You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

25 lines
522 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
exports.id = "vendor-chunks/zod";
exports.ids = ["vendor-chunks/zod"];
exports.modules = {
/***/ "(action-browser)/./node_modules/zod/lib/index.mjs":
/*!****************************************!*\
!*** ./node_modules/zod/lib/index.mjs ***!
\****************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BRAND: () => (/* binding */ BRAND),\n/* harmony export */ DIRTY: () => (/* binding */ DIRTY),\n/* harmony export */ EMPTY_PATH: () => (/* binding */ EMPTY_PATH),\n/* harmony export */ INVALID: () => (/* binding */ INVALID),\n/* harmony export */ NEVER: () => (/* binding */ NEVER),\n/* harmony export */ OK: () => (/* binding */ OK),\n/* harmony export */ ParseStatus: () => (/* binding */ ParseStatus),\n/* harmony export */ Schema: () => (/* binding */ ZodType),\n/* harmony export */ ZodAny: () => (/* binding */ ZodAny),\n/* harmony export */ ZodArray: () => (/* binding */ ZodArray),\n/* harmony export */ ZodBigInt: () => (/* binding */ ZodBigInt),\n/* harmony export */ ZodBoolean: () => (/* binding */ ZodBoolean),\n/* harmony export */ ZodBranded: () => (/* binding */ ZodBranded),\n/* harmony export */ ZodCatch: () => (/* binding */ ZodCatch),\n/* harmony export */ ZodDate: () => (/* binding */ ZodDate),\n/* harmony export */ ZodDefault: () => (/* binding */ ZodDefault),\n/* harmony export */ ZodDiscriminatedUnion: () => (/* binding */ ZodDiscriminatedUnion),\n/* harmony export */ ZodEffects: () => (/* binding */ ZodEffects),\n/* harmony export */ ZodEnum: () => (/* binding */ ZodEnum),\n/* harmony export */ ZodError: () => (/* binding */ ZodError),\n/* harmony export */ ZodFirstPartyTypeKind: () => (/* binding */ ZodFirstPartyTypeKind),\n/* harmony export */ ZodFunction: () => (/* binding */ ZodFunction),\n/* harmony export */ ZodIntersection: () => (/* binding */ ZodIntersection),\n/* harmony export */ ZodIssueCode: () => (/* binding */ ZodIssueCode),\n/* harmony export */ ZodLazy: () => (/* binding */ ZodLazy),\n/* harmony export */ ZodLiteral: () => (/* binding */ ZodLiteral),\n/* harmony export */ ZodMap: () => (/* binding */ ZodMap),\n/* harmony export */ ZodNaN: () => (/* binding */ ZodNaN),\n/* harmony export */ ZodNativeEnum: () => (/* binding */ ZodNativeEnum),\n/* harmony export */ ZodNever: () => (/* binding */ ZodNever),\n/* harmony export */ ZodNull: () => (/* binding */ ZodNull),\n/* harmony export */ ZodNullable: () => (/* binding */ ZodNullable),\n/* harmony export */ ZodNumber: () => (/* binding */ ZodNumber),\n/* harmony export */ ZodObject: () => (/* binding */ ZodObject),\n/* harmony export */ ZodOptional: () => (/* binding */ ZodOptional),\n/* harmony export */ ZodParsedType: () => (/* binding */ ZodParsedType),\n/* harmony export */ ZodPipeline: () => (/* binding */ ZodPipeline),\n/* harmony export */ ZodPromise: () => (/* binding */ ZodPromise),\n/* harmony export */ ZodReadonly: () => (/* binding */ ZodReadonly),\n/* harmony export */ ZodRecord: () => (/* binding */ ZodRecord),\n/* harmony export */ ZodSchema: () => (/* binding */ ZodType),\n/* harmony export */ ZodSet: () => (/* binding */ ZodSet),\n/* harmony export */ ZodString: () => (/* binding */ ZodString),\n/* harmony export */ ZodSymbol: () => (/* binding */ ZodSymbol),\n/* harmony export */ ZodTransformer: () => (/* binding */ ZodEffects),\n/* harmony export */ ZodTuple: () => (/* binding */ ZodTuple),\n/* harmony export */ ZodType: () => (/* binding */ ZodType),\n/* harmony export */ ZodUndefined: () => (/* binding */ ZodUndefined),\n/* harmony export */ ZodUnion: () => (/* binding */ ZodUnion),\n/* harmony export */ ZodUnknown: () => (/* binding */ ZodUnknown),\n/* harmony export */ ZodVoid: () => (/* binding */ ZodVoid),\n/* harmony export */ addIssueToContext: () => (/* binding */ addIssueToContext),\n/* harmony export */ any: () => (/* binding */ anyType),\n/* harmony export */ array: () => (/* binding */ arrayType),\n/* harmony export */ bigint: () => (/* binding */ bigIntType),\n/* harmony export */ boolean: () => (/* binding */ booleanType),\n/* harmony export */ coerce: () => (/* binding */ coerce),\n/* harmony export */ custom: () => (/* binding */ custom),\n/* harmony export */ date: () => (/* binding */ dateType),\n/* harmony export */ datetimeRegex: () => (/* binding */ datetimeRegex),\n/* harmony export */ \"default\": () => (/* binding */ z),\n/* harmony export */ defaultErrorMap: () => (/* binding */ errorMap),\n/* harmony export */ discriminatedUnion: () => (/* binding */ discriminatedUnionType),\n/* harmony export */ effect: () => (/* binding */ effectsType),\n/* harmony export */ \"enum\": () => (/* binding */ enumType),\n/* harmony export */ \"function\": () => (/* binding */ functionType),\n/* harmony export */ getErrorMap: () => (/* binding */ getErrorMap),\n/* harmony export */ getParsedType: () => (/* binding */ getParsedType),\n/* harmony export */ \"instanceof\": () => (/* binding */ instanceOfType),\n/* harmony export */ intersection: () => (/* binding */ intersectionType),\n/* harmony export */ isAborted: () => (/* binding */ isAborted),\n/* harmony export */ isAsync: () => (/* binding */ isAsync),\n/* harmony export */ isDirty: () => (/* binding */ isDirty),\n/* harmony export */ isValid: () => (/* binding */ isValid),\n/* harmony export */ late: () => (/* binding */ late),\n/* harmony export */ lazy: () => (/* binding */ lazyType),\n/* harmony export */ literal: () => (/* binding */ literalType),\n/* harmony export */ makeIssue: () => (/* binding */ makeIssue),\n/* harmony export */ map: () => (/* binding */ mapType),\n/* harmony export */ nan: () => (/* binding */ nanType),\n/* harmony export */ nativeEnum: () => (/* binding */ nativeEnumType),\n/* harmony export */ never: () => (/* binding */ neverType),\n/* harmony export */ \"null\": () => (/* binding */ nullType),\n/* harmony export */ nullable: () => (/* binding */ nullableType),\n/* harmony export */ number: () => (/* binding */ numberType),\n/* harmony export */ object: () => (/* binding */ objectType),\n/* harmony export */ objectUtil: () => (/* binding */ objectUtil),\n/* harmony export */ oboolean: () => (/* binding */ oboolean),\n/* harmony export */ onumber: () => (/* binding */ onumber),\n/* harmony export */ optional: () => (/* binding */ optionalType),\n/* harmony export */ ostring: () => (/* binding */ ostring),\n/* harmony export */ pipeline: () => (/* binding */ pipelineType),\n/* harmony export */ preprocess: () => (/* binding */ preprocessType),\n/* harmony export */ promise: () => (/* binding */ promiseType),\n/* harmony export */ quotelessJson: () => (/* binding */ quotelessJson),\n/* harmony export */ record: () => (/* binding */ recordType),\n/* harmony export */ set: () => (/* binding */ setType),\n/* harmony export */ setErrorMap: () => (/* binding */ setErrorMap),\n/* harmony export */ strictObject: () => (/* binding */ strictObjectType),\n/* harmony export */ string: () => (/* binding */ stringType),\n/* harmony export */ symbol: () => (/* binding */ symbolType),\n/* harmony export */ transformer: () => (/* binding */ effectsType),\n/* harmony export */ tuple: () => (/* binding */ tupleType),\n/* harmony export */ undefined: () => (/* binding */ undefinedType),\n/* harmony export */ union: () => (/* binding */ unionType),\n/* harmony export */ unknown: () => (/* binding */ unknownType),\n/* harmony export */ util: () => (/* binding */ util),\n/* harmony export */ \"void\": () => (/* binding */ voidType),\n/* harmony export */ z: () => (/* binding */ z)\n/* harmony export */ });\nvar util;\n(function(util) {\n util.assertEqual = (val)=>val;\n function assertIs(_arg) {}\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items)=>{\n const obj = {};\n for (const item of items){\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj)=>{\n const validKeys = util.objectKeys(obj).filter((k)=>typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys){\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj)=>{\n return util.objectKeys(obj).map(function(e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj)=>Object.keys(obj) // eslint-disable-line ban/ban\n : (object)=>{\n const keys = [];\n for(const key in object){\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker)=>{\n for (const item of arr){\n if (checker(item)) return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\" ? (val)=>Number.isInteger(val) // eslint-disable-line ban/ban\n : (val)=>typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val)=>typeof val === \"string\" ? `'${val}'` : val).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value)=>{\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function(objectUtil) {\n objectUtil.mergeShapes = (first, second)=>{\n return {\n ...first,\n ...second\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\"\n]);\nconst getParsedType = (data)=>{\n const t = typeof data;\n switch(t){\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\"\n]);\nconst quotelessJson = (obj)=>{\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues){\n super();\n this.issues = [];\n this.addIssue = (sub)=>{\n this.issues = [\n ...this.issues,\n sub\n ];\n };\n this.addIssues = (subs = [])=>{\n this.issues = [\n ...this.issues,\n ...subs\n ];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n } else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper || function(issue) {\n return issue.message;\n };\n const fieldErrors = {\n _errors: []\n };\n const processError = (error)=>{\n for (const issue of error.issues){\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n } else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n } else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n } else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n } else {\n let curr = fieldErrors;\n let i = 0;\n while(i < issue.path.length){\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || {\n _errors: []\n };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n } else {\n curr[el] = curr[el] || {\n _errors: []\n };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue)=>issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues){\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n } else {\n formErrors.push(mapper(sub));\n }\n }\n return {\n formErrors,\n fieldErrors\n };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues)=>{\n const error = new ZodError(issues);\n return error;\n};\nconst errorMap = (issue, _ctx)=>{\n let message;\n switch(issue.code){\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n } else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n } else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n } else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n } else {\n util.assertNever(issue.validation);\n }\n } else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n } else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\") message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\") message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\") message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\") message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\") message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\") message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\") message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\") message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\") message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return {\n message\n };\n};\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\nconst makeIssue = (params)=>{\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [\n ...path,\n ...issueData.path || []\n ];\n const fullIssue = {\n ...issueData,\n path: fullPath\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps.filter((m)=>!!m).slice().reverse();\n for (const map of maps){\n errorMessage = map(fullIssue, {\n data,\n defaultError: errorMessage\n }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n overrideMap,\n overrideMap === errorMap ? undefined : errorMap\n ].filter((x)=>!!x)\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor(){\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\") this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\") this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results){\n if (s.status === \"aborted\") return INVALID;\n if (s.status === \"dirty\") status.dirty();\n arrayValue.push(s.value);\n }\n return {\n status: status.value,\n value: arrayValue\n };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs){\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs){\n const { key, value } = pair;\n if (key.status === \"aborted\") return INVALID;\n if (value.status === \"aborted\") return INVALID;\n if (key.status === \"dirty\") status.dirty();\n if (value.status === \"dirty\") status.dirty();\n if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return {\n status: status.value,\n value: finalObject\n };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\"\n});\nconst DIRTY = (value)=>({\n status: \"dirty\",\n value\n });\nconst OK = (value)=>({\n status: \"valid\",\n value\n });\nconst isAborted = (x)=>x.status === \"aborted\";\nconst isDirty = (x)=>x.status === \"dirty\";\nconst isValid = (x)=>x.status === \"valid\";\nconst isAsync = (x)=>typeof Promise !== \"undefined\" && x instanceof Promise;\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */ function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;\n}\ntypeof SuppressedError === \"function\" ? SuppressedError : function(error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\nvar errorUtil;\n(function(errorUtil) {\n errorUtil.errToObj = (message)=>typeof message === \"string\" ? {\n message\n } : message || {};\n errorUtil.toString = (message)=>typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\nvar _ZodEnum_cache, _ZodNativeEnum_cache;\nclass ParseInputLazyPath {\n constructor(parent, value, path, key){\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n } else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result)=>{\n if (isValid(result)) {\n return {\n success: true,\n data: result.value\n };\n } else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error () {\n if (this._error) return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n }\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params) return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap) return {\n errorMap: errorMap,\n description\n };\n const customMap = (iss, ctx)=>{\n var _a, _b;\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return {\n message: message !== null && message !== void 0 ? message : ctx.defaultError\n };\n }\n if (typeof ctx.data === \"undefined\") {\n return {\n message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError\n };\n }\n if (iss.code !== \"invalid_type\") return {\n message: ctx.defaultError\n };\n return {\n message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError\n };\n };\n return {\n errorMap: customMap,\n description\n };\n}\nclass ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent\n };\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent\n }\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success) return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data)\n };\n const result = this._parseSync({\n data,\n path: ctx.path,\n parent: ctx\n });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n var _a, _b;\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data)\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({\n data,\n path: [],\n parent: ctx\n });\n return isValid(result) ? {\n value: result.value\n } : {\n issues: ctx.common.issues\n };\n } catch (err) {\n if ((_b = (_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true\n };\n }\n }\n return this._parseAsync({\n data,\n path: [],\n parent: ctx\n }).then((result)=>isValid(result) ? {\n value: result.value\n } : {\n issues: ctx.common.issues\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success) return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data)\n };\n const maybeAsyncResult = this._parse({\n data,\n path: ctx.path,\n parent: ctx\n });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val)=>{\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return {\n message\n };\n } else if (typeof message === \"function\") {\n return message(val);\n } else {\n return message;\n }\n };\n return this._refinement((val, ctx)=>{\n const result = check(val);\n const setError = ()=>ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val)\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data)=>{\n if (!data) {\n setError();\n return false;\n } else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n } else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx)=>{\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n } else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: {\n type: \"refinement\",\n refinement\n }\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def){\n /** Alias of safeParseAsync */ this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data)=>this[\"~validate\"](data)\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([\n this,\n option\n ], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: {\n type: \"transform\",\n transform\n }\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : ()=>def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def)\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : ()=>def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n // let regex = `\\\\d{2}:\\\\d{2}:\\\\d{2}`;\n let regex = `([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d`;\n if (args.precision) {\n regex = `${regex}\\\\.\\\\d{${args.precision}}`;\n } else if (args.precision == null) {\n regex = `${regex}(\\\\.\\\\d+)?`;\n }\n return regex;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nfunction datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset) opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt)) return false;\n try {\n const [header] = jwt.split(\".\");\n // Convert base64url to base64\n const base64 = header.replace(/-/g, \"+\").replace(/_/g, \"/\").padEnd(header.length + (4 - header.length % 4) % 4, \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null) return false;\n if (!decoded.typ || !decoded.alg) return false;\n if (alg && decoded.alg !== alg) return false;\n return true;\n } catch (_a) {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks){\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message\n });\n } else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message\n });\n }\n status.dirty();\n }\n } else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n } catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n } else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: {\n includes: check.value,\n position: check.position\n },\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n } else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n } else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: {\n startsWith: check.value\n },\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: {\n endsWith: check.value\n },\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: input.data\n };\n }\n _regex(regex, validation, message) {\n return this.refinement((data)=>regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message)\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [\n ...this._def.checks,\n check\n ]\n });\n }\n email(message) {\n return this._addCheck({\n kind: \"email\",\n ...errorUtil.errToObj(message)\n });\n }\n url(message) {\n return this._addCheck({\n kind: \"url\",\n ...errorUtil.errToObj(message)\n });\n }\n emoji(message) {\n return this._addCheck({\n kind: \"emoji\",\n ...errorUtil.errToObj(message)\n });\n }\n uuid(message) {\n return this._addCheck({\n kind: \"uuid\",\n ...errorUtil.errToObj(message)\n });\n }\n nanoid(message) {\n return this._addCheck({\n kind: \"nanoid\",\n ...errorUtil.errToObj(message)\n });\n }\n cuid(message) {\n return this._addCheck({\n kind: \"cuid\",\n ...errorUtil.errToObj(message)\n });\n }\n cuid2(message) {\n return this._addCheck({\n kind: \"cuid2\",\n ...errorUtil.errToObj(message)\n });\n }\n ulid(message) {\n return this._addCheck({\n kind: \"ulid\",\n ...errorUtil.errToObj(message)\n });\n }\n base64(message) {\n return this._addCheck({\n kind: \"base64\",\n ...errorUtil.errToObj(message)\n });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message)\n });\n }\n jwt(options) {\n return this._addCheck({\n kind: \"jwt\",\n ...errorUtil.errToObj(options)\n });\n }\n ip(options) {\n return this._addCheck({\n kind: \"ip\",\n ...errorUtil.errToObj(options)\n });\n }\n cidr(options) {\n return this._addCheck({\n kind: \"cidr\",\n ...errorUtil.errToObj(options)\n });\n }\n datetime(options) {\n var _a, _b;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message)\n });\n }\n date(message) {\n return this._addCheck({\n kind: \"date\",\n message\n });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message)\n });\n }\n duration(message) {\n return this._addCheck({\n kind: \"duration\",\n ...errorUtil.errToObj(message)\n });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message)\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message)\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message)\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message)\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message)\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message)\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message)\n });\n }\n /**\n * Equivalent to `.min(1)`\n */ nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind: \"trim\"\n }\n ]\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind: \"toLowerCase\"\n }\n ]\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind: \"toUpperCase\"\n }\n ]\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch)=>ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch)=>ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch)=>ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch)=>ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch)=>ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch)=>ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch)=>ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch)=>ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch)=>ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch)=>ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch)=>ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch)=>ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch)=>ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch)=>ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch)=>ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch)=>ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min) min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max) max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params)=>{\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params)\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return valInt % stepInt / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor(){\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks){\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message\n });\n status.dirty();\n }\n } else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: input.data\n };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message)\n }\n ]\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n check\n ]\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message)\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message)\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message)\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message)\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message)\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message)\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message)\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message)\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message)\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min) min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max) max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch)=>ch.kind === \"int\" || ch.kind === \"multipleOf\" && util.isInteger(ch.value));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n } else if (ch.kind === \"min\") {\n if (min === null || ch.value > min) min = ch.value;\n } else if (ch.kind === \"max\") {\n if (max === null || ch.value < max) max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params)=>{\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params)\n });\n};\nclass ZodBigInt extends ZodType {\n constructor(){\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n } catch (_a) {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks){\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message\n });\n status.dirty();\n }\n } else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: input.data\n };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message)\n }\n ]\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n check\n ]\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message)\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message)\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message)\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message)\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message)\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min) min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max) max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params)=>{\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params)\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params)=>{\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params)\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks){\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\"\n });\n status.dirty();\n }\n } else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\"\n });\n status.dirty();\n }\n } else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime())\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [\n ...this._def.checks,\n check\n ]\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message)\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message)\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min) min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max) max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params)=>{\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params)\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params)=>{\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params)\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params)=>{\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params)\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params)=>{\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params)\n });\n};\nclass ZodAny extends ZodType {\n constructor(){\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params)=>{\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params)\n });\n};\nclass ZodUnknown extends ZodType {\n constructor(){\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params)=>{\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params)\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType\n });\n return INVALID;\n }\n}\nZodNever.create = (params)=>{\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params)\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params)=>{\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params)\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: tooSmall ? def.exactLength.value : undefined,\n maximum: tooBig ? def.exactLength.value : undefined,\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([\n ...ctx.data\n ].map((item, i)=>{\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result)=>{\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [\n ...ctx.data\n ].map((item, i)=>{\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: {\n value: minLength,\n message: errorUtil.toString(message)\n }\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: {\n value: maxLength,\n message: errorUtil.toString(message)\n }\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: {\n value: len,\n message: errorUtil.toString(message)\n }\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params)=>{\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params)\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for(const key in schema.shape){\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: ()=>newShape\n });\n } else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element)\n });\n } else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n } else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n } else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item)=>deepPartialify(item)));\n } else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor(){\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */ this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<T, Augmentation>,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */ this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null) return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return this._cached = {\n shape,\n keys\n };\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for(const key in ctx.data){\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys){\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: {\n status: \"valid\",\n value: key\n },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys){\n pairs.push({\n key: {\n status: \"valid\",\n value: key\n },\n value: {\n status: \"valid\",\n value: ctx.data[key]\n }\n });\n }\n } else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys\n });\n status.dirty();\n }\n } else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n } else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys){\n const value = ctx.data[key];\n pairs.push({\n key: {\n status: \"valid\",\n value: key\n },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve().then(async ()=>{\n const syncPairs = [];\n for (const pair of pairs){\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet\n });\n }\n return syncPairs;\n }).then((syncPairs)=>{\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n } else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...message !== undefined ? {\n errorMap: (issue, ctx)=>{\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\") return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError\n };\n return {\n message: defaultError\n };\n }\n } : {}\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\"\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\"\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: ()=>({\n ...this._def.shape(),\n ...augmentation\n })\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */ merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: ()=>({\n ...this._def.shape(),\n ...merging._def.shape()\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({\n [key]: schema\n });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key)=>{\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: ()=>shape\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key)=>{\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: ()=>shape\n });\n }\n /**\n * @deprecated\n */ deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key)=>{\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n } else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: ()=>newShape\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key)=>{\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n } else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while(newField instanceof ZodOptional){\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: ()=>newShape\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params)=>{\n return new ZodObject({\n shape: ()=>shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params)\n });\n};\nZodObject.strictCreate = (shape, params)=>{\n return new ZodObject({\n shape: ()=>shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params)\n });\n};\nZodObject.lazycreate = (shape, params)=>{\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params)\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results){\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results){\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result)=>new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option)=>{\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: []\n },\n parent: null\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx\n }),\n ctx: childCtx\n };\n })).then(handleResults);\n } else {\n let dirty = undefined;\n const issues = [];\n for (const option of options){\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: []\n },\n parent: null\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx\n });\n if (result.status === \"valid\") {\n return result;\n } else if (result.status === \"dirty\" && !dirty) {\n dirty = {\n result,\n ctx: childCtx\n };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues)=>new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params)=>{\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params)\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type)=>{\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n } else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n } else if (type instanceof ZodLiteral) {\n return [\n type.value\n ];\n } else if (type instanceof ZodEnum) {\n return type.options;\n } else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n } else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n } else if (type instanceof ZodUndefined) {\n return [\n undefined\n ];\n } else if (type instanceof ZodNull) {\n return [\n null\n ];\n } else if (type instanceof ZodOptional) {\n return [\n undefined,\n ...getDiscriminator(type.unwrap())\n ];\n } else if (type instanceof ZodNullable) {\n return [\n null,\n ...getDiscriminator(type.unwrap())\n ];\n } else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n } else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n } else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n } else {\n return [];\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [\n discriminator\n ]\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n } else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */ static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options){\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues){\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params)\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return {\n valid: true,\n data: a\n };\n } else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key)=>bKeys.indexOf(key) !== -1);\n const newObj = {\n ...a,\n ...b\n };\n for (const key of sharedKeys){\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return {\n valid: false\n };\n }\n newObj[key] = sharedValue.data;\n }\n return {\n valid: true,\n data: newObj\n };\n } else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return {\n valid: false\n };\n }\n const newArray = [];\n for(let index = 0; index < a.length; index++){\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return {\n valid: false\n };\n }\n newArray.push(sharedValue.data);\n }\n return {\n valid: true,\n data: newArray\n };\n } else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return {\n valid: true,\n data: a\n };\n } else {\n return {\n valid: false\n };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight)=>{\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return {\n status: status.value,\n value: merged.data\n };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n })\n ]).then(([left, right])=>handleParsed(left, right));\n } else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params)=>{\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params)\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\"\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\"\n });\n status.dirty();\n }\n const items = [\n ...ctx.data\n ].map((item, itemIndex)=>{\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema) return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n }).filter((x)=>!!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results)=>{\n return ParseStatus.mergeArray(status, results);\n });\n } else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest\n });\n }\n}\nZodTuple.create = (schemas, params)=>{\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params)\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for(const key in ctx.data){\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n } else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third)\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second)\n });\n }\n}\nclass ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [\n ...ctx.data.entries()\n ].map(([key, value], index)=>{\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [\n index,\n \"key\"\n ])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [\n index,\n \"value\"\n ]))\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async ()=>{\n for (const pair of pairs){\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return {\n status: status.value,\n value: finalMap\n };\n });\n } else {\n const finalMap = new Map();\n for (const pair of pairs){\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return {\n status: status.value,\n value: finalMap\n };\n }\n }\n}\nZodMap.create = (keyType, valueType, params)=>{\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params)\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements){\n if (element.status === \"aborted\") return INVALID;\n if (element.status === \"dirty\") status.dirty();\n parsedSet.add(element.value);\n }\n return {\n status: status.value,\n value: parsedSet\n };\n }\n const elements = [\n ...ctx.data.values()\n ].map((item, i)=>valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements)=>finalizeSet(elements));\n } else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: {\n value: minSize,\n message: errorUtil.toString(message)\n }\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: {\n value: maxSize,\n message: errorUtil.toString(message)\n }\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params)=>{\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params)\n });\n};\nclass ZodFunction extends ZodType {\n constructor(){\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap\n ].filter((x)=>!!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error\n }\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap\n ].filter((x)=>!!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error\n }\n });\n }\n const params = {\n errorMap: ctx.common.contextualErrorMap\n };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function(...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e)=>{\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type.parseAsync(result, params).catch((e)=>{\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n } else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function(...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([\n makeArgsIssue(args, parsedArgs.error)\n ]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([\n makeReturnsIssue(result, parsedReturns.error)\n ]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create())\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: args ? args : ZodTuple.create([]).rest(ZodUnknown.create()),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params)\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n }\n}\nZodLazy.create = (getter, params)=>{\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params)\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value\n });\n return INVALID;\n }\n return {\n status: \"valid\",\n value: input.data\n };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params)=>{\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params)\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params)\n });\n}\nclass ZodEnum extends ZodType {\n constructor(){\n super(...arguments);\n _ZodEnum_cache.set(this, void 0);\n }\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\").has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values){\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values){\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values){\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt)=>!values.includes(opt)), {\n ...this._def,\n ...newDef\n });\n }\n}\n_ZodEnum_cache = new WeakMap();\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n constructor(){\n super(...arguments);\n _ZodNativeEnum_cache.set(this, void 0);\n }\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\").has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\n_ZodNativeEnum_cache = new WeakMap();\nZodNativeEnum.create = (values, params)=>{\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params)\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data)=>{\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap\n });\n }));\n }\n}\nZodPromise.create = (schema, params)=>{\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params)\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects ? this._def.schema.sourceType() : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg)=>{\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n } else {\n status.dirty();\n }\n },\n get path () {\n return ctx.path;\n }\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed)=>{\n if (status.value === \"aborted\") return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx\n });\n if (result.status === \"aborted\") return INVALID;\n if (result.status === \"dirty\") return DIRTY(result.value);\n if (status.value === \"dirty\") return DIRTY(result.value);\n return result;\n });\n } else {\n if (status.value === \"aborted\") return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx\n });\n if (result.status === \"aborted\") return INVALID;\n if (result.status === \"dirty\") return DIRTY(result.value);\n if (status.value === \"dirty\") return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc)=>{\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n if (inner.status === \"aborted\") return INVALID;\n if (inner.status === \"dirty\") status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return {\n status: status.value,\n value: inner.value\n };\n } else {\n return this._def.schema._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }).then((inner)=>{\n if (inner.status === \"aborted\") return INVALID;\n if (inner.status === \"dirty\") status.dirty();\n return executeRefinement(inner.value).then(()=>{\n return {\n status: status.value,\n value: inner.value\n };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n if (!isValid(base)) return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return {\n status: status.value,\n value: result\n };\n } else {\n return this._def.schema._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }).then((base)=>{\n if (!isValid(base)) return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result)=>({\n status: status.value,\n value: result\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params)=>{\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params)\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params)=>{\n return new ZodEffects({\n schema,\n effect: {\n type: \"preprocess\",\n transform: preprocess\n },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params)\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params)=>{\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params)\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params)=>{\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params)\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params)=>{\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : ()=>params.default,\n ...processCreateParams(params)\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: []\n }\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx\n }\n });\n if (isAsync(result)) {\n return result.then((result)=>{\n return {\n status: \"valid\",\n value: result.status === \"valid\" ? result.value : this._def.catchValue({\n get error () {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data\n })\n };\n });\n } else {\n return {\n status: \"valid\",\n value: result.status === \"valid\" ? result.value : this._def.catchValue({\n get error () {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data\n })\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params)=>{\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : ()=>params.catch,\n ...processCreateParams(params)\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return {\n status: \"valid\",\n value: input.data\n };\n }\n}\nZodNaN.create = (params)=>{\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params)\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async ()=>{\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n if (inResult.status === \"aborted\") return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n } else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx\n });\n }\n };\n return handleAsync();\n } else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n if (inResult.status === \"aborted\") return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value\n };\n } else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline\n });\n }\n}\nclass ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data)=>{\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data)=>freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params)=>{\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params)\n });\n};\nfunction custom(check, params = {}, /**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */ fatal) {\n if (check) return ZodAny.create().superRefine((data, ctx)=>{\n var _a, _b;\n if (!check(data)) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? {\n message: params\n } : params;\n const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n const p2 = typeof p === \"string\" ? {\n message: p\n } : p;\n ctx.addIssue({\n code: \"custom\",\n ...p2,\n fatal: _fatal\n });\n }\n });\n return ZodAny.create();\n}\nconst late = {\n object: ZodObject.lazycreate\n};\nvar ZodFirstPartyTypeKind;\n(function(ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`\n})=>custom((data)=>data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = ()=>stringType().optional();\nconst onumber = ()=>numberType().optional();\nconst oboolean = ()=>booleanType().optional();\nconst coerce = {\n string: (arg)=>ZodString.create({\n ...arg,\n coerce: true\n }),\n number: (arg)=>ZodNumber.create({\n ...arg,\n coerce: true\n }),\n boolean: (arg)=>ZodBoolean.create({\n ...arg,\n coerce: true\n }),\n bigint: (arg)=>ZodBigInt.create({\n ...arg,\n coerce: true\n }),\n date: (arg)=>ZodDate.create({\n ...arg,\n coerce: true\n })\n};\nconst NEVER = INVALID;\nvar z = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () {\n return util;\n },\n get objectUtil () {\n return objectUtil;\n },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n datetimeRegex: datetimeRegex,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n ZodReadonly: ZodReadonly,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () {\n return ZodFirstPartyTypeKind;\n },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n \"enum\": enumType,\n \"function\": functionType,\n \"instanceof\": instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n \"null\": nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n \"undefined\": undefinedType,\n union: unionType,\n unknown: unknownType,\n \"void\": voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy96b2QvbGliL2luZGV4Lm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUE7QUFDSCxVQUFVQSxJQUFJO0lBQ1hBLEtBQUtDLFdBQVcsR0FBRyxDQUFDQyxNQUFRQTtJQUM1QixTQUFTQyxTQUFTQyxJQUFJLEdBQUk7SUFDMUJKLEtBQUtHLFFBQVEsR0FBR0E7SUFDaEIsU0FBU0UsWUFBWUMsRUFBRTtRQUNuQixNQUFNLElBQUlDO0lBQ2Q7SUFDQVAsS0FBS0ssV0FBVyxHQUFHQTtJQUNuQkwsS0FBS1EsV0FBVyxHQUFHLENBQUNDO1FBQ2hCLE1BQU1DLE1BQU0sQ0FBQztRQUNiLEtBQUssTUFBTUMsUUFBUUYsTUFBTztZQUN0QkMsR0FBRyxDQUFDQyxLQUFLLEdBQUdBO1FBQ2hCO1FBQ0EsT0FBT0Q7SUFDWDtJQUNBVixLQUFLWSxrQkFBa0IsR0FBRyxDQUFDRjtRQUN2QixNQUFNRyxZQUFZYixLQUFLYyxVQUFVLENBQUNKLEtBQUtLLE1BQU0sQ0FBQyxDQUFDQyxJQUFNLE9BQU9OLEdBQUcsQ0FBQ0EsR0FBRyxDQUFDTSxFQUFFLENBQUMsS0FBSztRQUM1RSxNQUFNQyxXQUFXLENBQUM7UUFDbEIsS0FBSyxNQUFNRCxLQUFLSCxVQUFXO1lBQ3ZCSSxRQUFRLENBQUNELEVBQUUsR0FBR04sR0FBRyxDQUFDTSxFQUFFO1FBQ3hCO1FBQ0EsT0FBT2hCLEtBQUtrQixZQUFZLENBQUNEO0lBQzdCO0lBQ0FqQixLQUFLa0IsWUFBWSxHQUFHLENBQUNSO1FBQ2pCLE9BQU9WLEtBQUtjLFVBQVUsQ0FBQ0osS0FBS1MsR0FBRyxDQUFDLFNBQVVDLENBQUM7WUFDdkMsT0FBT1YsR0FBRyxDQUFDVSxFQUFFO1FBQ2pCO0lB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QUFLbEM7SUFDTGxqQixPQUFPc2pCO0lBQ1BqaUIsUUFBUXVoQjtJQUNSemhCLFNBQVMwaEI7SUFDVDVnQixNQUFNNmdCO0lBQ051QyxvQkFBb0IzQjtJQUNwQmhXLFFBQVE0VztJQUNSLFFBQVFIO0lBQ1IsWUFBWUg7SUFDWixjQUFjekI7SUFDZCtDLGNBQWMzQjtJQUNkNEIsTUFBTXRCO0lBQ051QixTQUFTdEI7SUFDVHRsQixLQUFLa2xCO0lBQ0w3aUIsS0FBSzBoQjtJQUNMOEMsWUFBWXJCO0lBQ1p4TCxPQUFPd0s7SUFDUCxRQUFRSDtJQUNSalYsVUFBVXdXO0lBQ1Z0akIsUUFBUXdoQjtJQUNSMWpCLFFBQVF1a0I7SUFDUnNCLFVBQVVBO0lBQ1ZELFNBQVNBO0lBQ1Q3VyxVQUFVd1c7SUFDVkksU0FBU0E7SUFDVGUsVUFBVWhCO0lBQ1ZsRCxZQUFZaUQ7SUFDWjdpQixTQUFTeWlCO0lBQ1RzQixRQUFROUI7SUFDUjloQixLQUFLZ2lCO0lBQ0w2QixjQUFjcEM7SUFDZHppQixRQUFRMGhCO0lBQ1JuaEIsUUFBUXloQjtJQUNSOEMsYUFBYXZCO0lBQ2J3QixPQUFPbEM7SUFDUCxhQUFhWjtJQUNiK0MsT0FBT3RDO0lBQ1B2aEIsU0FBU2loQjtJQUNULFFBQVFFO0lBQ1J5QixPQUFPQTtJQUNQM2lCLGNBQWNBO0lBQ2RDLGVBQWVBO0lBQ2ZLLFVBQVVBO0FBQ2Q7QUFFNHJEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbmV4dGNoYXQvLi9ub2RlX21vZHVsZXMvem9kL2xpYi9pbmRleC5tanM/NzdkOCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdXRpbDtcbihmdW5jdGlvbiAodXRpbCkge1xuICAgIHV0aWwuYXNzZXJ0RXF1YWwgPSAodmFsKSA9PiB2YWw7XG4gICAgZnVuY3Rpb24gYXNzZXJ0SXMoX2FyZykgeyB9XG4gICAgdXRpbC5hc3NlcnRJcyA9IGFzc2VydElzO1xuICAgIGZ1bmN0aW9uIGFzc2VydE5ldmVyKF94KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydE5ldmVyID0gYXNzZXJ0TmV2ZXI7XG4gICAgdXRpbC5hcnJheVRvRW51bSA9IChpdGVtcykgPT4ge1xuICAgICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBvYmpbaXRlbV0gPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgICB1dGlsLmdldFZhbGlkRW51bVZhbHVlcyA9IChvYmopID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRLZXlzID0gdXRpbC5vYmplY3RLZXlzKG9iaikuZmlsdGVyKChrKSA9PiB0eXBlb2Ygb2JqW29ialtrXV0gIT09IFwibnVtYmVyXCIpO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgdmFsaWRLZXlzKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFtrXSA9IG9ialtrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXRpbC5vYmplY3RWYWx1ZXMoZmlsdGVyZWQpO1xuICAgIH07XG4gICAgdXRpbC5vYmplY3RWYWx1ZXMgPSAob2JqKSA9PiB7XG4gICAgICAgIHJldHVybiB1dGlsLm9iamVjdEtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmpbZV07XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgdXRpbC5vYmplY3RLZXlzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSBcImZ1bmN0aW9uXCIgLy8gZXNsaW50LWRpc2FibGUtbGluZSBiYW4vYmFuXG4gICAgICAgID8gKG9iaikgPT4gT2JqZWN0LmtleXMob2JqKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgOiAob2JqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgfTtcbiAgICB1dGlsLmZpbmQgPSAoYXJyLCBjaGVja2VyKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnIpIHtcbiAgICAgICAgICAgIGlmIChjaGVja2VyKGl0ZW0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICB1dGlsLmlzSW50ZWdlciA9IHR5cGVvZiBOdW1iZXIuaXNJbnRlZ2VyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyAodmFsKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKHZhbCkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBiYW4vYmFuXG4gICAgICAgIDogKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiAmJiBpc0Zpbml0ZSh2YWwpICYmIE1hdGguZmxvb3IodmFsKSA9PT0gdmFsO1xuICAgIGZ1bmN0aW9uIGpvaW5WYWx1ZXMoYXJyYXksIHNlcGFyYXRvciA9IFwiIHwgXCIpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5XG4gICAgICAgICAgICAubWFwKCh2YWwpID0+ICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiID8gYCcke3ZhbH0nYCA6IHZhbCkpXG4gICAgICAgICAgICAuam9pbihzZXBhcmF0b3IpO1xuICAgIH1cbiAgICB1dGlsLmpvaW5WYWx1ZXMgPSBqb2luVmFsdWVzO1xuICAgIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyID0gKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xufSkodXRpbCB8fCAodXRpbCA9IHt9KSk7XG52YXIgb2JqZWN0VXRpbDtcbihmdW5jdGlvbiAob2JqZWN0VXRpbCkge1xuICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXMgPSAoZmlyc3QsIHNlY29uZCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uZmlyc3QsXG4gICAgICAgICAgICAuLi5zZWNvbmQsIC8vIHNlY29uZCBvdmVyd3JpdGVzIGZpcnN0XG4gICAgICAgIH07XG4gICAgfTtcbn0pKG9iamVjdFV0aWwgfHwgKG9iamVjdFV0aWwgPSB7fSkpO1xuY29uc3QgWm9kUGFyc2VkVHlwZSA9IHV0aWwuYXJyYXlUb0VudW0oW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJuYW5cIixcbiAgICBcIm51bWJlclwiLFxuICAgIFwiaW50ZWdlclwiLFxuICAgIFwiZmxvYXRcIixcbiAgICBcImJvb2xlYW5cIixcbiAgICBcImRhdGVcIixcbiAgICBcImJpZ2ludFwiLFxuICAgIFwic3ltYm9sXCIsXG4gICAgXCJmdW5jdGlvblwiLFxuICAgIFwidW5kZWZpbmVkXCIsXG4gICAgXCJudWxsXCIsXG4gICAgXCJhcnJheVwiLFxuICAgIFwib2JqZWN0XCIsXG4gICAgXCJ1bmtub3duXCIsXG4gICAgXCJwcm9taXNlXCIsXG4gICAgXCJ2b2lkXCIsXG4gICAgXCJuZXZlclwiLFxuICAgIFwibWFwXCIsXG4gICAgXCJzZXRcIixcbl0pO1xuY29uc3QgZ2V0UGFyc2VkVHlwZSA9IChkYXRhKSA9PiB7XG4gICAgY29uc3QgdCA9IHR5cGVvZiBkYXRhO1xuICAgIHN3aXRjaCAodCkge1xuICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQ7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnN0cmluZztcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGRhdGEpID8gWm9kUGFyc2VkVHlwZS5uYW4gOiBab2RQYXJzZWRUeXBlLm51bWJlcjtcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmJvb2xlYW47XG4gICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuZnVuY3Rpb247XG4gICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmJpZ2ludDtcbiAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc3ltYm9sO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmFycmF5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5udWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEudGhlbiAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBkYXRhLnRoZW4gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgICAgIGRhdGEuY2F0Y2ggJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZGF0YS5jYXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUucHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWFwICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5tYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIFNldCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBEYXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLm9iamVjdDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnVua25vd247XG4gICAgfVxufTtcblxuY29uc3QgWm9kSXNzdWVDb2RlID0gdXRpbC5hcnJheVRvRW51bShbXG4gICAgXCJpbnZhbGlkX3R5cGVcIixcbiAgICBcImludmFsaWRfbGl0ZXJhbFwiLFxuICAgIFwiY3VzdG9tXCIsXG4gICAgXCJpbnZhbGlkX3VuaW9uXCIsXG4gICAgXCJpbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3JcIixcbiAgICBcImludmFsaWRfZW51bV92YWx1ZVwiLFxuICAgIFwidW5yZWNvZ25pemVkX2tleXNcIixcbiAgICBcImludmFsaWRfYXJndW1lbnRzXCIsXG4gICAgXCJpbnZhbGlkX3JldHVybl90eXBlXCIsXG4gICAgXCJpbnZhbGlkX2RhdGVcIixcbiAgICBcImludmFsaWRfc3RyaW5nXCIsXG4gICAgXCJ0b29fc21hbGxcIixcbiAgICBcInRvb19iaWdcIixcbiAgICBcImludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzXCIsXG4gICAgXCJub3RfbXVsdGlwbGVfb2ZcIixcbiAgICBcIm5vdF9maW5pdGVcIixcbl0pO1xuY29uc3QgcXVvdGVsZXNzSnNvbiA9IChvYmopID0+IHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICByZXR1cm4ganNvbi5yZXBsYWNlKC9cIihbXlwiXSspXCI6L2csIFwiJDE6XCIpO1xufTtcbmNsYXNzIFpvZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGdldCBlcnJvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzc3VlcztcbiAgICB9XG4gICAgY29uc3RydWN0b3IoaXNzdWVzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaXNzdWVzID0gW107XG4gICAgICAgIHRoaXMuYWRkSXNzdWUgPSAoc3ViKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzc3VlcyA9IFsuLi50aGlzLmlzc3Vlcywgc3ViXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZGRJc3N1ZXMgPSAoc3VicyA9IFtdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzc3VlcyA9IFsuLi50aGlzLmlzc3VlcywgLi4uc3Vic107XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGFjdHVhbFByb3RvID0gbmV3LnRhcmdldC5wcm90b3R5cGU7XG4gICAgICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBiYW4vYmFuXG4gICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgYWN0dWFsUHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fX3Byb3RvX18gPSBhY3R1YWxQcm90bztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5hbWUgPSBcIlpvZEVycm9yXCI7XG4gICAgICAgIHRoaXMuaXNzdWVzID0gaXNzdWVzO1xuICAgIH1cbiAgICBmb3JtYXQoX21hcHBlcikge1xuICAgICAgICBjb25zdCBtYXBwZXIgPSBfbWFwcGVyIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoaXNzdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNzdWUubWVzc2FnZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZpZWxkRXJyb3JzID0geyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICBjb25zdCBwcm9jZXNzRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgZXJyb3IuaXNzdWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF91bmlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlLnVuaW9uRXJyb3JzLm1hcChwcm9jZXNzRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfcmV0dXJuX3R5cGVcIikge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoaXNzdWUucmV0dXJuVHlwZUVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX2FyZ3VtZW50c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcihpc3N1ZS5hcmd1bWVudHNFcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzLl9lcnJvcnMucHVzaChtYXBwZXIoaXNzdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyID0gZmllbGRFcnJvcnM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBpc3N1ZS5wYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSBpc3N1ZS5wYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVybWluYWwgPSBpID09PSBpc3N1ZS5wYXRoLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7IF9lcnJvcnM6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7IF9lcnJvcnM6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmICh0eXBlb2YgZWwgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnN0IGVycm9yQXJyYXk6IGFueSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZXJyb3JBcnJheS5fZXJyb3JzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IGVycm9yQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7IF9lcnJvcnM6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0uX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnJbZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBwcm9jZXNzRXJyb3IodGhpcyk7XG4gICAgICAgIHJldHVybiBmaWVsZEVycm9ycztcbiAgICB9XG4gICAgc3RhdGljIGFzc2VydCh2YWx1ZSkge1xuICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFpvZEVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgYSBab2RFcnJvcjogJHt2YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAgICB9XG4gICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmlzc3VlcywgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIsIDIpO1xuICAgIH1cbiAgICBnZXQgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgZmxhdHRlbihtYXBwZXIgPSAoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7fTtcbiAgICAgICAgY29uc3QgZm9ybUVycm9ycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLmlzc3Vlcykge1xuICAgICAgICAgICAgaWYgKHN1Yi5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gPSBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gfHwgW107XG4gICAgICAgICAgICAgICAgZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dLnB1c2gobWFwcGVyKHN1YikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9ybUVycm9ycy5wdXNoKG1hcHBlcihzdWIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmb3JtRXJyb3JzLCBmaWVsZEVycm9ycyB9O1xuICAgIH1cbiAgICBnZXQgZm9ybUVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxhdHRlbigpO1xuICAgIH1cbn1cblpvZEVycm9yLmNyZWF0ZSA9IChpc3N1ZXMpID0+IHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihpc3N1ZXMpO1xuICAgIHJldHVybiBlcnJvcjtcbn07XG5cbmNvbnN0IGVycm9yTWFwID0gKGlzc3VlLCBfY3R4KSA9PiB7XG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgc3dpdGNoIChpc3N1ZS5jb2RlKSB7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZTpcbiAgICAgICAgICAgIGlmIChpc3N1ZS5yZWNlaXZlZCA9PT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJSZXF1aXJlZFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBFeHBlY3RlZCAke2lzc3VlLmV4cGVjdGVkfSwgcmVjZWl2ZWQgJHtpc3N1ZS5yZWNlaXZlZH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfbGl0ZXJhbDpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBsaXRlcmFsIHZhbHVlLCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KGlzc3VlLmV4cGVjdGVkLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlcil9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS51bnJlY29nbml6ZWRfa2V5czpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgVW5yZWNvZ25pemVkIGtleShzKSBpbiBvYmplY3Q6ICR7dXRpbC5qb2luVmFsdWVzKGlzc3VlLmtleXMsIFwiLCBcIil9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3I6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZGlzY3JpbWluYXRvciB2YWx1ZS4gRXhwZWN0ZWQgJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUub3B0aW9ucyl9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX2VudW1fdmFsdWU6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZW51bSB2YWx1ZS4gRXhwZWN0ZWQgJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUub3B0aW9ucyl9LCByZWNlaXZlZCAnJHtpc3N1ZS5yZWNlaXZlZH0nYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX2FyZ3VtZW50czpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBmdW5jdGlvbiBhcmd1bWVudHNgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfcmV0dXJuX3R5cGU6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZnVuY3Rpb24gcmV0dXJuIHR5cGVgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfZGF0ZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBkYXRlYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZzpcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXNzdWUudmFsaWRhdGlvbiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChcImluY2x1ZGVzXCIgaW4gaXNzdWUudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3QgaW5jbHVkZSBcIiR7aXNzdWUudmFsaWRhdGlvbi5pbmNsdWRlc31cImA7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXNzdWUudmFsaWRhdGlvbi5wb3NpdGlvbiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGAke21lc3NhZ2V9IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtpc3N1ZS52YWxpZGF0aW9uLnBvc2l0aW9ufWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXCJzdGFydHNXaXRoXCIgaW4gaXNzdWUudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3Qgc3RhcnQgd2l0aCBcIiR7aXNzdWUudmFsaWRhdGlvbi5zdGFydHNXaXRofVwiYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXCJlbmRzV2l0aFwiIGluIGlzc3VlLnZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IGVuZCB3aXRoIFwiJHtpc3N1ZS52YWxpZGF0aW9uLmVuZHNXaXRofVwiYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoaXNzdWUudmFsaWRhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudmFsaWRhdGlvbiAhPT0gXCJyZWdleFwiKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkICR7aXNzdWUudmFsaWRhdGlvbn1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiSW52YWxpZFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLnRvb19zbWFsbDpcbiAgICAgICAgICAgIGlmIChpc3N1ZS50eXBlID09PSBcImFycmF5XCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IFwiZXhhY3RseVwiIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IGxlYXN0YCA6IGBtb3JlIHRoYW5gfSAke2lzc3VlLm1pbmltdW19IGVsZW1lbnQocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IFwiZXhhY3RseVwiIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IGxlYXN0YCA6IGBvdmVyYH0gJHtpc3N1ZS5taW5pbXVtfSBjaGFyYWN0ZXIocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseSBlcXVhbCB0byBgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgZ3JlYXRlciB0aGFuIGB9JHtpc3N1ZS5taW5pbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImRhdGVcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYERhdGUgbXVzdCBiZSAke2lzc3VlLmV4YWN0XG4gICAgICAgICAgICAgICAgICAgID8gYGV4YWN0bHkgZXF1YWwgdG8gYFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYGdyZWF0ZXIgdGhhbiBgfSR7bmV3IERhdGUoTnVtYmVyKGlzc3VlLm1pbmltdW0pKX1gO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS50b29fYmlnOlxuICAgICAgICAgICAgaWYgKGlzc3VlLnR5cGUgPT09IFwiYXJyYXlcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHlgIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IG1vc3RgIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX0gZWxlbWVudChzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHlgIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IG1vc3RgIDogYHVuZGVyYH0gJHtpc3N1ZS5tYXhpbXVtfSBjaGFyYWN0ZXIocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseWBcbiAgICAgICAgICAgICAgICAgICAgOiBpc3N1ZS5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGxlc3MgdGhhbiBvciBlcXVhbCB0b2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX1gO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJiaWdpbnRcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEJpZ0ludCBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseWBcbiAgICAgICAgICAgICAgICAgICAgOiBpc3N1ZS5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGxlc3MgdGhhbiBvciBlcXVhbCB0b2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX1gO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJkYXRlXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBEYXRlIG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5YFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgc21hbGxlciB0aGFuYH0gJHtuZXcgRGF0ZShOdW1iZXIoaXNzdWUubWF4aW11bSkpfWA7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiSW52YWxpZCBpbnB1dFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmN1c3RvbTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXM6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludGVyc2VjdGlvbiByZXN1bHRzIGNvdWxkIG5vdCBiZSBtZXJnZWRgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLm5vdF9tdWx0aXBsZV9vZjpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAke2lzc3VlLm11bHRpcGxlT2Z9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5ub3RfZmluaXRlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IFwiTnVtYmVyIG11c3QgYmUgZmluaXRlXCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBfY3R4LmRlZmF1bHRFcnJvcjtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoaXNzdWUpO1xuICAgIH1cbiAgICByZXR1cm4geyBtZXNzYWdlIH07XG59O1xuXG5sZXQgb3ZlcnJpZGVFcnJvck1hcCA9IGVycm9yTWFwO1xuZnVuY3Rpb24gc2V0RXJyb3JNYXAobWFwKSB7XG4gICAgb3ZlcnJpZGVFcnJvck1hcCA9IG1hcDtcbn1cbmZ1bmN0aW9uIGdldEVycm9yTWFwKCkge1xuICAgIHJldHVybiBvdmVycmlkZUVycm9yTWFwO1xufVxuXG5jb25zdCBtYWtlSXNzdWUgPSAocGFyYW1zKSA9PiB7XG4gICAgY29uc3QgeyBkYXRhLCBwYXRoLCBlcnJvck1hcHMsIGlzc3VlRGF0YSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gWy4uLnBhdGgsIC4uLihpc3N1ZURhdGEucGF0aCB8fCBbXSldO1xuICAgIGNvbnN0IGZ1bGxJc3N1ZSA9IHtcbiAgICAgICAgLi4uaXNzdWVEYXRhLFxuICAgICAgICBwYXRoOiBmdWxsUGF0aCxcbiAgICB9O1xuICAgIGlmIChpc3N1ZURhdGEubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5pc3N1ZURhdGEsXG4gICAgICAgICAgICBwYXRoOiBmdWxsUGF0aCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGlzc3VlRGF0YS5tZXNzYWdlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gXCJcIjtcbiAgICBjb25zdCBtYXBzID0gZXJyb3JNYXBzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICEhbSlcbiAgICAgICAgLnNsaWNlKClcbiAgICAgICAgLnJldmVyc2UoKTtcbiAgICBmb3IgKGNvbnN0IG1hcCBvZiBtYXBzKSB7XG4gICAgICAgIGVycm9yTWVzc2FnZSA9IG1hcChmdWxsSXNzdWUsIHsgZGF0YSwgZGVmYXVsdEVycm9yOiBlcnJvck1lc3NhZ2UgfSkubWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaXNzdWVEYXRhLFxuICAgICAgICBwYXRoOiBmdWxsUGF0aCxcbiAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgIH07XG59O1xuY29uc3QgRU1QVFlfUEFUSCA9IFtdO1xuZnVuY3Rpb24gYWRkSXNzdWVUb0NvbnRleHQoY3R4LCBpc3N1ZURhdGEpIHtcbiAgICBjb25zdCBvdmVycmlkZU1hcCA9IGdldEVycm9yTWFwKCk7XG4gICAgY29uc3QgaXNzdWUgPSBtYWtlSXNzdWUoe1xuICAgICAgICBpc3N1ZURhdGE6IGlzc3VlRGF0YSxcbiAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICBlcnJvck1hcHM6IFtcbiAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLCAvLyBjb250ZXh0dWFsIGVycm9yIG1hcCBpcyBmaXJzdCBwcmlvcml0eVxuICAgICAgICAgICAgY3R4LnNjaGVtYUVycm9yTWFwLCAvLyB0aGVuIHNjaGVtYS1ib3VuZCBtYXAgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICBvdmVycmlkZU1hcCwgLy8gdGhlbiBnbG9iYWwgb3ZlcnJpZGUgbWFwXG4gICAgICAgICAgICBvdmVycmlkZU1hcCA9PT0gZXJyb3JNYXAgPyB1bmRlZmluZWQgOiBlcnJvck1hcCwgLy8gdGhlbiBnbG9iYWwgZGVmYXVsdCBtYXBcbiAgICAgICAgXS5maWx0ZXIoKHgpID0+ICEheCksXG4gICAgfSk7XG4gICAgY3R4LmNvbW1vbi5pc3N1ZXMucHVzaChpc3N1ZSk7XG59XG5jbGFzcyBQYXJzZVN0YXR1cyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcInZhbGlkXCI7XG4gICAgfVxuICAgIGRpcnR5KCkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSA9PT0gXCJ2YWxpZFwiKVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiZGlydHlcIjtcbiAgICB9XG4gICAgYWJvcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlICE9PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcImFib3J0ZWRcIjtcbiAgICB9XG4gICAgc3RhdGljIG1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHRzKSB7XG4gICAgICAgIGNvbnN0IGFycmF5VmFsdWUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGlmIChzLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICBpZiAocy5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGFycmF5VmFsdWUucHVzaChzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGFycmF5VmFsdWUgfTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIG1lcmdlT2JqZWN0QXN5bmMoc3RhdHVzLCBwYWlycykge1xuICAgICAgICBjb25zdCBzeW5jUGFpcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBwYWlyLmtleTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcGFpci52YWx1ZTtcbiAgICAgICAgICAgIHN5bmNQYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgc3luY1BhaXJzKTtcbiAgICB9XG4gICAgc3RhdGljIG1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHBhaXJzKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsT2JqZWN0ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgY29uc3QgeyBrZXksIHZhbHVlIH0gPSBwYWlyO1xuICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgaWYgKGtleS52YWx1ZSAhPT0gXCJfX3Byb3RvX19cIiAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgdmFsdWUudmFsdWUgIT09IFwidW5kZWZpbmVkXCIgfHwgcGFpci5hbHdheXNTZXQpKSB7XG4gICAgICAgICAgICAgICAgZmluYWxPYmplY3Rba2V5LnZhbHVlXSA9IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxPYmplY3QgfTtcbiAgICB9XG59XG5jb25zdCBJTlZBTElEID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgc3RhdHVzOiBcImFib3J0ZWRcIixcbn0pO1xuY29uc3QgRElSVFkgPSAodmFsdWUpID0+ICh7IHN0YXR1czogXCJkaXJ0eVwiLCB2YWx1ZSB9KTtcbmNvbnN0IE9LID0gKHZhbHVlKSA9PiAoeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWUgfSk7XG5jb25zdCBpc0Fib3J0ZWQgPSAoeCkgPT4geC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiO1xuY29uc3QgaXNEaXJ0eSA9ICh4KSA9PiB4LnN0YXR1cyA9PT0gXCJkaXJ0eVwiO1xuY29uc3QgaXNWYWxpZCA9ICh4KSA9PiB4LnN0YXR1cyA9PT0gXCJ2YWxpZFwiO1xuY29uc3QgaXNBc3luYyA9ICh4KSA9PiB0eXBlb2YgUHJvbWlzZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB4IGluc3RhbmNlb2YgUHJvbWlzZTtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG5mdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxudHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XHJcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XHJcbn07XG5cbnZhciBlcnJvclV0aWw7XG4oZnVuY3Rpb24gKGVycm9yVXRpbCkge1xuICAgIGVycm9yVXRpbC5lcnJUb09iaiA9IChtZXNzYWdlKSA9PiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IHsgbWVzc2FnZSB9IDogbWVzc2FnZSB8fCB7fTtcbiAgICBlcnJvclV0aWwudG9TdHJpbmcgPSAobWVzc2FnZSkgPT4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogbWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLm1lc3NhZ2U7XG59KShlcnJvclV0aWwgfHwgKGVycm9yVXRpbCA9IHt9KSk7XG5cbnZhciBfWm9kRW51bV9jYWNoZSwgX1pvZE5hdGl2ZUVudW1fY2FjaGU7XG5jbGFzcyBQYXJzZUlucHV0TGF6eVBhdGgge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgdmFsdWUsIHBhdGgsIGtleSkge1xuICAgICAgICB0aGlzLl9jYWNoZWRQYXRoID0gW107XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fcGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuX2tleSA9IGtleTtcbiAgICB9XG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGVkUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9rZXkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLCAuLi50aGlzLl9rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsIHRoaXMuX2tleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFBhdGg7XG4gICAgfVxufVxuY29uc3QgaGFuZGxlUmVzdWx0ID0gKGN0eCwgcmVzdWx0KSA9PiB7XG4gICAgaWYgKGlzVmFsaWQocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiByZXN1bHQudmFsdWUgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghY3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWYWxpZGF0aW9uIGZhaWxlZCBidXQgbm8gaXNzdWVzIGRldGVjdGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Vycm9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3IoY3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG59O1xuZnVuY3Rpb24gcHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcylcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIGNvbnN0IHsgZXJyb3JNYXAsIGludmFsaWRfdHlwZV9lcnJvciwgcmVxdWlyZWRfZXJyb3IsIGRlc2NyaXB0aW9uIH0gPSBwYXJhbXM7XG4gICAgaWYgKGVycm9yTWFwICYmIChpbnZhbGlkX3R5cGVfZXJyb3IgfHwgcmVxdWlyZWRfZXJyb3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgdXNlIFwiaW52YWxpZF90eXBlX2Vycm9yXCIgb3IgXCJyZXF1aXJlZF9lcnJvclwiIGluIGNvbmp1bmN0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1hcC5gKTtcbiAgICB9XG4gICAgaWYgKGVycm9yTWFwKVxuICAgICAgICByZXR1cm4geyBlcnJvck1hcDogZXJyb3JNYXAsIGRlc2NyaXB0aW9uIH07XG4gICAgY29uc3QgY3VzdG9tTWFwID0gKGlzcywgY3R4KSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gcGFyYW1zO1xuICAgICAgICBpZiAoaXNzLmNvZGUgPT09IFwiaW52YWxpZF9lbnVtX3ZhbHVlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IG1lc3NhZ2UgIT09IG51bGwgJiYgbWVzc2FnZSAhPT0gdm9pZCAwID8gbWVzc2FnZSA6IGN0eC5kZWZhdWx0RXJyb3IgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGN0eC5kYXRhID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiAoX2EgPSBtZXNzYWdlICE9PSBudWxsICYmIG1lc3NhZ2UgIT09IHZvaWQgMCA/IG1lc3NhZ2UgOiByZXF1aXJlZF9lcnJvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc3MuY29kZSAhPT0gXCJpbnZhbGlkX3R5cGVcIilcbiAgICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IGN0eC5kZWZhdWx0RXJyb3IgfTtcbiAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogKF9iID0gbWVzc2FnZSAhPT0gbnVsbCAmJiBtZXNzYWdlICE9PSB2b2lkIDAgPyBtZXNzYWdlIDogaW52YWxpZF90eXBlX2Vycm9yKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBjdHguZGVmYXVsdEVycm9yIH07XG4gICAgfTtcbiAgICByZXR1cm4geyBlcnJvck1hcDogY3VzdG9tTWFwLCBkZXNjcmlwdGlvbiB9O1xufVxuY2xhc3MgWm9kVHlwZSB7XG4gICAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBfZ2V0VHlwZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0UGFyc2VkVHlwZShpbnB1dC5kYXRhKTtcbiAgICB9XG4gICAgX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIChjdHggfHwge1xuICAgICAgICAgICAgY29tbW9uOiBpbnB1dC5wYXJlbnQuY29tbW9uLFxuICAgICAgICAgICAgZGF0YTogaW5wdXQuZGF0YSxcbiAgICAgICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoaW5wdXQuZGF0YSksXG4gICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgcGF0aDogaW5wdXQucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDogaW5wdXQucGFyZW50LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhdHVzOiBuZXcgUGFyc2VTdGF0dXMoKSxcbiAgICAgICAgICAgIGN0eDoge1xuICAgICAgICAgICAgICAgIGNvbW1vbjogaW5wdXQucGFyZW50LmNvbW1vbixcbiAgICAgICAgICAgICAgICBkYXRhOiBpbnB1dC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoaW5wdXQuZGF0YSksXG4gICAgICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgICAgICBwYXRoOiBpbnB1dC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogaW5wdXQucGFyZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX3BhcnNlU3luYyhpbnB1dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZShpbnB1dCk7XG4gICAgICAgIGlmIChpc0FzeW5jKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNocm9ub3VzIHBhcnNlIGVuY291bnRlcmVkIHByb21pc2UuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIF9wYXJzZUFzeW5jKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlKGlucHV0KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuICAgIH1cbiAgICBwYXJzZShkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zYWZlUGFyc2UoZGF0YSwgcGFyYW1zKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgfVxuICAgIHNhZmVQYXJzZShkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBjdHggPSB7XG4gICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgIGFzeW5jOiAoX2EgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuYXN5bmMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbnRleHR1YWxFcnJvck1hcDogcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmVycm9yTWFwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhdGg6IChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMucGF0aCkgfHwgW10sXG4gICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoZGF0YSksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlU3luYyh7IGRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlc3VsdChjdHgsIHJlc3VsdCk7XG4gICAgfVxuICAgIFwifnZhbGlkYXRlXCIoZGF0YSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBjdHggPSB7XG4gICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgIGFzeW5jOiAhIXRoaXNbXCJ+c3RhbmRhcmRcIl0uYXN5bmMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoZGF0YSksXG4gICAgICAgIH07XG4gICAgICAgIGlmICghdGhpc1tcIn5zdGFuZGFyZFwiXS5hc3luYykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZVN5bmMoeyBkYXRhLCBwYXRoOiBbXSwgcGFyZW50OiBjdHggfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGN0eC5jb21tb24uaXNzdWVzLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmICgoX2IgPSAoX2EgPSBlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIubWVzc2FnZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvTG93ZXJDYXNlKCkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pbmNsdWRlcyhcImVuY291bnRlcmVkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbXCJ+c3RhbmRhcmRcIl0uYXN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdHguY29tbW9uID0ge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJzZUFzeW5jKHsgZGF0YSwgcGF0aDogW10sIHBhcmVudDogY3R4IH0pLnRoZW4oKHJlc3VsdCkgPT4gaXNWYWxpZChyZXN1bHQpXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgaXNzdWVzOiBjdHguY29tbW9uLmlzc3VlcyxcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBwYXJzZUFzeW5jKGRhdGEsIHBhcmFtcykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNhZmVQYXJzZUFzeW5jKGRhdGEsIHBhcmFtcyk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcylcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICBhc3luYyBzYWZlUGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5lcnJvck1hcCxcbiAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBhdGgpIHx8IFtdLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtYXliZUFzeW5jUmVzdWx0ID0gdGhpcy5fcGFyc2UoeyBkYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChpc0FzeW5jKG1heWJlQXN5bmNSZXN1bHQpXG4gICAgICAgICAgICA/IG1heWJlQXN5bmNSZXN1bHRcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKG1heWJlQXN5bmNSZXN1bHQpKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlc3VsdChjdHgsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJlZmluZShjaGVjaywgbWVzc2FnZSkge1xuICAgICAgICBjb25zdCBnZXRJc3N1ZVByb3BlcnRpZXMgPSAodmFsKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIG1lc3NhZ2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UodmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudCgodmFsLCBjdHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrKHZhbCk7XG4gICAgICAgICAgICBjb25zdCBzZXRFcnJvciA9ICgpID0+IGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgICAgICAuLi5nZXRJc3N1ZVByb3BlcnRpZXModmFsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm9taXNlICE9PSBcInVuZGVmaW5lZFwiICYmIHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlZmluZW1lbnQoY2hlY2ssIHJlZmluZW1lbnREYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KCh2YWwsIGN0eCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjaGVjayh2YWwpKSB7XG4gICAgICAgICAgICAgICAgY3R4LmFkZElzc3VlKHR5cGVvZiByZWZpbmVtZW50RGF0YSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID8gcmVmaW5lbWVudERhdGEodmFsLCBjdHgpXG4gICAgICAgICAgICAgICAgICAgIDogcmVmaW5lbWVudERhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3JlZmluZW1lbnQocmVmaW5lbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwicmVmaW5lbWVudFwiLCByZWZpbmVtZW50IH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdXBlclJlZmluZShyZWZpbmVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KHJlZmluZW1lbnQpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihkZWYpIHtcbiAgICAgICAgLyoqIEFsaWFzIG9mIHNhZmVQYXJzZUFzeW5jICovXG4gICAgICAgIHRoaXMuc3BhID0gdGhpcy5zYWZlUGFyc2VBc3luYztcbiAgICAgICAgdGhpcy5fZGVmID0gZGVmO1xuICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5wYXJzZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNhZmVQYXJzZSA9IHRoaXMuc2FmZVBhcnNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucGFyc2VBc3luYyA9IHRoaXMucGFyc2VBc3luYy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNhZmVQYXJzZUFzeW5jID0gdGhpcy5zYWZlUGFyc2VBc3luYy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNwYSA9IHRoaXMuc3BhLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVmaW5lID0gdGhpcy5yZWZpbmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZpbmVtZW50ID0gdGhpcy5yZWZpbmVtZW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3VwZXJSZWZpbmUgPSB0aGlzLnN1cGVyUmVmaW5lLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSB0aGlzLm9wdGlvbmFsLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubnVsbGFibGUgPSB0aGlzLm51bGxhYmxlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubnVsbGlzaCA9IHRoaXMubnVsbGlzaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmFycmF5ID0gdGhpcy5hcnJheS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnByb21pc2UgPSB0aGlzLnByb21pc2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vciA9IHRoaXMub3IuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5hbmQgPSB0aGlzLmFuZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYnJhbmQgPSB0aGlzLmJyYW5kLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVmYXVsdCA9IHRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNhdGNoID0gdGhpcy5jYXRjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmRlc2NyaWJlID0gdGhpcy5kZXNjcmliZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnBpcGUgPSB0aGlzLnBpcGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWFkb25seSA9IHRoaXMucmVhZG9ubHkuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pc051bGxhYmxlID0gdGhpcy5pc051bGxhYmxlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaXNPcHRpb25hbCA9IHRoaXMuaXNPcHRpb25hbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzW1wifnN0YW5kYXJkXCJdID0ge1xuICAgICAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgICAgIHZlbmRvcjogXCJ6b2RcIixcbiAgICAgICAgICAgIHZhbGlkYXRlOiAoZGF0YSkgPT4gdGhpc1tcIn52YWxpZGF0ZVwiXShkYXRhKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgb3B0aW9uYWwoKSB7XG4gICAgICAgIHJldHVybiBab2RPcHRpb25hbC5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgbnVsbGFibGUoKSB7XG4gICAgICAgIHJldHVybiBab2ROdWxsYWJsZS5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgbnVsbGlzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVsbGFibGUoKS5vcHRpb25hbCgpO1xuICAgIH1cbiAgICBhcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZEFycmF5LmNyZWF0ZSh0aGlzKTtcbiAgICB9XG4gICAgcHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZFByb21pc2UuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIG9yKG9wdGlvbikge1xuICAgICAgICByZXR1cm4gWm9kVW5pb24uY3JlYXRlKFt0aGlzLCBvcHRpb25dLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBhbmQoaW5jb21pbmcpIHtcbiAgICAgICAgcmV0dXJuIFpvZEludGVyc2VjdGlvbi5jcmVhdGUodGhpcywgaW5jb21pbmcsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIHRyYW5zZm9ybSh0cmFuc2Zvcm0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcyxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cyxcbiAgICAgICAgICAgIGVmZmVjdDogeyB0eXBlOiBcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0gfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRlZmF1bHQoZGVmKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZUZ1bmMgPSB0eXBlb2YgZGVmID09PSBcImZ1bmN0aW9uXCIgPyBkZWYgOiAoKSA9PiBkZWY7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRGVmYXVsdCh7XG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgICAgICBpbm5lclR5cGU6IHRoaXMsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZUZ1bmMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBicmFuZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RCcmFuZGVkKHtcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQnJhbmRlZCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMsXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaChkZWYpIHtcbiAgICAgICAgY29uc3QgY2F0Y2hWYWx1ZUZ1bmMgPSB0eXBlb2YgZGVmID09PSBcImZ1bmN0aW9uXCIgPyBkZWYgOiAoKSA9PiBkZWY7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goe1xuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICAgICAgaW5uZXJUeXBlOiB0aGlzLFxuICAgICAgICAgICAgY2F0Y2hWYWx1ZTogY2F0Y2hWYWx1ZUZ1bmMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZENhdGNoLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVzY3JpYmUoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgVGhpcyA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHJldHVybiBuZXcgVGhpcyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBpcGUodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBab2RQaXBlbGluZS5jcmVhdGUodGhpcywgdGFyZ2V0KTtcbiAgICB9XG4gICAgcmVhZG9ubHkoKSB7XG4gICAgICAgIHJldHVybiBab2RSZWFkb25seS5jcmVhdGUodGhpcyk7XG4gICAgfVxuICAgIGlzT3B0aW9uYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhZmVQYXJzZSh1bmRlZmluZWQpLnN1Y2Nlc3M7XG4gICAgfVxuICAgIGlzTnVsbGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhZmVQYXJzZShudWxsKS5zdWNjZXNzO1xuICAgIH1cbn1cbmNvbnN0IGN1aWRSZWdleCA9IC9eY1teXFxzLV17OCx9JC9pO1xuY29uc3QgY3VpZDJSZWdleCA9IC9eWzAtOWEtel0rJC87XG5jb25zdCB1bGlkUmVnZXggPSAvXlswLTlBLUhKS01OUC1UVi1aXXsyNn0kL2k7XG4vLyBjb25zdCB1dWlkUmVnZXggPVxuLy8gICAvXihbYS1mMC05XXs4fS1bYS1mMC05XXs0fS1bMS01XVthLWYwLTldezN9LVthLWYwLTldezR9LVthLWYwLTldezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO1xuY29uc3QgdXVpZFJlZ2V4ID0gL15bMC05YS1mQS1GXXs4fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXsxMn0kL2k7XG5jb25zdCBuYW5vaWRSZWdleCA9IC9eW2EtejAtOV8tXXsyMX0kL2k7XG5jb25zdCBqd3RSZWdleCA9IC9eW0EtWmEtejAtOS1fXStcXC5bQS1aYS16MC05LV9dK1xcLltBLVphLXowLTktX10qJC87XG5jb25zdCBkdXJhdGlvblJlZ2V4ID0gL15bLStdP1AoPyEkKSg/Oig/OlstK10/XFxkK1kpfCg/OlstK10/XFxkK1suLF1cXGQrWSQpKT8oPzooPzpbLStdP1xcZCtNKXwoPzpbLStdP1xcZCtbLixdXFxkK00kKSk/KD86KD86Wy0rXT9cXGQrVyl8KD86Wy0rXT9cXGQrWy4sXVxcZCtXJCkpPyg/Oig/OlstK10/XFxkK0QpfCg/OlstK10/XFxkK1suLF1cXGQrRCQpKT8oPzpUKD89W1xcZCstXSkoPzooPzpbLStdP1xcZCtIKXwoPzpbLStdP1xcZCtbLixdXFxkK0gkKSk/KD86KD86Wy0rXT9cXGQrTSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtNJCkpPyg/OlstK10/XFxkKyg/OlsuLF1cXGQrKT9TKT8pPz8kLztcbi8vIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2MTgxLzE1NTAxNTVcbi8vIG9sZCB2ZXJzaW9uOiB0b28gc2xvdywgZGlkbid0IHN1cHBvcnQgdW5pY29kZVxuLy8gY29uc3QgZW1haWxSZWdleCA9IC9eKCgoW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKyhcXC4oW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKykqKXwoKFxceDIyKSgoKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KChbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHg3Zl18XFx4MjF8W1xceDIzLVxceDViXXxbXFx4NWQtXFx4N2VdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoXFxcXChbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGQtXFx4N2ZdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpKSooKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KFxceDIyKSkpQCgoKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4pKygoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKSQvaTtcbi8vb2xkIGVtYWlsIHJlZ2V4XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID0gL14oKFtePD4oKVtcXF0uLDs6XFxzQFwiXSsoXFwuW148PigpW1xcXS4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKCg/IS0pKFtePD4oKVtcXF0uLDs6XFxzQFwiXStcXC4pK1tePD4oKVtcXF0uLDs6XFxzQFwiXXsxLH0pW14tPD4oKVtcXF0uLDs6XFxzQFwiXSQvaTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eKChbXjw+KClbXFxdXFxcXC4sOzpcXHNAXFxcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFxcWygoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcXSl8KFxcW0lQdjY6KChbYS1mMC05XXsxLDR9Oil7N318OjooW2EtZjAtOV17MSw0fTopezAsNn18KFthLWYwLTldezEsNH06KXsxfTooW2EtZjAtOV17MSw0fTopezAsNX18KFthLWYwLTldezEsNH06KXsyfTooW2EtZjAtOV17MSw0fTopezAsNH18KFthLWYwLTldezEsNH06KXszfTooW2EtZjAtOV17MSw0fTopezAsM318KFthLWYwLTldezEsNH06KXs0fTooW2EtZjAtOV17MSw0fTopezAsMn18KFthLWYwLTldezEsNH06KXs1fTooW2EtZjAtOV17MSw0fTopezAsMX0pKFthLWYwLTldezEsNH18KCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXFwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpKVxcXSl8KFtBLVphLXowLTldKFtBLVphLXowLTktXSpbQS1aYS16MC05XSkqKFxcLltBLVphLXpdezIsfSkrKSkkLztcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXlthLXpBLVowLTlcXC5cXCFcXCNcXCRcXCVcXCZcXCdcXCpcXCtcXC9cXD1cXD9cXF5cXF9cXGBcXHtcXHxcXH1cXH5cXC1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO1xuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eKD86W2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKnxcIig/OltcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDIxXFx4MjMtXFx4NWJcXHg1ZC1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKlwiKUAoPzooPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/fFxcWyg/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/fFthLXowLTktXSpbYS16MC05XTooPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMS1cXHg1YVxceDUzLVxceDdmXXxcXFxcW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBlLVxceDdmXSkrKVxcXSkkL2k7XG5jb25zdCBlbWFpbFJlZ2V4ID0gL14oPyFcXC4pKD8hLipcXC5cXC4pKFtBLVowLTlfJytcXC1cXC5dKilbQS1aMC05XystXUAoW0EtWjAtOV1bQS1aMC05XFwtXSpcXC4pK1tBLVpdezIsfSQvaTtcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXlthLXowLTkuISMkJSbigJkqKy89P15fYHt8fX4tXStAW2EtejAtOS1dKyg/OlxcLlthLXowLTlcXC1dKykqJC9pO1xuLy8gZnJvbSBodHRwczovL3RoZWtldmluc2NvdHQuY29tL2Vtb2ppcy1pbi1qYXZhc2NyaXB0LyN3cml0aW5nLWEtcmVndWxhci1leHByZXNzaW9uXG5jb25zdCBfZW1vamlSZWdleCA9IGBeKFxcXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxcXHB7RW1vamlfQ29tcG9uZW50fSkrJGA7XG5sZXQgZW1vamlSZWdleDtcbi8vIGZhc3Rlciwgc2ltcGxlciwgc2FmZXJcbmNvbnN0IGlwdjRSZWdleCA9IC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pJC87XG5jb25zdCBpcHY0Q2lkclJlZ2V4ID0gL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcXC8oM1swLTJdfFsxMl0/WzAtOV0pJC87XG4vLyBjb25zdCBpcHY2UmVnZXggPVxuLy8gL14oKFthLWYwLTldezEsNH06KXs3fXw6OihbYS1mMC05XXsxLDR9Oil7MCw2fXwoW2EtZjAtOV17MSw0fTopezF9OihbYS1mMC05XXsxLDR9Oil7MCw1fXwoW2EtZjAtOV17MSw0fTopezJ9OihbYS1mMC05XXsxLDR9Oil7MCw0fXwoW2EtZjAtOV17MSw0fTopezN9OihbYS1mMC05XXsxLDR9Oil7MCwzfXwoW2EtZjAtOV17MSw0fTopezR9OihbYS1mMC05XXsxLDR9Oil7MCwyfXwoW2EtZjAtOV17MSw0fTopezV9OihbYS1mMC05XXsxLDR9Oil7MCwxfSkoW2EtZjAtOV17MSw0fXwoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSkpJC87XG5jb25zdCBpcHY2UmVnZXggPSAvXigoWzAtOWEtZkEtRl17MSw0fTopezcsN31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdezAsNH0pezAsNH0lWzAtOWEtekEtWl17MSx9fDo6KGZmZmYoOjB7MSw0fSl7MCwxfTopezAsMX0oKDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKVxcLil7MywzfSgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pXFwuKXszLDN9KDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKSkkLztcbmNvbnN0IGlwdjZDaWRyUmVnZXggPSAvXigoWzAtOWEtZkEtRl17MSw0fTopezcsN31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdezAsNH0pezAsNH0lWzAtOWEtekEtWl17MSx9fDo6KGZmZmYoOjB7MSw0fSl7MCwxfTopezAsMX0oKDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKVxcLil7MywzfSgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pXFwuKXszLDN9KDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKSlcXC8oMTJbMC04XXwxWzAxXVswLTldfFsxLTldP1swLTldKSQvO1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzg2MDM5Mi9kZXRlcm1pbmUtaWYtc3RyaW5nLWlzLWluLWJhc2U2NC11c2luZy1qYXZhc2NyaXB0XG5jb25zdCBiYXNlNjRSZWdleCA9IC9eKFswLTlhLXpBLVorL117NH0pKigoWzAtOWEtekEtWisvXXsyfT09KXwoWzAtOWEtekEtWisvXXszfT0pKT8kLztcbi8vIGh0dHBzOi8vYmFzZTY0Lmd1cnUvc3RhbmRhcmRzL2Jhc2U2NHVybFxuY29uc3QgYmFzZTY0dXJsUmVnZXggPSAvXihbMC05YS16QS1aLV9dezR9KSooKFswLTlhLXpBLVotX117Mn0oPT0pPyl8KFswLTlhLXpBLVotX117M30oPSk/KSk/JC87XG4vLyBzaW1wbGVcbi8vIGNvbnN0IGRhdGVSZWdleFNvdXJjZSA9IGBcXFxcZHs0fS1cXFxcZHsyfS1cXFxcZHsyfWA7XG4vLyBubyBsZWFwIHllYXIgdmFsaWRhdGlvblxuLy8gY29uc3QgZGF0ZVJlZ2V4U291cmNlID0gYFxcXFxkezR9LSgoMFsxMzU3OF18MTB8MTIpLTMxfCgwWzEzLTldfDFbMC0yXSktMzB8KDBbMS05XXwxWzAtMl0pLSgwWzEtOV18MVxcXFxkfDJcXFxcZCkpYDtcbi8vIHdpdGggbGVhcCB5ZWFyIHZhbGlkYXRpb25cbmNvbnN0IGRhdGVSZWdleFNvdXJjZSA9IGAoKFxcXFxkXFxcXGRbMjQ2OF1bMDQ4XXxcXFxcZFxcXFxkWzEzNTc5XVsyNl18XFxcXGRcXFxcZDBbNDhdfFswMjQ2OF1bMDQ4XTAwfFsxMzU3OV1bMjZdMDApLTAyLTI5fFxcXFxkezR9LSgoMFsxMzU3OF18MVswMl0pLSgwWzEtOV18WzEyXVxcXFxkfDNbMDFdKXwoMFs0NjldfDExKS0oMFsxLTldfFsxMl1cXFxcZHwzMCl8KDAyKS0oMFsxLTldfDFcXFxcZHwyWzAtOF0pKSlgO1xuY29uc3QgZGF0ZVJlZ2V4ID0gbmV3IFJlZ0V4cChgXiR7ZGF0ZVJlZ2V4U291cmNlfSRgKTtcbmZ1bmN0aW9uIHRpbWVSZWdleFNvdXJjZShhcmdzKSB7XG4gICAgLy8gbGV0IHJlZ2V4ID0gYFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9YDtcbiAgICBsZXQgcmVnZXggPSBgKFswMV1cXFxcZHwyWzAtM10pOlswLTVdXFxcXGQ6WzAtNV1cXFxcZGA7XG4gICAgaWYgKGFyZ3MucHJlY2lzaW9uKSB7XG4gICAgICAgIHJlZ2V4ID0gYCR7cmVnZXh9XFxcXC5cXFxcZHske2FyZ3MucHJlY2lzaW9ufX1gO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmdzLnByZWNpc2lvbiA9PSBudWxsKSB7XG4gICAgICAgIHJlZ2V4ID0gYCR7cmVnZXh9KFxcXFwuXFxcXGQrKT9gO1xuICAgIH1cbiAgICByZXR1cm4gcmVnZXg7XG59XG5mdW5jdGlvbiB0aW1lUmVnZXgoYXJncykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHt0aW1lUmVnZXhTb3VyY2UoYXJncyl9JGApO1xufVxuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zMTQzMjMxXG5mdW5jdGlvbiBkYXRldGltZVJlZ2V4KGFyZ3MpIHtcbiAgICBsZXQgcmVnZXggPSBgJHtkYXRlUmVnZXhTb3VyY2V9VCR7dGltZVJlZ2V4U291cmNlKGFyZ3MpfWA7XG4gICAgY29uc3Qgb3B0cyA9IFtdO1xuICAgIG9wdHMucHVzaChhcmdzLmxvY2FsID8gYFo/YCA6IGBaYCk7XG4gICAgaWYgKGFyZ3Mub2Zmc2V0KVxuICAgICAgICBvcHRzLnB1c2goYChbKy1dXFxcXGR7Mn06P1xcXFxkezJ9KWApO1xuICAgIHJlZ2V4ID0gYCR7cmVnZXh9KCR7b3B0cy5qb2luKFwifFwiKX0pYDtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7cmVnZXh9JGApO1xufVxuZnVuY3Rpb24gaXNWYWxpZElQKGlwLCB2ZXJzaW9uKSB7XG4gICAgaWYgKCh2ZXJzaW9uID09PSBcInY0XCIgfHwgIXZlcnNpb24pICYmIGlwdjRSZWdleC50ZXN0KGlwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCh2ZXJzaW9uID09PSBcInY2XCIgfHwgIXZlcnNpb24pICYmIGlwdjZSZWdleC50ZXN0KGlwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNWYWxpZEpXVChqd3QsIGFsZykge1xuICAgIGlmICghand0UmVnZXgudGVzdChqd3QpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgW2hlYWRlcl0gPSBqd3Quc3BsaXQoXCIuXCIpO1xuICAgICAgICAvLyBDb252ZXJ0IGJhc2U2NHVybCB0byBiYXNlNjRcbiAgICAgICAgY29uc3QgYmFzZTY0ID0gaGVhZGVyXG4gICAgICAgICAgICAucmVwbGFjZSgvLS9nLCBcIitcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC9fL2csIFwiL1wiKVxuICAgICAgICAgICAgLnBhZEVuZChoZWFkZXIubGVuZ3RoICsgKCg0IC0gKGhlYWRlci5sZW5ndGggJSA0KSkgJSA0KSwgXCI9XCIpO1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gSlNPTi5wYXJzZShhdG9iKGJhc2U2NCkpO1xuICAgICAgICBpZiAodHlwZW9mIGRlY29kZWQgIT09IFwib2JqZWN0XCIgfHwgZGVjb2RlZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFkZWNvZGVkLnR5cCB8fCAhZGVjb2RlZC5hbGcpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChhbGcgJiYgZGVjb2RlZC5hbGcgIT09IGFsZylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNWYWxpZENpZHIoaXAsIHZlcnNpb24pIHtcbiAgICBpZiAoKHZlcnNpb24gPT09IFwidjRcIiB8fCAhdmVyc2lvbikgJiYgaXB2NENpZHJSZWdleC50ZXN0KGlwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCh2ZXJzaW9uID09PSBcInY2XCIgfHwgIXZlcnNpb24pICYmIGlwdjZDaWRyUmVnZXgudGVzdChpcCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmNsYXNzIFpvZFN0cmluZyBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IFN0cmluZyhpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zdHJpbmcsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmxlbmd0aCA8IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gaW5wdXQuZGF0YS5sZW5ndGggPCBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9vQmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZW1haWxcIikge1xuICAgICAgICAgICAgICAgIGlmICghZW1haWxSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZW1haWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVtb2ppXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtb2ppUmVnZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1vamlSZWdleCA9IG5ldyBSZWdFeHAoX2Vtb2ppUmVnZXgsIFwidVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFlbW9qaVJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJlbW9qaVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidXVpZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dWlkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInV1aWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm5hbm9pZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuYW5vaWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwibmFub2lkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJjdWlkXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1aWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiY3VpZDJcIikge1xuICAgICAgICAgICAgICAgIGlmICghY3VpZDJSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZDJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInVsaWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdWxpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ1bGlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ1cmxcIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoaW5wdXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwicmVnZXhcIikge1xuICAgICAgICAgICAgICAgIGNoZWNrLnJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdFJlc3VsdCA9IGNoZWNrLnJlZ2V4LnRlc3QoaW5wdXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXN0UmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwicmVnZXhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRyaW1cIikge1xuICAgICAgICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiaW5jbHVkZXNcIikge1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YS5pbmNsdWRlcyhjaGVjay52YWx1ZSwgY2hlY2sucG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgaW5jbHVkZXM6IGNoZWNrLnZhbHVlLCBwb3NpdGlvbjogY2hlY2sucG9zaXRpb24gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRvTG93ZXJDYXNlXCIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ0b1VwcGVyQ2FzZVwiKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IGlucHV0LmRhdGEudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwic3RhcnRzV2l0aFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kYXRhLnN0YXJ0c1dpdGgoY2hlY2sudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgc3RhcnRzV2l0aDogY2hlY2sudmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVuZHNXaXRoXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuZW5kc1dpdGgoY2hlY2sudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgZW5kc1dpdGg6IGNoZWNrLnZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJkYXRldGltZVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSBkYXRldGltZVJlZ2V4KGNoZWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSBkYXRlUmVnZXg7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidGltZVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSB0aW1lUmVnZXgoY2hlY2spO1xuICAgICAgICAgICAgICAgIGlmICghcmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImR1cmF0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWR1cmF0aW9uUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJpcFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkSVAoaW5wdXQuZGF0YSwgY2hlY2sudmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJpcFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiand0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRKV1QoaW5wdXQuZGF0YSwgY2hlY2suYWxnKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImp3dFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiY2lkclwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkQ2lkcihpbnB1dC5kYXRhLCBjaGVjay52ZXJzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImNpZHJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImJhc2U2NFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFiYXNlNjRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiYmFzZTY0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJiYXNlNjR1cmxcIikge1xuICAgICAgICAgICAgICAgIGlmICghYmFzZTY0dXJsUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImJhc2U2NHVybFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBfcmVnZXgocmVnZXgsIHZhbGlkYXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmaW5lbWVudCgoZGF0YSkgPT4gcmVnZXgudGVzdChkYXRhKSwge1xuICAgICAgICAgICAgdmFsaWRhdGlvbixcbiAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbWFpbChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZW1haWxcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICB1cmwobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInVybFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGVtb2ppKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJlbW9qaVwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIHV1aWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInV1aWRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBuYW5vaWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcIm5hbm9pZFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGN1aWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImN1aWRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBjdWlkMihtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiY3VpZDJcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICB1bGlkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1bGlkXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgYmFzZTY0KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJiYXNlNjRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBiYXNlNjR1cmwobWVzc2FnZSkge1xuICAgICAgICAvLyBiYXNlNjR1cmwgZW5jb2RpbmcgaXMgYSBtb2RpZmljYXRpb24gb2YgYmFzZTY0IHRoYXQgY2FuIHNhZmVseSBiZSB1c2VkIGluIFVSTHMgYW5kIGZpbGVuYW1lc1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJiYXNlNjR1cmxcIixcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGp3dChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiand0XCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zKSB9KTtcbiAgICB9XG4gICAgaXAob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImlwXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zKSB9KTtcbiAgICB9XG4gICAgY2lkcihvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiY2lkclwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucykgfSk7XG4gICAgfVxuICAgIGRhdGV0aW1lKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgICAgICAgICBwcmVjaXNpb246IG51bGwsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsb2NhbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogb3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICBwcmVjaXNpb246IHR5cGVvZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZWNpc2lvbikgPT09IFwidW5kZWZpbmVkXCIgPyBudWxsIDogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZWNpc2lvbixcbiAgICAgICAgICAgIG9mZnNldDogKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm9mZnNldCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsXG4gICAgICAgICAgICBsb2NhbDogKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxvY2FsKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZSxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkYXRlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJkYXRlXCIsIG1lc3NhZ2UgfSk7XG4gICAgfVxuICAgIHRpbWUob3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICAgICAga2luZDogXCJ0aW1lXCIsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiBudWxsLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJ0aW1lXCIsXG4gICAgICAgICAgICBwcmVjaXNpb246IHR5cGVvZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZWNpc2lvbikgPT09IFwidW5kZWZpbmVkXCIgPyBudWxsIDogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZWNpc2lvbixcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkdXJhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZHVyYXRpb25cIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICByZWdleChyZWdleCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJyZWdleFwiLFxuICAgICAgICAgICAgcmVnZXg6IHJlZ2V4LFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5jbHVkZXModmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiaW5jbHVkZXNcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucG9zaXRpb24sXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhcnRzV2l0aCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJzdGFydHNXaXRoXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbmRzV2l0aCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJlbmRzV2l0aFwiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWluKG1pbkxlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBtaW5MZW5ndGgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4TGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IG1heExlbmd0aCxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxlbmd0aChsZW4sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibGVuZ3RoXCIsXG4gICAgICAgICAgICB2YWx1ZTogbGVuLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXF1aXZhbGVudCB0byBgLm1pbigxKWBcbiAgICAgKi9cbiAgICBub25lbXB0eShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigxLCBlcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkpO1xuICAgIH1cbiAgICB0cmltKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6IFwidHJpbVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9Mb3dlckNhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0b0xvd2VyQ2FzZVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9VcHBlckNhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0b1VwcGVyQ2FzZVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGlzRGF0ZXRpbWUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZGF0ZXRpbWVcIik7XG4gICAgfVxuICAgIGdldCBpc0RhdGUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZGF0ZVwiKTtcbiAgICB9XG4gICAgZ2V0IGlzVGltZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ0aW1lXCIpO1xuICAgIH1cbiAgICBnZXQgaXNEdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJkdXJhdGlvblwiKTtcbiAgICB9XG4gICAgZ2V0IGlzRW1haWwoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZW1haWxcIik7XG4gICAgfVxuICAgIGdldCBpc1VSTCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ1cmxcIik7XG4gICAgfVxuICAgIGdldCBpc0Vtb2ppKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImVtb2ppXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVVUlEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcInV1aWRcIik7XG4gICAgfVxuICAgIGdldCBpc05BTk9JRCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJuYW5vaWRcIik7XG4gICAgfVxuICAgIGdldCBpc0NVSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY3VpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQ1VJRDIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY3VpZDJcIik7XG4gICAgfVxuICAgIGdldCBpc1VMSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidWxpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzSVAoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiaXBcIik7XG4gICAgfVxuICAgIGdldCBpc0NJRFIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY2lkclwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQmFzZTY0KCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImJhc2U2NFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQmFzZTY0dXJsKCkge1xuICAgICAgICAvLyBiYXNlNjR1cmwgZW5jb2RpbmcgaXMgYSBtb2RpZmljYXRpb24gb2YgYmFzZTY0IHRoYXQgY2FuIHNhZmVseSBiZSB1c2VkIGluIFVSTHMgYW5kIGZpbGVuYW1lc1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImJhc2U2NHVybFwiKTtcbiAgICB9XG4gICAgZ2V0IG1pbkxlbmd0aCgpIHtcbiAgICAgICAgbGV0IG1pbiA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKVxuICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICBnZXQgbWF4TGVuZ3RoKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxuWm9kU3RyaW5nLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFN0cmluZyxcbiAgICAgICAgY29lcmNlOiAoX2EgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM5NjY0ODQvd2h5LWRvZXMtbW9kdWx1cy1vcGVyYXRvci1yZXR1cm4tZnJhY3Rpb25hbC1udW1iZXItaW4tamF2YXNjcmlwdC8zMTcxMTAzNCMzMTcxMTAzNFxuZnVuY3Rpb24gZmxvYXRTYWZlUmVtYWluZGVyKHZhbCwgc3RlcCkge1xuICAgIGNvbnN0IHZhbERlY0NvdW50ID0gKHZhbC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgY29uc3Qgc3RlcERlY0NvdW50ID0gKHN0ZXAudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoO1xuICAgIGNvbnN0IGRlY0NvdW50ID0gdmFsRGVjQ291bnQgPiBzdGVwRGVjQ291bnQgPyB2YWxEZWNDb3VudCA6IHN0ZXBEZWNDb3VudDtcbiAgICBjb25zdCB2YWxJbnQgPSBwYXJzZUludCh2YWwudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgIGNvbnN0IHN0ZXBJbnQgPSBwYXJzZUludChzdGVwLnRvRml4ZWQoZGVjQ291bnQpLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcbiAgICByZXR1cm4gKHZhbEludCAlIHN0ZXBJbnQpIC8gTWF0aC5wb3coMTAsIGRlY0NvdW50KTtcbn1cbmNsYXNzIFpvZE51bWJlciBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm1pbiA9IHRoaXMuZ3RlO1xuICAgICAgICB0aGlzLm1heCA9IHRoaXMubHRlO1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLm11bHRpcGxlT2Y7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IE51bWJlcihpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bWJlcikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5udW1iZXIsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3R4ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJpbnRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdXRpbC5pc0ludGVnZXIoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcImludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBcImZsb2F0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gY2hlY2suaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgID8gaW5wdXQuZGF0YSA8IGNoZWNrLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogaW5wdXQuZGF0YSA8PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIGlmIChmbG9hdFNhZmVSZW1haW5kZXIoaW5wdXQuZGF0YSwgY2hlY2sudmFsdWUpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5ub3RfbXVsdGlwbGVfb2YsXG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZU9mOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImZpbml0ZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLm5vdF9maW5pdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgZ3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgc2V0TGltaXQoa2luZCwgdmFsdWUsIGluY2x1c2l2ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE51bWJlcih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGludChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImludFwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5lZ2F0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25wb3NpdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25uZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtdWx0aXBsZU9mKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm11bHRpcGxlT2ZcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZpbml0ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImZpbml0ZVwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2FmZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KS5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBtaW5WYWx1ZSgpIHtcbiAgICAgICAgbGV0IG1pbiA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKVxuICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICBnZXQgbWF4VmFsdWUoKSB7XG4gICAgICAgIGxldCBtYXggPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heClcbiAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG4gICAgZ2V0IGlzSW50KCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImludFwiIHx8XG4gICAgICAgICAgICAoY2gua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIgJiYgdXRpbC5pc0ludGVnZXIoY2gudmFsdWUpKSk7XG4gICAgfVxuICAgIGdldCBpc0Zpbml0ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGwsIG1pbiA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwiZmluaXRlXCIgfHxcbiAgICAgICAgICAgICAgICBjaC5raW5kID09PSBcImludFwiIHx8XG4gICAgICAgICAgICAgICAgY2gua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKVxuICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG1pbikgJiYgTnVtYmVyLmlzRmluaXRlKG1heCk7XG4gICAgfVxufVxuWm9kTnVtYmVyLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE51bWJlcih7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTnVtYmVyLFxuICAgICAgICBjb2VyY2U6IChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSB8fCBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEJpZ0ludCBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm1pbiA9IHRoaXMuZ3RlO1xuICAgICAgICB0aGlzLm1heCA9IHRoaXMubHRlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IEJpZ0ludChpbnB1dC5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRJbnZhbGlkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYmlnaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW52YWxpZElucHV0KGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3R4ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gY2hlY2suaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgID8gaW5wdXQuZGF0YSA8IGNoZWNrLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogaW5wdXQuZGF0YSA8PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhICUgY2hlY2sudmFsdWUgIT09IEJpZ0ludCgwKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVPZjogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIF9nZXRJbnZhbGlkSW5wdXQoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5iaWdpbnQsXG4gICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICB9XG4gICAgZ3RlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBndCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHQodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RCaWdJbnQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ucG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25uZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IEJpZ0ludCgwKSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG11bHRpcGxlT2YodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibXVsdGlwbGVPZlwiLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgbWluVmFsdWUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heFZhbHVlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxuWm9kQmlnSW50LmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIG5ldyBab2RCaWdJbnQoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJpZ0ludCxcbiAgICAgICAgY29lcmNlOiAoX2EgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEJvb2xlYW4gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBCb29sZWFuKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYm9vbGVhbikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5ib29sZWFuLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZEJvb2xlYW4uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQm9vbGVhbih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQm9vbGVhbixcbiAgICAgICAgY29lcmNlOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgfHwgZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2REYXRlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gbmV3IERhdGUoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5kYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmRhdGUsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOYU4oaW5wdXQuZGF0YS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9kYXRlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmdldFRpbWUoKSA8IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5nZXRUaW1lKCkgPiBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLnZhbHVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBEYXRlKGlucHV0LmRhdGEuZ2V0VGltZSgpKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtaW4obWluRGF0ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBtaW5EYXRlLmdldFRpbWUoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhEYXRlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IG1heERhdGUuZ2V0VGltZSgpLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG1pbkRhdGUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbiAhPSBudWxsID8gbmV3IERhdGUobWluKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBtYXhEYXRlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXggIT0gbnVsbCA/IG5ldyBEYXRlKG1heCkgOiBudWxsO1xuICAgIH1cbn1cblpvZERhdGUuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRGF0ZSh7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERhdGUsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RTeW1ib2wgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zeW1ib2wpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuc3ltYm9sLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFN5bWJvbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RTeW1ib2woe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFN5bWJvbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFVuZGVmaW5lZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS51bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kVW5kZWZpbmVkLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVuZGVmaW5lZCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5kZWZpbmVkLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kTnVsbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubnVsbCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2ROdWxsLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE51bGwoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RBbnkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgLy8gdG8gcHJldmVudCBpbnN0YW5jZXMgb2Ygb3RoZXIgY2xhc3NlcyBmcm9tIGV4dGVuZGluZyBab2RBbnkuIHRoaXMgY2F1c2VzIGlzc3VlcyB3aXRoIGNhdGNoYWxsIGluIFpvZE9iamVjdC5cbiAgICAgICAgdGhpcy5fYW55ID0gdHJ1ZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RBbnkuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQW55KHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBbnksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RVbmtub3duIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8vIHJlcXVpcmVkXG4gICAgICAgIHRoaXMuX3Vua25vd24gPSB0cnVlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFVua25vd24uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVW5rbm93bih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5rbm93bixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE5ldmVyIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubmV2ZXIsXG4gICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICB9XG59XG5ab2ROZXZlci5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROZXZlcih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmV2ZXIsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RWb2lkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnZvaWQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kVm9pZC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RWb2lkKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RWb2lkLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQXJyYXkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHgsIHN0YXR1cyB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5fZGVmO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYXJyYXkpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYXJyYXksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLmV4YWN0TGVuZ3RoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjdHguZGF0YS5sZW5ndGggPiBkZWYuZXhhY3RMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGN0eC5kYXRhLmxlbmd0aCA8IGRlZi5leGFjdExlbmd0aC52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b29CaWcgfHwgdG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogdG9vQmlnID8gWm9kSXNzdWVDb2RlLnRvb19iaWcgOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiAodG9vU21hbGwgPyBkZWYuZXhhY3RMZW5ndGgudmFsdWUgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiAodG9vQmlnID8gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYuZXhhY3RMZW5ndGgubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm1pbkxlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA8IGRlZi5taW5MZW5ndGgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWluaW11bTogZGVmLm1pbkxlbmd0aC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1pbkxlbmd0aC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYubWF4TGVuZ3RoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEubGVuZ3RoID4gZGVmLm1heExlbmd0aC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heExlbmd0aC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1heExlbmd0aC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoWy4uLmN0eC5kYXRhXS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmLnR5cGUuX3BhcnNlQXN5bmMobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpKSk7XG4gICAgICAgICAgICB9KSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gWy4uLmN0eC5kYXRhXS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkZWYudHlwZS5fcGFyc2VTeW5jKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHQpO1xuICAgIH1cbiAgICBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbiAgICBtaW4obWluTGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWluTGVuZ3RoOiB7IHZhbHVlOiBtaW5MZW5ndGgsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF4KG1heExlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1heExlbmd0aDogeyB2YWx1ZTogbWF4TGVuZ3RoLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxlbmd0aChsZW4sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBleGFjdExlbmd0aDogeyB2YWx1ZTogbGVuLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKDEsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblpvZEFycmF5LmNyZWF0ZSA9IChzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICB0eXBlOiBzY2hlbWEsXG4gICAgICAgIG1pbkxlbmd0aDogbnVsbCxcbiAgICAgICAgbWF4TGVuZ3RoOiBudWxsLFxuICAgICAgICBleGFjdExlbmd0aDogbnVsbCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBcnJheSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmZ1bmN0aW9uIGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYSkge1xuICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RPYmplY3QpIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLnNoYXBlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFNjaGVtYSA9IHNjaGVtYS5zaGFwZVtrZXldO1xuICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IFpvZE9wdGlvbmFsLmNyZWF0ZShkZWVwUGFydGlhbGlmeShmaWVsZFNjaGVtYSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnNjaGVtYS5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi5zY2hlbWEuX2RlZixcbiAgICAgICAgICAgIHR5cGU6IGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYS5lbGVtZW50KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7XG4gICAgICAgIHJldHVybiBab2RPcHRpb25hbC5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE51bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiBab2ROdWxsYWJsZS5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZFR1cGxlKSB7XG4gICAgICAgIHJldHVybiBab2RUdXBsZS5jcmVhdGUoc2NoZW1hLml0ZW1zLm1hcCgoaXRlbSkgPT4gZGVlcFBhcnRpYWxpZnkoaXRlbSkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgfVxufVxuY2xhc3MgWm9kT2JqZWN0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX2NhY2hlZCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBJbiBtb3N0IGNhc2VzLCB0aGlzIGlzIG5vIGxvbmdlciBuZWVkZWQgLSB1bmtub3duIHByb3BlcnRpZXMgYXJlIG5vdyBzaWxlbnRseSBzdHJpcHBlZC5cbiAgICAgICAgICogSWYgeW91IHdhbnQgdG8gcGFzcyB0aHJvdWdoIHVua25vd24gcHJvcGVydGllcywgdXNlIGAucGFzc3Rocm91Z2goKWAgaW5zdGVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubm9uc3RyaWN0ID0gdGhpcy5wYXNzdGhyb3VnaDtcbiAgICAgICAgLy8gZXh0ZW5kPFxuICAgICAgICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIFpvZFJhd1NoYXBlLFxuICAgICAgICAvLyAgIE5ld091dHB1dCBleHRlbmRzIHV0aWwuZmxhdHRlbjx7XG4gICAgICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBPdXRwdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX291dHB1dFwiXVxuICAgICAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXRcbiAgICAgICAgLy8gICAgICAgPyBPdXRwdXRba11cbiAgICAgICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAgICAgLy8gICB9PixcbiAgICAgICAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHV0aWwuZmxhdHRlbjx7XG4gICAgICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBJbnB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfaW5wdXRcIl1cbiAgICAgICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXRcbiAgICAgICAgLy8gICAgICAgPyBJbnB1dFtrXVxuICAgICAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgICAgICAvLyAgIH0+XG4gICAgICAgIC8vID4oXG4gICAgICAgIC8vICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gKTogWm9kT2JqZWN0PFxuICAgICAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIEF1Z21lbnRhdGlvbj4sXG4gICAgICAgIC8vICAgVW5rbm93bktleXMsXG4gICAgICAgIC8vICAgQ2F0Y2hhbGwsXG4gICAgICAgIC8vICAgTmV3T3V0cHV0LFxuICAgICAgICAvLyAgIE5ld0lucHV0XG4gICAgICAgIC8vID4ge1xuICAgICAgICAvLyAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgLy8gICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgLy8gICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAvLyAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgLy8gICAgICAgLi4uYXVnbWVudGF0aW9uLFxuICAgICAgICAvLyAgICAgfSksXG4gICAgICAgIC8vICAgfSkgYXMgYW55O1xuICAgICAgICAvLyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYC5leHRlbmRgIGluc3RlYWRcbiAgICAgICAgICogICovXG4gICAgICAgIHRoaXMuYXVnbWVudCA9IHRoaXMuZXh0ZW5kO1xuICAgIH1cbiAgICBfZ2V0Q2FjaGVkKCkge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVkICE9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZDtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLl9kZWYuc2hhcGUoKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IHV0aWwub2JqZWN0S2V5cyhzaGFwZSk7XG4gICAgICAgIHJldHVybiAodGhpcy5fY2FjaGVkID0geyBzaGFwZSwga2V5cyB9KTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IHsgc2hhcGUsIGtleXM6IHNoYXBlS2V5cyB9ID0gdGhpcy5fZ2V0Q2FjaGVkKCk7XG4gICAgICAgIGNvbnN0IGV4dHJhS2V5cyA9IFtdO1xuICAgICAgICBpZiAoISh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBab2ROZXZlciAmJlxuICAgICAgICAgICAgdGhpcy5fZGVmLnVua25vd25LZXlzID09PSBcInN0cmlwXCIpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjdHguZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmICghc2hhcGVLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFpcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcGVLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlWYWxpZGF0b3IgPSBzaGFwZVtrZXldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjdHguZGF0YVtrZXldO1xuICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IGtleVZhbGlkYXRvci5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwga2V5KSksXG4gICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBrZXkgaW4gY3R4LmRhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgWm9kTmV2ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHVua25vd25LZXlzID0gdGhpcy5fZGVmLnVua25vd25LZXlzO1xuICAgICAgICAgICAgaWYgKHVua25vd25LZXlzID09PSBcInBhc3N0aHJvdWdoXCIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHRyYUtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBrZXkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogY3R4LmRhdGFba2V5XSB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmtub3duS2V5cyA9PT0gXCJzdHJpY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChleHRyYUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS51bnJlY29nbml6ZWRfa2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXM6IGV4dHJhS2V5cyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHVua25vd25LZXlzID09PSBcInN0cmlwXCIpIDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgWm9kT2JqZWN0IGVycm9yOiBpbnZhbGlkIHVua25vd25LZXlzIHZhbHVlLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcnVuIGNhdGNoYWxsIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGNvbnN0IGNhdGNoYWxsID0gdGhpcy5fZGVmLmNhdGNoYWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZXh0cmFLZXlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjdHguZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBrZXkgfSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNhdGNoYWxsLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBrZXkpIC8vLCBjdHguY2hpbGQoa2V5KSwgdmFsdWUsIGdldFBhcnNlZFR5cGUodmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3luY1BhaXJzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHN5bmNQYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBwYWlyLmFsd2F5c1NldCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzeW5jUGFpcnM7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKChzeW5jUGFpcnMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgc3luY1BhaXJzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHBhaXJzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc2hhcGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2hhcGUoKTtcbiAgICB9XG4gICAgc3RyaWN0KG1lc3NhZ2UpIHtcbiAgICAgICAgZXJyb3JVdGlsLmVyclRvT2JqO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICB1bmtub3duS2V5czogXCJzdHJpY3RcIixcbiAgICAgICAgICAgIC4uLihtZXNzYWdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNYXA6IChpc3N1ZSwgY3R4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0RXJyb3IgPSAoX2MgPSAoX2IgPSAoX2EgPSB0aGlzLl9kZWYpLmVycm9yTWFwKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgaXNzdWUsIGN0eCkubWVzc2FnZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3R4LmRlZmF1bHRFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3N1ZS5jb2RlID09PSBcInVucmVjb2duaXplZF9rZXlzXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogKF9kID0gZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLm1lc3NhZ2UpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGRlZmF1bHRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWZhdWx0RXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0cmlwKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICB1bmtub3duS2V5czogXCJzdHJpcFwiLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGFzc3Rocm91Z2goKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInBhc3N0aHJvdWdoXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBjb25zdCBBdWdtZW50RmFjdG9yeSA9XG4gICAgLy8gICA8RGVmIGV4dGVuZHMgWm9kT2JqZWN0RGVmPihkZWY6IERlZikgPT5cbiAgICAvLyAgIDxBdWdtZW50YXRpb24gZXh0ZW5kcyBab2RSYXdTaGFwZT4oXG4gICAgLy8gICAgIGF1Z21lbnRhdGlvbjogQXVnbWVudGF0aW9uXG4gICAgLy8gICApOiBab2RPYmplY3Q8XG4gICAgLy8gICAgIGV4dGVuZFNoYXBlPFJldHVyblR5cGU8RGVmW1wic2hhcGVcIl0+LCBBdWdtZW50YXRpb24+LFxuICAgIC8vICAgICBEZWZbXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgICAgRGVmW1wiY2F0Y2hhbGxcIl1cbiAgICAvLyAgID4gPT4ge1xuICAgIC8vICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgICAgLi4uZGVmLFxuICAgIC8vICAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgIC8vICAgICAgICAgLi4uZGVmLnNoYXBlKCksXG4gICAgLy8gICAgICAgICAuLi5hdWdtZW50YXRpb24sXG4gICAgLy8gICAgICAgfSksXG4gICAgLy8gICAgIH0pIGFzIGFueTtcbiAgICAvLyAgIH07XG4gICAgZXh0ZW5kKGF1Z21lbnRhdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgICAgICAgICAuLi5hdWdtZW50YXRpb24sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByaW9yIHRvIHpvZEAxLjAuMTIgdGhlcmUgd2FzIGEgYnVnIGluIHRoZVxuICAgICAqIGluZmVycmVkIHR5cGUgb2YgbWVyZ2VkIG9iamVjdHMuIFBsZWFzZVxuICAgICAqIHVwZ3JhZGUgaWYgeW91IGFyZSBleHBlcmllbmNpbmcgaXNzdWVzLlxuICAgICAqL1xuICAgIG1lcmdlKG1lcmdpbmcpIHtcbiAgICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCxcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5zaGFwZSgpLFxuICAgICAgICAgICAgICAgIC4uLm1lcmdpbmcuX2RlZi5zaGFwZSgpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIC8vIG1lcmdlPFxuICAgIC8vICAgSW5jb21pbmcgZXh0ZW5kcyBBbnlab2RPYmplY3QsXG4gICAgLy8gICBBdWdtZW50YXRpb24gZXh0ZW5kcyBJbmNvbWluZ1tcInNoYXBlXCJdLFxuICAgIC8vICAgTmV3T3V0cHV0IGV4dGVuZHMge1xuICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBPdXRwdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfb3V0cHV0XCJdXG4gICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgT3V0cHV0XG4gICAgLy8gICAgICAgPyBPdXRwdXRba11cbiAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgIC8vICAgfSxcbiAgICAvLyAgIE5ld0lucHV0IGV4dGVuZHMge1xuICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBJbnB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9pbnB1dFwiXVxuICAgIC8vICAgICAgIDogayBleHRlbmRzIGtleW9mIElucHV0XG4gICAgLy8gICAgICAgPyBJbnB1dFtrXVxuICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgLy8gICB9XG4gICAgLy8gPihcbiAgICAvLyAgIG1lcmdpbmc6IEluY29taW5nXG4gICAgLy8gKTogWm9kT2JqZWN0PFxuICAgIC8vICAgZXh0ZW5kU2hhcGU8VCwgUmV0dXJuVHlwZTxJbmNvbWluZ1tcIl9kZWZcIl1bXCJzaGFwZVwiXT4+LFxuICAgIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1widW5rbm93bktleXNcIl0sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJjYXRjaGFsbFwiXSxcbiAgICAvLyAgIE5ld091dHB1dCxcbiAgICAvLyAgIE5ld0lucHV0XG4gICAgLy8gPiB7XG4gICAgLy8gICBjb25zdCBtZXJnZWQ6IGFueSA9IG5ldyBab2RPYmplY3Qoe1xuICAgIC8vICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLFxuICAgIC8vICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAgIC8vICAgICBzaGFwZTogKCkgPT5cbiAgICAvLyAgICAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKHRoaXMuX2RlZi5zaGFwZSgpLCBtZXJnaW5nLl9kZWYuc2hhcGUoKSksXG4gICAgLy8gICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgIC8vICAgfSkgYXMgYW55O1xuICAgIC8vICAgcmV0dXJuIG1lcmdlZDtcbiAgICAvLyB9XG4gICAgc2V0S2V5KGtleSwgc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1Z21lbnQoeyBba2V5XTogc2NoZW1hIH0pO1xuICAgIH1cbiAgICAvLyBtZXJnZTxJbmNvbWluZyBleHRlbmRzIEFueVpvZE9iamVjdD4oXG4gICAgLy8gICBtZXJnaW5nOiBJbmNvbWluZ1xuICAgIC8vICk6IC8vWm9kT2JqZWN0PFQgJiBJbmNvbWluZ1tcIl9zaGFwZVwiXSwgVW5rbm93bktleXMsIENhdGNoYWxsPiA9IChtZXJnaW5nKSA9PiB7XG4gICAgLy8gWm9kT2JqZWN0PFxuICAgIC8vICAgZXh0ZW5kU2hhcGU8VCwgUmV0dXJuVHlwZTxJbmNvbWluZ1tcIl9kZWZcIl1bXCJzaGFwZVwiXT4+LFxuICAgIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1widW5rbm93bktleXNcIl0sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJjYXRjaGFsbFwiXVxuICAgIC8vID4ge1xuICAgIC8vICAgLy8gY29uc3QgbWVyZ2VkU2hhcGUgPSBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKFxuICAgIC8vICAgLy8gICB0aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAvLyAgIC8vICAgbWVyZ2luZy5fZGVmLnNoYXBlKClcbiAgICAvLyAgIC8vICk7XG4gICAgLy8gICBjb25zdCBtZXJnZWQ6IGFueSA9IG5ldyBab2RPYmplY3Qoe1xuICAgIC8vICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLFxuICAgIC8vICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAgIC8vICAgICBzaGFwZTogKCkgPT5cbiAgICAvLyAgICAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKHRoaXMuX2RlZi5zaGFwZSgpLCBtZXJnaW5nLl9kZWYuc2hhcGUoKSksXG4gICAgLy8gICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgIC8vICAgfSkgYXMgYW55O1xuICAgIC8vICAgcmV0dXJuIG1lcmdlZDtcbiAgICAvLyB9XG4gICAgY2F0Y2hhbGwoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IGluZGV4LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGljayhtYXNrKSB7XG4gICAgICAgIGNvbnN0IHNoYXBlID0ge307XG4gICAgICAgIHV0aWwub2JqZWN0S2V5cyhtYXNrKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChtYXNrW2tleV0gJiYgdGhpcy5zaGFwZVtrZXldKSB7XG4gICAgICAgICAgICAgICAgc2hhcGVba2V5XSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9taXQobWFzaykge1xuICAgICAgICBjb25zdCBzaGFwZSA9IHt9O1xuICAgICAgICB1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIW1hc2tba2V5XSkge1xuICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGRlZXBQYXJ0aWFsKCkge1xuICAgICAgICByZXR1cm4gZGVlcFBhcnRpYWxpZnkodGhpcyk7XG4gICAgfVxuICAgIHBhcnRpYWwobWFzaykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICB1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFNjaGVtYSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIGlmIChtYXNrICYmICFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gZmllbGRTY2hlbWE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gZmllbGRTY2hlbWEub3B0aW9uYWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBuZXdTaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlcXVpcmVkKG1hc2spIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKG1hc2sgJiYgIW1hc2tba2V5XSkge1xuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFNjaGVtYSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgbmV3RmllbGQgPSBmaWVsZFNjaGVtYTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV3RmllbGQgaW5zdGFuY2VvZiBab2RPcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdGaWVsZCA9IG5ld0ZpZWxkLl9kZWYuaW5uZXJUeXBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gbmV3RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gbmV3U2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBrZXlvZigpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVpvZEVudW0odXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpKTtcbiAgICB9XG59XG5ab2RPYmplY3QuY3JlYXRlID0gKHNoYXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgdW5rbm93bktleXM6IFwic3RyaXBcIixcbiAgICAgICAgY2F0Y2hhbGw6IFpvZE5ldmVyLmNyZWF0ZSgpLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcblpvZE9iamVjdC5zdHJpY3RDcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB1bmtub3duS2V5czogXCJzdHJpY3RcIixcbiAgICAgICAgY2F0Y2hhbGw6IFpvZE5ldmVyLmNyZWF0ZSgpLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcblpvZE9iamVjdC5sYXp5Y3JlYXRlID0gKHNoYXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHNoYXBlLFxuICAgICAgICB1bmtub3duS2V5czogXCJzdHJpcFwiLFxuICAgICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kVW5pb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9kZWYub3B0aW9ucztcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUmVzdWx0cyhyZXN1bHRzKSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gZmlyc3QgaXNzdWUtZnJlZSB2YWxpZGF0aW9uIGlmIGl0IGV4aXN0c1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgaXNzdWVzIGZyb20gZGlydHkgb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goLi4ucmVzdWx0LmN0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIGludmFsaWRcbiAgICAgICAgICAgIGNvbnN0IHVuaW9uRXJyb3JzID0gcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gbmV3IFpvZEVycm9yKHJlc3VsdC5jdHguY29tbW9uLmlzc3VlcykpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb24sXG4gICAgICAgICAgICAgICAgdW5pb25FcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwob3B0aW9ucy5tYXAoYXN5bmMgKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkQ3R4ID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3R4LmNvbW1vbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogYXdhaXQgb3B0aW9uLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGNoaWxkQ3R4LFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgY3R4OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkpLnRoZW4oaGFuZGxlUmVzdWx0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZGlydHkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBpc3N1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEN0eCA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb24uX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIiAmJiAhZGlydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB7IHJlc3VsdCwgY3R4OiBjaGlsZEN0eCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRDdHguY29tbW9uLmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzLnB1c2goY2hpbGRDdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRpcnR5KSB7XG4gICAgICAgICAgICAgICAgY3R4LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5kaXJ0eS5jdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpcnR5LnJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVuaW9uRXJyb3JzID0gaXNzdWVzLm1hcCgoaXNzdWVzKSA9PiBuZXcgWm9kRXJyb3IoaXNzdWVzKSk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbixcbiAgICAgICAgICAgICAgICB1bmlvbkVycm9ycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9ucztcbiAgICB9XG59XG5ab2RVbmlvbi5jcmVhdGUgPSAodHlwZXMsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVW5pb24oe1xuICAgICAgICBvcHRpb25zOiB0eXBlcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RVbmlvbixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICBab2REaXNjcmltaW5hdGVkVW5pb24gICAgICAvLy8vLy8vLy8vXG4vLy8vLy8vLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5jb25zdCBnZXREaXNjcmltaW5hdG9yID0gKHR5cGUpID0+IHtcbiAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZExhenkpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5zY2hlbWEpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRWZmZWN0cykge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLmlubmVyVHlwZSgpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZExpdGVyYWwpIHtcbiAgICAgICAgcmV0dXJuIFt0eXBlLnZhbHVlXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZEVudW0pIHtcbiAgICAgICAgcmV0dXJuIHR5cGUub3B0aW9ucztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE5hdGl2ZUVudW0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJhbi9iYW5cbiAgICAgICAgcmV0dXJuIHV0aWwub2JqZWN0VmFsdWVzKHR5cGUuZW51bSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2REZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuX2RlZi5pbm5lclR5cGUpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kVW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtudWxsXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7XG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkLCAuLi5nZXREaXNjcmltaW5hdG9yKHR5cGUudW53cmFwKCkpXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE51bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiBbbnVsbCwgLi4uZ2V0RGlzY3JpbWluYXRvcih0eXBlLnVud3JhcCgpKV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RCcmFuZGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUudW53cmFwKCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kUmVhZG9ubHkpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS51bndyYXAoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RDYXRjaCkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLl9kZWYuaW5uZXJUeXBlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG59O1xuY2xhc3MgWm9kRGlzY3JpbWluYXRlZFVuaW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3IgPSB0aGlzLmRpc2NyaW1pbmF0b3I7XG4gICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3JWYWx1ZSA9IGN0eC5kYXRhW2Rpc2NyaW1pbmF0b3JdO1xuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnNNYXAuZ2V0KGRpc2NyaW1pbmF0b3JWYWx1ZSk7XG4gICAgICAgIGlmICghb3B0aW9uKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IEFycmF5LmZyb20odGhpcy5vcHRpb25zTWFwLmtleXMoKSksXG4gICAgICAgICAgICAgICAgcGF0aDogW2Rpc2NyaW1pbmF0b3JdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZGlzY3JpbWluYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5kaXNjcmltaW5hdG9yO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zO1xuICAgIH1cbiAgICBnZXQgb3B0aW9uc01hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zTWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhlIGRpc2NyaW1pbmF0ZWQgdW5pb24gc2NoZW1hLiBJdHMgYmVoYXZpb3VyIGlzIHZlcnkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSBub3JtYWwgei51bmlvbigpIGNvbnN0cnVjdG9yLlxuICAgICAqIEhvd2V2ZXIsIGl0IG9ubHkgYWxsb3dzIGEgdW5pb24gb2Ygb2JqZWN0cywgYWxsIG9mIHdoaWNoIG5lZWQgdG8gc2hhcmUgYSBkaXNjcmltaW5hdG9yIHByb3BlcnR5LiBUaGlzIHByb3BlcnR5IG11c3RcbiAgICAgKiBoYXZlIGEgZGlmZmVyZW50IHZhbHVlIGZvciBlYWNoIG9iamVjdCBpbiB0aGUgdW5pb24uXG4gICAgICogQHBhcmFtIGRpc2NyaW1pbmF0b3IgdGhlIG5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0gdHlwZXMgYW4gYXJyYXkgb2Ygb2JqZWN0IHNjaGVtYXNcbiAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShkaXNjcmltaW5hdG9yLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICAgICAgLy8gR2V0IGFsbCB0aGUgdmFsaWQgZGlzY3JpbWluYXRvciB2YWx1ZXNcbiAgICAgICAgY29uc3Qgb3B0aW9uc01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8gdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3JWYWx1ZXMgPSBnZXREaXNjcmltaW5hdG9yKHR5cGUuc2hhcGVbZGlzY3JpbWluYXRvcl0pO1xuICAgICAgICAgICAgaWYgKCFkaXNjcmltaW5hdG9yVmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQSBkaXNjcmltaW5hdG9yIHZhbHVlIGZvciBrZXkgXFxgJHtkaXNjcmltaW5hdG9yfVxcYCBjb3VsZCBub3QgYmUgZXh0cmFjdGVkIGZyb20gYWxsIHNjaGVtYSBvcHRpb25zYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGRpc2NyaW1pbmF0b3JWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc01hcC5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlzY3JpbWluYXRvciBwcm9wZXJ0eSAke1N0cmluZyhkaXNjcmltaW5hdG9yKX0gaGFzIGR1cGxpY2F0ZSB2YWx1ZSAke1N0cmluZyh2YWx1ZSl9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wdGlvbnNNYXAuc2V0KHZhbHVlLCB0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZERpc2NyaW1pbmF0ZWRVbmlvbih7XG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERpc2NyaW1pbmF0ZWRVbmlvbixcbiAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9uc01hcCxcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWVyZ2VWYWx1ZXMoYSwgYikge1xuICAgIGNvbnN0IGFUeXBlID0gZ2V0UGFyc2VkVHlwZShhKTtcbiAgICBjb25zdCBiVHlwZSA9IGdldFBhcnNlZFR5cGUoYik7XG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IGEgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYVR5cGUgPT09IFpvZFBhcnNlZFR5cGUub2JqZWN0ICYmIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICBjb25zdCBiS2V5cyA9IHV0aWwub2JqZWN0S2V5cyhiKTtcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5cyA9IHV0aWxcbiAgICAgICAgICAgIC5vYmplY3RLZXlzKGEpXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+IGJLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpO1xuICAgICAgICBjb25zdCBuZXdPYmogPSB7IC4uLmEsIC4uLmIgfTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcmVkS2V5cykge1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhhW2tleV0sIGJba2V5XSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHNoYXJlZFZhbHVlLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IG5ld09iaiB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5hcnJheSAmJiBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5hcnJheSkge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdBcnJheSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1BID0gYVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBpdGVtQiA9IGJbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhpdGVtQSwgaXRlbUIpO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3QXJyYXkucHVzaChzaGFyZWRWYWx1ZS5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogbmV3QXJyYXkgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYVR5cGUgPT09IFpvZFBhcnNlZFR5cGUuZGF0ZSAmJlxuICAgICAgICBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5kYXRlICYmXG4gICAgICAgICthID09PSArYikge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgfVxufVxuY2xhc3MgWm9kSW50ZXJzZWN0aW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZVBhcnNlZCA9IChwYXJzZWRMZWZ0LCBwYXJzZWRSaWdodCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzQWJvcnRlZChwYXJzZWRMZWZ0KSB8fCBpc0Fib3J0ZWQocGFyc2VkUmlnaHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVZhbHVlcyhwYXJzZWRMZWZ0LnZhbHVlLCBwYXJzZWRSaWdodC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIW1lcmdlZC52YWxpZCkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNEaXJ0eShwYXJzZWRMZWZ0KSB8fCBpc0RpcnR5KHBhcnNlZFJpZ2h0KSkge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBtZXJnZWQuZGF0YSB9O1xuICAgICAgICB9O1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWYubGVmdC5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmLnJpZ2h0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0pLnRoZW4oKFtsZWZ0LCByaWdodF0pID0+IGhhbmRsZVBhcnNlZChsZWZ0LCByaWdodCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVBhcnNlZCh0aGlzLl9kZWYubGVmdC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pLCB0aGlzLl9kZWYucmlnaHQuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5ab2RJbnRlcnNlY3Rpb24uY3JlYXRlID0gKGxlZnQsIHJpZ2h0LCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEludGVyc2VjdGlvbih7XG4gICAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RJbnRlcnNlY3Rpb24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RUdXBsZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYXJyYXkpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYXJyYXksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmRhdGEubGVuZ3RoIDwgdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICBtaW5pbXVtOiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN0ID0gdGhpcy5fZGVmLnJlc3Q7XG4gICAgICAgIGlmICghcmVzdCAmJiBjdHguZGF0YS5sZW5ndGggPiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICBtYXhpbXVtOiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtcyA9IFsuLi5jdHguZGF0YV1cbiAgICAgICAgICAgIC5tYXAoKGl0ZW0sIGl0ZW1JbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5fZGVmLml0ZW1zW2l0ZW1JbmRleF0gfHwgdGhpcy5fZGVmLnJlc3Q7XG4gICAgICAgICAgICBpZiAoIXNjaGVtYSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBzY2hlbWEuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaXRlbUluZGV4KSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKCh4KSA9PiAhIXgpOyAvLyBmaWx0ZXIgbnVsbHNcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChpdGVtcykudGhlbigocmVzdWx0cykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgaXRlbXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBpdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pdGVtcztcbiAgICB9XG4gICAgcmVzdChyZXN0KSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kVHVwbGUoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgcmVzdCxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuWm9kVHVwbGUuY3JlYXRlID0gKHNjaGVtYXMsIHBhcmFtcykgPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWFzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IG9mIHNjaGVtYXMgdG8gei50dXBsZShbIC4uLiBdKVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7XG4gICAgICAgIGl0ZW1zOiBzY2hlbWFzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFR1cGxlLFxuICAgICAgICByZXN0OiBudWxsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kUmVjb3JkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IGtleVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgIH1cbiAgICBnZXQgdmFsdWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWlycyA9IFtdO1xuICAgICAgICBjb25zdCBrZXlUeXBlID0gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGN0eC5kYXRhKSB7XG4gICAgICAgICAgICBwYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBrZXksIGN0eC5wYXRoLCBrZXkpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgY3R4LmRhdGFba2V5XSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdEFzeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHBhaXJzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUoZmlyc3QsIHNlY29uZCwgdGhpcmQpIHtcbiAgICAgICAgaWYgKHNlY29uZCBpbnN0YW5jZW9mIFpvZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgICAgICAgICBrZXlUeXBlOiBmaXJzdCxcbiAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IHNlY29uZCxcbiAgICAgICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlY29yZCxcbiAgICAgICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXJkKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgICAgIGtleVR5cGU6IFpvZFN0cmluZy5jcmVhdGUoKSxcbiAgICAgICAgICAgIHZhbHVlVHlwZTogZmlyc3QsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlY29yZCxcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMoc2Vjb25kKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuY2xhc3MgWm9kTWFwIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IGtleVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgIH1cbiAgICBnZXQgdmFsdWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm1hcCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5tYXAsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlUeXBlID0gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gWy4uLmN0eC5kYXRhLmVudHJpZXMoKV0ubWFwKChba2V5LCB2YWx1ZV0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIFtpbmRleCwgXCJrZXlcIl0pKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBbaW5kZXgsIFwidmFsdWVcIl0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbE1hcC5zZXQoa2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImRpcnR5XCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsTWFwLnNldChrZXkudmFsdWUsIHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cblpvZE1hcC5jcmVhdGUgPSAoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE1hcCh7XG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RNYXAsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RTZXQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnNldCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zZXQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWYgPSB0aGlzLl9kZWY7XG4gICAgICAgIGlmIChkZWYubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLnNpemUgPCBkZWYubWluU2l6ZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBkZWYubWluU2l6ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5taW5TaXplLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5tYXhTaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEuc2l6ZSA+IGRlZi5tYXhTaXplLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBkZWYubWF4U2l6ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5tYXhTaXplLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICAgICAgZnVuY3Rpb24gZmluYWxpemVTZXQoZWxlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICBwYXJzZWRTZXQuYWRkKGVsZW1lbnQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBwYXJzZWRTZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IFsuLi5jdHguZGF0YS52YWx1ZXMoKV0ubWFwKChpdGVtLCBpKSA9PiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaSkpKTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChlbGVtZW50cykudGhlbigoZWxlbWVudHMpID0+IGZpbmFsaXplU2V0KGVsZW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmluYWxpemVTZXQoZWxlbWVudHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1pbihtaW5TaXplLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU2V0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1pblNpemU6IHsgdmFsdWU6IG1pblNpemUsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF4KG1heFNpemUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWF4U2l6ZTogeyB2YWx1ZTogbWF4U2l6ZSwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzaXplKHNpemUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKHNpemUsIG1lc3NhZ2UpLm1heChzaXplLCBtZXNzYWdlKTtcbiAgICB9XG4gICAgbm9uZW1wdHkobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oMSwgbWVzc2FnZSk7XG4gICAgfVxufVxuWm9kU2V0LmNyZWF0ZSA9ICh2YWx1ZVR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kU2V0KHtcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgICBtaW5TaXplOiBudWxsLFxuICAgICAgICBtYXhTaXplOiBudWxsLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFNldCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEZ1bmN0aW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudmFsaWRhdGUgPSB0aGlzLmltcGxlbWVudDtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuZnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuZnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlQXJnc0lzc3VlKGFyZ3MsIGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFrZUlzc3VlKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBhcmdzLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIGVycm9yTWFwczogW1xuICAgICAgICAgICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgY3R4LnNjaGVtYUVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1hcCgpLFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1hcCxcbiAgICAgICAgICAgICAgICBdLmZpbHRlcigoeCkgPT4gISF4KSxcbiAgICAgICAgICAgICAgICBpc3N1ZURhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfYXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNFcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1ha2VSZXR1cm5zSXNzdWUocmV0dXJucywgZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWtlSXNzdWUoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHJldHVybnMsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXBzOiBbXG4gICAgICAgICAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICBjdHguc2NoZW1hRXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWFwKCksXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWFwLFxuICAgICAgICAgICAgICAgIF0uZmlsdGVyKCh4KSA9PiAhIXgpLFxuICAgICAgICAgICAgICAgIGlzc3VlRGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9yZXR1cm5fdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZUVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBlcnJvck1hcDogY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAgfTtcbiAgICAgICAgY29uc3QgZm4gPSBjdHguZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5yZXR1cm5zIGluc3RhbmNlb2YgWm9kUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gV291bGQgbG92ZSBhIHdheSB0byBhdm9pZCBkaXNhYmxpbmcgdGhpcyBydWxlLCBidXQgd2UgbmVlZFxuICAgICAgICAgICAgLy8gYW4gYWxpYXMgKHVzaW5nIGFuIGFycm93IGZ1bmN0aW9uIHdhcyB3aGF0IGNhdXNlZCAyNjUxKS5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgICAgY29uc3QgbWUgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIE9LKGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3IoW10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBhd2FpdCBtZS5fZGVmLmFyZ3NcbiAgICAgICAgICAgICAgICAgICAgLnBhcnNlQXN5bmMoYXJncywgcGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuYWRkSXNzdWUobWFrZUFyZ3NJc3N1ZShhcmdzLCBlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFJlZmxlY3QuYXBwbHkoZm4sIHRoaXMsIHBhcnNlZEFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFJldHVybnMgPSBhd2FpdCBtZS5fZGVmLnJldHVybnMuX2RlZi50eXBlXG4gICAgICAgICAgICAgICAgICAgIC5wYXJzZUFzeW5jKHJlc3VsdCwgcGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuYWRkSXNzdWUobWFrZVJldHVybnNJc3N1ZShyZXN1bHQsIGUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZFJldHVybnM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdvdWxkIGxvdmUgYSB3YXkgdG8gYXZvaWQgZGlzYWJsaW5nIHRoaXMgcnVsZSwgYnV0IHdlIG5lZWRcbiAgICAgICAgICAgIC8vIGFuIGFsaWFzICh1c2luZyBhbiBhcnJvdyBmdW5jdGlvbiB3YXMgd2hhdCBjYXVzZWQgMjY1MSkuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgICAgICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBPSyhmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBtZS5fZGVmLmFyZ3Muc2FmZVBhcnNlKGFyZ3MsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRBcmdzLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpvZEVycm9yKFttYWtlQXJnc0lzc3VlKGFyZ3MsIHBhcnNlZEFyZ3MuZXJyb3IpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoZm4sIHRoaXMsIHBhcnNlZEFyZ3MuZGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUmV0dXJucyA9IG1lLl9kZWYucmV0dXJucy5zYWZlUGFyc2UocmVzdWx0LCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkUmV0dXJucy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBab2RFcnJvcihbbWFrZVJldHVybnNJc3N1ZShyZXN1bHQsIHBhcnNlZFJldHVybnMuZXJyb3IpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRSZXR1cm5zLmRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXJhbWV0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmFyZ3M7XG4gICAgfVxuICAgIHJldHVyblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYucmV0dXJucztcbiAgICB9XG4gICAgYXJncyguLi5pdGVtcykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGFyZ3M6IFpvZFR1cGxlLmNyZWF0ZShpdGVtcykucmVzdChab2RVbmtub3duLmNyZWF0ZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybnMocmV0dXJuVHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHJldHVybnM6IHJldHVyblR5cGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbXBsZW1lbnQoZnVuYykge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRGdW5jID0gdGhpcy5wYXJzZShmdW5jKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZEZ1bmM7XG4gICAgfVxuICAgIHN0cmljdEltcGxlbWVudChmdW5jKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEZ1bmMgPSB0aGlzLnBhcnNlKGZ1bmMpO1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVkRnVuYztcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShhcmdzLCByZXR1cm5zLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgICAgICBhcmdzOiAoYXJnc1xuICAgICAgICAgICAgICAgID8gYXJnc1xuICAgICAgICAgICAgICAgIDogWm9kVHVwbGUuY3JlYXRlKFtdKS5yZXN0KFpvZFVua25vd24uY3JlYXRlKCkpKSxcbiAgICAgICAgICAgIHJldHVybnM6IHJldHVybnMgfHwgWm9kVW5rbm93bi5jcmVhdGUoKSxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRnVuY3Rpb24sXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmNsYXNzIFpvZExhenkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBnZXQgc2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmdldHRlcigpO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGxhenlTY2hlbWEgPSB0aGlzLl9kZWYuZ2V0dGVyKCk7XG4gICAgICAgIHJldHVybiBsYXp5U2NoZW1hLl9wYXJzZSh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgfVxufVxuWm9kTGF6eS5jcmVhdGUgPSAoZ2V0dGVyLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZExhenkoe1xuICAgICAgICBnZXR0ZXI6IGdldHRlcixcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RMYXp5LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kTGl0ZXJhbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQuZGF0YSAhPT0gdGhpcy5fZGVmLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfbGl0ZXJhbCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdGhpcy5fZGVmLnZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlO1xuICAgIH1cbn1cblpvZExpdGVyYWwuY3JlYXRlID0gKHZhbHVlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZExpdGVyYWwoe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTGl0ZXJhbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZVpvZEVudW0odmFsdWVzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZEVudW0oe1xuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRW51bSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufVxuY2xhc3MgWm9kRW51bSBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICBfWm9kRW51bV9jYWNoZS5zZXQodGhpcywgdm9pZCAwKTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQuZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB0aGlzLl9kZWYudmFsdWVzO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWwuam9pblZhbHVlcyhleHBlY3RlZFZhbHVlcyksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWm9kRW51bV9jYWNoZSwgXCJmXCIpKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ab2RFbnVtX2NhY2hlLCBuZXcgU2V0KHRoaXMuX2RlZi52YWx1ZXMpLCBcImZcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ab2RFbnVtX2NhY2hlLCBcImZcIikuaGFzKGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBleHBlY3RlZFZhbHVlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgfVxuICAgIGdldCBlbnVtKCkge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuX2RlZi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW51bVZhbHVlcztcbiAgICB9XG4gICAgZ2V0IFZhbHVlcygpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGdldCBFbnVtKCkge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuX2RlZi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW51bVZhbHVlcztcbiAgICB9XG4gICAgZXh0cmFjdCh2YWx1ZXMsIG5ld0RlZiA9IHRoaXMuX2RlZikge1xuICAgICAgICByZXR1cm4gWm9kRW51bS5jcmVhdGUodmFsdWVzLCB7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICAuLi5uZXdEZWYsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBleGNsdWRlKHZhbHVlcywgbmV3RGVmID0gdGhpcy5fZGVmKSB7XG4gICAgICAgIHJldHVybiBab2RFbnVtLmNyZWF0ZSh0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHQpID0+ICF2YWx1ZXMuaW5jbHVkZXMob3B0KSksIHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIC4uLm5ld0RlZixcbiAgICAgICAgfSk7XG4gICAgfVxufVxuX1pvZEVudW1fY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuWm9kRW51bS5jcmVhdGUgPSBjcmVhdGVab2RFbnVtO1xuY2xhc3MgWm9kTmF0aXZlRW51bSBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICBfWm9kTmF0aXZlRW51bV9jYWNoZS5zZXQodGhpcywgdm9pZCAwKTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IG5hdGl2ZUVudW1WYWx1ZXMgPSB1dGlsLmdldFZhbGlkRW51bVZhbHVlcyh0aGlzLl9kZWYudmFsdWVzKTtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc3RyaW5nICYmXG4gICAgICAgICAgICBjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5udW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdXRpbC5vYmplY3RWYWx1ZXMobmF0aXZlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbC5qb2luVmFsdWVzKGV4cGVjdGVkVmFsdWVzKSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ab2ROYXRpdmVFbnVtX2NhY2hlLCBcImZcIikpIHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1pvZE5hdGl2ZUVudW1fY2FjaGUsIG5ldyBTZXQodXRpbC5nZXRWYWxpZEVudW1WYWx1ZXModGhpcy5fZGVmLnZhbHVlcykpLCBcImZcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ab2ROYXRpdmVFbnVtX2NhY2hlLCBcImZcIikuaGFzKGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHV0aWwub2JqZWN0VmFsdWVzKG5hdGl2ZUVudW1WYWx1ZXMpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2VudW1fdmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogZXhwZWN0ZWRWYWx1ZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG4gICAgZ2V0IGVudW0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVzO1xuICAgIH1cbn1cbl9ab2ROYXRpdmVFbnVtX2NhY2hlID0gbmV3IFdlYWtNYXAoKTtcblpvZE5hdGl2ZUVudW0uY3JlYXRlID0gKHZhbHVlcywgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROYXRpdmVFbnVtKHtcbiAgICAgICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmF0aXZlRW51bSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFByb21pc2UgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUucHJvbWlzZSAmJlxuICAgICAgICAgICAgY3R4LmNvbW1vbi5hc3luYyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUucHJvbWlzZSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2lmaWVkID0gY3R4LnBhcnNlZFR5cGUgPT09IFpvZFBhcnNlZFR5cGUucHJvbWlzZVxuICAgICAgICAgICAgPyBjdHguZGF0YVxuICAgICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoY3R4LmRhdGEpO1xuICAgICAgICByZXR1cm4gT0socHJvbWlzaWZpZWQudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlLnBhcnNlQXN5bmMoZGF0YSwge1xuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIGVycm9yTWFwOiBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuWm9kUHJvbWlzZS5jcmVhdGUgPSAoc2NoZW1hLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFByb21pc2Uoe1xuICAgICAgICB0eXBlOiBzY2hlbWEsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUHJvbWlzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEVmZmVjdHMgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBpbm5lclR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hO1xuICAgIH1cbiAgICBzb3VyY2VUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0c1xuICAgICAgICAgICAgPyB0aGlzLl9kZWYuc2NoZW1hLnNvdXJjZVR5cGUoKVxuICAgICAgICAgICAgOiB0aGlzLl9kZWYuc2NoZW1hO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZWZmZWN0ID0gdGhpcy5fZGVmLmVmZmVjdCB8fCBudWxsO1xuICAgICAgICBjb25zdCBjaGVja0N0eCA9IHtcbiAgICAgICAgICAgIGFkZElzc3VlOiAoYXJnKSA9PiB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCBhcmcpO1xuICAgICAgICAgICAgICAgIGlmIChhcmcuZmF0YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5wYXRoO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY2hlY2tDdHguYWRkSXNzdWUgPSBjaGVja0N0eC5hZGRJc3N1ZS5iaW5kKGNoZWNrQ3R4KTtcbiAgICAgICAgaWYgKGVmZmVjdC50eXBlID09PSBcInByZXByb2Nlc3NcIikge1xuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkID0gZWZmZWN0LnRyYW5zZm9ybShjdHguZGF0YSwgY2hlY2tDdHgpO1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb2Nlc3NlZCkudGhlbihhc3luYyAocHJvY2Vzc2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmFsdWUgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcHJvY2Vzc2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUlRZKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmFsdWUgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBESVJUWShyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy52YWx1ZSA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUlRZKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy52YWx1ZSA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRElSVFkocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJyZWZpbmVtZW50XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVSZWZpbmVtZW50ID0gKGFjYykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGVmZmVjdC5yZWZpbmVtZW50KGFjYywgY2hlY2tDdHgpO1xuICAgICAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgcmVmaW5lbWVudCBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXIgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkXG4gICAgICAgICAgICAgICAgZXhlY3V0ZVJlZmluZW1lbnQoaW5uZXIudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5uZXIudmFsdWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hXG4gICAgICAgICAgICAgICAgICAgIC5fcGFyc2VBc3luYyh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGlubmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZVJlZmluZW1lbnQoaW5uZXIudmFsdWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbm5lci52YWx1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWZmZWN0LnR5cGUgPT09IFwidHJhbnNmb3JtXCIpIHtcbiAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZChiYXNlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZWZmZWN0LnRyYW5zZm9ybShiYXNlLnZhbHVlLCBjaGVja0N0eCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3luY2hyb25vdXMgdHJhbnNmb3JtIGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHJlc3VsdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWFcbiAgICAgICAgICAgICAgICAgICAgLl9wYXJzZUFzeW5jKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoYmFzZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQoYmFzZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlZmZlY3QudHJhbnNmb3JtKGJhc2UudmFsdWUsIGNoZWNrQ3R4KSkudGhlbigocmVzdWx0KSA9PiAoeyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHJlc3VsdCB9KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXRpbC5hc3NlcnROZXZlcihlZmZlY3QpO1xuICAgIH1cbn1cblpvZEVmZmVjdHMuY3JlYXRlID0gKHNjaGVtYSwgZWZmZWN0LCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cyxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuWm9kRWZmZWN0cy5jcmVhdGVXaXRoUHJlcHJvY2VzcyA9IChwcmVwcm9jZXNzLCBzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwicHJlcHJvY2Vzc1wiLCB0cmFuc2Zvcm06IHByZXByb2Nlc3MgfSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kT3B0aW9uYWwgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBPSyh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kT3B0aW9uYWwuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT3B0aW9uYWwoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT3B0aW9uYWwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2ROdWxsYWJsZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLm51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBPSyhudWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZE51bGxhYmxlLmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE51bGxhYmxlKHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGxhYmxlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kRGVmYXVsdCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgbGV0IGRhdGEgPSBjdHguZGF0YTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMuX2RlZi5kZWZhdWx0VmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW1vdmVEZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2REZWZhdWx0LmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB0eXBlb2YgcGFyYW1zLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBwYXJhbXMuZGVmYXVsdFxuICAgICAgICAgICAgOiAoKSA9PiBwYXJhbXMuZGVmYXVsdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZENhdGNoIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICAvLyBuZXdDdHggaXMgdXNlZCB0byBub3QgY29sbGVjdCBpc3N1ZXMgZnJvbSBpbm5lciB0eXBlcyBpbiBjdHhcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0ge1xuICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgLi4uY3R4LmNvbW1vbixcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YTogbmV3Q3R4LmRhdGEsXG4gICAgICAgICAgICBwYXRoOiBuZXdDdHgucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDoge1xuICAgICAgICAgICAgICAgIC4uLm5ld0N0eCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaXNBc3luYyhyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJ2YWxpZFwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGVycm9yKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFpvZEVycm9yKG5ld0N0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBuZXdDdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcInZhbGlkXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2RlZi5jYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFpvZEVycm9yKG5ld0N0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogbmV3Q3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVDYXRjaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kQ2F0Y2guY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQ2F0Y2gsXG4gICAgICAgIGNhdGNoVmFsdWU6IHR5cGVvZiBwYXJhbXMuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IHBhcmFtcy5jYXRjaCA6ICgpID0+IHBhcmFtcy5jYXRjaCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE5hTiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm5hbikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5uYW4sXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG59XG5ab2ROYU4uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmFOKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROYU4sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jb25zdCBCUkFORCA9IFN5bWJvbChcInpvZF9icmFuZFwiKTtcbmNsYXNzIFpvZEJyYW5kZWQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjdHguZGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlLl9wYXJzZSh7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbn1cbmNsYXNzIFpvZFBpcGVsaW5lIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVBc3luYyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpblJlc3VsdCA9IGF3YWl0IHRoaXMuX2RlZi5pbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChpblJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUlRZKGluUmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYub3V0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVBc3luYygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5SZXN1bHQgPSB0aGlzLl9kZWYuaW4uX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpblJlc3VsdC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImRpcnR5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpblJlc3VsdC52YWx1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShhLCBiKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kUGlwZWxpbmUoe1xuICAgICAgICAgICAgaW46IGEsXG4gICAgICAgICAgICBvdXQ6IGIsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFBpcGVsaW5lLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5jbGFzcyBab2RSZWFkb25seSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgICAgIGNvbnN0IGZyZWV6ZSA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZChkYXRhKSkge1xuICAgICAgICAgICAgICAgIGRhdGEudmFsdWUgPSBPYmplY3QuZnJlZXplKGRhdGEudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc0FzeW5jKHJlc3VsdClcbiAgICAgICAgICAgID8gcmVzdWx0LnRoZW4oKGRhdGEpID0+IGZyZWV6ZShkYXRhKSlcbiAgICAgICAgICAgIDogZnJlZXplKHJlc3VsdCk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kUmVhZG9ubHkuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kUmVhZG9ubHkoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVhZG9ubHksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5mdW5jdGlvbiBjdXN0b20oY2hlY2ssIHBhcmFtcyA9IHt9LCBcbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqXG4gKiBQYXNzIGBmYXRhbGAgaW50byB0aGUgcGFyYW1zIG9iamVjdCBpbnN0ZWFkOlxuICpcbiAqIGBgYHRzXG4gKiB6LnN0cmluZygpLmN1c3RvbSgodmFsKSA9PiB2YWwubGVuZ3RoID4gNSwgeyBmYXRhbDogZmFsc2UgfSlcbiAqIGBgYFxuICpcbiAqL1xuZmF0YWwpIHtcbiAgICBpZiAoY2hlY2spXG4gICAgICAgIHJldHVybiBab2RBbnkuY3JlYXRlKCkuc3VwZXJSZWZpbmUoKGRhdGEsIGN0eCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIGlmICghY2hlY2soZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gdHlwZW9mIHBhcmFtcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID8gcGFyYW1zKGRhdGEpXG4gICAgICAgICAgICAgICAgICAgIDogdHlwZW9mIHBhcmFtcyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7IG1lc3NhZ2U6IHBhcmFtcyB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHBhcmFtcztcbiAgICAgICAgICAgICAgICBjb25zdCBfZmF0YWwgPSAoX2IgPSAoX2EgPSBwLmZhdGFsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYXRhbCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwMiA9IHR5cGVvZiBwID09PSBcInN0cmluZ1wiID8geyBtZXNzYWdlOiBwIH0gOiBwO1xuICAgICAgICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7IGNvZGU6IFwiY3VzdG9tXCIsIC4uLnAyLCBmYXRhbDogX2ZhdGFsIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICByZXR1cm4gWm9kQW55LmNyZWF0ZSgpO1xufVxuY29uc3QgbGF0ZSA9IHtcbiAgICBvYmplY3Q6IFpvZE9iamVjdC5sYXp5Y3JlYXRlLFxufTtcbnZhciBab2RGaXJzdFBhcnR5VHlwZUtpbmQ7XG4oZnVuY3Rpb24gKFpvZEZpcnN0UGFydHlUeXBlS2luZCkge1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFN0cmluZ1wiXSA9IFwiWm9kU3RyaW5nXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTnVtYmVyXCJdID0gXCJab2ROdW1iZXJcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROYU5cIl0gPSBcIlpvZE5hTlwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEJpZ0ludFwiXSA9IFwiWm9kQmlnSW50XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQm9vbGVhblwiXSA9IFwiWm9kQm9vbGVhblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZERhdGVcIl0gPSBcIlpvZERhdGVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RTeW1ib2xcIl0gPSBcIlpvZFN5bWJvbFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFVuZGVmaW5lZFwiXSA9IFwiWm9kVW5kZWZpbmVkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTnVsbFwiXSA9IFwiWm9kTnVsbFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEFueVwiXSA9IFwiWm9kQW55XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVW5rbm93blwiXSA9IFwiWm9kVW5rbm93blwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE5ldmVyXCJdID0gXCJab2ROZXZlclwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFZvaWRcIl0gPSBcIlpvZFZvaWRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RBcnJheVwiXSA9IFwiWm9kQXJyYXlcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RPYmplY3RcIl0gPSBcIlpvZE9iamVjdFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFVuaW9uXCJdID0gXCJab2RVbmlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiXSA9IFwiWm9kRGlzY3JpbWluYXRlZFVuaW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kSW50ZXJzZWN0aW9uXCJdID0gXCJab2RJbnRlcnNlY3Rpb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RUdXBsZVwiXSA9IFwiWm9kVHVwbGVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RSZWNvcmRcIl0gPSBcIlpvZFJlY29yZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE1hcFwiXSA9IFwiWm9kTWFwXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kU2V0XCJdID0gXCJab2RTZXRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RGdW5jdGlvblwiXSA9IFwiWm9kRnVuY3Rpb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RMYXp5XCJdID0gXCJab2RMYXp5XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTGl0ZXJhbFwiXSA9IFwiWm9kTGl0ZXJhbFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEVudW1cIl0gPSBcIlpvZEVudW1cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RFZmZlY3RzXCJdID0gXCJab2RFZmZlY3RzXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTmF0aXZlRW51bVwiXSA9IFwiWm9kTmF0aXZlRW51bVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE9wdGlvbmFsXCJdID0gXCJab2RPcHRpb25hbFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE51bGxhYmxlXCJdID0gXCJab2ROdWxsYWJsZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZERlZmF1bHRcIl0gPSBcIlpvZERlZmF1bHRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RDYXRjaFwiXSA9IFwiWm9kQ2F0Y2hcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RQcm9taXNlXCJdID0gXCJab2RQcm9taXNlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQnJhbmRlZFwiXSA9IFwiWm9kQnJhbmRlZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFBpcGVsaW5lXCJdID0gXCJab2RQaXBlbGluZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFJlYWRvbmx5XCJdID0gXCJab2RSZWFkb25seVwiO1xufSkoWm9kRmlyc3RQYXJ0eVR5cGVLaW5kIHx8IChab2RGaXJzdFBhcnR5VHlwZUtpbmQgPSB7fSkpO1xuY29uc3QgaW5zdGFuY2VPZlR5cGUgPSAoXG4vLyBjb25zdCBpbnN0YW5jZU9mVHlwZSA9IDxUIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55PihcbmNscywgcGFyYW1zID0ge1xuICAgIG1lc3NhZ2U6IGBJbnB1dCBub3QgaW5zdGFuY2Ugb2YgJHtjbHMubmFtZX1gLFxufSkgPT4gY3VzdG9tKChkYXRhKSA9PiBkYXRhIGluc3RhbmNlb2YgY2xzLCBwYXJhbXMpO1xuY29uc3Qgc3RyaW5nVHlwZSA9IFpvZFN0cmluZy5jcmVhdGU7XG5jb25zdCBudW1iZXJUeXBlID0gWm9kTnVtYmVyLmNyZWF0ZTtcbmNvbnN0IG5hblR5cGUgPSBab2ROYU4uY3JlYXRlO1xuY29uc3QgYmlnSW50VHlwZSA9IFpvZEJpZ0ludC5jcmVhdGU7XG5jb25zdCBib29sZWFuVHlwZSA9IFpvZEJvb2xlYW4uY3JlYXRlO1xuY29uc3QgZGF0ZVR5cGUgPSBab2REYXRlLmNyZWF0ZTtcbmNvbnN0IHN5bWJvbFR5cGUgPSBab2RTeW1ib2wuY3JlYXRlO1xuY29uc3QgdW5kZWZpbmVkVHlwZSA9IFpvZFVuZGVmaW5lZC5jcmVhdGU7XG5jb25zdCBudWxsVHlwZSA9IFpvZE51bGwuY3JlYXRlO1xuY29uc3QgYW55VHlwZSA9IFpvZEFueS5jcmVhdGU7XG5jb25zdCB1bmtub3duVHlwZSA9IFpvZFVua25vd24uY3JlYXRlO1xuY29uc3QgbmV2ZXJUeXBlID0gWm9kTmV2ZXIuY3JlYXRlO1xuY29uc3Qgdm9pZFR5cGUgPSBab2RWb2lkLmNyZWF0ZTtcbmNvbnN0IGFycmF5VHlwZSA9IFpvZEFycmF5LmNyZWF0ZTtcbmNvbnN0IG9iamVjdFR5cGUgPSBab2RPYmplY3QuY3JlYXRlO1xuY29uc3Qgc3RyaWN0T2JqZWN0VHlwZSA9IFpvZE9iamVjdC5zdHJpY3RDcmVhdGU7XG5jb25zdCB1bmlvblR5cGUgPSBab2RVbmlvbi5jcmVhdGU7XG5jb25zdCBkaXNjcmltaW5hdGVkVW5pb25UeXBlID0gWm9kRGlzY3JpbWluYXRlZFVuaW9uLmNyZWF0ZTtcbmNvbnN0IGludGVyc2VjdGlvblR5cGUgPSBab2RJbnRlcnNlY3Rpb24uY3JlYXRlO1xuY29uc3QgdHVwbGVUeXBlID0gWm9kVHVwbGUuY3JlYXRlO1xuY29uc3QgcmVjb3JkVHlwZSA9IFpvZFJlY29yZC5jcmVhdGU7XG5jb25zdCBtYXBUeXBlID0gWm9kTWFwLmNyZWF0ZTtcbmNvbnN0IHNldFR5cGUgPSBab2RTZXQuY3JlYXRlO1xuY29uc3QgZnVuY3Rpb25UeXBlID0gWm9kRnVuY3Rpb24uY3JlYXRlO1xuY29uc3QgbGF6eVR5cGUgPSBab2RMYXp5LmNyZWF0ZTtcbmNvbnN0IGxpdGVyYWxUeXBlID0gWm9kTGl0ZXJhbC5jcmVhdGU7XG5jb25zdCBlbnVtVHlwZSA9IFpvZEVudW0uY3JlYXRlO1xuY29uc3QgbmF0aXZlRW51bVR5cGUgPSBab2ROYXRpdmVFbnVtLmNyZWF0ZTtcbmNvbnN0IHByb21pc2VUeXBlID0gWm9kUHJvbWlzZS5jcmVhdGU7XG5jb25zdCBlZmZlY3RzVHlwZSA9IFpvZEVmZmVjdHMuY3JlYXRlO1xuY29uc3Qgb3B0aW9uYWxUeXBlID0gWm9kT3B0aW9uYWwuY3JlYXRlO1xuY29uc3QgbnVsbGFibGVUeXBlID0gWm9kTnVsbGFibGUuY3JlYXRlO1xuY29uc3QgcHJlcHJvY2Vzc1R5cGUgPSBab2RFZmZlY3RzLmNyZWF0ZVdpdGhQcmVwcm9jZXNzO1xuY29uc3QgcGlwZWxpbmVUeXBlID0gWm9kUGlwZWxpbmUuY3JlYXRlO1xuY29uc3Qgb3N0cmluZyA9ICgpID0+IHN0cmluZ1R5cGUoKS5vcHRpb25hbCgpO1xuY29uc3Qgb251bWJlciA9ICgpID0+IG51bWJlclR5cGUoKS5vcHRpb25hbCgpO1xuY29uc3Qgb2Jvb2xlYW4gPSAoKSA9PiBib29sZWFuVHlwZSgpLm9wdGlvbmFsKCk7XG5jb25zdCBjb2VyY2UgPSB7XG4gICAgc3RyaW5nOiAoKGFyZykgPT4gWm9kU3RyaW5nLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBudW1iZXI6ICgoYXJnKSA9PiBab2ROdW1iZXIuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSkpLFxuICAgIGJvb2xlYW46ICgoYXJnKSA9PiBab2RCb29sZWFuLmNyZWF0ZSh7XG4gICAgICAgIC4uLmFyZyxcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgIH0pKSxcbiAgICBiaWdpbnQ6ICgoYXJnKSA9PiBab2RCaWdJbnQuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSkpLFxuICAgIGRhdGU6ICgoYXJnKSA9PiBab2REYXRlLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbn07XG5jb25zdCBORVZFUiA9IElOVkFMSUQ7XG5cbnZhciB6ID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBkZWZhdWx0RXJyb3JNYXA6IGVycm9yTWFwLFxuICAgIHNldEVycm9yTWFwOiBzZXRFcnJvck1hcCxcbiAgICBnZXRFcnJvck1hcDogZ2V0RXJyb3JNYXAsXG4gICAgbWFrZUlzc3VlOiBtYWtlSXNzdWUsXG4gICAgRU1QVFlfUEFUSDogRU1QVFlfUEFUSCxcbiAgICBhZGRJc3N1ZVRvQ29udGV4dDogYWRkSXNzdWVUb0NvbnRleHQsXG4gICAgUGFyc2VTdGF0dXM6IFBhcnNlU3RhdHVzLFxuICAgIElOVkFMSUQ6IElOVkFMSUQsXG4gICAgRElSVFk6IERJUlRZLFxuICAgIE9LOiBPSyxcbiAgICBpc0Fib3J0ZWQ6IGlzQWJvcnRlZCxcbiAgICBpc0RpcnR5OiBpc0RpcnR5LFxuICAgIGlzVmFsaWQ6IGlzVmFsaWQsXG4gICAgaXNBc3luYzogaXNBc3luYyxcbiAgICBnZXQgdXRpbCAoKSB7IHJldHVybiB1dGlsOyB9LFxuICAgIGdldCBvYmplY3RVdGlsICgpIHsgcmV0dXJuIG9iamVjdFV0aWw7IH0sXG4gICAgWm9kUGFyc2VkVHlwZTogWm9kUGFyc2VkVHlwZSxcbiAgICBnZXRQYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlLFxuICAgIFpvZFR5cGU6IFpvZFR5cGUsXG4gICAgZGF0ZXRpbWVSZWdleDogZGF0ZXRpbWVSZWdleCxcbiAgICBab2RTdHJpbmc6IFpvZFN0cmluZyxcbiAgICBab2ROdW1iZXI6IFpvZE51bWJlcixcbiAgICBab2RCaWdJbnQ6IFpvZEJpZ0ludCxcbiAgICBab2RCb29sZWFuOiBab2RCb29sZWFuLFxuICAgIFpvZERhdGU6IFpvZERhdGUsXG4gICAgWm9kU3ltYm9sOiBab2RTeW1ib2wsXG4gICAgWm9kVW5kZWZpbmVkOiBab2RVbmRlZmluZWQsXG4gICAgWm9kTnVsbDogWm9kTnVsbCxcbiAgICBab2RBbnk6IFpvZEFueSxcbiAgICBab2RVbmtub3duOiBab2RVbmtub3duLFxuICAgIFpvZE5ldmVyOiBab2ROZXZlcixcbiAgICBab2RWb2lkOiBab2RWb2lkLFxuICAgIFpvZEFycmF5OiBab2RBcnJheSxcbiAgICBab2RPYmplY3Q6IFpvZE9iamVjdCxcbiAgICBab2RVbmlvbjogWm9kVW5pb24sXG4gICAgWm9kRGlzY3JpbWluYXRlZFVuaW9uOiBab2REaXNjcmltaW5hdGVkVW5pb24sXG4gICAgWm9kSW50ZXJzZWN0aW9uOiBab2RJbnRlcnNlY3Rpb24sXG4gICAgWm9kVHVwbGU6IFpvZFR1cGxlLFxuICAgIFpvZFJlY29yZDogWm9kUmVjb3JkLFxuICAgIFpvZE1hcDogWm9kTWFwLFxuICAgIFpvZFNldDogWm9kU2V0LFxuICAgIFpvZEZ1bmN0aW9uOiBab2RGdW5jdGlvbixcbiAgICBab2RMYXp5OiBab2RMYXp5LFxuICAgIFpvZExpdGVyYWw6IFpvZExpdGVyYWwsXG4gICAgWm9kRW51bTogWm9kRW51bSxcbiAgICBab2ROYXRpdmVFbnVtOiBab2ROYXRpdmVFbnVtLFxuICAgIFpvZFByb21pc2U6IFpvZFByb21pc2UsXG4gICAgWm9kRWZmZWN0czogWm9kRWZmZWN0cyxcbiAgICBab2RUcmFuc2Zvcm1lcjogWm9kRWZmZWN0cyxcbiAgICBab2RPcHRpb25hbDogWm9kT3B0aW9uYWwsXG4gICAgWm9kTnVsbGFibGU6IFpvZE51bGxhYmxlLFxuICAgIFpvZERlZmF1bHQ6IFpvZERlZmF1bHQsXG4gICAgWm9kQ2F0Y2g6IFpvZENhdGNoLFxuICAgIFpvZE5hTjogWm9kTmFOLFxuICAgIEJSQU5EOiBCUkFORCxcbiAgICBab2RCcmFuZGVkOiBab2RCcmFuZGVkLFxuICAgIFpvZFBpcGVsaW5lOiBab2RQaXBlbGluZSxcbiAgICBab2RSZWFkb25seTogWm9kUmVhZG9ubHksXG4gICAgY3VzdG9tOiBjdXN0b20sXG4gICAgU2NoZW1hOiBab2RUeXBlLFxuICAgIFpvZFNjaGVtYTogWm9kVHlwZSxcbiAgICBsYXRlOiBsYXRlLFxuICAgIGdldCBab2RGaXJzdFBhcnR5VHlwZUtpbmQgKCkgeyByZXR1cm4gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kOyB9LFxuICAgIGNvZXJjZTogY29lcmNlLFxuICAgIGFueTogYW55VHlwZSxcbiAgICBhcnJheTogYXJyYXlUeXBlLFxuICAgIGJpZ2ludDogYmlnSW50VHlwZSxcbiAgICBib29sZWFuOiBib29sZWFuVHlwZSxcbiAgICBkYXRlOiBkYXRlVHlwZSxcbiAgICBkaXNjcmltaW5hdGVkVW5pb246IGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUsXG4gICAgZWZmZWN0OiBlZmZlY3RzVHlwZSxcbiAgICAnZW51bSc6IGVudW1UeXBlLFxuICAgICdmdW5jdGlvbic6IGZ1bmN0aW9uVHlwZSxcbiAgICAnaW5zdGFuY2VvZic6IGluc3RhbmNlT2ZUeXBlLFxuICAgIGludGVyc2VjdGlvbjogaW50ZXJzZWN0aW9uVHlwZSxcbiAgICBsYXp5OiBsYXp5VHlwZSxcbiAgICBsaXRlcmFsOiBsaXRlcmFsVHlwZSxcbiAgICBtYXA6IG1hcFR5cGUsXG4gICAgbmFuOiBuYW5UeXBlLFxuICAgIG5hdGl2ZUVudW06IG5hdGl2ZUVudW1UeXBlLFxuICAgIG5ldmVyOiBuZXZlclR5cGUsXG4gICAgJ251bGwnOiBudWxsVHlwZSxcbiAgICBudWxsYWJsZTogbnVsbGFibGVUeXBlLFxuICAgIG51bWJlcjogbnVtYmVyVHlwZSxcbiAgICBvYmplY3Q6IG9iamVjdFR5cGUsXG4gICAgb2Jvb2xlYW46IG9ib29sZWFuLFxuICAgIG9udW1iZXI6IG9udW1iZXIsXG4gICAgb3B0aW9uYWw6IG9wdGlvbmFsVHlwZSxcbiAgICBvc3RyaW5nOiBvc3RyaW5nLFxuICAgIHBpcGVsaW5lOiBwaXBlbGluZVR5cGUsXG4gICAgcHJlcHJvY2VzczogcHJlcHJvY2Vzc1R5cGUsXG4gICAgcHJvbWlzZTogcHJvbWlzZVR5cGUsXG4gICAgcmVjb3JkOiByZWNvcmRUeXBlLFxuICAgIHNldDogc2V0VHlwZSxcbiAgICBzdHJpY3RPYmplY3Q6IHN0cmljdE9iamVjdFR5cGUsXG4gICAgc3RyaW5nOiBzdHJpbmdUeXBlLFxuICAgIHN5bWJvbDogc3ltYm9sVHlwZSxcbiAgICB0cmFuc2Zvcm1lcjogZWZmZWN0c1R5cGUsXG4gICAgdHVwbGU6IHR1cGxlVHlwZSxcbiAgICAndW5kZWZpbmVkJzogdW5kZWZpbmVkVHlwZSxcbiAgICB1bmlvbjogdW5pb25UeXBlLFxuICAgIHVua25vd246IHVua25vd25UeXBlLFxuICAgICd2b2lkJzogdm9pZFR5cGUsXG4gICAgTkVWRVI6IE5FVkVSLFxuICAgIFpvZElzc3VlQ29kZTogWm9kSXNzdWVDb2RlLFxuICAgIHF1b3RlbGVzc0pzb246IHF1b3RlbGVzc0pzb24sXG4gICAgWm9kRXJyb3I6IFpvZEVycm9yXG59KTtcblxuZXhwb3J0IHsgQlJBTkQsIERJUlRZLCBFTVBUWV9QQVRILCBJTlZBTElELCBORVZFUiwgT0ssIFBhcnNlU3RhdHVzLCBab2RUeXBlIGFzIFNjaGVtYSwgWm9kQW55LCBab2RBcnJheSwgWm9kQmlnSW50LCBab2RCb29sZWFuLCBab2RCcmFuZGVkLCBab2RDYXRjaCwgWm9kRGF0ZSwgWm9kRGVmYXVsdCwgWm9kRGlzY3JpbWluYXRlZFVuaW9uLCBab2RFZmZlY3RzLCBab2RFbnVtLCBab2RFcnJvciwgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLCBab2RGdW5jdGlvbiwgWm9kSW50ZXJzZWN0aW9uLCBab2RJc3N1ZUNvZGUsIFpvZExhenksIFpvZExpdGVyYWwsIFpvZE1hcCwgWm9kTmFOLCBab2ROYXRpdmVFbnVtLCBab2ROZXZlciwgWm9kTnVsbCwgWm9kTnVsbGFibGUsIFpvZE51bWJlciwgWm9kT2JqZWN0LCBab2RPcHRpb25hbCwgWm9kUGFyc2VkVHlwZSwgWm9kUGlwZWxpbmUsIFpvZFByb21pc2UsIFpvZFJlYWRvbmx5LCBab2RSZWNvcmQsIFpvZFR5cGUgYXMgWm9kU2NoZW1hLCBab2RTZXQsIFpvZFN0cmluZywgWm9kU3ltYm9sLCBab2RFZmZlY3RzIGFzIFpvZFRyYW5zZm9ybWVyLCBab2RUdXBsZSwgWm9kVHlwZSwgWm9kVW5kZWZpbmVkLCBab2RVbmlvbiwgWm9kVW5rbm93biwgWm9kVm9pZCwgYWRkSXNzdWVUb0NvbnRleHQsIGFueVR5cGUgYXMgYW55LCBhcnJheVR5cGUgYXMgYXJyYXksIGJpZ0ludFR5cGUgYXMgYmlnaW50LCBib29sZWFuVHlwZSBhcyBib29sZWFuLCBjb2VyY2UsIGN1c3RvbSwgZGF0ZVR5cGUgYXMgZGF0ZSwgZGF0ZXRpbWVSZWdleCwgeiBhcyBkZWZhdWx0LCBlcnJvck1hcCBhcyBkZWZhdWx0RXJyb3JNYXAsIGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUgYXMgZGlzY3JpbWluYXRlZFVuaW9uLCBlZmZlY3RzVHlwZSBhcyBlZmZlY3QsIGVudW1UeXBlIGFzIGVudW0sIGZ1bmN0aW9uVHlwZSBhcyBmdW5jdGlvbiwgZ2V0RXJyb3JNYXAsIGdldFBhcnNlZFR5cGUsIGluc3RhbmNlT2ZUeXBlIGFzIGluc3RhbmNlb2YsIGludGVyc2VjdGlvblR5cGUgYXMgaW50ZXJzZWN0aW9uLCBpc0Fib3J0ZWQsIGlzQXN5bmMsIGlzRGlydHksIGlzVmFsaWQsIGxhdGUsIGxhenlUeXBlIGFzIGxhenksIGxpdGVyYWxUeXBlIGFzIGxpdGVyYWwsIG1ha2VJc3N1ZSwgbWFwVHlwZSBhcyBtYXAsIG5hblR5cGUgYXMgbmFuLCBuYXRpdmVFbnVtVHlwZSBhcyBuYXRpdmVFbnVtLCBuZXZlclR5cGUgYXMgbmV2ZXIsIG51bGxUeXBlIGFzIG51bGwsIG51bGxhYmxlVHlwZSBhcyBudWxsYWJsZSwgbnVtYmVyVHlwZSBhcyBudW1iZXIsIG9iamVjdFR5cGUgYXMgb2JqZWN0LCBvYmplY3RVdGlsLCBvYm9vbGVhbiwgb251bWJlciwgb3B0aW9uYWxUeXBlIGFzIG9wdGlvbmFsLCBvc3RyaW5nLCBwaXBlbGluZVR5cGUgYXMgcGlwZWxpbmUsIHByZXByb2Nlc3NUeXBlIGFzIHByZXByb2Nlc3MsIHByb21pc2VUeXBlIGFzIHByb21pc2UsIHF1b3RlbGVzc0pzb24sIHJlY29yZFR5cGUgYXMgcmVjb3JkLCBzZXRUeXBlIGFzIHNldCwgc2V0RXJyb3JNYXAsIHN0cmljdE9iamVjdFR5cGUgYXMgc3RyaWN0T2JqZWN0LCBzdHJpbmdUeXBlIGFzIHN0cmluZywgc3ltYm9sVHlwZSBhcyBzeW1ib2wsIGVmZmVjdHNUeXBlIGFzIHRyYW5zZm9ybWVyLCB0dXBsZVR5cGUgYXMgdHVwbGUsIHVuZGVmaW5lZFR5cGUgYXMgdW5kZWZpbmVkLCB1bmlvblR5cGUgYXMgdW5pb24sIHVua25vd25UeXBlIGFzIHVua25vd24sIHV0aWwsIHZvaWRUeXBlIGFzIHZvaWQsIHogfTtcbiJdLCJuYW1lcyI6WyJ1dGlsIiwiYXNzZXJ0RXF1YWwiLCJ2YWwiLCJhc3NlcnRJcyIsIl9hcmciLCJhc3NlcnROZXZlciIsIl94IiwiRXJyb3IiLCJhcnJheVRvRW51bSIsIml0ZW1zIiwib2JqIiwiaXRlbSIsImdldFZhbGlkRW51bVZhbHVlcyIsInZhbGlkS2V5cyIsIm9iamVjdEtleXMiLCJmaWx0ZXIiLCJrIiwiZmlsdGVyZWQiLCJvYmplY3RWYWx1ZXMiLCJtYXAiLCJlIiwiT2JqZWN0Iiwia2V5cyIsIm9iamVjdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInB1c2giLCJmaW5kIiwiYXJyIiwiY2hlY2tlciIsInVuZGVmaW5lZCIsImlzSW50ZWdlciIsIk51bWJlciIsImlzRmluaXRlIiwiTWF0aCIsImZsb29yIiwiam9pblZhbHVlcyIsImFycmF5Iiwic2VwYXJhdG9yIiwiam9pbiIsImpzb25TdHJpbmdpZnlSZXBsYWNlciIsIl8iLCJ2YWx1ZSIsInRvU3RyaW5nIiwib2JqZWN0VXRpbCIsIm1lcmdlU2hhcGVzIiwiZmlyc3QiLCJzZWNvbmQiLCJab2RQYXJzZWRUeXBlIiwiZ2V0UGFyc2VkVHlwZSIsImRhdGEiLCJ0Iiwic3RyaW5nIiwiaXNOYU4iLCJuYW4iLCJudW1iZXIiLCJib29sZWFuIiwiZnVuY3Rpb24iLCJiaWdpbnQiLCJzeW1ib2wiLCJBcnJheSIsImlzQXJyYXkiLCJudWxsIiwidGhlbiIsImNhdGNoIiwicHJvbWlzZSIsIk1hcCIsIlNldCIsInNldCIsIkRhdGUiLCJkYXRlIiwidW5rbm93biIsIlpvZElzc3VlQ29kZSIsInF1b3RlbGVzc0pzb24iLCJqc29uIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlcGxhY2UiLCJab2RFcnJvciIsImVycm9ycyIsImlzc3VlcyIsImNvbnN0cnVjdG9yIiwiYWRkSXNzdWUiLCJzdWIiLCJhZGRJc3N1ZXMiLCJzdWJzIiwiYWN0dWFsUHJvdG8iLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIm5hbWUiLCJmb3JtYXQiLCJfbWFwcGVyIiwibWFwcGVyIiwiaXNzdWUiLCJtZXNzYWdlIiwiZmllbGRFcnJvcnMiLCJfZXJyb3JzIiwicHJvY2Vzc0Vycm9yIiwiZXJyb3IiLCJjb2RlIiwidW5pb25FcnJvcnMiLCJyZXR1cm5UeXBlRXJyb3IiLCJhcmd1bWVudHNFcnJvciIsInBhdGgiLCJsZW5ndGgiLCJjdXJyIiwiaSIsImVsIiwidGVybWluYWwiLCJhc3NlcnQiLCJpc0VtcHR5IiwiZmxhdHRlbiIsImZvcm1FcnJvcnMiLCJjcmVhdGUiLCJlcnJvck1hcCIsIl9jdHgiLCJpbnZhbGlkX3R5cGUiLCJyZWNlaXZlZCIsImV4cGVjdGVkIiwiaW52YWxpZF9saXRlcmFsIiwidW5yZWNvZ25pemVkX2tleXMiLCJpbnZhbGlkX3VuaW9uIiwiaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yIiwib3B0aW9ucyIsImludmFsaWRfZW51bV92YWx1ZSIsImludmFsaWRfYXJndW1lbnRzIiwiaW52YWxpZF9yZXR1cm5fdHlwZSIsImludmFsaWRfZGF0ZSIsImludmFsaWRfc3RyaW5nIiwidmFsaWRhdGlvbiIsImluY2x1ZGVzIiwicG9zaXRpb24iLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJ0b29fc21hbGwiLCJ0eXBlIiwiZXhhY3QiLCJpbmNsdXNpdmUiLCJtaW5pbXVtIiwidG9vX2JpZyIsIm1heGltdW0iLCJjdXN0b20iLCJpbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlcyIsIm5vdF9tdWx0aXBsZV9vZiIsIm11bHRpcGxlT2YiLCJub3RfZmluaXRlIiwiZGVmYXVsdEVycm9yIiwib3ZlcnJpZGVFcnJvck1hcCIsInNldEVycm9yTWFwIiwiZ2V0RXJyb3JNYXAiLCJtYWtlSXNzdWUiLCJwYXJhbXMiLCJlcnJvck1hcHMiLCJpc3N1ZURhdGEiLCJmdWxsUGF0aCIsImZ1bGxJc3N1ZSIsImVycm9yTWVzc2FnZSIsIm1hcHMiLCJtIiwic2xpY2UiLCJyZXZlcnNlIiwiRU1QVFlfUEFUSCIsImFkZElzc3VlVG9Db250ZXh0IiwiY3R4Iiwib3ZlcnJpZGVNYXAiLCJjb21tb24iLCJjb250ZXh0dWFsRXJyb3JNYXAiLCJzY2hlbWFFcnJvck1hcCIsIngiLCJQYXJzZVN0YXR1cyIsImRpcnR5IiwiYWJvcnQiLCJtZXJnZUFycmF5Iiwic3RhdHVzIiwicmVzdWx0cyIsImFycmF5VmFsdWUiLCJzIiwiSU5WQUxJRCIsIm1lcmdlT2JqZWN0QXN5bmMiLCJwYWlycyIsInN5bmNQYWlycyIsInBhaXIiLCJtZXJnZU9iamVjdFN5bmMiLCJmaW5hbE9iamVjdCIsImFsd2F5c1NldCIsImZyZWV6ZSIsIkRJUlRZIiwiT0siLCJpc0Fib3J0ZWQiLCJpc0RpcnR5IiwiaXNWYWxpZCIsImlzQXN5bmMiLCJQcm9taXNlIiwiX19jbGFzc1ByaXZhdGVGaWVsZEdldCIsInJlY2VpdmVyIiwic3RhdGUiLCJraW5kIiwiZiIsIlR5cGVFcnJvciIsImhhcyIsImdldCIsIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiLCJTdXBwcmVzc2VkRXJyb3IiLCJzdXBwcmVzc2VkIiwiZXJyb3JVdGlsIiwiZXJyVG9PYmoiLCJfWm9kRW51bV9jYWNoZSIsIl9ab2ROYXRpdmVFbnVtX2NhY2hlIiwiUGFyc2VJbnB1dExhenlQYXRoIiwicGFyZW50IiwiX2NhY2hlZFBhdGgiLCJfcGF0aCIsIl9rZXkiLCJoYW5kbGVSZXN1bHQiLCJyZXN1bHQiLCJzdWNjZXNzIiwiX2Vycm9yIiwicHJvY2Vzc0NyZWF0ZVBhcmFtcyIsImludmFsaWRfdHlwZV9lcnJvciIsInJlcXVpcmVkX2Vycm9yIiwiZGVzY3JpcHRpb24iLCJjdXN0b21NYXAiLCJpc3MiLCJfYSIsIl9iIiwiWm9kVHlwZSIsIl9kZWYiLCJfZ2V0VHlwZSIsImlucHV0IiwiX2dldE9yUmV0dXJuQ3R4IiwicGFyc2VkVHlwZSIsIl9wcm9jZXNzSW5wdXRQYXJhbXMiLCJfcGFyc2VTeW5jIiwiX3BhcnNlIiwiX3BhcnNlQXN5bmMiLCJyZXNvbHZlIiwicGFyc2UiLCJzYWZlUGFyc2UiLCJhc3luYyIsImVyciIsInRvTG93ZXJDYXNlIiwicGFyc2VBc3luYyIsInNhZmVQYXJzZUFzeW5jIiwibWF5YmVBc3luY1Jlc3VsdCIsInJlZmluZSIsImNoZWNrIiwiZ2V0SXNzdWVQcm9wZXJ0aWVzIiwiX3JlZmluZW1lbnQiLCJzZXRFcnJvciIsInJlZmluZW1lbnQiLCJyZWZpbmVtZW50RGF0YSIsIlpvZEVmZmVjdHMiLCJzY2hlbWEiLCJ0eXBlTmFtZSIsIlpvZEZpcnN0UGFydHlUeXBlS2luZCIsImVmZmVjdCIsInN1cGVyUmVmaW5lIiwiZGVmIiwic3BhIiwiYmluZCIsIm9wdGlvbmFsIiwibnVsbGFibGUiLCJudWxsaXNoIiwib3IiLCJhbmQiLCJ0cmFuc2Zvcm0iLCJicmFuZCIsImRlZmF1bHQiLCJkZXNjcmliZSIsInBpcGUiLCJyZWFkb25seSIsImlzTnVsbGFibGUiLCJpc09wdGlvbmFsIiwidmVyc2lvbiIsInZlbmRvciIsInZhbGlkYXRlIiwiWm9kT3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsIlpvZEFycmF5IiwiWm9kUHJvbWlzZSIsIm9wdGlvbiIsIlpvZFVuaW9uIiwiaW5jb21pbmciLCJab2RJbnRlcnNlY3Rpb24iLCJkZWZhdWx0VmFsdWVGdW5jIiwiWm9kRGVmYXVsdCIsImlubmVyVHlwZSIsImRlZmF1bHRWYWx1ZSIsIlpvZEJyYW5kZWQiLCJjYXRjaFZhbHVlRnVuYyIsIlpvZENhdGNoIiwiY2F0Y2hWYWx1ZSIsIlRoaXMiLCJ0YXJnZXQiLCJab2RQaXBlbGluZSIsIlpvZFJlYWRvbmx5IiwiY3VpZFJlZ2V4IiwiY3VpZDJSZWdleCIsInVsaWRSZWdleCIsInV1aWRSZWdleCIsIm5hbm9pZFJlZ2V4Iiwiand0UmVnZXgiLCJkdXJhdGlvblJlZ2V4IiwiZW1haWxSZWdleCIsIl9lbW9qaVJlZ2V4IiwiZW1vamlSZWdleCIsImlwdjRSZWdleCIsImlwdjRDaWRyUmVnZXgiLCJpcHY2UmVnZXgiLCJpcHY2Q2lkclJlZ2V4IiwiYmFzZTY0UmVnZXgiLCJiYXNlNjR1cmxSZWdleCIsImRhdGVSZWdleFNvdXJjZSIsImRhdGVSZWdleCIsIlJlZ0V4cCIsInRpbWVSZWdleFNvdXJjZSIsImFyZ3MiLCJyZWdleCIsInByZWNpc2lvbiIsInRpbWVSZWdleCIsImRhdGV0aW1lUmVnZXgiLCJvcHRzIiwibG9jYWwiLCJvZmZzZXQiLCJpc1ZhbGlkSVAiLCJpcCIsInRlc3QiLCJpc1ZhbGlkSldUIiwiand0IiwiYWxnIiwiaGVhZGVyIiwic3BsaXQiLCJiYXNlNjQiLCJwYWRFbmQiLCJkZWNvZGVkIiwiYXRvYiIsInR5cCIsImlzVmFsaWRDaWRyIiwiWm9kU3RyaW5nIiwiY29lcmNlIiwiU3RyaW5nIiwiY2hlY2tzIiwidG9vQmlnIiwidG9vU21hbGwiLCJVUkwiLCJsYXN0SW5kZXgiLCJ0ZXN0UmVzdWx0IiwidHJpbSIsInRvVXBwZXJDYXNlIiwiX3JlZ2V4IiwiX2FkZENoZWNrIiwiZW1haWwiLCJ1cmwiLCJlbW9qaSIsInV1aWQiLCJuYW5vaWQiLCJjdWlkIiwiY3VpZDIiLCJ1bGlkIiwiYmFzZTY0dXJsIiwiY2lkciIsImRhdGV0aW1lIiwidGltZSIsImR1cmF0aW9uIiwibWluIiwibWluTGVuZ3RoIiwibWF4IiwibWF4TGVuZ3RoIiwibGVuIiwibm9uZW1wdHkiLCJpc0RhdGV0aW1lIiwiY2giLCJpc0RhdGUiLCJpc1RpbWUiLCJpc0R1cmF0aW9uIiwiaXNFbWFpbCIsImlzVVJMIiwiaXNFbW9qaSIsImlzVVVJRCIsImlzTkFOT0lEIiwiaXNDVUlEIiwiaXNDVUlEMiIsImlzVUxJRCIsImlzSVAiLCJpc0NJRFIiLCJpc0Jhc2U2NCIsImlzQmFzZTY0dXJsIiwiZmxvYXRTYWZlUmVtYWluZGVyIiwic3RlcCIsInZhbERlY0NvdW50Iiwic3RlcERlY0NvdW50IiwiZGVjQ291bnQiLCJ2YWxJbnQiLCJwYXJzZUludCIsInRvRml4ZWQiLCJzdGVwSW50IiwicG93IiwiWm9kTnVtYmVyIiwiYXJndW1lbnRzIiwiZ3RlIiwibHRlIiwic2V0TGltaXQiLCJndCIsImx0IiwiaW50IiwicG9zaXRpdmUiLCJuZWdhdGl2ZSIsIm5vbnBvc2l0aXZlIiwibm9ubmVnYXRpdmUiLCJmaW5pdGUiLCJzYWZlIiwiTUlOX1NBRkVfSU5URUdFUiIsIk1BWF9TQUZFX0lOVEVHRVIiLCJtaW5WYWx1ZSIsIm1heFZhbHVlIiwiaXNJbnQiLCJab2RCaWdJbnQiLCJCaWdJbnQiLCJfZ2V0SW52YWxpZElucHV0IiwiWm9kQm9vbGVhbiIsIkJvb2xlYW4iLCJab2REYXRlIiwiZ2V0VGltZSIsIm1pbkRhdGUiLCJtYXhEYXRlIiwiWm9kU3ltYm9sIiwiWm9kVW5kZWZpbmVkIiwiWm9kTnVsbCIsIlpvZEFueSIsIl9hbnkiLCJab2RVbmtub3duIiwiX3Vua25vd24iLCJab2ROZXZlciIsIm5ldmVyIiwiWm9kVm9pZCIsInZvaWQiLCJleGFjdExlbmd0aCIsImFsbCIsImVsZW1lbnQiLCJkZWVwUGFydGlhbGlmeSIsIlpvZE9iamVjdCIsIm5ld1NoYXBlIiwic2hhcGUiLCJmaWVsZFNjaGVtYSIsInVud3JhcCIsIlpvZFR1cGxlIiwiX2NhY2hlZCIsIm5vbnN0cmljdCIsInBhc3N0aHJvdWdoIiwiYXVnbWVudCIsImV4dGVuZCIsIl9nZXRDYWNoZWQiLCJzaGFwZUtleXMiLCJleHRyYUtleXMiLCJjYXRjaGFsbCIsInVua25vd25LZXlzIiwia2V5VmFsaWRhdG9yIiwic3RyaWN0IiwiX2MiLCJfZCIsInN0cmlwIiwiYXVnbWVudGF0aW9uIiwibWVyZ2UiLCJtZXJnaW5nIiwibWVyZ2VkIiwic2V0S2V5IiwiaW5kZXgiLCJwaWNrIiwibWFzayIsImZvckVhY2giLCJvbWl0IiwiZGVlcFBhcnRpYWwiLCJwYXJ0aWFsIiwicmVxdWlyZWQiLCJuZXdGaWVsZCIsImtleW9mIiwiY3JlYXRlWm9kRW51bSIsInN0cmljdENyZWF0ZSIsImxhenljcmVhdGUiLCJoYW5kbGVSZXN1bHRzIiwiY2hpbGRDdHgiLCJ0eXBlcyIsImdldERpc2NyaW1pbmF0b3IiLCJab2RMYXp5IiwiWm9kTGl0ZXJhbCIsIlpvZEVudW0iLCJab2ROYXRpdmVFbnVtIiwiZW51bSIsIlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsImRpc2NyaW1pbmF0b3IiLCJkaXNjcmltaW5hdG9yVmFsdWUiLCJvcHRpb25zTWFwIiwiZnJvbSIsImRpc2NyaW1pbmF0b3JWYWx1ZXMiLCJtZXJnZVZhbHVlcyIsImEiLCJiIiwiYVR5cGUiLCJiVHlwZSIsInZhbGlkIiwiYktleXMiLCJzaGFyZWRLZXlzIiwiaW5kZXhPZiIsIm5ld09iaiIsInNoYXJlZFZhbHVlIiwibmV3QXJyYXkiLCJpdGVtQSIsIml0ZW1CIiwiaGFuZGxlUGFyc2VkIiwicGFyc2VkTGVmdCIsInBhcnNlZFJpZ2h0IiwibGVmdCIsInJpZ2h0IiwicmVzdCIsIml0ZW1JbmRleCIsInNjaGVtYXMiLCJab2RSZWNvcmQiLCJrZXlTY2hlbWEiLCJrZXlUeXBlIiwidmFsdWVTY2hlbWEiLCJ2YWx1ZVR5cGUiLCJ0aGlyZCIsIlpvZE1hcCIsImVudHJpZXMiLCJmaW5hbE1hcCIsIlpvZFNldCIsIm1pblNpemUiLCJzaXplIiwibWF4U2l6ZSIsImZpbmFsaXplU2V0IiwiZWxlbWVudHMiLCJwYXJzZWRTZXQiLCJhZGQiLCJ2YWx1ZXMiLCJab2RGdW5jdGlvbiIsImltcGxlbWVudCIsIm1ha2VBcmdzSXNzdWUiLCJtYWtlUmV0dXJuc0lzc3VlIiwicmV0dXJucyIsImZuIiwibWUiLCJwYXJzZWRBcmdzIiwiUmVmbGVjdCIsImFwcGx5IiwicGFyc2VkUmV0dXJucyIsInBhcmFtZXRlcnMiLCJyZXR1cm5UeXBlIiwiZnVuYyIsInZhbGlkYXRlZEZ1bmMiLCJzdHJpY3RJbXBsZW1lbnQiLCJnZXR0ZXIiLCJsYXp5U2NoZW1hIiwiZXhwZWN0ZWRWYWx1ZXMiLCJlbnVtVmFsdWVzIiwiVmFsdWVzIiwiRW51bSIsImV4dHJhY3QiLCJuZXdEZWYiLCJleGNsdWRlIiwib3B0IiwiV2Vha01hcCIsIm5hdGl2ZUVudW1WYWx1ZXMiLCJwcm9taXNpZmllZCIsInNvdXJjZVR5cGUiLCJjaGVja0N0eCIsImFyZyIsImZhdGFsIiwicHJvY2Vzc2VkIiwiZXhlY3V0ZVJlZmluZW1lbnQiLCJhY2MiLCJpbm5lciIsImJhc2UiLCJjcmVhdGVXaXRoUHJlcHJvY2VzcyIsInByZXByb2Nlc3MiLCJyZW1vdmVEZWZhdWx0IiwibmV3Q3R4IiwicmVtb3ZlQ2F0Y2giLCJab2ROYU4iLCJCUkFORCIsIlN5bWJvbCIsImhhbmRsZUFzeW5jIiwiaW5SZXN1bHQiLCJpbiIsIm91dCIsInAiLCJfZmF0YWwiLCJwMiIsImxhdGUiLCJpbnN0YW5jZU9mVHlwZSIsImNscyIsInN0cmluZ1R5cGUiLCJudW1iZXJUeXBlIiwibmFuVHlwZSIsImJpZ0ludFR5cGUiLCJib29sZWFuVHlwZSIsImRhdGVUeXBlIiwic3ltYm9sVHlwZSIsInVuZGVmaW5lZFR5cGUiLCJudWxsVHlwZSIsImFueVR5cGUiLCJ1bmtub3duVHlwZSIsIm5ldmVyVHlwZSIsInZvaWRUeXBlIiwiYXJyYXlUeXBlIiwib2JqZWN0VHlwZSIsInN0cmljdE9iamVjdFR5cGUiLCJ1bmlvblR5cGUiLCJkaXNjcmltaW5hdGVkVW5pb25UeXBlIiwiaW50ZXJzZWN0aW9uVHlwZSIsInR1cGxlVHlwZSIsInJlY29yZFR5cGUiLCJtYXBUeXBlIiwic2V0VHlwZSIsImZ1bmN0aW9uVHlwZSIsImxhenlUeXBlIiwibGl0ZXJhbFR5cGUiLCJlbnVtVHlwZSIsIm5hdGl2ZUVudW1UeXBlIiwicHJvbWlzZVR5cGUiLCJlZmZlY3RzVHlwZSIsIm9wdGlvbmFsVHlwZSIsIm51bGxhYmxlVHlwZSIsInByZXByb2Nlc3NUeXBlIiwicGlwZWxpbmVUeXBlIiwib3N0cmluZyIsIm9udW1iZXIiLCJvYm9vbGVhbiIsIk5FVkVSIiwieiIsImRlZmF1bHRFcnJvck1hcCIsIlpvZFRyYW5zZm9ybWVyIiwiU2NoZW1hIiwiWm9kU2NoZW1hIiwiYW55IiwiZGlzY3JpbWluYXRlZFVuaW9uIiwiaW50ZXJzZWN0aW9uIiwibGF6eSIsImxpdGVyYWwiLCJuYXRpdmVFbnVtIiwicGlwZWxpbmUiLCJyZWNvcmQiLCJzdHJpY3RPYmplY3QiLCJ0cmFuc2Zvcm1lciIsInR1cGxlIiwidW5pb24iLCJpbnN0YW5jZW9mIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/zod/lib/index.mjs\n");
/***/ })
};
;