Files
e-tib.com/.next/dev/server/vendor-chunks/ai@6.0.142_zod@3.25.76.js
Marc Mintel d14122005d Initial commit: E-TIB production hardening & E2E foundation
Former-commit-id: ef04fca3d76375630c05aac117bf586953f3b657
2026-04-28 19:11:38 +02:00

25 lines
1.2 MiB

"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/ai@6.0.142_zod@3.25.76";
exports.ids = ["vendor-chunks/ai@6.0.142_zod@3.25.76"];
exports.modules = {
/***/ "(rsc)/./node_modules/.pnpm/ai@6.0.142_zod@3.25.76/node_modules/ai/dist/index.mjs":
/*!**********************************************************************************!*\
!*** ./node_modules/.pnpm/ai@6.0.142_zod@3.25.76/node_modules/ai/dist/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 */ AISDKError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError),\n/* harmony export */ APICallError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError),\n/* harmony export */ AbstractChat: () => (/* binding */ AbstractChat),\n/* harmony export */ DefaultChatTransport: () => (/* binding */ DefaultChatTransport),\n/* harmony export */ DefaultGeneratedFile: () => (/* binding */ DefaultGeneratedFile),\n/* harmony export */ DirectChatTransport: () => (/* binding */ DirectChatTransport),\n/* harmony export */ DownloadError: () => (/* reexport safe */ _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DownloadError),\n/* harmony export */ EmptyResponseBodyError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.EmptyResponseBodyError),\n/* harmony export */ Experimental_Agent: () => (/* binding */ ToolLoopAgent),\n/* harmony export */ HttpChatTransport: () => (/* binding */ HttpChatTransport),\n/* harmony export */ InvalidArgumentError: () => (/* binding */ InvalidArgumentError),\n/* harmony export */ InvalidDataContentError: () => (/* binding */ InvalidDataContentError),\n/* harmony export */ InvalidMessageRoleError: () => (/* binding */ InvalidMessageRoleError),\n/* harmony export */ InvalidPromptError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.InvalidPromptError),\n/* harmony export */ InvalidResponseDataError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.InvalidResponseDataError),\n/* harmony export */ InvalidStreamPartError: () => (/* binding */ InvalidStreamPartError),\n/* harmony export */ InvalidToolApprovalError: () => (/* binding */ InvalidToolApprovalError),\n/* harmony export */ InvalidToolInputError: () => (/* binding */ InvalidToolInputError),\n/* harmony export */ JSONParseError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.JSONParseError),\n/* harmony export */ JsonToSseTransformStream: () => (/* binding */ JsonToSseTransformStream),\n/* harmony export */ LoadAPIKeyError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.LoadAPIKeyError),\n/* harmony export */ LoadSettingError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.LoadSettingError),\n/* harmony export */ MessageConversionError: () => (/* binding */ MessageConversionError),\n/* harmony export */ MissingToolResultsError: () => (/* binding */ MissingToolResultsError),\n/* harmony export */ NoContentGeneratedError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoContentGeneratedError),\n/* harmony export */ NoImageGeneratedError: () => (/* binding */ NoImageGeneratedError),\n/* harmony export */ NoObjectGeneratedError: () => (/* binding */ NoObjectGeneratedError),\n/* harmony export */ NoOutputGeneratedError: () => (/* binding */ NoOutputGeneratedError),\n/* harmony export */ NoSpeechGeneratedError: () => (/* binding */ NoSpeechGeneratedError),\n/* harmony export */ NoSuchModelError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError),\n/* harmony export */ NoSuchProviderError: () => (/* binding */ NoSuchProviderError),\n/* harmony export */ NoSuchToolError: () => (/* binding */ NoSuchToolError),\n/* harmony export */ NoTranscriptGeneratedError: () => (/* binding */ NoTranscriptGeneratedError),\n/* harmony export */ NoVideoGeneratedError: () => (/* binding */ NoVideoGeneratedError),\n/* harmony export */ Output: () => (/* binding */ output_exports),\n/* harmony export */ RetryError: () => (/* binding */ RetryError),\n/* harmony export */ SerialJobExecutor: () => (/* binding */ SerialJobExecutor),\n/* harmony export */ TextStreamChatTransport: () => (/* binding */ TextStreamChatTransport),\n/* harmony export */ TooManyEmbeddingValuesForCallError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TooManyEmbeddingValuesForCallError),\n/* harmony export */ ToolCallNotFoundForApprovalError: () => (/* binding */ ToolCallNotFoundForApprovalError),\n/* harmony export */ ToolCallRepairError: () => (/* binding */ ToolCallRepairError),\n/* harmony export */ ToolLoopAgent: () => (/* binding */ ToolLoopAgent),\n/* harmony export */ TypeValidationError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError),\n/* harmony export */ UIMessageStreamError: () => (/* binding */ UIMessageStreamError),\n/* harmony export */ UI_MESSAGE_STREAM_HEADERS: () => (/* binding */ UI_MESSAGE_STREAM_HEADERS),\n/* harmony export */ UnsupportedFunctionalityError: () => (/* reexport safe */ _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.UnsupportedFunctionalityError),\n/* harmony export */ UnsupportedModelVersionError: () => (/* binding */ UnsupportedModelVersionError),\n/* harmony export */ addToolInputExamplesMiddleware: () => (/* binding */ addToolInputExamplesMiddleware),\n/* harmony export */ asSchema: () => (/* reexport safe */ _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.asSchema),\n/* harmony export */ assistantModelMessageSchema: () => (/* binding */ assistantModelMessageSchema),\n/* harmony export */ bindTelemetryIntegration: () => (/* binding */ bindTelemetryIntegration),\n/* harmony export */ callCompletionApi: () => (/* binding */ callCompletionApi),\n/* harmony export */ consumeStream: () => (/* binding */ consumeStream),\n/* harmony export */ convertFileListToFileUIParts: () => (/* binding */ convertFileListToFileUIParts),\n/* harmony export */ convertToModelMessages: () => (/* binding */ convertToModelMessages),\n/* harmony export */ cosineSimilarity: () => (/* binding */ cosineSimilarity),\n/* harmony export */ createAgentUIStream: () => (/* binding */ createAgentUIStream),\n/* harmony export */ createAgentUIStreamResponse: () => (/* binding */ createAgentUIStreamResponse),\n/* harmony export */ createDownload: () => (/* binding */ createDownload),\n/* harmony export */ createGateway: () => (/* reexport safe */ _ai_sdk_gateway__WEBPACK_IMPORTED_MODULE_1__.createGateway),\n/* harmony export */ createIdGenerator: () => (/* reexport safe */ _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.createIdGenerator),\n/* harmony export */ createProviderRegistry: () => (/* binding */ createProviderRegistry),\n/* harmony export */ createTextStreamResponse: () => (/* binding */ createTextStreamResponse),\n/* harmony export */ createUIMessageStream: () => (/* binding */ createUIMessageStream),\n/* harmony export */ createUIMessageStreamResponse: () => (/* binding */ createUIMessageStreamResponse),\n/* harmony export */ customProvider: () => (/* binding */ customProvider),\n/* harmony export */ defaultEmbeddingSettingsMiddleware: () => (/* binding */ defaultEmbeddingSettingsMiddleware),\n/* harmony export */ defaultSettingsMiddleware: () => (/* binding */ defaultSettingsMiddleware),\n/* harmony export */ dynamicTool: () => (/* reexport safe */ _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.dynamicTool),\n/* harmony export */ embed: () => (/* binding */ embed),\n/* harmony export */ embedMany: () => (/* binding */ embedMany),\n/* harmony export */ experimental_createProviderRegistry: () => (/* binding */ experimental_createProviderRegistry),\n/* harmony export */ experimental_customProvider: () => (/* binding */ experimental_customProvider),\n/* harmony export */ experimental_generateImage: () => (/* binding */ experimental_generateImage),\n/* harmony export */ experimental_generateSpeech: () => (/* binding */ generateSpeech),\n/* harmony export */ experimental_generateVideo: () => (/* binding */ experimental_generateVideo),\n/* harmony export */ experimental_transcribe: () => (/* binding */ transcribe),\n/* harmony export */ extractJsonMiddleware: () => (/* binding */ extractJsonMiddleware),\n/* harmony export */ extractReasoningMiddleware: () => (/* binding */ extractReasoningMiddleware),\n/* harmony export */ gateway: () => (/* reexport safe */ _ai_sdk_gateway__WEBPACK_IMPORTED_MODULE_1__.gateway),\n/* harmony export */ generateId: () => (/* reexport safe */ _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.generateId),\n/* harmony export */ generateImage: () => (/* binding */ generateImage),\n/* harmony export */ generateObject: () => (/* binding */ generateObject),\n/* harmony export */ generateText: () => (/* binding */ generateText),\n/* harmony export */ getStaticToolName: () => (/* binding */ getStaticToolName),\n/* harmony export */ getTextFromDataUrl: () => (/* binding */ getTextFromDataUrl),\n/* harmony export */ getToolName: () => (/* binding */ getToolName),\n/* harmony export */ getToolOrDynamicToolName: () => (/* binding */ getToolOrDynamicToolName),\n/* harmony export */ hasToolCall: () => (/* binding */ hasToolCall),\n/* harmony export */ isDataUIPart: () => (/* binding */ isDataUIPart),\n/* harmony export */ isDeepEqualData: () => (/* binding */ isDeepEqualData),\n/* harmony export */ isFileUIPart: () => (/* binding */ isFileUIPart),\n/* harmony export */ isLoopFinished: () => (/* binding */ isLoopFinished),\n/* harmony export */ isReasoningUIPart: () => (/* binding */ isReasoningUIPart),\n/* harmony export */ isStaticToolUIPart: () => (/* binding */ isStaticToolUIPart),\n/* harmony export */ isTextUIPart: () => (/* binding */ isTextUIPart),\n/* harmony export */ isToolOrDynamicToolUIPart: () => (/* binding */ isToolOrDynamicToolUIPart),\n/* harmony export */ isToolUIPart: () => (/* binding */ isToolUIPart),\n/* harmony export */ jsonSchema: () => (/* reexport safe */ _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.jsonSchema),\n/* harmony export */ lastAssistantMessageIsCompleteWithApprovalResponses: () => (/* binding */ lastAssistantMessageIsCompleteWithApprovalResponses),\n/* harmony export */ lastAssistantMessageIsCompleteWithToolCalls: () => (/* binding */ lastAssistantMessageIsCompleteWithToolCalls),\n/* harmony export */ modelMessageSchema: () => (/* binding */ modelMessageSchema),\n/* harmony export */ parseJsonEventStream: () => (/* reexport safe */ _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.parseJsonEventStream),\n/* harmony export */ parsePartialJson: () => (/* binding */ parsePartialJson),\n/* harmony export */ pipeAgentUIStreamToResponse: () => (/* binding */ pipeAgentUIStreamToResponse),\n/* harmony export */ pipeTextStreamToResponse: () => (/* binding */ pipeTextStreamToResponse),\n/* harmony export */ pipeUIMessageStreamToResponse: () => (/* binding */ pipeUIMessageStreamToResponse),\n/* harmony export */ pruneMessages: () => (/* binding */ pruneMessages),\n/* harmony export */ readUIMessageStream: () => (/* binding */ readUIMessageStream),\n/* harmony export */ registerTelemetryIntegration: () => (/* binding */ registerTelemetryIntegration),\n/* harmony export */ rerank: () => (/* binding */ rerank),\n/* harmony export */ safeValidateUIMessages: () => (/* binding */ safeValidateUIMessages),\n/* harmony export */ simulateReadableStream: () => (/* binding */ simulateReadableStream),\n/* harmony export */ simulateStreamingMiddleware: () => (/* binding */ simulateStreamingMiddleware),\n/* harmony export */ smoothStream: () => (/* binding */ smoothStream),\n/* harmony export */ stepCountIs: () => (/* binding */ stepCountIs),\n/* harmony export */ streamObject: () => (/* binding */ streamObject),\n/* harmony export */ streamText: () => (/* binding */ streamText),\n/* harmony export */ systemModelMessageSchema: () => (/* binding */ systemModelMessageSchema),\n/* harmony export */ tool: () => (/* reexport safe */ _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.tool),\n/* harmony export */ toolModelMessageSchema: () => (/* binding */ toolModelMessageSchema),\n/* harmony export */ uiMessageChunkSchema: () => (/* binding */ uiMessageChunkSchema),\n/* harmony export */ userModelMessageSchema: () => (/* binding */ userModelMessageSchema),\n/* harmony export */ validateUIMessages: () => (/* binding */ validateUIMessages),\n/* harmony export */ wrapEmbeddingModel: () => (/* binding */ wrapEmbeddingModel),\n/* harmony export */ wrapImageModel: () => (/* binding */ wrapImageModel),\n/* harmony export */ wrapLanguageModel: () => (/* binding */ wrapLanguageModel),\n/* harmony export */ wrapProvider: () => (/* binding */ wrapProvider),\n/* harmony export */ zodSchema: () => (/* reexport safe */ _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.zodSchema)\n/* harmony export */ });\n/* harmony import */ var _ai_sdk_gateway__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ai-sdk/gateway */ \"(rsc)/./node_modules/.pnpm/@ai-sdk+gateway@3.0.84_zod@3.25.76/node_modules/@ai-sdk/gateway/dist/index.mjs\");\n/* harmony import */ var _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ai-sdk/provider-utils */ \"(rsc)/./node_modules/.pnpm/@ai-sdk+provider-utils@4.0.21_zod@3.25.76/node_modules/@ai-sdk/provider-utils/dist/index.mjs\");\n/* harmony import */ var _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ai-sdk/provider */ \"(rsc)/./node_modules/.pnpm/@ai-sdk+provider@3.0.8/node_modules/@ai-sdk/provider/dist/index.mjs\");\n/* harmony import */ var zod_v4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! zod/v4 */ \"(rsc)/./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/schemas.js\");\n/* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @opentelemetry/api */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace-api.js\");\n/* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @opentelemetry/api */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/context-api.js\");\n/* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @opentelemetry/api */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/status.js\");\nvar __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name21 in all)\n __defProp(target, name21, { get: all[name21], enumerable: true });\n};\n\n// src/index.ts\n\n\n\n// src/generate-text/generate-text.ts\n\n\n// src/error/index.ts\n\n\n// src/error/invalid-argument-error.ts\n\nvar name = \"AI_InvalidArgumentError\";\nvar marker = `vercel.ai.error.${name}`;\nvar symbol = Symbol.for(marker);\nvar _a;\nvar InvalidArgumentError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n parameter,\n value,\n message\n }) {\n super({\n name,\n message: `Invalid argument for parameter ${parameter}: ${message}`\n });\n this[_a] = true;\n this.parameter = parameter;\n this.value = value;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker);\n }\n};\n_a = symbol;\n\n// src/error/invalid-stream-part-error.ts\n\nvar name2 = \"AI_InvalidStreamPartError\";\nvar marker2 = `vercel.ai.error.${name2}`;\nvar symbol2 = Symbol.for(marker2);\nvar _a2;\nvar InvalidStreamPartError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n chunk,\n message\n }) {\n super({ name: name2, message });\n this[_a2] = true;\n this.chunk = chunk;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker2);\n }\n};\n_a2 = symbol2;\n\n// src/error/invalid-tool-approval-error.ts\n\nvar name3 = \"AI_InvalidToolApprovalError\";\nvar marker3 = `vercel.ai.error.${name3}`;\nvar symbol3 = Symbol.for(marker3);\nvar _a3;\nvar InvalidToolApprovalError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({ approvalId }) {\n super({\n name: name3,\n message: `Tool approval response references unknown approvalId: \"${approvalId}\". No matching tool-approval-request found in message history.`\n });\n this[_a3] = true;\n this.approvalId = approvalId;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker3);\n }\n};\n_a3 = symbol3;\n\n// src/error/invalid-tool-input-error.ts\n\nvar name4 = \"AI_InvalidToolInputError\";\nvar marker4 = `vercel.ai.error.${name4}`;\nvar symbol4 = Symbol.for(marker4);\nvar _a4;\nvar InvalidToolInputError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n toolInput,\n toolName,\n cause,\n message = `Invalid input for tool ${toolName}: ${(0,_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.getErrorMessage)(cause)}`\n }) {\n super({ name: name4, message, cause });\n this[_a4] = true;\n this.toolInput = toolInput;\n this.toolName = toolName;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker4);\n }\n};\n_a4 = symbol4;\n\n// src/error/tool-call-not-found-for-approval-error.ts\n\nvar name5 = \"AI_ToolCallNotFoundForApprovalError\";\nvar marker5 = `vercel.ai.error.${name5}`;\nvar symbol5 = Symbol.for(marker5);\nvar _a5;\nvar ToolCallNotFoundForApprovalError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n toolCallId,\n approvalId\n }) {\n super({\n name: name5,\n message: `Tool call \"${toolCallId}\" not found for approval request \"${approvalId}\".`\n });\n this[_a5] = true;\n this.toolCallId = toolCallId;\n this.approvalId = approvalId;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker5);\n }\n};\n_a5 = symbol5;\n\n// src/error/missing-tool-result-error.ts\n\nvar name6 = \"AI_MissingToolResultsError\";\nvar marker6 = `vercel.ai.error.${name6}`;\nvar symbol6 = Symbol.for(marker6);\nvar _a6;\nvar MissingToolResultsError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({ toolCallIds }) {\n super({\n name: name6,\n message: `Tool result${toolCallIds.length > 1 ? \"s are\" : \" is\"} missing for tool call${toolCallIds.length > 1 ? \"s\" : \"\"} ${toolCallIds.join(\n \", \"\n )}.`\n });\n this[_a6] = true;\n this.toolCallIds = toolCallIds;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker6);\n }\n};\n_a6 = symbol6;\n\n// src/error/no-image-generated-error.ts\n\nvar name7 = \"AI_NoImageGeneratedError\";\nvar marker7 = `vercel.ai.error.${name7}`;\nvar symbol7 = Symbol.for(marker7);\nvar _a7;\nvar NoImageGeneratedError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n message = \"No image generated.\",\n cause,\n responses\n }) {\n super({ name: name7, message, cause });\n this[_a7] = true;\n this.responses = responses;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker7);\n }\n};\n_a7 = symbol7;\n\n// src/error/no-object-generated-error.ts\n\nvar name8 = \"AI_NoObjectGeneratedError\";\nvar marker8 = `vercel.ai.error.${name8}`;\nvar symbol8 = Symbol.for(marker8);\nvar _a8;\nvar NoObjectGeneratedError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n message = \"No object generated.\",\n cause,\n text: text2,\n response,\n usage,\n finishReason\n }) {\n super({ name: name8, message, cause });\n this[_a8] = true;\n this.text = text2;\n this.response = response;\n this.usage = usage;\n this.finishReason = finishReason;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker8);\n }\n};\n_a8 = symbol8;\n\n// src/error/no-output-generated-error.ts\n\nvar name9 = \"AI_NoOutputGeneratedError\";\nvar marker9 = `vercel.ai.error.${name9}`;\nvar symbol9 = Symbol.for(marker9);\nvar _a9;\nvar NoOutputGeneratedError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n // used in isInstance\n constructor({\n message = \"No output generated.\",\n cause\n } = {}) {\n super({ name: name9, message, cause });\n this[_a9] = true;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker9);\n }\n};\n_a9 = symbol9;\n\n// src/error/no-speech-generated-error.ts\n\nvar name10 = \"AI_NoSpeechGeneratedError\";\nvar marker10 = `vercel.ai.error.${name10}`;\nvar symbol10 = Symbol.for(marker10);\nvar _a10;\nvar NoSpeechGeneratedError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor(options) {\n super({\n name: name10,\n message: \"No speech audio generated.\"\n });\n this[_a10] = true;\n this.responses = options.responses;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker10);\n }\n};\n_a10 = symbol10;\n\n// src/error/no-transcript-generated-error.ts\n\nvar name11 = \"AI_NoTranscriptGeneratedError\";\nvar marker11 = `vercel.ai.error.${name11}`;\nvar symbol11 = Symbol.for(marker11);\nvar _a11;\nvar NoTranscriptGeneratedError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor(options) {\n super({\n name: name11,\n message: \"No transcript generated.\"\n });\n this[_a11] = true;\n this.responses = options.responses;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker11);\n }\n};\n_a11 = symbol11;\n\n// src/error/no-video-generated-error.ts\n\nvar name12 = \"AI_NoVideoGeneratedError\";\nvar marker12 = `vercel.ai.error.${name12}`;\nvar symbol12 = Symbol.for(marker12);\nvar _a12;\nvar NoVideoGeneratedError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n message = \"No video generated.\",\n cause,\n responses\n }) {\n super({ name: name12, message, cause });\n this[_a12] = true;\n this.responses = responses;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker12);\n }\n /**\n * @deprecated use `isInstance` instead\n */\n static isNoVideoGeneratedError(error) {\n return error instanceof Error && error.name === name12 && typeof error.responses !== \"undefined\" ? true : false;\n }\n /**\n * @deprecated Do not use this method. It will be removed in the next major version.\n */\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n cause: this.cause,\n responses: this.responses\n };\n }\n};\n_a12 = symbol12;\n\n// src/error/no-such-tool-error.ts\n\nvar name13 = \"AI_NoSuchToolError\";\nvar marker13 = `vercel.ai.error.${name13}`;\nvar symbol13 = Symbol.for(marker13);\nvar _a13;\nvar NoSuchToolError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n toolName,\n availableTools = void 0,\n message = `Model tried to call unavailable tool '${toolName}'. ${availableTools === void 0 ? \"No tools are available.\" : `Available tools: ${availableTools.join(\", \")}.`}`\n }) {\n super({ name: name13, message });\n this[_a13] = true;\n this.toolName = toolName;\n this.availableTools = availableTools;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker13);\n }\n};\n_a13 = symbol13;\n\n// src/error/tool-call-repair-error.ts\n\nvar name14 = \"AI_ToolCallRepairError\";\nvar marker14 = `vercel.ai.error.${name14}`;\nvar symbol14 = Symbol.for(marker14);\nvar _a14;\nvar ToolCallRepairError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n cause,\n originalError,\n message = `Error repairing tool call: ${(0,_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.getErrorMessage)(cause)}`\n }) {\n super({ name: name14, message, cause });\n this[_a14] = true;\n this.originalError = originalError;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker14);\n }\n};\n_a14 = symbol14;\n\n// src/error/unsupported-model-version-error.ts\n\nvar UnsupportedModelVersionError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor(options) {\n super({\n name: \"AI_UnsupportedModelVersionError\",\n message: `Unsupported model version ${options.version} for provider \"${options.provider}\" and model \"${options.modelId}\". AI SDK 5 only supports models that implement specification version \"v2\".`\n });\n this.version = options.version;\n this.provider = options.provider;\n this.modelId = options.modelId;\n }\n};\n\n// src/error/ui-message-stream-error.ts\n\nvar name15 = \"AI_UIMessageStreamError\";\nvar marker15 = `vercel.ai.error.${name15}`;\nvar symbol15 = Symbol.for(marker15);\nvar _a15;\nvar UIMessageStreamError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n chunkType,\n chunkId,\n message\n }) {\n super({ name: name15, message });\n this[_a15] = true;\n this.chunkType = chunkType;\n this.chunkId = chunkId;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker15);\n }\n};\n_a15 = symbol15;\n\n// src/prompt/invalid-data-content-error.ts\n\nvar name16 = \"AI_InvalidDataContentError\";\nvar marker16 = `vercel.ai.error.${name16}`;\nvar symbol16 = Symbol.for(marker16);\nvar _a16;\nvar InvalidDataContentError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n content,\n cause,\n message = `Invalid data content. Expected a base64 string, Uint8Array, ArrayBuffer, or Buffer, but got ${typeof content}.`\n }) {\n super({ name: name16, message, cause });\n this[_a16] = true;\n this.content = content;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker16);\n }\n};\n_a16 = symbol16;\n\n// src/prompt/invalid-message-role-error.ts\n\nvar name17 = \"AI_InvalidMessageRoleError\";\nvar marker17 = `vercel.ai.error.${name17}`;\nvar symbol17 = Symbol.for(marker17);\nvar _a17;\nvar InvalidMessageRoleError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n role,\n message = `Invalid message role: '${role}'. Must be one of: \"system\", \"user\", \"assistant\", \"tool\".`\n }) {\n super({ name: name17, message });\n this[_a17] = true;\n this.role = role;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker17);\n }\n};\n_a17 = symbol17;\n\n// src/prompt/message-conversion-error.ts\n\nvar name18 = \"AI_MessageConversionError\";\nvar marker18 = `vercel.ai.error.${name18}`;\nvar symbol18 = Symbol.for(marker18);\nvar _a18;\nvar MessageConversionError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n originalMessage,\n message\n }) {\n super({ name: name18, message });\n this[_a18] = true;\n this.originalMessage = originalMessage;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker18);\n }\n};\n_a18 = symbol18;\n\n// src/error/index.ts\n\n\n// src/util/retry-error.ts\n\nvar name19 = \"AI_RetryError\";\nvar marker19 = `vercel.ai.error.${name19}`;\nvar symbol19 = Symbol.for(marker19);\nvar _a19;\nvar RetryError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError {\n constructor({\n message,\n reason,\n errors\n }) {\n super({ name: name19, message });\n this[_a19] = true;\n this.reason = reason;\n this.errors = errors;\n this.lastError = errors[errors.length - 1];\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker19);\n }\n};\n_a19 = symbol19;\n\n// src/util/as-array.ts\nfunction asArray(value) {\n return value === void 0 ? [] : Array.isArray(value) ? value : [value];\n}\n\n// src/util/notify.ts\nasync function notify(options) {\n for (const callback of asArray(options.callbacks)) {\n if (callback == null)\n continue;\n try {\n await callback(options.event);\n } catch (_ignored) {\n }\n }\n}\n\n// src/logger/log-warnings.ts\nfunction formatWarning({\n warning,\n provider,\n model\n}) {\n const prefix = `AI SDK Warning (${provider} / ${model}):`;\n switch (warning.type) {\n case \"unsupported\": {\n let message = `${prefix} The feature \"${warning.feature}\" is not supported.`;\n if (warning.details) {\n message += ` ${warning.details}`;\n }\n return message;\n }\n case \"compatibility\": {\n let message = `${prefix} The feature \"${warning.feature}\" is used in a compatibility mode.`;\n if (warning.details) {\n message += ` ${warning.details}`;\n }\n return message;\n }\n case \"other\": {\n return `${prefix} ${warning.message}`;\n }\n default: {\n return `${prefix} ${JSON.stringify(warning, null, 2)}`;\n }\n }\n}\nvar FIRST_WARNING_INFO_MESSAGE = \"AI SDK Warning System: To turn off warning logging, set the AI_SDK_LOG_WARNINGS global to false.\";\nvar hasLoggedBefore = false;\nvar logWarnings = (options) => {\n if (options.warnings.length === 0) {\n return;\n }\n const logger = globalThis.AI_SDK_LOG_WARNINGS;\n if (logger === false) {\n return;\n }\n if (typeof logger === \"function\") {\n logger(options);\n return;\n }\n if (!hasLoggedBefore) {\n hasLoggedBefore = true;\n console.info(FIRST_WARNING_INFO_MESSAGE);\n }\n for (const warning of options.warnings) {\n console.warn(\n formatWarning({\n warning,\n provider: options.provider,\n model: options.model\n })\n );\n }\n};\n\n// src/model/resolve-model.ts\n\n\n// src/util/log-v2-compatibility-warning.ts\nfunction logV2CompatibilityWarning({\n provider,\n modelId\n}) {\n logWarnings({\n warnings: [\n {\n type: \"compatibility\",\n feature: \"specificationVersion\",\n details: `Using v2 specification compatibility mode. Some features may not be available.`\n }\n ],\n provider,\n model: modelId\n });\n}\n\n// src/model/as-embedding-model-v3.ts\nfunction asEmbeddingModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-image-model-v3.ts\nfunction asImageModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-language-model-v3.ts\nfunction asLanguageModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n switch (prop) {\n case \"specificationVersion\":\n return \"v3\";\n case \"doGenerate\":\n return async (...args) => {\n const result = await target.doGenerate(...args);\n return {\n ...result,\n finishReason: convertV2FinishReasonToV3(result.finishReason),\n usage: convertV2UsageToV3(result.usage)\n };\n };\n case \"doStream\":\n return async (...args) => {\n const result = await target.doStream(...args);\n return {\n ...result,\n stream: convertV2StreamToV3(result.stream)\n };\n };\n default:\n return target[prop];\n }\n }\n });\n}\nfunction convertV2StreamToV3(stream) {\n return stream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"finish\":\n controller.enqueue({\n ...chunk,\n finishReason: convertV2FinishReasonToV3(chunk.finishReason),\n usage: convertV2UsageToV3(chunk.usage)\n });\n break;\n default:\n controller.enqueue(chunk);\n break;\n }\n }\n })\n );\n}\nfunction convertV2FinishReasonToV3(finishReason) {\n return {\n unified: finishReason === \"unknown\" ? \"other\" : finishReason,\n raw: void 0\n };\n}\nfunction convertV2UsageToV3(usage) {\n return {\n inputTokens: {\n total: usage.inputTokens,\n noCache: void 0,\n cacheRead: usage.cachedInputTokens,\n cacheWrite: void 0\n },\n outputTokens: {\n total: usage.outputTokens,\n text: void 0,\n reasoning: usage.reasoningTokens\n }\n };\n}\n\n// src/model/as-speech-model-v3.ts\nfunction asSpeechModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-transcription-model-v3.ts\nfunction asTranscriptionModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/resolve-model.ts\nfunction resolveLanguageModel(model) {\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asLanguageModelV3(model);\n }\n return getGlobalProvider().languageModel(model);\n}\nfunction resolveEmbeddingModel(model) {\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asEmbeddingModelV3(model);\n }\n return getGlobalProvider().embeddingModel(model);\n}\nfunction resolveTranscriptionModel(model) {\n var _a21, _b;\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asTranscriptionModelV3(model);\n }\n return (_b = (_a21 = getGlobalProvider()).transcriptionModel) == null ? void 0 : _b.call(_a21, model);\n}\nfunction resolveSpeechModel(model) {\n var _a21, _b;\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asSpeechModelV3(model);\n }\n return (_b = (_a21 = getGlobalProvider()).speechModel) == null ? void 0 : _b.call(_a21, model);\n}\nfunction resolveImageModel(model) {\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asImageModelV3(model);\n }\n return getGlobalProvider().imageModel(model);\n}\nfunction resolveVideoModel(model) {\n if (typeof model === \"string\") {\n const provider = getGlobalProvider();\n const videoModel = provider.videoModel;\n if (!videoModel) {\n throw new Error(\n 'The default provider does not support video models. Please use a Experimental_VideoModelV3 object from a provider (e.g., vertex.video(\"model-id\")).'\n );\n }\n return videoModel(model);\n }\n if (model.specificationVersion !== \"v3\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return model;\n}\nfunction getGlobalProvider() {\n var _a21;\n return (_a21 = globalThis.AI_SDK_DEFAULT_PROVIDER) != null ? _a21 : _ai_sdk_gateway__WEBPACK_IMPORTED_MODULE_1__.gateway;\n}\n\n// src/prompt/call-settings.ts\nfunction getTotalTimeoutMs(timeout) {\n if (timeout == null) {\n return void 0;\n }\n if (typeof timeout === \"number\") {\n return timeout;\n }\n return timeout.totalMs;\n}\nfunction getStepTimeoutMs(timeout) {\n if (timeout == null || typeof timeout === \"number\") {\n return void 0;\n }\n return timeout.stepMs;\n}\nfunction getChunkTimeoutMs(timeout) {\n if (timeout == null || typeof timeout === \"number\") {\n return void 0;\n }\n return timeout.chunkMs;\n}\n\n// src/prompt/convert-to-language-model-prompt.ts\n\n\n// src/util/detect-media-type.ts\n\nvar imageMediaTypeSignatures = [\n {\n mediaType: \"image/gif\",\n bytesPrefix: [71, 73, 70]\n // GIF\n },\n {\n mediaType: \"image/png\",\n bytesPrefix: [137, 80, 78, 71]\n // PNG\n },\n {\n mediaType: \"image/jpeg\",\n bytesPrefix: [255, 216]\n // JPEG\n },\n {\n mediaType: \"image/webp\",\n bytesPrefix: [\n 82,\n 73,\n 70,\n 70,\n // \"RIFF\"\n null,\n null,\n null,\n null,\n // file size (variable)\n 87,\n 69,\n 66,\n 80\n // \"WEBP\"\n ]\n },\n {\n mediaType: \"image/bmp\",\n bytesPrefix: [66, 77]\n },\n {\n mediaType: \"image/tiff\",\n bytesPrefix: [73, 73, 42, 0]\n },\n {\n mediaType: \"image/tiff\",\n bytesPrefix: [77, 77, 0, 42]\n },\n {\n mediaType: \"image/avif\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 32,\n 102,\n 116,\n 121,\n 112,\n 97,\n 118,\n 105,\n 102\n ]\n },\n {\n mediaType: \"image/heic\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 32,\n 102,\n 116,\n 121,\n 112,\n 104,\n 101,\n 105,\n 99\n ]\n }\n];\nvar audioMediaTypeSignatures = [\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 251]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 250]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 243]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 242]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 227]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 226]\n },\n {\n mediaType: \"audio/wav\",\n bytesPrefix: [\n 82,\n // R\n 73,\n // I\n 70,\n // F\n 70,\n // F\n null,\n null,\n null,\n null,\n 87,\n // W\n 65,\n // A\n 86,\n // V\n 69\n // E\n ]\n },\n {\n mediaType: \"audio/ogg\",\n bytesPrefix: [79, 103, 103, 83]\n },\n {\n mediaType: \"audio/flac\",\n bytesPrefix: [102, 76, 97, 67]\n },\n {\n mediaType: \"audio/aac\",\n bytesPrefix: [64, 21, 0, 0]\n },\n {\n mediaType: \"audio/mp4\",\n bytesPrefix: [102, 116, 121, 112]\n },\n {\n mediaType: \"audio/webm\",\n bytesPrefix: [26, 69, 223, 163]\n }\n];\nvar videoMediaTypeSignatures = [\n {\n mediaType: \"video/mp4\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n null,\n 102,\n 116,\n 121,\n 112\n // ftyp\n ]\n },\n {\n mediaType: \"video/webm\",\n bytesPrefix: [26, 69, 223, 163]\n // EBML\n },\n {\n mediaType: \"video/quicktime\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 20,\n 102,\n 116,\n 121,\n 112,\n 113,\n 116\n // ftypqt\n ]\n },\n {\n mediaType: \"video/x-msvideo\",\n bytesPrefix: [82, 73, 70, 70]\n // RIFF (AVI)\n }\n];\nvar stripID3 = (data) => {\n const bytes = typeof data === \"string\" ? (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.convertBase64ToUint8Array)(data) : data;\n const id3Size = (bytes[6] & 127) << 21 | (bytes[7] & 127) << 14 | (bytes[8] & 127) << 7 | bytes[9] & 127;\n return bytes.slice(id3Size + 10);\n};\nfunction stripID3TagsIfPresent(data) {\n const hasId3 = typeof data === \"string\" && data.startsWith(\"SUQz\") || typeof data !== \"string\" && data.length > 10 && data[0] === 73 && // 'I'\n data[1] === 68 && // 'D'\n data[2] === 51;\n return hasId3 ? stripID3(data) : data;\n}\nfunction detectMediaType({\n data,\n signatures\n}) {\n const processedData = stripID3TagsIfPresent(data);\n const bytes = typeof processedData === \"string\" ? (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.convertBase64ToUint8Array)(\n processedData.substring(0, Math.min(processedData.length, 24))\n ) : processedData;\n for (const signature of signatures) {\n if (bytes.length >= signature.bytesPrefix.length && signature.bytesPrefix.every(\n (byte, index) => byte === null || bytes[index] === byte\n )) {\n return signature.mediaType;\n }\n }\n return void 0;\n}\n\n// src/util/download/download.ts\n\n\n\n// src/version.ts\nvar VERSION = true ? \"6.0.142\" : 0;\n\n// src/util/download/download.ts\nvar download = async ({\n url,\n maxBytes,\n abortSignal\n}) => {\n var _a21;\n const urlText = url.toString();\n (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.validateDownloadUrl)(urlText);\n try {\n const response = await fetch(urlText, {\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.withUserAgentSuffix)(\n {},\n `ai-sdk/${VERSION}`,\n (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.getRuntimeEnvironmentUserAgent)()\n ),\n signal: abortSignal\n });\n if (response.redirected) {\n (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.validateDownloadUrl)(response.url);\n }\n if (!response.ok) {\n throw new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DownloadError({\n url: urlText,\n statusCode: response.status,\n statusText: response.statusText\n });\n }\n const data = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.readResponseWithSizeLimit)({\n response,\n url: urlText,\n maxBytes: maxBytes != null ? maxBytes : _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_MAX_DOWNLOAD_SIZE\n });\n return {\n data,\n mediaType: (_a21 = response.headers.get(\"content-type\")) != null ? _a21 : void 0\n };\n } catch (error) {\n if (_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DownloadError.isInstance(error)) {\n throw error;\n }\n throw new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DownloadError({ url: urlText, cause: error });\n }\n};\n\n// src/util/download/download-function.ts\nvar createDefaultDownloadFunction = (download2 = download) => (requestedDownloads) => Promise.all(\n requestedDownloads.map(\n async (requestedDownload) => requestedDownload.isUrlSupportedByModel ? null : download2(requestedDownload)\n )\n);\n\n// src/prompt/data-content.ts\n\n\n\n\n// src/prompt/split-data-url.ts\nfunction splitDataUrl(dataUrl) {\n try {\n const [header, base64Content] = dataUrl.split(\",\");\n return {\n mediaType: header.split(\";\")[0].split(\":\")[1],\n base64Content\n };\n } catch (error) {\n return {\n mediaType: void 0,\n base64Content: void 0\n };\n }\n}\n\n// src/prompt/data-content.ts\nvar dataContentSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__[\"instanceof\"](Uint8Array),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__[\"instanceof\"](ArrayBuffer),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.custom(\n // Buffer might not be available in some environments such as CloudFlare:\n (value) => {\n var _a21, _b;\n return (_b = (_a21 = globalThis.Buffer) == null ? void 0 : _a21.isBuffer(value)) != null ? _b : false;\n },\n { message: \"Must be a Buffer\" }\n )\n]);\nfunction convertToLanguageModelV3DataContent(content) {\n if (content instanceof Uint8Array) {\n return { data: content, mediaType: void 0 };\n }\n if (content instanceof ArrayBuffer) {\n return { data: new Uint8Array(content), mediaType: void 0 };\n }\n if (typeof content === \"string\") {\n try {\n content = new URL(content);\n } catch (error) {\n }\n }\n if (content instanceof URL && content.protocol === \"data:\") {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(\n content.toString()\n );\n if (dataUrlMediaType == null || base64Content == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError({\n name: \"InvalidDataContentError\",\n message: `Invalid data URL format in content ${content.toString()}`\n });\n }\n return { data: base64Content, mediaType: dataUrlMediaType };\n }\n return { data: content, mediaType: void 0 };\n}\nfunction convertDataContentToBase64String(content) {\n if (typeof content === \"string\") {\n return content;\n }\n if (content instanceof ArrayBuffer) {\n return (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.convertUint8ArrayToBase64)(new Uint8Array(content));\n }\n return (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.convertUint8ArrayToBase64)(content);\n}\nfunction convertDataContentToUint8Array(content) {\n if (content instanceof Uint8Array) {\n return content;\n }\n if (typeof content === \"string\") {\n try {\n return (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.convertBase64ToUint8Array)(content);\n } catch (error) {\n throw new InvalidDataContentError({\n message: \"Invalid data content. Content string is not a base64-encoded media.\",\n content,\n cause: error\n });\n }\n }\n if (content instanceof ArrayBuffer) {\n return new Uint8Array(content);\n }\n throw new InvalidDataContentError({ content });\n}\n\n// src/prompt/convert-to-language-model-prompt.ts\nasync function convertToLanguageModelPrompt({\n prompt,\n supportedUrls,\n download: download2 = createDefaultDownloadFunction()\n}) {\n const downloadedAssets = await downloadAssets(\n prompt.messages,\n download2,\n supportedUrls\n );\n const approvalIdToToolCallId = /* @__PURE__ */ new Map();\n for (const message of prompt.messages) {\n if (message.role === \"assistant\" && Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === \"tool-approval-request\" && \"approvalId\" in part && \"toolCallId\" in part) {\n approvalIdToToolCallId.set(\n part.approvalId,\n part.toolCallId\n );\n }\n }\n }\n }\n const approvedToolCallIds = /* @__PURE__ */ new Set();\n for (const message of prompt.messages) {\n if (message.role === \"tool\") {\n for (const part of message.content) {\n if (part.type === \"tool-approval-response\") {\n const toolCallId = approvalIdToToolCallId.get(part.approvalId);\n if (toolCallId) {\n approvedToolCallIds.add(toolCallId);\n }\n }\n }\n }\n }\n const messages = [\n ...prompt.system != null ? typeof prompt.system === \"string\" ? [{ role: \"system\", content: prompt.system }] : asArray(prompt.system).map((message) => ({\n role: \"system\",\n content: message.content,\n providerOptions: message.providerOptions\n })) : [],\n ...prompt.messages.map(\n (message) => convertToLanguageModelMessage({ message, downloadedAssets })\n )\n ];\n const combinedMessages = [];\n for (const message of messages) {\n if (message.role !== \"tool\") {\n combinedMessages.push(message);\n continue;\n }\n const lastCombinedMessage = combinedMessages.at(-1);\n if ((lastCombinedMessage == null ? void 0 : lastCombinedMessage.role) === \"tool\") {\n lastCombinedMessage.content.push(...message.content);\n } else {\n combinedMessages.push(message);\n }\n }\n const toolCallIds = /* @__PURE__ */ new Set();\n for (const message of combinedMessages) {\n switch (message.role) {\n case \"assistant\": {\n for (const content of message.content) {\n if (content.type === \"tool-call\" && !content.providerExecuted) {\n toolCallIds.add(content.toolCallId);\n }\n }\n break;\n }\n case \"tool\": {\n for (const content of message.content) {\n if (content.type === \"tool-result\") {\n toolCallIds.delete(content.toolCallId);\n }\n }\n break;\n }\n case \"user\":\n case \"system\":\n for (const id of approvedToolCallIds) {\n toolCallIds.delete(id);\n }\n if (toolCallIds.size > 0) {\n throw new MissingToolResultsError({\n toolCallIds: Array.from(toolCallIds)\n });\n }\n break;\n }\n }\n for (const id of approvedToolCallIds) {\n toolCallIds.delete(id);\n }\n if (toolCallIds.size > 0) {\n throw new MissingToolResultsError({ toolCallIds: Array.from(toolCallIds) });\n }\n return combinedMessages.filter(\n // Filter out empty tool messages (e.g. if they only contained\n // tool-approval-response parts that were removed).\n // This prevents sending invalid empty messages to the provider.\n // Note: provider-executed tool-approval-response parts are preserved.\n (message) => message.role !== \"tool\" || message.content.length > 0\n );\n}\nfunction convertToLanguageModelMessage({\n message,\n downloadedAssets\n}) {\n const role = message.role;\n switch (role) {\n case \"system\": {\n return {\n role: \"system\",\n content: message.content,\n providerOptions: message.providerOptions\n };\n }\n case \"user\": {\n if (typeof message.content === \"string\") {\n return {\n role: \"user\",\n content: [{ type: \"text\", text: message.content }],\n providerOptions: message.providerOptions\n };\n }\n return {\n role: \"user\",\n content: message.content.map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== \"text\" || part.text !== \"\"),\n providerOptions: message.providerOptions\n };\n }\n case \"assistant\": {\n if (typeof message.content === \"string\") {\n return {\n role: \"assistant\",\n content: [{ type: \"text\", text: message.content }],\n providerOptions: message.providerOptions\n };\n }\n return {\n role: \"assistant\",\n content: message.content.filter(\n // remove empty text parts (no text, and no provider options):\n (part) => part.type !== \"text\" || part.text !== \"\" || part.providerOptions != null\n ).filter(\n (part) => part.type !== \"tool-approval-request\"\n ).map((part) => {\n const providerOptions = part.providerOptions;\n switch (part.type) {\n case \"file\": {\n const { data, mediaType } = convertToLanguageModelV3DataContent(\n part.data\n );\n return {\n type: \"file\",\n data,\n filename: part.filename,\n mediaType: mediaType != null ? mediaType : part.mediaType,\n providerOptions\n };\n }\n case \"reasoning\": {\n return {\n type: \"reasoning\",\n text: part.text,\n providerOptions\n };\n }\n case \"text\": {\n return {\n type: \"text\",\n text: part.text,\n providerOptions\n };\n }\n case \"tool-call\": {\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n providerExecuted: part.providerExecuted,\n providerOptions\n };\n }\n case \"tool-result\": {\n return {\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: mapToolResultOutput(part.output),\n providerOptions\n };\n }\n }\n }),\n providerOptions: message.providerOptions\n };\n }\n case \"tool\": {\n return {\n role: \"tool\",\n content: message.content.filter(\n // Only include tool-approval-response for provider-executed tools\n (part) => part.type !== \"tool-approval-response\" || part.providerExecuted\n ).map((part) => {\n switch (part.type) {\n case \"tool-result\": {\n return {\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: mapToolResultOutput(part.output),\n providerOptions: part.providerOptions\n };\n }\n case \"tool-approval-response\": {\n return {\n type: \"tool-approval-response\",\n approvalId: part.approvalId,\n approved: part.approved,\n reason: part.reason\n };\n }\n }\n }),\n providerOptions: message.providerOptions\n };\n }\n default: {\n const _exhaustiveCheck = role;\n throw new InvalidMessageRoleError({ role: _exhaustiveCheck });\n }\n }\n}\nasync function downloadAssets(messages, download2, supportedUrls) {\n const plannedDownloads = messages.filter((message) => message.role === \"user\").map((message) => message.content).filter(\n (content) => Array.isArray(content)\n ).flat().filter(\n (part) => part.type === \"image\" || part.type === \"file\"\n ).map((part) => {\n var _a21;\n const mediaType = (_a21 = part.mediaType) != null ? _a21 : part.type === \"image\" ? \"image/*\" : void 0;\n let data = part.type === \"image\" ? part.image : part.data;\n if (typeof data === \"string\") {\n try {\n data = new URL(data);\n } catch (ignored) {\n }\n }\n return { mediaType, data };\n }).filter(\n (part) => part.data instanceof URL\n ).map((part) => ({\n url: part.data,\n isUrlSupportedByModel: part.mediaType != null && (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.isUrlSupported)({\n url: part.data.toString(),\n mediaType: part.mediaType,\n supportedUrls\n })\n }));\n const downloadedFiles = await download2(plannedDownloads);\n return Object.fromEntries(\n downloadedFiles.map(\n (file, index) => file == null ? null : [\n plannedDownloads[index].url.toString(),\n { data: file.data, mediaType: file.mediaType }\n ]\n ).filter((file) => file != null)\n );\n}\nfunction convertPartToLanguageModelPart(part, downloadedAssets) {\n var _a21;\n if (part.type === \"text\") {\n return {\n type: \"text\",\n text: part.text,\n providerOptions: part.providerOptions\n };\n }\n let originalData;\n const type = part.type;\n switch (type) {\n case \"image\":\n originalData = part.image;\n break;\n case \"file\":\n originalData = part.data;\n break;\n default:\n throw new Error(`Unsupported part type: ${type}`);\n }\n const { data: convertedData, mediaType: convertedMediaType } = convertToLanguageModelV3DataContent(originalData);\n let mediaType = convertedMediaType != null ? convertedMediaType : part.mediaType;\n let data = convertedData;\n if (data instanceof URL) {\n const downloadedFile = downloadedAssets[data.toString()];\n if (downloadedFile) {\n data = downloadedFile.data;\n mediaType != null ? mediaType : mediaType = downloadedFile.mediaType;\n }\n }\n switch (type) {\n case \"image\": {\n if (data instanceof Uint8Array || typeof data === \"string\") {\n mediaType = (_a21 = detectMediaType({ data, signatures: imageMediaTypeSignatures })) != null ? _a21 : mediaType;\n }\n return {\n type: \"file\",\n mediaType: mediaType != null ? mediaType : \"image/*\",\n // any image\n filename: void 0,\n data,\n providerOptions: part.providerOptions\n };\n }\n case \"file\": {\n if (mediaType == null) {\n throw new Error(`Media type is missing for file part`);\n }\n return {\n type: \"file\",\n mediaType,\n filename: part.filename,\n data,\n providerOptions: part.providerOptions\n };\n }\n }\n}\nfunction mapToolResultOutput(output) {\n if (output.type !== \"content\") {\n return output;\n }\n return {\n type: \"content\",\n value: output.value.map((item) => {\n if (item.type !== \"media\") {\n return item;\n }\n if (item.mediaType.startsWith(\"image/\")) {\n return {\n type: \"image-data\",\n data: item.data,\n mediaType: item.mediaType\n };\n }\n return {\n type: \"file-data\",\n data: item.data,\n mediaType: item.mediaType\n };\n })\n };\n}\n\n// src/prompt/create-tool-model-output.ts\n\nasync function createToolModelOutput({\n toolCallId,\n input,\n output,\n tool: tool2,\n errorMode\n}) {\n if (errorMode === \"text\") {\n return { type: \"error-text\", value: (0,_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.getErrorMessage)(output) };\n } else if (errorMode === \"json\") {\n return { type: \"error-json\", value: toJSONValue(output) };\n }\n if (tool2 == null ? void 0 : tool2.toModelOutput) {\n return await tool2.toModelOutput({ toolCallId, input, output });\n }\n return typeof output === \"string\" ? { type: \"text\", value: output } : { type: \"json\", value: toJSONValue(output) };\n}\nfunction toJSONValue(value) {\n return value === void 0 ? null : value;\n}\n\n// src/prompt/prepare-call-settings.ts\nfunction prepareCallSettings({\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n seed,\n stopSequences\n}) {\n if (maxOutputTokens != null) {\n if (!Number.isInteger(maxOutputTokens)) {\n throw new InvalidArgumentError({\n parameter: \"maxOutputTokens\",\n value: maxOutputTokens,\n message: \"maxOutputTokens must be an integer\"\n });\n }\n if (maxOutputTokens < 1) {\n throw new InvalidArgumentError({\n parameter: \"maxOutputTokens\",\n value: maxOutputTokens,\n message: \"maxOutputTokens must be >= 1\"\n });\n }\n }\n if (temperature != null) {\n if (typeof temperature !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"temperature\",\n value: temperature,\n message: \"temperature must be a number\"\n });\n }\n }\n if (topP != null) {\n if (typeof topP !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"topP\",\n value: topP,\n message: \"topP must be a number\"\n });\n }\n }\n if (topK != null) {\n if (typeof topK !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"topK\",\n value: topK,\n message: \"topK must be a number\"\n });\n }\n }\n if (presencePenalty != null) {\n if (typeof presencePenalty !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"presencePenalty\",\n value: presencePenalty,\n message: \"presencePenalty must be a number\"\n });\n }\n }\n if (frequencyPenalty != null) {\n if (typeof frequencyPenalty !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"frequencyPenalty\",\n value: frequencyPenalty,\n message: \"frequencyPenalty must be a number\"\n });\n }\n }\n if (seed != null) {\n if (!Number.isInteger(seed)) {\n throw new InvalidArgumentError({\n parameter: \"seed\",\n value: seed,\n message: \"seed must be an integer\"\n });\n }\n }\n return {\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n stopSequences,\n seed\n };\n}\n\n// src/prompt/prepare-tools-and-tool-choice.ts\n\n\n// src/util/is-non-empty-object.ts\nfunction isNonEmptyObject(object2) {\n return object2 != null && Object.keys(object2).length > 0;\n}\n\n// src/prompt/prepare-tools-and-tool-choice.ts\nasync function prepareToolsAndToolChoice({\n tools,\n toolChoice,\n activeTools\n}) {\n if (!isNonEmptyObject(tools)) {\n return {\n tools: void 0,\n toolChoice: void 0\n };\n }\n const filteredTools = activeTools != null ? Object.entries(tools).filter(\n ([name21]) => activeTools.includes(name21)\n ) : Object.entries(tools);\n const languageModelTools = [];\n for (const [name21, tool2] of filteredTools) {\n const toolType = tool2.type;\n switch (toolType) {\n case void 0:\n case \"dynamic\":\n case \"function\":\n languageModelTools.push({\n type: \"function\",\n name: name21,\n description: tool2.description,\n inputSchema: await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.asSchema)(tool2.inputSchema).jsonSchema,\n ...tool2.inputExamples != null ? { inputExamples: tool2.inputExamples } : {},\n providerOptions: tool2.providerOptions,\n ...tool2.strict != null ? { strict: tool2.strict } : {}\n });\n break;\n case \"provider\":\n languageModelTools.push({\n type: \"provider\",\n name: name21,\n id: tool2.id,\n args: tool2.args\n });\n break;\n default: {\n const exhaustiveCheck = toolType;\n throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);\n }\n }\n }\n return {\n tools: languageModelTools,\n toolChoice: toolChoice == null ? { type: \"auto\" } : typeof toolChoice === \"string\" ? { type: toolChoice } : { type: \"tool\", toolName: toolChoice.toolName }\n };\n}\n\n// src/prompt/standardize-prompt.ts\n\n\n\n\n// src/prompt/message.ts\n\n\n// src/types/provider-metadata.ts\n\n\n// src/types/json-value.ts\n\nvar jsonValueSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.lazy(\n () => zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_3__[\"null\"](),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.number(),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean(),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.record(zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(), jsonValueSchema.optional()),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.array(jsonValueSchema)\n ])\n);\n\n// src/types/provider-metadata.ts\nvar providerMetadataSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.record(\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.record(zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(), jsonValueSchema.optional())\n);\n\n// src/prompt/content-part.ts\n\nvar textPartSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"text\"),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar imagePartSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"image\"),\n image: zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([dataContentSchema, zod_v4__WEBPACK_IMPORTED_MODULE_3__[\"instanceof\"](URL)]),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar filePartSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"file\"),\n data: zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([dataContentSchema, zod_v4__WEBPACK_IMPORTED_MODULE_3__[\"instanceof\"](URL)]),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar reasoningPartSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"reasoning\"),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolCallPartSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool-call\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolName: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n providerOptions: providerMetadataSchema.optional(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional()\n});\nvar outputSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.discriminatedUnion(\n \"type\",\n [\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"text\"),\n value: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"json\"),\n value: jsonValueSchema,\n providerOptions: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"execution-denied\"),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"error-text\"),\n value: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"error-json\"),\n value: jsonValueSchema,\n providerOptions: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"content\"),\n value: zod_v4__WEBPACK_IMPORTED_MODULE_3__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"text\"),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"media\"),\n data: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"file-data\"),\n data: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"file-url\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"file-id\"),\n fileId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_3__.record(zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_3__.string())]),\n providerOptions: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"image-data\"),\n data: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"image-url\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"image-file-id\"),\n fileId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_3__.record(zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_3__.string())]),\n providerOptions: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"custom\"),\n providerOptions: providerMetadataSchema.optional()\n })\n ])\n )\n })\n ]\n);\nvar toolResultPartSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool-result\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolName: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n output: outputSchema,\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolApprovalRequestSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool-approval-request\"),\n approvalId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string()\n});\nvar toolApprovalResponseSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool-approval-response\"),\n approvalId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n approved: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean(),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n});\n\n// src/prompt/message.ts\nvar systemModelMessageSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.object(\n {\n role: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"system\"),\n content: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerOptions: providerMetadataSchema.optional()\n }\n);\nvar userModelMessageSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n role: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"user\"),\n content: zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.array(zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([textPartSchema, imagePartSchema, filePartSchema]))\n ]),\n providerOptions: providerMetadataSchema.optional()\n});\nvar assistantModelMessageSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n role: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"assistant\"),\n content: zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([\n textPartSchema,\n filePartSchema,\n reasoningPartSchema,\n toolCallPartSchema,\n toolResultPartSchema,\n toolApprovalRequestSchema\n ])\n )\n ]),\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolModelMessageSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n role: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool\"),\n content: zod_v4__WEBPACK_IMPORTED_MODULE_3__.array(zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([toolResultPartSchema, toolApprovalResponseSchema])),\n providerOptions: providerMetadataSchema.optional()\n});\nvar modelMessageSchema = zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([\n systemModelMessageSchema,\n userModelMessageSchema,\n assistantModelMessageSchema,\n toolModelMessageSchema\n]);\n\n// src/prompt/standardize-prompt.ts\nasync function standardizePrompt(prompt) {\n if (prompt.prompt == null && prompt.messages == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.InvalidPromptError({\n prompt,\n message: \"prompt or messages must be defined\"\n });\n }\n if (prompt.prompt != null && prompt.messages != null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.InvalidPromptError({\n prompt,\n message: \"prompt and messages cannot be defined at the same time\"\n });\n }\n if (prompt.system != null && typeof prompt.system !== \"string\" && !asArray(prompt.system).every(\n (message) => typeof message === \"object\" && message !== null && \"role\" in message && message.role === \"system\"\n )) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.InvalidPromptError({\n prompt,\n message: \"system must be a string, SystemModelMessage, or array of SystemModelMessage\"\n });\n }\n let messages;\n if (prompt.prompt != null && typeof prompt.prompt === \"string\") {\n messages = [{ role: \"user\", content: prompt.prompt }];\n } else if (prompt.prompt != null && Array.isArray(prompt.prompt)) {\n messages = prompt.prompt;\n } else if (prompt.messages != null) {\n messages = prompt.messages;\n } else {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.InvalidPromptError({\n prompt,\n message: \"prompt or messages must be defined\"\n });\n }\n if (messages.length === 0) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.InvalidPromptError({\n prompt,\n message: \"messages must not be empty\"\n });\n }\n const validationResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeValidateTypes)({\n value: messages,\n schema: zod_v4__WEBPACK_IMPORTED_MODULE_3__.array(modelMessageSchema)\n });\n if (!validationResult.success) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.InvalidPromptError({\n prompt,\n message: \"The messages do not match the ModelMessage[] schema.\",\n cause: validationResult.error\n });\n }\n return {\n messages,\n system: prompt.system\n };\n}\n\n// src/prompt/wrap-gateway-error.ts\n\n\nfunction wrapGatewayError(error) {\n if (!_ai_sdk_gateway__WEBPACK_IMPORTED_MODULE_1__.GatewayAuthenticationError.isInstance(error))\n return error;\n const isProductionEnv = (process == null ? void 0 : \"development\") === \"production\";\n const moreInfoURL = \"https://ai-sdk.dev/unauthenticated-ai-gateway\";\n if (isProductionEnv) {\n return new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError({\n name: \"GatewayError\",\n message: `Unauthenticated. Configure AI_GATEWAY_API_KEY or use a provider module. Learn more: ${moreInfoURL}`\n });\n }\n return Object.assign(\n new Error(`\\x1B[1m\\x1B[31mUnauthenticated request to AI Gateway.\\x1B[0m\n\nTo authenticate, set the \\x1B[33mAI_GATEWAY_API_KEY\\x1B[0m environment variable with your API key.\n\nAlternatively, you can use a provider module instead of the AI Gateway.\n\nLearn more: \\x1B[34m${moreInfoURL}\\x1B[0m\n\n`),\n { name: \"GatewayAuthenticationError\" }\n );\n}\n\n// src/telemetry/assemble-operation-name.ts\nfunction assembleOperationName({\n operationId,\n telemetry\n}) {\n return {\n // standardized operation and resource name:\n \"operation.name\": `${operationId}${(telemetry == null ? void 0 : telemetry.functionId) != null ? ` ${telemetry.functionId}` : \"\"}`,\n \"resource.name\": telemetry == null ? void 0 : telemetry.functionId,\n // detailed, AI SDK specific data:\n \"ai.operationId\": operationId,\n \"ai.telemetry.functionId\": telemetry == null ? void 0 : telemetry.functionId\n };\n}\n\n// src/telemetry/get-base-telemetry-attributes.ts\nfunction getBaseTelemetryAttributes({\n model,\n settings,\n telemetry,\n headers\n}) {\n var _a21;\n return {\n \"ai.model.provider\": model.provider,\n \"ai.model.id\": model.modelId,\n // settings:\n ...Object.entries(settings).reduce((attributes, [key, value]) => {\n if (key === \"timeout\") {\n const totalTimeoutMs = getTotalTimeoutMs(\n value\n );\n if (totalTimeoutMs != null) {\n attributes[`ai.settings.${key}`] = totalTimeoutMs;\n }\n } else {\n attributes[`ai.settings.${key}`] = value;\n }\n return attributes;\n }, {}),\n // add metadata as attributes:\n ...Object.entries((_a21 = telemetry == null ? void 0 : telemetry.metadata) != null ? _a21 : {}).reduce(\n (attributes, [key, value]) => {\n attributes[`ai.telemetry.metadata.${key}`] = value;\n return attributes;\n },\n {}\n ),\n // request headers\n ...Object.entries(headers != null ? headers : {}).reduce((attributes, [key, value]) => {\n if (value !== void 0) {\n attributes[`ai.request.headers.${key}`] = value;\n }\n return attributes;\n }, {})\n };\n}\n\n// src/telemetry/get-tracer.ts\n\n\n// src/telemetry/noop-tracer.ts\nvar noopTracer = {\n startSpan() {\n return noopSpan;\n },\n startActiveSpan(name21, arg1, arg2, arg3) {\n if (typeof arg1 === \"function\") {\n return arg1(noopSpan);\n }\n if (typeof arg2 === \"function\") {\n return arg2(noopSpan);\n }\n if (typeof arg3 === \"function\") {\n return arg3(noopSpan);\n }\n }\n};\nvar noopSpan = {\n spanContext() {\n return noopSpanContext;\n },\n setAttribute() {\n return this;\n },\n setAttributes() {\n return this;\n },\n addEvent() {\n return this;\n },\n addLink() {\n return this;\n },\n addLinks() {\n return this;\n },\n setStatus() {\n return this;\n },\n updateName() {\n return this;\n },\n end() {\n return this;\n },\n isRecording() {\n return false;\n },\n recordException() {\n return this;\n }\n};\nvar noopSpanContext = {\n traceId: \"\",\n spanId: \"\",\n traceFlags: 0\n};\n\n// src/telemetry/get-tracer.ts\nfunction getTracer({\n isEnabled = false,\n tracer\n} = {}) {\n if (!isEnabled) {\n return noopTracer;\n }\n if (tracer) {\n return tracer;\n }\n return _opentelemetry_api__WEBPACK_IMPORTED_MODULE_4__.trace.getTracer(\"ai\");\n}\n\n// src/telemetry/record-span.ts\n\nasync function recordSpan({\n name: name21,\n tracer,\n attributes,\n fn,\n endWhenDone = true\n}) {\n return tracer.startActiveSpan(\n name21,\n { attributes: await attributes },\n async (span) => {\n const ctx = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_5__.context.active();\n try {\n const result = await _opentelemetry_api__WEBPACK_IMPORTED_MODULE_5__.context.with(ctx, () => fn(span));\n if (endWhenDone) {\n span.end();\n }\n return result;\n } catch (error) {\n try {\n recordErrorOnSpan(span, error);\n } finally {\n span.end();\n }\n throw error;\n }\n }\n );\n}\nfunction recordErrorOnSpan(span, error) {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack\n });\n span.setStatus({\n code: _opentelemetry_api__WEBPACK_IMPORTED_MODULE_6__.SpanStatusCode.ERROR,\n message: error.message\n });\n } else {\n span.setStatus({ code: _opentelemetry_api__WEBPACK_IMPORTED_MODULE_6__.SpanStatusCode.ERROR });\n }\n}\n\n// src/telemetry/select-telemetry-attributes.ts\nasync function selectTelemetryAttributes({\n telemetry,\n attributes\n}) {\n if ((telemetry == null ? void 0 : telemetry.isEnabled) !== true) {\n return {};\n }\n const resultAttributes = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) {\n continue;\n }\n if (typeof value === \"object\" && \"input\" in value && typeof value.input === \"function\") {\n if ((telemetry == null ? void 0 : telemetry.recordInputs) === false) {\n continue;\n }\n const result = await value.input();\n if (result != null) {\n resultAttributes[key] = result;\n }\n continue;\n }\n if (typeof value === \"object\" && \"output\" in value && typeof value.output === \"function\") {\n if ((telemetry == null ? void 0 : telemetry.recordOutputs) === false) {\n continue;\n }\n const result = await value.output();\n if (result != null) {\n resultAttributes[key] = result;\n }\n continue;\n }\n resultAttributes[key] = value;\n }\n return resultAttributes;\n}\n\n// src/telemetry/stringify-for-telemetry.ts\nfunction stringifyForTelemetry(prompt) {\n return JSON.stringify(\n prompt.map((message) => ({\n ...message,\n content: typeof message.content === \"string\" ? message.content : message.content.map(\n (part) => part.type === \"file\" ? {\n ...part,\n data: part.data instanceof Uint8Array ? convertDataContentToBase64String(part.data) : part.data\n } : part\n )\n }))\n );\n}\n\n// src/telemetry/telemetry-integration-registry.ts\nfunction registerTelemetryIntegration(integration) {\n if (!globalThis.AI_SDK_TELEMETRY_INTEGRATIONS) {\n globalThis.AI_SDK_TELEMETRY_INTEGRATIONS = [];\n }\n globalThis.AI_SDK_TELEMETRY_INTEGRATIONS.push(integration);\n}\nfunction getGlobalTelemetryIntegrations() {\n var _a21;\n return (_a21 = globalThis.AI_SDK_TELEMETRY_INTEGRATIONS) != null ? _a21 : [];\n}\n\n// src/telemetry/get-global-telemetry-integration.ts\nfunction bindTelemetryIntegration(integration) {\n var _a21, _b, _c, _d, _e, _f;\n return {\n onStart: (_a21 = integration.onStart) == null ? void 0 : _a21.bind(integration),\n onStepStart: (_b = integration.onStepStart) == null ? void 0 : _b.bind(integration),\n onToolCallStart: (_c = integration.onToolCallStart) == null ? void 0 : _c.bind(integration),\n onToolCallFinish: (_d = integration.onToolCallFinish) == null ? void 0 : _d.bind(integration),\n onStepFinish: (_e = integration.onStepFinish) == null ? void 0 : _e.bind(integration),\n onFinish: (_f = integration.onFinish) == null ? void 0 : _f.bind(integration)\n };\n}\nfunction getGlobalTelemetryIntegration() {\n const globalIntegrations = getGlobalTelemetryIntegrations();\n return (integrations) => {\n const localIntegrations = asArray(integrations);\n const allIntegrations = [...globalIntegrations, ...localIntegrations];\n function createTelemetryComposite(getListenerFromIntegration) {\n const listeners = allIntegrations.map(getListenerFromIntegration).filter(Boolean);\n return async (event) => {\n for (const listener of listeners) {\n try {\n await listener(event);\n } catch (_ignored) {\n }\n }\n };\n }\n return {\n onStart: createTelemetryComposite((integration) => integration.onStart),\n onStepStart: createTelemetryComposite(\n (integration) => integration.onStepStart\n ),\n onToolCallStart: createTelemetryComposite(\n (integration) => integration.onToolCallStart\n ),\n onToolCallFinish: createTelemetryComposite(\n (integration) => integration.onToolCallFinish\n ),\n onStepFinish: createTelemetryComposite(\n (integration) => integration.onStepFinish\n ),\n onFinish: createTelemetryComposite((integration) => integration.onFinish)\n };\n };\n}\n\n// src/types/usage.ts\nfunction asLanguageModelUsage(usage) {\n return {\n inputTokens: usage.inputTokens.total,\n inputTokenDetails: {\n noCacheTokens: usage.inputTokens.noCache,\n cacheReadTokens: usage.inputTokens.cacheRead,\n cacheWriteTokens: usage.inputTokens.cacheWrite\n },\n outputTokens: usage.outputTokens.total,\n outputTokenDetails: {\n textTokens: usage.outputTokens.text,\n reasoningTokens: usage.outputTokens.reasoning\n },\n totalTokens: addTokenCounts(\n usage.inputTokens.total,\n usage.outputTokens.total\n ),\n raw: usage.raw,\n reasoningTokens: usage.outputTokens.reasoning,\n cachedInputTokens: usage.inputTokens.cacheRead\n };\n}\nfunction createNullLanguageModelUsage() {\n return {\n inputTokens: void 0,\n inputTokenDetails: {\n noCacheTokens: void 0,\n cacheReadTokens: void 0,\n cacheWriteTokens: void 0\n },\n outputTokens: void 0,\n outputTokenDetails: {\n textTokens: void 0,\n reasoningTokens: void 0\n },\n totalTokens: void 0,\n raw: void 0\n };\n}\nfunction addLanguageModelUsage(usage1, usage2) {\n var _a21, _b, _c, _d, _e, _f, _g, _h, _i, _j;\n return {\n inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n (_a21 = usage1.inputTokenDetails) == null ? void 0 : _a21.noCacheTokens,\n (_b = usage2.inputTokenDetails) == null ? void 0 : _b.noCacheTokens\n ),\n cacheReadTokens: addTokenCounts(\n (_c = usage1.inputTokenDetails) == null ? void 0 : _c.cacheReadTokens,\n (_d = usage2.inputTokenDetails) == null ? void 0 : _d.cacheReadTokens\n ),\n cacheWriteTokens: addTokenCounts(\n (_e = usage1.inputTokenDetails) == null ? void 0 : _e.cacheWriteTokens,\n (_f = usage2.inputTokenDetails) == null ? void 0 : _f.cacheWriteTokens\n )\n },\n outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n (_g = usage1.outputTokenDetails) == null ? void 0 : _g.textTokens,\n (_h = usage2.outputTokenDetails) == null ? void 0 : _h.textTokens\n ),\n reasoningTokens: addTokenCounts(\n (_i = usage1.outputTokenDetails) == null ? void 0 : _i.reasoningTokens,\n (_j = usage2.outputTokenDetails) == null ? void 0 : _j.reasoningTokens\n )\n },\n totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens),\n reasoningTokens: addTokenCounts(\n usage1.reasoningTokens,\n usage2.reasoningTokens\n ),\n cachedInputTokens: addTokenCounts(\n usage1.cachedInputTokens,\n usage2.cachedInputTokens\n )\n };\n}\nfunction addTokenCounts(tokenCount1, tokenCount2) {\n return tokenCount1 == null && tokenCount2 == null ? void 0 : (tokenCount1 != null ? tokenCount1 : 0) + (tokenCount2 != null ? tokenCount2 : 0);\n}\nfunction addImageModelUsage(usage1, usage2) {\n return {\n inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens),\n outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens),\n totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens)\n };\n}\n\n// src/util/merge-objects.ts\nfunction mergeObjects(base, overrides) {\n if (base === void 0 && overrides === void 0) {\n return void 0;\n }\n if (base === void 0) {\n return overrides;\n }\n if (overrides === void 0) {\n return base;\n }\n const result = { ...base };\n for (const key in overrides) {\n if (Object.prototype.hasOwnProperty.call(overrides, key)) {\n const overridesValue = overrides[key];\n if (overridesValue === void 0)\n continue;\n const baseValue = key in base ? base[key] : void 0;\n const isSourceObject = overridesValue !== null && typeof overridesValue === \"object\" && !Array.isArray(overridesValue) && !(overridesValue instanceof Date) && !(overridesValue instanceof RegExp);\n const isTargetObject = baseValue !== null && baseValue !== void 0 && typeof baseValue === \"object\" && !Array.isArray(baseValue) && !(baseValue instanceof Date) && !(baseValue instanceof RegExp);\n if (isSourceObject && isTargetObject) {\n result[key] = mergeObjects(\n baseValue,\n overridesValue\n );\n } else {\n result[key] = overridesValue;\n }\n }\n }\n return result;\n}\n\n// src/util/retry-with-exponential-backoff.ts\n\n\nfunction getRetryDelayInMs({\n error,\n exponentialBackoffDelay\n}) {\n const headers = error.responseHeaders;\n if (!headers)\n return exponentialBackoffDelay;\n let ms;\n const retryAfterMs = headers[\"retry-after-ms\"];\n if (retryAfterMs) {\n const timeoutMs = parseFloat(retryAfterMs);\n if (!Number.isNaN(timeoutMs)) {\n ms = timeoutMs;\n }\n }\n const retryAfter = headers[\"retry-after\"];\n if (retryAfter && ms === void 0) {\n const timeoutSeconds = parseFloat(retryAfter);\n if (!Number.isNaN(timeoutSeconds)) {\n ms = timeoutSeconds * 1e3;\n } else {\n ms = Date.parse(retryAfter) - Date.now();\n }\n }\n if (ms != null && !Number.isNaN(ms) && 0 <= ms && (ms < 60 * 1e3 || ms < exponentialBackoffDelay)) {\n return ms;\n }\n return exponentialBackoffDelay;\n}\nvar retryWithExponentialBackoffRespectingRetryHeaders = ({\n maxRetries = 2,\n initialDelayInMs = 2e3,\n backoffFactor = 2,\n abortSignal\n} = {}) => async (f) => _retryWithExponentialBackoff(f, {\n maxRetries,\n delayInMs: initialDelayInMs,\n backoffFactor,\n abortSignal\n});\nasync function _retryWithExponentialBackoff(f, {\n maxRetries,\n delayInMs,\n backoffFactor,\n abortSignal\n}, errors = []) {\n try {\n return await f();\n } catch (error) {\n if ((0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.isAbortError)(error)) {\n throw error;\n }\n if (maxRetries === 0) {\n throw error;\n }\n const errorMessage = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.getErrorMessage)(error);\n const newErrors = [...errors, error];\n const tryNumber = newErrors.length;\n if (tryNumber > maxRetries) {\n throw new RetryError({\n message: `Failed after ${tryNumber} attempts. Last error: ${errorMessage}`,\n reason: \"maxRetriesExceeded\",\n errors: newErrors\n });\n }\n if (error instanceof Error && _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError.isInstance(error) && error.isRetryable === true && tryNumber <= maxRetries) {\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.delay)(\n getRetryDelayInMs({\n error,\n exponentialBackoffDelay: delayInMs\n }),\n { abortSignal }\n );\n return _retryWithExponentialBackoff(\n f,\n {\n maxRetries,\n delayInMs: backoffFactor * delayInMs,\n backoffFactor,\n abortSignal\n },\n newErrors\n );\n }\n if (tryNumber === 1) {\n throw error;\n }\n throw new RetryError({\n message: `Failed after ${tryNumber} attempts with non-retryable error: '${errorMessage}'`,\n reason: \"errorNotRetryable\",\n errors: newErrors\n });\n }\n}\n\n// src/util/prepare-retries.ts\nfunction prepareRetries({\n maxRetries,\n abortSignal\n}) {\n if (maxRetries != null) {\n if (!Number.isInteger(maxRetries)) {\n throw new InvalidArgumentError({\n parameter: \"maxRetries\",\n value: maxRetries,\n message: \"maxRetries must be an integer\"\n });\n }\n if (maxRetries < 0) {\n throw new InvalidArgumentError({\n parameter: \"maxRetries\",\n value: maxRetries,\n message: \"maxRetries must be >= 0\"\n });\n }\n }\n const maxRetriesResult = maxRetries != null ? maxRetries : 2;\n return {\n maxRetries: maxRetriesResult,\n retry: retryWithExponentialBackoffRespectingRetryHeaders({\n maxRetries: maxRetriesResult,\n abortSignal\n })\n };\n}\n\n// src/generate-text/collect-tool-approvals.ts\nfunction collectToolApprovals({\n messages\n}) {\n const lastMessage = messages.at(-1);\n if ((lastMessage == null ? void 0 : lastMessage.role) != \"tool\") {\n return {\n approvedToolApprovals: [],\n deniedToolApprovals: []\n };\n }\n const toolCallsByToolCallId = {};\n for (const message of messages) {\n if (message.role === \"assistant\" && typeof message.content !== \"string\") {\n const content = message.content;\n for (const part of content) {\n if (part.type === \"tool-call\") {\n toolCallsByToolCallId[part.toolCallId] = part;\n }\n }\n }\n }\n const toolApprovalRequestsByApprovalId = {};\n for (const message of messages) {\n if (message.role === \"assistant\" && typeof message.content !== \"string\") {\n const content = message.content;\n for (const part of content) {\n if (part.type === \"tool-approval-request\") {\n toolApprovalRequestsByApprovalId[part.approvalId] = part;\n }\n }\n }\n }\n const toolResults = {};\n for (const part of lastMessage.content) {\n if (part.type === \"tool-result\") {\n toolResults[part.toolCallId] = part;\n }\n }\n const approvedToolApprovals = [];\n const deniedToolApprovals = [];\n const approvalResponses = lastMessage.content.filter(\n (part) => part.type === \"tool-approval-response\"\n );\n for (const approvalResponse of approvalResponses) {\n const approvalRequest = toolApprovalRequestsByApprovalId[approvalResponse.approvalId];\n if (approvalRequest == null) {\n throw new InvalidToolApprovalError({\n approvalId: approvalResponse.approvalId\n });\n }\n if (toolResults[approvalRequest.toolCallId] != null) {\n continue;\n }\n const toolCall = toolCallsByToolCallId[approvalRequest.toolCallId];\n if (toolCall == null) {\n throw new ToolCallNotFoundForApprovalError({\n toolCallId: approvalRequest.toolCallId,\n approvalId: approvalRequest.approvalId\n });\n }\n const approval = {\n approvalRequest,\n approvalResponse,\n toolCall\n };\n if (approvalResponse.approved) {\n approvedToolApprovals.push(approval);\n } else {\n deniedToolApprovals.push(approval);\n }\n }\n return { approvedToolApprovals, deniedToolApprovals };\n}\n\n// src/generate-text/execute-tool-call.ts\n\n\n// src/util/now.ts\nfunction now() {\n var _a21, _b;\n return (_b = (_a21 = globalThis == null ? void 0 : globalThis.performance) == null ? void 0 : _a21.now()) != null ? _b : Date.now();\n}\n\n// src/generate-text/execute-tool-call.ts\nasync function executeToolCall({\n toolCall,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onPreliminaryToolResult,\n onToolCallStart,\n onToolCallFinish\n}) {\n const { toolName, toolCallId, input } = toolCall;\n const tool2 = tools == null ? void 0 : tools[toolName];\n if ((tool2 == null ? void 0 : tool2.execute) == null) {\n return void 0;\n }\n const baseCallbackEvent = {\n stepNumber,\n model,\n toolCall,\n messages,\n abortSignal,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context\n };\n return recordSpan({\n name: \"ai.toolCall\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.toolCall\",\n telemetry\n }),\n \"ai.toolCall.name\": toolName,\n \"ai.toolCall.id\": toolCallId,\n \"ai.toolCall.args\": {\n output: () => JSON.stringify(input)\n }\n }\n }),\n tracer,\n fn: async (span) => {\n let output;\n await notify({ event: baseCallbackEvent, callbacks: onToolCallStart });\n const startTime = now();\n try {\n const stream = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.executeTool)({\n execute: tool2.execute.bind(tool2),\n input,\n options: {\n toolCallId,\n messages,\n abortSignal,\n experimental_context\n }\n });\n for await (const part of stream) {\n if (part.type === \"preliminary\") {\n onPreliminaryToolResult == null ? void 0 : onPreliminaryToolResult({\n ...toolCall,\n type: \"tool-result\",\n output: part.output,\n preliminary: true\n });\n } else {\n output = part.output;\n }\n }\n } catch (error) {\n const durationMs2 = now() - startTime;\n await notify({\n event: {\n ...baseCallbackEvent,\n success: false,\n error,\n durationMs: durationMs2\n },\n callbacks: onToolCallFinish\n });\n recordErrorOnSpan(span, error);\n return {\n type: \"tool-error\",\n toolCallId,\n toolName,\n input,\n error,\n dynamic: tool2.type === \"dynamic\",\n ...toolCall.providerMetadata != null ? { providerMetadata: toolCall.providerMetadata } : {}\n };\n }\n const durationMs = now() - startTime;\n await notify({\n event: {\n ...baseCallbackEvent,\n success: true,\n output,\n durationMs\n },\n callbacks: onToolCallFinish\n });\n try {\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.toolCall.result\": {\n output: () => JSON.stringify(output)\n }\n }\n })\n );\n } catch (ignored) {\n }\n return {\n type: \"tool-result\",\n toolCallId,\n toolName,\n input,\n output,\n dynamic: tool2.type === \"dynamic\",\n ...toolCall.providerMetadata != null ? { providerMetadata: toolCall.providerMetadata } : {}\n };\n }\n });\n}\n\n// src/generate-text/extract-reasoning-content.ts\nfunction extractReasoningContent(content) {\n const parts = content.filter(\n (content2) => content2.type === \"reasoning\"\n );\n return parts.length === 0 ? void 0 : parts.map((content2) => content2.text).join(\"\\n\");\n}\n\n// src/generate-text/extract-text-content.ts\nfunction extractTextContent(content) {\n const parts = content.filter(\n (content2) => content2.type === \"text\"\n );\n if (parts.length === 0) {\n return void 0;\n }\n return parts.map((content2) => content2.text).join(\"\");\n}\n\n// src/generate-text/generated-file.ts\n\nvar DefaultGeneratedFile = class {\n constructor({\n data,\n mediaType\n }) {\n const isUint8Array = data instanceof Uint8Array;\n this.base64Data = isUint8Array ? void 0 : data;\n this.uint8ArrayData = isUint8Array ? data : void 0;\n this.mediaType = mediaType;\n }\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get base64() {\n if (this.base64Data == null) {\n this.base64Data = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.convertUint8ArrayToBase64)(this.uint8ArrayData);\n }\n return this.base64Data;\n }\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get uint8Array() {\n if (this.uint8ArrayData == null) {\n this.uint8ArrayData = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.convertBase64ToUint8Array)(this.base64Data);\n }\n return this.uint8ArrayData;\n }\n};\nvar DefaultGeneratedFileWithType = class extends DefaultGeneratedFile {\n constructor(options) {\n super(options);\n this.type = \"file\";\n }\n};\n\n// src/generate-text/is-approval-needed.ts\nasync function isApprovalNeeded({\n tool: tool2,\n toolCall,\n messages,\n experimental_context\n}) {\n if (tool2.needsApproval == null) {\n return false;\n }\n if (typeof tool2.needsApproval === \"boolean\") {\n return tool2.needsApproval;\n }\n return await tool2.needsApproval(toolCall.input, {\n toolCallId: toolCall.toolCallId,\n messages,\n experimental_context\n });\n}\n\n// src/generate-text/output.ts\nvar output_exports = {};\n__export(output_exports, {\n array: () => array,\n choice: () => choice,\n json: () => json,\n object: () => object,\n text: () => text\n});\n\n\n\n// src/util/parse-partial-json.ts\n\n\n// src/util/fix-json.ts\nfunction fixJson(input) {\n const stack = [\"ROOT\"];\n let lastValidIndex = -1;\n let literalStart = null;\n function processValueStart(char, i, swapState) {\n {\n switch (char) {\n case '\"': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_STRING\");\n break;\n }\n case \"f\":\n case \"t\":\n case \"n\": {\n lastValidIndex = i;\n literalStart = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_LITERAL\");\n break;\n }\n case \"-\": {\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_NUMBER\");\n break;\n }\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_NUMBER\");\n break;\n }\n case \"{\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_OBJECT_START\");\n break;\n }\n case \"[\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_ARRAY_START\");\n break;\n }\n }\n }\n }\n function processAfterObjectValue(char, i) {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_AFTER_COMMA\");\n break;\n }\n case \"}\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n function processAfterArrayValue(char, i) {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_ARRAY_AFTER_COMMA\");\n break;\n }\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n const currentState = stack[stack.length - 1];\n switch (currentState) {\n case \"ROOT\":\n processValueStart(char, i, \"FINISH\");\n break;\n case \"INSIDE_OBJECT_START\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_KEY\");\n break;\n }\n case \"}\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_AFTER_COMMA\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_KEY\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_KEY\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_AFTER_KEY\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_AFTER_KEY\": {\n switch (char) {\n case \":\": {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_BEFORE_VALUE\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_BEFORE_VALUE\": {\n processValueStart(char, i, \"INSIDE_OBJECT_AFTER_VALUE\");\n break;\n }\n case \"INSIDE_OBJECT_AFTER_VALUE\": {\n processAfterObjectValue(char, i);\n break;\n }\n case \"INSIDE_STRING\": {\n switch (char) {\n case '\"': {\n stack.pop();\n lastValidIndex = i;\n break;\n }\n case \"\\\\\": {\n stack.push(\"INSIDE_STRING_ESCAPE\");\n break;\n }\n default: {\n lastValidIndex = i;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_START\": {\n switch (char) {\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n default: {\n lastValidIndex = i;\n processValueStart(char, i, \"INSIDE_ARRAY_AFTER_VALUE\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_AFTER_VALUE\": {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_ARRAY_AFTER_COMMA\");\n break;\n }\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n default: {\n lastValidIndex = i;\n break;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_AFTER_COMMA\": {\n processValueStart(char, i, \"INSIDE_ARRAY_AFTER_VALUE\");\n break;\n }\n case \"INSIDE_STRING_ESCAPE\": {\n stack.pop();\n lastValidIndex = i;\n break;\n }\n case \"INSIDE_NUMBER\": {\n switch (char) {\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n lastValidIndex = i;\n break;\n }\n case \"e\":\n case \"E\":\n case \"-\":\n case \".\": {\n break;\n }\n case \",\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n }\n break;\n }\n case \"}\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n }\n break;\n }\n case \"]\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n break;\n }\n default: {\n stack.pop();\n break;\n }\n }\n break;\n }\n case \"INSIDE_LITERAL\": {\n const partialLiteral = input.substring(literalStart, i + 1);\n if (!\"false\".startsWith(partialLiteral) && !\"true\".startsWith(partialLiteral) && !\"null\".startsWith(partialLiteral)) {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n } else if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n } else {\n lastValidIndex = i;\n }\n break;\n }\n }\n }\n let result = input.slice(0, lastValidIndex + 1);\n for (let i = stack.length - 1; i >= 0; i--) {\n const state = stack[i];\n switch (state) {\n case \"INSIDE_STRING\": {\n result += '\"';\n break;\n }\n case \"INSIDE_OBJECT_KEY\":\n case \"INSIDE_OBJECT_AFTER_KEY\":\n case \"INSIDE_OBJECT_AFTER_COMMA\":\n case \"INSIDE_OBJECT_START\":\n case \"INSIDE_OBJECT_BEFORE_VALUE\":\n case \"INSIDE_OBJECT_AFTER_VALUE\": {\n result += \"}\";\n break;\n }\n case \"INSIDE_ARRAY_START\":\n case \"INSIDE_ARRAY_AFTER_COMMA\":\n case \"INSIDE_ARRAY_AFTER_VALUE\": {\n result += \"]\";\n break;\n }\n case \"INSIDE_LITERAL\": {\n const partialLiteral = input.substring(literalStart, input.length);\n if (\"true\".startsWith(partialLiteral)) {\n result += \"true\".slice(partialLiteral.length);\n } else if (\"false\".startsWith(partialLiteral)) {\n result += \"false\".slice(partialLiteral.length);\n } else if (\"null\".startsWith(partialLiteral)) {\n result += \"null\".slice(partialLiteral.length);\n }\n }\n }\n }\n return result;\n}\n\n// src/util/parse-partial-json.ts\nasync function parsePartialJson(jsonText) {\n if (jsonText === void 0) {\n return { value: void 0, state: \"undefined-input\" };\n }\n let result = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeParseJSON)({ text: jsonText });\n if (result.success) {\n return { value: result.value, state: \"successful-parse\" };\n }\n result = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeParseJSON)({ text: fixJson(jsonText) });\n if (result.success) {\n return { value: result.value, state: \"repaired-parse\" };\n }\n return { value: void 0, state: \"failed-parse\" };\n}\n\n// src/generate-text/output.ts\nvar text = () => ({\n name: \"text\",\n responseFormat: Promise.resolve({ type: \"text\" }),\n async parseCompleteOutput({ text: text2 }) {\n return text2;\n },\n async parsePartialOutput({ text: text2 }) {\n return { partial: text2 };\n },\n createElementStreamTransform() {\n return void 0;\n }\n});\nvar object = ({\n schema: inputSchema,\n name: name21,\n description\n}) => {\n const schema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.asSchema)(inputSchema);\n return {\n name: \"object\",\n responseFormat: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.resolve)(schema.jsonSchema).then((jsonSchema2) => ({\n type: \"json\",\n schema: jsonSchema2,\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n })),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeParseJSON)({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const validationResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeValidateTypes)({\n value: parseResult.value,\n schema\n });\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return validationResult.value;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n return {\n // Note: currently no validation of partial results:\n partial: result.value\n };\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\nvar array = ({\n element: inputElementSchema,\n name: name21,\n description\n}) => {\n const elementSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.asSchema)(inputElementSchema);\n return {\n name: \"array\",\n // JSON schema that describes an array of elements:\n responseFormat: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.resolve)(elementSchema.jsonSchema).then((jsonSchema2) => {\n const { $schema, ...itemSchema } = jsonSchema2;\n return {\n type: \"json\",\n schema: {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n elements: { type: \"array\", items: itemSchema }\n },\n required: [\"elements\"],\n additionalProperties: false\n },\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n };\n }),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeParseJSON)({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const outerValue = parseResult.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"elements\" in outerValue) || !Array.isArray(outerValue.elements)) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError({\n value: outerValue,\n cause: \"response must be an object with an elements array\"\n }),\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n for (const element of outerValue.elements) {\n const validationResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeValidateTypes)({\n value: element,\n schema: elementSchema\n });\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n }\n return outerValue.elements;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n const outerValue = result.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"elements\" in outerValue) || !Array.isArray(outerValue.elements)) {\n return void 0;\n }\n const rawElements = result.state === \"repaired-parse\" && outerValue.elements.length > 0 ? outerValue.elements.slice(0, -1) : outerValue.elements;\n const parsedElements = [];\n for (const rawElement of rawElements) {\n const validationResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeValidateTypes)({\n value: rawElement,\n schema: elementSchema\n });\n if (validationResult.success) {\n parsedElements.push(validationResult.value);\n }\n }\n return { partial: parsedElements };\n }\n }\n },\n createElementStreamTransform() {\n let publishedElements = 0;\n return new TransformStream({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n for (; publishedElements < partialOutput.length; publishedElements++) {\n controller.enqueue(partialOutput[publishedElements]);\n }\n }\n }\n });\n }\n };\n};\nvar choice = ({\n options: choiceOptions,\n name: name21,\n description\n}) => {\n return {\n name: \"choice\",\n // JSON schema that describes an enumeration:\n responseFormat: Promise.resolve({\n type: \"json\",\n schema: {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n result: { type: \"string\", enum: choiceOptions }\n },\n required: [\"result\"],\n additionalProperties: false\n },\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n }),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeParseJSON)({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const outerValue = parseResult.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"result\" in outerValue) || typeof outerValue.result !== \"string\" || !choiceOptions.includes(outerValue.result)) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError({\n value: outerValue,\n cause: \"response must be an object that contains a choice value.\"\n }),\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return outerValue.result;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n const outerValue = result.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"result\" in outerValue) || typeof outerValue.result !== \"string\") {\n return void 0;\n }\n const potentialMatches = choiceOptions.filter(\n (choiceOption) => choiceOption.startsWith(outerValue.result)\n );\n if (result.state === \"successful-parse\") {\n return potentialMatches.includes(outerValue.result) ? { partial: outerValue.result } : void 0;\n } else {\n return potentialMatches.length === 1 ? { partial: potentialMatches[0] } : void 0;\n }\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\nvar json = ({\n name: name21,\n description\n} = {}) => {\n return {\n name: \"json\",\n responseFormat: Promise.resolve({\n type: \"json\",\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n }),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeParseJSON)({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return parseResult.value;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n return result.value === void 0 ? void 0 : { partial: result.value };\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\n\n// src/generate-text/parse-tool-call.ts\n\nasync function parseToolCall({\n toolCall,\n tools,\n repairToolCall,\n system,\n messages\n}) {\n var _a21;\n try {\n if (tools == null) {\n if (toolCall.providerExecuted && toolCall.dynamic) {\n return await parseProviderExecutedDynamicToolCall(toolCall);\n }\n throw new NoSuchToolError({ toolName: toolCall.toolName });\n }\n try {\n return await doParseToolCall({ toolCall, tools });\n } catch (error) {\n if (repairToolCall == null || !(NoSuchToolError.isInstance(error) || InvalidToolInputError.isInstance(error))) {\n throw error;\n }\n let repairedToolCall = null;\n try {\n repairedToolCall = await repairToolCall({\n toolCall,\n tools,\n inputSchema: async ({ toolName }) => {\n const { inputSchema } = tools[toolName];\n return await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.asSchema)(inputSchema).jsonSchema;\n },\n system,\n messages,\n error\n });\n } catch (repairError) {\n throw new ToolCallRepairError({\n cause: repairError,\n originalError: error\n });\n }\n if (repairedToolCall == null) {\n throw error;\n }\n return await doParseToolCall({ toolCall: repairedToolCall, tools });\n }\n } catch (error) {\n const parsedInput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeParseJSON)({ text: toolCall.input });\n const input = parsedInput.success ? parsedInput.value : toolCall.input;\n return {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input,\n dynamic: true,\n invalid: true,\n error,\n title: (_a21 = tools == null ? void 0 : tools[toolCall.toolName]) == null ? void 0 : _a21.title,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata\n };\n }\n}\nasync function parseProviderExecutedDynamicToolCall(toolCall) {\n const parseResult = toolCall.input.trim() === \"\" ? { success: true, value: {} } : await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeParseJSON)({ text: toolCall.input });\n if (parseResult.success === false) {\n throw new InvalidToolInputError({\n toolName: toolCall.toolName,\n toolInput: toolCall.input,\n cause: parseResult.error\n });\n }\n return {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parseResult.value,\n providerExecuted: true,\n dynamic: true,\n providerMetadata: toolCall.providerMetadata\n };\n}\nasync function doParseToolCall({\n toolCall,\n tools\n}) {\n const toolName = toolCall.toolName;\n const tool2 = tools[toolName];\n if (tool2 == null) {\n if (toolCall.providerExecuted && toolCall.dynamic) {\n return await parseProviderExecutedDynamicToolCall(toolCall);\n }\n throw new NoSuchToolError({\n toolName: toolCall.toolName,\n availableTools: Object.keys(tools)\n });\n }\n const schema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.asSchema)(tool2.inputSchema);\n const parseResult = toolCall.input.trim() === \"\" ? await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeValidateTypes)({ value: {}, schema }) : await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeParseJSON)({ text: toolCall.input, schema });\n if (parseResult.success === false) {\n throw new InvalidToolInputError({\n toolName,\n toolInput: toolCall.input,\n cause: parseResult.error\n });\n }\n return tool2.type === \"dynamic\" ? {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n dynamic: true,\n title: tool2.title\n } : {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n title: tool2.title\n };\n}\n\n// src/generate-text/step-result.ts\nvar DefaultStepResult = class {\n constructor({\n stepNumber,\n model,\n functionId,\n metadata,\n experimental_context,\n content,\n finishReason,\n rawFinishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata\n }) {\n this.stepNumber = stepNumber;\n this.model = model;\n this.functionId = functionId;\n this.metadata = metadata;\n this.experimental_context = experimental_context;\n this.content = content;\n this.finishReason = finishReason;\n this.rawFinishReason = rawFinishReason;\n this.usage = usage;\n this.warnings = warnings;\n this.request = request;\n this.response = response;\n this.providerMetadata = providerMetadata;\n }\n get text() {\n return this.content.filter((part) => part.type === \"text\").map((part) => part.text).join(\"\");\n }\n get reasoning() {\n return this.content.filter((part) => part.type === \"reasoning\");\n }\n get reasoningText() {\n return this.reasoning.length === 0 ? void 0 : this.reasoning.map((part) => part.text).join(\"\");\n }\n get files() {\n return this.content.filter((part) => part.type === \"file\").map((part) => part.file);\n }\n get sources() {\n return this.content.filter((part) => part.type === \"source\");\n }\n get toolCalls() {\n return this.content.filter((part) => part.type === \"tool-call\");\n }\n get staticToolCalls() {\n return this.toolCalls.filter(\n (toolCall) => toolCall.dynamic !== true\n );\n }\n get dynamicToolCalls() {\n return this.toolCalls.filter(\n (toolCall) => toolCall.dynamic === true\n );\n }\n get toolResults() {\n return this.content.filter((part) => part.type === \"tool-result\");\n }\n get staticToolResults() {\n return this.toolResults.filter(\n (toolResult) => toolResult.dynamic !== true\n );\n }\n get dynamicToolResults() {\n return this.toolResults.filter(\n (toolResult) => toolResult.dynamic === true\n );\n }\n};\n\n// src/generate-text/stop-condition.ts\nfunction stepCountIs(stepCount) {\n return ({ steps }) => steps.length === stepCount;\n}\nfunction isLoopFinished() {\n return () => false;\n}\nfunction hasToolCall(toolName) {\n return ({ steps }) => {\n var _a21, _b, _c;\n return (_c = (_b = (_a21 = steps[steps.length - 1]) == null ? void 0 : _a21.toolCalls) == null ? void 0 : _b.some(\n (toolCall) => toolCall.toolName === toolName\n )) != null ? _c : false;\n };\n}\nasync function isStopConditionMet({\n stopConditions,\n steps\n}) {\n return (await Promise.all(stopConditions.map((condition) => condition({ steps })))).some((result) => result);\n}\n\n// src/generate-text/to-response-messages.ts\nasync function toResponseMessages({\n content: inputContent,\n tools\n}) {\n const responseMessages = [];\n const content = [];\n for (const part of inputContent) {\n if (part.type === \"source\") {\n continue;\n }\n if ((part.type === \"tool-result\" || part.type === \"tool-error\") && !part.providerExecuted) {\n continue;\n }\n if (part.type === \"text\" && part.text.length === 0) {\n continue;\n }\n switch (part.type) {\n case \"text\":\n content.push({\n type: \"text\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n break;\n case \"reasoning\":\n content.push({\n type: \"reasoning\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n break;\n case \"file\":\n content.push({\n type: \"file\",\n data: part.file.base64,\n mediaType: part.file.mediaType,\n providerOptions: part.providerMetadata\n });\n break;\n case \"tool-call\":\n content.push({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n providerExecuted: part.providerExecuted,\n providerOptions: part.providerMetadata\n });\n break;\n case \"tool-result\": {\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: tools == null ? void 0 : tools[part.toolName],\n output: part.output,\n errorMode: \"none\"\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n providerOptions: part.providerMetadata\n });\n break;\n }\n case \"tool-error\": {\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: tools == null ? void 0 : tools[part.toolName],\n output: part.error,\n errorMode: \"json\"\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n providerOptions: part.providerMetadata\n });\n break;\n }\n case \"tool-approval-request\":\n content.push({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCallId: part.toolCall.toolCallId\n });\n break;\n }\n }\n if (content.length > 0) {\n responseMessages.push({\n role: \"assistant\",\n content\n });\n }\n const toolResultContent = [];\n for (const part of inputContent) {\n if (!(part.type === \"tool-result\" || part.type === \"tool-error\") || part.providerExecuted) {\n continue;\n }\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: tools == null ? void 0 : tools[part.toolName],\n output: part.type === \"tool-result\" ? part.output : part.error,\n errorMode: part.type === \"tool-error\" ? \"text\" : \"none\"\n });\n toolResultContent.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n }\n if (toolResultContent.length > 0) {\n responseMessages.push({\n role: \"tool\",\n content: toolResultContent\n });\n }\n return responseMessages;\n}\n\n// src/util/merge-abort-signals.ts\nfunction mergeAbortSignals(...signals) {\n const validSignals = signals.filter(\n (signal) => signal != null\n );\n if (validSignals.length === 0) {\n return void 0;\n }\n if (validSignals.length === 1) {\n return validSignals[0];\n }\n const controller = new AbortController();\n for (const signal of validSignals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n return controller.signal;\n }\n signal.addEventListener(\n \"abort\",\n () => {\n controller.abort(signal.reason);\n },\n { once: true }\n );\n }\n return controller.signal;\n}\n\n// src/generate-text/generate-text.ts\nvar originalGenerateId = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.createIdGenerator)({\n prefix: \"aitxt\",\n size: 24\n});\nasync function generateText({\n model: modelArg,\n tools,\n toolChoice,\n system,\n prompt,\n messages,\n maxRetries: maxRetriesArg,\n abortSignal,\n timeout,\n headers,\n stopWhen = stepCountIs(1),\n experimental_output,\n output = experimental_output,\n experimental_telemetry: telemetry,\n providerOptions,\n experimental_activeTools,\n activeTools = experimental_activeTools,\n experimental_prepareStep,\n prepareStep = experimental_prepareStep,\n experimental_repairToolCall: repairToolCall,\n experimental_download: download2,\n experimental_context,\n experimental_include: include,\n _internal: { generateId: generateId2 = originalGenerateId } = {},\n experimental_onStart: onStart,\n experimental_onStepStart: onStepStart,\n experimental_onToolCallStart: onToolCallStart,\n experimental_onToolCallFinish: onToolCallFinish,\n onStepFinish,\n onFinish,\n ...settings\n}) {\n const model = resolveLanguageModel(modelArg);\n const createGlobalTelemetry = getGlobalTelemetryIntegration();\n const stopConditions = asArray(stopWhen);\n const totalTimeoutMs = getTotalTimeoutMs(timeout);\n const stepTimeoutMs = getStepTimeoutMs(timeout);\n const stepAbortController = stepTimeoutMs != null ? new AbortController() : void 0;\n const mergedAbortSignal = mergeAbortSignals(\n abortSignal,\n totalTimeoutMs != null ? AbortSignal.timeout(totalTimeoutMs) : void 0,\n stepAbortController == null ? void 0 : stepAbortController.signal\n );\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal: mergedAbortSignal\n });\n const callSettings = prepareCallSettings(settings);\n const headersWithUserAgent = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.withUserAgentSuffix)(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { ...callSettings, maxRetries }\n });\n const modelInfo = { provider: model.provider, modelId: model.modelId };\n const initialPrompt = await standardizePrompt({\n system,\n prompt,\n messages\n });\n const globalTelemetry = createGlobalTelemetry(telemetry == null ? void 0 : telemetry.integrations);\n await notify({\n event: {\n model: modelInfo,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n activeTools,\n maxOutputTokens: callSettings.maxOutputTokens,\n temperature: callSettings.temperature,\n topP: callSettings.topP,\n topK: callSettings.topK,\n presencePenalty: callSettings.presencePenalty,\n frequencyPenalty: callSettings.frequencyPenalty,\n stopSequences: callSettings.stopSequences,\n seed: callSettings.seed,\n maxRetries,\n timeout,\n headers,\n providerOptions,\n stopWhen,\n output,\n abortSignal,\n include,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context\n },\n callbacks: [\n onStart,\n globalTelemetry.onStart\n ]\n });\n const tracer = getTracer(telemetry);\n try {\n return await recordSpan({\n name: \"ai.generateText\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateText\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // model:\n \"ai.model.provider\": model.provider,\n \"ai.model.id\": model.modelId,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n }\n }\n }),\n tracer,\n fn: async (span) => {\n var _a21, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t;\n const initialMessages = initialPrompt.messages;\n const responseMessages = [];\n const { approvedToolApprovals, deniedToolApprovals } = collectToolApprovals({ messages: initialMessages });\n const localApprovedToolApprovals = approvedToolApprovals.filter(\n (toolApproval) => !toolApproval.toolCall.providerExecuted\n );\n if (deniedToolApprovals.length > 0 || localApprovedToolApprovals.length > 0) {\n const toolOutputs = await executeTools({\n toolCalls: localApprovedToolApprovals.map(\n (toolApproval) => toolApproval.toolCall\n ),\n tools,\n tracer,\n telemetry,\n messages: initialMessages,\n abortSignal: mergedAbortSignal,\n experimental_context,\n stepNumber: 0,\n model: modelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ]\n });\n const toolContent = [];\n for (const output2 of toolOutputs) {\n const modelOutput = await createToolModelOutput({\n toolCallId: output2.toolCallId,\n input: output2.input,\n tool: tools == null ? void 0 : tools[output2.toolName],\n output: output2.type === \"tool-result\" ? output2.output : output2.error,\n errorMode: output2.type === \"tool-error\" ? \"text\" : \"none\"\n });\n toolContent.push({\n type: \"tool-result\",\n toolCallId: output2.toolCallId,\n toolName: output2.toolName,\n output: modelOutput\n });\n }\n for (const toolApproval of deniedToolApprovals) {\n toolContent.push({\n type: \"tool-result\",\n toolCallId: toolApproval.toolCall.toolCallId,\n toolName: toolApproval.toolCall.toolName,\n output: {\n type: \"execution-denied\",\n reason: toolApproval.approvalResponse.reason,\n // For provider-executed tools, include approvalId so provider can correlate\n ...toolApproval.toolCall.providerExecuted && {\n providerOptions: {\n openai: {\n approvalId: toolApproval.approvalResponse.approvalId\n }\n }\n }\n }\n });\n }\n responseMessages.push({\n role: \"tool\",\n content: toolContent\n });\n }\n const providerExecutedToolApprovals = [\n ...approvedToolApprovals,\n ...deniedToolApprovals\n ].filter((toolApproval) => toolApproval.toolCall.providerExecuted);\n if (providerExecutedToolApprovals.length > 0) {\n responseMessages.push({\n role: \"tool\",\n content: providerExecutedToolApprovals.map(\n (toolApproval) => ({\n type: \"tool-approval-response\",\n approvalId: toolApproval.approvalResponse.approvalId,\n approved: toolApproval.approvalResponse.approved,\n reason: toolApproval.approvalResponse.reason,\n providerExecuted: true\n })\n )\n });\n }\n const callSettings2 = prepareCallSettings(settings);\n let currentModelResponse;\n let clientToolCalls = [];\n let clientToolOutputs = [];\n const steps = [];\n const pendingDeferredToolCalls = /* @__PURE__ */ new Map();\n do {\n const stepTimeoutId = stepTimeoutMs != null ? setTimeout(() => stepAbortController.abort(), stepTimeoutMs) : void 0;\n try {\n const stepInputMessages = [...initialMessages, ...responseMessages];\n const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({\n model,\n steps,\n stepNumber: steps.length,\n messages: stepInputMessages,\n experimental_context\n }));\n const stepModel = resolveLanguageModel(\n (_a21 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _a21 : model\n );\n const stepModelInfo = {\n provider: stepModel.provider,\n modelId: stepModel.modelId\n };\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n system: (_b = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _b : initialPrompt.system,\n messages: (_c = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _c : stepInputMessages\n },\n supportedUrls: await stepModel.supportedUrls,\n download: download2\n });\n experimental_context = (_d = prepareStepResult == null ? void 0 : prepareStepResult.experimental_context) != null ? _d : experimental_context;\n const stepActiveTools = (_e = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _e : activeTools;\n const { toolChoice: stepToolChoice, tools: stepTools } = await prepareToolsAndToolChoice({\n tools,\n toolChoice: (_f = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _f : toolChoice,\n activeTools: stepActiveTools\n });\n const stepMessages = (_g = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _g : stepInputMessages;\n const stepSystem = (_h = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _h : initialPrompt.system;\n const stepProviderOptions = mergeObjects(\n providerOptions,\n prepareStepResult == null ? void 0 : prepareStepResult.providerOptions\n );\n await notify({\n event: {\n stepNumber: steps.length,\n model: stepModelInfo,\n system: stepSystem,\n messages: stepMessages,\n tools,\n toolChoice: stepToolChoice,\n activeTools: stepActiveTools,\n steps: [...steps],\n providerOptions: stepProviderOptions,\n timeout,\n headers,\n stopWhen,\n output,\n abortSignal,\n include,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context\n },\n callbacks: [\n onStepStart,\n globalTelemetry.onStepStart\n ]\n });\n currentModelResponse = await retry(\n () => {\n var _a22;\n return recordSpan({\n name: \"ai.generateText.doGenerate\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateText.doGenerate\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // model:\n \"ai.model.provider\": stepModel.provider,\n \"ai.model.id\": stepModel.modelId,\n // prompt:\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(promptMessages)\n },\n \"ai.prompt.tools\": {\n // convert the language model level tools:\n input: () => stepTools == null ? void 0 : stepTools.map((tool2) => JSON.stringify(tool2))\n },\n \"ai.prompt.toolChoice\": {\n input: () => stepToolChoice != null ? JSON.stringify(stepToolChoice) : void 0\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": stepModel.provider,\n \"gen_ai.request.model\": stepModel.modelId,\n \"gen_ai.request.frequency_penalty\": settings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": settings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": settings.presencePenalty,\n \"gen_ai.request.stop_sequences\": settings.stopSequences,\n \"gen_ai.request.temperature\": (_a22 = settings.temperature) != null ? _a22 : void 0,\n \"gen_ai.request.top_k\": settings.topK,\n \"gen_ai.request.top_p\": settings.topP\n }\n }),\n tracer,\n fn: async (span2) => {\n var _a23, _b2, _c2, _d2, _e2, _f2, _g2, _h2;\n const result = await stepModel.doGenerate({\n ...callSettings2,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: await (output == null ? void 0 : output.responseFormat),\n prompt: promptMessages,\n providerOptions: stepProviderOptions,\n abortSignal: mergedAbortSignal,\n headers: headersWithUserAgent\n });\n const responseData = {\n id: (_b2 = (_a23 = result.response) == null ? void 0 : _a23.id) != null ? _b2 : generateId2(),\n timestamp: (_d2 = (_c2 = result.response) == null ? void 0 : _c2.timestamp) != null ? _d2 : /* @__PURE__ */ new Date(),\n modelId: (_f2 = (_e2 = result.response) == null ? void 0 : _e2.modelId) != null ? _f2 : stepModel.modelId,\n headers: (_g2 = result.response) == null ? void 0 : _g2.headers,\n body: (_h2 = result.response) == null ? void 0 : _h2.body\n };\n const usage = asLanguageModelUsage(result.usage);\n span2.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": result.finishReason.unified,\n \"ai.response.text\": {\n output: () => extractTextContent(result.content)\n },\n \"ai.response.reasoning\": {\n output: () => extractReasoningContent(result.content)\n },\n \"ai.response.toolCalls\": {\n output: () => {\n const toolCalls = asToolCalls(result.content);\n return toolCalls == null ? void 0 : JSON.stringify(toolCalls);\n }\n },\n \"ai.response.id\": responseData.id,\n \"ai.response.model\": responseData.modelId,\n \"ai.response.timestamp\": responseData.timestamp.toISOString(),\n \"ai.response.providerMetadata\": JSON.stringify(\n result.providerMetadata\n ),\n \"ai.usage.inputTokens\": result.usage.inputTokens.total,\n \"ai.usage.inputTokenDetails.noCacheTokens\": result.usage.inputTokens.noCache,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": result.usage.inputTokens.cacheRead,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": result.usage.inputTokens.cacheWrite,\n \"ai.usage.outputTokens\": result.usage.outputTokens.total,\n \"ai.usage.outputTokenDetails.textTokens\": result.usage.outputTokens.text,\n \"ai.usage.outputTokenDetails.reasoningTokens\": result.usage.outputTokens.reasoning,\n \"ai.usage.totalTokens\": usage.totalTokens,\n \"ai.usage.reasoningTokens\": result.usage.outputTokens.reasoning,\n \"ai.usage.cachedInputTokens\": result.usage.inputTokens.cacheRead,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [\n result.finishReason.unified\n ],\n \"gen_ai.response.id\": responseData.id,\n \"gen_ai.response.model\": responseData.modelId,\n \"gen_ai.usage.input_tokens\": result.usage.inputTokens.total,\n \"gen_ai.usage.output_tokens\": result.usage.outputTokens.total\n }\n })\n );\n return { ...result, response: responseData };\n }\n });\n }\n );\n const stepToolCalls = await Promise.all(\n currentModelResponse.content.filter(\n (part) => part.type === \"tool-call\"\n ).map(\n (toolCall) => parseToolCall({\n toolCall,\n tools,\n repairToolCall,\n system,\n messages: stepInputMessages\n })\n )\n );\n const toolApprovalRequests = {};\n for (const toolCall of stepToolCalls) {\n if (toolCall.invalid) {\n continue;\n }\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if (tool2 == null) {\n continue;\n }\n if ((tool2 == null ? void 0 : tool2.onInputAvailable) != null) {\n await tool2.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages: stepInputMessages,\n abortSignal: mergedAbortSignal,\n experimental_context\n });\n }\n if (await isApprovalNeeded({\n tool: tool2,\n toolCall,\n messages: stepInputMessages,\n experimental_context\n })) {\n toolApprovalRequests[toolCall.toolCallId] = {\n type: \"tool-approval-request\",\n approvalId: generateId2(),\n toolCall\n };\n }\n }\n const invalidToolCalls = stepToolCalls.filter(\n (toolCall) => toolCall.invalid && toolCall.dynamic\n );\n clientToolOutputs = [];\n for (const toolCall of invalidToolCalls) {\n clientToolOutputs.push({\n type: \"tool-error\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.getErrorMessage)(toolCall.error),\n dynamic: true\n });\n }\n clientToolCalls = stepToolCalls.filter(\n (toolCall) => !toolCall.providerExecuted\n );\n if (tools != null) {\n clientToolOutputs.push(\n ...await executeTools({\n toolCalls: clientToolCalls.filter(\n (toolCall) => !toolCall.invalid && toolApprovalRequests[toolCall.toolCallId] == null\n ),\n tools,\n tracer,\n telemetry,\n messages: stepInputMessages,\n abortSignal: mergedAbortSignal,\n experimental_context,\n stepNumber: steps.length,\n model: stepModelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ]\n })\n );\n }\n for (const toolCall of stepToolCalls) {\n if (!toolCall.providerExecuted)\n continue;\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if ((tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults) {\n const hasResultInResponse = currentModelResponse.content.some(\n (part) => part.type === \"tool-result\" && part.toolCallId === toolCall.toolCallId\n );\n if (!hasResultInResponse) {\n pendingDeferredToolCalls.set(toolCall.toolCallId, {\n toolName: toolCall.toolName\n });\n }\n }\n }\n for (const part of currentModelResponse.content) {\n if (part.type === \"tool-result\") {\n pendingDeferredToolCalls.delete(part.toolCallId);\n }\n }\n const stepContent = asContent({\n content: currentModelResponse.content,\n toolCalls: stepToolCalls,\n toolOutputs: clientToolOutputs,\n toolApprovalRequests: Object.values(toolApprovalRequests),\n tools\n });\n responseMessages.push(\n ...await toResponseMessages({\n content: stepContent,\n tools\n })\n );\n const stepRequest = ((_i = include == null ? void 0 : include.requestBody) != null ? _i : true) ? (_j = currentModelResponse.request) != null ? _j : {} : { ...currentModelResponse.request, body: void 0 };\n const stepResponse = {\n ...currentModelResponse.response,\n // deep clone msgs to avoid mutating past messages in multi-step:\n messages: structuredClone(responseMessages),\n // Conditionally include response body:\n body: ((_k = include == null ? void 0 : include.responseBody) != null ? _k : true) ? (_l = currentModelResponse.response) == null ? void 0 : _l.body : void 0\n };\n const stepNumber = steps.length;\n const currentStepResult = new DefaultStepResult({\n stepNumber,\n model: stepModelInfo,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context,\n content: stepContent,\n finishReason: currentModelResponse.finishReason.unified,\n rawFinishReason: currentModelResponse.finishReason.raw,\n usage: asLanguageModelUsage(currentModelResponse.usage),\n warnings: currentModelResponse.warnings,\n providerMetadata: currentModelResponse.providerMetadata,\n request: stepRequest,\n response: stepResponse\n });\n logWarnings({\n warnings: (_m = currentModelResponse.warnings) != null ? _m : [],\n provider: stepModelInfo.provider,\n model: stepModelInfo.modelId\n });\n steps.push(currentStepResult);\n await notify({\n event: currentStepResult,\n callbacks: [onStepFinish, globalTelemetry.onStepFinish]\n });\n } finally {\n if (stepTimeoutId != null) {\n clearTimeout(stepTimeoutId);\n }\n }\n } while (\n // Continue if:\n // 1. There are client tool calls that have all been executed, OR\n // 2. There are pending deferred results from provider-executed tools\n (clientToolCalls.length > 0 && clientToolOutputs.length === clientToolCalls.length || pendingDeferredToolCalls.size > 0) && // continue until a stop condition is met:\n !await isStopConditionMet({ stopConditions, steps })\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": currentModelResponse.finishReason.unified,\n \"ai.response.text\": {\n output: () => extractTextContent(currentModelResponse.content)\n },\n \"ai.response.reasoning\": {\n output: () => extractReasoningContent(currentModelResponse.content)\n },\n \"ai.response.toolCalls\": {\n output: () => {\n const toolCalls = asToolCalls(currentModelResponse.content);\n return toolCalls == null ? void 0 : JSON.stringify(toolCalls);\n }\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n currentModelResponse.providerMetadata\n )\n }\n })\n );\n const lastStep = steps[steps.length - 1];\n const totalUsage = steps.reduce(\n (totalUsage2, step) => {\n return addLanguageModelUsage(totalUsage2, step.usage);\n },\n {\n inputTokens: void 0,\n outputTokens: void 0,\n totalTokens: void 0,\n reasoningTokens: void 0,\n cachedInputTokens: void 0\n }\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.usage.inputTokens\": totalUsage.inputTokens,\n \"ai.usage.inputTokenDetails.noCacheTokens\": (_n = totalUsage.inputTokenDetails) == null ? void 0 : _n.noCacheTokens,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": (_o = totalUsage.inputTokenDetails) == null ? void 0 : _o.cacheReadTokens,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": (_p = totalUsage.inputTokenDetails) == null ? void 0 : _p.cacheWriteTokens,\n \"ai.usage.outputTokens\": totalUsage.outputTokens,\n \"ai.usage.outputTokenDetails.textTokens\": (_q = totalUsage.outputTokenDetails) == null ? void 0 : _q.textTokens,\n \"ai.usage.outputTokenDetails.reasoningTokens\": (_r = totalUsage.outputTokenDetails) == null ? void 0 : _r.reasoningTokens,\n \"ai.usage.totalTokens\": totalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": (_s = totalUsage.outputTokenDetails) == null ? void 0 : _s.reasoningTokens,\n \"ai.usage.cachedInputTokens\": (_t = totalUsage.inputTokenDetails) == null ? void 0 : _t.cacheReadTokens\n }\n })\n );\n await notify({\n event: {\n stepNumber: lastStep.stepNumber,\n model: lastStep.model,\n functionId: lastStep.functionId,\n metadata: lastStep.metadata,\n experimental_context: lastStep.experimental_context,\n finishReason: lastStep.finishReason,\n rawFinishReason: lastStep.rawFinishReason,\n usage: lastStep.usage,\n content: lastStep.content,\n text: lastStep.text,\n reasoningText: lastStep.reasoningText,\n reasoning: lastStep.reasoning,\n files: lastStep.files,\n sources: lastStep.sources,\n toolCalls: lastStep.toolCalls,\n staticToolCalls: lastStep.staticToolCalls,\n dynamicToolCalls: lastStep.dynamicToolCalls,\n toolResults: lastStep.toolResults,\n staticToolResults: lastStep.staticToolResults,\n dynamicToolResults: lastStep.dynamicToolResults,\n request: lastStep.request,\n response: lastStep.response,\n warnings: lastStep.warnings,\n providerMetadata: lastStep.providerMetadata,\n steps,\n totalUsage\n },\n callbacks: [\n onFinish,\n globalTelemetry.onFinish\n ]\n });\n let resolvedOutput;\n if (lastStep.finishReason === \"stop\") {\n const outputSpecification = output != null ? output : text();\n resolvedOutput = await outputSpecification.parseCompleteOutput(\n { text: lastStep.text },\n {\n response: lastStep.response,\n usage: lastStep.usage,\n finishReason: lastStep.finishReason\n }\n );\n }\n return new DefaultGenerateTextResult({\n steps,\n totalUsage,\n output: resolvedOutput\n });\n }\n });\n } catch (error) {\n throw wrapGatewayError(error);\n }\n}\nasync function executeTools({\n toolCalls,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish\n}) {\n const toolOutputs = await Promise.all(\n toolCalls.map(\n async (toolCall) => executeToolCall({\n toolCall,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish\n })\n )\n );\n return toolOutputs.filter(\n (output) => output != null\n );\n}\nvar DefaultGenerateTextResult = class {\n constructor(options) {\n this.steps = options.steps;\n this._output = options.output;\n this.totalUsage = options.totalUsage;\n }\n get finalStep() {\n return this.steps[this.steps.length - 1];\n }\n get content() {\n return this.finalStep.content;\n }\n get text() {\n return this.finalStep.text;\n }\n get files() {\n return this.finalStep.files;\n }\n get reasoningText() {\n return this.finalStep.reasoningText;\n }\n get reasoning() {\n return this.finalStep.reasoning;\n }\n get toolCalls() {\n return this.finalStep.toolCalls;\n }\n get staticToolCalls() {\n return this.finalStep.staticToolCalls;\n }\n get dynamicToolCalls() {\n return this.finalStep.dynamicToolCalls;\n }\n get toolResults() {\n return this.finalStep.toolResults;\n }\n get staticToolResults() {\n return this.finalStep.staticToolResults;\n }\n get dynamicToolResults() {\n return this.finalStep.dynamicToolResults;\n }\n get sources() {\n return this.finalStep.sources;\n }\n get finishReason() {\n return this.finalStep.finishReason;\n }\n get rawFinishReason() {\n return this.finalStep.rawFinishReason;\n }\n get warnings() {\n return this.finalStep.warnings;\n }\n get providerMetadata() {\n return this.finalStep.providerMetadata;\n }\n get response() {\n return this.finalStep.response;\n }\n get request() {\n return this.finalStep.request;\n }\n get usage() {\n return this.finalStep.usage;\n }\n get experimental_output() {\n return this.output;\n }\n get output() {\n if (this._output == null) {\n throw new NoOutputGeneratedError();\n }\n return this._output;\n }\n};\nfunction asToolCalls(content) {\n const parts = content.filter(\n (part) => part.type === \"tool-call\"\n );\n if (parts.length === 0) {\n return void 0;\n }\n return parts.map((toolCall) => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input\n }));\n}\nfunction asContent({\n content,\n toolCalls,\n toolOutputs,\n toolApprovalRequests,\n tools\n}) {\n const contentParts = [];\n for (const part of content) {\n switch (part.type) {\n case \"text\":\n case \"reasoning\":\n case \"source\":\n contentParts.push(part);\n break;\n case \"file\": {\n contentParts.push({\n type: \"file\",\n file: new DefaultGeneratedFile(part),\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"tool-call\": {\n contentParts.push(\n toolCalls.find((toolCall) => toolCall.toolCallId === part.toolCallId)\n );\n break;\n }\n case \"tool-result\": {\n const toolCall = toolCalls.find(\n (toolCall2) => toolCall2.toolCallId === part.toolCallId\n );\n if (toolCall == null) {\n const tool2 = tools == null ? void 0 : tools[part.toolName];\n const supportsDeferredResults = (tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults;\n if (!supportsDeferredResults) {\n throw new Error(`Tool call ${part.toolCallId} not found.`);\n }\n if (part.isError) {\n contentParts.push({\n type: \"tool-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: void 0,\n error: part.result,\n providerExecuted: true,\n dynamic: part.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n } else {\n contentParts.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: void 0,\n output: part.result,\n providerExecuted: true,\n dynamic: part.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n if (part.isError) {\n contentParts.push({\n type: \"tool-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: toolCall.input,\n error: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n } else {\n contentParts.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: toolCall.input,\n output: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n case \"tool-approval-request\": {\n const toolCall = toolCalls.find(\n (toolCall2) => toolCall2.toolCallId === part.toolCallId\n );\n if (toolCall == null) {\n throw new ToolCallNotFoundForApprovalError({\n toolCallId: part.toolCallId,\n approvalId: part.approvalId\n });\n }\n contentParts.push({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCall\n });\n break;\n }\n }\n }\n return [...contentParts, ...toolOutputs, ...toolApprovalRequests];\n}\n\n// src/generate-text/stream-text.ts\n\n\n\n// src/util/prepare-headers.ts\nfunction prepareHeaders(headers, defaultHeaders) {\n const responseHeaders = new Headers(headers != null ? headers : {});\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (!responseHeaders.has(key)) {\n responseHeaders.set(key, value);\n }\n }\n return responseHeaders;\n}\n\n// src/text-stream/create-text-stream-response.ts\nfunction createTextStreamResponse({\n status,\n statusText,\n headers,\n textStream\n}) {\n return new Response(textStream.pipeThrough(new TextEncoderStream()), {\n status: status != null ? status : 200,\n statusText,\n headers: prepareHeaders(headers, {\n \"content-type\": \"text/plain; charset=utf-8\"\n })\n });\n}\n\n// src/util/write-to-server-response.ts\nfunction writeToServerResponse({\n response,\n status,\n statusText,\n headers,\n stream\n}) {\n const statusCode = status != null ? status : 200;\n if (statusText !== void 0) {\n response.writeHead(statusCode, statusText, headers);\n } else {\n response.writeHead(statusCode, headers);\n }\n const reader = stream.getReader();\n const read = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n const canContinue = response.write(value);\n if (!canContinue) {\n await new Promise((resolve3) => {\n response.once(\"drain\", resolve3);\n });\n }\n }\n } catch (error) {\n throw error;\n } finally {\n response.end();\n }\n };\n read();\n}\n\n// src/text-stream/pipe-text-stream-to-response.ts\nfunction pipeTextStreamToResponse({\n response,\n status,\n statusText,\n headers,\n textStream\n}) {\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, {\n \"content-type\": \"text/plain; charset=utf-8\"\n }).entries()\n ),\n stream: textStream.pipeThrough(new TextEncoderStream())\n });\n}\n\n// src/ui-message-stream/json-to-sse-transform-stream.ts\nvar JsonToSseTransformStream = class extends TransformStream {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\n\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n }\n });\n }\n};\n\n// src/ui-message-stream/ui-message-stream-headers.ts\nvar UI_MESSAGE_STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-vercel-ai-ui-message-stream\": \"v1\",\n \"x-accel-buffering\": \"no\"\n // disable nginx buffering\n};\n\n// src/ui-message-stream/create-ui-message-stream-response.ts\nfunction createUIMessageStreamResponse({\n status,\n statusText,\n headers,\n stream,\n consumeSseStream\n}) {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 });\n }\n return new Response(sseStream.pipeThrough(new TextEncoderStream()), {\n status,\n statusText,\n headers: prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS)\n });\n}\n\n// src/ui-message-stream/get-response-ui-message-id.ts\nfunction getResponseUIMessageId({\n originalMessages,\n responseMessageId\n}) {\n if (originalMessages == null) {\n return void 0;\n }\n const lastMessage = originalMessages[originalMessages.length - 1];\n return (lastMessage == null ? void 0 : lastMessage.role) === \"assistant\" ? lastMessage.id : typeof responseMessageId === \"function\" ? responseMessageId() : responseMessageId;\n}\n\n// src/ui/process-ui-message-stream.ts\n\n\n// src/ui-message-stream/ui-message-chunks.ts\n\n\nvar uiMessageChunkSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"text-start\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"text-delta\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"text-end\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"error\"),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool-input-start\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolName: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool-input-delta\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n inputTextDelta: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool-input-available\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolName: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool-input-error\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolName: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool-approval-request\"),\n approvalId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool-output-available\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n preliminary: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool-output-error\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"tool-output-denied\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"reasoning-start\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"reasoning-delta\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"reasoning-end\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"source-url\"),\n sourceId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"source-document\"),\n sourceId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"file\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.custom(\n (value) => typeof value === \"string\" && value.startsWith(\"data-\"),\n { message: 'Type must start with \"data-\"' }\n ),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n data: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n transient: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"start-step\")\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"finish-step\")\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"start\"),\n messageId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n messageMetadata: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"finish\"),\n finishReason: zod_v4__WEBPACK_IMPORTED_MODULE_3__[\"enum\"]([\n \"stop\",\n \"length\",\n \"content-filter\",\n \"tool-calls\",\n \"error\",\n \"other\"\n ]).optional(),\n messageMetadata: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"abort\"),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.strictObject({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"message-metadata\"),\n messageMetadata: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown()\n })\n ])\n )\n);\nfunction isDataUIMessageChunk(chunk) {\n return chunk.type.startsWith(\"data-\");\n}\n\n// src/ui/ui-messages.ts\nfunction isDataUIPart(part) {\n return part.type.startsWith(\"data-\");\n}\nfunction isTextUIPart(part) {\n return part.type === \"text\";\n}\nfunction isFileUIPart(part) {\n return part.type === \"file\";\n}\nfunction isReasoningUIPart(part) {\n return part.type === \"reasoning\";\n}\nfunction isStaticToolUIPart(part) {\n return part.type.startsWith(\"tool-\");\n}\nfunction isDynamicToolUIPart(part) {\n return part.type === \"dynamic-tool\";\n}\nfunction isToolUIPart(part) {\n return isStaticToolUIPart(part) || isDynamicToolUIPart(part);\n}\nvar isToolOrDynamicToolUIPart = isToolUIPart;\nfunction getStaticToolName(part) {\n return part.type.split(\"-\").slice(1).join(\"-\");\n}\nfunction getToolName(part) {\n return isDynamicToolUIPart(part) ? part.toolName : getStaticToolName(part);\n}\nvar getToolOrDynamicToolName = getToolName;\n\n// src/ui/process-ui-message-stream.ts\nfunction createStreamingUIMessageState({\n lastMessage,\n messageId\n}) {\n return {\n message: (lastMessage == null ? void 0 : lastMessage.role) === \"assistant\" ? lastMessage : {\n id: messageId,\n metadata: void 0,\n role: \"assistant\",\n parts: []\n },\n activeTextParts: {},\n activeReasoningParts: {},\n partialToolCalls: {}\n };\n}\nfunction processUIMessageStream({\n stream,\n messageMetadataSchema,\n dataPartSchemas,\n runUpdateMessageJob,\n onError,\n onToolCall,\n onData\n}) {\n return stream.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n await runUpdateMessageJob(async ({ state, write }) => {\n var _a21, _b, _c, _d;\n function getToolInvocation(toolCallId) {\n const toolInvocations = state.message.parts.filter(isToolUIPart);\n const toolInvocation = toolInvocations.find(\n (invocation) => invocation.toolCallId === toolCallId\n );\n if (toolInvocation == null) {\n throw new UIMessageStreamError({\n chunkType: \"tool-invocation\",\n chunkId: toolCallId,\n message: `No tool invocation found for tool call ID \"${toolCallId}\".`\n });\n }\n return toolInvocation;\n }\n function updateToolPart(options) {\n var _a22;\n const part = state.message.parts.find(\n (part2) => isStaticToolUIPart(part2) && part2.toolCallId === options.toolCallId\n );\n const anyOptions = options;\n const anyPart = part;\n if (part != null) {\n part.state = options.state;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = anyOptions.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n if (options.title !== void 0) {\n anyPart.title = options.title;\n }\n anyPart.providerExecuted = (_a22 = anyOptions.providerExecuted) != null ? _a22 : part.providerExecuted;\n const providerMetadata = anyOptions.providerMetadata;\n if (providerMetadata != null) {\n if (options.state === \"output-available\" || options.state === \"output-error\") {\n const resultPart = part;\n resultPart.resultProviderMetadata = providerMetadata;\n } else {\n part.callProviderMetadata = providerMetadata;\n }\n }\n } else {\n state.message.parts.push({\n type: `tool-${options.toolName}`,\n toolCallId: options.toolCallId,\n state: options.state,\n title: options.title,\n input: anyOptions.input,\n output: anyOptions.output,\n rawInput: anyOptions.rawInput,\n errorText: anyOptions.errorText,\n providerExecuted: anyOptions.providerExecuted,\n preliminary: anyOptions.preliminary,\n ...anyOptions.providerMetadata != null && (options.state === \"output-available\" || options.state === \"output-error\") ? { resultProviderMetadata: anyOptions.providerMetadata } : {},\n ...anyOptions.providerMetadata != null && !(options.state === \"output-available\" || options.state === \"output-error\") ? { callProviderMetadata: anyOptions.providerMetadata } : {}\n });\n }\n }\n function updateDynamicToolPart(options) {\n var _a22, _b2;\n const part = state.message.parts.find(\n (part2) => part2.type === \"dynamic-tool\" && part2.toolCallId === options.toolCallId\n );\n const anyOptions = options;\n const anyPart = part;\n if (part != null) {\n part.state = options.state;\n anyPart.toolName = options.toolName;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = (_a22 = anyOptions.rawInput) != null ? _a22 : anyPart.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n if (options.title !== void 0) {\n anyPart.title = options.title;\n }\n anyPart.providerExecuted = (_b2 = anyOptions.providerExecuted) != null ? _b2 : part.providerExecuted;\n const providerMetadata = anyOptions.providerMetadata;\n if (providerMetadata != null) {\n if (options.state === \"output-available\" || options.state === \"output-error\") {\n const resultPart = part;\n resultPart.resultProviderMetadata = providerMetadata;\n } else {\n part.callProviderMetadata = providerMetadata;\n }\n }\n } else {\n state.message.parts.push({\n type: \"dynamic-tool\",\n toolName: options.toolName,\n toolCallId: options.toolCallId,\n state: options.state,\n input: anyOptions.input,\n output: anyOptions.output,\n errorText: anyOptions.errorText,\n preliminary: anyOptions.preliminary,\n providerExecuted: anyOptions.providerExecuted,\n title: options.title,\n ...anyOptions.providerMetadata != null && (options.state === \"output-available\" || options.state === \"output-error\") ? { resultProviderMetadata: anyOptions.providerMetadata } : {},\n ...anyOptions.providerMetadata != null && !(options.state === \"output-available\" || options.state === \"output-error\") ? { callProviderMetadata: anyOptions.providerMetadata } : {}\n });\n }\n }\n async function updateMessageMetadata(metadata) {\n if (metadata != null) {\n const mergedMetadata = state.message.metadata != null ? mergeObjects(state.message.metadata, metadata) : metadata;\n if (messageMetadataSchema != null) {\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.validateTypes)({\n value: mergedMetadata,\n schema: messageMetadataSchema,\n context: {\n field: \"message.metadata\",\n entityId: state.message.id\n }\n });\n }\n state.message.metadata = mergedMetadata;\n }\n }\n switch (chunk.type) {\n case \"text-start\": {\n const textPart = {\n type: \"text\",\n text: \"\",\n providerMetadata: chunk.providerMetadata,\n state: \"streaming\"\n };\n state.activeTextParts[chunk.id] = textPart;\n state.message.parts.push(textPart);\n write();\n break;\n }\n case \"text-delta\": {\n const textPart = state.activeTextParts[chunk.id];\n if (textPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"text-delta\",\n chunkId: chunk.id,\n message: `Received text-delta for missing text part with ID \"${chunk.id}\". Ensure a \"text-start\" chunk is sent before any \"text-delta\" chunks.`\n });\n }\n textPart.text += chunk.delta;\n textPart.providerMetadata = (_a21 = chunk.providerMetadata) != null ? _a21 : textPart.providerMetadata;\n write();\n break;\n }\n case \"text-end\": {\n const textPart = state.activeTextParts[chunk.id];\n if (textPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"text-end\",\n chunkId: chunk.id,\n message: `Received text-end for missing text part with ID \"${chunk.id}\". Ensure a \"text-start\" chunk is sent before any \"text-end\" chunks.`\n });\n }\n textPart.state = \"done\";\n textPart.providerMetadata = (_b = chunk.providerMetadata) != null ? _b : textPart.providerMetadata;\n delete state.activeTextParts[chunk.id];\n write();\n break;\n }\n case \"reasoning-start\": {\n const reasoningPart = {\n type: \"reasoning\",\n text: \"\",\n providerMetadata: chunk.providerMetadata,\n state: \"streaming\"\n };\n state.activeReasoningParts[chunk.id] = reasoningPart;\n state.message.parts.push(reasoningPart);\n write();\n break;\n }\n case \"reasoning-delta\": {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n if (reasoningPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"reasoning-delta\",\n chunkId: chunk.id,\n message: `Received reasoning-delta for missing reasoning part with ID \"${chunk.id}\". Ensure a \"reasoning-start\" chunk is sent before any \"reasoning-delta\" chunks.`\n });\n }\n reasoningPart.text += chunk.delta;\n reasoningPart.providerMetadata = (_c = chunk.providerMetadata) != null ? _c : reasoningPart.providerMetadata;\n write();\n break;\n }\n case \"reasoning-end\": {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n if (reasoningPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"reasoning-end\",\n chunkId: chunk.id,\n message: `Received reasoning-end for missing reasoning part with ID \"${chunk.id}\". Ensure a \"reasoning-start\" chunk is sent before any \"reasoning-end\" chunks.`\n });\n }\n reasoningPart.providerMetadata = (_d = chunk.providerMetadata) != null ? _d : reasoningPart.providerMetadata;\n reasoningPart.state = \"done\";\n delete state.activeReasoningParts[chunk.id];\n write();\n break;\n }\n case \"file\": {\n state.message.parts.push({\n type: \"file\",\n mediaType: chunk.mediaType,\n url: chunk.url,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n write();\n break;\n }\n case \"source-url\": {\n state.message.parts.push({\n type: \"source-url\",\n sourceId: chunk.sourceId,\n url: chunk.url,\n title: chunk.title,\n providerMetadata: chunk.providerMetadata\n });\n write();\n break;\n }\n case \"source-document\": {\n state.message.parts.push({\n type: \"source-document\",\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n filename: chunk.filename,\n providerMetadata: chunk.providerMetadata\n });\n write();\n break;\n }\n case \"tool-input-start\": {\n const toolInvocations = state.message.parts.filter(isStaticToolUIPart);\n state.partialToolCalls[chunk.toolCallId] = {\n text: \"\",\n toolName: chunk.toolName,\n index: toolInvocations.length,\n dynamic: chunk.dynamic,\n title: chunk.title\n };\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-streaming\",\n input: void 0,\n providerExecuted: chunk.providerExecuted,\n title: chunk.title,\n providerMetadata: chunk.providerMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-streaming\",\n input: void 0,\n providerExecuted: chunk.providerExecuted,\n title: chunk.title,\n providerMetadata: chunk.providerMetadata\n });\n }\n write();\n break;\n }\n case \"tool-input-delta\": {\n const partialToolCall = state.partialToolCalls[chunk.toolCallId];\n if (partialToolCall == null) {\n throw new UIMessageStreamError({\n chunkType: \"tool-input-delta\",\n chunkId: chunk.toolCallId,\n message: `Received tool-input-delta for missing tool call with ID \"${chunk.toolCallId}\". Ensure a \"tool-input-start\" chunk is sent before any \"tool-input-delta\" chunks.`\n });\n }\n partialToolCall.text += chunk.inputTextDelta;\n const { value: partialArgs } = await parsePartialJson(\n partialToolCall.text\n );\n if (partialToolCall.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: \"input-streaming\",\n input: partialArgs,\n title: partialToolCall.title\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: \"input-streaming\",\n input: partialArgs,\n title: partialToolCall.title\n });\n }\n write();\n break;\n }\n case \"tool-input-available\": {\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-available\",\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: chunk.title\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-available\",\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: chunk.title\n });\n }\n write();\n if (onToolCall && !chunk.providerExecuted) {\n await onToolCall({\n toolCall: chunk\n });\n }\n break;\n }\n case \"tool-input-error\": {\n const existingPart = state.message.parts.filter(isToolUIPart).find((p) => p.toolCallId === chunk.toolCallId);\n const isDynamic = existingPart != null ? existingPart.type === \"dynamic-tool\" : !!chunk.dynamic;\n if (isDynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"output-error\",\n input: chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"output-error\",\n input: void 0,\n rawInput: chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata\n });\n }\n write();\n break;\n }\n case \"tool-approval-request\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n toolInvocation.state = \"approval-requested\";\n toolInvocation.approval = { id: chunk.approvalId };\n write();\n break;\n }\n case \"tool-output-denied\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n toolInvocation.state = \"output-denied\";\n write();\n break;\n }\n case \"tool-output-available\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n if (toolInvocation.type === \"dynamic-tool\") {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: \"output-available\",\n input: toolInvocation.input,\n output: chunk.output,\n preliminary: chunk.preliminary,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getStaticToolName(toolInvocation),\n state: \"output-available\",\n input: toolInvocation.input,\n output: chunk.output,\n providerExecuted: chunk.providerExecuted,\n preliminary: chunk.preliminary,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title\n });\n }\n write();\n break;\n }\n case \"tool-output-error\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n if (toolInvocation.type === \"dynamic-tool\") {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: \"output-error\",\n input: toolInvocation.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getStaticToolName(toolInvocation),\n state: \"output-error\",\n input: toolInvocation.input,\n rawInput: toolInvocation.rawInput,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title\n });\n }\n write();\n break;\n }\n case \"start-step\": {\n state.message.parts.push({ type: \"step-start\" });\n break;\n }\n case \"finish-step\": {\n state.activeTextParts = {};\n state.activeReasoningParts = {};\n break;\n }\n case \"start\": {\n if (chunk.messageId != null) {\n state.message.id = chunk.messageId;\n }\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageId != null || chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"finish\": {\n if (chunk.finishReason != null) {\n state.finishReason = chunk.finishReason;\n }\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"message-metadata\": {\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"error\": {\n onError == null ? void 0 : onError(new Error(chunk.errorText));\n break;\n }\n default: {\n if (isDataUIMessageChunk(chunk)) {\n if ((dataPartSchemas == null ? void 0 : dataPartSchemas[chunk.type]) != null) {\n const partIdx = state.message.parts.findIndex(\n (p) => \"id\" in p && \"data\" in p && p.id === chunk.id && p.type === chunk.type\n );\n const actualPartIdx = partIdx >= 0 ? partIdx : state.message.parts.length;\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.validateTypes)({\n value: chunk.data,\n schema: dataPartSchemas[chunk.type],\n context: {\n field: `message.parts[${actualPartIdx}].data`,\n entityName: chunk.type,\n entityId: chunk.id\n }\n });\n }\n const dataChunk = chunk;\n if (dataChunk.transient) {\n onData == null ? void 0 : onData(dataChunk);\n break;\n }\n const existingUIPart = dataChunk.id != null ? state.message.parts.find(\n (chunkArg) => dataChunk.type === chunkArg.type && dataChunk.id === chunkArg.id\n ) : void 0;\n if (existingUIPart != null) {\n existingUIPart.data = dataChunk.data;\n } else {\n state.message.parts.push(dataChunk);\n }\n onData == null ? void 0 : onData(dataChunk);\n write();\n }\n }\n }\n controller.enqueue(chunk);\n });\n }\n })\n );\n}\n\n// src/ui-message-stream/handle-ui-message-stream-finish.ts\nfunction handleUIMessageStreamFinish({\n messageId,\n originalMessages = [],\n onStepFinish,\n onFinish,\n onError,\n stream\n}) {\n let lastMessage = originalMessages == null ? void 0 : originalMessages[originalMessages.length - 1];\n if ((lastMessage == null ? void 0 : lastMessage.role) !== \"assistant\") {\n lastMessage = void 0;\n } else {\n messageId = lastMessage.id;\n }\n let isAborted = false;\n const idInjectedStream = stream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n if (chunk.type === \"start\") {\n const startChunk = chunk;\n if (startChunk.messageId == null && messageId != null) {\n startChunk.messageId = messageId;\n }\n }\n if (chunk.type === \"abort\") {\n isAborted = true;\n }\n controller.enqueue(chunk);\n }\n })\n );\n if (onFinish == null && onStepFinish == null) {\n return idInjectedStream;\n }\n const state = createStreamingUIMessageState({\n lastMessage: lastMessage ? structuredClone(lastMessage) : void 0,\n messageId: messageId != null ? messageId : \"\"\n // will be overridden by the stream\n });\n const runUpdateMessageJob = async (job) => {\n await job({ state, write: () => {\n } });\n };\n let finishCalled = false;\n const callOnFinish = async () => {\n if (finishCalled || !onFinish) {\n return;\n }\n finishCalled = true;\n const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);\n await onFinish({\n isAborted,\n isContinuation,\n responseMessage: state.message,\n messages: [\n ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,\n state.message\n ],\n finishReason: state.finishReason\n });\n };\n const callOnStepFinish = async () => {\n if (!onStepFinish) {\n return;\n }\n const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);\n try {\n await onStepFinish({\n isContinuation,\n responseMessage: structuredClone(state.message),\n messages: [\n ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,\n structuredClone(state.message)\n ]\n });\n } catch (error) {\n onError(error);\n }\n };\n return processUIMessageStream({\n stream: idInjectedStream,\n runUpdateMessageJob,\n onError\n }).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n if (chunk.type === \"finish-step\") {\n await callOnStepFinish();\n }\n controller.enqueue(chunk);\n },\n // @ts-expect-error cancel is still new and missing from types https://developer.mozilla.org/en-US/docs/Web/API/TransformStream#browser_compatibility\n async cancel() {\n await callOnFinish();\n },\n async flush() {\n await callOnFinish();\n }\n })\n );\n}\n\n// src/ui-message-stream/pipe-ui-message-stream-to-response.ts\nfunction pipeUIMessageStreamToResponse({\n response,\n status,\n statusText,\n headers,\n stream,\n consumeSseStream\n}) {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 });\n }\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS).entries()\n ),\n stream: sseStream.pipeThrough(new TextEncoderStream())\n });\n}\n\n// src/util/async-iterable-stream.ts\nfunction createAsyncIterableStream(source) {\n const stream = source.pipeThrough(new TransformStream());\n stream[Symbol.asyncIterator] = function() {\n const reader = this.getReader();\n let finished = false;\n async function cleanup(cancelStream) {\n var _a21;\n if (finished)\n return;\n finished = true;\n try {\n if (cancelStream) {\n await ((_a21 = reader.cancel) == null ? void 0 : _a21.call(reader));\n }\n } finally {\n try {\n reader.releaseLock();\n } catch (e) {\n }\n }\n }\n return {\n /**\n * Reads the next chunk from the stream.\n * @returns A promise resolving to the next IteratorResult.\n */\n async next() {\n if (finished) {\n return { done: true, value: void 0 };\n }\n const { done, value } = await reader.read();\n if (done) {\n await cleanup(true);\n return { done: true, value: void 0 };\n }\n return { done: false, value };\n },\n /**\n * May be called on early exit (e.g., break from for-await) or after completion.\n * Ensures the stream is cancelled and resources are released.\n * @returns A promise resolving to a completed IteratorResult.\n */\n async return() {\n await cleanup(true);\n return { done: true, value: void 0 };\n },\n /**\n * Called on early exit with error.\n * Ensures the stream is cancelled and resources are released, then rethrows the error.\n * @param err The error to throw.\n * @returns A promise that rejects with the provided error.\n */\n async throw(err) {\n await cleanup(true);\n throw err;\n }\n };\n };\n return stream;\n}\n\n// src/util/consume-stream.ts\nasync function consumeStream({\n stream,\n onError\n}) {\n const reader = stream.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done)\n break;\n }\n } catch (error) {\n onError == null ? void 0 : onError(error);\n } finally {\n reader.releaseLock();\n }\n}\n\n// src/util/create-resolvable-promise.ts\nfunction createResolvablePromise() {\n let resolve3;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve3 = res;\n reject = rej;\n });\n return {\n promise,\n resolve: resolve3,\n reject\n };\n}\n\n// src/util/create-stitchable-stream.ts\nfunction createStitchableStream() {\n let innerStreamReaders = [];\n let controller = null;\n let isClosed = false;\n let waitForNewStream = createResolvablePromise();\n const terminate = () => {\n isClosed = true;\n waitForNewStream.resolve();\n innerStreamReaders.forEach((reader) => reader.cancel());\n innerStreamReaders = [];\n controller == null ? void 0 : controller.close();\n };\n const processPull = async () => {\n if (isClosed && innerStreamReaders.length === 0) {\n controller == null ? void 0 : controller.close();\n return;\n }\n if (innerStreamReaders.length === 0) {\n waitForNewStream = createResolvablePromise();\n await waitForNewStream.promise;\n return processPull();\n }\n try {\n const { value, done } = await innerStreamReaders[0].read();\n if (done) {\n innerStreamReaders.shift();\n if (innerStreamReaders.length === 0 && isClosed) {\n controller == null ? void 0 : controller.close();\n } else {\n await processPull();\n }\n } else {\n controller == null ? void 0 : controller.enqueue(value);\n }\n } catch (error) {\n controller == null ? void 0 : controller.error(error);\n innerStreamReaders.shift();\n terminate();\n }\n };\n return {\n stream: new ReadableStream({\n start(controllerParam) {\n controller = controllerParam;\n },\n pull: processPull,\n async cancel() {\n for (const reader of innerStreamReaders) {\n await reader.cancel();\n }\n innerStreamReaders = [];\n isClosed = true;\n }\n }),\n addStream: (innerStream) => {\n if (isClosed) {\n throw new Error(\"Cannot add inner stream: outer stream is closed\");\n }\n innerStreamReaders.push(innerStream.getReader());\n waitForNewStream.resolve();\n },\n /**\n * Gracefully close the outer stream. This will let the inner streams\n * finish processing and then close the outer stream.\n */\n close: () => {\n isClosed = true;\n waitForNewStream.resolve();\n if (innerStreamReaders.length === 0) {\n controller == null ? void 0 : controller.close();\n }\n },\n /**\n * Immediately close the outer stream. This will cancel all inner streams\n * and close the outer stream.\n */\n terminate\n };\n}\n\n// src/generate-text/run-tools-transformation.ts\n\nfunction runToolsTransformation({\n tools,\n generatorStream,\n tracer,\n telemetry,\n system,\n messages,\n abortSignal,\n repairToolCall,\n experimental_context,\n generateId: generateId2,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish\n}) {\n let toolResultsStreamController = null;\n const toolResultsStream = new ReadableStream({\n start(controller) {\n toolResultsStreamController = controller;\n }\n });\n const outstandingToolResults = /* @__PURE__ */ new Set();\n const toolInputs = /* @__PURE__ */ new Map();\n const toolCallsByToolCallId = /* @__PURE__ */ new Map();\n let canClose = false;\n let finishChunk = void 0;\n function attemptClose() {\n if (canClose && outstandingToolResults.size === 0) {\n if (finishChunk != null) {\n toolResultsStreamController.enqueue(finishChunk);\n }\n toolResultsStreamController.close();\n }\n }\n const forwardStream = new TransformStream({\n async transform(chunk, controller) {\n const chunkType = chunk.type;\n switch (chunkType) {\n case \"stream-start\":\n case \"text-start\":\n case \"text-delta\":\n case \"text-end\":\n case \"reasoning-start\":\n case \"reasoning-delta\":\n case \"reasoning-end\":\n case \"tool-input-start\":\n case \"tool-input-delta\":\n case \"tool-input-end\":\n case \"source\":\n case \"response-metadata\":\n case \"error\":\n case \"raw\": {\n controller.enqueue(chunk);\n break;\n }\n case \"file\": {\n controller.enqueue({\n type: \"file\",\n file: new DefaultGeneratedFileWithType({\n data: chunk.data,\n mediaType: chunk.mediaType\n }),\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n break;\n }\n case \"finish\": {\n finishChunk = {\n type: \"finish\",\n finishReason: chunk.finishReason.unified,\n rawFinishReason: chunk.finishReason.raw,\n usage: asLanguageModelUsage(chunk.usage),\n providerMetadata: chunk.providerMetadata\n };\n break;\n }\n case \"tool-approval-request\": {\n const toolCall = toolCallsByToolCallId.get(chunk.toolCallId);\n if (toolCall == null) {\n toolResultsStreamController.enqueue({\n type: \"error\",\n error: new ToolCallNotFoundForApprovalError({\n toolCallId: chunk.toolCallId,\n approvalId: chunk.approvalId\n })\n });\n break;\n }\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId: chunk.approvalId,\n toolCall\n });\n break;\n }\n case \"tool-call\": {\n try {\n const toolCall = await parseToolCall({\n toolCall: chunk,\n tools,\n repairToolCall,\n system,\n messages\n });\n toolCallsByToolCallId.set(toolCall.toolCallId, toolCall);\n controller.enqueue(toolCall);\n if (toolCall.invalid) {\n toolResultsStreamController.enqueue({\n type: \"tool-error\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.getErrorMessage)(toolCall.error),\n dynamic: true,\n title: toolCall.title\n });\n break;\n }\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if (tool2 == null) {\n break;\n }\n if (tool2.onInputAvailable != null) {\n await tool2.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages,\n abortSignal,\n experimental_context\n });\n }\n if (await isApprovalNeeded({\n tool: tool2,\n toolCall,\n messages,\n experimental_context\n })) {\n toolResultsStreamController.enqueue({\n type: \"tool-approval-request\",\n approvalId: generateId2(),\n toolCall\n });\n break;\n }\n toolInputs.set(toolCall.toolCallId, toolCall.input);\n if (tool2.execute != null && toolCall.providerExecuted !== true) {\n const toolExecutionId = generateId2();\n outstandingToolResults.add(toolExecutionId);\n executeToolCall({\n toolCall,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish,\n onPreliminaryToolResult: (result) => {\n toolResultsStreamController.enqueue(result);\n }\n }).then((result) => {\n toolResultsStreamController.enqueue(result);\n }).catch((error) => {\n toolResultsStreamController.enqueue({\n type: \"error\",\n error\n });\n }).finally(() => {\n outstandingToolResults.delete(toolExecutionId);\n attemptClose();\n });\n }\n } catch (error) {\n toolResultsStreamController.enqueue({ type: \"error\", error });\n }\n break;\n }\n case \"tool-result\": {\n const toolName = chunk.toolName;\n if (chunk.isError) {\n toolResultsStreamController.enqueue({\n type: \"tool-error\",\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolInputs.get(chunk.toolCallId),\n providerExecuted: true,\n error: chunk.result,\n dynamic: chunk.dynamic,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n } else {\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolInputs.get(chunk.toolCallId),\n output: chunk.result,\n providerExecuted: true,\n dynamic: chunk.dynamic,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n }\n break;\n }\n default: {\n const _exhaustiveCheck = chunkType;\n throw new Error(`Unhandled chunk type: ${_exhaustiveCheck}`);\n }\n }\n },\n flush() {\n canClose = true;\n attemptClose();\n }\n });\n return new ReadableStream({\n async start(controller) {\n return Promise.all([\n generatorStream.pipeThrough(forwardStream).pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n close() {\n }\n })\n ),\n toolResultsStream.pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n close() {\n controller.close();\n }\n })\n )\n ]);\n }\n });\n}\n\n// src/generate-text/stream-text.ts\nvar originalGenerateId2 = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.createIdGenerator)({\n prefix: \"aitxt\",\n size: 24\n});\nfunction streamText({\n model,\n tools,\n toolChoice,\n system,\n prompt,\n messages,\n maxRetries,\n abortSignal,\n timeout,\n headers,\n stopWhen = stepCountIs(1),\n experimental_output,\n output = experimental_output,\n experimental_telemetry: telemetry,\n prepareStep,\n providerOptions,\n experimental_activeTools,\n activeTools = experimental_activeTools,\n experimental_repairToolCall: repairToolCall,\n experimental_transform: transform,\n experimental_download: download2,\n includeRawChunks = false,\n onChunk,\n onError = ({ error }) => {\n console.error(error);\n },\n onFinish,\n onAbort,\n onStepFinish,\n experimental_onStart: onStart,\n experimental_onStepStart: onStepStart,\n experimental_onToolCallStart: onToolCallStart,\n experimental_onToolCallFinish: onToolCallFinish,\n experimental_context,\n experimental_include: include,\n _internal: { now: now2 = now, generateId: generateId2 = originalGenerateId2 } = {},\n ...settings\n}) {\n const totalTimeoutMs = getTotalTimeoutMs(timeout);\n const stepTimeoutMs = getStepTimeoutMs(timeout);\n const chunkTimeoutMs = getChunkTimeoutMs(timeout);\n const stepAbortController = stepTimeoutMs != null ? new AbortController() : void 0;\n const chunkAbortController = chunkTimeoutMs != null ? new AbortController() : void 0;\n return new DefaultStreamTextResult({\n model: resolveLanguageModel(model),\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal: mergeAbortSignals(\n abortSignal,\n totalTimeoutMs != null ? AbortSignal.timeout(totalTimeoutMs) : void 0,\n stepAbortController == null ? void 0 : stepAbortController.signal,\n chunkAbortController == null ? void 0 : chunkAbortController.signal\n ),\n stepTimeoutMs,\n stepAbortController,\n chunkTimeoutMs,\n chunkAbortController,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n transforms: asArray(transform),\n activeTools,\n repairToolCall,\n stopConditions: asArray(stopWhen),\n output,\n providerOptions,\n prepareStep,\n includeRawChunks,\n timeout,\n stopWhen,\n originalAbortSignal: abortSignal,\n onChunk,\n onError,\n onFinish,\n onAbort,\n onStepFinish,\n onStart,\n onStepStart,\n onToolCallStart,\n onToolCallFinish,\n now: now2,\n generateId: generateId2,\n experimental_context,\n download: download2,\n include\n });\n}\nfunction createOutputTransformStream(output) {\n let firstTextChunkId = void 0;\n let text2 = \"\";\n let textChunk = \"\";\n let textProviderMetadata = void 0;\n let lastPublishedJson = \"\";\n function publishTextChunk({\n controller,\n partialOutput = void 0\n }) {\n controller.enqueue({\n part: {\n type: \"text-delta\",\n id: firstTextChunkId,\n text: textChunk,\n providerMetadata: textProviderMetadata\n },\n partialOutput\n });\n textChunk = \"\";\n }\n return new TransformStream({\n async transform(chunk, controller) {\n var _a21;\n if (chunk.type === \"finish-step\" && textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n if (chunk.type !== \"text-delta\" && chunk.type !== \"text-start\" && chunk.type !== \"text-end\") {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (firstTextChunkId == null) {\n firstTextChunkId = chunk.id;\n } else if (chunk.id !== firstTextChunkId) {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (chunk.type === \"text-start\") {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (chunk.type === \"text-end\") {\n if (textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n text2 += chunk.text;\n textChunk += chunk.text;\n textProviderMetadata = (_a21 = chunk.providerMetadata) != null ? _a21 : textProviderMetadata;\n const result = await output.parsePartialOutput({ text: text2 });\n if (result !== void 0) {\n const currentJson = JSON.stringify(result.partial);\n if (currentJson !== lastPublishedJson) {\n publishTextChunk({ controller, partialOutput: result.partial });\n lastPublishedJson = currentJson;\n }\n }\n }\n });\n}\nvar DefaultStreamTextResult = class {\n constructor({\n model,\n telemetry,\n headers,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n stepTimeoutMs,\n stepAbortController,\n chunkTimeoutMs,\n chunkAbortController,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n transforms,\n activeTools,\n repairToolCall,\n stopConditions,\n output,\n providerOptions,\n prepareStep,\n includeRawChunks,\n now: now2,\n generateId: generateId2,\n timeout,\n stopWhen,\n originalAbortSignal,\n onChunk,\n onError,\n onFinish,\n onAbort,\n onStepFinish,\n onStart,\n onStepStart,\n onToolCallStart,\n onToolCallFinish,\n experimental_context,\n download: download2,\n include\n }) {\n this._totalUsage = new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DelayedPromise();\n this._finishReason = new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DelayedPromise();\n this._rawFinishReason = new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DelayedPromise();\n this._steps = new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DelayedPromise();\n this.outputSpecification = output;\n this.includeRawChunks = includeRawChunks;\n this.tools = tools;\n const createGlobalTelemetry = getGlobalTelemetryIntegration();\n const globalTelemetry = createGlobalTelemetry(telemetry == null ? void 0 : telemetry.integrations);\n let stepFinish;\n let recordedContent = [];\n const recordedResponseMessages = [];\n let recordedFinishReason = void 0;\n let recordedRawFinishReason = void 0;\n let recordedTotalUsage = void 0;\n let recordedRequest = {};\n let recordedWarnings = [];\n const recordedSteps = [];\n const pendingDeferredToolCalls = /* @__PURE__ */ new Map();\n let rootSpan;\n let activeTextContent = {};\n let activeReasoningContent = {};\n const eventProcessor = new TransformStream({\n async transform(chunk, controller) {\n var _a21, _b, _c, _d;\n controller.enqueue(chunk);\n const { part } = chunk;\n if (part.type === \"text-delta\" || part.type === \"reasoning-delta\" || part.type === \"source\" || part.type === \"tool-call\" || part.type === \"tool-result\" || part.type === \"tool-input-start\" || part.type === \"tool-input-delta\" || part.type === \"raw\") {\n await (onChunk == null ? void 0 : onChunk({ chunk: part }));\n }\n if (part.type === \"error\") {\n await onError({ error: wrapGatewayError(part.error) });\n }\n if (part.type === \"text-start\") {\n activeTextContent[part.id] = {\n type: \"text\",\n text: \"\",\n providerMetadata: part.providerMetadata\n };\n recordedContent.push(activeTextContent[part.id]);\n }\n if (part.type === \"text-delta\") {\n const activeText = activeTextContent[part.id];\n if (activeText == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `text part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeText.text += part.text;\n activeText.providerMetadata = (_a21 = part.providerMetadata) != null ? _a21 : activeText.providerMetadata;\n }\n if (part.type === \"text-end\") {\n const activeText = activeTextContent[part.id];\n if (activeText == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `text part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeText.providerMetadata = (_b = part.providerMetadata) != null ? _b : activeText.providerMetadata;\n delete activeTextContent[part.id];\n }\n if (part.type === \"reasoning-start\") {\n activeReasoningContent[part.id] = {\n type: \"reasoning\",\n text: \"\",\n providerMetadata: part.providerMetadata\n };\n recordedContent.push(activeReasoningContent[part.id]);\n }\n if (part.type === \"reasoning-delta\") {\n const activeReasoning = activeReasoningContent[part.id];\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `reasoning part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeReasoning.text += part.text;\n activeReasoning.providerMetadata = (_c = part.providerMetadata) != null ? _c : activeReasoning.providerMetadata;\n }\n if (part.type === \"reasoning-end\") {\n const activeReasoning = activeReasoningContent[part.id];\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `reasoning part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeReasoning.providerMetadata = (_d = part.providerMetadata) != null ? _d : activeReasoning.providerMetadata;\n delete activeReasoningContent[part.id];\n }\n if (part.type === \"file\") {\n recordedContent.push({\n type: \"file\",\n file: part.file,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n if (part.type === \"source\") {\n recordedContent.push(part);\n }\n if (part.type === \"tool-call\") {\n recordedContent.push(part);\n }\n if (part.type === \"tool-result\" && !part.preliminary) {\n recordedContent.push(part);\n }\n if (part.type === \"tool-approval-request\") {\n recordedContent.push(part);\n }\n if (part.type === \"tool-error\") {\n recordedContent.push(part);\n }\n if (part.type === \"start-step\") {\n recordedContent = [];\n activeReasoningContent = {};\n activeTextContent = {};\n recordedRequest = part.request;\n recordedWarnings = part.warnings;\n }\n if (part.type === \"finish-step\") {\n const stepMessages = await toResponseMessages({\n content: recordedContent,\n tools\n });\n const currentStepResult = new DefaultStepResult({\n stepNumber: recordedSteps.length,\n model: modelInfo,\n ...callbackTelemetryProps,\n experimental_context,\n content: recordedContent,\n finishReason: part.finishReason,\n rawFinishReason: part.rawFinishReason,\n usage: part.usage,\n warnings: recordedWarnings,\n request: recordedRequest,\n response: {\n ...part.response,\n messages: [...recordedResponseMessages, ...stepMessages]\n },\n providerMetadata: part.providerMetadata\n });\n await notify({\n event: currentStepResult,\n callbacks: [onStepFinish, globalTelemetry.onStepFinish]\n });\n logWarnings({\n warnings: recordedWarnings,\n provider: modelInfo.provider,\n model: modelInfo.modelId\n });\n recordedSteps.push(currentStepResult);\n recordedResponseMessages.push(...stepMessages);\n stepFinish.resolve();\n }\n if (part.type === \"finish\") {\n recordedTotalUsage = part.totalUsage;\n recordedFinishReason = part.finishReason;\n recordedRawFinishReason = part.rawFinishReason;\n }\n },\n async flush(controller) {\n var _a21, _b, _c, _d, _e, _f, _g;\n try {\n if (recordedSteps.length === 0) {\n const error = (abortSignal == null ? void 0 : abortSignal.aborted) ? abortSignal.reason : new NoOutputGeneratedError({\n message: \"No output generated. Check the stream for errors.\"\n });\n self._finishReason.reject(error);\n self._rawFinishReason.reject(error);\n self._totalUsage.reject(error);\n self._steps.reject(error);\n return;\n }\n const finishReason = recordedFinishReason != null ? recordedFinishReason : \"other\";\n const totalUsage = recordedTotalUsage != null ? recordedTotalUsage : createNullLanguageModelUsage();\n self._finishReason.resolve(finishReason);\n self._rawFinishReason.resolve(recordedRawFinishReason);\n self._totalUsage.resolve(totalUsage);\n self._steps.resolve(recordedSteps);\n const finalStep = recordedSteps[recordedSteps.length - 1];\n await notify({\n event: {\n stepNumber: finalStep.stepNumber,\n model: finalStep.model,\n functionId: finalStep.functionId,\n metadata: finalStep.metadata,\n experimental_context: finalStep.experimental_context,\n finishReason: finalStep.finishReason,\n rawFinishReason: finalStep.rawFinishReason,\n totalUsage,\n usage: finalStep.usage,\n content: finalStep.content,\n text: finalStep.text,\n reasoningText: finalStep.reasoningText,\n reasoning: finalStep.reasoning,\n files: finalStep.files,\n sources: finalStep.sources,\n toolCalls: finalStep.toolCalls,\n staticToolCalls: finalStep.staticToolCalls,\n dynamicToolCalls: finalStep.dynamicToolCalls,\n toolResults: finalStep.toolResults,\n staticToolResults: finalStep.staticToolResults,\n dynamicToolResults: finalStep.dynamicToolResults,\n request: finalStep.request,\n response: finalStep.response,\n warnings: finalStep.warnings,\n providerMetadata: finalStep.providerMetadata,\n steps: recordedSteps\n },\n callbacks: [\n onFinish,\n globalTelemetry.onFinish\n ]\n });\n rootSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": finishReason,\n \"ai.response.text\": { output: () => finalStep.text },\n \"ai.response.reasoning\": {\n output: () => finalStep.reasoningText\n },\n \"ai.response.toolCalls\": {\n output: () => {\n var _a22;\n return ((_a22 = finalStep.toolCalls) == null ? void 0 : _a22.length) ? JSON.stringify(finalStep.toolCalls) : void 0;\n }\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n finalStep.providerMetadata\n ),\n \"ai.usage.inputTokens\": totalUsage.inputTokens,\n \"ai.usage.inputTokenDetails.noCacheTokens\": (_a21 = totalUsage.inputTokenDetails) == null ? void 0 : _a21.noCacheTokens,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": (_b = totalUsage.inputTokenDetails) == null ? void 0 : _b.cacheReadTokens,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": (_c = totalUsage.inputTokenDetails) == null ? void 0 : _c.cacheWriteTokens,\n \"ai.usage.outputTokens\": totalUsage.outputTokens,\n \"ai.usage.outputTokenDetails.textTokens\": (_d = totalUsage.outputTokenDetails) == null ? void 0 : _d.textTokens,\n \"ai.usage.outputTokenDetails.reasoningTokens\": (_e = totalUsage.outputTokenDetails) == null ? void 0 : _e.reasoningTokens,\n \"ai.usage.totalTokens\": totalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": (_f = totalUsage.outputTokenDetails) == null ? void 0 : _f.reasoningTokens,\n \"ai.usage.cachedInputTokens\": (_g = totalUsage.inputTokenDetails) == null ? void 0 : _g.cacheReadTokens\n }\n })\n );\n } catch (error) {\n controller.error(error);\n } finally {\n rootSpan.end();\n }\n }\n });\n const stitchableStream = createStitchableStream();\n this.addStream = stitchableStream.addStream;\n this.closeStream = stitchableStream.close;\n const reader = stitchableStream.stream.getReader();\n let stream = new ReadableStream({\n async start(controller) {\n controller.enqueue({ type: \"start\" });\n },\n async pull(controller) {\n function abort() {\n onAbort == null ? void 0 : onAbort({ steps: recordedSteps });\n controller.enqueue({\n type: \"abort\",\n // The `reason` is usually of type DOMException, but it can also be of any type,\n // so we use getErrorMessage for serialization because it is already designed to accept values of the unknown type.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/reason\n ...(abortSignal == null ? void 0 : abortSignal.reason) !== void 0 ? { reason: (0,_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.getErrorMessage)(abortSignal.reason) } : {}\n });\n controller.close();\n }\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n if (abortSignal == null ? void 0 : abortSignal.aborted) {\n abort();\n return;\n }\n controller.enqueue(value);\n } catch (error) {\n if ((0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.isAbortError)(error) && (abortSignal == null ? void 0 : abortSignal.aborted)) {\n abort();\n } else {\n controller.error(error);\n }\n }\n },\n cancel(reason) {\n return stitchableStream.stream.cancel(reason);\n }\n });\n for (const transform of transforms) {\n stream = stream.pipeThrough(\n transform({\n tools,\n stopStream() {\n stitchableStream.terminate();\n }\n })\n );\n }\n this.baseStream = stream.pipeThrough(createOutputTransformStream(output != null ? output : text())).pipeThrough(eventProcessor);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const tracer = getTracer(telemetry);\n const callSettings = prepareCallSettings(settings);\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries }\n });\n const self = this;\n const modelInfo = { provider: model.provider, modelId: model.modelId };\n const callbackTelemetryProps = {\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata\n };\n recordSpan({\n name: \"ai.streamText\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.streamText\", telemetry }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n }\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (rootSpanArg) => {\n rootSpan = rootSpanArg;\n const initialPrompt = await standardizePrompt({\n system,\n prompt,\n messages\n });\n await notify({\n event: {\n model: modelInfo,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n activeTools,\n maxOutputTokens: callSettings.maxOutputTokens,\n temperature: callSettings.temperature,\n topP: callSettings.topP,\n topK: callSettings.topK,\n presencePenalty: callSettings.presencePenalty,\n frequencyPenalty: callSettings.frequencyPenalty,\n stopSequences: callSettings.stopSequences,\n seed: callSettings.seed,\n maxRetries,\n timeout,\n headers,\n providerOptions,\n stopWhen,\n output,\n abortSignal: originalAbortSignal,\n include,\n ...callbackTelemetryProps,\n experimental_context\n },\n callbacks: [\n onStart,\n globalTelemetry.onStart\n ]\n });\n const initialMessages = initialPrompt.messages;\n const initialResponseMessages = [];\n const { approvedToolApprovals, deniedToolApprovals } = collectToolApprovals({ messages: initialMessages });\n if (deniedToolApprovals.length > 0 || approvedToolApprovals.length > 0) {\n const providerExecutedToolApprovals = [\n ...approvedToolApprovals,\n ...deniedToolApprovals\n ].filter((toolApproval) => toolApproval.toolCall.providerExecuted);\n const localApprovedToolApprovals = approvedToolApprovals.filter(\n (toolApproval) => !toolApproval.toolCall.providerExecuted\n );\n const localDeniedToolApprovals = deniedToolApprovals.filter(\n (toolApproval) => !toolApproval.toolCall.providerExecuted\n );\n const deniedProviderExecutedToolApprovals = deniedToolApprovals.filter(\n (toolApproval) => toolApproval.toolCall.providerExecuted\n );\n let toolExecutionStepStreamController;\n const toolExecutionStepStream = new ReadableStream({\n start(controller) {\n toolExecutionStepStreamController = controller;\n }\n });\n self.addStream(toolExecutionStepStream);\n try {\n for (const toolApproval of [\n ...localDeniedToolApprovals,\n ...deniedProviderExecutedToolApprovals\n ]) {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue({\n type: \"tool-output-denied\",\n toolCallId: toolApproval.toolCall.toolCallId,\n toolName: toolApproval.toolCall.toolName\n });\n }\n const toolOutputs = [];\n await Promise.all(\n localApprovedToolApprovals.map(async (toolApproval) => {\n const result = await executeToolCall({\n toolCall: toolApproval.toolCall,\n tools,\n tracer,\n telemetry,\n messages: initialMessages,\n abortSignal,\n experimental_context,\n stepNumber: recordedSteps.length,\n model: modelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ],\n onPreliminaryToolResult: (result2) => {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue(result2);\n }\n });\n if (result != null) {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue(result);\n toolOutputs.push(result);\n }\n })\n );\n if (providerExecutedToolApprovals.length > 0) {\n initialResponseMessages.push({\n role: \"tool\",\n content: providerExecutedToolApprovals.map(\n (toolApproval) => ({\n type: \"tool-approval-response\",\n approvalId: toolApproval.approvalResponse.approvalId,\n approved: toolApproval.approvalResponse.approved,\n reason: toolApproval.approvalResponse.reason,\n providerExecuted: true\n })\n )\n });\n }\n if (toolOutputs.length > 0 || localDeniedToolApprovals.length > 0) {\n const localToolContent = [];\n for (const output2 of toolOutputs) {\n localToolContent.push({\n type: \"tool-result\",\n toolCallId: output2.toolCallId,\n toolName: output2.toolName,\n output: await createToolModelOutput({\n toolCallId: output2.toolCallId,\n input: output2.input,\n tool: tools == null ? void 0 : tools[output2.toolName],\n output: output2.type === \"tool-result\" ? output2.output : output2.error,\n errorMode: output2.type === \"tool-error\" ? \"text\" : \"none\"\n })\n });\n }\n for (const toolApproval of localDeniedToolApprovals) {\n localToolContent.push({\n type: \"tool-result\",\n toolCallId: toolApproval.toolCall.toolCallId,\n toolName: toolApproval.toolCall.toolName,\n output: {\n type: \"execution-denied\",\n reason: toolApproval.approvalResponse.reason\n }\n });\n }\n initialResponseMessages.push({\n role: \"tool\",\n content: localToolContent\n });\n }\n } finally {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.close();\n }\n }\n recordedResponseMessages.push(...initialResponseMessages);\n async function streamStep({\n currentStep,\n responseMessages,\n usage\n }) {\n var _a21, _b, _c, _d, _e, _f, _g, _h, _i;\n const includeRawChunks2 = self.includeRawChunks;\n const stepTimeoutId = stepTimeoutMs != null ? setTimeout(() => stepAbortController.abort(), stepTimeoutMs) : void 0;\n let chunkTimeoutId = void 0;\n function resetChunkTimeout() {\n if (chunkTimeoutMs != null) {\n if (chunkTimeoutId != null) {\n clearTimeout(chunkTimeoutId);\n }\n chunkTimeoutId = setTimeout(\n () => chunkAbortController.abort(),\n chunkTimeoutMs\n );\n }\n }\n function clearChunkTimeout() {\n if (chunkTimeoutId != null) {\n clearTimeout(chunkTimeoutId);\n chunkTimeoutId = void 0;\n }\n }\n function clearStepTimeout() {\n if (stepTimeoutId != null) {\n clearTimeout(stepTimeoutId);\n }\n }\n try {\n stepFinish = new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DelayedPromise();\n const stepInputMessages = [...initialMessages, ...responseMessages];\n const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({\n model,\n steps: recordedSteps,\n stepNumber: recordedSteps.length,\n messages: stepInputMessages,\n experimental_context\n }));\n const stepModel = resolveLanguageModel(\n (_a21 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _a21 : model\n );\n const stepModelInfo = {\n provider: stepModel.provider,\n modelId: stepModel.modelId\n };\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n system: (_b = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _b : initialPrompt.system,\n messages: (_c = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _c : stepInputMessages\n },\n supportedUrls: await stepModel.supportedUrls,\n download: download2\n });\n const stepActiveTools = (_d = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _d : activeTools;\n const { toolChoice: stepToolChoice, tools: stepTools } = await prepareToolsAndToolChoice({\n tools,\n toolChoice: (_e = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _e : toolChoice,\n activeTools: stepActiveTools\n });\n experimental_context = (_f = prepareStepResult == null ? void 0 : prepareStepResult.experimental_context) != null ? _f : experimental_context;\n const stepMessages = (_g = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _g : stepInputMessages;\n const stepSystem = (_h = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _h : initialPrompt.system;\n const stepProviderOptions = mergeObjects(\n providerOptions,\n prepareStepResult == null ? void 0 : prepareStepResult.providerOptions\n );\n await notify({\n event: {\n stepNumber: recordedSteps.length,\n model: stepModelInfo,\n system: stepSystem,\n messages: stepMessages,\n tools,\n toolChoice: stepToolChoice,\n activeTools: stepActiveTools,\n steps: [...recordedSteps],\n providerOptions: stepProviderOptions,\n timeout,\n headers,\n stopWhen,\n output,\n abortSignal: originalAbortSignal,\n include,\n ...callbackTelemetryProps,\n experimental_context\n },\n callbacks: [\n onStepStart,\n globalTelemetry.onStepStart\n ]\n });\n const {\n result: { stream: stream2, response, request },\n doStreamSpan,\n startTimestampMs\n } = await retry(\n () => recordSpan({\n name: \"ai.streamText.doStream\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.streamText.doStream\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // model:\n \"ai.model.provider\": stepModel.provider,\n \"ai.model.id\": stepModel.modelId,\n // prompt:\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(promptMessages)\n },\n \"ai.prompt.tools\": {\n // convert the language model level tools:\n input: () => stepTools == null ? void 0 : stepTools.map((tool2) => JSON.stringify(tool2))\n },\n \"ai.prompt.toolChoice\": {\n input: () => stepToolChoice != null ? JSON.stringify(stepToolChoice) : void 0\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": stepModel.provider,\n \"gen_ai.request.model\": stepModel.modelId,\n \"gen_ai.request.frequency_penalty\": callSettings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": callSettings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": callSettings.presencePenalty,\n \"gen_ai.request.stop_sequences\": callSettings.stopSequences,\n \"gen_ai.request.temperature\": callSettings.temperature,\n \"gen_ai.request.top_k\": callSettings.topK,\n \"gen_ai.request.top_p\": callSettings.topP\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (doStreamSpan2) => ({\n startTimestampMs: now2(),\n // get before the call\n doStreamSpan: doStreamSpan2,\n result: await stepModel.doStream({\n ...callSettings,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: await (output == null ? void 0 : output.responseFormat),\n prompt: promptMessages,\n providerOptions: stepProviderOptions,\n abortSignal,\n headers,\n includeRawChunks: includeRawChunks2\n })\n })\n })\n );\n const streamWithToolResults = runToolsTransformation({\n tools,\n generatorStream: stream2,\n tracer,\n telemetry,\n system,\n messages: stepInputMessages,\n repairToolCall,\n abortSignal,\n experimental_context,\n generateId: generateId2,\n stepNumber: recordedSteps.length,\n model: stepModelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ]\n });\n const stepRequest = ((_i = include == null ? void 0 : include.requestBody) != null ? _i : true) ? request != null ? request : {} : { ...request, body: void 0 };\n const stepToolCalls = [];\n const stepToolOutputs = [];\n let warnings;\n const activeToolCallToolNames = {};\n let stepFinishReason = \"other\";\n let stepRawFinishReason = void 0;\n let stepUsage = createNullLanguageModelUsage();\n let stepProviderMetadata;\n let stepFirstChunk = true;\n let stepResponse = {\n id: generateId2(),\n timestamp: /* @__PURE__ */ new Date(),\n modelId: modelInfo.modelId\n };\n let activeText = \"\";\n self.addStream(\n streamWithToolResults.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n var _a22, _b2, _c2, _d2, _e2;\n resetChunkTimeout();\n if (chunk.type === \"stream-start\") {\n warnings = chunk.warnings;\n return;\n }\n if (stepFirstChunk) {\n const msToFirstChunk = now2() - startTimestampMs;\n stepFirstChunk = false;\n doStreamSpan.addEvent(\"ai.stream.firstChunk\", {\n \"ai.response.msToFirstChunk\": msToFirstChunk\n });\n doStreamSpan.setAttributes({\n \"ai.response.msToFirstChunk\": msToFirstChunk\n });\n controller.enqueue({\n type: \"start-step\",\n request: stepRequest,\n warnings: warnings != null ? warnings : []\n });\n }\n const chunkType = chunk.type;\n switch (chunkType) {\n case \"tool-approval-request\":\n case \"text-start\":\n case \"text-end\": {\n controller.enqueue(chunk);\n break;\n }\n case \"text-delta\": {\n if (chunk.delta.length > 0) {\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata\n });\n activeText += chunk.delta;\n }\n break;\n }\n case \"reasoning-start\":\n case \"reasoning-end\": {\n controller.enqueue(chunk);\n break;\n }\n case \"reasoning-delta\": {\n controller.enqueue({\n type: \"reasoning-delta\",\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata\n });\n break;\n }\n case \"tool-call\": {\n controller.enqueue(chunk);\n stepToolCalls.push(chunk);\n break;\n }\n case \"tool-result\": {\n controller.enqueue(chunk);\n if (!chunk.preliminary) {\n stepToolOutputs.push(chunk);\n }\n break;\n }\n case \"tool-error\": {\n controller.enqueue(chunk);\n stepToolOutputs.push(chunk);\n break;\n }\n case \"response-metadata\": {\n stepResponse = {\n id: (_a22 = chunk.id) != null ? _a22 : stepResponse.id,\n timestamp: (_b2 = chunk.timestamp) != null ? _b2 : stepResponse.timestamp,\n modelId: (_c2 = chunk.modelId) != null ? _c2 : stepResponse.modelId\n };\n break;\n }\n case \"finish\": {\n stepUsage = chunk.usage;\n stepFinishReason = chunk.finishReason;\n stepRawFinishReason = chunk.rawFinishReason;\n stepProviderMetadata = chunk.providerMetadata;\n const msToFinish = now2() - startTimestampMs;\n doStreamSpan.addEvent(\"ai.stream.finish\");\n doStreamSpan.setAttributes({\n \"ai.response.msToFinish\": msToFinish,\n \"ai.response.avgOutputTokensPerSecond\": 1e3 * ((_d2 = stepUsage.outputTokens) != null ? _d2 : 0) / msToFinish\n });\n break;\n }\n case \"file\": {\n controller.enqueue(chunk);\n break;\n }\n case \"source\": {\n controller.enqueue(chunk);\n break;\n }\n case \"tool-input-start\": {\n activeToolCallToolNames[chunk.id] = chunk.toolName;\n const tool2 = tools == null ? void 0 : tools[chunk.toolName];\n if ((tool2 == null ? void 0 : tool2.onInputStart) != null) {\n await tool2.onInputStart({\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n experimental_context\n });\n }\n controller.enqueue({\n ...chunk,\n dynamic: (_e2 = chunk.dynamic) != null ? _e2 : (tool2 == null ? void 0 : tool2.type) === \"dynamic\",\n title: tool2 == null ? void 0 : tool2.title\n });\n break;\n }\n case \"tool-input-end\": {\n delete activeToolCallToolNames[chunk.id];\n controller.enqueue(chunk);\n break;\n }\n case \"tool-input-delta\": {\n const toolName = activeToolCallToolNames[chunk.id];\n const tool2 = tools == null ? void 0 : tools[toolName];\n if ((tool2 == null ? void 0 : tool2.onInputDelta) != null) {\n await tool2.onInputDelta({\n inputTextDelta: chunk.delta,\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n experimental_context\n });\n }\n controller.enqueue(chunk);\n break;\n }\n case \"error\": {\n controller.enqueue(chunk);\n stepFinishReason = \"error\";\n break;\n }\n case \"raw\": {\n if (includeRawChunks2) {\n controller.enqueue(chunk);\n }\n break;\n }\n default: {\n const exhaustiveCheck = chunkType;\n throw new Error(\n `Unknown chunk type: ${exhaustiveCheck}`\n );\n }\n }\n },\n // invoke onFinish callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n var _a22, _b2, _c2, _d2, _e2, _f2, _g2;\n const stepToolCallsJson = stepToolCalls.length > 0 ? JSON.stringify(stepToolCalls) : void 0;\n try {\n doStreamSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": stepFinishReason,\n \"ai.response.toolCalls\": {\n output: () => stepToolCallsJson\n },\n \"ai.response.id\": stepResponse.id,\n \"ai.response.model\": stepResponse.modelId,\n \"ai.response.timestamp\": stepResponse.timestamp.toISOString(),\n \"ai.usage.inputTokens\": stepUsage.inputTokens,\n \"ai.usage.inputTokenDetails.noCacheTokens\": (_a22 = stepUsage.inputTokenDetails) == null ? void 0 : _a22.noCacheTokens,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": (_b2 = stepUsage.inputTokenDetails) == null ? void 0 : _b2.cacheReadTokens,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": (_c2 = stepUsage.inputTokenDetails) == null ? void 0 : _c2.cacheWriteTokens,\n \"ai.usage.outputTokens\": stepUsage.outputTokens,\n \"ai.usage.outputTokenDetails.textTokens\": (_d2 = stepUsage.outputTokenDetails) == null ? void 0 : _d2.textTokens,\n \"ai.usage.outputTokenDetails.reasoningTokens\": (_e2 = stepUsage.outputTokenDetails) == null ? void 0 : _e2.reasoningTokens,\n \"ai.usage.totalTokens\": stepUsage.totalTokens,\n \"ai.usage.reasoningTokens\": (_f2 = stepUsage.outputTokenDetails) == null ? void 0 : _f2.reasoningTokens,\n \"ai.usage.cachedInputTokens\": (_g2 = stepUsage.inputTokenDetails) == null ? void 0 : _g2.cacheReadTokens,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [\n stepFinishReason\n ],\n \"gen_ai.response.id\": stepResponse.id,\n \"gen_ai.response.model\": stepResponse.modelId,\n \"gen_ai.usage.input_tokens\": stepUsage.inputTokens,\n \"gen_ai.usage.output_tokens\": stepUsage.outputTokens\n }\n })\n );\n } catch (error) {\n }\n controller.enqueue({\n type: \"finish-step\",\n finishReason: stepFinishReason,\n rawFinishReason: stepRawFinishReason,\n usage: stepUsage,\n providerMetadata: stepProviderMetadata,\n response: {\n ...stepResponse,\n headers: response == null ? void 0 : response.headers\n }\n });\n const combinedUsage = addLanguageModelUsage(\n usage,\n stepUsage\n );\n await stepFinish.promise;\n const processedStep = recordedSteps[recordedSteps.length - 1];\n try {\n doStreamSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.text\": {\n output: () => processedStep.text\n },\n \"ai.response.reasoning\": {\n output: () => processedStep.reasoningText\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n processedStep.providerMetadata\n )\n }\n })\n );\n } catch (error) {\n } finally {\n doStreamSpan.end();\n }\n const clientToolCalls = stepToolCalls.filter(\n (toolCall) => toolCall.providerExecuted !== true\n );\n const clientToolOutputs = stepToolOutputs.filter(\n (toolOutput) => toolOutput.providerExecuted !== true\n );\n for (const toolCall of stepToolCalls) {\n if (toolCall.providerExecuted !== true)\n continue;\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if ((tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults) {\n const hasResultInStep = stepToolOutputs.some(\n (output2) => (output2.type === \"tool-result\" || output2.type === \"tool-error\") && output2.toolCallId === toolCall.toolCallId\n );\n if (!hasResultInStep) {\n pendingDeferredToolCalls.set(toolCall.toolCallId, {\n toolName: toolCall.toolName\n });\n }\n }\n }\n for (const output2 of stepToolOutputs) {\n if (output2.type === \"tool-result\" || output2.type === \"tool-error\") {\n pendingDeferredToolCalls.delete(output2.toolCallId);\n }\n }\n clearStepTimeout();\n clearChunkTimeout();\n if (\n // Continue if:\n // 1. There are client tool calls that have all been executed, OR\n // 2. There are pending deferred results from provider-executed tools\n (clientToolCalls.length > 0 && clientToolOutputs.length === clientToolCalls.length || pendingDeferredToolCalls.size > 0) && // continue until a stop condition is met:\n !await isStopConditionMet({\n stopConditions,\n steps: recordedSteps\n })\n ) {\n responseMessages.push(\n ...await toResponseMessages({\n content: (\n // use transformed content to create the messages for the next step:\n recordedSteps[recordedSteps.length - 1].content\n ),\n tools\n })\n );\n try {\n await streamStep({\n currentStep: currentStep + 1,\n responseMessages,\n usage: combinedUsage\n });\n } catch (error) {\n controller.enqueue({\n type: \"error\",\n error\n });\n self.closeStream();\n }\n } else {\n controller.enqueue({\n type: \"finish\",\n finishReason: stepFinishReason,\n rawFinishReason: stepRawFinishReason,\n totalUsage: combinedUsage\n });\n self.closeStream();\n }\n }\n })\n )\n );\n } finally {\n clearStepTimeout();\n clearChunkTimeout();\n }\n }\n await streamStep({\n currentStep: 0,\n responseMessages: initialResponseMessages,\n usage: createNullLanguageModelUsage()\n });\n }\n }).catch((error) => {\n self.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: \"error\", error });\n controller.close();\n }\n })\n );\n self.closeStream();\n });\n }\n get steps() {\n this.consumeStream();\n return this._steps.promise;\n }\n get finalStep() {\n return this.steps.then((steps) => steps[steps.length - 1]);\n }\n get content() {\n return this.finalStep.then((step) => step.content);\n }\n get warnings() {\n return this.finalStep.then((step) => step.warnings);\n }\n get providerMetadata() {\n return this.finalStep.then((step) => step.providerMetadata);\n }\n get text() {\n return this.finalStep.then((step) => step.text);\n }\n get reasoningText() {\n return this.finalStep.then((step) => step.reasoningText);\n }\n get reasoning() {\n return this.finalStep.then((step) => step.reasoning);\n }\n get sources() {\n return this.finalStep.then((step) => step.sources);\n }\n get files() {\n return this.finalStep.then((step) => step.files);\n }\n get toolCalls() {\n return this.finalStep.then((step) => step.toolCalls);\n }\n get staticToolCalls() {\n return this.finalStep.then((step) => step.staticToolCalls);\n }\n get dynamicToolCalls() {\n return this.finalStep.then((step) => step.dynamicToolCalls);\n }\n get toolResults() {\n return this.finalStep.then((step) => step.toolResults);\n }\n get staticToolResults() {\n return this.finalStep.then((step) => step.staticToolResults);\n }\n get dynamicToolResults() {\n return this.finalStep.then((step) => step.dynamicToolResults);\n }\n get usage() {\n return this.finalStep.then((step) => step.usage);\n }\n get request() {\n return this.finalStep.then((step) => step.request);\n }\n get response() {\n return this.finalStep.then((step) => step.response);\n }\n get totalUsage() {\n this.consumeStream();\n return this._totalUsage.promise;\n }\n get finishReason() {\n this.consumeStream();\n return this._finishReason.promise;\n }\n get rawFinishReason() {\n this.consumeStream();\n return this._rawFinishReason.promise;\n }\n /**\n * Split out a new stream from the original stream.\n * The original stream is replaced to allow for further splitting,\n * since we do not know how many times the stream will be split.\n *\n * Note: this leads to buffering the stream content on the server.\n * However, the LLM results are expected to be small enough to not cause issues.\n */\n teeStream() {\n const [stream1, stream2] = this.baseStream.tee();\n this.baseStream = stream2;\n return stream1;\n }\n get textStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ part }, controller) {\n if (part.type === \"text-delta\") {\n controller.enqueue(part.text);\n }\n }\n })\n )\n );\n }\n get fullStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ part }, controller) {\n controller.enqueue(part);\n }\n })\n )\n );\n }\n async consumeStream(options) {\n var _a21;\n try {\n await consumeStream({\n stream: this.fullStream,\n onError: options == null ? void 0 : options.onError\n });\n } catch (error) {\n (_a21 = options == null ? void 0 : options.onError) == null ? void 0 : _a21.call(options, error);\n }\n }\n get experimental_partialOutputStream() {\n return this.partialOutputStream;\n }\n get partialOutputStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n controller.enqueue(partialOutput);\n }\n }\n })\n )\n );\n }\n get elementStream() {\n var _a21, _b, _c;\n const transform = (_a21 = this.outputSpecification) == null ? void 0 : _a21.createElementStreamTransform();\n if (transform == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.UnsupportedFunctionalityError({\n functionality: `element streams in ${(_c = (_b = this.outputSpecification) == null ? void 0 : _b.name) != null ? _c : \"text\"} mode`\n });\n }\n return createAsyncIterableStream(this.teeStream().pipeThrough(transform));\n }\n get output() {\n return this.finalStep.then((step) => {\n var _a21;\n const output = (_a21 = this.outputSpecification) != null ? _a21 : text();\n return output.parseCompleteOutput(\n { text: step.text },\n {\n response: step.response,\n usage: step.usage,\n finishReason: step.finishReason\n }\n );\n });\n }\n toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning = true,\n sendSources = false,\n sendStart = true,\n sendFinish = true,\n onError = _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.getErrorMessage\n } = {}) {\n const responseMessageId = generateMessageId != null ? getResponseUIMessageId({\n originalMessages,\n responseMessageId: generateMessageId\n }) : void 0;\n const isDynamic = (part) => {\n var _a21;\n const tool2 = (_a21 = this.tools) == null ? void 0 : _a21[part.toolName];\n if (tool2 == null) {\n return part.dynamic;\n }\n return (tool2 == null ? void 0 : tool2.type) === \"dynamic\" ? true : void 0;\n };\n const baseStream = this.fullStream.pipeThrough(\n new TransformStream({\n transform: async (part, controller) => {\n const messageMetadataValue = messageMetadata == null ? void 0 : messageMetadata({ part });\n const partType = part.type;\n switch (partType) {\n case \"text-start\": {\n controller.enqueue({\n type: \"text-start\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"text-delta\": {\n controller.enqueue({\n type: \"text-delta\",\n id: part.id,\n delta: part.text,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"text-end\": {\n controller.enqueue({\n type: \"text-end\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"reasoning-start\": {\n controller.enqueue({\n type: \"reasoning-start\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"reasoning-delta\": {\n if (sendReasoning) {\n controller.enqueue({\n type: \"reasoning-delta\",\n id: part.id,\n delta: part.text,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n case \"reasoning-end\": {\n controller.enqueue({\n type: \"reasoning-end\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"file\": {\n controller.enqueue({\n type: \"file\",\n mediaType: part.file.mediaType,\n url: `data:${part.file.mediaType};base64,${part.file.base64}`,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"source\": {\n if (sendSources && part.sourceType === \"url\") {\n controller.enqueue({\n type: \"source-url\",\n sourceId: part.id,\n url: part.url,\n title: part.title,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n if (sendSources && part.sourceType === \"document\") {\n controller.enqueue({\n type: \"source-document\",\n sourceId: part.id,\n mediaType: part.mediaType,\n title: part.title,\n filename: part.filename,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n case \"tool-input-start\": {\n const dynamic = isDynamic(part);\n controller.enqueue({\n type: \"tool-input-start\",\n toolCallId: part.id,\n toolName: part.toolName,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n ...part.title != null ? { title: part.title } : {}\n });\n break;\n }\n case \"tool-input-delta\": {\n controller.enqueue({\n type: \"tool-input-delta\",\n toolCallId: part.id,\n inputTextDelta: part.delta\n });\n break;\n }\n case \"tool-call\": {\n const dynamic = isDynamic(part);\n if (part.invalid) {\n controller.enqueue({\n type: \"tool-input-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n errorText: onError(part.error),\n ...part.title != null ? { title: part.title } : {}\n });\n } else {\n controller.enqueue({\n type: \"tool-input-available\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n ...part.title != null ? { title: part.title } : {}\n });\n }\n break;\n }\n case \"tool-approval-request\": {\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCallId: part.toolCall.toolCallId\n });\n break;\n }\n case \"tool-result\": {\n const dynamic = isDynamic(part);\n controller.enqueue({\n type: \"tool-output-available\",\n toolCallId: part.toolCallId,\n output: part.output,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.preliminary != null ? { preliminary: part.preliminary } : {},\n ...dynamic != null ? { dynamic } : {}\n });\n break;\n }\n case \"tool-error\": {\n const dynamic = isDynamic(part);\n controller.enqueue({\n type: \"tool-output-error\",\n toolCallId: part.toolCallId,\n errorText: part.providerExecuted ? typeof part.error === \"string\" ? part.error : JSON.stringify(part.error) : onError(part.error),\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...dynamic != null ? { dynamic } : {}\n });\n break;\n }\n case \"tool-output-denied\": {\n controller.enqueue({\n type: \"tool-output-denied\",\n toolCallId: part.toolCallId\n });\n break;\n }\n case \"error\": {\n controller.enqueue({\n type: \"error\",\n errorText: onError(part.error)\n });\n break;\n }\n case \"start-step\": {\n controller.enqueue({ type: \"start-step\" });\n break;\n }\n case \"finish-step\": {\n controller.enqueue({ type: \"finish-step\" });\n break;\n }\n case \"start\": {\n if (sendStart) {\n controller.enqueue({\n type: \"start\",\n ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {},\n ...responseMessageId != null ? { messageId: responseMessageId } : {}\n });\n }\n break;\n }\n case \"finish\": {\n if (sendFinish) {\n controller.enqueue({\n type: \"finish\",\n finishReason: part.finishReason,\n ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {}\n });\n }\n break;\n }\n case \"abort\": {\n controller.enqueue(part);\n break;\n }\n case \"tool-input-end\": {\n break;\n }\n case \"raw\": {\n break;\n }\n default: {\n const exhaustiveCheck = partType;\n throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);\n }\n }\n if (messageMetadataValue != null && partType !== \"start\" && partType !== \"finish\") {\n controller.enqueue({\n type: \"message-metadata\",\n messageMetadata: messageMetadataValue\n });\n }\n }\n })\n );\n return createAsyncIterableStream(\n handleUIMessageStreamFinish({\n stream: baseStream,\n messageId: responseMessageId != null ? responseMessageId : generateMessageId == null ? void 0 : generateMessageId(),\n originalMessages,\n onFinish,\n onError\n })\n );\n }\n pipeUIMessageStreamToResponse(response, {\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n } = {}) {\n pipeUIMessageStreamToResponse({\n response,\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError\n }),\n ...init\n });\n }\n pipeTextStreamToResponse(response, init) {\n pipeTextStreamToResponse({\n response,\n textStream: this.textStream,\n ...init\n });\n }\n toUIMessageStreamResponse({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n } = {}) {\n return createUIMessageStreamResponse({\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError\n }),\n ...init\n });\n }\n toTextStreamResponse(init) {\n return createTextStreamResponse({\n textStream: this.textStream,\n ...init\n });\n }\n};\n\n// src/agent/tool-loop-agent.ts\nvar ToolLoopAgent = class {\n constructor(settings) {\n this.version = \"agent-v1\";\n this.settings = settings;\n }\n /**\n * The id of the agent.\n */\n get id() {\n return this.settings.id;\n }\n /**\n * The tools that the agent can use.\n */\n get tools() {\n return this.settings.tools;\n }\n async prepareCall(options) {\n var _a21, _b, _c, _d;\n const { onStepFinish: _settingsOnStepFinish, ...settingsWithoutCallback } = this.settings;\n const baseCallArgs = {\n ...settingsWithoutCallback,\n stopWhen: (_a21 = this.settings.stopWhen) != null ? _a21 : stepCountIs(20),\n ...options\n };\n const preparedCallArgs = (_d = await ((_c = (_b = this.settings).prepareCall) == null ? void 0 : _c.call(\n _b,\n baseCallArgs\n ))) != null ? _d : baseCallArgs;\n const { instructions, messages, prompt, ...callArgs } = preparedCallArgs;\n return {\n ...callArgs,\n // restore prompt types\n ...{ system: instructions, messages, prompt }\n };\n }\n mergeOnStepFinishCallbacks(methodCallback) {\n const constructorCallback = this.settings.onStepFinish;\n if (methodCallback && constructorCallback) {\n return async (stepResult) => {\n await constructorCallback(stepResult);\n await methodCallback(stepResult);\n };\n }\n return methodCallback != null ? methodCallback : constructorCallback;\n }\n /**\n * Generates an output from the agent (non-streaming).\n */\n async generate({\n abortSignal,\n timeout,\n onStepFinish,\n ...options\n }) {\n return generateText({\n ...await this.prepareCall(options),\n abortSignal,\n timeout,\n onStepFinish: this.mergeOnStepFinishCallbacks(onStepFinish)\n });\n }\n /**\n * Streams an output from the agent (streaming).\n */\n async stream({\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish,\n ...options\n }) {\n return streamText({\n ...await this.prepareCall(options),\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish: this.mergeOnStepFinishCallbacks(onStepFinish)\n });\n }\n};\n\n// src/ui-message-stream/create-ui-message-stream.ts\n\nfunction createUIMessageStream({\n execute,\n onError = _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.getErrorMessage,\n originalMessages,\n onStepFinish,\n onFinish,\n generateId: generateId2 = _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.generateId\n}) {\n let controller;\n const ongoingStreamPromises = [];\n const stream = new ReadableStream({\n start(controllerArg) {\n controller = controllerArg;\n }\n });\n function safeEnqueue(data) {\n try {\n controller.enqueue(data);\n } catch (error) {\n }\n }\n try {\n const result = execute({\n writer: {\n write(part) {\n safeEnqueue(part);\n },\n merge(streamArg) {\n ongoingStreamPromises.push(\n (async () => {\n const reader = streamArg.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n safeEnqueue(value);\n }\n })().catch((error) => {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n })\n );\n },\n onError\n }\n });\n if (result) {\n ongoingStreamPromises.push(\n result.catch((error) => {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n })\n );\n }\n } catch (error) {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n }\n const waitForStreams = new Promise(async (resolve3) => {\n while (ongoingStreamPromises.length > 0) {\n await ongoingStreamPromises.shift();\n }\n resolve3();\n });\n waitForStreams.finally(() => {\n try {\n controller.close();\n } catch (error) {\n }\n });\n return handleUIMessageStreamFinish({\n stream,\n messageId: generateId2(),\n originalMessages,\n onStepFinish,\n onFinish,\n onError\n });\n}\n\n// src/ui-message-stream/read-ui-message-stream.ts\nfunction readUIMessageStream({\n message,\n stream,\n onError,\n terminateOnError = false\n}) {\n var _a21;\n let controller;\n let hasErrored = false;\n const outputStream = new ReadableStream({\n start(controllerParam) {\n controller = controllerParam;\n }\n });\n const state = createStreamingUIMessageState({\n messageId: (_a21 = message == null ? void 0 : message.id) != null ? _a21 : \"\",\n lastMessage: message\n });\n const handleError = (error) => {\n onError == null ? void 0 : onError(error);\n if (!hasErrored && terminateOnError) {\n hasErrored = true;\n controller == null ? void 0 : controller.error(error);\n }\n };\n consumeStream({\n stream: processUIMessageStream({\n stream,\n runUpdateMessageJob(job) {\n return job({\n state,\n write: () => {\n controller == null ? void 0 : controller.enqueue(structuredClone(state.message));\n }\n });\n },\n onError: handleError\n }),\n onError: handleError\n }).finally(() => {\n if (!hasErrored) {\n controller == null ? void 0 : controller.close();\n }\n });\n return createAsyncIterableStream(outputStream);\n}\n\n// src/ui/convert-to-model-messages.ts\n\nasync function convertToModelMessages(messages, options) {\n const modelMessages = [];\n if (options == null ? void 0 : options.ignoreIncompleteToolCalls) {\n messages = messages.map((message) => ({\n ...message,\n parts: message.parts.filter(\n (part) => !isToolUIPart(part) || part.state !== \"input-streaming\" && part.state !== \"input-available\"\n )\n }));\n }\n for (const message of messages) {\n switch (message.role) {\n case \"system\": {\n const textParts = message.parts.filter(\n (part) => part.type === \"text\"\n );\n const providerMetadata = textParts.reduce((acc, part) => {\n if (part.providerMetadata != null) {\n return { ...acc, ...part.providerMetadata };\n }\n return acc;\n }, {});\n modelMessages.push({\n role: \"system\",\n content: textParts.map((part) => part.text).join(\"\"),\n ...Object.keys(providerMetadata).length > 0 ? { providerOptions: providerMetadata } : {}\n });\n break;\n }\n case \"user\": {\n modelMessages.push({\n role: \"user\",\n content: message.parts.map((part) => {\n var _a21;\n if (isTextUIPart(part)) {\n return {\n type: \"text\",\n text: part.text,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n };\n }\n if (isFileUIPart(part)) {\n return {\n type: \"file\",\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.url,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n };\n }\n if (isDataUIPart(part)) {\n return (_a21 = options == null ? void 0 : options.convertDataPart) == null ? void 0 : _a21.call(\n options,\n part\n );\n }\n }).filter(_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.isNonNullable)\n });\n break;\n }\n case \"assistant\": {\n if (message.parts != null) {\n let block = [];\n async function processBlock() {\n var _a21, _b, _c, _d, _e, _f, _g;\n if (block.length === 0) {\n return;\n }\n const content = [];\n for (const part of block) {\n if (isTextUIPart(part)) {\n content.push({\n type: \"text\",\n text: part.text,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n } else if (isFileUIPart(part)) {\n content.push({\n type: \"file\",\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.url,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n } else if (isReasoningUIPart(part)) {\n content.push({\n type: \"reasoning\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n } else if (isToolUIPart(part)) {\n const toolName = getToolName(part);\n if (part.state !== \"input-streaming\") {\n content.push({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName,\n input: part.state === \"output-error\" ? (_a21 = part.input) != null ? _a21 : \"rawInput\" in part ? part.rawInput : void 0 : part.input,\n providerExecuted: part.providerExecuted,\n ...part.callProviderMetadata != null ? { providerOptions: part.callProviderMetadata } : {}\n });\n if (part.approval != null) {\n content.push({\n type: \"tool-approval-request\",\n approvalId: part.approval.id,\n toolCallId: part.toolCallId\n });\n }\n if (part.providerExecuted === true && part.state !== \"approval-responded\" && (part.state === \"output-available\" || part.state === \"output-error\")) {\n const resultProviderMetadata = (_b = part.resultProviderMetadata) != null ? _b : part.callProviderMetadata;\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName,\n output: await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n output: part.state === \"output-error\" ? part.errorText : part.output,\n tool: (_c = options == null ? void 0 : options.tools) == null ? void 0 : _c[toolName],\n errorMode: part.state === \"output-error\" ? \"json\" : \"none\"\n }),\n ...resultProviderMetadata != null ? { providerOptions: resultProviderMetadata } : {}\n });\n }\n }\n } else if (isDataUIPart(part)) {\n const dataPart = (_d = options == null ? void 0 : options.convertDataPart) == null ? void 0 : _d.call(\n options,\n part\n );\n if (dataPart != null) {\n content.push(dataPart);\n }\n } else {\n const _exhaustiveCheck = part;\n throw new Error(`Unsupported part: ${_exhaustiveCheck}`);\n }\n }\n modelMessages.push({\n role: \"assistant\",\n content\n });\n const toolParts = block.filter(\n (part) => {\n var _a22;\n return isToolUIPart(part) && (part.providerExecuted !== true || ((_a22 = part.approval) == null ? void 0 : _a22.approved) != null);\n }\n );\n if (toolParts.length > 0) {\n {\n const content2 = [];\n for (const toolPart of toolParts) {\n if (((_e = toolPart.approval) == null ? void 0 : _e.approved) != null) {\n content2.push({\n type: \"tool-approval-response\",\n approvalId: toolPart.approval.id,\n approved: toolPart.approval.approved,\n reason: toolPart.approval.reason,\n providerExecuted: toolPart.providerExecuted\n });\n }\n if (toolPart.providerExecuted === true) {\n continue;\n }\n switch (toolPart.state) {\n case \"output-denied\": {\n content2.push({\n type: \"tool-result\",\n toolCallId: toolPart.toolCallId,\n toolName: getToolName(toolPart),\n output: {\n type: \"error-text\",\n value: (_f = toolPart.approval.reason) != null ? _f : \"Tool execution denied.\"\n },\n ...toolPart.callProviderMetadata != null ? { providerOptions: toolPart.callProviderMetadata } : {}\n });\n break;\n }\n case \"output-error\":\n case \"output-available\": {\n const toolName = getToolName(toolPart);\n content2.push({\n type: \"tool-result\",\n toolCallId: toolPart.toolCallId,\n toolName,\n output: await createToolModelOutput({\n toolCallId: toolPart.toolCallId,\n input: toolPart.input,\n output: toolPart.state === \"output-error\" ? toolPart.errorText : toolPart.output,\n tool: (_g = options == null ? void 0 : options.tools) == null ? void 0 : _g[toolName],\n errorMode: toolPart.state === \"output-error\" ? \"text\" : \"none\"\n }),\n ...toolPart.callProviderMetadata != null ? { providerOptions: toolPart.callProviderMetadata } : {}\n });\n break;\n }\n }\n }\n if (content2.length > 0) {\n modelMessages.push({\n role: \"tool\",\n content: content2\n });\n }\n }\n }\n block = [];\n }\n for (const part of message.parts) {\n if (isTextUIPart(part) || isReasoningUIPart(part) || isFileUIPart(part) || isToolUIPart(part) || isDataUIPart(part)) {\n block.push(part);\n } else if (part.type === \"step-start\") {\n await processBlock();\n }\n }\n await processBlock();\n break;\n }\n break;\n }\n default: {\n const _exhaustiveCheck = message.role;\n throw new MessageConversionError({\n originalMessage: message,\n message: `Unsupported role: ${_exhaustiveCheck}`\n });\n }\n }\n }\n return modelMessages;\n}\n\n// src/ui/validate-ui-messages.ts\n\n\n\nvar uiMessagesSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n role: zod_v4__WEBPACK_IMPORTED_MODULE_3__[\"enum\"]([\"system\", \"user\", \"assistant\"]),\n metadata: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown().optional(),\n parts: zod_v4__WEBPACK_IMPORTED_MODULE_3__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"text\"),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__[\"enum\"]([\"streaming\", \"done\"]).optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"reasoning\"),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__[\"enum\"]([\"streaming\", \"done\"]).optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"source-url\"),\n sourceId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"source-document\"),\n sourceId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"file\"),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"step-start\")\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().startsWith(\"data-\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n data: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"dynamic-tool\"),\n toolName: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"input-streaming\"),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown().optional(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"dynamic-tool\"),\n toolName: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"input-available\"),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"dynamic-tool\"),\n toolName: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"approval-requested\"),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n approved: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"dynamic-tool\"),\n toolName: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"approval-responded\"),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n approved: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean(),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"dynamic-tool\"),\n toolName: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"output-available\"),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n preliminary: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n approved: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(true),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n }).optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"dynamic-tool\"),\n toolName: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"output-error\"),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n rawInput: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown().optional(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n approved: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(true),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n }).optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"dynamic-tool\"),\n toolName: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"output-denied\"),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n approved: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(false),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().startsWith(\"tool-\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"input-streaming\"),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown().optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().startsWith(\"tool-\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"input-available\"),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().startsWith(\"tool-\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"approval-requested\"),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n approved: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().startsWith(\"tool-\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"approval-responded\"),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n approved: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean(),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().startsWith(\"tool-\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"output-available\"),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n preliminary: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n approved: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(true),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n }).optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().startsWith(\"tool-\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"output-error\"),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n rawInput: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown().optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n approved: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(true),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n }).optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().startsWith(\"tool-\"),\n toolCallId: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n state: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(\"output-denied\"),\n providerExecuted: zod_v4__WEBPACK_IMPORTED_MODULE_3__.boolean().optional(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_3__.unknown(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n errorText: zod_v4__WEBPACK_IMPORTED_MODULE_3__.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: zod_v4__WEBPACK_IMPORTED_MODULE_3__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string(),\n approved: zod_v4__WEBPACK_IMPORTED_MODULE_3__.literal(false),\n reason: zod_v4__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n })\n })\n ])\n ).nonempty(\"Message must contain at least one part\")\n })\n ).nonempty(\"Messages array must not be empty\")\n )\n);\nasync function safeValidateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n}) {\n try {\n if (messages == null) {\n return {\n success: false,\n error: new InvalidArgumentError({\n parameter: \"messages\",\n value: messages,\n message: \"messages parameter must be provided\"\n })\n };\n }\n const validatedMessages = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.validateTypes)({\n value: messages,\n schema: uiMessagesSchema\n });\n if (metadataSchema) {\n for (const [msgIdx, message] of validatedMessages.entries()) {\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.validateTypes)({\n value: message.metadata,\n schema: metadataSchema,\n context: {\n field: `messages[${msgIdx}].metadata`,\n entityId: message.id\n }\n });\n }\n }\n if (dataSchemas || tools) {\n for (const [msgIdx, message] of validatedMessages.entries()) {\n for (const [partIdx, part] of message.parts.entries()) {\n if (dataSchemas && part.type.startsWith(\"data-\")) {\n const dataPart = part;\n const dataName = dataPart.type.slice(5);\n const dataSchema = dataSchemas[dataName];\n if (!dataSchema) {\n return {\n success: false,\n error: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError({\n value: dataPart.data,\n cause: `No data schema found for data part ${dataName}`,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].data`,\n entityName: dataName,\n entityId: dataPart.id\n }\n })\n };\n }\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.validateTypes)({\n value: dataPart.data,\n schema: dataSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].data`,\n entityName: dataName,\n entityId: dataPart.id\n }\n });\n }\n if (tools && part.type.startsWith(\"tool-\")) {\n const toolPart = part;\n const toolName = toolPart.type.slice(5);\n const tool2 = tools[toolName];\n if (!tool2) {\n return {\n success: false,\n error: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError({\n value: toolPart.input,\n cause: `No tool schema found for tool part ${toolName}`,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].input`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n })\n };\n }\n if (toolPart.state === \"input-available\" || toolPart.state === \"output-available\" || toolPart.state === \"output-error\" && toolPart.input !== void 0) {\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.validateTypes)({\n value: toolPart.input,\n schema: tool2.inputSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].input`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n });\n }\n if (toolPart.state === \"output-available\" && tool2.outputSchema) {\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.validateTypes)({\n value: toolPart.output,\n schema: tool2.outputSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].output`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n });\n }\n }\n }\n }\n }\n return {\n success: true,\n data: validatedMessages\n };\n } catch (error) {\n const err = error;\n return {\n success: false,\n error: err\n };\n }\n}\nasync function validateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n}) {\n const response = await safeValidateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n });\n if (!response.success)\n throw response.error;\n return response.data;\n}\n\n// src/agent/create-agent-ui-stream.ts\nasync function createAgentUIStream({\n agent,\n uiMessages,\n options,\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish,\n ...uiMessageStreamOptions\n}) {\n var _a21;\n const validatedMessages = await validateUIMessages({\n messages: uiMessages,\n tools: agent.tools\n });\n const modelMessages = await convertToModelMessages(validatedMessages, {\n tools: agent.tools\n });\n const result = await agent.stream({\n prompt: modelMessages,\n options,\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish\n });\n return result.toUIMessageStream({\n ...uiMessageStreamOptions,\n // TODO reading `originalMessages` is here for bc, always use `validatedMessages` in v7\n originalMessages: (_a21 = uiMessageStreamOptions.originalMessages) != null ? _a21 : validatedMessages\n });\n}\n\n// src/agent/create-agent-ui-stream-response.ts\nasync function createAgentUIStreamResponse({\n headers,\n status,\n statusText,\n consumeSseStream,\n ...options\n}) {\n return createUIMessageStreamResponse({\n headers,\n status,\n statusText,\n consumeSseStream,\n stream: await createAgentUIStream(options)\n });\n}\n\n// src/agent/pipe-agent-ui-stream-to-response.ts\nasync function pipeAgentUIStreamToResponse({\n response,\n headers,\n status,\n statusText,\n consumeSseStream,\n ...options\n}) {\n pipeUIMessageStreamToResponse({\n response,\n headers,\n status,\n statusText,\n consumeSseStream,\n stream: await createAgentUIStream(options)\n });\n}\n\n// src/embed/embed.ts\n\nasync function embed({\n model: modelArg,\n value,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_telemetry: telemetry\n}) {\n const model = resolveEmbeddingModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.withUserAgentSuffix)(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { maxRetries }\n });\n const tracer = getTracer(telemetry);\n return recordSpan({\n name: \"ai.embed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.embed\", telemetry }),\n ...baseTelemetryAttributes,\n \"ai.value\": { input: () => JSON.stringify(value) }\n }\n }),\n tracer,\n fn: async (span) => {\n const { embedding, usage, warnings, response, providerMetadata } = await retry(\n () => (\n // nested spans to align with the embedMany telemetry data:\n recordSpan({\n name: \"ai.embed.doEmbed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.embed.doEmbed\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": { input: () => [JSON.stringify(value)] }\n }\n }),\n tracer,\n fn: async (doEmbedSpan) => {\n var _a21;\n const modelResponse = await model.doEmbed({\n values: [value],\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embedding2 = modelResponse.embeddings[0];\n const usage2 = (_a21 = modelResponse.usage) != null ? _a21 : { tokens: NaN };\n doEmbedSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => modelResponse.embeddings.map(\n (embedding3) => JSON.stringify(embedding3)\n )\n },\n \"ai.usage.tokens\": usage2.tokens\n }\n })\n );\n return {\n embedding: embedding2,\n usage: usage2,\n warnings: modelResponse.warnings,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n }\n })\n )\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embedding\": { output: () => JSON.stringify(embedding) },\n \"ai.usage.tokens\": usage.tokens\n }\n })\n );\n logWarnings({ warnings, provider: model.provider, model: model.modelId });\n return new DefaultEmbedResult({\n value,\n embedding,\n usage,\n warnings,\n providerMetadata,\n response\n });\n }\n });\n}\nvar DefaultEmbedResult = class {\n constructor(options) {\n this.value = options.value;\n this.embedding = options.embedding;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n }\n};\n\n// src/embed/embed-many.ts\n\n\n// src/util/split-array.ts\nfunction splitArray(array2, chunkSize) {\n if (chunkSize <= 0) {\n throw new Error(\"chunkSize must be greater than 0\");\n }\n const result = [];\n for (let i = 0; i < array2.length; i += chunkSize) {\n result.push(array2.slice(i, i + chunkSize));\n }\n return result;\n}\n\n// src/embed/embed-many.ts\nasync function embedMany({\n model: modelArg,\n values,\n maxParallelCalls = Infinity,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n providerOptions,\n experimental_telemetry: telemetry\n}) {\n const model = resolveEmbeddingModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.withUserAgentSuffix)(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { maxRetries }\n });\n const tracer = getTracer(telemetry);\n return recordSpan({\n name: \"ai.embedMany\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.embedMany\", telemetry }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": {\n input: () => values.map((value) => JSON.stringify(value))\n }\n }\n }),\n tracer,\n fn: async (span) => {\n var _a21;\n const [maxEmbeddingsPerCall, supportsParallelCalls] = await Promise.all([\n model.maxEmbeddingsPerCall,\n model.supportsParallelCalls\n ]);\n if (maxEmbeddingsPerCall == null || maxEmbeddingsPerCall === Infinity) {\n const { embeddings: embeddings2, usage, warnings: warnings2, response, providerMetadata: providerMetadata2 } = await retry(() => {\n return recordSpan({\n name: \"ai.embedMany.doEmbed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.embedMany.doEmbed\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": {\n input: () => values.map((value) => JSON.stringify(value))\n }\n }\n }),\n tracer,\n fn: async (doEmbedSpan) => {\n var _a22;\n const modelResponse = await model.doEmbed({\n values,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embeddings3 = modelResponse.embeddings;\n const usage2 = (_a22 = modelResponse.usage) != null ? _a22 : { tokens: NaN };\n doEmbedSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings3.map(\n (embedding) => JSON.stringify(embedding)\n )\n },\n \"ai.usage.tokens\": usage2.tokens\n }\n })\n );\n return {\n embeddings: embeddings3,\n usage: usage2,\n warnings: modelResponse.warnings,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n }\n });\n });\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings2.map((embedding) => JSON.stringify(embedding))\n },\n \"ai.usage.tokens\": usage.tokens\n }\n })\n );\n logWarnings({\n warnings: warnings2,\n provider: model.provider,\n model: model.modelId\n });\n return new DefaultEmbedManyResult({\n values,\n embeddings: embeddings2,\n usage,\n warnings: warnings2,\n providerMetadata: providerMetadata2,\n responses: [response]\n });\n }\n const valueChunks = splitArray(values, maxEmbeddingsPerCall);\n const embeddings = [];\n const warnings = [];\n const responses = [];\n let tokens = 0;\n let providerMetadata;\n const parallelChunks = splitArray(\n valueChunks,\n supportsParallelCalls ? maxParallelCalls : 1\n );\n for (const parallelChunk of parallelChunks) {\n const results = await Promise.all(\n parallelChunk.map((chunk) => {\n return retry(() => {\n return recordSpan({\n name: \"ai.embedMany.doEmbed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.embedMany.doEmbed\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": {\n input: () => chunk.map((value) => JSON.stringify(value))\n }\n }\n }),\n tracer,\n fn: async (doEmbedSpan) => {\n var _a22;\n const modelResponse = await model.doEmbed({\n values: chunk,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embeddings2 = modelResponse.embeddings;\n const usage = (_a22 = modelResponse.usage) != null ? _a22 : { tokens: NaN };\n doEmbedSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings2.map(\n (embedding) => JSON.stringify(embedding)\n )\n },\n \"ai.usage.tokens\": usage.tokens\n }\n })\n );\n return {\n embeddings: embeddings2,\n usage,\n warnings: modelResponse.warnings,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n }\n });\n });\n })\n );\n for (const result of results) {\n embeddings.push(...result.embeddings);\n warnings.push(...result.warnings);\n responses.push(result.response);\n tokens += result.usage.tokens;\n if (result.providerMetadata) {\n if (!providerMetadata) {\n providerMetadata = { ...result.providerMetadata };\n } else {\n for (const [providerName, metadata] of Object.entries(\n result.providerMetadata\n )) {\n providerMetadata[providerName] = {\n ...(_a21 = providerMetadata[providerName]) != null ? _a21 : {},\n ...metadata\n };\n }\n }\n }\n }\n }\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings.map((embedding) => JSON.stringify(embedding))\n },\n \"ai.usage.tokens\": tokens\n }\n })\n );\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n return new DefaultEmbedManyResult({\n values,\n embeddings,\n usage: { tokens },\n warnings,\n providerMetadata,\n responses\n });\n }\n });\n}\nvar DefaultEmbedManyResult = class {\n constructor(options) {\n this.values = options.values;\n this.embeddings = options.embeddings;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.responses = options.responses;\n }\n};\n\n// src/generate-image/generate-image.ts\n\nasync function generateImage({\n model: modelArg,\n prompt: promptArg,\n n = 1,\n maxImagesPerCall,\n size,\n aspectRatio,\n seed,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers\n}) {\n var _a21, _b;\n const model = resolveImageModel(modelArg);\n const headersWithUserAgent = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.withUserAgentSuffix)(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const maxImagesPerCallWithDefault = (_a21 = maxImagesPerCall != null ? maxImagesPerCall : await invokeModelMaxImagesPerCall(model)) != null ? _a21 : 1;\n const callCount = Math.ceil(n / maxImagesPerCallWithDefault);\n const callImageCounts = Array.from({ length: callCount }, (_, i) => {\n if (i < callCount - 1) {\n return maxImagesPerCallWithDefault;\n }\n const remainder = n % maxImagesPerCallWithDefault;\n return remainder === 0 ? maxImagesPerCallWithDefault : remainder;\n });\n const results = await Promise.all(\n callImageCounts.map(\n async (callImageCount) => retry(() => {\n const { prompt, files, mask } = normalizePrompt(promptArg);\n return model.doGenerate({\n prompt,\n files,\n mask,\n n: callImageCount,\n abortSignal,\n headers: headersWithUserAgent,\n size,\n aspectRatio,\n seed,\n providerOptions: providerOptions != null ? providerOptions : {}\n });\n })\n )\n );\n const images = [];\n const warnings = [];\n const responses = [];\n const providerMetadata = {};\n let totalUsage = {\n inputTokens: void 0,\n outputTokens: void 0,\n totalTokens: void 0\n };\n for (const result of results) {\n images.push(\n ...result.images.map(\n (image) => {\n var _a22;\n return new DefaultGeneratedFile({\n data: image,\n mediaType: (_a22 = detectMediaType({\n data: image,\n signatures: imageMediaTypeSignatures\n })) != null ? _a22 : \"image/png\"\n });\n }\n )\n );\n warnings.push(...result.warnings);\n if (result.usage != null) {\n totalUsage = addImageModelUsage(totalUsage, result.usage);\n }\n if (result.providerMetadata) {\n for (const [providerName, metadata] of Object.entries(result.providerMetadata)) {\n if (providerName === \"gateway\") {\n const currentEntry = providerMetadata[providerName];\n if (currentEntry != null && typeof currentEntry === \"object\") {\n providerMetadata[providerName] = {\n ...currentEntry,\n ...metadata\n };\n } else {\n providerMetadata[providerName] = metadata;\n }\n const imagesValue = providerMetadata[providerName].images;\n if (Array.isArray(imagesValue) && imagesValue.length === 0) {\n delete providerMetadata[providerName].images;\n }\n } else {\n (_b = providerMetadata[providerName]) != null ? _b : providerMetadata[providerName] = { images: [] };\n providerMetadata[providerName].images.push(\n ...result.providerMetadata[providerName].images\n );\n }\n }\n }\n responses.push(result.response);\n }\n logWarnings({ warnings, provider: model.provider, model: model.modelId });\n if (!images.length) {\n throw new NoImageGeneratedError({ responses });\n }\n return new DefaultGenerateImageResult({\n images,\n warnings,\n responses,\n providerMetadata,\n usage: totalUsage\n });\n}\nvar DefaultGenerateImageResult = class {\n constructor(options) {\n this.images = options.images;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = options.providerMetadata;\n this.usage = options.usage;\n }\n get image() {\n return this.images[0];\n }\n};\nasync function invokeModelMaxImagesPerCall(model) {\n const isFunction = model.maxImagesPerCall instanceof Function;\n if (!isFunction) {\n return model.maxImagesPerCall;\n }\n return model.maxImagesPerCall({\n modelId: model.modelId\n });\n}\nfunction normalizePrompt(prompt) {\n if (typeof prompt === \"string\") {\n return { prompt, files: void 0, mask: void 0 };\n }\n return {\n prompt: prompt.text,\n files: prompt.images.map(toImageModelV3File),\n mask: prompt.mask ? toImageModelV3File(prompt.mask) : void 0\n };\n}\nfunction toImageModelV3File(dataContent) {\n if (typeof dataContent === \"string\" && dataContent.startsWith(\"http\")) {\n return {\n type: \"url\",\n url: dataContent\n };\n }\n if (typeof dataContent === \"string\" && dataContent.startsWith(\"data:\")) {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(dataContent);\n if (base64Content != null) {\n const uint8Data2 = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.convertBase64ToUint8Array)(base64Content);\n return {\n type: \"file\",\n data: uint8Data2,\n mediaType: dataUrlMediaType || detectMediaType({\n data: uint8Data2,\n signatures: imageMediaTypeSignatures\n }) || \"image/png\"\n };\n }\n }\n const uint8Data = convertDataContentToUint8Array(dataContent);\n return {\n type: \"file\",\n data: uint8Data,\n mediaType: detectMediaType({\n data: uint8Data,\n signatures: imageMediaTypeSignatures\n }) || \"image/png\"\n };\n}\n\n// src/generate-image/index.ts\nvar experimental_generateImage = generateImage;\n\n// src/generate-object/generate-object.ts\n\n\n// src/generate-object/output-strategy.ts\n\n\nvar noSchemaOutputStrategy = {\n type: \"no-schema\",\n jsonSchema: async () => void 0,\n async validatePartialResult({ value, textDelta }) {\n return { success: true, value: { partial: value, textDelta } };\n },\n async validateFinalResult(value, context2) {\n return value === void 0 ? {\n success: false,\n error: new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n text: context2.text,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n })\n } : { success: true, value };\n },\n createElementStream() {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.UnsupportedFunctionalityError({\n functionality: \"element streams in no-schema mode\"\n });\n }\n};\nvar objectOutputStrategy = (schema) => ({\n type: \"object\",\n jsonSchema: async () => await schema.jsonSchema,\n async validatePartialResult({ value, textDelta }) {\n return {\n success: true,\n value: {\n // Note: currently no validation of partial results:\n partial: value,\n textDelta\n }\n };\n },\n async validateFinalResult(value) {\n return (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeValidateTypes)({ value, schema });\n },\n createElementStream() {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.UnsupportedFunctionalityError({\n functionality: \"element streams in object mode\"\n });\n }\n});\nvar arrayOutputStrategy = (schema) => {\n return {\n type: \"array\",\n // wrap in object that contains array of elements, since most LLMs will not\n // be able to generate an array directly:\n // possible future optimization: use arrays directly when model supports grammar-guided generation\n jsonSchema: async () => {\n const { $schema, ...itemSchema } = await schema.jsonSchema;\n return {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n elements: { type: \"array\", items: itemSchema }\n },\n required: [\"elements\"],\n additionalProperties: false\n };\n },\n async validatePartialResult({\n value,\n latestObject,\n isFirstDelta,\n isFinalDelta\n }) {\n var _a21;\n if (!(0,_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.isJSONObject)(value) || !(0,_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.isJSONArray)(value.elements)) {\n return {\n success: false,\n error: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError({\n value,\n cause: \"value must be an object that contains an array of elements\"\n })\n };\n }\n const inputArray = value.elements;\n const resultArray = [];\n for (let i = 0; i < inputArray.length; i++) {\n const element = inputArray[i];\n const result = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeValidateTypes)({ value: element, schema });\n if (i === inputArray.length - 1 && !isFinalDelta) {\n continue;\n }\n if (!result.success) {\n return result;\n }\n resultArray.push(result.value);\n }\n const publishedElementCount = (_a21 = latestObject == null ? void 0 : latestObject.length) != null ? _a21 : 0;\n let textDelta = \"\";\n if (isFirstDelta) {\n textDelta += \"[\";\n }\n if (publishedElementCount > 0) {\n textDelta += \",\";\n }\n textDelta += resultArray.slice(publishedElementCount).map((element) => JSON.stringify(element)).join(\",\");\n if (isFinalDelta) {\n textDelta += \"]\";\n }\n return {\n success: true,\n value: {\n partial: resultArray,\n textDelta\n }\n };\n },\n async validateFinalResult(value) {\n if (!(0,_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.isJSONObject)(value) || !(0,_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.isJSONArray)(value.elements)) {\n return {\n success: false,\n error: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError({\n value,\n cause: \"value must be an object that contains an array of elements\"\n })\n };\n }\n const inputArray = value.elements;\n for (const element of inputArray) {\n const result = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeValidateTypes)({ value: element, schema });\n if (!result.success) {\n return result;\n }\n }\n return { success: true, value: inputArray };\n },\n createElementStream(originalStream) {\n let publishedElements = 0;\n return createAsyncIterableStream(\n originalStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"object\": {\n const array2 = chunk.object;\n for (; publishedElements < array2.length; publishedElements++) {\n controller.enqueue(array2[publishedElements]);\n }\n break;\n }\n case \"text-delta\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(\n `Unsupported chunk type: ${_exhaustiveCheck}`\n );\n }\n }\n }\n })\n )\n );\n }\n };\n};\nvar enumOutputStrategy = (enumValues) => {\n return {\n type: \"enum\",\n // wrap in object that contains result, since most LLMs will not\n // be able to generate an enum value directly:\n // possible future optimization: use enums directly when model supports top-level enums\n jsonSchema: async () => ({\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n result: { type: \"string\", enum: enumValues }\n },\n required: [\"result\"],\n additionalProperties: false\n }),\n async validateFinalResult(value) {\n if (!(0,_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.isJSONObject)(value) || typeof value.result !== \"string\") {\n return {\n success: false,\n error: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError({\n value,\n cause: 'value must be an object that contains a string in the \"result\" property.'\n })\n };\n }\n const result = value.result;\n return enumValues.includes(result) ? { success: true, value: result } : {\n success: false,\n error: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError({\n value,\n cause: \"value must be a string in the enum\"\n })\n };\n },\n async validatePartialResult({ value, textDelta }) {\n if (!(0,_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.isJSONObject)(value) || typeof value.result !== \"string\") {\n return {\n success: false,\n error: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError({\n value,\n cause: 'value must be an object that contains a string in the \"result\" property.'\n })\n };\n }\n const result = value.result;\n const possibleEnumValues = enumValues.filter(\n (enumValue) => enumValue.startsWith(result)\n );\n if (value.result.length === 0 || possibleEnumValues.length === 0) {\n return {\n success: false,\n error: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError({\n value,\n cause: \"value must be a string in the enum\"\n })\n };\n }\n return {\n success: true,\n value: {\n partial: possibleEnumValues.length > 1 ? result : possibleEnumValues[0],\n textDelta\n }\n };\n },\n createElementStream() {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.UnsupportedFunctionalityError({\n functionality: \"element streams in enum mode\"\n });\n }\n };\n};\nfunction getOutputStrategy({\n output,\n schema,\n enumValues\n}) {\n switch (output) {\n case \"object\":\n return objectOutputStrategy((0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.asSchema)(schema));\n case \"array\":\n return arrayOutputStrategy((0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.asSchema)(schema));\n case \"enum\":\n return enumOutputStrategy(enumValues);\n case \"no-schema\":\n return noSchemaOutputStrategy;\n default: {\n const _exhaustiveCheck = output;\n throw new Error(`Unsupported output: ${_exhaustiveCheck}`);\n }\n }\n}\n\n// src/generate-object/parse-and-validate-object-result.ts\n\n\nasync function parseAndValidateObjectResult(result, outputStrategy, context2) {\n const parseResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.safeParseJSON)({ text: result });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: result,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const validationResult = await outputStrategy.validateFinalResult(\n parseResult.value,\n {\n text: result,\n response: context2.response,\n usage: context2.usage\n }\n );\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: result,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return validationResult.value;\n}\nasync function parseAndValidateObjectResultWithRepair(result, outputStrategy, repairText, context2) {\n try {\n return await parseAndValidateObjectResult(result, outputStrategy, context2);\n } catch (error) {\n if (repairText != null && NoObjectGeneratedError.isInstance(error) && (_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.JSONParseError.isInstance(error.cause) || _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError.isInstance(error.cause))) {\n const repairedText = await repairText({\n text: result,\n error: error.cause\n });\n if (repairedText === null) {\n throw error;\n }\n return await parseAndValidateObjectResult(\n repairedText,\n outputStrategy,\n context2\n );\n }\n throw error;\n }\n}\n\n// src/generate-object/validate-object-generation-input.ts\nfunction validateObjectGenerationInput({\n output,\n schema,\n schemaName,\n schemaDescription,\n enumValues\n}) {\n if (output != null && output !== \"object\" && output !== \"array\" && output !== \"enum\" && output !== \"no-schema\") {\n throw new InvalidArgumentError({\n parameter: \"output\",\n value: output,\n message: \"Invalid output type.\"\n });\n }\n if (output === \"no-schema\") {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is not supported for no-schema output.\"\n });\n }\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaDescription\",\n value: schemaDescription,\n message: \"Schema description is not supported for no-schema output.\"\n });\n }\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaName\",\n value: schemaName,\n message: \"Schema name is not supported for no-schema output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for no-schema output.\"\n });\n }\n }\n if (output === \"object\") {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is required for object output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for object output.\"\n });\n }\n }\n if (output === \"array\") {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Element schema is required for array output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for array output.\"\n });\n }\n }\n if (output === \"enum\") {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is not supported for enum output.\"\n });\n }\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaDescription\",\n value: schemaDescription,\n message: \"Schema description is not supported for enum output.\"\n });\n }\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaName\",\n value: schemaName,\n message: \"Schema name is not supported for enum output.\"\n });\n }\n if (enumValues == null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are required for enum output.\"\n });\n }\n for (const value of enumValues) {\n if (typeof value !== \"string\") {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value,\n message: \"Enum values must be strings.\"\n });\n }\n }\n }\n}\n\n// src/generate-object/generate-object.ts\nvar originalGenerateId3 = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.createIdGenerator)({ prefix: \"aiobj\", size: 24 });\nasync function generateObject(options) {\n const {\n model: modelArg,\n output = \"object\",\n system,\n prompt,\n messages,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry: telemetry,\n experimental_download: download2,\n providerOptions,\n _internal: {\n generateId: generateId2 = originalGenerateId3,\n currentDate = () => /* @__PURE__ */ new Date()\n } = {},\n ...settings\n } = options;\n const model = resolveLanguageModel(modelArg);\n const enumValues = \"enum\" in options ? options.enum : void 0;\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName\n } = \"schema\" in options ? options : {};\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues\n });\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues\n });\n const callSettings = prepareCallSettings(settings);\n const headersWithUserAgent = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.withUserAgentSuffix)(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { ...callSettings, maxRetries }\n });\n const tracer = getTracer(telemetry);\n const jsonSchema2 = await outputStrategy.jsonSchema();\n try {\n return await recordSpan({\n name: \"ai.generateObject\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateObject\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n },\n \"ai.schema\": jsonSchema2 != null ? { input: () => JSON.stringify(jsonSchema2) } : void 0,\n \"ai.schema.name\": schemaName,\n \"ai.schema.description\": schemaDescription,\n \"ai.settings.output\": outputStrategy.type\n }\n }),\n tracer,\n fn: async (span) => {\n var _a21;\n let result;\n let finishReason;\n let usage;\n let warnings;\n let response;\n let request;\n let resultProviderMetadata;\n let reasoning;\n const standardizedPrompt = await standardizePrompt({\n system,\n prompt,\n messages\n });\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n download: download2\n });\n const generateResult = await retry(\n () => recordSpan({\n name: \"ai.generateObject.doGenerate\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateObject.doGenerate\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(promptMessages)\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": model.provider,\n \"gen_ai.request.model\": model.modelId,\n \"gen_ai.request.frequency_penalty\": callSettings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": callSettings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": callSettings.presencePenalty,\n \"gen_ai.request.temperature\": callSettings.temperature,\n \"gen_ai.request.top_k\": callSettings.topK,\n \"gen_ai.request.top_p\": callSettings.topP\n }\n }),\n tracer,\n fn: async (span2) => {\n var _a22, _b, _c, _d, _e, _f, _g, _h;\n const result2 = await model.doGenerate({\n responseFormat: {\n type: \"json\",\n schema: jsonSchema2,\n name: schemaName,\n description: schemaDescription\n },\n ...prepareCallSettings(settings),\n prompt: promptMessages,\n providerOptions,\n abortSignal,\n headers: headersWithUserAgent\n });\n const responseData = {\n id: (_b = (_a22 = result2.response) == null ? void 0 : _a22.id) != null ? _b : generateId2(),\n timestamp: (_d = (_c = result2.response) == null ? void 0 : _c.timestamp) != null ? _d : currentDate(),\n modelId: (_f = (_e = result2.response) == null ? void 0 : _e.modelId) != null ? _f : model.modelId,\n headers: (_g = result2.response) == null ? void 0 : _g.headers,\n body: (_h = result2.response) == null ? void 0 : _h.body\n };\n const text2 = extractTextContent(result2.content);\n const reasoning2 = extractReasoningContent(result2.content);\n if (text2 === void 0) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: the model did not return a response.\",\n response: responseData,\n usage: asLanguageModelUsage(result2.usage),\n finishReason: result2.finishReason.unified\n });\n }\n span2.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": result2.finishReason.unified,\n \"ai.response.object\": { output: () => text2 },\n \"ai.response.id\": responseData.id,\n \"ai.response.model\": responseData.modelId,\n \"ai.response.timestamp\": responseData.timestamp.toISOString(),\n \"ai.response.providerMetadata\": JSON.stringify(\n result2.providerMetadata\n ),\n // TODO rename telemetry attributes to inputTokens and outputTokens\n \"ai.usage.promptTokens\": result2.usage.inputTokens.total,\n \"ai.usage.completionTokens\": result2.usage.outputTokens.total,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [\n result2.finishReason.unified\n ],\n \"gen_ai.response.id\": responseData.id,\n \"gen_ai.response.model\": responseData.modelId,\n \"gen_ai.usage.input_tokens\": result2.usage.inputTokens.total,\n \"gen_ai.usage.output_tokens\": result2.usage.outputTokens.total\n }\n })\n );\n return {\n ...result2,\n objectText: text2,\n reasoning: reasoning2,\n responseData\n };\n }\n })\n );\n result = generateResult.objectText;\n finishReason = generateResult.finishReason.unified;\n usage = asLanguageModelUsage(generateResult.usage);\n warnings = generateResult.warnings;\n resultProviderMetadata = generateResult.providerMetadata;\n request = (_a21 = generateResult.request) != null ? _a21 : {};\n response = generateResult.responseData;\n reasoning = generateResult.reasoning;\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n const object2 = await parseAndValidateObjectResultWithRepair(\n result,\n outputStrategy,\n repairText,\n {\n response,\n usage,\n finishReason\n }\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": finishReason,\n \"ai.response.object\": {\n output: () => JSON.stringify(object2)\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n resultProviderMetadata\n ),\n // TODO rename telemetry attributes to inputTokens and outputTokens\n \"ai.usage.promptTokens\": usage.inputTokens,\n \"ai.usage.completionTokens\": usage.outputTokens\n }\n })\n );\n return new DefaultGenerateObjectResult({\n object: object2,\n reasoning,\n finishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata: resultProviderMetadata\n });\n }\n });\n } catch (error) {\n throw wrapGatewayError(error);\n }\n}\nvar DefaultGenerateObjectResult = class {\n constructor(options) {\n this.object = options.object;\n this.finishReason = options.finishReason;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n this.request = options.request;\n this.reasoning = options.reasoning;\n }\n toJsonResponse(init) {\n var _a21;\n return new Response(JSON.stringify(this.object), {\n status: (_a21 = init == null ? void 0 : init.status) != null ? _a21 : 200,\n headers: prepareHeaders(init == null ? void 0 : init.headers, {\n \"content-type\": \"application/json; charset=utf-8\"\n })\n });\n }\n};\n\n// src/generate-object/stream-object.ts\n\n\n// src/util/cosine-similarity.ts\nfunction cosineSimilarity(vector1, vector2) {\n if (vector1.length !== vector2.length) {\n throw new InvalidArgumentError({\n parameter: \"vector1,vector2\",\n value: { vector1Length: vector1.length, vector2Length: vector2.length },\n message: `Vectors must have the same length`\n });\n }\n const n = vector1.length;\n if (n === 0) {\n return 0;\n }\n let magnitudeSquared1 = 0;\n let magnitudeSquared2 = 0;\n let dotProduct = 0;\n for (let i = 0; i < n; i++) {\n const value1 = vector1[i];\n const value2 = vector2[i];\n magnitudeSquared1 += value1 * value1;\n magnitudeSquared2 += value2 * value2;\n dotProduct += value1 * value2;\n }\n return magnitudeSquared1 === 0 || magnitudeSquared2 === 0 ? 0 : dotProduct / (Math.sqrt(magnitudeSquared1) * Math.sqrt(magnitudeSquared2));\n}\n\n// src/util/download/create-download.ts\nfunction createDownload(options) {\n return ({ url, abortSignal }) => download({ url, maxBytes: options == null ? void 0 : options.maxBytes, abortSignal });\n}\n\n// src/util/data-url.ts\nfunction getTextFromDataUrl(dataUrl) {\n const [header, base64Content] = dataUrl.split(\",\");\n const mediaType = header.split(\";\")[0].split(\":\")[1];\n if (mediaType == null || base64Content == null) {\n throw new Error(\"Invalid data URL format\");\n }\n try {\n return window.atob(base64Content);\n } catch (error) {\n throw new Error(`Error decoding data URL`);\n }\n}\n\n// src/util/is-deep-equal-data.ts\nfunction isDeepEqualData(obj1, obj2) {\n if (obj1 === obj2)\n return true;\n if (obj1 == null || obj2 == null)\n return false;\n if (typeof obj1 !== \"object\" && typeof obj2 !== \"object\")\n return obj1 === obj2;\n if (obj1.constructor !== obj2.constructor)\n return false;\n if (obj1 instanceof Date && obj2 instanceof Date) {\n return obj1.getTime() === obj2.getTime();\n }\n if (Array.isArray(obj1)) {\n if (obj1.length !== obj2.length)\n return false;\n for (let i = 0; i < obj1.length; i++) {\n if (!isDeepEqualData(obj1[i], obj2[i]))\n return false;\n }\n return true;\n }\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length)\n return false;\n for (const key of keys1) {\n if (!keys2.includes(key))\n return false;\n if (!isDeepEqualData(obj1[key], obj2[key]))\n return false;\n }\n return true;\n}\n\n// src/util/serial-job-executor.ts\nvar SerialJobExecutor = class {\n constructor() {\n this.queue = [];\n this.isProcessing = false;\n }\n async processQueue() {\n if (this.isProcessing) {\n return;\n }\n this.isProcessing = true;\n while (this.queue.length > 0) {\n await this.queue[0]();\n this.queue.shift();\n }\n this.isProcessing = false;\n }\n async run(job) {\n return new Promise((resolve3, reject) => {\n this.queue.push(async () => {\n try {\n await job();\n resolve3();\n } catch (error) {\n reject(error);\n }\n });\n void this.processQueue();\n });\n }\n};\n\n// src/util/simulate-readable-stream.ts\n\nfunction simulateReadableStream({\n chunks,\n initialDelayInMs = 0,\n chunkDelayInMs = 0,\n _internal\n}) {\n var _a21;\n const delay2 = (_a21 = _internal == null ? void 0 : _internal.delay) != null ? _a21 : _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.delay;\n let index = 0;\n return new ReadableStream({\n async pull(controller) {\n if (index < chunks.length) {\n await delay2(index === 0 ? initialDelayInMs : chunkDelayInMs);\n controller.enqueue(chunks[index++]);\n } else {\n controller.close();\n }\n }\n });\n}\n\n// src/generate-object/stream-object.ts\nvar originalGenerateId4 = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.createIdGenerator)({ prefix: \"aiobj\", size: 24 });\nfunction streamObject(options) {\n const {\n model,\n output = \"object\",\n system,\n prompt,\n messages,\n maxRetries,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry: telemetry,\n experimental_download: download2,\n providerOptions,\n onError = ({ error }) => {\n console.error(error);\n },\n onFinish,\n _internal: {\n generateId: generateId2 = originalGenerateId4,\n currentDate = () => /* @__PURE__ */ new Date(),\n now: now2 = now\n } = {},\n ...settings\n } = options;\n const enumValues = \"enum\" in options && options.enum ? options.enum : void 0;\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName\n } = \"schema\" in options ? options : {};\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues\n });\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues\n });\n return new DefaultStreamObjectResult({\n model,\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal,\n outputStrategy,\n system,\n prompt,\n messages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onError,\n onFinish,\n download: download2,\n generateId: generateId2,\n currentDate,\n now: now2\n });\n}\nvar DefaultStreamObjectResult = class {\n constructor({\n model: modelArg,\n headers,\n telemetry,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n outputStrategy,\n system,\n prompt,\n messages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onError,\n onFinish,\n download: download2,\n generateId: generateId2,\n currentDate,\n now: now2\n }) {\n this._object = new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DelayedPromise();\n this._usage = new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DelayedPromise();\n this._providerMetadata = new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DelayedPromise();\n this._warnings = new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DelayedPromise();\n this._request = new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DelayedPromise();\n this._response = new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DelayedPromise();\n this._finishReason = new _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.DelayedPromise();\n const model = resolveLanguageModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const callSettings = prepareCallSettings(settings);\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries }\n });\n const tracer = getTracer(telemetry);\n const self = this;\n const stitchableStream = createStitchableStream();\n const eventProcessor = new TransformStream({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n if (chunk.type === \"error\") {\n onError({ error: wrapGatewayError(chunk.error) });\n }\n }\n });\n this.baseStream = stitchableStream.stream.pipeThrough(eventProcessor);\n recordSpan({\n name: \"ai.streamObject\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.streamObject\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n },\n \"ai.schema\": {\n input: async () => JSON.stringify(await outputStrategy.jsonSchema())\n },\n \"ai.schema.name\": schemaName,\n \"ai.schema.description\": schemaDescription,\n \"ai.settings.output\": outputStrategy.type\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (rootSpan) => {\n const standardizedPrompt = await standardizePrompt({\n system,\n prompt,\n messages\n });\n const callOptions = {\n responseFormat: {\n type: \"json\",\n schema: await outputStrategy.jsonSchema(),\n name: schemaName,\n description: schemaDescription\n },\n ...prepareCallSettings(settings),\n prompt: await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n download: download2\n }),\n providerOptions,\n abortSignal,\n headers,\n includeRawChunks: false\n };\n const transformer = {\n transform: (chunk, controller) => {\n switch (chunk.type) {\n case \"text-delta\":\n controller.enqueue(chunk.delta);\n break;\n case \"response-metadata\":\n case \"finish\":\n case \"error\":\n case \"stream-start\":\n controller.enqueue(chunk);\n break;\n }\n }\n };\n const {\n result: { stream, response, request },\n doStreamSpan,\n startTimestampMs\n } = await retry(\n () => recordSpan({\n name: \"ai.streamObject.doStream\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.streamObject.doStream\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(callOptions.prompt)\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": model.provider,\n \"gen_ai.request.model\": model.modelId,\n \"gen_ai.request.frequency_penalty\": callSettings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": callSettings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": callSettings.presencePenalty,\n \"gen_ai.request.temperature\": callSettings.temperature,\n \"gen_ai.request.top_k\": callSettings.topK,\n \"gen_ai.request.top_p\": callSettings.topP\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (doStreamSpan2) => ({\n startTimestampMs: now2(),\n doStreamSpan: doStreamSpan2,\n result: await model.doStream(callOptions)\n })\n })\n );\n self._request.resolve(request != null ? request : {});\n let warnings;\n let usage = createNullLanguageModelUsage();\n let finishReason;\n let providerMetadata;\n let object2;\n let error;\n let accumulatedText = \"\";\n let textDelta = \"\";\n let fullResponse = {\n id: generateId2(),\n timestamp: currentDate(),\n modelId: model.modelId\n };\n let latestObjectJson = void 0;\n let latestObject = void 0;\n let isFirstChunk = true;\n let isFirstDelta = true;\n const transformedStream = stream.pipeThrough(new TransformStream(transformer)).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n var _a21, _b, _c;\n if (typeof chunk === \"object\" && chunk.type === \"stream-start\") {\n warnings = chunk.warnings;\n return;\n }\n if (isFirstChunk) {\n const msToFirstChunk = now2() - startTimestampMs;\n isFirstChunk = false;\n doStreamSpan.addEvent(\"ai.stream.firstChunk\", {\n \"ai.stream.msToFirstChunk\": msToFirstChunk\n });\n doStreamSpan.setAttributes({\n \"ai.stream.msToFirstChunk\": msToFirstChunk\n });\n }\n if (typeof chunk === \"string\") {\n accumulatedText += chunk;\n textDelta += chunk;\n const { value: currentObjectJson, state: parseState } = await parsePartialJson(accumulatedText);\n if (currentObjectJson !== void 0 && !isDeepEqualData(latestObjectJson, currentObjectJson)) {\n const validationResult = await outputStrategy.validatePartialResult({\n value: currentObjectJson,\n textDelta,\n latestObject,\n isFirstDelta,\n isFinalDelta: parseState === \"successful-parse\"\n });\n if (validationResult.success && !isDeepEqualData(\n latestObject,\n validationResult.value.partial\n )) {\n latestObjectJson = currentObjectJson;\n latestObject = validationResult.value.partial;\n controller.enqueue({\n type: \"object\",\n object: latestObject\n });\n controller.enqueue({\n type: \"text-delta\",\n textDelta: validationResult.value.textDelta\n });\n textDelta = \"\";\n isFirstDelta = false;\n }\n }\n return;\n }\n switch (chunk.type) {\n case \"response-metadata\": {\n fullResponse = {\n id: (_a21 = chunk.id) != null ? _a21 : fullResponse.id,\n timestamp: (_b = chunk.timestamp) != null ? _b : fullResponse.timestamp,\n modelId: (_c = chunk.modelId) != null ? _c : fullResponse.modelId\n };\n break;\n }\n case \"finish\": {\n if (textDelta !== \"\") {\n controller.enqueue({ type: \"text-delta\", textDelta });\n }\n finishReason = chunk.finishReason.unified;\n usage = asLanguageModelUsage(chunk.usage);\n providerMetadata = chunk.providerMetadata;\n controller.enqueue({\n ...chunk,\n finishReason: chunk.finishReason.unified,\n usage,\n response: fullResponse\n });\n logWarnings({\n warnings: warnings != null ? warnings : [],\n provider: model.provider,\n model: model.modelId\n });\n self._usage.resolve(usage);\n self._providerMetadata.resolve(providerMetadata);\n self._warnings.resolve(warnings);\n self._response.resolve({\n ...fullResponse,\n headers: response == null ? void 0 : response.headers\n });\n self._finishReason.resolve(finishReason != null ? finishReason : \"other\");\n try {\n object2 = await parseAndValidateObjectResultWithRepair(\n accumulatedText,\n outputStrategy,\n repairText,\n {\n response: fullResponse,\n usage,\n finishReason\n }\n );\n self._object.resolve(object2);\n } catch (e) {\n error = e;\n self._object.reject(e);\n }\n break;\n }\n default: {\n controller.enqueue(chunk);\n break;\n }\n }\n },\n // invoke onFinish callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n try {\n const finalUsage = usage != null ? usage : {\n promptTokens: NaN,\n completionTokens: NaN,\n totalTokens: NaN\n };\n doStreamSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": finishReason,\n \"ai.response.object\": {\n output: () => JSON.stringify(object2)\n },\n \"ai.response.id\": fullResponse.id,\n \"ai.response.model\": fullResponse.modelId,\n \"ai.response.timestamp\": fullResponse.timestamp.toISOString(),\n \"ai.response.providerMetadata\": JSON.stringify(providerMetadata),\n \"ai.usage.inputTokens\": finalUsage.inputTokens,\n \"ai.usage.outputTokens\": finalUsage.outputTokens,\n \"ai.usage.totalTokens\": finalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": finalUsage.reasoningTokens,\n \"ai.usage.cachedInputTokens\": finalUsage.cachedInputTokens,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [finishReason],\n \"gen_ai.response.id\": fullResponse.id,\n \"gen_ai.response.model\": fullResponse.modelId,\n \"gen_ai.usage.input_tokens\": finalUsage.inputTokens,\n \"gen_ai.usage.output_tokens\": finalUsage.outputTokens\n }\n })\n );\n doStreamSpan.end();\n rootSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.usage.inputTokens\": finalUsage.inputTokens,\n \"ai.usage.outputTokens\": finalUsage.outputTokens,\n \"ai.usage.totalTokens\": finalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": finalUsage.reasoningTokens,\n \"ai.usage.cachedInputTokens\": finalUsage.cachedInputTokens,\n \"ai.response.object\": {\n output: () => JSON.stringify(object2)\n },\n \"ai.response.providerMetadata\": JSON.stringify(providerMetadata)\n }\n })\n );\n await (onFinish == null ? void 0 : onFinish({\n usage: finalUsage,\n object: object2,\n error,\n response: {\n ...fullResponse,\n headers: response == null ? void 0 : response.headers\n },\n warnings,\n providerMetadata\n }));\n } catch (error2) {\n controller.enqueue({ type: \"error\", error: error2 });\n } finally {\n rootSpan.end();\n }\n }\n })\n );\n stitchableStream.addStream(transformedStream);\n }\n }).catch((error) => {\n stitchableStream.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: \"error\", error });\n controller.close();\n }\n })\n );\n }).finally(() => {\n stitchableStream.close();\n });\n this.outputStrategy = outputStrategy;\n }\n get object() {\n return this._object.promise;\n }\n get usage() {\n return this._usage.promise;\n }\n get providerMetadata() {\n return this._providerMetadata.promise;\n }\n get warnings() {\n return this._warnings.promise;\n }\n get request() {\n return this._request.promise;\n }\n get response() {\n return this._response.promise;\n }\n get finishReason() {\n return this._finishReason.promise;\n }\n get partialObjectStream() {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"object\":\n controller.enqueue(chunk.object);\n break;\n case \"text-delta\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n }\n })\n )\n );\n }\n get elementStream() {\n return this.outputStrategy.createElementStream(this.baseStream);\n }\n get textStream() {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-delta\":\n controller.enqueue(chunk.textDelta);\n break;\n case \"object\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n }\n })\n )\n );\n }\n get fullStream() {\n return createAsyncIterableStream(this.baseStream);\n }\n pipeTextStreamToResponse(response, init) {\n pipeTextStreamToResponse({\n response,\n textStream: this.textStream,\n ...init\n });\n }\n toTextStreamResponse(init) {\n return createTextStreamResponse({\n textStream: this.textStream,\n ...init\n });\n }\n};\n\n// src/generate-speech/generate-speech.ts\n\n\n// src/generate-speech/generated-audio-file.ts\nvar DefaultGeneratedAudioFile = class extends DefaultGeneratedFile {\n constructor({\n data,\n mediaType\n }) {\n super({ data, mediaType });\n let format = \"mp3\";\n if (mediaType) {\n const mediaTypeParts = mediaType.split(\"/\");\n if (mediaTypeParts.length === 2) {\n if (mediaType !== \"audio/mpeg\") {\n format = mediaTypeParts[1];\n }\n }\n }\n if (!format) {\n throw new Error(\n \"Audio format must be provided or determinable from media type\"\n );\n }\n this.format = format;\n }\n};\n\n// src/generate-speech/generate-speech.ts\nasync function generateSpeech({\n model,\n text: text2,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers\n}) {\n var _a21;\n const resolvedModel = resolveSpeechModel(model);\n if (!resolvedModel) {\n throw new Error(\"Model could not be resolved\");\n }\n const headersWithUserAgent = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.withUserAgentSuffix)(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const result = await retry(\n () => resolvedModel.doGenerate({\n text: text2,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n })\n );\n if (!result.audio || result.audio.length === 0) {\n throw new NoSpeechGeneratedError({ responses: [result.response] });\n }\n logWarnings({\n warnings: result.warnings,\n provider: resolvedModel.provider,\n model: resolvedModel.modelId\n });\n return new DefaultSpeechResult({\n audio: new DefaultGeneratedAudioFile({\n data: result.audio,\n mediaType: (_a21 = detectMediaType({\n data: result.audio,\n signatures: audioMediaTypeSignatures\n })) != null ? _a21 : \"audio/mp3\"\n }),\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata\n });\n}\nvar DefaultSpeechResult = class {\n constructor(options) {\n var _a21;\n this.audio = options.audio;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = (_a21 = options.providerMetadata) != null ? _a21 : {};\n }\n};\n\n// src/generate-text/prune-messages.ts\nfunction pruneMessages({\n messages,\n reasoning = \"none\",\n toolCalls = [],\n emptyMessages = \"remove\"\n}) {\n if (reasoning === \"all\" || reasoning === \"before-last-message\") {\n messages = messages.map((message, messageIndex) => {\n if (message.role !== \"assistant\" || typeof message.content === \"string\" || reasoning === \"before-last-message\" && messageIndex === messages.length - 1) {\n return message;\n }\n return {\n ...message,\n content: message.content.filter((part) => part.type !== \"reasoning\")\n };\n });\n }\n if (toolCalls === \"none\") {\n toolCalls = [];\n } else if (toolCalls === \"all\") {\n toolCalls = [{ type: \"all\" }];\n } else if (toolCalls === \"before-last-message\") {\n toolCalls = [{ type: \"before-last-message\" }];\n } else if (typeof toolCalls === \"string\") {\n toolCalls = [{ type: toolCalls }];\n }\n for (const toolCall of toolCalls) {\n const keepLastMessagesCount = toolCall.type === \"all\" ? void 0 : toolCall.type === \"before-last-message\" ? 1 : Number(\n toolCall.type.slice(\"before-last-\".length).slice(0, -\"-messages\".length)\n );\n const keptToolCallIds = /* @__PURE__ */ new Set();\n const keptApprovalIds = /* @__PURE__ */ new Set();\n if (keepLastMessagesCount != null) {\n for (const message of messages.slice(-keepLastMessagesCount)) {\n if ((message.role === \"assistant\" || message.role === \"tool\") && typeof message.content !== \"string\") {\n for (const part of message.content) {\n if (part.type === \"tool-call\" || part.type === \"tool-result\") {\n keptToolCallIds.add(part.toolCallId);\n } else if (part.type === \"tool-approval-request\" || part.type === \"tool-approval-response\") {\n keptApprovalIds.add(part.approvalId);\n }\n }\n }\n }\n }\n messages = messages.map((message, messageIndex) => {\n if (message.role !== \"assistant\" && message.role !== \"tool\" || typeof message.content === \"string\" || keepLastMessagesCount && messageIndex >= messages.length - keepLastMessagesCount) {\n return message;\n }\n const toolCallIdToToolName = {};\n const approvalIdToToolName = {};\n return {\n ...message,\n content: message.content.filter((part) => {\n if (part.type !== \"tool-call\" && part.type !== \"tool-result\" && part.type !== \"tool-approval-request\" && part.type !== \"tool-approval-response\") {\n return true;\n }\n if (part.type === \"tool-call\") {\n toolCallIdToToolName[part.toolCallId] = part.toolName;\n } else if (part.type === \"tool-approval-request\") {\n approvalIdToToolName[part.approvalId] = toolCallIdToToolName[part.toolCallId];\n }\n if ((part.type === \"tool-call\" || part.type === \"tool-result\") && keptToolCallIds.has(part.toolCallId) || (part.type === \"tool-approval-request\" || part.type === \"tool-approval-response\") && keptApprovalIds.has(part.approvalId)) {\n return true;\n }\n return toolCall.tools != null && !toolCall.tools.includes(\n part.type === \"tool-call\" || part.type === \"tool-result\" ? part.toolName : approvalIdToToolName[part.approvalId]\n );\n })\n };\n });\n }\n if (emptyMessages === \"remove\") {\n messages = messages.filter((message) => message.content.length > 0);\n }\n return messages;\n}\n\n// src/generate-text/smooth-stream.ts\n\n\nvar CHUNKING_REGEXPS = {\n word: /\\S+\\s+/m,\n line: /\\n+/m\n};\nfunction smoothStream({\n delayInMs = 10,\n chunking = \"word\",\n _internal: { delay: delay2 = _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.delay } = {}\n} = {}) {\n let detectChunk;\n if (chunking != null && typeof chunking === \"object\" && \"segment\" in chunking && typeof chunking.segment === \"function\") {\n const segmenter = chunking;\n detectChunk = (buffer) => {\n if (buffer.length === 0)\n return null;\n const iterator = segmenter.segment(buffer)[Symbol.iterator]();\n const first = iterator.next().value;\n return (first == null ? void 0 : first.segment) || null;\n };\n } else if (typeof chunking === \"function\") {\n detectChunk = (buffer) => {\n const match = chunking(buffer);\n if (match == null) {\n return null;\n }\n if (!match.length) {\n throw new Error(`Chunking function must return a non-empty string.`);\n }\n if (!buffer.startsWith(match)) {\n throw new Error(\n `Chunking function must return a match that is a prefix of the buffer. Received: \"${match}\" expected to start with \"${buffer}\"`\n );\n }\n return match;\n };\n } else {\n const chunkingRegex = typeof chunking === \"string\" ? CHUNKING_REGEXPS[chunking] : chunking instanceof RegExp ? chunking : void 0;\n if (chunkingRegex == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.InvalidArgumentError({\n argument: \"chunking\",\n message: `Chunking must be \"word\", \"line\", a RegExp, an Intl.Segmenter, or a ChunkDetector function. Received: ${chunking}`\n });\n }\n detectChunk = (buffer) => {\n const match = chunkingRegex.exec(buffer);\n if (!match) {\n return null;\n }\n return buffer.slice(0, match.index) + (match == null ? void 0 : match[0]);\n };\n }\n return () => {\n let buffer = \"\";\n let id = \"\";\n let type = void 0;\n let providerMetadata = void 0;\n function flushBuffer(controller) {\n if (buffer.length > 0 && type !== void 0) {\n controller.enqueue({\n type,\n text: buffer,\n id,\n ...providerMetadata != null ? { providerMetadata } : {}\n });\n buffer = \"\";\n providerMetadata = void 0;\n }\n }\n return new TransformStream({\n async transform(chunk, controller) {\n if (chunk.type !== \"text-delta\" && chunk.type !== \"reasoning-delta\") {\n flushBuffer(controller);\n controller.enqueue(chunk);\n return;\n }\n if ((chunk.type !== type || chunk.id !== id) && buffer.length > 0) {\n flushBuffer(controller);\n }\n buffer += chunk.text;\n id = chunk.id;\n type = chunk.type;\n if (chunk.providerMetadata != null) {\n providerMetadata = chunk.providerMetadata;\n }\n let match;\n while ((match = detectChunk(buffer)) != null) {\n controller.enqueue({ type, text: match, id });\n buffer = buffer.slice(match.length);\n await delay2(delayInMs);\n }\n }\n });\n };\n}\n\n// src/generate-video/generate-video.ts\n\nvar defaultDownload = createDownload();\nasync function experimental_generateVideo({\n model: modelArg,\n prompt: promptArg,\n n = 1,\n maxVideosPerCall,\n aspectRatio,\n resolution,\n duration,\n fps,\n seed,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n download: downloadFn = defaultDownload\n}) {\n var _a21;\n const model = resolveVideoModel(modelArg);\n const headersWithUserAgent = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.withUserAgentSuffix)(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const { prompt, image } = normalizePrompt2(promptArg);\n const maxVideosPerCallWithDefault = (_a21 = maxVideosPerCall != null ? maxVideosPerCall : await invokeModelMaxVideosPerCall(model)) != null ? _a21 : 1;\n const callCount = Math.ceil(n / maxVideosPerCallWithDefault);\n const callVideoCounts = Array.from({ length: callCount }, (_, index) => {\n const remaining = n - index * maxVideosPerCallWithDefault;\n return Math.min(remaining, maxVideosPerCallWithDefault);\n });\n const results = await Promise.all(\n callVideoCounts.map(\n async (callVideoCount) => retry(\n () => model.doGenerate({\n prompt,\n n: callVideoCount,\n aspectRatio,\n resolution,\n duration,\n fps,\n seed,\n image,\n providerOptions: providerOptions != null ? providerOptions : {},\n headers: headersWithUserAgent,\n abortSignal\n })\n )\n )\n );\n const videos = [];\n const warnings = [];\n const responses = [];\n const providerMetadata = {};\n for (const result of results) {\n for (const videoData of result.videos) {\n switch (videoData.type) {\n case \"url\": {\n const { data, mediaType: downloadedMediaType } = await downloadFn({\n url: new URL(videoData.url),\n abortSignal\n });\n const isUsableMediaType = (type) => !!type && type !== \"application/octet-stream\";\n const mediaType = isUsableMediaType(videoData.mediaType) && videoData.mediaType || isUsableMediaType(downloadedMediaType) && downloadedMediaType || detectMediaType({\n data,\n signatures: videoMediaTypeSignatures\n }) || \"video/mp4\";\n videos.push(\n new DefaultGeneratedFile({\n data,\n mediaType\n })\n );\n break;\n }\n case \"base64\": {\n videos.push(\n new DefaultGeneratedFile({\n data: videoData.data,\n mediaType: videoData.mediaType || \"video/mp4\"\n })\n );\n break;\n }\n case \"binary\": {\n const mediaType = videoData.mediaType || detectMediaType({\n data: videoData.data,\n signatures: videoMediaTypeSignatures\n }) || \"video/mp4\";\n videos.push(\n new DefaultGeneratedFile({\n data: videoData.data,\n mediaType\n })\n );\n break;\n }\n }\n }\n warnings.push(...result.warnings);\n responses.push({\n timestamp: result.response.timestamp,\n modelId: result.response.modelId,\n headers: result.response.headers,\n providerMetadata: result.providerMetadata\n });\n if (result.providerMetadata != null) {\n for (const [providerName, metadata] of Object.entries(\n result.providerMetadata\n )) {\n const existingMetadata = providerMetadata[providerName];\n if (existingMetadata != null && typeof existingMetadata === \"object\") {\n providerMetadata[providerName] = {\n ...existingMetadata,\n ...metadata\n };\n if (\"videos\" in existingMetadata && Array.isArray(existingMetadata.videos) && \"videos\" in metadata && Array.isArray(metadata.videos)) {\n providerMetadata[providerName].videos = [\n ...existingMetadata.videos,\n ...metadata.videos\n ];\n }\n } else {\n providerMetadata[providerName] = metadata;\n }\n }\n }\n }\n if (videos.length === 0) {\n throw new NoVideoGeneratedError({ responses });\n }\n if (warnings.length > 0) {\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n }\n return {\n video: videos[0],\n videos,\n warnings,\n responses,\n providerMetadata\n };\n}\nfunction normalizePrompt2(promptArg) {\n var _a21, _b;\n if (typeof promptArg === \"string\") {\n return {\n prompt: promptArg,\n image: void 0\n };\n }\n let image;\n if (promptArg.image != null) {\n const dataContent = promptArg.image;\n if (typeof dataContent === \"string\") {\n if (dataContent.startsWith(\"http://\") || dataContent.startsWith(\"https://\")) {\n image = {\n type: \"url\",\n url: dataContent\n };\n } else if (dataContent.startsWith(\"data:\")) {\n const { mediaType, base64Content } = splitDataUrl(dataContent);\n image = {\n type: \"file\",\n mediaType: mediaType != null ? mediaType : \"image/png\",\n data: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.convertBase64ToUint8Array)(base64Content != null ? base64Content : \"\")\n };\n } else {\n const bytes = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.convertBase64ToUint8Array)(dataContent);\n const mediaType = (_a21 = detectMediaType({\n data: bytes,\n signatures: imageMediaTypeSignatures\n })) != null ? _a21 : \"image/png\";\n image = {\n type: \"file\",\n mediaType,\n data: bytes\n };\n }\n } else if (dataContent instanceof Uint8Array) {\n const mediaType = (_b = detectMediaType({\n data: dataContent,\n signatures: imageMediaTypeSignatures\n })) != null ? _b : \"image/png\";\n image = {\n type: \"file\",\n mediaType,\n data: dataContent\n };\n }\n }\n return {\n prompt: promptArg.text,\n image\n };\n}\nasync function invokeModelMaxVideosPerCall(model) {\n if (typeof model.maxVideosPerCall === \"function\") {\n return await model.maxVideosPerCall({ modelId: model.modelId });\n }\n return model.maxVideosPerCall;\n}\n\n// src/middleware/default-embedding-settings-middleware.ts\nfunction defaultEmbeddingSettingsMiddleware({\n settings\n}) {\n return {\n specificationVersion: \"v3\",\n transformParams: async ({ params }) => {\n return mergeObjects(settings, params);\n }\n };\n}\n\n// src/middleware/default-settings-middleware.ts\nfunction defaultSettingsMiddleware({\n settings\n}) {\n return {\n specificationVersion: \"v3\",\n transformParams: async ({ params }) => {\n return mergeObjects(settings, params);\n }\n };\n}\n\n// src/middleware/extract-json-middleware.ts\nfunction defaultTransform(text2) {\n return text2.replace(/^```(?:json)?\\s*\\n?/, \"\").replace(/\\n?```\\s*$/, \"\").trim();\n}\nfunction extractJsonMiddleware(options) {\n var _a21;\n const transform = (_a21 = options == null ? void 0 : options.transform) != null ? _a21 : defaultTransform;\n const hasCustomTransform = (options == null ? void 0 : options.transform) !== void 0;\n return {\n specificationVersion: \"v3\",\n wrapGenerate: async ({ doGenerate }) => {\n const { content, ...rest } = await doGenerate();\n const transformedContent = [];\n for (const part of content) {\n if (part.type !== \"text\") {\n transformedContent.push(part);\n continue;\n }\n transformedContent.push({\n ...part,\n text: transform(part.text)\n });\n }\n return { content: transformedContent, ...rest };\n },\n wrapStream: async ({ doStream }) => {\n const { stream, ...rest } = await doStream();\n const textBlocks = {};\n const SUFFIX_BUFFER_SIZE = 12;\n return {\n stream: stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n if (chunk.type === \"text-start\") {\n textBlocks[chunk.id] = {\n startEvent: chunk,\n // Custom transforms need to buffer all content\n phase: hasCustomTransform ? \"buffering\" : \"prefix\",\n buffer: \"\",\n prefixStripped: false\n };\n return;\n }\n if (chunk.type === \"text-delta\") {\n const block = textBlocks[chunk.id];\n if (!block) {\n controller.enqueue(chunk);\n return;\n }\n block.buffer += chunk.delta;\n if (block.phase === \"buffering\") {\n return;\n }\n if (block.phase === \"prefix\") {\n if (block.buffer.length > 0 && !block.buffer.startsWith(\"`\")) {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n } else if (block.buffer.startsWith(\"```\")) {\n if (block.buffer.includes(\"\\n\")) {\n const prefixMatch = block.buffer.match(/^```(?:json)?\\s*\\n/);\n if (prefixMatch) {\n block.buffer = block.buffer.slice(\n prefixMatch[0].length\n );\n block.prefixStripped = true;\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n } else {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n }\n }\n } else if (block.buffer.length >= 3 && !block.buffer.startsWith(\"```\")) {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n }\n }\n if (block.phase === \"streaming\" && block.buffer.length > SUFFIX_BUFFER_SIZE) {\n const toStream = block.buffer.slice(0, -SUFFIX_BUFFER_SIZE);\n block.buffer = block.buffer.slice(-SUFFIX_BUFFER_SIZE);\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n delta: toStream\n });\n }\n return;\n }\n if (chunk.type === \"text-end\") {\n const block = textBlocks[chunk.id];\n if (block) {\n if (block.phase === \"prefix\" || block.phase === \"buffering\") {\n controller.enqueue(block.startEvent);\n }\n let remaining = block.buffer;\n if (block.phase === \"buffering\") {\n remaining = transform(remaining);\n } else if (block.prefixStripped) {\n remaining = remaining.replace(/\\n?```\\s*$/, \"\").trimEnd();\n } else {\n remaining = transform(remaining);\n }\n if (remaining.length > 0) {\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n delta: remaining\n });\n }\n controller.enqueue(chunk);\n delete textBlocks[chunk.id];\n return;\n }\n }\n controller.enqueue(chunk);\n }\n })\n ),\n ...rest\n };\n }\n };\n}\n\n// src/util/get-potential-start-index.ts\nfunction getPotentialStartIndex(text2, searchedText) {\n if (searchedText.length === 0) {\n return null;\n }\n const directIndex = text2.indexOf(searchedText);\n if (directIndex !== -1) {\n return directIndex;\n }\n for (let i = text2.length - 1; i >= 0; i--) {\n const suffix = text2.substring(i);\n if (searchedText.startsWith(suffix)) {\n return i;\n }\n }\n return null;\n}\n\n// src/middleware/extract-reasoning-middleware.ts\nfunction extractReasoningMiddleware({\n tagName,\n separator = \"\\n\",\n startWithReasoning = false\n}) {\n const openingTag = `<${tagName}>`;\n const closingTag = `</${tagName}>`;\n return {\n specificationVersion: \"v3\",\n wrapGenerate: async ({ doGenerate }) => {\n const { content, ...rest } = await doGenerate();\n const transformedContent = [];\n for (const part of content) {\n if (part.type !== \"text\") {\n transformedContent.push(part);\n continue;\n }\n const text2 = startWithReasoning ? openingTag + part.text : part.text;\n const regexp = new RegExp(`${openingTag}(.*?)${closingTag}`, \"gs\");\n const matches = Array.from(text2.matchAll(regexp));\n if (!matches.length) {\n transformedContent.push(part);\n continue;\n }\n const reasoningText = matches.map((match) => match[1]).join(separator);\n let textWithoutReasoning = text2;\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i];\n const beforeMatch = textWithoutReasoning.slice(0, match.index);\n const afterMatch = textWithoutReasoning.slice(\n match.index + match[0].length\n );\n textWithoutReasoning = beforeMatch + (beforeMatch.length > 0 && afterMatch.length > 0 ? separator : \"\") + afterMatch;\n }\n transformedContent.push({\n type: \"reasoning\",\n text: reasoningText\n });\n transformedContent.push({\n type: \"text\",\n text: textWithoutReasoning\n });\n }\n return { content: transformedContent, ...rest };\n },\n wrapStream: async ({ doStream }) => {\n const { stream, ...rest } = await doStream();\n const reasoningExtractions = {};\n let delayedTextStart;\n return {\n stream: stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n if (chunk.type === \"text-start\") {\n delayedTextStart = chunk;\n return;\n }\n if (chunk.type === \"text-end\" && delayedTextStart) {\n controller.enqueue(delayedTextStart);\n delayedTextStart = void 0;\n }\n if (chunk.type !== \"text-delta\") {\n controller.enqueue(chunk);\n return;\n }\n if (reasoningExtractions[chunk.id] == null) {\n reasoningExtractions[chunk.id] = {\n isFirstReasoning: true,\n isFirstText: true,\n afterSwitch: false,\n isReasoning: startWithReasoning,\n buffer: \"\",\n idCounter: 0,\n textId: chunk.id\n };\n }\n const activeExtraction = reasoningExtractions[chunk.id];\n activeExtraction.buffer += chunk.delta;\n function publish(text2) {\n if (text2.length > 0) {\n const prefix = activeExtraction.afterSwitch && (activeExtraction.isReasoning ? !activeExtraction.isFirstReasoning : !activeExtraction.isFirstText) ? separator : \"\";\n if (activeExtraction.isReasoning && (activeExtraction.afterSwitch || activeExtraction.isFirstReasoning)) {\n controller.enqueue({\n type: \"reasoning-start\",\n id: `reasoning-${activeExtraction.idCounter}`\n });\n }\n if (activeExtraction.isReasoning) {\n controller.enqueue({\n type: \"reasoning-delta\",\n delta: prefix + text2,\n id: `reasoning-${activeExtraction.idCounter}`\n });\n } else {\n if (delayedTextStart) {\n controller.enqueue(delayedTextStart);\n delayedTextStart = void 0;\n }\n controller.enqueue({\n type: \"text-delta\",\n delta: prefix + text2,\n id: activeExtraction.textId\n });\n }\n activeExtraction.afterSwitch = false;\n if (activeExtraction.isReasoning) {\n activeExtraction.isFirstReasoning = false;\n } else {\n activeExtraction.isFirstText = false;\n }\n }\n }\n do {\n const nextTag = activeExtraction.isReasoning ? closingTag : openingTag;\n const startIndex = getPotentialStartIndex(\n activeExtraction.buffer,\n nextTag\n );\n if (startIndex == null) {\n publish(activeExtraction.buffer);\n activeExtraction.buffer = \"\";\n break;\n }\n publish(activeExtraction.buffer.slice(0, startIndex));\n const foundFullMatch = startIndex + nextTag.length <= activeExtraction.buffer.length;\n if (foundFullMatch) {\n activeExtraction.buffer = activeExtraction.buffer.slice(\n startIndex + nextTag.length\n );\n if (activeExtraction.isReasoning) {\n if (activeExtraction.isFirstReasoning) {\n controller.enqueue({\n type: \"reasoning-start\",\n id: `reasoning-${activeExtraction.idCounter}`\n });\n }\n controller.enqueue({\n type: \"reasoning-end\",\n id: `reasoning-${activeExtraction.idCounter++}`\n });\n }\n activeExtraction.isReasoning = !activeExtraction.isReasoning;\n activeExtraction.afterSwitch = true;\n } else {\n activeExtraction.buffer = activeExtraction.buffer.slice(startIndex);\n break;\n }\n } while (true);\n }\n })\n ),\n ...rest\n };\n }\n };\n}\n\n// src/middleware/simulate-streaming-middleware.ts\nfunction simulateStreamingMiddleware() {\n return {\n specificationVersion: \"v3\",\n wrapStream: async ({ doGenerate }) => {\n const result = await doGenerate();\n let id = 0;\n const simulatedStream = new ReadableStream({\n start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings: result.warnings\n });\n controller.enqueue({ type: \"response-metadata\", ...result.response });\n for (const part of result.content) {\n switch (part.type) {\n case \"text\": {\n if (part.text.length > 0) {\n controller.enqueue({ type: \"text-start\", id: String(id) });\n controller.enqueue({\n type: \"text-delta\",\n id: String(id),\n delta: part.text\n });\n controller.enqueue({ type: \"text-end\", id: String(id) });\n id++;\n }\n break;\n }\n case \"reasoning\": {\n controller.enqueue({\n type: \"reasoning-start\",\n id: String(id),\n providerMetadata: part.providerMetadata\n });\n controller.enqueue({\n type: \"reasoning-delta\",\n id: String(id),\n delta: part.text\n });\n controller.enqueue({ type: \"reasoning-end\", id: String(id) });\n id++;\n break;\n }\n default: {\n controller.enqueue(part);\n break;\n }\n }\n }\n controller.enqueue({\n type: \"finish\",\n finishReason: result.finishReason,\n usage: result.usage,\n providerMetadata: result.providerMetadata\n });\n controller.close();\n }\n });\n return {\n stream: simulatedStream,\n request: result.request,\n response: result.response\n };\n }\n };\n}\n\n// src/middleware/add-tool-input-examples-middleware.ts\nfunction defaultFormatExample(example) {\n return JSON.stringify(example.input);\n}\nfunction addToolInputExamplesMiddleware({\n prefix = \"Input Examples:\",\n format = defaultFormatExample,\n remove = true\n} = {}) {\n return {\n specificationVersion: \"v3\",\n transformParams: async ({ params }) => {\n var _a21;\n if (!((_a21 = params.tools) == null ? void 0 : _a21.length)) {\n return params;\n }\n const transformedTools = params.tools.map((tool2) => {\n var _a22;\n if (tool2.type !== \"function\" || !((_a22 = tool2.inputExamples) == null ? void 0 : _a22.length)) {\n return tool2;\n }\n const formattedExamples = tool2.inputExamples.map((example, index) => format(example, index)).join(\"\\n\");\n const examplesSection = `${prefix}\n${formattedExamples}`;\n const toolDescription = tool2.description ? `${tool2.description}\n\n${examplesSection}` : examplesSection;\n return {\n ...tool2,\n description: toolDescription,\n inputExamples: remove ? void 0 : tool2.inputExamples\n };\n });\n return {\n ...params,\n tools: transformedTools\n };\n }\n };\n}\n\n// src/middleware/wrap-language-model.ts\nvar wrapLanguageModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n return [...asArray(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap = ({\n model,\n middleware: {\n transformParams,\n wrapGenerate,\n wrapStream,\n overrideProvider,\n overrideModelId,\n overrideSupportedUrls\n },\n modelId,\n providerId\n}) => {\n var _a21, _b, _c;\n async function doTransform({\n params,\n type\n }) {\n return transformParams ? await transformParams({ params, type, model }) : params;\n }\n return {\n specificationVersion: \"v3\",\n provider: (_a21 = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _a21 : model.provider,\n modelId: (_b = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _b : model.modelId,\n supportedUrls: (_c = overrideSupportedUrls == null ? void 0 : overrideSupportedUrls({ model })) != null ? _c : model.supportedUrls,\n async doGenerate(params) {\n const transformedParams = await doTransform({ params, type: \"generate\" });\n const doGenerate = async () => model.doGenerate(transformedParams);\n const doStream = async () => model.doStream(transformedParams);\n return wrapGenerate ? wrapGenerate({\n doGenerate,\n doStream,\n params: transformedParams,\n model\n }) : doGenerate();\n },\n async doStream(params) {\n const transformedParams = await doTransform({ params, type: \"stream\" });\n const doGenerate = async () => model.doGenerate(transformedParams);\n const doStream = async () => model.doStream(transformedParams);\n return wrapStream ? wrapStream({ doGenerate, doStream, params: transformedParams, model }) : doStream();\n }\n };\n};\n\n// src/middleware/wrap-embedding-model.ts\nvar wrapEmbeddingModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n return [...asArray(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap2({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap2 = ({\n model,\n middleware: {\n transformParams,\n wrapEmbed,\n overrideProvider,\n overrideModelId,\n overrideMaxEmbeddingsPerCall,\n overrideSupportsParallelCalls\n },\n modelId,\n providerId\n}) => {\n var _a21, _b, _c, _d;\n async function doTransform({\n params\n }) {\n return transformParams ? await transformParams({ params, model }) : params;\n }\n return {\n specificationVersion: \"v3\",\n provider: (_a21 = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _a21 : model.provider,\n modelId: (_b = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _b : model.modelId,\n maxEmbeddingsPerCall: (_c = overrideMaxEmbeddingsPerCall == null ? void 0 : overrideMaxEmbeddingsPerCall({ model })) != null ? _c : model.maxEmbeddingsPerCall,\n supportsParallelCalls: (_d = overrideSupportsParallelCalls == null ? void 0 : overrideSupportsParallelCalls({ model })) != null ? _d : model.supportsParallelCalls,\n async doEmbed(params) {\n const transformedParams = await doTransform({ params });\n const doEmbed = async () => model.doEmbed(transformedParams);\n return wrapEmbed ? wrapEmbed({\n doEmbed,\n params: transformedParams,\n model\n }) : doEmbed();\n }\n };\n};\n\n// src/middleware/wrap-image-model.ts\nvar wrapImageModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n return [...asArray(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap3({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap3 = ({\n model,\n middleware: {\n transformParams,\n wrapGenerate,\n overrideProvider,\n overrideModelId,\n overrideMaxImagesPerCall\n },\n modelId,\n providerId\n}) => {\n var _a21, _b, _c;\n async function doTransform({ params }) {\n return transformParams ? await transformParams({ params, model }) : params;\n }\n const maxImagesPerCallRaw = (_a21 = overrideMaxImagesPerCall == null ? void 0 : overrideMaxImagesPerCall({ model })) != null ? _a21 : model.maxImagesPerCall;\n const maxImagesPerCall = maxImagesPerCallRaw instanceof Function ? maxImagesPerCallRaw.bind(model) : maxImagesPerCallRaw;\n return {\n specificationVersion: \"v3\",\n provider: (_b = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _b : model.provider,\n modelId: (_c = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _c : model.modelId,\n maxImagesPerCall,\n async doGenerate(params) {\n const transformedParams = await doTransform({ params });\n const doGenerate = async () => model.doGenerate(transformedParams);\n return wrapGenerate ? wrapGenerate({\n doGenerate,\n params: transformedParams,\n model\n }) : doGenerate();\n }\n };\n};\n\n// src/model/as-provider-v3.ts\nfunction asProviderV3(provider) {\n if (\"specificationVersion\" in provider && provider.specificationVersion === \"v3\") {\n return provider;\n }\n const v2Provider = provider;\n return {\n specificationVersion: \"v3\",\n languageModel: (modelId) => asLanguageModelV3(v2Provider.languageModel(modelId)),\n embeddingModel: (modelId) => asEmbeddingModelV3(v2Provider.textEmbeddingModel(modelId)),\n imageModel: (modelId) => asImageModelV3(v2Provider.imageModel(modelId)),\n transcriptionModel: v2Provider.transcriptionModel ? (modelId) => asTranscriptionModelV3(v2Provider.transcriptionModel(modelId)) : void 0,\n speechModel: v2Provider.speechModel ? (modelId) => asSpeechModelV3(v2Provider.speechModel(modelId)) : void 0,\n rerankingModel: void 0\n // v2 providers don't have reranking models\n };\n}\n\n// src/middleware/wrap-provider.ts\nfunction wrapProvider({\n provider,\n languageModelMiddleware,\n imageModelMiddleware\n}) {\n const providerV3 = asProviderV3(provider);\n return {\n specificationVersion: \"v3\",\n languageModel: (modelId) => wrapLanguageModel({\n model: providerV3.languageModel(modelId),\n middleware: languageModelMiddleware\n }),\n embeddingModel: providerV3.embeddingModel,\n imageModel: (modelId) => {\n let model = providerV3.imageModel(modelId);\n if (imageModelMiddleware != null) {\n model = wrapImageModel({ model, middleware: imageModelMiddleware });\n }\n return model;\n },\n transcriptionModel: providerV3.transcriptionModel,\n speechModel: providerV3.speechModel,\n rerankingModel: providerV3.rerankingModel\n };\n}\n\n// src/registry/custom-provider.ts\n\nfunction customProvider({\n languageModels,\n embeddingModels,\n imageModels,\n transcriptionModels,\n speechModels,\n rerankingModels,\n videoModels,\n fallbackProvider: fallbackProviderArg\n}) {\n const fallbackProvider = fallbackProviderArg ? asProviderV3(fallbackProviderArg) : void 0;\n return {\n specificationVersion: \"v3\",\n languageModel(modelId) {\n if (languageModels != null && modelId in languageModels) {\n return languageModels[modelId];\n }\n if (fallbackProvider) {\n return fallbackProvider.languageModel(modelId);\n }\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({ modelId, modelType: \"languageModel\" });\n },\n embeddingModel(modelId) {\n if (embeddingModels != null && modelId in embeddingModels) {\n return embeddingModels[modelId];\n }\n if (fallbackProvider) {\n return fallbackProvider.embeddingModel(modelId);\n }\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({ modelId, modelType: \"embeddingModel\" });\n },\n imageModel(modelId) {\n if (imageModels != null && modelId in imageModels) {\n return imageModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.imageModel) {\n return fallbackProvider.imageModel(modelId);\n }\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({ modelId, modelType: \"imageModel\" });\n },\n transcriptionModel(modelId) {\n if (transcriptionModels != null && modelId in transcriptionModels) {\n return transcriptionModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.transcriptionModel) {\n return fallbackProvider.transcriptionModel(modelId);\n }\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({ modelId, modelType: \"transcriptionModel\" });\n },\n speechModel(modelId) {\n if (speechModels != null && modelId in speechModels) {\n return speechModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.speechModel) {\n return fallbackProvider.speechModel(modelId);\n }\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({ modelId, modelType: \"speechModel\" });\n },\n rerankingModel(modelId) {\n if (rerankingModels != null && modelId in rerankingModels) {\n return rerankingModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.rerankingModel) {\n return fallbackProvider.rerankingModel(modelId);\n }\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({ modelId, modelType: \"rerankingModel\" });\n },\n videoModel(modelId) {\n if (videoModels != null && modelId in videoModels) {\n return videoModels[modelId];\n }\n const videoModel = fallbackProvider == null ? void 0 : fallbackProvider.videoModel;\n if (videoModel) {\n return videoModel(modelId);\n }\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({ modelId, modelType: \"videoModel\" });\n }\n };\n}\nvar experimental_customProvider = customProvider;\n\n// src/registry/no-such-provider-error.ts\n\nvar name20 = \"AI_NoSuchProviderError\";\nvar marker20 = `vercel.ai.error.${name20}`;\nvar symbol20 = Symbol.for(marker20);\nvar _a20;\nvar NoSuchProviderError = class extends _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError {\n constructor({\n modelId,\n modelType,\n providerId,\n availableProviders,\n message = `No such provider: ${providerId} (available providers: ${availableProviders.join()})`\n }) {\n super({ errorName: name20, modelId, modelType, message });\n this[_a20] = true;\n this.providerId = providerId;\n this.availableProviders = availableProviders;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker20);\n }\n};\n_a20 = symbol20;\n\n// src/registry/provider-registry.ts\n\nfunction createProviderRegistry(providers, {\n separator = \":\",\n languageModelMiddleware,\n imageModelMiddleware\n} = {}) {\n const registry = new DefaultProviderRegistry({\n separator,\n languageModelMiddleware,\n imageModelMiddleware\n });\n for (const [id, provider] of Object.entries(providers)) {\n registry.registerProvider({ id, provider });\n }\n return registry;\n}\nvar experimental_createProviderRegistry = createProviderRegistry;\nvar DefaultProviderRegistry = class {\n constructor({\n separator,\n languageModelMiddleware,\n imageModelMiddleware\n }) {\n this.providers = {};\n this.separator = separator;\n this.languageModelMiddleware = languageModelMiddleware;\n this.imageModelMiddleware = imageModelMiddleware;\n }\n registerProvider({\n id,\n provider\n }) {\n this.providers[id] = provider;\n }\n getProvider(id, modelType) {\n const provider = this.providers[id];\n if (provider == null) {\n throw new NoSuchProviderError({\n modelId: id,\n modelType,\n providerId: id,\n availableProviders: Object.keys(this.providers)\n });\n }\n return provider;\n }\n splitId(id, modelType) {\n const index = id.indexOf(this.separator);\n if (index === -1) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({\n modelId: id,\n modelType,\n message: `Invalid ${modelType} id for registry: ${id} (must be in the format \"providerId${this.separator}modelId\")`\n });\n }\n return [id.slice(0, index), id.slice(index + this.separator.length)];\n }\n languageModel(id) {\n var _a21, _b;\n const [providerId, modelId] = this.splitId(id, \"languageModel\");\n let model = (_b = (_a21 = this.getProvider(providerId, \"languageModel\")).languageModel) == null ? void 0 : _b.call(\n _a21,\n modelId\n );\n if (model == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({ modelId: id, modelType: \"languageModel\" });\n }\n if (this.languageModelMiddleware != null) {\n model = wrapLanguageModel({\n model,\n middleware: this.languageModelMiddleware\n });\n }\n return model;\n }\n embeddingModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"embeddingModel\");\n const provider = this.getProvider(providerId, \"embeddingModel\");\n const model = (_a21 = provider.embeddingModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({\n modelId: id,\n modelType: \"embeddingModel\"\n });\n }\n return model;\n }\n imageModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"imageModel\");\n const provider = this.getProvider(providerId, \"imageModel\");\n let model = (_a21 = provider.imageModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({ modelId: id, modelType: \"imageModel\" });\n }\n if (this.imageModelMiddleware != null) {\n model = wrapImageModel({\n model,\n middleware: this.imageModelMiddleware\n });\n }\n return model;\n }\n transcriptionModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"transcriptionModel\");\n const provider = this.getProvider(providerId, \"transcriptionModel\");\n const model = (_a21 = provider.transcriptionModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({\n modelId: id,\n modelType: \"transcriptionModel\"\n });\n }\n return model;\n }\n speechModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"speechModel\");\n const provider = this.getProvider(providerId, \"speechModel\");\n const model = (_a21 = provider.speechModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({ modelId: id, modelType: \"speechModel\" });\n }\n return model;\n }\n rerankingModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"rerankingModel\");\n const provider = this.getProvider(providerId, \"rerankingModel\");\n const model = (_a21 = provider.rerankingModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.NoSuchModelError({ modelId: id, modelType: \"rerankingModel\" });\n }\n return model;\n }\n};\n\n// src/rerank/rerank.ts\nasync function rerank({\n model,\n documents,\n query,\n topN,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n providerOptions,\n experimental_telemetry: telemetry\n}) {\n if (documents.length === 0) {\n return new DefaultRerankResult({\n originalDocuments: [],\n ranking: [],\n providerMetadata: void 0,\n response: {\n timestamp: /* @__PURE__ */ new Date(),\n modelId: model.modelId\n }\n });\n }\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const documentsToSend = typeof documents[0] === \"string\" ? { type: \"text\", values: documents } : { type: \"object\", values: documents };\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { maxRetries }\n });\n const tracer = getTracer(telemetry);\n return recordSpan({\n name: \"ai.rerank\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.rerank\", telemetry }),\n ...baseTelemetryAttributes,\n \"ai.documents\": {\n input: () => documents.map((document) => JSON.stringify(document))\n }\n }\n }),\n tracer,\n fn: async () => {\n var _a21, _b;\n const { ranking, response, providerMetadata, warnings } = await retry(\n () => recordSpan({\n name: \"ai.rerank.doRerank\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.rerank.doRerank\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.documents\": {\n input: () => documents.map((document) => JSON.stringify(document))\n }\n }\n }),\n tracer,\n fn: async (doRerankSpan) => {\n const modelResponse = await model.doRerank({\n documents: documentsToSend,\n query,\n topN,\n providerOptions,\n abortSignal,\n headers\n });\n const ranking2 = modelResponse.ranking;\n doRerankSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.ranking.type\": documentsToSend.type,\n \"ai.ranking\": {\n output: () => ranking2.map((ranking3) => JSON.stringify(ranking3))\n }\n }\n })\n );\n return {\n ranking: ranking2,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response,\n warnings: modelResponse.warnings\n };\n }\n })\n );\n logWarnings({\n warnings: warnings != null ? warnings : [],\n provider: model.provider,\n model: model.modelId\n });\n return new DefaultRerankResult({\n originalDocuments: documents,\n ranking: ranking.map((ranking2) => ({\n originalIndex: ranking2.index,\n score: ranking2.relevanceScore,\n document: documents[ranking2.index]\n })),\n providerMetadata,\n response: {\n id: response == null ? void 0 : response.id,\n timestamp: (_a21 = response == null ? void 0 : response.timestamp) != null ? _a21 : /* @__PURE__ */ new Date(),\n modelId: (_b = response == null ? void 0 : response.modelId) != null ? _b : model.modelId,\n headers: response == null ? void 0 : response.headers,\n body: response == null ? void 0 : response.body\n }\n });\n }\n });\n}\nvar DefaultRerankResult = class {\n constructor(options) {\n this.originalDocuments = options.originalDocuments;\n this.ranking = options.ranking;\n this.response = options.response;\n this.providerMetadata = options.providerMetadata;\n }\n get rerankedDocuments() {\n return this.ranking.map((ranking) => ranking.document);\n }\n};\n\n// src/transcribe/transcribe.ts\n\nvar defaultDownload2 = createDownload();\nasync function transcribe({\n model,\n audio,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n download: downloadFn = defaultDownload2\n}) {\n const resolvedModel = resolveTranscriptionModel(model);\n if (!resolvedModel) {\n throw new Error(\"Model could not be resolved\");\n }\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.withUserAgentSuffix)(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const audioData = audio instanceof URL ? (await downloadFn({ url: audio, abortSignal })).data : convertDataContentToUint8Array(audio);\n const result = await retry(\n () => {\n var _a21;\n return resolvedModel.doGenerate({\n audio: audioData,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions,\n mediaType: (_a21 = detectMediaType({\n data: audioData,\n signatures: audioMediaTypeSignatures\n })) != null ? _a21 : \"audio/wav\"\n });\n }\n );\n logWarnings({\n warnings: result.warnings,\n provider: resolvedModel.provider,\n model: resolvedModel.modelId\n });\n if (!result.text) {\n throw new NoTranscriptGeneratedError({ responses: [result.response] });\n }\n return new DefaultTranscriptionResult({\n text: result.text,\n segments: result.segments,\n language: result.language,\n durationInSeconds: result.durationInSeconds,\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata\n });\n}\nvar DefaultTranscriptionResult = class {\n constructor(options) {\n var _a21;\n this.text = options.text;\n this.segments = options.segments;\n this.language = options.language;\n this.durationInSeconds = options.durationInSeconds;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = (_a21 = options.providerMetadata) != null ? _a21 : {};\n }\n};\n\n// src/ui/call-completion-api.ts\n\n\n// src/ui/process-text-stream.ts\nasync function processTextStream({\n stream,\n onTextPart\n}) {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n await onTextPart(value);\n }\n}\n\n// src/ui/call-completion-api.ts\nvar getOriginalFetch = () => fetch;\nasync function callCompletionApi({\n api,\n prompt,\n credentials,\n headers,\n body,\n streamProtocol = \"data\",\n setCompletion,\n setLoading,\n setError,\n setAbortController,\n onFinish,\n onError,\n fetch: fetch2 = getOriginalFetch()\n}) {\n var _a21;\n try {\n setLoading(true);\n setError(void 0);\n const abortController = new AbortController();\n setAbortController(abortController);\n setCompletion(\"\");\n const response = await fetch2(api, {\n method: \"POST\",\n body: JSON.stringify({\n prompt,\n ...body\n }),\n credentials,\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.withUserAgentSuffix)(\n {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n `ai-sdk/${VERSION}`,\n (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.getRuntimeEnvironmentUserAgent)()\n ),\n signal: abortController.signal\n }).catch((err) => {\n throw err;\n });\n if (!response.ok) {\n throw new Error(\n (_a21 = await response.text()) != null ? _a21 : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n let result = \"\";\n switch (streamProtocol) {\n case \"text\": {\n await processTextStream({\n stream: response.body,\n onTextPart: (chunk) => {\n result += chunk;\n setCompletion(result);\n }\n });\n break;\n }\n case \"data\": {\n await consumeStream({\n stream: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.parseJsonEventStream)({\n stream: response.body,\n schema: uiMessageChunkSchema\n }).pipeThrough(\n new TransformStream({\n async transform(part) {\n if (!part.success) {\n throw part.error;\n }\n const streamPart = part.value;\n if (streamPart.type === \"text-delta\") {\n result += streamPart.delta;\n setCompletion(result);\n } else if (streamPart.type === \"error\") {\n throw new Error(streamPart.errorText);\n }\n }\n })\n ),\n onError: (error) => {\n throw error;\n }\n });\n break;\n }\n default: {\n const exhaustiveCheck = streamProtocol;\n throw new Error(`Unknown stream protocol: ${exhaustiveCheck}`);\n }\n }\n if (onFinish) {\n onFinish(prompt, result);\n }\n setAbortController(null);\n return result;\n } catch (err) {\n if (err.name === \"AbortError\") {\n setAbortController(null);\n return null;\n }\n if (err instanceof Error) {\n if (onError) {\n onError(err);\n }\n }\n setError(err);\n } finally {\n setLoading(false);\n }\n}\n\n// src/ui/chat.ts\n\n\n// src/ui/convert-file-list-to-file-ui-parts.ts\nasync function convertFileListToFileUIParts(files) {\n if (files == null) {\n return [];\n }\n if (!globalThis.FileList || !(files instanceof globalThis.FileList)) {\n throw new Error(\"FileList is not supported in the current environment\");\n }\n return Promise.all(\n Array.from(files).map(async (file) => {\n const { name: name21, type } = file;\n const dataUrl = await new Promise((resolve3, reject) => {\n const reader = new FileReader();\n reader.onload = (readerEvent) => {\n var _a21;\n resolve3((_a21 = readerEvent.target) == null ? void 0 : _a21.result);\n };\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n return {\n type: \"file\",\n mediaType: type,\n filename: name21,\n url: dataUrl\n };\n })\n );\n}\n\n// src/ui/default-chat-transport.ts\n\n\n// src/ui/http-chat-transport.ts\n\nvar HttpChatTransport = class {\n constructor({\n api = \"/api/chat\",\n credentials,\n headers,\n body,\n fetch: fetch2,\n prepareSendMessagesRequest,\n prepareReconnectToStreamRequest\n }) {\n this.api = api;\n this.credentials = credentials;\n this.headers = headers;\n this.body = body;\n this.fetch = fetch2;\n this.prepareSendMessagesRequest = prepareSendMessagesRequest;\n this.prepareReconnectToStreamRequest = prepareReconnectToStreamRequest;\n }\n async sendMessages({\n abortSignal,\n ...options\n }) {\n var _a21, _b, _c, _d, _e;\n const resolvedBody = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.resolve)(this.body);\n const resolvedHeaders = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.resolve)(this.headers);\n const resolvedCredentials = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.resolve)(this.credentials);\n const baseHeaders = {\n ...(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.normalizeHeaders)(resolvedHeaders),\n ...(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.normalizeHeaders)(options.headers)\n };\n const preparedRequest = await ((_a21 = this.prepareSendMessagesRequest) == null ? void 0 : _a21.call(this, {\n api: this.api,\n id: options.chatId,\n messages: options.messages,\n body: { ...resolvedBody, ...options.body },\n headers: baseHeaders,\n credentials: resolvedCredentials,\n requestMetadata: options.metadata,\n trigger: options.trigger,\n messageId: options.messageId\n }));\n const api = (_b = preparedRequest == null ? void 0 : preparedRequest.api) != null ? _b : this.api;\n const headers = (preparedRequest == null ? void 0 : preparedRequest.headers) !== void 0 ? (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.normalizeHeaders)(preparedRequest.headers) : baseHeaders;\n const body = (preparedRequest == null ? void 0 : preparedRequest.body) !== void 0 ? preparedRequest.body : {\n ...resolvedBody,\n ...options.body,\n id: options.chatId,\n messages: options.messages,\n trigger: options.trigger,\n messageId: options.messageId\n };\n const credentials = (_c = preparedRequest == null ? void 0 : preparedRequest.credentials) != null ? _c : resolvedCredentials;\n const fetch2 = (_d = this.fetch) != null ? _d : globalThis.fetch;\n const response = await fetch2(api, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n body: JSON.stringify(body),\n credentials,\n signal: abortSignal\n });\n if (!response.ok) {\n throw new Error(\n (_e = await response.text()) != null ? _e : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n return this.processResponseStream(response.body);\n }\n async reconnectToStream(options) {\n var _a21, _b, _c, _d, _e;\n const resolvedBody = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.resolve)(this.body);\n const resolvedHeaders = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.resolve)(this.headers);\n const resolvedCredentials = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.resolve)(this.credentials);\n const baseHeaders = {\n ...(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.normalizeHeaders)(resolvedHeaders),\n ...(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.normalizeHeaders)(options.headers)\n };\n const preparedRequest = await ((_a21 = this.prepareReconnectToStreamRequest) == null ? void 0 : _a21.call(this, {\n api: this.api,\n id: options.chatId,\n body: { ...resolvedBody, ...options.body },\n headers: baseHeaders,\n credentials: resolvedCredentials,\n requestMetadata: options.metadata\n }));\n const api = (_b = preparedRequest == null ? void 0 : preparedRequest.api) != null ? _b : `${this.api}/${options.chatId}/stream`;\n const headers = (preparedRequest == null ? void 0 : preparedRequest.headers) !== void 0 ? (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.normalizeHeaders)(preparedRequest.headers) : baseHeaders;\n const credentials = (_c = preparedRequest == null ? void 0 : preparedRequest.credentials) != null ? _c : resolvedCredentials;\n const fetch2 = (_d = this.fetch) != null ? _d : globalThis.fetch;\n const response = await fetch2(api, {\n method: \"GET\",\n headers,\n credentials\n });\n if (response.status === 204) {\n return null;\n }\n if (!response.ok) {\n throw new Error(\n (_e = await response.text()) != null ? _e : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n return this.processResponseStream(response.body);\n }\n};\n\n// src/ui/default-chat-transport.ts\nvar DefaultChatTransport = class extends HttpChatTransport {\n constructor(options = {}) {\n super(options);\n }\n processResponseStream(stream) {\n return (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.parseJsonEventStream)({\n stream,\n schema: uiMessageChunkSchema\n }).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n if (!chunk.success) {\n throw chunk.error;\n }\n controller.enqueue(chunk.value);\n }\n })\n );\n }\n};\n\n// src/ui/chat.ts\nvar AbstractChat = class {\n constructor({\n generateId: generateId2 = _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_2__.generateId,\n id = generateId2(),\n transport = new DefaultChatTransport(),\n messageMetadataSchema,\n dataPartSchemas,\n state,\n onError,\n onToolCall,\n onFinish,\n onData,\n sendAutomaticallyWhen\n }) {\n this.activeResponse = void 0;\n this.jobExecutor = new SerialJobExecutor();\n /**\n * Appends or replaces a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n *\n * If a messageId is provided, the message will be replaced.\n */\n this.sendMessage = async (message, options) => {\n var _a21, _b, _c, _d;\n if (message == null) {\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a21 = this.lastMessage) == null ? void 0 : _a21.id,\n ...options\n });\n return;\n }\n let uiMessage;\n if (\"text\" in message || \"files\" in message) {\n const fileParts = Array.isArray(message.files) ? message.files : await convertFileListToFileUIParts(message.files);\n uiMessage = {\n parts: [\n ...fileParts,\n ...\"text\" in message && message.text != null ? [{ type: \"text\", text: message.text }] : []\n ]\n };\n } else {\n uiMessage = message;\n }\n if (message.messageId != null) {\n const messageIndex = this.state.messages.findIndex(\n (m) => m.id === message.messageId\n );\n if (messageIndex === -1) {\n throw new Error(`message with id ${message.messageId} not found`);\n }\n if (this.state.messages[messageIndex].role !== \"user\") {\n throw new Error(\n `message with id ${message.messageId} is not a user message`\n );\n }\n this.state.messages = this.state.messages.slice(0, messageIndex + 1);\n this.state.replaceMessage(messageIndex, {\n ...uiMessage,\n id: message.messageId,\n role: (_b = uiMessage.role) != null ? _b : \"user\",\n metadata: message.metadata\n });\n } else {\n this.state.pushMessage({\n ...uiMessage,\n id: (_c = uiMessage.id) != null ? _c : this.generateId(),\n role: (_d = uiMessage.role) != null ? _d : \"user\",\n metadata: message.metadata\n });\n }\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: message.messageId,\n ...options\n });\n };\n /**\n * Regenerate the assistant message with the provided message id.\n * If no message id is provided, the last assistant message will be regenerated.\n */\n this.regenerate = async ({\n messageId,\n ...options\n } = {}) => {\n const messageIndex = messageId == null ? this.state.messages.length - 1 : this.state.messages.findIndex((message) => message.id === messageId);\n if (messageIndex === -1) {\n throw new Error(`message ${messageId} not found`);\n }\n this.state.messages = this.state.messages.slice(\n 0,\n // if the message is a user message, we need to include it in the request:\n this.messages[messageIndex].role === \"assistant\" ? messageIndex : messageIndex + 1\n );\n await this.makeRequest({\n trigger: \"regenerate-message\",\n messageId,\n ...options\n });\n };\n /**\n * Attempt to resume an ongoing streaming response.\n */\n this.resumeStream = async (options = {}) => {\n await this.makeRequest({ trigger: \"resume-stream\", ...options });\n };\n /**\n * Clear the error state and set the status to ready if the chat is in an error state.\n */\n this.clearError = () => {\n if (this.status === \"error\") {\n this.state.error = void 0;\n this.setStatus({ status: \"ready\" });\n }\n };\n this.addToolApprovalResponse = async ({\n id,\n approved,\n reason,\n options\n }) => this.jobExecutor.run(async () => {\n const messages = this.state.messages;\n const lastMessage = messages[messages.length - 1];\n const updatePart = (part) => isToolUIPart(part) && part.state === \"approval-requested\" && part.approval.id === id ? {\n ...part,\n state: \"approval-responded\",\n approval: { id, approved, reason }\n } : part;\n this.state.replaceMessage(messages.length - 1, {\n ...lastMessage,\n parts: lastMessage.parts.map(updatePart)\n });\n if (this.activeResponse) {\n this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(updatePart);\n }\n if (this.status !== \"streaming\" && this.status !== \"submitted\" && this.sendAutomaticallyWhen) {\n this.shouldSendAutomatically().then((shouldSend) => {\n var _a21;\n if (shouldSend) {\n this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a21 = this.lastMessage) == null ? void 0 : _a21.id,\n ...options\n });\n }\n });\n }\n });\n this.addToolOutput = async ({\n state = \"output-available\",\n toolCallId,\n output,\n errorText,\n options\n }) => this.jobExecutor.run(async () => {\n const messages = this.state.messages;\n const lastMessage = messages[messages.length - 1];\n const updatePart = (part) => isToolUIPart(part) && part.toolCallId === toolCallId ? { ...part, state, output, errorText } : part;\n this.state.replaceMessage(messages.length - 1, {\n ...lastMessage,\n parts: lastMessage.parts.map(updatePart)\n });\n if (this.activeResponse) {\n this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(updatePart);\n }\n if (this.status !== \"streaming\" && this.status !== \"submitted\" && this.sendAutomaticallyWhen) {\n this.shouldSendAutomatically().then((shouldSend) => {\n var _a21;\n if (shouldSend) {\n this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a21 = this.lastMessage) == null ? void 0 : _a21.id,\n ...options\n });\n }\n });\n }\n });\n /** @deprecated Use addToolOutput */\n this.addToolResult = this.addToolOutput;\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n this.stop = async () => {\n var _a21;\n if (this.status !== \"streaming\" && this.status !== \"submitted\")\n return;\n if ((_a21 = this.activeResponse) == null ? void 0 : _a21.abortController) {\n this.activeResponse.abortController.abort();\n }\n };\n this.id = id;\n this.transport = transport;\n this.generateId = generateId2;\n this.messageMetadataSchema = messageMetadataSchema;\n this.dataPartSchemas = dataPartSchemas;\n this.state = state;\n this.onError = onError;\n this.onToolCall = onToolCall;\n this.onFinish = onFinish;\n this.onData = onData;\n this.sendAutomaticallyWhen = sendAutomaticallyWhen;\n }\n /**\n * Hook status:\n *\n * - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.\n * - `streaming`: The response is actively streaming in from the API, receiving chunks of data.\n * - `ready`: The full response has been received and processed; a new user message can be submitted.\n * - `error`: An error occurred during the API request, preventing successful completion.\n */\n get status() {\n return this.state.status;\n }\n setStatus({\n status,\n error\n }) {\n if (this.status === status)\n return;\n this.state.status = status;\n this.state.error = error;\n }\n get error() {\n return this.state.error;\n }\n get messages() {\n return this.state.messages;\n }\n get lastMessage() {\n return this.state.messages[this.state.messages.length - 1];\n }\n set messages(messages) {\n this.state.messages = messages;\n }\n async shouldSendAutomatically() {\n if (!this.sendAutomaticallyWhen)\n return false;\n const result = this.sendAutomaticallyWhen({\n messages: this.state.messages\n });\n if (result && typeof result === \"object\" && \"then\" in result) {\n return await result;\n }\n return result;\n }\n async makeRequest({\n trigger,\n metadata,\n headers,\n body,\n messageId\n }) {\n var _a21, _b, _c;\n let resumeStream;\n if (trigger === \"resume-stream\") {\n try {\n const reconnect = await this.transport.reconnectToStream({\n chatId: this.id,\n metadata,\n headers,\n body\n });\n if (reconnect == null) {\n return;\n }\n resumeStream = reconnect;\n } catch (err) {\n if (this.onError && err instanceof Error) {\n this.onError(err);\n }\n this.setStatus({ status: \"error\", error: err });\n return;\n }\n }\n this.setStatus({ status: \"submitted\", error: void 0 });\n const lastMessage = this.lastMessage;\n let isAbort = false;\n let isDisconnect = false;\n let isError = false;\n try {\n const activeResponse = {\n state: createStreamingUIMessageState({\n lastMessage: this.state.snapshot(lastMessage),\n messageId: this.generateId()\n }),\n abortController: new AbortController()\n };\n activeResponse.abortController.signal.addEventListener(\"abort\", () => {\n isAbort = true;\n });\n this.activeResponse = activeResponse;\n let stream;\n if (trigger === \"resume-stream\") {\n stream = resumeStream;\n } else {\n stream = await this.transport.sendMessages({\n chatId: this.id,\n messages: this.state.messages,\n abortSignal: activeResponse.abortController.signal,\n metadata,\n headers,\n body,\n trigger,\n messageId\n });\n }\n const runUpdateMessageJob = (job) => (\n // serialize the job execution to avoid race conditions:\n this.jobExecutor.run(\n () => job({\n state: activeResponse.state,\n write: () => {\n var _a22;\n this.setStatus({ status: \"streaming\" });\n const replaceLastMessage = activeResponse.state.message.id === ((_a22 = this.lastMessage) == null ? void 0 : _a22.id);\n if (replaceLastMessage) {\n this.state.replaceMessage(\n this.state.messages.length - 1,\n activeResponse.state.message\n );\n } else {\n this.state.pushMessage(activeResponse.state.message);\n }\n }\n })\n )\n );\n await consumeStream({\n stream: processUIMessageStream({\n stream,\n onToolCall: this.onToolCall,\n onData: this.onData,\n messageMetadataSchema: this.messageMetadataSchema,\n dataPartSchemas: this.dataPartSchemas,\n runUpdateMessageJob,\n onError: (error) => {\n throw error;\n }\n }),\n onError: (error) => {\n throw error;\n }\n });\n this.setStatus({ status: \"ready\" });\n } catch (err) {\n if (isAbort || err.name === \"AbortError\") {\n isAbort = true;\n this.setStatus({ status: \"ready\" });\n return null;\n }\n isError = true;\n if (err instanceof TypeError && (err.message.toLowerCase().includes(\"fetch\") || err.message.toLowerCase().includes(\"network\"))) {\n isDisconnect = true;\n }\n if (this.onError && err instanceof Error) {\n this.onError(err);\n }\n this.setStatus({ status: \"error\", error: err });\n } finally {\n try {\n (_b = this.onFinish) == null ? void 0 : _b.call(this, {\n message: this.activeResponse.state.message,\n messages: this.state.messages,\n isAbort,\n isDisconnect,\n isError,\n finishReason: (_a21 = this.activeResponse) == null ? void 0 : _a21.state.finishReason\n });\n } catch (err) {\n console.error(err);\n }\n this.activeResponse = void 0;\n }\n if (!isError && await this.shouldSendAutomatically()) {\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_c = this.lastMessage) == null ? void 0 : _c.id,\n metadata,\n headers,\n body\n });\n }\n }\n};\n\n// src/ui/direct-chat-transport.ts\nvar DirectChatTransport = class {\n constructor({\n agent,\n options,\n ...uiMessageStreamOptions\n }) {\n this.agent = agent;\n this.agentOptions = options;\n this.uiMessageStreamOptions = uiMessageStreamOptions;\n }\n async sendMessages({\n messages,\n abortSignal\n }) {\n const validatedMessages = await validateUIMessages({\n messages,\n tools: this.agent.tools\n });\n const modelMessages = await convertToModelMessages(validatedMessages, {\n tools: this.agent.tools\n });\n const result = await this.agent.stream({\n prompt: modelMessages,\n abortSignal,\n ...this.agentOptions !== void 0 ? { options: this.agentOptions } : {}\n });\n return result.toUIMessageStream(this.uiMessageStreamOptions);\n }\n /**\n * Direct transport does not support reconnection since there is no\n * persistent server-side stream to reconnect to.\n *\n * @returns Always returns `null`\n */\n async reconnectToStream(_options) {\n return null;\n }\n};\n\n// src/ui/last-assistant-message-is-complete-with-approval-responses.ts\nfunction lastAssistantMessageIsCompleteWithApprovalResponses({\n messages\n}) {\n const message = messages[messages.length - 1];\n if (!message) {\n return false;\n }\n if (message.role !== \"assistant\") {\n return false;\n }\n const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {\n return part.type === \"step-start\" ? index : lastIndex;\n }, -1);\n const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter(isToolUIPart).filter((part) => !part.providerExecuted);\n return (\n // has at least one tool approval response\n lastStepToolInvocations.filter((part) => part.state === \"approval-responded\").length > 0 && // all tool approvals must have a response\n lastStepToolInvocations.every(\n (part) => part.state === \"output-available\" || part.state === \"output-error\" || part.state === \"approval-responded\"\n )\n );\n}\n\n// src/ui/last-assistant-message-is-complete-with-tool-calls.ts\nfunction lastAssistantMessageIsCompleteWithToolCalls({\n messages\n}) {\n const message = messages[messages.length - 1];\n if (!message) {\n return false;\n }\n if (message.role !== \"assistant\") {\n return false;\n }\n const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {\n return part.type === \"step-start\" ? index : lastIndex;\n }, -1);\n const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter(isToolUIPart).filter((part) => !part.providerExecuted);\n return lastStepToolInvocations.length > 0 && lastStepToolInvocations.every(\n (part) => part.state === \"output-available\" || part.state === \"output-error\"\n );\n}\n\n// src/ui/transform-text-to-ui-message-stream.ts\nfunction transformTextToUiMessageStream({\n stream\n}) {\n return stream.pipeThrough(\n new TransformStream({\n start(controller) {\n controller.enqueue({ type: \"start\" });\n controller.enqueue({ type: \"start-step\" });\n controller.enqueue({ type: \"text-start\", id: \"text-1\" });\n },\n async transform(part, controller) {\n controller.enqueue({ type: \"text-delta\", id: \"text-1\", delta: part });\n },\n async flush(controller) {\n controller.enqueue({ type: \"text-end\", id: \"text-1\" });\n controller.enqueue({ type: \"finish-step\" });\n controller.enqueue({ type: \"finish\" });\n }\n })\n );\n}\n\n// src/ui/text-stream-chat-transport.ts\nvar TextStreamChatTransport = class extends HttpChatTransport {\n constructor(options = {}) {\n super(options);\n }\n processResponseStream(stream) {\n return transformTextToUiMessageStream({\n stream: stream.pipeThrough(new TextDecoderStream())\n });\n }\n};\n\n//# sourceMappingURL=index.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvLnBucG0vYWlANi4wLjE0Ml96b2RAMy4yNS43Ni9ub2RlX21vZHVsZXMvYWkvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxvQ0FBb0M7QUFDcEU7O0FBRUE7QUFDcUU7QUFVckM7O0FBRWhDO0FBS2dDOztBQUVoQztBQWUwQjs7QUFFMUI7QUFDOEM7QUFDOUM7QUFDQSxnQ0FBZ0MsS0FBSztBQUNyQztBQUNBO0FBQ0EseUNBQXlDLHdEQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxpREFBaUQsVUFBVSxJQUFJLFFBQVE7QUFDdkUsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHdEQUFVO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUM2RDtBQUM3RDtBQUNBLGlDQUFpQyxNQUFNO0FBQ3ZDO0FBQ0E7QUFDQSwyQ0FBMkMsd0RBQVc7QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILFlBQVksc0JBQXNCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyx3REFBVztBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDNkQ7QUFDN0Q7QUFDQSxpQ0FBaUMsTUFBTTtBQUN2QztBQUNBO0FBQ0EsNkNBQTZDLHdEQUFXO0FBQ3hELGdCQUFnQixZQUFZO0FBQzVCO0FBQ0E7QUFDQSx5RUFBeUUsV0FBVztBQUNwRixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHdEQUFXO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUM4RTtBQUM5RTtBQUNBLGlDQUFp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QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0Usb0RBQU87QUFDN0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFHZ0M7O0FBRWhDO0FBQ21FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxpRkFBeUI7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0Esd0NBQXdDLHNDQUFzQztBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IscUNBQXFDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHFDQUFxQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyx3QkFBd0I7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsR0FBRztBQUNI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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNpRTtBQUNpQztBQUNsRztBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLElBQUk7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxJQUFJO0FBQ0osUUFBUSxvRUFBWTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLHVFQUFnQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxXQUFXLHdCQUF3QixhQUFhO0FBQ2pGO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxrQ0FBa0MsMERBQWE7QUFDL0MsWUFBWSw2REFBSztBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsV0FBVyxzQ0FBc0MsYUFBYTtBQUM3RjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDcUQ7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxVQUFVLDhCQUE4QjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHNEQUFzRDtBQUMzRTtBQUNBO0FBQ0EsdUJBQXVCLG1FQUFXO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELDhDQUE4QztBQUNqRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsOENBQThDO0FBQy9GO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpRkFBMEI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGlGQUEwQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFHeUI7QUFNTTs7QUFFaEM7QUFDdUQ7O0FBRXZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsUUFBUTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsMEVBQTBFLE9BQU87QUFDakY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHFCQUFxQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLDZJQUE2SSxJQUFJO0FBQ2pKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLDJFQUEyRSw0REFBZSw0QkFBNEIsaUVBQW9CO0FBQzFJO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCLHlFQUFr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QUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGVBQWU7QUFDNUMsNkJBQTZCLG9CQUFvQjtBQUNqRCw2QkFBNkIsa0NBQWtDO0FBQy9ELE9BQU87QUFDUDtBQUNBLDZCQUE2QiwrQ0FBK0M7QUFDNUUsT0FBTztBQUNQO0FBQ0EsNkJBQTZCLGdDQUFnQztBQUM3RCw2QkFBNkIscUJBQXFCO0FBQ2xELDZCQUE2QixnQkFBZ0I7QUFDN0M7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQW1JRTtBQUNGIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL2FpQDYuMC4xNDJfem9kQDMuMjUuNzYvbm9kZV9tb2R1bGVzL2FpL2Rpc3QvaW5kZXgubWpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHtcbiAgZm9yICh2YXIgbmFtZTIxIGluIGFsbClcbiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lMjEsIHsgZ2V0OiBhbGxbbmFtZTIxXSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbn07XG5cbi8vIHNyYy9pbmRleC50c1xuaW1wb3J0IHsgY3JlYXRlR2F0ZXdheSwgZ2F0ZXdheSBhcyBnYXRld2F5MiB9IGZyb20gXCJAYWktc2RrL2dhdGV3YXlcIjtcbmltcG9ydCB7XG4gIGFzU2NoZW1hIGFzIGFzU2NoZW1hNSxcbiAgY3JlYXRlSWRHZW5lcmF0b3IgYXMgY3JlYXRlSWRHZW5lcmF0b3I1LFxuICBkeW5hbWljVG9vbCxcbiAgZ2VuZXJhdGVJZCxcbiAganNvblNjaGVtYSxcbiAgcGFyc2VKc29uRXZlbnRTdHJlYW0gYXMgcGFyc2VKc29uRXZlbnRTdHJlYW0zLFxuICB0b29sLFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hM1xufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvZ2VuZXJhdGUtdGV4dC9nZW5lcmF0ZS10ZXh0LnRzXG5pbXBvcnQge1xuICBjcmVhdGVJZEdlbmVyYXRvcixcbiAgZ2V0RXJyb3JNZXNzYWdlIGFzIGdldEVycm9yTWVzc2FnZTUsXG4gIHdpdGhVc2VyQWdlbnRTdWZmaXggYXMgd2l0aFVzZXJBZ2VudFN1ZmZpeDJcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL2Vycm9yL2luZGV4LnRzXG5pbXBvcnQge1xuICBBSVNES0Vycm9yIGFzIEFJU0RLRXJyb3IyMSxcbiAgQVBJQ2FsbEVycm9yLFxuICBFbXB0eVJlc3BvbnNlQm9keUVycm9yLFxuICBJbnZhbGlkUHJvbXB0RXJyb3IsXG4gIEludmFsaWRSZXNwb25zZURhdGFFcnJvcixcbiAgSlNPTlBhcnNlRXJyb3IsXG4gIExvYWRBUElLZXlFcnJvcixcbiAgTG9hZFNldHRpbmdFcnJvcixcbiAgTm9Db250ZW50R2VuZXJhdGVkRXJyb3IsXG4gIE5vU3VjaE1vZGVsRXJyb3IsXG4gIFRvb01hbnlFbWJlZGRpbmdWYWx1ZXNGb3JDYWxsRXJyb3IsXG4gIFR5cGVWYWxpZGF0aW9uRXJyb3IsXG4gIFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5cbi8vIHNyYy9lcnJvci9pbnZhbGlkLWFyZ3VtZW50LWVycm9yLnRzXG5pbXBvcnQgeyBBSVNES0Vycm9yIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbnZhciBuYW1lID0gXCJBSV9JbnZhbGlkQXJndW1lbnRFcnJvclwiO1xudmFyIG1hcmtlciA9IGB2ZXJjZWwuYWkuZXJyb3IuJHtuYW1lfWA7XG52YXIgc3ltYm9sID0gU3ltYm9sLmZvcihtYXJrZXIpO1xudmFyIF9hO1xudmFyIEludmFsaWRBcmd1bWVudEVycm9yID0gY2xhc3MgZXh0ZW5kcyBBSVNES0Vycm9yIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHBhcmFtZXRlcixcbiAgICB2YWx1ZSxcbiAgICBtZXNzYWdlXG4gIH0pIHtcbiAgICBzdXBlcih7XG4gICAgICBuYW1lLFxuICAgICAgbWVzc2FnZTogYEludmFsaWQgYXJndW1lbnQgZm9yIHBhcmFtZXRlciAke3BhcmFtZXRlcn06ICR7bWVzc2FnZX1gXG4gICAgfSk7XG4gICAgdGhpc1tfYV0gPSB0cnVlO1xuICAgIHRoaXMucGFyYW1ldGVyID0gcGFyYW1ldGVyO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBBSVNES0Vycm9yLmhhc01hcmtlcihlcnJvciwgbWFya2VyKTtcbiAgfVxufTtcbl9hID0gc3ltYm9sO1xuXG4vLyBzcmMvZXJyb3IvaW52YWxpZC1zdHJlYW0tcGFydC1lcnJvci50c1xuaW1wb3J0IHsgQUlTREtFcnJvciBhcyBBSVNES0Vycm9yMiB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgbmFtZTIgPSBcIkFJX0ludmFsaWRTdHJlYW1QYXJ0RXJyb3JcIjtcbnZhciBtYXJrZXIyID0gYHZlcmNlbC5haS5lcnJvci4ke25hbWUyfWA7XG52YXIgc3ltYm9sMiA9IFN5bWJvbC5mb3IobWFya2VyMik7XG52YXIgX2EyO1xudmFyIEludmFsaWRTdHJlYW1QYXJ0RXJyb3IgPSBjbGFzcyBleHRlbmRzIEFJU0RLRXJyb3IyIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNodW5rLFxuICAgIG1lc3NhZ2VcbiAgfSkge1xuICAgIHN1cGVyKHsgbmFtZTogbmFtZTIsIG1lc3NhZ2UgfSk7XG4gICAgdGhpc1tfYTJdID0gdHJ1ZTtcbiAgICB0aGlzLmNodW5rID0gY2h1bms7XG4gIH1cbiAgc3RhdGljIGlzSW5zdGFuY2UoZXJyb3IpIHtcbiAgICByZXR1cm4gQUlTREtFcnJvcjIuaGFzTWFya2VyKGVycm9yLCBtYXJrZXIyKTtcbiAgfVxufTtcbl9hMiA9IHN5bWJvbDI7XG5cbi8vIHNyYy9lcnJvci9pbnZhbGlkLXRvb2wtYXBwcm92YWwtZXJyb3IudHNcbmltcG9ydCB7IEFJU0RLRXJyb3IgYXMgQUlTREtFcnJvcjMgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xudmFyIG5hbWUzID0gXCJBSV9JbnZhbGlkVG9vbEFwcHJvdmFsRXJyb3JcIjtcbnZhciBtYXJrZXIzID0gYHZlcmNlbC5haS5lcnJvci4ke25hbWUzfWA7XG52YXIgc3ltYm9sMyA9IFN5bWJvbC5mb3IobWFya2VyMyk7XG52YXIgX2EzO1xudmFyIEludmFsaWRUb29sQXBwcm92YWxFcnJvciA9IGNsYXNzIGV4dGVuZHMgQUlTREtFcnJvcjMge1xuICBjb25zdHJ1Y3Rvcih7IGFwcHJvdmFsSWQgfSkge1xuICAgIHN1cGVyKHtcbiAgICAgIG5hbWU6IG5hbWUzLFxuICAgICAgbWVzc2FnZTogYFRvb2wgYXBwcm92YWwgcmVzcG9uc2UgcmVmZXJlbmNlcyB1bmtub3duIGFwcHJvdmFsSWQ6IFwiJHthcHByb3ZhbElkfVwiLiBObyBtYXRjaGluZyB0b29sLWFwcHJvdmFsLXJlcXVlc3QgZm91bmQgaW4gbWVzc2FnZSBoaXN0b3J5LmBcbiAgICB9KTtcbiAgICB0aGlzW19hM10gPSB0cnVlO1xuICAgIHRoaXMuYXBwcm92YWxJZCA9IGFwcHJvdmFsSWQ7XG4gIH1cbiAgc3RhdGljIGlzSW5zdGFuY2UoZXJyb3IpIHtcbiAgICByZXR1cm4gQUlTREtFcnJvcjMuaGFzTWFya2VyKGVycm9yLCBtYXJrZXIzKTtcbiAgfVxufTtcbl9hMyA9IHN5bWJvbDM7XG5cbi8vIHNyYy9lcnJvci9pbnZhbGlkLXRvb2wtaW5wdXQtZXJyb3IudHNcbmltcG9ydCB7IEFJU0RLRXJyb3IgYXMgQUlTREtFcnJvcjQsIGdldEVycm9yTWVzc2FnZSB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgbmFtZTQgPSBcIkFJX0ludmFsaWRUb29sSW5wdXRFcnJvclwiO1xudmFyIG1hcmtlcjQgPSBgdmVyY2VsLmFpLmVycm9yLiR7bmFtZTR9YDtcbnZhciBzeW1ib2w0ID0gU3ltYm9sLmZvcihtYXJrZXI0KTtcbnZhciBfYTQ7XG52YXIgSW52YWxpZFRvb2xJbnB1dEVycm9yID0gY2xhc3MgZXh0ZW5kcyBBSVNES0Vycm9yNCB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICB0b29sSW5wdXQsXG4gICAgdG9vbE5hbWUsXG4gICAgY2F1c2UsXG4gICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0IGZvciB0b29sICR7dG9vbE5hbWV9OiAke2dldEVycm9yTWVzc2FnZShjYXVzZSl9YFxuICB9KSB7XG4gICAgc3VwZXIoeyBuYW1lOiBuYW1lNCwgbWVzc2FnZSwgY2F1c2UgfSk7XG4gICAgdGhpc1tfYTRdID0gdHJ1ZTtcbiAgICB0aGlzLnRvb2xJbnB1dCA9IHRvb2xJbnB1dDtcbiAgICB0aGlzLnRvb2xOYW1lID0gdG9vbE5hbWU7XG4gIH1cbiAgc3RhdGljIGlzSW5zdGFuY2UoZXJyb3IpIHtcbiAgICByZXR1cm4gQUlTREtFcnJvcjQuaGFzTWFya2VyKGVycm9yLCBtYXJrZXI0KTtcbiAgfVxufTtcbl9hNCA9IHN5bWJvbDQ7XG5cbi8vIHNyYy9lcnJvci90b29sLWNhbGwtbm90LWZvdW5kLWZvci1hcHByb3ZhbC1lcnJvci50c1xuaW1wb3J0IHsgQUlTREtFcnJvciBhcyBBSVNES0Vycm9yNSB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgbmFtZTUgPSBcIkFJX1Rvb2xDYWxsTm90Rm91bmRGb3JBcHByb3ZhbEVycm9yXCI7XG52YXIgbWFya2VyNSA9IGB2ZXJjZWwuYWkuZXJyb3IuJHtuYW1lNX1gO1xudmFyIHN5bWJvbDUgPSBTeW1ib2wuZm9yKG1hcmtlcjUpO1xudmFyIF9hNTtcbnZhciBUb29sQ2FsbE5vdEZvdW5kRm9yQXBwcm92YWxFcnJvciA9IGNsYXNzIGV4dGVuZHMgQUlTREtFcnJvcjUge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgdG9vbENhbGxJZCxcbiAgICBhcHByb3ZhbElkXG4gIH0pIHtcbiAgICBzdXBlcih7XG4gICAgICBuYW1lOiBuYW1lNSxcbiAgICAgIG1lc3NhZ2U6IGBUb29sIGNhbGwgXCIke3Rvb2xDYWxsSWR9XCIgbm90IGZvdW5kIGZvciBhcHByb3ZhbCByZXF1ZXN0IFwiJHthcHByb3ZhbElkfVwiLmBcbiAgICB9KTtcbiAgICB0aGlzW19hNV0gPSB0cnVlO1xuICAgIHRoaXMudG9vbENhbGxJZCA9IHRvb2xDYWxsSWQ7XG4gICAgdGhpcy5hcHByb3ZhbElkID0gYXBwcm92YWxJZDtcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBBSVNES0Vycm9yNS5oYXNNYXJrZXIoZXJyb3IsIG1hcmtlcjUpO1xuICB9XG59O1xuX2E1ID0gc3ltYm9sNTtcblxuLy8gc3JjL2Vycm9yL21pc3NpbmctdG9vbC1yZXN1bHQtZXJyb3IudHNcbmltcG9ydCB7IEFJU0RLRXJyb3IgYXMgQUlTREtFcnJvcjYgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xudmFyIG5hbWU2ID0gXCJBSV9NaXNzaW5nVG9vbFJlc3VsdHNFcnJvclwiO1xudmFyIG1hcmtlcjYgPSBgdmVyY2VsLmFpLmVycm9yLiR7bmFtZTZ9YDtcbnZhciBzeW1ib2w2ID0gU3ltYm9sLmZvcihtYXJrZXI2KTtcbnZhciBfYTY7XG52YXIgTWlzc2luZ1Rvb2xSZXN1bHRzRXJyb3IgPSBjbGFzcyBleHRlbmRzIEFJU0RLRXJyb3I2IHtcbiAgY29uc3RydWN0b3IoeyB0b29sQ2FsbElkcyB9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgbmFtZTogbmFtZTYsXG4gICAgICBtZXNzYWdlOiBgVG9vbCByZXN1bHQke3Rvb2xDYWxsSWRzLmxlbmd0aCA+IDEgPyBcInMgYXJlXCIgOiBcIiBpc1wifSBtaXNzaW5nIGZvciB0b29sIGNhbGwke3Rvb2xDYWxsSWRzLmxlbmd0aCA+IDEgPyBcInNcIiA6IFwiXCJ9ICR7dG9vbENhbGxJZHMuam9pbihcbiAgICAgICAgXCIsIFwiXG4gICAgICApfS5gXG4gICAgfSk7XG4gICAgdGhpc1tfYTZdID0gdHJ1ZTtcbiAgICB0aGlzLnRvb2xDYWxsSWRzID0gdG9vbENhbGxJZHM7XG4gIH1cbiAgc3RhdGljIGlzSW5zdGFuY2UoZXJyb3IpIHtcbiAgICByZXR1cm4gQUlTREtFcnJvcjYuaGFzTWFya2VyKGVycm9yLCBtYXJrZXI2KTtcbiAgfVxufTtcbl9hNiA9IHN5bWJvbDY7XG5cbi8vIHNyYy9lcnJvci9uby1pbWFnZS1nZW5lcmF0ZWQtZXJyb3IudHNcbmltcG9ydCB7IEFJU0RLRXJyb3IgYXMgQUlTREtFcnJvcjcgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xudmFyIG5hbWU3ID0gXCJBSV9Ob0ltYWdlR2VuZXJhdGVkRXJyb3JcIjtcbnZhciBtYXJrZXI3ID0gYHZlcmNlbC5haS5lcnJvci4ke25hbWU3fWA7XG52YXIgc3ltYm9sNyA9IFN5bWJvbC5mb3IobWFya2VyNyk7XG52YXIgX2E3O1xudmFyIE5vSW1hZ2VHZW5lcmF0ZWRFcnJvciA9IGNsYXNzIGV4dGVuZHMgQUlTREtFcnJvcjcge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgbWVzc2FnZSA9IFwiTm8gaW1hZ2UgZ2VuZXJhdGVkLlwiLFxuICAgIGNhdXNlLFxuICAgIHJlc3BvbnNlc1xuICB9KSB7XG4gICAgc3VwZXIoeyBuYW1lOiBuYW1lNywgbWVzc2FnZSwgY2F1c2UgfSk7XG4gICAgdGhpc1tfYTddID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3BvbnNlcyA9IHJlc3BvbnNlcztcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBBSVNES0Vycm9yNy5oYXNNYXJrZXIoZXJyb3IsIG1hcmtlcjcpO1xuICB9XG59O1xuX2E3ID0gc3ltYm9sNztcblxuLy8gc3JjL2Vycm9yL25vLW9iamVjdC1nZW5lcmF0ZWQtZXJyb3IudHNcbmltcG9ydCB7IEFJU0RLRXJyb3IgYXMgQUlTREtFcnJvcjggfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xudmFyIG5hbWU4ID0gXCJBSV9Ob09iamVjdEdlbmVyYXRlZEVycm9yXCI7XG52YXIgbWFya2VyOCA9IGB2ZXJjZWwuYWkuZXJyb3IuJHtuYW1lOH1gO1xudmFyIHN5bWJvbDggPSBTeW1ib2wuZm9yKG1hcmtlcjgpO1xudmFyIF9hODtcbnZhciBOb09iamVjdEdlbmVyYXRlZEVycm9yID0gY2xhc3MgZXh0ZW5kcyBBSVNES0Vycm9yOCB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBtZXNzYWdlID0gXCJObyBvYmplY3QgZ2VuZXJhdGVkLlwiLFxuICAgIGNhdXNlLFxuICAgIHRleHQ6IHRleHQyLFxuICAgIHJlc3BvbnNlLFxuICAgIHVzYWdlLFxuICAgIGZpbmlzaFJlYXNvblxuICB9KSB7XG4gICAgc3VwZXIoeyBuYW1lOiBuYW1lOCwgbWVzc2FnZSwgY2F1c2UgfSk7XG4gICAgdGhpc1tfYThdID0gdHJ1ZTtcbiAgICB0aGlzLnRleHQgPSB0ZXh0MjtcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy51c2FnZSA9IHVzYWdlO1xuICAgIHRoaXMuZmluaXNoUmVhc29uID0gZmluaXNoUmVhc29uO1xuICB9XG4gIHN0YXRpYyBpc0luc3RhbmNlKGVycm9yKSB7XG4gICAgcmV0dXJuIEFJU0RLRXJyb3I4Lmhhc01hcmtlcihlcnJvciwgbWFya2VyOCk7XG4gIH1cbn07XG5fYTggPSBzeW1ib2w4O1xuXG4vLyBzcmMvZXJyb3Ivbm8tb3V0cHV0LWdlbmVyYXRlZC1lcnJvci50c1xuaW1wb3J0IHsgQUlTREtFcnJvciBhcyBBSVNES0Vycm9yOSB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgbmFtZTkgPSBcIkFJX05vT3V0cHV0R2VuZXJhdGVkRXJyb3JcIjtcbnZhciBtYXJrZXI5ID0gYHZlcmNlbC5haS5lcnJvci4ke25hbWU5fWA7XG52YXIgc3ltYm9sOSA9IFN5bWJvbC5mb3IobWFya2VyOSk7XG52YXIgX2E5O1xudmFyIE5vT3V0cHV0R2VuZXJhdGVkRXJyb3IgPSBjbGFzcyBleHRlbmRzIEFJU0RLRXJyb3I5IHtcbiAgLy8gdXNlZCBpbiBpc0luc3RhbmNlXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBtZXNzYWdlID0gXCJObyBvdXRwdXQgZ2VuZXJhdGVkLlwiLFxuICAgIGNhdXNlXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKHsgbmFtZTogbmFtZTksIG1lc3NhZ2UsIGNhdXNlIH0pO1xuICAgIHRoaXNbX2E5XSA9IHRydWU7XG4gIH1cbiAgc3RhdGljIGlzSW5zdGFuY2UoZXJyb3IpIHtcbiAgICByZXR1cm4gQUlTREtFcnJvcjkuaGFzTWFya2VyKGVycm9yLCBtYXJrZXI5KTtcbiAgfVxufTtcbl9hOSA9IHN5bWJvbDk7XG5cbi8vIHNyYy9lcnJvci9uby1zcGVlY2gtZ2VuZXJhdGVkLWVycm9yLnRzXG5pbXBvcnQgeyBBSVNES0Vycm9yIGFzIEFJU0RLRXJyb3IxMCB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgbmFtZTEwID0gXCJBSV9Ob1NwZWVjaEdlbmVyYXRlZEVycm9yXCI7XG52YXIgbWFya2VyMTAgPSBgdmVyY2VsLmFpLmVycm9yLiR7bmFtZTEwfWA7XG52YXIgc3ltYm9sMTAgPSBTeW1ib2wuZm9yKG1hcmtlcjEwKTtcbnZhciBfYTEwO1xudmFyIE5vU3BlZWNoR2VuZXJhdGVkRXJyb3IgPSBjbGFzcyBleHRlbmRzIEFJU0RLRXJyb3IxMCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICBuYW1lOiBuYW1lMTAsXG4gICAgICBtZXNzYWdlOiBcIk5vIHNwZWVjaCBhdWRpbyBnZW5lcmF0ZWQuXCJcbiAgICB9KTtcbiAgICB0aGlzW19hMTBdID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3BvbnNlcyA9IG9wdGlvbnMucmVzcG9uc2VzO1xuICB9XG4gIHN0YXRpYyBpc0luc3RhbmNlKGVycm9yKSB7XG4gICAgcmV0dXJuIEFJU0RLRXJyb3IxMC5oYXNNYXJrZXIoZXJyb3IsIG1hcmtlcjEwKTtcbiAgfVxufTtcbl9hMTAgPSBzeW1ib2wxMDtcblxuLy8gc3JjL2Vycm9yL25vLXRyYW5zY3JpcHQtZ2VuZXJhdGVkLWVycm9yLnRzXG5pbXBvcnQgeyBBSVNES0Vycm9yIGFzIEFJU0RLRXJyb3IxMSB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgbmFtZTExID0gXCJBSV9Ob1RyYW5zY3JpcHRHZW5lcmF0ZWRFcnJvclwiO1xudmFyIG1hcmtlcjExID0gYHZlcmNlbC5haS5lcnJvci4ke25hbWUxMX1gO1xudmFyIHN5bWJvbDExID0gU3ltYm9sLmZvcihtYXJrZXIxMSk7XG52YXIgX2ExMTtcbnZhciBOb1RyYW5zY3JpcHRHZW5lcmF0ZWRFcnJvciA9IGNsYXNzIGV4dGVuZHMgQUlTREtFcnJvcjExIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIG5hbWU6IG5hbWUxMSxcbiAgICAgIG1lc3NhZ2U6IFwiTm8gdHJhbnNjcmlwdCBnZW5lcmF0ZWQuXCJcbiAgICB9KTtcbiAgICB0aGlzW19hMTFdID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3BvbnNlcyA9IG9wdGlvbnMucmVzcG9uc2VzO1xuICB9XG4gIHN0YXRpYyBpc0luc3RhbmNlKGVycm9yKSB7XG4gICAgcmV0dXJuIEFJU0RLRXJyb3IxMS5oYXNNYXJrZXIoZXJyb3IsIG1hcmtlcjExKTtcbiAgfVxufTtcbl9hMTEgPSBzeW1ib2wxMTtcblxuLy8gc3JjL2Vycm9yL25vLXZpZGVvLWdlbmVyYXRlZC1lcnJvci50c1xuaW1wb3J0IHsgQUlTREtFcnJvciBhcyBBSVNES0Vycm9yMTIgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xudmFyIG5hbWUxMiA9IFwiQUlfTm9WaWRlb0dlbmVyYXRlZEVycm9yXCI7XG52YXIgbWFya2VyMTIgPSBgdmVyY2VsLmFpLmVycm9yLiR7bmFtZTEyfWA7XG52YXIgc3ltYm9sMTIgPSBTeW1ib2wuZm9yKG1hcmtlcjEyKTtcbnZhciBfYTEyO1xudmFyIE5vVmlkZW9HZW5lcmF0ZWRFcnJvciA9IGNsYXNzIGV4dGVuZHMgQUlTREtFcnJvcjEyIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG1lc3NhZ2UgPSBcIk5vIHZpZGVvIGdlbmVyYXRlZC5cIixcbiAgICBjYXVzZSxcbiAgICByZXNwb25zZXNcbiAgfSkge1xuICAgIHN1cGVyKHsgbmFtZTogbmFtZTEyLCBtZXNzYWdlLCBjYXVzZSB9KTtcbiAgICB0aGlzW19hMTJdID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3BvbnNlcyA9IHJlc3BvbnNlcztcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBBSVNES0Vycm9yMTIuaGFzTWFya2VyKGVycm9yLCBtYXJrZXIxMik7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgaXNJbnN0YW5jZWAgaW5zdGVhZFxuICAgKi9cbiAgc3RhdGljIGlzTm9WaWRlb0dlbmVyYXRlZEVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gbmFtZTEyICYmIHR5cGVvZiBlcnJvci5yZXNwb25zZXMgIT09IFwidW5kZWZpbmVkXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgdGhpcyBtZXRob2QuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLlxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBzdGFjazogdGhpcy5zdGFjayxcbiAgICAgIGNhdXNlOiB0aGlzLmNhdXNlLFxuICAgICAgcmVzcG9uc2VzOiB0aGlzLnJlc3BvbnNlc1xuICAgIH07XG4gIH1cbn07XG5fYTEyID0gc3ltYm9sMTI7XG5cbi8vIHNyYy9lcnJvci9uby1zdWNoLXRvb2wtZXJyb3IudHNcbmltcG9ydCB7IEFJU0RLRXJyb3IgYXMgQUlTREtFcnJvcjEzIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbnZhciBuYW1lMTMgPSBcIkFJX05vU3VjaFRvb2xFcnJvclwiO1xudmFyIG1hcmtlcjEzID0gYHZlcmNlbC5haS5lcnJvci4ke25hbWUxM31gO1xudmFyIHN5bWJvbDEzID0gU3ltYm9sLmZvcihtYXJrZXIxMyk7XG52YXIgX2ExMztcbnZhciBOb1N1Y2hUb29sRXJyb3IgPSBjbGFzcyBleHRlbmRzIEFJU0RLRXJyb3IxMyB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICB0b29sTmFtZSxcbiAgICBhdmFpbGFibGVUb29scyA9IHZvaWQgMCxcbiAgICBtZXNzYWdlID0gYE1vZGVsIHRyaWVkIHRvIGNhbGwgdW5hdmFpbGFibGUgdG9vbCAnJHt0b29sTmFtZX0nLiAke2F2YWlsYWJsZVRvb2xzID09PSB2b2lkIDAgPyBcIk5vIHRvb2xzIGFyZSBhdmFpbGFibGUuXCIgOiBgQXZhaWxhYmxlIHRvb2xzOiAke2F2YWlsYWJsZVRvb2xzLmpvaW4oXCIsIFwiKX0uYH1gXG4gIH0pIHtcbiAgICBzdXBlcih7IG5hbWU6IG5hbWUxMywgbWVzc2FnZSB9KTtcbiAgICB0aGlzW19hMTNdID0gdHJ1ZTtcbiAgICB0aGlzLnRvb2xOYW1lID0gdG9vbE5hbWU7XG4gICAgdGhpcy5hdmFpbGFibGVUb29scyA9IGF2YWlsYWJsZVRvb2xzO1xuICB9XG4gIHN0YXRpYyBpc0luc3RhbmNlKGVycm9yKSB7XG4gICAgcmV0dXJuIEFJU0RLRXJyb3IxMy5oYXNNYXJrZXIoZXJyb3IsIG1hcmtlcjEzKTtcbiAgfVxufTtcbl9hMTMgPSBzeW1ib2wxMztcblxuLy8gc3JjL2Vycm9yL3Rvb2wtY2FsbC1yZXBhaXItZXJyb3IudHNcbmltcG9ydCB7IEFJU0RLRXJyb3IgYXMgQUlTREtFcnJvcjE0LCBnZXRFcnJvck1lc3NhZ2UgYXMgZ2V0RXJyb3JNZXNzYWdlMiB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgbmFtZTE0ID0gXCJBSV9Ub29sQ2FsbFJlcGFpckVycm9yXCI7XG52YXIgbWFya2VyMTQgPSBgdmVyY2VsLmFpLmVycm9yLiR7bmFtZTE0fWA7XG52YXIgc3ltYm9sMTQgPSBTeW1ib2wuZm9yKG1hcmtlcjE0KTtcbnZhciBfYTE0O1xudmFyIFRvb2xDYWxsUmVwYWlyRXJyb3IgPSBjbGFzcyBleHRlbmRzIEFJU0RLRXJyb3IxNCB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBjYXVzZSxcbiAgICBvcmlnaW5hbEVycm9yLFxuICAgIG1lc3NhZ2UgPSBgRXJyb3IgcmVwYWlyaW5nIHRvb2wgY2FsbDogJHtnZXRFcnJvck1lc3NhZ2UyKGNhdXNlKX1gXG4gIH0pIHtcbiAgICBzdXBlcih7IG5hbWU6IG5hbWUxNCwgbWVzc2FnZSwgY2F1c2UgfSk7XG4gICAgdGhpc1tfYTE0XSA9IHRydWU7XG4gICAgdGhpcy5vcmlnaW5hbEVycm9yID0gb3JpZ2luYWxFcnJvcjtcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBBSVNES0Vycm9yMTQuaGFzTWFya2VyKGVycm9yLCBtYXJrZXIxNCk7XG4gIH1cbn07XG5fYTE0ID0gc3ltYm9sMTQ7XG5cbi8vIHNyYy9lcnJvci91bnN1cHBvcnRlZC1tb2RlbC12ZXJzaW9uLWVycm9yLnRzXG5pbXBvcnQgeyBBSVNES0Vycm9yIGFzIEFJU0RLRXJyb3IxNSB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgVW5zdXBwb3J0ZWRNb2RlbFZlcnNpb25FcnJvciA9IGNsYXNzIGV4dGVuZHMgQUlTREtFcnJvcjE1IHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIG5hbWU6IFwiQUlfVW5zdXBwb3J0ZWRNb2RlbFZlcnNpb25FcnJvclwiLFxuICAgICAgbWVzc2FnZTogYFVuc3VwcG9ydGVkIG1vZGVsIHZlcnNpb24gJHtvcHRpb25zLnZlcnNpb259IGZvciBwcm92aWRlciBcIiR7b3B0aW9ucy5wcm92aWRlcn1cIiBhbmQgbW9kZWwgXCIke29wdGlvbnMubW9kZWxJZH1cIi4gQUkgU0RLIDUgb25seSBzdXBwb3J0cyBtb2RlbHMgdGhhdCBpbXBsZW1lbnQgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIFwidjJcIi5gXG4gICAgfSk7XG4gICAgdGhpcy52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uO1xuICAgIHRoaXMucHJvdmlkZXIgPSBvcHRpb25zLnByb3ZpZGVyO1xuICAgIHRoaXMubW9kZWxJZCA9IG9wdGlvbnMubW9kZWxJZDtcbiAgfVxufTtcblxuLy8gc3JjL2Vycm9yL3VpLW1lc3NhZ2Utc3RyZWFtLWVycm9yLnRzXG5pbXBvcnQgeyBBSVNES0Vycm9yIGFzIEFJU0RLRXJyb3IxNiB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgbmFtZTE1ID0gXCJBSV9VSU1lc3NhZ2VTdHJlYW1FcnJvclwiO1xudmFyIG1hcmtlcjE1ID0gYHZlcmNlbC5haS5lcnJvci4ke25hbWUxNX1gO1xudmFyIHN5bWJvbDE1ID0gU3ltYm9sLmZvcihtYXJrZXIxNSk7XG52YXIgX2ExNTtcbnZhciBVSU1lc3NhZ2VTdHJlYW1FcnJvciA9IGNsYXNzIGV4dGVuZHMgQUlTREtFcnJvcjE2IHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNodW5rVHlwZSxcbiAgICBjaHVua0lkLFxuICAgIG1lc3NhZ2VcbiAgfSkge1xuICAgIHN1cGVyKHsgbmFtZTogbmFtZTE1LCBtZXNzYWdlIH0pO1xuICAgIHRoaXNbX2ExNV0gPSB0cnVlO1xuICAgIHRoaXMuY2h1bmtUeXBlID0gY2h1bmtUeXBlO1xuICAgIHRoaXMuY2h1bmtJZCA9IGNodW5rSWQ7XG4gIH1cbiAgc3RhdGljIGlzSW5zdGFuY2UoZXJyb3IpIHtcbiAgICByZXR1cm4gQUlTREtFcnJvcjE2Lmhhc01hcmtlcihlcnJvciwgbWFya2VyMTUpO1xuICB9XG59O1xuX2ExNSA9IHN5bWJvbDE1O1xuXG4vLyBzcmMvcHJvbXB0L2ludmFsaWQtZGF0YS1jb250ZW50LWVycm9yLnRzXG5pbXBvcnQgeyBBSVNES0Vycm9yIGFzIEFJU0RLRXJyb3IxNyB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgbmFtZTE2ID0gXCJBSV9JbnZhbGlkRGF0YUNvbnRlbnRFcnJvclwiO1xudmFyIG1hcmtlcjE2ID0gYHZlcmNlbC5haS5lcnJvci4ke25hbWUxNn1gO1xudmFyIHN5bWJvbDE2ID0gU3ltYm9sLmZvcihtYXJrZXIxNik7XG52YXIgX2ExNjtcbnZhciBJbnZhbGlkRGF0YUNvbnRlbnRFcnJvciA9IGNsYXNzIGV4dGVuZHMgQUlTREtFcnJvcjE3IHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNvbnRlbnQsXG4gICAgY2F1c2UsXG4gICAgbWVzc2FnZSA9IGBJbnZhbGlkIGRhdGEgY29udGVudC4gRXhwZWN0ZWQgYSBiYXNlNjQgc3RyaW5nLCBVaW50OEFycmF5LCBBcnJheUJ1ZmZlciwgb3IgQnVmZmVyLCBidXQgZ290ICR7dHlwZW9mIGNvbnRlbnR9LmBcbiAgfSkge1xuICAgIHN1cGVyKHsgbmFtZTogbmFtZTE2LCBtZXNzYWdlLCBjYXVzZSB9KTtcbiAgICB0aGlzW19hMTZdID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICB9XG4gIHN0YXRpYyBpc0luc3RhbmNlKGVycm9yKSB7XG4gICAgcmV0dXJuIEFJU0RLRXJyb3IxNy5oYXNNYXJrZXIoZXJyb3IsIG1hcmtlcjE2KTtcbiAgfVxufTtcbl9hMTYgPSBzeW1ib2wxNjtcblxuLy8gc3JjL3Byb21wdC9pbnZhbGlkLW1lc3NhZ2Utcm9sZS1lcnJvci50c1xuaW1wb3J0IHsgQUlTREtFcnJvciBhcyBBSVNES0Vycm9yMTggfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xudmFyIG5hbWUxNyA9IFwiQUlfSW52YWxpZE1lc3NhZ2VSb2xlRXJyb3JcIjtcbnZhciBtYXJrZXIxNyA9IGB2ZXJjZWwuYWkuZXJyb3IuJHtuYW1lMTd9YDtcbnZhciBzeW1ib2wxNyA9IFN5bWJvbC5mb3IobWFya2VyMTcpO1xudmFyIF9hMTc7XG52YXIgSW52YWxpZE1lc3NhZ2VSb2xlRXJyb3IgPSBjbGFzcyBleHRlbmRzIEFJU0RLRXJyb3IxOCB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICByb2xlLFxuICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBtZXNzYWdlIHJvbGU6ICcke3JvbGV9Jy4gTXVzdCBiZSBvbmUgb2Y6IFwic3lzdGVtXCIsIFwidXNlclwiLCBcImFzc2lzdGFudFwiLCBcInRvb2xcIi5gXG4gIH0pIHtcbiAgICBzdXBlcih7IG5hbWU6IG5hbWUxNywgbWVzc2FnZSB9KTtcbiAgICB0aGlzW19hMTddID0gdHJ1ZTtcbiAgICB0aGlzLnJvbGUgPSByb2xlO1xuICB9XG4gIHN0YXRpYyBpc0luc3RhbmNlKGVycm9yKSB7XG4gICAgcmV0dXJuIEFJU0RLRXJyb3IxOC5oYXNNYXJrZXIoZXJyb3IsIG1hcmtlcjE3KTtcbiAgfVxufTtcbl9hMTcgPSBzeW1ib2wxNztcblxuLy8gc3JjL3Byb21wdC9tZXNzYWdlLWNvbnZlcnNpb24tZXJyb3IudHNcbmltcG9ydCB7IEFJU0RLRXJyb3IgYXMgQUlTREtFcnJvcjE5IH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbnZhciBuYW1lMTggPSBcIkFJX01lc3NhZ2VDb252ZXJzaW9uRXJyb3JcIjtcbnZhciBtYXJrZXIxOCA9IGB2ZXJjZWwuYWkuZXJyb3IuJHtuYW1lMTh9YDtcbnZhciBzeW1ib2wxOCA9IFN5bWJvbC5mb3IobWFya2VyMTgpO1xudmFyIF9hMTg7XG52YXIgTWVzc2FnZUNvbnZlcnNpb25FcnJvciA9IGNsYXNzIGV4dGVuZHMgQUlTREtFcnJvcjE5IHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG9yaWdpbmFsTWVzc2FnZSxcbiAgICBtZXNzYWdlXG4gIH0pIHtcbiAgICBzdXBlcih7IG5hbWU6IG5hbWUxOCwgbWVzc2FnZSB9KTtcbiAgICB0aGlzW19hMThdID0gdHJ1ZTtcbiAgICB0aGlzLm9yaWdpbmFsTWVzc2FnZSA9IG9yaWdpbmFsTWVzc2FnZTtcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBBSVNES0Vycm9yMTkuaGFzTWFya2VyKGVycm9yLCBtYXJrZXIxOCk7XG4gIH1cbn07XG5fYTE4ID0gc3ltYm9sMTg7XG5cbi8vIHNyYy9lcnJvci9pbmRleC50c1xuaW1wb3J0IHsgRG93bmxvYWRFcnJvciB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5cbi8vIHNyYy91dGlsL3JldHJ5LWVycm9yLnRzXG5pbXBvcnQgeyBBSVNES0Vycm9yIGFzIEFJU0RLRXJyb3IyMCB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgbmFtZTE5ID0gXCJBSV9SZXRyeUVycm9yXCI7XG52YXIgbWFya2VyMTkgPSBgdmVyY2VsLmFpLmVycm9yLiR7bmFtZTE5fWA7XG52YXIgc3ltYm9sMTkgPSBTeW1ib2wuZm9yKG1hcmtlcjE5KTtcbnZhciBfYTE5O1xudmFyIFJldHJ5RXJyb3IgPSBjbGFzcyBleHRlbmRzIEFJU0RLRXJyb3IyMCB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBtZXNzYWdlLFxuICAgIHJlYXNvbixcbiAgICBlcnJvcnNcbiAgfSkge1xuICAgIHN1cGVyKHsgbmFtZTogbmFtZTE5LCBtZXNzYWdlIH0pO1xuICAgIHRoaXNbX2ExOV0gPSB0cnVlO1xuICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIHRoaXMubGFzdEVycm9yID0gZXJyb3JzW2Vycm9ycy5sZW5ndGggLSAxXTtcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBBSVNES0Vycm9yMjAuaGFzTWFya2VyKGVycm9yLCBtYXJrZXIxOSk7XG4gIH1cbn07XG5fYTE5ID0gc3ltYm9sMTk7XG5cbi8vIHNyYy91dGlsL2FzLWFycmF5LnRzXG5mdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdm9pZCAwID8gW10gOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuLy8gc3JjL3V0aWwvbm90aWZ5LnRzXG5hc3luYyBmdW5jdGlvbiBub3RpZnkob3B0aW9ucykge1xuICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGFzQXJyYXkob3B0aW9ucy5jYWxsYmFja3MpKSB7XG4gICAgaWYgKGNhbGxiYWNrID09IG51bGwpXG4gICAgICBjb250aW51ZTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2FsbGJhY2sob3B0aW9ucy5ldmVudCk7XG4gICAgfSBjYXRjaCAoX2lnbm9yZWQpIHtcbiAgICB9XG4gIH1cbn1cblxuLy8gc3JjL2xvZ2dlci9sb2ctd2FybmluZ3MudHNcbmZ1bmN0aW9uIGZvcm1hdFdhcm5pbmcoe1xuICB3YXJuaW5nLFxuICBwcm92aWRlcixcbiAgbW9kZWxcbn0pIHtcbiAgY29uc3QgcHJlZml4ID0gYEFJIFNESyBXYXJuaW5nICgke3Byb3ZpZGVyfSAvICR7bW9kZWx9KTpgO1xuICBzd2l0Y2ggKHdhcm5pbmcudHlwZSkge1xuICAgIGNhc2UgXCJ1bnN1cHBvcnRlZFwiOiB7XG4gICAgICBsZXQgbWVzc2FnZSA9IGAke3ByZWZpeH0gVGhlIGZlYXR1cmUgXCIke3dhcm5pbmcuZmVhdHVyZX1cIiBpcyBub3Qgc3VwcG9ydGVkLmA7XG4gICAgICBpZiAod2FybmluZy5kZXRhaWxzKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYCAke3dhcm5pbmcuZGV0YWlsc31gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGNhc2UgXCJjb21wYXRpYmlsaXR5XCI6IHtcbiAgICAgIGxldCBtZXNzYWdlID0gYCR7cHJlZml4fSBUaGUgZmVhdHVyZSBcIiR7d2FybmluZy5mZWF0dXJlfVwiIGlzIHVzZWQgaW4gYSBjb21wYXRpYmlsaXR5IG1vZGUuYDtcbiAgICAgIGlmICh3YXJuaW5nLmRldGFpbHMpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgICR7d2FybmluZy5kZXRhaWxzfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgY2FzZSBcIm90aGVyXCI6IHtcbiAgICAgIHJldHVybiBgJHtwcmVmaXh9ICR7d2FybmluZy5tZXNzYWdlfWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBgJHtwcmVmaXh9ICR7SlNPTi5zdHJpbmdpZnkod2FybmluZywgbnVsbCwgMil9YDtcbiAgICB9XG4gIH1cbn1cbnZhciBGSVJTVF9XQVJOSU5HX0lORk9fTUVTU0FHRSA9IFwiQUkgU0RLIFdhcm5pbmcgU3lzdGVtOiBUbyB0dXJuIG9mZiB3YXJuaW5nIGxvZ2dpbmcsIHNldCB0aGUgQUlfU0RLX0xPR19XQVJOSU5HUyBnbG9iYWwgdG8gZmFsc2UuXCI7XG52YXIgaGFzTG9nZ2VkQmVmb3JlID0gZmFsc2U7XG52YXIgbG9nV2FybmluZ3MgPSAob3B0aW9ucykgPT4ge1xuICBpZiAob3B0aW9ucy53YXJuaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbG9nZ2VyID0gZ2xvYmFsVGhpcy5BSV9TREtfTE9HX1dBUk5JTkdTO1xuICBpZiAobG9nZ2VyID09PSBmYWxzZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodHlwZW9mIGxvZ2dlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbG9nZ2VyKG9wdGlvbnMpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWhhc0xvZ2dlZEJlZm9yZSkge1xuICAgIGhhc0xvZ2dlZEJlZm9yZSA9IHRydWU7XG4gICAgY29uc29sZS5pbmZvKEZJUlNUX1dBUk5JTkdfSU5GT19NRVNTQUdFKTtcbiAgfVxuICBmb3IgKGNvbnN0IHdhcm5pbmcgb2Ygb3B0aW9ucy53YXJuaW5ncykge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGZvcm1hdFdhcm5pbmcoe1xuICAgICAgICB3YXJuaW5nLFxuICAgICAgICBwcm92aWRlcjogb3B0aW9ucy5wcm92aWRlcixcbiAgICAgICAgbW9kZWw6IG9wdGlvbnMubW9kZWxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufTtcblxuLy8gc3JjL21vZGVsL3Jlc29sdmUtbW9kZWwudHNcbmltcG9ydCB7IGdhdGV3YXkgfSBmcm9tIFwiQGFpLXNkay9nYXRld2F5XCI7XG5cbi8vIHNyYy91dGlsL2xvZy12Mi1jb21wYXRpYmlsaXR5LXdhcm5pbmcudHNcbmZ1bmN0aW9uIGxvZ1YyQ29tcGF0aWJpbGl0eVdhcm5pbmcoe1xuICBwcm92aWRlcixcbiAgbW9kZWxJZFxufSkge1xuICBsb2dXYXJuaW5ncyh7XG4gICAgd2FybmluZ3M6IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjb21wYXRpYmlsaXR5XCIsXG4gICAgICAgIGZlYXR1cmU6IFwic3BlY2lmaWNhdGlvblZlcnNpb25cIixcbiAgICAgICAgZGV0YWlsczogYFVzaW5nIHYyIHNwZWNpZmljYXRpb24gY29tcGF0aWJpbGl0eSBtb2RlLiBTb21lIGZlYXR1cmVzIG1heSBub3QgYmUgYXZhaWxhYmxlLmBcbiAgICAgIH1cbiAgICBdLFxuICAgIHByb3ZpZGVyLFxuICAgIG1vZGVsOiBtb2RlbElkXG4gIH0pO1xufVxuXG4vLyBzcmMvbW9kZWwvYXMtZW1iZWRkaW5nLW1vZGVsLXYzLnRzXG5mdW5jdGlvbiBhc0VtYmVkZGluZ01vZGVsVjMobW9kZWwpIHtcbiAgaWYgKG1vZGVsLnNwZWNpZmljYXRpb25WZXJzaW9uID09PSBcInYzXCIpIHtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cbiAgbG9nVjJDb21wYXRpYmlsaXR5V2FybmluZyh7XG4gICAgcHJvdmlkZXI6IG1vZGVsLnByb3ZpZGVyLFxuICAgIG1vZGVsSWQ6IG1vZGVsLm1vZGVsSWRcbiAgfSk7XG4gIHJldHVybiBuZXcgUHJveHkobW9kZWwsIHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICBpZiAocHJvcCA9PT0gXCJzcGVjaWZpY2F0aW9uVmVyc2lvblwiKVxuICAgICAgICByZXR1cm4gXCJ2M1wiO1xuICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBzcmMvbW9kZWwvYXMtaW1hZ2UtbW9kZWwtdjMudHNcbmZ1bmN0aW9uIGFzSW1hZ2VNb2RlbFYzKG1vZGVsKSB7XG4gIGlmIChtb2RlbC5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9PT0gXCJ2M1wiKSB7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG4gIGxvZ1YyQ29tcGF0aWJpbGl0eVdhcm5pbmcoe1xuICAgIHByb3ZpZGVyOiBtb2RlbC5wcm92aWRlcixcbiAgICBtb2RlbElkOiBtb2RlbC5tb2RlbElkXG4gIH0pO1xuICByZXR1cm4gbmV3IFByb3h5KG1vZGVsLCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHByb3AgPT09IFwic3BlY2lmaWNhdGlvblZlcnNpb25cIilcbiAgICAgICAgcmV0dXJuIFwidjNcIjtcbiAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgfVxuICB9KTtcbn1cblxuLy8gc3JjL21vZGVsL2FzLWxhbmd1YWdlLW1vZGVsLXYzLnRzXG5mdW5jdGlvbiBhc0xhbmd1YWdlTW9kZWxWMyhtb2RlbCkge1xuICBpZiAobW9kZWwuc3BlY2lmaWNhdGlvblZlcnNpb24gPT09IFwidjNcIikge1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuICBsb2dWMkNvbXBhdGliaWxpdHlXYXJuaW5nKHtcbiAgICBwcm92aWRlcjogbW9kZWwucHJvdmlkZXIsXG4gICAgbW9kZWxJZDogbW9kZWwubW9kZWxJZFxuICB9KTtcbiAgcmV0dXJuIG5ldyBQcm94eShtb2RlbCwge1xuICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgIHN3aXRjaCAocHJvcCkge1xuICAgICAgICBjYXNlIFwic3BlY2lmaWNhdGlvblZlcnNpb25cIjpcbiAgICAgICAgICByZXR1cm4gXCJ2M1wiO1xuICAgICAgICBjYXNlIFwiZG9HZW5lcmF0ZVwiOlxuICAgICAgICAgIHJldHVybiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFyZ2V0LmRvR2VuZXJhdGUoLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbjogY29udmVydFYyRmluaXNoUmVhc29uVG9WMyhyZXN1bHQuZmluaXNoUmVhc29uKSxcbiAgICAgICAgICAgICAgdXNhZ2U6IGNvbnZlcnRWMlVzYWdlVG9WMyhyZXN1bHQudXNhZ2UpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJkb1N0cmVhbVwiOlxuICAgICAgICAgIHJldHVybiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFyZ2V0LmRvU3RyZWFtKC4uLmFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgICAgICBzdHJlYW06IGNvbnZlcnRWMlN0cmVhbVRvVjMocmVzdWx0LnN0cmVhbSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VjJTdHJlYW1Ub1YzKHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtLnBpcGVUaHJvdWdoKFxuICAgIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAgIHN3aXRjaCAoY2h1bmsudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJmaW5pc2hcIjpcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgIC4uLmNodW5rLFxuICAgICAgICAgICAgICBmaW5pc2hSZWFzb246IGNvbnZlcnRWMkZpbmlzaFJlYXNvblRvVjMoY2h1bmsuZmluaXNoUmVhc29uKSxcbiAgICAgICAgICAgICAgdXNhZ2U6IGNvbnZlcnRWMlVzYWdlVG9WMyhjaHVuay51c2FnZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VjJGaW5pc2hSZWFzb25Ub1YzKGZpbmlzaFJlYXNvbikge1xuICByZXR1cm4ge1xuICAgIHVuaWZpZWQ6IGZpbmlzaFJlYXNvbiA9PT0gXCJ1bmtub3duXCIgPyBcIm90aGVyXCIgOiBmaW5pc2hSZWFzb24sXG4gICAgcmF3OiB2b2lkIDBcbiAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRWMlVzYWdlVG9WMyh1c2FnZSkge1xuICByZXR1cm4ge1xuICAgIGlucHV0VG9rZW5zOiB7XG4gICAgICB0b3RhbDogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICBub0NhY2hlOiB2b2lkIDAsXG4gICAgICBjYWNoZVJlYWQ6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgY2FjaGVXcml0ZTogdm9pZCAwXG4gICAgfSxcbiAgICBvdXRwdXRUb2tlbnM6IHtcbiAgICAgIHRvdGFsOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICB0ZXh0OiB2b2lkIDAsXG4gICAgICByZWFzb25pbmc6IHVzYWdlLnJlYXNvbmluZ1Rva2Vuc1xuICAgIH1cbiAgfTtcbn1cblxuLy8gc3JjL21vZGVsL2FzLXNwZWVjaC1tb2RlbC12My50c1xuZnVuY3Rpb24gYXNTcGVlY2hNb2RlbFYzKG1vZGVsKSB7XG4gIGlmIChtb2RlbC5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9PT0gXCJ2M1wiKSB7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG4gIGxvZ1YyQ29tcGF0aWJpbGl0eVdhcm5pbmcoe1xuICAgIHByb3ZpZGVyOiBtb2RlbC5wcm92aWRlcixcbiAgICBtb2RlbElkOiBtb2RlbC5tb2RlbElkXG4gIH0pO1xuICByZXR1cm4gbmV3IFByb3h5KG1vZGVsLCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHByb3AgPT09IFwic3BlY2lmaWNhdGlvblZlcnNpb25cIilcbiAgICAgICAgcmV0dXJuIFwidjNcIjtcbiAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgfVxuICB9KTtcbn1cblxuLy8gc3JjL21vZGVsL2FzLXRyYW5zY3JpcHRpb24tbW9kZWwtdjMudHNcbmZ1bmN0aW9uIGFzVHJhbnNjcmlwdGlvbk1vZGVsVjMobW9kZWwpIHtcbiAgaWYgKG1vZGVsLnNwZWNpZmljYXRpb25WZXJzaW9uID09PSBcInYzXCIpIHtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cbiAgbG9nVjJDb21wYXRpYmlsaXR5V2FybmluZyh7XG4gICAgcHJvdmlkZXI6IG1vZGVsLnByb3ZpZGVyLFxuICAgIG1vZGVsSWQ6IG1vZGVsLm1vZGVsSWRcbiAgfSk7XG4gIHJldHVybiBuZXcgUHJveHkobW9kZWwsIHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICBpZiAocHJvcCA9PT0gXCJzcGVjaWZpY2F0aW9uVmVyc2lvblwiKVxuICAgICAgICByZXR1cm4gXCJ2M1wiO1xuICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBzcmMvbW9kZWwvcmVzb2x2ZS1tb2RlbC50c1xuZnVuY3Rpb24gcmVzb2x2ZUxhbmd1YWdlTW9kZWwobW9kZWwpIHtcbiAgaWYgKHR5cGVvZiBtb2RlbCAhPT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChtb2RlbC5zcGVjaWZpY2F0aW9uVmVyc2lvbiAhPT0gXCJ2M1wiICYmIG1vZGVsLnNwZWNpZmljYXRpb25WZXJzaW9uICE9PSBcInYyXCIpIHtcbiAgICAgIGNvbnN0IHVuc3VwcG9ydGVkTW9kZWwgPSBtb2RlbDtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE1vZGVsVmVyc2lvbkVycm9yKHtcbiAgICAgICAgdmVyc2lvbjogdW5zdXBwb3J0ZWRNb2RlbC5zcGVjaWZpY2F0aW9uVmVyc2lvbixcbiAgICAgICAgcHJvdmlkZXI6IHVuc3VwcG9ydGVkTW9kZWwucHJvdmlkZXIsXG4gICAgICAgIG1vZGVsSWQ6IHVuc3VwcG9ydGVkTW9kZWwubW9kZWxJZFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBhc0xhbmd1YWdlTW9kZWxWMyhtb2RlbCk7XG4gIH1cbiAgcmV0dXJuIGdldEdsb2JhbFByb3ZpZGVyKCkubGFuZ3VhZ2VNb2RlbChtb2RlbCk7XG59XG5mdW5jdGlvbiByZXNvbHZlRW1iZWRkaW5nTW9kZWwobW9kZWwpIHtcbiAgaWYgKHR5cGVvZiBtb2RlbCAhPT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChtb2RlbC5zcGVjaWZpY2F0aW9uVmVyc2lvbiAhPT0gXCJ2M1wiICYmIG1vZGVsLnNwZWNpZmljYXRpb25WZXJzaW9uICE9PSBcInYyXCIpIHtcbiAgICAgIGNvbnN0IHVuc3VwcG9ydGVkTW9kZWwgPSBtb2RlbDtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE1vZGVsVmVyc2lvbkVycm9yKHtcbiAgICAgICAgdmVyc2lvbjogdW5zdXBwb3J0ZWRNb2RlbC5zcGVjaWZpY2F0aW9uVmVyc2lvbixcbiAgICAgICAgcHJvdmlkZXI6IHVuc3VwcG9ydGVkTW9kZWwucHJvdmlkZXIsXG4gICAgICAgIG1vZGVsSWQ6IHVuc3VwcG9ydGVkTW9kZWwubW9kZWxJZFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBhc0VtYmVkZGluZ01vZGVsVjMobW9kZWwpO1xuICB9XG4gIHJldHVybiBnZXRHbG9iYWxQcm92aWRlcigpLmVtYmVkZGluZ01vZGVsKG1vZGVsKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2NyaXB0aW9uTW9kZWwobW9kZWwpIHtcbiAgdmFyIF9hMjEsIF9iO1xuICBpZiAodHlwZW9mIG1vZGVsICE9PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKG1vZGVsLnNwZWNpZmljYXRpb25WZXJzaW9uICE9PSBcInYzXCIgJiYgbW9kZWwuc3BlY2lmaWNhdGlvblZlcnNpb24gIT09IFwidjJcIikge1xuICAgICAgY29uc3QgdW5zdXBwb3J0ZWRNb2RlbCA9IG1vZGVsO1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkTW9kZWxWZXJzaW9uRXJyb3Ioe1xuICAgICAgICB2ZXJzaW9uOiB1bnN1cHBvcnRlZE1vZGVsLnNwZWNpZmljYXRpb25WZXJzaW9uLFxuICAgICAgICBwcm92aWRlcjogdW5zdXBwb3J0ZWRNb2RlbC5wcm92aWRlcixcbiAgICAgICAgbW9kZWxJZDogdW5zdXBwb3J0ZWRNb2RlbC5tb2RlbElkXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFzVHJhbnNjcmlwdGlvbk1vZGVsVjMobW9kZWwpO1xuICB9XG4gIHJldHVybiAoX2IgPSAoX2EyMSA9IGdldEdsb2JhbFByb3ZpZGVyKCkpLnRyYW5zY3JpcHRpb25Nb2RlbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EyMSwgbW9kZWwpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVNwZWVjaE1vZGVsKG1vZGVsKSB7XG4gIHZhciBfYTIxLCBfYjtcbiAgaWYgKHR5cGVvZiBtb2RlbCAhPT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChtb2RlbC5zcGVjaWZpY2F0aW9uVmVyc2lvbiAhPT0gXCJ2M1wiICYmIG1vZGVsLnNwZWNpZmljYXRpb25WZXJzaW9uICE9PSBcInYyXCIpIHtcbiAgICAgIGNvbnN0IHVuc3VwcG9ydGVkTW9kZWwgPSBtb2RlbDtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE1vZGVsVmVyc2lvbkVycm9yKHtcbiAgICAgICAgdmVyc2lvbjogdW5zdXBwb3J0ZWRNb2RlbC5zcGVjaWZpY2F0aW9uVmVyc2lvbixcbiAgICAgICAgcHJvdmlkZXI6IHVuc3VwcG9ydGVkTW9kZWwucHJvdmlkZXIsXG4gICAgICAgIG1vZGVsSWQ6IHVuc3VwcG9ydGVkTW9kZWwubW9kZWxJZFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBhc1NwZWVjaE1vZGVsVjMobW9kZWwpO1xuICB9XG4gIHJldHVybiAoX2IgPSAoX2EyMSA9IGdldEdsb2JhbFByb3ZpZGVyKCkpLnNwZWVjaE1vZGVsKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChfYTIxLCBtb2RlbCk7XG59XG5mdW5jdGlvbiByZXNvbHZlSW1hZ2VNb2RlbChtb2RlbCkge1xuICBpZiAodHlwZW9mIG1vZGVsICE9PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKG1vZGVsLnNwZWNpZmljYXRpb25WZXJzaW9uICE9PSBcInYzXCIgJiYgbW9kZWwuc3BlY2lmaWNhdGlvblZlcnNpb24gIT09IFwidjJcIikge1xuICAgICAgY29uc3QgdW5zdXBwb3J0ZWRNb2RlbCA9IG1vZGVsO1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkTW9kZWxWZXJzaW9uRXJyb3Ioe1xuICAgICAgICB2ZXJzaW9uOiB1bnN1cHBvcnRlZE1vZGVsLnNwZWNpZmljYXRpb25WZXJzaW9uLFxuICAgICAgICBwcm92aWRlcjogdW5zdXBwb3J0ZWRNb2RlbC5wcm92aWRlcixcbiAgICAgICAgbW9kZWxJZDogdW5zdXBwb3J0ZWRNb2RlbC5tb2RlbElkXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFzSW1hZ2VNb2RlbFYzKG1vZGVsKTtcbiAgfVxuICByZXR1cm4gZ2V0R2xvYmFsUHJvdmlkZXIoKS5pbWFnZU1vZGVsKG1vZGVsKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVWaWRlb01vZGVsKG1vZGVsKSB7XG4gIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IGdldEdsb2JhbFByb3ZpZGVyKCk7XG4gICAgY29uc3QgdmlkZW9Nb2RlbCA9IHByb3ZpZGVyLnZpZGVvTW9kZWw7XG4gICAgaWYgKCF2aWRlb01vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgZGVmYXVsdCBwcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIG1vZGVscy4gUGxlYXNlIHVzZSBhIEV4cGVyaW1lbnRhbF9WaWRlb01vZGVsVjMgb2JqZWN0IGZyb20gYSBwcm92aWRlciAoZS5nLiwgdmVydGV4LnZpZGVvKFwibW9kZWwtaWRcIikpLidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB2aWRlb01vZGVsKG1vZGVsKTtcbiAgfVxuICBpZiAobW9kZWwuc3BlY2lmaWNhdGlvblZlcnNpb24gIT09IFwidjNcIikge1xuICAgIGNvbnN0IHVuc3VwcG9ydGVkTW9kZWwgPSBtb2RlbDtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRNb2RlbFZlcnNpb25FcnJvcih7XG4gICAgICB2ZXJzaW9uOiB1bnN1cHBvcnRlZE1vZGVsLnNwZWNpZmljYXRpb25WZXJzaW9uLFxuICAgICAgcHJvdmlkZXI6IHVuc3VwcG9ydGVkTW9kZWwucHJvdmlkZXIsXG4gICAgICBtb2RlbElkOiB1bnN1cHBvcnRlZE1vZGVsLm1vZGVsSWRcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbW9kZWw7XG59XG5mdW5jdGlvbiBnZXRHbG9iYWxQcm92aWRlcigpIHtcbiAgdmFyIF9hMjE7XG4gIHJldHVybiAoX2EyMSA9IGdsb2JhbFRoaXMuQUlfU0RLX0RFRkFVTFRfUFJPVklERVIpICE9IG51bGwgPyBfYTIxIDogZ2F0ZXdheTtcbn1cblxuLy8gc3JjL3Byb21wdC9jYWxsLXNldHRpbmdzLnRzXG5mdW5jdGlvbiBnZXRUb3RhbFRpbWVvdXRNcyh0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0ID09IG51bGwpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlmICh0eXBlb2YgdGltZW91dCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiB0aW1lb3V0O1xuICB9XG4gIHJldHVybiB0aW1lb3V0LnRvdGFsTXM7XG59XG5mdW5jdGlvbiBnZXRTdGVwVGltZW91dE1zKHRpbWVvdXQpIHtcbiAgaWYgKHRpbWVvdXQgPT0gbnVsbCB8fCB0eXBlb2YgdGltZW91dCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgcmV0dXJuIHRpbWVvdXQuc3RlcE1zO1xufVxuZnVuY3Rpb24gZ2V0Q2h1bmtUaW1lb3V0TXModGltZW91dCkge1xuICBpZiAodGltZW91dCA9PSBudWxsIHx8IHR5cGVvZiB0aW1lb3V0ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICByZXR1cm4gdGltZW91dC5jaHVua01zO1xufVxuXG4vLyBzcmMvcHJvbXB0L2NvbnZlcnQtdG8tbGFuZ3VhZ2UtbW9kZWwtcHJvbXB0LnRzXG5pbXBvcnQge1xuICBpc1VybFN1cHBvcnRlZFxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvdXRpbC9kZXRlY3QtbWVkaWEtdHlwZS50c1xuaW1wb3J0IHsgY29udmVydEJhc2U2NFRvVWludDhBcnJheSB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG52YXIgaW1hZ2VNZWRpYVR5cGVTaWduYXR1cmVzID0gW1xuICB7XG4gICAgbWVkaWFUeXBlOiBcImltYWdlL2dpZlwiLFxuICAgIGJ5dGVzUHJlZml4OiBbNzEsIDczLCA3MF1cbiAgICAvLyBHSUZcbiAgfSxcbiAge1xuICAgIG1lZGlhVHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICBieXRlc1ByZWZpeDogWzEzNywgODAsIDc4LCA3MV1cbiAgICAvLyBQTkdcbiAgfSxcbiAge1xuICAgIG1lZGlhVHlwZTogXCJpbWFnZS9qcGVnXCIsXG4gICAgYnl0ZXNQcmVmaXg6IFsyNTUsIDIxNl1cbiAgICAvLyBKUEVHXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwiaW1hZ2Uvd2VicFwiLFxuICAgIGJ5dGVzUHJlZml4OiBbXG4gICAgICA4MixcbiAgICAgIDczLFxuICAgICAgNzAsXG4gICAgICA3MCxcbiAgICAgIC8vIFwiUklGRlwiXG4gICAgICBudWxsLFxuICAgICAgbnVsbCxcbiAgICAgIG51bGwsXG4gICAgICBudWxsLFxuICAgICAgLy8gZmlsZSBzaXplICh2YXJpYWJsZSlcbiAgICAgIDg3LFxuICAgICAgNjksXG4gICAgICA2NixcbiAgICAgIDgwXG4gICAgICAvLyBcIldFQlBcIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIG1lZGlhVHlwZTogXCJpbWFnZS9ibXBcIixcbiAgICBieXRlc1ByZWZpeDogWzY2LCA3N11cbiAgfSxcbiAge1xuICAgIG1lZGlhVHlwZTogXCJpbWFnZS90aWZmXCIsXG4gICAgYnl0ZXNQcmVmaXg6IFs3MywgNzMsIDQyLCAwXVxuICB9LFxuICB7XG4gICAgbWVkaWFUeXBlOiBcImltYWdlL3RpZmZcIixcbiAgICBieXRlc1ByZWZpeDogWzc3LCA3NywgMCwgNDJdXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwiaW1hZ2UvYXZpZlwiLFxuICAgIGJ5dGVzUHJlZml4OiBbXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAzMixcbiAgICAgIDEwMixcbiAgICAgIDExNixcbiAgICAgIDEyMSxcbiAgICAgIDExMixcbiAgICAgIDk3LFxuICAgICAgMTE4LFxuICAgICAgMTA1LFxuICAgICAgMTAyXG4gICAgXVxuICB9LFxuICB7XG4gICAgbWVkaWFUeXBlOiBcImltYWdlL2hlaWNcIixcbiAgICBieXRlc1ByZWZpeDogW1xuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMzIsXG4gICAgICAxMDIsXG4gICAgICAxMTYsXG4gICAgICAxMjEsXG4gICAgICAxMTIsXG4gICAgICAxMDQsXG4gICAgICAxMDEsXG4gICAgICAxMDUsXG4gICAgICA5OVxuICAgIF1cbiAgfVxuXTtcbnZhciBhdWRpb01lZGlhVHlwZVNpZ25hdHVyZXMgPSBbXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwiYXVkaW8vbXBlZ1wiLFxuICAgIGJ5dGVzUHJlZml4OiBbMjU1LCAyNTFdXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwiYXVkaW8vbXBlZ1wiLFxuICAgIGJ5dGVzUHJlZml4OiBbMjU1LCAyNTBdXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwiYXVkaW8vbXBlZ1wiLFxuICAgIGJ5dGVzUHJlZml4OiBbMjU1LCAyNDNdXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwiYXVkaW8vbXBlZ1wiLFxuICAgIGJ5dGVzUHJlZml4OiBbMjU1LCAyNDJdXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwiYXVkaW8vbXBlZ1wiLFxuICAgIGJ5dGVzUHJlZml4OiBbMjU1LCAyMjddXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwiYXVkaW8vbXBlZ1wiLFxuICAgIGJ5dGVzUHJlZml4OiBbMjU1LCAyMjZdXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwiYXVkaW8vd2F2XCIsXG4gICAgYnl0ZXNQcmVmaXg6IFtcbiAgICAgIDgyLFxuICAgICAgLy8gUlxuICAgICAgNzMsXG4gICAgICAvLyBJXG4gICAgICA3MCxcbiAgICAgIC8vIEZcbiAgICAgIDcwLFxuICAgICAgLy8gRlxuICAgICAgbnVsbCxcbiAgICAgIG51bGwsXG4gICAgICBudWxsLFxuICAgICAgbnVsbCxcbiAgICAgIDg3LFxuICAgICAgLy8gV1xuICAgICAgNjUsXG4gICAgICAvLyBBXG4gICAgICA4NixcbiAgICAgIC8vIFZcbiAgICAgIDY5XG4gICAgICAvLyBFXG4gICAgXVxuICB9LFxuICB7XG4gICAgbWVkaWFUeXBlOiBcImF1ZGlvL29nZ1wiLFxuICAgIGJ5dGVzUHJlZml4OiBbNzksIDEwMywgMTAzLCA4M11cbiAgfSxcbiAge1xuICAgIG1lZGlhVHlwZTogXCJhdWRpby9mbGFjXCIsXG4gICAgYnl0ZXNQcmVmaXg6IFsxMDIsIDc2LCA5NywgNjddXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwiYXVkaW8vYWFjXCIsXG4gICAgYnl0ZXNQcmVmaXg6IFs2NCwgMjEsIDAsIDBdXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwiYXVkaW8vbXA0XCIsXG4gICAgYnl0ZXNQcmVmaXg6IFsxMDIsIDExNiwgMTIxLCAxMTJdXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwiYXVkaW8vd2VibVwiLFxuICAgIGJ5dGVzUHJlZml4OiBbMjYsIDY5LCAyMjMsIDE2M11cbiAgfVxuXTtcbnZhciB2aWRlb01lZGlhVHlwZVNpZ25hdHVyZXMgPSBbXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwidmlkZW8vbXA0XCIsXG4gICAgYnl0ZXNQcmVmaXg6IFtcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIG51bGwsXG4gICAgICAxMDIsXG4gICAgICAxMTYsXG4gICAgICAxMjEsXG4gICAgICAxMTJcbiAgICAgIC8vIGZ0eXBcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwidmlkZW8vd2VibVwiLFxuICAgIGJ5dGVzUHJlZml4OiBbMjYsIDY5LCAyMjMsIDE2M11cbiAgICAvLyBFQk1MXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwidmlkZW8vcXVpY2t0aW1lXCIsXG4gICAgYnl0ZXNQcmVmaXg6IFtcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDIwLFxuICAgICAgMTAyLFxuICAgICAgMTE2LFxuICAgICAgMTIxLFxuICAgICAgMTEyLFxuICAgICAgMTEzLFxuICAgICAgMTE2XG4gICAgICAvLyBmdHlwcXRcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBtZWRpYVR5cGU6IFwidmlkZW8veC1tc3ZpZGVvXCIsXG4gICAgYnl0ZXNQcmVmaXg6IFs4MiwgNzMsIDcwLCA3MF1cbiAgICAvLyBSSUZGIChBVkkpXG4gIH1cbl07XG52YXIgc3RyaXBJRDMgPSAoZGF0YSkgPT4ge1xuICBjb25zdCBieXRlcyA9IHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiID8gY29udmVydEJhc2U2NFRvVWludDhBcnJheShkYXRhKSA6IGRhdGE7XG4gIGNvbnN0IGlkM1NpemUgPSAoYnl0ZXNbNl0gJiAxMjcpIDw8IDIxIHwgKGJ5dGVzWzddICYgMTI3KSA8PCAxNCB8IChieXRlc1s4XSAmIDEyNykgPDwgNyB8IGJ5dGVzWzldICYgMTI3O1xuICByZXR1cm4gYnl0ZXMuc2xpY2UoaWQzU2l6ZSArIDEwKTtcbn07XG5mdW5jdGlvbiBzdHJpcElEM1RhZ3NJZlByZXNlbnQoZGF0YSkge1xuICBjb25zdCBoYXNJZDMgPSB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiAmJiBkYXRhLnN0YXJ0c1dpdGgoXCJTVVF6XCIpIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICYmIGRhdGEubGVuZ3RoID4gMTAgJiYgZGF0YVswXSA9PT0gNzMgJiYgLy8gJ0knXG4gIGRhdGFbMV0gPT09IDY4ICYmIC8vICdEJ1xuICBkYXRhWzJdID09PSA1MTtcbiAgcmV0dXJuIGhhc0lkMyA/IHN0cmlwSUQzKGRhdGEpIDogZGF0YTtcbn1cbmZ1bmN0aW9uIGRldGVjdE1lZGlhVHlwZSh7XG4gIGRhdGEsXG4gIHNpZ25hdHVyZXNcbn0pIHtcbiAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHN0cmlwSUQzVGFnc0lmUHJlc2VudChkYXRhKTtcbiAgY29uc3QgYnl0ZXMgPSB0eXBlb2YgcHJvY2Vzc2VkRGF0YSA9PT0gXCJzdHJpbmdcIiA/IGNvbnZlcnRCYXNlNjRUb1VpbnQ4QXJyYXkoXG4gICAgcHJvY2Vzc2VkRGF0YS5zdWJzdHJpbmcoMCwgTWF0aC5taW4ocHJvY2Vzc2VkRGF0YS5sZW5ndGgsIDI0KSlcbiAgKSA6IHByb2Nlc3NlZERhdGE7XG4gIGZvciAoY29uc3Qgc2lnbmF0dXJlIG9mIHNpZ25hdHVyZXMpIHtcbiAgICBpZiAoYnl0ZXMubGVuZ3RoID49IHNpZ25hdHVyZS5ieXRlc1ByZWZpeC5sZW5ndGggJiYgc2lnbmF0dXJlLmJ5dGVzUHJlZml4LmV2ZXJ5KFxuICAgICAgKGJ5dGUsIGluZGV4KSA9PiBieXRlID09PSBudWxsIHx8IGJ5dGVzW2luZGV4XSA9PT0gYnl0ZVxuICAgICkpIHtcbiAgICAgIHJldHVybiBzaWduYXR1cmUubWVkaWFUeXBlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuXG4vLyBzcmMvdXRpbC9kb3dubG9hZC9kb3dubG9hZC50c1xuaW1wb3J0IHtcbiAgRG93bmxvYWRFcnJvciBhcyBEb3dubG9hZEVycm9yMixcbiAgcmVhZFJlc3BvbnNlV2l0aFNpemVMaW1pdCxcbiAgREVGQVVMVF9NQVhfRE9XTkxPQURfU0laRSxcbiAgdmFsaWRhdGVEb3dubG9hZFVybFxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHtcbiAgd2l0aFVzZXJBZ2VudFN1ZmZpeCxcbiAgZ2V0UnVudGltZUVudmlyb25tZW50VXNlckFnZW50XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5cbi8vIHNyYy92ZXJzaW9uLnRzXG52YXIgVkVSU0lPTiA9IHRydWUgPyBcIjYuMC4xNDJcIiA6IFwiMC4wLjAtdGVzdFwiO1xuXG4vLyBzcmMvdXRpbC9kb3dubG9hZC9kb3dubG9hZC50c1xudmFyIGRvd25sb2FkID0gYXN5bmMgKHtcbiAgdXJsLFxuICBtYXhCeXRlcyxcbiAgYWJvcnRTaWduYWxcbn0pID0+IHtcbiAgdmFyIF9hMjE7XG4gIGNvbnN0IHVybFRleHQgPSB1cmwudG9TdHJpbmcoKTtcbiAgdmFsaWRhdGVEb3dubG9hZFVybCh1cmxUZXh0KTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybFRleHQsIHtcbiAgICAgIGhlYWRlcnM6IHdpdGhVc2VyQWdlbnRTdWZmaXgoXG4gICAgICAgIHt9LFxuICAgICAgICBgYWktc2RrLyR7VkVSU0lPTn1gLFxuICAgICAgICBnZXRSdW50aW1lRW52aXJvbm1lbnRVc2VyQWdlbnQoKVxuICAgICAgKSxcbiAgICAgIHNpZ25hbDogYWJvcnRTaWduYWxcbiAgICB9KTtcbiAgICBpZiAocmVzcG9uc2UucmVkaXJlY3RlZCkge1xuICAgICAgdmFsaWRhdGVEb3dubG9hZFVybChyZXNwb25zZS51cmwpO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRG93bmxvYWRFcnJvcjIoe1xuICAgICAgICB1cmw6IHVybFRleHQsXG4gICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZWFkUmVzcG9uc2VXaXRoU2l6ZUxpbWl0KHtcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgdXJsOiB1cmxUZXh0LFxuICAgICAgbWF4Qnl0ZXM6IG1heEJ5dGVzICE9IG51bGwgPyBtYXhCeXRlcyA6IERFRkFVTFRfTUFYX0RPV05MT0FEX1NJWkVcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YSxcbiAgICAgIG1lZGlhVHlwZTogKF9hMjEgPSByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSkgIT0gbnVsbCA/IF9hMjEgOiB2b2lkIDBcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChEb3dubG9hZEVycm9yMi5pc0luc3RhbmNlKGVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHRocm93IG5ldyBEb3dubG9hZEVycm9yMih7IHVybDogdXJsVGV4dCwgY2F1c2U6IGVycm9yIH0pO1xuICB9XG59O1xuXG4vLyBzcmMvdXRpbC9kb3dubG9hZC9kb3dubG9hZC1mdW5jdGlvbi50c1xudmFyIGNyZWF0ZURlZmF1bHREb3dubG9hZEZ1bmN0aW9uID0gKGRvd25sb2FkMiA9IGRvd25sb2FkKSA9PiAocmVxdWVzdGVkRG93bmxvYWRzKSA9PiBQcm9taXNlLmFsbChcbiAgcmVxdWVzdGVkRG93bmxvYWRzLm1hcChcbiAgICBhc3luYyAocmVxdWVzdGVkRG93bmxvYWQpID0+IHJlcXVlc3RlZERvd25sb2FkLmlzVXJsU3VwcG9ydGVkQnlNb2RlbCA/IG51bGwgOiBkb3dubG9hZDIocmVxdWVzdGVkRG93bmxvYWQpXG4gIClcbik7XG5cbi8vIHNyYy9wcm9tcHQvZGF0YS1jb250ZW50LnRzXG5pbXBvcnQgeyBBSVNES0Vycm9yIGFzIEFJU0RLRXJyb3IyMiB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5pbXBvcnQge1xuICBjb252ZXJ0QmFzZTY0VG9VaW50OEFycmF5IGFzIGNvbnZlcnRCYXNlNjRUb1VpbnQ4QXJyYXkyLFxuICBjb252ZXJ0VWludDhBcnJheVRvQmFzZTY0XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZC92NFwiO1xuXG4vLyBzcmMvcHJvbXB0L3NwbGl0LWRhdGEtdXJsLnRzXG5mdW5jdGlvbiBzcGxpdERhdGFVcmwoZGF0YVVybCkge1xuICB0cnkge1xuICAgIGNvbnN0IFtoZWFkZXIsIGJhc2U2NENvbnRlbnRdID0gZGF0YVVybC5zcGxpdChcIixcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lZGlhVHlwZTogaGVhZGVyLnNwbGl0KFwiO1wiKVswXS5zcGxpdChcIjpcIilbMV0sXG4gICAgICBiYXNlNjRDb250ZW50XG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVkaWFUeXBlOiB2b2lkIDAsXG4gICAgICBiYXNlNjRDb250ZW50OiB2b2lkIDBcbiAgICB9O1xuICB9XG59XG5cbi8vIHNyYy9wcm9tcHQvZGF0YS1jb250ZW50LnRzXG52YXIgZGF0YUNvbnRlbnRTY2hlbWEgPSB6LnVuaW9uKFtcbiAgei5zdHJpbmcoKSxcbiAgei5pbnN0YW5jZW9mKFVpbnQ4QXJyYXkpLFxuICB6Lmluc3RhbmNlb2YoQXJyYXlCdWZmZXIpLFxuICB6LmN1c3RvbShcbiAgICAvLyBCdWZmZXIgbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBpbiBzb21lIGVudmlyb25tZW50cyBzdWNoIGFzIENsb3VkRmxhcmU6XG4gICAgKHZhbHVlKSA9PiB7XG4gICAgICB2YXIgX2EyMSwgX2I7XG4gICAgICByZXR1cm4gKF9iID0gKF9hMjEgPSBnbG9iYWxUaGlzLkJ1ZmZlcikgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjEuaXNCdWZmZXIodmFsdWUpKSAhPSBudWxsID8gX2IgOiBmYWxzZTtcbiAgICB9LFxuICAgIHsgbWVzc2FnZTogXCJNdXN0IGJlIGEgQnVmZmVyXCIgfVxuICApXG5dKTtcbmZ1bmN0aW9uIGNvbnZlcnRUb0xhbmd1YWdlTW9kZWxWM0RhdGFDb250ZW50KGNvbnRlbnQpIHtcbiAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgcmV0dXJuIHsgZGF0YTogY29udGVudCwgbWVkaWFUeXBlOiB2b2lkIDAgfTtcbiAgfVxuICBpZiAoY29udGVudCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIHsgZGF0YTogbmV3IFVpbnQ4QXJyYXkoY29udGVudCksIG1lZGlhVHlwZTogdm9pZCAwIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRlbnQgPSBuZXcgVVJMKGNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgfVxuICB9XG4gIGlmIChjb250ZW50IGluc3RhbmNlb2YgVVJMICYmIGNvbnRlbnQucHJvdG9jb2wgPT09IFwiZGF0YTpcIikge1xuICAgIGNvbnN0IHsgbWVkaWFUeXBlOiBkYXRhVXJsTWVkaWFUeXBlLCBiYXNlNjRDb250ZW50IH0gPSBzcGxpdERhdGFVcmwoXG4gICAgICBjb250ZW50LnRvU3RyaW5nKClcbiAgICApO1xuICAgIGlmIChkYXRhVXJsTWVkaWFUeXBlID09IG51bGwgfHwgYmFzZTY0Q29udGVudCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgQUlTREtFcnJvcjIyKHtcbiAgICAgICAgbmFtZTogXCJJbnZhbGlkRGF0YUNvbnRlbnRFcnJvclwiLFxuICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCBkYXRhIFVSTCBmb3JtYXQgaW4gY29udGVudCAke2NvbnRlbnQudG9TdHJpbmcoKX1gXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZGF0YTogYmFzZTY0Q29udGVudCwgbWVkaWFUeXBlOiBkYXRhVXJsTWVkaWFUeXBlIH07XG4gIH1cbiAgcmV0dXJuIHsgZGF0YTogY29udGVudCwgbWVkaWFUeXBlOiB2b2lkIDAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnREYXRhQ29udGVudFRvQmFzZTY0U3RyaW5nKGNvbnRlbnQpIHtcbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBjb252ZXJ0VWludDhBcnJheVRvQmFzZTY0KG5ldyBVaW50OEFycmF5KGNvbnRlbnQpKTtcbiAgfVxuICByZXR1cm4gY29udmVydFVpbnQ4QXJyYXlUb0Jhc2U2NChjb250ZW50KTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnREYXRhQ29udGVudFRvVWludDhBcnJheShjb250ZW50KSB7XG4gIGlmIChjb250ZW50IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgY29udGVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY29udmVydEJhc2U2NFRvVWludDhBcnJheTIoY29udGVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0YUNvbnRlbnRFcnJvcih7XG4gICAgICAgIG1lc3NhZ2U6IFwiSW52YWxpZCBkYXRhIGNvbnRlbnQuIENvbnRlbnQgc3RyaW5nIGlzIG5vdCBhIGJhc2U2NC1lbmNvZGVkIG1lZGlhLlwiLFxuICAgICAgICBjb250ZW50LFxuICAgICAgICBjYXVzZTogZXJyb3JcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoY29udGVudCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGNvbnRlbnQpO1xuICB9XG4gIHRocm93IG5ldyBJbnZhbGlkRGF0YUNvbnRlbnRFcnJvcih7IGNvbnRlbnQgfSk7XG59XG5cbi8vIHNyYy9wcm9tcHQvY29udmVydC10by1sYW5ndWFnZS1tb2RlbC1wcm9tcHQudHNcbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRUb0xhbmd1YWdlTW9kZWxQcm9tcHQoe1xuICBwcm9tcHQsXG4gIHN1cHBvcnRlZFVybHMsXG4gIGRvd25sb2FkOiBkb3dubG9hZDIgPSBjcmVhdGVEZWZhdWx0RG93bmxvYWRGdW5jdGlvbigpXG59KSB7XG4gIGNvbnN0IGRvd25sb2FkZWRBc3NldHMgPSBhd2FpdCBkb3dubG9hZEFzc2V0cyhcbiAgICBwcm9tcHQubWVzc2FnZXMsXG4gICAgZG93bmxvYWQyLFxuICAgIHN1cHBvcnRlZFVybHNcbiAgKTtcbiAgY29uc3QgYXBwcm92YWxJZFRvVG9vbENhbGxJZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBwcm9tcHQubWVzc2FnZXMpIHtcbiAgICBpZiAobWVzc2FnZS5yb2xlID09PSBcImFzc2lzdGFudFwiICYmIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIG1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICBpZiAocGFydC50eXBlID09PSBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiICYmIFwiYXBwcm92YWxJZFwiIGluIHBhcnQgJiYgXCJ0b29sQ2FsbElkXCIgaW4gcGFydCkge1xuICAgICAgICAgIGFwcHJvdmFsSWRUb1Rvb2xDYWxsSWQuc2V0KFxuICAgICAgICAgICAgcGFydC5hcHByb3ZhbElkLFxuICAgICAgICAgICAgcGFydC50b29sQ2FsbElkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBhcHByb3ZlZFRvb2xDYWxsSWRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHByb21wdC5tZXNzYWdlcykge1xuICAgIGlmIChtZXNzYWdlLnJvbGUgPT09IFwidG9vbFwiKSB7XG4gICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgbWVzc2FnZS5jb250ZW50KSB7XG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidG9vbC1hcHByb3ZhbC1yZXNwb25zZVwiKSB7XG4gICAgICAgICAgY29uc3QgdG9vbENhbGxJZCA9IGFwcHJvdmFsSWRUb1Rvb2xDYWxsSWQuZ2V0KHBhcnQuYXBwcm92YWxJZCk7XG4gICAgICAgICAgaWYgKHRvb2xDYWxsSWQpIHtcbiAgICAgICAgICAgIGFwcHJvdmVkVG9vbENhbGxJZHMuYWRkKHRvb2xDYWxsSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBtZXNzYWdlcyA9IFtcbiAgICAuLi5wcm9tcHQuc3lzdGVtICE9IG51bGwgPyB0eXBlb2YgcHJvbXB0LnN5c3RlbSA9PT0gXCJzdHJpbmdcIiA/IFt7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IHByb21wdC5zeXN0ZW0gfV0gOiBhc0FycmF5KHByb21wdC5zeXN0ZW0pLm1hcCgobWVzc2FnZSkgPT4gKHtcbiAgICAgIHJvbGU6IFwic3lzdGVtXCIsXG4gICAgICBjb250ZW50OiBtZXNzYWdlLmNvbnRlbnQsXG4gICAgICBwcm92aWRlck9wdGlvbnM6IG1lc3NhZ2UucHJvdmlkZXJPcHRpb25zXG4gICAgfSkpIDogW10sXG4gICAgLi4ucHJvbXB0Lm1lc3NhZ2VzLm1hcChcbiAgICAgIChtZXNzYWdlKSA9PiBjb252ZXJ0VG9MYW5ndWFnZU1vZGVsTWVzc2FnZSh7IG1lc3NhZ2UsIGRvd25sb2FkZWRBc3NldHMgfSlcbiAgICApXG4gIF07XG4gIGNvbnN0IGNvbWJpbmVkTWVzc2FnZXMgPSBbXTtcbiAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XG4gICAgaWYgKG1lc3NhZ2Uucm9sZSAhPT0gXCJ0b29sXCIpIHtcbiAgICAgIGNvbWJpbmVkTWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBsYXN0Q29tYmluZWRNZXNzYWdlID0gY29tYmluZWRNZXNzYWdlcy5hdCgtMSk7XG4gICAgaWYgKChsYXN0Q29tYmluZWRNZXNzYWdlID09IG51bGwgPyB2b2lkIDAgOiBsYXN0Q29tYmluZWRNZXNzYWdlLnJvbGUpID09PSBcInRvb2xcIikge1xuICAgICAgbGFzdENvbWJpbmVkTWVzc2FnZS5jb250ZW50LnB1c2goLi4ubWVzc2FnZS5jb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tYmluZWRNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuICBjb25zdCB0b29sQ2FsbElkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBjb21iaW5lZE1lc3NhZ2VzKSB7XG4gICAgc3dpdGNoIChtZXNzYWdlLnJvbGUpIHtcbiAgICAgIGNhc2UgXCJhc3Npc3RhbnRcIjoge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRlbnQgb2YgbWVzc2FnZS5jb250ZW50KSB7XG4gICAgICAgICAgaWYgKGNvbnRlbnQudHlwZSA9PT0gXCJ0b29sLWNhbGxcIiAmJiAhY29udGVudC5wcm92aWRlckV4ZWN1dGVkKSB7XG4gICAgICAgICAgICB0b29sQ2FsbElkcy5hZGQoY29udGVudC50b29sQ2FsbElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidG9vbFwiOiB7XG4gICAgICAgIGZvciAoY29uc3QgY29udGVudCBvZiBtZXNzYWdlLmNvbnRlbnQpIHtcbiAgICAgICAgICBpZiAoY29udGVudC50eXBlID09PSBcInRvb2wtcmVzdWx0XCIpIHtcbiAgICAgICAgICAgIHRvb2xDYWxsSWRzLmRlbGV0ZShjb250ZW50LnRvb2xDYWxsSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJ1c2VyXCI6XG4gICAgICBjYXNlIFwic3lzdGVtXCI6XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgYXBwcm92ZWRUb29sQ2FsbElkcykge1xuICAgICAgICAgIHRvb2xDYWxsSWRzLmRlbGV0ZShpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvb2xDYWxsSWRzLnNpemUgPiAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdUb29sUmVzdWx0c0Vycm9yKHtcbiAgICAgICAgICAgIHRvb2xDYWxsSWRzOiBBcnJheS5mcm9tKHRvb2xDYWxsSWRzKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGlkIG9mIGFwcHJvdmVkVG9vbENhbGxJZHMpIHtcbiAgICB0b29sQ2FsbElkcy5kZWxldGUoaWQpO1xuICB9XG4gIGlmICh0b29sQ2FsbElkcy5zaXplID4gMCkge1xuICAgIHRocm93IG5ldyBNaXNzaW5nVG9vbFJlc3VsdHNFcnJvcih7IHRvb2xDYWxsSWRzOiBBcnJheS5mcm9tKHRvb2xDYWxsSWRzKSB9KTtcbiAgfVxuICByZXR1cm4gY29tYmluZWRNZXNzYWdlcy5maWx0ZXIoXG4gICAgLy8gRmlsdGVyIG91dCBlbXB0eSB0b29sIG1lc3NhZ2VzIChlLmcuIGlmIHRoZXkgb25seSBjb250YWluZWRcbiAgICAvLyB0b29sLWFwcHJvdmFsLXJlc3BvbnNlIHBhcnRzIHRoYXQgd2VyZSByZW1vdmVkKS5cbiAgICAvLyBUaGlzIHByZXZlbnRzIHNlbmRpbmcgaW52YWxpZCBlbXB0eSBtZXNzYWdlcyB0byB0aGUgcHJvdmlkZXIuXG4gICAgLy8gTm90ZTogcHJvdmlkZXItZXhlY3V0ZWQgdG9vbC1hcHByb3ZhbC1yZXNwb25zZSBwYXJ0cyBhcmUgcHJlc2VydmVkLlxuICAgIChtZXNzYWdlKSA9PiBtZXNzYWdlLnJvbGUgIT09IFwidG9vbFwiIHx8IG1lc3NhZ2UuY29udGVudC5sZW5ndGggPiAwXG4gICk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VG9MYW5ndWFnZU1vZGVsTWVzc2FnZSh7XG4gIG1lc3NhZ2UsXG4gIGRvd25sb2FkZWRBc3NldHNcbn0pIHtcbiAgY29uc3Qgcm9sZSA9IG1lc3NhZ2Uucm9sZTtcbiAgc3dpdGNoIChyb2xlKSB7XG4gICAgY2FzZSBcInN5c3RlbVwiOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByb2xlOiBcInN5c3RlbVwiLFxuICAgICAgICBjb250ZW50OiBtZXNzYWdlLmNvbnRlbnQsXG4gICAgICAgIHByb3ZpZGVyT3B0aW9uczogbWVzc2FnZS5wcm92aWRlck9wdGlvbnNcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgXCJ1c2VyXCI6IHtcbiAgICAgIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcm9sZTogXCJ1c2VyXCIsXG4gICAgICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IG1lc3NhZ2UuY29udGVudCB9XSxcbiAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IG1lc3NhZ2UucHJvdmlkZXJPcHRpb25zXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICByb2xlOiBcInVzZXJcIixcbiAgICAgICAgY29udGVudDogbWVzc2FnZS5jb250ZW50Lm1hcCgocGFydCkgPT4gY29udmVydFBhcnRUb0xhbmd1YWdlTW9kZWxQYXJ0KHBhcnQsIGRvd25sb2FkZWRBc3NldHMpKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQudHlwZSAhPT0gXCJ0ZXh0XCIgfHwgcGFydC50ZXh0ICE9PSBcIlwiKSxcbiAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBtZXNzYWdlLnByb3ZpZGVyT3B0aW9uc1xuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSBcImFzc2lzdGFudFwiOiB7XG4gICAgICBpZiAodHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IG1lc3NhZ2UuY29udGVudCB9XSxcbiAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IG1lc3NhZ2UucHJvdmlkZXJPcHRpb25zXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICBjb250ZW50OiBtZXNzYWdlLmNvbnRlbnQuZmlsdGVyKFxuICAgICAgICAgIC8vIHJlbW92ZSBlbXB0eSB0ZXh0IHBhcnRzIChubyB0ZXh0LCBhbmQgbm8gcHJvdmlkZXIgb3B0aW9ucyk6XG4gICAgICAgICAgKHBhcnQpID0+IHBhcnQudHlwZSAhPT0gXCJ0ZXh0XCIgfHwgcGFydC50ZXh0ICE9PSBcIlwiIHx8IHBhcnQucHJvdmlkZXJPcHRpb25zICE9IG51bGxcbiAgICAgICAgKS5maWx0ZXIoXG4gICAgICAgICAgKHBhcnQpID0+IHBhcnQudHlwZSAhPT0gXCJ0b29sLWFwcHJvdmFsLXJlcXVlc3RcIlxuICAgICAgICApLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb3ZpZGVyT3B0aW9ucyA9IHBhcnQucHJvdmlkZXJPcHRpb25zO1xuICAgICAgICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiZmlsZVwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgbWVkaWFUeXBlIH0gPSBjb252ZXJ0VG9MYW5ndWFnZU1vZGVsVjNEYXRhQ29udGVudChcbiAgICAgICAgICAgICAgICBwYXJ0LmRhdGFcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogbWVkaWFUeXBlICE9IG51bGwgPyBtZWRpYVR5cGUgOiBwYXJ0Lm1lZGlhVHlwZSxcbiAgICAgICAgICAgICAgICBwcm92aWRlck9wdGlvbnNcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJyZWFzb25pbmdcIjoge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwicmVhc29uaW5nXCIsXG4gICAgICAgICAgICAgICAgdGV4dDogcGFydC50ZXh0LFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uc1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInRleHRcIjoge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHBhcnQudGV4dCxcbiAgICAgICAgICAgICAgICBwcm92aWRlck9wdGlvbnNcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJ0b29sLWNhbGxcIjoge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgIHRvb2xOYW1lOiBwYXJ0LnRvb2xOYW1lLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXJ0LmlucHV0LFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHBhcnQucHJvdmlkZXJFeGVjdXRlZCxcbiAgICAgICAgICAgICAgICBwcm92aWRlck9wdGlvbnNcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJ0b29sLXJlc3VsdFwiOiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLXJlc3VsdFwiLFxuICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICB0b29sTmFtZTogcGFydC50b29sTmFtZSxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IG1hcFRvb2xSZXN1bHRPdXRwdXQocGFydC5vdXRwdXQpLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uc1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHByb3ZpZGVyT3B0aW9uczogbWVzc2FnZS5wcm92aWRlck9wdGlvbnNcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgXCJ0b29sXCI6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJvbGU6IFwidG9vbFwiLFxuICAgICAgICBjb250ZW50OiBtZXNzYWdlLmNvbnRlbnQuZmlsdGVyKFxuICAgICAgICAgIC8vIE9ubHkgaW5jbHVkZSB0b29sLWFwcHJvdmFsLXJlc3BvbnNlIGZvciBwcm92aWRlci1leGVjdXRlZCB0b29sc1xuICAgICAgICAgIChwYXJ0KSA9PiBwYXJ0LnR5cGUgIT09IFwidG9vbC1hcHByb3ZhbC1yZXNwb25zZVwiIHx8IHBhcnQucHJvdmlkZXJFeGVjdXRlZFxuICAgICAgICApLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwidG9vbC1yZXN1bHRcIjoge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgdG9vbE5hbWU6IHBhcnQudG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiBtYXBUb29sUmVzdWx0T3V0cHV0KHBhcnQub3V0cHV0KSxcbiAgICAgICAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHBhcnQucHJvdmlkZXJPcHRpb25zXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidG9vbC1hcHByb3ZhbC1yZXNwb25zZVwiOiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWFwcHJvdmFsLXJlc3BvbnNlXCIsXG4gICAgICAgICAgICAgICAgYXBwcm92YWxJZDogcGFydC5hcHByb3ZhbElkLFxuICAgICAgICAgICAgICAgIGFwcHJvdmVkOiBwYXJ0LmFwcHJvdmVkLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogcGFydC5yZWFzb25cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBwcm92aWRlck9wdGlvbnM6IG1lc3NhZ2UucHJvdmlkZXJPcHRpb25zXG4gICAgICB9O1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBfZXhoYXVzdGl2ZUNoZWNrID0gcm9sZTtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkTWVzc2FnZVJvbGVFcnJvcih7IHJvbGU6IF9leGhhdXN0aXZlQ2hlY2sgfSk7XG4gICAgfVxuICB9XG59XG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZEFzc2V0cyhtZXNzYWdlcywgZG93bmxvYWQyLCBzdXBwb3J0ZWRVcmxzKSB7XG4gIGNvbnN0IHBsYW5uZWREb3dubG9hZHMgPSBtZXNzYWdlcy5maWx0ZXIoKG1lc3NhZ2UpID0+IG1lc3NhZ2Uucm9sZSA9PT0gXCJ1c2VyXCIpLm1hcCgobWVzc2FnZSkgPT4gbWVzc2FnZS5jb250ZW50KS5maWx0ZXIoXG4gICAgKGNvbnRlbnQpID0+IEFycmF5LmlzQXJyYXkoY29udGVudClcbiAgKS5mbGF0KCkuZmlsdGVyKFxuICAgIChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09IFwiaW1hZ2VcIiB8fCBwYXJ0LnR5cGUgPT09IFwiZmlsZVwiXG4gICkubWFwKChwYXJ0KSA9PiB7XG4gICAgdmFyIF9hMjE7XG4gICAgY29uc3QgbWVkaWFUeXBlID0gKF9hMjEgPSBwYXJ0Lm1lZGlhVHlwZSkgIT0gbnVsbCA/IF9hMjEgOiBwYXJ0LnR5cGUgPT09IFwiaW1hZ2VcIiA/IFwiaW1hZ2UvKlwiIDogdm9pZCAwO1xuICAgIGxldCBkYXRhID0gcGFydC50eXBlID09PSBcImltYWdlXCIgPyBwYXJ0LmltYWdlIDogcGFydC5kYXRhO1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IG5ldyBVUkwoZGF0YSk7XG4gICAgICB9IGNhdGNoIChpZ25vcmVkKSB7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG1lZGlhVHlwZSwgZGF0YSB9O1xuICB9KS5maWx0ZXIoXG4gICAgKHBhcnQpID0+IHBhcnQuZGF0YSBpbnN0YW5jZW9mIFVSTFxuICApLm1hcCgocGFydCkgPT4gKHtcbiAgICB1cmw6IHBhcnQuZGF0YSxcbiAgICBpc1VybFN1cHBvcnRlZEJ5TW9kZWw6IHBhcnQubWVkaWFUeXBlICE9IG51bGwgJiYgaXNVcmxTdXBwb3J0ZWQoe1xuICAgICAgdXJsOiBwYXJ0LmRhdGEudG9TdHJpbmcoKSxcbiAgICAgIG1lZGlhVHlwZTogcGFydC5tZWRpYVR5cGUsXG4gICAgICBzdXBwb3J0ZWRVcmxzXG4gICAgfSlcbiAgfSkpO1xuICBjb25zdCBkb3dubG9hZGVkRmlsZXMgPSBhd2FpdCBkb3dubG9hZDIocGxhbm5lZERvd25sb2Fkcyk7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgZG93bmxvYWRlZEZpbGVzLm1hcChcbiAgICAgIChmaWxlLCBpbmRleCkgPT4gZmlsZSA9PSBudWxsID8gbnVsbCA6IFtcbiAgICAgICAgcGxhbm5lZERvd25sb2Fkc1tpbmRleF0udXJsLnRvU3RyaW5nKCksXG4gICAgICAgIHsgZGF0YTogZmlsZS5kYXRhLCBtZWRpYVR5cGU6IGZpbGUubWVkaWFUeXBlIH1cbiAgICAgIF1cbiAgICApLmZpbHRlcigoZmlsZSkgPT4gZmlsZSAhPSBudWxsKVxuICApO1xufVxuZnVuY3Rpb24gY29udmVydFBhcnRUb0xhbmd1YWdlTW9kZWxQYXJ0KHBhcnQsIGRvd25sb2FkZWRBc3NldHMpIHtcbiAgdmFyIF9hMjE7XG4gIGlmIChwYXJ0LnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgdGV4dDogcGFydC50ZXh0LFxuICAgICAgcHJvdmlkZXJPcHRpb25zOiBwYXJ0LnByb3ZpZGVyT3B0aW9uc1xuICAgIH07XG4gIH1cbiAgbGV0IG9yaWdpbmFsRGF0YTtcbiAgY29uc3QgdHlwZSA9IHBhcnQudHlwZTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgICBvcmlnaW5hbERhdGEgPSBwYXJ0LmltYWdlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIG9yaWdpbmFsRGF0YSA9IHBhcnQuZGF0YTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHBhcnQgdHlwZTogJHt0eXBlfWApO1xuICB9XG4gIGNvbnN0IHsgZGF0YTogY29udmVydGVkRGF0YSwgbWVkaWFUeXBlOiBjb252ZXJ0ZWRNZWRpYVR5cGUgfSA9IGNvbnZlcnRUb0xhbmd1YWdlTW9kZWxWM0RhdGFDb250ZW50KG9yaWdpbmFsRGF0YSk7XG4gIGxldCBtZWRpYVR5cGUgPSBjb252ZXJ0ZWRNZWRpYVR5cGUgIT0gbnVsbCA/IGNvbnZlcnRlZE1lZGlhVHlwZSA6IHBhcnQubWVkaWFUeXBlO1xuICBsZXQgZGF0YSA9IGNvbnZlcnRlZERhdGE7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgY29uc3QgZG93bmxvYWRlZEZpbGUgPSBkb3dubG9hZGVkQXNzZXRzW2RhdGEudG9TdHJpbmcoKV07XG4gICAgaWYgKGRvd25sb2FkZWRGaWxlKSB7XG4gICAgICBkYXRhID0gZG93bmxvYWRlZEZpbGUuZGF0YTtcbiAgICAgIG1lZGlhVHlwZSAhPSBudWxsID8gbWVkaWFUeXBlIDogbWVkaWFUeXBlID0gZG93bmxvYWRlZEZpbGUubWVkaWFUeXBlO1xuICAgIH1cbiAgfVxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwiaW1hZ2VcIjoge1xuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG1lZGlhVHlwZSA9IChfYTIxID0gZGV0ZWN0TWVkaWFUeXBlKHsgZGF0YSwgc2lnbmF0dXJlczogaW1hZ2VNZWRpYVR5cGVTaWduYXR1cmVzIH0pKSAhPSBudWxsID8gX2EyMSA6IG1lZGlhVHlwZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICBtZWRpYVR5cGU6IG1lZGlhVHlwZSAhPSBudWxsID8gbWVkaWFUeXBlIDogXCJpbWFnZS8qXCIsXG4gICAgICAgIC8vIGFueSBpbWFnZVxuICAgICAgICBmaWxlbmFtZTogdm9pZCAwLFxuICAgICAgICBkYXRhLFxuICAgICAgICBwcm92aWRlck9wdGlvbnM6IHBhcnQucHJvdmlkZXJPcHRpb25zXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlIFwiZmlsZVwiOiB7XG4gICAgICBpZiAobWVkaWFUeXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZWRpYSB0eXBlIGlzIG1pc3NpbmcgZm9yIGZpbGUgcGFydGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgZmlsZW5hbWU6IHBhcnQuZmlsZW5hbWUsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHByb3ZpZGVyT3B0aW9uczogcGFydC5wcm92aWRlck9wdGlvbnNcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXBUb29sUmVzdWx0T3V0cHV0KG91dHB1dCkge1xuICBpZiAob3V0cHV0LnR5cGUgIT09IFwiY29udGVudFwiKSB7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiY29udGVudFwiLFxuICAgIHZhbHVlOiBvdXRwdXQudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS50eXBlICE9PSBcIm1lZGlhXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5tZWRpYVR5cGUuc3RhcnRzV2l0aChcImltYWdlL1wiKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiaW1hZ2UtZGF0YVwiLFxuICAgICAgICAgIGRhdGE6IGl0ZW0uZGF0YSxcbiAgICAgICAgICBtZWRpYVR5cGU6IGl0ZW0ubWVkaWFUeXBlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImZpbGUtZGF0YVwiLFxuICAgICAgICBkYXRhOiBpdGVtLmRhdGEsXG4gICAgICAgIG1lZGlhVHlwZTogaXRlbS5tZWRpYVR5cGVcbiAgICAgIH07XG4gICAgfSlcbiAgfTtcbn1cblxuLy8gc3JjL3Byb21wdC9jcmVhdGUtdG9vbC1tb2RlbC1vdXRwdXQudHNcbmltcG9ydCB7IGdldEVycm9yTWVzc2FnZSBhcyBnZXRFcnJvck1lc3NhZ2UzIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRvb2xNb2RlbE91dHB1dCh7XG4gIHRvb2xDYWxsSWQsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHRvb2w6IHRvb2wyLFxuICBlcnJvck1vZGVcbn0pIHtcbiAgaWYgKGVycm9yTW9kZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICByZXR1cm4geyB0eXBlOiBcImVycm9yLXRleHRcIiwgdmFsdWU6IGdldEVycm9yTWVzc2FnZTMob3V0cHV0KSB9O1xuICB9IGVsc2UgaWYgKGVycm9yTW9kZSA9PT0gXCJqc29uXCIpIHtcbiAgICByZXR1cm4geyB0eXBlOiBcImVycm9yLWpzb25cIiwgdmFsdWU6IHRvSlNPTlZhbHVlKG91dHB1dCkgfTtcbiAgfVxuICBpZiAodG9vbDIgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2wyLnRvTW9kZWxPdXRwdXQpIHtcbiAgICByZXR1cm4gYXdhaXQgdG9vbDIudG9Nb2RlbE91dHB1dCh7IHRvb2xDYWxsSWQsIGlucHV0LCBvdXRwdXQgfSk7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBvdXRwdXQgPT09IFwic3RyaW5nXCIgPyB7IHR5cGU6IFwidGV4dFwiLCB2YWx1ZTogb3V0cHV0IH0gOiB7IHR5cGU6IFwianNvblwiLCB2YWx1ZTogdG9KU09OVmFsdWUob3V0cHV0KSB9O1xufVxuZnVuY3Rpb24gdG9KU09OVmFsdWUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2b2lkIDAgPyBudWxsIDogdmFsdWU7XG59XG5cbi8vIHNyYy9wcm9tcHQvcHJlcGFyZS1jYWxsLXNldHRpbmdzLnRzXG5mdW5jdGlvbiBwcmVwYXJlQ2FsbFNldHRpbmdzKHtcbiAgbWF4T3V0cHV0VG9rZW5zLFxuICB0ZW1wZXJhdHVyZSxcbiAgdG9wUCxcbiAgdG9wSyxcbiAgcHJlc2VuY2VQZW5hbHR5LFxuICBmcmVxdWVuY3lQZW5hbHR5LFxuICBzZWVkLFxuICBzdG9wU2VxdWVuY2VzXG59KSB7XG4gIGlmIChtYXhPdXRwdXRUb2tlbnMgIT0gbnVsbCkge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihtYXhPdXRwdXRUb2tlbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3Ioe1xuICAgICAgICBwYXJhbWV0ZXI6IFwibWF4T3V0cHV0VG9rZW5zXCIsXG4gICAgICAgIHZhbHVlOiBtYXhPdXRwdXRUb2tlbnMsXG4gICAgICAgIG1lc3NhZ2U6IFwibWF4T3V0cHV0VG9rZW5zIG11c3QgYmUgYW4gaW50ZWdlclwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKG1heE91dHB1dFRva2VucyA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcih7XG4gICAgICAgIHBhcmFtZXRlcjogXCJtYXhPdXRwdXRUb2tlbnNcIixcbiAgICAgICAgdmFsdWU6IG1heE91dHB1dFRva2VucyxcbiAgICAgICAgbWVzc2FnZTogXCJtYXhPdXRwdXRUb2tlbnMgbXVzdCBiZSA+PSAxXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAodGVtcGVyYXR1cmUgIT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgdGVtcGVyYXR1cmUgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcih7XG4gICAgICAgIHBhcmFtZXRlcjogXCJ0ZW1wZXJhdHVyZVwiLFxuICAgICAgICB2YWx1ZTogdGVtcGVyYXR1cmUsXG4gICAgICAgIG1lc3NhZ2U6IFwidGVtcGVyYXR1cmUgbXVzdCBiZSBhIG51bWJlclwiXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKHRvcFAgIT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgdG9wUCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKHtcbiAgICAgICAgcGFyYW1ldGVyOiBcInRvcFBcIixcbiAgICAgICAgdmFsdWU6IHRvcFAsXG4gICAgICAgIG1lc3NhZ2U6IFwidG9wUCBtdXN0IGJlIGEgbnVtYmVyXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAodG9wSyAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiB0b3BLICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3Ioe1xuICAgICAgICBwYXJhbWV0ZXI6IFwidG9wS1wiLFxuICAgICAgICB2YWx1ZTogdG9wSyxcbiAgICAgICAgbWVzc2FnZTogXCJ0b3BLIG11c3QgYmUgYSBudW1iZXJcIlxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChwcmVzZW5jZVBlbmFsdHkgIT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgcHJlc2VuY2VQZW5hbHR5ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3Ioe1xuICAgICAgICBwYXJhbWV0ZXI6IFwicHJlc2VuY2VQZW5hbHR5XCIsXG4gICAgICAgIHZhbHVlOiBwcmVzZW5jZVBlbmFsdHksXG4gICAgICAgIG1lc3NhZ2U6IFwicHJlc2VuY2VQZW5hbHR5IG11c3QgYmUgYSBudW1iZXJcIlxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChmcmVxdWVuY3lQZW5hbHR5ICE9IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGZyZXF1ZW5jeVBlbmFsdHkgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcih7XG4gICAgICAgIHBhcmFtZXRlcjogXCJmcmVxdWVuY3lQZW5hbHR5XCIsXG4gICAgICAgIHZhbHVlOiBmcmVxdWVuY3lQZW5hbHR5LFxuICAgICAgICBtZXNzYWdlOiBcImZyZXF1ZW5jeVBlbmFsdHkgbXVzdCBiZSBhIG51bWJlclwiXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKHNlZWQgIT0gbnVsbCkge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihzZWVkKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKHtcbiAgICAgICAgcGFyYW1ldGVyOiBcInNlZWRcIixcbiAgICAgICAgdmFsdWU6IHNlZWQsXG4gICAgICAgIG1lc3NhZ2U6IFwic2VlZCBtdXN0IGJlIGFuIGludGVnZXJcIlxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgbWF4T3V0cHV0VG9rZW5zLFxuICAgIHRlbXBlcmF0dXJlLFxuICAgIHRvcFAsXG4gICAgdG9wSyxcbiAgICBwcmVzZW5jZVBlbmFsdHksXG4gICAgZnJlcXVlbmN5UGVuYWx0eSxcbiAgICBzdG9wU2VxdWVuY2VzLFxuICAgIHNlZWRcbiAgfTtcbn1cblxuLy8gc3JjL3Byb21wdC9wcmVwYXJlLXRvb2xzLWFuZC10b29sLWNob2ljZS50c1xuaW1wb3J0IHsgYXNTY2hlbWEgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvdXRpbC9pcy1ub24tZW1wdHktb2JqZWN0LnRzXG5mdW5jdGlvbiBpc05vbkVtcHR5T2JqZWN0KG9iamVjdDIpIHtcbiAgcmV0dXJuIG9iamVjdDIgIT0gbnVsbCAmJiBPYmplY3Qua2V5cyhvYmplY3QyKS5sZW5ndGggPiAwO1xufVxuXG4vLyBzcmMvcHJvbXB0L3ByZXBhcmUtdG9vbHMtYW5kLXRvb2wtY2hvaWNlLnRzXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlVG9vbHNBbmRUb29sQ2hvaWNlKHtcbiAgdG9vbHMsXG4gIHRvb2xDaG9pY2UsXG4gIGFjdGl2ZVRvb2xzXG59KSB7XG4gIGlmICghaXNOb25FbXB0eU9iamVjdCh0b29scykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9vbHM6IHZvaWQgMCxcbiAgICAgIHRvb2xDaG9pY2U6IHZvaWQgMFxuICAgIH07XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRUb29scyA9IGFjdGl2ZVRvb2xzICE9IG51bGwgPyBPYmplY3QuZW50cmllcyh0b29scykuZmlsdGVyKFxuICAgIChbbmFtZTIxXSkgPT4gYWN0aXZlVG9vbHMuaW5jbHVkZXMobmFtZTIxKVxuICApIDogT2JqZWN0LmVudHJpZXModG9vbHMpO1xuICBjb25zdCBsYW5ndWFnZU1vZGVsVG9vbHMgPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZTIxLCB0b29sMl0gb2YgZmlsdGVyZWRUb29scykge1xuICAgIGNvbnN0IHRvb2xUeXBlID0gdG9vbDIudHlwZTtcbiAgICBzd2l0Y2ggKHRvb2xUeXBlKSB7XG4gICAgICBjYXNlIHZvaWQgMDpcbiAgICAgIGNhc2UgXCJkeW5hbWljXCI6XG4gICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgbGFuZ3VhZ2VNb2RlbFRvb2xzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBuYW1lOiBuYW1lMjEsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRvb2wyLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiBhd2FpdCBhc1NjaGVtYSh0b29sMi5pbnB1dFNjaGVtYSkuanNvblNjaGVtYSxcbiAgICAgICAgICAuLi50b29sMi5pbnB1dEV4YW1wbGVzICE9IG51bGwgPyB7IGlucHV0RXhhbXBsZXM6IHRvb2wyLmlucHV0RXhhbXBsZXMgfSA6IHt9LFxuICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogdG9vbDIucHJvdmlkZXJPcHRpb25zLFxuICAgICAgICAgIC4uLnRvb2wyLnN0cmljdCAhPSBudWxsID8geyBzdHJpY3Q6IHRvb2wyLnN0cmljdCB9IDoge31cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByb3ZpZGVyXCI6XG4gICAgICAgIGxhbmd1YWdlTW9kZWxUb29scy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInByb3ZpZGVyXCIsXG4gICAgICAgICAgbmFtZTogbmFtZTIxLFxuICAgICAgICAgIGlkOiB0b29sMi5pZCxcbiAgICAgICAgICBhcmdzOiB0b29sMi5hcmdzXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgZXhoYXVzdGl2ZUNoZWNrID0gdG9vbFR5cGU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdG9vbCB0eXBlOiAke2V4aGF1c3RpdmVDaGVja31gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0b29sczogbGFuZ3VhZ2VNb2RlbFRvb2xzLFxuICAgIHRvb2xDaG9pY2U6IHRvb2xDaG9pY2UgPT0gbnVsbCA/IHsgdHlwZTogXCJhdXRvXCIgfSA6IHR5cGVvZiB0b29sQ2hvaWNlID09PSBcInN0cmluZ1wiID8geyB0eXBlOiB0b29sQ2hvaWNlIH0gOiB7IHR5cGU6IFwidG9vbFwiLCB0b29sTmFtZTogdG9vbENob2ljZS50b29sTmFtZSB9XG4gIH07XG59XG5cbi8vIHNyYy9wcm9tcHQvc3RhbmRhcmRpemUtcHJvbXB0LnRzXG5pbXBvcnQgeyBJbnZhbGlkUHJvbXB0RXJyb3IgYXMgSW52YWxpZFByb21wdEVycm9yMiB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5pbXBvcnQge1xuICBzYWZlVmFsaWRhdGVUeXBlc1xufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6NiB9IGZyb20gXCJ6b2QvdjRcIjtcblxuLy8gc3JjL3Byb21wdC9tZXNzYWdlLnRzXG5pbXBvcnQgeyB6IGFzIHo1IH0gZnJvbSBcInpvZC92NFwiO1xuXG4vLyBzcmMvdHlwZXMvcHJvdmlkZXItbWV0YWRhdGEudHNcbmltcG9ydCB7IHogYXMgejMgfSBmcm9tIFwiem9kL3Y0XCI7XG5cbi8vIHNyYy90eXBlcy9qc29uLXZhbHVlLnRzXG5pbXBvcnQgeyB6IGFzIHoyIH0gZnJvbSBcInpvZC92NFwiO1xudmFyIGpzb25WYWx1ZVNjaGVtYSA9IHoyLmxhenkoXG4gICgpID0+IHoyLnVuaW9uKFtcbiAgICB6Mi5udWxsKCksXG4gICAgejIuc3RyaW5nKCksXG4gICAgejIubnVtYmVyKCksXG4gICAgejIuYm9vbGVhbigpLFxuICAgIHoyLnJlY29yZCh6Mi5zdHJpbmcoKSwganNvblZhbHVlU2NoZW1hLm9wdGlvbmFsKCkpLFxuICAgIHoyLmFycmF5KGpzb25WYWx1ZVNjaGVtYSlcbiAgXSlcbik7XG5cbi8vIHNyYy90eXBlcy9wcm92aWRlci1tZXRhZGF0YS50c1xudmFyIHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEgPSB6My5yZWNvcmQoXG4gIHozLnN0cmluZygpLFxuICB6My5yZWNvcmQoejMuc3RyaW5nKCksIGpzb25WYWx1ZVNjaGVtYS5vcHRpb25hbCgpKVxuKTtcblxuLy8gc3JjL3Byb21wdC9jb250ZW50LXBhcnQudHNcbmltcG9ydCB7IHogYXMgejQgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgdGV4dFBhcnRTY2hlbWEgPSB6NC5vYmplY3Qoe1xuICB0eXBlOiB6NC5saXRlcmFsKFwidGV4dFwiKSxcbiAgdGV4dDogejQuc3RyaW5nKCksXG4gIHByb3ZpZGVyT3B0aW9uczogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpXG59KTtcbnZhciBpbWFnZVBhcnRTY2hlbWEgPSB6NC5vYmplY3Qoe1xuICB0eXBlOiB6NC5saXRlcmFsKFwiaW1hZ2VcIiksXG4gIGltYWdlOiB6NC51bmlvbihbZGF0YUNvbnRlbnRTY2hlbWEsIHo0Lmluc3RhbmNlb2YoVVJMKV0pLFxuICBtZWRpYVR5cGU6IHo0LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHByb3ZpZGVyT3B0aW9uczogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpXG59KTtcbnZhciBmaWxlUGFydFNjaGVtYSA9IHo0Lm9iamVjdCh7XG4gIHR5cGU6IHo0LmxpdGVyYWwoXCJmaWxlXCIpLFxuICBkYXRhOiB6NC51bmlvbihbZGF0YUNvbnRlbnRTY2hlbWEsIHo0Lmluc3RhbmNlb2YoVVJMKV0pLFxuICBmaWxlbmFtZTogejQuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbWVkaWFUeXBlOiB6NC5zdHJpbmcoKSxcbiAgcHJvdmlkZXJPcHRpb25zOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKClcbn0pO1xudmFyIHJlYXNvbmluZ1BhcnRTY2hlbWEgPSB6NC5vYmplY3Qoe1xuICB0eXBlOiB6NC5saXRlcmFsKFwicmVhc29uaW5nXCIpLFxuICB0ZXh0OiB6NC5zdHJpbmcoKSxcbiAgcHJvdmlkZXJPcHRpb25zOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKClcbn0pO1xudmFyIHRvb2xDYWxsUGFydFNjaGVtYSA9IHo0Lm9iamVjdCh7XG4gIHR5cGU6IHo0LmxpdGVyYWwoXCJ0b29sLWNhbGxcIiksXG4gIHRvb2xDYWxsSWQ6IHo0LnN0cmluZygpLFxuICB0b29sTmFtZTogejQuc3RyaW5nKCksXG4gIGlucHV0OiB6NC51bmtub3duKCksXG4gIHByb3ZpZGVyT3B0aW9uczogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpLFxuICBwcm92aWRlckV4ZWN1dGVkOiB6NC5ib29sZWFuKCkub3B0aW9uYWwoKVxufSk7XG52YXIgb3V0cHV0U2NoZW1hID0gejQuZGlzY3JpbWluYXRlZFVuaW9uKFxuICBcInR5cGVcIixcbiAgW1xuICAgIHo0Lm9iamVjdCh7XG4gICAgICB0eXBlOiB6NC5saXRlcmFsKFwidGV4dFwiKSxcbiAgICAgIHZhbHVlOiB6NC5zdHJpbmcoKSxcbiAgICAgIHByb3ZpZGVyT3B0aW9uczogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpXG4gICAgfSksXG4gICAgejQub2JqZWN0KHtcbiAgICAgIHR5cGU6IHo0LmxpdGVyYWwoXCJqc29uXCIpLFxuICAgICAgdmFsdWU6IGpzb25WYWx1ZVNjaGVtYSxcbiAgICAgIHByb3ZpZGVyT3B0aW9uczogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpXG4gICAgfSksXG4gICAgejQub2JqZWN0KHtcbiAgICAgIHR5cGU6IHo0LmxpdGVyYWwoXCJleGVjdXRpb24tZGVuaWVkXCIpLFxuICAgICAgcmVhc29uOiB6NC5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgcHJvdmlkZXJPcHRpb25zOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKClcbiAgICB9KSxcbiAgICB6NC5vYmplY3Qoe1xuICAgICAgdHlwZTogejQubGl0ZXJhbChcImVycm9yLXRleHRcIiksXG4gICAgICB2YWx1ZTogejQuc3RyaW5nKCksXG4gICAgICBwcm92aWRlck9wdGlvbnM6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxuICAgIH0pLFxuICAgIHo0Lm9iamVjdCh7XG4gICAgICB0eXBlOiB6NC5saXRlcmFsKFwiZXJyb3ItanNvblwiKSxcbiAgICAgIHZhbHVlOiBqc29uVmFsdWVTY2hlbWEsXG4gICAgICBwcm92aWRlck9wdGlvbnM6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxuICAgIH0pLFxuICAgIHo0Lm9iamVjdCh7XG4gICAgICB0eXBlOiB6NC5saXRlcmFsKFwiY29udGVudFwiKSxcbiAgICAgIHZhbHVlOiB6NC5hcnJheShcbiAgICAgICAgejQudW5pb24oW1xuICAgICAgICAgIHo0Lm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6NC5saXRlcmFsKFwidGV4dFwiKSxcbiAgICAgICAgICAgIHRleHQ6IHo0LnN0cmluZygpLFxuICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6NC5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejQubGl0ZXJhbChcIm1lZGlhXCIpLFxuICAgICAgICAgICAgZGF0YTogejQuc3RyaW5nKCksXG4gICAgICAgICAgICBtZWRpYVR5cGU6IHo0LnN0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejQub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHo0LmxpdGVyYWwoXCJmaWxlLWRhdGFcIiksXG4gICAgICAgICAgICBkYXRhOiB6NC5zdHJpbmcoKSxcbiAgICAgICAgICAgIG1lZGlhVHlwZTogejQuc3RyaW5nKCksXG4gICAgICAgICAgICBmaWxlbmFtZTogejQuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejQub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHo0LmxpdGVyYWwoXCJmaWxlLXVybFwiKSxcbiAgICAgICAgICAgIHVybDogejQuc3RyaW5nKCksXG4gICAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHo0Lm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6NC5saXRlcmFsKFwiZmlsZS1pZFwiKSxcbiAgICAgICAgICAgIGZpbGVJZDogejQudW5pb24oW3o0LnN0cmluZygpLCB6NC5yZWNvcmQoejQuc3RyaW5nKCksIHo0LnN0cmluZygpKV0pLFxuICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6NC5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejQubGl0ZXJhbChcImltYWdlLWRhdGFcIiksXG4gICAgICAgICAgICBkYXRhOiB6NC5zdHJpbmcoKSxcbiAgICAgICAgICAgIG1lZGlhVHlwZTogejQuc3RyaW5nKCksXG4gICAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHo0Lm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6NC5saXRlcmFsKFwiaW1hZ2UtdXJsXCIpLFxuICAgICAgICAgICAgdXJsOiB6NC5zdHJpbmcoKSxcbiAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejQub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHo0LmxpdGVyYWwoXCJpbWFnZS1maWxlLWlkXCIpLFxuICAgICAgICAgICAgZmlsZUlkOiB6NC51bmlvbihbejQuc3RyaW5nKCksIHo0LnJlY29yZCh6NC5zdHJpbmcoKSwgejQuc3RyaW5nKCkpXSksXG4gICAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHo0Lm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6NC5saXRlcmFsKFwiY3VzdG9tXCIpLFxuICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKClcbiAgICAgICAgICB9KVxuICAgICAgICBdKVxuICAgICAgKVxuICAgIH0pXG4gIF1cbik7XG52YXIgdG9vbFJlc3VsdFBhcnRTY2hlbWEgPSB6NC5vYmplY3Qoe1xuICB0eXBlOiB6NC5saXRlcmFsKFwidG9vbC1yZXN1bHRcIiksXG4gIHRvb2xDYWxsSWQ6IHo0LnN0cmluZygpLFxuICB0b29sTmFtZTogejQuc3RyaW5nKCksXG4gIG91dHB1dDogb3V0cHV0U2NoZW1hLFxuICBwcm92aWRlck9wdGlvbnM6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxufSk7XG52YXIgdG9vbEFwcHJvdmFsUmVxdWVzdFNjaGVtYSA9IHo0Lm9iamVjdCh7XG4gIHR5cGU6IHo0LmxpdGVyYWwoXCJ0b29sLWFwcHJvdmFsLXJlcXVlc3RcIiksXG4gIGFwcHJvdmFsSWQ6IHo0LnN0cmluZygpLFxuICB0b29sQ2FsbElkOiB6NC5zdHJpbmcoKVxufSk7XG52YXIgdG9vbEFwcHJvdmFsUmVzcG9uc2VTY2hlbWEgPSB6NC5vYmplY3Qoe1xuICB0eXBlOiB6NC5saXRlcmFsKFwidG9vbC1hcHByb3ZhbC1yZXNwb25zZVwiKSxcbiAgYXBwcm92YWxJZDogejQuc3RyaW5nKCksXG4gIGFwcHJvdmVkOiB6NC5ib29sZWFuKCksXG4gIHJlYXNvbjogejQuc3RyaW5nKCkub3B0aW9uYWwoKVxufSk7XG5cbi8vIHNyYy9wcm9tcHQvbWVzc2FnZS50c1xudmFyIHN5c3RlbU1vZGVsTWVzc2FnZVNjaGVtYSA9IHo1Lm9iamVjdChcbiAge1xuICAgIHJvbGU6IHo1LmxpdGVyYWwoXCJzeXN0ZW1cIiksXG4gICAgY29udGVudDogejUuc3RyaW5nKCksXG4gICAgcHJvdmlkZXJPcHRpb25zOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKClcbiAgfVxuKTtcbnZhciB1c2VyTW9kZWxNZXNzYWdlU2NoZW1hID0gejUub2JqZWN0KHtcbiAgcm9sZTogejUubGl0ZXJhbChcInVzZXJcIiksXG4gIGNvbnRlbnQ6IHo1LnVuaW9uKFtcbiAgICB6NS5zdHJpbmcoKSxcbiAgICB6NS5hcnJheSh6NS51bmlvbihbdGV4dFBhcnRTY2hlbWEsIGltYWdlUGFydFNjaGVtYSwgZmlsZVBhcnRTY2hlbWFdKSlcbiAgXSksXG4gIHByb3ZpZGVyT3B0aW9uczogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpXG59KTtcbnZhciBhc3Npc3RhbnRNb2RlbE1lc3NhZ2VTY2hlbWEgPSB6NS5vYmplY3Qoe1xuICByb2xlOiB6NS5saXRlcmFsKFwiYXNzaXN0YW50XCIpLFxuICBjb250ZW50OiB6NS51bmlvbihbXG4gICAgejUuc3RyaW5nKCksXG4gICAgejUuYXJyYXkoXG4gICAgICB6NS51bmlvbihbXG4gICAgICAgIHRleHRQYXJ0U2NoZW1hLFxuICAgICAgICBmaWxlUGFydFNjaGVtYSxcbiAgICAgICAgcmVhc29uaW5nUGFydFNjaGVtYSxcbiAgICAgICAgdG9vbENhbGxQYXJ0U2NoZW1hLFxuICAgICAgICB0b29sUmVzdWx0UGFydFNjaGVtYSxcbiAgICAgICAgdG9vbEFwcHJvdmFsUmVxdWVzdFNjaGVtYVxuICAgICAgXSlcbiAgICApXG4gIF0pLFxuICBwcm92aWRlck9wdGlvbnM6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxufSk7XG52YXIgdG9vbE1vZGVsTWVzc2FnZVNjaGVtYSA9IHo1Lm9iamVjdCh7XG4gIHJvbGU6IHo1LmxpdGVyYWwoXCJ0b29sXCIpLFxuICBjb250ZW50OiB6NS5hcnJheSh6NS51bmlvbihbdG9vbFJlc3VsdFBhcnRTY2hlbWEsIHRvb2xBcHByb3ZhbFJlc3BvbnNlU2NoZW1hXSkpLFxuICBwcm92aWRlck9wdGlvbnM6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxufSk7XG52YXIgbW9kZWxNZXNzYWdlU2NoZW1hID0gejUudW5pb24oW1xuICBzeXN0ZW1Nb2RlbE1lc3NhZ2VTY2hlbWEsXG4gIHVzZXJNb2RlbE1lc3NhZ2VTY2hlbWEsXG4gIGFzc2lzdGFudE1vZGVsTWVzc2FnZVNjaGVtYSxcbiAgdG9vbE1vZGVsTWVzc2FnZVNjaGVtYVxuXSk7XG5cbi8vIHNyYy9wcm9tcHQvc3RhbmRhcmRpemUtcHJvbXB0LnRzXG5hc3luYyBmdW5jdGlvbiBzdGFuZGFyZGl6ZVByb21wdChwcm9tcHQpIHtcbiAgaWYgKHByb21wdC5wcm9tcHQgPT0gbnVsbCAmJiBwcm9tcHQubWVzc2FnZXMgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkUHJvbXB0RXJyb3IyKHtcbiAgICAgIHByb21wdCxcbiAgICAgIG1lc3NhZ2U6IFwicHJvbXB0IG9yIG1lc3NhZ2VzIG11c3QgYmUgZGVmaW5lZFwiXG4gICAgfSk7XG4gIH1cbiAgaWYgKHByb21wdC5wcm9tcHQgIT0gbnVsbCAmJiBwcm9tcHQubWVzc2FnZXMgIT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkUHJvbXB0RXJyb3IyKHtcbiAgICAgIHByb21wdCxcbiAgICAgIG1lc3NhZ2U6IFwicHJvbXB0IGFuZCBtZXNzYWdlcyBjYW5ub3QgYmUgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lXCJcbiAgICB9KTtcbiAgfVxuICBpZiAocHJvbXB0LnN5c3RlbSAhPSBudWxsICYmIHR5cGVvZiBwcm9tcHQuc3lzdGVtICE9PSBcInN0cmluZ1wiICYmICFhc0FycmF5KHByb21wdC5zeXN0ZW0pLmV2ZXJ5KFxuICAgIChtZXNzYWdlKSA9PiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJvYmplY3RcIiAmJiBtZXNzYWdlICE9PSBudWxsICYmIFwicm9sZVwiIGluIG1lc3NhZ2UgJiYgbWVzc2FnZS5yb2xlID09PSBcInN5c3RlbVwiXG4gICkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZFByb21wdEVycm9yMih7XG4gICAgICBwcm9tcHQsXG4gICAgICBtZXNzYWdlOiBcInN5c3RlbSBtdXN0IGJlIGEgc3RyaW5nLCBTeXN0ZW1Nb2RlbE1lc3NhZ2UsIG9yIGFycmF5IG9mIFN5c3RlbU1vZGVsTWVzc2FnZVwiXG4gICAgfSk7XG4gIH1cbiAgbGV0IG1lc3NhZ2VzO1xuICBpZiAocHJvbXB0LnByb21wdCAhPSBudWxsICYmIHR5cGVvZiBwcm9tcHQucHJvbXB0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgbWVzc2FnZXMgPSBbeyByb2xlOiBcInVzZXJcIiwgY29udGVudDogcHJvbXB0LnByb21wdCB9XTtcbiAgfSBlbHNlIGlmIChwcm9tcHQucHJvbXB0ICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShwcm9tcHQucHJvbXB0KSkge1xuICAgIG1lc3NhZ2VzID0gcHJvbXB0LnByb21wdDtcbiAgfSBlbHNlIGlmIChwcm9tcHQubWVzc2FnZXMgIT0gbnVsbCkge1xuICAgIG1lc3NhZ2VzID0gcHJvbXB0Lm1lc3NhZ2VzO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBJbnZhbGlkUHJvbXB0RXJyb3IyKHtcbiAgICAgIHByb21wdCxcbiAgICAgIG1lc3NhZ2U6IFwicHJvbXB0IG9yIG1lc3NhZ2VzIG11c3QgYmUgZGVmaW5lZFwiXG4gICAgfSk7XG4gIH1cbiAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkUHJvbXB0RXJyb3IyKHtcbiAgICAgIHByb21wdCxcbiAgICAgIG1lc3NhZ2U6IFwibWVzc2FnZXMgbXVzdCBub3QgYmUgZW1wdHlcIlxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCBzYWZlVmFsaWRhdGVUeXBlcyh7XG4gICAgdmFsdWU6IG1lc3NhZ2VzLFxuICAgIHNjaGVtYTogejYuYXJyYXkobW9kZWxNZXNzYWdlU2NoZW1hKVxuICB9KTtcbiAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZFByb21wdEVycm9yMih7XG4gICAgICBwcm9tcHQsXG4gICAgICBtZXNzYWdlOiBcIlRoZSBtZXNzYWdlcyBkbyBub3QgbWF0Y2ggdGhlIE1vZGVsTWVzc2FnZVtdIHNjaGVtYS5cIixcbiAgICAgIGNhdXNlOiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlcyxcbiAgICBzeXN0ZW06IHByb21wdC5zeXN0ZW1cbiAgfTtcbn1cblxuLy8gc3JjL3Byb21wdC93cmFwLWdhdGV3YXktZXJyb3IudHNcbmltcG9ydCB7IEdhdGV3YXlBdXRoZW50aWNhdGlvbkVycm9yIH0gZnJvbSBcIkBhaS1zZGsvZ2F0ZXdheVwiO1xuaW1wb3J0IHsgQUlTREtFcnJvciBhcyBBSVNES0Vycm9yMjMgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xuZnVuY3Rpb24gd3JhcEdhdGV3YXlFcnJvcihlcnJvcikge1xuICBpZiAoIUdhdGV3YXlBdXRoZW50aWNhdGlvbkVycm9yLmlzSW5zdGFuY2UoZXJyb3IpKVxuICAgIHJldHVybiBlcnJvcjtcbiAgY29uc3QgaXNQcm9kdWN0aW9uRW52ID0gKHByb2Nlc3MgPT0gbnVsbCA/IHZvaWQgMCA6IHByb2Nlc3MuZW52Lk5PREVfRU5WKSA9PT0gXCJwcm9kdWN0aW9uXCI7XG4gIGNvbnN0IG1vcmVJbmZvVVJMID0gXCJodHRwczovL2FpLXNkay5kZXYvdW5hdXRoZW50aWNhdGVkLWFpLWdhdGV3YXlcIjtcbiAgaWYgKGlzUHJvZHVjdGlvbkVudikge1xuICAgIHJldHVybiBuZXcgQUlTREtFcnJvcjIzKHtcbiAgICAgIG5hbWU6IFwiR2F0ZXdheUVycm9yXCIsXG4gICAgICBtZXNzYWdlOiBgVW5hdXRoZW50aWNhdGVkLiBDb25maWd1cmUgQUlfR0FURVdBWV9BUElfS0VZIG9yIHVzZSBhIHByb3ZpZGVyIG1vZHVsZS4gTGVhcm4gbW9yZTogJHttb3JlSW5mb1VSTH1gXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgbmV3IEVycm9yKGBcXHgxQlsxbVxceDFCWzMxbVVuYXV0aGVudGljYXRlZCByZXF1ZXN0IHRvIEFJIEdhdGV3YXkuXFx4MUJbMG1cblxuVG8gYXV0aGVudGljYXRlLCBzZXQgdGhlIFxceDFCWzMzbUFJX0dBVEVXQVlfQVBJX0tFWVxceDFCWzBtIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGggeW91ciBBUEkga2V5LlxuXG5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSBhIHByb3ZpZGVyIG1vZHVsZSBpbnN0ZWFkIG9mIHRoZSBBSSBHYXRld2F5LlxuXG5MZWFybiBtb3JlOiBcXHgxQlszNG0ke21vcmVJbmZvVVJMfVxceDFCWzBtXG5cbmApLFxuICAgIHsgbmFtZTogXCJHYXRld2F5QXV0aGVudGljYXRpb25FcnJvclwiIH1cbiAgKTtcbn1cblxuLy8gc3JjL3RlbGVtZXRyeS9hc3NlbWJsZS1vcGVyYXRpb24tbmFtZS50c1xuZnVuY3Rpb24gYXNzZW1ibGVPcGVyYXRpb25OYW1lKHtcbiAgb3BlcmF0aW9uSWQsXG4gIHRlbGVtZXRyeVxufSkge1xuICByZXR1cm4ge1xuICAgIC8vIHN0YW5kYXJkaXplZCBvcGVyYXRpb24gYW5kIHJlc291cmNlIG5hbWU6XG4gICAgXCJvcGVyYXRpb24ubmFtZVwiOiBgJHtvcGVyYXRpb25JZH0keyh0ZWxlbWV0cnkgPT0gbnVsbCA/IHZvaWQgMCA6IHRlbGVtZXRyeS5mdW5jdGlvbklkKSAhPSBudWxsID8gYCAke3RlbGVtZXRyeS5mdW5jdGlvbklkfWAgOiBcIlwifWAsXG4gICAgXCJyZXNvdXJjZS5uYW1lXCI6IHRlbGVtZXRyeSA9PSBudWxsID8gdm9pZCAwIDogdGVsZW1ldHJ5LmZ1bmN0aW9uSWQsXG4gICAgLy8gZGV0YWlsZWQsIEFJIFNESyBzcGVjaWZpYyBkYXRhOlxuICAgIFwiYWkub3BlcmF0aW9uSWRcIjogb3BlcmF0aW9uSWQsXG4gICAgXCJhaS50ZWxlbWV0cnkuZnVuY3Rpb25JZFwiOiB0ZWxlbWV0cnkgPT0gbnVsbCA/IHZvaWQgMCA6IHRlbGVtZXRyeS5mdW5jdGlvbklkXG4gIH07XG59XG5cbi8vIHNyYy90ZWxlbWV0cnkvZ2V0LWJhc2UtdGVsZW1ldHJ5LWF0dHJpYnV0ZXMudHNcbmZ1bmN0aW9uIGdldEJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgbW9kZWwsXG4gIHNldHRpbmdzLFxuICB0ZWxlbWV0cnksXG4gIGhlYWRlcnNcbn0pIHtcbiAgdmFyIF9hMjE7XG4gIHJldHVybiB7XG4gICAgXCJhaS5tb2RlbC5wcm92aWRlclwiOiBtb2RlbC5wcm92aWRlcixcbiAgICBcImFpLm1vZGVsLmlkXCI6IG1vZGVsLm1vZGVsSWQsXG4gICAgLy8gc2V0dGluZ3M6XG4gICAgLi4uT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MpLnJlZHVjZSgoYXR0cmlidXRlcywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBcInRpbWVvdXRcIikge1xuICAgICAgICBjb25zdCB0b3RhbFRpbWVvdXRNcyA9IGdldFRvdGFsVGltZW91dE1zKFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0b3RhbFRpbWVvdXRNcyAhPSBudWxsKSB7XG4gICAgICAgICAgYXR0cmlidXRlc1tgYWkuc2V0dGluZ3MuJHtrZXl9YF0gPSB0b3RhbFRpbWVvdXRNcztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0cmlidXRlc1tgYWkuc2V0dGluZ3MuJHtrZXl9YF0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH0sIHt9KSxcbiAgICAvLyBhZGQgbWV0YWRhdGEgYXMgYXR0cmlidXRlczpcbiAgICAuLi5PYmplY3QuZW50cmllcygoX2EyMSA9IHRlbGVtZXRyeSA9PSBudWxsID8gdm9pZCAwIDogdGVsZW1ldHJ5Lm1ldGFkYXRhKSAhPSBudWxsID8gX2EyMSA6IHt9KS5yZWR1Y2UoXG4gICAgICAoYXR0cmlidXRlcywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGF0dHJpYnV0ZXNbYGFpLnRlbGVtZXRyeS5tZXRhZGF0YS4ke2tleX1gXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICksXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgLi4uT2JqZWN0LmVudHJpZXMoaGVhZGVycyAhPSBudWxsID8gaGVhZGVycyA6IHt9KS5yZWR1Y2UoKGF0dHJpYnV0ZXMsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgYXR0cmlidXRlc1tgYWkucmVxdWVzdC5oZWFkZXJzLiR7a2V5fWBdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICB9LCB7fSlcbiAgfTtcbn1cblxuLy8gc3JjL3RlbGVtZXRyeS9nZXQtdHJhY2VyLnRzXG5pbXBvcnQgeyB0cmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcblxuLy8gc3JjL3RlbGVtZXRyeS9ub29wLXRyYWNlci50c1xudmFyIG5vb3BUcmFjZXIgPSB7XG4gIHN0YXJ0U3BhbigpIHtcbiAgICByZXR1cm4gbm9vcFNwYW47XG4gIH0sXG4gIHN0YXJ0QWN0aXZlU3BhbihuYW1lMjEsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAodHlwZW9mIGFyZzEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGFyZzEobm9vcFNwYW4pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFyZzIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGFyZzIobm9vcFNwYW4pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFyZzMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGFyZzMobm9vcFNwYW4pO1xuICAgIH1cbiAgfVxufTtcbnZhciBub29wU3BhbiA9IHtcbiAgc3BhbkNvbnRleHQoKSB7XG4gICAgcmV0dXJuIG5vb3BTcGFuQ29udGV4dDtcbiAgfSxcbiAgc2V0QXR0cmlidXRlKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBzZXRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBhZGRFdmVudCgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgYWRkTGluaygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgYWRkTGlua3MoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHNldFN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgdXBkYXRlTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW5kKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBpc1JlY29yZGluZygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHJlY29yZEV4Y2VwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcbnZhciBub29wU3BhbkNvbnRleHQgPSB7XG4gIHRyYWNlSWQ6IFwiXCIsXG4gIHNwYW5JZDogXCJcIixcbiAgdHJhY2VGbGFnczogMFxufTtcblxuLy8gc3JjL3RlbGVtZXRyeS9nZXQtdHJhY2VyLnRzXG5mdW5jdGlvbiBnZXRUcmFjZXIoe1xuICBpc0VuYWJsZWQgPSBmYWxzZSxcbiAgdHJhY2VyXG59ID0ge30pIHtcbiAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICByZXR1cm4gbm9vcFRyYWNlcjtcbiAgfVxuICBpZiAodHJhY2VyKSB7XG4gICAgcmV0dXJuIHRyYWNlcjtcbiAgfVxuICByZXR1cm4gdHJhY2UuZ2V0VHJhY2VyKFwiYWlcIik7XG59XG5cbi8vIHNyYy90ZWxlbWV0cnkvcmVjb3JkLXNwYW4udHNcbmltcG9ydCB7XG4gIFNwYW5TdGF0dXNDb2RlLFxuICBjb250ZXh0XG59IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmFzeW5jIGZ1bmN0aW9uIHJlY29yZFNwYW4oe1xuICBuYW1lOiBuYW1lMjEsXG4gIHRyYWNlcixcbiAgYXR0cmlidXRlcyxcbiAgZm4sXG4gIGVuZFdoZW5Eb25lID0gdHJ1ZVxufSkge1xuICByZXR1cm4gdHJhY2VyLnN0YXJ0QWN0aXZlU3BhbihcbiAgICBuYW1lMjEsXG4gICAgeyBhdHRyaWJ1dGVzOiBhd2FpdCBhdHRyaWJ1dGVzIH0sXG4gICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGNvbnRleHQuYWN0aXZlKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250ZXh0LndpdGgoY3R4LCAoKSA9PiBmbihzcGFuKSk7XG4gICAgICAgIGlmIChlbmRXaGVuRG9uZSkge1xuICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVjb3JkRXJyb3JPblNwYW4oc3BhbiwgZXJyb3IpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuZnVuY3Rpb24gcmVjb3JkRXJyb3JPblNwYW4oc3BhbiwgZXJyb3IpIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBzcGFuLnJlY29yZEV4Y2VwdGlvbih7XG4gICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgIHN0YWNrOiBlcnJvci5zdGFja1xuICAgIH0pO1xuICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IgfSk7XG4gIH1cbn1cblxuLy8gc3JjL3RlbGVtZXRyeS9zZWxlY3QtdGVsZW1ldHJ5LWF0dHJpYnV0ZXMudHNcbmFzeW5jIGZ1bmN0aW9uIHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICB0ZWxlbWV0cnksXG4gIGF0dHJpYnV0ZXNcbn0pIHtcbiAgaWYgKCh0ZWxlbWV0cnkgPT0gbnVsbCA/IHZvaWQgMCA6IHRlbGVtZXRyeS5pc0VuYWJsZWQpICE9PSB0cnVlKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGNvbnN0IHJlc3VsdEF0dHJpYnV0ZXMgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJpbnB1dFwiIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pbnB1dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBpZiAoKHRlbGVtZXRyeSA9PSBudWxsID8gdm9pZCAwIDogdGVsZW1ldHJ5LnJlY29yZElucHV0cykgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmFsdWUuaW5wdXQoKTtcbiAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICByZXN1bHRBdHRyaWJ1dGVzW2tleV0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBcIm91dHB1dFwiIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgaWYgKCh0ZWxlbWV0cnkgPT0gbnVsbCA/IHZvaWQgMCA6IHRlbGVtZXRyeS5yZWNvcmRPdXRwdXRzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2YWx1ZS5vdXRwdXQoKTtcbiAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICByZXN1bHRBdHRyaWJ1dGVzW2tleV0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmVzdWx0QXR0cmlidXRlc1trZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdEF0dHJpYnV0ZXM7XG59XG5cbi8vIHNyYy90ZWxlbWV0cnkvc3RyaW5naWZ5LWZvci10ZWxlbWV0cnkudHNcbmZ1bmN0aW9uIHN0cmluZ2lmeUZvclRlbGVtZXRyeShwcm9tcHQpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFxuICAgIHByb21wdC5tYXAoKG1lc3NhZ2UpID0+ICh7XG4gICAgICAuLi5tZXNzYWdlLFxuICAgICAgY29udGVudDogdHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2UuY29udGVudCA6IG1lc3NhZ2UuY29udGVudC5tYXAoXG4gICAgICAgIChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09IFwiZmlsZVwiID8ge1xuICAgICAgICAgIC4uLnBhcnQsXG4gICAgICAgICAgZGF0YTogcGFydC5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGNvbnZlcnREYXRhQ29udGVudFRvQmFzZTY0U3RyaW5nKHBhcnQuZGF0YSkgOiBwYXJ0LmRhdGFcbiAgICAgICAgfSA6IHBhcnRcbiAgICAgIClcbiAgICB9KSlcbiAgKTtcbn1cblxuLy8gc3JjL3RlbGVtZXRyeS90ZWxlbWV0cnktaW50ZWdyYXRpb24tcmVnaXN0cnkudHNcbmZ1bmN0aW9uIHJlZ2lzdGVyVGVsZW1ldHJ5SW50ZWdyYXRpb24oaW50ZWdyYXRpb24pIHtcbiAgaWYgKCFnbG9iYWxUaGlzLkFJX1NES19URUxFTUVUUllfSU5URUdSQVRJT05TKSB7XG4gICAgZ2xvYmFsVGhpcy5BSV9TREtfVEVMRU1FVFJZX0lOVEVHUkFUSU9OUyA9IFtdO1xuICB9XG4gIGdsb2JhbFRoaXMuQUlfU0RLX1RFTEVNRVRSWV9JTlRFR1JBVElPTlMucHVzaChpbnRlZ3JhdGlvbik7XG59XG5mdW5jdGlvbiBnZXRHbG9iYWxUZWxlbWV0cnlJbnRlZ3JhdGlvbnMoKSB7XG4gIHZhciBfYTIxO1xuICByZXR1cm4gKF9hMjEgPSBnbG9iYWxUaGlzLkFJX1NES19URUxFTUVUUllfSU5URUdSQVRJT05TKSAhPSBudWxsID8gX2EyMSA6IFtdO1xufVxuXG4vLyBzcmMvdGVsZW1ldHJ5L2dldC1nbG9iYWwtdGVsZW1ldHJ5LWludGVncmF0aW9uLnRzXG5mdW5jdGlvbiBiaW5kVGVsZW1ldHJ5SW50ZWdyYXRpb24oaW50ZWdyYXRpb24pIHtcbiAgdmFyIF9hMjEsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgcmV0dXJuIHtcbiAgICBvblN0YXJ0OiAoX2EyMSA9IGludGVncmF0aW9uLm9uU3RhcnQpID09IG51bGwgPyB2b2lkIDAgOiBfYTIxLmJpbmQoaW50ZWdyYXRpb24pLFxuICAgIG9uU3RlcFN0YXJ0OiAoX2IgPSBpbnRlZ3JhdGlvbi5vblN0ZXBTdGFydCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLmJpbmQoaW50ZWdyYXRpb24pLFxuICAgIG9uVG9vbENhbGxTdGFydDogKF9jID0gaW50ZWdyYXRpb24ub25Ub29sQ2FsbFN0YXJ0KSA9PSBudWxsID8gdm9pZCAwIDogX2MuYmluZChpbnRlZ3JhdGlvbiksXG4gICAgb25Ub29sQ2FsbEZpbmlzaDogKF9kID0gaW50ZWdyYXRpb24ub25Ub29sQ2FsbEZpbmlzaCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kLmJpbmQoaW50ZWdyYXRpb24pLFxuICAgIG9uU3RlcEZpbmlzaDogKF9lID0gaW50ZWdyYXRpb24ub25TdGVwRmluaXNoKSA9PSBudWxsID8gdm9pZCAwIDogX2UuYmluZChpbnRlZ3JhdGlvbiksXG4gICAgb25GaW5pc2g6IChfZiA9IGludGVncmF0aW9uLm9uRmluaXNoKSA9PSBudWxsID8gdm9pZCAwIDogX2YuYmluZChpbnRlZ3JhdGlvbilcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldEdsb2JhbFRlbGVtZXRyeUludGVncmF0aW9uKCkge1xuICBjb25zdCBnbG9iYWxJbnRlZ3JhdGlvbnMgPSBnZXRHbG9iYWxUZWxlbWV0cnlJbnRlZ3JhdGlvbnMoKTtcbiAgcmV0dXJuIChpbnRlZ3JhdGlvbnMpID0+IHtcbiAgICBjb25zdCBsb2NhbEludGVncmF0aW9ucyA9IGFzQXJyYXkoaW50ZWdyYXRpb25zKTtcbiAgICBjb25zdCBhbGxJbnRlZ3JhdGlvbnMgPSBbLi4uZ2xvYmFsSW50ZWdyYXRpb25zLCAuLi5sb2NhbEludGVncmF0aW9uc107XG4gICAgZnVuY3Rpb24gY3JlYXRlVGVsZW1ldHJ5Q29tcG9zaXRlKGdldExpc3RlbmVyRnJvbUludGVncmF0aW9uKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lcnMgPSBhbGxJbnRlZ3JhdGlvbnMubWFwKGdldExpc3RlbmVyRnJvbUludGVncmF0aW9uKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICByZXR1cm4gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgICAgICB9IGNhdGNoIChfaWdub3JlZCkge1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uU3RhcnQ6IGNyZWF0ZVRlbGVtZXRyeUNvbXBvc2l0ZSgoaW50ZWdyYXRpb24pID0+IGludGVncmF0aW9uLm9uU3RhcnQpLFxuICAgICAgb25TdGVwU3RhcnQ6IGNyZWF0ZVRlbGVtZXRyeUNvbXBvc2l0ZShcbiAgICAgICAgKGludGVncmF0aW9uKSA9PiBpbnRlZ3JhdGlvbi5vblN0ZXBTdGFydFxuICAgICAgKSxcbiAgICAgIG9uVG9vbENhbGxTdGFydDogY3JlYXRlVGVsZW1ldHJ5Q29tcG9zaXRlKFxuICAgICAgICAoaW50ZWdyYXRpb24pID0+IGludGVncmF0aW9uLm9uVG9vbENhbGxTdGFydFxuICAgICAgKSxcbiAgICAgIG9uVG9vbENhbGxGaW5pc2g6IGNyZWF0ZVRlbGVtZXRyeUNvbXBvc2l0ZShcbiAgICAgICAgKGludGVncmF0aW9uKSA9PiBpbnRlZ3JhdGlvbi5vblRvb2xDYWxsRmluaXNoXG4gICAgICApLFxuICAgICAgb25TdGVwRmluaXNoOiBjcmVhdGVUZWxlbWV0cnlDb21wb3NpdGUoXG4gICAgICAgIChpbnRlZ3JhdGlvbikgPT4gaW50ZWdyYXRpb24ub25TdGVwRmluaXNoXG4gICAgICApLFxuICAgICAgb25GaW5pc2g6IGNyZWF0ZVRlbGVtZXRyeUNvbXBvc2l0ZSgoaW50ZWdyYXRpb24pID0+IGludGVncmF0aW9uLm9uRmluaXNoKVxuICAgIH07XG4gIH07XG59XG5cbi8vIHNyYy90eXBlcy91c2FnZS50c1xuZnVuY3Rpb24gYXNMYW5ndWFnZU1vZGVsVXNhZ2UodXNhZ2UpIHtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMudG90YWwsXG4gICAgaW5wdXRUb2tlbkRldGFpbHM6IHtcbiAgICAgIG5vQ2FjaGVUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zLm5vQ2FjaGUsXG4gICAgICBjYWNoZVJlYWRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zLmNhY2hlUmVhZCxcbiAgICAgIGNhY2hlV3JpdGVUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zLmNhY2hlV3JpdGVcbiAgICB9LFxuICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLnRvdGFsLFxuICAgIG91dHB1dFRva2VuRGV0YWlsczoge1xuICAgICAgdGV4dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLnRleHQsXG4gICAgICByZWFzb25pbmdUb2tlbnM6IHVzYWdlLm91dHB1dFRva2Vucy5yZWFzb25pbmdcbiAgICB9LFxuICAgIHRvdGFsVG9rZW5zOiBhZGRUb2tlbkNvdW50cyhcbiAgICAgIHVzYWdlLmlucHV0VG9rZW5zLnRvdGFsLFxuICAgICAgdXNhZ2Uub3V0cHV0VG9rZW5zLnRvdGFsXG4gICAgKSxcbiAgICByYXc6IHVzYWdlLnJhdyxcbiAgICByZWFzb25pbmdUb2tlbnM6IHVzYWdlLm91dHB1dFRva2Vucy5yZWFzb25pbmcsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zLmNhY2hlUmVhZFxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlTnVsbExhbmd1YWdlTW9kZWxVc2FnZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dFRva2Vuczogdm9pZCAwLFxuICAgIGlucHV0VG9rZW5EZXRhaWxzOiB7XG4gICAgICBub0NhY2hlVG9rZW5zOiB2b2lkIDAsXG4gICAgICBjYWNoZVJlYWRUb2tlbnM6IHZvaWQgMCxcbiAgICAgIGNhY2hlV3JpdGVUb2tlbnM6IHZvaWQgMFxuICAgIH0sXG4gICAgb3V0cHV0VG9rZW5zOiB2b2lkIDAsXG4gICAgb3V0cHV0VG9rZW5EZXRhaWxzOiB7XG4gICAgICB0ZXh0VG9rZW5zOiB2b2lkIDAsXG4gICAgICByZWFzb25pbmdUb2tlbnM6IHZvaWQgMFxuICAgIH0sXG4gICAgdG90YWxUb2tlbnM6IHZvaWQgMCxcbiAgICByYXc6IHZvaWQgMFxuICB9O1xufVxuZnVuY3Rpb24gYWRkTGFuZ3VhZ2VNb2RlbFVzYWdlKHVzYWdlMSwgdXNhZ2UyKSB7XG4gIHZhciBfYTIxLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2ksIF9qO1xuICByZXR1cm4ge1xuICAgIGlucHV0VG9rZW5zOiBhZGRUb2tlbkNvdW50cyh1c2FnZTEuaW5wdXRUb2tlbnMsIHVzYWdlMi5pbnB1dFRva2VucyksXG4gICAgaW5wdXRUb2tlbkRldGFpbHM6IHtcbiAgICAgIG5vQ2FjaGVUb2tlbnM6IGFkZFRva2VuQ291bnRzKFxuICAgICAgICAoX2EyMSA9IHVzYWdlMS5pbnB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjEubm9DYWNoZVRva2VucyxcbiAgICAgICAgKF9iID0gdXNhZ2UyLmlucHV0VG9rZW5EZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2Iubm9DYWNoZVRva2Vuc1xuICAgICAgKSxcbiAgICAgIGNhY2hlUmVhZFRva2VuczogYWRkVG9rZW5Db3VudHMoXG4gICAgICAgIChfYyA9IHVzYWdlMS5pbnB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9jLmNhY2hlUmVhZFRva2VucyxcbiAgICAgICAgKF9kID0gdXNhZ2UyLmlucHV0VG9rZW5EZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2QuY2FjaGVSZWFkVG9rZW5zXG4gICAgICApLFxuICAgICAgY2FjaGVXcml0ZVRva2VuczogYWRkVG9rZW5Db3VudHMoXG4gICAgICAgIChfZSA9IHVzYWdlMS5pbnB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9lLmNhY2hlV3JpdGVUb2tlbnMsXG4gICAgICAgIChfZiA9IHVzYWdlMi5pbnB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9mLmNhY2hlV3JpdGVUb2tlbnNcbiAgICAgIClcbiAgICB9LFxuICAgIG91dHB1dFRva2VuczogYWRkVG9rZW5Db3VudHModXNhZ2UxLm91dHB1dFRva2VucywgdXNhZ2UyLm91dHB1dFRva2VucyksXG4gICAgb3V0cHV0VG9rZW5EZXRhaWxzOiB7XG4gICAgICB0ZXh0VG9rZW5zOiBhZGRUb2tlbkNvdW50cyhcbiAgICAgICAgKF9nID0gdXNhZ2UxLm91dHB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9nLnRleHRUb2tlbnMsXG4gICAgICAgIChfaCA9IHVzYWdlMi5vdXRwdXRUb2tlbkRldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfaC50ZXh0VG9rZW5zXG4gICAgICApLFxuICAgICAgcmVhc29uaW5nVG9rZW5zOiBhZGRUb2tlbkNvdW50cyhcbiAgICAgICAgKF9pID0gdXNhZ2UxLm91dHB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9pLnJlYXNvbmluZ1Rva2VucyxcbiAgICAgICAgKF9qID0gdXNhZ2UyLm91dHB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9qLnJlYXNvbmluZ1Rva2Vuc1xuICAgICAgKVxuICAgIH0sXG4gICAgdG90YWxUb2tlbnM6IGFkZFRva2VuQ291bnRzKHVzYWdlMS50b3RhbFRva2VucywgdXNhZ2UyLnRvdGFsVG9rZW5zKSxcbiAgICByZWFzb25pbmdUb2tlbnM6IGFkZFRva2VuQ291bnRzKFxuICAgICAgdXNhZ2UxLnJlYXNvbmluZ1Rva2VucyxcbiAgICAgIHVzYWdlMi5yZWFzb25pbmdUb2tlbnNcbiAgICApLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiBhZGRUb2tlbkNvdW50cyhcbiAgICAgIHVzYWdlMS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICAgIHVzYWdlMi5jYWNoZWRJbnB1dFRva2Vuc1xuICAgIClcbiAgfTtcbn1cbmZ1bmN0aW9uIGFkZFRva2VuQ291bnRzKHRva2VuQ291bnQxLCB0b2tlbkNvdW50Mikge1xuICByZXR1cm4gdG9rZW5Db3VudDEgPT0gbnVsbCAmJiB0b2tlbkNvdW50MiA9PSBudWxsID8gdm9pZCAwIDogKHRva2VuQ291bnQxICE9IG51bGwgPyB0b2tlbkNvdW50MSA6IDApICsgKHRva2VuQ291bnQyICE9IG51bGwgPyB0b2tlbkNvdW50MiA6IDApO1xufVxuZnVuY3Rpb24gYWRkSW1hZ2VNb2RlbFVzYWdlKHVzYWdlMSwgdXNhZ2UyKSB7XG4gIHJldHVybiB7XG4gICAgaW5wdXRUb2tlbnM6IGFkZFRva2VuQ291bnRzKHVzYWdlMS5pbnB1dFRva2VucywgdXNhZ2UyLmlucHV0VG9rZW5zKSxcbiAgICBvdXRwdXRUb2tlbnM6IGFkZFRva2VuQ291bnRzKHVzYWdlMS5vdXRwdXRUb2tlbnMsIHVzYWdlMi5vdXRwdXRUb2tlbnMpLFxuICAgIHRvdGFsVG9rZW5zOiBhZGRUb2tlbkNvdW50cyh1c2FnZTEudG90YWxUb2tlbnMsIHVzYWdlMi50b3RhbFRva2VucylcbiAgfTtcbn1cblxuLy8gc3JjL3V0aWwvbWVyZ2Utb2JqZWN0cy50c1xuZnVuY3Rpb24gbWVyZ2VPYmplY3RzKGJhc2UsIG92ZXJyaWRlcykge1xuICBpZiAoYmFzZSA9PT0gdm9pZCAwICYmIG92ZXJyaWRlcyA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBpZiAoYmFzZSA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIG92ZXJyaWRlcztcbiAgfVxuICBpZiAob3ZlcnJpZGVzID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSB7IC4uLmJhc2UgfTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb3ZlcnJpZGVzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvdmVycmlkZXMsIGtleSkpIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlc1ZhbHVlID0gb3ZlcnJpZGVzW2tleV07XG4gICAgICBpZiAob3ZlcnJpZGVzVmFsdWUgPT09IHZvaWQgMClcbiAgICAgICAgY29udGludWU7XG4gICAgICBjb25zdCBiYXNlVmFsdWUgPSBrZXkgaW4gYmFzZSA/IGJhc2Vba2V5XSA6IHZvaWQgMDtcbiAgICAgIGNvbnN0IGlzU291cmNlT2JqZWN0ID0gb3ZlcnJpZGVzVmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIG92ZXJyaWRlc1ZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KG92ZXJyaWRlc1ZhbHVlKSAmJiAhKG92ZXJyaWRlc1ZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgJiYgIShvdmVycmlkZXNWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCk7XG4gICAgICBjb25zdCBpc1RhcmdldE9iamVjdCA9IGJhc2VWYWx1ZSAhPT0gbnVsbCAmJiBiYXNlVmFsdWUgIT09IHZvaWQgMCAmJiB0eXBlb2YgYmFzZVZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGJhc2VWYWx1ZSkgJiYgIShiYXNlVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSAmJiAhKGJhc2VWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCk7XG4gICAgICBpZiAoaXNTb3VyY2VPYmplY3QgJiYgaXNUYXJnZXRPYmplY3QpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZU9iamVjdHMoXG4gICAgICAgICAgYmFzZVZhbHVlLFxuICAgICAgICAgIG92ZXJyaWRlc1ZhbHVlXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IG92ZXJyaWRlc1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBzcmMvdXRpbC9yZXRyeS13aXRoLWV4cG9uZW50aWFsLWJhY2tvZmYudHNcbmltcG9ydCB7IEFQSUNhbGxFcnJvciBhcyBBUElDYWxsRXJyb3IyIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGRlbGF5LCBnZXRFcnJvck1lc3NhZ2UgYXMgZ2V0RXJyb3JNZXNzYWdlNCwgaXNBYm9ydEVycm9yIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmZ1bmN0aW9uIGdldFJldHJ5RGVsYXlJbk1zKHtcbiAgZXJyb3IsXG4gIGV4cG9uZW50aWFsQmFja29mZkRlbGF5XG59KSB7XG4gIGNvbnN0IGhlYWRlcnMgPSBlcnJvci5yZXNwb25zZUhlYWRlcnM7XG4gIGlmICghaGVhZGVycylcbiAgICByZXR1cm4gZXhwb25lbnRpYWxCYWNrb2ZmRGVsYXk7XG4gIGxldCBtcztcbiAgY29uc3QgcmV0cnlBZnRlck1zID0gaGVhZGVyc1tcInJldHJ5LWFmdGVyLW1zXCJdO1xuICBpZiAocmV0cnlBZnRlck1zKSB7XG4gICAgY29uc3QgdGltZW91dE1zID0gcGFyc2VGbG9hdChyZXRyeUFmdGVyTXMpO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKHRpbWVvdXRNcykpIHtcbiAgICAgIG1zID0gdGltZW91dE1zO1xuICAgIH1cbiAgfVxuICBjb25zdCByZXRyeUFmdGVyID0gaGVhZGVyc1tcInJldHJ5LWFmdGVyXCJdO1xuICBpZiAocmV0cnlBZnRlciAmJiBtcyA9PT0gdm9pZCAwKSB7XG4gICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBwYXJzZUZsb2F0KHJldHJ5QWZ0ZXIpO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKHRpbWVvdXRTZWNvbmRzKSkge1xuICAgICAgbXMgPSB0aW1lb3V0U2Vjb25kcyAqIDFlMztcbiAgICB9IGVsc2Uge1xuICAgICAgbXMgPSBEYXRlLnBhcnNlKHJldHJ5QWZ0ZXIpIC0gRGF0ZS5ub3coKTtcbiAgICB9XG4gIH1cbiAgaWYgKG1zICE9IG51bGwgJiYgIU51bWJlci5pc05hTihtcykgJiYgMCA8PSBtcyAmJiAobXMgPCA2MCAqIDFlMyB8fCBtcyA8IGV4cG9uZW50aWFsQmFja29mZkRlbGF5KSkge1xuICAgIHJldHVybiBtcztcbiAgfVxuICByZXR1cm4gZXhwb25lbnRpYWxCYWNrb2ZmRGVsYXk7XG59XG52YXIgcmV0cnlXaXRoRXhwb25lbnRpYWxCYWNrb2ZmUmVzcGVjdGluZ1JldHJ5SGVhZGVycyA9ICh7XG4gIG1heFJldHJpZXMgPSAyLFxuICBpbml0aWFsRGVsYXlJbk1zID0gMmUzLFxuICBiYWNrb2ZmRmFjdG9yID0gMixcbiAgYWJvcnRTaWduYWxcbn0gPSB7fSkgPT4gYXN5bmMgKGYpID0+IF9yZXRyeVdpdGhFeHBvbmVudGlhbEJhY2tvZmYoZiwge1xuICBtYXhSZXRyaWVzLFxuICBkZWxheUluTXM6IGluaXRpYWxEZWxheUluTXMsXG4gIGJhY2tvZmZGYWN0b3IsXG4gIGFib3J0U2lnbmFsXG59KTtcbmFzeW5jIGZ1bmN0aW9uIF9yZXRyeVdpdGhFeHBvbmVudGlhbEJhY2tvZmYoZiwge1xuICBtYXhSZXRyaWVzLFxuICBkZWxheUluTXMsXG4gIGJhY2tvZmZGYWN0b3IsXG4gIGFib3J0U2lnbmFsXG59LCBlcnJvcnMgPSBbXSkge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzQWJvcnRFcnJvcihlcnJvcikpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAobWF4UmV0cmllcyA9PT0gMCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdldEVycm9yTWVzc2FnZTQoZXJyb3IpO1xuICAgIGNvbnN0IG5ld0Vycm9ycyA9IFsuLi5lcnJvcnMsIGVycm9yXTtcbiAgICBjb25zdCB0cnlOdW1iZXIgPSBuZXdFcnJvcnMubGVuZ3RoO1xuICAgIGlmICh0cnlOdW1iZXIgPiBtYXhSZXRyaWVzKSB7XG4gICAgICB0aHJvdyBuZXcgUmV0cnlFcnJvcih7XG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgYWZ0ZXIgJHt0cnlOdW1iZXJ9IGF0dGVtcHRzLiBMYXN0IGVycm9yOiAke2Vycm9yTWVzc2FnZX1gLFxuICAgICAgICByZWFzb246IFwibWF4UmV0cmllc0V4Y2VlZGVkXCIsXG4gICAgICAgIGVycm9yczogbmV3RXJyb3JzXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgQVBJQ2FsbEVycm9yMi5pc0luc3RhbmNlKGVycm9yKSAmJiBlcnJvci5pc1JldHJ5YWJsZSA9PT0gdHJ1ZSAmJiB0cnlOdW1iZXIgPD0gbWF4UmV0cmllcykge1xuICAgICAgYXdhaXQgZGVsYXkoXG4gICAgICAgIGdldFJldHJ5RGVsYXlJbk1zKHtcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBleHBvbmVudGlhbEJhY2tvZmZEZWxheTogZGVsYXlJbk1zXG4gICAgICAgIH0pLFxuICAgICAgICB7IGFib3J0U2lnbmFsIH1cbiAgICAgICk7XG4gICAgICByZXR1cm4gX3JldHJ5V2l0aEV4cG9uZW50aWFsQmFja29mZihcbiAgICAgICAgZixcbiAgICAgICAge1xuICAgICAgICAgIG1heFJldHJpZXMsXG4gICAgICAgICAgZGVsYXlJbk1zOiBiYWNrb2ZmRmFjdG9yICogZGVsYXlJbk1zLFxuICAgICAgICAgIGJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgYWJvcnRTaWduYWxcbiAgICAgICAgfSxcbiAgICAgICAgbmV3RXJyb3JzXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHJ5TnVtYmVyID09PSAxKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFJldHJ5RXJyb3Ioe1xuICAgICAgbWVzc2FnZTogYEZhaWxlZCBhZnRlciAke3RyeU51bWJlcn0gYXR0ZW1wdHMgd2l0aCBub24tcmV0cnlhYmxlIGVycm9yOiAnJHtlcnJvck1lc3NhZ2V9J2AsXG4gICAgICByZWFzb246IFwiZXJyb3JOb3RSZXRyeWFibGVcIixcbiAgICAgIGVycm9yczogbmV3RXJyb3JzXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gc3JjL3V0aWwvcHJlcGFyZS1yZXRyaWVzLnRzXG5mdW5jdGlvbiBwcmVwYXJlUmV0cmllcyh7XG4gIG1heFJldHJpZXMsXG4gIGFib3J0U2lnbmFsXG59KSB7XG4gIGlmIChtYXhSZXRyaWVzICE9IG51bGwpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4UmV0cmllcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcih7XG4gICAgICAgIHBhcmFtZXRlcjogXCJtYXhSZXRyaWVzXCIsXG4gICAgICAgIHZhbHVlOiBtYXhSZXRyaWVzLFxuICAgICAgICBtZXNzYWdlOiBcIm1heFJldHJpZXMgbXVzdCBiZSBhbiBpbnRlZ2VyXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAobWF4UmV0cmllcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcih7XG4gICAgICAgIHBhcmFtZXRlcjogXCJtYXhSZXRyaWVzXCIsXG4gICAgICAgIHZhbHVlOiBtYXhSZXRyaWVzLFxuICAgICAgICBtZXNzYWdlOiBcIm1heFJldHJpZXMgbXVzdCBiZSA+PSAwXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjb25zdCBtYXhSZXRyaWVzUmVzdWx0ID0gbWF4UmV0cmllcyAhPSBudWxsID8gbWF4UmV0cmllcyA6IDI7XG4gIHJldHVybiB7XG4gICAgbWF4UmV0cmllczogbWF4UmV0cmllc1Jlc3VsdCxcbiAgICByZXRyeTogcmV0cnlXaXRoRXhwb25lbnRpYWxCYWNrb2ZmUmVzcGVjdGluZ1JldHJ5SGVhZGVycyh7XG4gICAgICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzUmVzdWx0LFxuICAgICAgYWJvcnRTaWduYWxcbiAgICB9KVxuICB9O1xufVxuXG4vLyBzcmMvZ2VuZXJhdGUtdGV4dC9jb2xsZWN0LXRvb2wtYXBwcm92YWxzLnRzXG5mdW5jdGlvbiBjb2xsZWN0VG9vbEFwcHJvdmFscyh7XG4gIG1lc3NhZ2VzXG59KSB7XG4gIGNvbnN0IGxhc3RNZXNzYWdlID0gbWVzc2FnZXMuYXQoLTEpO1xuICBpZiAoKGxhc3RNZXNzYWdlID09IG51bGwgPyB2b2lkIDAgOiBsYXN0TWVzc2FnZS5yb2xlKSAhPSBcInRvb2xcIikge1xuICAgIHJldHVybiB7XG4gICAgICBhcHByb3ZlZFRvb2xBcHByb3ZhbHM6IFtdLFxuICAgICAgZGVuaWVkVG9vbEFwcHJvdmFsczogW11cbiAgICB9O1xuICB9XG4gIGNvbnN0IHRvb2xDYWxsc0J5VG9vbENhbGxJZCA9IHt9O1xuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcbiAgICBpZiAobWVzc2FnZS5yb2xlID09PSBcImFzc2lzdGFudFwiICYmIHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBtZXNzYWdlLmNvbnRlbnQ7XG4gICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgY29udGVudCkge1xuICAgICAgICBpZiAocGFydC50eXBlID09PSBcInRvb2wtY2FsbFwiKSB7XG4gICAgICAgICAgdG9vbENhbGxzQnlUb29sQ2FsbElkW3BhcnQudG9vbENhbGxJZF0gPSBwYXJ0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHRvb2xBcHByb3ZhbFJlcXVlc3RzQnlBcHByb3ZhbElkID0ge307XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgIGlmIChtZXNzYWdlLnJvbGUgPT09IFwiYXNzaXN0YW50XCIgJiYgdHlwZW9mIG1lc3NhZ2UuY29udGVudCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgY29udGVudCA9IG1lc3NhZ2UuY29udGVudDtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBjb250ZW50KSB7XG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidG9vbC1hcHByb3ZhbC1yZXF1ZXN0XCIpIHtcbiAgICAgICAgICB0b29sQXBwcm92YWxSZXF1ZXN0c0J5QXBwcm92YWxJZFtwYXJ0LmFwcHJvdmFsSWRdID0gcGFydDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCB0b29sUmVzdWx0cyA9IHt9O1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgbGFzdE1lc3NhZ2UuY29udGVudCkge1xuICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidG9vbC1yZXN1bHRcIikge1xuICAgICAgdG9vbFJlc3VsdHNbcGFydC50b29sQ2FsbElkXSA9IHBhcnQ7XG4gICAgfVxuICB9XG4gIGNvbnN0IGFwcHJvdmVkVG9vbEFwcHJvdmFscyA9IFtdO1xuICBjb25zdCBkZW5pZWRUb29sQXBwcm92YWxzID0gW107XG4gIGNvbnN0IGFwcHJvdmFsUmVzcG9uc2VzID0gbGFzdE1lc3NhZ2UuY29udGVudC5maWx0ZXIoXG4gICAgKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gXCJ0b29sLWFwcHJvdmFsLXJlc3BvbnNlXCJcbiAgKTtcbiAgZm9yIChjb25zdCBhcHByb3ZhbFJlc3BvbnNlIG9mIGFwcHJvdmFsUmVzcG9uc2VzKSB7XG4gICAgY29uc3QgYXBwcm92YWxSZXF1ZXN0ID0gdG9vbEFwcHJvdmFsUmVxdWVzdHNCeUFwcHJvdmFsSWRbYXBwcm92YWxSZXNwb25zZS5hcHByb3ZhbElkXTtcbiAgICBpZiAoYXBwcm92YWxSZXF1ZXN0ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9vbEFwcHJvdmFsRXJyb3Ioe1xuICAgICAgICBhcHByb3ZhbElkOiBhcHByb3ZhbFJlc3BvbnNlLmFwcHJvdmFsSWRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodG9vbFJlc3VsdHNbYXBwcm92YWxSZXF1ZXN0LnRvb2xDYWxsSWRdICE9IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB0b29sQ2FsbCA9IHRvb2xDYWxsc0J5VG9vbENhbGxJZFthcHByb3ZhbFJlcXVlc3QudG9vbENhbGxJZF07XG4gICAgaWYgKHRvb2xDYWxsID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbE5vdEZvdW5kRm9yQXBwcm92YWxFcnJvcih7XG4gICAgICAgIHRvb2xDYWxsSWQ6IGFwcHJvdmFsUmVxdWVzdC50b29sQ2FsbElkLFxuICAgICAgICBhcHByb3ZhbElkOiBhcHByb3ZhbFJlcXVlc3QuYXBwcm92YWxJZFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGFwcHJvdmFsID0ge1xuICAgICAgYXBwcm92YWxSZXF1ZXN0LFxuICAgICAgYXBwcm92YWxSZXNwb25zZSxcbiAgICAgIHRvb2xDYWxsXG4gICAgfTtcbiAgICBpZiAoYXBwcm92YWxSZXNwb25zZS5hcHByb3ZlZCkge1xuICAgICAgYXBwcm92ZWRUb29sQXBwcm92YWxzLnB1c2goYXBwcm92YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZW5pZWRUb29sQXBwcm92YWxzLnB1c2goYXBwcm92YWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBhcHByb3ZlZFRvb2xBcHByb3ZhbHMsIGRlbmllZFRvb2xBcHByb3ZhbHMgfTtcbn1cblxuLy8gc3JjL2dlbmVyYXRlLXRleHQvZXhlY3V0ZS10b29sLWNhbGwudHNcbmltcG9ydCB7IGV4ZWN1dGVUb29sIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL3V0aWwvbm93LnRzXG5mdW5jdGlvbiBub3coKSB7XG4gIHZhciBfYTIxLCBfYjtcbiAgcmV0dXJuIChfYiA9IChfYTIxID0gZ2xvYmFsVGhpcyA9PSBudWxsID8gdm9pZCAwIDogZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjEubm93KCkpICE9IG51bGwgPyBfYiA6IERhdGUubm93KCk7XG59XG5cbi8vIHNyYy9nZW5lcmF0ZS10ZXh0L2V4ZWN1dGUtdG9vbC1jYWxsLnRzXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlVG9vbENhbGwoe1xuICB0b29sQ2FsbCxcbiAgdG9vbHMsXG4gIHRyYWNlcixcbiAgdGVsZW1ldHJ5LFxuICBtZXNzYWdlcyxcbiAgYWJvcnRTaWduYWwsXG4gIGV4cGVyaW1lbnRhbF9jb250ZXh0LFxuICBzdGVwTnVtYmVyLFxuICBtb2RlbCxcbiAgb25QcmVsaW1pbmFyeVRvb2xSZXN1bHQsXG4gIG9uVG9vbENhbGxTdGFydCxcbiAgb25Ub29sQ2FsbEZpbmlzaFxufSkge1xuICBjb25zdCB7IHRvb2xOYW1lLCB0b29sQ2FsbElkLCBpbnB1dCB9ID0gdG9vbENhbGw7XG4gIGNvbnN0IHRvb2wyID0gdG9vbHMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2xzW3Rvb2xOYW1lXTtcbiAgaWYgKCh0b29sMiA9PSBudWxsID8gdm9pZCAwIDogdG9vbDIuZXhlY3V0ZSkgPT0gbnVsbCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgY29uc3QgYmFzZUNhbGxiYWNrRXZlbnQgPSB7XG4gICAgc3RlcE51bWJlcixcbiAgICBtb2RlbCxcbiAgICB0b29sQ2FsbCxcbiAgICBtZXNzYWdlcyxcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBmdW5jdGlvbklkOiB0ZWxlbWV0cnkgPT0gbnVsbCA/IHZvaWQgMCA6IHRlbGVtZXRyeS5mdW5jdGlvbklkLFxuICAgIG1ldGFkYXRhOiB0ZWxlbWV0cnkgPT0gbnVsbCA/IHZvaWQgMCA6IHRlbGVtZXRyeS5tZXRhZGF0YSxcbiAgICBleHBlcmltZW50YWxfY29udGV4dFxuICB9O1xuICByZXR1cm4gcmVjb3JkU3Bhbih7XG4gICAgbmFtZTogXCJhaS50b29sQ2FsbFwiLFxuICAgIGF0dHJpYnV0ZXM6IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgdGVsZW1ldHJ5LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAuLi5hc3NlbWJsZU9wZXJhdGlvbk5hbWUoe1xuICAgICAgICAgIG9wZXJhdGlvbklkOiBcImFpLnRvb2xDYWxsXCIsXG4gICAgICAgICAgdGVsZW1ldHJ5XG4gICAgICAgIH0pLFxuICAgICAgICBcImFpLnRvb2xDYWxsLm5hbWVcIjogdG9vbE5hbWUsXG4gICAgICAgIFwiYWkudG9vbENhbGwuaWRcIjogdG9vbENhbGxJZCxcbiAgICAgICAgXCJhaS50b29sQ2FsbC5hcmdzXCI6IHtcbiAgICAgICAgICBvdXRwdXQ6ICgpID0+IEpTT04uc3RyaW5naWZ5KGlucHV0KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksXG4gICAgdHJhY2VyLFxuICAgIGZuOiBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgbGV0IG91dHB1dDtcbiAgICAgIGF3YWl0IG5vdGlmeSh7IGV2ZW50OiBiYXNlQ2FsbGJhY2tFdmVudCwgY2FsbGJhY2tzOiBvblRvb2xDYWxsU3RhcnQgfSk7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBub3coKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGV4ZWN1dGVUb29sKHtcbiAgICAgICAgICBleGVjdXRlOiB0b29sMi5leGVjdXRlLmJpbmQodG9vbDIpLFxuICAgICAgICAgIGlucHV0LFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICBtZXNzYWdlcyxcbiAgICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHRcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2Ygc3RyZWFtKSB7XG4gICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJwcmVsaW1pbmFyeVwiKSB7XG4gICAgICAgICAgICBvblByZWxpbWluYXJ5VG9vbFJlc3VsdCA9PSBudWxsID8gdm9pZCAwIDogb25QcmVsaW1pbmFyeVRvb2xSZXN1bHQoe1xuICAgICAgICAgICAgICAuLi50b29sQ2FsbCxcbiAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLXJlc3VsdFwiLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHBhcnQub3V0cHV0LFxuICAgICAgICAgICAgICBwcmVsaW1pbmFyeTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dCA9IHBhcnQub3V0cHV0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NczIgPSBub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgICAgYXdhaXQgbm90aWZ5KHtcbiAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgLi4uYmFzZUNhbGxiYWNrRXZlbnQsXG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgZHVyYXRpb25NczogZHVyYXRpb25NczJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNhbGxiYWNrczogb25Ub29sQ2FsbEZpbmlzaFxuICAgICAgICB9KTtcbiAgICAgICAgcmVjb3JkRXJyb3JPblNwYW4oc3BhbiwgZXJyb3IpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwidG9vbC1lcnJvclwiLFxuICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgZHluYW1pYzogdG9vbDIudHlwZSA9PT0gXCJkeW5hbWljXCIsXG4gICAgICAgICAgLi4udG9vbENhbGwucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhOiB0b29sQ2FsbC5wcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IG5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgYXdhaXQgbm90aWZ5KHtcbiAgICAgICAgZXZlbnQ6IHtcbiAgICAgICAgICAuLi5iYXNlQ2FsbGJhY2tFdmVudCxcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICBkdXJhdGlvbk1zXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGxiYWNrczogb25Ub29sQ2FsbEZpbmlzaFxuICAgICAgfSk7XG4gICAgICB0cnkge1xuICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgYXdhaXQgc2VsZWN0VGVsZW1ldHJ5QXR0cmlidXRlcyh7XG4gICAgICAgICAgICB0ZWxlbWV0cnksXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgIFwiYWkudG9vbENhbGwucmVzdWx0XCI6IHtcbiAgICAgICAgICAgICAgICBvdXRwdXQ6ICgpID0+IEpTT04uc3RyaW5naWZ5KG91dHB1dClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChpZ25vcmVkKSB7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgIHRvb2xOYW1lLFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgb3V0cHV0LFxuICAgICAgICBkeW5hbWljOiB0b29sMi50eXBlID09PSBcImR5bmFtaWNcIixcbiAgICAgICAgLi4udG9vbENhbGwucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhOiB0b29sQ2FsbC5wcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBzcmMvZ2VuZXJhdGUtdGV4dC9leHRyYWN0LXJlYXNvbmluZy1jb250ZW50LnRzXG5mdW5jdGlvbiBleHRyYWN0UmVhc29uaW5nQ29udGVudChjb250ZW50KSB7XG4gIGNvbnN0IHBhcnRzID0gY29udGVudC5maWx0ZXIoXG4gICAgKGNvbnRlbnQyKSA9PiBjb250ZW50Mi50eXBlID09PSBcInJlYXNvbmluZ1wiXG4gICk7XG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPT09IDAgPyB2b2lkIDAgOiBwYXJ0cy5tYXAoKGNvbnRlbnQyKSA9PiBjb250ZW50Mi50ZXh0KS5qb2luKFwiXFxuXCIpO1xufVxuXG4vLyBzcmMvZ2VuZXJhdGUtdGV4dC9leHRyYWN0LXRleHQtY29udGVudC50c1xuZnVuY3Rpb24gZXh0cmFjdFRleHRDb250ZW50KGNvbnRlbnQpIHtcbiAgY29uc3QgcGFydHMgPSBjb250ZW50LmZpbHRlcihcbiAgICAoY29udGVudDIpID0+IGNvbnRlbnQyLnR5cGUgPT09IFwidGV4dFwiXG4gICk7XG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIHJldHVybiBwYXJ0cy5tYXAoKGNvbnRlbnQyKSA9PiBjb250ZW50Mi50ZXh0KS5qb2luKFwiXCIpO1xufVxuXG4vLyBzcmMvZ2VuZXJhdGUtdGV4dC9nZW5lcmF0ZWQtZmlsZS50c1xuaW1wb3J0IHtcbiAgY29udmVydEJhc2U2NFRvVWludDhBcnJheSBhcyBjb252ZXJ0QmFzZTY0VG9VaW50OEFycmF5MyxcbiAgY29udmVydFVpbnQ4QXJyYXlUb0Jhc2U2NCBhcyBjb252ZXJ0VWludDhBcnJheVRvQmFzZTY0MlxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xudmFyIERlZmF1bHRHZW5lcmF0ZWRGaWxlID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgZGF0YSxcbiAgICBtZWRpYVR5cGVcbiAgfSkge1xuICAgIGNvbnN0IGlzVWludDhBcnJheSA9IGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5O1xuICAgIHRoaXMuYmFzZTY0RGF0YSA9IGlzVWludDhBcnJheSA/IHZvaWQgMCA6IGRhdGE7XG4gICAgdGhpcy51aW50OEFycmF5RGF0YSA9IGlzVWludDhBcnJheSA/IGRhdGEgOiB2b2lkIDA7XG4gICAgdGhpcy5tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gIH1cbiAgLy8gbGF6eSBjb252ZXJzaW9uIHdpdGggY2FjaGluZyB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjb252ZXJzaW9uIG92ZXJoZWFkOlxuICBnZXQgYmFzZTY0KCkge1xuICAgIGlmICh0aGlzLmJhc2U2NERhdGEgPT0gbnVsbCkge1xuICAgICAgdGhpcy5iYXNlNjREYXRhID0gY29udmVydFVpbnQ4QXJyYXlUb0Jhc2U2NDIodGhpcy51aW50OEFycmF5RGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2U2NERhdGE7XG4gIH1cbiAgLy8gbGF6eSBjb252ZXJzaW9uIHdpdGggY2FjaGluZyB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjb252ZXJzaW9uIG92ZXJoZWFkOlxuICBnZXQgdWludDhBcnJheSgpIHtcbiAgICBpZiAodGhpcy51aW50OEFycmF5RGF0YSA9PSBudWxsKSB7XG4gICAgICB0aGlzLnVpbnQ4QXJyYXlEYXRhID0gY29udmVydEJhc2U2NFRvVWludDhBcnJheTModGhpcy5iYXNlNjREYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudWludDhBcnJheURhdGE7XG4gIH1cbn07XG52YXIgRGVmYXVsdEdlbmVyYXRlZEZpbGVXaXRoVHlwZSA9IGNsYXNzIGV4dGVuZHMgRGVmYXVsdEdlbmVyYXRlZEZpbGUge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy50eXBlID0gXCJmaWxlXCI7XG4gIH1cbn07XG5cbi8vIHNyYy9nZW5lcmF0ZS10ZXh0L2lzLWFwcHJvdmFsLW5lZWRlZC50c1xuYXN5bmMgZnVuY3Rpb24gaXNBcHByb3ZhbE5lZWRlZCh7XG4gIHRvb2w6IHRvb2wyLFxuICB0b29sQ2FsbCxcbiAgbWVzc2FnZXMsXG4gIGV4cGVyaW1lbnRhbF9jb250ZXh0XG59KSB7XG4gIGlmICh0b29sMi5uZWVkc0FwcHJvdmFsID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiB0b29sMi5uZWVkc0FwcHJvdmFsID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiB0b29sMi5uZWVkc0FwcHJvdmFsO1xuICB9XG4gIHJldHVybiBhd2FpdCB0b29sMi5uZWVkc0FwcHJvdmFsKHRvb2xDYWxsLmlucHV0LCB7XG4gICAgdG9vbENhbGxJZDogdG9vbENhbGwudG9vbENhbGxJZCxcbiAgICBtZXNzYWdlcyxcbiAgICBleHBlcmltZW50YWxfY29udGV4dFxuICB9KTtcbn1cblxuLy8gc3JjL2dlbmVyYXRlLXRleHQvb3V0cHV0LnRzXG52YXIgb3V0cHV0X2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KG91dHB1dF9leHBvcnRzLCB7XG4gIGFycmF5OiAoKSA9PiBhcnJheSxcbiAgY2hvaWNlOiAoKSA9PiBjaG9pY2UsXG4gIGpzb246ICgpID0+IGpzb24sXG4gIG9iamVjdDogKCkgPT4gb2JqZWN0LFxuICB0ZXh0OiAoKSA9PiB0ZXh0XG59KTtcbmltcG9ydCB7XG4gIFR5cGVWYWxpZGF0aW9uRXJyb3IgYXMgVHlwZVZhbGlkYXRpb25FcnJvcjJcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7XG4gIGFzU2NoZW1hIGFzIGFzU2NoZW1hMixcbiAgcmVzb2x2ZSxcbiAgc2FmZVBhcnNlSlNPTiBhcyBzYWZlUGFyc2VKU09OMixcbiAgc2FmZVZhbGlkYXRlVHlwZXMgYXMgc2FmZVZhbGlkYXRlVHlwZXMyXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5cbi8vIHNyYy91dGlsL3BhcnNlLXBhcnRpYWwtanNvbi50c1xuaW1wb3J0IHsgc2FmZVBhcnNlSlNPTiB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5cbi8vIHNyYy91dGlsL2ZpeC1qc29uLnRzXG5mdW5jdGlvbiBmaXhKc29uKGlucHV0KSB7XG4gIGNvbnN0IHN0YWNrID0gW1wiUk9PVFwiXTtcbiAgbGV0IGxhc3RWYWxpZEluZGV4ID0gLTE7XG4gIGxldCBsaXRlcmFsU3RhcnQgPSBudWxsO1xuICBmdW5jdGlvbiBwcm9jZXNzVmFsdWVTdGFydChjaGFyLCBpLCBzd2FwU3RhdGUpIHtcbiAgICB7XG4gICAgICBzd2l0Y2ggKGNoYXIpIHtcbiAgICAgICAgY2FzZSAnXCInOiB7XG4gICAgICAgICAgbGFzdFZhbGlkSW5kZXggPSBpO1xuICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgIHN0YWNrLnB1c2goc3dhcFN0YXRlKTtcbiAgICAgICAgICBzdGFjay5wdXNoKFwiSU5TSURFX1NUUklOR1wiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiZlwiOlxuICAgICAgICBjYXNlIFwidFwiOlxuICAgICAgICBjYXNlIFwiblwiOiB7XG4gICAgICAgICAgbGFzdFZhbGlkSW5kZXggPSBpO1xuICAgICAgICAgIGxpdGVyYWxTdGFydCA9IGk7XG4gICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgc3RhY2sucHVzaChzd2FwU3RhdGUpO1xuICAgICAgICAgIHN0YWNrLnB1c2goXCJJTlNJREVfTElURVJBTFwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiLVwiOiB7XG4gICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgc3RhY2sucHVzaChzd2FwU3RhdGUpO1xuICAgICAgICAgIHN0YWNrLnB1c2goXCJJTlNJREVfTlVNQkVSXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCIwXCI6XG4gICAgICAgIGNhc2UgXCIxXCI6XG4gICAgICAgIGNhc2UgXCIyXCI6XG4gICAgICAgIGNhc2UgXCIzXCI6XG4gICAgICAgIGNhc2UgXCI0XCI6XG4gICAgICAgIGNhc2UgXCI1XCI6XG4gICAgICAgIGNhc2UgXCI2XCI6XG4gICAgICAgIGNhc2UgXCI3XCI6XG4gICAgICAgIGNhc2UgXCI4XCI6XG4gICAgICAgIGNhc2UgXCI5XCI6IHtcbiAgICAgICAgICBsYXN0VmFsaWRJbmRleCA9IGk7XG4gICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgc3RhY2sucHVzaChzd2FwU3RhdGUpO1xuICAgICAgICAgIHN0YWNrLnB1c2goXCJJTlNJREVfTlVNQkVSXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJ7XCI6IHtcbiAgICAgICAgICBsYXN0VmFsaWRJbmRleCA9IGk7XG4gICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgc3RhY2sucHVzaChzd2FwU3RhdGUpO1xuICAgICAgICAgIHN0YWNrLnB1c2goXCJJTlNJREVfT0JKRUNUX1NUQVJUXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJbXCI6IHtcbiAgICAgICAgICBsYXN0VmFsaWRJbmRleCA9IGk7XG4gICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgc3RhY2sucHVzaChzd2FwU3RhdGUpO1xuICAgICAgICAgIHN0YWNrLnB1c2goXCJJTlNJREVfQVJSQVlfU1RBUlRcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJvY2Vzc0FmdGVyT2JqZWN0VmFsdWUoY2hhciwgaSkge1xuICAgIHN3aXRjaCAoY2hhcikge1xuICAgICAgY2FzZSBcIixcIjoge1xuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgc3RhY2sucHVzaChcIklOU0lERV9PQkpFQ1RfQUZURVJfQ09NTUFcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcIn1cIjoge1xuICAgICAgICBsYXN0VmFsaWRJbmRleCA9IGk7XG4gICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJvY2Vzc0FmdGVyQXJyYXlWYWx1ZShjaGFyLCBpKSB7XG4gICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICBjYXNlIFwiLFwiOiB7XG4gICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICBzdGFjay5wdXNoKFwiSU5TSURFX0FSUkFZX0FGVEVSX0NPTU1BXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJdXCI6IHtcbiAgICAgICAgbGFzdFZhbGlkSW5kZXggPSBpO1xuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gaW5wdXRbaV07XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgc3dpdGNoIChjdXJyZW50U3RhdGUpIHtcbiAgICAgIGNhc2UgXCJST09UXCI6XG4gICAgICAgIHByb2Nlc3NWYWx1ZVN0YXJ0KGNoYXIsIGksIFwiRklOSVNIXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJJTlNJREVfT0JKRUNUX1NUQVJUXCI6IHtcbiAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgY2FzZSAnXCInOiB7XG4gICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goXCJJTlNJREVfT0JKRUNUX0tFWVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwifVwiOiB7XG4gICAgICAgICAgICBsYXN0VmFsaWRJbmRleCA9IGk7XG4gICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJJTlNJREVfT0JKRUNUX0FGVEVSX0NPTU1BXCI6IHtcbiAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgY2FzZSAnXCInOiB7XG4gICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goXCJJTlNJREVfT0JKRUNUX0tFWVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJJTlNJREVfT0JKRUNUX0tFWVwiOiB7XG4gICAgICAgIHN3aXRjaCAoY2hhcikge1xuICAgICAgICAgIGNhc2UgJ1wiJzoge1xuICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKFwiSU5TSURFX09CSkVDVF9BRlRFUl9LRVlcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiSU5TSURFX09CSkVDVF9BRlRFUl9LRVlcIjoge1xuICAgICAgICBzd2l0Y2ggKGNoYXIpIHtcbiAgICAgICAgICBjYXNlIFwiOlwiOiB7XG4gICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goXCJJTlNJREVfT0JKRUNUX0JFRk9SRV9WQUxVRVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJJTlNJREVfT0JKRUNUX0JFRk9SRV9WQUxVRVwiOiB7XG4gICAgICAgIHByb2Nlc3NWYWx1ZVN0YXJ0KGNoYXIsIGksIFwiSU5TSURFX09CSkVDVF9BRlRFUl9WQUxVRVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiSU5TSURFX09CSkVDVF9BRlRFUl9WQUxVRVwiOiB7XG4gICAgICAgIHByb2Nlc3NBZnRlck9iamVjdFZhbHVlKGNoYXIsIGkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJJTlNJREVfU1RSSU5HXCI6IHtcbiAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgY2FzZSAnXCInOiB7XG4gICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGxhc3RWYWxpZEluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiXFxcXFwiOiB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKFwiSU5TSURFX1NUUklOR19FU0NBUEVcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgbGFzdFZhbGlkSW5kZXggPSBpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJJTlNJREVfQVJSQVlfU1RBUlRcIjoge1xuICAgICAgICBzd2l0Y2ggKGNoYXIpIHtcbiAgICAgICAgICBjYXNlIFwiXVwiOiB7XG4gICAgICAgICAgICBsYXN0VmFsaWRJbmRleCA9IGk7XG4gICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBsYXN0VmFsaWRJbmRleCA9IGk7XG4gICAgICAgICAgICBwcm9jZXNzVmFsdWVTdGFydChjaGFyLCBpLCBcIklOU0lERV9BUlJBWV9BRlRFUl9WQUxVRVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJJTlNJREVfQVJSQVlfQUZURVJfVkFMVUVcIjoge1xuICAgICAgICBzd2l0Y2ggKGNoYXIpIHtcbiAgICAgICAgICBjYXNlIFwiLFwiOiB7XG4gICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goXCJJTlNJREVfQVJSQVlfQUZURVJfQ09NTUFcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIl1cIjoge1xuICAgICAgICAgICAgbGFzdFZhbGlkSW5kZXggPSBpO1xuICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgbGFzdFZhbGlkSW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcIklOU0lERV9BUlJBWV9BRlRFUl9DT01NQVwiOiB7XG4gICAgICAgIHByb2Nlc3NWYWx1ZVN0YXJ0KGNoYXIsIGksIFwiSU5TSURFX0FSUkFZX0FGVEVSX1ZBTFVFXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJJTlNJREVfU1RSSU5HX0VTQ0FQRVwiOiB7XG4gICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICBsYXN0VmFsaWRJbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcIklOU0lERV9OVU1CRVJcIjoge1xuICAgICAgICBzd2l0Y2ggKGNoYXIpIHtcbiAgICAgICAgICBjYXNlIFwiMFwiOlxuICAgICAgICAgIGNhc2UgXCIxXCI6XG4gICAgICAgICAgY2FzZSBcIjJcIjpcbiAgICAgICAgICBjYXNlIFwiM1wiOlxuICAgICAgICAgIGNhc2UgXCI0XCI6XG4gICAgICAgICAgY2FzZSBcIjVcIjpcbiAgICAgICAgICBjYXNlIFwiNlwiOlxuICAgICAgICAgIGNhc2UgXCI3XCI6XG4gICAgICAgICAgY2FzZSBcIjhcIjpcbiAgICAgICAgICBjYXNlIFwiOVwiOiB7XG4gICAgICAgICAgICBsYXN0VmFsaWRJbmRleCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgICBjYXNlIFwiRVwiOlxuICAgICAgICAgIGNhc2UgXCItXCI6XG4gICAgICAgICAgY2FzZSBcIi5cIjoge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCIsXCI6IHtcbiAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSBcIklOU0lERV9BUlJBWV9BRlRFUl9WQUxVRVwiKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3NBZnRlckFycmF5VmFsdWUoY2hhciwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09IFwiSU5TSURFX09CSkVDVF9BRlRFUl9WQUxVRVwiKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3NBZnRlck9iamVjdFZhbHVlKGNoYXIsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJ9XCI6IHtcbiAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSBcIklOU0lERV9PQkpFQ1RfQUZURVJfVkFMVUVcIikge1xuICAgICAgICAgICAgICBwcm9jZXNzQWZ0ZXJPYmplY3RWYWx1ZShjaGFyLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiXVwiOiB7XG4gICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gXCJJTlNJREVfQVJSQVlfQUZURVJfVkFMVUVcIikge1xuICAgICAgICAgICAgICBwcm9jZXNzQWZ0ZXJBcnJheVZhbHVlKGNoYXIsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcIklOU0lERV9MSVRFUkFMXCI6IHtcbiAgICAgICAgY29uc3QgcGFydGlhbExpdGVyYWwgPSBpbnB1dC5zdWJzdHJpbmcobGl0ZXJhbFN0YXJ0LCBpICsgMSk7XG4gICAgICAgIGlmICghXCJmYWxzZVwiLnN0YXJ0c1dpdGgocGFydGlhbExpdGVyYWwpICYmICFcInRydWVcIi5zdGFydHNXaXRoKHBhcnRpYWxMaXRlcmFsKSAmJiAhXCJudWxsXCIuc3RhcnRzV2l0aChwYXJ0aWFsTGl0ZXJhbCkpIHtcbiAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09IFwiSU5TSURFX09CSkVDVF9BRlRFUl9WQUxVRVwiKSB7XG4gICAgICAgICAgICBwcm9jZXNzQWZ0ZXJPYmplY3RWYWx1ZShjaGFyLCBpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSBcIklOU0lERV9BUlJBWV9BRlRFUl9WQUxVRVwiKSB7XG4gICAgICAgICAgICBwcm9jZXNzQWZ0ZXJBcnJheVZhbHVlKGNoYXIsIGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0VmFsaWRJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxldCByZXN1bHQgPSBpbnB1dC5zbGljZSgwLCBsYXN0VmFsaWRJbmRleCArIDEpO1xuICBmb3IgKGxldCBpID0gc3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBzdGF0ZSA9IHN0YWNrW2ldO1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgXCJJTlNJREVfU1RSSU5HXCI6IHtcbiAgICAgICAgcmVzdWx0ICs9ICdcIic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcIklOU0lERV9PQkpFQ1RfS0VZXCI6XG4gICAgICBjYXNlIFwiSU5TSURFX09CSkVDVF9BRlRFUl9LRVlcIjpcbiAgICAgIGNhc2UgXCJJTlNJREVfT0JKRUNUX0FGVEVSX0NPTU1BXCI6XG4gICAgICBjYXNlIFwiSU5TSURFX09CSkVDVF9TVEFSVFwiOlxuICAgICAgY2FzZSBcIklOU0lERV9PQkpFQ1RfQkVGT1JFX1ZBTFVFXCI6XG4gICAgICBjYXNlIFwiSU5TSURFX09CSkVDVF9BRlRFUl9WQUxVRVwiOiB7XG4gICAgICAgIHJlc3VsdCArPSBcIn1cIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiSU5TSURFX0FSUkFZX1NUQVJUXCI6XG4gICAgICBjYXNlIFwiSU5TSURFX0FSUkFZX0FGVEVSX0NPTU1BXCI6XG4gICAgICBjYXNlIFwiSU5TSURFX0FSUkFZX0FGVEVSX1ZBTFVFXCI6IHtcbiAgICAgICAgcmVzdWx0ICs9IFwiXVwiO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJJTlNJREVfTElURVJBTFwiOiB7XG4gICAgICAgIGNvbnN0IHBhcnRpYWxMaXRlcmFsID0gaW5wdXQuc3Vic3RyaW5nKGxpdGVyYWxTdGFydCwgaW5wdXQubGVuZ3RoKTtcbiAgICAgICAgaWYgKFwidHJ1ZVwiLnN0YXJ0c1dpdGgocGFydGlhbExpdGVyYWwpKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IFwidHJ1ZVwiLnNsaWNlKHBhcnRpYWxMaXRlcmFsLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXCJmYWxzZVwiLnN0YXJ0c1dpdGgocGFydGlhbExpdGVyYWwpKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IFwiZmFsc2VcIi5zbGljZShwYXJ0aWFsTGl0ZXJhbC5sZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYgKFwibnVsbFwiLnN0YXJ0c1dpdGgocGFydGlhbExpdGVyYWwpKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IFwibnVsbFwiLnNsaWNlKHBhcnRpYWxMaXRlcmFsLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gc3JjL3V0aWwvcGFyc2UtcGFydGlhbC1qc29uLnRzXG5hc3luYyBmdW5jdGlvbiBwYXJzZVBhcnRpYWxKc29uKGpzb25UZXh0KSB7XG4gIGlmIChqc29uVGV4dCA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHZvaWQgMCwgc3RhdGU6IFwidW5kZWZpbmVkLWlucHV0XCIgfTtcbiAgfVxuICBsZXQgcmVzdWx0ID0gYXdhaXQgc2FmZVBhcnNlSlNPTih7IHRleHQ6IGpzb25UZXh0IH0pO1xuICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0LnZhbHVlLCBzdGF0ZTogXCJzdWNjZXNzZnVsLXBhcnNlXCIgfTtcbiAgfVxuICByZXN1bHQgPSBhd2FpdCBzYWZlUGFyc2VKU09OKHsgdGV4dDogZml4SnNvbihqc29uVGV4dCkgfSk7XG4gIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgIHJldHVybiB7IHZhbHVlOiByZXN1bHQudmFsdWUsIHN0YXRlOiBcInJlcGFpcmVkLXBhcnNlXCIgfTtcbiAgfVxuICByZXR1cm4geyB2YWx1ZTogdm9pZCAwLCBzdGF0ZTogXCJmYWlsZWQtcGFyc2VcIiB9O1xufVxuXG4vLyBzcmMvZ2VuZXJhdGUtdGV4dC9vdXRwdXQudHNcbnZhciB0ZXh0ID0gKCkgPT4gKHtcbiAgbmFtZTogXCJ0ZXh0XCIsXG4gIHJlc3BvbnNlRm9ybWF0OiBQcm9taXNlLnJlc29sdmUoeyB0eXBlOiBcInRleHRcIiB9KSxcbiAgYXN5bmMgcGFyc2VDb21wbGV0ZU91dHB1dCh7IHRleHQ6IHRleHQyIH0pIHtcbiAgICByZXR1cm4gdGV4dDI7XG4gIH0sXG4gIGFzeW5jIHBhcnNlUGFydGlhbE91dHB1dCh7IHRleHQ6IHRleHQyIH0pIHtcbiAgICByZXR1cm4geyBwYXJ0aWFsOiB0ZXh0MiB9O1xuICB9LFxuICBjcmVhdGVFbGVtZW50U3RyZWFtVHJhbnNmb3JtKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbn0pO1xudmFyIG9iamVjdCA9ICh7XG4gIHNjaGVtYTogaW5wdXRTY2hlbWEsXG4gIG5hbWU6IG5hbWUyMSxcbiAgZGVzY3JpcHRpb25cbn0pID0+IHtcbiAgY29uc3Qgc2NoZW1hID0gYXNTY2hlbWEyKGlucHV0U2NoZW1hKTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcIm9iamVjdFwiLFxuICAgIHJlc3BvbnNlRm9ybWF0OiByZXNvbHZlKHNjaGVtYS5qc29uU2NoZW1hKS50aGVuKChqc29uU2NoZW1hMikgPT4gKHtcbiAgICAgIHR5cGU6IFwianNvblwiLFxuICAgICAgc2NoZW1hOiBqc29uU2NoZW1hMixcbiAgICAgIC4uLm5hbWUyMSAhPSBudWxsICYmIHsgbmFtZTogbmFtZTIxIH0sXG4gICAgICAuLi5kZXNjcmlwdGlvbiAhPSBudWxsICYmIHsgZGVzY3JpcHRpb24gfVxuICAgIH0pKSxcbiAgICBhc3luYyBwYXJzZUNvbXBsZXRlT3V0cHV0KHsgdGV4dDogdGV4dDIgfSwgY29udGV4dDIpIHtcbiAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gYXdhaXQgc2FmZVBhcnNlSlNPTjIoeyB0ZXh0OiB0ZXh0MiB9KTtcbiAgICAgIGlmICghcGFyc2VSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgTm9PYmplY3RHZW5lcmF0ZWRFcnJvcih7XG4gICAgICAgICAgbWVzc2FnZTogXCJObyBvYmplY3QgZ2VuZXJhdGVkOiBjb3VsZCBub3QgcGFyc2UgdGhlIHJlc3BvbnNlLlwiLFxuICAgICAgICAgIGNhdXNlOiBwYXJzZVJlc3VsdC5lcnJvcixcbiAgICAgICAgICB0ZXh0OiB0ZXh0MixcbiAgICAgICAgICByZXNwb25zZTogY29udGV4dDIucmVzcG9uc2UsXG4gICAgICAgICAgdXNhZ2U6IGNvbnRleHQyLnVzYWdlLFxuICAgICAgICAgIGZpbmlzaFJlYXNvbjogY29udGV4dDIuZmluaXNoUmVhc29uXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHNhZmVWYWxpZGF0ZVR5cGVzMih7XG4gICAgICAgIHZhbHVlOiBwYXJzZVJlc3VsdC52YWx1ZSxcbiAgICAgICAgc2NoZW1hXG4gICAgICB9KTtcbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBOb09iamVjdEdlbmVyYXRlZEVycm9yKHtcbiAgICAgICAgICBtZXNzYWdlOiBcIk5vIG9iamVjdCBnZW5lcmF0ZWQ6IHJlc3BvbnNlIGRpZCBub3QgbWF0Y2ggc2NoZW1hLlwiLFxuICAgICAgICAgIGNhdXNlOiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yLFxuICAgICAgICAgIHRleHQ6IHRleHQyLFxuICAgICAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5yZXNwb25zZSxcbiAgICAgICAgICB1c2FnZTogY29udGV4dDIudXNhZ2UsXG4gICAgICAgICAgZmluaXNoUmVhc29uOiBjb250ZXh0Mi5maW5pc2hSZWFzb25cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC52YWx1ZTtcbiAgICB9LFxuICAgIGFzeW5jIHBhcnNlUGFydGlhbE91dHB1dCh7IHRleHQ6IHRleHQyIH0pIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhcnNlUGFydGlhbEpzb24odGV4dDIpO1xuICAgICAgc3dpdGNoIChyZXN1bHQuc3RhdGUpIHtcbiAgICAgICAgY2FzZSBcImZhaWxlZC1wYXJzZVwiOlxuICAgICAgICBjYXNlIFwidW5kZWZpbmVkLWlucHV0XCI6IHtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZXBhaXJlZC1wYXJzZVwiOlxuICAgICAgICBjYXNlIFwic3VjY2Vzc2Z1bC1wYXJzZVwiOiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8vIE5vdGU6IGN1cnJlbnRseSBubyB2YWxpZGF0aW9uIG9mIHBhcnRpYWwgcmVzdWx0czpcbiAgICAgICAgICAgIHBhcnRpYWw6IHJlc3VsdC52YWx1ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZUVsZW1lbnRTdHJlYW1UcmFuc2Zvcm0oKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgfTtcbn07XG52YXIgYXJyYXkgPSAoe1xuICBlbGVtZW50OiBpbnB1dEVsZW1lbnRTY2hlbWEsXG4gIG5hbWU6IG5hbWUyMSxcbiAgZGVzY3JpcHRpb25cbn0pID0+IHtcbiAgY29uc3QgZWxlbWVudFNjaGVtYSA9IGFzU2NoZW1hMihpbnB1dEVsZW1lbnRTY2hlbWEpO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IFwiYXJyYXlcIixcbiAgICAvLyBKU09OIHNjaGVtYSB0aGF0IGRlc2NyaWJlcyBhbiBhcnJheSBvZiBlbGVtZW50czpcbiAgICByZXNwb25zZUZvcm1hdDogcmVzb2x2ZShlbGVtZW50U2NoZW1hLmpzb25TY2hlbWEpLnRoZW4oKGpzb25TY2hlbWEyKSA9PiB7XG4gICAgICBjb25zdCB7ICRzY2hlbWEsIC4uLml0ZW1TY2hlbWEgfSA9IGpzb25TY2hlbWEyO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJqc29uXCIsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgICRzY2hlbWE6IFwiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjXCIsXG4gICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlbGVtZW50czogeyB0eXBlOiBcImFycmF5XCIsIGl0ZW1zOiBpdGVtU2NoZW1hIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJlbGVtZW50c1wiXSxcbiAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgLi4ubmFtZTIxICE9IG51bGwgJiYgeyBuYW1lOiBuYW1lMjEgfSxcbiAgICAgICAgLi4uZGVzY3JpcHRpb24gIT0gbnVsbCAmJiB7IGRlc2NyaXB0aW9uIH1cbiAgICAgIH07XG4gICAgfSksXG4gICAgYXN5bmMgcGFyc2VDb21wbGV0ZU91dHB1dCh7IHRleHQ6IHRleHQyIH0sIGNvbnRleHQyKSB7XG4gICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IGF3YWl0IHNhZmVQYXJzZUpTT04yKHsgdGV4dDogdGV4dDIgfSk7XG4gICAgICBpZiAoIXBhcnNlUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vT2JqZWN0R2VuZXJhdGVkRXJyb3Ioe1xuICAgICAgICAgIG1lc3NhZ2U6IFwiTm8gb2JqZWN0IGdlbmVyYXRlZDogY291bGQgbm90IHBhcnNlIHRoZSByZXNwb25zZS5cIixcbiAgICAgICAgICBjYXVzZTogcGFyc2VSZXN1bHQuZXJyb3IsXG4gICAgICAgICAgdGV4dDogdGV4dDIsXG4gICAgICAgICAgcmVzcG9uc2U6IGNvbnRleHQyLnJlc3BvbnNlLFxuICAgICAgICAgIHVzYWdlOiBjb250ZXh0Mi51c2FnZSxcbiAgICAgICAgICBmaW5pc2hSZWFzb246IGNvbnRleHQyLmZpbmlzaFJlYXNvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG91dGVyVmFsdWUgPSBwYXJzZVJlc3VsdC52YWx1ZTtcbiAgICAgIGlmIChvdXRlclZhbHVlID09IG51bGwgfHwgdHlwZW9mIG91dGVyVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgIShcImVsZW1lbnRzXCIgaW4gb3V0ZXJWYWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkob3V0ZXJWYWx1ZS5lbGVtZW50cykpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vT2JqZWN0R2VuZXJhdGVkRXJyb3Ioe1xuICAgICAgICAgIG1lc3NhZ2U6IFwiTm8gb2JqZWN0IGdlbmVyYXRlZDogcmVzcG9uc2UgZGlkIG5vdCBtYXRjaCBzY2hlbWEuXCIsXG4gICAgICAgICAgY2F1c2U6IG5ldyBUeXBlVmFsaWRhdGlvbkVycm9yMih7XG4gICAgICAgICAgICB2YWx1ZTogb3V0ZXJWYWx1ZSxcbiAgICAgICAgICAgIGNhdXNlOiBcInJlc3BvbnNlIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggYW4gZWxlbWVudHMgYXJyYXlcIlxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRleHQ6IHRleHQyLFxuICAgICAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5yZXNwb25zZSxcbiAgICAgICAgICB1c2FnZTogY29udGV4dDIudXNhZ2UsXG4gICAgICAgICAgZmluaXNoUmVhc29uOiBjb250ZXh0Mi5maW5pc2hSZWFzb25cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygb3V0ZXJWYWx1ZS5lbGVtZW50cykge1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgc2FmZVZhbGlkYXRlVHlwZXMyKHtcbiAgICAgICAgICB2YWx1ZTogZWxlbWVudCxcbiAgICAgICAgICBzY2hlbWE6IGVsZW1lbnRTY2hlbWFcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vT2JqZWN0R2VuZXJhdGVkRXJyb3Ioe1xuICAgICAgICAgICAgbWVzc2FnZTogXCJObyBvYmplY3QgZ2VuZXJhdGVkOiByZXNwb25zZSBkaWQgbm90IG1hdGNoIHNjaGVtYS5cIixcbiAgICAgICAgICAgIGNhdXNlOiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yLFxuICAgICAgICAgICAgdGV4dDogdGV4dDIsXG4gICAgICAgICAgICByZXNwb25zZTogY29udGV4dDIucmVzcG9uc2UsXG4gICAgICAgICAgICB1c2FnZTogY29udGV4dDIudXNhZ2UsXG4gICAgICAgICAgICBmaW5pc2hSZWFzb246IGNvbnRleHQyLmZpbmlzaFJlYXNvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0ZXJWYWx1ZS5lbGVtZW50cztcbiAgICB9LFxuICAgIGFzeW5jIHBhcnNlUGFydGlhbE91dHB1dCh7IHRleHQ6IHRleHQyIH0pIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhcnNlUGFydGlhbEpzb24odGV4dDIpO1xuICAgICAgc3dpdGNoIChyZXN1bHQuc3RhdGUpIHtcbiAgICAgICAgY2FzZSBcImZhaWxlZC1wYXJzZVwiOlxuICAgICAgICBjYXNlIFwidW5kZWZpbmVkLWlucHV0XCI6IHtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZXBhaXJlZC1wYXJzZVwiOlxuICAgICAgICBjYXNlIFwic3VjY2Vzc2Z1bC1wYXJzZVwiOiB7XG4gICAgICAgICAgY29uc3Qgb3V0ZXJWYWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICBpZiAob3V0ZXJWYWx1ZSA9PSBudWxsIHx8IHR5cGVvZiBvdXRlclZhbHVlICE9PSBcIm9iamVjdFwiIHx8ICEoXCJlbGVtZW50c1wiIGluIG91dGVyVmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KG91dGVyVmFsdWUuZWxlbWVudHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByYXdFbGVtZW50cyA9IHJlc3VsdC5zdGF0ZSA9PT0gXCJyZXBhaXJlZC1wYXJzZVwiICYmIG91dGVyVmFsdWUuZWxlbWVudHMubGVuZ3RoID4gMCA/IG91dGVyVmFsdWUuZWxlbWVudHMuc2xpY2UoMCwgLTEpIDogb3V0ZXJWYWx1ZS5lbGVtZW50cztcbiAgICAgICAgICBjb25zdCBwYXJzZWRFbGVtZW50cyA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgcmF3RWxlbWVudCBvZiByYXdFbGVtZW50cykge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHNhZmVWYWxpZGF0ZVR5cGVzMih7XG4gICAgICAgICAgICAgIHZhbHVlOiByYXdFbGVtZW50LFxuICAgICAgICAgICAgICBzY2hlbWE6IGVsZW1lbnRTY2hlbWFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICBwYXJzZWRFbGVtZW50cy5wdXNoKHZhbGlkYXRpb25SZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4geyBwYXJ0aWFsOiBwYXJzZWRFbGVtZW50cyB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBjcmVhdGVFbGVtZW50U3RyZWFtVHJhbnNmb3JtKCkge1xuICAgICAgbGV0IHB1Ymxpc2hlZEVsZW1lbnRzID0gMDtcbiAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgdHJhbnNmb3JtKHsgcGFydGlhbE91dHB1dCB9LCBjb250cm9sbGVyKSB7XG4gICAgICAgICAgaWYgKHBhcnRpYWxPdXRwdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICg7IHB1Ymxpc2hlZEVsZW1lbnRzIDwgcGFydGlhbE91dHB1dC5sZW5ndGg7IHB1Ymxpc2hlZEVsZW1lbnRzKyspIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHBhcnRpYWxPdXRwdXRbcHVibGlzaGVkRWxlbWVudHNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn07XG52YXIgY2hvaWNlID0gKHtcbiAgb3B0aW9uczogY2hvaWNlT3B0aW9ucyxcbiAgbmFtZTogbmFtZTIxLFxuICBkZXNjcmlwdGlvblxufSkgPT4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IFwiY2hvaWNlXCIsXG4gICAgLy8gSlNPTiBzY2hlbWEgdGhhdCBkZXNjcmliZXMgYW4gZW51bWVyYXRpb246XG4gICAgcmVzcG9uc2VGb3JtYXQ6IFByb21pc2UucmVzb2x2ZSh7XG4gICAgICB0eXBlOiBcImpzb25cIixcbiAgICAgIHNjaGVtYToge1xuICAgICAgICAkc2NoZW1hOiBcImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hI1wiLFxuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgcmVzdWx0OiB7IHR5cGU6IFwic3RyaW5nXCIsIGVudW06IGNob2ljZU9wdGlvbnMgfVxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogW1wicmVzdWx0XCJdLFxuICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgICAgIH0sXG4gICAgICAuLi5uYW1lMjEgIT0gbnVsbCAmJiB7IG5hbWU6IG5hbWUyMSB9LFxuICAgICAgLi4uZGVzY3JpcHRpb24gIT0gbnVsbCAmJiB7IGRlc2NyaXB0aW9uIH1cbiAgICB9KSxcbiAgICBhc3luYyBwYXJzZUNvbXBsZXRlT3V0cHV0KHsgdGV4dDogdGV4dDIgfSwgY29udGV4dDIpIHtcbiAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gYXdhaXQgc2FmZVBhcnNlSlNPTjIoeyB0ZXh0OiB0ZXh0MiB9KTtcbiAgICAgIGlmICghcGFyc2VSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgTm9PYmplY3RHZW5lcmF0ZWRFcnJvcih7XG4gICAgICAgICAgbWVzc2FnZTogXCJObyBvYmplY3QgZ2VuZXJhdGVkOiBjb3VsZCBub3QgcGFyc2UgdGhlIHJlc3BvbnNlLlwiLFxuICAgICAgICAgIGNhdXNlOiBwYXJzZVJlc3VsdC5lcnJvcixcbiAgICAgICAgICB0ZXh0OiB0ZXh0MixcbiAgICAgICAgICByZXNwb25zZTogY29udGV4dDIucmVzcG9uc2UsXG4gICAgICAgICAgdXNhZ2U6IGNvbnRleHQyLnVzYWdlLFxuICAgICAgICAgIGZpbmlzaFJlYXNvbjogY29udGV4dDIuZmluaXNoUmVhc29uXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3V0ZXJWYWx1ZSA9IHBhcnNlUmVzdWx0LnZhbHVlO1xuICAgICAgaWYgKG91dGVyVmFsdWUgPT0gbnVsbCB8fCB0eXBlb2Ygb3V0ZXJWYWx1ZSAhPT0gXCJvYmplY3RcIiB8fCAhKFwicmVzdWx0XCIgaW4gb3V0ZXJWYWx1ZSkgfHwgdHlwZW9mIG91dGVyVmFsdWUucmVzdWx0ICE9PSBcInN0cmluZ1wiIHx8ICFjaG9pY2VPcHRpb25zLmluY2x1ZGVzKG91dGVyVmFsdWUucmVzdWx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgTm9PYmplY3RHZW5lcmF0ZWRFcnJvcih7XG4gICAgICAgICAgbWVzc2FnZTogXCJObyBvYmplY3QgZ2VuZXJhdGVkOiByZXNwb25zZSBkaWQgbm90IG1hdGNoIHNjaGVtYS5cIixcbiAgICAgICAgICBjYXVzZTogbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IyKHtcbiAgICAgICAgICAgIHZhbHVlOiBvdXRlclZhbHVlLFxuICAgICAgICAgICAgY2F1c2U6IFwicmVzcG9uc2UgbXVzdCBiZSBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIGNob2ljZSB2YWx1ZS5cIlxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRleHQ6IHRleHQyLFxuICAgICAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5yZXNwb25zZSxcbiAgICAgICAgICB1c2FnZTogY29udGV4dDIudXNhZ2UsXG4gICAgICAgICAgZmluaXNoUmVhc29uOiBjb250ZXh0Mi5maW5pc2hSZWFzb25cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0ZXJWYWx1ZS5yZXN1bHQ7XG4gICAgfSxcbiAgICBhc3luYyBwYXJzZVBhcnRpYWxPdXRwdXQoeyB0ZXh0OiB0ZXh0MiB9KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJzZVBhcnRpYWxKc29uKHRleHQyKTtcbiAgICAgIHN3aXRjaCAocmVzdWx0LnN0YXRlKSB7XG4gICAgICAgIGNhc2UgXCJmYWlsZWQtcGFyc2VcIjpcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZC1pbnB1dFwiOiB7XG4gICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVwYWlyZWQtcGFyc2VcIjpcbiAgICAgICAgY2FzZSBcInN1Y2Nlc3NmdWwtcGFyc2VcIjoge1xuICAgICAgICAgIGNvbnN0IG91dGVyVmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgaWYgKG91dGVyVmFsdWUgPT0gbnVsbCB8fCB0eXBlb2Ygb3V0ZXJWYWx1ZSAhPT0gXCJvYmplY3RcIiB8fCAhKFwicmVzdWx0XCIgaW4gb3V0ZXJWYWx1ZSkgfHwgdHlwZW9mIG91dGVyVmFsdWUucmVzdWx0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBwb3RlbnRpYWxNYXRjaGVzID0gY2hvaWNlT3B0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgICAoY2hvaWNlT3B0aW9uKSA9PiBjaG9pY2VPcHRpb24uc3RhcnRzV2l0aChvdXRlclZhbHVlLnJlc3VsdClcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUgPT09IFwic3VjY2Vzc2Z1bC1wYXJzZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gcG90ZW50aWFsTWF0Y2hlcy5pbmNsdWRlcyhvdXRlclZhbHVlLnJlc3VsdCkgPyB7IHBhcnRpYWw6IG91dGVyVmFsdWUucmVzdWx0IH0gOiB2b2lkIDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwb3RlbnRpYWxNYXRjaGVzLmxlbmd0aCA9PT0gMSA/IHsgcGFydGlhbDogcG90ZW50aWFsTWF0Y2hlc1swXSB9IDogdm9pZCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgY3JlYXRlRWxlbWVudFN0cmVhbVRyYW5zZm9ybSgpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICB9O1xufTtcbnZhciBqc29uID0gKHtcbiAgbmFtZTogbmFtZTIxLFxuICBkZXNjcmlwdGlvblxufSA9IHt9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJqc29uXCIsXG4gICAgcmVzcG9uc2VGb3JtYXQ6IFByb21pc2UucmVzb2x2ZSh7XG4gICAgICB0eXBlOiBcImpzb25cIixcbiAgICAgIC4uLm5hbWUyMSAhPSBudWxsICYmIHsgbmFtZTogbmFtZTIxIH0sXG4gICAgICAuLi5kZXNjcmlwdGlvbiAhPSBudWxsICYmIHsgZGVzY3JpcHRpb24gfVxuICAgIH0pLFxuICAgIGFzeW5jIHBhcnNlQ29tcGxldGVPdXRwdXQoeyB0ZXh0OiB0ZXh0MiB9LCBjb250ZXh0Mikge1xuICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSBhd2FpdCBzYWZlUGFyc2VKU09OMih7IHRleHQ6IHRleHQyIH0pO1xuICAgICAgaWYgKCFwYXJzZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBOb09iamVjdEdlbmVyYXRlZEVycm9yKHtcbiAgICAgICAgICBtZXNzYWdlOiBcIk5vIG9iamVjdCBnZW5lcmF0ZWQ6IGNvdWxkIG5vdCBwYXJzZSB0aGUgcmVzcG9uc2UuXCIsXG4gICAgICAgICAgY2F1c2U6IHBhcnNlUmVzdWx0LmVycm9yLFxuICAgICAgICAgIHRleHQ6IHRleHQyLFxuICAgICAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5yZXNwb25zZSxcbiAgICAgICAgICB1c2FnZTogY29udGV4dDIudXNhZ2UsXG4gICAgICAgICAgZmluaXNoUmVhc29uOiBjb250ZXh0Mi5maW5pc2hSZWFzb25cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyc2VSZXN1bHQudmFsdWU7XG4gICAgfSxcbiAgICBhc3luYyBwYXJzZVBhcnRpYWxPdXRwdXQoeyB0ZXh0OiB0ZXh0MiB9KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJzZVBhcnRpYWxKc29uKHRleHQyKTtcbiAgICAgIHN3aXRjaCAocmVzdWx0LnN0YXRlKSB7XG4gICAgICAgIGNhc2UgXCJmYWlsZWQtcGFyc2VcIjpcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZC1pbnB1dFwiOiB7XG4gICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVwYWlyZWQtcGFyc2VcIjpcbiAgICAgICAgY2FzZSBcInN1Y2Nlc3NmdWwtcGFyc2VcIjoge1xuICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHsgcGFydGlhbDogcmVzdWx0LnZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZUVsZW1lbnRTdHJlYW1UcmFuc2Zvcm0oKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgfTtcbn07XG5cbi8vIHNyYy9nZW5lcmF0ZS10ZXh0L3BhcnNlLXRvb2wtY2FsbC50c1xuaW1wb3J0IHtcbiAgYXNTY2hlbWEgYXMgYXNTY2hlbWEzLFxuICBzYWZlUGFyc2VKU09OIGFzIHNhZmVQYXJzZUpTT04zLFxuICBzYWZlVmFsaWRhdGVUeXBlcyBhcyBzYWZlVmFsaWRhdGVUeXBlczNcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmFzeW5jIGZ1bmN0aW9uIHBhcnNlVG9vbENhbGwoe1xuICB0b29sQ2FsbCxcbiAgdG9vbHMsXG4gIHJlcGFpclRvb2xDYWxsLFxuICBzeXN0ZW0sXG4gIG1lc3NhZ2VzXG59KSB7XG4gIHZhciBfYTIxO1xuICB0cnkge1xuICAgIGlmICh0b29scyA9PSBudWxsKSB7XG4gICAgICBpZiAodG9vbENhbGwucHJvdmlkZXJFeGVjdXRlZCAmJiB0b29sQ2FsbC5keW5hbWljKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBwYXJzZVByb3ZpZGVyRXhlY3V0ZWREeW5hbWljVG9vbENhbGwodG9vbENhbGwpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IE5vU3VjaFRvb2xFcnJvcih7IHRvb2xOYW1lOiB0b29sQ2FsbC50b29sTmFtZSB9KTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBkb1BhcnNlVG9vbENhbGwoeyB0b29sQ2FsbCwgdG9vbHMgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChyZXBhaXJUb29sQ2FsbCA9PSBudWxsIHx8ICEoTm9TdWNoVG9vbEVycm9yLmlzSW5zdGFuY2UoZXJyb3IpIHx8IEludmFsaWRUb29sSW5wdXRFcnJvci5pc0luc3RhbmNlKGVycm9yKSkpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBsZXQgcmVwYWlyZWRUb29sQ2FsbCA9IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICByZXBhaXJlZFRvb2xDYWxsID0gYXdhaXQgcmVwYWlyVG9vbENhbGwoe1xuICAgICAgICAgIHRvb2xDYWxsLFxuICAgICAgICAgIHRvb2xzLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiBhc3luYyAoeyB0b29sTmFtZSB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGlucHV0U2NoZW1hIH0gPSB0b29sc1t0b29sTmFtZV07XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXNTY2hlbWEzKGlucHV0U2NoZW1hKS5qc29uU2NoZW1hO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc3lzdGVtLFxuICAgICAgICAgIG1lc3NhZ2VzLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAocmVwYWlyRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xDYWxsUmVwYWlyRXJyb3Ioe1xuICAgICAgICAgIGNhdXNlOiByZXBhaXJFcnJvcixcbiAgICAgICAgICBvcmlnaW5hbEVycm9yOiBlcnJvclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXBhaXJlZFRvb2xDYWxsID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXdhaXQgZG9QYXJzZVRvb2xDYWxsKHsgdG9vbENhbGw6IHJlcGFpcmVkVG9vbENhbGwsIHRvb2xzIH0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBwYXJzZWRJbnB1dCA9IGF3YWl0IHNhZmVQYXJzZUpTT04zKHsgdGV4dDogdG9vbENhbGwuaW5wdXQgfSk7XG4gICAgY29uc3QgaW5wdXQgPSBwYXJzZWRJbnB1dC5zdWNjZXNzID8gcGFyc2VkSW5wdXQudmFsdWUgOiB0b29sQ2FsbC5pbnB1dDtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgIHRvb2xDYWxsSWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWQsXG4gICAgICB0b29sTmFtZTogdG9vbENhbGwudG9vbE5hbWUsXG4gICAgICBpbnB1dCxcbiAgICAgIGR5bmFtaWM6IHRydWUsXG4gICAgICBpbnZhbGlkOiB0cnVlLFxuICAgICAgZXJyb3IsXG4gICAgICB0aXRsZTogKF9hMjEgPSB0b29scyA9PSBudWxsID8gdm9pZCAwIDogdG9vbHNbdG9vbENhbGwudG9vbE5hbWVdKSA9PSBudWxsID8gdm9pZCAwIDogX2EyMS50aXRsZSxcbiAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRvb2xDYWxsLnByb3ZpZGVyRXhlY3V0ZWQsXG4gICAgICBwcm92aWRlck1ldGFkYXRhOiB0b29sQ2FsbC5wcm92aWRlck1ldGFkYXRhXG4gICAgfTtcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gcGFyc2VQcm92aWRlckV4ZWN1dGVkRHluYW1pY1Rvb2xDYWxsKHRvb2xDYWxsKSB7XG4gIGNvbnN0IHBhcnNlUmVzdWx0ID0gdG9vbENhbGwuaW5wdXQudHJpbSgpID09PSBcIlwiID8geyBzdWNjZXNzOiB0cnVlLCB2YWx1ZToge30gfSA6IGF3YWl0IHNhZmVQYXJzZUpTT04zKHsgdGV4dDogdG9vbENhbGwuaW5wdXQgfSk7XG4gIGlmIChwYXJzZVJlc3VsdC5zdWNjZXNzID09PSBmYWxzZSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkVG9vbElucHV0RXJyb3Ioe1xuICAgICAgdG9vbE5hbWU6IHRvb2xDYWxsLnRvb2xOYW1lLFxuICAgICAgdG9vbElucHV0OiB0b29sQ2FsbC5pbnB1dCxcbiAgICAgIGNhdXNlOiBwYXJzZVJlc3VsdC5lcnJvclxuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICB0b29sQ2FsbElkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgIHRvb2xOYW1lOiB0b29sQ2FsbC50b29sTmFtZSxcbiAgICBpbnB1dDogcGFyc2VSZXN1bHQudmFsdWUsXG4gICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZSxcbiAgICBkeW5hbWljOiB0cnVlLFxuICAgIHByb3ZpZGVyTWV0YWRhdGE6IHRvb2xDYWxsLnByb3ZpZGVyTWV0YWRhdGFcbiAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGRvUGFyc2VUb29sQ2FsbCh7XG4gIHRvb2xDYWxsLFxuICB0b29sc1xufSkge1xuICBjb25zdCB0b29sTmFtZSA9IHRvb2xDYWxsLnRvb2xOYW1lO1xuICBjb25zdCB0b29sMiA9IHRvb2xzW3Rvb2xOYW1lXTtcbiAgaWYgKHRvb2wyID09IG51bGwpIHtcbiAgICBpZiAodG9vbENhbGwucHJvdmlkZXJFeGVjdXRlZCAmJiB0b29sQ2FsbC5keW5hbWljKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcGFyc2VQcm92aWRlckV4ZWN1dGVkRHluYW1pY1Rvb2xDYWxsKHRvb2xDYWxsKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IE5vU3VjaFRvb2xFcnJvcih7XG4gICAgICB0b29sTmFtZTogdG9vbENhbGwudG9vbE5hbWUsXG4gICAgICBhdmFpbGFibGVUb29sczogT2JqZWN0LmtleXModG9vbHMpXG4gICAgfSk7XG4gIH1cbiAgY29uc3Qgc2NoZW1hID0gYXNTY2hlbWEzKHRvb2wyLmlucHV0U2NoZW1hKTtcbiAgY29uc3QgcGFyc2VSZXN1bHQgPSB0b29sQ2FsbC5pbnB1dC50cmltKCkgPT09IFwiXCIgPyBhd2FpdCBzYWZlVmFsaWRhdGVUeXBlczMoeyB2YWx1ZToge30sIHNjaGVtYSB9KSA6IGF3YWl0IHNhZmVQYXJzZUpTT04zKHsgdGV4dDogdG9vbENhbGwuaW5wdXQsIHNjaGVtYSB9KTtcbiAgaWYgKHBhcnNlUmVzdWx0LnN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRUb29sSW5wdXRFcnJvcih7XG4gICAgICB0b29sTmFtZSxcbiAgICAgIHRvb2xJbnB1dDogdG9vbENhbGwuaW5wdXQsXG4gICAgICBjYXVzZTogcGFyc2VSZXN1bHQuZXJyb3JcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdG9vbDIudHlwZSA9PT0gXCJkeW5hbWljXCIgPyB7XG4gICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICB0b29sQ2FsbElkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgIHRvb2xOYW1lOiB0b29sQ2FsbC50b29sTmFtZSxcbiAgICBpbnB1dDogcGFyc2VSZXN1bHQudmFsdWUsXG4gICAgcHJvdmlkZXJFeGVjdXRlZDogdG9vbENhbGwucHJvdmlkZXJFeGVjdXRlZCxcbiAgICBwcm92aWRlck1ldGFkYXRhOiB0b29sQ2FsbC5wcm92aWRlck1ldGFkYXRhLFxuICAgIGR5bmFtaWM6IHRydWUsXG4gICAgdGl0bGU6IHRvb2wyLnRpdGxlXG4gIH0gOiB7XG4gICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICB0b29sQ2FsbElkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgIHRvb2xOYW1lLFxuICAgIGlucHV0OiBwYXJzZVJlc3VsdC52YWx1ZSxcbiAgICBwcm92aWRlckV4ZWN1dGVkOiB0b29sQ2FsbC5wcm92aWRlckV4ZWN1dGVkLFxuICAgIHByb3ZpZGVyTWV0YWRhdGE6IHRvb2xDYWxsLnByb3ZpZGVyTWV0YWRhdGEsXG4gICAgdGl0bGU6IHRvb2wyLnRpdGxlXG4gIH07XG59XG5cbi8vIHNyYy9nZW5lcmF0ZS10ZXh0L3N0ZXAtcmVzdWx0LnRzXG52YXIgRGVmYXVsdFN0ZXBSZXN1bHQgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBzdGVwTnVtYmVyLFxuICAgIG1vZGVsLFxuICAgIGZ1bmN0aW9uSWQsXG4gICAgbWV0YWRhdGEsXG4gICAgZXhwZXJpbWVudGFsX2NvbnRleHQsXG4gICAgY29udGVudCxcbiAgICBmaW5pc2hSZWFzb24sXG4gICAgcmF3RmluaXNoUmVhc29uLFxuICAgIHVzYWdlLFxuICAgIHdhcm5pbmdzLFxuICAgIHJlcXVlc3QsXG4gICAgcmVzcG9uc2UsXG4gICAgcHJvdmlkZXJNZXRhZGF0YVxuICB9KSB7XG4gICAgdGhpcy5zdGVwTnVtYmVyID0gc3RlcE51bWJlcjtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5mdW5jdGlvbklkID0gZnVuY3Rpb25JZDtcbiAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gICAgdGhpcy5leHBlcmltZW50YWxfY29udGV4dCA9IGV4cGVyaW1lbnRhbF9jb250ZXh0O1xuICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgdGhpcy5maW5pc2hSZWFzb24gPSBmaW5pc2hSZWFzb247XG4gICAgdGhpcy5yYXdGaW5pc2hSZWFzb24gPSByYXdGaW5pc2hSZWFzb247XG4gICAgdGhpcy51c2FnZSA9IHVzYWdlO1xuICAgIHRoaXMud2FybmluZ3MgPSB3YXJuaW5ncztcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0aGlzLnByb3ZpZGVyTWV0YWRhdGEgPSBwcm92aWRlck1ldGFkYXRhO1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09IFwidGV4dFwiKS5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCkuam9pbihcIlwiKTtcbiAgfVxuICBnZXQgcmVhc29uaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09IFwicmVhc29uaW5nXCIpO1xuICB9XG4gIGdldCByZWFzb25pbmdUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLnJlYXNvbmluZy5sZW5ndGggPT09IDAgPyB2b2lkIDAgOiB0aGlzLnJlYXNvbmluZy5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCkuam9pbihcIlwiKTtcbiAgfVxuICBnZXQgZmlsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudC5maWx0ZXIoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpLm1hcCgocGFydCkgPT4gcGFydC5maWxlKTtcbiAgfVxuICBnZXQgc291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50LmZpbHRlcigocGFydCkgPT4gcGFydC50eXBlID09PSBcInNvdXJjZVwiKTtcbiAgfVxuICBnZXQgdG9vbENhbGxzKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09IFwidG9vbC1jYWxsXCIpO1xuICB9XG4gIGdldCBzdGF0aWNUb29sQ2FsbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9vbENhbGxzLmZpbHRlcihcbiAgICAgICh0b29sQ2FsbCkgPT4gdG9vbENhbGwuZHluYW1pYyAhPT0gdHJ1ZVxuICAgICk7XG4gIH1cbiAgZ2V0IGR5bmFtaWNUb29sQ2FsbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9vbENhbGxzLmZpbHRlcihcbiAgICAgICh0b29sQ2FsbCkgPT4gdG9vbENhbGwuZHluYW1pYyA9PT0gdHJ1ZVxuICAgICk7XG4gIH1cbiAgZ2V0IHRvb2xSZXN1bHRzKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09IFwidG9vbC1yZXN1bHRcIik7XG4gIH1cbiAgZ2V0IHN0YXRpY1Rvb2xSZXN1bHRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvb2xSZXN1bHRzLmZpbHRlcihcbiAgICAgICh0b29sUmVzdWx0KSA9PiB0b29sUmVzdWx0LmR5bmFtaWMgIT09IHRydWVcbiAgICApO1xuICB9XG4gIGdldCBkeW5hbWljVG9vbFJlc3VsdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9vbFJlc3VsdHMuZmlsdGVyKFxuICAgICAgKHRvb2xSZXN1bHQpID0+IHRvb2xSZXN1bHQuZHluYW1pYyA9PT0gdHJ1ZVxuICAgICk7XG4gIH1cbn07XG5cbi8vIHNyYy9nZW5lcmF0ZS10ZXh0L3N0b3AtY29uZGl0aW9uLnRzXG5mdW5jdGlvbiBzdGVwQ291bnRJcyhzdGVwQ291bnQpIHtcbiAgcmV0dXJuICh7IHN0ZXBzIH0pID0+IHN0ZXBzLmxlbmd0aCA9PT0gc3RlcENvdW50O1xufVxuZnVuY3Rpb24gaXNMb29wRmluaXNoZWQoKSB7XG4gIHJldHVybiAoKSA9PiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc1Rvb2xDYWxsKHRvb2xOYW1lKSB7XG4gIHJldHVybiAoeyBzdGVwcyB9KSA9PiB7XG4gICAgdmFyIF9hMjEsIF9iLCBfYztcbiAgICByZXR1cm4gKF9jID0gKF9iID0gKF9hMjEgPSBzdGVwc1tzdGVwcy5sZW5ndGggLSAxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjEudG9vbENhbGxzKSA9PSBudWxsID8gdm9pZCAwIDogX2Iuc29tZShcbiAgICAgICh0b29sQ2FsbCkgPT4gdG9vbENhbGwudG9vbE5hbWUgPT09IHRvb2xOYW1lXG4gICAgKSkgIT0gbnVsbCA/IF9jIDogZmFsc2U7XG4gIH07XG59XG5hc3luYyBmdW5jdGlvbiBpc1N0b3BDb25kaXRpb25NZXQoe1xuICBzdG9wQ29uZGl0aW9ucyxcbiAgc3RlcHNcbn0pIHtcbiAgcmV0dXJuIChhd2FpdCBQcm9taXNlLmFsbChzdG9wQ29uZGl0aW9ucy5tYXAoKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uKHsgc3RlcHMgfSkpKSkuc29tZSgocmVzdWx0KSA9PiByZXN1bHQpO1xufVxuXG4vLyBzcmMvZ2VuZXJhdGUtdGV4dC90by1yZXNwb25zZS1tZXNzYWdlcy50c1xuYXN5bmMgZnVuY3Rpb24gdG9SZXNwb25zZU1lc3NhZ2VzKHtcbiAgY29udGVudDogaW5wdXRDb250ZW50LFxuICB0b29sc1xufSkge1xuICBjb25zdCByZXNwb25zZU1lc3NhZ2VzID0gW107XG4gIGNvbnN0IGNvbnRlbnQgPSBbXTtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIGlucHV0Q29udGVudCkge1xuICAgIGlmIChwYXJ0LnR5cGUgPT09IFwic291cmNlXCIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoKHBhcnQudHlwZSA9PT0gXCJ0b29sLXJlc3VsdFwiIHx8IHBhcnQudHlwZSA9PT0gXCJ0b29sLWVycm9yXCIpICYmICFwYXJ0LnByb3ZpZGVyRXhlY3V0ZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocGFydC50eXBlID09PSBcInRleHRcIiAmJiBwYXJ0LnRleHQubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgc3dpdGNoIChwYXJ0LnR5cGUpIHtcbiAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogcGFydC50ZXh0LFxuICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogcGFydC5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWFzb25pbmdcIjpcbiAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZ1wiLFxuICAgICAgICAgIHRleHQ6IHBhcnQudGV4dCxcbiAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHBhcnQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIGRhdGE6IHBhcnQuZmlsZS5iYXNlNjQsXG4gICAgICAgICAgbWVkaWFUeXBlOiBwYXJ0LmZpbGUubWVkaWFUeXBlLFxuICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogcGFydC5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b29sLWNhbGxcIjpcbiAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICB0b29sTmFtZTogcGFydC50b29sTmFtZSxcbiAgICAgICAgICBpbnB1dDogcGFydC5pbnB1dCxcbiAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiBwYXJ0LnByb3ZpZGVyRXhlY3V0ZWQsXG4gICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBwYXJ0LnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvb2wtcmVzdWx0XCI6IHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgY3JlYXRlVG9vbE1vZGVsT3V0cHV0KHtcbiAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgaW5wdXQ6IHBhcnQuaW5wdXQsXG4gICAgICAgICAgdG9vbDogdG9vbHMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2xzW3BhcnQudG9vbE5hbWVdLFxuICAgICAgICAgIG91dHB1dDogcGFydC5vdXRwdXQsXG4gICAgICAgICAgZXJyb3JNb2RlOiBcIm5vbmVcIlxuICAgICAgICB9KTtcbiAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgIHRvb2xOYW1lOiBwYXJ0LnRvb2xOYW1lLFxuICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHBhcnQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidG9vbC1lcnJvclwiOiB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGNyZWF0ZVRvb2xNb2RlbE91dHB1dCh7XG4gICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgIGlucHV0OiBwYXJ0LmlucHV0LFxuICAgICAgICAgIHRvb2w6IHRvb2xzID09IG51bGwgPyB2b2lkIDAgOiB0b29sc1twYXJ0LnRvb2xOYW1lXSxcbiAgICAgICAgICBvdXRwdXQ6IHBhcnQuZXJyb3IsXG4gICAgICAgICAgZXJyb3JNb2RlOiBcImpzb25cIlxuICAgICAgICB9KTtcbiAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgIHRvb2xOYW1lOiBwYXJ0LnRvb2xOYW1lLFxuICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHBhcnQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidG9vbC1hcHByb3ZhbC1yZXF1ZXN0XCI6XG4gICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJ0b29sLWFwcHJvdmFsLXJlcXVlc3RcIixcbiAgICAgICAgICBhcHByb3ZhbElkOiBwYXJ0LmFwcHJvdmFsSWQsXG4gICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbC50b29sQ2FsbElkXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGNvbnRlbnQubGVuZ3RoID4gMCkge1xuICAgIHJlc3BvbnNlTWVzc2FnZXMucHVzaCh7XG4gICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgY29udGVudFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHRvb2xSZXN1bHRDb250ZW50ID0gW107XG4gIGZvciAoY29uc3QgcGFydCBvZiBpbnB1dENvbnRlbnQpIHtcbiAgICBpZiAoIShwYXJ0LnR5cGUgPT09IFwidG9vbC1yZXN1bHRcIiB8fCBwYXJ0LnR5cGUgPT09IFwidG9vbC1lcnJvclwiKSB8fCBwYXJ0LnByb3ZpZGVyRXhlY3V0ZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBjcmVhdGVUb29sTW9kZWxPdXRwdXQoe1xuICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgaW5wdXQ6IHBhcnQuaW5wdXQsXG4gICAgICB0b29sOiB0b29scyA9PSBudWxsID8gdm9pZCAwIDogdG9vbHNbcGFydC50b29sTmFtZV0sXG4gICAgICBvdXRwdXQ6IHBhcnQudHlwZSA9PT0gXCJ0b29sLXJlc3VsdFwiID8gcGFydC5vdXRwdXQgOiBwYXJ0LmVycm9yLFxuICAgICAgZXJyb3JNb2RlOiBwYXJ0LnR5cGUgPT09IFwidG9vbC1lcnJvclwiID8gXCJ0ZXh0XCIgOiBcIm5vbmVcIlxuICAgIH0pO1xuICAgIHRvb2xSZXN1bHRDb250ZW50LnB1c2goe1xuICAgICAgdHlwZTogXCJ0b29sLXJlc3VsdFwiLFxuICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgdG9vbE5hbWU6IHBhcnQudG9vbE5hbWUsXG4gICAgICBvdXRwdXQsXG4gICAgICAuLi5wYXJ0LnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCA/IHsgcHJvdmlkZXJPcHRpb25zOiBwYXJ0LnByb3ZpZGVyTWV0YWRhdGEgfSA6IHt9XG4gICAgfSk7XG4gIH1cbiAgaWYgKHRvb2xSZXN1bHRDb250ZW50Lmxlbmd0aCA+IDApIHtcbiAgICByZXNwb25zZU1lc3NhZ2VzLnB1c2goe1xuICAgICAgcm9sZTogXCJ0b29sXCIsXG4gICAgICBjb250ZW50OiB0b29sUmVzdWx0Q29udGVudFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXNwb25zZU1lc3NhZ2VzO1xufVxuXG4vLyBzcmMvdXRpbC9tZXJnZS1hYm9ydC1zaWduYWxzLnRzXG5mdW5jdGlvbiBtZXJnZUFib3J0U2lnbmFscyguLi5zaWduYWxzKSB7XG4gIGNvbnN0IHZhbGlkU2lnbmFscyA9IHNpZ25hbHMuZmlsdGVyKFxuICAgIChzaWduYWwpID0+IHNpZ25hbCAhPSBudWxsXG4gICk7XG4gIGlmICh2YWxpZFNpZ25hbHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBpZiAodmFsaWRTaWduYWxzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB2YWxpZFNpZ25hbHNbMF07XG4gIH1cbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgdmFsaWRTaWduYWxzKSB7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBjb250cm9sbGVyLmFib3J0KHNpZ25hbC5yZWFzb24pO1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnbmFsO1xuICAgIH1cbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIFwiYWJvcnRcIixcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29udHJvbGxlci5hYm9ydChzaWduYWwucmVhc29uKTtcbiAgICAgIH0sXG4gICAgICB7IG9uY2U6IHRydWUgfVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnbmFsO1xufVxuXG4vLyBzcmMvZ2VuZXJhdGUtdGV4dC9nZW5lcmF0ZS10ZXh0LnRzXG52YXIgb3JpZ2luYWxHZW5lcmF0ZUlkID0gY3JlYXRlSWRHZW5lcmF0b3Ioe1xuICBwcmVmaXg6IFwiYWl0eHRcIixcbiAgc2l6ZTogMjRcbn0pO1xuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZXh0KHtcbiAgbW9kZWw6IG1vZGVsQXJnLFxuICB0b29scyxcbiAgdG9vbENob2ljZSxcbiAgc3lzdGVtLFxuICBwcm9tcHQsXG4gIG1lc3NhZ2VzLFxuICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzQXJnLFxuICBhYm9ydFNpZ25hbCxcbiAgdGltZW91dCxcbiAgaGVhZGVycyxcbiAgc3RvcFdoZW4gPSBzdGVwQ291bnRJcygxKSxcbiAgZXhwZXJpbWVudGFsX291dHB1dCxcbiAgb3V0cHV0ID0gZXhwZXJpbWVudGFsX291dHB1dCxcbiAgZXhwZXJpbWVudGFsX3RlbGVtZXRyeTogdGVsZW1ldHJ5LFxuICBwcm92aWRlck9wdGlvbnMsXG4gIGV4cGVyaW1lbnRhbF9hY3RpdmVUb29scyxcbiAgYWN0aXZlVG9vbHMgPSBleHBlcmltZW50YWxfYWN0aXZlVG9vbHMsXG4gIGV4cGVyaW1lbnRhbF9wcmVwYXJlU3RlcCxcbiAgcHJlcGFyZVN0ZXAgPSBleHBlcmltZW50YWxfcHJlcGFyZVN0ZXAsXG4gIGV4cGVyaW1lbnRhbF9yZXBhaXJUb29sQ2FsbDogcmVwYWlyVG9vbENhbGwsXG4gIGV4cGVyaW1lbnRhbF9kb3dubG9hZDogZG93bmxvYWQyLFxuICBleHBlcmltZW50YWxfY29udGV4dCxcbiAgZXhwZXJpbWVudGFsX2luY2x1ZGU6IGluY2x1ZGUsXG4gIF9pbnRlcm5hbDogeyBnZW5lcmF0ZUlkOiBnZW5lcmF0ZUlkMiA9IG9yaWdpbmFsR2VuZXJhdGVJZCB9ID0ge30sXG4gIGV4cGVyaW1lbnRhbF9vblN0YXJ0OiBvblN0YXJ0LFxuICBleHBlcmltZW50YWxfb25TdGVwU3RhcnQ6IG9uU3RlcFN0YXJ0LFxuICBleHBlcmltZW50YWxfb25Ub29sQ2FsbFN0YXJ0OiBvblRvb2xDYWxsU3RhcnQsXG4gIGV4cGVyaW1lbnRhbF9vblRvb2xDYWxsRmluaXNoOiBvblRvb2xDYWxsRmluaXNoLFxuICBvblN0ZXBGaW5pc2gsXG4gIG9uRmluaXNoLFxuICAuLi5zZXR0aW5nc1xufSkge1xuICBjb25zdCBtb2RlbCA9IHJlc29sdmVMYW5ndWFnZU1vZGVsKG1vZGVsQXJnKTtcbiAgY29uc3QgY3JlYXRlR2xvYmFsVGVsZW1ldHJ5ID0gZ2V0R2xvYmFsVGVsZW1ldHJ5SW50ZWdyYXRpb24oKTtcbiAgY29uc3Qgc3RvcENvbmRpdGlvbnMgPSBhc0FycmF5KHN0b3BXaGVuKTtcbiAgY29uc3QgdG90YWxUaW1lb3V0TXMgPSBnZXRUb3RhbFRpbWVvdXRNcyh0aW1lb3V0KTtcbiAgY29uc3Qgc3RlcFRpbWVvdXRNcyA9IGdldFN0ZXBUaW1lb3V0TXModGltZW91dCk7XG4gIGNvbnN0IHN0ZXBBYm9ydENvbnRyb2xsZXIgPSBzdGVwVGltZW91dE1zICE9IG51bGwgPyBuZXcgQWJvcnRDb250cm9sbGVyKCkgOiB2b2lkIDA7XG4gIGNvbnN0IG1lcmdlZEFib3J0U2lnbmFsID0gbWVyZ2VBYm9ydFNpZ25hbHMoXG4gICAgYWJvcnRTaWduYWwsXG4gICAgdG90YWxUaW1lb3V0TXMgIT0gbnVsbCA/IEFib3J0U2lnbmFsLnRpbWVvdXQodG90YWxUaW1lb3V0TXMpIDogdm9pZCAwLFxuICAgIHN0ZXBBYm9ydENvbnRyb2xsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IHN0ZXBBYm9ydENvbnRyb2xsZXIuc2lnbmFsXG4gICk7XG4gIGNvbnN0IHsgbWF4UmV0cmllcywgcmV0cnkgfSA9IHByZXBhcmVSZXRyaWVzKHtcbiAgICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzQXJnLFxuICAgIGFib3J0U2lnbmFsOiBtZXJnZWRBYm9ydFNpZ25hbFxuICB9KTtcbiAgY29uc3QgY2FsbFNldHRpbmdzID0gcHJlcGFyZUNhbGxTZXR0aW5ncyhzZXR0aW5ncyk7XG4gIGNvbnN0IGhlYWRlcnNXaXRoVXNlckFnZW50ID0gd2l0aFVzZXJBZ2VudFN1ZmZpeDIoXG4gICAgaGVhZGVycyAhPSBudWxsID8gaGVhZGVycyA6IHt9LFxuICAgIGBhaS8ke1ZFUlNJT059YFxuICApO1xuICBjb25zdCBiYXNlVGVsZW1ldHJ5QXR0cmlidXRlcyA9IGdldEJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICBtb2RlbCxcbiAgICB0ZWxlbWV0cnksXG4gICAgaGVhZGVyczogaGVhZGVyc1dpdGhVc2VyQWdlbnQsXG4gICAgc2V0dGluZ3M6IHsgLi4uY2FsbFNldHRpbmdzLCBtYXhSZXRyaWVzIH1cbiAgfSk7XG4gIGNvbnN0IG1vZGVsSW5mbyA9IHsgcHJvdmlkZXI6IG1vZGVsLnByb3ZpZGVyLCBtb2RlbElkOiBtb2RlbC5tb2RlbElkIH07XG4gIGNvbnN0IGluaXRpYWxQcm9tcHQgPSBhd2FpdCBzdGFuZGFyZGl6ZVByb21wdCh7XG4gICAgc3lzdGVtLFxuICAgIHByb21wdCxcbiAgICBtZXNzYWdlc1xuICB9KTtcbiAgY29uc3QgZ2xvYmFsVGVsZW1ldHJ5ID0gY3JlYXRlR2xvYmFsVGVsZW1ldHJ5KHRlbGVtZXRyeSA9PSBudWxsID8gdm9pZCAwIDogdGVsZW1ldHJ5LmludGVncmF0aW9ucyk7XG4gIGF3YWl0IG5vdGlmeSh7XG4gICAgZXZlbnQ6IHtcbiAgICAgIG1vZGVsOiBtb2RlbEluZm8sXG4gICAgICBzeXN0ZW0sXG4gICAgICBwcm9tcHQsXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIHRvb2xzLFxuICAgICAgdG9vbENob2ljZSxcbiAgICAgIGFjdGl2ZVRvb2xzLFxuICAgICAgbWF4T3V0cHV0VG9rZW5zOiBjYWxsU2V0dGluZ3MubWF4T3V0cHV0VG9rZW5zLFxuICAgICAgdGVtcGVyYXR1cmU6IGNhbGxTZXR0aW5ncy50ZW1wZXJhdHVyZSxcbiAgICAgIHRvcFA6IGNhbGxTZXR0aW5ncy50b3BQLFxuICAgICAgdG9wSzogY2FsbFNldHRpbmdzLnRvcEssXG4gICAgICBwcmVzZW5jZVBlbmFsdHk6IGNhbGxTZXR0aW5ncy5wcmVzZW5jZVBlbmFsdHksXG4gICAgICBmcmVxdWVuY3lQZW5hbHR5OiBjYWxsU2V0dGluZ3MuZnJlcXVlbmN5UGVuYWx0eSxcbiAgICAgIHN0b3BTZXF1ZW5jZXM6IGNhbGxTZXR0aW5ncy5zdG9wU2VxdWVuY2VzLFxuICAgICAgc2VlZDogY2FsbFNldHRpbmdzLnNlZWQsXG4gICAgICBtYXhSZXRyaWVzLFxuICAgICAgdGltZW91dCxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBwcm92aWRlck9wdGlvbnMsXG4gICAgICBzdG9wV2hlbixcbiAgICAgIG91dHB1dCxcbiAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgaW5jbHVkZSxcbiAgICAgIGZ1bmN0aW9uSWQ6IHRlbGVtZXRyeSA9PSBudWxsID8gdm9pZCAwIDogdGVsZW1ldHJ5LmZ1bmN0aW9uSWQsXG4gICAgICBtZXRhZGF0YTogdGVsZW1ldHJ5ID09IG51bGwgPyB2b2lkIDAgOiB0ZWxlbWV0cnkubWV0YWRhdGEsXG4gICAgICBleHBlcmltZW50YWxfY29udGV4dFxuICAgIH0sXG4gICAgY2FsbGJhY2tzOiBbXG4gICAgICBvblN0YXJ0LFxuICAgICAgZ2xvYmFsVGVsZW1ldHJ5Lm9uU3RhcnRcbiAgICBdXG4gIH0pO1xuICBjb25zdCB0cmFjZXIgPSBnZXRUcmFjZXIodGVsZW1ldHJ5KTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVjb3JkU3Bhbih7XG4gICAgICBuYW1lOiBcImFpLmdlbmVyYXRlVGV4dFwiLFxuICAgICAgYXR0cmlidXRlczogc2VsZWN0VGVsZW1ldHJ5QXR0cmlidXRlcyh7XG4gICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIC4uLmFzc2VtYmxlT3BlcmF0aW9uTmFtZSh7XG4gICAgICAgICAgICBvcGVyYXRpb25JZDogXCJhaS5nZW5lcmF0ZVRleHRcIixcbiAgICAgICAgICAgIHRlbGVtZXRyeVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIC4uLmJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzLFxuICAgICAgICAgIC8vIG1vZGVsOlxuICAgICAgICAgIFwiYWkubW9kZWwucHJvdmlkZXJcIjogbW9kZWwucHJvdmlkZXIsXG4gICAgICAgICAgXCJhaS5tb2RlbC5pZFwiOiBtb2RlbC5tb2RlbElkLFxuICAgICAgICAgIC8vIHNwZWNpZmljIHNldHRpbmdzIHRoYXQgb25seSBtYWtlIHNlbnNlIG9uIHRoZSBvdXRlciBsZXZlbDpcbiAgICAgICAgICBcImFpLnByb21wdFwiOiB7XG4gICAgICAgICAgICBpbnB1dDogKCkgPT4gSlNPTi5zdHJpbmdpZnkoeyBzeXN0ZW0sIHByb21wdCwgbWVzc2FnZXMgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdHJhY2VyLFxuICAgICAgZm46IGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgIHZhciBfYTIxLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2ksIF9qLCBfaywgX2wsIF9tLCBfbiwgX28sIF9wLCBfcSwgX3IsIF9zLCBfdDtcbiAgICAgICAgY29uc3QgaW5pdGlhbE1lc3NhZ2VzID0gaW5pdGlhbFByb21wdC5tZXNzYWdlcztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VNZXNzYWdlcyA9IFtdO1xuICAgICAgICBjb25zdCB7IGFwcHJvdmVkVG9vbEFwcHJvdmFscywgZGVuaWVkVG9vbEFwcHJvdmFscyB9ID0gY29sbGVjdFRvb2xBcHByb3ZhbHMoeyBtZXNzYWdlczogaW5pdGlhbE1lc3NhZ2VzIH0pO1xuICAgICAgICBjb25zdCBsb2NhbEFwcHJvdmVkVG9vbEFwcHJvdmFscyA9IGFwcHJvdmVkVG9vbEFwcHJvdmFscy5maWx0ZXIoXG4gICAgICAgICAgKHRvb2xBcHByb3ZhbCkgPT4gIXRvb2xBcHByb3ZhbC50b29sQ2FsbC5wcm92aWRlckV4ZWN1dGVkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChkZW5pZWRUb29sQXBwcm92YWxzLmxlbmd0aCA+IDAgfHwgbG9jYWxBcHByb3ZlZFRvb2xBcHByb3ZhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHRvb2xPdXRwdXRzID0gYXdhaXQgZXhlY3V0ZVRvb2xzKHtcbiAgICAgICAgICAgIHRvb2xDYWxsczogbG9jYWxBcHByb3ZlZFRvb2xBcHByb3ZhbHMubWFwKFxuICAgICAgICAgICAgICAodG9vbEFwcHJvdmFsKSA9PiB0b29sQXBwcm92YWwudG9vbENhbGxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0b29scyxcbiAgICAgICAgICAgIHRyYWNlcixcbiAgICAgICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBpbml0aWFsTWVzc2FnZXMsXG4gICAgICAgICAgICBhYm9ydFNpZ25hbDogbWVyZ2VkQWJvcnRTaWduYWwsXG4gICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dCxcbiAgICAgICAgICAgIHN0ZXBOdW1iZXI6IDAsXG4gICAgICAgICAgICBtb2RlbDogbW9kZWxJbmZvLFxuICAgICAgICAgICAgb25Ub29sQ2FsbFN0YXJ0OiBbXG4gICAgICAgICAgICAgIG9uVG9vbENhbGxTdGFydCxcbiAgICAgICAgICAgICAgZ2xvYmFsVGVsZW1ldHJ5Lm9uVG9vbENhbGxTdGFydFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG9uVG9vbENhbGxGaW5pc2g6IFtcbiAgICAgICAgICAgICAgb25Ub29sQ2FsbEZpbmlzaCxcbiAgICAgICAgICAgICAgZ2xvYmFsVGVsZW1ldHJ5Lm9uVG9vbENhbGxGaW5pc2hcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCB0b29sQ29udGVudCA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3V0cHV0MiBvZiB0b29sT3V0cHV0cykge1xuICAgICAgICAgICAgY29uc3QgbW9kZWxPdXRwdXQgPSBhd2FpdCBjcmVhdGVUb29sTW9kZWxPdXRwdXQoe1xuICAgICAgICAgICAgICB0b29sQ2FsbElkOiBvdXRwdXQyLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIGlucHV0OiBvdXRwdXQyLmlucHV0LFxuICAgICAgICAgICAgICB0b29sOiB0b29scyA9PSBudWxsID8gdm9pZCAwIDogdG9vbHNbb3V0cHV0Mi50b29sTmFtZV0sXG4gICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0Mi50eXBlID09PSBcInRvb2wtcmVzdWx0XCIgPyBvdXRwdXQyLm91dHB1dCA6IG91dHB1dDIuZXJyb3IsXG4gICAgICAgICAgICAgIGVycm9yTW9kZTogb3V0cHV0Mi50eXBlID09PSBcInRvb2wtZXJyb3JcIiA/IFwidGV4dFwiIDogXCJub25lXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdG9vbENvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogb3V0cHV0Mi50b29sQ2FsbElkLFxuICAgICAgICAgICAgICB0b29sTmFtZTogb3V0cHV0Mi50b29sTmFtZSxcbiAgICAgICAgICAgICAgb3V0cHV0OiBtb2RlbE91dHB1dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgdG9vbEFwcHJvdmFsIG9mIGRlbmllZFRvb2xBcHByb3ZhbHMpIHtcbiAgICAgICAgICAgIHRvb2xDb250ZW50LnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHRvb2xBcHByb3ZhbC50b29sQ2FsbC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbEFwcHJvdmFsLnRvb2xDYWxsLnRvb2xOYW1lLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImV4ZWN1dGlvbi1kZW5pZWRcIixcbiAgICAgICAgICAgICAgICByZWFzb246IHRvb2xBcHByb3ZhbC5hcHByb3ZhbFJlc3BvbnNlLnJlYXNvbixcbiAgICAgICAgICAgICAgICAvLyBGb3IgcHJvdmlkZXItZXhlY3V0ZWQgdG9vbHMsIGluY2x1ZGUgYXBwcm92YWxJZCBzbyBwcm92aWRlciBjYW4gY29ycmVsYXRlXG4gICAgICAgICAgICAgICAgLi4udG9vbEFwcHJvdmFsLnRvb2xDYWxsLnByb3ZpZGVyRXhlY3V0ZWQgJiYge1xuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIG9wZW5haToge1xuICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmFsSWQ6IHRvb2xBcHByb3ZhbC5hcHByb3ZhbFJlc3BvbnNlLmFwcHJvdmFsSWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICByb2xlOiBcInRvb2xcIixcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRvb2xDb250ZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvdmlkZXJFeGVjdXRlZFRvb2xBcHByb3ZhbHMgPSBbXG4gICAgICAgICAgLi4uYXBwcm92ZWRUb29sQXBwcm92YWxzLFxuICAgICAgICAgIC4uLmRlbmllZFRvb2xBcHByb3ZhbHNcbiAgICAgICAgXS5maWx0ZXIoKHRvb2xBcHByb3ZhbCkgPT4gdG9vbEFwcHJvdmFsLnRvb2xDYWxsLnByb3ZpZGVyRXhlY3V0ZWQpO1xuICAgICAgICBpZiAocHJvdmlkZXJFeGVjdXRlZFRvb2xBcHByb3ZhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICByb2xlOiBcInRvb2xcIixcbiAgICAgICAgICAgIGNvbnRlbnQ6IHByb3ZpZGVyRXhlY3V0ZWRUb29sQXBwcm92YWxzLm1hcChcbiAgICAgICAgICAgICAgKHRvb2xBcHByb3ZhbCkgPT4gKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVzcG9uc2VcIixcbiAgICAgICAgICAgICAgICBhcHByb3ZhbElkOiB0b29sQXBwcm92YWwuYXBwcm92YWxSZXNwb25zZS5hcHByb3ZhbElkLFxuICAgICAgICAgICAgICAgIGFwcHJvdmVkOiB0b29sQXBwcm92YWwuYXBwcm92YWxSZXNwb25zZS5hcHByb3ZlZCxcbiAgICAgICAgICAgICAgICByZWFzb246IHRvb2xBcHByb3ZhbC5hcHByb3ZhbFJlc3BvbnNlLnJlYXNvbixcbiAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FsbFNldHRpbmdzMiA9IHByZXBhcmVDYWxsU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgICAgICBsZXQgY3VycmVudE1vZGVsUmVzcG9uc2U7XG4gICAgICAgIGxldCBjbGllbnRUb29sQ2FsbHMgPSBbXTtcbiAgICAgICAgbGV0IGNsaWVudFRvb2xPdXRwdXRzID0gW107XG4gICAgICAgIGNvbnN0IHN0ZXBzID0gW107XG4gICAgICAgIGNvbnN0IHBlbmRpbmdEZWZlcnJlZFRvb2xDYWxscyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCBzdGVwVGltZW91dElkID0gc3RlcFRpbWVvdXRNcyAhPSBudWxsID8gc2V0VGltZW91dCgoKSA9PiBzdGVwQWJvcnRDb250cm9sbGVyLmFib3J0KCksIHN0ZXBUaW1lb3V0TXMpIDogdm9pZCAwO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwSW5wdXRNZXNzYWdlcyA9IFsuLi5pbml0aWFsTWVzc2FnZXMsIC4uLnJlc3BvbnNlTWVzc2FnZXNdO1xuICAgICAgICAgICAgY29uc3QgcHJlcGFyZVN0ZXBSZXN1bHQgPSBhd2FpdCAocHJlcGFyZVN0ZXAgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXBhcmVTdGVwKHtcbiAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgIHN0ZXBzLFxuICAgICAgICAgICAgICBzdGVwTnVtYmVyOiBzdGVwcy5sZW5ndGgsXG4gICAgICAgICAgICAgIG1lc3NhZ2VzOiBzdGVwSW5wdXRNZXNzYWdlcyxcbiAgICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHRcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBNb2RlbCA9IHJlc29sdmVMYW5ndWFnZU1vZGVsKFxuICAgICAgICAgICAgICAoX2EyMSA9IHByZXBhcmVTdGVwUmVzdWx0ID09IG51bGwgPyB2b2lkIDAgOiBwcmVwYXJlU3RlcFJlc3VsdC5tb2RlbCkgIT0gbnVsbCA/IF9hMjEgOiBtb2RlbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBNb2RlbEluZm8gPSB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyOiBzdGVwTW9kZWwucHJvdmlkZXIsXG4gICAgICAgICAgICAgIG1vZGVsSWQ6IHN0ZXBNb2RlbC5tb2RlbElkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcHJvbXB0TWVzc2FnZXMgPSBhd2FpdCBjb252ZXJ0VG9MYW5ndWFnZU1vZGVsUHJvbXB0KHtcbiAgICAgICAgICAgICAgcHJvbXB0OiB7XG4gICAgICAgICAgICAgICAgc3lzdGVtOiAoX2IgPSBwcmVwYXJlU3RlcFJlc3VsdCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZVN0ZXBSZXN1bHQuc3lzdGVtKSAhPSBudWxsID8gX2IgOiBpbml0aWFsUHJvbXB0LnN5c3RlbSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlczogKF9jID0gcHJlcGFyZVN0ZXBSZXN1bHQgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXBhcmVTdGVwUmVzdWx0Lm1lc3NhZ2VzKSAhPSBudWxsID8gX2MgOiBzdGVwSW5wdXRNZXNzYWdlc1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzdXBwb3J0ZWRVcmxzOiBhd2FpdCBzdGVwTW9kZWwuc3VwcG9ydGVkVXJscyxcbiAgICAgICAgICAgICAgZG93bmxvYWQ6IGRvd25sb2FkMlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dCA9IChfZCA9IHByZXBhcmVTdGVwUmVzdWx0ID09IG51bGwgPyB2b2lkIDAgOiBwcmVwYXJlU3RlcFJlc3VsdC5leHBlcmltZW50YWxfY29udGV4dCkgIT0gbnVsbCA/IF9kIDogZXhwZXJpbWVudGFsX2NvbnRleHQ7XG4gICAgICAgICAgICBjb25zdCBzdGVwQWN0aXZlVG9vbHMgPSAoX2UgPSBwcmVwYXJlU3RlcFJlc3VsdCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZVN0ZXBSZXN1bHQuYWN0aXZlVG9vbHMpICE9IG51bGwgPyBfZSA6IGFjdGl2ZVRvb2xzO1xuICAgICAgICAgICAgY29uc3QgeyB0b29sQ2hvaWNlOiBzdGVwVG9vbENob2ljZSwgdG9vbHM6IHN0ZXBUb29scyB9ID0gYXdhaXQgcHJlcGFyZVRvb2xzQW5kVG9vbENob2ljZSh7XG4gICAgICAgICAgICAgIHRvb2xzLFxuICAgICAgICAgICAgICB0b29sQ2hvaWNlOiAoX2YgPSBwcmVwYXJlU3RlcFJlc3VsdCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZVN0ZXBSZXN1bHQudG9vbENob2ljZSkgIT0gbnVsbCA/IF9mIDogdG9vbENob2ljZSxcbiAgICAgICAgICAgICAgYWN0aXZlVG9vbHM6IHN0ZXBBY3RpdmVUb29sc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBzdGVwTWVzc2FnZXMgPSAoX2cgPSBwcmVwYXJlU3RlcFJlc3VsdCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZVN0ZXBSZXN1bHQubWVzc2FnZXMpICE9IG51bGwgPyBfZyA6IHN0ZXBJbnB1dE1lc3NhZ2VzO1xuICAgICAgICAgICAgY29uc3Qgc3RlcFN5c3RlbSA9IChfaCA9IHByZXBhcmVTdGVwUmVzdWx0ID09IG51bGwgPyB2b2lkIDAgOiBwcmVwYXJlU3RlcFJlc3VsdC5zeXN0ZW0pICE9IG51bGwgPyBfaCA6IGluaXRpYWxQcm9tcHQuc3lzdGVtO1xuICAgICAgICAgICAgY29uc3Qgc3RlcFByb3ZpZGVyT3B0aW9ucyA9IG1lcmdlT2JqZWN0cyhcbiAgICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zLFxuICAgICAgICAgICAgICBwcmVwYXJlU3RlcFJlc3VsdCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZVN0ZXBSZXN1bHQucHJvdmlkZXJPcHRpb25zXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgbm90aWZ5KHtcbiAgICAgICAgICAgICAgZXZlbnQ6IHtcbiAgICAgICAgICAgICAgICBzdGVwTnVtYmVyOiBzdGVwcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgbW9kZWw6IHN0ZXBNb2RlbEluZm8sXG4gICAgICAgICAgICAgICAgc3lzdGVtOiBzdGVwU3lzdGVtLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBzdGVwTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgdG9vbHMsXG4gICAgICAgICAgICAgICAgdG9vbENob2ljZTogc3RlcFRvb2xDaG9pY2UsXG4gICAgICAgICAgICAgICAgYWN0aXZlVG9vbHM6IHN0ZXBBY3RpdmVUb29scyxcbiAgICAgICAgICAgICAgICBzdGVwczogWy4uLnN0ZXBzXSxcbiAgICAgICAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHN0ZXBQcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIHN0b3BXaGVuLFxuICAgICAgICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBpbmNsdWRlLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IHRlbGVtZXRyeSA9PSBudWxsID8gdm9pZCAwIDogdGVsZW1ldHJ5LmZ1bmN0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHRlbGVtZXRyeSA9PSBudWxsID8gdm9pZCAwIDogdGVsZW1ldHJ5Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNhbGxiYWNrczogW1xuICAgICAgICAgICAgICAgIG9uU3RlcFN0YXJ0LFxuICAgICAgICAgICAgICAgIGdsb2JhbFRlbGVtZXRyeS5vblN0ZXBTdGFydFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGN1cnJlbnRNb2RlbFJlc3BvbnNlID0gYXdhaXQgcmV0cnkoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2EyMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkU3Bhbih7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcImFpLmdlbmVyYXRlVGV4dC5kb0dlbmVyYXRlXCIsXG4gICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBzZWxlY3RUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgdGVsZW1ldHJ5LFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgLi4uYXNzZW1ibGVPcGVyYXRpb25OYW1lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbklkOiBcImFpLmdlbmVyYXRlVGV4dC5kb0dlbmVyYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZWxlbWV0cnlcbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAuLi5iYXNlVGVsZW1ldHJ5QXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBtb2RlbDpcbiAgICAgICAgICAgICAgICAgICAgICBcImFpLm1vZGVsLnByb3ZpZGVyXCI6IHN0ZXBNb2RlbC5wcm92aWRlcixcbiAgICAgICAgICAgICAgICAgICAgICBcImFpLm1vZGVsLmlkXCI6IHN0ZXBNb2RlbC5tb2RlbElkLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHByb21wdDpcbiAgICAgICAgICAgICAgICAgICAgICBcImFpLnByb21wdC5tZXNzYWdlc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogKCkgPT4gc3RyaW5naWZ5Rm9yVGVsZW1ldHJ5KHByb21wdE1lc3NhZ2VzKVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXCJhaS5wcm9tcHQudG9vbHNcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgbGFuZ3VhZ2UgbW9kZWwgbGV2ZWwgdG9vbHM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogKCkgPT4gc3RlcFRvb2xzID09IG51bGwgPyB2b2lkIDAgOiBzdGVwVG9vbHMubWFwKCh0b29sMikgPT4gSlNPTi5zdHJpbmdpZnkodG9vbDIpKVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXCJhaS5wcm9tcHQudG9vbENob2ljZVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogKCkgPT4gc3RlcFRvb2xDaG9pY2UgIT0gbnVsbCA/IEpTT04uc3RyaW5naWZ5KHN0ZXBUb29sQ2hvaWNlKSA6IHZvaWQgMFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbmRhcmRpemVkIGdlbi1haSBsbG0gc3BhbiBhdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnN5c3RlbVwiOiBzdGVwTW9kZWwucHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgXCJnZW5fYWkucmVxdWVzdC5tb2RlbFwiOiBzdGVwTW9kZWwubW9kZWxJZCxcbiAgICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXF1ZXN0LmZyZXF1ZW5jeV9wZW5hbHR5XCI6IHNldHRpbmdzLmZyZXF1ZW5jeVBlbmFsdHksXG4gICAgICAgICAgICAgICAgICAgICAgXCJnZW5fYWkucmVxdWVzdC5tYXhfdG9rZW5zXCI6IHNldHRpbmdzLm1heE91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXF1ZXN0LnByZXNlbmNlX3BlbmFsdHlcIjogc2V0dGluZ3MucHJlc2VuY2VQZW5hbHR5LFxuICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlcXVlc3Quc3RvcF9zZXF1ZW5jZXNcIjogc2V0dGluZ3Muc3RvcFNlcXVlbmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXF1ZXN0LnRlbXBlcmF0dXJlXCI6IChfYTIyID0gc2V0dGluZ3MudGVtcGVyYXR1cmUpICE9IG51bGwgPyBfYTIyIDogdm9pZCAwLFxuICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlcXVlc3QudG9wX2tcIjogc2V0dGluZ3MudG9wSyxcbiAgICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXF1ZXN0LnRvcF9wXCI6IHNldHRpbmdzLnRvcFBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICB0cmFjZXIsXG4gICAgICAgICAgICAgICAgICBmbjogYXN5bmMgKHNwYW4yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTIzLCBfYjIsIF9jMiwgX2QyLCBfZTIsIF9mMiwgX2cyLCBfaDI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0ZXBNb2RlbC5kb0dlbmVyYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5jYWxsU2V0dGluZ3MyLFxuICAgICAgICAgICAgICAgICAgICAgIHRvb2xzOiBzdGVwVG9vbHMsXG4gICAgICAgICAgICAgICAgICAgICAgdG9vbENob2ljZTogc3RlcFRvb2xDaG9pY2UsXG4gICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VGb3JtYXQ6IGF3YWl0IChvdXRwdXQgPT0gbnVsbCA/IHZvaWQgMCA6IG91dHB1dC5yZXNwb25zZUZvcm1hdCksXG4gICAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBwcm9tcHRNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHN0ZXBQcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG1lcmdlZEFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnNXaXRoVXNlckFnZW50XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IChfYjIgPSAoX2EyMyA9IHJlc3VsdC5yZXNwb25zZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjMuaWQpICE9IG51bGwgPyBfYjIgOiBnZW5lcmF0ZUlkMigpLFxuICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogKF9kMiA9IChfYzIgPSByZXN1bHQucmVzcG9uc2UpID09IG51bGwgPyB2b2lkIDAgOiBfYzIudGltZXN0YW1wKSAhPSBudWxsID8gX2QyIDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgbW9kZWxJZDogKF9mMiA9IChfZTIgPSByZXN1bHQucmVzcG9uc2UpID09IG51bGwgPyB2b2lkIDAgOiBfZTIubW9kZWxJZCkgIT0gbnVsbCA/IF9mMiA6IHN0ZXBNb2RlbC5tb2RlbElkLFxuICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IChfZzIgPSByZXN1bHQucmVzcG9uc2UpID09IG51bGwgPyB2b2lkIDAgOiBfZzIuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICBib2R5OiAoX2gyID0gcmVzdWx0LnJlc3BvbnNlKSA9PSBudWxsID8gdm9pZCAwIDogX2gyLmJvZHlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNhZ2UgPSBhc0xhbmd1YWdlTW9kZWxVc2FnZShyZXN1bHQudXNhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBzcGFuMi5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVsZW1ldHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLmZpbmlzaFJlYXNvblwiOiByZXN1bHQuZmluaXNoUmVhc29uLnVuaWZpZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UudGV4dFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiAoKSA9PiBleHRyYWN0VGV4dENvbnRlbnQocmVzdWx0LmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UucmVhc29uaW5nXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6ICgpID0+IGV4dHJhY3RSZWFzb25pbmdDb250ZW50KHJlc3VsdC5jb250ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLnRvb2xDYWxsc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sQ2FsbHMgPSBhc1Rvb2xDYWxscyhyZXN1bHQuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9vbENhbGxzID09IG51bGwgPyB2b2lkIDAgOiBKU09OLnN0cmluZ2lmeSh0b29sQ2FsbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS5pZFwiOiByZXNwb25zZURhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UubW9kZWxcIjogcmVzcG9uc2VEYXRhLm1vZGVsSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UudGltZXN0YW1wXCI6IHJlc3BvbnNlRGF0YS50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS5wcm92aWRlck1ldGFkYXRhXCI6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UuaW5wdXRUb2tlbnNcIjogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLnRvdGFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcImFpLnVzYWdlLmlucHV0VG9rZW5EZXRhaWxzLm5vQ2FjaGVUb2tlbnNcIjogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLm5vQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UuaW5wdXRUb2tlbkRldGFpbHMuY2FjaGVSZWFkVG9rZW5zXCI6IHJlc3VsdC51c2FnZS5pbnB1dFRva2Vucy5jYWNoZVJlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UuaW5wdXRUb2tlbkRldGFpbHMuY2FjaGVXcml0ZVRva2Vuc1wiOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMuY2FjaGVXcml0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhaS51c2FnZS5vdXRwdXRUb2tlbnNcIjogcmVzdWx0LnVzYWdlLm91dHB1dFRva2Vucy50b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhaS51c2FnZS5vdXRwdXRUb2tlbkRldGFpbHMudGV4dFRva2Vuc1wiOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2Uub3V0cHV0VG9rZW5EZXRhaWxzLnJlYXNvbmluZ1Rva2Vuc1wiOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLnJlYXNvbmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhaS51c2FnZS50b3RhbFRva2Vuc1wiOiB1c2FnZS50b3RhbFRva2VucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhaS51c2FnZS5yZWFzb25pbmdUb2tlbnNcIjogcmVzdWx0LnVzYWdlLm91dHB1dFRva2Vucy5yZWFzb25pbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnNcIjogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLmNhY2hlUmVhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbmRhcmRpemVkIGdlbi1haSBsbG0gc3BhbiBhdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXNwb25zZS5maW5pc2hfcmVhc29uc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZpbmlzaFJlYXNvbi51bmlmaWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlc3BvbnNlLmlkXCI6IHJlc3BvbnNlRGF0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJnZW5fYWkucmVzcG9uc2UubW9kZWxcIjogcmVzcG9uc2VEYXRhLm1vZGVsSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnVzYWdlLmlucHV0X3Rva2Vuc1wiOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMudG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnVzYWdlLm91dHB1dF90b2tlbnNcIjogcmVzdWx0LnVzYWdlLm91dHB1dFRva2Vucy50b3RhbFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLnJlc3VsdCwgcmVzcG9uc2U6IHJlc3BvbnNlRGF0YSB9O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgc3RlcFRvb2xDYWxscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBjdXJyZW50TW9kZWxSZXNwb25zZS5jb250ZW50LmZpbHRlcihcbiAgICAgICAgICAgICAgICAocGFydCkgPT4gcGFydC50eXBlID09PSBcInRvb2wtY2FsbFwiXG4gICAgICAgICAgICAgICkubWFwKFxuICAgICAgICAgICAgICAgICh0b29sQ2FsbCkgPT4gcGFyc2VUb29sQ2FsbCh7XG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbCxcbiAgICAgICAgICAgICAgICAgIHRvb2xzLFxuICAgICAgICAgICAgICAgICAgcmVwYWlyVG9vbENhbGwsXG4gICAgICAgICAgICAgICAgICBzeXN0ZW0sXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlczogc3RlcElucHV0TWVzc2FnZXNcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgdG9vbEFwcHJvdmFsUmVxdWVzdHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdG9vbENhbGwgb2Ygc3RlcFRvb2xDYWxscykge1xuICAgICAgICAgICAgICBpZiAodG9vbENhbGwuaW52YWxpZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHRvb2wyID0gdG9vbHMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2xzW3Rvb2xDYWxsLnRvb2xOYW1lXTtcbiAgICAgICAgICAgICAgaWYgKHRvb2wyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoKHRvb2wyID09IG51bGwgPyB2b2lkIDAgOiB0b29sMi5vbklucHV0QXZhaWxhYmxlKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdG9vbDIub25JbnB1dEF2YWlsYWJsZSh7XG4gICAgICAgICAgICAgICAgICBpbnB1dDogdG9vbENhbGwuaW5wdXQsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IHN0ZXBJbnB1dE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG1lcmdlZEFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoYXdhaXQgaXNBcHByb3ZhbE5lZWRlZCh7XG4gICAgICAgICAgICAgICAgdG9vbDogdG9vbDIsXG4gICAgICAgICAgICAgICAgdG9vbENhbGwsXG4gICAgICAgICAgICAgICAgbWVzc2FnZXM6IHN0ZXBJbnB1dE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0XG4gICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgdG9vbEFwcHJvdmFsUmVxdWVzdHNbdG9vbENhbGwudG9vbENhbGxJZF0gPSB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiLFxuICAgICAgICAgICAgICAgICAgYXBwcm92YWxJZDogZ2VuZXJhdGVJZDIoKSxcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW52YWxpZFRvb2xDYWxscyA9IHN0ZXBUb29sQ2FsbHMuZmlsdGVyKFxuICAgICAgICAgICAgICAodG9vbENhbGwpID0+IHRvb2xDYWxsLmludmFsaWQgJiYgdG9vbENhbGwuZHluYW1pY1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNsaWVudFRvb2xPdXRwdXRzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRvb2xDYWxsIG9mIGludmFsaWRUb29sQ2FsbHMpIHtcbiAgICAgICAgICAgICAgY2xpZW50VG9vbE91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWVycm9yXCIsXG4gICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdG9vbENhbGwudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbENhbGwudG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHRvb2xDYWxsLmlucHV0LFxuICAgICAgICAgICAgICAgIGVycm9yOiBnZXRFcnJvck1lc3NhZ2U1KHRvb2xDYWxsLmVycm9yKSxcbiAgICAgICAgICAgICAgICBkeW5hbWljOiB0cnVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xpZW50VG9vbENhbGxzID0gc3RlcFRvb2xDYWxscy5maWx0ZXIoXG4gICAgICAgICAgICAgICh0b29sQ2FsbCkgPT4gIXRvb2xDYWxsLnByb3ZpZGVyRXhlY3V0ZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodG9vbHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBjbGllbnRUb29sT3V0cHV0cy5wdXNoKFxuICAgICAgICAgICAgICAgIC4uLmF3YWl0IGV4ZWN1dGVUb29scyh7XG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbHM6IGNsaWVudFRvb2xDYWxscy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICh0b29sQ2FsbCkgPT4gIXRvb2xDYWxsLmludmFsaWQgJiYgdG9vbEFwcHJvdmFsUmVxdWVzdHNbdG9vbENhbGwudG9vbENhbGxJZF0gPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIHRvb2xzLFxuICAgICAgICAgICAgICAgICAgdHJhY2VyLFxuICAgICAgICAgICAgICAgICAgdGVsZW1ldHJ5LFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IHN0ZXBJbnB1dE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG1lcmdlZEFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQsXG4gICAgICAgICAgICAgICAgICBzdGVwTnVtYmVyOiBzdGVwcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICBtb2RlbDogc3RlcE1vZGVsSW5mbyxcbiAgICAgICAgICAgICAgICAgIG9uVG9vbENhbGxTdGFydDogW1xuICAgICAgICAgICAgICAgICAgICBvblRvb2xDYWxsU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFRlbGVtZXRyeS5vblRvb2xDYWxsU3RhcnRcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICBvblRvb2xDYWxsRmluaXNoOiBbXG4gICAgICAgICAgICAgICAgICAgIG9uVG9vbENhbGxGaW5pc2gsXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFRlbGVtZXRyeS5vblRvb2xDYWxsRmluaXNoXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgdG9vbENhbGwgb2Ygc3RlcFRvb2xDYWxscykge1xuICAgICAgICAgICAgICBpZiAoIXRvb2xDYWxsLnByb3ZpZGVyRXhlY3V0ZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIGNvbnN0IHRvb2wyID0gdG9vbHMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2xzW3Rvb2xDYWxsLnRvb2xOYW1lXTtcbiAgICAgICAgICAgICAgaWYgKCh0b29sMiA9PSBudWxsID8gdm9pZCAwIDogdG9vbDIudHlwZSkgPT09IFwicHJvdmlkZXJcIiAmJiB0b29sMi5zdXBwb3J0c0RlZmVycmVkUmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc1Jlc3VsdEluUmVzcG9uc2UgPSBjdXJyZW50TW9kZWxSZXNwb25zZS5jb250ZW50LnNvbWUoXG4gICAgICAgICAgICAgICAgICAocGFydCkgPT4gcGFydC50eXBlID09PSBcInRvb2wtcmVzdWx0XCIgJiYgcGFydC50b29sQ2FsbElkID09PSB0b29sQ2FsbC50b29sQ2FsbElkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc1Jlc3VsdEluUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgIHBlbmRpbmdEZWZlcnJlZFRvb2xDYWxscy5zZXQodG9vbENhbGwudG9vbENhbGxJZCwge1xuICAgICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbENhbGwudG9vbE5hbWVcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGN1cnJlbnRNb2RlbFJlc3BvbnNlLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJ0b29sLXJlc3VsdFwiKSB7XG4gICAgICAgICAgICAgICAgcGVuZGluZ0RlZmVycmVkVG9vbENhbGxzLmRlbGV0ZShwYXJ0LnRvb2xDYWxsSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzdGVwQ29udGVudCA9IGFzQ29udGVudCh7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGN1cnJlbnRNb2RlbFJlc3BvbnNlLmNvbnRlbnQsXG4gICAgICAgICAgICAgIHRvb2xDYWxsczogc3RlcFRvb2xDYWxscyxcbiAgICAgICAgICAgICAgdG9vbE91dHB1dHM6IGNsaWVudFRvb2xPdXRwdXRzLFxuICAgICAgICAgICAgICB0b29sQXBwcm92YWxSZXF1ZXN0czogT2JqZWN0LnZhbHVlcyh0b29sQXBwcm92YWxSZXF1ZXN0cyksXG4gICAgICAgICAgICAgIHRvb2xzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZXMucHVzaChcbiAgICAgICAgICAgICAgLi4uYXdhaXQgdG9SZXNwb25zZU1lc3NhZ2VzKHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBzdGVwQ29udGVudCxcbiAgICAgICAgICAgICAgICB0b29sc1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBSZXF1ZXN0ID0gKChfaSA9IGluY2x1ZGUgPT0gbnVsbCA/IHZvaWQgMCA6IGluY2x1ZGUucmVxdWVzdEJvZHkpICE9IG51bGwgPyBfaSA6IHRydWUpID8gKF9qID0gY3VycmVudE1vZGVsUmVzcG9uc2UucmVxdWVzdCkgIT0gbnVsbCA/IF9qIDoge30gOiB7IC4uLmN1cnJlbnRNb2RlbFJlc3BvbnNlLnJlcXVlc3QsIGJvZHk6IHZvaWQgMCB9O1xuICAgICAgICAgICAgY29uc3Qgc3RlcFJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAuLi5jdXJyZW50TW9kZWxSZXNwb25zZS5yZXNwb25zZSxcbiAgICAgICAgICAgICAgLy8gZGVlcCBjbG9uZSBtc2dzIHRvIGF2b2lkIG11dGF0aW5nIHBhc3QgbWVzc2FnZXMgaW4gbXVsdGktc3RlcDpcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IHN0cnVjdHVyZWRDbG9uZShyZXNwb25zZU1lc3NhZ2VzKSxcbiAgICAgICAgICAgICAgLy8gQ29uZGl0aW9uYWxseSBpbmNsdWRlIHJlc3BvbnNlIGJvZHk6XG4gICAgICAgICAgICAgIGJvZHk6ICgoX2sgPSBpbmNsdWRlID09IG51bGwgPyB2b2lkIDAgOiBpbmNsdWRlLnJlc3BvbnNlQm9keSkgIT0gbnVsbCA/IF9rIDogdHJ1ZSkgPyAoX2wgPSBjdXJyZW50TW9kZWxSZXNwb25zZS5yZXNwb25zZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9sLmJvZHkgOiB2b2lkIDBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzdGVwTnVtYmVyID0gc3RlcHMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFN0ZXBSZXN1bHQgPSBuZXcgRGVmYXVsdFN0ZXBSZXN1bHQoe1xuICAgICAgICAgICAgICBzdGVwTnVtYmVyLFxuICAgICAgICAgICAgICBtb2RlbDogc3RlcE1vZGVsSW5mbyxcbiAgICAgICAgICAgICAgZnVuY3Rpb25JZDogdGVsZW1ldHJ5ID09IG51bGwgPyB2b2lkIDAgOiB0ZWxlbWV0cnkuZnVuY3Rpb25JZCxcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHRlbGVtZXRyeSA9PSBudWxsID8gdm9pZCAwIDogdGVsZW1ldHJ5Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dCxcbiAgICAgICAgICAgICAgY29udGVudDogc3RlcENvbnRlbnQsXG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbjogY3VycmVudE1vZGVsUmVzcG9uc2UuZmluaXNoUmVhc29uLnVuaWZpZWQsXG4gICAgICAgICAgICAgIHJhd0ZpbmlzaFJlYXNvbjogY3VycmVudE1vZGVsUmVzcG9uc2UuZmluaXNoUmVhc29uLnJhdyxcbiAgICAgICAgICAgICAgdXNhZ2U6IGFzTGFuZ3VhZ2VNb2RlbFVzYWdlKGN1cnJlbnRNb2RlbFJlc3BvbnNlLnVzYWdlKSxcbiAgICAgICAgICAgICAgd2FybmluZ3M6IGN1cnJlbnRNb2RlbFJlc3BvbnNlLndhcm5pbmdzLFxuICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBjdXJyZW50TW9kZWxSZXNwb25zZS5wcm92aWRlck1ldGFkYXRhLFxuICAgICAgICAgICAgICByZXF1ZXN0OiBzdGVwUmVxdWVzdCxcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHN0ZXBSZXNwb25zZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsb2dXYXJuaW5ncyh7XG4gICAgICAgICAgICAgIHdhcm5pbmdzOiAoX20gPSBjdXJyZW50TW9kZWxSZXNwb25zZS53YXJuaW5ncykgIT0gbnVsbCA/IF9tIDogW10sXG4gICAgICAgICAgICAgIHByb3ZpZGVyOiBzdGVwTW9kZWxJbmZvLnByb3ZpZGVyLFxuICAgICAgICAgICAgICBtb2RlbDogc3RlcE1vZGVsSW5mby5tb2RlbElkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0ZXBzLnB1c2goY3VycmVudFN0ZXBSZXN1bHQpO1xuICAgICAgICAgICAgYXdhaXQgbm90aWZ5KHtcbiAgICAgICAgICAgICAgZXZlbnQ6IGN1cnJlbnRTdGVwUmVzdWx0LFxuICAgICAgICAgICAgICBjYWxsYmFja3M6IFtvblN0ZXBGaW5pc2gsIGdsb2JhbFRlbGVtZXRyeS5vblN0ZXBGaW5pc2hdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKHN0ZXBUaW1lb3V0SWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoc3RlcFRpbWVvdXRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAvLyBDb250aW51ZSBpZjpcbiAgICAgICAgICAvLyAxLiBUaGVyZSBhcmUgY2xpZW50IHRvb2wgY2FsbHMgdGhhdCBoYXZlIGFsbCBiZWVuIGV4ZWN1dGVkLCBPUlxuICAgICAgICAgIC8vIDIuIFRoZXJlIGFyZSBwZW5kaW5nIGRlZmVycmVkIHJlc3VsdHMgZnJvbSBwcm92aWRlci1leGVjdXRlZCB0b29sc1xuICAgICAgICAgIChjbGllbnRUb29sQ2FsbHMubGVuZ3RoID4gMCAmJiBjbGllbnRUb29sT3V0cHV0cy5sZW5ndGggPT09IGNsaWVudFRvb2xDYWxscy5sZW5ndGggfHwgcGVuZGluZ0RlZmVycmVkVG9vbENhbGxzLnNpemUgPiAwKSAmJiAvLyBjb250aW51ZSB1bnRpbCBhIHN0b3AgY29uZGl0aW9uIGlzIG1ldDpcbiAgICAgICAgICAhYXdhaXQgaXNTdG9wQ29uZGl0aW9uTWV0KHsgc3RvcENvbmRpdGlvbnMsIHN0ZXBzIH0pXG4gICAgICAgICk7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICBhd2FpdCBzZWxlY3RUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS5maW5pc2hSZWFzb25cIjogY3VycmVudE1vZGVsUmVzcG9uc2UuZmluaXNoUmVhc29uLnVuaWZpZWQsXG4gICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UudGV4dFwiOiB7XG4gICAgICAgICAgICAgICAgb3V0cHV0OiAoKSA9PiBleHRyYWN0VGV4dENvbnRlbnQoY3VycmVudE1vZGVsUmVzcG9uc2UuY29udGVudClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS5yZWFzb25pbmdcIjoge1xuICAgICAgICAgICAgICAgIG91dHB1dDogKCkgPT4gZXh0cmFjdFJlYXNvbmluZ0NvbnRlbnQoY3VycmVudE1vZGVsUmVzcG9uc2UuY29udGVudClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS50b29sQ2FsbHNcIjoge1xuICAgICAgICAgICAgICAgIG91dHB1dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdG9vbENhbGxzID0gYXNUb29sQ2FsbHMoY3VycmVudE1vZGVsUmVzcG9uc2UuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdG9vbENhbGxzID09IG51bGwgPyB2b2lkIDAgOiBKU09OLnN0cmluZ2lmeSh0b29sQ2FsbHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS5wcm92aWRlck1ldGFkYXRhXCI6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIGN1cnJlbnRNb2RlbFJlc3BvbnNlLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGxhc3RTdGVwID0gc3RlcHNbc3RlcHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IHRvdGFsVXNhZ2UgPSBzdGVwcy5yZWR1Y2UoXG4gICAgICAgICAgKHRvdGFsVXNhZ2UyLCBzdGVwKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWRkTGFuZ3VhZ2VNb2RlbFVzYWdlKHRvdGFsVXNhZ2UyLCBzdGVwLnVzYWdlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiB2b2lkIDAsXG4gICAgICAgICAgICBvdXRwdXRUb2tlbnM6IHZvaWQgMCxcbiAgICAgICAgICAgIHRvdGFsVG9rZW5zOiB2b2lkIDAsXG4gICAgICAgICAgICByZWFzb25pbmdUb2tlbnM6IHZvaWQgMCxcbiAgICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiB2b2lkIDBcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICBhd2FpdCBzZWxlY3RUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgXCJhaS51c2FnZS5pbnB1dFRva2Vuc1wiOiB0b3RhbFVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgICAgICBcImFpLnVzYWdlLmlucHV0VG9rZW5EZXRhaWxzLm5vQ2FjaGVUb2tlbnNcIjogKF9uID0gdG90YWxVc2FnZS5pbnB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9uLm5vQ2FjaGVUb2tlbnMsXG4gICAgICAgICAgICAgIFwiYWkudXNhZ2UuaW5wdXRUb2tlbkRldGFpbHMuY2FjaGVSZWFkVG9rZW5zXCI6IChfbyA9IHRvdGFsVXNhZ2UuaW5wdXRUb2tlbkRldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfby5jYWNoZVJlYWRUb2tlbnMsXG4gICAgICAgICAgICAgIFwiYWkudXNhZ2UuaW5wdXRUb2tlbkRldGFpbHMuY2FjaGVXcml0ZVRva2Vuc1wiOiAoX3AgPSB0b3RhbFVzYWdlLmlucHV0VG9rZW5EZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX3AuY2FjaGVXcml0ZVRva2VucyxcbiAgICAgICAgICAgICAgXCJhaS51c2FnZS5vdXRwdXRUb2tlbnNcIjogdG90YWxVc2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICAgIFwiYWkudXNhZ2Uub3V0cHV0VG9rZW5EZXRhaWxzLnRleHRUb2tlbnNcIjogKF9xID0gdG90YWxVc2FnZS5vdXRwdXRUb2tlbkRldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfcS50ZXh0VG9rZW5zLFxuICAgICAgICAgICAgICBcImFpLnVzYWdlLm91dHB1dFRva2VuRGV0YWlscy5yZWFzb25pbmdUb2tlbnNcIjogKF9yID0gdG90YWxVc2FnZS5vdXRwdXRUb2tlbkRldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfci5yZWFzb25pbmdUb2tlbnMsXG4gICAgICAgICAgICAgIFwiYWkudXNhZ2UudG90YWxUb2tlbnNcIjogdG90YWxVc2FnZS50b3RhbFRva2VucyxcbiAgICAgICAgICAgICAgXCJhaS51c2FnZS5yZWFzb25pbmdUb2tlbnNcIjogKF9zID0gdG90YWxVc2FnZS5vdXRwdXRUb2tlbkRldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfcy5yZWFzb25pbmdUb2tlbnMsXG4gICAgICAgICAgICAgIFwiYWkudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnNcIjogKF90ID0gdG90YWxVc2FnZS5pbnB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF90LmNhY2hlUmVhZFRva2Vuc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IG5vdGlmeSh7XG4gICAgICAgICAgZXZlbnQ6IHtcbiAgICAgICAgICAgIHN0ZXBOdW1iZXI6IGxhc3RTdGVwLnN0ZXBOdW1iZXIsXG4gICAgICAgICAgICBtb2RlbDogbGFzdFN0ZXAubW9kZWwsXG4gICAgICAgICAgICBmdW5jdGlvbklkOiBsYXN0U3RlcC5mdW5jdGlvbklkLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGxhc3RTdGVwLm1ldGFkYXRhLFxuICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IGxhc3RTdGVwLmV4cGVyaW1lbnRhbF9jb250ZXh0LFxuICAgICAgICAgICAgZmluaXNoUmVhc29uOiBsYXN0U3RlcC5maW5pc2hSZWFzb24sXG4gICAgICAgICAgICByYXdGaW5pc2hSZWFzb246IGxhc3RTdGVwLnJhd0ZpbmlzaFJlYXNvbixcbiAgICAgICAgICAgIHVzYWdlOiBsYXN0U3RlcC51c2FnZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGxhc3RTdGVwLmNvbnRlbnQsXG4gICAgICAgICAgICB0ZXh0OiBsYXN0U3RlcC50ZXh0LFxuICAgICAgICAgICAgcmVhc29uaW5nVGV4dDogbGFzdFN0ZXAucmVhc29uaW5nVGV4dCxcbiAgICAgICAgICAgIHJlYXNvbmluZzogbGFzdFN0ZXAucmVhc29uaW5nLFxuICAgICAgICAgICAgZmlsZXM6IGxhc3RTdGVwLmZpbGVzLFxuICAgICAgICAgICAgc291cmNlczogbGFzdFN0ZXAuc291cmNlcyxcbiAgICAgICAgICAgIHRvb2xDYWxsczogbGFzdFN0ZXAudG9vbENhbGxzLFxuICAgICAgICAgICAgc3RhdGljVG9vbENhbGxzOiBsYXN0U3RlcC5zdGF0aWNUb29sQ2FsbHMsXG4gICAgICAgICAgICBkeW5hbWljVG9vbENhbGxzOiBsYXN0U3RlcC5keW5hbWljVG9vbENhbGxzLFxuICAgICAgICAgICAgdG9vbFJlc3VsdHM6IGxhc3RTdGVwLnRvb2xSZXN1bHRzLFxuICAgICAgICAgICAgc3RhdGljVG9vbFJlc3VsdHM6IGxhc3RTdGVwLnN0YXRpY1Rvb2xSZXN1bHRzLFxuICAgICAgICAgICAgZHluYW1pY1Rvb2xSZXN1bHRzOiBsYXN0U3RlcC5keW5hbWljVG9vbFJlc3VsdHMsXG4gICAgICAgICAgICByZXF1ZXN0OiBsYXN0U3RlcC5yZXF1ZXN0LFxuICAgICAgICAgICAgcmVzcG9uc2U6IGxhc3RTdGVwLnJlc3BvbnNlLFxuICAgICAgICAgICAgd2FybmluZ3M6IGxhc3RTdGVwLndhcm5pbmdzLFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogbGFzdFN0ZXAucHJvdmlkZXJNZXRhZGF0YSxcbiAgICAgICAgICAgIHN0ZXBzLFxuICAgICAgICAgICAgdG90YWxVc2FnZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FsbGJhY2tzOiBbXG4gICAgICAgICAgICBvbkZpbmlzaCxcbiAgICAgICAgICAgIGdsb2JhbFRlbGVtZXRyeS5vbkZpbmlzaFxuICAgICAgICAgIF1cbiAgICAgICAgfSk7XG4gICAgICAgIGxldCByZXNvbHZlZE91dHB1dDtcbiAgICAgICAgaWYgKGxhc3RTdGVwLmZpbmlzaFJlYXNvbiA9PT0gXCJzdG9wXCIpIHtcbiAgICAgICAgICBjb25zdCBvdXRwdXRTcGVjaWZpY2F0aW9uID0gb3V0cHV0ICE9IG51bGwgPyBvdXRwdXQgOiB0ZXh0KCk7XG4gICAgICAgICAgcmVzb2x2ZWRPdXRwdXQgPSBhd2FpdCBvdXRwdXRTcGVjaWZpY2F0aW9uLnBhcnNlQ29tcGxldGVPdXRwdXQoXG4gICAgICAgICAgICB7IHRleHQ6IGxhc3RTdGVwLnRleHQgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IGxhc3RTdGVwLnJlc3BvbnNlLFxuICAgICAgICAgICAgICB1c2FnZTogbGFzdFN0ZXAudXNhZ2UsXG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbjogbGFzdFN0ZXAuZmluaXNoUmVhc29uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRHZW5lcmF0ZVRleHRSZXN1bHQoe1xuICAgICAgICAgIHN0ZXBzLFxuICAgICAgICAgIHRvdGFsVXNhZ2UsXG4gICAgICAgICAgb3V0cHV0OiByZXNvbHZlZE91dHB1dFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyB3cmFwR2F0ZXdheUVycm9yKGVycm9yKTtcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVRvb2xzKHtcbiAgdG9vbENhbGxzLFxuICB0b29scyxcbiAgdHJhY2VyLFxuICB0ZWxlbWV0cnksXG4gIG1lc3NhZ2VzLFxuICBhYm9ydFNpZ25hbCxcbiAgZXhwZXJpbWVudGFsX2NvbnRleHQsXG4gIHN0ZXBOdW1iZXIsXG4gIG1vZGVsLFxuICBvblRvb2xDYWxsU3RhcnQsXG4gIG9uVG9vbENhbGxGaW5pc2hcbn0pIHtcbiAgY29uc3QgdG9vbE91dHB1dHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICB0b29sQ2FsbHMubWFwKFxuICAgICAgYXN5bmMgKHRvb2xDYWxsKSA9PiBleGVjdXRlVG9vbENhbGwoe1xuICAgICAgICB0b29sQ2FsbCxcbiAgICAgICAgdG9vbHMsXG4gICAgICAgIHRyYWNlcixcbiAgICAgICAgdGVsZW1ldHJ5LFxuICAgICAgICBtZXNzYWdlcyxcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0LFxuICAgICAgICBzdGVwTnVtYmVyLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgb25Ub29sQ2FsbFN0YXJ0LFxuICAgICAgICBvblRvb2xDYWxsRmluaXNoXG4gICAgICB9KVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHRvb2xPdXRwdXRzLmZpbHRlcihcbiAgICAob3V0cHV0KSA9PiBvdXRwdXQgIT0gbnVsbFxuICApO1xufVxudmFyIERlZmF1bHRHZW5lcmF0ZVRleHRSZXN1bHQgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLnN0ZXBzID0gb3B0aW9ucy5zdGVwcztcbiAgICB0aGlzLl9vdXRwdXQgPSBvcHRpb25zLm91dHB1dDtcbiAgICB0aGlzLnRvdGFsVXNhZ2UgPSBvcHRpb25zLnRvdGFsVXNhZ2U7XG4gIH1cbiAgZ2V0IGZpbmFsU3RlcCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGVwc1t0aGlzLnN0ZXBzLmxlbmd0aCAtIDFdO1xuICB9XG4gIGdldCBjb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC5jb250ZW50O1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC50ZXh0O1xuICB9XG4gIGdldCBmaWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAuZmlsZXM7XG4gIH1cbiAgZ2V0IHJlYXNvbmluZ1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxTdGVwLnJlYXNvbmluZ1RleHQ7XG4gIH1cbiAgZ2V0IHJlYXNvbmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAucmVhc29uaW5nO1xuICB9XG4gIGdldCB0b29sQ2FsbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxTdGVwLnRvb2xDYWxscztcbiAgfVxuICBnZXQgc3RhdGljVG9vbENhbGxzKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC5zdGF0aWNUb29sQ2FsbHM7XG4gIH1cbiAgZ2V0IGR5bmFtaWNUb29sQ2FsbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxTdGVwLmR5bmFtaWNUb29sQ2FsbHM7XG4gIH1cbiAgZ2V0IHRvb2xSZXN1bHRzKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC50b29sUmVzdWx0cztcbiAgfVxuICBnZXQgc3RhdGljVG9vbFJlc3VsdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxTdGVwLnN0YXRpY1Rvb2xSZXN1bHRzO1xuICB9XG4gIGdldCBkeW5hbWljVG9vbFJlc3VsdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxTdGVwLmR5bmFtaWNUb29sUmVzdWx0cztcbiAgfVxuICBnZXQgc291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAuc291cmNlcztcbiAgfVxuICBnZXQgZmluaXNoUmVhc29uKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC5maW5pc2hSZWFzb247XG4gIH1cbiAgZ2V0IHJhd0ZpbmlzaFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAucmF3RmluaXNoUmVhc29uO1xuICB9XG4gIGdldCB3YXJuaW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAud2FybmluZ3M7XG4gIH1cbiAgZ2V0IHByb3ZpZGVyTWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxTdGVwLnByb3ZpZGVyTWV0YWRhdGE7XG4gIH1cbiAgZ2V0IHJlc3BvbnNlKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC5yZXNwb25zZTtcbiAgfVxuICBnZXQgcmVxdWVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAucmVxdWVzdDtcbiAgfVxuICBnZXQgdXNhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxTdGVwLnVzYWdlO1xuICB9XG4gIGdldCBleHBlcmltZW50YWxfb3V0cHV0KCkge1xuICAgIHJldHVybiB0aGlzLm91dHB1dDtcbiAgfVxuICBnZXQgb3V0cHV0KCkge1xuICAgIGlmICh0aGlzLl9vdXRwdXQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IE5vT3V0cHV0R2VuZXJhdGVkRXJyb3IoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX291dHB1dDtcbiAgfVxufTtcbmZ1bmN0aW9uIGFzVG9vbENhbGxzKGNvbnRlbnQpIHtcbiAgY29uc3QgcGFydHMgPSBjb250ZW50LmZpbHRlcihcbiAgICAocGFydCkgPT4gcGFydC50eXBlID09PSBcInRvb2wtY2FsbFwiXG4gICk7XG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIHJldHVybiBwYXJ0cy5tYXAoKHRvb2xDYWxsKSA9PiAoe1xuICAgIHRvb2xDYWxsSWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWQsXG4gICAgdG9vbE5hbWU6IHRvb2xDYWxsLnRvb2xOYW1lLFxuICAgIGlucHV0OiB0b29sQ2FsbC5pbnB1dFxuICB9KSk7XG59XG5mdW5jdGlvbiBhc0NvbnRlbnQoe1xuICBjb250ZW50LFxuICB0b29sQ2FsbHMsXG4gIHRvb2xPdXRwdXRzLFxuICB0b29sQXBwcm92YWxSZXF1ZXN0cyxcbiAgdG9vbHNcbn0pIHtcbiAgY29uc3QgY29udGVudFBhcnRzID0gW107XG4gIGZvciAoY29uc3QgcGFydCBvZiBjb250ZW50KSB7XG4gICAgc3dpdGNoIChwYXJ0LnR5cGUpIHtcbiAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICBjYXNlIFwicmVhc29uaW5nXCI6XG4gICAgICBjYXNlIFwic291cmNlXCI6XG4gICAgICAgIGNvbnRlbnRQYXJ0cy5wdXNoKHBhcnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJmaWxlXCI6IHtcbiAgICAgICAgY29udGVudFBhcnRzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIGZpbGU6IG5ldyBEZWZhdWx0R2VuZXJhdGVkRmlsZShwYXJ0KSxcbiAgICAgICAgICAuLi5wYXJ0LnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCA/IHsgcHJvdmlkZXJNZXRhZGF0YTogcGFydC5wcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidG9vbC1jYWxsXCI6IHtcbiAgICAgICAgY29udGVudFBhcnRzLnB1c2goXG4gICAgICAgICAgdG9vbENhbGxzLmZpbmQoKHRvb2xDYWxsKSA9PiB0b29sQ2FsbC50b29sQ2FsbElkID09PSBwYXJ0LnRvb2xDYWxsSWQpXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInRvb2wtcmVzdWx0XCI6IHtcbiAgICAgICAgY29uc3QgdG9vbENhbGwgPSB0b29sQ2FsbHMuZmluZChcbiAgICAgICAgICAodG9vbENhbGwyKSA9PiB0b29sQ2FsbDIudG9vbENhbGxJZCA9PT0gcGFydC50b29sQ2FsbElkXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0b29sQ2FsbCA9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgdG9vbDIgPSB0b29scyA9PSBudWxsID8gdm9pZCAwIDogdG9vbHNbcGFydC50b29sTmFtZV07XG4gICAgICAgICAgY29uc3Qgc3VwcG9ydHNEZWZlcnJlZFJlc3VsdHMgPSAodG9vbDIgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2wyLnR5cGUpID09PSBcInByb3ZpZGVyXCIgJiYgdG9vbDIuc3VwcG9ydHNEZWZlcnJlZFJlc3VsdHM7XG4gICAgICAgICAgaWYgKCFzdXBwb3J0c0RlZmVycmVkUmVzdWx0cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUb29sIGNhbGwgJHtwYXJ0LnRvb2xDYWxsSWR9IG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHBhcnQuaXNFcnJvcikge1xuICAgICAgICAgICAgY29udGVudFBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtZXJyb3JcIixcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICB0b29sTmFtZTogcGFydC50b29sTmFtZSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHZvaWQgMCxcbiAgICAgICAgICAgICAgZXJyb3I6IHBhcnQucmVzdWx0LFxuICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlLFxuICAgICAgICAgICAgICBkeW5hbWljOiBwYXJ0LmR5bmFtaWMsXG4gICAgICAgICAgICAgIC4uLnBhcnQucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhOiBwYXJ0LnByb3ZpZGVyTWV0YWRhdGEgfSA6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudFBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgdG9vbE5hbWU6IHBhcnQudG9vbE5hbWUsXG4gICAgICAgICAgICAgIGlucHV0OiB2b2lkIDAsXG4gICAgICAgICAgICAgIG91dHB1dDogcGFydC5yZXN1bHQsXG4gICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGR5bmFtaWM6IHBhcnQuZHluYW1pYyxcbiAgICAgICAgICAgICAgLi4ucGFydC5wcm92aWRlck1ldGFkYXRhICE9IG51bGwgPyB7IHByb3ZpZGVyTWV0YWRhdGE6IHBhcnQucHJvdmlkZXJNZXRhZGF0YSB9IDoge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydC5pc0Vycm9yKSB7XG4gICAgICAgICAgY29udGVudFBhcnRzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWVycm9yXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICB0b29sTmFtZTogcGFydC50b29sTmFtZSxcbiAgICAgICAgICAgIGlucHV0OiB0b29sQ2FsbC5pbnB1dCxcbiAgICAgICAgICAgIGVycm9yOiBwYXJ0LnJlc3VsdCxcbiAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWUsXG4gICAgICAgICAgICBkeW5hbWljOiB0b29sQ2FsbC5keW5hbWljLFxuICAgICAgICAgICAgLi4ucGFydC5wcm92aWRlck1ldGFkYXRhICE9IG51bGwgPyB7IHByb3ZpZGVyTWV0YWRhdGE6IHBhcnQucHJvdmlkZXJNZXRhZGF0YSB9IDoge31cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZW50UGFydHMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICB0b29sTmFtZTogcGFydC50b29sTmFtZSxcbiAgICAgICAgICAgIGlucHV0OiB0b29sQ2FsbC5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogcGFydC5yZXN1bHQsXG4gICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlLFxuICAgICAgICAgICAgZHluYW1pYzogdG9vbENhbGwuZHluYW1pYyxcbiAgICAgICAgICAgIC4uLnBhcnQucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhOiBwYXJ0LnByb3ZpZGVyTWV0YWRhdGEgfSA6IHt9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidG9vbC1hcHByb3ZhbC1yZXF1ZXN0XCI6IHtcbiAgICAgICAgY29uc3QgdG9vbENhbGwgPSB0b29sQ2FsbHMuZmluZChcbiAgICAgICAgICAodG9vbENhbGwyKSA9PiB0b29sQ2FsbDIudG9vbENhbGxJZCA9PT0gcGFydC50b29sQ2FsbElkXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0b29sQ2FsbCA9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRvb2xDYWxsTm90Rm91bmRGb3JBcHByb3ZhbEVycm9yKHtcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgIGFwcHJvdmFsSWQ6IHBhcnQuYXBwcm92YWxJZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnRQYXJ0cy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiLFxuICAgICAgICAgIGFwcHJvdmFsSWQ6IHBhcnQuYXBwcm92YWxJZCxcbiAgICAgICAgICB0b29sQ2FsbFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4uY29udGVudFBhcnRzLCAuLi50b29sT3V0cHV0cywgLi4udG9vbEFwcHJvdmFsUmVxdWVzdHNdO1xufVxuXG4vLyBzcmMvZ2VuZXJhdGUtdGV4dC9zdHJlYW0tdGV4dC50c1xuaW1wb3J0IHtcbiAgZ2V0RXJyb3JNZXNzYWdlIGFzIGdldEVycm9yTWVzc2FnZTcsXG4gIFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yIGFzIFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yMlxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xuaW1wb3J0IHtcbiAgY3JlYXRlSWRHZW5lcmF0b3IgYXMgY3JlYXRlSWRHZW5lcmF0b3IyLFxuICBEZWxheWVkUHJvbWlzZSxcbiAgaXNBYm9ydEVycm9yIGFzIGlzQWJvcnRFcnJvcjJcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL3V0aWwvcHJlcGFyZS1oZWFkZXJzLnRzXG5mdW5jdGlvbiBwcmVwYXJlSGVhZGVycyhoZWFkZXJzLCBkZWZhdWx0SGVhZGVycykge1xuICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBuZXcgSGVhZGVycyhoZWFkZXJzICE9IG51bGwgPyBoZWFkZXJzIDoge30pO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZWZhdWx0SGVhZGVycykpIHtcbiAgICBpZiAoIXJlc3BvbnNlSGVhZGVycy5oYXMoa2V5KSkge1xuICAgICAgcmVzcG9uc2VIZWFkZXJzLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlSGVhZGVycztcbn1cblxuLy8gc3JjL3RleHQtc3RyZWFtL2NyZWF0ZS10ZXh0LXN0cmVhbS1yZXNwb25zZS50c1xuZnVuY3Rpb24gY3JlYXRlVGV4dFN0cmVhbVJlc3BvbnNlKHtcbiAgc3RhdHVzLFxuICBzdGF0dXNUZXh0LFxuICBoZWFkZXJzLFxuICB0ZXh0U3RyZWFtXG59KSB7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UodGV4dFN0cmVhbS5waXBlVGhyb3VnaChuZXcgVGV4dEVuY29kZXJTdHJlYW0oKSksIHtcbiAgICBzdGF0dXM6IHN0YXR1cyAhPSBudWxsID8gc3RhdHVzIDogMjAwLFxuICAgIHN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogcHJlcGFyZUhlYWRlcnMoaGVhZGVycywge1xuICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCJcbiAgICB9KVxuICB9KTtcbn1cblxuLy8gc3JjL3V0aWwvd3JpdGUtdG8tc2VydmVyLXJlc3BvbnNlLnRzXG5mdW5jdGlvbiB3cml0ZVRvU2VydmVyUmVzcG9uc2Uoe1xuICByZXNwb25zZSxcbiAgc3RhdHVzLFxuICBzdGF0dXNUZXh0LFxuICBoZWFkZXJzLFxuICBzdHJlYW1cbn0pIHtcbiAgY29uc3Qgc3RhdHVzQ29kZSA9IHN0YXR1cyAhPSBudWxsID8gc3RhdHVzIDogMjAwO1xuICBpZiAoc3RhdHVzVGV4dCAhPT0gdm9pZCAwKSB7XG4gICAgcmVzcG9uc2Uud3JpdGVIZWFkKHN0YXR1c0NvZGUsIHN0YXR1c1RleHQsIGhlYWRlcnMpO1xuICB9IGVsc2Uge1xuICAgIHJlc3BvbnNlLndyaXRlSGVhZChzdGF0dXNDb2RlLCBoZWFkZXJzKTtcbiAgfVxuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IHJlYWQgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgIGlmIChkb25lKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjb25zdCBjYW5Db250aW51ZSA9IHJlc3BvbnNlLndyaXRlKHZhbHVlKTtcbiAgICAgICAgaWYgKCFjYW5Db250aW51ZSkge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMykgPT4ge1xuICAgICAgICAgICAgcmVzcG9uc2Uub25jZShcImRyYWluXCIsIHJlc29sdmUzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVzcG9uc2UuZW5kKCk7XG4gICAgfVxuICB9O1xuICByZWFkKCk7XG59XG5cbi8vIHNyYy90ZXh0LXN0cmVhbS9waXBlLXRleHQtc3RyZWFtLXRvLXJlc3BvbnNlLnRzXG5mdW5jdGlvbiBwaXBlVGV4dFN0cmVhbVRvUmVzcG9uc2Uoe1xuICByZXNwb25zZSxcbiAgc3RhdHVzLFxuICBzdGF0dXNUZXh0LFxuICBoZWFkZXJzLFxuICB0ZXh0U3RyZWFtXG59KSB7XG4gIHdyaXRlVG9TZXJ2ZXJSZXNwb25zZSh7XG4gICAgcmVzcG9uc2UsXG4gICAgc3RhdHVzLFxuICAgIHN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgcHJlcGFyZUhlYWRlcnMoaGVhZGVycywge1xuICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIlxuICAgICAgfSkuZW50cmllcygpXG4gICAgKSxcbiAgICBzdHJlYW06IHRleHRTdHJlYW0ucGlwZVRocm91Z2gobmV3IFRleHRFbmNvZGVyU3RyZWFtKCkpXG4gIH0pO1xufVxuXG4vLyBzcmMvdWktbWVzc2FnZS1zdHJlYW0vanNvbi10by1zc2UtdHJhbnNmb3JtLXN0cmVhbS50c1xudmFyIEpzb25Ub1NzZVRyYW5zZm9ybVN0cmVhbSA9IGNsYXNzIGV4dGVuZHMgVHJhbnNmb3JtU3RyZWFtIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdHJhbnNmb3JtKHBhcnQsIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOiAke0pTT04uc3RyaW5naWZ5KHBhcnQpfVxuXG5gKTtcbiAgICAgIH0sXG4gICAgICBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShcImRhdGE6IFtET05FXVxcblxcblwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuLy8gc3JjL3VpLW1lc3NhZ2Utc3RyZWFtL3VpLW1lc3NhZ2Utc3RyZWFtLWhlYWRlcnMudHNcbnZhciBVSV9NRVNTQUdFX1NUUkVBTV9IRUFERVJTID0ge1xuICBcImNvbnRlbnQtdHlwZVwiOiBcInRleHQvZXZlbnQtc3RyZWFtXCIsXG4gIFwiY2FjaGUtY29udHJvbFwiOiBcIm5vLWNhY2hlXCIsXG4gIGNvbm5lY3Rpb246IFwia2VlcC1hbGl2ZVwiLFxuICBcIngtdmVyY2VsLWFpLXVpLW1lc3NhZ2Utc3RyZWFtXCI6IFwidjFcIixcbiAgXCJ4LWFjY2VsLWJ1ZmZlcmluZ1wiOiBcIm5vXCJcbiAgLy8gZGlzYWJsZSBuZ2lueCBidWZmZXJpbmdcbn07XG5cbi8vIHNyYy91aS1tZXNzYWdlLXN0cmVhbS9jcmVhdGUtdWktbWVzc2FnZS1zdHJlYW0tcmVzcG9uc2UudHNcbmZ1bmN0aW9uIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbVJlc3BvbnNlKHtcbiAgc3RhdHVzLFxuICBzdGF0dXNUZXh0LFxuICBoZWFkZXJzLFxuICBzdHJlYW0sXG4gIGNvbnN1bWVTc2VTdHJlYW1cbn0pIHtcbiAgbGV0IHNzZVN0cmVhbSA9IHN0cmVhbS5waXBlVGhyb3VnaChuZXcgSnNvblRvU3NlVHJhbnNmb3JtU3RyZWFtKCkpO1xuICBpZiAoY29uc3VtZVNzZVN0cmVhbSkge1xuICAgIGNvbnN0IFtzdHJlYW0xLCBzdHJlYW0yXSA9IHNzZVN0cmVhbS50ZWUoKTtcbiAgICBzc2VTdHJlYW0gPSBzdHJlYW0xO1xuICAgIGNvbnN1bWVTc2VTdHJlYW0oeyBzdHJlYW06IHN0cmVhbTIgfSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBSZXNwb25zZShzc2VTdHJlYW0ucGlwZVRocm91Z2gobmV3IFRleHRFbmNvZGVyU3RyZWFtKCkpLCB7XG4gICAgc3RhdHVzLFxuICAgIHN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogcHJlcGFyZUhlYWRlcnMoaGVhZGVycywgVUlfTUVTU0FHRV9TVFJFQU1fSEVBREVSUylcbiAgfSk7XG59XG5cbi8vIHNyYy91aS1tZXNzYWdlLXN0cmVhbS9nZXQtcmVzcG9uc2UtdWktbWVzc2FnZS1pZC50c1xuZnVuY3Rpb24gZ2V0UmVzcG9uc2VVSU1lc3NhZ2VJZCh7XG4gIG9yaWdpbmFsTWVzc2FnZXMsXG4gIHJlc3BvbnNlTWVzc2FnZUlkXG59KSB7XG4gIGlmIChvcmlnaW5hbE1lc3NhZ2VzID09IG51bGwpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGNvbnN0IGxhc3RNZXNzYWdlID0gb3JpZ2luYWxNZXNzYWdlc1tvcmlnaW5hbE1lc3NhZ2VzLmxlbmd0aCAtIDFdO1xuICByZXR1cm4gKGxhc3RNZXNzYWdlID09IG51bGwgPyB2b2lkIDAgOiBsYXN0TWVzc2FnZS5yb2xlKSA9PT0gXCJhc3Npc3RhbnRcIiA/IGxhc3RNZXNzYWdlLmlkIDogdHlwZW9mIHJlc3BvbnNlTWVzc2FnZUlkID09PSBcImZ1bmN0aW9uXCIgPyByZXNwb25zZU1lc3NhZ2VJZCgpIDogcmVzcG9uc2VNZXNzYWdlSWQ7XG59XG5cbi8vIHNyYy91aS9wcm9jZXNzLXVpLW1lc3NhZ2Utc3RyZWFtLnRzXG5pbXBvcnQgeyB2YWxpZGF0ZVR5cGVzIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL3VpLW1lc3NhZ2Utc3RyZWFtL3VpLW1lc3NhZ2UtY2h1bmtzLnRzXG5pbXBvcnQgeyB6IGFzIHo3IH0gZnJvbSBcInpvZC92NFwiO1xuaW1wb3J0IHsgbGF6eVNjaGVtYSwgem9kU2NoZW1hIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbnZhciB1aU1lc3NhZ2VDaHVua1NjaGVtYSA9IGxhenlTY2hlbWEoXG4gICgpID0+IHpvZFNjaGVtYShcbiAgICB6Ny51bmlvbihbXG4gICAgICB6Ny5zdHJpY3RPYmplY3Qoe1xuICAgICAgICB0eXBlOiB6Ny5saXRlcmFsKFwidGV4dC1zdGFydFwiKSxcbiAgICAgICAgaWQ6IHo3LnN0cmluZygpLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKClcbiAgICAgIH0pLFxuICAgICAgejcuc3RyaWN0T2JqZWN0KHtcbiAgICAgICAgdHlwZTogejcubGl0ZXJhbChcInRleHQtZGVsdGFcIiksXG4gICAgICAgIGlkOiB6Ny5zdHJpbmcoKSxcbiAgICAgICAgZGVsdGE6IHo3LnN0cmluZygpLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKClcbiAgICAgIH0pLFxuICAgICAgejcuc3RyaWN0T2JqZWN0KHtcbiAgICAgICAgdHlwZTogejcubGl0ZXJhbChcInRleHQtZW5kXCIpLFxuICAgICAgICBpZDogejcuc3RyaW5nKCksXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxuICAgICAgfSksXG4gICAgICB6Ny5zdHJpY3RPYmplY3Qoe1xuICAgICAgICB0eXBlOiB6Ny5saXRlcmFsKFwiZXJyb3JcIiksXG4gICAgICAgIGVycm9yVGV4dDogejcuc3RyaW5nKClcbiAgICAgIH0pLFxuICAgICAgejcuc3RyaWN0T2JqZWN0KHtcbiAgICAgICAgdHlwZTogejcubGl0ZXJhbChcInRvb2wtaW5wdXQtc3RhcnRcIiksXG4gICAgICAgIHRvb2xDYWxsSWQ6IHo3LnN0cmluZygpLFxuICAgICAgICB0b29sTmFtZTogejcuc3RyaW5nKCksXG4gICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHo3LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgIGR5bmFtaWM6IHo3LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICB0aXRsZTogejcuc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgICAgfSksXG4gICAgICB6Ny5zdHJpY3RPYmplY3Qoe1xuICAgICAgICB0eXBlOiB6Ny5saXRlcmFsKFwidG9vbC1pbnB1dC1kZWx0YVwiKSxcbiAgICAgICAgdG9vbENhbGxJZDogejcuc3RyaW5nKCksXG4gICAgICAgIGlucHV0VGV4dERlbHRhOiB6Ny5zdHJpbmcoKVxuICAgICAgfSksXG4gICAgICB6Ny5zdHJpY3RPYmplY3Qoe1xuICAgICAgICB0eXBlOiB6Ny5saXRlcmFsKFwidG9vbC1pbnB1dC1hdmFpbGFibGVcIiksXG4gICAgICAgIHRvb2xDYWxsSWQ6IHo3LnN0cmluZygpLFxuICAgICAgICB0b29sTmFtZTogejcuc3RyaW5nKCksXG4gICAgICAgIGlucHV0OiB6Ny51bmtub3duKCksXG4gICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHo3LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgIGR5bmFtaWM6IHo3LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICB0aXRsZTogejcuc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgICAgfSksXG4gICAgICB6Ny5zdHJpY3RPYmplY3Qoe1xuICAgICAgICB0eXBlOiB6Ny5saXRlcmFsKFwidG9vbC1pbnB1dC1lcnJvclwiKSxcbiAgICAgICAgdG9vbENhbGxJZDogejcuc3RyaW5nKCksXG4gICAgICAgIHRvb2xOYW1lOiB6Ny5zdHJpbmcoKSxcbiAgICAgICAgaW5wdXQ6IHo3LnVua25vd24oKSxcbiAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogejcuYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgZHluYW1pYzogejcuYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgIGVycm9yVGV4dDogejcuc3RyaW5nKCksXG4gICAgICAgIHRpdGxlOiB6Ny5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICB9KSxcbiAgICAgIHo3LnN0cmljdE9iamVjdCh7XG4gICAgICAgIHR5cGU6IHo3LmxpdGVyYWwoXCJ0b29sLWFwcHJvdmFsLXJlcXVlc3RcIiksXG4gICAgICAgIGFwcHJvdmFsSWQ6IHo3LnN0cmluZygpLFxuICAgICAgICB0b29sQ2FsbElkOiB6Ny5zdHJpbmcoKVxuICAgICAgfSksXG4gICAgICB6Ny5zdHJpY3RPYmplY3Qoe1xuICAgICAgICB0eXBlOiB6Ny5saXRlcmFsKFwidG9vbC1vdXRwdXQtYXZhaWxhYmxlXCIpLFxuICAgICAgICB0b29sQ2FsbElkOiB6Ny5zdHJpbmcoKSxcbiAgICAgICAgb3V0cHV0OiB6Ny51bmtub3duKCksXG4gICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHo3LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgIGR5bmFtaWM6IHo3LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICBwcmVsaW1pbmFyeTogejcuYm9vbGVhbigpLm9wdGlvbmFsKClcbiAgICAgIH0pLFxuICAgICAgejcuc3RyaWN0T2JqZWN0KHtcbiAgICAgICAgdHlwZTogejcubGl0ZXJhbChcInRvb2wtb3V0cHV0LWVycm9yXCIpLFxuICAgICAgICB0b29sQ2FsbElkOiB6Ny5zdHJpbmcoKSxcbiAgICAgICAgZXJyb3JUZXh0OiB6Ny5zdHJpbmcoKSxcbiAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogejcuYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgZHluYW1pYzogejcuYm9vbGVhbigpLm9wdGlvbmFsKClcbiAgICAgIH0pLFxuICAgICAgejcuc3RyaWN0T2JqZWN0KHtcbiAgICAgICAgdHlwZTogejcubGl0ZXJhbChcInRvb2wtb3V0cHV0LWRlbmllZFwiKSxcbiAgICAgICAgdG9vbENhbGxJZDogejcuc3RyaW5nKClcbiAgICAgIH0pLFxuICAgICAgejcuc3RyaWN0T2JqZWN0KHtcbiAgICAgICAgdHlwZTogejcubGl0ZXJhbChcInJlYXNvbmluZy1zdGFydFwiKSxcbiAgICAgICAgaWQ6IHo3LnN0cmluZygpLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKClcbiAgICAgIH0pLFxuICAgICAgejcuc3RyaWN0T2JqZWN0KHtcbiAgICAgICAgdHlwZTogejcubGl0ZXJhbChcInJlYXNvbmluZy1kZWx0YVwiKSxcbiAgICAgICAgaWQ6IHo3LnN0cmluZygpLFxuICAgICAgICBkZWx0YTogejcuc3RyaW5nKCksXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxuICAgICAgfSksXG4gICAgICB6Ny5zdHJpY3RPYmplY3Qoe1xuICAgICAgICB0eXBlOiB6Ny5saXRlcmFsKFwicmVhc29uaW5nLWVuZFwiKSxcbiAgICAgICAgaWQ6IHo3LnN0cmluZygpLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKClcbiAgICAgIH0pLFxuICAgICAgejcuc3RyaWN0T2JqZWN0KHtcbiAgICAgICAgdHlwZTogejcubGl0ZXJhbChcInNvdXJjZS11cmxcIiksXG4gICAgICAgIHNvdXJjZUlkOiB6Ny5zdHJpbmcoKSxcbiAgICAgICAgdXJsOiB6Ny5zdHJpbmcoKSxcbiAgICAgICAgdGl0bGU6IHo3LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxuICAgICAgfSksXG4gICAgICB6Ny5zdHJpY3RPYmplY3Qoe1xuICAgICAgICB0eXBlOiB6Ny5saXRlcmFsKFwic291cmNlLWRvY3VtZW50XCIpLFxuICAgICAgICBzb3VyY2VJZDogejcuc3RyaW5nKCksXG4gICAgICAgIG1lZGlhVHlwZTogejcuc3RyaW5nKCksXG4gICAgICAgIHRpdGxlOiB6Ny5zdHJpbmcoKSxcbiAgICAgICAgZmlsZW5hbWU6IHo3LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxuICAgICAgfSksXG4gICAgICB6Ny5zdHJpY3RPYmplY3Qoe1xuICAgICAgICB0eXBlOiB6Ny5saXRlcmFsKFwiZmlsZVwiKSxcbiAgICAgICAgdXJsOiB6Ny5zdHJpbmcoKSxcbiAgICAgICAgbWVkaWFUeXBlOiB6Ny5zdHJpbmcoKSxcbiAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpXG4gICAgICB9KSxcbiAgICAgIHo3LnN0cmljdE9iamVjdCh7XG4gICAgICAgIHR5cGU6IHo3LmN1c3RvbShcbiAgICAgICAgICAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5zdGFydHNXaXRoKFwiZGF0YS1cIiksXG4gICAgICAgICAgeyBtZXNzYWdlOiAnVHlwZSBtdXN0IHN0YXJ0IHdpdGggXCJkYXRhLVwiJyB9XG4gICAgICAgICksXG4gICAgICAgIGlkOiB6Ny5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICBkYXRhOiB6Ny51bmtub3duKCksXG4gICAgICAgIHRyYW5zaWVudDogejcuYm9vbGVhbigpLm9wdGlvbmFsKClcbiAgICAgIH0pLFxuICAgICAgejcuc3RyaWN0T2JqZWN0KHtcbiAgICAgICAgdHlwZTogejcubGl0ZXJhbChcInN0YXJ0LXN0ZXBcIilcbiAgICAgIH0pLFxuICAgICAgejcuc3RyaWN0T2JqZWN0KHtcbiAgICAgICAgdHlwZTogejcubGl0ZXJhbChcImZpbmlzaC1zdGVwXCIpXG4gICAgICB9KSxcbiAgICAgIHo3LnN0cmljdE9iamVjdCh7XG4gICAgICAgIHR5cGU6IHo3LmxpdGVyYWwoXCJzdGFydFwiKSxcbiAgICAgICAgbWVzc2FnZUlkOiB6Ny5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICBtZXNzYWdlTWV0YWRhdGE6IHo3LnVua25vd24oKS5vcHRpb25hbCgpXG4gICAgICB9KSxcbiAgICAgIHo3LnN0cmljdE9iamVjdCh7XG4gICAgICAgIHR5cGU6IHo3LmxpdGVyYWwoXCJmaW5pc2hcIiksXG4gICAgICAgIGZpbmlzaFJlYXNvbjogejcuZW51bShbXG4gICAgICAgICAgXCJzdG9wXCIsXG4gICAgICAgICAgXCJsZW5ndGhcIixcbiAgICAgICAgICBcImNvbnRlbnQtZmlsdGVyXCIsXG4gICAgICAgICAgXCJ0b29sLWNhbGxzXCIsXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICAgIFwib3RoZXJcIlxuICAgICAgICBdKS5vcHRpb25hbCgpLFxuICAgICAgICBtZXNzYWdlTWV0YWRhdGE6IHo3LnVua25vd24oKS5vcHRpb25hbCgpXG4gICAgICB9KSxcbiAgICAgIHo3LnN0cmljdE9iamVjdCh7XG4gICAgICAgIHR5cGU6IHo3LmxpdGVyYWwoXCJhYm9ydFwiKSxcbiAgICAgICAgcmVhc29uOiB6Ny5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICB9KSxcbiAgICAgIHo3LnN0cmljdE9iamVjdCh7XG4gICAgICAgIHR5cGU6IHo3LmxpdGVyYWwoXCJtZXNzYWdlLW1ldGFkYXRhXCIpLFxuICAgICAgICBtZXNzYWdlTWV0YWRhdGE6IHo3LnVua25vd24oKVxuICAgICAgfSlcbiAgICBdKVxuICApXG4pO1xuZnVuY3Rpb24gaXNEYXRhVUlNZXNzYWdlQ2h1bmsoY2h1bmspIHtcbiAgcmV0dXJuIGNodW5rLnR5cGUuc3RhcnRzV2l0aChcImRhdGEtXCIpO1xufVxuXG4vLyBzcmMvdWkvdWktbWVzc2FnZXMudHNcbmZ1bmN0aW9uIGlzRGF0YVVJUGFydChwYXJ0KSB7XG4gIHJldHVybiBwYXJ0LnR5cGUuc3RhcnRzV2l0aChcImRhdGEtXCIpO1xufVxuZnVuY3Rpb24gaXNUZXh0VUlQYXJ0KHBhcnQpIHtcbiAgcmV0dXJuIHBhcnQudHlwZSA9PT0gXCJ0ZXh0XCI7XG59XG5mdW5jdGlvbiBpc0ZpbGVVSVBhcnQocGFydCkge1xuICByZXR1cm4gcGFydC50eXBlID09PSBcImZpbGVcIjtcbn1cbmZ1bmN0aW9uIGlzUmVhc29uaW5nVUlQYXJ0KHBhcnQpIHtcbiAgcmV0dXJuIHBhcnQudHlwZSA9PT0gXCJyZWFzb25pbmdcIjtcbn1cbmZ1bmN0aW9uIGlzU3RhdGljVG9vbFVJUGFydChwYXJ0KSB7XG4gIHJldHVybiBwYXJ0LnR5cGUuc3RhcnRzV2l0aChcInRvb2wtXCIpO1xufVxuZnVuY3Rpb24gaXNEeW5hbWljVG9vbFVJUGFydChwYXJ0KSB7XG4gIHJldHVybiBwYXJ0LnR5cGUgPT09IFwiZHluYW1pYy10b29sXCI7XG59XG5mdW5jdGlvbiBpc1Rvb2xVSVBhcnQocGFydCkge1xuICByZXR1cm4gaXNTdGF0aWNUb29sVUlQYXJ0KHBhcnQpIHx8IGlzRHluYW1pY1Rvb2xVSVBhcnQocGFydCk7XG59XG52YXIgaXNUb29sT3JEeW5hbWljVG9vbFVJUGFydCA9IGlzVG9vbFVJUGFydDtcbmZ1bmN0aW9uIGdldFN0YXRpY1Rvb2xOYW1lKHBhcnQpIHtcbiAgcmV0dXJuIHBhcnQudHlwZS5zcGxpdChcIi1cIikuc2xpY2UoMSkuam9pbihcIi1cIik7XG59XG5mdW5jdGlvbiBnZXRUb29sTmFtZShwYXJ0KSB7XG4gIHJldHVybiBpc0R5bmFtaWNUb29sVUlQYXJ0KHBhcnQpID8gcGFydC50b29sTmFtZSA6IGdldFN0YXRpY1Rvb2xOYW1lKHBhcnQpO1xufVxudmFyIGdldFRvb2xPckR5bmFtaWNUb29sTmFtZSA9IGdldFRvb2xOYW1lO1xuXG4vLyBzcmMvdWkvcHJvY2Vzcy11aS1tZXNzYWdlLXN0cmVhbS50c1xuZnVuY3Rpb24gY3JlYXRlU3RyZWFtaW5nVUlNZXNzYWdlU3RhdGUoe1xuICBsYXN0TWVzc2FnZSxcbiAgbWVzc2FnZUlkXG59KSB7XG4gIHJldHVybiB7XG4gICAgbWVzc2FnZTogKGxhc3RNZXNzYWdlID09IG51bGwgPyB2b2lkIDAgOiBsYXN0TWVzc2FnZS5yb2xlKSA9PT0gXCJhc3Npc3RhbnRcIiA/IGxhc3RNZXNzYWdlIDoge1xuICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgIG1ldGFkYXRhOiB2b2lkIDAsXG4gICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgcGFydHM6IFtdXG4gICAgfSxcbiAgICBhY3RpdmVUZXh0UGFydHM6IHt9LFxuICAgIGFjdGl2ZVJlYXNvbmluZ1BhcnRzOiB7fSxcbiAgICBwYXJ0aWFsVG9vbENhbGxzOiB7fVxuICB9O1xufVxuZnVuY3Rpb24gcHJvY2Vzc1VJTWVzc2FnZVN0cmVhbSh7XG4gIHN0cmVhbSxcbiAgbWVzc2FnZU1ldGFkYXRhU2NoZW1hLFxuICBkYXRhUGFydFNjaGVtYXMsXG4gIHJ1blVwZGF0ZU1lc3NhZ2VKb2IsXG4gIG9uRXJyb3IsXG4gIG9uVG9vbENhbGwsXG4gIG9uRGF0YVxufSkge1xuICByZXR1cm4gc3RyZWFtLnBpcGVUaHJvdWdoKFxuICAgIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgYXN5bmMgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAgIGF3YWl0IHJ1blVwZGF0ZU1lc3NhZ2VKb2IoYXN5bmMgKHsgc3RhdGUsIHdyaXRlIH0pID0+IHtcbiAgICAgICAgICB2YXIgX2EyMSwgX2IsIF9jLCBfZDtcbiAgICAgICAgICBmdW5jdGlvbiBnZXRUb29sSW52b2NhdGlvbih0b29sQ2FsbElkKSB7XG4gICAgICAgICAgICBjb25zdCB0b29sSW52b2NhdGlvbnMgPSBzdGF0ZS5tZXNzYWdlLnBhcnRzLmZpbHRlcihpc1Rvb2xVSVBhcnQpO1xuICAgICAgICAgICAgY29uc3QgdG9vbEludm9jYXRpb24gPSB0b29sSW52b2NhdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgKGludm9jYXRpb24pID0+IGludm9jYXRpb24udG9vbENhbGxJZCA9PT0gdG9vbENhbGxJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0b29sSW52b2NhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBVSU1lc3NhZ2VTdHJlYW1FcnJvcih7XG4gICAgICAgICAgICAgICAgY2h1bmtUeXBlOiBcInRvb2wtaW52b2NhdGlvblwiLFxuICAgICAgICAgICAgICAgIGNodW5rSWQ6IHRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYE5vIHRvb2wgaW52b2NhdGlvbiBmb3VuZCBmb3IgdG9vbCBjYWxsIElEIFwiJHt0b29sQ2FsbElkfVwiLmBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdG9vbEludm9jYXRpb247XG4gICAgICAgICAgfVxuICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVRvb2xQYXJ0KG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciBfYTIyO1xuICAgICAgICAgICAgY29uc3QgcGFydCA9IHN0YXRlLm1lc3NhZ2UucGFydHMuZmluZChcbiAgICAgICAgICAgICAgKHBhcnQyKSA9PiBpc1N0YXRpY1Rvb2xVSVBhcnQocGFydDIpICYmIHBhcnQyLnRvb2xDYWxsSWQgPT09IG9wdGlvbnMudG9vbENhbGxJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGFueU9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgYW55UGFydCA9IHBhcnQ7XG4gICAgICAgICAgICBpZiAocGFydCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHBhcnQuc3RhdGUgPSBvcHRpb25zLnN0YXRlO1xuICAgICAgICAgICAgICBhbnlQYXJ0LmlucHV0ID0gYW55T3B0aW9ucy5pbnB1dDtcbiAgICAgICAgICAgICAgYW55UGFydC5vdXRwdXQgPSBhbnlPcHRpb25zLm91dHB1dDtcbiAgICAgICAgICAgICAgYW55UGFydC5lcnJvclRleHQgPSBhbnlPcHRpb25zLmVycm9yVGV4dDtcbiAgICAgICAgICAgICAgYW55UGFydC5yYXdJbnB1dCA9IGFueU9wdGlvbnMucmF3SW5wdXQ7XG4gICAgICAgICAgICAgIGFueVBhcnQucHJlbGltaW5hcnkgPSBhbnlPcHRpb25zLnByZWxpbWluYXJ5O1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aXRsZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgYW55UGFydC50aXRsZSA9IG9wdGlvbnMudGl0bGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYW55UGFydC5wcm92aWRlckV4ZWN1dGVkID0gKF9hMjIgPSBhbnlPcHRpb25zLnByb3ZpZGVyRXhlY3V0ZWQpICE9IG51bGwgPyBfYTIyIDogcGFydC5wcm92aWRlckV4ZWN1dGVkO1xuICAgICAgICAgICAgICBjb25zdCBwcm92aWRlck1ldGFkYXRhID0gYW55T3B0aW9ucy5wcm92aWRlck1ldGFkYXRhO1xuICAgICAgICAgICAgICBpZiAocHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdGUgPT09IFwib3V0cHV0LWF2YWlsYWJsZVwiIHx8IG9wdGlvbnMuc3RhdGUgPT09IFwib3V0cHV0LWVycm9yXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdFBhcnQgPSBwYXJ0O1xuICAgICAgICAgICAgICAgICAgcmVzdWx0UGFydC5yZXN1bHRQcm92aWRlck1ldGFkYXRhID0gcHJvdmlkZXJNZXRhZGF0YTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGFydC5jYWxsUHJvdmlkZXJNZXRhZGF0YSA9IHByb3ZpZGVyTWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGF0ZS5tZXNzYWdlLnBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IGB0b29sLSR7b3B0aW9ucy50b29sTmFtZX1gLFxuICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IG9wdGlvbnMudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICBzdGF0ZTogb3B0aW9ucy5zdGF0ZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgICAgICAgICAgICBpbnB1dDogYW55T3B0aW9ucy5pbnB1dCxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IGFueU9wdGlvbnMub3V0cHV0LFxuICAgICAgICAgICAgICAgIHJhd0lucHV0OiBhbnlPcHRpb25zLnJhd0lucHV0LFxuICAgICAgICAgICAgICAgIGVycm9yVGV4dDogYW55T3B0aW9ucy5lcnJvclRleHQsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogYW55T3B0aW9ucy5wcm92aWRlckV4ZWN1dGVkLFxuICAgICAgICAgICAgICAgIHByZWxpbWluYXJ5OiBhbnlPcHRpb25zLnByZWxpbWluYXJ5LFxuICAgICAgICAgICAgICAgIC4uLmFueU9wdGlvbnMucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsICYmIChvcHRpb25zLnN0YXRlID09PSBcIm91dHB1dC1hdmFpbGFibGVcIiB8fCBvcHRpb25zLnN0YXRlID09PSBcIm91dHB1dC1lcnJvclwiKSA/IHsgcmVzdWx0UHJvdmlkZXJNZXRhZGF0YTogYW55T3B0aW9ucy5wcm92aWRlck1ldGFkYXRhIH0gOiB7fSxcbiAgICAgICAgICAgICAgICAuLi5hbnlPcHRpb25zLnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCAmJiAhKG9wdGlvbnMuc3RhdGUgPT09IFwib3V0cHV0LWF2YWlsYWJsZVwiIHx8IG9wdGlvbnMuc3RhdGUgPT09IFwib3V0cHV0LWVycm9yXCIpID8geyBjYWxsUHJvdmlkZXJNZXRhZGF0YTogYW55T3B0aW9ucy5wcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZnVuY3Rpb24gdXBkYXRlRHluYW1pY1Rvb2xQYXJ0KG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciBfYTIyLCBfYjI7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gc3RhdGUubWVzc2FnZS5wYXJ0cy5maW5kKFxuICAgICAgICAgICAgICAocGFydDIpID0+IHBhcnQyLnR5cGUgPT09IFwiZHluYW1pYy10b29sXCIgJiYgcGFydDIudG9vbENhbGxJZCA9PT0gb3B0aW9ucy50b29sQ2FsbElkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgYW55T3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBhbnlQYXJ0ID0gcGFydDtcbiAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgcGFydC5zdGF0ZSA9IG9wdGlvbnMuc3RhdGU7XG4gICAgICAgICAgICAgIGFueVBhcnQudG9vbE5hbWUgPSBvcHRpb25zLnRvb2xOYW1lO1xuICAgICAgICAgICAgICBhbnlQYXJ0LmlucHV0ID0gYW55T3B0aW9ucy5pbnB1dDtcbiAgICAgICAgICAgICAgYW55UGFydC5vdXRwdXQgPSBhbnlPcHRpb25zLm91dHB1dDtcbiAgICAgICAgICAgICAgYW55UGFydC5lcnJvclRleHQgPSBhbnlPcHRpb25zLmVycm9yVGV4dDtcbiAgICAgICAgICAgICAgYW55UGFydC5yYXdJbnB1dCA9IChfYTIyID0gYW55T3B0aW9ucy5yYXdJbnB1dCkgIT0gbnVsbCA/IF9hMjIgOiBhbnlQYXJ0LnJhd0lucHV0O1xuICAgICAgICAgICAgICBhbnlQYXJ0LnByZWxpbWluYXJ5ID0gYW55T3B0aW9ucy5wcmVsaW1pbmFyeTtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGl0bGUgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIGFueVBhcnQudGl0bGUgPSBvcHRpb25zLnRpdGxlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGFueVBhcnQucHJvdmlkZXJFeGVjdXRlZCA9IChfYjIgPSBhbnlPcHRpb25zLnByb3ZpZGVyRXhlY3V0ZWQpICE9IG51bGwgPyBfYjIgOiBwYXJ0LnByb3ZpZGVyRXhlY3V0ZWQ7XG4gICAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVyTWV0YWRhdGEgPSBhbnlPcHRpb25zLnByb3ZpZGVyTWV0YWRhdGE7XG4gICAgICAgICAgICAgIGlmIChwcm92aWRlck1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zdGF0ZSA9PT0gXCJvdXRwdXQtYXZhaWxhYmxlXCIgfHwgb3B0aW9ucy5zdGF0ZSA9PT0gXCJvdXRwdXQtZXJyb3JcIikge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0UGFydCA9IHBhcnQ7XG4gICAgICAgICAgICAgICAgICByZXN1bHRQYXJ0LnJlc3VsdFByb3ZpZGVyTWV0YWRhdGEgPSBwcm92aWRlck1ldGFkYXRhO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwYXJ0LmNhbGxQcm92aWRlck1ldGFkYXRhID0gcHJvdmlkZXJNZXRhZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlLm1lc3NhZ2UucGFydHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJkeW5hbWljLXRvb2xcIixcbiAgICAgICAgICAgICAgICB0b29sTmFtZTogb3B0aW9ucy50b29sTmFtZSxcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBvcHRpb25zLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgc3RhdGU6IG9wdGlvbnMuc3RhdGUsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGFueU9wdGlvbnMuaW5wdXQsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiBhbnlPcHRpb25zLm91dHB1dCxcbiAgICAgICAgICAgICAgICBlcnJvclRleHQ6IGFueU9wdGlvbnMuZXJyb3JUZXh0LFxuICAgICAgICAgICAgICAgIHByZWxpbWluYXJ5OiBhbnlPcHRpb25zLnByZWxpbWluYXJ5LFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IGFueU9wdGlvbnMucHJvdmlkZXJFeGVjdXRlZCxcbiAgICAgICAgICAgICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgICAgICAgICAgICAuLi5hbnlPcHRpb25zLnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCAmJiAob3B0aW9ucy5zdGF0ZSA9PT0gXCJvdXRwdXQtYXZhaWxhYmxlXCIgfHwgb3B0aW9ucy5zdGF0ZSA9PT0gXCJvdXRwdXQtZXJyb3JcIikgPyB7IHJlc3VsdFByb3ZpZGVyTWV0YWRhdGE6IGFueU9wdGlvbnMucHJvdmlkZXJNZXRhZGF0YSB9IDoge30sXG4gICAgICAgICAgICAgICAgLi4uYW55T3B0aW9ucy5wcm92aWRlck1ldGFkYXRhICE9IG51bGwgJiYgIShvcHRpb25zLnN0YXRlID09PSBcIm91dHB1dC1hdmFpbGFibGVcIiB8fCBvcHRpb25zLnN0YXRlID09PSBcIm91dHB1dC1lcnJvclwiKSA/IHsgY2FsbFByb3ZpZGVyTWV0YWRhdGE6IGFueU9wdGlvbnMucHJvdmlkZXJNZXRhZGF0YSB9IDoge31cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU1lc3NhZ2VNZXRhZGF0YShtZXRhZGF0YSkge1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkTWV0YWRhdGEgPSBzdGF0ZS5tZXNzYWdlLm1ldGFkYXRhICE9IG51bGwgPyBtZXJnZU9iamVjdHMoc3RhdGUubWVzc2FnZS5tZXRhZGF0YSwgbWV0YWRhdGEpIDogbWV0YWRhdGE7XG4gICAgICAgICAgICAgIGlmIChtZXNzYWdlTWV0YWRhdGFTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHZhbGlkYXRlVHlwZXMoe1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IG1lcmdlZE1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgc2NoZW1hOiBtZXNzYWdlTWV0YWRhdGFTY2hlbWEsXG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBcIm1lc3NhZ2UubWV0YWRhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQ6IHN0YXRlLm1lc3NhZ2UuaWRcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdGF0ZS5tZXNzYWdlLm1ldGFkYXRhID0gbWVyZ2VkTWV0YWRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXRjaCAoY2h1bmsudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInRleHQtc3RhcnRcIjoge1xuICAgICAgICAgICAgICBjb25zdCB0ZXh0UGFydCA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIlwiLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IGNodW5rLnByb3ZpZGVyTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgc3RhdGU6IFwic3RyZWFtaW5nXCJcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgc3RhdGUuYWN0aXZlVGV4dFBhcnRzW2NodW5rLmlkXSA9IHRleHRQYXJ0O1xuICAgICAgICAgICAgICBzdGF0ZS5tZXNzYWdlLnBhcnRzLnB1c2godGV4dFBhcnQpO1xuICAgICAgICAgICAgICB3cml0ZSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0LWRlbHRhXCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dFBhcnQgPSBzdGF0ZS5hY3RpdmVUZXh0UGFydHNbY2h1bmsuaWRdO1xuICAgICAgICAgICAgICBpZiAodGV4dFBhcnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVSU1lc3NhZ2VTdHJlYW1FcnJvcih7XG4gICAgICAgICAgICAgICAgICBjaHVua1R5cGU6IFwidGV4dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgY2h1bmtJZDogY2h1bmsuaWQsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgUmVjZWl2ZWQgdGV4dC1kZWx0YSBmb3IgbWlzc2luZyB0ZXh0IHBhcnQgd2l0aCBJRCBcIiR7Y2h1bmsuaWR9XCIuIEVuc3VyZSBhIFwidGV4dC1zdGFydFwiIGNodW5rIGlzIHNlbnQgYmVmb3JlIGFueSBcInRleHQtZGVsdGFcIiBjaHVua3MuYFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRleHRQYXJ0LnRleHQgKz0gY2h1bmsuZGVsdGE7XG4gICAgICAgICAgICAgIHRleHRQYXJ0LnByb3ZpZGVyTWV0YWRhdGEgPSAoX2EyMSA9IGNodW5rLnByb3ZpZGVyTWV0YWRhdGEpICE9IG51bGwgPyBfYTIxIDogdGV4dFBhcnQucHJvdmlkZXJNZXRhZGF0YTtcbiAgICAgICAgICAgICAgd3JpdGUoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidGV4dC1lbmRcIjoge1xuICAgICAgICAgICAgICBjb25zdCB0ZXh0UGFydCA9IHN0YXRlLmFjdGl2ZVRleHRQYXJ0c1tjaHVuay5pZF07XG4gICAgICAgICAgICAgIGlmICh0ZXh0UGFydCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVJTWVzc2FnZVN0cmVhbUVycm9yKHtcbiAgICAgICAgICAgICAgICAgIGNodW5rVHlwZTogXCJ0ZXh0LWVuZFwiLFxuICAgICAgICAgICAgICAgICAgY2h1bmtJZDogY2h1bmsuaWQsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgUmVjZWl2ZWQgdGV4dC1lbmQgZm9yIG1pc3NpbmcgdGV4dCBwYXJ0IHdpdGggSUQgXCIke2NodW5rLmlkfVwiLiBFbnN1cmUgYSBcInRleHQtc3RhcnRcIiBjaHVuayBpcyBzZW50IGJlZm9yZSBhbnkgXCJ0ZXh0LWVuZFwiIGNodW5rcy5gXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGV4dFBhcnQuc3RhdGUgPSBcImRvbmVcIjtcbiAgICAgICAgICAgICAgdGV4dFBhcnQucHJvdmlkZXJNZXRhZGF0YSA9IChfYiA9IGNodW5rLnByb3ZpZGVyTWV0YWRhdGEpICE9IG51bGwgPyBfYiA6IHRleHRQYXJ0LnByb3ZpZGVyTWV0YWRhdGE7XG4gICAgICAgICAgICAgIGRlbGV0ZSBzdGF0ZS5hY3RpdmVUZXh0UGFydHNbY2h1bmsuaWRdO1xuICAgICAgICAgICAgICB3cml0ZSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJyZWFzb25pbmctc3RhcnRcIjoge1xuICAgICAgICAgICAgICBjb25zdCByZWFzb25pbmdQYXJ0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwicmVhc29uaW5nXCIsXG4gICAgICAgICAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBjaHVuay5wcm92aWRlck1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHN0YXRlOiBcInN0cmVhbWluZ1wiXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHN0YXRlLmFjdGl2ZVJlYXNvbmluZ1BhcnRzW2NodW5rLmlkXSA9IHJlYXNvbmluZ1BhcnQ7XG4gICAgICAgICAgICAgIHN0YXRlLm1lc3NhZ2UucGFydHMucHVzaChyZWFzb25pbmdQYXJ0KTtcbiAgICAgICAgICAgICAgd3JpdGUoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmVhc29uaW5nLWRlbHRhXCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVhc29uaW5nUGFydCA9IHN0YXRlLmFjdGl2ZVJlYXNvbmluZ1BhcnRzW2NodW5rLmlkXTtcbiAgICAgICAgICAgICAgaWYgKHJlYXNvbmluZ1BhcnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVSU1lc3NhZ2VTdHJlYW1FcnJvcih7XG4gICAgICAgICAgICAgICAgICBjaHVua1R5cGU6IFwicmVhc29uaW5nLWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgICBjaHVua0lkOiBjaHVuay5pZCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBSZWNlaXZlZCByZWFzb25pbmctZGVsdGEgZm9yIG1pc3NpbmcgcmVhc29uaW5nIHBhcnQgd2l0aCBJRCBcIiR7Y2h1bmsuaWR9XCIuIEVuc3VyZSBhIFwicmVhc29uaW5nLXN0YXJ0XCIgY2h1bmsgaXMgc2VudCBiZWZvcmUgYW55IFwicmVhc29uaW5nLWRlbHRhXCIgY2h1bmtzLmBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWFzb25pbmdQYXJ0LnRleHQgKz0gY2h1bmsuZGVsdGE7XG4gICAgICAgICAgICAgIHJlYXNvbmluZ1BhcnQucHJvdmlkZXJNZXRhZGF0YSA9IChfYyA9IGNodW5rLnByb3ZpZGVyTWV0YWRhdGEpICE9IG51bGwgPyBfYyA6IHJlYXNvbmluZ1BhcnQucHJvdmlkZXJNZXRhZGF0YTtcbiAgICAgICAgICAgICAgd3JpdGUoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmVhc29uaW5nLWVuZFwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlYXNvbmluZ1BhcnQgPSBzdGF0ZS5hY3RpdmVSZWFzb25pbmdQYXJ0c1tjaHVuay5pZF07XG4gICAgICAgICAgICAgIGlmIChyZWFzb25pbmdQYXJ0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVUlNZXNzYWdlU3RyZWFtRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgY2h1bmtUeXBlOiBcInJlYXNvbmluZy1lbmRcIixcbiAgICAgICAgICAgICAgICAgIGNodW5rSWQ6IGNodW5rLmlkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYFJlY2VpdmVkIHJlYXNvbmluZy1lbmQgZm9yIG1pc3NpbmcgcmVhc29uaW5nIHBhcnQgd2l0aCBJRCBcIiR7Y2h1bmsuaWR9XCIuIEVuc3VyZSBhIFwicmVhc29uaW5nLXN0YXJ0XCIgY2h1bmsgaXMgc2VudCBiZWZvcmUgYW55IFwicmVhc29uaW5nLWVuZFwiIGNodW5rcy5gXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVhc29uaW5nUGFydC5wcm92aWRlck1ldGFkYXRhID0gKF9kID0gY2h1bmsucHJvdmlkZXJNZXRhZGF0YSkgIT0gbnVsbCA/IF9kIDogcmVhc29uaW5nUGFydC5wcm92aWRlck1ldGFkYXRhO1xuICAgICAgICAgICAgICByZWFzb25pbmdQYXJ0LnN0YXRlID0gXCJkb25lXCI7XG4gICAgICAgICAgICAgIGRlbGV0ZSBzdGF0ZS5hY3RpdmVSZWFzb25pbmdQYXJ0c1tjaHVuay5pZF07XG4gICAgICAgICAgICAgIHdyaXRlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjoge1xuICAgICAgICAgICAgICBzdGF0ZS5tZXNzYWdlLnBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogY2h1bmsubWVkaWFUeXBlLFxuICAgICAgICAgICAgICAgIHVybDogY2h1bmsudXJsLFxuICAgICAgICAgICAgICAgIC4uLmNodW5rLnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCA/IHsgcHJvdmlkZXJNZXRhZGF0YTogY2h1bmsucHJvdmlkZXJNZXRhZGF0YSB9IDoge31cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHdyaXRlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInNvdXJjZS11cmxcIjoge1xuICAgICAgICAgICAgICBzdGF0ZS5tZXNzYWdlLnBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwic291cmNlLXVybFwiLFxuICAgICAgICAgICAgICAgIHNvdXJjZUlkOiBjaHVuay5zb3VyY2VJZCxcbiAgICAgICAgICAgICAgICB1cmw6IGNodW5rLnVybCxcbiAgICAgICAgICAgICAgICB0aXRsZTogY2h1bmsudGl0bGUsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogY2h1bmsucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgd3JpdGUoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwic291cmNlLWRvY3VtZW50XCI6IHtcbiAgICAgICAgICAgICAgc3RhdGUubWVzc2FnZS5wYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInNvdXJjZS1kb2N1bWVudFwiLFxuICAgICAgICAgICAgICAgIHNvdXJjZUlkOiBjaHVuay5zb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBtZWRpYVR5cGU6IGNodW5rLm1lZGlhVHlwZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogY2h1bmsudGl0bGUsXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IGNodW5rLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IGNodW5rLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHdyaXRlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInRvb2wtaW5wdXQtc3RhcnRcIjoge1xuICAgICAgICAgICAgICBjb25zdCB0b29sSW52b2NhdGlvbnMgPSBzdGF0ZS5tZXNzYWdlLnBhcnRzLmZpbHRlcihpc1N0YXRpY1Rvb2xVSVBhcnQpO1xuICAgICAgICAgICAgICBzdGF0ZS5wYXJ0aWFsVG9vbENhbGxzW2NodW5rLnRvb2xDYWxsSWRdID0ge1xuICAgICAgICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgdG9vbE5hbWU6IGNodW5rLnRvb2xOYW1lLFxuICAgICAgICAgICAgICAgIGluZGV4OiB0b29sSW52b2NhdGlvbnMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGR5bmFtaWM6IGNodW5rLmR5bmFtaWMsXG4gICAgICAgICAgICAgICAgdGl0bGU6IGNodW5rLnRpdGxlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGlmIChjaHVuay5keW5hbWljKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlRHluYW1pY1Rvb2xQYXJ0KHtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGNodW5rLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogY2h1bmsudG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICBzdGF0ZTogXCJpbnB1dC1zdHJlYW1pbmdcIixcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiBjaHVuay5wcm92aWRlckV4ZWN1dGVkLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IGNodW5rLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogY2h1bmsucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVRvb2xQYXJ0KHtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGNodW5rLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogY2h1bmsudG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICBzdGF0ZTogXCJpbnB1dC1zdHJlYW1pbmdcIixcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiBjaHVuay5wcm92aWRlckV4ZWN1dGVkLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IGNodW5rLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogY2h1bmsucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdyaXRlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInRvb2wtaW5wdXQtZGVsdGFcIjoge1xuICAgICAgICAgICAgICBjb25zdCBwYXJ0aWFsVG9vbENhbGwgPSBzdGF0ZS5wYXJ0aWFsVG9vbENhbGxzW2NodW5rLnRvb2xDYWxsSWRdO1xuICAgICAgICAgICAgICBpZiAocGFydGlhbFRvb2xDYWxsID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVUlNZXNzYWdlU3RyZWFtRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgY2h1bmtUeXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgIGNodW5rSWQ6IGNodW5rLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgUmVjZWl2ZWQgdG9vbC1pbnB1dC1kZWx0YSBmb3IgbWlzc2luZyB0b29sIGNhbGwgd2l0aCBJRCBcIiR7Y2h1bmsudG9vbENhbGxJZH1cIi4gRW5zdXJlIGEgXCJ0b29sLWlucHV0LXN0YXJ0XCIgY2h1bmsgaXMgc2VudCBiZWZvcmUgYW55IFwidG9vbC1pbnB1dC1kZWx0YVwiIGNodW5rcy5gXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFydGlhbFRvb2xDYWxsLnRleHQgKz0gY2h1bmsuaW5wdXRUZXh0RGVsdGE7XG4gICAgICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IHBhcnRpYWxBcmdzIH0gPSBhd2FpdCBwYXJzZVBhcnRpYWxKc29uKFxuICAgICAgICAgICAgICAgIHBhcnRpYWxUb29sQ2FsbC50ZXh0XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChwYXJ0aWFsVG9vbENhbGwuZHluYW1pYykge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUR5bmFtaWNUb29sUGFydCh7XG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBjaHVuay50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHBhcnRpYWxUb29sQ2FsbC50b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiBcImlucHV0LXN0cmVhbWluZ1wiLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBhcnRpYWxBcmdzLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IHBhcnRpYWxUb29sQ2FsbC50aXRsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVRvb2xQYXJ0KHtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGNodW5rLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogcGFydGlhbFRvb2xDYWxsLnRvb2xOYW1lLFxuICAgICAgICAgICAgICAgICAgc3RhdGU6IFwiaW5wdXQtc3RyZWFtaW5nXCIsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogcGFydGlhbEFyZ3MsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogcGFydGlhbFRvb2xDYWxsLnRpdGxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd3JpdGUoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidG9vbC1pbnB1dC1hdmFpbGFibGVcIjoge1xuICAgICAgICAgICAgICBpZiAoY2h1bmsuZHluYW1pYykge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUR5bmFtaWNUb29sUGFydCh7XG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBjaHVuay50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IGNodW5rLnRvb2xOYW1lLFxuICAgICAgICAgICAgICAgICAgc3RhdGU6IFwiaW5wdXQtYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogY2h1bmsuaW5wdXQsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiBjaHVuay5wcm92aWRlckV4ZWN1dGVkLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogY2h1bmsucHJvdmlkZXJNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiBjaHVuay50aXRsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVRvb2xQYXJ0KHtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGNodW5rLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogY2h1bmsudG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICBzdGF0ZTogXCJpbnB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBjaHVuay5pbnB1dCxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IGNodW5rLnByb3ZpZGVyRXhlY3V0ZWQsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBjaHVuay5wcm92aWRlck1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IGNodW5rLnRpdGxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd3JpdGUoKTtcbiAgICAgICAgICAgICAgaWYgKG9uVG9vbENhbGwgJiYgIWNodW5rLnByb3ZpZGVyRXhlY3V0ZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBvblRvb2xDYWxsKHtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsOiBjaHVua1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInRvb2wtaW5wdXQtZXJyb3JcIjoge1xuICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1BhcnQgPSBzdGF0ZS5tZXNzYWdlLnBhcnRzLmZpbHRlcihpc1Rvb2xVSVBhcnQpLmZpbmQoKHApID0+IHAudG9vbENhbGxJZCA9PT0gY2h1bmsudG9vbENhbGxJZCk7XG4gICAgICAgICAgICAgIGNvbnN0IGlzRHluYW1pYyA9IGV4aXN0aW5nUGFydCAhPSBudWxsID8gZXhpc3RpbmdQYXJ0LnR5cGUgPT09IFwiZHluYW1pYy10b29sXCIgOiAhIWNodW5rLmR5bmFtaWM7XG4gICAgICAgICAgICAgIGlmIChpc0R5bmFtaWMpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVEeW5hbWljVG9vbFBhcnQoe1xuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogY2h1bmsudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiBjaHVuay50b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiBcIm91dHB1dC1lcnJvclwiLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IGNodW5rLmlucHV0LFxuICAgICAgICAgICAgICAgICAgZXJyb3JUZXh0OiBjaHVuay5lcnJvclRleHQsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiBjaHVuay5wcm92aWRlckV4ZWN1dGVkLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogY2h1bmsucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVRvb2xQYXJ0KHtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGNodW5rLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogY2h1bmsudG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICBzdGF0ZTogXCJvdXRwdXQtZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICByYXdJbnB1dDogY2h1bmsuaW5wdXQsXG4gICAgICAgICAgICAgICAgICBlcnJvclRleHQ6IGNodW5rLmVycm9yVGV4dCxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IGNodW5rLnByb3ZpZGVyRXhlY3V0ZWQsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBjaHVuay5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd3JpdGUoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidG9vbC1hcHByb3ZhbC1yZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgdG9vbEludm9jYXRpb24gPSBnZXRUb29sSW52b2NhdGlvbihjaHVuay50b29sQ2FsbElkKTtcbiAgICAgICAgICAgICAgdG9vbEludm9jYXRpb24uc3RhdGUgPSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiO1xuICAgICAgICAgICAgICB0b29sSW52b2NhdGlvbi5hcHByb3ZhbCA9IHsgaWQ6IGNodW5rLmFwcHJvdmFsSWQgfTtcbiAgICAgICAgICAgICAgd3JpdGUoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidG9vbC1vdXRwdXQtZGVuaWVkXCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgdG9vbEludm9jYXRpb24gPSBnZXRUb29sSW52b2NhdGlvbihjaHVuay50b29sQ2FsbElkKTtcbiAgICAgICAgICAgICAgdG9vbEludm9jYXRpb24uc3RhdGUgPSBcIm91dHB1dC1kZW5pZWRcIjtcbiAgICAgICAgICAgICAgd3JpdGUoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidG9vbC1vdXRwdXQtYXZhaWxhYmxlXCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgdG9vbEludm9jYXRpb24gPSBnZXRUb29sSW52b2NhdGlvbihjaHVuay50b29sQ2FsbElkKTtcbiAgICAgICAgICAgICAgaWYgKHRvb2xJbnZvY2F0aW9uLnR5cGUgPT09IFwiZHluYW1pYy10b29sXCIpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVEeW5hbWljVG9vbFBhcnQoe1xuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogY2h1bmsudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sSW52b2NhdGlvbi50b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiBcIm91dHB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB0b29sSW52b2NhdGlvbi5pbnB1dCxcbiAgICAgICAgICAgICAgICAgIG91dHB1dDogY2h1bmsub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgcHJlbGltaW5hcnk6IGNodW5rLnByZWxpbWluYXJ5LFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogY2h1bmsucHJvdmlkZXJFeGVjdXRlZCxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IGNodW5rLnByb3ZpZGVyTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogdG9vbEludm9jYXRpb24udGl0bGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVUb29sUGFydCh7XG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBjaHVuay50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IGdldFN0YXRpY1Rvb2xOYW1lKHRvb2xJbnZvY2F0aW9uKSxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiBcIm91dHB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB0b29sSW52b2NhdGlvbi5pbnB1dCxcbiAgICAgICAgICAgICAgICAgIG91dHB1dDogY2h1bmsub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogY2h1bmsucHJvdmlkZXJFeGVjdXRlZCxcbiAgICAgICAgICAgICAgICAgIHByZWxpbWluYXJ5OiBjaHVuay5wcmVsaW1pbmFyeSxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IGNodW5rLnByb3ZpZGVyTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogdG9vbEludm9jYXRpb24udGl0bGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB3cml0ZSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJ0b29sLW91dHB1dC1lcnJvclwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvb2xJbnZvY2F0aW9uID0gZ2V0VG9vbEludm9jYXRpb24oY2h1bmsudG9vbENhbGxJZCk7XG4gICAgICAgICAgICAgIGlmICh0b29sSW52b2NhdGlvbi50eXBlID09PSBcImR5bmFtaWMtdG9vbFwiKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlRHluYW1pY1Rvb2xQYXJ0KHtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGNodW5rLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbEludm9jYXRpb24udG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICBzdGF0ZTogXCJvdXRwdXQtZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB0b29sSW52b2NhdGlvbi5pbnB1dCxcbiAgICAgICAgICAgICAgICAgIGVycm9yVGV4dDogY2h1bmsuZXJyb3JUZXh0LFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogY2h1bmsucHJvdmlkZXJFeGVjdXRlZCxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IGNodW5rLnByb3ZpZGVyTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogdG9vbEludm9jYXRpb24udGl0bGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVUb29sUGFydCh7XG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBjaHVuay50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IGdldFN0YXRpY1Rvb2xOYW1lKHRvb2xJbnZvY2F0aW9uKSxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiBcIm91dHB1dC1lcnJvclwiLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IHRvb2xJbnZvY2F0aW9uLmlucHV0LFxuICAgICAgICAgICAgICAgICAgcmF3SW5wdXQ6IHRvb2xJbnZvY2F0aW9uLnJhd0lucHV0LFxuICAgICAgICAgICAgICAgICAgZXJyb3JUZXh0OiBjaHVuay5lcnJvclRleHQsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiBjaHVuay5wcm92aWRlckV4ZWN1dGVkLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogY2h1bmsucHJvdmlkZXJNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiB0b29sSW52b2NhdGlvbi50aXRsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdyaXRlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInN0YXJ0LXN0ZXBcIjoge1xuICAgICAgICAgICAgICBzdGF0ZS5tZXNzYWdlLnBhcnRzLnB1c2goeyB0eXBlOiBcInN0ZXAtc3RhcnRcIiB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZmluaXNoLXN0ZXBcIjoge1xuICAgICAgICAgICAgICBzdGF0ZS5hY3RpdmVUZXh0UGFydHMgPSB7fTtcbiAgICAgICAgICAgICAgc3RhdGUuYWN0aXZlUmVhc29uaW5nUGFydHMgPSB7fTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwic3RhcnRcIjoge1xuICAgICAgICAgICAgICBpZiAoY2h1bmsubWVzc2FnZUlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5tZXNzYWdlLmlkID0gY2h1bmsubWVzc2FnZUlkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZU1lc3NhZ2VNZXRhZGF0YShjaHVuay5tZXNzYWdlTWV0YWRhdGEpO1xuICAgICAgICAgICAgICBpZiAoY2h1bmsubWVzc2FnZUlkICE9IG51bGwgfHwgY2h1bmsubWVzc2FnZU1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3cml0ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImZpbmlzaFwiOiB7XG4gICAgICAgICAgICAgIGlmIChjaHVuay5maW5pc2hSZWFzb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN0YXRlLmZpbmlzaFJlYXNvbiA9IGNodW5rLmZpbmlzaFJlYXNvbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBhd2FpdCB1cGRhdGVNZXNzYWdlTWV0YWRhdGEoY2h1bmsubWVzc2FnZU1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgaWYgKGNodW5rLm1lc3NhZ2VNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgd3JpdGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlLW1ldGFkYXRhXCI6IHtcbiAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlTWVzc2FnZU1ldGFkYXRhKGNodW5rLm1lc3NhZ2VNZXRhZGF0YSk7XG4gICAgICAgICAgICAgIGlmIChjaHVuay5tZXNzYWdlTWV0YWRhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHdyaXRlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZXJyb3JcIjoge1xuICAgICAgICAgICAgICBvbkVycm9yID09IG51bGwgPyB2b2lkIDAgOiBvbkVycm9yKG5ldyBFcnJvcihjaHVuay5lcnJvclRleHQpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgIGlmIChpc0RhdGFVSU1lc3NhZ2VDaHVuayhjaHVuaykpIHtcbiAgICAgICAgICAgICAgICBpZiAoKGRhdGFQYXJ0U2NoZW1hcyA9PSBudWxsID8gdm9pZCAwIDogZGF0YVBhcnRTY2hlbWFzW2NodW5rLnR5cGVdKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0SWR4ID0gc3RhdGUubWVzc2FnZS5wYXJ0cy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgIChwKSA9PiBcImlkXCIgaW4gcCAmJiBcImRhdGFcIiBpbiBwICYmIHAuaWQgPT09IGNodW5rLmlkICYmIHAudHlwZSA9PT0gY2h1bmsudHlwZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFBhcnRJZHggPSBwYXJ0SWR4ID49IDAgPyBwYXJ0SWR4IDogc3RhdGUubWVzc2FnZS5wYXJ0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB2YWxpZGF0ZVR5cGVzKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNodW5rLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYTogZGF0YVBhcnRTY2hlbWFzW2NodW5rLnR5cGVdLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBtZXNzYWdlLnBhcnRzWyR7YWN0dWFsUGFydElkeH1dLmRhdGFgLFxuICAgICAgICAgICAgICAgICAgICAgIGVudGl0eU5hbWU6IGNodW5rLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQ6IGNodW5rLmlkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhQ2h1bmsgPSBjaHVuaztcbiAgICAgICAgICAgICAgICBpZiAoZGF0YUNodW5rLnRyYW5zaWVudCkge1xuICAgICAgICAgICAgICAgICAgb25EYXRhID09IG51bGwgPyB2b2lkIDAgOiBvbkRhdGEoZGF0YUNodW5rKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1VJUGFydCA9IGRhdGFDaHVuay5pZCAhPSBudWxsID8gc3RhdGUubWVzc2FnZS5wYXJ0cy5maW5kKFxuICAgICAgICAgICAgICAgICAgKGNodW5rQXJnKSA9PiBkYXRhQ2h1bmsudHlwZSA9PT0gY2h1bmtBcmcudHlwZSAmJiBkYXRhQ2h1bmsuaWQgPT09IGNodW5rQXJnLmlkXG4gICAgICAgICAgICAgICAgKSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdVSVBhcnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgZXhpc3RpbmdVSVBhcnQuZGF0YSA9IGRhdGFDaHVuay5kYXRhO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5tZXNzYWdlLnBhcnRzLnB1c2goZGF0YUNodW5rKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb25EYXRhID09IG51bGwgPyB2b2lkIDAgOiBvbkRhdGEoZGF0YUNodW5rKTtcbiAgICAgICAgICAgICAgICB3cml0ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG59XG5cbi8vIHNyYy91aS1tZXNzYWdlLXN0cmVhbS9oYW5kbGUtdWktbWVzc2FnZS1zdHJlYW0tZmluaXNoLnRzXG5mdW5jdGlvbiBoYW5kbGVVSU1lc3NhZ2VTdHJlYW1GaW5pc2goe1xuICBtZXNzYWdlSWQsXG4gIG9yaWdpbmFsTWVzc2FnZXMgPSBbXSxcbiAgb25TdGVwRmluaXNoLFxuICBvbkZpbmlzaCxcbiAgb25FcnJvcixcbiAgc3RyZWFtXG59KSB7XG4gIGxldCBsYXN0TWVzc2FnZSA9IG9yaWdpbmFsTWVzc2FnZXMgPT0gbnVsbCA/IHZvaWQgMCA6IG9yaWdpbmFsTWVzc2FnZXNbb3JpZ2luYWxNZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgaWYgKChsYXN0TWVzc2FnZSA9PSBudWxsID8gdm9pZCAwIDogbGFzdE1lc3NhZ2Uucm9sZSkgIT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICBsYXN0TWVzc2FnZSA9IHZvaWQgMDtcbiAgfSBlbHNlIHtcbiAgICBtZXNzYWdlSWQgPSBsYXN0TWVzc2FnZS5pZDtcbiAgfVxuICBsZXQgaXNBYm9ydGVkID0gZmFsc2U7XG4gIGNvbnN0IGlkSW5qZWN0ZWRTdHJlYW0gPSBzdHJlYW0ucGlwZVRocm91Z2goXG4gICAgbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgaWYgKGNodW5rLnR5cGUgPT09IFwic3RhcnRcIikge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0Q2h1bmsgPSBjaHVuaztcbiAgICAgICAgICBpZiAoc3RhcnRDaHVuay5tZXNzYWdlSWQgPT0gbnVsbCAmJiBtZXNzYWdlSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhcnRDaHVuay5tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaHVuay50eXBlID09PSBcImFib3J0XCIpIHtcbiAgICAgICAgICBpc0Fib3J0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICB9XG4gICAgfSlcbiAgKTtcbiAgaWYgKG9uRmluaXNoID09IG51bGwgJiYgb25TdGVwRmluaXNoID09IG51bGwpIHtcbiAgICByZXR1cm4gaWRJbmplY3RlZFN0cmVhbTtcbiAgfVxuICBjb25zdCBzdGF0ZSA9IGNyZWF0ZVN0cmVhbWluZ1VJTWVzc2FnZVN0YXRlKHtcbiAgICBsYXN0TWVzc2FnZTogbGFzdE1lc3NhZ2UgPyBzdHJ1Y3R1cmVkQ2xvbmUobGFzdE1lc3NhZ2UpIDogdm9pZCAwLFxuICAgIG1lc3NhZ2VJZDogbWVzc2FnZUlkICE9IG51bGwgPyBtZXNzYWdlSWQgOiBcIlwiXG4gICAgLy8gd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBzdHJlYW1cbiAgfSk7XG4gIGNvbnN0IHJ1blVwZGF0ZU1lc3NhZ2VKb2IgPSBhc3luYyAoam9iKSA9PiB7XG4gICAgYXdhaXQgam9iKHsgc3RhdGUsIHdyaXRlOiAoKSA9PiB7XG4gICAgfSB9KTtcbiAgfTtcbiAgbGV0IGZpbmlzaENhbGxlZCA9IGZhbHNlO1xuICBjb25zdCBjYWxsT25GaW5pc2ggPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGZpbmlzaENhbGxlZCB8fCAhb25GaW5pc2gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZmluaXNoQ2FsbGVkID0gdHJ1ZTtcbiAgICBjb25zdCBpc0NvbnRpbnVhdGlvbiA9IHN0YXRlLm1lc3NhZ2UuaWQgPT09IChsYXN0TWVzc2FnZSA9PSBudWxsID8gdm9pZCAwIDogbGFzdE1lc3NhZ2UuaWQpO1xuICAgIGF3YWl0IG9uRmluaXNoKHtcbiAgICAgIGlzQWJvcnRlZCxcbiAgICAgIGlzQ29udGludWF0aW9uLFxuICAgICAgcmVzcG9uc2VNZXNzYWdlOiBzdGF0ZS5tZXNzYWdlLFxuICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgLi4uaXNDb250aW51YXRpb24gPyBvcmlnaW5hbE1lc3NhZ2VzLnNsaWNlKDAsIC0xKSA6IG9yaWdpbmFsTWVzc2FnZXMsXG4gICAgICAgIHN0YXRlLm1lc3NhZ2VcbiAgICAgIF0sXG4gICAgICBmaW5pc2hSZWFzb246IHN0YXRlLmZpbmlzaFJlYXNvblxuICAgIH0pO1xuICB9O1xuICBjb25zdCBjYWxsT25TdGVwRmluaXNoID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghb25TdGVwRmluaXNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzQ29udGludWF0aW9uID0gc3RhdGUubWVzc2FnZS5pZCA9PT0gKGxhc3RNZXNzYWdlID09IG51bGwgPyB2b2lkIDAgOiBsYXN0TWVzc2FnZS5pZCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG9uU3RlcEZpbmlzaCh7XG4gICAgICAgIGlzQ29udGludWF0aW9uLFxuICAgICAgICByZXNwb25zZU1lc3NhZ2U6IHN0cnVjdHVyZWRDbG9uZShzdGF0ZS5tZXNzYWdlKSxcbiAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICAuLi5pc0NvbnRpbnVhdGlvbiA/IG9yaWdpbmFsTWVzc2FnZXMuc2xpY2UoMCwgLTEpIDogb3JpZ2luYWxNZXNzYWdlcyxcbiAgICAgICAgICBzdHJ1Y3R1cmVkQ2xvbmUoc3RhdGUubWVzc2FnZSlcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG9uRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHByb2Nlc3NVSU1lc3NhZ2VTdHJlYW0oe1xuICAgIHN0cmVhbTogaWRJbmplY3RlZFN0cmVhbSxcbiAgICBydW5VcGRhdGVNZXNzYWdlSm9iLFxuICAgIG9uRXJyb3JcbiAgfSkucGlwZVRocm91Z2goXG4gICAgbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICBhc3luYyB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgaWYgKGNodW5rLnR5cGUgPT09IFwiZmluaXNoLXN0ZXBcIikge1xuICAgICAgICAgIGF3YWl0IGNhbGxPblN0ZXBGaW5pc2goKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoY2h1bmspO1xuICAgICAgfSxcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2FuY2VsIGlzIHN0aWxsIG5ldyBhbmQgbWlzc2luZyBmcm9tIHR5cGVzIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UcmFuc2Zvcm1TdHJlYW0jYnJvd3Nlcl9jb21wYXRpYmlsaXR5XG4gICAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgIGF3YWl0IGNhbGxPbkZpbmlzaCgpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGZsdXNoKCkge1xuICAgICAgICBhd2FpdCBjYWxsT25GaW5pc2goKTtcbiAgICAgIH1cbiAgICB9KVxuICApO1xufVxuXG4vLyBzcmMvdWktbWVzc2FnZS1zdHJlYW0vcGlwZS11aS1tZXNzYWdlLXN0cmVhbS10by1yZXNwb25zZS50c1xuZnVuY3Rpb24gcGlwZVVJTWVzc2FnZVN0cmVhbVRvUmVzcG9uc2Uoe1xuICByZXNwb25zZSxcbiAgc3RhdHVzLFxuICBzdGF0dXNUZXh0LFxuICBoZWFkZXJzLFxuICBzdHJlYW0sXG4gIGNvbnN1bWVTc2VTdHJlYW1cbn0pIHtcbiAgbGV0IHNzZVN0cmVhbSA9IHN0cmVhbS5waXBlVGhyb3VnaChuZXcgSnNvblRvU3NlVHJhbnNmb3JtU3RyZWFtKCkpO1xuICBpZiAoY29uc3VtZVNzZVN0cmVhbSkge1xuICAgIGNvbnN0IFtzdHJlYW0xLCBzdHJlYW0yXSA9IHNzZVN0cmVhbS50ZWUoKTtcbiAgICBzc2VTdHJlYW0gPSBzdHJlYW0xO1xuICAgIGNvbnN1bWVTc2VTdHJlYW0oeyBzdHJlYW06IHN0cmVhbTIgfSk7XG4gIH1cbiAgd3JpdGVUb1NlcnZlclJlc3BvbnNlKHtcbiAgICByZXNwb25zZSxcbiAgICBzdGF0dXMsXG4gICAgc3RhdHVzVGV4dCxcbiAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBwcmVwYXJlSGVhZGVycyhoZWFkZXJzLCBVSV9NRVNTQUdFX1NUUkVBTV9IRUFERVJTKS5lbnRyaWVzKClcbiAgICApLFxuICAgIHN0cmVhbTogc3NlU3RyZWFtLnBpcGVUaHJvdWdoKG5ldyBUZXh0RW5jb2RlclN0cmVhbSgpKVxuICB9KTtcbn1cblxuLy8gc3JjL3V0aWwvYXN5bmMtaXRlcmFibGUtc3RyZWFtLnRzXG5mdW5jdGlvbiBjcmVhdGVBc3luY0l0ZXJhYmxlU3RyZWFtKHNvdXJjZSkge1xuICBjb25zdCBzdHJlYW0gPSBzb3VyY2UucGlwZVRocm91Z2gobmV3IFRyYW5zZm9ybVN0cmVhbSgpKTtcbiAgc3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHJlYWRlciA9IHRoaXMuZ2V0UmVhZGVyKCk7XG4gICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gICAgYXN5bmMgZnVuY3Rpb24gY2xlYW51cChjYW5jZWxTdHJlYW0pIHtcbiAgICAgIHZhciBfYTIxO1xuICAgICAgaWYgKGZpbmlzaGVkKVxuICAgICAgICByZXR1cm47XG4gICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoY2FuY2VsU3RyZWFtKSB7XG4gICAgICAgICAgYXdhaXQgKChfYTIxID0gcmVhZGVyLmNhbmNlbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjEuY2FsbChyZWFkZXIpKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIFJlYWRzIHRoZSBuZXh0IGNodW5rIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIG5leHQgSXRlcmF0b3JSZXN1bHQuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB2b2lkIDAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIGF3YWl0IGNsZWFudXAodHJ1ZSk7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHZvaWQgMCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9O1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogTWF5IGJlIGNhbGxlZCBvbiBlYXJseSBleGl0IChlLmcuLCBicmVhayBmcm9tIGZvci1hd2FpdCkgb3IgYWZ0ZXIgY29tcGxldGlvbi5cbiAgICAgICAqIEVuc3VyZXMgdGhlIHN0cmVhbSBpcyBjYW5jZWxsZWQgYW5kIHJlc291cmNlcyBhcmUgcmVsZWFzZWQuXG4gICAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2aW5nIHRvIGEgY29tcGxldGVkIEl0ZXJhdG9yUmVzdWx0LlxuICAgICAgICovXG4gICAgICBhc3luYyByZXR1cm4oKSB7XG4gICAgICAgIGF3YWl0IGNsZWFudXAodHJ1ZSk7XG4gICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB2b2lkIDAgfTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIENhbGxlZCBvbiBlYXJseSBleGl0IHdpdGggZXJyb3IuXG4gICAgICAgKiBFbnN1cmVzIHRoZSBzdHJlYW0gaXMgY2FuY2VsbGVkIGFuZCByZXNvdXJjZXMgYXJlIHJlbGVhc2VkLCB0aGVuIHJldGhyb3dzIHRoZSBlcnJvci5cbiAgICAgICAqIEBwYXJhbSBlcnIgVGhlIGVycm9yIHRvIHRocm93LlxuICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aXRoIHRoZSBwcm92aWRlZCBlcnJvci5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgdGhyb3coZXJyKSB7XG4gICAgICAgIGF3YWl0IGNsZWFudXAodHJ1ZSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICByZXR1cm4gc3RyZWFtO1xufVxuXG4vLyBzcmMvdXRpbC9jb25zdW1lLXN0cmVhbS50c1xuYXN5bmMgZnVuY3Rpb24gY29uc3VtZVN0cmVhbSh7XG4gIHN0cmVhbSxcbiAgb25FcnJvclxufSkge1xuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gIHRyeSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHsgZG9uZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgIGlmIChkb25lKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgb25FcnJvciA9PSBudWxsID8gdm9pZCAwIDogb25FcnJvcihlcnJvcik7XG4gIH0gZmluYWxseSB7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gIH1cbn1cblxuLy8gc3JjL3V0aWwvY3JlYXRlLXJlc29sdmFibGUtcHJvbWlzZS50c1xuZnVuY3Rpb24gY3JlYXRlUmVzb2x2YWJsZVByb21pc2UoKSB7XG4gIGxldCByZXNvbHZlMztcbiAgbGV0IHJlamVjdDtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgIHJlc29sdmUzID0gcmVzO1xuICAgIHJlamVjdCA9IHJlajtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcHJvbWlzZSxcbiAgICByZXNvbHZlOiByZXNvbHZlMyxcbiAgICByZWplY3RcbiAgfTtcbn1cblxuLy8gc3JjL3V0aWwvY3JlYXRlLXN0aXRjaGFibGUtc3RyZWFtLnRzXG5mdW5jdGlvbiBjcmVhdGVTdGl0Y2hhYmxlU3RyZWFtKCkge1xuICBsZXQgaW5uZXJTdHJlYW1SZWFkZXJzID0gW107XG4gIGxldCBjb250cm9sbGVyID0gbnVsbDtcbiAgbGV0IGlzQ2xvc2VkID0gZmFsc2U7XG4gIGxldCB3YWl0Rm9yTmV3U3RyZWFtID0gY3JlYXRlUmVzb2x2YWJsZVByb21pc2UoKTtcbiAgY29uc3QgdGVybWluYXRlID0gKCkgPT4ge1xuICAgIGlzQ2xvc2VkID0gdHJ1ZTtcbiAgICB3YWl0Rm9yTmV3U3RyZWFtLnJlc29sdmUoKTtcbiAgICBpbm5lclN0cmVhbVJlYWRlcnMuZm9yRWFjaCgocmVhZGVyKSA9PiByZWFkZXIuY2FuY2VsKCkpO1xuICAgIGlubmVyU3RyZWFtUmVhZGVycyA9IFtdO1xuICAgIGNvbnRyb2xsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgfTtcbiAgY29uc3QgcHJvY2Vzc1B1bGwgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzQ2xvc2VkICYmIGlubmVyU3RyZWFtUmVhZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRyb2xsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlubmVyU3RyZWFtUmVhZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHdhaXRGb3JOZXdTdHJlYW0gPSBjcmVhdGVSZXNvbHZhYmxlUHJvbWlzZSgpO1xuICAgICAgYXdhaXQgd2FpdEZvck5ld1N0cmVhbS5wcm9taXNlO1xuICAgICAgcmV0dXJuIHByb2Nlc3NQdWxsKCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpbm5lclN0cmVhbVJlYWRlcnNbMF0ucmVhZCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgaW5uZXJTdHJlYW1SZWFkZXJzLnNoaWZ0KCk7XG4gICAgICAgIGlmIChpbm5lclN0cmVhbVJlYWRlcnMubGVuZ3RoID09PSAwICYmIGlzQ2xvc2VkKSB7XG4gICAgICAgICAgY29udHJvbGxlciA9PSBudWxsID8gdm9pZCAwIDogY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHByb2Nlc3NQdWxsKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2xsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRyb2xsZXIuZW5xdWV1ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnRyb2xsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRyb2xsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgaW5uZXJTdHJlYW1SZWFkZXJzLnNoaWZ0KCk7XG4gICAgICB0ZXJtaW5hdGUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB7XG4gICAgc3RyZWFtOiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgc3RhcnQoY29udHJvbGxlclBhcmFtKSB7XG4gICAgICAgIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyUGFyYW07XG4gICAgICB9LFxuICAgICAgcHVsbDogcHJvY2Vzc1B1bGwsXG4gICAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIGlubmVyU3RyZWFtUmVhZGVycykge1xuICAgICAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgICBpbm5lclN0cmVhbVJlYWRlcnMgPSBbXTtcbiAgICAgICAgaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pLFxuICAgIGFkZFN0cmVhbTogKGlubmVyU3RyZWFtKSA9PiB7XG4gICAgICBpZiAoaXNDbG9zZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBpbm5lciBzdHJlYW06IG91dGVyIHN0cmVhbSBpcyBjbG9zZWRcIik7XG4gICAgICB9XG4gICAgICBpbm5lclN0cmVhbVJlYWRlcnMucHVzaChpbm5lclN0cmVhbS5nZXRSZWFkZXIoKSk7XG4gICAgICB3YWl0Rm9yTmV3U3RyZWFtLnJlc29sdmUoKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdyYWNlZnVsbHkgY2xvc2UgdGhlIG91dGVyIHN0cmVhbS4gVGhpcyB3aWxsIGxldCB0aGUgaW5uZXIgc3RyZWFtc1xuICAgICAqIGZpbmlzaCBwcm9jZXNzaW5nIGFuZCB0aGVuIGNsb3NlIHRoZSBvdXRlciBzdHJlYW0uXG4gICAgICovXG4gICAgY2xvc2U6ICgpID0+IHtcbiAgICAgIGlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgIHdhaXRGb3JOZXdTdHJlYW0ucmVzb2x2ZSgpO1xuICAgICAgaWYgKGlubmVyU3RyZWFtUmVhZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udHJvbGxlciA9PSBudWxsID8gdm9pZCAwIDogY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogSW1tZWRpYXRlbHkgY2xvc2UgdGhlIG91dGVyIHN0cmVhbS4gVGhpcyB3aWxsIGNhbmNlbCBhbGwgaW5uZXIgc3RyZWFtc1xuICAgICAqIGFuZCBjbG9zZSB0aGUgb3V0ZXIgc3RyZWFtLlxuICAgICAqL1xuICAgIHRlcm1pbmF0ZVxuICB9O1xufVxuXG4vLyBzcmMvZ2VuZXJhdGUtdGV4dC9ydW4tdG9vbHMtdHJhbnNmb3JtYXRpb24udHNcbmltcG9ydCB7XG4gIGdldEVycm9yTWVzc2FnZSBhcyBnZXRFcnJvck1lc3NhZ2U2XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5mdW5jdGlvbiBydW5Ub29sc1RyYW5zZm9ybWF0aW9uKHtcbiAgdG9vbHMsXG4gIGdlbmVyYXRvclN0cmVhbSxcbiAgdHJhY2VyLFxuICB0ZWxlbWV0cnksXG4gIHN5c3RlbSxcbiAgbWVzc2FnZXMsXG4gIGFib3J0U2lnbmFsLFxuICByZXBhaXJUb29sQ2FsbCxcbiAgZXhwZXJpbWVudGFsX2NvbnRleHQsXG4gIGdlbmVyYXRlSWQ6IGdlbmVyYXRlSWQyLFxuICBzdGVwTnVtYmVyLFxuICBtb2RlbCxcbiAgb25Ub29sQ2FsbFN0YXJ0LFxuICBvblRvb2xDYWxsRmluaXNoXG59KSB7XG4gIGxldCB0b29sUmVzdWx0c1N0cmVhbUNvbnRyb2xsZXIgPSBudWxsO1xuICBjb25zdCB0b29sUmVzdWx0c1N0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgdG9vbFJlc3VsdHNTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBvdXRzdGFuZGluZ1Rvb2xSZXN1bHRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3QgdG9vbElucHV0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGNvbnN0IHRvb2xDYWxsc0J5VG9vbENhbGxJZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGxldCBjYW5DbG9zZSA9IGZhbHNlO1xuICBsZXQgZmluaXNoQ2h1bmsgPSB2b2lkIDA7XG4gIGZ1bmN0aW9uIGF0dGVtcHRDbG9zZSgpIHtcbiAgICBpZiAoY2FuQ2xvc2UgJiYgb3V0c3RhbmRpbmdUb29sUmVzdWx0cy5zaXplID09PSAwKSB7XG4gICAgICBpZiAoZmluaXNoQ2h1bmsgIT0gbnVsbCkge1xuICAgICAgICB0b29sUmVzdWx0c1N0cmVhbUNvbnRyb2xsZXIuZW5xdWV1ZShmaW5pc2hDaHVuayk7XG4gICAgICB9XG4gICAgICB0b29sUmVzdWx0c1N0cmVhbUNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZm9yd2FyZFN0cmVhbSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgY29uc3QgY2h1bmtUeXBlID0gY2h1bmsudHlwZTtcbiAgICAgIHN3aXRjaCAoY2h1bmtUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJzdHJlYW0tc3RhcnRcIjpcbiAgICAgICAgY2FzZSBcInRleHQtc3RhcnRcIjpcbiAgICAgICAgY2FzZSBcInRleHQtZGVsdGFcIjpcbiAgICAgICAgY2FzZSBcInRleHQtZW5kXCI6XG4gICAgICAgIGNhc2UgXCJyZWFzb25pbmctc3RhcnRcIjpcbiAgICAgICAgY2FzZSBcInJlYXNvbmluZy1kZWx0YVwiOlxuICAgICAgICBjYXNlIFwicmVhc29uaW5nLWVuZFwiOlxuICAgICAgICBjYXNlIFwidG9vbC1pbnB1dC1zdGFydFwiOlxuICAgICAgICBjYXNlIFwidG9vbC1pbnB1dC1kZWx0YVwiOlxuICAgICAgICBjYXNlIFwidG9vbC1pbnB1dC1lbmRcIjpcbiAgICAgICAgY2FzZSBcInNvdXJjZVwiOlxuICAgICAgICBjYXNlIFwicmVzcG9uc2UtbWV0YWRhdGFcIjpcbiAgICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgIGNhc2UgXCJyYXdcIjoge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImZpbGVcIjoge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgICAgIGZpbGU6IG5ldyBEZWZhdWx0R2VuZXJhdGVkRmlsZVdpdGhUeXBlKHtcbiAgICAgICAgICAgICAgZGF0YTogY2h1bmsuZGF0YSxcbiAgICAgICAgICAgICAgbWVkaWFUeXBlOiBjaHVuay5tZWRpYVR5cGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLi4uY2h1bmsucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhOiBjaHVuay5wcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJmaW5pc2hcIjoge1xuICAgICAgICAgIGZpbmlzaENodW5rID0ge1xuICAgICAgICAgICAgdHlwZTogXCJmaW5pc2hcIixcbiAgICAgICAgICAgIGZpbmlzaFJlYXNvbjogY2h1bmsuZmluaXNoUmVhc29uLnVuaWZpZWQsXG4gICAgICAgICAgICByYXdGaW5pc2hSZWFzb246IGNodW5rLmZpbmlzaFJlYXNvbi5yYXcsXG4gICAgICAgICAgICB1c2FnZTogYXNMYW5ndWFnZU1vZGVsVXNhZ2UoY2h1bmsudXNhZ2UpLFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogY2h1bmsucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiOiB7XG4gICAgICAgICAgY29uc3QgdG9vbENhbGwgPSB0b29sQ2FsbHNCeVRvb2xDYWxsSWQuZ2V0KGNodW5rLnRvb2xDYWxsSWQpO1xuICAgICAgICAgIGlmICh0b29sQ2FsbCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0b29sUmVzdWx0c1N0cmVhbUNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgZXJyb3I6IG5ldyBUb29sQ2FsbE5vdEZvdW5kRm9yQXBwcm92YWxFcnJvcih7XG4gICAgICAgICAgICAgICAgdG9vbENhbGxJZDogY2h1bmsudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICBhcHByb3ZhbElkOiBjaHVuay5hcHByb3ZhbElkXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWFwcHJvdmFsLXJlcXVlc3RcIixcbiAgICAgICAgICAgIGFwcHJvdmFsSWQ6IGNodW5rLmFwcHJvdmFsSWQsXG4gICAgICAgICAgICB0b29sQ2FsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJ0b29sLWNhbGxcIjoge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0b29sQ2FsbCA9IGF3YWl0IHBhcnNlVG9vbENhbGwoe1xuICAgICAgICAgICAgICB0b29sQ2FsbDogY2h1bmssXG4gICAgICAgICAgICAgIHRvb2xzLFxuICAgICAgICAgICAgICByZXBhaXJUb29sQ2FsbCxcbiAgICAgICAgICAgICAgc3lzdGVtLFxuICAgICAgICAgICAgICBtZXNzYWdlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0b29sQ2FsbHNCeVRvb2xDYWxsSWQuc2V0KHRvb2xDYWxsLnRvb2xDYWxsSWQsIHRvb2xDYWxsKTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh0b29sQ2FsbCk7XG4gICAgICAgICAgICBpZiAodG9vbENhbGwuaW52YWxpZCkge1xuICAgICAgICAgICAgICB0b29sUmVzdWx0c1N0cmVhbUNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWVycm9yXCIsXG4gICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdG9vbENhbGwudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbENhbGwudG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHRvb2xDYWxsLmlucHV0LFxuICAgICAgICAgICAgICAgIGVycm9yOiBnZXRFcnJvck1lc3NhZ2U2KHRvb2xDYWxsLmVycm9yKSxcbiAgICAgICAgICAgICAgICBkeW5hbWljOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0b29sQ2FsbC50aXRsZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0b29sMiA9IHRvb2xzID09IG51bGwgPyB2b2lkIDAgOiB0b29sc1t0b29sQ2FsbC50b29sTmFtZV07XG4gICAgICAgICAgICBpZiAodG9vbDIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b29sMi5vbklucHV0QXZhaWxhYmxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgYXdhaXQgdG9vbDIub25JbnB1dEF2YWlsYWJsZSh7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IHRvb2xDYWxsLmlucHV0LFxuICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXdhaXQgaXNBcHByb3ZhbE5lZWRlZCh7XG4gICAgICAgICAgICAgIHRvb2w6IHRvb2wyLFxuICAgICAgICAgICAgICB0b29sQ2FsbCxcbiAgICAgICAgICAgICAgbWVzc2FnZXMsXG4gICAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICB0b29sUmVzdWx0c1N0cmVhbUNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWFwcHJvdmFsLXJlcXVlc3RcIixcbiAgICAgICAgICAgICAgICBhcHByb3ZhbElkOiBnZW5lcmF0ZUlkMigpLFxuICAgICAgICAgICAgICAgIHRvb2xDYWxsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRvb2xJbnB1dHMuc2V0KHRvb2xDYWxsLnRvb2xDYWxsSWQsIHRvb2xDYWxsLmlucHV0KTtcbiAgICAgICAgICAgIGlmICh0b29sMi5leGVjdXRlICE9IG51bGwgJiYgdG9vbENhbGwucHJvdmlkZXJFeGVjdXRlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b29sRXhlY3V0aW9uSWQgPSBnZW5lcmF0ZUlkMigpO1xuICAgICAgICAgICAgICBvdXRzdGFuZGluZ1Rvb2xSZXN1bHRzLmFkZCh0b29sRXhlY3V0aW9uSWQpO1xuICAgICAgICAgICAgICBleGVjdXRlVG9vbENhbGwoe1xuICAgICAgICAgICAgICAgIHRvb2xDYWxsLFxuICAgICAgICAgICAgICAgIHRvb2xzLFxuICAgICAgICAgICAgICAgIHRyYWNlcixcbiAgICAgICAgICAgICAgICB0ZWxlbWV0cnksXG4gICAgICAgICAgICAgICAgbWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQsXG4gICAgICAgICAgICAgICAgc3RlcE51bWJlcixcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvblRvb2xDYWxsU3RhcnQsXG4gICAgICAgICAgICAgICAgb25Ub29sQ2FsbEZpbmlzaCxcbiAgICAgICAgICAgICAgICBvblByZWxpbWluYXJ5VG9vbFJlc3VsdDogKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdG9vbFJlc3VsdHNTdHJlYW1Db250cm9sbGVyLmVucXVldWUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRvb2xSZXN1bHRzU3RyZWFtQ29udHJvbGxlci5lbnF1ZXVlKHJlc3VsdCk7XG4gICAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRvb2xSZXN1bHRzU3RyZWFtQ29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIG91dHN0YW5kaW5nVG9vbFJlc3VsdHMuZGVsZXRlKHRvb2xFeGVjdXRpb25JZCk7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdENsb3NlKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0b29sUmVzdWx0c1N0cmVhbUNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwiZXJyb3JcIiwgZXJyb3IgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJ0b29sLXJlc3VsdFwiOiB7XG4gICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBjaHVuay50b29sTmFtZTtcbiAgICAgICAgICBpZiAoY2h1bmsuaXNFcnJvcikge1xuICAgICAgICAgICAgdG9vbFJlc3VsdHNTdHJlYW1Db250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtZXJyb3JcIixcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogY2h1bmsudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgIGlucHV0OiB0b29sSW5wdXRzLmdldChjaHVuay50b29sQ2FsbElkKSxcbiAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGNodW5rLnJlc3VsdCxcbiAgICAgICAgICAgICAgZHluYW1pYzogY2h1bmsuZHluYW1pYyxcbiAgICAgICAgICAgICAgLi4uY2h1bmsucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhOiBjaHVuay5wcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogY2h1bmsudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgIGlucHV0OiB0b29sSW5wdXRzLmdldChjaHVuay50b29sQ2FsbElkKSxcbiAgICAgICAgICAgICAgb3V0cHV0OiBjaHVuay5yZXN1bHQsXG4gICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGR5bmFtaWM6IGNodW5rLmR5bmFtaWMsXG4gICAgICAgICAgICAgIC4uLmNodW5rLnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCA/IHsgcHJvdmlkZXJNZXRhZGF0YTogY2h1bmsucHJvdmlkZXJNZXRhZGF0YSB9IDoge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgX2V4aGF1c3RpdmVDaGVjayA9IGNodW5rVHlwZTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjaHVuayB0eXBlOiAke19leGhhdXN0aXZlQ2hlY2t9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoKCkge1xuICAgICAgY2FuQ2xvc2UgPSB0cnVlO1xuICAgICAgYXR0ZW1wdENsb3NlKCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgYXN5bmMgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2VuZXJhdG9yU3RyZWFtLnBpcGVUaHJvdWdoKGZvcndhcmRTdHJlYW0pLnBpcGVUbyhcbiAgICAgICAgICBuZXcgV3JpdGFibGVTdHJlYW0oe1xuICAgICAgICAgICAgd3JpdGUoY2h1bmspIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZSgpIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgICB0b29sUmVzdWx0c1N0cmVhbS5waXBlVG8oXG4gICAgICAgICAgbmV3IFdyaXRhYmxlU3RyZWFtKHtcbiAgICAgICAgICAgIHdyaXRlKGNodW5rKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xvc2UoKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICBdKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBzcmMvZ2VuZXJhdGUtdGV4dC9zdHJlYW0tdGV4dC50c1xudmFyIG9yaWdpbmFsR2VuZXJhdGVJZDIgPSBjcmVhdGVJZEdlbmVyYXRvcjIoe1xuICBwcmVmaXg6IFwiYWl0eHRcIixcbiAgc2l6ZTogMjRcbn0pO1xuZnVuY3Rpb24gc3RyZWFtVGV4dCh7XG4gIG1vZGVsLFxuICB0b29scyxcbiAgdG9vbENob2ljZSxcbiAgc3lzdGVtLFxuICBwcm9tcHQsXG4gIG1lc3NhZ2VzLFxuICBtYXhSZXRyaWVzLFxuICBhYm9ydFNpZ25hbCxcbiAgdGltZW91dCxcbiAgaGVhZGVycyxcbiAgc3RvcFdoZW4gPSBzdGVwQ291bnRJcygxKSxcbiAgZXhwZXJpbWVudGFsX291dHB1dCxcbiAgb3V0cHV0ID0gZXhwZXJpbWVudGFsX291dHB1dCxcbiAgZXhwZXJpbWVudGFsX3RlbGVtZXRyeTogdGVsZW1ldHJ5LFxuICBwcmVwYXJlU3RlcCxcbiAgcHJvdmlkZXJPcHRpb25zLFxuICBleHBlcmltZW50YWxfYWN0aXZlVG9vbHMsXG4gIGFjdGl2ZVRvb2xzID0gZXhwZXJpbWVudGFsX2FjdGl2ZVRvb2xzLFxuICBleHBlcmltZW50YWxfcmVwYWlyVG9vbENhbGw6IHJlcGFpclRvb2xDYWxsLFxuICBleHBlcmltZW50YWxfdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gIGV4cGVyaW1lbnRhbF9kb3dubG9hZDogZG93bmxvYWQyLFxuICBpbmNsdWRlUmF3Q2h1bmtzID0gZmFsc2UsXG4gIG9uQ2h1bmssXG4gIG9uRXJyb3IgPSAoeyBlcnJvciB9KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gIH0sXG4gIG9uRmluaXNoLFxuICBvbkFib3J0LFxuICBvblN0ZXBGaW5pc2gsXG4gIGV4cGVyaW1lbnRhbF9vblN0YXJ0OiBvblN0YXJ0LFxuICBleHBlcmltZW50YWxfb25TdGVwU3RhcnQ6IG9uU3RlcFN0YXJ0LFxuICBleHBlcmltZW50YWxfb25Ub29sQ2FsbFN0YXJ0OiBvblRvb2xDYWxsU3RhcnQsXG4gIGV4cGVyaW1lbnRhbF9vblRvb2xDYWxsRmluaXNoOiBvblRvb2xDYWxsRmluaXNoLFxuICBleHBlcmltZW50YWxfY29udGV4dCxcbiAgZXhwZXJpbWVudGFsX2luY2x1ZGU6IGluY2x1ZGUsXG4gIF9pbnRlcm5hbDogeyBub3c6IG5vdzIgPSBub3csIGdlbmVyYXRlSWQ6IGdlbmVyYXRlSWQyID0gb3JpZ2luYWxHZW5lcmF0ZUlkMiB9ID0ge30sXG4gIC4uLnNldHRpbmdzXG59KSB7XG4gIGNvbnN0IHRvdGFsVGltZW91dE1zID0gZ2V0VG90YWxUaW1lb3V0TXModGltZW91dCk7XG4gIGNvbnN0IHN0ZXBUaW1lb3V0TXMgPSBnZXRTdGVwVGltZW91dE1zKHRpbWVvdXQpO1xuICBjb25zdCBjaHVua1RpbWVvdXRNcyA9IGdldENodW5rVGltZW91dE1zKHRpbWVvdXQpO1xuICBjb25zdCBzdGVwQWJvcnRDb250cm9sbGVyID0gc3RlcFRpbWVvdXRNcyAhPSBudWxsID8gbmV3IEFib3J0Q29udHJvbGxlcigpIDogdm9pZCAwO1xuICBjb25zdCBjaHVua0Fib3J0Q29udHJvbGxlciA9IGNodW5rVGltZW91dE1zICE9IG51bGwgPyBuZXcgQWJvcnRDb250cm9sbGVyKCkgOiB2b2lkIDA7XG4gIHJldHVybiBuZXcgRGVmYXVsdFN0cmVhbVRleHRSZXN1bHQoe1xuICAgIG1vZGVsOiByZXNvbHZlTGFuZ3VhZ2VNb2RlbChtb2RlbCksXG4gICAgdGVsZW1ldHJ5LFxuICAgIGhlYWRlcnMsXG4gICAgc2V0dGluZ3MsXG4gICAgbWF4UmV0cmllcyxcbiAgICBhYm9ydFNpZ25hbDogbWVyZ2VBYm9ydFNpZ25hbHMoXG4gICAgICBhYm9ydFNpZ25hbCxcbiAgICAgIHRvdGFsVGltZW91dE1zICE9IG51bGwgPyBBYm9ydFNpZ25hbC50aW1lb3V0KHRvdGFsVGltZW91dE1zKSA6IHZvaWQgMCxcbiAgICAgIHN0ZXBBYm9ydENvbnRyb2xsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IHN0ZXBBYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgY2h1bmtBYm9ydENvbnRyb2xsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGNodW5rQWJvcnRDb250cm9sbGVyLnNpZ25hbFxuICAgICksXG4gICAgc3RlcFRpbWVvdXRNcyxcbiAgICBzdGVwQWJvcnRDb250cm9sbGVyLFxuICAgIGNodW5rVGltZW91dE1zLFxuICAgIGNodW5rQWJvcnRDb250cm9sbGVyLFxuICAgIHN5c3RlbSxcbiAgICBwcm9tcHQsXG4gICAgbWVzc2FnZXMsXG4gICAgdG9vbHMsXG4gICAgdG9vbENob2ljZSxcbiAgICB0cmFuc2Zvcm1zOiBhc0FycmF5KHRyYW5zZm9ybSksXG4gICAgYWN0aXZlVG9vbHMsXG4gICAgcmVwYWlyVG9vbENhbGwsXG4gICAgc3RvcENvbmRpdGlvbnM6IGFzQXJyYXkoc3RvcFdoZW4pLFxuICAgIG91dHB1dCxcbiAgICBwcm92aWRlck9wdGlvbnMsXG4gICAgcHJlcGFyZVN0ZXAsXG4gICAgaW5jbHVkZVJhd0NodW5rcyxcbiAgICB0aW1lb3V0LFxuICAgIHN0b3BXaGVuLFxuICAgIG9yaWdpbmFsQWJvcnRTaWduYWw6IGFib3J0U2lnbmFsLFxuICAgIG9uQ2h1bmssXG4gICAgb25FcnJvcixcbiAgICBvbkZpbmlzaCxcbiAgICBvbkFib3J0LFxuICAgIG9uU3RlcEZpbmlzaCxcbiAgICBvblN0YXJ0LFxuICAgIG9uU3RlcFN0YXJ0LFxuICAgIG9uVG9vbENhbGxTdGFydCxcbiAgICBvblRvb2xDYWxsRmluaXNoLFxuICAgIG5vdzogbm93MixcbiAgICBnZW5lcmF0ZUlkOiBnZW5lcmF0ZUlkMixcbiAgICBleHBlcmltZW50YWxfY29udGV4dCxcbiAgICBkb3dubG9hZDogZG93bmxvYWQyLFxuICAgIGluY2x1ZGVcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVPdXRwdXRUcmFuc2Zvcm1TdHJlYW0ob3V0cHV0KSB7XG4gIGxldCBmaXJzdFRleHRDaHVua0lkID0gdm9pZCAwO1xuICBsZXQgdGV4dDIgPSBcIlwiO1xuICBsZXQgdGV4dENodW5rID0gXCJcIjtcbiAgbGV0IHRleHRQcm92aWRlck1ldGFkYXRhID0gdm9pZCAwO1xuICBsZXQgbGFzdFB1Ymxpc2hlZEpzb24gPSBcIlwiO1xuICBmdW5jdGlvbiBwdWJsaXNoVGV4dENodW5rKHtcbiAgICBjb250cm9sbGVyLFxuICAgIHBhcnRpYWxPdXRwdXQgPSB2b2lkIDBcbiAgfSkge1xuICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICBwYXJ0OiB7XG4gICAgICAgIHR5cGU6IFwidGV4dC1kZWx0YVwiLFxuICAgICAgICBpZDogZmlyc3RUZXh0Q2h1bmtJZCxcbiAgICAgICAgdGV4dDogdGV4dENodW5rLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB0ZXh0UHJvdmlkZXJNZXRhZGF0YVxuICAgICAgfSxcbiAgICAgIHBhcnRpYWxPdXRwdXRcbiAgICB9KTtcbiAgICB0ZXh0Q2h1bmsgPSBcIlwiO1xuICB9XG4gIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICBhc3luYyB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIHZhciBfYTIxO1xuICAgICAgaWYgKGNodW5rLnR5cGUgPT09IFwiZmluaXNoLXN0ZXBcIiAmJiB0ZXh0Q2h1bmsubGVuZ3RoID4gMCkge1xuICAgICAgICBwdWJsaXNoVGV4dENodW5rKHsgY29udHJvbGxlciB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjaHVuay50eXBlICE9PSBcInRleHQtZGVsdGFcIiAmJiBjaHVuay50eXBlICE9PSBcInRleHQtc3RhcnRcIiAmJiBjaHVuay50eXBlICE9PSBcInRleHQtZW5kXCIpIHtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgcGFydDogY2h1bmssIHBhcnRpYWxPdXRwdXQ6IHZvaWQgMCB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGZpcnN0VGV4dENodW5rSWQgPT0gbnVsbCkge1xuICAgICAgICBmaXJzdFRleHRDaHVua0lkID0gY2h1bmsuaWQ7XG4gICAgICB9IGVsc2UgaWYgKGNodW5rLmlkICE9PSBmaXJzdFRleHRDaHVua0lkKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHBhcnQ6IGNodW5rLCBwYXJ0aWFsT3V0cHV0OiB2b2lkIDAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjaHVuay50eXBlID09PSBcInRleHQtc3RhcnRcIikge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyBwYXJ0OiBjaHVuaywgcGFydGlhbE91dHB1dDogdm9pZCAwIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY2h1bmsudHlwZSA9PT0gXCJ0ZXh0LWVuZFwiKSB7XG4gICAgICAgIGlmICh0ZXh0Q2h1bmsubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHB1Ymxpc2hUZXh0Q2h1bmsoeyBjb250cm9sbGVyIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHBhcnQ6IGNodW5rLCBwYXJ0aWFsT3V0cHV0OiB2b2lkIDAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRleHQyICs9IGNodW5rLnRleHQ7XG4gICAgICB0ZXh0Q2h1bmsgKz0gY2h1bmsudGV4dDtcbiAgICAgIHRleHRQcm92aWRlck1ldGFkYXRhID0gKF9hMjEgPSBjaHVuay5wcm92aWRlck1ldGFkYXRhKSAhPSBudWxsID8gX2EyMSA6IHRleHRQcm92aWRlck1ldGFkYXRhO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0cHV0LnBhcnNlUGFydGlhbE91dHB1dCh7IHRleHQ6IHRleHQyIH0pO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRKc29uID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0LnBhcnRpYWwpO1xuICAgICAgICBpZiAoY3VycmVudEpzb24gIT09IGxhc3RQdWJsaXNoZWRKc29uKSB7XG4gICAgICAgICAgcHVibGlzaFRleHRDaHVuayh7IGNvbnRyb2xsZXIsIHBhcnRpYWxPdXRwdXQ6IHJlc3VsdC5wYXJ0aWFsIH0pO1xuICAgICAgICAgIGxhc3RQdWJsaXNoZWRKc29uID0gY3VycmVudEpzb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxudmFyIERlZmF1bHRTdHJlYW1UZXh0UmVzdWx0ID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgbW9kZWwsXG4gICAgdGVsZW1ldHJ5LFxuICAgIGhlYWRlcnMsXG4gICAgc2V0dGluZ3MsXG4gICAgbWF4UmV0cmllczogbWF4UmV0cmllc0FyZyxcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBzdGVwVGltZW91dE1zLFxuICAgIHN0ZXBBYm9ydENvbnRyb2xsZXIsXG4gICAgY2h1bmtUaW1lb3V0TXMsXG4gICAgY2h1bmtBYm9ydENvbnRyb2xsZXIsXG4gICAgc3lzdGVtLFxuICAgIHByb21wdCxcbiAgICBtZXNzYWdlcyxcbiAgICB0b29scyxcbiAgICB0b29sQ2hvaWNlLFxuICAgIHRyYW5zZm9ybXMsXG4gICAgYWN0aXZlVG9vbHMsXG4gICAgcmVwYWlyVG9vbENhbGwsXG4gICAgc3RvcENvbmRpdGlvbnMsXG4gICAgb3V0cHV0LFxuICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICBwcmVwYXJlU3RlcCxcbiAgICBpbmNsdWRlUmF3Q2h1bmtzLFxuICAgIG5vdzogbm93MixcbiAgICBnZW5lcmF0ZUlkOiBnZW5lcmF0ZUlkMixcbiAgICB0aW1lb3V0LFxuICAgIHN0b3BXaGVuLFxuICAgIG9yaWdpbmFsQWJvcnRTaWduYWwsXG4gICAgb25DaHVuayxcbiAgICBvbkVycm9yLFxuICAgIG9uRmluaXNoLFxuICAgIG9uQWJvcnQsXG4gICAgb25TdGVwRmluaXNoLFxuICAgIG9uU3RhcnQsXG4gICAgb25TdGVwU3RhcnQsXG4gICAgb25Ub29sQ2FsbFN0YXJ0LFxuICAgIG9uVG9vbENhbGxGaW5pc2gsXG4gICAgZXhwZXJpbWVudGFsX2NvbnRleHQsXG4gICAgZG93bmxvYWQ6IGRvd25sb2FkMixcbiAgICBpbmNsdWRlXG4gIH0pIHtcbiAgICB0aGlzLl90b3RhbFVzYWdlID0gbmV3IERlbGF5ZWRQcm9taXNlKCk7XG4gICAgdGhpcy5fZmluaXNoUmVhc29uID0gbmV3IERlbGF5ZWRQcm9taXNlKCk7XG4gICAgdGhpcy5fcmF3RmluaXNoUmVhc29uID0gbmV3IERlbGF5ZWRQcm9taXNlKCk7XG4gICAgdGhpcy5fc3RlcHMgPSBuZXcgRGVsYXllZFByb21pc2UoKTtcbiAgICB0aGlzLm91dHB1dFNwZWNpZmljYXRpb24gPSBvdXRwdXQ7XG4gICAgdGhpcy5pbmNsdWRlUmF3Q2h1bmtzID0gaW5jbHVkZVJhd0NodW5rcztcbiAgICB0aGlzLnRvb2xzID0gdG9vbHM7XG4gICAgY29uc3QgY3JlYXRlR2xvYmFsVGVsZW1ldHJ5ID0gZ2V0R2xvYmFsVGVsZW1ldHJ5SW50ZWdyYXRpb24oKTtcbiAgICBjb25zdCBnbG9iYWxUZWxlbWV0cnkgPSBjcmVhdGVHbG9iYWxUZWxlbWV0cnkodGVsZW1ldHJ5ID09IG51bGwgPyB2b2lkIDAgOiB0ZWxlbWV0cnkuaW50ZWdyYXRpb25zKTtcbiAgICBsZXQgc3RlcEZpbmlzaDtcbiAgICBsZXQgcmVjb3JkZWRDb250ZW50ID0gW107XG4gICAgY29uc3QgcmVjb3JkZWRSZXNwb25zZU1lc3NhZ2VzID0gW107XG4gICAgbGV0IHJlY29yZGVkRmluaXNoUmVhc29uID0gdm9pZCAwO1xuICAgIGxldCByZWNvcmRlZFJhd0ZpbmlzaFJlYXNvbiA9IHZvaWQgMDtcbiAgICBsZXQgcmVjb3JkZWRUb3RhbFVzYWdlID0gdm9pZCAwO1xuICAgIGxldCByZWNvcmRlZFJlcXVlc3QgPSB7fTtcbiAgICBsZXQgcmVjb3JkZWRXYXJuaW5ncyA9IFtdO1xuICAgIGNvbnN0IHJlY29yZGVkU3RlcHMgPSBbXTtcbiAgICBjb25zdCBwZW5kaW5nRGVmZXJyZWRUb29sQ2FsbHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGxldCByb290U3BhbjtcbiAgICBsZXQgYWN0aXZlVGV4dENvbnRlbnQgPSB7fTtcbiAgICBsZXQgYWN0aXZlUmVhc29uaW5nQ29udGVudCA9IHt9O1xuICAgIGNvbnN0IGV2ZW50UHJvY2Vzc29yID0gbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICBhc3luYyB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIF9hMjEsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgIGNvbnN0IHsgcGFydCB9ID0gY2h1bms7XG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidGV4dC1kZWx0YVwiIHx8IHBhcnQudHlwZSA9PT0gXCJyZWFzb25pbmctZGVsdGFcIiB8fCBwYXJ0LnR5cGUgPT09IFwic291cmNlXCIgfHwgcGFydC50eXBlID09PSBcInRvb2wtY2FsbFwiIHx8IHBhcnQudHlwZSA9PT0gXCJ0b29sLXJlc3VsdFwiIHx8IHBhcnQudHlwZSA9PT0gXCJ0b29sLWlucHV0LXN0YXJ0XCIgfHwgcGFydC50eXBlID09PSBcInRvb2wtaW5wdXQtZGVsdGFcIiB8fCBwYXJ0LnR5cGUgPT09IFwicmF3XCIpIHtcbiAgICAgICAgICBhd2FpdCAob25DaHVuayA9PSBudWxsID8gdm9pZCAwIDogb25DaHVuayh7IGNodW5rOiBwYXJ0IH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICBhd2FpdCBvbkVycm9yKHsgZXJyb3I6IHdyYXBHYXRld2F5RXJyb3IocGFydC5lcnJvcikgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJ0ZXh0LXN0YXJ0XCIpIHtcbiAgICAgICAgICBhY3RpdmVUZXh0Q29udGVudFtwYXJ0LmlkXSA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHBhcnQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmVjb3JkZWRDb250ZW50LnB1c2goYWN0aXZlVGV4dENvbnRlbnRbcGFydC5pZF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidGV4dC1kZWx0YVwiKSB7XG4gICAgICAgICAgY29uc3QgYWN0aXZlVGV4dCA9IGFjdGl2ZVRleHRDb250ZW50W3BhcnQuaWRdO1xuICAgICAgICAgIGlmIChhY3RpdmVUZXh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgIHBhcnQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGB0ZXh0IHBhcnQgJHtwYXJ0LmlkfSBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBhcnRpYWxPdXRwdXQ6IHZvaWQgMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2ZVRleHQudGV4dCArPSBwYXJ0LnRleHQ7XG4gICAgICAgICAgYWN0aXZlVGV4dC5wcm92aWRlck1ldGFkYXRhID0gKF9hMjEgPSBwYXJ0LnByb3ZpZGVyTWV0YWRhdGEpICE9IG51bGwgPyBfYTIxIDogYWN0aXZlVGV4dC5wcm92aWRlck1ldGFkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidGV4dC1lbmRcIikge1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZVRleHQgPSBhY3RpdmVUZXh0Q29udGVudFtwYXJ0LmlkXTtcbiAgICAgICAgICBpZiAoYWN0aXZlVGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICBwYXJ0OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgdGV4dCBwYXJ0ICR7cGFydC5pZH0gbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwYXJ0aWFsT3V0cHV0OiB2b2lkIDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmVUZXh0LnByb3ZpZGVyTWV0YWRhdGEgPSAoX2IgPSBwYXJ0LnByb3ZpZGVyTWV0YWRhdGEpICE9IG51bGwgPyBfYiA6IGFjdGl2ZVRleHQucHJvdmlkZXJNZXRhZGF0YTtcbiAgICAgICAgICBkZWxldGUgYWN0aXZlVGV4dENvbnRlbnRbcGFydC5pZF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJyZWFzb25pbmctc3RhcnRcIikge1xuICAgICAgICAgIGFjdGl2ZVJlYXNvbmluZ0NvbnRlbnRbcGFydC5pZF0gPSB7XG4gICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZ1wiLFxuICAgICAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHBhcnQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmVjb3JkZWRDb250ZW50LnB1c2goYWN0aXZlUmVhc29uaW5nQ29udGVudFtwYXJ0LmlkXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJyZWFzb25pbmctZGVsdGFcIikge1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZVJlYXNvbmluZyA9IGFjdGl2ZVJlYXNvbmluZ0NvbnRlbnRbcGFydC5pZF07XG4gICAgICAgICAgaWYgKGFjdGl2ZVJlYXNvbmluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICBwYXJ0OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgcmVhc29uaW5nIHBhcnQgJHtwYXJ0LmlkfSBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBhcnRpYWxPdXRwdXQ6IHZvaWQgMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2ZVJlYXNvbmluZy50ZXh0ICs9IHBhcnQudGV4dDtcbiAgICAgICAgICBhY3RpdmVSZWFzb25pbmcucHJvdmlkZXJNZXRhZGF0YSA9IChfYyA9IHBhcnQucHJvdmlkZXJNZXRhZGF0YSkgIT0gbnVsbCA/IF9jIDogYWN0aXZlUmVhc29uaW5nLnByb3ZpZGVyTWV0YWRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJyZWFzb25pbmctZW5kXCIpIHtcbiAgICAgICAgICBjb25zdCBhY3RpdmVSZWFzb25pbmcgPSBhY3RpdmVSZWFzb25pbmdDb250ZW50W3BhcnQuaWRdO1xuICAgICAgICAgIGlmIChhY3RpdmVSZWFzb25pbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgcGFydDoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICBlcnJvcjogYHJlYXNvbmluZyBwYXJ0ICR7cGFydC5pZH0gbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwYXJ0aWFsT3V0cHV0OiB2b2lkIDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmVSZWFzb25pbmcucHJvdmlkZXJNZXRhZGF0YSA9IChfZCA9IHBhcnQucHJvdmlkZXJNZXRhZGF0YSkgIT0gbnVsbCA/IF9kIDogYWN0aXZlUmVhc29uaW5nLnByb3ZpZGVyTWV0YWRhdGE7XG4gICAgICAgICAgZGVsZXRlIGFjdGl2ZVJlYXNvbmluZ0NvbnRlbnRbcGFydC5pZF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICByZWNvcmRlZENvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgICAgIGZpbGU6IHBhcnQuZmlsZSxcbiAgICAgICAgICAgIC4uLnBhcnQucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhOiBwYXJ0LnByb3ZpZGVyTWV0YWRhdGEgfSA6IHt9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJzb3VyY2VcIikge1xuICAgICAgICAgIHJlY29yZGVkQ29udGVudC5wdXNoKHBhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidG9vbC1jYWxsXCIpIHtcbiAgICAgICAgICByZWNvcmRlZENvbnRlbnQucHVzaChwYXJ0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydC50eXBlID09PSBcInRvb2wtcmVzdWx0XCIgJiYgIXBhcnQucHJlbGltaW5hcnkpIHtcbiAgICAgICAgICByZWNvcmRlZENvbnRlbnQucHVzaChwYXJ0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydC50eXBlID09PSBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiKSB7XG4gICAgICAgICAgcmVjb3JkZWRDb250ZW50LnB1c2gocGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJ0b29sLWVycm9yXCIpIHtcbiAgICAgICAgICByZWNvcmRlZENvbnRlbnQucHVzaChwYXJ0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydC50eXBlID09PSBcInN0YXJ0LXN0ZXBcIikge1xuICAgICAgICAgIHJlY29yZGVkQ29udGVudCA9IFtdO1xuICAgICAgICAgIGFjdGl2ZVJlYXNvbmluZ0NvbnRlbnQgPSB7fTtcbiAgICAgICAgICBhY3RpdmVUZXh0Q29udGVudCA9IHt9O1xuICAgICAgICAgIHJlY29yZGVkUmVxdWVzdCA9IHBhcnQucmVxdWVzdDtcbiAgICAgICAgICByZWNvcmRlZFdhcm5pbmdzID0gcGFydC53YXJuaW5ncztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbmlzaC1zdGVwXCIpIHtcbiAgICAgICAgICBjb25zdCBzdGVwTWVzc2FnZXMgPSBhd2FpdCB0b1Jlc3BvbnNlTWVzc2FnZXMoe1xuICAgICAgICAgICAgY29udGVudDogcmVjb3JkZWRDb250ZW50LFxuICAgICAgICAgICAgdG9vbHNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50U3RlcFJlc3VsdCA9IG5ldyBEZWZhdWx0U3RlcFJlc3VsdCh7XG4gICAgICAgICAgICBzdGVwTnVtYmVyOiByZWNvcmRlZFN0ZXBzLmxlbmd0aCxcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbEluZm8sXG4gICAgICAgICAgICAuLi5jYWxsYmFja1RlbGVtZXRyeVByb3BzLFxuICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQsXG4gICAgICAgICAgICBjb250ZW50OiByZWNvcmRlZENvbnRlbnQsXG4gICAgICAgICAgICBmaW5pc2hSZWFzb246IHBhcnQuZmluaXNoUmVhc29uLFxuICAgICAgICAgICAgcmF3RmluaXNoUmVhc29uOiBwYXJ0LnJhd0ZpbmlzaFJlYXNvbixcbiAgICAgICAgICAgIHVzYWdlOiBwYXJ0LnVzYWdlLFxuICAgICAgICAgICAgd2FybmluZ3M6IHJlY29yZGVkV2FybmluZ3MsXG4gICAgICAgICAgICByZXF1ZXN0OiByZWNvcmRlZFJlcXVlc3QsXG4gICAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgICAuLi5wYXJ0LnJlc3BvbnNlLFxuICAgICAgICAgICAgICBtZXNzYWdlczogWy4uLnJlY29yZGVkUmVzcG9uc2VNZXNzYWdlcywgLi4uc3RlcE1lc3NhZ2VzXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHBhcnQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGF3YWl0IG5vdGlmeSh7XG4gICAgICAgICAgICBldmVudDogY3VycmVudFN0ZXBSZXN1bHQsXG4gICAgICAgICAgICBjYWxsYmFja3M6IFtvblN0ZXBGaW5pc2gsIGdsb2JhbFRlbGVtZXRyeS5vblN0ZXBGaW5pc2hdXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbG9nV2FybmluZ3Moe1xuICAgICAgICAgICAgd2FybmluZ3M6IHJlY29yZGVkV2FybmluZ3MsXG4gICAgICAgICAgICBwcm92aWRlcjogbW9kZWxJbmZvLnByb3ZpZGVyLFxuICAgICAgICAgICAgbW9kZWw6IG1vZGVsSW5mby5tb2RlbElkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVjb3JkZWRTdGVwcy5wdXNoKGN1cnJlbnRTdGVwUmVzdWx0KTtcbiAgICAgICAgICByZWNvcmRlZFJlc3BvbnNlTWVzc2FnZXMucHVzaCguLi5zdGVwTWVzc2FnZXMpO1xuICAgICAgICAgIHN0ZXBGaW5pc2gucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZmluaXNoXCIpIHtcbiAgICAgICAgICByZWNvcmRlZFRvdGFsVXNhZ2UgPSBwYXJ0LnRvdGFsVXNhZ2U7XG4gICAgICAgICAgcmVjb3JkZWRGaW5pc2hSZWFzb24gPSBwYXJ0LmZpbmlzaFJlYXNvbjtcbiAgICAgICAgICByZWNvcmRlZFJhd0ZpbmlzaFJlYXNvbiA9IHBhcnQucmF3RmluaXNoUmVhc29uO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgICB2YXIgX2EyMSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAocmVjb3JkZWRTdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gKGFib3J0U2lnbmFsID09IG51bGwgPyB2b2lkIDAgOiBhYm9ydFNpZ25hbC5hYm9ydGVkKSA/IGFib3J0U2lnbmFsLnJlYXNvbiA6IG5ldyBOb091dHB1dEdlbmVyYXRlZEVycm9yKHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCJObyBvdXRwdXQgZ2VuZXJhdGVkLiBDaGVjayB0aGUgc3RyZWFtIGZvciBlcnJvcnMuXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZi5fZmluaXNoUmVhc29uLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICBzZWxmLl9yYXdGaW5pc2hSZWFzb24ucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIHNlbGYuX3RvdGFsVXNhZ2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIHNlbGYuX3N0ZXBzLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZpbmlzaFJlYXNvbiA9IHJlY29yZGVkRmluaXNoUmVhc29uICE9IG51bGwgPyByZWNvcmRlZEZpbmlzaFJlYXNvbiA6IFwib3RoZXJcIjtcbiAgICAgICAgICBjb25zdCB0b3RhbFVzYWdlID0gcmVjb3JkZWRUb3RhbFVzYWdlICE9IG51bGwgPyByZWNvcmRlZFRvdGFsVXNhZ2UgOiBjcmVhdGVOdWxsTGFuZ3VhZ2VNb2RlbFVzYWdlKCk7XG4gICAgICAgICAgc2VsZi5fZmluaXNoUmVhc29uLnJlc29sdmUoZmluaXNoUmVhc29uKTtcbiAgICAgICAgICBzZWxmLl9yYXdGaW5pc2hSZWFzb24ucmVzb2x2ZShyZWNvcmRlZFJhd0ZpbmlzaFJlYXNvbik7XG4gICAgICAgICAgc2VsZi5fdG90YWxVc2FnZS5yZXNvbHZlKHRvdGFsVXNhZ2UpO1xuICAgICAgICAgIHNlbGYuX3N0ZXBzLnJlc29sdmUocmVjb3JkZWRTdGVwcyk7XG4gICAgICAgICAgY29uc3QgZmluYWxTdGVwID0gcmVjb3JkZWRTdGVwc1tyZWNvcmRlZFN0ZXBzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGF3YWl0IG5vdGlmeSh7XG4gICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICBzdGVwTnVtYmVyOiBmaW5hbFN0ZXAuc3RlcE51bWJlcixcbiAgICAgICAgICAgICAgbW9kZWw6IGZpbmFsU3RlcC5tb2RlbCxcbiAgICAgICAgICAgICAgZnVuY3Rpb25JZDogZmluYWxTdGVwLmZ1bmN0aW9uSWQsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiBmaW5hbFN0ZXAubWV0YWRhdGEsXG4gICAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiBmaW5hbFN0ZXAuZXhwZXJpbWVudGFsX2NvbnRleHQsXG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbjogZmluYWxTdGVwLmZpbmlzaFJlYXNvbixcbiAgICAgICAgICAgICAgcmF3RmluaXNoUmVhc29uOiBmaW5hbFN0ZXAucmF3RmluaXNoUmVhc29uLFxuICAgICAgICAgICAgICB0b3RhbFVzYWdlLFxuICAgICAgICAgICAgICB1c2FnZTogZmluYWxTdGVwLnVzYWdlLFxuICAgICAgICAgICAgICBjb250ZW50OiBmaW5hbFN0ZXAuY29udGVudCxcbiAgICAgICAgICAgICAgdGV4dDogZmluYWxTdGVwLnRleHQsXG4gICAgICAgICAgICAgIHJlYXNvbmluZ1RleHQ6IGZpbmFsU3RlcC5yZWFzb25pbmdUZXh0LFxuICAgICAgICAgICAgICByZWFzb25pbmc6IGZpbmFsU3RlcC5yZWFzb25pbmcsXG4gICAgICAgICAgICAgIGZpbGVzOiBmaW5hbFN0ZXAuZmlsZXMsXG4gICAgICAgICAgICAgIHNvdXJjZXM6IGZpbmFsU3RlcC5zb3VyY2VzLFxuICAgICAgICAgICAgICB0b29sQ2FsbHM6IGZpbmFsU3RlcC50b29sQ2FsbHMsXG4gICAgICAgICAgICAgIHN0YXRpY1Rvb2xDYWxsczogZmluYWxTdGVwLnN0YXRpY1Rvb2xDYWxscyxcbiAgICAgICAgICAgICAgZHluYW1pY1Rvb2xDYWxsczogZmluYWxTdGVwLmR5bmFtaWNUb29sQ2FsbHMsXG4gICAgICAgICAgICAgIHRvb2xSZXN1bHRzOiBmaW5hbFN0ZXAudG9vbFJlc3VsdHMsXG4gICAgICAgICAgICAgIHN0YXRpY1Rvb2xSZXN1bHRzOiBmaW5hbFN0ZXAuc3RhdGljVG9vbFJlc3VsdHMsXG4gICAgICAgICAgICAgIGR5bmFtaWNUb29sUmVzdWx0czogZmluYWxTdGVwLmR5bmFtaWNUb29sUmVzdWx0cyxcbiAgICAgICAgICAgICAgcmVxdWVzdDogZmluYWxTdGVwLnJlcXVlc3QsXG4gICAgICAgICAgICAgIHJlc3BvbnNlOiBmaW5hbFN0ZXAucmVzcG9uc2UsXG4gICAgICAgICAgICAgIHdhcm5pbmdzOiBmaW5hbFN0ZXAud2FybmluZ3MsXG4gICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IGZpbmFsU3RlcC5wcm92aWRlck1ldGFkYXRhLFxuICAgICAgICAgICAgICBzdGVwczogcmVjb3JkZWRTdGVwc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbGxiYWNrczogW1xuICAgICAgICAgICAgICBvbkZpbmlzaCxcbiAgICAgICAgICAgICAgZ2xvYmFsVGVsZW1ldHJ5Lm9uRmluaXNoXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcm9vdFNwYW4uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICAgIGF3YWl0IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICB0ZWxlbWV0cnksXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLmZpbmlzaFJlYXNvblwiOiBmaW5pc2hSZWFzb24sXG4gICAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS50ZXh0XCI6IHsgb3V0cHV0OiAoKSA9PiBmaW5hbFN0ZXAudGV4dCB9LFxuICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UucmVhc29uaW5nXCI6IHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dDogKCkgPT4gZmluYWxTdGVwLnJlYXNvbmluZ1RleHRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UudG9vbENhbGxzXCI6IHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2EyMjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoX2EyMiA9IGZpbmFsU3RlcC50b29sQ2FsbHMpID09IG51bGwgPyB2b2lkIDAgOiBfYTIyLmxlbmd0aCkgPyBKU09OLnN0cmluZ2lmeShmaW5hbFN0ZXAudG9vbENhbGxzKSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UucHJvdmlkZXJNZXRhZGF0YVwiOiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgIGZpbmFsU3RlcC5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBcImFpLnVzYWdlLmlucHV0VG9rZW5zXCI6IHRvdGFsVXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgXCJhaS51c2FnZS5pbnB1dFRva2VuRGV0YWlscy5ub0NhY2hlVG9rZW5zXCI6IChfYTIxID0gdG90YWxVc2FnZS5pbnB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjEubm9DYWNoZVRva2VucyxcbiAgICAgICAgICAgICAgICBcImFpLnVzYWdlLmlucHV0VG9rZW5EZXRhaWxzLmNhY2hlUmVhZFRva2Vuc1wiOiAoX2IgPSB0b3RhbFVzYWdlLmlucHV0VG9rZW5EZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FjaGVSZWFkVG9rZW5zLFxuICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UuaW5wdXRUb2tlbkRldGFpbHMuY2FjaGVXcml0ZVRva2Vuc1wiOiAoX2MgPSB0b3RhbFVzYWdlLmlucHV0VG9rZW5EZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2MuY2FjaGVXcml0ZVRva2VucyxcbiAgICAgICAgICAgICAgICBcImFpLnVzYWdlLm91dHB1dFRva2Vuc1wiOiB0b3RhbFVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgICBcImFpLnVzYWdlLm91dHB1dFRva2VuRGV0YWlscy50ZXh0VG9rZW5zXCI6IChfZCA9IHRvdGFsVXNhZ2Uub3V0cHV0VG9rZW5EZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2QudGV4dFRva2VucyxcbiAgICAgICAgICAgICAgICBcImFpLnVzYWdlLm91dHB1dFRva2VuRGV0YWlscy5yZWFzb25pbmdUb2tlbnNcIjogKF9lID0gdG90YWxVc2FnZS5vdXRwdXRUb2tlbkRldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfZS5yZWFzb25pbmdUb2tlbnMsXG4gICAgICAgICAgICAgICAgXCJhaS51c2FnZS50b3RhbFRva2Vuc1wiOiB0b3RhbFVzYWdlLnRvdGFsVG9rZW5zLFxuICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UucmVhc29uaW5nVG9rZW5zXCI6IChfZiA9IHRvdGFsVXNhZ2Uub3V0cHV0VG9rZW5EZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2YucmVhc29uaW5nVG9rZW5zLFxuICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnNcIjogKF9nID0gdG90YWxVc2FnZS5pbnB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9nLmNhY2hlUmVhZFRva2Vuc1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnJvcik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcm9vdFNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzdGl0Y2hhYmxlU3RyZWFtID0gY3JlYXRlU3RpdGNoYWJsZVN0cmVhbSgpO1xuICAgIHRoaXMuYWRkU3RyZWFtID0gc3RpdGNoYWJsZVN0cmVhbS5hZGRTdHJlYW07XG4gICAgdGhpcy5jbG9zZVN0cmVhbSA9IHN0aXRjaGFibGVTdHJlYW0uY2xvc2U7XG4gICAgY29uc3QgcmVhZGVyID0gc3RpdGNoYWJsZVN0cmVhbS5zdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgbGV0IHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICBhc3luYyBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwic3RhcnRcIiB9KTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgZnVuY3Rpb24gYWJvcnQoKSB7XG4gICAgICAgICAgb25BYm9ydCA9PSBudWxsID8gdm9pZCAwIDogb25BYm9ydCh7IHN0ZXBzOiByZWNvcmRlZFN0ZXBzIH0pO1xuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICB0eXBlOiBcImFib3J0XCIsXG4gICAgICAgICAgICAvLyBUaGUgYHJlYXNvbmAgaXMgdXN1YWxseSBvZiB0eXBlIERPTUV4Y2VwdGlvbiwgYnV0IGl0IGNhbiBhbHNvIGJlIG9mIGFueSB0eXBlLFxuICAgICAgICAgICAgLy8gc28gd2UgdXNlIGdldEVycm9yTWVzc2FnZSBmb3Igc2VyaWFsaXphdGlvbiBiZWNhdXNlIGl0IGlzIGFscmVhZHkgZGVzaWduZWQgdG8gYWNjZXB0IHZhbHVlcyBvZiB0aGUgdW5rbm93biB0eXBlLlxuICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRTaWduYWwvcmVhc29uXG4gICAgICAgICAgICAuLi4oYWJvcnRTaWduYWwgPT0gbnVsbCA/IHZvaWQgMCA6IGFib3J0U2lnbmFsLnJlYXNvbikgIT09IHZvaWQgMCA/IHsgcmVhc29uOiBnZXRFcnJvck1lc3NhZ2U3KGFib3J0U2lnbmFsLnJlYXNvbikgfSA6IHt9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWJvcnRTaWduYWwgPT0gbnVsbCA/IHZvaWQgMCA6IGFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGlzQWJvcnRFcnJvcjIoZXJyb3IpICYmIChhYm9ydFNpZ25hbCA9PSBudWxsID8gdm9pZCAwIDogYWJvcnRTaWduYWwuYWJvcnRlZCkpIHtcbiAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbmNlbChyZWFzb24pIHtcbiAgICAgICAgcmV0dXJuIHN0aXRjaGFibGVTdHJlYW0uc3RyZWFtLmNhbmNlbChyZWFzb24pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgdHJhbnNmb3JtIG9mIHRyYW5zZm9ybXMpIHtcbiAgICAgIHN0cmVhbSA9IHN0cmVhbS5waXBlVGhyb3VnaChcbiAgICAgICAgdHJhbnNmb3JtKHtcbiAgICAgICAgICB0b29scyxcbiAgICAgICAgICBzdG9wU3RyZWFtKCkge1xuICAgICAgICAgICAgc3RpdGNoYWJsZVN0cmVhbS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmJhc2VTdHJlYW0gPSBzdHJlYW0ucGlwZVRocm91Z2goY3JlYXRlT3V0cHV0VHJhbnNmb3JtU3RyZWFtKG91dHB1dCAhPSBudWxsID8gb3V0cHV0IDogdGV4dCgpKSkucGlwZVRocm91Z2goZXZlbnRQcm9jZXNzb3IpO1xuICAgIGNvbnN0IHsgbWF4UmV0cmllcywgcmV0cnkgfSA9IHByZXBhcmVSZXRyaWVzKHtcbiAgICAgIG1heFJldHJpZXM6IG1heFJldHJpZXNBcmcsXG4gICAgICBhYm9ydFNpZ25hbFxuICAgIH0pO1xuICAgIGNvbnN0IHRyYWNlciA9IGdldFRyYWNlcih0ZWxlbWV0cnkpO1xuICAgIGNvbnN0IGNhbGxTZXR0aW5ncyA9IHByZXBhcmVDYWxsU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgIGNvbnN0IGJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzID0gZ2V0QmFzZVRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgbW9kZWwsXG4gICAgICB0ZWxlbWV0cnksXG4gICAgICBoZWFkZXJzLFxuICAgICAgc2V0dGluZ3M6IHsgLi4uY2FsbFNldHRpbmdzLCBtYXhSZXRyaWVzIH1cbiAgICB9KTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBtb2RlbEluZm8gPSB7IHByb3ZpZGVyOiBtb2RlbC5wcm92aWRlciwgbW9kZWxJZDogbW9kZWwubW9kZWxJZCB9O1xuICAgIGNvbnN0IGNhbGxiYWNrVGVsZW1ldHJ5UHJvcHMgPSB7XG4gICAgICBmdW5jdGlvbklkOiB0ZWxlbWV0cnkgPT0gbnVsbCA/IHZvaWQgMCA6IHRlbGVtZXRyeS5mdW5jdGlvbklkLFxuICAgICAgbWV0YWRhdGE6IHRlbGVtZXRyeSA9PSBudWxsID8gdm9pZCAwIDogdGVsZW1ldHJ5Lm1ldGFkYXRhXG4gICAgfTtcbiAgICByZWNvcmRTcGFuKHtcbiAgICAgIG5hbWU6IFwiYWkuc3RyZWFtVGV4dFwiLFxuICAgICAgYXR0cmlidXRlczogc2VsZWN0VGVsZW1ldHJ5QXR0cmlidXRlcyh7XG4gICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIC4uLmFzc2VtYmxlT3BlcmF0aW9uTmFtZSh7IG9wZXJhdGlvbklkOiBcImFpLnN0cmVhbVRleHRcIiwgdGVsZW1ldHJ5IH0pLFxuICAgICAgICAgIC4uLmJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzLFxuICAgICAgICAgIC8vIHNwZWNpZmljIHNldHRpbmdzIHRoYXQgb25seSBtYWtlIHNlbnNlIG9uIHRoZSBvdXRlciBsZXZlbDpcbiAgICAgICAgICBcImFpLnByb21wdFwiOiB7XG4gICAgICAgICAgICBpbnB1dDogKCkgPT4gSlNPTi5zdHJpbmdpZnkoeyBzeXN0ZW0sIHByb21wdCwgbWVzc2FnZXMgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdHJhY2VyLFxuICAgICAgZW5kV2hlbkRvbmU6IGZhbHNlLFxuICAgICAgZm46IGFzeW5jIChyb290U3BhbkFyZykgPT4ge1xuICAgICAgICByb290U3BhbiA9IHJvb3RTcGFuQXJnO1xuICAgICAgICBjb25zdCBpbml0aWFsUHJvbXB0ID0gYXdhaXQgc3RhbmRhcmRpemVQcm9tcHQoe1xuICAgICAgICAgIHN5c3RlbSxcbiAgICAgICAgICBwcm9tcHQsXG4gICAgICAgICAgbWVzc2FnZXNcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IG5vdGlmeSh7XG4gICAgICAgICAgZXZlbnQ6IHtcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbEluZm8sXG4gICAgICAgICAgICBzeXN0ZW0sXG4gICAgICAgICAgICBwcm9tcHQsXG4gICAgICAgICAgICBtZXNzYWdlcyxcbiAgICAgICAgICAgIHRvb2xzLFxuICAgICAgICAgICAgdG9vbENob2ljZSxcbiAgICAgICAgICAgIGFjdGl2ZVRvb2xzLFxuICAgICAgICAgICAgbWF4T3V0cHV0VG9rZW5zOiBjYWxsU2V0dGluZ3MubWF4T3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgdGVtcGVyYXR1cmU6IGNhbGxTZXR0aW5ncy50ZW1wZXJhdHVyZSxcbiAgICAgICAgICAgIHRvcFA6IGNhbGxTZXR0aW5ncy50b3BQLFxuICAgICAgICAgICAgdG9wSzogY2FsbFNldHRpbmdzLnRvcEssXG4gICAgICAgICAgICBwcmVzZW5jZVBlbmFsdHk6IGNhbGxTZXR0aW5ncy5wcmVzZW5jZVBlbmFsdHksXG4gICAgICAgICAgICBmcmVxdWVuY3lQZW5hbHR5OiBjYWxsU2V0dGluZ3MuZnJlcXVlbmN5UGVuYWx0eSxcbiAgICAgICAgICAgIHN0b3BTZXF1ZW5jZXM6IGNhbGxTZXR0aW5ncy5zdG9wU2VxdWVuY2VzLFxuICAgICAgICAgICAgc2VlZDogY2FsbFNldHRpbmdzLnNlZWQsXG4gICAgICAgICAgICBtYXhSZXRyaWVzLFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBwcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgICBzdG9wV2hlbixcbiAgICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcmlnaW5hbEFib3J0U2lnbmFsLFxuICAgICAgICAgICAgaW5jbHVkZSxcbiAgICAgICAgICAgIC4uLmNhbGxiYWNrVGVsZW1ldHJ5UHJvcHMsXG4gICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FsbGJhY2tzOiBbXG4gICAgICAgICAgICBvblN0YXJ0LFxuICAgICAgICAgICAgZ2xvYmFsVGVsZW1ldHJ5Lm9uU3RhcnRcbiAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbml0aWFsTWVzc2FnZXMgPSBpbml0aWFsUHJvbXB0Lm1lc3NhZ2VzO1xuICAgICAgICBjb25zdCBpbml0aWFsUmVzcG9uc2VNZXNzYWdlcyA9IFtdO1xuICAgICAgICBjb25zdCB7IGFwcHJvdmVkVG9vbEFwcHJvdmFscywgZGVuaWVkVG9vbEFwcHJvdmFscyB9ID0gY29sbGVjdFRvb2xBcHByb3ZhbHMoeyBtZXNzYWdlczogaW5pdGlhbE1lc3NhZ2VzIH0pO1xuICAgICAgICBpZiAoZGVuaWVkVG9vbEFwcHJvdmFscy5sZW5ndGggPiAwIHx8IGFwcHJvdmVkVG9vbEFwcHJvdmFscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgcHJvdmlkZXJFeGVjdXRlZFRvb2xBcHByb3ZhbHMgPSBbXG4gICAgICAgICAgICAuLi5hcHByb3ZlZFRvb2xBcHByb3ZhbHMsXG4gICAgICAgICAgICAuLi5kZW5pZWRUb29sQXBwcm92YWxzXG4gICAgICAgICAgXS5maWx0ZXIoKHRvb2xBcHByb3ZhbCkgPT4gdG9vbEFwcHJvdmFsLnRvb2xDYWxsLnByb3ZpZGVyRXhlY3V0ZWQpO1xuICAgICAgICAgIGNvbnN0IGxvY2FsQXBwcm92ZWRUb29sQXBwcm92YWxzID0gYXBwcm92ZWRUb29sQXBwcm92YWxzLmZpbHRlcihcbiAgICAgICAgICAgICh0b29sQXBwcm92YWwpID0+ICF0b29sQXBwcm92YWwudG9vbENhbGwucHJvdmlkZXJFeGVjdXRlZFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbG9jYWxEZW5pZWRUb29sQXBwcm92YWxzID0gZGVuaWVkVG9vbEFwcHJvdmFscy5maWx0ZXIoXG4gICAgICAgICAgICAodG9vbEFwcHJvdmFsKSA9PiAhdG9vbEFwcHJvdmFsLnRvb2xDYWxsLnByb3ZpZGVyRXhlY3V0ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGRlbmllZFByb3ZpZGVyRXhlY3V0ZWRUb29sQXBwcm92YWxzID0gZGVuaWVkVG9vbEFwcHJvdmFscy5maWx0ZXIoXG4gICAgICAgICAgICAodG9vbEFwcHJvdmFsKSA9PiB0b29sQXBwcm92YWwudG9vbENhbGwucHJvdmlkZXJFeGVjdXRlZFxuICAgICAgICAgICk7XG4gICAgICAgICAgbGV0IHRvb2xFeGVjdXRpb25TdGVwU3RyZWFtQ29udHJvbGxlcjtcbiAgICAgICAgICBjb25zdCB0b29sRXhlY3V0aW9uU3RlcFN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgIHRvb2xFeGVjdXRpb25TdGVwU3RyZWFtQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2VsZi5hZGRTdHJlYW0odG9vbEV4ZWN1dGlvblN0ZXBTdHJlYW0pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRvb2xBcHByb3ZhbCBvZiBbXG4gICAgICAgICAgICAgIC4uLmxvY2FsRGVuaWVkVG9vbEFwcHJvdmFscyxcbiAgICAgICAgICAgICAgLi4uZGVuaWVkUHJvdmlkZXJFeGVjdXRlZFRvb2xBcHByb3ZhbHNcbiAgICAgICAgICAgIF0pIHtcbiAgICAgICAgICAgICAgdG9vbEV4ZWN1dGlvblN0ZXBTdHJlYW1Db250cm9sbGVyID09IG51bGwgPyB2b2lkIDAgOiB0b29sRXhlY3V0aW9uU3RlcFN0cmVhbUNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1kZW5pZWRcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB0b29sQXBwcm92YWwudG9vbENhbGwudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbEFwcHJvdmFsLnRvb2xDYWxsLnRvb2xOYW1lXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdG9vbE91dHB1dHMgPSBbXTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBsb2NhbEFwcHJvdmVkVG9vbEFwcHJvdmFscy5tYXAoYXN5bmMgKHRvb2xBcHByb3ZhbCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVUb29sQ2FsbCh7XG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbDogdG9vbEFwcHJvdmFsLnRvb2xDYWxsLFxuICAgICAgICAgICAgICAgICAgdG9vbHMsXG4gICAgICAgICAgICAgICAgICB0cmFjZXIsXG4gICAgICAgICAgICAgICAgICB0ZWxlbWV0cnksXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlczogaW5pdGlhbE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dCxcbiAgICAgICAgICAgICAgICAgIHN0ZXBOdW1iZXI6IHJlY29yZGVkU3RlcHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgbW9kZWw6IG1vZGVsSW5mbyxcbiAgICAgICAgICAgICAgICAgIG9uVG9vbENhbGxTdGFydDogW1xuICAgICAgICAgICAgICAgICAgICBvblRvb2xDYWxsU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFRlbGVtZXRyeS5vblRvb2xDYWxsU3RhcnRcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICBvblRvb2xDYWxsRmluaXNoOiBbXG4gICAgICAgICAgICAgICAgICAgIG9uVG9vbENhbGxGaW5pc2gsXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFRlbGVtZXRyeS5vblRvb2xDYWxsRmluaXNoXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgb25QcmVsaW1pbmFyeVRvb2xSZXN1bHQ6IChyZXN1bHQyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRvb2xFeGVjdXRpb25TdGVwU3RyZWFtQ29udHJvbGxlciA9PSBudWxsID8gdm9pZCAwIDogdG9vbEV4ZWN1dGlvblN0ZXBTdHJlYW1Db250cm9sbGVyLmVucXVldWUocmVzdWx0Mik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICB0b29sRXhlY3V0aW9uU3RlcFN0cmVhbUNvbnRyb2xsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2xFeGVjdXRpb25TdGVwU3RyZWFtQ29udHJvbGxlci5lbnF1ZXVlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICB0b29sT3V0cHV0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChwcm92aWRlckV4ZWN1dGVkVG9vbEFwcHJvdmFscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGluaXRpYWxSZXNwb25zZU1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgIHJvbGU6IFwidG9vbFwiLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHByb3ZpZGVyRXhlY3V0ZWRUb29sQXBwcm92YWxzLm1hcChcbiAgICAgICAgICAgICAgICAgICh0b29sQXBwcm92YWwpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1hcHByb3ZhbC1yZXNwb25zZVwiLFxuICAgICAgICAgICAgICAgICAgICBhcHByb3ZhbElkOiB0b29sQXBwcm92YWwuYXBwcm92YWxSZXNwb25zZS5hcHByb3ZhbElkLFxuICAgICAgICAgICAgICAgICAgICBhcHByb3ZlZDogdG9vbEFwcHJvdmFsLmFwcHJvdmFsUmVzcG9uc2UuYXBwcm92ZWQsXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogdG9vbEFwcHJvdmFsLmFwcHJvdmFsUmVzcG9uc2UucmVhc29uLFxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9vbE91dHB1dHMubGVuZ3RoID4gMCB8fCBsb2NhbERlbmllZFRvb2xBcHByb3ZhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBsb2NhbFRvb2xDb250ZW50ID0gW107XG4gICAgICAgICAgICAgIGZvciAoY29uc3Qgb3V0cHV0MiBvZiB0b29sT3V0cHV0cykge1xuICAgICAgICAgICAgICAgIGxvY2FsVG9vbENvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBvdXRwdXQyLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogb3V0cHV0Mi50b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgIG91dHB1dDogYXdhaXQgY3JlYXRlVG9vbE1vZGVsT3V0cHV0KHtcbiAgICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogb3V0cHV0Mi50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogb3V0cHV0Mi5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbDogdG9vbHMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2xzW291dHB1dDIudG9vbE5hbWVdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IG91dHB1dDIudHlwZSA9PT0gXCJ0b29sLXJlc3VsdFwiID8gb3V0cHV0Mi5vdXRwdXQgOiBvdXRwdXQyLmVycm9yLFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1vZGU6IG91dHB1dDIudHlwZSA9PT0gXCJ0b29sLWVycm9yXCIgPyBcInRleHRcIiA6IFwibm9uZVwiXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgdG9vbEFwcHJvdmFsIG9mIGxvY2FsRGVuaWVkVG9vbEFwcHJvdmFscykge1xuICAgICAgICAgICAgICAgIGxvY2FsVG9vbENvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB0b29sQXBwcm92YWwudG9vbENhbGwudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sQXBwcm92YWwudG9vbENhbGwudG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJleGVjdXRpb24tZGVuaWVkXCIsXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogdG9vbEFwcHJvdmFsLmFwcHJvdmFsUmVzcG9uc2UucmVhc29uXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaW5pdGlhbFJlc3BvbnNlTWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgcm9sZTogXCJ0b29sXCIsXG4gICAgICAgICAgICAgICAgY29udGVudDogbG9jYWxUb29sQ29udGVudFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdG9vbEV4ZWN1dGlvblN0ZXBTdHJlYW1Db250cm9sbGVyID09IG51bGwgPyB2b2lkIDAgOiB0b29sRXhlY3V0aW9uU3RlcFN0cmVhbUNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVjb3JkZWRSZXNwb25zZU1lc3NhZ2VzLnB1c2goLi4uaW5pdGlhbFJlc3BvbnNlTWVzc2FnZXMpO1xuICAgICAgICBhc3luYyBmdW5jdGlvbiBzdHJlYW1TdGVwKHtcbiAgICAgICAgICBjdXJyZW50U3RlcCxcbiAgICAgICAgICByZXNwb25zZU1lc3NhZ2VzLFxuICAgICAgICAgIHVzYWdlXG4gICAgICAgIH0pIHtcbiAgICAgICAgICB2YXIgX2EyMSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9pO1xuICAgICAgICAgIGNvbnN0IGluY2x1ZGVSYXdDaHVua3MyID0gc2VsZi5pbmNsdWRlUmF3Q2h1bmtzO1xuICAgICAgICAgIGNvbnN0IHN0ZXBUaW1lb3V0SWQgPSBzdGVwVGltZW91dE1zICE9IG51bGwgPyBzZXRUaW1lb3V0KCgpID0+IHN0ZXBBYm9ydENvbnRyb2xsZXIuYWJvcnQoKSwgc3RlcFRpbWVvdXRNcykgOiB2b2lkIDA7XG4gICAgICAgICAgbGV0IGNodW5rVGltZW91dElkID0gdm9pZCAwO1xuICAgICAgICAgIGZ1bmN0aW9uIHJlc2V0Q2h1bmtUaW1lb3V0KCkge1xuICAgICAgICAgICAgaWYgKGNodW5rVGltZW91dE1zICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgaWYgKGNodW5rVGltZW91dElkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY2h1bmtUaW1lb3V0SWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNodW5rVGltZW91dElkID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAoKSA9PiBjaHVua0Fib3J0Q29udHJvbGxlci5hYm9ydCgpLFxuICAgICAgICAgICAgICAgIGNodW5rVGltZW91dE1zXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZ1bmN0aW9uIGNsZWFyQ2h1bmtUaW1lb3V0KCkge1xuICAgICAgICAgICAgaWYgKGNodW5rVGltZW91dElkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGNodW5rVGltZW91dElkKTtcbiAgICAgICAgICAgICAgY2h1bmtUaW1lb3V0SWQgPSB2b2lkIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZ1bmN0aW9uIGNsZWFyU3RlcFRpbWVvdXQoKSB7XG4gICAgICAgICAgICBpZiAoc3RlcFRpbWVvdXRJZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dChzdGVwVGltZW91dElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0ZXBGaW5pc2ggPSBuZXcgRGVsYXllZFByb21pc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBJbnB1dE1lc3NhZ2VzID0gWy4uLmluaXRpYWxNZXNzYWdlcywgLi4ucmVzcG9uc2VNZXNzYWdlc107XG4gICAgICAgICAgICBjb25zdCBwcmVwYXJlU3RlcFJlc3VsdCA9IGF3YWl0IChwcmVwYXJlU3RlcCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZVN0ZXAoe1xuICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgc3RlcHM6IHJlY29yZGVkU3RlcHMsXG4gICAgICAgICAgICAgIHN0ZXBOdW1iZXI6IHJlY29yZGVkU3RlcHMubGVuZ3RoLFxuICAgICAgICAgICAgICBtZXNzYWdlczogc3RlcElucHV0TWVzc2FnZXMsXG4gICAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjb25zdCBzdGVwTW9kZWwgPSByZXNvbHZlTGFuZ3VhZ2VNb2RlbChcbiAgICAgICAgICAgICAgKF9hMjEgPSBwcmVwYXJlU3RlcFJlc3VsdCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZVN0ZXBSZXN1bHQubW9kZWwpICE9IG51bGwgPyBfYTIxIDogbW9kZWxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzdGVwTW9kZWxJbmZvID0ge1xuICAgICAgICAgICAgICBwcm92aWRlcjogc3RlcE1vZGVsLnByb3ZpZGVyLFxuICAgICAgICAgICAgICBtb2RlbElkOiBzdGVwTW9kZWwubW9kZWxJZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHByb21wdE1lc3NhZ2VzID0gYXdhaXQgY29udmVydFRvTGFuZ3VhZ2VNb2RlbFByb21wdCh7XG4gICAgICAgICAgICAgIHByb21wdDoge1xuICAgICAgICAgICAgICAgIHN5c3RlbTogKF9iID0gcHJlcGFyZVN0ZXBSZXN1bHQgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXBhcmVTdGVwUmVzdWx0LnN5c3RlbSkgIT0gbnVsbCA/IF9iIDogaW5pdGlhbFByb21wdC5zeXN0ZW0sXG4gICAgICAgICAgICAgICAgbWVzc2FnZXM6IChfYyA9IHByZXBhcmVTdGVwUmVzdWx0ID09IG51bGwgPyB2b2lkIDAgOiBwcmVwYXJlU3RlcFJlc3VsdC5tZXNzYWdlcykgIT0gbnVsbCA/IF9jIDogc3RlcElucHV0TWVzc2FnZXNcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc3VwcG9ydGVkVXJsczogYXdhaXQgc3RlcE1vZGVsLnN1cHBvcnRlZFVybHMsXG4gICAgICAgICAgICAgIGRvd25sb2FkOiBkb3dubG9hZDJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc3RlcEFjdGl2ZVRvb2xzID0gKF9kID0gcHJlcGFyZVN0ZXBSZXN1bHQgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXBhcmVTdGVwUmVzdWx0LmFjdGl2ZVRvb2xzKSAhPSBudWxsID8gX2QgOiBhY3RpdmVUb29scztcbiAgICAgICAgICAgIGNvbnN0IHsgdG9vbENob2ljZTogc3RlcFRvb2xDaG9pY2UsIHRvb2xzOiBzdGVwVG9vbHMgfSA9IGF3YWl0IHByZXBhcmVUb29sc0FuZFRvb2xDaG9pY2Uoe1xuICAgICAgICAgICAgICB0b29scyxcbiAgICAgICAgICAgICAgdG9vbENob2ljZTogKF9lID0gcHJlcGFyZVN0ZXBSZXN1bHQgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXBhcmVTdGVwUmVzdWx0LnRvb2xDaG9pY2UpICE9IG51bGwgPyBfZSA6IHRvb2xDaG9pY2UsXG4gICAgICAgICAgICAgIGFjdGl2ZVRvb2xzOiBzdGVwQWN0aXZlVG9vbHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQgPSAoX2YgPSBwcmVwYXJlU3RlcFJlc3VsdCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZVN0ZXBSZXN1bHQuZXhwZXJpbWVudGFsX2NvbnRleHQpICE9IG51bGwgPyBfZiA6IGV4cGVyaW1lbnRhbF9jb250ZXh0O1xuICAgICAgICAgICAgY29uc3Qgc3RlcE1lc3NhZ2VzID0gKF9nID0gcHJlcGFyZVN0ZXBSZXN1bHQgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXBhcmVTdGVwUmVzdWx0Lm1lc3NhZ2VzKSAhPSBudWxsID8gX2cgOiBzdGVwSW5wdXRNZXNzYWdlcztcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBTeXN0ZW0gPSAoX2ggPSBwcmVwYXJlU3RlcFJlc3VsdCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZVN0ZXBSZXN1bHQuc3lzdGVtKSAhPSBudWxsID8gX2ggOiBpbml0aWFsUHJvbXB0LnN5c3RlbTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBQcm92aWRlck9wdGlvbnMgPSBtZXJnZU9iamVjdHMoXG4gICAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgcHJlcGFyZVN0ZXBSZXN1bHQgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXBhcmVTdGVwUmVzdWx0LnByb3ZpZGVyT3B0aW9uc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IG5vdGlmeSh7XG4gICAgICAgICAgICAgIGV2ZW50OiB7XG4gICAgICAgICAgICAgICAgc3RlcE51bWJlcjogcmVjb3JkZWRTdGVwcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgbW9kZWw6IHN0ZXBNb2RlbEluZm8sXG4gICAgICAgICAgICAgICAgc3lzdGVtOiBzdGVwU3lzdGVtLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBzdGVwTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgdG9vbHMsXG4gICAgICAgICAgICAgICAgdG9vbENob2ljZTogc3RlcFRvb2xDaG9pY2UsXG4gICAgICAgICAgICAgICAgYWN0aXZlVG9vbHM6IHN0ZXBBY3RpdmVUb29scyxcbiAgICAgICAgICAgICAgICBzdGVwczogWy4uLnJlY29yZGVkU3RlcHNdLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogc3RlcFByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgc3RvcFdoZW4sXG4gICAgICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcmlnaW5hbEFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIGluY2x1ZGUsXG4gICAgICAgICAgICAgICAgLi4uY2FsbGJhY2tUZWxlbWV0cnlQcm9wcyxcbiAgICAgICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjYWxsYmFja3M6IFtcbiAgICAgICAgICAgICAgICBvblN0ZXBTdGFydCxcbiAgICAgICAgICAgICAgICBnbG9iYWxUZWxlbWV0cnkub25TdGVwU3RhcnRcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHJlc3VsdDogeyBzdHJlYW06IHN0cmVhbTIsIHJlc3BvbnNlLCByZXF1ZXN0IH0sXG4gICAgICAgICAgICAgIGRvU3RyZWFtU3BhbixcbiAgICAgICAgICAgICAgc3RhcnRUaW1lc3RhbXBNc1xuICAgICAgICAgICAgfSA9IGF3YWl0IHJldHJ5KFxuICAgICAgICAgICAgICAoKSA9PiByZWNvcmRTcGFuKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImFpLnN0cmVhbVRleHQuZG9TdHJlYW1cIixcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBzZWxlY3RUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYXNzZW1ibGVPcGVyYXRpb25OYW1lKHtcbiAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25JZDogXCJhaS5zdHJlYW1UZXh0LmRvU3RyZWFtXCIsXG4gICAgICAgICAgICAgICAgICAgICAgdGVsZW1ldHJ5XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAuLi5iYXNlVGVsZW1ldHJ5QXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgLy8gbW9kZWw6XG4gICAgICAgICAgICAgICAgICAgIFwiYWkubW9kZWwucHJvdmlkZXJcIjogc3RlcE1vZGVsLnByb3ZpZGVyLFxuICAgICAgICAgICAgICAgICAgICBcImFpLm1vZGVsLmlkXCI6IHN0ZXBNb2RlbC5tb2RlbElkLFxuICAgICAgICAgICAgICAgICAgICAvLyBwcm9tcHQ6XG4gICAgICAgICAgICAgICAgICAgIFwiYWkucHJvbXB0Lm1lc3NhZ2VzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogKCkgPT4gc3RyaW5naWZ5Rm9yVGVsZW1ldHJ5KHByb21wdE1lc3NhZ2VzKVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBcImFpLnByb21wdC50b29sc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgbGFuZ3VhZ2UgbW9kZWwgbGV2ZWwgdG9vbHM6XG4gICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6ICgpID0+IHN0ZXBUb29scyA9PSBudWxsID8gdm9pZCAwIDogc3RlcFRvb2xzLm1hcCgodG9vbDIpID0+IEpTT04uc3RyaW5naWZ5KHRvb2wyKSlcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCJhaS5wcm9tcHQudG9vbENob2ljZVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6ICgpID0+IHN0ZXBUb29sQ2hvaWNlICE9IG51bGwgPyBKU09OLnN0cmluZ2lmeShzdGVwVG9vbENob2ljZSkgOiB2b2lkIDBcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RhbmRhcmRpemVkIGdlbi1haSBsbG0gc3BhbiBhdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5zeXN0ZW1cIjogc3RlcE1vZGVsLnByb3ZpZGVyLFxuICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXF1ZXN0Lm1vZGVsXCI6IHN0ZXBNb2RlbC5tb2RlbElkLFxuICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXF1ZXN0LmZyZXF1ZW5jeV9wZW5hbHR5XCI6IGNhbGxTZXR0aW5ncy5mcmVxdWVuY3lQZW5hbHR5LFxuICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXF1ZXN0Lm1heF90b2tlbnNcIjogY2FsbFNldHRpbmdzLm1heE91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgICAgICAgXCJnZW5fYWkucmVxdWVzdC5wcmVzZW5jZV9wZW5hbHR5XCI6IGNhbGxTZXR0aW5ncy5wcmVzZW5jZVBlbmFsdHksXG4gICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlcXVlc3Quc3RvcF9zZXF1ZW5jZXNcIjogY2FsbFNldHRpbmdzLnN0b3BTZXF1ZW5jZXMsXG4gICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlcXVlc3QudGVtcGVyYXR1cmVcIjogY2FsbFNldHRpbmdzLnRlbXBlcmF0dXJlLFxuICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXF1ZXN0LnRvcF9rXCI6IGNhbGxTZXR0aW5ncy50b3BLLFxuICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXF1ZXN0LnRvcF9wXCI6IGNhbGxTZXR0aW5ncy50b3BQXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdHJhY2VyLFxuICAgICAgICAgICAgICAgIGVuZFdoZW5Eb25lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmbjogYXN5bmMgKGRvU3RyZWFtU3BhbjIpID0+ICh7XG4gICAgICAgICAgICAgICAgICBzdGFydFRpbWVzdGFtcE1zOiBub3cyKCksXG4gICAgICAgICAgICAgICAgICAvLyBnZXQgYmVmb3JlIHRoZSBjYWxsXG4gICAgICAgICAgICAgICAgICBkb1N0cmVhbVNwYW46IGRvU3RyZWFtU3BhbjIsXG4gICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IHN0ZXBNb2RlbC5kb1N0cmVhbSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNhbGxTZXR0aW5ncyxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHM6IHN0ZXBUb29scyxcbiAgICAgICAgICAgICAgICAgICAgdG9vbENob2ljZTogc3RlcFRvb2xDaG9pY2UsXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRm9ybWF0OiBhd2FpdCAob3V0cHV0ID09IG51bGwgPyB2b2lkIDAgOiBvdXRwdXQucmVzcG9uc2VGb3JtYXQpLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IHByb21wdE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHN0ZXBQcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmF3Q2h1bmtzOiBpbmNsdWRlUmF3Q2h1bmtzMlxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbVdpdGhUb29sUmVzdWx0cyA9IHJ1blRvb2xzVHJhbnNmb3JtYXRpb24oe1xuICAgICAgICAgICAgICB0b29scyxcbiAgICAgICAgICAgICAgZ2VuZXJhdG9yU3RyZWFtOiBzdHJlYW0yLFxuICAgICAgICAgICAgICB0cmFjZXIsXG4gICAgICAgICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgICAgICAgc3lzdGVtLFxuICAgICAgICAgICAgICBtZXNzYWdlczogc3RlcElucHV0TWVzc2FnZXMsXG4gICAgICAgICAgICAgIHJlcGFpclRvb2xDYWxsLFxuICAgICAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQsXG4gICAgICAgICAgICAgIGdlbmVyYXRlSWQ6IGdlbmVyYXRlSWQyLFxuICAgICAgICAgICAgICBzdGVwTnVtYmVyOiByZWNvcmRlZFN0ZXBzLmxlbmd0aCxcbiAgICAgICAgICAgICAgbW9kZWw6IHN0ZXBNb2RlbEluZm8sXG4gICAgICAgICAgICAgIG9uVG9vbENhbGxTdGFydDogW1xuICAgICAgICAgICAgICAgIG9uVG9vbENhbGxTdGFydCxcbiAgICAgICAgICAgICAgICBnbG9iYWxUZWxlbWV0cnkub25Ub29sQ2FsbFN0YXJ0XG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIG9uVG9vbENhbGxGaW5pc2g6IFtcbiAgICAgICAgICAgICAgICBvblRvb2xDYWxsRmluaXNoLFxuICAgICAgICAgICAgICAgIGdsb2JhbFRlbGVtZXRyeS5vblRvb2xDYWxsRmluaXNoXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc3RlcFJlcXVlc3QgPSAoKF9pID0gaW5jbHVkZSA9PSBudWxsID8gdm9pZCAwIDogaW5jbHVkZS5yZXF1ZXN0Qm9keSkgIT0gbnVsbCA/IF9pIDogdHJ1ZSkgPyByZXF1ZXN0ICE9IG51bGwgPyByZXF1ZXN0IDoge30gOiB7IC4uLnJlcXVlc3QsIGJvZHk6IHZvaWQgMCB9O1xuICAgICAgICAgICAgY29uc3Qgc3RlcFRvb2xDYWxscyA9IFtdO1xuICAgICAgICAgICAgY29uc3Qgc3RlcFRvb2xPdXRwdXRzID0gW107XG4gICAgICAgICAgICBsZXQgd2FybmluZ3M7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVUb29sQ2FsbFRvb2xOYW1lcyA9IHt9O1xuICAgICAgICAgICAgbGV0IHN0ZXBGaW5pc2hSZWFzb24gPSBcIm90aGVyXCI7XG4gICAgICAgICAgICBsZXQgc3RlcFJhd0ZpbmlzaFJlYXNvbiA9IHZvaWQgMDtcbiAgICAgICAgICAgIGxldCBzdGVwVXNhZ2UgPSBjcmVhdGVOdWxsTGFuZ3VhZ2VNb2RlbFVzYWdlKCk7XG4gICAgICAgICAgICBsZXQgc3RlcFByb3ZpZGVyTWV0YWRhdGE7XG4gICAgICAgICAgICBsZXQgc3RlcEZpcnN0Q2h1bmsgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHN0ZXBSZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgaWQ6IGdlbmVyYXRlSWQyKCksXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgIG1vZGVsSWQ6IG1vZGVsSW5mby5tb2RlbElkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGFjdGl2ZVRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc2VsZi5hZGRTdHJlYW0oXG4gICAgICAgICAgICAgIHN0cmVhbVdpdGhUb29sUmVzdWx0cy5waXBlVGhyb3VnaChcbiAgICAgICAgICAgICAgICBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgICAgICAgICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2EyMiwgX2IyLCBfYzIsIF9kMiwgX2UyO1xuICAgICAgICAgICAgICAgICAgICByZXNldENodW5rVGltZW91dCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmsudHlwZSA9PT0gXCJzdHJlYW0tc3RhcnRcIikge1xuICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzID0gY2h1bmsud2FybmluZ3M7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGVwRmlyc3RDaHVuaykge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zVG9GaXJzdENodW5rID0gbm93MigpIC0gc3RhcnRUaW1lc3RhbXBNcztcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwRmlyc3RDaHVuayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIGRvU3RyZWFtU3Bhbi5hZGRFdmVudChcImFpLnN0cmVhbS5maXJzdENodW5rXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UubXNUb0ZpcnN0Q2h1bmtcIjogbXNUb0ZpcnN0Q2h1bmtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBkb1N0cmVhbVNwYW4uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLm1zVG9GaXJzdENodW5rXCI6IG1zVG9GaXJzdENodW5rXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RhcnQtc3RlcFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogc3RlcFJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nczogd2FybmluZ3MgIT0gbnVsbCA/IHdhcm5pbmdzIDogW11cbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHVua1R5cGUgPSBjaHVuay50eXBlO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNodW5rVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0b29sLWFwcHJvdmFsLXJlcXVlc3RcIjpcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dC1zdGFydFwiOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0LWVuZFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0LWRlbHRhXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVuay5kZWx0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGNodW5rLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGNodW5rLmRlbHRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IGNodW5rLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRleHQgKz0gY2h1bmsuZGVsdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJlYXNvbmluZy1zdGFydFwiOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJyZWFzb25pbmctZW5kXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJlYXNvbmluZy1kZWx0YVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZy1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogY2h1bmsuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGNodW5rLmRlbHRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBjaHVuay5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidG9vbC1jYWxsXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwVG9vbENhbGxzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0b29sLXJlc3VsdFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaHVuay5wcmVsaW1pbmFyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwVG9vbE91dHB1dHMucHVzaChjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRvb2wtZXJyb3JcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBUb29sT3V0cHV0cy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicmVzcG9uc2UtbWV0YWRhdGFcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogKF9hMjIgPSBjaHVuay5pZCkgIT0gbnVsbCA/IF9hMjIgOiBzdGVwUmVzcG9uc2UuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogKF9iMiA9IGNodW5rLnRpbWVzdGFtcCkgIT0gbnVsbCA/IF9iMiA6IHN0ZXBSZXNwb25zZS50aW1lc3RhbXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsSWQ6IChfYzIgPSBjaHVuay5tb2RlbElkKSAhPSBudWxsID8gX2MyIDogc3RlcFJlc3BvbnNlLm1vZGVsSWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImZpbmlzaFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwVXNhZ2UgPSBjaHVuay51c2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaW5pc2hSZWFzb24gPSBjaHVuay5maW5pc2hSZWFzb247XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmF3RmluaXNoUmVhc29uID0gY2h1bmsucmF3RmluaXNoUmVhc29uO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFByb3ZpZGVyTWV0YWRhdGEgPSBjaHVuay5wcm92aWRlck1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNUb0ZpbmlzaCA9IG5vdzIoKSAtIHN0YXJ0VGltZXN0YW1wTXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb1N0cmVhbVNwYW4uYWRkRXZlbnQoXCJhaS5zdHJlYW0uZmluaXNoXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9TdHJlYW1TcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLm1zVG9GaW5pc2hcIjogbXNUb0ZpbmlzaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS5hdmdPdXRwdXRUb2tlbnNQZXJTZWNvbmRcIjogMWUzICogKChfZDIgPSBzdGVwVXNhZ2Uub3V0cHV0VG9rZW5zKSAhPSBudWxsID8gX2QyIDogMCkgLyBtc1RvRmluaXNoXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzb3VyY2VcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidG9vbC1pbnB1dC1zdGFydFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUb29sQ2FsbFRvb2xOYW1lc1tjaHVuay5pZF0gPSBjaHVuay50b29sTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvb2wyID0gdG9vbHMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2xzW2NodW5rLnRvb2xOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodG9vbDIgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2wyLm9uSW5wdXRTdGFydCkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0b29sMi5vbklucHV0U3RhcnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGNodW5rLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBzdGVwSW5wdXRNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNodW5rLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljOiAoX2UyID0gY2h1bmsuZHluYW1pYykgIT0gbnVsbCA/IF9lMiA6ICh0b29sMiA9PSBudWxsID8gdm9pZCAwIDogdG9vbDIudHlwZSkgPT09IFwiZHluYW1pY1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdG9vbDIgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2wyLnRpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidG9vbC1pbnB1dC1lbmRcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFjdGl2ZVRvb2xDYWxsVG9vbE5hbWVzW2NodW5rLmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRvb2wtaW5wdXQtZGVsdGFcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBhY3RpdmVUb29sQ2FsbFRvb2xOYW1lc1tjaHVuay5pZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sMiA9IHRvb2xzID09IG51bGwgPyB2b2lkIDAgOiB0b29sc1t0b29sTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRvb2wyID09IG51bGwgPyB2b2lkIDAgOiB0b29sMi5vbklucHV0RGVsdGEpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdG9vbDIub25JbnB1dERlbHRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRleHREZWx0YTogY2h1bmsuZGVsdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogY2h1bmsuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IHN0ZXBJbnB1dE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZXJyb3JcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaW5pc2hSZWFzb24gPSBcImVycm9yXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJhd1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZVJhd0NodW5rczIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGhhdXN0aXZlQ2hlY2sgPSBjaHVua1R5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBVbmtub3duIGNodW5rIHR5cGU6ICR7ZXhoYXVzdGl2ZUNoZWNrfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgLy8gaW52b2tlIG9uRmluaXNoIGNhbGxiYWNrIGFuZCByZXNvbHZlIHRvb2xSZXN1bHRzIHByb21pc2Ugd2hlbiB0aGUgc3RyZWFtIGlzIGFib3V0IHRvIGNsb3NlOlxuICAgICAgICAgICAgICAgICAgYXN5bmMgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2EyMiwgX2IyLCBfYzIsIF9kMiwgX2UyLCBfZjIsIF9nMjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcFRvb2xDYWxsc0pzb24gPSBzdGVwVG9vbENhbGxzLmxlbmd0aCA+IDAgPyBKU09OLnN0cmluZ2lmeShzdGVwVG9vbENhbGxzKSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBkb1N0cmVhbVNwYW4uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWxlbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLmZpbmlzaFJlYXNvblwiOiBzdGVwRmluaXNoUmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UudG9vbENhbGxzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogKCkgPT4gc3RlcFRvb2xDYWxsc0pzb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UuaWRcIjogc3RlcFJlc3BvbnNlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UubW9kZWxcIjogc3RlcFJlc3BvbnNlLm1vZGVsSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS50aW1lc3RhbXBcIjogc3RlcFJlc3BvbnNlLnRpbWVzdGFtcC50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UuaW5wdXRUb2tlbnNcIjogc3RlcFVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UuaW5wdXRUb2tlbkRldGFpbHMubm9DYWNoZVRva2Vuc1wiOiAoX2EyMiA9IHN0ZXBVc2FnZS5pbnB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjIubm9DYWNoZVRva2VucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFpLnVzYWdlLmlucHV0VG9rZW5EZXRhaWxzLmNhY2hlUmVhZFRva2Vuc1wiOiAoX2IyID0gc3RlcFVzYWdlLmlucHV0VG9rZW5EZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2IyLmNhY2hlUmVhZFRva2VucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFpLnVzYWdlLmlucHV0VG9rZW5EZXRhaWxzLmNhY2hlV3JpdGVUb2tlbnNcIjogKF9jMiA9IHN0ZXBVc2FnZS5pbnB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9jMi5jYWNoZVdyaXRlVG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2Uub3V0cHV0VG9rZW5zXCI6IHN0ZXBVc2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhaS51c2FnZS5vdXRwdXRUb2tlbkRldGFpbHMudGV4dFRva2Vuc1wiOiAoX2QyID0gc3RlcFVzYWdlLm91dHB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9kMi50ZXh0VG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2Uub3V0cHV0VG9rZW5EZXRhaWxzLnJlYXNvbmluZ1Rva2Vuc1wiOiAoX2UyID0gc3RlcFVzYWdlLm91dHB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9lMi5yZWFzb25pbmdUb2tlbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhaS51c2FnZS50b3RhbFRva2Vuc1wiOiBzdGVwVXNhZ2UudG90YWxUb2tlbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhaS51c2FnZS5yZWFzb25pbmdUb2tlbnNcIjogKF9mMiA9IHN0ZXBVc2FnZS5vdXRwdXRUb2tlbkRldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfZjIucmVhc29uaW5nVG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnNcIjogKF9nMiA9IHN0ZXBVc2FnZS5pbnB1dFRva2VuRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9nMi5jYWNoZVJlYWRUb2tlbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbmRhcmRpemVkIGdlbi1haSBsbG0gc3BhbiBhdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlc3BvbnNlLmZpbmlzaF9yZWFzb25zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaW5pc2hSZWFzb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlc3BvbnNlLmlkXCI6IHN0ZXBSZXNwb25zZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXNwb25zZS5tb2RlbFwiOiBzdGVwUmVzcG9uc2UubW9kZWxJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImdlbl9haS51c2FnZS5pbnB1dF90b2tlbnNcIjogc3RlcFVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnVzYWdlLm91dHB1dF90b2tlbnNcIjogc3RlcFVzYWdlLm91dHB1dFRva2Vuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImZpbmlzaC1zdGVwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZmluaXNoUmVhc29uOiBzdGVwRmluaXNoUmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgIHJhd0ZpbmlzaFJlYXNvbjogc3RlcFJhd0ZpbmlzaFJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICB1c2FnZTogc3RlcFVzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHN0ZXBQcm92aWRlck1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5zdGVwUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UuaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbWJpbmVkVXNhZ2UgPSBhZGRMYW5ndWFnZU1vZGVsVXNhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcFVzYWdlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHN0ZXBGaW5pc2gucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkU3RlcCA9IHJlY29yZGVkU3RlcHNbcmVjb3JkZWRTdGVwcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBkb1N0cmVhbVNwYW4uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWxlbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLnRleHRcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiAoKSA9PiBwcm9jZXNzZWRTdGVwLnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UucmVhc29uaW5nXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogKCkgPT4gcHJvY2Vzc2VkU3RlcC5yZWFzb25pbmdUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLnByb3ZpZGVyTWV0YWRhdGFcIjogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRTdGVwLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICBkb1N0cmVhbVNwYW4uZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50VG9vbENhbGxzID0gc3RlcFRvb2xDYWxscy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgKHRvb2xDYWxsKSA9PiB0b29sQ2FsbC5wcm92aWRlckV4ZWN1dGVkICE9PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFRvb2xPdXRwdXRzID0gc3RlcFRvb2xPdXRwdXRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAodG9vbE91dHB1dCkgPT4gdG9vbE91dHB1dC5wcm92aWRlckV4ZWN1dGVkICE9PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdG9vbENhbGwgb2Ygc3RlcFRvb2xDYWxscykge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh0b29sQ2FsbC5wcm92aWRlckV4ZWN1dGVkICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9vbDIgPSB0b29scyA9PSBudWxsID8gdm9pZCAwIDogdG9vbHNbdG9vbENhbGwudG9vbE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICgodG9vbDIgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2wyLnR5cGUpID09PSBcInByb3ZpZGVyXCIgJiYgdG9vbDIuc3VwcG9ydHNEZWZlcnJlZFJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc1Jlc3VsdEluU3RlcCA9IHN0ZXBUb29sT3V0cHV0cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cHV0MikgPT4gKG91dHB1dDIudHlwZSA9PT0gXCJ0b29sLXJlc3VsdFwiIHx8IG91dHB1dDIudHlwZSA9PT0gXCJ0b29sLWVycm9yXCIpICYmIG91dHB1dDIudG9vbENhbGxJZCA9PT0gdG9vbENhbGwudG9vbENhbGxJZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzUmVzdWx0SW5TdGVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdEZWZlcnJlZFRvb2xDYWxscy5zZXQodG9vbENhbGwudG9vbENhbGxJZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sQ2FsbC50b29sTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvdXRwdXQyIG9mIHN0ZXBUb29sT3V0cHV0cykge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQyLnR5cGUgPT09IFwidG9vbC1yZXN1bHRcIiB8fCBvdXRwdXQyLnR5cGUgPT09IFwidG9vbC1lcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nRGVmZXJyZWRUb29sQ2FsbHMuZGVsZXRlKG91dHB1dDIudG9vbENhbGxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyU3RlcFRpbWVvdXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJDaHVua1RpbWVvdXQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIGlmOlxuICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIFRoZXJlIGFyZSBjbGllbnQgdG9vbCBjYWxscyB0aGF0IGhhdmUgYWxsIGJlZW4gZXhlY3V0ZWQsIE9SXG4gICAgICAgICAgICAgICAgICAgICAgLy8gMi4gVGhlcmUgYXJlIHBlbmRpbmcgZGVmZXJyZWQgcmVzdWx0cyBmcm9tIHByb3ZpZGVyLWV4ZWN1dGVkIHRvb2xzXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWVudFRvb2xDYWxscy5sZW5ndGggPiAwICYmIGNsaWVudFRvb2xPdXRwdXRzLmxlbmd0aCA9PT0gY2xpZW50VG9vbENhbGxzLmxlbmd0aCB8fCBwZW5kaW5nRGVmZXJyZWRUb29sQ2FsbHMuc2l6ZSA+IDApICYmIC8vIGNvbnRpbnVlIHVudGlsIGEgc3RvcCBjb25kaXRpb24gaXMgbWV0OlxuICAgICAgICAgICAgICAgICAgICAgICFhd2FpdCBpc1N0b3BDb25kaXRpb25NZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcENvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwczogcmVjb3JkZWRTdGVwc1xuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmF3YWl0IHRvUmVzcG9uc2VNZXNzYWdlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdHJhbnNmb3JtZWQgY29udGVudCB0byBjcmVhdGUgdGhlIG1lc3NhZ2VzIGZvciB0aGUgbmV4dCBzdGVwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZGVkU3RlcHNbcmVjb3JkZWRTdGVwcy5sZW5ndGggLSAxXS5jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHN0cmVhbVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlcDogY3VycmVudFN0ZXAgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZU1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZTogY29tYmluZWRVc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZVN0cmVhbSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJmaW5pc2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaFJlYXNvbjogc3RlcEZpbmlzaFJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd0ZpbmlzaFJlYXNvbjogc3RlcFJhd0ZpbmlzaFJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsVXNhZ2U6IGNvbWJpbmVkVXNhZ2VcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlU3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjbGVhclN0ZXBUaW1lb3V0KCk7XG4gICAgICAgICAgICBjbGVhckNodW5rVGltZW91dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBzdHJlYW1TdGVwKHtcbiAgICAgICAgICBjdXJyZW50U3RlcDogMCxcbiAgICAgICAgICByZXNwb25zZU1lc3NhZ2VzOiBpbml0aWFsUmVzcG9uc2VNZXNzYWdlcyxcbiAgICAgICAgICB1c2FnZTogY3JlYXRlTnVsbExhbmd1YWdlTW9kZWxVc2FnZSgpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgc2VsZi5hZGRTdHJlYW0oXG4gICAgICAgIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJlcnJvclwiLCBlcnJvciB9KTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgc2VsZi5jbG9zZVN0cmVhbSgpO1xuICAgIH0pO1xuICB9XG4gIGdldCBzdGVwcygpIHtcbiAgICB0aGlzLmNvbnN1bWVTdHJlYW0oKTtcbiAgICByZXR1cm4gdGhpcy5fc3RlcHMucHJvbWlzZTtcbiAgfVxuICBnZXQgZmluYWxTdGVwKCkge1xuICAgIHJldHVybiB0aGlzLnN0ZXBzLnRoZW4oKHN0ZXBzKSA9PiBzdGVwc1tzdGVwcy5sZW5ndGggLSAxXSk7XG4gIH1cbiAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxTdGVwLnRoZW4oKHN0ZXApID0+IHN0ZXAuY29udGVudCk7XG4gIH1cbiAgZ2V0IHdhcm5pbmdzKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC50aGVuKChzdGVwKSA9PiBzdGVwLndhcm5pbmdzKTtcbiAgfVxuICBnZXQgcHJvdmlkZXJNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAudGhlbigoc3RlcCkgPT4gc3RlcC5wcm92aWRlck1ldGFkYXRhKTtcbiAgfVxuICBnZXQgdGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAudGhlbigoc3RlcCkgPT4gc3RlcC50ZXh0KTtcbiAgfVxuICBnZXQgcmVhc29uaW5nVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAudGhlbigoc3RlcCkgPT4gc3RlcC5yZWFzb25pbmdUZXh0KTtcbiAgfVxuICBnZXQgcmVhc29uaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC50aGVuKChzdGVwKSA9PiBzdGVwLnJlYXNvbmluZyk7XG4gIH1cbiAgZ2V0IHNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxTdGVwLnRoZW4oKHN0ZXApID0+IHN0ZXAuc291cmNlcyk7XG4gIH1cbiAgZ2V0IGZpbGVzKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC50aGVuKChzdGVwKSA9PiBzdGVwLmZpbGVzKTtcbiAgfVxuICBnZXQgdG9vbENhbGxzKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC50aGVuKChzdGVwKSA9PiBzdGVwLnRvb2xDYWxscyk7XG4gIH1cbiAgZ2V0IHN0YXRpY1Rvb2xDYWxscygpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAudGhlbigoc3RlcCkgPT4gc3RlcC5zdGF0aWNUb29sQ2FsbHMpO1xuICB9XG4gIGdldCBkeW5hbWljVG9vbENhbGxzKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC50aGVuKChzdGVwKSA9PiBzdGVwLmR5bmFtaWNUb29sQ2FsbHMpO1xuICB9XG4gIGdldCB0b29sUmVzdWx0cygpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAudGhlbigoc3RlcCkgPT4gc3RlcC50b29sUmVzdWx0cyk7XG4gIH1cbiAgZ2V0IHN0YXRpY1Rvb2xSZXN1bHRzKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC50aGVuKChzdGVwKSA9PiBzdGVwLnN0YXRpY1Rvb2xSZXN1bHRzKTtcbiAgfVxuICBnZXQgZHluYW1pY1Rvb2xSZXN1bHRzKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC50aGVuKChzdGVwKSA9PiBzdGVwLmR5bmFtaWNUb29sUmVzdWx0cyk7XG4gIH1cbiAgZ2V0IHVzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsU3RlcC50aGVuKChzdGVwKSA9PiBzdGVwLnVzYWdlKTtcbiAgfVxuICBnZXQgcmVxdWVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAudGhlbigoc3RlcCkgPT4gc3RlcC5yZXF1ZXN0KTtcbiAgfVxuICBnZXQgcmVzcG9uc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxTdGVwLnRoZW4oKHN0ZXApID0+IHN0ZXAucmVzcG9uc2UpO1xuICB9XG4gIGdldCB0b3RhbFVzYWdlKCkge1xuICAgIHRoaXMuY29uc3VtZVN0cmVhbSgpO1xuICAgIHJldHVybiB0aGlzLl90b3RhbFVzYWdlLnByb21pc2U7XG4gIH1cbiAgZ2V0IGZpbmlzaFJlYXNvbigpIHtcbiAgICB0aGlzLmNvbnN1bWVTdHJlYW0oKTtcbiAgICByZXR1cm4gdGhpcy5fZmluaXNoUmVhc29uLnByb21pc2U7XG4gIH1cbiAgZ2V0IHJhd0ZpbmlzaFJlYXNvbigpIHtcbiAgICB0aGlzLmNvbnN1bWVTdHJlYW0oKTtcbiAgICByZXR1cm4gdGhpcy5fcmF3RmluaXNoUmVhc29uLnByb21pc2U7XG4gIH1cbiAgLyoqXG4gICAqIFNwbGl0IG91dCBhIG5ldyBzdHJlYW0gZnJvbSB0aGUgb3JpZ2luYWwgc3RyZWFtLlxuICAgKiBUaGUgb3JpZ2luYWwgc3RyZWFtIGlzIHJlcGxhY2VkIHRvIGFsbG93IGZvciBmdXJ0aGVyIHNwbGl0dGluZyxcbiAgICogc2luY2Ugd2UgZG8gbm90IGtub3cgaG93IG1hbnkgdGltZXMgdGhlIHN0cmVhbSB3aWxsIGJlIHNwbGl0LlxuICAgKlxuICAgKiBOb3RlOiB0aGlzIGxlYWRzIHRvIGJ1ZmZlcmluZyB0aGUgc3RyZWFtIGNvbnRlbnQgb24gdGhlIHNlcnZlci5cbiAgICogSG93ZXZlciwgdGhlIExMTSByZXN1bHRzIGFyZSBleHBlY3RlZCB0byBiZSBzbWFsbCBlbm91Z2ggdG8gbm90IGNhdXNlIGlzc3Vlcy5cbiAgICovXG4gIHRlZVN0cmVhbSgpIHtcbiAgICBjb25zdCBbc3RyZWFtMSwgc3RyZWFtMl0gPSB0aGlzLmJhc2VTdHJlYW0udGVlKCk7XG4gICAgdGhpcy5iYXNlU3RyZWFtID0gc3RyZWFtMjtcbiAgICByZXR1cm4gc3RyZWFtMTtcbiAgfVxuICBnZXQgdGV4dFN0cmVhbSgpIHtcbiAgICByZXR1cm4gY3JlYXRlQXN5bmNJdGVyYWJsZVN0cmVhbShcbiAgICAgIHRoaXMudGVlU3RyZWFtKCkucGlwZVRocm91Z2goXG4gICAgICAgIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgICAgIHRyYW5zZm9ybSh7IHBhcnQgfSwgY29udHJvbGxlcikge1xuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJ0ZXh0LWRlbHRhXCIpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHBhcnQudGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG4gIH1cbiAgZ2V0IGZ1bGxTdHJlYW0oKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUFzeW5jSXRlcmFibGVTdHJlYW0oXG4gICAgICB0aGlzLnRlZVN0cmVhbSgpLnBpcGVUaHJvdWdoKFxuICAgICAgICBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgICB0cmFuc2Zvcm0oeyBwYXJ0IH0sIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShwYXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBhc3luYyBjb25zdW1lU3RyZWFtKG9wdGlvbnMpIHtcbiAgICB2YXIgX2EyMTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY29uc3VtZVN0cmVhbSh7XG4gICAgICAgIHN0cmVhbTogdGhpcy5mdWxsU3RyZWFtLFxuICAgICAgICBvbkVycm9yOiBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLm9uRXJyb3JcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAoX2EyMSA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMub25FcnJvcikgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjEuY2FsbChvcHRpb25zLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIGdldCBleHBlcmltZW50YWxfcGFydGlhbE91dHB1dFN0cmVhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJ0aWFsT3V0cHV0U3RyZWFtO1xuICB9XG4gIGdldCBwYXJ0aWFsT3V0cHV0U3RyZWFtKCkge1xuICAgIHJldHVybiBjcmVhdGVBc3luY0l0ZXJhYmxlU3RyZWFtKFxuICAgICAgdGhpcy50ZWVTdHJlYW0oKS5waXBlVGhyb3VnaChcbiAgICAgICAgbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICAgICAgdHJhbnNmb3JtKHsgcGFydGlhbE91dHB1dCB9LCBjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBpZiAocGFydGlhbE91dHB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShwYXJ0aWFsT3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBnZXQgZWxlbWVudFN0cmVhbSgpIHtcbiAgICB2YXIgX2EyMSwgX2IsIF9jO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IChfYTIxID0gdGhpcy5vdXRwdXRTcGVjaWZpY2F0aW9uKSA9PSBudWxsID8gdm9pZCAwIDogX2EyMS5jcmVhdGVFbGVtZW50U3RyZWFtVHJhbnNmb3JtKCk7XG4gICAgaWYgKHRyYW5zZm9ybSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3IyKHtcbiAgICAgICAgZnVuY3Rpb25hbGl0eTogYGVsZW1lbnQgc3RyZWFtcyBpbiAkeyhfYyA9IChfYiA9IHRoaXMub3V0cHV0U3BlY2lmaWNhdGlvbikgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLm5hbWUpICE9IG51bGwgPyBfYyA6IFwidGV4dFwifSBtb2RlYFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVBc3luY0l0ZXJhYmxlU3RyZWFtKHRoaXMudGVlU3RyZWFtKCkucGlwZVRocm91Z2godHJhbnNmb3JtKSk7XG4gIH1cbiAgZ2V0IG91dHB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbFN0ZXAudGhlbigoc3RlcCkgPT4ge1xuICAgICAgdmFyIF9hMjE7XG4gICAgICBjb25zdCBvdXRwdXQgPSAoX2EyMSA9IHRoaXMub3V0cHV0U3BlY2lmaWNhdGlvbikgIT0gbnVsbCA/IF9hMjEgOiB0ZXh0KCk7XG4gICAgICByZXR1cm4gb3V0cHV0LnBhcnNlQ29tcGxldGVPdXRwdXQoXG4gICAgICAgIHsgdGV4dDogc3RlcC50ZXh0IH0sXG4gICAgICAgIHtcbiAgICAgICAgICByZXNwb25zZTogc3RlcC5yZXNwb25zZSxcbiAgICAgICAgICB1c2FnZTogc3RlcC51c2FnZSxcbiAgICAgICAgICBmaW5pc2hSZWFzb246IHN0ZXAuZmluaXNoUmVhc29uXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgdG9VSU1lc3NhZ2VTdHJlYW0oe1xuICAgIG9yaWdpbmFsTWVzc2FnZXMsXG4gICAgZ2VuZXJhdGVNZXNzYWdlSWQsXG4gICAgb25GaW5pc2gsXG4gICAgbWVzc2FnZU1ldGFkYXRhLFxuICAgIHNlbmRSZWFzb25pbmcgPSB0cnVlLFxuICAgIHNlbmRTb3VyY2VzID0gZmFsc2UsXG4gICAgc2VuZFN0YXJ0ID0gdHJ1ZSxcbiAgICBzZW5kRmluaXNoID0gdHJ1ZSxcbiAgICBvbkVycm9yID0gZ2V0RXJyb3JNZXNzYWdlN1xuICB9ID0ge30pIHtcbiAgICBjb25zdCByZXNwb25zZU1lc3NhZ2VJZCA9IGdlbmVyYXRlTWVzc2FnZUlkICE9IG51bGwgPyBnZXRSZXNwb25zZVVJTWVzc2FnZUlkKHtcbiAgICAgIG9yaWdpbmFsTWVzc2FnZXMsXG4gICAgICByZXNwb25zZU1lc3NhZ2VJZDogZ2VuZXJhdGVNZXNzYWdlSWRcbiAgICB9KSA6IHZvaWQgMDtcbiAgICBjb25zdCBpc0R5bmFtaWMgPSAocGFydCkgPT4ge1xuICAgICAgdmFyIF9hMjE7XG4gICAgICBjb25zdCB0b29sMiA9IChfYTIxID0gdGhpcy50b29scykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjFbcGFydC50b29sTmFtZV07XG4gICAgICBpZiAodG9vbDIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcGFydC5keW5hbWljO1xuICAgICAgfVxuICAgICAgcmV0dXJuICh0b29sMiA9PSBudWxsID8gdm9pZCAwIDogdG9vbDIudHlwZSkgPT09IFwiZHluYW1pY1wiID8gdHJ1ZSA6IHZvaWQgMDtcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VTdHJlYW0gPSB0aGlzLmZ1bGxTdHJlYW0ucGlwZVRocm91Z2goXG4gICAgICBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgdHJhbnNmb3JtOiBhc3luYyAocGFydCwgY29udHJvbGxlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VNZXRhZGF0YVZhbHVlID0gbWVzc2FnZU1ldGFkYXRhID09IG51bGwgPyB2b2lkIDAgOiBtZXNzYWdlTWV0YWRhdGEoeyBwYXJ0IH0pO1xuICAgICAgICAgIGNvbnN0IHBhcnRUeXBlID0gcGFydC50eXBlO1xuICAgICAgICAgIHN3aXRjaCAocGFydFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0LXN0YXJ0XCI6IHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHQtc3RhcnRcIixcbiAgICAgICAgICAgICAgICBpZDogcGFydC5pZCxcbiAgICAgICAgICAgICAgICAuLi5wYXJ0LnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCA/IHsgcHJvdmlkZXJNZXRhZGF0YTogcGFydC5wcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidGV4dC1kZWx0YVwiOiB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgaWQ6IHBhcnQuaWQsXG4gICAgICAgICAgICAgICAgZGVsdGE6IHBhcnQudGV4dCxcbiAgICAgICAgICAgICAgICAuLi5wYXJ0LnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCA/IHsgcHJvdmlkZXJNZXRhZGF0YTogcGFydC5wcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidGV4dC1lbmRcIjoge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dC1lbmRcIixcbiAgICAgICAgICAgICAgICBpZDogcGFydC5pZCxcbiAgICAgICAgICAgICAgICAuLi5wYXJ0LnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCA/IHsgcHJvdmlkZXJNZXRhZGF0YTogcGFydC5wcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmVhc29uaW5nLXN0YXJ0XCI6IHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZy1zdGFydFwiLFxuICAgICAgICAgICAgICAgIGlkOiBwYXJ0LmlkLFxuICAgICAgICAgICAgICAgIC4uLnBhcnQucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhOiBwYXJ0LnByb3ZpZGVyTWV0YWRhdGEgfSA6IHt9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJyZWFzb25pbmctZGVsdGFcIjoge1xuICAgICAgICAgICAgICBpZiAoc2VuZFJlYXNvbmluZykge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZy1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IHBhcnQuaWQsXG4gICAgICAgICAgICAgICAgICBkZWx0YTogcGFydC50ZXh0LFxuICAgICAgICAgICAgICAgICAgLi4ucGFydC5wcm92aWRlck1ldGFkYXRhICE9IG51bGwgPyB7IHByb3ZpZGVyTWV0YWRhdGE6IHBhcnQucHJvdmlkZXJNZXRhZGF0YSB9IDoge31cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJyZWFzb25pbmctZW5kXCI6IHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZy1lbmRcIixcbiAgICAgICAgICAgICAgICBpZDogcGFydC5pZCxcbiAgICAgICAgICAgICAgICAuLi5wYXJ0LnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCA/IHsgcHJvdmlkZXJNZXRhZGF0YTogcGFydC5wcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZmlsZVwiOiB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgICAgICAgICAgbWVkaWFUeXBlOiBwYXJ0LmZpbGUubWVkaWFUeXBlLFxuICAgICAgICAgICAgICAgIHVybDogYGRhdGE6JHtwYXJ0LmZpbGUubWVkaWFUeXBlfTtiYXNlNjQsJHtwYXJ0LmZpbGUuYmFzZTY0fWAsXG4gICAgICAgICAgICAgICAgLi4ucGFydC5wcm92aWRlck1ldGFkYXRhICE9IG51bGwgPyB7IHByb3ZpZGVyTWV0YWRhdGE6IHBhcnQucHJvdmlkZXJNZXRhZGF0YSB9IDoge31cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInNvdXJjZVwiOiB7XG4gICAgICAgICAgICAgIGlmIChzZW5kU291cmNlcyAmJiBwYXJ0LnNvdXJjZVR5cGUgPT09IFwidXJsXCIpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzb3VyY2UtdXJsXCIsXG4gICAgICAgICAgICAgICAgICBzb3VyY2VJZDogcGFydC5pZCxcbiAgICAgICAgICAgICAgICAgIHVybDogcGFydC51cmwsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogcGFydC50aXRsZSxcbiAgICAgICAgICAgICAgICAgIC4uLnBhcnQucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhOiBwYXJ0LnByb3ZpZGVyTWV0YWRhdGEgfSA6IHt9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHNlbmRTb3VyY2VzICYmIHBhcnQuc291cmNlVHlwZSA9PT0gXCJkb2N1bWVudFwiKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic291cmNlLWRvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgICBzb3VyY2VJZDogcGFydC5pZCxcbiAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogcGFydC5tZWRpYVR5cGUsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogcGFydC50aXRsZSxcbiAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgLi4ucGFydC5wcm92aWRlck1ldGFkYXRhICE9IG51bGwgPyB7IHByb3ZpZGVyTWV0YWRhdGE6IHBhcnQucHJvdmlkZXJNZXRhZGF0YSB9IDoge31cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJ0b29sLWlucHV0LXN0YXJ0XCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgZHluYW1pYyA9IGlzRHluYW1pYyhwYXJ0KTtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LmlkLFxuICAgICAgICAgICAgICAgIHRvb2xOYW1lOiBwYXJ0LnRvb2xOYW1lLFxuICAgICAgICAgICAgICAgIC4uLnBhcnQucHJvdmlkZXJFeGVjdXRlZCAhPSBudWxsID8geyBwcm92aWRlckV4ZWN1dGVkOiBwYXJ0LnByb3ZpZGVyRXhlY3V0ZWQgfSA6IHt9LFxuICAgICAgICAgICAgICAgIC4uLnBhcnQucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhOiBwYXJ0LnByb3ZpZGVyTWV0YWRhdGEgfSA6IHt9LFxuICAgICAgICAgICAgICAgIC4uLmR5bmFtaWMgIT0gbnVsbCA/IHsgZHluYW1pYyB9IDoge30sXG4gICAgICAgICAgICAgICAgLi4ucGFydC50aXRsZSAhPSBudWxsID8geyB0aXRsZTogcGFydC50aXRsZSB9IDoge31cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInRvb2wtaW5wdXQtZGVsdGFcIjoge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuaWQsXG4gICAgICAgICAgICAgICAgaW5wdXRUZXh0RGVsdGE6IHBhcnQuZGVsdGFcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInRvb2wtY2FsbFwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGR5bmFtaWMgPSBpc0R5bmFtaWMocGFydCk7XG4gICAgICAgICAgICAgIGlmIChwYXJ0LmludmFsaWQpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWVycm9yXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogcGFydC50b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBwYXJ0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgLi4ucGFydC5wcm92aWRlckV4ZWN1dGVkICE9IG51bGwgPyB7IHByb3ZpZGVyRXhlY3V0ZWQ6IHBhcnQucHJvdmlkZXJFeGVjdXRlZCB9IDoge30sXG4gICAgICAgICAgICAgICAgICAuLi5wYXJ0LnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCA/IHsgcHJvdmlkZXJNZXRhZGF0YTogcGFydC5wcm92aWRlck1ldGFkYXRhIH0gOiB7fSxcbiAgICAgICAgICAgICAgICAgIC4uLmR5bmFtaWMgIT0gbnVsbCA/IHsgZHluYW1pYyB9IDoge30sXG4gICAgICAgICAgICAgICAgICBlcnJvclRleHQ6IG9uRXJyb3IocGFydC5lcnJvciksXG4gICAgICAgICAgICAgICAgICAuLi5wYXJ0LnRpdGxlICE9IG51bGwgPyB7IHRpdGxlOiBwYXJ0LnRpdGxlIH0gOiB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogcGFydC50b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBwYXJ0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgLi4ucGFydC5wcm92aWRlckV4ZWN1dGVkICE9IG51bGwgPyB7IHByb3ZpZGVyRXhlY3V0ZWQ6IHBhcnQucHJvdmlkZXJFeGVjdXRlZCB9IDoge30sXG4gICAgICAgICAgICAgICAgICAuLi5wYXJ0LnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCA/IHsgcHJvdmlkZXJNZXRhZGF0YTogcGFydC5wcm92aWRlck1ldGFkYXRhIH0gOiB7fSxcbiAgICAgICAgICAgICAgICAgIC4uLmR5bmFtaWMgIT0gbnVsbCA/IHsgZHluYW1pYyB9IDoge30sXG4gICAgICAgICAgICAgICAgICAuLi5wYXJ0LnRpdGxlICE9IG51bGwgPyB7IHRpdGxlOiBwYXJ0LnRpdGxlIH0gOiB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiOiB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWFwcHJvdmFsLXJlcXVlc3RcIixcbiAgICAgICAgICAgICAgICBhcHByb3ZhbElkOiBwYXJ0LmFwcHJvdmFsSWQsXG4gICAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbC50b29sQ2FsbElkXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJ0b29sLXJlc3VsdFwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGR5bmFtaWMgPSBpc0R5bmFtaWMocGFydCk7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiBwYXJ0Lm91dHB1dCxcbiAgICAgICAgICAgICAgICAuLi5wYXJ0LnByb3ZpZGVyRXhlY3V0ZWQgIT0gbnVsbCA/IHsgcHJvdmlkZXJFeGVjdXRlZDogcGFydC5wcm92aWRlckV4ZWN1dGVkIH0gOiB7fSxcbiAgICAgICAgICAgICAgICAuLi5wYXJ0LnByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCA/IHsgcHJvdmlkZXJNZXRhZGF0YTogcGFydC5wcm92aWRlck1ldGFkYXRhIH0gOiB7fSxcbiAgICAgICAgICAgICAgICAuLi5wYXJ0LnByZWxpbWluYXJ5ICE9IG51bGwgPyB7IHByZWxpbWluYXJ5OiBwYXJ0LnByZWxpbWluYXJ5IH0gOiB7fSxcbiAgICAgICAgICAgICAgICAuLi5keW5hbWljICE9IG51bGwgPyB7IGR5bmFtaWMgfSA6IHt9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJ0b29sLWVycm9yXCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgZHluYW1pYyA9IGlzRHluYW1pYyhwYXJ0KTtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtb3V0cHV0LWVycm9yXCIsXG4gICAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgIGVycm9yVGV4dDogcGFydC5wcm92aWRlckV4ZWN1dGVkID8gdHlwZW9mIHBhcnQuZXJyb3IgPT09IFwic3RyaW5nXCIgPyBwYXJ0LmVycm9yIDogSlNPTi5zdHJpbmdpZnkocGFydC5lcnJvcikgOiBvbkVycm9yKHBhcnQuZXJyb3IpLFxuICAgICAgICAgICAgICAgIC4uLnBhcnQucHJvdmlkZXJFeGVjdXRlZCAhPSBudWxsID8geyBwcm92aWRlckV4ZWN1dGVkOiBwYXJ0LnByb3ZpZGVyRXhlY3V0ZWQgfSA6IHt9LFxuICAgICAgICAgICAgICAgIC4uLnBhcnQucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhOiBwYXJ0LnByb3ZpZGVyTWV0YWRhdGEgfSA6IHt9LFxuICAgICAgICAgICAgICAgIC4uLmR5bmFtaWMgIT0gbnVsbCA/IHsgZHluYW1pYyB9IDoge31cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInRvb2wtb3V0cHV0LWRlbmllZFwiOiB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1kZW5pZWRcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImVycm9yXCI6IHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0OiBvbkVycm9yKHBhcnQuZXJyb3IpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJzdGFydC1zdGVwXCI6IHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJzdGFydC1zdGVwXCIgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImZpbmlzaC1zdGVwXCI6IHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJmaW5pc2gtc3RlcFwiIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJzdGFydFwiOiB7XG4gICAgICAgICAgICAgIGlmIChzZW5kU3RhcnQpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdGFydFwiLFxuICAgICAgICAgICAgICAgICAgLi4ubWVzc2FnZU1ldGFkYXRhVmFsdWUgIT0gbnVsbCA/IHsgbWVzc2FnZU1ldGFkYXRhOiBtZXNzYWdlTWV0YWRhdGFWYWx1ZSB9IDoge30sXG4gICAgICAgICAgICAgICAgICAuLi5yZXNwb25zZU1lc3NhZ2VJZCAhPSBudWxsID8geyBtZXNzYWdlSWQ6IHJlc3BvbnNlTWVzc2FnZUlkIH0gOiB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImZpbmlzaFwiOiB7XG4gICAgICAgICAgICAgIGlmIChzZW5kRmluaXNoKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZmluaXNoXCIsXG4gICAgICAgICAgICAgICAgICBmaW5pc2hSZWFzb246IHBhcnQuZmluaXNoUmVhc29uLFxuICAgICAgICAgICAgICAgICAgLi4ubWVzc2FnZU1ldGFkYXRhVmFsdWUgIT0gbnVsbCA/IHsgbWVzc2FnZU1ldGFkYXRhOiBtZXNzYWdlTWV0YWRhdGFWYWx1ZSB9IDoge31cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJhYm9ydFwiOiB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShwYXJ0KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidG9vbC1pbnB1dC1lbmRcIjoge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjoge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhoYXVzdGl2ZUNoZWNrID0gcGFydFR5cGU7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaHVuayB0eXBlOiAke2V4aGF1c3RpdmVDaGVja31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1lc3NhZ2VNZXRhZGF0YVZhbHVlICE9IG51bGwgJiYgcGFydFR5cGUgIT09IFwic3RhcnRcIiAmJiBwYXJ0VHlwZSAhPT0gXCJmaW5pc2hcIikge1xuICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJtZXNzYWdlLW1ldGFkYXRhXCIsXG4gICAgICAgICAgICAgIG1lc3NhZ2VNZXRhZGF0YTogbWVzc2FnZU1ldGFkYXRhVmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBjcmVhdGVBc3luY0l0ZXJhYmxlU3RyZWFtKFxuICAgICAgaGFuZGxlVUlNZXNzYWdlU3RyZWFtRmluaXNoKHtcbiAgICAgICAgc3RyZWFtOiBiYXNlU3RyZWFtLFxuICAgICAgICBtZXNzYWdlSWQ6IHJlc3BvbnNlTWVzc2FnZUlkICE9IG51bGwgPyByZXNwb25zZU1lc3NhZ2VJZCA6IGdlbmVyYXRlTWVzc2FnZUlkID09IG51bGwgPyB2b2lkIDAgOiBnZW5lcmF0ZU1lc3NhZ2VJZCgpLFxuICAgICAgICBvcmlnaW5hbE1lc3NhZ2VzLFxuICAgICAgICBvbkZpbmlzaCxcbiAgICAgICAgb25FcnJvclxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIHBpcGVVSU1lc3NhZ2VTdHJlYW1Ub1Jlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgb3JpZ2luYWxNZXNzYWdlcyxcbiAgICBnZW5lcmF0ZU1lc3NhZ2VJZCxcbiAgICBvbkZpbmlzaCxcbiAgICBtZXNzYWdlTWV0YWRhdGEsXG4gICAgc2VuZFJlYXNvbmluZyxcbiAgICBzZW5kU291cmNlcyxcbiAgICBzZW5kRmluaXNoLFxuICAgIHNlbmRTdGFydCxcbiAgICBvbkVycm9yLFxuICAgIC4uLmluaXRcbiAgfSA9IHt9KSB7XG4gICAgcGlwZVVJTWVzc2FnZVN0cmVhbVRvUmVzcG9uc2Uoe1xuICAgICAgcmVzcG9uc2UsXG4gICAgICBzdHJlYW06IHRoaXMudG9VSU1lc3NhZ2VTdHJlYW0oe1xuICAgICAgICBvcmlnaW5hbE1lc3NhZ2VzLFxuICAgICAgICBnZW5lcmF0ZU1lc3NhZ2VJZCxcbiAgICAgICAgb25GaW5pc2gsXG4gICAgICAgIG1lc3NhZ2VNZXRhZGF0YSxcbiAgICAgICAgc2VuZFJlYXNvbmluZyxcbiAgICAgICAgc2VuZFNvdXJjZXMsXG4gICAgICAgIHNlbmRGaW5pc2gsXG4gICAgICAgIHNlbmRTdGFydCxcbiAgICAgICAgb25FcnJvclxuICAgICAgfSksXG4gICAgICAuLi5pbml0XG4gICAgfSk7XG4gIH1cbiAgcGlwZVRleHRTdHJlYW1Ub1Jlc3BvbnNlKHJlc3BvbnNlLCBpbml0KSB7XG4gICAgcGlwZVRleHRTdHJlYW1Ub1Jlc3BvbnNlKHtcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgdGV4dFN0cmVhbTogdGhpcy50ZXh0U3RyZWFtLFxuICAgICAgLi4uaW5pdFxuICAgIH0pO1xuICB9XG4gIHRvVUlNZXNzYWdlU3RyZWFtUmVzcG9uc2Uoe1xuICAgIG9yaWdpbmFsTWVzc2FnZXMsXG4gICAgZ2VuZXJhdGVNZXNzYWdlSWQsXG4gICAgb25GaW5pc2gsXG4gICAgbWVzc2FnZU1ldGFkYXRhLFxuICAgIHNlbmRSZWFzb25pbmcsXG4gICAgc2VuZFNvdXJjZXMsXG4gICAgc2VuZEZpbmlzaCxcbiAgICBzZW5kU3RhcnQsXG4gICAgb25FcnJvcixcbiAgICAuLi5pbml0XG4gIH0gPSB7fSkge1xuICAgIHJldHVybiBjcmVhdGVVSU1lc3NhZ2VTdHJlYW1SZXNwb25zZSh7XG4gICAgICBzdHJlYW06IHRoaXMudG9VSU1lc3NhZ2VTdHJlYW0oe1xuICAgICAgICBvcmlnaW5hbE1lc3NhZ2VzLFxuICAgICAgICBnZW5lcmF0ZU1lc3NhZ2VJZCxcbiAgICAgICAgb25GaW5pc2gsXG4gICAgICAgIG1lc3NhZ2VNZXRhZGF0YSxcbiAgICAgICAgc2VuZFJlYXNvbmluZyxcbiAgICAgICAgc2VuZFNvdXJjZXMsXG4gICAgICAgIHNlbmRGaW5pc2gsXG4gICAgICAgIHNlbmRTdGFydCxcbiAgICAgICAgb25FcnJvclxuICAgICAgfSksXG4gICAgICAuLi5pbml0XG4gICAgfSk7XG4gIH1cbiAgdG9UZXh0U3RyZWFtUmVzcG9uc2UoaW5pdCkge1xuICAgIHJldHVybiBjcmVhdGVUZXh0U3RyZWFtUmVzcG9uc2Uoe1xuICAgICAgdGV4dFN0cmVhbTogdGhpcy50ZXh0U3RyZWFtLFxuICAgICAgLi4uaW5pdFxuICAgIH0pO1xuICB9XG59O1xuXG4vLyBzcmMvYWdlbnQvdG9vbC1sb29wLWFnZW50LnRzXG52YXIgVG9vbExvb3BBZ2VudCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICB0aGlzLnZlcnNpb24gPSBcImFnZW50LXYxXCI7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGFnZW50LlxuICAgKi9cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmlkO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdG9vbHMgdGhhdCB0aGUgYWdlbnQgY2FuIHVzZS5cbiAgICovXG4gIGdldCB0b29scygpIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy50b29scztcbiAgfVxuICBhc3luYyBwcmVwYXJlQ2FsbChvcHRpb25zKSB7XG4gICAgdmFyIF9hMjEsIF9iLCBfYywgX2Q7XG4gICAgY29uc3QgeyBvblN0ZXBGaW5pc2g6IF9zZXR0aW5nc09uU3RlcEZpbmlzaCwgLi4uc2V0dGluZ3NXaXRob3V0Q2FsbGJhY2sgfSA9IHRoaXMuc2V0dGluZ3M7XG4gICAgY29uc3QgYmFzZUNhbGxBcmdzID0ge1xuICAgICAgLi4uc2V0dGluZ3NXaXRob3V0Q2FsbGJhY2ssXG4gICAgICBzdG9wV2hlbjogKF9hMjEgPSB0aGlzLnNldHRpbmdzLnN0b3BXaGVuKSAhPSBudWxsID8gX2EyMSA6IHN0ZXBDb3VudElzKDIwKSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9O1xuICAgIGNvbnN0IHByZXBhcmVkQ2FsbEFyZ3MgPSAoX2QgPSBhd2FpdCAoKF9jID0gKF9iID0gdGhpcy5zZXR0aW5ncykucHJlcGFyZUNhbGwpID09IG51bGwgPyB2b2lkIDAgOiBfYy5jYWxsKFxuICAgICAgX2IsXG4gICAgICBiYXNlQ2FsbEFyZ3NcbiAgICApKSkgIT0gbnVsbCA/IF9kIDogYmFzZUNhbGxBcmdzO1xuICAgIGNvbnN0IHsgaW5zdHJ1Y3Rpb25zLCBtZXNzYWdlcywgcHJvbXB0LCAuLi5jYWxsQXJncyB9ID0gcHJlcGFyZWRDYWxsQXJncztcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY2FsbEFyZ3MsXG4gICAgICAvLyByZXN0b3JlIHByb21wdCB0eXBlc1xuICAgICAgLi4ueyBzeXN0ZW06IGluc3RydWN0aW9ucywgbWVzc2FnZXMsIHByb21wdCB9XG4gICAgfTtcbiAgfVxuICBtZXJnZU9uU3RlcEZpbmlzaENhbGxiYWNrcyhtZXRob2RDYWxsYmFjaykge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yQ2FsbGJhY2sgPSB0aGlzLnNldHRpbmdzLm9uU3RlcEZpbmlzaDtcbiAgICBpZiAobWV0aG9kQ2FsbGJhY2sgJiYgY29uc3RydWN0b3JDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGFzeW5jIChzdGVwUmVzdWx0KSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbnN0cnVjdG9yQ2FsbGJhY2soc3RlcFJlc3VsdCk7XG4gICAgICAgIGF3YWl0IG1ldGhvZENhbGxiYWNrKHN0ZXBSZXN1bHQpO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGhvZENhbGxiYWNrICE9IG51bGwgPyBtZXRob2RDYWxsYmFjayA6IGNvbnN0cnVjdG9yQ2FsbGJhY2s7XG4gIH1cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiBvdXRwdXQgZnJvbSB0aGUgYWdlbnQgKG5vbi1zdHJlYW1pbmcpLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGUoe1xuICAgIGFib3J0U2lnbmFsLFxuICAgIHRpbWVvdXQsXG4gICAgb25TdGVwRmluaXNoLFxuICAgIC4uLm9wdGlvbnNcbiAgfSkge1xuICAgIHJldHVybiBnZW5lcmF0ZVRleHQoe1xuICAgICAgLi4uYXdhaXQgdGhpcy5wcmVwYXJlQ2FsbChvcHRpb25zKSxcbiAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgdGltZW91dCxcbiAgICAgIG9uU3RlcEZpbmlzaDogdGhpcy5tZXJnZU9uU3RlcEZpbmlzaENhbGxiYWNrcyhvblN0ZXBGaW5pc2gpXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFN0cmVhbXMgYW4gb3V0cHV0IGZyb20gdGhlIGFnZW50IChzdHJlYW1pbmcpLlxuICAgKi9cbiAgYXN5bmMgc3RyZWFtKHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICB0aW1lb3V0LFxuICAgIGV4cGVyaW1lbnRhbF90cmFuc2Zvcm0sXG4gICAgb25TdGVwRmluaXNoLFxuICAgIC4uLm9wdGlvbnNcbiAgfSkge1xuICAgIHJldHVybiBzdHJlYW1UZXh0KHtcbiAgICAgIC4uLmF3YWl0IHRoaXMucHJlcGFyZUNhbGwob3B0aW9ucyksXG4gICAgICBhYm9ydFNpZ25hbCxcbiAgICAgIHRpbWVvdXQsXG4gICAgICBleHBlcmltZW50YWxfdHJhbnNmb3JtLFxuICAgICAgb25TdGVwRmluaXNoOiB0aGlzLm1lcmdlT25TdGVwRmluaXNoQ2FsbGJhY2tzKG9uU3RlcEZpbmlzaClcbiAgICB9KTtcbiAgfVxufTtcblxuLy8gc3JjL3VpLW1lc3NhZ2Utc3RyZWFtL2NyZWF0ZS11aS1tZXNzYWdlLXN0cmVhbS50c1xuaW1wb3J0IHtcbiAgZ2VuZXJhdGVJZCBhcyBnZW5lcmF0ZUlkRnVuYyxcbiAgZ2V0RXJyb3JNZXNzYWdlIGFzIGdldEVycm9yTWVzc2FnZThcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmZ1bmN0aW9uIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbSh7XG4gIGV4ZWN1dGUsXG4gIG9uRXJyb3IgPSBnZXRFcnJvck1lc3NhZ2U4LFxuICBvcmlnaW5hbE1lc3NhZ2VzLFxuICBvblN0ZXBGaW5pc2gsXG4gIG9uRmluaXNoLFxuICBnZW5lcmF0ZUlkOiBnZW5lcmF0ZUlkMiA9IGdlbmVyYXRlSWRGdW5jXG59KSB7XG4gIGxldCBjb250cm9sbGVyO1xuICBjb25zdCBvbmdvaW5nU3RyZWFtUHJvbWlzZXMgPSBbXTtcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICBzdGFydChjb250cm9sbGVyQXJnKSB7XG4gICAgICBjb250cm9sbGVyID0gY29udHJvbGxlckFyZztcbiAgICB9XG4gIH0pO1xuICBmdW5jdGlvbiBzYWZlRW5xdWV1ZShkYXRhKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShkYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgIH1cbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWN1dGUoe1xuICAgICAgd3JpdGVyOiB7XG4gICAgICAgIHdyaXRlKHBhcnQpIHtcbiAgICAgICAgICBzYWZlRW5xdWV1ZShwYXJ0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyZ2Uoc3RyZWFtQXJnKSB7XG4gICAgICAgICAgb25nb2luZ1N0cmVhbVByb21pc2VzLnB1c2goXG4gICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBzdHJlYW1BcmcuZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSlcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHNhZmVFbnF1ZXVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgc2FmZUVucXVldWUoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICBlcnJvclRleHQ6IG9uRXJyb3IoZXJyb3IpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgb25nb2luZ1N0cmVhbVByb21pc2VzLnB1c2goXG4gICAgICAgIHJlc3VsdC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBzYWZlRW5xdWV1ZSh7XG4gICAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgICBlcnJvclRleHQ6IG9uRXJyb3IoZXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBzYWZlRW5xdWV1ZSh7XG4gICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICBlcnJvclRleHQ6IG9uRXJyb3IoZXJyb3IpXG4gICAgfSk7XG4gIH1cbiAgY29uc3Qgd2FpdEZvclN0cmVhbXMgPSBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZTMpID0+IHtcbiAgICB3aGlsZSAob25nb2luZ1N0cmVhbVByb21pc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IG9uZ29pbmdTdHJlYW1Qcm9taXNlcy5zaGlmdCgpO1xuICAgIH1cbiAgICByZXNvbHZlMygpO1xuICB9KTtcbiAgd2FpdEZvclN0cmVhbXMuZmluYWxseSgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBoYW5kbGVVSU1lc3NhZ2VTdHJlYW1GaW5pc2goe1xuICAgIHN0cmVhbSxcbiAgICBtZXNzYWdlSWQ6IGdlbmVyYXRlSWQyKCksXG4gICAgb3JpZ2luYWxNZXNzYWdlcyxcbiAgICBvblN0ZXBGaW5pc2gsXG4gICAgb25GaW5pc2gsXG4gICAgb25FcnJvclxuICB9KTtcbn1cblxuLy8gc3JjL3VpLW1lc3NhZ2Utc3RyZWFtL3JlYWQtdWktbWVzc2FnZS1zdHJlYW0udHNcbmZ1bmN0aW9uIHJlYWRVSU1lc3NhZ2VTdHJlYW0oe1xuICBtZXNzYWdlLFxuICBzdHJlYW0sXG4gIG9uRXJyb3IsXG4gIHRlcm1pbmF0ZU9uRXJyb3IgPSBmYWxzZVxufSkge1xuICB2YXIgX2EyMTtcbiAgbGV0IGNvbnRyb2xsZXI7XG4gIGxldCBoYXNFcnJvcmVkID0gZmFsc2U7XG4gIGNvbnN0IG91dHB1dFN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgc3RhcnQoY29udHJvbGxlclBhcmFtKSB7XG4gICAgICBjb250cm9sbGVyID0gY29udHJvbGxlclBhcmFtO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHN0YXRlID0gY3JlYXRlU3RyZWFtaW5nVUlNZXNzYWdlU3RhdGUoe1xuICAgIG1lc3NhZ2VJZDogKF9hMjEgPSBtZXNzYWdlID09IG51bGwgPyB2b2lkIDAgOiBtZXNzYWdlLmlkKSAhPSBudWxsID8gX2EyMSA6IFwiXCIsXG4gICAgbGFzdE1lc3NhZ2U6IG1lc3NhZ2VcbiAgfSk7XG4gIGNvbnN0IGhhbmRsZUVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgb25FcnJvciA9PSBudWxsID8gdm9pZCAwIDogb25FcnJvcihlcnJvcik7XG4gICAgaWYgKCFoYXNFcnJvcmVkICYmIHRlcm1pbmF0ZU9uRXJyb3IpIHtcbiAgICAgIGhhc0Vycm9yZWQgPSB0cnVlO1xuICAgICAgY29udHJvbGxlciA9PSBudWxsID8gdm9pZCAwIDogY29udHJvbGxlci5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9O1xuICBjb25zdW1lU3RyZWFtKHtcbiAgICBzdHJlYW06IHByb2Nlc3NVSU1lc3NhZ2VTdHJlYW0oe1xuICAgICAgc3RyZWFtLFxuICAgICAgcnVuVXBkYXRlTWVzc2FnZUpvYihqb2IpIHtcbiAgICAgICAgcmV0dXJuIGpvYih7XG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgd3JpdGU6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRyb2xsZXIuZW5xdWV1ZShzdHJ1Y3R1cmVkQ2xvbmUoc3RhdGUubWVzc2FnZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogaGFuZGxlRXJyb3JcbiAgICB9KSxcbiAgICBvbkVycm9yOiBoYW5kbGVFcnJvclxuICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICBpZiAoIWhhc0Vycm9yZWQpIHtcbiAgICAgIGNvbnRyb2xsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY3JlYXRlQXN5bmNJdGVyYWJsZVN0cmVhbShvdXRwdXRTdHJlYW0pO1xufVxuXG4vLyBzcmMvdWkvY29udmVydC10by1tb2RlbC1tZXNzYWdlcy50c1xuaW1wb3J0IHtcbiAgaXNOb25OdWxsYWJsZVxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuYXN5bmMgZnVuY3Rpb24gY29udmVydFRvTW9kZWxNZXNzYWdlcyhtZXNzYWdlcywgb3B0aW9ucykge1xuICBjb25zdCBtb2RlbE1lc3NhZ2VzID0gW107XG4gIGlmIChvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmlnbm9yZUluY29tcGxldGVUb29sQ2FsbHMpIHtcbiAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4gKHtcbiAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICBwYXJ0czogbWVzc2FnZS5wYXJ0cy5maWx0ZXIoXG4gICAgICAgIChwYXJ0KSA9PiAhaXNUb29sVUlQYXJ0KHBhcnQpIHx8IHBhcnQuc3RhdGUgIT09IFwiaW5wdXQtc3RyZWFtaW5nXCIgJiYgcGFydC5zdGF0ZSAhPT0gXCJpbnB1dC1hdmFpbGFibGVcIlxuICAgICAgKVxuICAgIH0pKTtcbiAgfVxuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcbiAgICBzd2l0Y2ggKG1lc3NhZ2Uucm9sZSkge1xuICAgICAgY2FzZSBcInN5c3RlbVwiOiB7XG4gICAgICAgIGNvbnN0IHRleHRQYXJ0cyA9IG1lc3NhZ2UucGFydHMuZmlsdGVyKFxuICAgICAgICAgIChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09IFwidGV4dFwiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyTWV0YWRhdGEgPSB0ZXh0UGFydHMucmVkdWNlKChhY2MsIHBhcnQpID0+IHtcbiAgICAgICAgICBpZiAocGFydC5wcm92aWRlck1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLmFjYywgLi4ucGFydC5wcm92aWRlck1ldGFkYXRhIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgbW9kZWxNZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICByb2xlOiBcInN5c3RlbVwiLFxuICAgICAgICAgIGNvbnRlbnQ6IHRleHRQYXJ0cy5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCkuam9pbihcIlwiKSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhwcm92aWRlck1ldGFkYXRhKS5sZW5ndGggPiAwID8geyBwcm92aWRlck9wdGlvbnM6IHByb3ZpZGVyTWV0YWRhdGEgfSA6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJ1c2VyXCI6IHtcbiAgICAgICAgbW9kZWxNZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICByb2xlOiBcInVzZXJcIixcbiAgICAgICAgICBjb250ZW50OiBtZXNzYWdlLnBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hMjE7XG4gICAgICAgICAgICBpZiAoaXNUZXh0VUlQYXJ0KHBhcnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogcGFydC50ZXh0LFxuICAgICAgICAgICAgICAgIC4uLnBhcnQucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck9wdGlvbnM6IHBhcnQucHJvdmlkZXJNZXRhZGF0YSB9IDoge31cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0ZpbGVVSVBhcnQocGFydCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgICAgICAgICBtZWRpYVR5cGU6IHBhcnQubWVkaWFUeXBlLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIGRhdGE6IHBhcnQudXJsLFxuICAgICAgICAgICAgICAgIC4uLnBhcnQucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck9wdGlvbnM6IHBhcnQucHJvdmlkZXJNZXRhZGF0YSB9IDoge31cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0RhdGFVSVBhcnQocGFydCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChfYTIxID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5jb252ZXJ0RGF0YVBhcnQpID09IG51bGwgPyB2b2lkIDAgOiBfYTIxLmNhbGwoXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICBwYXJ0XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkuZmlsdGVyKGlzTm9uTnVsbGFibGUpXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhc3Npc3RhbnRcIjoge1xuICAgICAgICBpZiAobWVzc2FnZS5wYXJ0cyAhPSBudWxsKSB7XG4gICAgICAgICAgbGV0IGJsb2NrID0gW107XG4gICAgICAgICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0Jsb2NrKCkge1xuICAgICAgICAgICAgdmFyIF9hMjEsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgICAgICBpZiAoYmxvY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBibG9jaykge1xuICAgICAgICAgICAgICBpZiAoaXNUZXh0VUlQYXJ0KHBhcnQpKSB7XG4gICAgICAgICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgICAgdGV4dDogcGFydC50ZXh0LFxuICAgICAgICAgICAgICAgICAgLi4ucGFydC5wcm92aWRlck1ldGFkYXRhICE9IG51bGwgPyB7IHByb3ZpZGVyT3B0aW9uczogcGFydC5wcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzRmlsZVVJUGFydChwYXJ0KSkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogcGFydC5tZWRpYVR5cGUsXG4gICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHBhcnQudXJsLFxuICAgICAgICAgICAgICAgICAgLi4ucGFydC5wcm92aWRlck1ldGFkYXRhICE9IG51bGwgPyB7IHByb3ZpZGVyT3B0aW9uczogcGFydC5wcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVhc29uaW5nVUlQYXJ0KHBhcnQpKSB7XG4gICAgICAgICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwicmVhc29uaW5nXCIsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiBwYXJ0LnRleHQsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHBhcnQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzVG9vbFVJUGFydChwYXJ0KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xOYW1lID0gZ2V0VG9vbE5hbWUocGFydCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQuc3RhdGUgIT09IFwiaW5wdXQtc3RyZWFtaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBwYXJ0LnN0YXRlID09PSBcIm91dHB1dC1lcnJvclwiID8gKF9hMjEgPSBwYXJ0LmlucHV0KSAhPSBudWxsID8gX2EyMSA6IFwicmF3SW5wdXRcIiBpbiBwYXJ0ID8gcGFydC5yYXdJbnB1dCA6IHZvaWQgMCA6IHBhcnQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHBhcnQucHJvdmlkZXJFeGVjdXRlZCxcbiAgICAgICAgICAgICAgICAgICAgLi4ucGFydC5jYWxsUHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck9wdGlvbnM6IHBhcnQuY2FsbFByb3ZpZGVyTWV0YWRhdGEgfSA6IHt9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LmFwcHJvdmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmFsSWQ6IHBhcnQuYXBwcm92YWwuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKHBhcnQucHJvdmlkZXJFeGVjdXRlZCA9PT0gdHJ1ZSAmJiBwYXJ0LnN0YXRlICE9PSBcImFwcHJvdmFsLXJlc3BvbmRlZFwiICYmIChwYXJ0LnN0YXRlID09PSBcIm91dHB1dC1hdmFpbGFibGVcIiB8fCBwYXJ0LnN0YXRlID09PSBcIm91dHB1dC1lcnJvclwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRQcm92aWRlck1ldGFkYXRhID0gKF9iID0gcGFydC5yZXN1bHRQcm92aWRlck1ldGFkYXRhKSAhPSBudWxsID8gX2IgOiBwYXJ0LmNhbGxQcm92aWRlck1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiBhd2FpdCBjcmVhdGVUb29sTW9kZWxPdXRwdXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBhcnQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IHBhcnQuc3RhdGUgPT09IFwib3V0cHV0LWVycm9yXCIgPyBwYXJ0LmVycm9yVGV4dCA6IHBhcnQub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbDogKF9jID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy50b29scykgPT0gbnVsbCA/IHZvaWQgMCA6IF9jW3Rvb2xOYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTW9kZTogcGFydC5zdGF0ZSA9PT0gXCJvdXRwdXQtZXJyb3JcIiA/IFwianNvblwiIDogXCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAuLi5yZXN1bHRQcm92aWRlck1ldGFkYXRhICE9IG51bGwgPyB7IHByb3ZpZGVyT3B0aW9uczogcmVzdWx0UHJvdmlkZXJNZXRhZGF0YSB9IDoge31cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzRGF0YVVJUGFydChwYXJ0KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFQYXJ0ID0gKF9kID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5jb252ZXJ0RGF0YVBhcnQpID09IG51bGwgPyB2b2lkIDAgOiBfZC5jYWxsKFxuICAgICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIHBhcnRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhUGFydCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goZGF0YVBhcnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZUNoZWNrID0gcGFydDtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHBhcnQ6ICR7X2V4aGF1c3RpdmVDaGVja31gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbW9kZWxNZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICAgICAgY29udGVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB0b29sUGFydHMgPSBibG9jay5maWx0ZXIoXG4gICAgICAgICAgICAgIChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hMjI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVG9vbFVJUGFydChwYXJ0KSAmJiAocGFydC5wcm92aWRlckV4ZWN1dGVkICE9PSB0cnVlIHx8ICgoX2EyMiA9IHBhcnQuYXBwcm92YWwpID09IG51bGwgPyB2b2lkIDAgOiBfYTIyLmFwcHJvdmVkKSAhPSBudWxsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0b29sUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudDIgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRvb2xQYXJ0IG9mIHRvb2xQYXJ0cykge1xuICAgICAgICAgICAgICAgICAgaWYgKCgoX2UgPSB0b29sUGFydC5hcHByb3ZhbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lLmFwcHJvdmVkKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQyLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1hcHByb3ZhbC1yZXNwb25zZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmFsSWQ6IHRvb2xQYXJ0LmFwcHJvdmFsLmlkLFxuICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmVkOiB0b29sUGFydC5hcHByb3ZhbC5hcHByb3ZlZCxcbiAgICAgICAgICAgICAgICAgICAgICByZWFzb246IHRvb2xQYXJ0LmFwcHJvdmFsLnJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0b29sUGFydC5wcm92aWRlckV4ZWN1dGVkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRvb2xQYXJ0LnByb3ZpZGVyRXhlY3V0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRvb2xQYXJ0LnN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJvdXRwdXQtZGVuaWVkXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Mi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHRvb2xQYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sTmFtZTogZ2V0VG9vbE5hbWUodG9vbFBhcnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3ItdGV4dFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKF9mID0gdG9vbFBhcnQuYXBwcm92YWwucmVhc29uKSAhPSBudWxsID8gX2YgOiBcIlRvb2wgZXhlY3V0aW9uIGRlbmllZC5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvb2xQYXJ0LmNhbGxQcm92aWRlck1ldGFkYXRhICE9IG51bGwgPyB7IHByb3ZpZGVyT3B0aW9uczogdG9vbFBhcnQuY2FsbFByb3ZpZGVyTWV0YWRhdGEgfSA6IHt9XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm91dHB1dC1lcnJvclwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwib3V0cHV0LWF2YWlsYWJsZVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBnZXRUb29sTmFtZSh0b29sUGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudDIucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB0b29sUGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IGF3YWl0IGNyZWF0ZVRvb2xNb2RlbE91dHB1dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHRvb2xQYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiB0b29sUGFydC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiB0b29sUGFydC5zdGF0ZSA9PT0gXCJvdXRwdXQtZXJyb3JcIiA/IHRvb2xQYXJ0LmVycm9yVGV4dCA6IHRvb2xQYXJ0Lm91dHB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbDogKF9nID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy50b29scykgPT0gbnVsbCA/IHZvaWQgMCA6IF9nW3Rvb2xOYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNb2RlOiB0b29sUGFydC5zdGF0ZSA9PT0gXCJvdXRwdXQtZXJyb3JcIiA/IFwidGV4dFwiIDogXCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4udG9vbFBhcnQuY2FsbFByb3ZpZGVyTWV0YWRhdGEgIT0gbnVsbCA/IHsgcHJvdmlkZXJPcHRpb25zOiB0b29sUGFydC5jYWxsUHJvdmlkZXJNZXRhZGF0YSB9IDoge31cbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29udGVudDIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgbW9kZWxNZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogXCJ0b29sXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQyXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsb2NrID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBtZXNzYWdlLnBhcnRzKSB7XG4gICAgICAgICAgICBpZiAoaXNUZXh0VUlQYXJ0KHBhcnQpIHx8IGlzUmVhc29uaW5nVUlQYXJ0KHBhcnQpIHx8IGlzRmlsZVVJUGFydChwYXJ0KSB8fCBpc1Rvb2xVSVBhcnQocGFydCkgfHwgaXNEYXRhVUlQYXJ0KHBhcnQpKSB7XG4gICAgICAgICAgICAgIGJsb2NrLnB1c2gocGFydCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJzdGVwLXN0YXJ0XCIpIHtcbiAgICAgICAgICAgICAgYXdhaXQgcHJvY2Vzc0Jsb2NrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHByb2Nlc3NCbG9jaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZUNoZWNrID0gbWVzc2FnZS5yb2xlO1xuICAgICAgICB0aHJvdyBuZXcgTWVzc2FnZUNvbnZlcnNpb25FcnJvcih7XG4gICAgICAgICAgb3JpZ2luYWxNZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBVbnN1cHBvcnRlZCByb2xlOiAke19leGhhdXN0aXZlQ2hlY2t9YFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1vZGVsTWVzc2FnZXM7XG59XG5cbi8vIHNyYy91aS92YWxpZGF0ZS11aS1tZXNzYWdlcy50c1xuaW1wb3J0IHsgVHlwZVZhbGlkYXRpb25FcnJvciBhcyBUeXBlVmFsaWRhdGlvbkVycm9yMyB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5pbXBvcnQge1xuICBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWEyLFxuICB2YWxpZGF0ZVR5cGVzIGFzIHZhbGlkYXRlVHlwZXMyLFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMlxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6OCB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciB1aU1lc3NhZ2VzU2NoZW1hID0gbGF6eVNjaGVtYTIoXG4gICgpID0+IHpvZFNjaGVtYTIoXG4gICAgejguYXJyYXkoXG4gICAgICB6OC5vYmplY3Qoe1xuICAgICAgICBpZDogejguc3RyaW5nKCksXG4gICAgICAgIHJvbGU6IHo4LmVudW0oW1wic3lzdGVtXCIsIFwidXNlclwiLCBcImFzc2lzdGFudFwiXSksXG4gICAgICAgIG1ldGFkYXRhOiB6OC51bmtub3duKCkub3B0aW9uYWwoKSxcbiAgICAgICAgcGFydHM6IHo4LmFycmF5KFxuICAgICAgICAgIHo4LnVuaW9uKFtcbiAgICAgICAgICAgIHo4Lm9iamVjdCh7XG4gICAgICAgICAgICAgIHR5cGU6IHo4LmxpdGVyYWwoXCJ0ZXh0XCIpLFxuICAgICAgICAgICAgICB0ZXh0OiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgc3RhdGU6IHo4LmVudW0oW1wic3RyZWFtaW5nXCIsIFwiZG9uZVwiXSkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHo4Lm9iamVjdCh7XG4gICAgICAgICAgICAgIHR5cGU6IHo4LmxpdGVyYWwoXCJyZWFzb25pbmdcIiksXG4gICAgICAgICAgICAgIHRleHQ6IHo4LnN0cmluZygpLFxuICAgICAgICAgICAgICBzdGF0ZTogejguZW51bShbXCJzdHJlYW1pbmdcIiwgXCJkb25lXCJdKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKClcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgejgub2JqZWN0KHtcbiAgICAgICAgICAgICAgdHlwZTogejgubGl0ZXJhbChcInNvdXJjZS11cmxcIiksXG4gICAgICAgICAgICAgIHNvdXJjZUlkOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgdXJsOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgdGl0bGU6IHo4LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB6OC5vYmplY3Qoe1xuICAgICAgICAgICAgICB0eXBlOiB6OC5saXRlcmFsKFwic291cmNlLWRvY3VtZW50XCIpLFxuICAgICAgICAgICAgICBzb3VyY2VJZDogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgIG1lZGlhVHlwZTogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgIHRpdGxlOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IHo4LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB6OC5vYmplY3Qoe1xuICAgICAgICAgICAgICB0eXBlOiB6OC5saXRlcmFsKFwiZmlsZVwiKSxcbiAgICAgICAgICAgICAgbWVkaWFUeXBlOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IHo4LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIHVybDogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB6OC5vYmplY3Qoe1xuICAgICAgICAgICAgICB0eXBlOiB6OC5saXRlcmFsKFwic3RlcC1zdGFydFwiKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB6OC5vYmplY3Qoe1xuICAgICAgICAgICAgICB0eXBlOiB6OC5zdHJpbmcoKS5zdGFydHNXaXRoKFwiZGF0YS1cIiksXG4gICAgICAgICAgICAgIGlkOiB6OC5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBkYXRhOiB6OC51bmtub3duKClcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgejgub2JqZWN0KHtcbiAgICAgICAgICAgICAgdHlwZTogejgubGl0ZXJhbChcImR5bmFtaWMtdG9vbFwiKSxcbiAgICAgICAgICAgICAgdG9vbE5hbWU6IHo4LnN0cmluZygpLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgc3RhdGU6IHo4LmxpdGVyYWwoXCJpbnB1dC1zdHJlYW1pbmdcIiksXG4gICAgICAgICAgICAgIGlucHV0OiB6OC51bmtub3duKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogejguYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGNhbGxQcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIG91dHB1dDogejgubmV2ZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBlcnJvclRleHQ6IHo4Lm5ldmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgYXBwcm92YWw6IHo4Lm5ldmVyKCkub3B0aW9uYWwoKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB6OC5vYmplY3Qoe1xuICAgICAgICAgICAgICB0eXBlOiB6OC5saXRlcmFsKFwiZHluYW1pYy10b29sXCIpLFxuICAgICAgICAgICAgICB0b29sTmFtZTogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHo4LnN0cmluZygpLFxuICAgICAgICAgICAgICBzdGF0ZTogejgubGl0ZXJhbChcImlucHV0LWF2YWlsYWJsZVwiKSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHo4LnVua25vd24oKSxcbiAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogejguYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIG91dHB1dDogejgubmV2ZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBlcnJvclRleHQ6IHo4Lm5ldmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgY2FsbFByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgYXBwcm92YWw6IHo4Lm5ldmVyKCkub3B0aW9uYWwoKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB6OC5vYmplY3Qoe1xuICAgICAgICAgICAgICB0eXBlOiB6OC5saXRlcmFsKFwiZHluYW1pYy10b29sXCIpLFxuICAgICAgICAgICAgICB0b29sTmFtZTogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHo4LnN0cmluZygpLFxuICAgICAgICAgICAgICBzdGF0ZTogejgubGl0ZXJhbChcImFwcHJvdmFsLXJlcXVlc3RlZFwiKSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHo4LnVua25vd24oKSxcbiAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogejguYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIG91dHB1dDogejgubmV2ZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBlcnJvclRleHQ6IHo4Lm5ldmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgY2FsbFByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgYXBwcm92YWw6IHo4Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgaWQ6IHo4LnN0cmluZygpLFxuICAgICAgICAgICAgICAgIGFwcHJvdmVkOiB6OC5uZXZlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgICAgcmVhc29uOiB6OC5uZXZlcigpLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgejgub2JqZWN0KHtcbiAgICAgICAgICAgICAgdHlwZTogejgubGl0ZXJhbChcImR5bmFtaWMtdG9vbFwiKSxcbiAgICAgICAgICAgICAgdG9vbE5hbWU6IHo4LnN0cmluZygpLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgc3RhdGU6IHo4LmxpdGVyYWwoXCJhcHByb3ZhbC1yZXNwb25kZWRcIiksXG4gICAgICAgICAgICAgIGlucHV0OiB6OC51bmtub3duKCksXG4gICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHo4LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHo4Lm5ldmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgZXJyb3JUZXh0OiB6OC5uZXZlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGNhbGxQcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGFwcHJvdmFsOiB6OC5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIGlkOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBhcHByb3ZlZDogejguYm9vbGVhbigpLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogejguc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB6OC5vYmplY3Qoe1xuICAgICAgICAgICAgICB0eXBlOiB6OC5saXRlcmFsKFwiZHluYW1pYy10b29sXCIpLFxuICAgICAgICAgICAgICB0b29sTmFtZTogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHo4LnN0cmluZygpLFxuICAgICAgICAgICAgICBzdGF0ZTogejgubGl0ZXJhbChcIm91dHB1dC1hdmFpbGFibGVcIiksXG4gICAgICAgICAgICAgIGlucHV0OiB6OC51bmtub3duKCksXG4gICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHo4LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHo4LnVua25vd24oKSxcbiAgICAgICAgICAgICAgZXJyb3JUZXh0OiB6OC5uZXZlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGNhbGxQcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIHJlc3VsdFByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgcHJlbGltaW5hcnk6IHo4LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBhcHByb3ZhbDogejgub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBpZDogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgYXBwcm92ZWQ6IHo4LmxpdGVyYWwodHJ1ZSksXG4gICAgICAgICAgICAgICAgcmVhc29uOiB6OC5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIH0pLm9wdGlvbmFsKClcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgejgub2JqZWN0KHtcbiAgICAgICAgICAgICAgdHlwZTogejgubGl0ZXJhbChcImR5bmFtaWMtdG9vbFwiKSxcbiAgICAgICAgICAgICAgdG9vbE5hbWU6IHo4LnN0cmluZygpLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgc3RhdGU6IHo4LmxpdGVyYWwoXCJvdXRwdXQtZXJyb3JcIiksXG4gICAgICAgICAgICAgIGlucHV0OiB6OC51bmtub3duKCksXG4gICAgICAgICAgICAgIHJhd0lucHV0OiB6OC51bmtub3duKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogejguYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIG91dHB1dDogejgubmV2ZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBlcnJvclRleHQ6IHo4LnN0cmluZygpLFxuICAgICAgICAgICAgICBjYWxsUHJvdmlkZXJNZXRhZGF0YTogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICByZXN1bHRQcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGFwcHJvdmFsOiB6OC5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIGlkOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBhcHByb3ZlZDogejgubGl0ZXJhbCh0cnVlKSxcbiAgICAgICAgICAgICAgICByZWFzb246IHo4LnN0cmluZygpLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgfSkub3B0aW9uYWwoKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB6OC5vYmplY3Qoe1xuICAgICAgICAgICAgICB0eXBlOiB6OC5saXRlcmFsKFwiZHluYW1pYy10b29sXCIpLFxuICAgICAgICAgICAgICB0b29sTmFtZTogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHo4LnN0cmluZygpLFxuICAgICAgICAgICAgICBzdGF0ZTogejgubGl0ZXJhbChcIm91dHB1dC1kZW5pZWRcIiksXG4gICAgICAgICAgICAgIGlucHV0OiB6OC51bmtub3duKCksXG4gICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHo4LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHo4Lm5ldmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgZXJyb3JUZXh0OiB6OC5uZXZlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGNhbGxQcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGFwcHJvdmFsOiB6OC5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIGlkOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBhcHByb3ZlZDogejgubGl0ZXJhbChmYWxzZSksXG4gICAgICAgICAgICAgICAgcmVhc29uOiB6OC5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHo4Lm9iamVjdCh7XG4gICAgICAgICAgICAgIHR5cGU6IHo4LnN0cmluZygpLnN0YXJ0c1dpdGgoXCJ0b29sLVwiKSxcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgIHN0YXRlOiB6OC5saXRlcmFsKFwiaW5wdXQtc3RyZWFtaW5nXCIpLFxuICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB6OC5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgY2FsbFByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHo4LnVua25vd24oKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHo4Lm5ldmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgZXJyb3JUZXh0OiB6OC5uZXZlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGFwcHJvdmFsOiB6OC5uZXZlcigpLm9wdGlvbmFsKClcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgejgub2JqZWN0KHtcbiAgICAgICAgICAgICAgdHlwZTogejguc3RyaW5nKCkuc3RhcnRzV2l0aChcInRvb2wtXCIpLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgc3RhdGU6IHo4LmxpdGVyYWwoXCJpbnB1dC1hdmFpbGFibGVcIiksXG4gICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHo4LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBpbnB1dDogejgudW5rbm93bigpLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHo4Lm5ldmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgZXJyb3JUZXh0OiB6OC5uZXZlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGNhbGxQcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGFwcHJvdmFsOiB6OC5uZXZlcigpLm9wdGlvbmFsKClcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgejgub2JqZWN0KHtcbiAgICAgICAgICAgICAgdHlwZTogejguc3RyaW5nKCkuc3RhcnRzV2l0aChcInRvb2wtXCIpLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgc3RhdGU6IHo4LmxpdGVyYWwoXCJhcHByb3ZhbC1yZXF1ZXN0ZWRcIiksXG4gICAgICAgICAgICAgIGlucHV0OiB6OC51bmtub3duKCksXG4gICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHo4LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHo4Lm5ldmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgZXJyb3JUZXh0OiB6OC5uZXZlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGNhbGxQcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGFwcHJvdmFsOiB6OC5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIGlkOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBhcHByb3ZlZDogejgubmV2ZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogejgubmV2ZXIoKS5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHo4Lm9iamVjdCh7XG4gICAgICAgICAgICAgIHR5cGU6IHo4LnN0cmluZygpLnN0YXJ0c1dpdGgoXCJ0b29sLVwiKSxcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgIHN0YXRlOiB6OC5saXRlcmFsKFwiYXBwcm92YWwtcmVzcG9uZGVkXCIpLFxuICAgICAgICAgICAgICBpbnB1dDogejgudW5rbm93bigpLFxuICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB6OC5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgb3V0cHV0OiB6OC5uZXZlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGVycm9yVGV4dDogejgubmV2ZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBjYWxsUHJvdmlkZXJNZXRhZGF0YTogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBhcHByb3ZhbDogejgub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBpZDogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgYXBwcm92ZWQ6IHo4LmJvb2xlYW4oKSxcbiAgICAgICAgICAgICAgICByZWFzb246IHo4LnN0cmluZygpLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgejgub2JqZWN0KHtcbiAgICAgICAgICAgICAgdHlwZTogejguc3RyaW5nKCkuc3RhcnRzV2l0aChcInRvb2wtXCIpLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgc3RhdGU6IHo4LmxpdGVyYWwoXCJvdXRwdXQtYXZhaWxhYmxlXCIpLFxuICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB6OC5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHo4LnVua25vd24oKSxcbiAgICAgICAgICAgICAgb3V0cHV0OiB6OC51bmtub3duKCksXG4gICAgICAgICAgICAgIGVycm9yVGV4dDogejgubmV2ZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBjYWxsUHJvdmlkZXJNZXRhZGF0YTogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICByZXN1bHRQcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIHByZWxpbWluYXJ5OiB6OC5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgYXBwcm92YWw6IHo4Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgaWQ6IHo4LnN0cmluZygpLFxuICAgICAgICAgICAgICAgIGFwcHJvdmVkOiB6OC5saXRlcmFsKHRydWUpLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogejguc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgICAgICAgICAgICB9KS5vcHRpb25hbCgpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHo4Lm9iamVjdCh7XG4gICAgICAgICAgICAgIHR5cGU6IHo4LnN0cmluZygpLnN0YXJ0c1dpdGgoXCJ0b29sLVwiKSxcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgIHN0YXRlOiB6OC5saXRlcmFsKFwib3V0cHV0LWVycm9yXCIpLFxuICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB6OC5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHo4LnVua25vd24oKSxcbiAgICAgICAgICAgICAgcmF3SW5wdXQ6IHo4LnVua25vd24oKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHo4Lm5ldmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgZXJyb3JUZXh0OiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgY2FsbFByb3ZpZGVyTWV0YWRhdGE6IHByb3ZpZGVyTWV0YWRhdGFTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgcmVzdWx0UHJvdmlkZXJNZXRhZGF0YTogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBhcHByb3ZhbDogejgub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBpZDogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgYXBwcm92ZWQ6IHo4LmxpdGVyYWwodHJ1ZSksXG4gICAgICAgICAgICAgICAgcmVhc29uOiB6OC5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIH0pLm9wdGlvbmFsKClcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgejgub2JqZWN0KHtcbiAgICAgICAgICAgICAgdHlwZTogejguc3RyaW5nKCkuc3RhcnRzV2l0aChcInRvb2wtXCIpLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgc3RhdGU6IHo4LmxpdGVyYWwoXCJvdXRwdXQtZGVuaWVkXCIpLFxuICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB6OC5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHo4LnVua25vd24oKSxcbiAgICAgICAgICAgICAgb3V0cHV0OiB6OC5uZXZlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGVycm9yVGV4dDogejgubmV2ZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBjYWxsUHJvdmlkZXJNZXRhZGF0YTogcHJvdmlkZXJNZXRhZGF0YVNjaGVtYS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICBhcHByb3ZhbDogejgub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBpZDogejguc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgYXBwcm92ZWQ6IHo4LmxpdGVyYWwoZmFsc2UpLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogejguc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdKVxuICAgICAgICApLm5vbmVtcHR5KFwiTWVzc2FnZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHBhcnRcIilcbiAgICAgIH0pXG4gICAgKS5ub25lbXB0eShcIk1lc3NhZ2VzIGFycmF5IG11c3Qgbm90IGJlIGVtcHR5XCIpXG4gIClcbik7XG5hc3luYyBmdW5jdGlvbiBzYWZlVmFsaWRhdGVVSU1lc3NhZ2VzKHtcbiAgbWVzc2FnZXMsXG4gIG1ldGFkYXRhU2NoZW1hLFxuICBkYXRhU2NoZW1hcyxcbiAgdG9vbHNcbn0pIHtcbiAgdHJ5IHtcbiAgICBpZiAobWVzc2FnZXMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3Ioe1xuICAgICAgICAgIHBhcmFtZXRlcjogXCJtZXNzYWdlc1wiLFxuICAgICAgICAgIHZhbHVlOiBtZXNzYWdlcyxcbiAgICAgICAgICBtZXNzYWdlOiBcIm1lc3NhZ2VzIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkXCJcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHZhbGlkYXRlZE1lc3NhZ2VzID0gYXdhaXQgdmFsaWRhdGVUeXBlczIoe1xuICAgICAgdmFsdWU6IG1lc3NhZ2VzLFxuICAgICAgc2NoZW1hOiB1aU1lc3NhZ2VzU2NoZW1hXG4gICAgfSk7XG4gICAgaWYgKG1ldGFkYXRhU2NoZW1hKSB7XG4gICAgICBmb3IgKGNvbnN0IFttc2dJZHgsIG1lc3NhZ2VdIG9mIHZhbGlkYXRlZE1lc3NhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgICBhd2FpdCB2YWxpZGF0ZVR5cGVzMih7XG4gICAgICAgICAgdmFsdWU6IG1lc3NhZ2UubWV0YWRhdGEsXG4gICAgICAgICAgc2NoZW1hOiBtZXRhZGF0YVNjaGVtYSxcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICBmaWVsZDogYG1lc3NhZ2VzWyR7bXNnSWR4fV0ubWV0YWRhdGFgLFxuICAgICAgICAgICAgZW50aXR5SWQ6IG1lc3NhZ2UuaWRcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YVNjaGVtYXMgfHwgdG9vbHMpIHtcbiAgICAgIGZvciAoY29uc3QgW21zZ0lkeCwgbWVzc2FnZV0gb2YgdmFsaWRhdGVkTWVzc2FnZXMuZW50cmllcygpKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3BhcnRJZHgsIHBhcnRdIG9mIG1lc3NhZ2UucGFydHMuZW50cmllcygpKSB7XG4gICAgICAgICAgaWYgKGRhdGFTY2hlbWFzICYmIHBhcnQudHlwZS5zdGFydHNXaXRoKFwiZGF0YS1cIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFQYXJ0ID0gcGFydDtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFOYW1lID0gZGF0YVBhcnQudHlwZS5zbGljZSg1KTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTY2hlbWEgPSBkYXRhU2NoZW1hc1tkYXRhTmFtZV07XG4gICAgICAgICAgICBpZiAoIWRhdGFTY2hlbWEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IzKHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhUGFydC5kYXRhLFxuICAgICAgICAgICAgICAgICAgY2F1c2U6IGBObyBkYXRhIHNjaGVtYSBmb3VuZCBmb3IgZGF0YSBwYXJ0ICR7ZGF0YU5hbWV9YCxcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBtZXNzYWdlc1ske21zZ0lkeH1dLnBhcnRzWyR7cGFydElkeH1dLmRhdGFgLFxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlOYW1lOiBkYXRhTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQ6IGRhdGFQYXJ0LmlkXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHZhbGlkYXRlVHlwZXMyKHtcbiAgICAgICAgICAgICAgdmFsdWU6IGRhdGFQYXJ0LmRhdGEsXG4gICAgICAgICAgICAgIHNjaGVtYTogZGF0YVNjaGVtYSxcbiAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgIGZpZWxkOiBgbWVzc2FnZXNbJHttc2dJZHh9XS5wYXJ0c1ske3BhcnRJZHh9XS5kYXRhYCxcbiAgICAgICAgICAgICAgICBlbnRpdHlOYW1lOiBkYXRhTmFtZSxcbiAgICAgICAgICAgICAgICBlbnRpdHlJZDogZGF0YVBhcnQuaWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0b29scyAmJiBwYXJ0LnR5cGUuc3RhcnRzV2l0aChcInRvb2wtXCIpKSB7XG4gICAgICAgICAgICBjb25zdCB0b29sUGFydCA9IHBhcnQ7XG4gICAgICAgICAgICBjb25zdCB0b29sTmFtZSA9IHRvb2xQYXJ0LnR5cGUuc2xpY2UoNSk7XG4gICAgICAgICAgICBjb25zdCB0b29sMiA9IHRvb2xzW3Rvb2xOYW1lXTtcbiAgICAgICAgICAgIGlmICghdG9vbDIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IzKHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0b29sUGFydC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgIGNhdXNlOiBgTm8gdG9vbCBzY2hlbWEgZm91bmQgZm9yIHRvb2wgcGFydCAke3Rvb2xOYW1lfWAsXG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgbWVzc2FnZXNbJHttc2dJZHh9XS5wYXJ0c1ske3BhcnRJZHh9XS5pbnB1dGAsXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU5hbWU6IHRvb2xOYW1lLFxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlJZDogdG9vbFBhcnQudG9vbENhbGxJZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9vbFBhcnQuc3RhdGUgPT09IFwiaW5wdXQtYXZhaWxhYmxlXCIgfHwgdG9vbFBhcnQuc3RhdGUgPT09IFwib3V0cHV0LWF2YWlsYWJsZVwiIHx8IHRvb2xQYXJ0LnN0YXRlID09PSBcIm91dHB1dC1lcnJvclwiICYmIHRvb2xQYXJ0LmlucHV0ICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgYXdhaXQgdmFsaWRhdGVUeXBlczIoe1xuICAgICAgICAgICAgICAgIHZhbHVlOiB0b29sUGFydC5pbnB1dCxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IHRvb2wyLmlucHV0U2NoZW1hLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkOiBgbWVzc2FnZXNbJHttc2dJZHh9XS5wYXJ0c1ske3BhcnRJZHh9XS5pbnB1dGAsXG4gICAgICAgICAgICAgICAgICBlbnRpdHlOYW1lOiB0b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgIGVudGl0eUlkOiB0b29sUGFydC50b29sQ2FsbElkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b29sUGFydC5zdGF0ZSA9PT0gXCJvdXRwdXQtYXZhaWxhYmxlXCIgJiYgdG9vbDIub3V0cHV0U2NoZW1hKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHZhbGlkYXRlVHlwZXMyKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdG9vbFBhcnQub3V0cHV0LFxuICAgICAgICAgICAgICAgIHNjaGVtYTogdG9vbDIub3V0cHV0U2NoZW1hLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkOiBgbWVzc2FnZXNbJHttc2dJZHh9XS5wYXJ0c1ske3BhcnRJZHh9XS5vdXRwdXRgLFxuICAgICAgICAgICAgICAgICAgZW50aXR5TmFtZTogdG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICBlbnRpdHlJZDogdG9vbFBhcnQudG9vbENhbGxJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgZGF0YTogdmFsaWRhdGVkTWVzc2FnZXNcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGVyciA9IGVycm9yO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBlcnJcbiAgICB9O1xuICB9XG59XG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVVJTWVzc2FnZXMoe1xuICBtZXNzYWdlcyxcbiAgbWV0YWRhdGFTY2hlbWEsXG4gIGRhdGFTY2hlbWFzLFxuICB0b29sc1xufSkge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNhZmVWYWxpZGF0ZVVJTWVzc2FnZXMoe1xuICAgIG1lc3NhZ2VzLFxuICAgIG1ldGFkYXRhU2NoZW1hLFxuICAgIGRhdGFTY2hlbWFzLFxuICAgIHRvb2xzXG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLnN1Y2Nlc3MpXG4gICAgdGhyb3cgcmVzcG9uc2UuZXJyb3I7XG4gIHJldHVybiByZXNwb25zZS5kYXRhO1xufVxuXG4vLyBzcmMvYWdlbnQvY3JlYXRlLWFnZW50LXVpLXN0cmVhbS50c1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQWdlbnRVSVN0cmVhbSh7XG4gIGFnZW50LFxuICB1aU1lc3NhZ2VzLFxuICBvcHRpb25zLFxuICBhYm9ydFNpZ25hbCxcbiAgdGltZW91dCxcbiAgZXhwZXJpbWVudGFsX3RyYW5zZm9ybSxcbiAgb25TdGVwRmluaXNoLFxuICAuLi51aU1lc3NhZ2VTdHJlYW1PcHRpb25zXG59KSB7XG4gIHZhciBfYTIxO1xuICBjb25zdCB2YWxpZGF0ZWRNZXNzYWdlcyA9IGF3YWl0IHZhbGlkYXRlVUlNZXNzYWdlcyh7XG4gICAgbWVzc2FnZXM6IHVpTWVzc2FnZXMsXG4gICAgdG9vbHM6IGFnZW50LnRvb2xzXG4gIH0pO1xuICBjb25zdCBtb2RlbE1lc3NhZ2VzID0gYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyh2YWxpZGF0ZWRNZXNzYWdlcywge1xuICAgIHRvb2xzOiBhZ2VudC50b29sc1xuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWdlbnQuc3RyZWFtKHtcbiAgICBwcm9tcHQ6IG1vZGVsTWVzc2FnZXMsXG4gICAgb3B0aW9ucyxcbiAgICBhYm9ydFNpZ25hbCxcbiAgICB0aW1lb3V0LFxuICAgIGV4cGVyaW1lbnRhbF90cmFuc2Zvcm0sXG4gICAgb25TdGVwRmluaXNoXG4gIH0pO1xuICByZXR1cm4gcmVzdWx0LnRvVUlNZXNzYWdlU3RyZWFtKHtcbiAgICAuLi51aU1lc3NhZ2VTdHJlYW1PcHRpb25zLFxuICAgIC8vIFRPRE8gcmVhZGluZyBgb3JpZ2luYWxNZXNzYWdlc2AgaXMgaGVyZSBmb3IgYmMsIGFsd2F5cyB1c2UgYHZhbGlkYXRlZE1lc3NhZ2VzYCBpbiB2N1xuICAgIG9yaWdpbmFsTWVzc2FnZXM6IChfYTIxID0gdWlNZXNzYWdlU3RyZWFtT3B0aW9ucy5vcmlnaW5hbE1lc3NhZ2VzKSAhPSBudWxsID8gX2EyMSA6IHZhbGlkYXRlZE1lc3NhZ2VzXG4gIH0pO1xufVxuXG4vLyBzcmMvYWdlbnQvY3JlYXRlLWFnZW50LXVpLXN0cmVhbS1yZXNwb25zZS50c1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQWdlbnRVSVN0cmVhbVJlc3BvbnNlKHtcbiAgaGVhZGVycyxcbiAgc3RhdHVzLFxuICBzdGF0dXNUZXh0LFxuICBjb25zdW1lU3NlU3RyZWFtLFxuICAuLi5vcHRpb25zXG59KSB7XG4gIHJldHVybiBjcmVhdGVVSU1lc3NhZ2VTdHJlYW1SZXNwb25zZSh7XG4gICAgaGVhZGVycyxcbiAgICBzdGF0dXMsXG4gICAgc3RhdHVzVGV4dCxcbiAgICBjb25zdW1lU3NlU3RyZWFtLFxuICAgIHN0cmVhbTogYXdhaXQgY3JlYXRlQWdlbnRVSVN0cmVhbShvcHRpb25zKVxuICB9KTtcbn1cblxuLy8gc3JjL2FnZW50L3BpcGUtYWdlbnQtdWktc3RyZWFtLXRvLXJlc3BvbnNlLnRzXG5hc3luYyBmdW5jdGlvbiBwaXBlQWdlbnRVSVN0cmVhbVRvUmVzcG9uc2Uoe1xuICByZXNwb25zZSxcbiAgaGVhZGVycyxcbiAgc3RhdHVzLFxuICBzdGF0dXNUZXh0LFxuICBjb25zdW1lU3NlU3RyZWFtLFxuICAuLi5vcHRpb25zXG59KSB7XG4gIHBpcGVVSU1lc3NhZ2VTdHJlYW1Ub1Jlc3BvbnNlKHtcbiAgICByZXNwb25zZSxcbiAgICBoZWFkZXJzLFxuICAgIHN0YXR1cyxcbiAgICBzdGF0dXNUZXh0LFxuICAgIGNvbnN1bWVTc2VTdHJlYW0sXG4gICAgc3RyZWFtOiBhd2FpdCBjcmVhdGVBZ2VudFVJU3RyZWFtKG9wdGlvbnMpXG4gIH0pO1xufVxuXG4vLyBzcmMvZW1iZWQvZW1iZWQudHNcbmltcG9ydCB7IHdpdGhVc2VyQWdlbnRTdWZmaXggYXMgd2l0aFVzZXJBZ2VudFN1ZmZpeDMgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuYXN5bmMgZnVuY3Rpb24gZW1iZWQoe1xuICBtb2RlbDogbW9kZWxBcmcsXG4gIHZhbHVlLFxuICBwcm92aWRlck9wdGlvbnMsXG4gIG1heFJldHJpZXM6IG1heFJldHJpZXNBcmcsXG4gIGFib3J0U2lnbmFsLFxuICBoZWFkZXJzLFxuICBleHBlcmltZW50YWxfdGVsZW1ldHJ5OiB0ZWxlbWV0cnlcbn0pIHtcbiAgY29uc3QgbW9kZWwgPSByZXNvbHZlRW1iZWRkaW5nTW9kZWwobW9kZWxBcmcpO1xuICBjb25zdCB7IG1heFJldHJpZXMsIHJldHJ5IH0gPSBwcmVwYXJlUmV0cmllcyh7XG4gICAgbWF4UmV0cmllczogbWF4UmV0cmllc0FyZyxcbiAgICBhYm9ydFNpZ25hbFxuICB9KTtcbiAgY29uc3QgaGVhZGVyc1dpdGhVc2VyQWdlbnQgPSB3aXRoVXNlckFnZW50U3VmZml4MyhcbiAgICBoZWFkZXJzICE9IG51bGwgPyBoZWFkZXJzIDoge30sXG4gICAgYGFpLyR7VkVSU0lPTn1gXG4gICk7XG4gIGNvbnN0IGJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzID0gZ2V0QmFzZVRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgIG1vZGVsLFxuICAgIHRlbGVtZXRyeSxcbiAgICBoZWFkZXJzOiBoZWFkZXJzV2l0aFVzZXJBZ2VudCxcbiAgICBzZXR0aW5nczogeyBtYXhSZXRyaWVzIH1cbiAgfSk7XG4gIGNvbnN0IHRyYWNlciA9IGdldFRyYWNlcih0ZWxlbWV0cnkpO1xuICByZXR1cm4gcmVjb3JkU3Bhbih7XG4gICAgbmFtZTogXCJhaS5lbWJlZFwiLFxuICAgIGF0dHJpYnV0ZXM6IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgdGVsZW1ldHJ5LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAuLi5hc3NlbWJsZU9wZXJhdGlvbk5hbWUoeyBvcGVyYXRpb25JZDogXCJhaS5lbWJlZFwiLCB0ZWxlbWV0cnkgfSksXG4gICAgICAgIC4uLmJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzLFxuICAgICAgICBcImFpLnZhbHVlXCI6IHsgaW5wdXQ6ICgpID0+IEpTT04uc3RyaW5naWZ5KHZhbHVlKSB9XG4gICAgICB9XG4gICAgfSksXG4gICAgdHJhY2VyLFxuICAgIGZuOiBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgY29uc3QgeyBlbWJlZGRpbmcsIHVzYWdlLCB3YXJuaW5ncywgcmVzcG9uc2UsIHByb3ZpZGVyTWV0YWRhdGEgfSA9IGF3YWl0IHJldHJ5KFxuICAgICAgICAoKSA9PiAoXG4gICAgICAgICAgLy8gbmVzdGVkIHNwYW5zIHRvIGFsaWduIHdpdGggdGhlIGVtYmVkTWFueSB0ZWxlbWV0cnkgZGF0YTpcbiAgICAgICAgICByZWNvcmRTcGFuKHtcbiAgICAgICAgICAgIG5hbWU6IFwiYWkuZW1iZWQuZG9FbWJlZFwiLFxuICAgICAgICAgICAgYXR0cmlidXRlczogc2VsZWN0VGVsZW1ldHJ5QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgIC4uLmFzc2VtYmxlT3BlcmF0aW9uTmFtZSh7XG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb25JZDogXCJhaS5lbWJlZC5kb0VtYmVkXCIsXG4gICAgICAgICAgICAgICAgICB0ZWxlbWV0cnlcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAuLi5iYXNlVGVsZW1ldHJ5QXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAvLyBzcGVjaWZpYyBzZXR0aW5ncyB0aGF0IG9ubHkgbWFrZSBzZW5zZSBvbiB0aGUgb3V0ZXIgbGV2ZWw6XG4gICAgICAgICAgICAgICAgXCJhaS52YWx1ZXNcIjogeyBpbnB1dDogKCkgPT4gW0pTT04uc3RyaW5naWZ5KHZhbHVlKV0gfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRyYWNlcixcbiAgICAgICAgICAgIGZuOiBhc3luYyAoZG9FbWJlZFNwYW4pID0+IHtcbiAgICAgICAgICAgICAgdmFyIF9hMjE7XG4gICAgICAgICAgICAgIGNvbnN0IG1vZGVsUmVzcG9uc2UgPSBhd2FpdCBtb2RlbC5kb0VtYmVkKHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IFt2YWx1ZV0sXG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyc1dpdGhVc2VyQWdlbnQsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjb25zdCBlbWJlZGRpbmcyID0gbW9kZWxSZXNwb25zZS5lbWJlZGRpbmdzWzBdO1xuICAgICAgICAgICAgICBjb25zdCB1c2FnZTIgPSAoX2EyMSA9IG1vZGVsUmVzcG9uc2UudXNhZ2UpICE9IG51bGwgPyBfYTIxIDogeyB0b2tlbnM6IE5hTiB9O1xuICAgICAgICAgICAgICBkb0VtYmVkU3Bhbi5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgIGF3YWl0IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgdGVsZW1ldHJ5LFxuICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICBcImFpLmVtYmVkZGluZ3NcIjoge1xuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogKCkgPT4gbW9kZWxSZXNwb25zZS5lbWJlZGRpbmdzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgIChlbWJlZGRpbmczKSA9PiBKU09OLnN0cmluZ2lmeShlbWJlZGRpbmczKVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCJhaS51c2FnZS50b2tlbnNcIjogdXNhZ2UyLnRva2Vuc1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZW1iZWRkaW5nOiBlbWJlZGRpbmcyLFxuICAgICAgICAgICAgICAgIHVzYWdlOiB1c2FnZTIsXG4gICAgICAgICAgICAgICAgd2FybmluZ3M6IG1vZGVsUmVzcG9uc2Uud2FybmluZ3MsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogbW9kZWxSZXNwb25zZS5wcm92aWRlck1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBtb2RlbFJlc3BvbnNlLnJlc3BvbnNlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHNwYW4uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgYXdhaXQgc2VsZWN0VGVsZW1ldHJ5QXR0cmlidXRlcyh7XG4gICAgICAgICAgdGVsZW1ldHJ5LFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgIFwiYWkuZW1iZWRkaW5nXCI6IHsgb3V0cHV0OiAoKSA9PiBKU09OLnN0cmluZ2lmeShlbWJlZGRpbmcpIH0sXG4gICAgICAgICAgICBcImFpLnVzYWdlLnRva2Vuc1wiOiB1c2FnZS50b2tlbnNcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgbG9nV2FybmluZ3MoeyB3YXJuaW5ncywgcHJvdmlkZXI6IG1vZGVsLnByb3ZpZGVyLCBtb2RlbDogbW9kZWwubW9kZWxJZCB9KTtcbiAgICAgIHJldHVybiBuZXcgRGVmYXVsdEVtYmVkUmVzdWx0KHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGVtYmVkZGluZyxcbiAgICAgICAgdXNhZ2UsXG4gICAgICAgIHdhcm5pbmdzLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhLFxuICAgICAgICByZXNwb25zZVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cbnZhciBEZWZhdWx0RW1iZWRSZXN1bHQgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICB0aGlzLmVtYmVkZGluZyA9IG9wdGlvbnMuZW1iZWRkaW5nO1xuICAgIHRoaXMudXNhZ2UgPSBvcHRpb25zLnVzYWdlO1xuICAgIHRoaXMud2FybmluZ3MgPSBvcHRpb25zLndhcm5pbmdzO1xuICAgIHRoaXMucHJvdmlkZXJNZXRhZGF0YSA9IG9wdGlvbnMucHJvdmlkZXJNZXRhZGF0YTtcbiAgICB0aGlzLnJlc3BvbnNlID0gb3B0aW9ucy5yZXNwb25zZTtcbiAgfVxufTtcblxuLy8gc3JjL2VtYmVkL2VtYmVkLW1hbnkudHNcbmltcG9ydCB7IHdpdGhVc2VyQWdlbnRTdWZmaXggYXMgd2l0aFVzZXJBZ2VudFN1ZmZpeDQgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvdXRpbC9zcGxpdC1hcnJheS50c1xuZnVuY3Rpb24gc3BsaXRBcnJheShhcnJheTIsIGNodW5rU2l6ZSkge1xuICBpZiAoY2h1bmtTaXplIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJjaHVua1NpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheTIubGVuZ3RoOyBpICs9IGNodW5rU2l6ZSkge1xuICAgIHJlc3VsdC5wdXNoKGFycmF5Mi5zbGljZShpLCBpICsgY2h1bmtTaXplKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gc3JjL2VtYmVkL2VtYmVkLW1hbnkudHNcbmFzeW5jIGZ1bmN0aW9uIGVtYmVkTWFueSh7XG4gIG1vZGVsOiBtb2RlbEFyZyxcbiAgdmFsdWVzLFxuICBtYXhQYXJhbGxlbENhbGxzID0gSW5maW5pdHksXG4gIG1heFJldHJpZXM6IG1heFJldHJpZXNBcmcsXG4gIGFib3J0U2lnbmFsLFxuICBoZWFkZXJzLFxuICBwcm92aWRlck9wdGlvbnMsXG4gIGV4cGVyaW1lbnRhbF90ZWxlbWV0cnk6IHRlbGVtZXRyeVxufSkge1xuICBjb25zdCBtb2RlbCA9IHJlc29sdmVFbWJlZGRpbmdNb2RlbChtb2RlbEFyZyk7XG4gIGNvbnN0IHsgbWF4UmV0cmllcywgcmV0cnkgfSA9IHByZXBhcmVSZXRyaWVzKHtcbiAgICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzQXJnLFxuICAgIGFib3J0U2lnbmFsXG4gIH0pO1xuICBjb25zdCBoZWFkZXJzV2l0aFVzZXJBZ2VudCA9IHdpdGhVc2VyQWdlbnRTdWZmaXg0KFxuICAgIGhlYWRlcnMgIT0gbnVsbCA/IGhlYWRlcnMgOiB7fSxcbiAgICBgYWkvJHtWRVJTSU9OfWBcbiAgKTtcbiAgY29uc3QgYmFzZVRlbGVtZXRyeUF0dHJpYnV0ZXMgPSBnZXRCYXNlVGVsZW1ldHJ5QXR0cmlidXRlcyh7XG4gICAgbW9kZWwsXG4gICAgdGVsZW1ldHJ5LFxuICAgIGhlYWRlcnM6IGhlYWRlcnNXaXRoVXNlckFnZW50LFxuICAgIHNldHRpbmdzOiB7IG1heFJldHJpZXMgfVxuICB9KTtcbiAgY29uc3QgdHJhY2VyID0gZ2V0VHJhY2VyKHRlbGVtZXRyeSk7XG4gIHJldHVybiByZWNvcmRTcGFuKHtcbiAgICBuYW1lOiBcImFpLmVtYmVkTWFueVwiLFxuICAgIGF0dHJpYnV0ZXM6IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgdGVsZW1ldHJ5LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAuLi5hc3NlbWJsZU9wZXJhdGlvbk5hbWUoeyBvcGVyYXRpb25JZDogXCJhaS5lbWJlZE1hbnlcIiwgdGVsZW1ldHJ5IH0pLFxuICAgICAgICAuLi5iYXNlVGVsZW1ldHJ5QXR0cmlidXRlcyxcbiAgICAgICAgLy8gc3BlY2lmaWMgc2V0dGluZ3MgdGhhdCBvbmx5IG1ha2Ugc2Vuc2Ugb24gdGhlIG91dGVyIGxldmVsOlxuICAgICAgICBcImFpLnZhbHVlc1wiOiB7XG4gICAgICAgICAgaW5wdXQ6ICgpID0+IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSxcbiAgICB0cmFjZXIsXG4gICAgZm46IGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICB2YXIgX2EyMTtcbiAgICAgIGNvbnN0IFttYXhFbWJlZGRpbmdzUGVyQ2FsbCwgc3VwcG9ydHNQYXJhbGxlbENhbGxzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgbW9kZWwubWF4RW1iZWRkaW5nc1BlckNhbGwsXG4gICAgICAgIG1vZGVsLnN1cHBvcnRzUGFyYWxsZWxDYWxsc1xuICAgICAgXSk7XG4gICAgICBpZiAobWF4RW1iZWRkaW5nc1BlckNhbGwgPT0gbnVsbCB8fCBtYXhFbWJlZGRpbmdzUGVyQ2FsbCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgY29uc3QgeyBlbWJlZGRpbmdzOiBlbWJlZGRpbmdzMiwgdXNhZ2UsIHdhcm5pbmdzOiB3YXJuaW5nczIsIHJlc3BvbnNlLCBwcm92aWRlck1ldGFkYXRhOiBwcm92aWRlck1ldGFkYXRhMiB9ID0gYXdhaXQgcmV0cnkoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZWNvcmRTcGFuKHtcbiAgICAgICAgICAgIG5hbWU6IFwiYWkuZW1iZWRNYW55LmRvRW1iZWRcIixcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICB0ZWxlbWV0cnksXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAuLi5hc3NlbWJsZU9wZXJhdGlvbk5hbWUoe1xuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uSWQ6IFwiYWkuZW1iZWRNYW55LmRvRW1iZWRcIixcbiAgICAgICAgICAgICAgICAgIHRlbGVtZXRyeVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC4uLmJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIC8vIHNwZWNpZmljIHNldHRpbmdzIHRoYXQgb25seSBtYWtlIHNlbnNlIG9uIHRoZSBvdXRlciBsZXZlbDpcbiAgICAgICAgICAgICAgICBcImFpLnZhbHVlc1wiOiB7XG4gICAgICAgICAgICAgICAgICBpbnB1dDogKCkgPT4gdmFsdWVzLm1hcCgodmFsdWUpID0+IEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdHJhY2VyLFxuICAgICAgICAgICAgZm46IGFzeW5jIChkb0VtYmVkU3BhbikgPT4ge1xuICAgICAgICAgICAgICB2YXIgX2EyMjtcbiAgICAgICAgICAgICAgY29uc3QgbW9kZWxSZXNwb25zZSA9IGF3YWl0IG1vZGVsLmRvRW1iZWQoe1xuICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzV2l0aFVzZXJBZ2VudCxcbiAgICAgICAgICAgICAgICBwcm92aWRlck9wdGlvbnNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IGVtYmVkZGluZ3MzID0gbW9kZWxSZXNwb25zZS5lbWJlZGRpbmdzO1xuICAgICAgICAgICAgICBjb25zdCB1c2FnZTIgPSAoX2EyMiA9IG1vZGVsUmVzcG9uc2UudXNhZ2UpICE9IG51bGwgPyBfYTIyIDogeyB0b2tlbnM6IE5hTiB9O1xuICAgICAgICAgICAgICBkb0VtYmVkU3Bhbi5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgIGF3YWl0IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgdGVsZW1ldHJ5LFxuICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICBcImFpLmVtYmVkZGluZ3NcIjoge1xuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogKCkgPT4gZW1iZWRkaW5nczMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVtYmVkZGluZykgPT4gSlNPTi5zdHJpbmdpZnkoZW1iZWRkaW5nKVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCJhaS51c2FnZS50b2tlbnNcIjogdXNhZ2UyLnRva2Vuc1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZW1iZWRkaW5nczogZW1iZWRkaW5nczMsXG4gICAgICAgICAgICAgICAgdXNhZ2U6IHVzYWdlMixcbiAgICAgICAgICAgICAgICB3YXJuaW5nczogbW9kZWxSZXNwb25zZS53YXJuaW5ncyxcbiAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBtb2RlbFJlc3BvbnNlLnByb3ZpZGVyTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2U6IG1vZGVsUmVzcG9uc2UucmVzcG9uc2VcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICBhd2FpdCBzZWxlY3RUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgXCJhaS5lbWJlZGRpbmdzXCI6IHtcbiAgICAgICAgICAgICAgICBvdXRwdXQ6ICgpID0+IGVtYmVkZGluZ3MyLm1hcCgoZW1iZWRkaW5nKSA9PiBKU09OLnN0cmluZ2lmeShlbWJlZGRpbmcpKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcImFpLnVzYWdlLnRva2Vuc1wiOiB1c2FnZS50b2tlbnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBsb2dXYXJuaW5ncyh7XG4gICAgICAgICAgd2FybmluZ3M6IHdhcm5pbmdzMixcbiAgICAgICAgICBwcm92aWRlcjogbW9kZWwucHJvdmlkZXIsXG4gICAgICAgICAgbW9kZWw6IG1vZGVsLm1vZGVsSWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEVtYmVkTWFueVJlc3VsdCh7XG4gICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgIGVtYmVkZGluZ3M6IGVtYmVkZGluZ3MyLFxuICAgICAgICAgIHVzYWdlLFxuICAgICAgICAgIHdhcm5pbmdzOiB3YXJuaW5nczIsXG4gICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogcHJvdmlkZXJNZXRhZGF0YTIsXG4gICAgICAgICAgcmVzcG9uc2VzOiBbcmVzcG9uc2VdXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWVDaHVua3MgPSBzcGxpdEFycmF5KHZhbHVlcywgbWF4RW1iZWRkaW5nc1BlckNhbGwpO1xuICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IFtdO1xuICAgICAgY29uc3Qgd2FybmluZ3MgPSBbXTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IFtdO1xuICAgICAgbGV0IHRva2VucyA9IDA7XG4gICAgICBsZXQgcHJvdmlkZXJNZXRhZGF0YTtcbiAgICAgIGNvbnN0IHBhcmFsbGVsQ2h1bmtzID0gc3BsaXRBcnJheShcbiAgICAgICAgdmFsdWVDaHVua3MsXG4gICAgICAgIHN1cHBvcnRzUGFyYWxsZWxDYWxscyA/IG1heFBhcmFsbGVsQ2FsbHMgOiAxXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBwYXJhbGxlbENodW5rIG9mIHBhcmFsbGVsQ2h1bmtzKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBwYXJhbGxlbENodW5rLm1hcCgoY2h1bmspID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXRyeSgoKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByZWNvcmRTcGFuKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImFpLmVtYmVkTWFueS5kb0VtYmVkXCIsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogc2VsZWN0VGVsZW1ldHJ5QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICB0ZWxlbWV0cnksXG4gICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmFzc2VtYmxlT3BlcmF0aW9uTmFtZSh7XG4gICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uSWQ6IFwiYWkuZW1iZWRNYW55LmRvRW1iZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICB0ZWxlbWV0cnlcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIC4uLmJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpYyBzZXR0aW5ncyB0aGF0IG9ubHkgbWFrZSBzZW5zZSBvbiB0aGUgb3V0ZXIgbGV2ZWw6XG4gICAgICAgICAgICAgICAgICAgIFwiYWkudmFsdWVzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogKCkgPT4gY2h1bmsubWFwKCh2YWx1ZSkgPT4gSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdHJhY2VyLFxuICAgICAgICAgICAgICAgIGZuOiBhc3luYyAoZG9FbWJlZFNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgIHZhciBfYTIyO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZWxSZXNwb25zZSA9IGF3YWl0IG1vZGVsLmRvRW1iZWQoe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGNodW5rLFxuICAgICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyc1dpdGhVc2VyQWdlbnQsXG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uc1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbWJlZGRpbmdzMiA9IG1vZGVsUmVzcG9uc2UuZW1iZWRkaW5ncztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHVzYWdlID0gKF9hMjIgPSBtb2RlbFJlc3BvbnNlLnVzYWdlKSAhPSBudWxsID8gX2EyMiA6IHsgdG9rZW5zOiBOYU4gfTtcbiAgICAgICAgICAgICAgICAgIGRvRW1iZWRTcGFuLnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImFpLmVtYmVkZGluZ3NcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6ICgpID0+IGVtYmVkZGluZ3MyLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW1iZWRkaW5nKSA9PiBKU09OLnN0cmluZ2lmeShlbWJlZGRpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFpLnVzYWdlLnRva2Vuc1wiOiB1c2FnZS50b2tlbnNcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZW1iZWRkaW5nczogZW1iZWRkaW5nczIsXG4gICAgICAgICAgICAgICAgICAgIHVzYWdlLFxuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nczogbW9kZWxSZXNwb25zZS53YXJuaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogbW9kZWxSZXNwb25zZS5wcm92aWRlck1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogbW9kZWxSZXNwb25zZS5yZXNwb25zZVxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgIGVtYmVkZGluZ3MucHVzaCguLi5yZXN1bHQuZW1iZWRkaW5ncyk7XG4gICAgICAgICAgd2FybmluZ3MucHVzaCguLi5yZXN1bHQud2FybmluZ3MpO1xuICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKHJlc3VsdC5yZXNwb25zZSk7XG4gICAgICAgICAgdG9rZW5zICs9IHJlc3VsdC51c2FnZS50b2tlbnM7XG4gICAgICAgICAgaWYgKHJlc3VsdC5wcm92aWRlck1ldGFkYXRhKSB7XG4gICAgICAgICAgICBpZiAoIXByb3ZpZGVyTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YSA9IHsgLi4ucmVzdWx0LnByb3ZpZGVyTWV0YWRhdGEgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW3Byb3ZpZGVyTmFtZSwgbWV0YWRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgICAgIHJlc3VsdC5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhW3Byb3ZpZGVyTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAuLi4oX2EyMSA9IHByb3ZpZGVyTWV0YWRhdGFbcHJvdmlkZXJOYW1lXSkgIT0gbnVsbCA/IF9hMjEgOiB7fSxcbiAgICAgICAgICAgICAgICAgIC4uLm1ldGFkYXRhXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICBhd2FpdCBzZWxlY3RUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICAgICAgICB0ZWxlbWV0cnksXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgXCJhaS5lbWJlZGRpbmdzXCI6IHtcbiAgICAgICAgICAgICAgb3V0cHV0OiAoKSA9PiBlbWJlZGRpbmdzLm1hcCgoZW1iZWRkaW5nKSA9PiBKU09OLnN0cmluZ2lmeShlbWJlZGRpbmcpKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiYWkudXNhZ2UudG9rZW5zXCI6IHRva2Vuc1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBsb2dXYXJuaW5ncyh7XG4gICAgICAgIHdhcm5pbmdzLFxuICAgICAgICBwcm92aWRlcjogbW9kZWwucHJvdmlkZXIsXG4gICAgICAgIG1vZGVsOiBtb2RlbC5tb2RlbElkXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgRGVmYXVsdEVtYmVkTWFueVJlc3VsdCh7XG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgZW1iZWRkaW5ncyxcbiAgICAgICAgdXNhZ2U6IHsgdG9rZW5zIH0sXG4gICAgICAgIHdhcm5pbmdzLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhLFxuICAgICAgICByZXNwb25zZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG52YXIgRGVmYXVsdEVtYmVkTWFueVJlc3VsdCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHRoaXMudmFsdWVzID0gb3B0aW9ucy52YWx1ZXM7XG4gICAgdGhpcy5lbWJlZGRpbmdzID0gb3B0aW9ucy5lbWJlZGRpbmdzO1xuICAgIHRoaXMudXNhZ2UgPSBvcHRpb25zLnVzYWdlO1xuICAgIHRoaXMud2FybmluZ3MgPSBvcHRpb25zLndhcm5pbmdzO1xuICAgIHRoaXMucHJvdmlkZXJNZXRhZGF0YSA9IG9wdGlvbnMucHJvdmlkZXJNZXRhZGF0YTtcbiAgICB0aGlzLnJlc3BvbnNlcyA9IG9wdGlvbnMucmVzcG9uc2VzO1xuICB9XG59O1xuXG4vLyBzcmMvZ2VuZXJhdGUtaW1hZ2UvZ2VuZXJhdGUtaW1hZ2UudHNcbmltcG9ydCB7XG4gIGNvbnZlcnRCYXNlNjRUb1VpbnQ4QXJyYXkgYXMgY29udmVydEJhc2U2NFRvVWludDhBcnJheTQsXG4gIHdpdGhVc2VyQWdlbnRTdWZmaXggYXMgd2l0aFVzZXJBZ2VudFN1ZmZpeDVcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSW1hZ2Uoe1xuICBtb2RlbDogbW9kZWxBcmcsXG4gIHByb21wdDogcHJvbXB0QXJnLFxuICBuID0gMSxcbiAgbWF4SW1hZ2VzUGVyQ2FsbCxcbiAgc2l6ZSxcbiAgYXNwZWN0UmF0aW8sXG4gIHNlZWQsXG4gIHByb3ZpZGVyT3B0aW9ucyxcbiAgbWF4UmV0cmllczogbWF4UmV0cmllc0FyZyxcbiAgYWJvcnRTaWduYWwsXG4gIGhlYWRlcnNcbn0pIHtcbiAgdmFyIF9hMjEsIF9iO1xuICBjb25zdCBtb2RlbCA9IHJlc29sdmVJbWFnZU1vZGVsKG1vZGVsQXJnKTtcbiAgY29uc3QgaGVhZGVyc1dpdGhVc2VyQWdlbnQgPSB3aXRoVXNlckFnZW50U3VmZml4NShcbiAgICBoZWFkZXJzICE9IG51bGwgPyBoZWFkZXJzIDoge30sXG4gICAgYGFpLyR7VkVSU0lPTn1gXG4gICk7XG4gIGNvbnN0IHsgcmV0cnkgfSA9IHByZXBhcmVSZXRyaWVzKHtcbiAgICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzQXJnLFxuICAgIGFib3J0U2lnbmFsXG4gIH0pO1xuICBjb25zdCBtYXhJbWFnZXNQZXJDYWxsV2l0aERlZmF1bHQgPSAoX2EyMSA9IG1heEltYWdlc1BlckNhbGwgIT0gbnVsbCA/IG1heEltYWdlc1BlckNhbGwgOiBhd2FpdCBpbnZva2VNb2RlbE1heEltYWdlc1BlckNhbGwobW9kZWwpKSAhPSBudWxsID8gX2EyMSA6IDE7XG4gIGNvbnN0IGNhbGxDb3VudCA9IE1hdGguY2VpbChuIC8gbWF4SW1hZ2VzUGVyQ2FsbFdpdGhEZWZhdWx0KTtcbiAgY29uc3QgY2FsbEltYWdlQ291bnRzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogY2FsbENvdW50IH0sIChfLCBpKSA9PiB7XG4gICAgaWYgKGkgPCBjYWxsQ291bnQgLSAxKSB7XG4gICAgICByZXR1cm4gbWF4SW1hZ2VzUGVyQ2FsbFdpdGhEZWZhdWx0O1xuICAgIH1cbiAgICBjb25zdCByZW1haW5kZXIgPSBuICUgbWF4SW1hZ2VzUGVyQ2FsbFdpdGhEZWZhdWx0O1xuICAgIHJldHVybiByZW1haW5kZXIgPT09IDAgPyBtYXhJbWFnZXNQZXJDYWxsV2l0aERlZmF1bHQgOiByZW1haW5kZXI7XG4gIH0pO1xuICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgY2FsbEltYWdlQ291bnRzLm1hcChcbiAgICAgIGFzeW5jIChjYWxsSW1hZ2VDb3VudCkgPT4gcmV0cnkoKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHByb21wdCwgZmlsZXMsIG1hc2sgfSA9IG5vcm1hbGl6ZVByb21wdChwcm9tcHRBcmcpO1xuICAgICAgICByZXR1cm4gbW9kZWwuZG9HZW5lcmF0ZSh7XG4gICAgICAgICAgcHJvbXB0LFxuICAgICAgICAgIGZpbGVzLFxuICAgICAgICAgIG1hc2ssXG4gICAgICAgICAgbjogY2FsbEltYWdlQ291bnQsXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1dpdGhVc2VyQWdlbnQsXG4gICAgICAgICAgc2l6ZSxcbiAgICAgICAgICBhc3BlY3RSYXRpbyxcbiAgICAgICAgICBzZWVkLFxuICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogcHJvdmlkZXJPcHRpb25zICE9IG51bGwgPyBwcm92aWRlck9wdGlvbnMgOiB7fVxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKVxuICApO1xuICBjb25zdCBpbWFnZXMgPSBbXTtcbiAgY29uc3Qgd2FybmluZ3MgPSBbXTtcbiAgY29uc3QgcmVzcG9uc2VzID0gW107XG4gIGNvbnN0IHByb3ZpZGVyTWV0YWRhdGEgPSB7fTtcbiAgbGV0IHRvdGFsVXNhZ2UgPSB7XG4gICAgaW5wdXRUb2tlbnM6IHZvaWQgMCxcbiAgICBvdXRwdXRUb2tlbnM6IHZvaWQgMCxcbiAgICB0b3RhbFRva2Vuczogdm9pZCAwXG4gIH07XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpbWFnZXMucHVzaChcbiAgICAgIC4uLnJlc3VsdC5pbWFnZXMubWFwKFxuICAgICAgICAoaW1hZ2UpID0+IHtcbiAgICAgICAgICB2YXIgX2EyMjtcbiAgICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRHZW5lcmF0ZWRGaWxlKHtcbiAgICAgICAgICAgIGRhdGE6IGltYWdlLFxuICAgICAgICAgICAgbWVkaWFUeXBlOiAoX2EyMiA9IGRldGVjdE1lZGlhVHlwZSh7XG4gICAgICAgICAgICAgIGRhdGE6IGltYWdlLFxuICAgICAgICAgICAgICBzaWduYXR1cmVzOiBpbWFnZU1lZGlhVHlwZVNpZ25hdHVyZXNcbiAgICAgICAgICAgIH0pKSAhPSBudWxsID8gX2EyMiA6IFwiaW1hZ2UvcG5nXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gICAgd2FybmluZ3MucHVzaCguLi5yZXN1bHQud2FybmluZ3MpO1xuICAgIGlmIChyZXN1bHQudXNhZ2UgIT0gbnVsbCkge1xuICAgICAgdG90YWxVc2FnZSA9IGFkZEltYWdlTW9kZWxVc2FnZSh0b3RhbFVzYWdlLCByZXN1bHQudXNhZ2UpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnByb3ZpZGVyTWV0YWRhdGEpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb3ZpZGVyTmFtZSwgbWV0YWRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5wcm92aWRlck1ldGFkYXRhKSkge1xuICAgICAgICBpZiAocHJvdmlkZXJOYW1lID09PSBcImdhdGV3YXlcIikge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbnRyeSA9IHByb3ZpZGVyTWV0YWRhdGFbcHJvdmlkZXJOYW1lXTtcbiAgICAgICAgICBpZiAoY3VycmVudEVudHJ5ICE9IG51bGwgJiYgdHlwZW9mIGN1cnJlbnRFbnRyeSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YVtwcm92aWRlck5hbWVdID0ge1xuICAgICAgICAgICAgICAuLi5jdXJyZW50RW50cnksXG4gICAgICAgICAgICAgIC4uLm1ldGFkYXRhXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhW3Byb3ZpZGVyTmFtZV0gPSBtZXRhZGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW1hZ2VzVmFsdWUgPSBwcm92aWRlck1ldGFkYXRhW3Byb3ZpZGVyTmFtZV0uaW1hZ2VzO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGltYWdlc1ZhbHVlKSAmJiBpbWFnZXNWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSBwcm92aWRlck1ldGFkYXRhW3Byb3ZpZGVyTmFtZV0uaW1hZ2VzO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAoX2IgPSBwcm92aWRlck1ldGFkYXRhW3Byb3ZpZGVyTmFtZV0pICE9IG51bGwgPyBfYiA6IHByb3ZpZGVyTWV0YWRhdGFbcHJvdmlkZXJOYW1lXSA9IHsgaW1hZ2VzOiBbXSB9O1xuICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGFbcHJvdmlkZXJOYW1lXS5pbWFnZXMucHVzaChcbiAgICAgICAgICAgIC4uLnJlc3VsdC5wcm92aWRlck1ldGFkYXRhW3Byb3ZpZGVyTmFtZV0uaW1hZ2VzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXNwb25zZXMucHVzaChyZXN1bHQucmVzcG9uc2UpO1xuICB9XG4gIGxvZ1dhcm5pbmdzKHsgd2FybmluZ3MsIHByb3ZpZGVyOiBtb2RlbC5wcm92aWRlciwgbW9kZWw6IG1vZGVsLm1vZGVsSWQgfSk7XG4gIGlmICghaW1hZ2VzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBOb0ltYWdlR2VuZXJhdGVkRXJyb3IoeyByZXNwb25zZXMgfSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBEZWZhdWx0R2VuZXJhdGVJbWFnZVJlc3VsdCh7XG4gICAgaW1hZ2VzLFxuICAgIHdhcm5pbmdzLFxuICAgIHJlc3BvbnNlcyxcbiAgICBwcm92aWRlck1ldGFkYXRhLFxuICAgIHVzYWdlOiB0b3RhbFVzYWdlXG4gIH0pO1xufVxudmFyIERlZmF1bHRHZW5lcmF0ZUltYWdlUmVzdWx0ID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgdGhpcy5pbWFnZXMgPSBvcHRpb25zLmltYWdlcztcbiAgICB0aGlzLndhcm5pbmdzID0gb3B0aW9ucy53YXJuaW5ncztcbiAgICB0aGlzLnJlc3BvbnNlcyA9IG9wdGlvbnMucmVzcG9uc2VzO1xuICAgIHRoaXMucHJvdmlkZXJNZXRhZGF0YSA9IG9wdGlvbnMucHJvdmlkZXJNZXRhZGF0YTtcbiAgICB0aGlzLnVzYWdlID0gb3B0aW9ucy51c2FnZTtcbiAgfVxuICBnZXQgaW1hZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VzWzBdO1xuICB9XG59O1xuYXN5bmMgZnVuY3Rpb24gaW52b2tlTW9kZWxNYXhJbWFnZXNQZXJDYWxsKG1vZGVsKSB7XG4gIGNvbnN0IGlzRnVuY3Rpb24gPSBtb2RlbC5tYXhJbWFnZXNQZXJDYWxsIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gIGlmICghaXNGdW5jdGlvbikge1xuICAgIHJldHVybiBtb2RlbC5tYXhJbWFnZXNQZXJDYWxsO1xuICB9XG4gIHJldHVybiBtb2RlbC5tYXhJbWFnZXNQZXJDYWxsKHtcbiAgICBtb2RlbElkOiBtb2RlbC5tb2RlbElkXG4gIH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUHJvbXB0KHByb21wdCkge1xuICBpZiAodHlwZW9mIHByb21wdCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7IHByb21wdCwgZmlsZXM6IHZvaWQgMCwgbWFzazogdm9pZCAwIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcm9tcHQ6IHByb21wdC50ZXh0LFxuICAgIGZpbGVzOiBwcm9tcHQuaW1hZ2VzLm1hcCh0b0ltYWdlTW9kZWxWM0ZpbGUpLFxuICAgIG1hc2s6IHByb21wdC5tYXNrID8gdG9JbWFnZU1vZGVsVjNGaWxlKHByb21wdC5tYXNrKSA6IHZvaWQgMFxuICB9O1xufVxuZnVuY3Rpb24gdG9JbWFnZU1vZGVsVjNGaWxlKGRhdGFDb250ZW50KSB7XG4gIGlmICh0eXBlb2YgZGF0YUNvbnRlbnQgPT09IFwic3RyaW5nXCIgJiYgZGF0YUNvbnRlbnQuc3RhcnRzV2l0aChcImh0dHBcIikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJ1cmxcIixcbiAgICAgIHVybDogZGF0YUNvbnRlbnRcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgZGF0YUNvbnRlbnQgPT09IFwic3RyaW5nXCIgJiYgZGF0YUNvbnRlbnQuc3RhcnRzV2l0aChcImRhdGE6XCIpKSB7XG4gICAgY29uc3QgeyBtZWRpYVR5cGU6IGRhdGFVcmxNZWRpYVR5cGUsIGJhc2U2NENvbnRlbnQgfSA9IHNwbGl0RGF0YVVybChkYXRhQ29udGVudCk7XG4gICAgaWYgKGJhc2U2NENvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgY29uc3QgdWludDhEYXRhMiA9IGNvbnZlcnRCYXNlNjRUb1VpbnQ4QXJyYXk0KGJhc2U2NENvbnRlbnQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgIGRhdGE6IHVpbnQ4RGF0YTIsXG4gICAgICAgIG1lZGlhVHlwZTogZGF0YVVybE1lZGlhVHlwZSB8fCBkZXRlY3RNZWRpYVR5cGUoe1xuICAgICAgICAgIGRhdGE6IHVpbnQ4RGF0YTIsXG4gICAgICAgICAgc2lnbmF0dXJlczogaW1hZ2VNZWRpYVR5cGVTaWduYXR1cmVzXG4gICAgICAgIH0pIHx8IFwiaW1hZ2UvcG5nXCJcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGNvbnN0IHVpbnQ4RGF0YSA9IGNvbnZlcnREYXRhQ29udGVudFRvVWludDhBcnJheShkYXRhQ29udGVudCk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJmaWxlXCIsXG4gICAgZGF0YTogdWludDhEYXRhLFxuICAgIG1lZGlhVHlwZTogZGV0ZWN0TWVkaWFUeXBlKHtcbiAgICAgIGRhdGE6IHVpbnQ4RGF0YSxcbiAgICAgIHNpZ25hdHVyZXM6IGltYWdlTWVkaWFUeXBlU2lnbmF0dXJlc1xuICAgIH0pIHx8IFwiaW1hZ2UvcG5nXCJcbiAgfTtcbn1cblxuLy8gc3JjL2dlbmVyYXRlLWltYWdlL2luZGV4LnRzXG52YXIgZXhwZXJpbWVudGFsX2dlbmVyYXRlSW1hZ2UgPSBnZW5lcmF0ZUltYWdlO1xuXG4vLyBzcmMvZ2VuZXJhdGUtb2JqZWN0L2dlbmVyYXRlLW9iamVjdC50c1xuaW1wb3J0IHtcbiAgY3JlYXRlSWRHZW5lcmF0b3IgYXMgY3JlYXRlSWRHZW5lcmF0b3IzLFxuICB3aXRoVXNlckFnZW50U3VmZml4IGFzIHdpdGhVc2VyQWdlbnRTdWZmaXg2XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5cbi8vIHNyYy9nZW5lcmF0ZS1vYmplY3Qvb3V0cHV0LXN0cmF0ZWd5LnRzXG5pbXBvcnQge1xuICBpc0pTT05BcnJheSxcbiAgaXNKU09OT2JqZWN0LFxuICBUeXBlVmFsaWRhdGlvbkVycm9yIGFzIFR5cGVWYWxpZGF0aW9uRXJyb3I0LFxuICBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlFcnJvciBhcyBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlFcnJvcjNcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7XG4gIGFzU2NoZW1hIGFzIGFzU2NoZW1hNCxcbiAgc2FmZVZhbGlkYXRlVHlwZXMgYXMgc2FmZVZhbGlkYXRlVHlwZXM0XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG52YXIgbm9TY2hlbWFPdXRwdXRTdHJhdGVneSA9IHtcbiAgdHlwZTogXCJuby1zY2hlbWFcIixcbiAganNvblNjaGVtYTogYXN5bmMgKCkgPT4gdm9pZCAwLFxuICBhc3luYyB2YWxpZGF0ZVBhcnRpYWxSZXN1bHQoeyB2YWx1ZSwgdGV4dERlbHRhIH0pIHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCB2YWx1ZTogeyBwYXJ0aWFsOiB2YWx1ZSwgdGV4dERlbHRhIH0gfTtcbiAgfSxcbiAgYXN5bmMgdmFsaWRhdGVGaW5hbFJlc3VsdCh2YWx1ZSwgY29udGV4dDIpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHZvaWQgMCA/IHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZXJyb3I6IG5ldyBOb09iamVjdEdlbmVyYXRlZEVycm9yKHtcbiAgICAgICAgbWVzc2FnZTogXCJObyBvYmplY3QgZ2VuZXJhdGVkOiByZXNwb25zZSBkaWQgbm90IG1hdGNoIHNjaGVtYS5cIixcbiAgICAgICAgdGV4dDogY29udGV4dDIudGV4dCxcbiAgICAgICAgcmVzcG9uc2U6IGNvbnRleHQyLnJlc3BvbnNlLFxuICAgICAgICB1c2FnZTogY29udGV4dDIudXNhZ2UsXG4gICAgICAgIGZpbmlzaFJlYXNvbjogY29udGV4dDIuZmluaXNoUmVhc29uXG4gICAgICB9KVxuICAgIH0gOiB7IHN1Y2Nlc3M6IHRydWUsIHZhbHVlIH07XG4gIH0sXG4gIGNyZWF0ZUVsZW1lbnRTdHJlYW0oKSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yMyh7XG4gICAgICBmdW5jdGlvbmFsaXR5OiBcImVsZW1lbnQgc3RyZWFtcyBpbiBuby1zY2hlbWEgbW9kZVwiXG4gICAgfSk7XG4gIH1cbn07XG52YXIgb2JqZWN0T3V0cHV0U3RyYXRlZ3kgPSAoc2NoZW1hKSA9PiAoe1xuICB0eXBlOiBcIm9iamVjdFwiLFxuICBqc29uU2NoZW1hOiBhc3luYyAoKSA9PiBhd2FpdCBzY2hlbWEuanNvblNjaGVtYSxcbiAgYXN5bmMgdmFsaWRhdGVQYXJ0aWFsUmVzdWx0KHsgdmFsdWUsIHRleHREZWx0YSB9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICB2YWx1ZToge1xuICAgICAgICAvLyBOb3RlOiBjdXJyZW50bHkgbm8gdmFsaWRhdGlvbiBvZiBwYXJ0aWFsIHJlc3VsdHM6XG4gICAgICAgIHBhcnRpYWw6IHZhbHVlLFxuICAgICAgICB0ZXh0RGVsdGFcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBhc3luYyB2YWxpZGF0ZUZpbmFsUmVzdWx0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHNhZmVWYWxpZGF0ZVR5cGVzNCh7IHZhbHVlLCBzY2hlbWEgfSk7XG4gIH0sXG4gIGNyZWF0ZUVsZW1lbnRTdHJlYW0oKSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yMyh7XG4gICAgICBmdW5jdGlvbmFsaXR5OiBcImVsZW1lbnQgc3RyZWFtcyBpbiBvYmplY3QgbW9kZVwiXG4gICAgfSk7XG4gIH1cbn0pO1xudmFyIGFycmF5T3V0cHV0U3RyYXRlZ3kgPSAoc2NoZW1hKSA9PiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJhcnJheVwiLFxuICAgIC8vIHdyYXAgaW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYXJyYXkgb2YgZWxlbWVudHMsIHNpbmNlIG1vc3QgTExNcyB3aWxsIG5vdFxuICAgIC8vIGJlIGFibGUgdG8gZ2VuZXJhdGUgYW4gYXJyYXkgZGlyZWN0bHk6XG4gICAgLy8gcG9zc2libGUgZnV0dXJlIG9wdGltaXphdGlvbjogdXNlIGFycmF5cyBkaXJlY3RseSB3aGVuIG1vZGVsIHN1cHBvcnRzIGdyYW1tYXItZ3VpZGVkIGdlbmVyYXRpb25cbiAgICBqc29uU2NoZW1hOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7ICRzY2hlbWEsIC4uLml0ZW1TY2hlbWEgfSA9IGF3YWl0IHNjaGVtYS5qc29uU2NoZW1hO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJHNjaGVtYTogXCJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSNcIixcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGVsZW1lbnRzOiB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IGl0ZW1TY2hlbWEgfVxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogW1wiZWxlbWVudHNcIl0sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFzeW5jIHZhbGlkYXRlUGFydGlhbFJlc3VsdCh7XG4gICAgICB2YWx1ZSxcbiAgICAgIGxhdGVzdE9iamVjdCxcbiAgICAgIGlzRmlyc3REZWx0YSxcbiAgICAgIGlzRmluYWxEZWx0YVxuICAgIH0pIHtcbiAgICAgIHZhciBfYTIxO1xuICAgICAgaWYgKCFpc0pTT05PYmplY3QodmFsdWUpIHx8ICFpc0pTT05BcnJheSh2YWx1ZS5lbGVtZW50cykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3I0KHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgY2F1c2U6IFwidmFsdWUgbXVzdCBiZSBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhbiBhcnJheSBvZiBlbGVtZW50c1wiXG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlucHV0QXJyYXkgPSB2YWx1ZS5lbGVtZW50cztcbiAgICAgIGNvbnN0IHJlc3VsdEFycmF5ID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGlucHV0QXJyYXlbaV07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhZmVWYWxpZGF0ZVR5cGVzNCh7IHZhbHVlOiBlbGVtZW50LCBzY2hlbWEgfSk7XG4gICAgICAgIGlmIChpID09PSBpbnB1dEFycmF5Lmxlbmd0aCAtIDEgJiYgIWlzRmluYWxEZWx0YSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdEFycmF5LnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB1Ymxpc2hlZEVsZW1lbnRDb3VudCA9IChfYTIxID0gbGF0ZXN0T2JqZWN0ID09IG51bGwgPyB2b2lkIDAgOiBsYXRlc3RPYmplY3QubGVuZ3RoKSAhPSBudWxsID8gX2EyMSA6IDA7XG4gICAgICBsZXQgdGV4dERlbHRhID0gXCJcIjtcbiAgICAgIGlmIChpc0ZpcnN0RGVsdGEpIHtcbiAgICAgICAgdGV4dERlbHRhICs9IFwiW1wiO1xuICAgICAgfVxuICAgICAgaWYgKHB1Ymxpc2hlZEVsZW1lbnRDb3VudCA+IDApIHtcbiAgICAgICAgdGV4dERlbHRhICs9IFwiLFwiO1xuICAgICAgfVxuICAgICAgdGV4dERlbHRhICs9IHJlc3VsdEFycmF5LnNsaWNlKHB1Ymxpc2hlZEVsZW1lbnRDb3VudCkubWFwKChlbGVtZW50KSA9PiBKU09OLnN0cmluZ2lmeShlbGVtZW50KSkuam9pbihcIixcIik7XG4gICAgICBpZiAoaXNGaW5hbERlbHRhKSB7XG4gICAgICAgIHRleHREZWx0YSArPSBcIl1cIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcGFydGlhbDogcmVzdWx0QXJyYXksXG4gICAgICAgICAgdGV4dERlbHRhXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICBhc3luYyB2YWxpZGF0ZUZpbmFsUmVzdWx0KHZhbHVlKSB7XG4gICAgICBpZiAoIWlzSlNPTk9iamVjdCh2YWx1ZSkgfHwgIWlzSlNPTkFycmF5KHZhbHVlLmVsZW1lbnRzKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiBuZXcgVHlwZVZhbGlkYXRpb25FcnJvcjQoe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBjYXVzZTogXCJ2YWx1ZSBtdXN0IGJlIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGFuIGFycmF5IG9mIGVsZW1lbnRzXCJcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgaW5wdXRBcnJheSA9IHZhbHVlLmVsZW1lbnRzO1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGlucHV0QXJyYXkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FmZVZhbGlkYXRlVHlwZXM0KHsgdmFsdWU6IGVsZW1lbnQsIHNjaGVtYSB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHZhbHVlOiBpbnB1dEFycmF5IH07XG4gICAgfSxcbiAgICBjcmVhdGVFbGVtZW50U3RyZWFtKG9yaWdpbmFsU3RyZWFtKSB7XG4gICAgICBsZXQgcHVibGlzaGVkRWxlbWVudHMgPSAwO1xuICAgICAgcmV0dXJuIGNyZWF0ZUFzeW5jSXRlcmFibGVTdHJlYW0oXG4gICAgICAgIG9yaWdpbmFsU3RyZWFtLnBpcGVUaHJvdWdoKFxuICAgICAgICAgIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgICAgICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoY2h1bmsudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXkyID0gY2h1bmsub2JqZWN0O1xuICAgICAgICAgICAgICAgICAgZm9yICg7IHB1Ymxpc2hlZEVsZW1lbnRzIDwgYXJyYXkyLmxlbmd0aDsgcHVibGlzaGVkRWxlbWVudHMrKykge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYXJyYXkyW3B1Ymxpc2hlZEVsZW1lbnRzXSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBcInRleHQtZGVsdGFcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZmluaXNoXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZUNoZWNrID0gY2h1bms7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBVbnN1cHBvcnRlZCBjaHVuayB0eXBlOiAke19leGhhdXN0aXZlQ2hlY2t9YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn07XG52YXIgZW51bU91dHB1dFN0cmF0ZWd5ID0gKGVudW1WYWx1ZXMpID0+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcImVudW1cIixcbiAgICAvLyB3cmFwIGluIG9iamVjdCB0aGF0IGNvbnRhaW5zIHJlc3VsdCwgc2luY2UgbW9zdCBMTE1zIHdpbGwgbm90XG4gICAgLy8gYmUgYWJsZSB0byBnZW5lcmF0ZSBhbiBlbnVtIHZhbHVlIGRpcmVjdGx5OlxuICAgIC8vIHBvc3NpYmxlIGZ1dHVyZSBvcHRpbWl6YXRpb246IHVzZSBlbnVtcyBkaXJlY3RseSB3aGVuIG1vZGVsIHN1cHBvcnRzIHRvcC1sZXZlbCBlbnVtc1xuICAgIGpzb25TY2hlbWE6IGFzeW5jICgpID0+ICh7XG4gICAgICAkc2NoZW1hOiBcImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hI1wiLFxuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgcmVzdWx0OiB7IHR5cGU6IFwic3RyaW5nXCIsIGVudW06IGVudW1WYWx1ZXMgfVxuICAgICAgfSxcbiAgICAgIHJlcXVpcmVkOiBbXCJyZXN1bHRcIl0sXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgICB9KSxcbiAgICBhc3luYyB2YWxpZGF0ZUZpbmFsUmVzdWx0KHZhbHVlKSB7XG4gICAgICBpZiAoIWlzSlNPTk9iamVjdCh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlLnJlc3VsdCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiBuZXcgVHlwZVZhbGlkYXRpb25FcnJvcjQoe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBjYXVzZTogJ3ZhbHVlIG11c3QgYmUgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBzdHJpbmcgaW4gdGhlIFwicmVzdWx0XCIgcHJvcGVydHkuJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZS5yZXN1bHQ7XG4gICAgICByZXR1cm4gZW51bVZhbHVlcy5pbmNsdWRlcyhyZXN1bHQpID8geyBzdWNjZXNzOiB0cnVlLCB2YWx1ZTogcmVzdWx0IH0gOiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjogbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3I0KHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBjYXVzZTogXCJ2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIGluIHRoZSBlbnVtXCJcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBhc3luYyB2YWxpZGF0ZVBhcnRpYWxSZXN1bHQoeyB2YWx1ZSwgdGV4dERlbHRhIH0pIHtcbiAgICAgIGlmICghaXNKU09OT2JqZWN0KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUucmVzdWx0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IG5ldyBUeXBlVmFsaWRhdGlvbkVycm9yNCh7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGNhdXNlOiAndmFsdWUgbXVzdCBiZSBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIHN0cmluZyBpbiB0aGUgXCJyZXN1bHRcIiBwcm9wZXJ0eS4nXG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbHVlLnJlc3VsdDtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRW51bVZhbHVlcyA9IGVudW1WYWx1ZXMuZmlsdGVyKFxuICAgICAgICAoZW51bVZhbHVlKSA9PiBlbnVtVmFsdWUuc3RhcnRzV2l0aChyZXN1bHQpXG4gICAgICApO1xuICAgICAgaWYgKHZhbHVlLnJlc3VsdC5sZW5ndGggPT09IDAgfHwgcG9zc2libGVFbnVtVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiBuZXcgVHlwZVZhbGlkYXRpb25FcnJvcjQoe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBjYXVzZTogXCJ2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIGluIHRoZSBlbnVtXCJcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwYXJ0aWFsOiBwb3NzaWJsZUVudW1WYWx1ZXMubGVuZ3RoID4gMSA/IHJlc3VsdCA6IHBvc3NpYmxlRW51bVZhbHVlc1swXSxcbiAgICAgICAgICB0ZXh0RGVsdGFcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgIGNyZWF0ZUVsZW1lbnRTdHJlYW0oKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3IzKHtcbiAgICAgICAgZnVuY3Rpb25hbGl0eTogXCJlbGVtZW50IHN0cmVhbXMgaW4gZW51bSBtb2RlXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn07XG5mdW5jdGlvbiBnZXRPdXRwdXRTdHJhdGVneSh7XG4gIG91dHB1dCxcbiAgc2NoZW1hLFxuICBlbnVtVmFsdWVzXG59KSB7XG4gIHN3aXRjaCAob3V0cHV0KSB7XG4gICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgcmV0dXJuIG9iamVjdE91dHB1dFN0cmF0ZWd5KGFzU2NoZW1hNChzY2hlbWEpKTtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBhcnJheU91dHB1dFN0cmF0ZWd5KGFzU2NoZW1hNChzY2hlbWEpKTtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgcmV0dXJuIGVudW1PdXRwdXRTdHJhdGVneShlbnVtVmFsdWVzKTtcbiAgICBjYXNlIFwibm8tc2NoZW1hXCI6XG4gICAgICByZXR1cm4gbm9TY2hlbWFPdXRwdXRTdHJhdGVneTtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBfZXhoYXVzdGl2ZUNoZWNrID0gb3V0cHV0O1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBvdXRwdXQ6ICR7X2V4aGF1c3RpdmVDaGVja31gKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gc3JjL2dlbmVyYXRlLW9iamVjdC9wYXJzZS1hbmQtdmFsaWRhdGUtb2JqZWN0LXJlc3VsdC50c1xuaW1wb3J0IHsgSlNPTlBhcnNlRXJyb3IgYXMgSlNPTlBhcnNlRXJyb3IyLCBUeXBlVmFsaWRhdGlvbkVycm9yIGFzIFR5cGVWYWxpZGF0aW9uRXJyb3I1IH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7IHNhZmVQYXJzZUpTT04gYXMgc2FmZVBhcnNlSlNPTjQgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuYXN5bmMgZnVuY3Rpb24gcGFyc2VBbmRWYWxpZGF0ZU9iamVjdFJlc3VsdChyZXN1bHQsIG91dHB1dFN0cmF0ZWd5LCBjb250ZXh0Mikge1xuICBjb25zdCBwYXJzZVJlc3VsdCA9IGF3YWl0IHNhZmVQYXJzZUpTT040KHsgdGV4dDogcmVzdWx0IH0pO1xuICBpZiAoIXBhcnNlUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgTm9PYmplY3RHZW5lcmF0ZWRFcnJvcih7XG4gICAgICBtZXNzYWdlOiBcIk5vIG9iamVjdCBnZW5lcmF0ZWQ6IGNvdWxkIG5vdCBwYXJzZSB0aGUgcmVzcG9uc2UuXCIsXG4gICAgICBjYXVzZTogcGFyc2VSZXN1bHQuZXJyb3IsXG4gICAgICB0ZXh0OiByZXN1bHQsXG4gICAgICByZXNwb25zZTogY29udGV4dDIucmVzcG9uc2UsXG4gICAgICB1c2FnZTogY29udGV4dDIudXNhZ2UsXG4gICAgICBmaW5pc2hSZWFzb246IGNvbnRleHQyLmZpbmlzaFJlYXNvblxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCBvdXRwdXRTdHJhdGVneS52YWxpZGF0ZUZpbmFsUmVzdWx0KFxuICAgIHBhcnNlUmVzdWx0LnZhbHVlLFxuICAgIHtcbiAgICAgIHRleHQ6IHJlc3VsdCxcbiAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5yZXNwb25zZSxcbiAgICAgIHVzYWdlOiBjb250ZXh0Mi51c2FnZVxuICAgIH1cbiAgKTtcbiAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgTm9PYmplY3RHZW5lcmF0ZWRFcnJvcih7XG4gICAgICBtZXNzYWdlOiBcIk5vIG9iamVjdCBnZW5lcmF0ZWQ6IHJlc3BvbnNlIGRpZCBub3QgbWF0Y2ggc2NoZW1hLlwiLFxuICAgICAgY2F1c2U6IHZhbGlkYXRpb25SZXN1bHQuZXJyb3IsXG4gICAgICB0ZXh0OiByZXN1bHQsXG4gICAgICByZXNwb25zZTogY29udGV4dDIucmVzcG9uc2UsXG4gICAgICB1c2FnZTogY29udGV4dDIudXNhZ2UsXG4gICAgICBmaW5pc2hSZWFzb246IGNvbnRleHQyLmZpbmlzaFJlYXNvblxuICAgIH0pO1xuICB9XG4gIHJldHVybiB2YWxpZGF0aW9uUmVzdWx0LnZhbHVlO1xufVxuYXN5bmMgZnVuY3Rpb24gcGFyc2VBbmRWYWxpZGF0ZU9iamVjdFJlc3VsdFdpdGhSZXBhaXIocmVzdWx0LCBvdXRwdXRTdHJhdGVneSwgcmVwYWlyVGV4dCwgY29udGV4dDIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcGFyc2VBbmRWYWxpZGF0ZU9iamVjdFJlc3VsdChyZXN1bHQsIG91dHB1dFN0cmF0ZWd5LCBjb250ZXh0Mik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHJlcGFpclRleHQgIT0gbnVsbCAmJiBOb09iamVjdEdlbmVyYXRlZEVycm9yLmlzSW5zdGFuY2UoZXJyb3IpICYmIChKU09OUGFyc2VFcnJvcjIuaXNJbnN0YW5jZShlcnJvci5jYXVzZSkgfHwgVHlwZVZhbGlkYXRpb25FcnJvcjUuaXNJbnN0YW5jZShlcnJvci5jYXVzZSkpKSB7XG4gICAgICBjb25zdCByZXBhaXJlZFRleHQgPSBhd2FpdCByZXBhaXJUZXh0KHtcbiAgICAgICAgdGV4dDogcmVzdWx0LFxuICAgICAgICBlcnJvcjogZXJyb3IuY2F1c2VcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcGFpcmVkVGV4dCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCBwYXJzZUFuZFZhbGlkYXRlT2JqZWN0UmVzdWx0KFxuICAgICAgICByZXBhaXJlZFRleHQsXG4gICAgICAgIG91dHB1dFN0cmF0ZWd5LFxuICAgICAgICBjb250ZXh0MlxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLy8gc3JjL2dlbmVyYXRlLW9iamVjdC92YWxpZGF0ZS1vYmplY3QtZ2VuZXJhdGlvbi1pbnB1dC50c1xuZnVuY3Rpb24gdmFsaWRhdGVPYmplY3RHZW5lcmF0aW9uSW5wdXQoe1xuICBvdXRwdXQsXG4gIHNjaGVtYSxcbiAgc2NoZW1hTmFtZSxcbiAgc2NoZW1hRGVzY3JpcHRpb24sXG4gIGVudW1WYWx1ZXNcbn0pIHtcbiAgaWYgKG91dHB1dCAhPSBudWxsICYmIG91dHB1dCAhPT0gXCJvYmplY3RcIiAmJiBvdXRwdXQgIT09IFwiYXJyYXlcIiAmJiBvdXRwdXQgIT09IFwiZW51bVwiICYmIG91dHB1dCAhPT0gXCJuby1zY2hlbWFcIikge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcih7XG4gICAgICBwYXJhbWV0ZXI6IFwib3V0cHV0XCIsXG4gICAgICB2YWx1ZTogb3V0cHV0LFxuICAgICAgbWVzc2FnZTogXCJJbnZhbGlkIG91dHB1dCB0eXBlLlwiXG4gICAgfSk7XG4gIH1cbiAgaWYgKG91dHB1dCA9PT0gXCJuby1zY2hlbWFcIikge1xuICAgIGlmIChzY2hlbWEgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKHtcbiAgICAgICAgcGFyYW1ldGVyOiBcInNjaGVtYVwiLFxuICAgICAgICB2YWx1ZTogc2NoZW1hLFxuICAgICAgICBtZXNzYWdlOiBcIlNjaGVtYSBpcyBub3Qgc3VwcG9ydGVkIGZvciBuby1zY2hlbWEgb3V0cHV0LlwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNjaGVtYURlc2NyaXB0aW9uICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcih7XG4gICAgICAgIHBhcmFtZXRlcjogXCJzY2hlbWFEZXNjcmlwdGlvblwiLFxuICAgICAgICB2YWx1ZTogc2NoZW1hRGVzY3JpcHRpb24sXG4gICAgICAgIG1lc3NhZ2U6IFwiU2NoZW1hIGRlc2NyaXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vLXNjaGVtYSBvdXRwdXQuXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2NoZW1hTmFtZSAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3Ioe1xuICAgICAgICBwYXJhbWV0ZXI6IFwic2NoZW1hTmFtZVwiLFxuICAgICAgICB2YWx1ZTogc2NoZW1hTmFtZSxcbiAgICAgICAgbWVzc2FnZTogXCJTY2hlbWEgbmFtZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBuby1zY2hlbWEgb3V0cHV0LlwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGVudW1WYWx1ZXMgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKHtcbiAgICAgICAgcGFyYW1ldGVyOiBcImVudW1WYWx1ZXNcIixcbiAgICAgICAgdmFsdWU6IGVudW1WYWx1ZXMsXG4gICAgICAgIG1lc3NhZ2U6IFwiRW51bSB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIG5vLXNjaGVtYSBvdXRwdXQuXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAob3V0cHV0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKHNjaGVtYSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3Ioe1xuICAgICAgICBwYXJhbWV0ZXI6IFwic2NoZW1hXCIsXG4gICAgICAgIHZhbHVlOiBzY2hlbWEsXG4gICAgICAgIG1lc3NhZ2U6IFwiU2NoZW1hIGlzIHJlcXVpcmVkIGZvciBvYmplY3Qgb3V0cHV0LlwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGVudW1WYWx1ZXMgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKHtcbiAgICAgICAgcGFyYW1ldGVyOiBcImVudW1WYWx1ZXNcIixcbiAgICAgICAgdmFsdWU6IGVudW1WYWx1ZXMsXG4gICAgICAgIG1lc3NhZ2U6IFwiRW51bSB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIG9iamVjdCBvdXRwdXQuXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAob3V0cHV0ID09PSBcImFycmF5XCIpIHtcbiAgICBpZiAoc2NoZW1hID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcih7XG4gICAgICAgIHBhcmFtZXRlcjogXCJzY2hlbWFcIixcbiAgICAgICAgdmFsdWU6IHNjaGVtYSxcbiAgICAgICAgbWVzc2FnZTogXCJFbGVtZW50IHNjaGVtYSBpcyByZXF1aXJlZCBmb3IgYXJyYXkgb3V0cHV0LlwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGVudW1WYWx1ZXMgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKHtcbiAgICAgICAgcGFyYW1ldGVyOiBcImVudW1WYWx1ZXNcIixcbiAgICAgICAgdmFsdWU6IGVudW1WYWx1ZXMsXG4gICAgICAgIG1lc3NhZ2U6IFwiRW51bSB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGFycmF5IG91dHB1dC5cIlxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChvdXRwdXQgPT09IFwiZW51bVwiKSB7XG4gICAgaWYgKHNjaGVtYSAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3Ioe1xuICAgICAgICBwYXJhbWV0ZXI6IFwic2NoZW1hXCIsXG4gICAgICAgIHZhbHVlOiBzY2hlbWEsXG4gICAgICAgIG1lc3NhZ2U6IFwiU2NoZW1hIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGVudW0gb3V0cHV0LlwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNjaGVtYURlc2NyaXB0aW9uICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcih7XG4gICAgICAgIHBhcmFtZXRlcjogXCJzY2hlbWFEZXNjcmlwdGlvblwiLFxuICAgICAgICB2YWx1ZTogc2NoZW1hRGVzY3JpcHRpb24sXG4gICAgICAgIG1lc3NhZ2U6IFwiU2NoZW1hIGRlc2NyaXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGVudW0gb3V0cHV0LlwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNjaGVtYU5hbWUgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKHtcbiAgICAgICAgcGFyYW1ldGVyOiBcInNjaGVtYU5hbWVcIixcbiAgICAgICAgdmFsdWU6IHNjaGVtYU5hbWUsXG4gICAgICAgIG1lc3NhZ2U6IFwiU2NoZW1hIG5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3IgZW51bSBvdXRwdXQuXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZW51bVZhbHVlcyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3Ioe1xuICAgICAgICBwYXJhbWV0ZXI6IFwiZW51bVZhbHVlc1wiLFxuICAgICAgICB2YWx1ZTogZW51bVZhbHVlcyxcbiAgICAgICAgbWVzc2FnZTogXCJFbnVtIHZhbHVlcyBhcmUgcmVxdWlyZWQgZm9yIGVudW0gb3V0cHV0LlwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBlbnVtVmFsdWVzKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcih7XG4gICAgICAgICAgcGFyYW1ldGVyOiBcImVudW1WYWx1ZXNcIixcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBcIkVudW0gdmFsdWVzIG11c3QgYmUgc3RyaW5ncy5cIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gc3JjL2dlbmVyYXRlLW9iamVjdC9nZW5lcmF0ZS1vYmplY3QudHNcbnZhciBvcmlnaW5hbEdlbmVyYXRlSWQzID0gY3JlYXRlSWRHZW5lcmF0b3IzKHsgcHJlZml4OiBcImFpb2JqXCIsIHNpemU6IDI0IH0pO1xuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPYmplY3Qob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgbW9kZWw6IG1vZGVsQXJnLFxuICAgIG91dHB1dCA9IFwib2JqZWN0XCIsXG4gICAgc3lzdGVtLFxuICAgIHByb21wdCxcbiAgICBtZXNzYWdlcyxcbiAgICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzQXJnLFxuICAgIGFib3J0U2lnbmFsLFxuICAgIGhlYWRlcnMsXG4gICAgZXhwZXJpbWVudGFsX3JlcGFpclRleHQ6IHJlcGFpclRleHQsXG4gICAgZXhwZXJpbWVudGFsX3RlbGVtZXRyeTogdGVsZW1ldHJ5LFxuICAgIGV4cGVyaW1lbnRhbF9kb3dubG9hZDogZG93bmxvYWQyLFxuICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICBfaW50ZXJuYWw6IHtcbiAgICAgIGdlbmVyYXRlSWQ6IGdlbmVyYXRlSWQyID0gb3JpZ2luYWxHZW5lcmF0ZUlkMyxcbiAgICAgIGN1cnJlbnREYXRlID0gKCkgPT4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKClcbiAgICB9ID0ge30sXG4gICAgLi4uc2V0dGluZ3NcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IG1vZGVsID0gcmVzb2x2ZUxhbmd1YWdlTW9kZWwobW9kZWxBcmcpO1xuICBjb25zdCBlbnVtVmFsdWVzID0gXCJlbnVtXCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMuZW51bSA6IHZvaWQgMDtcbiAgY29uc3Qge1xuICAgIHNjaGVtYTogaW5wdXRTY2hlbWEsXG4gICAgc2NoZW1hRGVzY3JpcHRpb24sXG4gICAgc2NoZW1hTmFtZVxuICB9ID0gXCJzY2hlbWFcIiBpbiBvcHRpb25zID8gb3B0aW9ucyA6IHt9O1xuICB2YWxpZGF0ZU9iamVjdEdlbmVyYXRpb25JbnB1dCh7XG4gICAgb3V0cHV0LFxuICAgIHNjaGVtYTogaW5wdXRTY2hlbWEsXG4gICAgc2NoZW1hTmFtZSxcbiAgICBzY2hlbWFEZXNjcmlwdGlvbixcbiAgICBlbnVtVmFsdWVzXG4gIH0pO1xuICBjb25zdCB7IG1heFJldHJpZXMsIHJldHJ5IH0gPSBwcmVwYXJlUmV0cmllcyh7XG4gICAgbWF4UmV0cmllczogbWF4UmV0cmllc0FyZyxcbiAgICBhYm9ydFNpZ25hbFxuICB9KTtcbiAgY29uc3Qgb3V0cHV0U3RyYXRlZ3kgPSBnZXRPdXRwdXRTdHJhdGVneSh7XG4gICAgb3V0cHV0LFxuICAgIHNjaGVtYTogaW5wdXRTY2hlbWEsXG4gICAgZW51bVZhbHVlc1xuICB9KTtcbiAgY29uc3QgY2FsbFNldHRpbmdzID0gcHJlcGFyZUNhbGxTZXR0aW5ncyhzZXR0aW5ncyk7XG4gIGNvbnN0IGhlYWRlcnNXaXRoVXNlckFnZW50ID0gd2l0aFVzZXJBZ2VudFN1ZmZpeDYoXG4gICAgaGVhZGVycyAhPSBudWxsID8gaGVhZGVycyA6IHt9LFxuICAgIGBhaS8ke1ZFUlNJT059YFxuICApO1xuICBjb25zdCBiYXNlVGVsZW1ldHJ5QXR0cmlidXRlcyA9IGdldEJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICBtb2RlbCxcbiAgICB0ZWxlbWV0cnksXG4gICAgaGVhZGVyczogaGVhZGVyc1dpdGhVc2VyQWdlbnQsXG4gICAgc2V0dGluZ3M6IHsgLi4uY2FsbFNldHRpbmdzLCBtYXhSZXRyaWVzIH1cbiAgfSk7XG4gIGNvbnN0IHRyYWNlciA9IGdldFRyYWNlcih0ZWxlbWV0cnkpO1xuICBjb25zdCBqc29uU2NoZW1hMiA9IGF3YWl0IG91dHB1dFN0cmF0ZWd5Lmpzb25TY2hlbWEoKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVjb3JkU3Bhbih7XG4gICAgICBuYW1lOiBcImFpLmdlbmVyYXRlT2JqZWN0XCIsXG4gICAgICBhdHRyaWJ1dGVzOiBzZWxlY3RUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICAgICAgdGVsZW1ldHJ5LFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgLi4uYXNzZW1ibGVPcGVyYXRpb25OYW1lKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbklkOiBcImFpLmdlbmVyYXRlT2JqZWN0XCIsXG4gICAgICAgICAgICB0ZWxlbWV0cnlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5iYXNlVGVsZW1ldHJ5QXR0cmlidXRlcyxcbiAgICAgICAgICAvLyBzcGVjaWZpYyBzZXR0aW5ncyB0aGF0IG9ubHkgbWFrZSBzZW5zZSBvbiB0aGUgb3V0ZXIgbGV2ZWw6XG4gICAgICAgICAgXCJhaS5wcm9tcHRcIjoge1xuICAgICAgICAgICAgaW5wdXQ6ICgpID0+IEpTT04uc3RyaW5naWZ5KHsgc3lzdGVtLCBwcm9tcHQsIG1lc3NhZ2VzIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImFpLnNjaGVtYVwiOiBqc29uU2NoZW1hMiAhPSBudWxsID8geyBpbnB1dDogKCkgPT4gSlNPTi5zdHJpbmdpZnkoanNvblNjaGVtYTIpIH0gOiB2b2lkIDAsXG4gICAgICAgICAgXCJhaS5zY2hlbWEubmFtZVwiOiBzY2hlbWFOYW1lLFxuICAgICAgICAgIFwiYWkuc2NoZW1hLmRlc2NyaXB0aW9uXCI6IHNjaGVtYURlc2NyaXB0aW9uLFxuICAgICAgICAgIFwiYWkuc2V0dGluZ3Mub3V0cHV0XCI6IG91dHB1dFN0cmF0ZWd5LnR5cGVcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0cmFjZXIsXG4gICAgICBmbjogYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgdmFyIF9hMjE7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBmaW5pc2hSZWFzb247XG4gICAgICAgIGxldCB1c2FnZTtcbiAgICAgICAgbGV0IHdhcm5pbmdzO1xuICAgICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICAgIGxldCByZXF1ZXN0O1xuICAgICAgICBsZXQgcmVzdWx0UHJvdmlkZXJNZXRhZGF0YTtcbiAgICAgICAgbGV0IHJlYXNvbmluZztcbiAgICAgICAgY29uc3Qgc3RhbmRhcmRpemVkUHJvbXB0ID0gYXdhaXQgc3RhbmRhcmRpemVQcm9tcHQoe1xuICAgICAgICAgIHN5c3RlbSxcbiAgICAgICAgICBwcm9tcHQsXG4gICAgICAgICAgbWVzc2FnZXNcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb21wdE1lc3NhZ2VzID0gYXdhaXQgY29udmVydFRvTGFuZ3VhZ2VNb2RlbFByb21wdCh7XG4gICAgICAgICAgcHJvbXB0OiBzdGFuZGFyZGl6ZWRQcm9tcHQsXG4gICAgICAgICAgc3VwcG9ydGVkVXJsczogYXdhaXQgbW9kZWwuc3VwcG9ydGVkVXJscyxcbiAgICAgICAgICBkb3dubG9hZDogZG93bmxvYWQyXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBnZW5lcmF0ZVJlc3VsdCA9IGF3YWl0IHJldHJ5KFxuICAgICAgICAgICgpID0+IHJlY29yZFNwYW4oe1xuICAgICAgICAgICAgbmFtZTogXCJhaS5nZW5lcmF0ZU9iamVjdC5kb0dlbmVyYXRlXCIsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBzZWxlY3RUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgdGVsZW1ldHJ5LFxuICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgLi4uYXNzZW1ibGVPcGVyYXRpb25OYW1lKHtcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbklkOiBcImFpLmdlbmVyYXRlT2JqZWN0LmRvR2VuZXJhdGVcIixcbiAgICAgICAgICAgICAgICAgIHRlbGVtZXRyeVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC4uLmJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIFwiYWkucHJvbXB0Lm1lc3NhZ2VzXCI6IHtcbiAgICAgICAgICAgICAgICAgIGlucHV0OiAoKSA9PiBzdHJpbmdpZnlGb3JUZWxlbWV0cnkocHJvbXB0TWVzc2FnZXMpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBzdGFuZGFyZGl6ZWQgZ2VuLWFpIGxsbSBzcGFuIGF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgXCJnZW5fYWkuc3lzdGVtXCI6IG1vZGVsLnByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlcXVlc3QubW9kZWxcIjogbW9kZWwubW9kZWxJZCxcbiAgICAgICAgICAgICAgICBcImdlbl9haS5yZXF1ZXN0LmZyZXF1ZW5jeV9wZW5hbHR5XCI6IGNhbGxTZXR0aW5ncy5mcmVxdWVuY3lQZW5hbHR5LFxuICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlcXVlc3QubWF4X3Rva2Vuc1wiOiBjYWxsU2V0dGluZ3MubWF4T3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlcXVlc3QucHJlc2VuY2VfcGVuYWx0eVwiOiBjYWxsU2V0dGluZ3MucHJlc2VuY2VQZW5hbHR5LFxuICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlcXVlc3QudGVtcGVyYXR1cmVcIjogY2FsbFNldHRpbmdzLnRlbXBlcmF0dXJlLFxuICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlcXVlc3QudG9wX2tcIjogY2FsbFNldHRpbmdzLnRvcEssXG4gICAgICAgICAgICAgICAgXCJnZW5fYWkucmVxdWVzdC50b3BfcFwiOiBjYWxsU2V0dGluZ3MudG9wUFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRyYWNlcixcbiAgICAgICAgICAgIGZuOiBhc3luYyAoc3BhbjIpID0+IHtcbiAgICAgICAgICAgICAgdmFyIF9hMjIsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oO1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQyID0gYXdhaXQgbW9kZWwuZG9HZW5lcmF0ZSh7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VGb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwianNvblwiLFxuICAgICAgICAgICAgICAgICAgc2NoZW1hOiBqc29uU2NoZW1hMixcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogc2NoZW1hRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLnByZXBhcmVDYWxsU2V0dGluZ3Moc2V0dGluZ3MpLFxuICAgICAgICAgICAgICAgIHByb21wdDogcHJvbXB0TWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnNXaXRoVXNlckFnZW50XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IChfYiA9IChfYTIyID0gcmVzdWx0Mi5yZXNwb25zZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjIuaWQpICE9IG51bGwgPyBfYiA6IGdlbmVyYXRlSWQyKCksXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiAoX2QgPSAoX2MgPSByZXN1bHQyLnJlc3BvbnNlKSA9PSBudWxsID8gdm9pZCAwIDogX2MudGltZXN0YW1wKSAhPSBudWxsID8gX2QgOiBjdXJyZW50RGF0ZSgpLFxuICAgICAgICAgICAgICAgIG1vZGVsSWQ6IChfZiA9IChfZSA9IHJlc3VsdDIucmVzcG9uc2UpID09IG51bGwgPyB2b2lkIDAgOiBfZS5tb2RlbElkKSAhPSBudWxsID8gX2YgOiBtb2RlbC5tb2RlbElkLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IChfZyA9IHJlc3VsdDIucmVzcG9uc2UpID09IG51bGwgPyB2b2lkIDAgOiBfZy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IChfaCA9IHJlc3VsdDIucmVzcG9uc2UpID09IG51bGwgPyB2b2lkIDAgOiBfaC5ib2R5XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGNvbnN0IHRleHQyID0gZXh0cmFjdFRleHRDb250ZW50KHJlc3VsdDIuY29udGVudCk7XG4gICAgICAgICAgICAgIGNvbnN0IHJlYXNvbmluZzIgPSBleHRyYWN0UmVhc29uaW5nQ29udGVudChyZXN1bHQyLmNvbnRlbnQpO1xuICAgICAgICAgICAgICBpZiAodGV4dDIgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb09iamVjdEdlbmVyYXRlZEVycm9yKHtcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiTm8gb2JqZWN0IGdlbmVyYXRlZDogdGhlIG1vZGVsIGRpZCBub3QgcmV0dXJuIGEgcmVzcG9uc2UuXCIsXG4gICAgICAgICAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2VEYXRhLFxuICAgICAgICAgICAgICAgICAgdXNhZ2U6IGFzTGFuZ3VhZ2VNb2RlbFVzYWdlKHJlc3VsdDIudXNhZ2UpLFxuICAgICAgICAgICAgICAgICAgZmluaXNoUmVhc29uOiByZXN1bHQyLmZpbmlzaFJlYXNvbi51bmlmaWVkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3BhbjIuc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICAgICAgICBhd2FpdCBzZWxlY3RUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS5maW5pc2hSZWFzb25cIjogcmVzdWx0Mi5maW5pc2hSZWFzb24udW5pZmllZCxcbiAgICAgICAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS5vYmplY3RcIjogeyBvdXRwdXQ6ICgpID0+IHRleHQyIH0sXG4gICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UuaWRcIjogcmVzcG9uc2VEYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLm1vZGVsXCI6IHJlc3BvbnNlRGF0YS5tb2RlbElkLFxuICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLnRpbWVzdGFtcFwiOiByZXNwb25zZURhdGEudGltZXN0YW1wLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UucHJvdmlkZXJNZXRhZGF0YVwiOiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQyLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyByZW5hbWUgdGVsZW1ldHJ5IGF0dHJpYnV0ZXMgdG8gaW5wdXRUb2tlbnMgYW5kIG91dHB1dFRva2Vuc1xuICAgICAgICAgICAgICAgICAgICBcImFpLnVzYWdlLnByb21wdFRva2Vuc1wiOiByZXN1bHQyLnVzYWdlLmlucHV0VG9rZW5zLnRvdGFsLFxuICAgICAgICAgICAgICAgICAgICBcImFpLnVzYWdlLmNvbXBsZXRpb25Ub2tlbnNcIjogcmVzdWx0Mi51c2FnZS5vdXRwdXRUb2tlbnMudG90YWwsXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0YW5kYXJkaXplZCBnZW4tYWkgbGxtIHNwYW4gYXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICAgICAgXCJnZW5fYWkucmVzcG9uc2UuZmluaXNoX3JlYXNvbnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDIuZmluaXNoUmVhc29uLnVuaWZpZWRcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJnZW5fYWkucmVzcG9uc2UuaWRcIjogcmVzcG9uc2VEYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXNwb25zZS5tb2RlbFwiOiByZXNwb25zZURhdGEubW9kZWxJZCxcbiAgICAgICAgICAgICAgICAgICAgXCJnZW5fYWkudXNhZ2UuaW5wdXRfdG9rZW5zXCI6IHJlc3VsdDIudXNhZ2UuaW5wdXRUb2tlbnMudG90YWwsXG4gICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnVzYWdlLm91dHB1dF90b2tlbnNcIjogcmVzdWx0Mi51c2FnZS5vdXRwdXRUb2tlbnMudG90YWxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnJlc3VsdDIsXG4gICAgICAgICAgICAgICAgb2JqZWN0VGV4dDogdGV4dDIsXG4gICAgICAgICAgICAgICAgcmVhc29uaW5nOiByZWFzb25pbmcyLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJlc3VsdCA9IGdlbmVyYXRlUmVzdWx0Lm9iamVjdFRleHQ7XG4gICAgICAgIGZpbmlzaFJlYXNvbiA9IGdlbmVyYXRlUmVzdWx0LmZpbmlzaFJlYXNvbi51bmlmaWVkO1xuICAgICAgICB1c2FnZSA9IGFzTGFuZ3VhZ2VNb2RlbFVzYWdlKGdlbmVyYXRlUmVzdWx0LnVzYWdlKTtcbiAgICAgICAgd2FybmluZ3MgPSBnZW5lcmF0ZVJlc3VsdC53YXJuaW5ncztcbiAgICAgICAgcmVzdWx0UHJvdmlkZXJNZXRhZGF0YSA9IGdlbmVyYXRlUmVzdWx0LnByb3ZpZGVyTWV0YWRhdGE7XG4gICAgICAgIHJlcXVlc3QgPSAoX2EyMSA9IGdlbmVyYXRlUmVzdWx0LnJlcXVlc3QpICE9IG51bGwgPyBfYTIxIDoge307XG4gICAgICAgIHJlc3BvbnNlID0gZ2VuZXJhdGVSZXN1bHQucmVzcG9uc2VEYXRhO1xuICAgICAgICByZWFzb25pbmcgPSBnZW5lcmF0ZVJlc3VsdC5yZWFzb25pbmc7XG4gICAgICAgIGxvZ1dhcm5pbmdzKHtcbiAgICAgICAgICB3YXJuaW5ncyxcbiAgICAgICAgICBwcm92aWRlcjogbW9kZWwucHJvdmlkZXIsXG4gICAgICAgICAgbW9kZWw6IG1vZGVsLm1vZGVsSWRcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9iamVjdDIgPSBhd2FpdCBwYXJzZUFuZFZhbGlkYXRlT2JqZWN0UmVzdWx0V2l0aFJlcGFpcihcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgb3V0cHV0U3RyYXRlZ3ksXG4gICAgICAgICAgcmVwYWlyVGV4dCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIHVzYWdlLFxuICAgICAgICAgICAgZmluaXNoUmVhc29uXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgYXdhaXQgc2VsZWN0VGVsZW1ldHJ5QXR0cmlidXRlcyh7XG4gICAgICAgICAgICB0ZWxlbWV0cnksXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UuZmluaXNoUmVhc29uXCI6IGZpbmlzaFJlYXNvbixcbiAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS5vYmplY3RcIjoge1xuICAgICAgICAgICAgICAgIG91dHB1dDogKCkgPT4gSlNPTi5zdHJpbmdpZnkob2JqZWN0MilcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJhaS5yZXNwb25zZS5wcm92aWRlck1ldGFkYXRhXCI6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIHJlc3VsdFByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgLy8gVE9ETyByZW5hbWUgdGVsZW1ldHJ5IGF0dHJpYnV0ZXMgdG8gaW5wdXRUb2tlbnMgYW5kIG91dHB1dFRva2Vuc1xuICAgICAgICAgICAgICBcImFpLnVzYWdlLnByb21wdFRva2Vuc1wiOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgXCJhaS51c2FnZS5jb21wbGV0aW9uVG9rZW5zXCI6IHVzYWdlLm91dHB1dFRva2Vuc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEdlbmVyYXRlT2JqZWN0UmVzdWx0KHtcbiAgICAgICAgICBvYmplY3Q6IG9iamVjdDIsXG4gICAgICAgICAgcmVhc29uaW5nLFxuICAgICAgICAgIGZpbmlzaFJlYXNvbixcbiAgICAgICAgICB1c2FnZSxcbiAgICAgICAgICB3YXJuaW5ncyxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHJlc3VsdFByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgd3JhcEdhdGV3YXlFcnJvcihlcnJvcik7XG4gIH1cbn1cbnZhciBEZWZhdWx0R2VuZXJhdGVPYmplY3RSZXN1bHQgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLm9iamVjdCA9IG9wdGlvbnMub2JqZWN0O1xuICAgIHRoaXMuZmluaXNoUmVhc29uID0gb3B0aW9ucy5maW5pc2hSZWFzb247XG4gICAgdGhpcy51c2FnZSA9IG9wdGlvbnMudXNhZ2U7XG4gICAgdGhpcy53YXJuaW5ncyA9IG9wdGlvbnMud2FybmluZ3M7XG4gICAgdGhpcy5wcm92aWRlck1ldGFkYXRhID0gb3B0aW9ucy5wcm92aWRlck1ldGFkYXRhO1xuICAgIHRoaXMucmVzcG9uc2UgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgIHRoaXMucmVxdWVzdCA9IG9wdGlvbnMucmVxdWVzdDtcbiAgICB0aGlzLnJlYXNvbmluZyA9IG9wdGlvbnMucmVhc29uaW5nO1xuICB9XG4gIHRvSnNvblJlc3BvbnNlKGluaXQpIHtcbiAgICB2YXIgX2EyMTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKEpTT04uc3RyaW5naWZ5KHRoaXMub2JqZWN0KSwge1xuICAgICAgc3RhdHVzOiAoX2EyMSA9IGluaXQgPT0gbnVsbCA/IHZvaWQgMCA6IGluaXQuc3RhdHVzKSAhPSBudWxsID8gX2EyMSA6IDIwMCxcbiAgICAgIGhlYWRlcnM6IHByZXBhcmVIZWFkZXJzKGluaXQgPT0gbnVsbCA/IHZvaWQgMCA6IGluaXQuaGVhZGVycywge1xuICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIlxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxufTtcblxuLy8gc3JjL2dlbmVyYXRlLW9iamVjdC9zdHJlYW0tb2JqZWN0LnRzXG5pbXBvcnQge1xuICBjcmVhdGVJZEdlbmVyYXRvciBhcyBjcmVhdGVJZEdlbmVyYXRvcjQsXG4gIERlbGF5ZWRQcm9taXNlIGFzIERlbGF5ZWRQcm9taXNlMlxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvdXRpbC9jb3NpbmUtc2ltaWxhcml0eS50c1xuZnVuY3Rpb24gY29zaW5lU2ltaWxhcml0eSh2ZWN0b3IxLCB2ZWN0b3IyKSB7XG4gIGlmICh2ZWN0b3IxLmxlbmd0aCAhPT0gdmVjdG9yMi5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3Ioe1xuICAgICAgcGFyYW1ldGVyOiBcInZlY3RvcjEsdmVjdG9yMlwiLFxuICAgICAgdmFsdWU6IHsgdmVjdG9yMUxlbmd0aDogdmVjdG9yMS5sZW5ndGgsIHZlY3RvcjJMZW5ndGg6IHZlY3RvcjIubGVuZ3RoIH0sXG4gICAgICBtZXNzYWdlOiBgVmVjdG9ycyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoYFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IG4gPSB2ZWN0b3IxLmxlbmd0aDtcbiAgaWYgKG4gPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBsZXQgbWFnbml0dWRlU3F1YXJlZDEgPSAwO1xuICBsZXQgbWFnbml0dWRlU3F1YXJlZDIgPSAwO1xuICBsZXQgZG90UHJvZHVjdCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgY29uc3QgdmFsdWUxID0gdmVjdG9yMVtpXTtcbiAgICBjb25zdCB2YWx1ZTIgPSB2ZWN0b3IyW2ldO1xuICAgIG1hZ25pdHVkZVNxdWFyZWQxICs9IHZhbHVlMSAqIHZhbHVlMTtcbiAgICBtYWduaXR1ZGVTcXVhcmVkMiArPSB2YWx1ZTIgKiB2YWx1ZTI7XG4gICAgZG90UHJvZHVjdCArPSB2YWx1ZTEgKiB2YWx1ZTI7XG4gIH1cbiAgcmV0dXJuIG1hZ25pdHVkZVNxdWFyZWQxID09PSAwIHx8IG1hZ25pdHVkZVNxdWFyZWQyID09PSAwID8gMCA6IGRvdFByb2R1Y3QgLyAoTWF0aC5zcXJ0KG1hZ25pdHVkZVNxdWFyZWQxKSAqIE1hdGguc3FydChtYWduaXR1ZGVTcXVhcmVkMikpO1xufVxuXG4vLyBzcmMvdXRpbC9kb3dubG9hZC9jcmVhdGUtZG93bmxvYWQudHNcbmZ1bmN0aW9uIGNyZWF0ZURvd25sb2FkKG9wdGlvbnMpIHtcbiAgcmV0dXJuICh7IHVybCwgYWJvcnRTaWduYWwgfSkgPT4gZG93bmxvYWQoeyB1cmwsIG1heEJ5dGVzOiBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLm1heEJ5dGVzLCBhYm9ydFNpZ25hbCB9KTtcbn1cblxuLy8gc3JjL3V0aWwvZGF0YS11cmwudHNcbmZ1bmN0aW9uIGdldFRleHRGcm9tRGF0YVVybChkYXRhVXJsKSB7XG4gIGNvbnN0IFtoZWFkZXIsIGJhc2U2NENvbnRlbnRdID0gZGF0YVVybC5zcGxpdChcIixcIik7XG4gIGNvbnN0IG1lZGlhVHlwZSA9IGhlYWRlci5zcGxpdChcIjtcIilbMF0uc3BsaXQoXCI6XCIpWzFdO1xuICBpZiAobWVkaWFUeXBlID09IG51bGwgfHwgYmFzZTY0Q29udGVudCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkYXRhIFVSTCBmb3JtYXRcIik7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gd2luZG93LmF0b2IoYmFzZTY0Q29udGVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNvZGluZyBkYXRhIFVSTGApO1xuICB9XG59XG5cbi8vIHNyYy91dGlsL2lzLWRlZXAtZXF1YWwtZGF0YS50c1xuZnVuY3Rpb24gaXNEZWVwRXF1YWxEYXRhKG9iajEsIG9iajIpIHtcbiAgaWYgKG9iajEgPT09IG9iajIpXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmIChvYmoxID09IG51bGwgfHwgb2JqMiA9PSBudWxsKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBvYmoxICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmoyICE9PSBcIm9iamVjdFwiKVxuICAgIHJldHVybiBvYmoxID09PSBvYmoyO1xuICBpZiAob2JqMS5jb25zdHJ1Y3RvciAhPT0gb2JqMi5jb25zdHJ1Y3RvcilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChvYmoxIGluc3RhbmNlb2YgRGF0ZSAmJiBvYmoyIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBvYmoxLmdldFRpbWUoKSA9PT0gb2JqMi5nZXRUaW1lKCk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqMSkpIHtcbiAgICBpZiAob2JqMS5sZW5ndGggIT09IG9iajIubGVuZ3RoKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqMS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFpc0RlZXBFcXVhbERhdGEob2JqMVtpXSwgb2JqMltpXSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3Qga2V5czEgPSBPYmplY3Qua2V5cyhvYmoxKTtcbiAgY29uc3Qga2V5czIgPSBPYmplY3Qua2V5cyhvYmoyKTtcbiAgaWYgKGtleXMxLmxlbmd0aCAhPT0ga2V5czIubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5czEpIHtcbiAgICBpZiAoIWtleXMyLmluY2x1ZGVzKGtleSkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFpc0RlZXBFcXVhbERhdGEob2JqMVtrZXldLCBvYmoyW2tleV0pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBzcmMvdXRpbC9zZXJpYWwtam9iLWV4ZWN1dG9yLnRzXG52YXIgU2VyaWFsSm9iRXhlY3V0b3IgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuICB9XG4gIGFzeW5jIHByb2Nlc3NRdWV1ZSgpIHtcbiAgICBpZiAodGhpcy5pc1Byb2Nlc3NpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSB0cnVlO1xuICAgIHdoaWxlICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMucXVldWVbMF0oKTtcbiAgICAgIHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICB9XG4gICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgfVxuICBhc3luYyBydW4oam9iKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMywgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGpvYigpO1xuICAgICAgICAgIHJlc29sdmUzKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB2b2lkIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8vIHNyYy91dGlsL3NpbXVsYXRlLXJlYWRhYmxlLXN0cmVhbS50c1xuaW1wb3J0IHsgZGVsYXkgYXMgZGVsYXlGdW5jdGlvbiB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5mdW5jdGlvbiBzaW11bGF0ZVJlYWRhYmxlU3RyZWFtKHtcbiAgY2h1bmtzLFxuICBpbml0aWFsRGVsYXlJbk1zID0gMCxcbiAgY2h1bmtEZWxheUluTXMgPSAwLFxuICBfaW50ZXJuYWxcbn0pIHtcbiAgdmFyIF9hMjE7XG4gIGNvbnN0IGRlbGF5MiA9IChfYTIxID0gX2ludGVybmFsID09IG51bGwgPyB2b2lkIDAgOiBfaW50ZXJuYWwuZGVsYXkpICE9IG51bGwgPyBfYTIxIDogZGVsYXlGdW5jdGlvbjtcbiAgbGV0IGluZGV4ID0gMDtcbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgYXN5bmMgcHVsbChjb250cm9sbGVyKSB7XG4gICAgICBpZiAoaW5kZXggPCBjaHVua3MubGVuZ3RoKSB7XG4gICAgICAgIGF3YWl0IGRlbGF5MihpbmRleCA9PT0gMCA/IGluaXRpYWxEZWxheUluTXMgOiBjaHVua0RlbGF5SW5Ncyk7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVua3NbaW5kZXgrK10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIHNyYy9nZW5lcmF0ZS1vYmplY3Qvc3RyZWFtLW9iamVjdC50c1xudmFyIG9yaWdpbmFsR2VuZXJhdGVJZDQgPSBjcmVhdGVJZEdlbmVyYXRvcjQoeyBwcmVmaXg6IFwiYWlvYmpcIiwgc2l6ZTogMjQgfSk7XG5mdW5jdGlvbiBzdHJlYW1PYmplY3Qob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgbW9kZWwsXG4gICAgb3V0cHV0ID0gXCJvYmplY3RcIixcbiAgICBzeXN0ZW0sXG4gICAgcHJvbXB0LFxuICAgIG1lc3NhZ2VzLFxuICAgIG1heFJldHJpZXMsXG4gICAgYWJvcnRTaWduYWwsXG4gICAgaGVhZGVycyxcbiAgICBleHBlcmltZW50YWxfcmVwYWlyVGV4dDogcmVwYWlyVGV4dCxcbiAgICBleHBlcmltZW50YWxfdGVsZW1ldHJ5OiB0ZWxlbWV0cnksXG4gICAgZXhwZXJpbWVudGFsX2Rvd25sb2FkOiBkb3dubG9hZDIsXG4gICAgcHJvdmlkZXJPcHRpb25zLFxuICAgIG9uRXJyb3IgPSAoeyBlcnJvciB9KSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9LFxuICAgIG9uRmluaXNoLFxuICAgIF9pbnRlcm5hbDoge1xuICAgICAgZ2VuZXJhdGVJZDogZ2VuZXJhdGVJZDIgPSBvcmlnaW5hbEdlbmVyYXRlSWQ0LFxuICAgICAgY3VycmVudERhdGUgPSAoKSA9PiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSxcbiAgICAgIG5vdzogbm93MiA9IG5vd1xuICAgIH0gPSB7fSxcbiAgICAuLi5zZXR0aW5nc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW51bVZhbHVlcyA9IFwiZW51bVwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtID8gb3B0aW9ucy5lbnVtIDogdm9pZCAwO1xuICBjb25zdCB7XG4gICAgc2NoZW1hOiBpbnB1dFNjaGVtYSxcbiAgICBzY2hlbWFEZXNjcmlwdGlvbixcbiAgICBzY2hlbWFOYW1lXG4gIH0gPSBcInNjaGVtYVwiIGluIG9wdGlvbnMgPyBvcHRpb25zIDoge307XG4gIHZhbGlkYXRlT2JqZWN0R2VuZXJhdGlvbklucHV0KHtcbiAgICBvdXRwdXQsXG4gICAgc2NoZW1hOiBpbnB1dFNjaGVtYSxcbiAgICBzY2hlbWFOYW1lLFxuICAgIHNjaGVtYURlc2NyaXB0aW9uLFxuICAgIGVudW1WYWx1ZXNcbiAgfSk7XG4gIGNvbnN0IG91dHB1dFN0cmF0ZWd5ID0gZ2V0T3V0cHV0U3RyYXRlZ3koe1xuICAgIG91dHB1dCxcbiAgICBzY2hlbWE6IGlucHV0U2NoZW1hLFxuICAgIGVudW1WYWx1ZXNcbiAgfSk7XG4gIHJldHVybiBuZXcgRGVmYXVsdFN0cmVhbU9iamVjdFJlc3VsdCh7XG4gICAgbW9kZWwsXG4gICAgdGVsZW1ldHJ5LFxuICAgIGhlYWRlcnMsXG4gICAgc2V0dGluZ3MsXG4gICAgbWF4UmV0cmllcyxcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBvdXRwdXRTdHJhdGVneSxcbiAgICBzeXN0ZW0sXG4gICAgcHJvbXB0LFxuICAgIG1lc3NhZ2VzLFxuICAgIHNjaGVtYU5hbWUsXG4gICAgc2NoZW1hRGVzY3JpcHRpb24sXG4gICAgcHJvdmlkZXJPcHRpb25zLFxuICAgIHJlcGFpclRleHQsXG4gICAgb25FcnJvcixcbiAgICBvbkZpbmlzaCxcbiAgICBkb3dubG9hZDogZG93bmxvYWQyLFxuICAgIGdlbmVyYXRlSWQ6IGdlbmVyYXRlSWQyLFxuICAgIGN1cnJlbnREYXRlLFxuICAgIG5vdzogbm93MlxuICB9KTtcbn1cbnZhciBEZWZhdWx0U3RyZWFtT2JqZWN0UmVzdWx0ID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgbW9kZWw6IG1vZGVsQXJnLFxuICAgIGhlYWRlcnMsXG4gICAgdGVsZW1ldHJ5LFxuICAgIHNldHRpbmdzLFxuICAgIG1heFJldHJpZXM6IG1heFJldHJpZXNBcmcsXG4gICAgYWJvcnRTaWduYWwsXG4gICAgb3V0cHV0U3RyYXRlZ3ksXG4gICAgc3lzdGVtLFxuICAgIHByb21wdCxcbiAgICBtZXNzYWdlcyxcbiAgICBzY2hlbWFOYW1lLFxuICAgIHNjaGVtYURlc2NyaXB0aW9uLFxuICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICByZXBhaXJUZXh0LFxuICAgIG9uRXJyb3IsXG4gICAgb25GaW5pc2gsXG4gICAgZG93bmxvYWQ6IGRvd25sb2FkMixcbiAgICBnZW5lcmF0ZUlkOiBnZW5lcmF0ZUlkMixcbiAgICBjdXJyZW50RGF0ZSxcbiAgICBub3c6IG5vdzJcbiAgfSkge1xuICAgIHRoaXMuX29iamVjdCA9IG5ldyBEZWxheWVkUHJvbWlzZTIoKTtcbiAgICB0aGlzLl91c2FnZSA9IG5ldyBEZWxheWVkUHJvbWlzZTIoKTtcbiAgICB0aGlzLl9wcm92aWRlck1ldGFkYXRhID0gbmV3IERlbGF5ZWRQcm9taXNlMigpO1xuICAgIHRoaXMuX3dhcm5pbmdzID0gbmV3IERlbGF5ZWRQcm9taXNlMigpO1xuICAgIHRoaXMuX3JlcXVlc3QgPSBuZXcgRGVsYXllZFByb21pc2UyKCk7XG4gICAgdGhpcy5fcmVzcG9uc2UgPSBuZXcgRGVsYXllZFByb21pc2UyKCk7XG4gICAgdGhpcy5fZmluaXNoUmVhc29uID0gbmV3IERlbGF5ZWRQcm9taXNlMigpO1xuICAgIGNvbnN0IG1vZGVsID0gcmVzb2x2ZUxhbmd1YWdlTW9kZWwobW9kZWxBcmcpO1xuICAgIGNvbnN0IHsgbWF4UmV0cmllcywgcmV0cnkgfSA9IHByZXBhcmVSZXRyaWVzKHtcbiAgICAgIG1heFJldHJpZXM6IG1heFJldHJpZXNBcmcsXG4gICAgICBhYm9ydFNpZ25hbFxuICAgIH0pO1xuICAgIGNvbnN0IGNhbGxTZXR0aW5ncyA9IHByZXBhcmVDYWxsU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgIGNvbnN0IGJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzID0gZ2V0QmFzZVRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgbW9kZWwsXG4gICAgICB0ZWxlbWV0cnksXG4gICAgICBoZWFkZXJzLFxuICAgICAgc2V0dGluZ3M6IHsgLi4uY2FsbFNldHRpbmdzLCBtYXhSZXRyaWVzIH1cbiAgICB9KTtcbiAgICBjb25zdCB0cmFjZXIgPSBnZXRUcmFjZXIodGVsZW1ldHJ5KTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBzdGl0Y2hhYmxlU3RyZWFtID0gY3JlYXRlU3RpdGNoYWJsZVN0cmVhbSgpO1xuICAgIGNvbnN0IGV2ZW50UHJvY2Vzc29yID0gbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgaWYgKGNodW5rLnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgIG9uRXJyb3IoeyBlcnJvcjogd3JhcEdhdGV3YXlFcnJvcihjaHVuay5lcnJvcikgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmJhc2VTdHJlYW0gPSBzdGl0Y2hhYmxlU3RyZWFtLnN0cmVhbS5waXBlVGhyb3VnaChldmVudFByb2Nlc3Nvcik7XG4gICAgcmVjb3JkU3Bhbih7XG4gICAgICBuYW1lOiBcImFpLnN0cmVhbU9iamVjdFwiLFxuICAgICAgYXR0cmlidXRlczogc2VsZWN0VGVsZW1ldHJ5QXR0cmlidXRlcyh7XG4gICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIC4uLmFzc2VtYmxlT3BlcmF0aW9uTmFtZSh7XG4gICAgICAgICAgICBvcGVyYXRpb25JZDogXCJhaS5zdHJlYW1PYmplY3RcIixcbiAgICAgICAgICAgIHRlbGVtZXRyeVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIC4uLmJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzLFxuICAgICAgICAgIC8vIHNwZWNpZmljIHNldHRpbmdzIHRoYXQgb25seSBtYWtlIHNlbnNlIG9uIHRoZSBvdXRlciBsZXZlbDpcbiAgICAgICAgICBcImFpLnByb21wdFwiOiB7XG4gICAgICAgICAgICBpbnB1dDogKCkgPT4gSlNPTi5zdHJpbmdpZnkoeyBzeXN0ZW0sIHByb21wdCwgbWVzc2FnZXMgfSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiYWkuc2NoZW1hXCI6IHtcbiAgICAgICAgICAgIGlucHV0OiBhc3luYyAoKSA9PiBKU09OLnN0cmluZ2lmeShhd2FpdCBvdXRwdXRTdHJhdGVneS5qc29uU2NoZW1hKCkpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImFpLnNjaGVtYS5uYW1lXCI6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgXCJhaS5zY2hlbWEuZGVzY3JpcHRpb25cIjogc2NoZW1hRGVzY3JpcHRpb24sXG4gICAgICAgICAgXCJhaS5zZXR0aW5ncy5vdXRwdXRcIjogb3V0cHV0U3RyYXRlZ3kudHlwZVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRyYWNlcixcbiAgICAgIGVuZFdoZW5Eb25lOiBmYWxzZSxcbiAgICAgIGZuOiBhc3luYyAocm9vdFNwYW4pID0+IHtcbiAgICAgICAgY29uc3Qgc3RhbmRhcmRpemVkUHJvbXB0ID0gYXdhaXQgc3RhbmRhcmRpemVQcm9tcHQoe1xuICAgICAgICAgIHN5c3RlbSxcbiAgICAgICAgICBwcm9tcHQsXG4gICAgICAgICAgbWVzc2FnZXNcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNhbGxPcHRpb25zID0ge1xuICAgICAgICAgIHJlc3BvbnNlRm9ybWF0OiB7XG4gICAgICAgICAgICB0eXBlOiBcImpzb25cIixcbiAgICAgICAgICAgIHNjaGVtYTogYXdhaXQgb3V0cHV0U3RyYXRlZ3kuanNvblNjaGVtYSgpLFxuICAgICAgICAgICAgbmFtZTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzY2hlbWFEZXNjcmlwdGlvblxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4ucHJlcGFyZUNhbGxTZXR0aW5ncyhzZXR0aW5ncyksXG4gICAgICAgICAgcHJvbXB0OiBhd2FpdCBjb252ZXJ0VG9MYW5ndWFnZU1vZGVsUHJvbXB0KHtcbiAgICAgICAgICAgIHByb21wdDogc3RhbmRhcmRpemVkUHJvbXB0LFxuICAgICAgICAgICAgc3VwcG9ydGVkVXJsczogYXdhaXQgbW9kZWwuc3VwcG9ydGVkVXJscyxcbiAgICAgICAgICAgIGRvd25sb2FkOiBkb3dubG9hZDJcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBpbmNsdWRlUmF3Q2h1bmtzOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IHtcbiAgICAgICAgICB0cmFuc2Zvcm06IChjaHVuaywgY29udHJvbGxlcikgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChjaHVuay50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0LWRlbHRhXCI6XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rLmRlbHRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcInJlc3BvbnNlLW1ldGFkYXRhXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJmaW5pc2hcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJzdHJlYW0tc3RhcnRcIjpcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoY2h1bmspO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJlc3VsdDogeyBzdHJlYW0sIHJlc3BvbnNlLCByZXF1ZXN0IH0sXG4gICAgICAgICAgZG9TdHJlYW1TcGFuLFxuICAgICAgICAgIHN0YXJ0VGltZXN0YW1wTXNcbiAgICAgICAgfSA9IGF3YWl0IHJldHJ5KFxuICAgICAgICAgICgpID0+IHJlY29yZFNwYW4oe1xuICAgICAgICAgICAgbmFtZTogXCJhaS5zdHJlYW1PYmplY3QuZG9TdHJlYW1cIixcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICB0ZWxlbWV0cnksXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAuLi5hc3NlbWJsZU9wZXJhdGlvbk5hbWUoe1xuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uSWQ6IFwiYWkuc3RyZWFtT2JqZWN0LmRvU3RyZWFtXCIsXG4gICAgICAgICAgICAgICAgICB0ZWxlbWV0cnlcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAuLi5iYXNlVGVsZW1ldHJ5QXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICBcImFpLnByb21wdC5tZXNzYWdlc1wiOiB7XG4gICAgICAgICAgICAgICAgICBpbnB1dDogKCkgPT4gc3RyaW5naWZ5Rm9yVGVsZW1ldHJ5KGNhbGxPcHRpb25zLnByb21wdClcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIHN0YW5kYXJkaXplZCBnZW4tYWkgbGxtIHNwYW4gYXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICBcImdlbl9haS5zeXN0ZW1cIjogbW9kZWwucHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgXCJnZW5fYWkucmVxdWVzdC5tb2RlbFwiOiBtb2RlbC5tb2RlbElkLFxuICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlcXVlc3QuZnJlcXVlbmN5X3BlbmFsdHlcIjogY2FsbFNldHRpbmdzLmZyZXF1ZW5jeVBlbmFsdHksXG4gICAgICAgICAgICAgICAgXCJnZW5fYWkucmVxdWVzdC5tYXhfdG9rZW5zXCI6IGNhbGxTZXR0aW5ncy5tYXhPdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgXCJnZW5fYWkucmVxdWVzdC5wcmVzZW5jZV9wZW5hbHR5XCI6IGNhbGxTZXR0aW5ncy5wcmVzZW5jZVBlbmFsdHksXG4gICAgICAgICAgICAgICAgXCJnZW5fYWkucmVxdWVzdC50ZW1wZXJhdHVyZVwiOiBjYWxsU2V0dGluZ3MudGVtcGVyYXR1cmUsXG4gICAgICAgICAgICAgICAgXCJnZW5fYWkucmVxdWVzdC50b3Bfa1wiOiBjYWxsU2V0dGluZ3MudG9wSyxcbiAgICAgICAgICAgICAgICBcImdlbl9haS5yZXF1ZXN0LnRvcF9wXCI6IGNhbGxTZXR0aW5ncy50b3BQXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdHJhY2VyLFxuICAgICAgICAgICAgZW5kV2hlbkRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgZm46IGFzeW5jIChkb1N0cmVhbVNwYW4yKSA9PiAoe1xuICAgICAgICAgICAgICBzdGFydFRpbWVzdGFtcE1zOiBub3cyKCksXG4gICAgICAgICAgICAgIGRvU3RyZWFtU3BhbjogZG9TdHJlYW1TcGFuMixcbiAgICAgICAgICAgICAgcmVzdWx0OiBhd2FpdCBtb2RlbC5kb1N0cmVhbShjYWxsT3B0aW9ucylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgc2VsZi5fcmVxdWVzdC5yZXNvbHZlKHJlcXVlc3QgIT0gbnVsbCA/IHJlcXVlc3QgOiB7fSk7XG4gICAgICAgIGxldCB3YXJuaW5ncztcbiAgICAgICAgbGV0IHVzYWdlID0gY3JlYXRlTnVsbExhbmd1YWdlTW9kZWxVc2FnZSgpO1xuICAgICAgICBsZXQgZmluaXNoUmVhc29uO1xuICAgICAgICBsZXQgcHJvdmlkZXJNZXRhZGF0YTtcbiAgICAgICAgbGV0IG9iamVjdDI7XG4gICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgbGV0IGFjY3VtdWxhdGVkVGV4dCA9IFwiXCI7XG4gICAgICAgIGxldCB0ZXh0RGVsdGEgPSBcIlwiO1xuICAgICAgICBsZXQgZnVsbFJlc3BvbnNlID0ge1xuICAgICAgICAgIGlkOiBnZW5lcmF0ZUlkMigpLFxuICAgICAgICAgIHRpbWVzdGFtcDogY3VycmVudERhdGUoKSxcbiAgICAgICAgICBtb2RlbElkOiBtb2RlbC5tb2RlbElkXG4gICAgICAgIH07XG4gICAgICAgIGxldCBsYXRlc3RPYmplY3RKc29uID0gdm9pZCAwO1xuICAgICAgICBsZXQgbGF0ZXN0T2JqZWN0ID0gdm9pZCAwO1xuICAgICAgICBsZXQgaXNGaXJzdENodW5rID0gdHJ1ZTtcbiAgICAgICAgbGV0IGlzRmlyc3REZWx0YSA9IHRydWU7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkU3RyZWFtID0gc3RyZWFtLnBpcGVUaHJvdWdoKG5ldyBUcmFuc2Zvcm1TdHJlYW0odHJhbnNmb3JtZXIpKS5waXBlVGhyb3VnaChcbiAgICAgICAgICBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgICAgICAgICB2YXIgX2EyMSwgX2IsIF9jO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSBcIm9iamVjdFwiICYmIGNodW5rLnR5cGUgPT09IFwic3RyZWFtLXN0YXJ0XCIpIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IGNodW5rLndhcm5pbmdzO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXNGaXJzdENodW5rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNUb0ZpcnN0Q2h1bmsgPSBub3cyKCkgLSBzdGFydFRpbWVzdGFtcE1zO1xuICAgICAgICAgICAgICAgIGlzRmlyc3RDaHVuayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGRvU3RyZWFtU3Bhbi5hZGRFdmVudChcImFpLnN0cmVhbS5maXJzdENodW5rXCIsIHtcbiAgICAgICAgICAgICAgICAgIFwiYWkuc3RyZWFtLm1zVG9GaXJzdENodW5rXCI6IG1zVG9GaXJzdENodW5rXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZG9TdHJlYW1TcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgXCJhaS5zdHJlYW0ubXNUb0ZpcnN0Q2h1bmtcIjogbXNUb0ZpcnN0Q2h1bmtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRUZXh0ICs9IGNodW5rO1xuICAgICAgICAgICAgICAgIHRleHREZWx0YSArPSBjaHVuaztcbiAgICAgICAgICAgICAgICBjb25zdCB7IHZhbHVlOiBjdXJyZW50T2JqZWN0SnNvbiwgc3RhdGU6IHBhcnNlU3RhdGUgfSA9IGF3YWl0IHBhcnNlUGFydGlhbEpzb24oYWNjdW11bGF0ZWRUZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudE9iamVjdEpzb24gIT09IHZvaWQgMCAmJiAhaXNEZWVwRXF1YWxEYXRhKGxhdGVzdE9iamVjdEpzb24sIGN1cnJlbnRPYmplY3RKc29uKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IG91dHB1dFN0cmF0ZWd5LnZhbGlkYXRlUGFydGlhbFJlc3VsdCh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjdXJyZW50T2JqZWN0SnNvbixcbiAgICAgICAgICAgICAgICAgICAgdGV4dERlbHRhLFxuICAgICAgICAgICAgICAgICAgICBsYXRlc3RPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGlzRmlyc3REZWx0YSxcbiAgICAgICAgICAgICAgICAgICAgaXNGaW5hbERlbHRhOiBwYXJzZVN0YXRlID09PSBcInN1Y2Nlc3NmdWwtcGFyc2VcIlxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzICYmICFpc0RlZXBFcXVhbERhdGEoXG4gICAgICAgICAgICAgICAgICAgIGxhdGVzdE9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdC52YWx1ZS5wYXJ0aWFsXG4gICAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhdGVzdE9iamVjdEpzb24gPSBjdXJyZW50T2JqZWN0SnNvbjtcbiAgICAgICAgICAgICAgICAgICAgbGF0ZXN0T2JqZWN0ID0gdmFsaWRhdGlvblJlc3VsdC52YWx1ZS5wYXJ0aWFsO1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBsYXRlc3RPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgdGV4dERlbHRhOiB2YWxpZGF0aW9uUmVzdWx0LnZhbHVlLnRleHREZWx0YVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERlbHRhID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaXNGaXJzdERlbHRhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzd2l0Y2ggKGNodW5rLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwicmVzcG9uc2UtbWV0YWRhdGFcIjoge1xuICAgICAgICAgICAgICAgICAgZnVsbFJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogKF9hMjEgPSBjaHVuay5pZCkgIT0gbnVsbCA/IF9hMjEgOiBmdWxsUmVzcG9uc2UuaWQsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogKF9iID0gY2h1bmsudGltZXN0YW1wKSAhPSBudWxsID8gX2IgOiBmdWxsUmVzcG9uc2UudGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbElkOiAoX2MgPSBjaHVuay5tb2RlbElkKSAhPSBudWxsID8gX2MgOiBmdWxsUmVzcG9uc2UubW9kZWxJZFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIFwiZmluaXNoXCI6IHtcbiAgICAgICAgICAgICAgICAgIGlmICh0ZXh0RGVsdGEgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJ0ZXh0LWRlbHRhXCIsIHRleHREZWx0YSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGZpbmlzaFJlYXNvbiA9IGNodW5rLmZpbmlzaFJlYXNvbi51bmlmaWVkO1xuICAgICAgICAgICAgICAgICAgdXNhZ2UgPSBhc0xhbmd1YWdlTW9kZWxVc2FnZShjaHVuay51c2FnZSk7XG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhID0gY2h1bmsucHJvdmlkZXJNZXRhZGF0YTtcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNodW5rLFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hSZWFzb246IGNodW5rLmZpbmlzaFJlYXNvbi51bmlmaWVkLFxuICAgICAgICAgICAgICAgICAgICB1c2FnZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGZ1bGxSZXNwb25zZVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBsb2dXYXJuaW5ncyh7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiB3YXJuaW5ncyAhPSBudWxsID8gd2FybmluZ3MgOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXI6IG1vZGVsLnByb3ZpZGVyLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbDogbW9kZWwubW9kZWxJZFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBzZWxmLl91c2FnZS5yZXNvbHZlKHVzYWdlKTtcbiAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb3ZpZGVyTWV0YWRhdGEucmVzb2x2ZShwcm92aWRlck1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgIHNlbGYuX3dhcm5pbmdzLnJlc29sdmUod2FybmluZ3MpO1xuICAgICAgICAgICAgICAgICAgc2VsZi5fcmVzcG9uc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmZ1bGxSZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UgPT0gbnVsbCA/IHZvaWQgMCA6IHJlc3BvbnNlLmhlYWRlcnNcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgc2VsZi5fZmluaXNoUmVhc29uLnJlc29sdmUoZmluaXNoUmVhc29uICE9IG51bGwgPyBmaW5pc2hSZWFzb24gOiBcIm90aGVyXCIpO1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0MiA9IGF3YWl0IHBhcnNlQW5kVmFsaWRhdGVPYmplY3RSZXN1bHRXaXRoUmVwYWlyKFxuICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJhdGVneSxcbiAgICAgICAgICAgICAgICAgICAgICByZXBhaXJUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBmdWxsUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaFJlYXNvblxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fb2JqZWN0LnJlc29sdmUob2JqZWN0Mik7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fb2JqZWN0LnJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoY2h1bmspO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gaW52b2tlIG9uRmluaXNoIGNhbGxiYWNrIGFuZCByZXNvbHZlIHRvb2xSZXN1bHRzIHByb21pc2Ugd2hlbiB0aGUgc3RyZWFtIGlzIGFib3V0IHRvIGNsb3NlOlxuICAgICAgICAgICAgYXN5bmMgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsVXNhZ2UgPSB1c2FnZSAhPSBudWxsID8gdXNhZ2UgOiB7XG4gICAgICAgICAgICAgICAgICBwcm9tcHRUb2tlbnM6IE5hTixcbiAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Ub2tlbnM6IE5hTixcbiAgICAgICAgICAgICAgICAgIHRvdGFsVG9rZW5zOiBOYU5cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGRvU3RyZWFtU3Bhbi5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgYXdhaXQgc2VsZWN0VGVsZW1ldHJ5QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgIHRlbGVtZXRyeSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UuZmluaXNoUmVhc29uXCI6IGZpbmlzaFJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLm9iamVjdFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6ICgpID0+IEpTT04uc3RyaW5naWZ5KG9iamVjdDIpXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLmlkXCI6IGZ1bGxSZXNwb25zZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLm1vZGVsXCI6IGZ1bGxSZXNwb25zZS5tb2RlbElkLFxuICAgICAgICAgICAgICAgICAgICAgIFwiYWkucmVzcG9uc2UudGltZXN0YW1wXCI6IGZ1bGxSZXNwb25zZS50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLnByb3ZpZGVyTWV0YWRhdGFcIjogSlNPTi5zdHJpbmdpZnkocHJvdmlkZXJNZXRhZGF0YSksXG4gICAgICAgICAgICAgICAgICAgICAgXCJhaS51c2FnZS5pbnB1dFRva2Vuc1wiOiBmaW5hbFVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2Uub3V0cHV0VG9rZW5zXCI6IGZpbmFsVXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UudG90YWxUb2tlbnNcIjogZmluYWxVc2FnZS50b3RhbFRva2VucyxcbiAgICAgICAgICAgICAgICAgICAgICBcImFpLnVzYWdlLnJlYXNvbmluZ1Rva2Vuc1wiOiBmaW5hbFVzYWdlLnJlYXNvbmluZ1Rva2VucyxcbiAgICAgICAgICAgICAgICAgICAgICBcImFpLnVzYWdlLmNhY2hlZElucHV0VG9rZW5zXCI6IGZpbmFsVXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbmRhcmRpemVkIGdlbi1haSBsbG0gc3BhbiBhdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlc3BvbnNlLmZpbmlzaF9yZWFzb25zXCI6IFtmaW5pc2hSZWFzb25dLFxuICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuX2FpLnJlc3BvbnNlLmlkXCI6IGZ1bGxSZXNwb25zZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICBcImdlbl9haS5yZXNwb25zZS5tb2RlbFwiOiBmdWxsUmVzcG9uc2UubW9kZWxJZCxcbiAgICAgICAgICAgICAgICAgICAgICBcImdlbl9haS51c2FnZS5pbnB1dF90b2tlbnNcIjogZmluYWxVc2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgICAgICAgICBcImdlbl9haS51c2FnZS5vdXRwdXRfdG9rZW5zXCI6IGZpbmFsVXNhZ2Uub3V0cHV0VG9rZW5zXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb1N0cmVhbVNwYW4uZW5kKCk7XG4gICAgICAgICAgICAgICAgcm9vdFNwYW4uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICB0ZWxlbWV0cnksXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBcImFpLnVzYWdlLmlucHV0VG9rZW5zXCI6IGZpbmFsVXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgICAgICAgXCJhaS51c2FnZS5vdXRwdXRUb2tlbnNcIjogZmluYWxVc2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgICAgICAgXCJhaS51c2FnZS50b3RhbFRva2Vuc1wiOiBmaW5hbFVzYWdlLnRvdGFsVG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UucmVhc29uaW5nVG9rZW5zXCI6IGZpbmFsVXNhZ2UucmVhc29uaW5nVG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAgIFwiYWkudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnNcIjogZmluYWxVc2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLm9iamVjdFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6ICgpID0+IEpTT04uc3RyaW5naWZ5KG9iamVjdDIpXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBcImFpLnJlc3BvbnNlLnByb3ZpZGVyTWV0YWRhdGFcIjogSlNPTi5zdHJpbmdpZnkocHJvdmlkZXJNZXRhZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGF3YWl0IChvbkZpbmlzaCA9PSBudWxsID8gdm9pZCAwIDogb25GaW5pc2goe1xuICAgICAgICAgICAgICAgICAgdXNhZ2U6IGZpbmFsVXNhZ2UsXG4gICAgICAgICAgICAgICAgICBvYmplY3Q6IG9iamVjdDIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmZ1bGxSZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UgPT0gbnVsbCA/IHZvaWQgMCA6IHJlc3BvbnNlLmhlYWRlcnNcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB3YXJuaW5ncyxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yMikge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwiZXJyb3JcIiwgZXJyb3I6IGVycm9yMiB9KTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByb290U3Bhbi5lbmQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHN0aXRjaGFibGVTdHJlYW0uYWRkU3RyZWFtKHRyYW5zZm9ybWVkU3RyZWFtKTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHN0aXRjaGFibGVTdHJlYW0uYWRkU3RyZWFtKFxuICAgICAgICBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgICAgIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwiZXJyb3JcIiwgZXJyb3IgfSk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgIHN0aXRjaGFibGVTdHJlYW0uY2xvc2UoKTtcbiAgICB9KTtcbiAgICB0aGlzLm91dHB1dFN0cmF0ZWd5ID0gb3V0cHV0U3RyYXRlZ3k7XG4gIH1cbiAgZ2V0IG9iamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0LnByb21pc2U7XG4gIH1cbiAgZ2V0IHVzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLl91c2FnZS5wcm9taXNlO1xuICB9XG4gIGdldCBwcm92aWRlck1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9wcm92aWRlck1ldGFkYXRhLnByb21pc2U7XG4gIH1cbiAgZ2V0IHdhcm5pbmdzKCkge1xuICAgIHJldHVybiB0aGlzLl93YXJuaW5ncy5wcm9taXNlO1xuICB9XG4gIGdldCByZXF1ZXN0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0LnByb21pc2U7XG4gIH1cbiAgZ2V0IHJlc3BvbnNlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNwb25zZS5wcm9taXNlO1xuICB9XG4gIGdldCBmaW5pc2hSZWFzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbmlzaFJlYXNvbi5wcm9taXNlO1xuICB9XG4gIGdldCBwYXJ0aWFsT2JqZWN0U3RyZWFtKCkge1xuICAgIHJldHVybiBjcmVhdGVBc3luY0l0ZXJhYmxlU3RyZWFtKFxuICAgICAgdGhpcy5iYXNlU3RyZWFtLnBpcGVUaHJvdWdoKFxuICAgICAgICBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoY2h1bmsudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rLm9iamVjdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0LWRlbHRhXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJmaW5pc2hcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZUNoZWNrID0gY2h1bms7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBjaHVuayB0eXBlOiAke19leGhhdXN0aXZlQ2hlY2t9YCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBnZXQgZWxlbWVudFN0cmVhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5vdXRwdXRTdHJhdGVneS5jcmVhdGVFbGVtZW50U3RyZWFtKHRoaXMuYmFzZVN0cmVhbSk7XG4gIH1cbiAgZ2V0IHRleHRTdHJlYW0oKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUFzeW5jSXRlcmFibGVTdHJlYW0oXG4gICAgICB0aGlzLmJhc2VTdHJlYW0ucGlwZVRocm91Z2goXG4gICAgICAgIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgICAgICAgc3dpdGNoIChjaHVuay50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0LWRlbHRhXCI6XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rLnRleHREZWx0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImZpbmlzaFwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZXJyb3JcIjpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9leGhhdXN0aXZlQ2hlY2sgPSBjaHVuaztcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGNodW5rIHR5cGU6ICR7X2V4aGF1c3RpdmVDaGVja31gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICB9XG4gIGdldCBmdWxsU3RyZWFtKCkge1xuICAgIHJldHVybiBjcmVhdGVBc3luY0l0ZXJhYmxlU3RyZWFtKHRoaXMuYmFzZVN0cmVhbSk7XG4gIH1cbiAgcGlwZVRleHRTdHJlYW1Ub1Jlc3BvbnNlKHJlc3BvbnNlLCBpbml0KSB7XG4gICAgcGlwZVRleHRTdHJlYW1Ub1Jlc3BvbnNlKHtcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgdGV4dFN0cmVhbTogdGhpcy50ZXh0U3RyZWFtLFxuICAgICAgLi4uaW5pdFxuICAgIH0pO1xuICB9XG4gIHRvVGV4dFN0cmVhbVJlc3BvbnNlKGluaXQpIHtcbiAgICByZXR1cm4gY3JlYXRlVGV4dFN0cmVhbVJlc3BvbnNlKHtcbiAgICAgIHRleHRTdHJlYW06IHRoaXMudGV4dFN0cmVhbSxcbiAgICAgIC4uLmluaXRcbiAgICB9KTtcbiAgfVxufTtcblxuLy8gc3JjL2dlbmVyYXRlLXNwZWVjaC9nZW5lcmF0ZS1zcGVlY2gudHNcbmltcG9ydCB7IHdpdGhVc2VyQWdlbnRTdWZmaXggYXMgd2l0aFVzZXJBZ2VudFN1ZmZpeDcgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvZ2VuZXJhdGUtc3BlZWNoL2dlbmVyYXRlZC1hdWRpby1maWxlLnRzXG52YXIgRGVmYXVsdEdlbmVyYXRlZEF1ZGlvRmlsZSA9IGNsYXNzIGV4dGVuZHMgRGVmYXVsdEdlbmVyYXRlZEZpbGUge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgZGF0YSxcbiAgICBtZWRpYVR5cGVcbiAgfSkge1xuICAgIHN1cGVyKHsgZGF0YSwgbWVkaWFUeXBlIH0pO1xuICAgIGxldCBmb3JtYXQgPSBcIm1wM1wiO1xuICAgIGlmIChtZWRpYVR5cGUpIHtcbiAgICAgIGNvbnN0IG1lZGlhVHlwZVBhcnRzID0gbWVkaWFUeXBlLnNwbGl0KFwiL1wiKTtcbiAgICAgIGlmIChtZWRpYVR5cGVQYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgaWYgKG1lZGlhVHlwZSAhPT0gXCJhdWRpby9tcGVnXCIpIHtcbiAgICAgICAgICBmb3JtYXQgPSBtZWRpYVR5cGVQYXJ0c1sxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkF1ZGlvIGZvcm1hdCBtdXN0IGJlIHByb3ZpZGVkIG9yIGRldGVybWluYWJsZSBmcm9tIG1lZGlhIHR5cGVcIlxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG4gIH1cbn07XG5cbi8vIHNyYy9nZW5lcmF0ZS1zcGVlY2gvZ2VuZXJhdGUtc3BlZWNoLnRzXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVNwZWVjaCh7XG4gIG1vZGVsLFxuICB0ZXh0OiB0ZXh0MixcbiAgdm9pY2UsXG4gIG91dHB1dEZvcm1hdCxcbiAgaW5zdHJ1Y3Rpb25zLFxuICBzcGVlZCxcbiAgbGFuZ3VhZ2UsXG4gIHByb3ZpZGVyT3B0aW9ucyA9IHt9LFxuICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzQXJnLFxuICBhYm9ydFNpZ25hbCxcbiAgaGVhZGVyc1xufSkge1xuICB2YXIgX2EyMTtcbiAgY29uc3QgcmVzb2x2ZWRNb2RlbCA9IHJlc29sdmVTcGVlY2hNb2RlbChtb2RlbCk7XG4gIGlmICghcmVzb2x2ZWRNb2RlbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk1vZGVsIGNvdWxkIG5vdCBiZSByZXNvbHZlZFwiKTtcbiAgfVxuICBjb25zdCBoZWFkZXJzV2l0aFVzZXJBZ2VudCA9IHdpdGhVc2VyQWdlbnRTdWZmaXg3KFxuICAgIGhlYWRlcnMgIT0gbnVsbCA/IGhlYWRlcnMgOiB7fSxcbiAgICBgYWkvJHtWRVJTSU9OfWBcbiAgKTtcbiAgY29uc3QgeyByZXRyeSB9ID0gcHJlcGFyZVJldHJpZXMoe1xuICAgIG1heFJldHJpZXM6IG1heFJldHJpZXNBcmcsXG4gICAgYWJvcnRTaWduYWxcbiAgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJldHJ5KFxuICAgICgpID0+IHJlc29sdmVkTW9kZWwuZG9HZW5lcmF0ZSh7XG4gICAgICB0ZXh0OiB0ZXh0MixcbiAgICAgIHZvaWNlLFxuICAgICAgb3V0cHV0Rm9ybWF0LFxuICAgICAgaW5zdHJ1Y3Rpb25zLFxuICAgICAgc3BlZWQsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgaGVhZGVyczogaGVhZGVyc1dpdGhVc2VyQWdlbnQsXG4gICAgICBwcm92aWRlck9wdGlvbnNcbiAgICB9KVxuICApO1xuICBpZiAoIXJlc3VsdC5hdWRpbyB8fCByZXN1bHQuYXVkaW8ubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IE5vU3BlZWNoR2VuZXJhdGVkRXJyb3IoeyByZXNwb25zZXM6IFtyZXN1bHQucmVzcG9uc2VdIH0pO1xuICB9XG4gIGxvZ1dhcm5pbmdzKHtcbiAgICB3YXJuaW5nczogcmVzdWx0Lndhcm5pbmdzLFxuICAgIHByb3ZpZGVyOiByZXNvbHZlZE1vZGVsLnByb3ZpZGVyLFxuICAgIG1vZGVsOiByZXNvbHZlZE1vZGVsLm1vZGVsSWRcbiAgfSk7XG4gIHJldHVybiBuZXcgRGVmYXVsdFNwZWVjaFJlc3VsdCh7XG4gICAgYXVkaW86IG5ldyBEZWZhdWx0R2VuZXJhdGVkQXVkaW9GaWxlKHtcbiAgICAgIGRhdGE6IHJlc3VsdC5hdWRpbyxcbiAgICAgIG1lZGlhVHlwZTogKF9hMjEgPSBkZXRlY3RNZWRpYVR5cGUoe1xuICAgICAgICBkYXRhOiByZXN1bHQuYXVkaW8sXG4gICAgICAgIHNpZ25hdHVyZXM6IGF1ZGlvTWVkaWFUeXBlU2lnbmF0dXJlc1xuICAgICAgfSkpICE9IG51bGwgPyBfYTIxIDogXCJhdWRpby9tcDNcIlxuICAgIH0pLFxuICAgIHdhcm5pbmdzOiByZXN1bHQud2FybmluZ3MsXG4gICAgcmVzcG9uc2VzOiBbcmVzdWx0LnJlc3BvbnNlXSxcbiAgICBwcm92aWRlck1ldGFkYXRhOiByZXN1bHQucHJvdmlkZXJNZXRhZGF0YVxuICB9KTtcbn1cbnZhciBEZWZhdWx0U3BlZWNoUmVzdWx0ID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgdmFyIF9hMjE7XG4gICAgdGhpcy5hdWRpbyA9IG9wdGlvbnMuYXVkaW87XG4gICAgdGhpcy53YXJuaW5ncyA9IG9wdGlvbnMud2FybmluZ3M7XG4gICAgdGhpcy5yZXNwb25zZXMgPSBvcHRpb25zLnJlc3BvbnNlcztcbiAgICB0aGlzLnByb3ZpZGVyTWV0YWRhdGEgPSAoX2EyMSA9IG9wdGlvbnMucHJvdmlkZXJNZXRhZGF0YSkgIT0gbnVsbCA/IF9hMjEgOiB7fTtcbiAgfVxufTtcblxuLy8gc3JjL2dlbmVyYXRlLXRleHQvcHJ1bmUtbWVzc2FnZXMudHNcbmZ1bmN0aW9uIHBydW5lTWVzc2FnZXMoe1xuICBtZXNzYWdlcyxcbiAgcmVhc29uaW5nID0gXCJub25lXCIsXG4gIHRvb2xDYWxscyA9IFtdLFxuICBlbXB0eU1lc3NhZ2VzID0gXCJyZW1vdmVcIlxufSkge1xuICBpZiAocmVhc29uaW5nID09PSBcImFsbFwiIHx8IHJlYXNvbmluZyA9PT0gXCJiZWZvcmUtbGFzdC1tZXNzYWdlXCIpIHtcbiAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLm1hcCgobWVzc2FnZSwgbWVzc2FnZUluZGV4KSA9PiB7XG4gICAgICBpZiAobWVzc2FnZS5yb2xlICE9PSBcImFzc2lzdGFudFwiIHx8IHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09IFwic3RyaW5nXCIgfHwgcmVhc29uaW5nID09PSBcImJlZm9yZS1sYXN0LW1lc3NhZ2VcIiAmJiBtZXNzYWdlSW5kZXggPT09IG1lc3NhZ2VzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICBjb250ZW50OiBtZXNzYWdlLmNvbnRlbnQuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgIT09IFwicmVhc29uaW5nXCIpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIGlmICh0b29sQ2FsbHMgPT09IFwibm9uZVwiKSB7XG4gICAgdG9vbENhbGxzID0gW107XG4gIH0gZWxzZSBpZiAodG9vbENhbGxzID09PSBcImFsbFwiKSB7XG4gICAgdG9vbENhbGxzID0gW3sgdHlwZTogXCJhbGxcIiB9XTtcbiAgfSBlbHNlIGlmICh0b29sQ2FsbHMgPT09IFwiYmVmb3JlLWxhc3QtbWVzc2FnZVwiKSB7XG4gICAgdG9vbENhbGxzID0gW3sgdHlwZTogXCJiZWZvcmUtbGFzdC1tZXNzYWdlXCIgfV07XG4gIH0gZWxzZSBpZiAodHlwZW9mIHRvb2xDYWxscyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHRvb2xDYWxscyA9IFt7IHR5cGU6IHRvb2xDYWxscyB9XTtcbiAgfVxuICBmb3IgKGNvbnN0IHRvb2xDYWxsIG9mIHRvb2xDYWxscykge1xuICAgIGNvbnN0IGtlZXBMYXN0TWVzc2FnZXNDb3VudCA9IHRvb2xDYWxsLnR5cGUgPT09IFwiYWxsXCIgPyB2b2lkIDAgOiB0b29sQ2FsbC50eXBlID09PSBcImJlZm9yZS1sYXN0LW1lc3NhZ2VcIiA/IDEgOiBOdW1iZXIoXG4gICAgICB0b29sQ2FsbC50eXBlLnNsaWNlKFwiYmVmb3JlLWxhc3QtXCIubGVuZ3RoKS5zbGljZSgwLCAtXCItbWVzc2FnZXNcIi5sZW5ndGgpXG4gICAgKTtcbiAgICBjb25zdCBrZXB0VG9vbENhbGxJZHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGNvbnN0IGtlcHRBcHByb3ZhbElkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgaWYgKGtlZXBMYXN0TWVzc2FnZXNDb3VudCAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMuc2xpY2UoLWtlZXBMYXN0TWVzc2FnZXNDb3VudCkpIHtcbiAgICAgICAgaWYgKChtZXNzYWdlLnJvbGUgPT09IFwiYXNzaXN0YW50XCIgfHwgbWVzc2FnZS5yb2xlID09PSBcInRvb2xcIikgJiYgdHlwZW9mIG1lc3NhZ2UuY29udGVudCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBtZXNzYWdlLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidG9vbC1jYWxsXCIgfHwgcGFydC50eXBlID09PSBcInRvb2wtcmVzdWx0XCIpIHtcbiAgICAgICAgICAgICAga2VwdFRvb2xDYWxsSWRzLmFkZChwYXJ0LnRvb2xDYWxsSWQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwidG9vbC1hcHByb3ZhbC1yZXF1ZXN0XCIgfHwgcGFydC50eXBlID09PSBcInRvb2wtYXBwcm92YWwtcmVzcG9uc2VcIikge1xuICAgICAgICAgICAgICBrZXB0QXBwcm92YWxJZHMuYWRkKHBhcnQuYXBwcm92YWxJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMubWFwKChtZXNzYWdlLCBtZXNzYWdlSW5kZXgpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlLnJvbGUgIT09IFwiYXNzaXN0YW50XCIgJiYgbWVzc2FnZS5yb2xlICE9PSBcInRvb2xcIiB8fCB0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiIHx8IGtlZXBMYXN0TWVzc2FnZXNDb3VudCAmJiBtZXNzYWdlSW5kZXggPj0gbWVzc2FnZXMubGVuZ3RoIC0ga2VlcExhc3RNZXNzYWdlc0NvdW50KSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgfVxuICAgICAgY29uc3QgdG9vbENhbGxJZFRvVG9vbE5hbWUgPSB7fTtcbiAgICAgIGNvbnN0IGFwcHJvdmFsSWRUb1Rvb2xOYW1lID0ge307XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICBjb250ZW50OiBtZXNzYWdlLmNvbnRlbnQuZmlsdGVyKChwYXJ0KSA9PiB7XG4gICAgICAgICAgaWYgKHBhcnQudHlwZSAhPT0gXCJ0b29sLWNhbGxcIiAmJiBwYXJ0LnR5cGUgIT09IFwidG9vbC1yZXN1bHRcIiAmJiBwYXJ0LnR5cGUgIT09IFwidG9vbC1hcHByb3ZhbC1yZXF1ZXN0XCIgJiYgcGFydC50eXBlICE9PSBcInRvb2wtYXBwcm92YWwtcmVzcG9uc2VcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidG9vbC1jYWxsXCIpIHtcbiAgICAgICAgICAgIHRvb2xDYWxsSWRUb1Rvb2xOYW1lW3BhcnQudG9vbENhbGxJZF0gPSBwYXJ0LnRvb2xOYW1lO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiKSB7XG4gICAgICAgICAgICBhcHByb3ZhbElkVG9Ub29sTmFtZVtwYXJ0LmFwcHJvdmFsSWRdID0gdG9vbENhbGxJZFRvVG9vbE5hbWVbcGFydC50b29sQ2FsbElkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKChwYXJ0LnR5cGUgPT09IFwidG9vbC1jYWxsXCIgfHwgcGFydC50eXBlID09PSBcInRvb2wtcmVzdWx0XCIpICYmIGtlcHRUb29sQ2FsbElkcy5oYXMocGFydC50b29sQ2FsbElkKSB8fCAocGFydC50eXBlID09PSBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiIHx8IHBhcnQudHlwZSA9PT0gXCJ0b29sLWFwcHJvdmFsLXJlc3BvbnNlXCIpICYmIGtlcHRBcHByb3ZhbElkcy5oYXMocGFydC5hcHByb3ZhbElkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0b29sQ2FsbC50b29scyAhPSBudWxsICYmICF0b29sQ2FsbC50b29scy5pbmNsdWRlcyhcbiAgICAgICAgICAgIHBhcnQudHlwZSA9PT0gXCJ0b29sLWNhbGxcIiB8fCBwYXJ0LnR5cGUgPT09IFwidG9vbC1yZXN1bHRcIiA/IHBhcnQudG9vbE5hbWUgOiBhcHByb3ZhbElkVG9Ub29sTmFtZVtwYXJ0LmFwcHJvdmFsSWRdXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgaWYgKGVtcHR5TWVzc2FnZXMgPT09IFwicmVtb3ZlXCIpIHtcbiAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLmZpbHRlcigobWVzc2FnZSkgPT4gbWVzc2FnZS5jb250ZW50Lmxlbmd0aCA+IDApO1xuICB9XG4gIHJldHVybiBtZXNzYWdlcztcbn1cblxuLy8gc3JjL2dlbmVyYXRlLXRleHQvc21vb3RoLXN0cmVhbS50c1xuaW1wb3J0IHsgZGVsYXkgYXMgb3JpZ2luYWxEZWxheSB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyBJbnZhbGlkQXJndW1lbnRFcnJvciBhcyBJbnZhbGlkQXJndW1lbnRFcnJvcjIgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xudmFyIENIVU5LSU5HX1JFR0VYUFMgPSB7XG4gIHdvcmQ6IC9cXFMrXFxzKy9tLFxuICBsaW5lOiAvXFxuKy9tXG59O1xuZnVuY3Rpb24gc21vb3RoU3RyZWFtKHtcbiAgZGVsYXlJbk1zID0gMTAsXG4gIGNodW5raW5nID0gXCJ3b3JkXCIsXG4gIF9pbnRlcm5hbDogeyBkZWxheTogZGVsYXkyID0gb3JpZ2luYWxEZWxheSB9ID0ge31cbn0gPSB7fSkge1xuICBsZXQgZGV0ZWN0Q2h1bms7XG4gIGlmIChjaHVua2luZyAhPSBudWxsICYmIHR5cGVvZiBjaHVua2luZyA9PT0gXCJvYmplY3RcIiAmJiBcInNlZ21lbnRcIiBpbiBjaHVua2luZyAmJiB0eXBlb2YgY2h1bmtpbmcuc2VnbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3Qgc2VnbWVudGVyID0gY2h1bmtpbmc7XG4gICAgZGV0ZWN0Q2h1bmsgPSAoYnVmZmVyKSA9PiB7XG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBpdGVyYXRvciA9IHNlZ21lbnRlci5zZWdtZW50KGJ1ZmZlcilbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgZmlyc3QgPSBpdGVyYXRvci5uZXh0KCkudmFsdWU7XG4gICAgICByZXR1cm4gKGZpcnN0ID09IG51bGwgPyB2b2lkIDAgOiBmaXJzdC5zZWdtZW50KSB8fCBudWxsO1xuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNodW5raW5nID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBkZXRlY3RDaHVuayA9IChidWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoID0gY2h1bmtpbmcoYnVmZmVyKTtcbiAgICAgIGlmIChtYXRjaCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKCFtYXRjaC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaHVua2luZyBmdW5jdGlvbiBtdXN0IHJldHVybiBhIG5vbi1lbXB0eSBzdHJpbmcuYCk7XG4gICAgICB9XG4gICAgICBpZiAoIWJ1ZmZlci5zdGFydHNXaXRoKG1hdGNoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENodW5raW5nIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgbWF0Y2ggdGhhdCBpcyBhIHByZWZpeCBvZiB0aGUgYnVmZmVyLiBSZWNlaXZlZDogXCIke21hdGNofVwiIGV4cGVjdGVkIHRvIHN0YXJ0IHdpdGggXCIke2J1ZmZlcn1cImBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNodW5raW5nUmVnZXggPSB0eXBlb2YgY2h1bmtpbmcgPT09IFwic3RyaW5nXCIgPyBDSFVOS0lOR19SRUdFWFBTW2NodW5raW5nXSA6IGNodW5raW5nIGluc3RhbmNlb2YgUmVnRXhwID8gY2h1bmtpbmcgOiB2b2lkIDA7XG4gICAgaWYgKGNodW5raW5nUmVnZXggPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yMih7XG4gICAgICAgIGFyZ3VtZW50OiBcImNodW5raW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IGBDaHVua2luZyBtdXN0IGJlIFwid29yZFwiLCBcImxpbmVcIiwgYSBSZWdFeHAsIGFuIEludGwuU2VnbWVudGVyLCBvciBhIENodW5rRGV0ZWN0b3IgZnVuY3Rpb24uIFJlY2VpdmVkOiAke2NodW5raW5nfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgICBkZXRlY3RDaHVuayA9IChidWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoID0gY2h1bmtpbmdSZWdleC5leGVjKGJ1ZmZlcik7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBtYXRjaC5pbmRleCkgKyAobWF0Y2ggPT0gbnVsbCA/IHZvaWQgMCA6IG1hdGNoWzBdKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiAoKSA9PiB7XG4gICAgbGV0IGJ1ZmZlciA9IFwiXCI7XG4gICAgbGV0IGlkID0gXCJcIjtcbiAgICBsZXQgdHlwZSA9IHZvaWQgMDtcbiAgICBsZXQgcHJvdmlkZXJNZXRhZGF0YSA9IHZvaWQgMDtcbiAgICBmdW5jdGlvbiBmbHVzaEJ1ZmZlcihjb250cm9sbGVyKSB7XG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDAgJiYgdHlwZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICB0ZXh0OiBidWZmZXIsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgLi4ucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgYnVmZmVyID0gXCJcIjtcbiAgICAgICAgcHJvdmlkZXJNZXRhZGF0YSA9IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgYXN5bmMgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAgIGlmIChjaHVuay50eXBlICE9PSBcInRleHQtZGVsdGFcIiAmJiBjaHVuay50eXBlICE9PSBcInJlYXNvbmluZy1kZWx0YVwiKSB7XG4gICAgICAgICAgZmx1c2hCdWZmZXIoY29udHJvbGxlcik7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChjaHVuay50eXBlICE9PSB0eXBlIHx8IGNodW5rLmlkICE9PSBpZCkgJiYgYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmbHVzaEJ1ZmZlcihjb250cm9sbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIgKz0gY2h1bmsudGV4dDtcbiAgICAgICAgaWQgPSBjaHVuay5pZDtcbiAgICAgICAgdHlwZSA9IGNodW5rLnR5cGU7XG4gICAgICAgIGlmIChjaHVuay5wcm92aWRlck1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgICAgICBwcm92aWRlck1ldGFkYXRhID0gY2h1bmsucHJvdmlkZXJNZXRhZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWF0Y2g7XG4gICAgICAgIHdoaWxlICgobWF0Y2ggPSBkZXRlY3RDaHVuayhidWZmZXIpKSAhPSBudWxsKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZSwgdGV4dDogbWF0Y2gsIGlkIH0pO1xuICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShtYXRjaC5sZW5ndGgpO1xuICAgICAgICAgIGF3YWl0IGRlbGF5MihkZWxheUluTXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59XG5cbi8vIHNyYy9nZW5lcmF0ZS12aWRlby9nZW5lcmF0ZS12aWRlby50c1xuaW1wb3J0IHtcbiAgY29udmVydEJhc2U2NFRvVWludDhBcnJheSBhcyBjb252ZXJ0QmFzZTY0VG9VaW50OEFycmF5NSxcbiAgd2l0aFVzZXJBZ2VudFN1ZmZpeCBhcyB3aXRoVXNlckFnZW50U3VmZml4OFxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xudmFyIGRlZmF1bHREb3dubG9hZCA9IGNyZWF0ZURvd25sb2FkKCk7XG5hc3luYyBmdW5jdGlvbiBleHBlcmltZW50YWxfZ2VuZXJhdGVWaWRlbyh7XG4gIG1vZGVsOiBtb2RlbEFyZyxcbiAgcHJvbXB0OiBwcm9tcHRBcmcsXG4gIG4gPSAxLFxuICBtYXhWaWRlb3NQZXJDYWxsLFxuICBhc3BlY3RSYXRpbyxcbiAgcmVzb2x1dGlvbixcbiAgZHVyYXRpb24sXG4gIGZwcyxcbiAgc2VlZCxcbiAgcHJvdmlkZXJPcHRpb25zLFxuICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzQXJnLFxuICBhYm9ydFNpZ25hbCxcbiAgaGVhZGVycyxcbiAgZG93bmxvYWQ6IGRvd25sb2FkRm4gPSBkZWZhdWx0RG93bmxvYWRcbn0pIHtcbiAgdmFyIF9hMjE7XG4gIGNvbnN0IG1vZGVsID0gcmVzb2x2ZVZpZGVvTW9kZWwobW9kZWxBcmcpO1xuICBjb25zdCBoZWFkZXJzV2l0aFVzZXJBZ2VudCA9IHdpdGhVc2VyQWdlbnRTdWZmaXg4KFxuICAgIGhlYWRlcnMgIT0gbnVsbCA/IGhlYWRlcnMgOiB7fSxcbiAgICBgYWkvJHtWRVJTSU9OfWBcbiAgKTtcbiAgY29uc3QgeyByZXRyeSB9ID0gcHJlcGFyZVJldHJpZXMoe1xuICAgIG1heFJldHJpZXM6IG1heFJldHJpZXNBcmcsXG4gICAgYWJvcnRTaWduYWxcbiAgfSk7XG4gIGNvbnN0IHsgcHJvbXB0LCBpbWFnZSB9ID0gbm9ybWFsaXplUHJvbXB0Mihwcm9tcHRBcmcpO1xuICBjb25zdCBtYXhWaWRlb3NQZXJDYWxsV2l0aERlZmF1bHQgPSAoX2EyMSA9IG1heFZpZGVvc1BlckNhbGwgIT0gbnVsbCA/IG1heFZpZGVvc1BlckNhbGwgOiBhd2FpdCBpbnZva2VNb2RlbE1heFZpZGVvc1BlckNhbGwobW9kZWwpKSAhPSBudWxsID8gX2EyMSA6IDE7XG4gIGNvbnN0IGNhbGxDb3VudCA9IE1hdGguY2VpbChuIC8gbWF4VmlkZW9zUGVyQ2FsbFdpdGhEZWZhdWx0KTtcbiAgY29uc3QgY2FsbFZpZGVvQ291bnRzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogY2FsbENvdW50IH0sIChfLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IG4gLSBpbmRleCAqIG1heFZpZGVvc1BlckNhbGxXaXRoRGVmYXVsdDtcbiAgICByZXR1cm4gTWF0aC5taW4ocmVtYWluaW5nLCBtYXhWaWRlb3NQZXJDYWxsV2l0aERlZmF1bHQpO1xuICB9KTtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGNhbGxWaWRlb0NvdW50cy5tYXAoXG4gICAgICBhc3luYyAoY2FsbFZpZGVvQ291bnQpID0+IHJldHJ5KFxuICAgICAgICAoKSA9PiBtb2RlbC5kb0dlbmVyYXRlKHtcbiAgICAgICAgICBwcm9tcHQsXG4gICAgICAgICAgbjogY2FsbFZpZGVvQ291bnQsXG4gICAgICAgICAgYXNwZWN0UmF0aW8sXG4gICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICBmcHMsXG4gICAgICAgICAgc2VlZCxcbiAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHByb3ZpZGVyT3B0aW9ucyAhPSBudWxsID8gcHJvdmlkZXJPcHRpb25zIDoge30sXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1dpdGhVc2VyQWdlbnQsXG4gICAgICAgICAgYWJvcnRTaWduYWxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApXG4gICk7XG4gIGNvbnN0IHZpZGVvcyA9IFtdO1xuICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuICBjb25zdCByZXNwb25zZXMgPSBbXTtcbiAgY29uc3QgcHJvdmlkZXJNZXRhZGF0YSA9IHt9O1xuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgZm9yIChjb25zdCB2aWRlb0RhdGEgb2YgcmVzdWx0LnZpZGVvcykge1xuICAgICAgc3dpdGNoICh2aWRlb0RhdGEudHlwZSkge1xuICAgICAgICBjYXNlIFwidXJsXCI6IHtcbiAgICAgICAgICBjb25zdCB7IGRhdGEsIG1lZGlhVHlwZTogZG93bmxvYWRlZE1lZGlhVHlwZSB9ID0gYXdhaXQgZG93bmxvYWRGbih7XG4gICAgICAgICAgICB1cmw6IG5ldyBVUkwodmlkZW9EYXRhLnVybCksXG4gICAgICAgICAgICBhYm9ydFNpZ25hbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGlzVXNhYmxlTWVkaWFUeXBlID0gKHR5cGUpID0+ICEhdHlwZSAmJiB0eXBlICE9PSBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiO1xuICAgICAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IGlzVXNhYmxlTWVkaWFUeXBlKHZpZGVvRGF0YS5tZWRpYVR5cGUpICYmIHZpZGVvRGF0YS5tZWRpYVR5cGUgfHwgaXNVc2FibGVNZWRpYVR5cGUoZG93bmxvYWRlZE1lZGlhVHlwZSkgJiYgZG93bmxvYWRlZE1lZGlhVHlwZSB8fCBkZXRlY3RNZWRpYVR5cGUoe1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHNpZ25hdHVyZXM6IHZpZGVvTWVkaWFUeXBlU2lnbmF0dXJlc1xuICAgICAgICAgIH0pIHx8IFwidmlkZW8vbXA0XCI7XG4gICAgICAgICAgdmlkZW9zLnB1c2goXG4gICAgICAgICAgICBuZXcgRGVmYXVsdEdlbmVyYXRlZEZpbGUoe1xuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBtZWRpYVR5cGVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYmFzZTY0XCI6IHtcbiAgICAgICAgICB2aWRlb3MucHVzaChcbiAgICAgICAgICAgIG5ldyBEZWZhdWx0R2VuZXJhdGVkRmlsZSh7XG4gICAgICAgICAgICAgIGRhdGE6IHZpZGVvRGF0YS5kYXRhLFxuICAgICAgICAgICAgICBtZWRpYVR5cGU6IHZpZGVvRGF0YS5tZWRpYVR5cGUgfHwgXCJ2aWRlby9tcDRcIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJiaW5hcnlcIjoge1xuICAgICAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHZpZGVvRGF0YS5tZWRpYVR5cGUgfHwgZGV0ZWN0TWVkaWFUeXBlKHtcbiAgICAgICAgICAgIGRhdGE6IHZpZGVvRGF0YS5kYXRhLFxuICAgICAgICAgICAgc2lnbmF0dXJlczogdmlkZW9NZWRpYVR5cGVTaWduYXR1cmVzXG4gICAgICAgICAgfSkgfHwgXCJ2aWRlby9tcDRcIjtcbiAgICAgICAgICB2aWRlb3MucHVzaChcbiAgICAgICAgICAgIG5ldyBEZWZhdWx0R2VuZXJhdGVkRmlsZSh7XG4gICAgICAgICAgICAgIGRhdGE6IHZpZGVvRGF0YS5kYXRhLFxuICAgICAgICAgICAgICBtZWRpYVR5cGVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB3YXJuaW5ncy5wdXNoKC4uLnJlc3VsdC53YXJuaW5ncyk7XG4gICAgcmVzcG9uc2VzLnB1c2goe1xuICAgICAgdGltZXN0YW1wOiByZXN1bHQucmVzcG9uc2UudGltZXN0YW1wLFxuICAgICAgbW9kZWxJZDogcmVzdWx0LnJlc3BvbnNlLm1vZGVsSWQsXG4gICAgICBoZWFkZXJzOiByZXN1bHQucmVzcG9uc2UuaGVhZGVycyxcbiAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHJlc3VsdC5wcm92aWRlck1ldGFkYXRhXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5wcm92aWRlck1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb3ZpZGVyTmFtZSwgbWV0YWRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICByZXN1bHQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgKSkge1xuICAgICAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gcHJvdmlkZXJNZXRhZGF0YVtwcm92aWRlck5hbWVdO1xuICAgICAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSAhPSBudWxsICYmIHR5cGVvZiBleGlzdGluZ01ldGFkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YVtwcm92aWRlck5hbWVdID0ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm1ldGFkYXRhXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoXCJ2aWRlb3NcIiBpbiBleGlzdGluZ01ldGFkYXRhICYmIEFycmF5LmlzQXJyYXkoZXhpc3RpbmdNZXRhZGF0YS52aWRlb3MpICYmIFwidmlkZW9zXCIgaW4gbWV0YWRhdGEgJiYgQXJyYXkuaXNBcnJheShtZXRhZGF0YS52aWRlb3MpKSB7XG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhW3Byb3ZpZGVyTmFtZV0udmlkZW9zID0gW1xuICAgICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLnZpZGVvcyxcbiAgICAgICAgICAgICAgLi4ubWV0YWRhdGEudmlkZW9zXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm92aWRlck1ldGFkYXRhW3Byb3ZpZGVyTmFtZV0gPSBtZXRhZGF0YTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAodmlkZW9zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBOb1ZpZGVvR2VuZXJhdGVkRXJyb3IoeyByZXNwb25zZXMgfSk7XG4gIH1cbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBsb2dXYXJuaW5ncyh7XG4gICAgICB3YXJuaW5ncyxcbiAgICAgIHByb3ZpZGVyOiBtb2RlbC5wcm92aWRlcixcbiAgICAgIG1vZGVsOiBtb2RlbC5tb2RlbElkXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2aWRlbzogdmlkZW9zWzBdLFxuICAgIHZpZGVvcyxcbiAgICB3YXJuaW5ncyxcbiAgICByZXNwb25zZXMsXG4gICAgcHJvdmlkZXJNZXRhZGF0YVxuICB9O1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUHJvbXB0Mihwcm9tcHRBcmcpIHtcbiAgdmFyIF9hMjEsIF9iO1xuICBpZiAodHlwZW9mIHByb21wdEFyZyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9tcHQ6IHByb21wdEFyZyxcbiAgICAgIGltYWdlOiB2b2lkIDBcbiAgICB9O1xuICB9XG4gIGxldCBpbWFnZTtcbiAgaWYgKHByb21wdEFyZy5pbWFnZSAhPSBudWxsKSB7XG4gICAgY29uc3QgZGF0YUNvbnRlbnQgPSBwcm9tcHRBcmcuaW1hZ2U7XG4gICAgaWYgKHR5cGVvZiBkYXRhQ29udGVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKGRhdGFDb250ZW50LnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpIHx8IGRhdGFDb250ZW50LnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xuICAgICAgICBpbWFnZSA9IHtcbiAgICAgICAgICB0eXBlOiBcInVybFwiLFxuICAgICAgICAgIHVybDogZGF0YUNvbnRlbnRcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YUNvbnRlbnQuc3RhcnRzV2l0aChcImRhdGE6XCIpKSB7XG4gICAgICAgIGNvbnN0IHsgbWVkaWFUeXBlLCBiYXNlNjRDb250ZW50IH0gPSBzcGxpdERhdGFVcmwoZGF0YUNvbnRlbnQpO1xuICAgICAgICBpbWFnZSA9IHtcbiAgICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgICBtZWRpYVR5cGU6IG1lZGlhVHlwZSAhPSBudWxsID8gbWVkaWFUeXBlIDogXCJpbWFnZS9wbmdcIixcbiAgICAgICAgICBkYXRhOiBjb252ZXJ0QmFzZTY0VG9VaW50OEFycmF5NShiYXNlNjRDb250ZW50ICE9IG51bGwgPyBiYXNlNjRDb250ZW50IDogXCJcIilcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gY29udmVydEJhc2U2NFRvVWludDhBcnJheTUoZGF0YUNvbnRlbnQpO1xuICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSAoX2EyMSA9IGRldGVjdE1lZGlhVHlwZSh7XG4gICAgICAgICAgZGF0YTogYnl0ZXMsXG4gICAgICAgICAgc2lnbmF0dXJlczogaW1hZ2VNZWRpYVR5cGVTaWduYXR1cmVzXG4gICAgICAgIH0pKSAhPSBudWxsID8gX2EyMSA6IFwiaW1hZ2UvcG5nXCI7XG4gICAgICAgIGltYWdlID0ge1xuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgICBkYXRhOiBieXRlc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YUNvbnRlbnQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICBjb25zdCBtZWRpYVR5cGUgPSAoX2IgPSBkZXRlY3RNZWRpYVR5cGUoe1xuICAgICAgICBkYXRhOiBkYXRhQ29udGVudCxcbiAgICAgICAgc2lnbmF0dXJlczogaW1hZ2VNZWRpYVR5cGVTaWduYXR1cmVzXG4gICAgICB9KSkgIT0gbnVsbCA/IF9iIDogXCJpbWFnZS9wbmdcIjtcbiAgICAgIGltYWdlID0ge1xuICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBkYXRhOiBkYXRhQ29udGVudFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcm9tcHQ6IHByb21wdEFyZy50ZXh0LFxuICAgIGltYWdlXG4gIH07XG59XG5hc3luYyBmdW5jdGlvbiBpbnZva2VNb2RlbE1heFZpZGVvc1BlckNhbGwobW9kZWwpIHtcbiAgaWYgKHR5cGVvZiBtb2RlbC5tYXhWaWRlb3NQZXJDYWxsID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gYXdhaXQgbW9kZWwubWF4VmlkZW9zUGVyQ2FsbCh7IG1vZGVsSWQ6IG1vZGVsLm1vZGVsSWQgfSk7XG4gIH1cbiAgcmV0dXJuIG1vZGVsLm1heFZpZGVvc1BlckNhbGw7XG59XG5cbi8vIHNyYy9taWRkbGV3YXJlL2RlZmF1bHQtZW1iZWRkaW5nLXNldHRpbmdzLW1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGRlZmF1bHRFbWJlZGRpbmdTZXR0aW5nc01pZGRsZXdhcmUoe1xuICBzZXR0aW5nc1xufSkge1xuICByZXR1cm4ge1xuICAgIHNwZWNpZmljYXRpb25WZXJzaW9uOiBcInYzXCIsXG4gICAgdHJhbnNmb3JtUGFyYW1zOiBhc3luYyAoeyBwYXJhbXMgfSkgPT4ge1xuICAgICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhzZXR0aW5ncywgcGFyYW1zKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIHNyYy9taWRkbGV3YXJlL2RlZmF1bHQtc2V0dGluZ3MtbWlkZGxld2FyZS50c1xuZnVuY3Rpb24gZGVmYXVsdFNldHRpbmdzTWlkZGxld2FyZSh7XG4gIHNldHRpbmdzXG59KSB7XG4gIHJldHVybiB7XG4gICAgc3BlY2lmaWNhdGlvblZlcnNpb246IFwidjNcIixcbiAgICB0cmFuc2Zvcm1QYXJhbXM6IGFzeW5jICh7IHBhcmFtcyB9KSA9PiB7XG4gICAgICByZXR1cm4gbWVyZ2VPYmplY3RzKHNldHRpbmdzLCBwYXJhbXMpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gc3JjL21pZGRsZXdhcmUvZXh0cmFjdC1qc29uLW1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGRlZmF1bHRUcmFuc2Zvcm0odGV4dDIpIHtcbiAgcmV0dXJuIHRleHQyLnJlcGxhY2UoL15gYGAoPzpqc29uKT9cXHMqXFxuPy8sIFwiXCIpLnJlcGxhY2UoL1xcbj9gYGBcXHMqJC8sIFwiXCIpLnRyaW0oKTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RKc29uTWlkZGxld2FyZShvcHRpb25zKSB7XG4gIHZhciBfYTIxO1xuICBjb25zdCB0cmFuc2Zvcm0gPSAoX2EyMSA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMudHJhbnNmb3JtKSAhPSBudWxsID8gX2EyMSA6IGRlZmF1bHRUcmFuc2Zvcm07XG4gIGNvbnN0IGhhc0N1c3RvbVRyYW5zZm9ybSA9IChvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLnRyYW5zZm9ybSkgIT09IHZvaWQgMDtcbiAgcmV0dXJuIHtcbiAgICBzcGVjaWZpY2F0aW9uVmVyc2lvbjogXCJ2M1wiLFxuICAgIHdyYXBHZW5lcmF0ZTogYXN5bmMgKHsgZG9HZW5lcmF0ZSB9KSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRlbnQsIC4uLnJlc3QgfSA9IGF3YWl0IGRvR2VuZXJhdGUoKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkQ29udGVudCA9IFtdO1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGNvbnRlbnQpIHtcbiAgICAgICAgaWYgKHBhcnQudHlwZSAhPT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICB0cmFuc2Zvcm1lZENvbnRlbnQucHVzaChwYXJ0KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0cmFuc2Zvcm1lZENvbnRlbnQucHVzaCh7XG4gICAgICAgICAgLi4ucGFydCxcbiAgICAgICAgICB0ZXh0OiB0cmFuc2Zvcm0ocGFydC50ZXh0KVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6IHRyYW5zZm9ybWVkQ29udGVudCwgLi4ucmVzdCB9O1xuICAgIH0sXG4gICAgd3JhcFN0cmVhbTogYXN5bmMgKHsgZG9TdHJlYW0gfSkgPT4ge1xuICAgICAgY29uc3QgeyBzdHJlYW0sIC4uLnJlc3QgfSA9IGF3YWl0IGRvU3RyZWFtKCk7XG4gICAgICBjb25zdCB0ZXh0QmxvY2tzID0ge307XG4gICAgICBjb25zdCBTVUZGSVhfQlVGRkVSX1NJWkUgPSAxMjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0cmVhbTogc3RyZWFtLnBpcGVUaHJvdWdoKFxuICAgICAgICAgIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiAoY2h1bmssIGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNodW5rLnR5cGUgPT09IFwidGV4dC1zdGFydFwiKSB7XG4gICAgICAgICAgICAgICAgdGV4dEJsb2Nrc1tjaHVuay5pZF0gPSB7XG4gICAgICAgICAgICAgICAgICBzdGFydEV2ZW50OiBjaHVuayxcbiAgICAgICAgICAgICAgICAgIC8vIEN1c3RvbSB0cmFuc2Zvcm1zIG5lZWQgdG8gYnVmZmVyIGFsbCBjb250ZW50XG4gICAgICAgICAgICAgICAgICBwaGFzZTogaGFzQ3VzdG9tVHJhbnNmb3JtID8gXCJidWZmZXJpbmdcIiA6IFwicHJlZml4XCIsXG4gICAgICAgICAgICAgICAgICBidWZmZXI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBwcmVmaXhTdHJpcHBlZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY2h1bmsudHlwZSA9PT0gXCJ0ZXh0LWRlbHRhXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9jayA9IHRleHRCbG9ja3NbY2h1bmsuaWRdO1xuICAgICAgICAgICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJsb2NrLmJ1ZmZlciArPSBjaHVuay5kZWx0YTtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2sucGhhc2UgPT09IFwiYnVmZmVyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrLnBoYXNlID09PSBcInByZWZpeFwiKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoYmxvY2suYnVmZmVyLmxlbmd0aCA+IDAgJiYgIWJsb2NrLmJ1ZmZlci5zdGFydHNXaXRoKFwiYFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBibG9jay5waGFzZSA9IFwic3RyZWFtaW5nXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShibG9jay5zdGFydEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmxvY2suYnVmZmVyLnN0YXJ0c1dpdGgoXCJgYGBcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrLmJ1ZmZlci5pbmNsdWRlcyhcIlxcblwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZpeE1hdGNoID0gYmxvY2suYnVmZmVyLm1hdGNoKC9eYGBgKD86anNvbik/XFxzKlxcbi8pO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXhNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suYnVmZmVyID0gYmxvY2suYnVmZmVyLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhNYXRjaFswXS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jay5wcmVmaXhTdHJpcHBlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jay5waGFzZSA9IFwic3RyZWFtaW5nXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYmxvY2suc3RhcnRFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLnBoYXNlID0gXCJzdHJlYW1pbmdcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShibG9jay5zdGFydEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmxvY2suYnVmZmVyLmxlbmd0aCA+PSAzICYmICFibG9jay5idWZmZXIuc3RhcnRzV2l0aChcImBgYFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBibG9jay5waGFzZSA9IFwic3RyZWFtaW5nXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShibG9jay5zdGFydEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrLnBoYXNlID09PSBcInN0cmVhbWluZ1wiICYmIGJsb2NrLmJ1ZmZlci5sZW5ndGggPiBTVUZGSVhfQlVGRkVSX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHRvU3RyZWFtID0gYmxvY2suYnVmZmVyLnNsaWNlKDAsIC1TVUZGSVhfQlVGRkVSX1NJWkUpO1xuICAgICAgICAgICAgICAgICAgYmxvY2suYnVmZmVyID0gYmxvY2suYnVmZmVyLnNsaWNlKC1TVUZGSVhfQlVGRkVSX1NJWkUpO1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBjaHVuay5pZCxcbiAgICAgICAgICAgICAgICAgICAgZGVsdGE6IHRvU3RyZWFtXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjaHVuay50eXBlID09PSBcInRleHQtZW5kXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9jayA9IHRleHRCbG9ja3NbY2h1bmsuaWRdO1xuICAgICAgICAgICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrLnBoYXNlID09PSBcInByZWZpeFwiIHx8IGJsb2NrLnBoYXNlID09PSBcImJ1ZmZlcmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShibG9jay5zdGFydEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGxldCByZW1haW5pbmcgPSBibG9jay5idWZmZXI7XG4gICAgICAgICAgICAgICAgICBpZiAoYmxvY2sucGhhc2UgPT09IFwiYnVmZmVyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nID0gdHJhbnNmb3JtKHJlbWFpbmluZyk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJsb2NrLnByZWZpeFN0cmlwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5yZXBsYWNlKC9cXG4/YGBgXFxzKiQvLCBcIlwiKS50cmltRW5kKCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSB0cmFuc2Zvcm0ocmVtYWluaW5nKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGlkOiBjaHVuay5pZCxcbiAgICAgICAgICAgICAgICAgICAgICBkZWx0YTogcmVtYWluaW5nXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0ZXh0QmxvY2tzW2NodW5rLmlkXTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgICAuLi5yZXN0XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cblxuLy8gc3JjL3V0aWwvZ2V0LXBvdGVudGlhbC1zdGFydC1pbmRleC50c1xuZnVuY3Rpb24gZ2V0UG90ZW50aWFsU3RhcnRJbmRleCh0ZXh0Miwgc2VhcmNoZWRUZXh0KSB7XG4gIGlmIChzZWFyY2hlZFRleHQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgZGlyZWN0SW5kZXggPSB0ZXh0Mi5pbmRleE9mKHNlYXJjaGVkVGV4dCk7XG4gIGlmIChkaXJlY3RJbmRleCAhPT0gLTEpIHtcbiAgICByZXR1cm4gZGlyZWN0SW5kZXg7XG4gIH1cbiAgZm9yIChsZXQgaSA9IHRleHQyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gdGV4dDIuc3Vic3RyaW5nKGkpO1xuICAgIGlmIChzZWFyY2hlZFRleHQuc3RhcnRzV2l0aChzdWZmaXgpKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIHNyYy9taWRkbGV3YXJlL2V4dHJhY3QtcmVhc29uaW5nLW1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGV4dHJhY3RSZWFzb25pbmdNaWRkbGV3YXJlKHtcbiAgdGFnTmFtZSxcbiAgc2VwYXJhdG9yID0gXCJcXG5cIixcbiAgc3RhcnRXaXRoUmVhc29uaW5nID0gZmFsc2Vcbn0pIHtcbiAgY29uc3Qgb3BlbmluZ1RhZyA9IGA8JHt0YWdOYW1lfT5gO1xuICBjb25zdCBjbG9zaW5nVGFnID0gYDwvJHt0YWdOYW1lfT5gO1xuICByZXR1cm4ge1xuICAgIHNwZWNpZmljYXRpb25WZXJzaW9uOiBcInYzXCIsXG4gICAgd3JhcEdlbmVyYXRlOiBhc3luYyAoeyBkb0dlbmVyYXRlIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGVudCwgLi4ucmVzdCB9ID0gYXdhaXQgZG9HZW5lcmF0ZSgpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb250ZW50ID0gW107XG4gICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgY29udGVudCkge1xuICAgICAgICBpZiAocGFydC50eXBlICE9PSBcInRleHRcIikge1xuICAgICAgICAgIHRyYW5zZm9ybWVkQ29udGVudC5wdXNoKHBhcnQpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleHQyID0gc3RhcnRXaXRoUmVhc29uaW5nID8gb3BlbmluZ1RhZyArIHBhcnQudGV4dCA6IHBhcnQudGV4dDtcbiAgICAgICAgY29uc3QgcmVnZXhwID0gbmV3IFJlZ0V4cChgJHtvcGVuaW5nVGFnfSguKj8pJHtjbG9zaW5nVGFnfWAsIFwiZ3NcIik7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBBcnJheS5mcm9tKHRleHQyLm1hdGNoQWxsKHJlZ2V4cCkpO1xuICAgICAgICBpZiAoIW1hdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdHJhbnNmb3JtZWRDb250ZW50LnB1c2gocGFydCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVhc29uaW5nVGV4dCA9IG1hdGNoZXMubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0pLmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgICAgbGV0IHRleHRXaXRob3V0UmVhc29uaW5nID0gdGV4dDI7XG4gICAgICAgIGZvciAobGV0IGkgPSBtYXRjaGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2ggPSBtYXRjaGVzW2ldO1xuICAgICAgICAgIGNvbnN0IGJlZm9yZU1hdGNoID0gdGV4dFdpdGhvdXRSZWFzb25pbmcuc2xpY2UoMCwgbWF0Y2guaW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGFmdGVyTWF0Y2ggPSB0ZXh0V2l0aG91dFJlYXNvbmluZy5zbGljZShcbiAgICAgICAgICAgIG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0ZXh0V2l0aG91dFJlYXNvbmluZyA9IGJlZm9yZU1hdGNoICsgKGJlZm9yZU1hdGNoLmxlbmd0aCA+IDAgJiYgYWZ0ZXJNYXRjaC5sZW5ndGggPiAwID8gc2VwYXJhdG9yIDogXCJcIikgKyBhZnRlck1hdGNoO1xuICAgICAgICB9XG4gICAgICAgIHRyYW5zZm9ybWVkQ29udGVudC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZ1wiLFxuICAgICAgICAgIHRleHQ6IHJlYXNvbmluZ1RleHRcbiAgICAgICAgfSk7XG4gICAgICAgIHRyYW5zZm9ybWVkQ29udGVudC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiB0ZXh0V2l0aG91dFJlYXNvbmluZ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6IHRyYW5zZm9ybWVkQ29udGVudCwgLi4ucmVzdCB9O1xuICAgIH0sXG4gICAgd3JhcFN0cmVhbTogYXN5bmMgKHsgZG9TdHJlYW0gfSkgPT4ge1xuICAgICAgY29uc3QgeyBzdHJlYW0sIC4uLnJlc3QgfSA9IGF3YWl0IGRvU3RyZWFtKCk7XG4gICAgICBjb25zdCByZWFzb25pbmdFeHRyYWN0aW9ucyA9IHt9O1xuICAgICAgbGV0IGRlbGF5ZWRUZXh0U3RhcnQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHJlYW06IHN0cmVhbS5waXBlVGhyb3VnaChcbiAgICAgICAgICBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogKGNodW5rLCBjb250cm9sbGVyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjaHVuay50eXBlID09PSBcInRleHQtc3RhcnRcIikge1xuICAgICAgICAgICAgICAgIGRlbGF5ZWRUZXh0U3RhcnQgPSBjaHVuaztcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNodW5rLnR5cGUgPT09IFwidGV4dC1lbmRcIiAmJiBkZWxheWVkVGV4dFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGRlbGF5ZWRUZXh0U3RhcnQpO1xuICAgICAgICAgICAgICAgIGRlbGF5ZWRUZXh0U3RhcnQgPSB2b2lkIDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNodW5rLnR5cGUgIT09IFwidGV4dC1kZWx0YVwiKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlYXNvbmluZ0V4dHJhY3Rpb25zW2NodW5rLmlkXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVhc29uaW5nRXh0cmFjdGlvbnNbY2h1bmsuaWRdID0ge1xuICAgICAgICAgICAgICAgICAgaXNGaXJzdFJlYXNvbmluZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGlzRmlyc3RUZXh0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgYWZ0ZXJTd2l0Y2g6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgaXNSZWFzb25pbmc6IHN0YXJ0V2l0aFJlYXNvbmluZyxcbiAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogXCJcIixcbiAgICAgICAgICAgICAgICAgIGlkQ291bnRlcjogMCxcbiAgICAgICAgICAgICAgICAgIHRleHRJZDogY2h1bmsuaWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUV4dHJhY3Rpb24gPSByZWFzb25pbmdFeHRyYWN0aW9uc1tjaHVuay5pZF07XG4gICAgICAgICAgICAgIGFjdGl2ZUV4dHJhY3Rpb24uYnVmZmVyICs9IGNodW5rLmRlbHRhO1xuICAgICAgICAgICAgICBmdW5jdGlvbiBwdWJsaXNoKHRleHQyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRleHQyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGFjdGl2ZUV4dHJhY3Rpb24uYWZ0ZXJTd2l0Y2ggJiYgKGFjdGl2ZUV4dHJhY3Rpb24uaXNSZWFzb25pbmcgPyAhYWN0aXZlRXh0cmFjdGlvbi5pc0ZpcnN0UmVhc29uaW5nIDogIWFjdGl2ZUV4dHJhY3Rpb24uaXNGaXJzdFRleHQpID8gc2VwYXJhdG9yIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVFeHRyYWN0aW9uLmlzUmVhc29uaW5nICYmIChhY3RpdmVFeHRyYWN0aW9uLmFmdGVyU3dpdGNoIHx8IGFjdGl2ZUV4dHJhY3Rpb24uaXNGaXJzdFJlYXNvbmluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZy1zdGFydFwiLFxuICAgICAgICAgICAgICAgICAgICAgIGlkOiBgcmVhc29uaW5nLSR7YWN0aXZlRXh0cmFjdGlvbi5pZENvdW50ZXJ9YFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVFeHRyYWN0aW9uLmlzUmVhc29uaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJyZWFzb25pbmctZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICBkZWx0YTogcHJlZml4ICsgdGV4dDIsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IGByZWFzb25pbmctJHthY3RpdmVFeHRyYWN0aW9uLmlkQ291bnRlcn1gXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGF5ZWRUZXh0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoZGVsYXllZFRleHRTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgZGVsYXllZFRleHRTdGFydCA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGRlbHRhOiBwcmVmaXggKyB0ZXh0MixcbiAgICAgICAgICAgICAgICAgICAgICBpZDogYWN0aXZlRXh0cmFjdGlvbi50ZXh0SWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBhY3RpdmVFeHRyYWN0aW9uLmFmdGVyU3dpdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlRXh0cmFjdGlvbi5pc1JlYXNvbmluZykge1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmVFeHRyYWN0aW9uLmlzRmlyc3RSZWFzb25pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUV4dHJhY3Rpb24uaXNGaXJzdFRleHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUYWcgPSBhY3RpdmVFeHRyYWN0aW9uLmlzUmVhc29uaW5nID8gY2xvc2luZ1RhZyA6IG9wZW5pbmdUYWc7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGdldFBvdGVudGlhbFN0YXJ0SW5kZXgoXG4gICAgICAgICAgICAgICAgICBhY3RpdmVFeHRyYWN0aW9uLmJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgIG5leHRUYWdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHB1Ymxpc2goYWN0aXZlRXh0cmFjdGlvbi5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgYWN0aXZlRXh0cmFjdGlvbi5idWZmZXIgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHB1Ymxpc2goYWN0aXZlRXh0cmFjdGlvbi5idWZmZXIuc2xpY2UoMCwgc3RhcnRJbmRleCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kRnVsbE1hdGNoID0gc3RhcnRJbmRleCArIG5leHRUYWcubGVuZ3RoIDw9IGFjdGl2ZUV4dHJhY3Rpb24uYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRGdWxsTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUV4dHJhY3Rpb24uYnVmZmVyID0gYWN0aXZlRXh0cmFjdGlvbi5idWZmZXIuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggKyBuZXh0VGFnLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVFeHRyYWN0aW9uLmlzUmVhc29uaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVFeHRyYWN0aW9uLmlzRmlyc3RSZWFzb25pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJyZWFzb25pbmctc3RhcnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBgcmVhc29uaW5nLSR7YWN0aXZlRXh0cmFjdGlvbi5pZENvdW50ZXJ9YFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJyZWFzb25pbmctZW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IGByZWFzb25pbmctJHthY3RpdmVFeHRyYWN0aW9uLmlkQ291bnRlcisrfWBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBhY3RpdmVFeHRyYWN0aW9uLmlzUmVhc29uaW5nID0gIWFjdGl2ZUV4dHJhY3Rpb24uaXNSZWFzb25pbmc7XG4gICAgICAgICAgICAgICAgICBhY3RpdmVFeHRyYWN0aW9uLmFmdGVyU3dpdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgYWN0aXZlRXh0cmFjdGlvbi5idWZmZXIgPSBhY3RpdmVFeHRyYWN0aW9uLmJ1ZmZlci5zbGljZShzdGFydEluZGV4KTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgLi4ucmVzdFxuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG5cbi8vIHNyYy9taWRkbGV3YXJlL3NpbXVsYXRlLXN0cmVhbWluZy1taWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBzaW11bGF0ZVN0cmVhbWluZ01pZGRsZXdhcmUoKSB7XG4gIHJldHVybiB7XG4gICAgc3BlY2lmaWNhdGlvblZlcnNpb246IFwidjNcIixcbiAgICB3cmFwU3RyZWFtOiBhc3luYyAoeyBkb0dlbmVyYXRlIH0pID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRvR2VuZXJhdGUoKTtcbiAgICAgIGxldCBpZCA9IDA7XG4gICAgICBjb25zdCBzaW11bGF0ZWRTdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyZWFtLXN0YXJ0XCIsXG4gICAgICAgICAgICB3YXJuaW5nczogcmVzdWx0Lndhcm5pbmdzXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJyZXNwb25zZS1tZXRhZGF0YVwiLCAuLi5yZXN1bHQucmVzcG9uc2UgfSk7XG4gICAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHJlc3VsdC5jb250ZW50KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhcnQudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcInRleHQtc3RhcnRcIiwgaWQ6IFN0cmluZyhpZCkgfSk7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRleHQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFN0cmluZyhpZCksXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhOiBwYXJ0LnRleHRcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJ0ZXh0LWVuZFwiLCBpZDogU3RyaW5nKGlkKSB9KTtcbiAgICAgICAgICAgICAgICAgIGlkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJyZWFzb25pbmdcIjoge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZy1zdGFydFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IFN0cmluZyhpZCksXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBwYXJ0LnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJyZWFzb25pbmctZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgIGlkOiBTdHJpbmcoaWQpLFxuICAgICAgICAgICAgICAgICAgZGVsdGE6IHBhcnQudGV4dFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwicmVhc29uaW5nLWVuZFwiLCBpZDogU3RyaW5nKGlkKSB9KTtcbiAgICAgICAgICAgICAgICBpZCsrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUocGFydCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgIHR5cGU6IFwiZmluaXNoXCIsXG4gICAgICAgICAgICBmaW5pc2hSZWFzb246IHJlc3VsdC5maW5pc2hSZWFzb24sXG4gICAgICAgICAgICB1c2FnZTogcmVzdWx0LnVzYWdlLFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogcmVzdWx0LnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RyZWFtOiBzaW11bGF0ZWRTdHJlYW0sXG4gICAgICAgIHJlcXVlc3Q6IHJlc3VsdC5yZXF1ZXN0LFxuICAgICAgICByZXNwb25zZTogcmVzdWx0LnJlc3BvbnNlXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cblxuLy8gc3JjL21pZGRsZXdhcmUvYWRkLXRvb2wtaW5wdXQtZXhhbXBsZXMtbWlkZGxld2FyZS50c1xuZnVuY3Rpb24gZGVmYXVsdEZvcm1hdEV4YW1wbGUoZXhhbXBsZSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXhhbXBsZS5pbnB1dCk7XG59XG5mdW5jdGlvbiBhZGRUb29sSW5wdXRFeGFtcGxlc01pZGRsZXdhcmUoe1xuICBwcmVmaXggPSBcIklucHV0IEV4YW1wbGVzOlwiLFxuICBmb3JtYXQgPSBkZWZhdWx0Rm9ybWF0RXhhbXBsZSxcbiAgcmVtb3ZlID0gdHJ1ZVxufSA9IHt9KSB7XG4gIHJldHVybiB7XG4gICAgc3BlY2lmaWNhdGlvblZlcnNpb246IFwidjNcIixcbiAgICB0cmFuc2Zvcm1QYXJhbXM6IGFzeW5jICh7IHBhcmFtcyB9KSA9PiB7XG4gICAgICB2YXIgX2EyMTtcbiAgICAgIGlmICghKChfYTIxID0gcGFyYW1zLnRvb2xzKSA9PSBudWxsID8gdm9pZCAwIDogX2EyMS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICB9XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZFRvb2xzID0gcGFyYW1zLnRvb2xzLm1hcCgodG9vbDIpID0+IHtcbiAgICAgICAgdmFyIF9hMjI7XG4gICAgICAgIGlmICh0b29sMi50eXBlICE9PSBcImZ1bmN0aW9uXCIgfHwgISgoX2EyMiA9IHRvb2wyLmlucHV0RXhhbXBsZXMpID09IG51bGwgPyB2b2lkIDAgOiBfYTIyLmxlbmd0aCkpIHtcbiAgICAgICAgICByZXR1cm4gdG9vbDI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybWF0dGVkRXhhbXBsZXMgPSB0b29sMi5pbnB1dEV4YW1wbGVzLm1hcCgoZXhhbXBsZSwgaW5kZXgpID0+IGZvcm1hdChleGFtcGxlLCBpbmRleCkpLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIGNvbnN0IGV4YW1wbGVzU2VjdGlvbiA9IGAke3ByZWZpeH1cbiR7Zm9ybWF0dGVkRXhhbXBsZXN9YDtcbiAgICAgICAgY29uc3QgdG9vbERlc2NyaXB0aW9uID0gdG9vbDIuZGVzY3JpcHRpb24gPyBgJHt0b29sMi5kZXNjcmlwdGlvbn1cblxuJHtleGFtcGxlc1NlY3Rpb259YCA6IGV4YW1wbGVzU2VjdGlvbjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi50b29sMixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdG9vbERlc2NyaXB0aW9uLFxuICAgICAgICAgIGlucHV0RXhhbXBsZXM6IHJlbW92ZSA/IHZvaWQgMCA6IHRvb2wyLmlucHV0RXhhbXBsZXNcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB0b29sczogdHJhbnNmb3JtZWRUb29sc1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG5cbi8vIHNyYy9taWRkbGV3YXJlL3dyYXAtbGFuZ3VhZ2UtbW9kZWwudHNcbnZhciB3cmFwTGFuZ3VhZ2VNb2RlbCA9ICh7XG4gIG1vZGVsLFxuICBtaWRkbGV3YXJlOiBtaWRkbGV3YXJlQXJnLFxuICBtb2RlbElkLFxuICBwcm92aWRlcklkXG59KSA9PiB7XG4gIHJldHVybiBbLi4uYXNBcnJheShtaWRkbGV3YXJlQXJnKV0ucmV2ZXJzZSgpLnJlZHVjZSgod3JhcHBlZE1vZGVsLCBtaWRkbGV3YXJlKSA9PiB7XG4gICAgcmV0dXJuIGRvV3JhcCh7IG1vZGVsOiB3cmFwcGVkTW9kZWwsIG1pZGRsZXdhcmUsIG1vZGVsSWQsIHByb3ZpZGVySWQgfSk7XG4gIH0sIG1vZGVsKTtcbn07XG52YXIgZG9XcmFwID0gKHtcbiAgbW9kZWwsXG4gIG1pZGRsZXdhcmU6IHtcbiAgICB0cmFuc2Zvcm1QYXJhbXMsXG4gICAgd3JhcEdlbmVyYXRlLFxuICAgIHdyYXBTdHJlYW0sXG4gICAgb3ZlcnJpZGVQcm92aWRlcixcbiAgICBvdmVycmlkZU1vZGVsSWQsXG4gICAgb3ZlcnJpZGVTdXBwb3J0ZWRVcmxzXG4gIH0sXG4gIG1vZGVsSWQsXG4gIHByb3ZpZGVySWRcbn0pID0+IHtcbiAgdmFyIF9hMjEsIF9iLCBfYztcbiAgYXN5bmMgZnVuY3Rpb24gZG9UcmFuc2Zvcm0oe1xuICAgIHBhcmFtcyxcbiAgICB0eXBlXG4gIH0pIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtUGFyYW1zID8gYXdhaXQgdHJhbnNmb3JtUGFyYW1zKHsgcGFyYW1zLCB0eXBlLCBtb2RlbCB9KSA6IHBhcmFtcztcbiAgfVxuICByZXR1cm4ge1xuICAgIHNwZWNpZmljYXRpb25WZXJzaW9uOiBcInYzXCIsXG4gICAgcHJvdmlkZXI6IChfYTIxID0gcHJvdmlkZXJJZCAhPSBudWxsID8gcHJvdmlkZXJJZCA6IG92ZXJyaWRlUHJvdmlkZXIgPT0gbnVsbCA/IHZvaWQgMCA6IG92ZXJyaWRlUHJvdmlkZXIoeyBtb2RlbCB9KSkgIT0gbnVsbCA/IF9hMjEgOiBtb2RlbC5wcm92aWRlcixcbiAgICBtb2RlbElkOiAoX2IgPSBtb2RlbElkICE9IG51bGwgPyBtb2RlbElkIDogb3ZlcnJpZGVNb2RlbElkID09IG51bGwgPyB2b2lkIDAgOiBvdmVycmlkZU1vZGVsSWQoeyBtb2RlbCB9KSkgIT0gbnVsbCA/IF9iIDogbW9kZWwubW9kZWxJZCxcbiAgICBzdXBwb3J0ZWRVcmxzOiAoX2MgPSBvdmVycmlkZVN1cHBvcnRlZFVybHMgPT0gbnVsbCA/IHZvaWQgMCA6IG92ZXJyaWRlU3VwcG9ydGVkVXJscyh7IG1vZGVsIH0pKSAhPSBudWxsID8gX2MgOiBtb2RlbC5zdXBwb3J0ZWRVcmxzLFxuICAgIGFzeW5jIGRvR2VuZXJhdGUocGFyYW1zKSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZFBhcmFtcyA9IGF3YWl0IGRvVHJhbnNmb3JtKHsgcGFyYW1zLCB0eXBlOiBcImdlbmVyYXRlXCIgfSk7XG4gICAgICBjb25zdCBkb0dlbmVyYXRlID0gYXN5bmMgKCkgPT4gbW9kZWwuZG9HZW5lcmF0ZSh0cmFuc2Zvcm1lZFBhcmFtcyk7XG4gICAgICBjb25zdCBkb1N0cmVhbSA9IGFzeW5jICgpID0+IG1vZGVsLmRvU3RyZWFtKHRyYW5zZm9ybWVkUGFyYW1zKTtcbiAgICAgIHJldHVybiB3cmFwR2VuZXJhdGUgPyB3cmFwR2VuZXJhdGUoe1xuICAgICAgICBkb0dlbmVyYXRlLFxuICAgICAgICBkb1N0cmVhbSxcbiAgICAgICAgcGFyYW1zOiB0cmFuc2Zvcm1lZFBhcmFtcyxcbiAgICAgICAgbW9kZWxcbiAgICAgIH0pIDogZG9HZW5lcmF0ZSgpO1xuICAgIH0sXG4gICAgYXN5bmMgZG9TdHJlYW0ocGFyYW1zKSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZFBhcmFtcyA9IGF3YWl0IGRvVHJhbnNmb3JtKHsgcGFyYW1zLCB0eXBlOiBcInN0cmVhbVwiIH0pO1xuICAgICAgY29uc3QgZG9HZW5lcmF0ZSA9IGFzeW5jICgpID0+IG1vZGVsLmRvR2VuZXJhdGUodHJhbnNmb3JtZWRQYXJhbXMpO1xuICAgICAgY29uc3QgZG9TdHJlYW0gPSBhc3luYyAoKSA9PiBtb2RlbC5kb1N0cmVhbSh0cmFuc2Zvcm1lZFBhcmFtcyk7XG4gICAgICByZXR1cm4gd3JhcFN0cmVhbSA/IHdyYXBTdHJlYW0oeyBkb0dlbmVyYXRlLCBkb1N0cmVhbSwgcGFyYW1zOiB0cmFuc2Zvcm1lZFBhcmFtcywgbW9kZWwgfSkgOiBkb1N0cmVhbSgpO1xuICAgIH1cbiAgfTtcbn07XG5cbi8vIHNyYy9taWRkbGV3YXJlL3dyYXAtZW1iZWRkaW5nLW1vZGVsLnRzXG52YXIgd3JhcEVtYmVkZGluZ01vZGVsID0gKHtcbiAgbW9kZWwsXG4gIG1pZGRsZXdhcmU6IG1pZGRsZXdhcmVBcmcsXG4gIG1vZGVsSWQsXG4gIHByb3ZpZGVySWRcbn0pID0+IHtcbiAgcmV0dXJuIFsuLi5hc0FycmF5KG1pZGRsZXdhcmVBcmcpXS5yZXZlcnNlKCkucmVkdWNlKCh3cmFwcGVkTW9kZWwsIG1pZGRsZXdhcmUpID0+IHtcbiAgICByZXR1cm4gZG9XcmFwMih7IG1vZGVsOiB3cmFwcGVkTW9kZWwsIG1pZGRsZXdhcmUsIG1vZGVsSWQsIHByb3ZpZGVySWQgfSk7XG4gIH0sIG1vZGVsKTtcbn07XG52YXIgZG9XcmFwMiA9ICh7XG4gIG1vZGVsLFxuICBtaWRkbGV3YXJlOiB7XG4gICAgdHJhbnNmb3JtUGFyYW1zLFxuICAgIHdyYXBFbWJlZCxcbiAgICBvdmVycmlkZVByb3ZpZGVyLFxuICAgIG92ZXJyaWRlTW9kZWxJZCxcbiAgICBvdmVycmlkZU1heEVtYmVkZGluZ3NQZXJDYWxsLFxuICAgIG92ZXJyaWRlU3VwcG9ydHNQYXJhbGxlbENhbGxzXG4gIH0sXG4gIG1vZGVsSWQsXG4gIHByb3ZpZGVySWRcbn0pID0+IHtcbiAgdmFyIF9hMjEsIF9iLCBfYywgX2Q7XG4gIGFzeW5jIGZ1bmN0aW9uIGRvVHJhbnNmb3JtKHtcbiAgICBwYXJhbXNcbiAgfSkge1xuICAgIHJldHVybiB0cmFuc2Zvcm1QYXJhbXMgPyBhd2FpdCB0cmFuc2Zvcm1QYXJhbXMoeyBwYXJhbXMsIG1vZGVsIH0pIDogcGFyYW1zO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3BlY2lmaWNhdGlvblZlcnNpb246IFwidjNcIixcbiAgICBwcm92aWRlcjogKF9hMjEgPSBwcm92aWRlcklkICE9IG51bGwgPyBwcm92aWRlcklkIDogb3ZlcnJpZGVQcm92aWRlciA9PSBudWxsID8gdm9pZCAwIDogb3ZlcnJpZGVQcm92aWRlcih7IG1vZGVsIH0pKSAhPSBudWxsID8gX2EyMSA6IG1vZGVsLnByb3ZpZGVyLFxuICAgIG1vZGVsSWQ6IChfYiA9IG1vZGVsSWQgIT0gbnVsbCA/IG1vZGVsSWQgOiBvdmVycmlkZU1vZGVsSWQgPT0gbnVsbCA/IHZvaWQgMCA6IG92ZXJyaWRlTW9kZWxJZCh7IG1vZGVsIH0pKSAhPSBudWxsID8gX2IgOiBtb2RlbC5tb2RlbElkLFxuICAgIG1heEVtYmVkZGluZ3NQZXJDYWxsOiAoX2MgPSBvdmVycmlkZU1heEVtYmVkZGluZ3NQZXJDYWxsID09IG51bGwgPyB2b2lkIDAgOiBvdmVycmlkZU1heEVtYmVkZGluZ3NQZXJDYWxsKHsgbW9kZWwgfSkpICE9IG51bGwgPyBfYyA6IG1vZGVsLm1heEVtYmVkZGluZ3NQZXJDYWxsLFxuICAgIHN1cHBvcnRzUGFyYWxsZWxDYWxsczogKF9kID0gb3ZlcnJpZGVTdXBwb3J0c1BhcmFsbGVsQ2FsbHMgPT0gbnVsbCA/IHZvaWQgMCA6IG92ZXJyaWRlU3VwcG9ydHNQYXJhbGxlbENhbGxzKHsgbW9kZWwgfSkpICE9IG51bGwgPyBfZCA6IG1vZGVsLnN1cHBvcnRzUGFyYWxsZWxDYWxscyxcbiAgICBhc3luYyBkb0VtYmVkKHBhcmFtcykge1xuICAgICAgY29uc3QgdHJhbnNmb3JtZWRQYXJhbXMgPSBhd2FpdCBkb1RyYW5zZm9ybSh7IHBhcmFtcyB9KTtcbiAgICAgIGNvbnN0IGRvRW1iZWQgPSBhc3luYyAoKSA9PiBtb2RlbC5kb0VtYmVkKHRyYW5zZm9ybWVkUGFyYW1zKTtcbiAgICAgIHJldHVybiB3cmFwRW1iZWQgPyB3cmFwRW1iZWQoe1xuICAgICAgICBkb0VtYmVkLFxuICAgICAgICBwYXJhbXM6IHRyYW5zZm9ybWVkUGFyYW1zLFxuICAgICAgICBtb2RlbFxuICAgICAgfSkgOiBkb0VtYmVkKCk7XG4gICAgfVxuICB9O1xufTtcblxuLy8gc3JjL21pZGRsZXdhcmUvd3JhcC1pbWFnZS1tb2RlbC50c1xudmFyIHdyYXBJbWFnZU1vZGVsID0gKHtcbiAgbW9kZWwsXG4gIG1pZGRsZXdhcmU6IG1pZGRsZXdhcmVBcmcsXG4gIG1vZGVsSWQsXG4gIHByb3ZpZGVySWRcbn0pID0+IHtcbiAgcmV0dXJuIFsuLi5hc0FycmF5KG1pZGRsZXdhcmVBcmcpXS5yZXZlcnNlKCkucmVkdWNlKCh3cmFwcGVkTW9kZWwsIG1pZGRsZXdhcmUpID0+IHtcbiAgICByZXR1cm4gZG9XcmFwMyh7IG1vZGVsOiB3cmFwcGVkTW9kZWwsIG1pZGRsZXdhcmUsIG1vZGVsSWQsIHByb3ZpZGVySWQgfSk7XG4gIH0sIG1vZGVsKTtcbn07XG52YXIgZG9XcmFwMyA9ICh7XG4gIG1vZGVsLFxuICBtaWRkbGV3YXJlOiB7XG4gICAgdHJhbnNmb3JtUGFyYW1zLFxuICAgIHdyYXBHZW5lcmF0ZSxcbiAgICBvdmVycmlkZVByb3ZpZGVyLFxuICAgIG92ZXJyaWRlTW9kZWxJZCxcbiAgICBvdmVycmlkZU1heEltYWdlc1BlckNhbGxcbiAgfSxcbiAgbW9kZWxJZCxcbiAgcHJvdmlkZXJJZFxufSkgPT4ge1xuICB2YXIgX2EyMSwgX2IsIF9jO1xuICBhc3luYyBmdW5jdGlvbiBkb1RyYW5zZm9ybSh7IHBhcmFtcyB9KSB7XG4gICAgcmV0dXJuIHRyYW5zZm9ybVBhcmFtcyA/IGF3YWl0IHRyYW5zZm9ybVBhcmFtcyh7IHBhcmFtcywgbW9kZWwgfSkgOiBwYXJhbXM7XG4gIH1cbiAgY29uc3QgbWF4SW1hZ2VzUGVyQ2FsbFJhdyA9IChfYTIxID0gb3ZlcnJpZGVNYXhJbWFnZXNQZXJDYWxsID09IG51bGwgPyB2b2lkIDAgOiBvdmVycmlkZU1heEltYWdlc1BlckNhbGwoeyBtb2RlbCB9KSkgIT0gbnVsbCA/IF9hMjEgOiBtb2RlbC5tYXhJbWFnZXNQZXJDYWxsO1xuICBjb25zdCBtYXhJbWFnZXNQZXJDYWxsID0gbWF4SW1hZ2VzUGVyQ2FsbFJhdyBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gbWF4SW1hZ2VzUGVyQ2FsbFJhdy5iaW5kKG1vZGVsKSA6IG1heEltYWdlc1BlckNhbGxSYXc7XG4gIHJldHVybiB7XG4gICAgc3BlY2lmaWNhdGlvblZlcnNpb246IFwidjNcIixcbiAgICBwcm92aWRlcjogKF9iID0gcHJvdmlkZXJJZCAhPSBudWxsID8gcHJvdmlkZXJJZCA6IG92ZXJyaWRlUHJvdmlkZXIgPT0gbnVsbCA/IHZvaWQgMCA6IG92ZXJyaWRlUHJvdmlkZXIoeyBtb2RlbCB9KSkgIT0gbnVsbCA/IF9iIDogbW9kZWwucHJvdmlkZXIsXG4gICAgbW9kZWxJZDogKF9jID0gbW9kZWxJZCAhPSBudWxsID8gbW9kZWxJZCA6IG92ZXJyaWRlTW9kZWxJZCA9PSBudWxsID8gdm9pZCAwIDogb3ZlcnJpZGVNb2RlbElkKHsgbW9kZWwgfSkpICE9IG51bGwgPyBfYyA6IG1vZGVsLm1vZGVsSWQsXG4gICAgbWF4SW1hZ2VzUGVyQ2FsbCxcbiAgICBhc3luYyBkb0dlbmVyYXRlKHBhcmFtcykge1xuICAgICAgY29uc3QgdHJhbnNmb3JtZWRQYXJhbXMgPSBhd2FpdCBkb1RyYW5zZm9ybSh7IHBhcmFtcyB9KTtcbiAgICAgIGNvbnN0IGRvR2VuZXJhdGUgPSBhc3luYyAoKSA9PiBtb2RlbC5kb0dlbmVyYXRlKHRyYW5zZm9ybWVkUGFyYW1zKTtcbiAgICAgIHJldHVybiB3cmFwR2VuZXJhdGUgPyB3cmFwR2VuZXJhdGUoe1xuICAgICAgICBkb0dlbmVyYXRlLFxuICAgICAgICBwYXJhbXM6IHRyYW5zZm9ybWVkUGFyYW1zLFxuICAgICAgICBtb2RlbFxuICAgICAgfSkgOiBkb0dlbmVyYXRlKCk7XG4gICAgfVxuICB9O1xufTtcblxuLy8gc3JjL21vZGVsL2FzLXByb3ZpZGVyLXYzLnRzXG5mdW5jdGlvbiBhc1Byb3ZpZGVyVjMocHJvdmlkZXIpIHtcbiAgaWYgKFwic3BlY2lmaWNhdGlvblZlcnNpb25cIiBpbiBwcm92aWRlciAmJiBwcm92aWRlci5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9PT0gXCJ2M1wiKSB7XG4gICAgcmV0dXJuIHByb3ZpZGVyO1xuICB9XG4gIGNvbnN0IHYyUHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgcmV0dXJuIHtcbiAgICBzcGVjaWZpY2F0aW9uVmVyc2lvbjogXCJ2M1wiLFxuICAgIGxhbmd1YWdlTW9kZWw6IChtb2RlbElkKSA9PiBhc0xhbmd1YWdlTW9kZWxWMyh2MlByb3ZpZGVyLmxhbmd1YWdlTW9kZWwobW9kZWxJZCkpLFxuICAgIGVtYmVkZGluZ01vZGVsOiAobW9kZWxJZCkgPT4gYXNFbWJlZGRpbmdNb2RlbFYzKHYyUHJvdmlkZXIudGV4dEVtYmVkZGluZ01vZGVsKG1vZGVsSWQpKSxcbiAgICBpbWFnZU1vZGVsOiAobW9kZWxJZCkgPT4gYXNJbWFnZU1vZGVsVjModjJQcm92aWRlci5pbWFnZU1vZGVsKG1vZGVsSWQpKSxcbiAgICB0cmFuc2NyaXB0aW9uTW9kZWw6IHYyUHJvdmlkZXIudHJhbnNjcmlwdGlvbk1vZGVsID8gKG1vZGVsSWQpID0+IGFzVHJhbnNjcmlwdGlvbk1vZGVsVjModjJQcm92aWRlci50cmFuc2NyaXB0aW9uTW9kZWwobW9kZWxJZCkpIDogdm9pZCAwLFxuICAgIHNwZWVjaE1vZGVsOiB2MlByb3ZpZGVyLnNwZWVjaE1vZGVsID8gKG1vZGVsSWQpID0+IGFzU3BlZWNoTW9kZWxWMyh2MlByb3ZpZGVyLnNwZWVjaE1vZGVsKG1vZGVsSWQpKSA6IHZvaWQgMCxcbiAgICByZXJhbmtpbmdNb2RlbDogdm9pZCAwXG4gICAgLy8gdjIgcHJvdmlkZXJzIGRvbid0IGhhdmUgcmVyYW5raW5nIG1vZGVsc1xuICB9O1xufVxuXG4vLyBzcmMvbWlkZGxld2FyZS93cmFwLXByb3ZpZGVyLnRzXG5mdW5jdGlvbiB3cmFwUHJvdmlkZXIoe1xuICBwcm92aWRlcixcbiAgbGFuZ3VhZ2VNb2RlbE1pZGRsZXdhcmUsXG4gIGltYWdlTW9kZWxNaWRkbGV3YXJlXG59KSB7XG4gIGNvbnN0IHByb3ZpZGVyVjMgPSBhc1Byb3ZpZGVyVjMocHJvdmlkZXIpO1xuICByZXR1cm4ge1xuICAgIHNwZWNpZmljYXRpb25WZXJzaW9uOiBcInYzXCIsXG4gICAgbGFuZ3VhZ2VNb2RlbDogKG1vZGVsSWQpID0+IHdyYXBMYW5ndWFnZU1vZGVsKHtcbiAgICAgIG1vZGVsOiBwcm92aWRlclYzLmxhbmd1YWdlTW9kZWwobW9kZWxJZCksXG4gICAgICBtaWRkbGV3YXJlOiBsYW5ndWFnZU1vZGVsTWlkZGxld2FyZVxuICAgIH0pLFxuICAgIGVtYmVkZGluZ01vZGVsOiBwcm92aWRlclYzLmVtYmVkZGluZ01vZGVsLFxuICAgIGltYWdlTW9kZWw6IChtb2RlbElkKSA9PiB7XG4gICAgICBsZXQgbW9kZWwgPSBwcm92aWRlclYzLmltYWdlTW9kZWwobW9kZWxJZCk7XG4gICAgICBpZiAoaW1hZ2VNb2RlbE1pZGRsZXdhcmUgIT0gbnVsbCkge1xuICAgICAgICBtb2RlbCA9IHdyYXBJbWFnZU1vZGVsKHsgbW9kZWwsIG1pZGRsZXdhcmU6IGltYWdlTW9kZWxNaWRkbGV3YXJlIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH0sXG4gICAgdHJhbnNjcmlwdGlvbk1vZGVsOiBwcm92aWRlclYzLnRyYW5zY3JpcHRpb25Nb2RlbCxcbiAgICBzcGVlY2hNb2RlbDogcHJvdmlkZXJWMy5zcGVlY2hNb2RlbCxcbiAgICByZXJhbmtpbmdNb2RlbDogcHJvdmlkZXJWMy5yZXJhbmtpbmdNb2RlbFxuICB9O1xufVxuXG4vLyBzcmMvcmVnaXN0cnkvY3VzdG9tLXByb3ZpZGVyLnRzXG5pbXBvcnQge1xuICBOb1N1Y2hNb2RlbEVycm9yIGFzIE5vU3VjaE1vZGVsRXJyb3IyXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5mdW5jdGlvbiBjdXN0b21Qcm92aWRlcih7XG4gIGxhbmd1YWdlTW9kZWxzLFxuICBlbWJlZGRpbmdNb2RlbHMsXG4gIGltYWdlTW9kZWxzLFxuICB0cmFuc2NyaXB0aW9uTW9kZWxzLFxuICBzcGVlY2hNb2RlbHMsXG4gIHJlcmFua2luZ01vZGVscyxcbiAgdmlkZW9Nb2RlbHMsXG4gIGZhbGxiYWNrUHJvdmlkZXI6IGZhbGxiYWNrUHJvdmlkZXJBcmdcbn0pIHtcbiAgY29uc3QgZmFsbGJhY2tQcm92aWRlciA9IGZhbGxiYWNrUHJvdmlkZXJBcmcgPyBhc1Byb3ZpZGVyVjMoZmFsbGJhY2tQcm92aWRlckFyZykgOiB2b2lkIDA7XG4gIHJldHVybiB7XG4gICAgc3BlY2lmaWNhdGlvblZlcnNpb246IFwidjNcIixcbiAgICBsYW5ndWFnZU1vZGVsKG1vZGVsSWQpIHtcbiAgICAgIGlmIChsYW5ndWFnZU1vZGVscyAhPSBudWxsICYmIG1vZGVsSWQgaW4gbGFuZ3VhZ2VNb2RlbHMpIHtcbiAgICAgICAgcmV0dXJuIGxhbmd1YWdlTW9kZWxzW21vZGVsSWRdO1xuICAgICAgfVxuICAgICAgaWYgKGZhbGxiYWNrUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrUHJvdmlkZXIubGFuZ3VhZ2VNb2RlbChtb2RlbElkKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBOb1N1Y2hNb2RlbEVycm9yMih7IG1vZGVsSWQsIG1vZGVsVHlwZTogXCJsYW5ndWFnZU1vZGVsXCIgfSk7XG4gICAgfSxcbiAgICBlbWJlZGRpbmdNb2RlbChtb2RlbElkKSB7XG4gICAgICBpZiAoZW1iZWRkaW5nTW9kZWxzICE9IG51bGwgJiYgbW9kZWxJZCBpbiBlbWJlZGRpbmdNb2RlbHMpIHtcbiAgICAgICAgcmV0dXJuIGVtYmVkZGluZ01vZGVsc1ttb2RlbElkXTtcbiAgICAgIH1cbiAgICAgIGlmIChmYWxsYmFja1Byb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBmYWxsYmFja1Byb3ZpZGVyLmVtYmVkZGluZ01vZGVsKG1vZGVsSWQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IE5vU3VjaE1vZGVsRXJyb3IyKHsgbW9kZWxJZCwgbW9kZWxUeXBlOiBcImVtYmVkZGluZ01vZGVsXCIgfSk7XG4gICAgfSxcbiAgICBpbWFnZU1vZGVsKG1vZGVsSWQpIHtcbiAgICAgIGlmIChpbWFnZU1vZGVscyAhPSBudWxsICYmIG1vZGVsSWQgaW4gaW1hZ2VNb2RlbHMpIHtcbiAgICAgICAgcmV0dXJuIGltYWdlTW9kZWxzW21vZGVsSWRdO1xuICAgICAgfVxuICAgICAgaWYgKGZhbGxiYWNrUHJvdmlkZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGZhbGxiYWNrUHJvdmlkZXIuaW1hZ2VNb2RlbCkge1xuICAgICAgICByZXR1cm4gZmFsbGJhY2tQcm92aWRlci5pbWFnZU1vZGVsKG1vZGVsSWQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IE5vU3VjaE1vZGVsRXJyb3IyKHsgbW9kZWxJZCwgbW9kZWxUeXBlOiBcImltYWdlTW9kZWxcIiB9KTtcbiAgICB9LFxuICAgIHRyYW5zY3JpcHRpb25Nb2RlbChtb2RlbElkKSB7XG4gICAgICBpZiAodHJhbnNjcmlwdGlvbk1vZGVscyAhPSBudWxsICYmIG1vZGVsSWQgaW4gdHJhbnNjcmlwdGlvbk1vZGVscykge1xuICAgICAgICByZXR1cm4gdHJhbnNjcmlwdGlvbk1vZGVsc1ttb2RlbElkXTtcbiAgICAgIH1cbiAgICAgIGlmIChmYWxsYmFja1Byb3ZpZGVyID09IG51bGwgPyB2b2lkIDAgOiBmYWxsYmFja1Byb3ZpZGVyLnRyYW5zY3JpcHRpb25Nb2RlbCkge1xuICAgICAgICByZXR1cm4gZmFsbGJhY2tQcm92aWRlci50cmFuc2NyaXB0aW9uTW9kZWwobW9kZWxJZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgTm9TdWNoTW9kZWxFcnJvcjIoeyBtb2RlbElkLCBtb2RlbFR5cGU6IFwidHJhbnNjcmlwdGlvbk1vZGVsXCIgfSk7XG4gICAgfSxcbiAgICBzcGVlY2hNb2RlbChtb2RlbElkKSB7XG4gICAgICBpZiAoc3BlZWNoTW9kZWxzICE9IG51bGwgJiYgbW9kZWxJZCBpbiBzcGVlY2hNb2RlbHMpIHtcbiAgICAgICAgcmV0dXJuIHNwZWVjaE1vZGVsc1ttb2RlbElkXTtcbiAgICAgIH1cbiAgICAgIGlmIChmYWxsYmFja1Byb3ZpZGVyID09IG51bGwgPyB2b2lkIDAgOiBmYWxsYmFja1Byb3ZpZGVyLnNwZWVjaE1vZGVsKSB7XG4gICAgICAgIHJldHVybiBmYWxsYmFja1Byb3ZpZGVyLnNwZWVjaE1vZGVsKG1vZGVsSWQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IE5vU3VjaE1vZGVsRXJyb3IyKHsgbW9kZWxJZCwgbW9kZWxUeXBlOiBcInNwZWVjaE1vZGVsXCIgfSk7XG4gICAgfSxcbiAgICByZXJhbmtpbmdNb2RlbChtb2RlbElkKSB7XG4gICAgICBpZiAocmVyYW5raW5nTW9kZWxzICE9IG51bGwgJiYgbW9kZWxJZCBpbiByZXJhbmtpbmdNb2RlbHMpIHtcbiAgICAgICAgcmV0dXJuIHJlcmFua2luZ01vZGVsc1ttb2RlbElkXTtcbiAgICAgIH1cbiAgICAgIGlmIChmYWxsYmFja1Byb3ZpZGVyID09IG51bGwgPyB2b2lkIDAgOiBmYWxsYmFja1Byb3ZpZGVyLnJlcmFua2luZ01vZGVsKSB7XG4gICAgICAgIHJldHVybiBmYWxsYmFja1Byb3ZpZGVyLnJlcmFua2luZ01vZGVsKG1vZGVsSWQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IE5vU3VjaE1vZGVsRXJyb3IyKHsgbW9kZWxJZCwgbW9kZWxUeXBlOiBcInJlcmFua2luZ01vZGVsXCIgfSk7XG4gICAgfSxcbiAgICB2aWRlb01vZGVsKG1vZGVsSWQpIHtcbiAgICAgIGlmICh2aWRlb01vZGVscyAhPSBudWxsICYmIG1vZGVsSWQgaW4gdmlkZW9Nb2RlbHMpIHtcbiAgICAgICAgcmV0dXJuIHZpZGVvTW9kZWxzW21vZGVsSWRdO1xuICAgICAgfVxuICAgICAgY29uc3QgdmlkZW9Nb2RlbCA9IGZhbGxiYWNrUHJvdmlkZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGZhbGxiYWNrUHJvdmlkZXIudmlkZW9Nb2RlbDtcbiAgICAgIGlmICh2aWRlb01vZGVsKSB7XG4gICAgICAgIHJldHVybiB2aWRlb01vZGVsKG1vZGVsSWQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IE5vU3VjaE1vZGVsRXJyb3IyKHsgbW9kZWxJZCwgbW9kZWxUeXBlOiBcInZpZGVvTW9kZWxcIiB9KTtcbiAgICB9XG4gIH07XG59XG52YXIgZXhwZXJpbWVudGFsX2N1c3RvbVByb3ZpZGVyID0gY3VzdG9tUHJvdmlkZXI7XG5cbi8vIHNyYy9yZWdpc3RyeS9uby1zdWNoLXByb3ZpZGVyLWVycm9yLnRzXG5pbXBvcnQgeyBBSVNES0Vycm9yIGFzIEFJU0RLRXJyb3IyNCwgTm9TdWNoTW9kZWxFcnJvciBhcyBOb1N1Y2hNb2RlbEVycm9yMyB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgbmFtZTIwID0gXCJBSV9Ob1N1Y2hQcm92aWRlckVycm9yXCI7XG52YXIgbWFya2VyMjAgPSBgdmVyY2VsLmFpLmVycm9yLiR7bmFtZTIwfWA7XG52YXIgc3ltYm9sMjAgPSBTeW1ib2wuZm9yKG1hcmtlcjIwKTtcbnZhciBfYTIwO1xudmFyIE5vU3VjaFByb3ZpZGVyRXJyb3IgPSBjbGFzcyBleHRlbmRzIE5vU3VjaE1vZGVsRXJyb3IzIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG1vZGVsSWQsXG4gICAgbW9kZWxUeXBlLFxuICAgIHByb3ZpZGVySWQsXG4gICAgYXZhaWxhYmxlUHJvdmlkZXJzLFxuICAgIG1lc3NhZ2UgPSBgTm8gc3VjaCBwcm92aWRlcjogJHtwcm92aWRlcklkfSAoYXZhaWxhYmxlIHByb3ZpZGVyczogJHthdmFpbGFibGVQcm92aWRlcnMuam9pbigpfSlgXG4gIH0pIHtcbiAgICBzdXBlcih7IGVycm9yTmFtZTogbmFtZTIwLCBtb2RlbElkLCBtb2RlbFR5cGUsIG1lc3NhZ2UgfSk7XG4gICAgdGhpc1tfYTIwXSA9IHRydWU7XG4gICAgdGhpcy5wcm92aWRlcklkID0gcHJvdmlkZXJJZDtcbiAgICB0aGlzLmF2YWlsYWJsZVByb3ZpZGVycyA9IGF2YWlsYWJsZVByb3ZpZGVycztcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBBSVNES0Vycm9yMjQuaGFzTWFya2VyKGVycm9yLCBtYXJrZXIyMCk7XG4gIH1cbn07XG5fYTIwID0gc3ltYm9sMjA7XG5cbi8vIHNyYy9yZWdpc3RyeS9wcm92aWRlci1yZWdpc3RyeS50c1xuaW1wb3J0IHtcbiAgTm9TdWNoTW9kZWxFcnJvciBhcyBOb1N1Y2hNb2RlbEVycm9yNFxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xuZnVuY3Rpb24gY3JlYXRlUHJvdmlkZXJSZWdpc3RyeShwcm92aWRlcnMsIHtcbiAgc2VwYXJhdG9yID0gXCI6XCIsXG4gIGxhbmd1YWdlTW9kZWxNaWRkbGV3YXJlLFxuICBpbWFnZU1vZGVsTWlkZGxld2FyZVxufSA9IHt9KSB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IERlZmF1bHRQcm92aWRlclJlZ2lzdHJ5KHtcbiAgICBzZXBhcmF0b3IsXG4gICAgbGFuZ3VhZ2VNb2RlbE1pZGRsZXdhcmUsXG4gICAgaW1hZ2VNb2RlbE1pZGRsZXdhcmVcbiAgfSk7XG4gIGZvciAoY29uc3QgW2lkLCBwcm92aWRlcl0gb2YgT2JqZWN0LmVudHJpZXMocHJvdmlkZXJzKSkge1xuICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyUHJvdmlkZXIoeyBpZCwgcHJvdmlkZXIgfSk7XG4gIH1cbiAgcmV0dXJuIHJlZ2lzdHJ5O1xufVxudmFyIGV4cGVyaW1lbnRhbF9jcmVhdGVQcm92aWRlclJlZ2lzdHJ5ID0gY3JlYXRlUHJvdmlkZXJSZWdpc3RyeTtcbnZhciBEZWZhdWx0UHJvdmlkZXJSZWdpc3RyeSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHNlcGFyYXRvcixcbiAgICBsYW5ndWFnZU1vZGVsTWlkZGxld2FyZSxcbiAgICBpbWFnZU1vZGVsTWlkZGxld2FyZVxuICB9KSB7XG4gICAgdGhpcy5wcm92aWRlcnMgPSB7fTtcbiAgICB0aGlzLnNlcGFyYXRvciA9IHNlcGFyYXRvcjtcbiAgICB0aGlzLmxhbmd1YWdlTW9kZWxNaWRkbGV3YXJlID0gbGFuZ3VhZ2VNb2RlbE1pZGRsZXdhcmU7XG4gICAgdGhpcy5pbWFnZU1vZGVsTWlkZGxld2FyZSA9IGltYWdlTW9kZWxNaWRkbGV3YXJlO1xuICB9XG4gIHJlZ2lzdGVyUHJvdmlkZXIoe1xuICAgIGlkLFxuICAgIHByb3ZpZGVyXG4gIH0pIHtcbiAgICB0aGlzLnByb3ZpZGVyc1tpZF0gPSBwcm92aWRlcjtcbiAgfVxuICBnZXRQcm92aWRlcihpZCwgbW9kZWxUeXBlKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLnByb3ZpZGVyc1tpZF07XG4gICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBOb1N1Y2hQcm92aWRlckVycm9yKHtcbiAgICAgICAgbW9kZWxJZDogaWQsXG4gICAgICAgIG1vZGVsVHlwZSxcbiAgICAgICAgcHJvdmlkZXJJZDogaWQsXG4gICAgICAgIGF2YWlsYWJsZVByb3ZpZGVyczogT2JqZWN0LmtleXModGhpcy5wcm92aWRlcnMpXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3ZpZGVyO1xuICB9XG4gIHNwbGl0SWQoaWQsIG1vZGVsVHlwZSkge1xuICAgIGNvbnN0IGluZGV4ID0gaWQuaW5kZXhPZih0aGlzLnNlcGFyYXRvcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IE5vU3VjaE1vZGVsRXJyb3I0KHtcbiAgICAgICAgbW9kZWxJZDogaWQsXG4gICAgICAgIG1vZGVsVHlwZSxcbiAgICAgICAgbWVzc2FnZTogYEludmFsaWQgJHttb2RlbFR5cGV9IGlkIGZvciByZWdpc3RyeTogJHtpZH0gKG11c3QgYmUgaW4gdGhlIGZvcm1hdCBcInByb3ZpZGVySWQke3RoaXMuc2VwYXJhdG9yfW1vZGVsSWRcIilgXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFtpZC5zbGljZSgwLCBpbmRleCksIGlkLnNsaWNlKGluZGV4ICsgdGhpcy5zZXBhcmF0b3IubGVuZ3RoKV07XG4gIH1cbiAgbGFuZ3VhZ2VNb2RlbChpZCkge1xuICAgIHZhciBfYTIxLCBfYjtcbiAgICBjb25zdCBbcHJvdmlkZXJJZCwgbW9kZWxJZF0gPSB0aGlzLnNwbGl0SWQoaWQsIFwibGFuZ3VhZ2VNb2RlbFwiKTtcbiAgICBsZXQgbW9kZWwgPSAoX2IgPSAoX2EyMSA9IHRoaXMuZ2V0UHJvdmlkZXIocHJvdmlkZXJJZCwgXCJsYW5ndWFnZU1vZGVsXCIpKS5sYW5ndWFnZU1vZGVsKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChcbiAgICAgIF9hMjEsXG4gICAgICBtb2RlbElkXG4gICAgKTtcbiAgICBpZiAobW9kZWwgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IE5vU3VjaE1vZGVsRXJyb3I0KHsgbW9kZWxJZDogaWQsIG1vZGVsVHlwZTogXCJsYW5ndWFnZU1vZGVsXCIgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxhbmd1YWdlTW9kZWxNaWRkbGV3YXJlICE9IG51bGwpIHtcbiAgICAgIG1vZGVsID0gd3JhcExhbmd1YWdlTW9kZWwoe1xuICAgICAgICBtb2RlbCxcbiAgICAgICAgbWlkZGxld2FyZTogdGhpcy5sYW5ndWFnZU1vZGVsTWlkZGxld2FyZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuICBlbWJlZGRpbmdNb2RlbChpZCkge1xuICAgIHZhciBfYTIxO1xuICAgIGNvbnN0IFtwcm92aWRlcklkLCBtb2RlbElkXSA9IHRoaXMuc3BsaXRJZChpZCwgXCJlbWJlZGRpbmdNb2RlbFwiKTtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJvdmlkZXJJZCwgXCJlbWJlZGRpbmdNb2RlbFwiKTtcbiAgICBjb25zdCBtb2RlbCA9IChfYTIxID0gcHJvdmlkZXIuZW1iZWRkaW5nTW9kZWwpID09IG51bGwgPyB2b2lkIDAgOiBfYTIxLmNhbGwocHJvdmlkZXIsIG1vZGVsSWQpO1xuICAgIGlmIChtb2RlbCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgTm9TdWNoTW9kZWxFcnJvcjQoe1xuICAgICAgICBtb2RlbElkOiBpZCxcbiAgICAgICAgbW9kZWxUeXBlOiBcImVtYmVkZGluZ01vZGVsXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cbiAgaW1hZ2VNb2RlbChpZCkge1xuICAgIHZhciBfYTIxO1xuICAgIGNvbnN0IFtwcm92aWRlcklkLCBtb2RlbElkXSA9IHRoaXMuc3BsaXRJZChpZCwgXCJpbWFnZU1vZGVsXCIpO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcm92aWRlcklkLCBcImltYWdlTW9kZWxcIik7XG4gICAgbGV0IG1vZGVsID0gKF9hMjEgPSBwcm92aWRlci5pbWFnZU1vZGVsKSA9PSBudWxsID8gdm9pZCAwIDogX2EyMS5jYWxsKHByb3ZpZGVyLCBtb2RlbElkKTtcbiAgICBpZiAobW9kZWwgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IE5vU3VjaE1vZGVsRXJyb3I0KHsgbW9kZWxJZDogaWQsIG1vZGVsVHlwZTogXCJpbWFnZU1vZGVsXCIgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmltYWdlTW9kZWxNaWRkbGV3YXJlICE9IG51bGwpIHtcbiAgICAgIG1vZGVsID0gd3JhcEltYWdlTW9kZWwoe1xuICAgICAgICBtb2RlbCxcbiAgICAgICAgbWlkZGxld2FyZTogdGhpcy5pbWFnZU1vZGVsTWlkZGxld2FyZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuICB0cmFuc2NyaXB0aW9uTW9kZWwoaWQpIHtcbiAgICB2YXIgX2EyMTtcbiAgICBjb25zdCBbcHJvdmlkZXJJZCwgbW9kZWxJZF0gPSB0aGlzLnNwbGl0SWQoaWQsIFwidHJhbnNjcmlwdGlvbk1vZGVsXCIpO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcm92aWRlcklkLCBcInRyYW5zY3JpcHRpb25Nb2RlbFwiKTtcbiAgICBjb25zdCBtb2RlbCA9IChfYTIxID0gcHJvdmlkZXIudHJhbnNjcmlwdGlvbk1vZGVsKSA9PSBudWxsID8gdm9pZCAwIDogX2EyMS5jYWxsKHByb3ZpZGVyLCBtb2RlbElkKTtcbiAgICBpZiAobW9kZWwgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IE5vU3VjaE1vZGVsRXJyb3I0KHtcbiAgICAgICAgbW9kZWxJZDogaWQsXG4gICAgICAgIG1vZGVsVHlwZTogXCJ0cmFuc2NyaXB0aW9uTW9kZWxcIlxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuICBzcGVlY2hNb2RlbChpZCkge1xuICAgIHZhciBfYTIxO1xuICAgIGNvbnN0IFtwcm92aWRlcklkLCBtb2RlbElkXSA9IHRoaXMuc3BsaXRJZChpZCwgXCJzcGVlY2hNb2RlbFwiKTtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJvdmlkZXJJZCwgXCJzcGVlY2hNb2RlbFwiKTtcbiAgICBjb25zdCBtb2RlbCA9IChfYTIxID0gcHJvdmlkZXIuc3BlZWNoTW9kZWwpID09IG51bGwgPyB2b2lkIDAgOiBfYTIxLmNhbGwocHJvdmlkZXIsIG1vZGVsSWQpO1xuICAgIGlmIChtb2RlbCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgTm9TdWNoTW9kZWxFcnJvcjQoeyBtb2RlbElkOiBpZCwgbW9kZWxUeXBlOiBcInNwZWVjaE1vZGVsXCIgfSk7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuICByZXJhbmtpbmdNb2RlbChpZCkge1xuICAgIHZhciBfYTIxO1xuICAgIGNvbnN0IFtwcm92aWRlcklkLCBtb2RlbElkXSA9IHRoaXMuc3BsaXRJZChpZCwgXCJyZXJhbmtpbmdNb2RlbFwiKTtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJvdmlkZXJJZCwgXCJyZXJhbmtpbmdNb2RlbFwiKTtcbiAgICBjb25zdCBtb2RlbCA9IChfYTIxID0gcHJvdmlkZXIucmVyYW5raW5nTW9kZWwpID09IG51bGwgPyB2b2lkIDAgOiBfYTIxLmNhbGwocHJvdmlkZXIsIG1vZGVsSWQpO1xuICAgIGlmIChtb2RlbCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgTm9TdWNoTW9kZWxFcnJvcjQoeyBtb2RlbElkOiBpZCwgbW9kZWxUeXBlOiBcInJlcmFua2luZ01vZGVsXCIgfSk7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxufTtcblxuLy8gc3JjL3JlcmFuay9yZXJhbmsudHNcbmFzeW5jIGZ1bmN0aW9uIHJlcmFuayh7XG4gIG1vZGVsLFxuICBkb2N1bWVudHMsXG4gIHF1ZXJ5LFxuICB0b3BOLFxuICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzQXJnLFxuICBhYm9ydFNpZ25hbCxcbiAgaGVhZGVycyxcbiAgcHJvdmlkZXJPcHRpb25zLFxuICBleHBlcmltZW50YWxfdGVsZW1ldHJ5OiB0ZWxlbWV0cnlcbn0pIHtcbiAgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbmV3IERlZmF1bHRSZXJhbmtSZXN1bHQoe1xuICAgICAgb3JpZ2luYWxEb2N1bWVudHM6IFtdLFxuICAgICAgcmFua2luZzogW10sXG4gICAgICBwcm92aWRlck1ldGFkYXRhOiB2b2lkIDAsXG4gICAgICByZXNwb25zZToge1xuICAgICAgICB0aW1lc3RhbXA6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLFxuICAgICAgICBtb2RlbElkOiBtb2RlbC5tb2RlbElkXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgeyBtYXhSZXRyaWVzLCByZXRyeSB9ID0gcHJlcGFyZVJldHJpZXMoe1xuICAgIG1heFJldHJpZXM6IG1heFJldHJpZXNBcmcsXG4gICAgYWJvcnRTaWduYWxcbiAgfSk7XG4gIGNvbnN0IGRvY3VtZW50c1RvU2VuZCA9IHR5cGVvZiBkb2N1bWVudHNbMF0gPT09IFwic3RyaW5nXCIgPyB7IHR5cGU6IFwidGV4dFwiLCB2YWx1ZXM6IGRvY3VtZW50cyB9IDogeyB0eXBlOiBcIm9iamVjdFwiLCB2YWx1ZXM6IGRvY3VtZW50cyB9O1xuICBjb25zdCBiYXNlVGVsZW1ldHJ5QXR0cmlidXRlcyA9IGdldEJhc2VUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICBtb2RlbCxcbiAgICB0ZWxlbWV0cnksXG4gICAgaGVhZGVycyxcbiAgICBzZXR0aW5nczogeyBtYXhSZXRyaWVzIH1cbiAgfSk7XG4gIGNvbnN0IHRyYWNlciA9IGdldFRyYWNlcih0ZWxlbWV0cnkpO1xuICByZXR1cm4gcmVjb3JkU3Bhbih7XG4gICAgbmFtZTogXCJhaS5yZXJhbmtcIixcbiAgICBhdHRyaWJ1dGVzOiBzZWxlY3RUZWxlbWV0cnlBdHRyaWJ1dGVzKHtcbiAgICAgIHRlbGVtZXRyeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgLi4uYXNzZW1ibGVPcGVyYXRpb25OYW1lKHsgb3BlcmF0aW9uSWQ6IFwiYWkucmVyYW5rXCIsIHRlbGVtZXRyeSB9KSxcbiAgICAgICAgLi4uYmFzZVRlbGVtZXRyeUF0dHJpYnV0ZXMsXG4gICAgICAgIFwiYWkuZG9jdW1lbnRzXCI6IHtcbiAgICAgICAgICBpbnB1dDogKCkgPT4gZG9jdW1lbnRzLm1hcCgoZG9jdW1lbnQpID0+IEpTT04uc3RyaW5naWZ5KGRvY3VtZW50KSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLFxuICAgIHRyYWNlcixcbiAgICBmbjogYXN5bmMgKCkgPT4ge1xuICAgICAgdmFyIF9hMjEsIF9iO1xuICAgICAgY29uc3QgeyByYW5raW5nLCByZXNwb25zZSwgcHJvdmlkZXJNZXRhZGF0YSwgd2FybmluZ3MgfSA9IGF3YWl0IHJldHJ5KFxuICAgICAgICAoKSA9PiByZWNvcmRTcGFuKHtcbiAgICAgICAgICBuYW1lOiBcImFpLnJlcmFuay5kb1JlcmFua1wiLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHNlbGVjdFRlbGVtZXRyeUF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgdGVsZW1ldHJ5LFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAuLi5hc3NlbWJsZU9wZXJhdGlvbk5hbWUoe1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbklkOiBcImFpLnJlcmFuay5kb1JlcmFua1wiLFxuICAgICAgICAgICAgICAgIHRlbGVtZXRyeVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgLi4uYmFzZVRlbGVtZXRyeUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIC8vIHNwZWNpZmljIHNldHRpbmdzIHRoYXQgb25seSBtYWtlIHNlbnNlIG9uIHRoZSBvdXRlciBsZXZlbDpcbiAgICAgICAgICAgICAgXCJhaS5kb2N1bWVudHNcIjoge1xuICAgICAgICAgICAgICAgIGlucHV0OiAoKSA9PiBkb2N1bWVudHMubWFwKChkb2N1bWVudCkgPT4gSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnQpKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdHJhY2VyLFxuICAgICAgICAgIGZuOiBhc3luYyAoZG9SZXJhbmtTcGFuKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb2RlbFJlc3BvbnNlID0gYXdhaXQgbW9kZWwuZG9SZXJhbmsoe1xuICAgICAgICAgICAgICBkb2N1bWVudHM6IGRvY3VtZW50c1RvU2VuZCxcbiAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgIHRvcE4sXG4gICAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgcmFua2luZzIgPSBtb2RlbFJlc3BvbnNlLnJhbmtpbmc7XG4gICAgICAgICAgICBkb1JlcmFua1NwYW4uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICAgICAgYXdhaXQgc2VsZWN0VGVsZW1ldHJ5QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgdGVsZW1ldHJ5LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgIFwiYWkucmFua2luZy50eXBlXCI6IGRvY3VtZW50c1RvU2VuZC50eXBlLFxuICAgICAgICAgICAgICAgICAgXCJhaS5yYW5raW5nXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiAoKSA9PiByYW5raW5nMi5tYXAoKHJhbmtpbmczKSA9PiBKU09OLnN0cmluZ2lmeShyYW5raW5nMykpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHJhbmtpbmc6IHJhbmtpbmcyLFxuICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiBtb2RlbFJlc3BvbnNlLnByb3ZpZGVyTWV0YWRhdGEsXG4gICAgICAgICAgICAgIHJlc3BvbnNlOiBtb2RlbFJlc3BvbnNlLnJlc3BvbnNlLFxuICAgICAgICAgICAgICB3YXJuaW5nczogbW9kZWxSZXNwb25zZS53YXJuaW5nc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgbG9nV2FybmluZ3Moe1xuICAgICAgICB3YXJuaW5nczogd2FybmluZ3MgIT0gbnVsbCA/IHdhcm5pbmdzIDogW10sXG4gICAgICAgIHByb3ZpZGVyOiBtb2RlbC5wcm92aWRlcixcbiAgICAgICAgbW9kZWw6IG1vZGVsLm1vZGVsSWRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UmVyYW5rUmVzdWx0KHtcbiAgICAgICAgb3JpZ2luYWxEb2N1bWVudHM6IGRvY3VtZW50cyxcbiAgICAgICAgcmFua2luZzogcmFua2luZy5tYXAoKHJhbmtpbmcyKSA9PiAoe1xuICAgICAgICAgIG9yaWdpbmFsSW5kZXg6IHJhbmtpbmcyLmluZGV4LFxuICAgICAgICAgIHNjb3JlOiByYW5raW5nMi5yZWxldmFuY2VTY29yZSxcbiAgICAgICAgICBkb2N1bWVudDogZG9jdW1lbnRzW3JhbmtpbmcyLmluZGV4XVxuICAgICAgICB9KSksXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGEsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgaWQ6IHJlc3BvbnNlID09IG51bGwgPyB2b2lkIDAgOiByZXNwb25zZS5pZCxcbiAgICAgICAgICB0aW1lc3RhbXA6IChfYTIxID0gcmVzcG9uc2UgPT0gbnVsbCA/IHZvaWQgMCA6IHJlc3BvbnNlLnRpbWVzdGFtcCkgIT0gbnVsbCA/IF9hMjEgOiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSxcbiAgICAgICAgICBtb2RlbElkOiAoX2IgPSByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UubW9kZWxJZCkgIT0gbnVsbCA/IF9iIDogbW9kZWwubW9kZWxJZCxcbiAgICAgICAgICBoZWFkZXJzOiByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICBib2R5OiByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UuYm9keVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxudmFyIERlZmF1bHRSZXJhbmtSZXN1bHQgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLm9yaWdpbmFsRG9jdW1lbnRzID0gb3B0aW9ucy5vcmlnaW5hbERvY3VtZW50cztcbiAgICB0aGlzLnJhbmtpbmcgPSBvcHRpb25zLnJhbmtpbmc7XG4gICAgdGhpcy5yZXNwb25zZSA9IG9wdGlvbnMucmVzcG9uc2U7XG4gICAgdGhpcy5wcm92aWRlck1ldGFkYXRhID0gb3B0aW9ucy5wcm92aWRlck1ldGFkYXRhO1xuICB9XG4gIGdldCByZXJhbmtlZERvY3VtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5raW5nLm1hcCgocmFua2luZykgPT4gcmFua2luZy5kb2N1bWVudCk7XG4gIH1cbn07XG5cbi8vIHNyYy90cmFuc2NyaWJlL3RyYW5zY3JpYmUudHNcbmltcG9ydCB7IHdpdGhVc2VyQWdlbnRTdWZmaXggYXMgd2l0aFVzZXJBZ2VudFN1ZmZpeDkgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xudmFyIGRlZmF1bHREb3dubG9hZDIgPSBjcmVhdGVEb3dubG9hZCgpO1xuYXN5bmMgZnVuY3Rpb24gdHJhbnNjcmliZSh7XG4gIG1vZGVsLFxuICBhdWRpbyxcbiAgcHJvdmlkZXJPcHRpb25zID0ge30sXG4gIG1heFJldHJpZXM6IG1heFJldHJpZXNBcmcsXG4gIGFib3J0U2lnbmFsLFxuICBoZWFkZXJzLFxuICBkb3dubG9hZDogZG93bmxvYWRGbiA9IGRlZmF1bHREb3dubG9hZDJcbn0pIHtcbiAgY29uc3QgcmVzb2x2ZWRNb2RlbCA9IHJlc29sdmVUcmFuc2NyaXB0aW9uTW9kZWwobW9kZWwpO1xuICBpZiAoIXJlc29sdmVkTW9kZWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNb2RlbCBjb3VsZCBub3QgYmUgcmVzb2x2ZWRcIik7XG4gIH1cbiAgY29uc3QgeyByZXRyeSB9ID0gcHJlcGFyZVJldHJpZXMoe1xuICAgIG1heFJldHJpZXM6IG1heFJldHJpZXNBcmcsXG4gICAgYWJvcnRTaWduYWxcbiAgfSk7XG4gIGNvbnN0IGhlYWRlcnNXaXRoVXNlckFnZW50ID0gd2l0aFVzZXJBZ2VudFN1ZmZpeDkoXG4gICAgaGVhZGVycyAhPSBudWxsID8gaGVhZGVycyA6IHt9LFxuICAgIGBhaS8ke1ZFUlNJT059YFxuICApO1xuICBjb25zdCBhdWRpb0RhdGEgPSBhdWRpbyBpbnN0YW5jZW9mIFVSTCA/IChhd2FpdCBkb3dubG9hZEZuKHsgdXJsOiBhdWRpbywgYWJvcnRTaWduYWwgfSkpLmRhdGEgOiBjb252ZXJ0RGF0YUNvbnRlbnRUb1VpbnQ4QXJyYXkoYXVkaW8pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXRyeShcbiAgICAoKSA9PiB7XG4gICAgICB2YXIgX2EyMTtcbiAgICAgIHJldHVybiByZXNvbHZlZE1vZGVsLmRvR2VuZXJhdGUoe1xuICAgICAgICBhdWRpbzogYXVkaW9EYXRhLFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgaGVhZGVyczogaGVhZGVyc1dpdGhVc2VyQWdlbnQsXG4gICAgICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgbWVkaWFUeXBlOiAoX2EyMSA9IGRldGVjdE1lZGlhVHlwZSh7XG4gICAgICAgICAgZGF0YTogYXVkaW9EYXRhLFxuICAgICAgICAgIHNpZ25hdHVyZXM6IGF1ZGlvTWVkaWFUeXBlU2lnbmF0dXJlc1xuICAgICAgICB9KSkgIT0gbnVsbCA/IF9hMjEgOiBcImF1ZGlvL3dhdlwiXG4gICAgICB9KTtcbiAgICB9XG4gICk7XG4gIGxvZ1dhcm5pbmdzKHtcbiAgICB3YXJuaW5nczogcmVzdWx0Lndhcm5pbmdzLFxuICAgIHByb3ZpZGVyOiByZXNvbHZlZE1vZGVsLnByb3ZpZGVyLFxuICAgIG1vZGVsOiByZXNvbHZlZE1vZGVsLm1vZGVsSWRcbiAgfSk7XG4gIGlmICghcmVzdWx0LnRleHQpIHtcbiAgICB0aHJvdyBuZXcgTm9UcmFuc2NyaXB0R2VuZXJhdGVkRXJyb3IoeyByZXNwb25zZXM6IFtyZXN1bHQucmVzcG9uc2VdIH0pO1xuICB9XG4gIHJldHVybiBuZXcgRGVmYXVsdFRyYW5zY3JpcHRpb25SZXN1bHQoe1xuICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgIHNlZ21lbnRzOiByZXN1bHQuc2VnbWVudHMsXG4gICAgbGFuZ3VhZ2U6IHJlc3VsdC5sYW5ndWFnZSxcbiAgICBkdXJhdGlvbkluU2Vjb25kczogcmVzdWx0LmR1cmF0aW9uSW5TZWNvbmRzLFxuICAgIHdhcm5pbmdzOiByZXN1bHQud2FybmluZ3MsXG4gICAgcmVzcG9uc2VzOiBbcmVzdWx0LnJlc3BvbnNlXSxcbiAgICBwcm92aWRlck1ldGFkYXRhOiByZXN1bHQucHJvdmlkZXJNZXRhZGF0YVxuICB9KTtcbn1cbnZhciBEZWZhdWx0VHJhbnNjcmlwdGlvblJlc3VsdCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHZhciBfYTIxO1xuICAgIHRoaXMudGV4dCA9IG9wdGlvbnMudGV4dDtcbiAgICB0aGlzLnNlZ21lbnRzID0gb3B0aW9ucy5zZWdtZW50cztcbiAgICB0aGlzLmxhbmd1YWdlID0gb3B0aW9ucy5sYW5ndWFnZTtcbiAgICB0aGlzLmR1cmF0aW9uSW5TZWNvbmRzID0gb3B0aW9ucy5kdXJhdGlvbkluU2Vjb25kcztcbiAgICB0aGlzLndhcm5pbmdzID0gb3B0aW9ucy53YXJuaW5ncztcbiAgICB0aGlzLnJlc3BvbnNlcyA9IG9wdGlvbnMucmVzcG9uc2VzO1xuICAgIHRoaXMucHJvdmlkZXJNZXRhZGF0YSA9IChfYTIxID0gb3B0aW9ucy5wcm92aWRlck1ldGFkYXRhKSAhPSBudWxsID8gX2EyMSA6IHt9O1xuICB9XG59O1xuXG4vLyBzcmMvdWkvY2FsbC1jb21wbGV0aW9uLWFwaS50c1xuaW1wb3J0IHtcbiAgcGFyc2VKc29uRXZlbnRTdHJlYW0sXG4gIHdpdGhVc2VyQWdlbnRTdWZmaXggYXMgd2l0aFVzZXJBZ2VudFN1ZmZpeDEwLFxuICBnZXRSdW50aW1lRW52aXJvbm1lbnRVc2VyQWdlbnQgYXMgZ2V0UnVudGltZUVudmlyb25tZW50VXNlckFnZW50MlxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvdWkvcHJvY2Vzcy10ZXh0LXN0cmVhbS50c1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1RleHRTdHJlYW0oe1xuICBzdHJlYW0sXG4gIG9uVGV4dFBhcnRcbn0pIHtcbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLnBpcGVUaHJvdWdoKG5ldyBUZXh0RGVjb2RlclN0cmVhbSgpKS5nZXRSZWFkZXIoKTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgYXdhaXQgb25UZXh0UGFydCh2YWx1ZSk7XG4gIH1cbn1cblxuLy8gc3JjL3VpL2NhbGwtY29tcGxldGlvbi1hcGkudHNcbnZhciBnZXRPcmlnaW5hbEZldGNoID0gKCkgPT4gZmV0Y2g7XG5hc3luYyBmdW5jdGlvbiBjYWxsQ29tcGxldGlvbkFwaSh7XG4gIGFwaSxcbiAgcHJvbXB0LFxuICBjcmVkZW50aWFscyxcbiAgaGVhZGVycyxcbiAgYm9keSxcbiAgc3RyZWFtUHJvdG9jb2wgPSBcImRhdGFcIixcbiAgc2V0Q29tcGxldGlvbixcbiAgc2V0TG9hZGluZyxcbiAgc2V0RXJyb3IsXG4gIHNldEFib3J0Q29udHJvbGxlcixcbiAgb25GaW5pc2gsXG4gIG9uRXJyb3IsXG4gIGZldGNoOiBmZXRjaDIgPSBnZXRPcmlnaW5hbEZldGNoKClcbn0pIHtcbiAgdmFyIF9hMjE7XG4gIHRyeSB7XG4gICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICBzZXRFcnJvcih2b2lkIDApO1xuICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBzZXRBYm9ydENvbnRyb2xsZXIoYWJvcnRDb250cm9sbGVyKTtcbiAgICBzZXRDb21wbGV0aW9uKFwiXCIpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gyKGFwaSwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcHJvbXB0LFxuICAgICAgICAuLi5ib2R5XG4gICAgICB9KSxcbiAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgaGVhZGVyczogd2l0aFVzZXJBZ2VudFN1ZmZpeDEwKFxuICAgICAgICB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgLi4uaGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBgYWktc2RrLyR7VkVSU0lPTn1gLFxuICAgICAgICBnZXRSdW50aW1lRW52aXJvbm1lbnRVc2VyQWdlbnQyKClcbiAgICAgICksXG4gICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWxcbiAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAoX2EyMSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKSkgIT0gbnVsbCA/IF9hMjEgOiBcIkZhaWxlZCB0byBmZXRjaCB0aGUgY2hhdCByZXNwb25zZS5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5ib2R5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcmVzcG9uc2UgYm9keSBpcyBlbXB0eS5cIik7XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIHN3aXRjaCAoc3RyZWFtUHJvdG9jb2wpIHtcbiAgICAgIGNhc2UgXCJ0ZXh0XCI6IHtcbiAgICAgICAgYXdhaXQgcHJvY2Vzc1RleHRTdHJlYW0oe1xuICAgICAgICAgIHN0cmVhbTogcmVzcG9uc2UuYm9keSxcbiAgICAgICAgICBvblRleHRQYXJ0OiAoY2h1bmspID0+IHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBjaHVuaztcbiAgICAgICAgICAgIHNldENvbXBsZXRpb24ocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJkYXRhXCI6IHtcbiAgICAgICAgYXdhaXQgY29uc3VtZVN0cmVhbSh7XG4gICAgICAgICAgc3RyZWFtOiBwYXJzZUpzb25FdmVudFN0cmVhbSh7XG4gICAgICAgICAgICBzdHJlYW06IHJlc3BvbnNlLmJvZHksXG4gICAgICAgICAgICBzY2hlbWE6IHVpTWVzc2FnZUNodW5rU2NoZW1hXG4gICAgICAgICAgfSkucGlwZVRocm91Z2goXG4gICAgICAgICAgICBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgICAgICAgYXN5bmMgdHJhbnNmb3JtKHBhcnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgcGFydC5lcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtUGFydCA9IHBhcnQudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbVBhcnQudHlwZSA9PT0gXCJ0ZXh0LWRlbHRhXCIpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzdHJlYW1QYXJ0LmRlbHRhO1xuICAgICAgICAgICAgICAgICAgc2V0Q29tcGxldGlvbihyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtUGFydC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHJlYW1QYXJ0LmVycm9yVGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICksXG4gICAgICAgICAgb25FcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgZXhoYXVzdGl2ZUNoZWNrID0gc3RyZWFtUHJvdG9jb2w7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdHJlYW0gcHJvdG9jb2w6ICR7ZXhoYXVzdGl2ZUNoZWNrfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob25GaW5pc2gpIHtcbiAgICAgIG9uRmluaXNoKHByb21wdCwgcmVzdWx0KTtcbiAgICB9XG4gICAgc2V0QWJvcnRDb250cm9sbGVyKG51bGwpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHtcbiAgICAgIHNldEFib3J0Q29udHJvbGxlcihudWxsKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGlmIChvbkVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0RXJyb3IoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgfVxufVxuXG4vLyBzcmMvdWkvY2hhdC50c1xuaW1wb3J0IHtcbiAgZ2VuZXJhdGVJZCBhcyBnZW5lcmF0ZUlkRnVuYzJcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL3VpL2NvbnZlcnQtZmlsZS1saXN0LXRvLWZpbGUtdWktcGFydHMudHNcbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRGaWxlTGlzdFRvRmlsZVVJUGFydHMoZmlsZXMpIHtcbiAgaWYgKGZpbGVzID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKCFnbG9iYWxUaGlzLkZpbGVMaXN0IHx8ICEoZmlsZXMgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLkZpbGVMaXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZpbGVMaXN0IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnRcIik7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgIEFycmF5LmZyb20oZmlsZXMpLm1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgY29uc3QgeyBuYW1lOiBuYW1lMjEsIHR5cGUgfSA9IGZpbGU7XG4gICAgICBjb25zdCBkYXRhVXJsID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUzLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChyZWFkZXJFdmVudCkgPT4ge1xuICAgICAgICAgIHZhciBfYTIxO1xuICAgICAgICAgIHJlc29sdmUzKChfYTIxID0gcmVhZGVyRXZlbnQudGFyZ2V0KSA9PSBudWxsID8gdm9pZCAwIDogX2EyMS5yZXN1bHQpO1xuICAgICAgICB9O1xuICAgICAgICByZWFkZXIub25lcnJvciA9IChlcnJvcikgPT4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICBtZWRpYVR5cGU6IHR5cGUsXG4gICAgICAgIGZpbGVuYW1lOiBuYW1lMjEsXG4gICAgICAgIHVybDogZGF0YVVybFxuICAgICAgfTtcbiAgICB9KVxuICApO1xufVxuXG4vLyBzcmMvdWkvZGVmYXVsdC1jaGF0LXRyYW5zcG9ydC50c1xuaW1wb3J0IHsgcGFyc2VKc29uRXZlbnRTdHJlYW0gYXMgcGFyc2VKc29uRXZlbnRTdHJlYW0yIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL3VpL2h0dHAtY2hhdC10cmFuc3BvcnQudHNcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZUhlYWRlcnMsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZTJcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbnZhciBIdHRwQ2hhdFRyYW5zcG9ydCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGFwaSA9IFwiL2FwaS9jaGF0XCIsXG4gICAgY3JlZGVudGlhbHMsXG4gICAgaGVhZGVycyxcbiAgICBib2R5LFxuICAgIGZldGNoOiBmZXRjaDIsXG4gICAgcHJlcGFyZVNlbmRNZXNzYWdlc1JlcXVlc3QsXG4gICAgcHJlcGFyZVJlY29ubmVjdFRvU3RyZWFtUmVxdWVzdFxuICB9KSB7XG4gICAgdGhpcy5hcGkgPSBhcGk7XG4gICAgdGhpcy5jcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzO1xuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgICB0aGlzLmZldGNoID0gZmV0Y2gyO1xuICAgIHRoaXMucHJlcGFyZVNlbmRNZXNzYWdlc1JlcXVlc3QgPSBwcmVwYXJlU2VuZE1lc3NhZ2VzUmVxdWVzdDtcbiAgICB0aGlzLnByZXBhcmVSZWNvbm5lY3RUb1N0cmVhbVJlcXVlc3QgPSBwcmVwYXJlUmVjb25uZWN0VG9TdHJlYW1SZXF1ZXN0O1xuICB9XG4gIGFzeW5jIHNlbmRNZXNzYWdlcyh7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgLi4ub3B0aW9uc1xuICB9KSB7XG4gICAgdmFyIF9hMjEsIF9iLCBfYywgX2QsIF9lO1xuICAgIGNvbnN0IHJlc29sdmVkQm9keSA9IGF3YWl0IHJlc29sdmUyKHRoaXMuYm9keSk7XG4gICAgY29uc3QgcmVzb2x2ZWRIZWFkZXJzID0gYXdhaXQgcmVzb2x2ZTIodGhpcy5oZWFkZXJzKTtcbiAgICBjb25zdCByZXNvbHZlZENyZWRlbnRpYWxzID0gYXdhaXQgcmVzb2x2ZTIodGhpcy5jcmVkZW50aWFscyk7XG4gICAgY29uc3QgYmFzZUhlYWRlcnMgPSB7XG4gICAgICAuLi5ub3JtYWxpemVIZWFkZXJzKHJlc29sdmVkSGVhZGVycyksXG4gICAgICAuLi5ub3JtYWxpemVIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgICB9O1xuICAgIGNvbnN0IHByZXBhcmVkUmVxdWVzdCA9IGF3YWl0ICgoX2EyMSA9IHRoaXMucHJlcGFyZVNlbmRNZXNzYWdlc1JlcXVlc3QpID09IG51bGwgPyB2b2lkIDAgOiBfYTIxLmNhbGwodGhpcywge1xuICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgIGlkOiBvcHRpb25zLmNoYXRJZCxcbiAgICAgIG1lc3NhZ2VzOiBvcHRpb25zLm1lc3NhZ2VzLFxuICAgICAgYm9keTogeyAuLi5yZXNvbHZlZEJvZHksIC4uLm9wdGlvbnMuYm9keSB9LFxuICAgICAgaGVhZGVyczogYmFzZUhlYWRlcnMsXG4gICAgICBjcmVkZW50aWFsczogcmVzb2x2ZWRDcmVkZW50aWFscyxcbiAgICAgIHJlcXVlc3RNZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgIHRyaWdnZXI6IG9wdGlvbnMudHJpZ2dlcixcbiAgICAgIG1lc3NhZ2VJZDogb3B0aW9ucy5tZXNzYWdlSWRcbiAgICB9KSk7XG4gICAgY29uc3QgYXBpID0gKF9iID0gcHJlcGFyZWRSZXF1ZXN0ID09IG51bGwgPyB2b2lkIDAgOiBwcmVwYXJlZFJlcXVlc3QuYXBpKSAhPSBudWxsID8gX2IgOiB0aGlzLmFwaTtcbiAgICBjb25zdCBoZWFkZXJzID0gKHByZXBhcmVkUmVxdWVzdCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZWRSZXF1ZXN0LmhlYWRlcnMpICE9PSB2b2lkIDAgPyBub3JtYWxpemVIZWFkZXJzKHByZXBhcmVkUmVxdWVzdC5oZWFkZXJzKSA6IGJhc2VIZWFkZXJzO1xuICAgIGNvbnN0IGJvZHkgPSAocHJlcGFyZWRSZXF1ZXN0ID09IG51bGwgPyB2b2lkIDAgOiBwcmVwYXJlZFJlcXVlc3QuYm9keSkgIT09IHZvaWQgMCA/IHByZXBhcmVkUmVxdWVzdC5ib2R5IDoge1xuICAgICAgLi4ucmVzb2x2ZWRCb2R5LFxuICAgICAgLi4ub3B0aW9ucy5ib2R5LFxuICAgICAgaWQ6IG9wdGlvbnMuY2hhdElkLFxuICAgICAgbWVzc2FnZXM6IG9wdGlvbnMubWVzc2FnZXMsXG4gICAgICB0cmlnZ2VyOiBvcHRpb25zLnRyaWdnZXIsXG4gICAgICBtZXNzYWdlSWQ6IG9wdGlvbnMubWVzc2FnZUlkXG4gICAgfTtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IChfYyA9IHByZXBhcmVkUmVxdWVzdCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZWRSZXF1ZXN0LmNyZWRlbnRpYWxzKSAhPSBudWxsID8gX2MgOiByZXNvbHZlZENyZWRlbnRpYWxzO1xuICAgIGNvbnN0IGZldGNoMiA9IChfZCA9IHRoaXMuZmV0Y2gpICE9IG51bGwgPyBfZCA6IGdsb2JhbFRoaXMuZmV0Y2g7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaDIoYXBpLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgLi4uaGVhZGVyc1xuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgY3JlZGVudGlhbHMsXG4gICAgICBzaWduYWw6IGFib3J0U2lnbmFsXG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAoX2UgPSBhd2FpdCByZXNwb25zZS50ZXh0KCkpICE9IG51bGwgPyBfZSA6IFwiRmFpbGVkIHRvIGZldGNoIHRoZSBjaGF0IHJlc3BvbnNlLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLmJvZHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSByZXNwb25zZSBib2R5IGlzIGVtcHR5LlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlU3RyZWFtKHJlc3BvbnNlLmJvZHkpO1xuICB9XG4gIGFzeW5jIHJlY29ubmVjdFRvU3RyZWFtKG9wdGlvbnMpIHtcbiAgICB2YXIgX2EyMSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgY29uc3QgcmVzb2x2ZWRCb2R5ID0gYXdhaXQgcmVzb2x2ZTIodGhpcy5ib2R5KTtcbiAgICBjb25zdCByZXNvbHZlZEhlYWRlcnMgPSBhd2FpdCByZXNvbHZlMih0aGlzLmhlYWRlcnMpO1xuICAgIGNvbnN0IHJlc29sdmVkQ3JlZGVudGlhbHMgPSBhd2FpdCByZXNvbHZlMih0aGlzLmNyZWRlbnRpYWxzKTtcbiAgICBjb25zdCBiYXNlSGVhZGVycyA9IHtcbiAgICAgIC4uLm5vcm1hbGl6ZUhlYWRlcnMocmVzb2x2ZWRIZWFkZXJzKSxcbiAgICAgIC4uLm5vcm1hbGl6ZUhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICAgIH07XG4gICAgY29uc3QgcHJlcGFyZWRSZXF1ZXN0ID0gYXdhaXQgKChfYTIxID0gdGhpcy5wcmVwYXJlUmVjb25uZWN0VG9TdHJlYW1SZXF1ZXN0KSA9PSBudWxsID8gdm9pZCAwIDogX2EyMS5jYWxsKHRoaXMsIHtcbiAgICAgIGFwaTogdGhpcy5hcGksXG4gICAgICBpZDogb3B0aW9ucy5jaGF0SWQsXG4gICAgICBib2R5OiB7IC4uLnJlc29sdmVkQm9keSwgLi4ub3B0aW9ucy5ib2R5IH0sXG4gICAgICBoZWFkZXJzOiBiYXNlSGVhZGVycyxcbiAgICAgIGNyZWRlbnRpYWxzOiByZXNvbHZlZENyZWRlbnRpYWxzLFxuICAgICAgcmVxdWVzdE1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhXG4gICAgfSkpO1xuICAgIGNvbnN0IGFwaSA9IChfYiA9IHByZXBhcmVkUmVxdWVzdCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZWRSZXF1ZXN0LmFwaSkgIT0gbnVsbCA/IF9iIDogYCR7dGhpcy5hcGl9LyR7b3B0aW9ucy5jaGF0SWR9L3N0cmVhbWA7XG4gICAgY29uc3QgaGVhZGVycyA9IChwcmVwYXJlZFJlcXVlc3QgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXBhcmVkUmVxdWVzdC5oZWFkZXJzKSAhPT0gdm9pZCAwID8gbm9ybWFsaXplSGVhZGVycyhwcmVwYXJlZFJlcXVlc3QuaGVhZGVycykgOiBiYXNlSGVhZGVycztcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IChfYyA9IHByZXBhcmVkUmVxdWVzdCA9PSBudWxsID8gdm9pZCAwIDogcHJlcGFyZWRSZXF1ZXN0LmNyZWRlbnRpYWxzKSAhPSBudWxsID8gX2MgOiByZXNvbHZlZENyZWRlbnRpYWxzO1xuICAgIGNvbnN0IGZldGNoMiA9IChfZCA9IHRoaXMuZmV0Y2gpICE9IG51bGwgPyBfZCA6IGdsb2JhbFRoaXMuZmV0Y2g7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaDIoYXBpLCB7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBoZWFkZXJzLFxuICAgICAgY3JlZGVudGlhbHNcbiAgICB9KTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIChfZSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKSkgIT0gbnVsbCA/IF9lIDogXCJGYWlsZWQgdG8gZmV0Y2ggdGhlIGNoYXQgcmVzcG9uc2UuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuYm9keSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHJlc3BvbnNlIGJvZHkgaXMgZW1wdHkuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2VTdHJlYW0ocmVzcG9uc2UuYm9keSk7XG4gIH1cbn07XG5cbi8vIHNyYy91aS9kZWZhdWx0LWNoYXQtdHJhbnNwb3J0LnRzXG52YXIgRGVmYXVsdENoYXRUcmFuc3BvcnQgPSBjbGFzcyBleHRlbmRzIEh0dHBDaGF0VHJhbnNwb3J0IHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gIH1cbiAgcHJvY2Vzc1Jlc3BvbnNlU3RyZWFtKHN0cmVhbSkge1xuICAgIHJldHVybiBwYXJzZUpzb25FdmVudFN0cmVhbTIoe1xuICAgICAgc3RyZWFtLFxuICAgICAgc2NoZW1hOiB1aU1lc3NhZ2VDaHVua1NjaGVtYVxuICAgIH0pLnBpcGVUaHJvdWdoKFxuICAgICAgbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgICAgIGlmICghY2h1bmsuc3VjY2Vzcykge1xuICAgICAgICAgICAgdGhyb3cgY2h1bmsuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuay52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufTtcblxuLy8gc3JjL3VpL2NoYXQudHNcbnZhciBBYnN0cmFjdENoYXQgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBnZW5lcmF0ZUlkOiBnZW5lcmF0ZUlkMiA9IGdlbmVyYXRlSWRGdW5jMixcbiAgICBpZCA9IGdlbmVyYXRlSWQyKCksXG4gICAgdHJhbnNwb3J0ID0gbmV3IERlZmF1bHRDaGF0VHJhbnNwb3J0KCksXG4gICAgbWVzc2FnZU1ldGFkYXRhU2NoZW1hLFxuICAgIGRhdGFQYXJ0U2NoZW1hcyxcbiAgICBzdGF0ZSxcbiAgICBvbkVycm9yLFxuICAgIG9uVG9vbENhbGwsXG4gICAgb25GaW5pc2gsXG4gICAgb25EYXRhLFxuICAgIHNlbmRBdXRvbWF0aWNhbGx5V2hlblxuICB9KSB7XG4gICAgdGhpcy5hY3RpdmVSZXNwb25zZSA9IHZvaWQgMDtcbiAgICB0aGlzLmpvYkV4ZWN1dG9yID0gbmV3IFNlcmlhbEpvYkV4ZWN1dG9yKCk7XG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBvciByZXBsYWNlcyBhIHVzZXIgbWVzc2FnZSB0byB0aGUgY2hhdCBsaXN0LiBUaGlzIHRyaWdnZXJzIHRoZSBBUEkgY2FsbCB0byBmZXRjaFxuICAgICAqIHRoZSBhc3Npc3RhbnQncyByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIElmIGEgbWVzc2FnZUlkIGlzIHByb3ZpZGVkLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHJlcGxhY2VkLlxuICAgICAqL1xuICAgIHRoaXMuc2VuZE1lc3NhZ2UgPSBhc3luYyAobWVzc2FnZSwgb3B0aW9ucykgPT4ge1xuICAgICAgdmFyIF9hMjEsIF9iLCBfYywgX2Q7XG4gICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWFrZVJlcXVlc3Qoe1xuICAgICAgICAgIHRyaWdnZXI6IFwic3VibWl0LW1lc3NhZ2VcIixcbiAgICAgICAgICBtZXNzYWdlSWQ6IChfYTIxID0gdGhpcy5sYXN0TWVzc2FnZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjEuaWQsXG4gICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IHVpTWVzc2FnZTtcbiAgICAgIGlmIChcInRleHRcIiBpbiBtZXNzYWdlIHx8IFwiZmlsZXNcIiBpbiBtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXJ0cyA9IEFycmF5LmlzQXJyYXkobWVzc2FnZS5maWxlcykgPyBtZXNzYWdlLmZpbGVzIDogYXdhaXQgY29udmVydEZpbGVMaXN0VG9GaWxlVUlQYXJ0cyhtZXNzYWdlLmZpbGVzKTtcbiAgICAgICAgdWlNZXNzYWdlID0ge1xuICAgICAgICAgIHBhcnRzOiBbXG4gICAgICAgICAgICAuLi5maWxlUGFydHMsXG4gICAgICAgICAgICAuLi5cInRleHRcIiBpbiBtZXNzYWdlICYmIG1lc3NhZ2UudGV4dCAhPSBudWxsID8gW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IG1lc3NhZ2UudGV4dCB9XSA6IFtdXG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdWlNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VJZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJbmRleCA9IHRoaXMuc3RhdGUubWVzc2FnZXMuZmluZEluZGV4KFxuICAgICAgICAgIChtKSA9PiBtLmlkID09PSBtZXNzYWdlLm1lc3NhZ2VJZFxuICAgICAgICApO1xuICAgICAgICBpZiAobWVzc2FnZUluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbWVzc2FnZSB3aXRoIGlkICR7bWVzc2FnZS5tZXNzYWdlSWR9IG5vdCBmb3VuZGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLm1lc3NhZ2VzW21lc3NhZ2VJbmRleF0ucm9sZSAhPT0gXCJ1c2VyXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgbWVzc2FnZSB3aXRoIGlkICR7bWVzc2FnZS5tZXNzYWdlSWR9IGlzIG5vdCBhIHVzZXIgbWVzc2FnZWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUubWVzc2FnZXMgPSB0aGlzLnN0YXRlLm1lc3NhZ2VzLnNsaWNlKDAsIG1lc3NhZ2VJbmRleCArIDEpO1xuICAgICAgICB0aGlzLnN0YXRlLnJlcGxhY2VNZXNzYWdlKG1lc3NhZ2VJbmRleCwge1xuICAgICAgICAgIC4uLnVpTWVzc2FnZSxcbiAgICAgICAgICBpZDogbWVzc2FnZS5tZXNzYWdlSWQsXG4gICAgICAgICAgcm9sZTogKF9iID0gdWlNZXNzYWdlLnJvbGUpICE9IG51bGwgPyBfYiA6IFwidXNlclwiLFxuICAgICAgICAgIG1ldGFkYXRhOiBtZXNzYWdlLm1ldGFkYXRhXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5wdXNoTWVzc2FnZSh7XG4gICAgICAgICAgLi4udWlNZXNzYWdlLFxuICAgICAgICAgIGlkOiAoX2MgPSB1aU1lc3NhZ2UuaWQpICE9IG51bGwgPyBfYyA6IHRoaXMuZ2VuZXJhdGVJZCgpLFxuICAgICAgICAgIHJvbGU6IChfZCA9IHVpTWVzc2FnZS5yb2xlKSAhPSBudWxsID8gX2QgOiBcInVzZXJcIixcbiAgICAgICAgICBtZXRhZGF0YTogbWVzc2FnZS5tZXRhZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMubWFrZVJlcXVlc3Qoe1xuICAgICAgICB0cmlnZ2VyOiBcInN1Ym1pdC1tZXNzYWdlXCIsXG4gICAgICAgIG1lc3NhZ2VJZDogbWVzc2FnZS5tZXNzYWdlSWQsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVnZW5lcmF0ZSB0aGUgYXNzaXN0YW50IG1lc3NhZ2Ugd2l0aCB0aGUgcHJvdmlkZWQgbWVzc2FnZSBpZC5cbiAgICAgKiBJZiBubyBtZXNzYWdlIGlkIGlzIHByb3ZpZGVkLCB0aGUgbGFzdCBhc3Npc3RhbnQgbWVzc2FnZSB3aWxsIGJlIHJlZ2VuZXJhdGVkLlxuICAgICAqL1xuICAgIHRoaXMucmVnZW5lcmF0ZSA9IGFzeW5jICh7XG4gICAgICBtZXNzYWdlSWQsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlSW5kZXggPSBtZXNzYWdlSWQgPT0gbnVsbCA/IHRoaXMuc3RhdGUubWVzc2FnZXMubGVuZ3RoIC0gMSA6IHRoaXMuc3RhdGUubWVzc2FnZXMuZmluZEluZGV4KChtZXNzYWdlKSA9PiBtZXNzYWdlLmlkID09PSBtZXNzYWdlSWQpO1xuICAgICAgaWYgKG1lc3NhZ2VJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtZXNzYWdlICR7bWVzc2FnZUlkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhdGUubWVzc2FnZXMgPSB0aGlzLnN0YXRlLm1lc3NhZ2VzLnNsaWNlKFxuICAgICAgICAwLFxuICAgICAgICAvLyBpZiB0aGUgbWVzc2FnZSBpcyBhIHVzZXIgbWVzc2FnZSwgd2UgbmVlZCB0byBpbmNsdWRlIGl0IGluIHRoZSByZXF1ZXN0OlxuICAgICAgICB0aGlzLm1lc3NhZ2VzW21lc3NhZ2VJbmRleF0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiA/IG1lc3NhZ2VJbmRleCA6IG1lc3NhZ2VJbmRleCArIDFcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0KHtcbiAgICAgICAgdHJpZ2dlcjogXCJyZWdlbmVyYXRlLW1lc3NhZ2VcIixcbiAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgdG8gcmVzdW1lIGFuIG9uZ29pbmcgc3RyZWFtaW5nIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIHRoaXMucmVzdW1lU3RyZWFtID0gYXN5bmMgKG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5tYWtlUmVxdWVzdCh7IHRyaWdnZXI6IFwicmVzdW1lLXN0cmVhbVwiLCAuLi5vcHRpb25zIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIGVycm9yIHN0YXRlIGFuZCBzZXQgdGhlIHN0YXR1cyB0byByZWFkeSBpZiB0aGUgY2hhdCBpcyBpbiBhbiBlcnJvciBzdGF0ZS5cbiAgICAgKi9cbiAgICB0aGlzLmNsZWFyRXJyb3IgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPT09IFwiZXJyb3JcIikge1xuICAgICAgICB0aGlzLnN0YXRlLmVycm9yID0gdm9pZCAwO1xuICAgICAgICB0aGlzLnNldFN0YXR1cyh7IHN0YXR1czogXCJyZWFkeVwiIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5hZGRUb29sQXBwcm92YWxSZXNwb25zZSA9IGFzeW5jICh7XG4gICAgICBpZCxcbiAgICAgIGFwcHJvdmVkLFxuICAgICAgcmVhc29uLFxuICAgICAgb3B0aW9uc1xuICAgIH0pID0+IHRoaXMuam9iRXhlY3V0b3IucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5zdGF0ZS5tZXNzYWdlcztcbiAgICAgIGNvbnN0IGxhc3RNZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCB1cGRhdGVQYXJ0ID0gKHBhcnQpID0+IGlzVG9vbFVJUGFydChwYXJ0KSAmJiBwYXJ0LnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiICYmIHBhcnQuYXBwcm92YWwuaWQgPT09IGlkID8ge1xuICAgICAgICAuLi5wYXJ0LFxuICAgICAgICBzdGF0ZTogXCJhcHByb3ZhbC1yZXNwb25kZWRcIixcbiAgICAgICAgYXBwcm92YWw6IHsgaWQsIGFwcHJvdmVkLCByZWFzb24gfVxuICAgICAgfSA6IHBhcnQ7XG4gICAgICB0aGlzLnN0YXRlLnJlcGxhY2VNZXNzYWdlKG1lc3NhZ2VzLmxlbmd0aCAtIDEsIHtcbiAgICAgICAgLi4ubGFzdE1lc3NhZ2UsXG4gICAgICAgIHBhcnRzOiBsYXN0TWVzc2FnZS5wYXJ0cy5tYXAodXBkYXRlUGFydClcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuYWN0aXZlUmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVSZXNwb25zZS5zdGF0ZS5tZXNzYWdlLnBhcnRzID0gdGhpcy5hY3RpdmVSZXNwb25zZS5zdGF0ZS5tZXNzYWdlLnBhcnRzLm1hcCh1cGRhdGVQYXJ0KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXR1cyAhPT0gXCJzdHJlYW1pbmdcIiAmJiB0aGlzLnN0YXR1cyAhPT0gXCJzdWJtaXR0ZWRcIiAmJiB0aGlzLnNlbmRBdXRvbWF0aWNhbGx5V2hlbikge1xuICAgICAgICB0aGlzLnNob3VsZFNlbmRBdXRvbWF0aWNhbGx5KCkudGhlbigoc2hvdWxkU2VuZCkgPT4ge1xuICAgICAgICAgIHZhciBfYTIxO1xuICAgICAgICAgIGlmIChzaG91bGRTZW5kKSB7XG4gICAgICAgICAgICB0aGlzLm1ha2VSZXF1ZXN0KHtcbiAgICAgICAgICAgICAgdHJpZ2dlcjogXCJzdWJtaXQtbWVzc2FnZVwiLFxuICAgICAgICAgICAgICBtZXNzYWdlSWQ6IChfYTIxID0gdGhpcy5sYXN0TWVzc2FnZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjEuaWQsXG4gICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5hZGRUb29sT3V0cHV0ID0gYXN5bmMgKHtcbiAgICAgIHN0YXRlID0gXCJvdXRwdXQtYXZhaWxhYmxlXCIsXG4gICAgICB0b29sQ2FsbElkLFxuICAgICAgb3V0cHV0LFxuICAgICAgZXJyb3JUZXh0LFxuICAgICAgb3B0aW9uc1xuICAgIH0pID0+IHRoaXMuam9iRXhlY3V0b3IucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5zdGF0ZS5tZXNzYWdlcztcbiAgICAgIGNvbnN0IGxhc3RNZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCB1cGRhdGVQYXJ0ID0gKHBhcnQpID0+IGlzVG9vbFVJUGFydChwYXJ0KSAmJiBwYXJ0LnRvb2xDYWxsSWQgPT09IHRvb2xDYWxsSWQgPyB7IC4uLnBhcnQsIHN0YXRlLCBvdXRwdXQsIGVycm9yVGV4dCB9IDogcGFydDtcbiAgICAgIHRoaXMuc3RhdGUucmVwbGFjZU1lc3NhZ2UobWVzc2FnZXMubGVuZ3RoIC0gMSwge1xuICAgICAgICAuLi5sYXN0TWVzc2FnZSxcbiAgICAgICAgcGFydHM6IGxhc3RNZXNzYWdlLnBhcnRzLm1hcCh1cGRhdGVQYXJ0KVxuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5hY3RpdmVSZXNwb25zZSkge1xuICAgICAgICB0aGlzLmFjdGl2ZVJlc3BvbnNlLnN0YXRlLm1lc3NhZ2UucGFydHMgPSB0aGlzLmFjdGl2ZVJlc3BvbnNlLnN0YXRlLm1lc3NhZ2UucGFydHMubWFwKHVwZGF0ZVBhcnQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RhdHVzICE9PSBcInN0cmVhbWluZ1wiICYmIHRoaXMuc3RhdHVzICE9PSBcInN1Ym1pdHRlZFwiICYmIHRoaXMuc2VuZEF1dG9tYXRpY2FsbHlXaGVuKSB7XG4gICAgICAgIHRoaXMuc2hvdWxkU2VuZEF1dG9tYXRpY2FsbHkoKS50aGVuKChzaG91bGRTZW5kKSA9PiB7XG4gICAgICAgICAgdmFyIF9hMjE7XG4gICAgICAgICAgaWYgKHNob3VsZFNlbmQpIHtcbiAgICAgICAgICAgIHRoaXMubWFrZVJlcXVlc3Qoe1xuICAgICAgICAgICAgICB0cmlnZ2VyOiBcInN1Ym1pdC1tZXNzYWdlXCIsXG4gICAgICAgICAgICAgIG1lc3NhZ2VJZDogKF9hMjEgPSB0aGlzLmxhc3RNZXNzYWdlKSA9PSBudWxsID8gdm9pZCAwIDogX2EyMS5pZCxcbiAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGFkZFRvb2xPdXRwdXQgKi9cbiAgICB0aGlzLmFkZFRvb2xSZXN1bHQgPSB0aGlzLmFkZFRvb2xPdXRwdXQ7XG4gICAgLyoqXG4gICAgICogQWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBpbW1lZGlhdGVseSwga2VlcCB0aGUgZ2VuZXJhdGVkIHRva2VucyBpZiBhbnkuXG4gICAgICovXG4gICAgdGhpcy5zdG9wID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdmFyIF9hMjE7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgIT09IFwic3RyZWFtaW5nXCIgJiYgdGhpcy5zdGF0dXMgIT09IFwic3VibWl0dGVkXCIpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGlmICgoX2EyMSA9IHRoaXMuYWN0aXZlUmVzcG9uc2UpID09IG51bGwgPyB2b2lkIDAgOiBfYTIxLmFib3J0Q29udHJvbGxlcikge1xuICAgICAgICB0aGlzLmFjdGl2ZVJlc3BvbnNlLmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICAgIHRoaXMuZ2VuZXJhdGVJZCA9IGdlbmVyYXRlSWQyO1xuICAgIHRoaXMubWVzc2FnZU1ldGFkYXRhU2NoZW1hID0gbWVzc2FnZU1ldGFkYXRhU2NoZW1hO1xuICAgIHRoaXMuZGF0YVBhcnRTY2hlbWFzID0gZGF0YVBhcnRTY2hlbWFzO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xuICAgIHRoaXMub25Ub29sQ2FsbCA9IG9uVG9vbENhbGw7XG4gICAgdGhpcy5vbkZpbmlzaCA9IG9uRmluaXNoO1xuICAgIHRoaXMub25EYXRhID0gb25EYXRhO1xuICAgIHRoaXMuc2VuZEF1dG9tYXRpY2FsbHlXaGVuID0gc2VuZEF1dG9tYXRpY2FsbHlXaGVuO1xuICB9XG4gIC8qKlxuICAgKiBIb29rIHN0YXR1czpcbiAgICpcbiAgICogLSBgc3VibWl0dGVkYDogVGhlIG1lc3NhZ2UgaGFzIGJlZW4gc2VudCB0byB0aGUgQVBJIGFuZCB3ZSdyZSBhd2FpdGluZyB0aGUgc3RhcnQgb2YgdGhlIHJlc3BvbnNlIHN0cmVhbS5cbiAgICogLSBgc3RyZWFtaW5nYDogVGhlIHJlc3BvbnNlIGlzIGFjdGl2ZWx5IHN0cmVhbWluZyBpbiBmcm9tIHRoZSBBUEksIHJlY2VpdmluZyBjaHVua3Mgb2YgZGF0YS5cbiAgICogLSBgcmVhZHlgOiBUaGUgZnVsbCByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkOyBhIG5ldyB1c2VyIG1lc3NhZ2UgY2FuIGJlIHN1Ym1pdHRlZC5cbiAgICogLSBgZXJyb3JgOiBBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIEFQSSByZXF1ZXN0LCBwcmV2ZW50aW5nIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi5cbiAgICovXG4gIGdldCBzdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuc3RhdHVzO1xuICB9XG4gIHNldFN0YXR1cyh7XG4gICAgc3RhdHVzLFxuICAgIGVycm9yXG4gIH0pIHtcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09IHN0YXR1cylcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnN0YXRlLnN0YXR1cyA9IHN0YXR1cztcbiAgICB0aGlzLnN0YXRlLmVycm9yID0gZXJyb3I7XG4gIH1cbiAgZ2V0IGVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmVycm9yO1xuICB9XG4gIGdldCBtZXNzYWdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5tZXNzYWdlcztcbiAgfVxuICBnZXQgbGFzdE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUubWVzc2FnZXNbdGhpcy5zdGF0ZS5tZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgfVxuICBzZXQgbWVzc2FnZXMobWVzc2FnZXMpIHtcbiAgICB0aGlzLnN0YXRlLm1lc3NhZ2VzID0gbWVzc2FnZXM7XG4gIH1cbiAgYXN5bmMgc2hvdWxkU2VuZEF1dG9tYXRpY2FsbHkoKSB7XG4gICAgaWYgKCF0aGlzLnNlbmRBdXRvbWF0aWNhbGx5V2hlbilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlbmRBdXRvbWF0aWNhbGx5V2hlbih7XG4gICAgICBtZXNzYWdlczogdGhpcy5zdGF0ZS5tZXNzYWdlc1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiBcInRoZW5cIiBpbiByZXN1bHQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgYXN5bmMgbWFrZVJlcXVlc3Qoe1xuICAgIHRyaWdnZXIsXG4gICAgbWV0YWRhdGEsXG4gICAgaGVhZGVycyxcbiAgICBib2R5LFxuICAgIG1lc3NhZ2VJZFxuICB9KSB7XG4gICAgdmFyIF9hMjEsIF9iLCBfYztcbiAgICBsZXQgcmVzdW1lU3RyZWFtO1xuICAgIGlmICh0cmlnZ2VyID09PSBcInJlc3VtZS1zdHJlYW1cIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVjb25uZWN0ID0gYXdhaXQgdGhpcy50cmFuc3BvcnQucmVjb25uZWN0VG9TdHJlYW0oe1xuICAgICAgICAgIGNoYXRJZDogdGhpcy5pZCxcbiAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIGJvZHlcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZWNvbm5lY3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bWVTdHJlYW0gPSByZWNvbm5lY3Q7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKHRoaXMub25FcnJvciAmJiBlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHRoaXMub25FcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdHVzKHsgc3RhdHVzOiBcImVycm9yXCIsIGVycm9yOiBlcnIgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZXRTdGF0dXMoeyBzdGF0dXM6IFwic3VibWl0dGVkXCIsIGVycm9yOiB2b2lkIDAgfSk7XG4gICAgY29uc3QgbGFzdE1lc3NhZ2UgPSB0aGlzLmxhc3RNZXNzYWdlO1xuICAgIGxldCBpc0Fib3J0ID0gZmFsc2U7XG4gICAgbGV0IGlzRGlzY29ubmVjdCA9IGZhbHNlO1xuICAgIGxldCBpc0Vycm9yID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFjdGl2ZVJlc3BvbnNlID0ge1xuICAgICAgICBzdGF0ZTogY3JlYXRlU3RyZWFtaW5nVUlNZXNzYWdlU3RhdGUoe1xuICAgICAgICAgIGxhc3RNZXNzYWdlOiB0aGlzLnN0YXRlLnNuYXBzaG90KGxhc3RNZXNzYWdlKSxcbiAgICAgICAgICBtZXNzYWdlSWQ6IHRoaXMuZ2VuZXJhdGVJZCgpXG4gICAgICAgIH0pLFxuICAgICAgICBhYm9ydENvbnRyb2xsZXI6IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgfTtcbiAgICAgIGFjdGl2ZVJlc3BvbnNlLmFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHtcbiAgICAgICAgaXNBYm9ydCA9IHRydWU7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWN0aXZlUmVzcG9uc2UgPSBhY3RpdmVSZXNwb25zZTtcbiAgICAgIGxldCBzdHJlYW07XG4gICAgICBpZiAodHJpZ2dlciA9PT0gXCJyZXN1bWUtc3RyZWFtXCIpIHtcbiAgICAgICAgc3RyZWFtID0gcmVzdW1lU3RyZWFtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyZWFtID0gYXdhaXQgdGhpcy50cmFuc3BvcnQuc2VuZE1lc3NhZ2VzKHtcbiAgICAgICAgICBjaGF0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgbWVzc2FnZXM6IHRoaXMuc3RhdGUubWVzc2FnZXMsXG4gICAgICAgICAgYWJvcnRTaWduYWw6IGFjdGl2ZVJlc3BvbnNlLmFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgbWVzc2FnZUlkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcnVuVXBkYXRlTWVzc2FnZUpvYiA9IChqb2IpID0+IChcbiAgICAgICAgLy8gc2VyaWFsaXplIHRoZSBqb2IgZXhlY3V0aW9uIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uczpcbiAgICAgICAgdGhpcy5qb2JFeGVjdXRvci5ydW4oXG4gICAgICAgICAgKCkgPT4gam9iKHtcbiAgICAgICAgICAgIHN0YXRlOiBhY3RpdmVSZXNwb25zZS5zdGF0ZSxcbiAgICAgICAgICAgIHdyaXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHZhciBfYTIyO1xuICAgICAgICAgICAgICB0aGlzLnNldFN0YXR1cyh7IHN0YXR1czogXCJzdHJlYW1pbmdcIiB9KTtcbiAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZUxhc3RNZXNzYWdlID0gYWN0aXZlUmVzcG9uc2Uuc3RhdGUubWVzc2FnZS5pZCA9PT0gKChfYTIyID0gdGhpcy5sYXN0TWVzc2FnZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMjIuaWQpO1xuICAgICAgICAgICAgICBpZiAocmVwbGFjZUxhc3RNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5yZXBsYWNlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUubWVzc2FnZXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVJlc3BvbnNlLnN0YXRlLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUucHVzaE1lc3NhZ2UoYWN0aXZlUmVzcG9uc2Uuc3RhdGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgYXdhaXQgY29uc3VtZVN0cmVhbSh7XG4gICAgICAgIHN0cmVhbTogcHJvY2Vzc1VJTWVzc2FnZVN0cmVhbSh7XG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIG9uVG9vbENhbGw6IHRoaXMub25Ub29sQ2FsbCxcbiAgICAgICAgICBvbkRhdGE6IHRoaXMub25EYXRhLFxuICAgICAgICAgIG1lc3NhZ2VNZXRhZGF0YVNjaGVtYTogdGhpcy5tZXNzYWdlTWV0YWRhdGFTY2hlbWEsXG4gICAgICAgICAgZGF0YVBhcnRTY2hlbWFzOiB0aGlzLmRhdGFQYXJ0U2NoZW1hcyxcbiAgICAgICAgICBydW5VcGRhdGVNZXNzYWdlSm9iLFxuICAgICAgICAgIG9uRXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgb25FcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRTdGF0dXMoeyBzdGF0dXM6IFwicmVhZHlcIiB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChpc0Fib3J0IHx8IGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikge1xuICAgICAgICBpc0Fib3J0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXRTdGF0dXMoeyBzdGF0dXM6IFwicmVhZHlcIiB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpc0Vycm9yID0gdHJ1ZTtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgKGVyci5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJmZXRjaFwiKSB8fCBlcnIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwibmV0d29ya1wiKSkpIHtcbiAgICAgICAgaXNEaXNjb25uZWN0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9uRXJyb3IgJiYgZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhpcy5vbkVycm9yKGVycik7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFN0YXR1cyh7IHN0YXR1czogXCJlcnJvclwiLCBlcnJvcjogZXJyIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAoX2IgPSB0aGlzLm9uRmluaXNoKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgbWVzc2FnZTogdGhpcy5hY3RpdmVSZXNwb25zZS5zdGF0ZS5tZXNzYWdlLFxuICAgICAgICAgIG1lc3NhZ2VzOiB0aGlzLnN0YXRlLm1lc3NhZ2VzLFxuICAgICAgICAgIGlzQWJvcnQsXG4gICAgICAgICAgaXNEaXNjb25uZWN0LFxuICAgICAgICAgIGlzRXJyb3IsXG4gICAgICAgICAgZmluaXNoUmVhc29uOiAoX2EyMSA9IHRoaXMuYWN0aXZlUmVzcG9uc2UpID09IG51bGwgPyB2b2lkIDAgOiBfYTIxLnN0YXRlLmZpbmlzaFJlYXNvblxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB9XG4gICAgICB0aGlzLmFjdGl2ZVJlc3BvbnNlID0gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAoIWlzRXJyb3IgJiYgYXdhaXQgdGhpcy5zaG91bGRTZW5kQXV0b21hdGljYWxseSgpKSB7XG4gICAgICBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0KHtcbiAgICAgICAgdHJpZ2dlcjogXCJzdWJtaXQtbWVzc2FnZVwiLFxuICAgICAgICBtZXNzYWdlSWQ6IChfYyA9IHRoaXMubGFzdE1lc3NhZ2UpID09IG51bGwgPyB2b2lkIDAgOiBfYy5pZCxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufTtcblxuLy8gc3JjL3VpL2RpcmVjdC1jaGF0LXRyYW5zcG9ydC50c1xudmFyIERpcmVjdENoYXRUcmFuc3BvcnQgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBhZ2VudCxcbiAgICBvcHRpb25zLFxuICAgIC4uLnVpTWVzc2FnZVN0cmVhbU9wdGlvbnNcbiAgfSkge1xuICAgIHRoaXMuYWdlbnQgPSBhZ2VudDtcbiAgICB0aGlzLmFnZW50T3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy51aU1lc3NhZ2VTdHJlYW1PcHRpb25zID0gdWlNZXNzYWdlU3RyZWFtT3B0aW9ucztcbiAgfVxuICBhc3luYyBzZW5kTWVzc2FnZXMoe1xuICAgIG1lc3NhZ2VzLFxuICAgIGFib3J0U2lnbmFsXG4gIH0pIHtcbiAgICBjb25zdCB2YWxpZGF0ZWRNZXNzYWdlcyA9IGF3YWl0IHZhbGlkYXRlVUlNZXNzYWdlcyh7XG4gICAgICBtZXNzYWdlcyxcbiAgICAgIHRvb2xzOiB0aGlzLmFnZW50LnRvb2xzXG4gICAgfSk7XG4gICAgY29uc3QgbW9kZWxNZXNzYWdlcyA9IGF3YWl0IGNvbnZlcnRUb01vZGVsTWVzc2FnZXModmFsaWRhdGVkTWVzc2FnZXMsIHtcbiAgICAgIHRvb2xzOiB0aGlzLmFnZW50LnRvb2xzXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudC5zdHJlYW0oe1xuICAgICAgcHJvbXB0OiBtb2RlbE1lc3NhZ2VzLFxuICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAuLi50aGlzLmFnZW50T3B0aW9ucyAhPT0gdm9pZCAwID8geyBvcHRpb25zOiB0aGlzLmFnZW50T3B0aW9ucyB9IDoge31cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnRvVUlNZXNzYWdlU3RyZWFtKHRoaXMudWlNZXNzYWdlU3RyZWFtT3B0aW9ucyk7XG4gIH1cbiAgLyoqXG4gICAqIERpcmVjdCB0cmFuc3BvcnQgZG9lcyBub3Qgc3VwcG9ydCByZWNvbm5lY3Rpb24gc2luY2UgdGhlcmUgaXMgbm9cbiAgICogcGVyc2lzdGVudCBzZXJ2ZXItc2lkZSBzdHJlYW0gdG8gcmVjb25uZWN0IHRvLlxuICAgKlxuICAgKiBAcmV0dXJucyBBbHdheXMgcmV0dXJucyBgbnVsbGBcbiAgICovXG4gIGFzeW5jIHJlY29ubmVjdFRvU3RyZWFtKF9vcHRpb25zKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbi8vIHNyYy91aS9sYXN0LWFzc2lzdGFudC1tZXNzYWdlLWlzLWNvbXBsZXRlLXdpdGgtYXBwcm92YWwtcmVzcG9uc2VzLnRzXG5mdW5jdGlvbiBsYXN0QXNzaXN0YW50TWVzc2FnZUlzQ29tcGxldGVXaXRoQXBwcm92YWxSZXNwb25zZXMoe1xuICBtZXNzYWdlc1xufSkge1xuICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gIGlmICghbWVzc2FnZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobWVzc2FnZS5yb2xlICE9PSBcImFzc2lzdGFudFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGxhc3RTdGVwU3RhcnRJbmRleCA9IG1lc3NhZ2UucGFydHMucmVkdWNlKChsYXN0SW5kZXgsIHBhcnQsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIHBhcnQudHlwZSA9PT0gXCJzdGVwLXN0YXJ0XCIgPyBpbmRleCA6IGxhc3RJbmRleDtcbiAgfSwgLTEpO1xuICBjb25zdCBsYXN0U3RlcFRvb2xJbnZvY2F0aW9ucyA9IG1lc3NhZ2UucGFydHMuc2xpY2UobGFzdFN0ZXBTdGFydEluZGV4ICsgMSkuZmlsdGVyKGlzVG9vbFVJUGFydCkuZmlsdGVyKChwYXJ0KSA9PiAhcGFydC5wcm92aWRlckV4ZWN1dGVkKTtcbiAgcmV0dXJuIChcbiAgICAvLyBoYXMgYXQgbGVhc3Qgb25lIHRvb2wgYXBwcm92YWwgcmVzcG9uc2VcbiAgICBsYXN0U3RlcFRvb2xJbnZvY2F0aW9ucy5maWx0ZXIoKHBhcnQpID0+IHBhcnQuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVzcG9uZGVkXCIpLmxlbmd0aCA+IDAgJiYgLy8gYWxsIHRvb2wgYXBwcm92YWxzIG11c3QgaGF2ZSBhIHJlc3BvbnNlXG4gICAgbGFzdFN0ZXBUb29sSW52b2NhdGlvbnMuZXZlcnkoXG4gICAgICAocGFydCkgPT4gcGFydC5zdGF0ZSA9PT0gXCJvdXRwdXQtYXZhaWxhYmxlXCIgfHwgcGFydC5zdGF0ZSA9PT0gXCJvdXRwdXQtZXJyb3JcIiB8fCBwYXJ0LnN0YXRlID09PSBcImFwcHJvdmFsLXJlc3BvbmRlZFwiXG4gICAgKVxuICApO1xufVxuXG4vLyBzcmMvdWkvbGFzdC1hc3Npc3RhbnQtbWVzc2FnZS1pcy1jb21wbGV0ZS13aXRoLXRvb2wtY2FsbHMudHNcbmZ1bmN0aW9uIGxhc3RBc3Npc3RhbnRNZXNzYWdlSXNDb21wbGV0ZVdpdGhUb29sQ2FsbHMoe1xuICBtZXNzYWdlc1xufSkge1xuICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gIGlmICghbWVzc2FnZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobWVzc2FnZS5yb2xlICE9PSBcImFzc2lzdGFudFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGxhc3RTdGVwU3RhcnRJbmRleCA9IG1lc3NhZ2UucGFydHMucmVkdWNlKChsYXN0SW5kZXgsIHBhcnQsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIHBhcnQudHlwZSA9PT0gXCJzdGVwLXN0YXJ0XCIgPyBpbmRleCA6IGxhc3RJbmRleDtcbiAgfSwgLTEpO1xuICBjb25zdCBsYXN0U3RlcFRvb2xJbnZvY2F0aW9ucyA9IG1lc3NhZ2UucGFydHMuc2xpY2UobGFzdFN0ZXBTdGFydEluZGV4ICsgMSkuZmlsdGVyKGlzVG9vbFVJUGFydCkuZmlsdGVyKChwYXJ0KSA9PiAhcGFydC5wcm92aWRlckV4ZWN1dGVkKTtcbiAgcmV0dXJuIGxhc3RTdGVwVG9vbEludm9jYXRpb25zLmxlbmd0aCA+IDAgJiYgbGFzdFN0ZXBUb29sSW52b2NhdGlvbnMuZXZlcnkoXG4gICAgKHBhcnQpID0+IHBhcnQuc3RhdGUgPT09IFwib3V0cHV0LWF2YWlsYWJsZVwiIHx8IHBhcnQuc3RhdGUgPT09IFwib3V0cHV0LWVycm9yXCJcbiAgKTtcbn1cblxuLy8gc3JjL3VpL3RyYW5zZm9ybS10ZXh0LXRvLXVpLW1lc3NhZ2Utc3RyZWFtLnRzXG5mdW5jdGlvbiB0cmFuc2Zvcm1UZXh0VG9VaU1lc3NhZ2VTdHJlYW0oe1xuICBzdHJlYW1cbn0pIHtcbiAgcmV0dXJuIHN0cmVhbS5waXBlVGhyb3VnaChcbiAgICBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJzdGFydFwiIH0pO1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcInN0YXJ0LXN0ZXBcIiB9KTtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJ0ZXh0LXN0YXJ0XCIsIGlkOiBcInRleHQtMVwiIH0pO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHRyYW5zZm9ybShwYXJ0LCBjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwidGV4dC1kZWx0YVwiLCBpZDogXCJ0ZXh0LTFcIiwgZGVsdGE6IHBhcnQgfSk7XG4gICAgICB9LFxuICAgICAgYXN5bmMgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcInRleHQtZW5kXCIsIGlkOiBcInRleHQtMVwiIH0pO1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcImZpbmlzaC1zdGVwXCIgfSk7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwiZmluaXNoXCIgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgKTtcbn1cblxuLy8gc3JjL3VpL3RleHQtc3RyZWFtLWNoYXQtdHJhbnNwb3J0LnRzXG52YXIgVGV4dFN0cmVhbUNoYXRUcmFuc3BvcnQgPSBjbGFzcyBleHRlbmRzIEh0dHBDaGF0VHJhbnNwb3J0IHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gIH1cbiAgcHJvY2Vzc1Jlc3BvbnNlU3RyZWFtKHN0cmVhbSkge1xuICAgIHJldHVybiB0cmFuc2Zvcm1UZXh0VG9VaU1lc3NhZ2VTdHJlYW0oe1xuICAgICAgc3RyZWFtOiBzdHJlYW0ucGlwZVRocm91Z2gobmV3IFRleHREZWNvZGVyU3RyZWFtKCkpXG4gICAgfSk7XG4gIH1cbn07XG5leHBvcnQge1xuICBBSVNES0Vycm9yMjEgYXMgQUlTREtFcnJvcixcbiAgQVBJQ2FsbEVycm9yLFxuICBBYnN0cmFjdENoYXQsXG4gIERlZmF1bHRDaGF0VHJhbnNwb3J0LFxuICBEZWZhdWx0R2VuZXJhdGVkRmlsZSxcbiAgRGlyZWN0Q2hhdFRyYW5zcG9ydCxcbiAgRG93bmxvYWRFcnJvcixcbiAgRW1wdHlSZXNwb25zZUJvZHlFcnJvcixcbiAgVG9vbExvb3BBZ2VudCBhcyBFeHBlcmltZW50YWxfQWdlbnQsXG4gIEh0dHBDaGF0VHJhbnNwb3J0LFxuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgSW52YWxpZERhdGFDb250ZW50RXJyb3IsXG4gIEludmFsaWRNZXNzYWdlUm9sZUVycm9yLFxuICBJbnZhbGlkUHJvbXB0RXJyb3IsXG4gIEludmFsaWRSZXNwb25zZURhdGFFcnJvcixcbiAgSW52YWxpZFN0cmVhbVBhcnRFcnJvcixcbiAgSW52YWxpZFRvb2xBcHByb3ZhbEVycm9yLFxuICBJbnZhbGlkVG9vbElucHV0RXJyb3IsXG4gIEpTT05QYXJzZUVycm9yLFxuICBKc29uVG9Tc2VUcmFuc2Zvcm1TdHJlYW0sXG4gIExvYWRBUElLZXlFcnJvcixcbiAgTG9hZFNldHRpbmdFcnJvcixcbiAgTWVzc2FnZUNvbnZlcnNpb25FcnJvcixcbiAgTWlzc2luZ1Rvb2xSZXN1bHRzRXJyb3IsXG4gIE5vQ29udGVudEdlbmVyYXRlZEVycm9yLFxuICBOb0ltYWdlR2VuZXJhdGVkRXJyb3IsXG4gIE5vT2JqZWN0R2VuZXJhdGVkRXJyb3IsXG4gIE5vT3V0cHV0R2VuZXJhdGVkRXJyb3IsXG4gIE5vU3BlZWNoR2VuZXJhdGVkRXJyb3IsXG4gIE5vU3VjaE1vZGVsRXJyb3IsXG4gIE5vU3VjaFByb3ZpZGVyRXJyb3IsXG4gIE5vU3VjaFRvb2xFcnJvcixcbiAgTm9UcmFuc2NyaXB0R2VuZXJhdGVkRXJyb3IsXG4gIE5vVmlkZW9HZW5lcmF0ZWRFcnJvcixcbiAgb3V0cHV0X2V4cG9ydHMgYXMgT3V0cHV0LFxuICBSZXRyeUVycm9yLFxuICBTZXJpYWxKb2JFeGVjdXRvcixcbiAgVGV4dFN0cmVhbUNoYXRUcmFuc3BvcnQsXG4gIFRvb01hbnlFbWJlZGRpbmdWYWx1ZXNGb3JDYWxsRXJyb3IsXG4gIFRvb2xDYWxsTm90Rm91bmRGb3JBcHByb3ZhbEVycm9yLFxuICBUb29sQ2FsbFJlcGFpckVycm9yLFxuICBUb29sTG9vcEFnZW50LFxuICBUeXBlVmFsaWRhdGlvbkVycm9yLFxuICBVSU1lc3NhZ2VTdHJlYW1FcnJvcixcbiAgVUlfTUVTU0FHRV9TVFJFQU1fSEVBREVSUyxcbiAgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3IsXG4gIFVuc3VwcG9ydGVkTW9kZWxWZXJzaW9uRXJyb3IsXG4gIGFkZFRvb2xJbnB1dEV4YW1wbGVzTWlkZGxld2FyZSxcbiAgYXNTY2hlbWE1IGFzIGFzU2NoZW1hLFxuICBhc3Npc3RhbnRNb2RlbE1lc3NhZ2VTY2hlbWEsXG4gIGJpbmRUZWxlbWV0cnlJbnRlZ3JhdGlvbixcbiAgY2FsbENvbXBsZXRpb25BcGksXG4gIGNvbnN1bWVTdHJlYW0sXG4gIGNvbnZlcnRGaWxlTGlzdFRvRmlsZVVJUGFydHMsXG4gIGNvbnZlcnRUb01vZGVsTWVzc2FnZXMsXG4gIGNvc2luZVNpbWlsYXJpdHksXG4gIGNyZWF0ZUFnZW50VUlTdHJlYW0sXG4gIGNyZWF0ZUFnZW50VUlTdHJlYW1SZXNwb25zZSxcbiAgY3JlYXRlRG93bmxvYWQsXG4gIGNyZWF0ZUdhdGV3YXksXG4gIGNyZWF0ZUlkR2VuZXJhdG9yNSBhcyBjcmVhdGVJZEdlbmVyYXRvcixcbiAgY3JlYXRlUHJvdmlkZXJSZWdpc3RyeSxcbiAgY3JlYXRlVGV4dFN0cmVhbVJlc3BvbnNlLFxuICBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0sXG4gIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbVJlc3BvbnNlLFxuICBjdXN0b21Qcm92aWRlcixcbiAgZGVmYXVsdEVtYmVkZGluZ1NldHRpbmdzTWlkZGxld2FyZSxcbiAgZGVmYXVsdFNldHRpbmdzTWlkZGxld2FyZSxcbiAgZHluYW1pY1Rvb2wsXG4gIGVtYmVkLFxuICBlbWJlZE1hbnksXG4gIGV4cGVyaW1lbnRhbF9jcmVhdGVQcm92aWRlclJlZ2lzdHJ5LFxuICBleHBlcmltZW50YWxfY3VzdG9tUHJvdmlkZXIsXG4gIGV4cGVyaW1lbnRhbF9nZW5lcmF0ZUltYWdlLFxuICBnZW5lcmF0ZVNwZWVjaCBhcyBleHBlcmltZW50YWxfZ2VuZXJhdGVTcGVlY2gsXG4gIGV4cGVyaW1lbnRhbF9nZW5lcmF0ZVZpZGVvLFxuICB0cmFuc2NyaWJlIGFzIGV4cGVyaW1lbnRhbF90cmFuc2NyaWJlLFxuICBleHRyYWN0SnNvbk1pZGRsZXdhcmUsXG4gIGV4dHJhY3RSZWFzb25pbmdNaWRkbGV3YXJlLFxuICBnYXRld2F5MiBhcyBnYXRld2F5LFxuICBnZW5lcmF0ZUlkLFxuICBnZW5lcmF0ZUltYWdlLFxuICBnZW5lcmF0ZU9iamVjdCxcbiAgZ2VuZXJhdGVUZXh0LFxuICBnZXRTdGF0aWNUb29sTmFtZSxcbiAgZ2V0VGV4dEZyb21EYXRhVXJsLFxuICBnZXRUb29sTmFtZSxcbiAgZ2V0VG9vbE9yRHluYW1pY1Rvb2xOYW1lLFxuICBoYXNUb29sQ2FsbCxcbiAgaXNEYXRhVUlQYXJ0LFxuICBpc0RlZXBFcXVhbERhdGEsXG4gIGlzRmlsZVVJUGFydCxcbiAgaXNMb29wRmluaXNoZWQsXG4gIGlzUmVhc29uaW5nVUlQYXJ0LFxuICBpc1N0YXRpY1Rvb2xVSVBhcnQsXG4gIGlzVGV4dFVJUGFydCxcbiAgaXNUb29sT3JEeW5hbWljVG9vbFVJUGFydCxcbiAgaXNUb29sVUlQYXJ0LFxuICBqc29uU2NoZW1hLFxuICBsYXN0QXNzaXN0YW50TWVzc2FnZUlzQ29tcGxldGVXaXRoQXBwcm92YWxSZXNwb25zZXMsXG4gIGxhc3RBc3Npc3RhbnRNZXNzYWdlSXNDb21wbGV0ZVdpdGhUb29sQ2FsbHMsXG4gIG1vZGVsTWVzc2FnZVNjaGVtYSxcbiAgcGFyc2VKc29uRXZlbnRTdHJlYW0zIGFzIHBhcnNlSnNvbkV2ZW50U3RyZWFtLFxuICBwYXJzZVBhcnRpYWxKc29uLFxuICBwaXBlQWdlbnRVSVN0cmVhbVRvUmVzcG9uc2UsXG4gIHBpcGVUZXh0U3RyZWFtVG9SZXNwb25zZSxcbiAgcGlwZVVJTWVzc2FnZVN0cmVhbVRvUmVzcG9uc2UsXG4gIHBydW5lTWVzc2FnZXMsXG4gIHJlYWRVSU1lc3NhZ2VTdHJlYW0sXG4gIHJlZ2lzdGVyVGVsZW1ldHJ5SW50ZWdyYXRpb24sXG4gIHJlcmFuayxcbiAgc2FmZVZhbGlkYXRlVUlNZXNzYWdlcyxcbiAgc2ltdWxhdGVSZWFkYWJsZVN0cmVhbSxcbiAgc2ltdWxhdGVTdHJlYW1pbmdNaWRkbGV3YXJlLFxuICBzbW9vdGhTdHJlYW0sXG4gIHN0ZXBDb3VudElzLFxuICBzdHJlYW1PYmplY3QsXG4gIHN0cmVhbVRleHQsXG4gIHN5c3RlbU1vZGVsTWVzc2FnZVNjaGVtYSxcbiAgdG9vbCxcbiAgdG9vbE1vZGVsTWVzc2FnZVNjaGVtYSxcbiAgdWlNZXNzYWdlQ2h1bmtTY2hlbWEsXG4gIHVzZXJNb2RlbE1lc3NhZ2VTY2hlbWEsXG4gIHZhbGlkYXRlVUlNZXNzYWdlcyxcbiAgd3JhcEVtYmVkZGluZ01vZGVsLFxuICB3cmFwSW1hZ2VNb2RlbCxcbiAgd3JhcExhbmd1YWdlTW9kZWwsXG4gIHdyYXBQcm92aWRlcixcbiAgem9kU2NoZW1hMyBhcyB6b2RTY2hlbWFcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/.pnpm/ai@6.0.142_zod@3.25.76/node_modules/ai/dist/index.mjs\n");
/***/ })
};
;