Files
e-tib.com/.next/dev/server/vendor-chunks/@ai-sdk+gateway@3.0.84_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

35 lines
325 KiB
JavaScript

"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-sdk+gateway@3.0.84_zod@3.25.76";
exports.ids = ["vendor-chunks/@ai-sdk+gateway@3.0.84_zod@3.25.76"];
exports.modules = {
/***/ "(action-browser)/./node_modules/.pnpm/@ai-sdk+gateway@3.0.84_zod@3.25.76/node_modules/@ai-sdk/gateway/dist/index.mjs":
/*!***********************************************************************************************************!*\
!*** ./node_modules/.pnpm/@ai-sdk+gateway@3.0.84_zod@3.25.76/node_modules/@ai-sdk/gateway/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 */ GatewayAuthenticationError: () => (/* binding */ GatewayAuthenticationError),\n/* harmony export */ GatewayError: () => (/* binding */ GatewayError),\n/* harmony export */ GatewayInternalServerError: () => (/* binding */ GatewayInternalServerError),\n/* harmony export */ GatewayInvalidRequestError: () => (/* binding */ GatewayInvalidRequestError),\n/* harmony export */ GatewayModelNotFoundError: () => (/* binding */ GatewayModelNotFoundError),\n/* harmony export */ GatewayRateLimitError: () => (/* binding */ GatewayRateLimitError),\n/* harmony export */ GatewayResponseError: () => (/* binding */ GatewayResponseError),\n/* harmony export */ createGateway: () => (/* binding */ createGatewayProvider),\n/* harmony export */ createGatewayProvider: () => (/* binding */ createGatewayProvider),\n/* harmony export */ gateway: () => (/* binding */ gateway)\n/* harmony export */ });\n/* harmony import */ var _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ai-sdk/provider-utils */ \"(action-browser)/./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_2__ = __webpack_require__(/*! @ai-sdk/provider */ \"(action-browser)/./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_1__ = __webpack_require__(/*! zod/v4 */ \"(action-browser)/./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/schemas.js\");\n/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! zod */ \"(action-browser)/./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js\");\n/* harmony import */ var _vercel_oidc__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @vercel/oidc */ \"(action-browser)/./node_modules/.pnpm/@vercel+oidc@3.1.0/node_modules/@vercel/oidc/dist/index.js\");\n// src/gateway-provider.ts\n\n\n// src/errors/as-gateway-error.ts\n\n\n// src/errors/create-gateway-error.ts\n\n\n// src/errors/gateway-error.ts\nvar marker = \"vercel.ai.gateway.error\";\nvar symbol = Symbol.for(marker);\nvar _a, _b;\nvar GatewayError = class _GatewayError extends (_b = Error, _a = symbol, _b) {\n constructor({\n message,\n statusCode = 500,\n cause,\n generationId\n }) {\n super(generationId ? `${message} [${generationId}]` : message);\n this[_a] = true;\n this.statusCode = statusCode;\n this.cause = cause;\n this.generationId = generationId;\n }\n /**\n * Checks if the given error is a Gateway Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is a Gateway Error, false otherwise.\n */\n static isInstance(error) {\n return _GatewayError.hasMarker(error);\n }\n static hasMarker(error) {\n return typeof error === \"object\" && error !== null && symbol in error && error[symbol] === true;\n }\n};\n\n// src/errors/gateway-authentication-error.ts\nvar name = \"GatewayAuthenticationError\";\nvar marker2 = `vercel.ai.gateway.error.${name}`;\nvar symbol2 = Symbol.for(marker2);\nvar _a2, _b2;\nvar GatewayAuthenticationError = class _GatewayAuthenticationError extends (_b2 = GatewayError, _a2 = symbol2, _b2) {\n constructor({\n message = \"Authentication failed\",\n statusCode = 401,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a2] = true;\n // used in isInstance\n this.name = name;\n this.type = \"authentication_error\";\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol2 in error;\n }\n /**\n * Creates a contextual error message when authentication fails\n */\n static createContextualError({\n apiKeyProvided,\n oidcTokenProvided,\n message = \"Authentication failed\",\n statusCode = 401,\n cause,\n generationId\n }) {\n let contextualMessage;\n if (apiKeyProvided) {\n contextualMessage = `AI Gateway authentication failed: Invalid API key.\n\nCreate a new API key: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys\n\nProvide via 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.`;\n } else if (oidcTokenProvided) {\n contextualMessage = `AI Gateway authentication failed: Invalid OIDC token.\n\nRun 'npx vercel link' to link your project, then 'vc env pull' to fetch the token.\n\nAlternatively, use an API key: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys`;\n } else {\n contextualMessage = `AI Gateway authentication failed: No authentication provided.\n\nOption 1 - API key:\nCreate an API key: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys\nProvide via 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.\n\nOption 2 - OIDC token:\nRun 'npx vercel link' to link your project, then 'vc env pull' to fetch the token.`;\n }\n return new _GatewayAuthenticationError({\n message: contextualMessage,\n statusCode,\n cause,\n generationId\n });\n }\n};\n\n// src/errors/gateway-invalid-request-error.ts\nvar name2 = \"GatewayInvalidRequestError\";\nvar marker3 = `vercel.ai.gateway.error.${name2}`;\nvar symbol3 = Symbol.for(marker3);\nvar _a3, _b3;\nvar GatewayInvalidRequestError = class extends (_b3 = GatewayError, _a3 = symbol3, _b3) {\n constructor({\n message = \"Invalid request\",\n statusCode = 400,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a3] = true;\n // used in isInstance\n this.name = name2;\n this.type = \"invalid_request_error\";\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol3 in error;\n }\n};\n\n// src/errors/gateway-rate-limit-error.ts\nvar name3 = \"GatewayRateLimitError\";\nvar marker4 = `vercel.ai.gateway.error.${name3}`;\nvar symbol4 = Symbol.for(marker4);\nvar _a4, _b4;\nvar GatewayRateLimitError = class extends (_b4 = GatewayError, _a4 = symbol4, _b4) {\n constructor({\n message = \"Rate limit exceeded\",\n statusCode = 429,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a4] = true;\n // used in isInstance\n this.name = name3;\n this.type = \"rate_limit_exceeded\";\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol4 in error;\n }\n};\n\n// src/errors/gateway-model-not-found-error.ts\n\n\nvar name4 = \"GatewayModelNotFoundError\";\nvar marker5 = `vercel.ai.gateway.error.${name4}`;\nvar symbol5 = Symbol.for(marker5);\nvar modelNotFoundParamSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n modelId: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n })\n )\n);\nvar _a5, _b5;\nvar GatewayModelNotFoundError = class extends (_b5 = GatewayError, _a5 = symbol5, _b5) {\n constructor({\n message = \"Model not found\",\n statusCode = 404,\n modelId,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a5] = true;\n // used in isInstance\n this.name = name4;\n this.type = \"model_not_found\";\n this.modelId = modelId;\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol5 in error;\n }\n};\n\n// src/errors/gateway-internal-server-error.ts\nvar name5 = \"GatewayInternalServerError\";\nvar marker6 = `vercel.ai.gateway.error.${name5}`;\nvar symbol6 = Symbol.for(marker6);\nvar _a6, _b6;\nvar GatewayInternalServerError = class extends (_b6 = GatewayError, _a6 = symbol6, _b6) {\n constructor({\n message = \"Internal server error\",\n statusCode = 500,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a6] = true;\n // used in isInstance\n this.name = name5;\n this.type = \"internal_server_error\";\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol6 in error;\n }\n};\n\n// src/errors/gateway-response-error.ts\nvar name6 = \"GatewayResponseError\";\nvar marker7 = `vercel.ai.gateway.error.${name6}`;\nvar symbol7 = Symbol.for(marker7);\nvar _a7, _b7;\nvar GatewayResponseError = class extends (_b7 = GatewayError, _a7 = symbol7, _b7) {\n constructor({\n message = \"Invalid response from Gateway\",\n statusCode = 502,\n response,\n validationError,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a7] = true;\n // used in isInstance\n this.name = name6;\n this.type = \"response_error\";\n this.response = response;\n this.validationError = validationError;\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol7 in error;\n }\n};\n\n// src/errors/create-gateway-error.ts\n\nasync function createGatewayErrorFromResponse({\n response,\n statusCode,\n defaultMessage = \"Gateway request failed\",\n cause,\n authMethod\n}) {\n var _a9;\n const parseResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.safeValidateTypes)({\n value: response,\n schema: gatewayErrorResponseSchema\n });\n if (!parseResult.success) {\n const rawGenerationId = typeof response === \"object\" && response !== null && \"generationId\" in response ? response.generationId : void 0;\n return new GatewayResponseError({\n message: `Invalid error response format: ${defaultMessage}`,\n statusCode,\n response,\n validationError: parseResult.error,\n cause,\n generationId: rawGenerationId\n });\n }\n const validatedResponse = parseResult.value;\n const errorType = validatedResponse.error.type;\n const message = validatedResponse.error.message;\n const generationId = (_a9 = validatedResponse.generationId) != null ? _a9 : void 0;\n switch (errorType) {\n case \"authentication_error\":\n return GatewayAuthenticationError.createContextualError({\n apiKeyProvided: authMethod === \"api-key\",\n oidcTokenProvided: authMethod === \"oidc\",\n statusCode,\n cause,\n generationId\n });\n case \"invalid_request_error\":\n return new GatewayInvalidRequestError({\n message,\n statusCode,\n cause,\n generationId\n });\n case \"rate_limit_exceeded\":\n return new GatewayRateLimitError({\n message,\n statusCode,\n cause,\n generationId\n });\n case \"model_not_found\": {\n const modelResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.safeValidateTypes)({\n value: validatedResponse.error.param,\n schema: modelNotFoundParamSchema\n });\n return new GatewayModelNotFoundError({\n message,\n statusCode,\n modelId: modelResult.success ? modelResult.value.modelId : void 0,\n cause,\n generationId\n });\n }\n case \"internal_server_error\":\n return new GatewayInternalServerError({\n message,\n statusCode,\n cause,\n generationId\n });\n default:\n return new GatewayInternalServerError({\n message,\n statusCode,\n cause,\n generationId\n });\n }\n}\nvar gatewayErrorResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n error: zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n message: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().nullish(),\n param: zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown().nullish(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_1__.union([zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_1__.number()]).nullish()\n }),\n generationId: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().nullish()\n })\n )\n);\n\n// src/errors/gateway-timeout-error.ts\nvar name7 = \"GatewayTimeoutError\";\nvar marker8 = `vercel.ai.gateway.error.${name7}`;\nvar symbol8 = Symbol.for(marker8);\nvar _a8, _b8;\nvar GatewayTimeoutError = class _GatewayTimeoutError extends (_b8 = GatewayError, _a8 = symbol8, _b8) {\n constructor({\n message = \"Request timed out\",\n statusCode = 408,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a8] = true;\n // used in isInstance\n this.name = name7;\n this.type = \"timeout_error\";\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol8 in error;\n }\n /**\n * Creates a helpful timeout error message with troubleshooting guidance\n */\n static createTimeoutError({\n originalMessage,\n statusCode = 408,\n cause,\n generationId\n }) {\n const message = `Gateway request timed out: ${originalMessage}\n\n This is a client-side timeout. To resolve this, increase your timeout configuration: https://vercel.com/docs/ai-gateway/capabilities/video-generation#extending-timeouts-for-node.js`;\n return new _GatewayTimeoutError({\n message,\n statusCode,\n cause,\n generationId\n });\n }\n};\n\n// src/errors/as-gateway-error.ts\nfunction isTimeoutError(error) {\n if (!(error instanceof Error)) {\n return false;\n }\n const errorCode = error.code;\n if (typeof errorCode === \"string\") {\n const undiciTimeoutCodes = [\n \"UND_ERR_HEADERS_TIMEOUT\",\n \"UND_ERR_BODY_TIMEOUT\",\n \"UND_ERR_CONNECT_TIMEOUT\"\n ];\n return undiciTimeoutCodes.includes(errorCode);\n }\n return false;\n}\nasync function asGatewayError(error, authMethod) {\n var _a9;\n if (GatewayError.isInstance(error)) {\n return error;\n }\n if (isTimeoutError(error)) {\n return GatewayTimeoutError.createTimeoutError({\n originalMessage: error instanceof Error ? error.message : \"Unknown error\",\n cause: error\n });\n }\n if (_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.APICallError.isInstance(error)) {\n if (error.cause && isTimeoutError(error.cause)) {\n return GatewayTimeoutError.createTimeoutError({\n originalMessage: error.message,\n cause: error\n });\n }\n return await createGatewayErrorFromResponse({\n response: extractApiCallResponse(error),\n statusCode: (_a9 = error.statusCode) != null ? _a9 : 500,\n defaultMessage: \"Gateway request failed\",\n cause: error,\n authMethod\n });\n }\n return await createGatewayErrorFromResponse({\n response: {},\n statusCode: 500,\n defaultMessage: error instanceof Error ? `Gateway request failed: ${error.message}` : \"Unknown Gateway error\",\n cause: error,\n authMethod\n });\n}\n\n// src/errors/extract-api-call-response.ts\nfunction extractApiCallResponse(error) {\n if (error.data !== void 0) {\n return error.data;\n }\n if (error.responseBody != null) {\n try {\n return JSON.parse(error.responseBody);\n } catch (e) {\n return error.responseBody;\n }\n }\n return {};\n}\n\n// src/errors/parse-auth-method.ts\n\n\nvar GATEWAY_AUTH_METHOD_HEADER = \"ai-gateway-auth-method\";\nasync function parseAuthMethod(headers) {\n const result = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.safeValidateTypes)({\n value: headers[GATEWAY_AUTH_METHOD_HEADER],\n schema: gatewayAuthMethodSchema\n });\n return result.success ? result.value : void 0;\n}\nvar gatewayAuthMethodSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_1__.union([zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"api-key\"), zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"oidc\")]))\n);\n\n// src/gateway-fetch-metadata.ts\n\n\nvar GatewayFetchMetadata = class {\n constructor(config) {\n this.config = config;\n }\n async getAvailableModels() {\n try {\n const { value } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.getFromApi)({\n url: `${this.config.baseURL}/config`,\n headers: await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers()),\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(\n gatewayAvailableModelsResponseSchema\n ),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n fetch: this.config.fetch\n });\n return value;\n } catch (error) {\n throw await asGatewayError(error);\n }\n }\n async getCredits() {\n try {\n const baseUrl = new URL(this.config.baseURL);\n const { value } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.getFromApi)({\n url: `${baseUrl.origin}/v1/credits`,\n headers: await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers()),\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(\n gatewayCreditsResponseSchema\n ),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n fetch: this.config.fetch\n });\n return value;\n } catch (error) {\n throw await asGatewayError(error);\n }\n }\n};\nvar gatewayAvailableModelsResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n models: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().nullish(),\n pricing: zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n input: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n input_cache_read: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().nullish(),\n input_cache_write: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().nullish()\n }).transform(\n ({ input, output, input_cache_read, input_cache_write }) => ({\n input,\n output,\n ...input_cache_read ? { cachedInputTokens: input_cache_read } : {},\n ...input_cache_write ? { cacheCreationInputTokens: input_cache_write } : {}\n })\n ).nullish(),\n specification: zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n specificationVersion: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"v3\"),\n provider: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n modelId: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n }),\n modelType: zod_v4__WEBPACK_IMPORTED_MODULE_1__[\"enum\"]([\"embedding\", \"image\", \"language\", \"video\"]).nullish()\n })\n )\n })\n )\n);\nvar gatewayCreditsResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n balance: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n total_used: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n }).transform(({ balance, total_used }) => ({\n balance,\n totalUsed: total_used\n }))\n )\n);\n\n// src/gateway-spend-report.ts\n\n\nvar GatewaySpendReport = class {\n constructor(config) {\n this.config = config;\n }\n async getSpendReport(params) {\n try {\n const baseUrl = new URL(this.config.baseURL);\n const searchParams = new URLSearchParams();\n searchParams.set(\"start_date\", params.startDate);\n searchParams.set(\"end_date\", params.endDate);\n if (params.groupBy) {\n searchParams.set(\"group_by\", params.groupBy);\n }\n if (params.datePart) {\n searchParams.set(\"date_part\", params.datePart);\n }\n if (params.userId) {\n searchParams.set(\"user_id\", params.userId);\n }\n if (params.model) {\n searchParams.set(\"model\", params.model);\n }\n if (params.provider) {\n searchParams.set(\"provider\", params.provider);\n }\n if (params.credentialType) {\n searchParams.set(\"credential_type\", params.credentialType);\n }\n if (params.tags && params.tags.length > 0) {\n searchParams.set(\"tags\", params.tags.join(\",\"));\n }\n const { value } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.getFromApi)({\n url: `${baseUrl.origin}/v1/report?${searchParams.toString()}`,\n headers: await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers()),\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(\n gatewaySpendReportResponseSchema\n ),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n fetch: this.config.fetch\n });\n return value;\n } catch (error) {\n throw await asGatewayError(error);\n }\n }\n};\nvar gatewaySpendReportResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n results: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n day: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional(),\n hour: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional(),\n user: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional(),\n tag: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional(),\n provider: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional(),\n credential_type: zod_v4__WEBPACK_IMPORTED_MODULE_1__[\"enum\"]([\"byok\", \"system\"]).optional(),\n total_cost: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n market_cost: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional(),\n input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional(),\n output_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional(),\n cached_input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional(),\n cache_creation_input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional(),\n reasoning_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional(),\n request_count: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional()\n }).transform(\n ({\n credential_type,\n total_cost,\n market_cost,\n input_tokens,\n output_tokens,\n cached_input_tokens,\n cache_creation_input_tokens,\n reasoning_tokens,\n request_count,\n ...rest\n }) => ({\n ...rest,\n ...credential_type !== void 0 ? { credentialType: credential_type } : {},\n totalCost: total_cost,\n ...market_cost !== void 0 ? { marketCost: market_cost } : {},\n ...input_tokens !== void 0 ? { inputTokens: input_tokens } : {},\n ...output_tokens !== void 0 ? { outputTokens: output_tokens } : {},\n ...cached_input_tokens !== void 0 ? { cachedInputTokens: cached_input_tokens } : {},\n ...cache_creation_input_tokens !== void 0 ? { cacheCreationInputTokens: cache_creation_input_tokens } : {},\n ...reasoning_tokens !== void 0 ? { reasoningTokens: reasoning_tokens } : {},\n ...request_count !== void 0 ? { requestCount: request_count } : {}\n })\n )\n )\n })\n )\n);\n\n// src/gateway-generation-info.ts\n\n\nvar GatewayGenerationInfoFetcher = class {\n constructor(config) {\n this.config = config;\n }\n async getGenerationInfo(params) {\n try {\n const baseUrl = new URL(this.config.baseURL);\n const { value } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.getFromApi)({\n url: `${baseUrl.origin}/v1/generation?id=${encodeURIComponent(params.id)}`,\n headers: await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers()),\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(\n gatewayGenerationInfoResponseSchema\n ),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n fetch: this.config.fetch\n });\n return value;\n } catch (error) {\n throw await asGatewayError(error);\n }\n }\n};\nvar gatewayGenerationInfoResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n data: zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n total_cost: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n upstream_inference_cost: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n created_at: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n is_byok: zod_v4__WEBPACK_IMPORTED_MODULE_1__.boolean(),\n provider_name: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n streamed: zod_v4__WEBPACK_IMPORTED_MODULE_1__.boolean(),\n finish_reason: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n latency: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n generation_time: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n native_tokens_prompt: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n native_tokens_completion: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n native_tokens_reasoning: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n native_tokens_cached: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n native_tokens_cache_creation: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n billable_web_search_calls: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number()\n }).transform(\n ({\n total_cost,\n upstream_inference_cost,\n created_at,\n is_byok,\n provider_name,\n finish_reason,\n generation_time,\n native_tokens_prompt,\n native_tokens_completion,\n native_tokens_reasoning,\n native_tokens_cached,\n native_tokens_cache_creation,\n billable_web_search_calls,\n ...rest\n }) => ({\n ...rest,\n totalCost: total_cost,\n upstreamInferenceCost: upstream_inference_cost,\n createdAt: created_at,\n isByok: is_byok,\n providerName: provider_name,\n finishReason: finish_reason,\n generationTime: generation_time,\n promptTokens: native_tokens_prompt,\n completionTokens: native_tokens_completion,\n reasoningTokens: native_tokens_reasoning,\n cachedTokens: native_tokens_cached,\n cacheCreationTokens: native_tokens_cache_creation,\n billableWebSearchCalls: billable_web_search_calls\n })\n )\n }).transform(({ data }) => data)\n )\n);\n\n// src/gateway-language-model.ts\n\n\nvar GatewayLanguageModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n this.supportedUrls = { \"*/*\": [/.*/] };\n }\n get provider() {\n return this.config.provider;\n }\n async getArgs(options) {\n const { abortSignal: _abortSignal, ...optionsWithoutSignal } = options;\n return {\n args: this.maybeEncodeFileParts(optionsWithoutSignal),\n warnings: []\n };\n }\n async doGenerate(options) {\n const { args, warnings } = await this.getArgs(options);\n const { abortSignal } = options;\n const resolvedHeaders = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers());\n try {\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.postJsonToApi)({\n url: this.getUrl(),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.combineHeaders)(\n resolvedHeaders,\n options.headers,\n this.getModelConfigHeaders(this.modelId, false),\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.o11yHeaders)\n ),\n body: args,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(zod_v4__WEBPACK_IMPORTED_MODULE_1__.any()),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n ...abortSignal && { abortSignal },\n fetch: this.config.fetch\n });\n return {\n ...responseBody,\n request: { body: args },\n response: { headers: responseHeaders, body: rawResponse },\n warnings\n };\n } catch (error) {\n throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));\n }\n }\n async doStream(options) {\n const { args, warnings } = await this.getArgs(options);\n const { abortSignal } = options;\n const resolvedHeaders = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers());\n try {\n const { value: response, responseHeaders } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.postJsonToApi)({\n url: this.getUrl(),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.combineHeaders)(\n resolvedHeaders,\n options.headers,\n this.getModelConfigHeaders(this.modelId, true),\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.o11yHeaders)\n ),\n body: args,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createEventSourceResponseHandler)(zod_v4__WEBPACK_IMPORTED_MODULE_1__.any()),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n ...abortSignal && { abortSignal },\n fetch: this.config.fetch\n });\n return {\n stream: response.pipeThrough(\n new TransformStream({\n start(controller) {\n if (warnings.length > 0) {\n controller.enqueue({ type: \"stream-start\", warnings });\n }\n },\n transform(chunk, controller) {\n if (chunk.success) {\n const streamPart = chunk.value;\n if (streamPart.type === \"raw\" && !options.includeRawChunks) {\n return;\n }\n if (streamPart.type === \"response-metadata\" && streamPart.timestamp && typeof streamPart.timestamp === \"string\") {\n streamPart.timestamp = new Date(streamPart.timestamp);\n }\n controller.enqueue(streamPart);\n } else {\n controller.error(\n chunk.error\n );\n }\n }\n })\n ),\n request: { body: args },\n response: { headers: responseHeaders }\n };\n } catch (error) {\n throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));\n }\n }\n isFilePart(part) {\n return part && typeof part === \"object\" && \"type\" in part && part.type === \"file\";\n }\n /**\n * Encodes file parts in the prompt to base64. Mutates the passed options\n * instance directly to avoid copying the file data.\n * @param options - The options to encode.\n * @returns The options with the file parts encoded.\n */\n maybeEncodeFileParts(options) {\n for (const message of options.prompt) {\n for (const part of message.content) {\n if (this.isFilePart(part)) {\n const filePart = part;\n if (filePart.data instanceof Uint8Array) {\n const buffer = Uint8Array.from(filePart.data);\n const base64Data = Buffer.from(buffer).toString(\"base64\");\n filePart.data = new URL(\n `data:${filePart.mediaType || \"application/octet-stream\"};base64,${base64Data}`\n );\n }\n }\n }\n }\n return options;\n }\n getUrl() {\n return `${this.config.baseURL}/language-model`;\n }\n getModelConfigHeaders(modelId, streaming) {\n return {\n \"ai-language-model-specification-version\": \"3\",\n \"ai-language-model-id\": modelId,\n \"ai-language-model-streaming\": String(streaming)\n };\n }\n};\n\n// src/gateway-embedding-model.ts\n\n\nvar GatewayEmbeddingModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n this.maxEmbeddingsPerCall = 2048;\n this.supportsParallelCalls = true;\n }\n get provider() {\n return this.config.provider;\n }\n async doEmbed({\n values,\n headers,\n abortSignal,\n providerOptions\n }) {\n var _a9;\n const resolvedHeaders = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers());\n try {\n const {\n responseHeaders,\n value: responseBody,\n rawValue\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.postJsonToApi)({\n url: this.getUrl(),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.combineHeaders)(\n resolvedHeaders,\n headers != null ? headers : {},\n this.getModelConfigHeaders(),\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.o11yHeaders)\n ),\n body: {\n values,\n ...providerOptions ? { providerOptions } : {}\n },\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(\n gatewayEmbeddingResponseSchema\n ),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n ...abortSignal && { abortSignal },\n fetch: this.config.fetch\n });\n return {\n embeddings: responseBody.embeddings,\n usage: (_a9 = responseBody.usage) != null ? _a9 : void 0,\n providerMetadata: responseBody.providerMetadata,\n response: { headers: responseHeaders, body: rawValue },\n warnings: []\n };\n } catch (error) {\n throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));\n }\n }\n getUrl() {\n return `${this.config.baseURL}/embedding-model`;\n }\n getModelConfigHeaders() {\n return {\n \"ai-embedding-model-specification-version\": \"3\",\n \"ai-model-id\": this.modelId\n };\n }\n};\nvar gatewayEmbeddingResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n embeddings: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(zod_v4__WEBPACK_IMPORTED_MODULE_1__.number())),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({ tokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number() }).nullish(),\n providerMetadata: zod_v4__WEBPACK_IMPORTED_MODULE_1__.record(zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_1__.record(zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown())).optional()\n })\n )\n);\n\n// src/gateway-image-model.ts\n\n\nvar GatewayImageModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n // Set a very large number to prevent client-side splitting of requests\n this.maxImagesPerCall = Number.MAX_SAFE_INTEGER;\n }\n get provider() {\n return this.config.provider;\n }\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n files,\n mask,\n providerOptions,\n headers,\n abortSignal\n }) {\n var _a9, _b9, _c, _d;\n const resolvedHeaders = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers());\n try {\n const {\n responseHeaders,\n value: responseBody,\n rawValue\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.postJsonToApi)({\n url: this.getUrl(),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.combineHeaders)(\n resolvedHeaders,\n headers != null ? headers : {},\n this.getModelConfigHeaders(),\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.o11yHeaders)\n ),\n body: {\n prompt,\n n,\n ...size && { size },\n ...aspectRatio && { aspectRatio },\n ...seed && { seed },\n ...providerOptions && { providerOptions },\n ...files && {\n files: files.map((file) => maybeEncodeImageFile(file))\n },\n ...mask && { mask: maybeEncodeImageFile(mask) }\n },\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(\n gatewayImageResponseSchema\n ),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n ...abortSignal && { abortSignal },\n fetch: this.config.fetch\n });\n return {\n images: responseBody.images,\n // Always base64 strings from server\n warnings: (_a9 = responseBody.warnings) != null ? _a9 : [],\n providerMetadata: responseBody.providerMetadata,\n response: {\n timestamp: /* @__PURE__ */ new Date(),\n modelId: this.modelId,\n headers: responseHeaders\n },\n ...responseBody.usage != null && {\n usage: {\n inputTokens: (_b9 = responseBody.usage.inputTokens) != null ? _b9 : void 0,\n outputTokens: (_c = responseBody.usage.outputTokens) != null ? _c : void 0,\n totalTokens: (_d = responseBody.usage.totalTokens) != null ? _d : void 0\n }\n }\n };\n } catch (error) {\n throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));\n }\n }\n getUrl() {\n return `${this.config.baseURL}/image-model`;\n }\n getModelConfigHeaders() {\n return {\n \"ai-image-model-specification-version\": \"3\",\n \"ai-model-id\": this.modelId\n };\n }\n};\nfunction maybeEncodeImageFile(file) {\n if (file.type === \"file\" && file.data instanceof Uint8Array) {\n return {\n ...file,\n data: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.convertUint8ArrayToBase64)(file.data)\n };\n }\n return file;\n}\nvar providerMetadataEntrySchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n images: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown()).optional()\n}).catchall(zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown());\nvar gatewayImageWarningSchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"unsupported\"),\n feature: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n details: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"compatibility\"),\n feature: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n details: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"other\"),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n })\n]);\nvar gatewayImageUsageSchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n inputTokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().nullish(),\n outputTokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().nullish(),\n totalTokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().nullish()\n});\nvar gatewayImageResponseSchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n images: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()),\n // Always base64 strings over the wire\n warnings: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(gatewayImageWarningSchema).optional(),\n providerMetadata: zod_v4__WEBPACK_IMPORTED_MODULE_1__.record(zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(), providerMetadataEntrySchema).optional(),\n usage: gatewayImageUsageSchema.optional()\n});\n\n// src/gateway-video-model.ts\n\n\n\nvar GatewayVideoModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n // Set a very large number to prevent client-side splitting of requests\n this.maxVideosPerCall = Number.MAX_SAFE_INTEGER;\n }\n get provider() {\n return this.config.provider;\n }\n async doGenerate({\n prompt,\n n,\n aspectRatio,\n resolution,\n duration,\n fps,\n seed,\n image,\n providerOptions,\n headers,\n abortSignal\n }) {\n var _a9;\n const resolvedHeaders = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers());\n try {\n const { responseHeaders, value: responseBody } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.postJsonToApi)({\n url: this.getUrl(),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.combineHeaders)(\n resolvedHeaders,\n headers != null ? headers : {},\n this.getModelConfigHeaders(),\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.o11yHeaders),\n { accept: \"text/event-stream\" }\n ),\n body: {\n prompt,\n n,\n ...aspectRatio && { aspectRatio },\n ...resolution && { resolution },\n ...duration && { duration },\n ...fps && { fps },\n ...seed && { seed },\n ...providerOptions && { providerOptions },\n ...image && { image: maybeEncodeVideoFile(image) }\n },\n successfulResponseHandler: async ({\n response,\n url,\n requestBodyValues\n }) => {\n if (response.body == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.APICallError({\n message: \"SSE response body is empty\",\n url,\n requestBodyValues,\n statusCode: response.status\n });\n }\n const eventStream = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.parseJsonEventStream)({\n stream: response.body,\n schema: gatewayVideoEventSchema\n });\n const reader = eventStream.getReader();\n const { done, value: parseResult } = await reader.read();\n reader.releaseLock();\n if (done || !parseResult) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.APICallError({\n message: \"SSE stream ended without a data event\",\n url,\n requestBodyValues,\n statusCode: response.status\n });\n }\n if (!parseResult.success) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.APICallError({\n message: \"Failed to parse video SSE event\",\n cause: parseResult.error,\n url,\n requestBodyValues,\n statusCode: response.status\n });\n }\n const event = parseResult.value;\n if (event.type === \"error\") {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.APICallError({\n message: event.message,\n statusCode: event.statusCode,\n url,\n requestBodyValues,\n responseHeaders: Object.fromEntries([...response.headers]),\n responseBody: JSON.stringify(event),\n data: {\n error: {\n message: event.message,\n type: event.errorType,\n param: event.param\n }\n }\n });\n }\n return {\n value: {\n videos: event.videos,\n warnings: event.warnings,\n providerMetadata: event.providerMetadata\n },\n responseHeaders: Object.fromEntries([...response.headers])\n };\n },\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n ...abortSignal && { abortSignal },\n fetch: this.config.fetch\n });\n return {\n videos: responseBody.videos,\n warnings: (_a9 = responseBody.warnings) != null ? _a9 : [],\n providerMetadata: responseBody.providerMetadata,\n response: {\n timestamp: /* @__PURE__ */ new Date(),\n modelId: this.modelId,\n headers: responseHeaders\n }\n };\n } catch (error) {\n throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));\n }\n }\n getUrl() {\n return `${this.config.baseURL}/video-model`;\n }\n getModelConfigHeaders() {\n return {\n \"ai-video-model-specification-version\": \"3\",\n \"ai-model-id\": this.modelId\n };\n }\n};\nfunction maybeEncodeVideoFile(file) {\n if (file.type === \"file\" && file.data instanceof Uint8Array) {\n return {\n ...file,\n data: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.convertUint8ArrayToBase64)(file.data)\n };\n }\n return file;\n}\nvar providerMetadataEntrySchema2 = zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n videos: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown()).optional()\n}).catchall(zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown());\nvar gatewayVideoDataSchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"url\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"base64\"),\n data: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n })\n]);\nvar gatewayVideoWarningSchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"unsupported\"),\n feature: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n details: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"compatibility\"),\n feature: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n details: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"other\"),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n })\n]);\nvar gatewayVideoEventSchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"result\"),\n videos: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(gatewayVideoDataSchema),\n warnings: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(gatewayVideoWarningSchema).optional(),\n providerMetadata: zod_v4__WEBPACK_IMPORTED_MODULE_1__.record(zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(), providerMetadataEntrySchema2).optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"error\"),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n errorType: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n statusCode: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n param: zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown().nullable()\n })\n]);\n\n// src/tool/parallel-search.ts\n\n\nvar parallelSearchInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n objective: zod__WEBPACK_IMPORTED_MODULE_3__.string().describe(\n \"Natural-language description of the web research goal, including source or freshness guidance and broader context from the task. Maximum 5000 characters.\"\n ),\n search_queries: zod__WEBPACK_IMPORTED_MODULE_3__.array(zod__WEBPACK_IMPORTED_MODULE_3__.string()).optional().describe(\n \"Optional search queries to supplement the objective. Maximum 200 characters per query.\"\n ),\n mode: zod__WEBPACK_IMPORTED_MODULE_3__[\"enum\"]([\"one-shot\", \"agentic\"]).optional().describe(\n 'Mode preset: \"one-shot\" for comprehensive results with longer excerpts (default), \"agentic\" for concise, token-efficient results for multi-step workflows.'\n ),\n max_results: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\n \"Maximum number of results to return (1-20). Defaults to 10 if not specified.\"\n ),\n source_policy: zod__WEBPACK_IMPORTED_MODULE_3__.object({\n include_domains: zod__WEBPACK_IMPORTED_MODULE_3__.array(zod__WEBPACK_IMPORTED_MODULE_3__.string()).optional().describe(\"List of domains to include in search results.\"),\n exclude_domains: zod__WEBPACK_IMPORTED_MODULE_3__.array(zod__WEBPACK_IMPORTED_MODULE_3__.string()).optional().describe(\"List of domains to exclude from search results.\"),\n after_date: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional().describe(\n \"Only include results published after this date (ISO 8601 format).\"\n )\n }).optional().describe(\n \"Source policy for controlling which domains to include/exclude and freshness.\"\n ),\n excerpts: zod__WEBPACK_IMPORTED_MODULE_3__.object({\n max_chars_per_result: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\"Maximum characters per result.\"),\n max_chars_total: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\"Maximum total characters across all results.\")\n }).optional().describe(\"Excerpt configuration for controlling result length.\"),\n fetch_policy: zod__WEBPACK_IMPORTED_MODULE_3__.object({\n max_age_seconds: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\n \"Maximum age in seconds for cached content. Set to 0 to always fetch fresh content.\"\n )\n }).optional().describe(\"Fetch policy for controlling content freshness.\")\n })\n )\n);\nvar parallelSearchOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod__WEBPACK_IMPORTED_MODULE_3__.union([\n // Success response\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n searchId: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n results: zod__WEBPACK_IMPORTED_MODULE_3__.array(\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n url: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n title: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n excerpt: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n publishDate: zod__WEBPACK_IMPORTED_MODULE_3__.string().nullable().optional(),\n relevanceScore: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional()\n })\n )\n }),\n // Error response\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n error: zod__WEBPACK_IMPORTED_MODULE_3__[\"enum\"]([\n \"api_error\",\n \"rate_limit\",\n \"timeout\",\n \"invalid_input\",\n \"configuration_error\",\n \"unknown\"\n ]),\n statusCode: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional(),\n message: zod__WEBPACK_IMPORTED_MODULE_3__.string()\n })\n ])\n )\n);\nvar parallelSearchToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createProviderToolFactoryWithOutputSchema)({\n id: \"gateway.parallel_search\",\n inputSchema: parallelSearchInputSchema,\n outputSchema: parallelSearchOutputSchema\n});\nvar parallelSearch = (config = {}) => parallelSearchToolFactory(config);\n\n// src/tool/perplexity-search.ts\n\n\nvar perplexitySearchInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n query: zod__WEBPACK_IMPORTED_MODULE_3__.union([zod__WEBPACK_IMPORTED_MODULE_3__.string(), zod__WEBPACK_IMPORTED_MODULE_3__.array(zod__WEBPACK_IMPORTED_MODULE_3__.string())]).describe(\n \"Search query (string) or multiple queries (array of up to 5 strings). Multi-query searches return combined results from all queries.\"\n ),\n max_results: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\n \"Maximum number of search results to return (1-20, default: 10)\"\n ),\n max_tokens_per_page: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\n \"Maximum number of tokens to extract per search result page (256-2048, default: 2048)\"\n ),\n max_tokens: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\n \"Maximum total tokens across all search results (default: 25000, max: 1000000)\"\n ),\n country: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional().describe(\n \"Two-letter ISO 3166-1 alpha-2 country code for regional search results (e.g., 'US', 'GB', 'FR')\"\n ),\n search_domain_filter: zod__WEBPACK_IMPORTED_MODULE_3__.array(zod__WEBPACK_IMPORTED_MODULE_3__.string()).optional().describe(\n \"List of domains to include or exclude from search results (max 20). To include: ['nature.com', 'science.org']. To exclude: ['-example.com', '-spam.net']\"\n ),\n search_language_filter: zod__WEBPACK_IMPORTED_MODULE_3__.array(zod__WEBPACK_IMPORTED_MODULE_3__.string()).optional().describe(\n \"List of ISO 639-1 language codes to filter results (max 10, lowercase). Examples: ['en', 'fr', 'de']\"\n ),\n search_after_date: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional().describe(\n \"Include only results published after this date. Format: 'MM/DD/YYYY' (e.g., '3/1/2025'). Cannot be used with search_recency_filter.\"\n ),\n search_before_date: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional().describe(\n \"Include only results published before this date. Format: 'MM/DD/YYYY' (e.g., '3/15/2025'). Cannot be used with search_recency_filter.\"\n ),\n last_updated_after_filter: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional().describe(\n \"Include only results last updated after this date. Format: 'MM/DD/YYYY' (e.g., '3/1/2025'). Cannot be used with search_recency_filter.\"\n ),\n last_updated_before_filter: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional().describe(\n \"Include only results last updated before this date. Format: 'MM/DD/YYYY' (e.g., '3/15/2025'). Cannot be used with search_recency_filter.\"\n ),\n search_recency_filter: zod__WEBPACK_IMPORTED_MODULE_3__[\"enum\"]([\"day\", \"week\", \"month\", \"year\"]).optional().describe(\n \"Filter results by relative time period. Cannot be used with search_after_date or search_before_date.\"\n )\n })\n )\n);\nvar perplexitySearchOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod__WEBPACK_IMPORTED_MODULE_3__.union([\n // Success response\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n results: zod__WEBPACK_IMPORTED_MODULE_3__.array(\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n title: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n url: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n snippet: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n date: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n lastUpdated: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n })\n ),\n id: zod__WEBPACK_IMPORTED_MODULE_3__.string()\n }),\n // Error response\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n error: zod__WEBPACK_IMPORTED_MODULE_3__[\"enum\"]([\n \"api_error\",\n \"rate_limit\",\n \"timeout\",\n \"invalid_input\",\n \"unknown\"\n ]),\n statusCode: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional(),\n message: zod__WEBPACK_IMPORTED_MODULE_3__.string()\n })\n ])\n )\n);\nvar perplexitySearchToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createProviderToolFactoryWithOutputSchema)({\n id: \"gateway.perplexity_search\",\n inputSchema: perplexitySearchInputSchema,\n outputSchema: perplexitySearchOutputSchema\n});\nvar perplexitySearch = (config = {}) => perplexitySearchToolFactory(config);\n\n// src/gateway-tools.ts\nvar gatewayTools = {\n /**\n * Search the web using Parallel AI's Search API for LLM-optimized excerpts.\n *\n * Takes a natural language objective and returns relevant excerpts,\n * replacing multiple keyword searches with a single call for broad\n * or complex queries. Supports different search types for depth vs\n * breadth tradeoffs.\n */\n parallelSearch,\n /**\n * Search the web using Perplexity's Search API for real-time information,\n * news, research papers, and articles.\n *\n * Provides ranked search results with advanced filtering options including\n * domain, language, date range, and recency filters.\n */\n perplexitySearch\n};\n\n// src/vercel-environment.ts\n\n\nasync function getVercelRequestId() {\n var _a9;\n return (_a9 = (0,_vercel_oidc__WEBPACK_IMPORTED_MODULE_4__.getContext)().headers) == null ? void 0 : _a9[\"x-vercel-id\"];\n}\n\n// src/gateway-provider.ts\n\n\n// src/version.ts\nvar VERSION = true ? \"3.0.84\" : 0;\n\n// src/gateway-provider.ts\nvar AI_GATEWAY_PROTOCOL_VERSION = \"0.0.1\";\nfunction createGatewayProvider(options = {}) {\n var _a9, _b9;\n let pendingMetadata = null;\n let metadataCache = null;\n const cacheRefreshMillis = (_a9 = options.metadataCacheRefreshMillis) != null ? _a9 : 1e3 * 60 * 5;\n let lastFetchTime = 0;\n const baseURL = (_b9 = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.withoutTrailingSlash)(options.baseURL)) != null ? _b9 : \"https://ai-gateway.vercel.sh/v3/ai\";\n const getHeaders = async () => {\n try {\n const auth = await getGatewayAuthToken(options);\n return (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.withUserAgentSuffix)(\n {\n Authorization: `Bearer ${auth.token}`,\n \"ai-gateway-protocol-version\": AI_GATEWAY_PROTOCOL_VERSION,\n [GATEWAY_AUTH_METHOD_HEADER]: auth.authMethod,\n ...options.headers\n },\n `ai-sdk/gateway/${VERSION}`\n );\n } catch (error) {\n throw GatewayAuthenticationError.createContextualError({\n apiKeyProvided: false,\n oidcTokenProvided: false,\n statusCode: 401,\n cause: error\n });\n }\n };\n const createO11yHeaders = () => {\n const deploymentId = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.loadOptionalSetting)({\n settingValue: void 0,\n environmentVariableName: \"VERCEL_DEPLOYMENT_ID\"\n });\n const environment = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.loadOptionalSetting)({\n settingValue: void 0,\n environmentVariableName: \"VERCEL_ENV\"\n });\n const region = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.loadOptionalSetting)({\n settingValue: void 0,\n environmentVariableName: \"VERCEL_REGION\"\n });\n const projectId = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.loadOptionalSetting)({\n settingValue: void 0,\n environmentVariableName: \"VERCEL_PROJECT_ID\"\n });\n return async () => {\n const requestId = await getVercelRequestId();\n return {\n ...deploymentId && { \"ai-o11y-deployment-id\": deploymentId },\n ...environment && { \"ai-o11y-environment\": environment },\n ...region && { \"ai-o11y-region\": region },\n ...requestId && { \"ai-o11y-request-id\": requestId },\n ...projectId && { \"ai-o11y-project-id\": projectId }\n };\n };\n };\n const createLanguageModel = (modelId) => {\n return new GatewayLanguageModel(modelId, {\n provider: \"gateway\",\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n o11yHeaders: createO11yHeaders()\n });\n };\n const getAvailableModels = async () => {\n var _a10, _b10, _c;\n const now = (_c = (_b10 = (_a10 = options._internal) == null ? void 0 : _a10.currentDate) == null ? void 0 : _b10.call(_a10).getTime()) != null ? _c : Date.now();\n if (!pendingMetadata || now - lastFetchTime > cacheRefreshMillis) {\n lastFetchTime = now;\n pendingMetadata = new GatewayFetchMetadata({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch\n }).getAvailableModels().then((metadata) => {\n metadataCache = metadata;\n return metadata;\n }).catch(async (error) => {\n throw await asGatewayError(\n error,\n await parseAuthMethod(await getHeaders())\n );\n });\n }\n return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;\n };\n const getCredits = async () => {\n return new GatewayFetchMetadata({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch\n }).getCredits().catch(async (error) => {\n throw await asGatewayError(\n error,\n await parseAuthMethod(await getHeaders())\n );\n });\n };\n const getSpendReport = async (params) => {\n return new GatewaySpendReport({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch\n }).getSpendReport(params).catch(async (error) => {\n throw await asGatewayError(\n error,\n await parseAuthMethod(await getHeaders())\n );\n });\n };\n const getGenerationInfo = async (params) => {\n return new GatewayGenerationInfoFetcher({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch\n }).getGenerationInfo(params).catch(async (error) => {\n throw await asGatewayError(\n error,\n await parseAuthMethod(await getHeaders())\n );\n });\n };\n const provider = function(modelId) {\n if (new.target) {\n throw new Error(\n \"The Gateway Provider model function cannot be called with the new keyword.\"\n );\n }\n return createLanguageModel(modelId);\n };\n provider.specificationVersion = \"v3\";\n provider.getAvailableModels = getAvailableModels;\n provider.getCredits = getCredits;\n provider.getSpendReport = getSpendReport;\n provider.getGenerationInfo = getGenerationInfo;\n provider.imageModel = (modelId) => {\n return new GatewayImageModel(modelId, {\n provider: \"gateway\",\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n o11yHeaders: createO11yHeaders()\n });\n };\n provider.languageModel = createLanguageModel;\n const createEmbeddingModel = (modelId) => {\n return new GatewayEmbeddingModel(modelId, {\n provider: \"gateway\",\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n o11yHeaders: createO11yHeaders()\n });\n };\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.videoModel = (modelId) => {\n return new GatewayVideoModel(modelId, {\n provider: \"gateway\",\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n o11yHeaders: createO11yHeaders()\n });\n };\n provider.chat = provider.languageModel;\n provider.embedding = provider.embeddingModel;\n provider.image = provider.imageModel;\n provider.video = provider.videoModel;\n provider.tools = gatewayTools;\n return provider;\n}\nvar gateway = createGatewayProvider();\nasync function getGatewayAuthToken(options) {\n const apiKey = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.loadOptionalSetting)({\n settingValue: options.apiKey,\n environmentVariableName: \"AI_GATEWAY_API_KEY\"\n });\n if (apiKey) {\n return {\n token: apiKey,\n authMethod: \"api-key\"\n };\n }\n const oidcToken = await (0,_vercel_oidc__WEBPACK_IMPORTED_MODULE_4__.getVercelOidcToken)();\n return {\n token: oidcToken,\n authMethod: \"oidc\"\n };\n}\n\n//# sourceMappingURL=index.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWktc2RrK2dhdGV3YXlAMy4wLjg0X3pvZEAzLjI1Ljc2L25vZGVfbW9kdWxlcy9AYWktc2RrL2dhdGV3YXkvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFJZ0M7O0FBRWhDO0FBQ2dEOztBQUVoRDtBQUNpQzs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsNEJBQTRCLFNBQVMsR0FBRyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUMsS0FBSztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1IsWUFBWSwwQ0FBMEM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLE1BQU07QUFDTjs7QUFFQTs7QUFFQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUMsTUFBTTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1IsWUFBWSwwQ0FBMEM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiwyRUFBbUI7QUFDcEM7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsZ0VBQWtCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFZRTtBQUNGIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BhaS1zZGsrZ2F0ZXdheUAzLjAuODRfem9kQDMuMjUuNzYvbm9kZV9tb2R1bGVzL0BhaS1zZGsvZ2F0ZXdheS9kaXN0L2luZGV4Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvZ2F0ZXdheS1wcm92aWRlci50c1xuaW1wb3J0IHtcbiAgbG9hZE9wdGlvbmFsU2V0dGluZyxcbiAgd2l0aG91dFRyYWlsaW5nU2xhc2hcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL2Vycm9ycy9hcy1nYXRld2F5LWVycm9yLnRzXG5pbXBvcnQgeyBBUElDYWxsRXJyb3IgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xuXG4vLyBzcmMvZXJyb3JzL2NyZWF0ZS1nYXRld2F5LWVycm9yLnRzXG5pbXBvcnQgeyB6IGFzIHoyIH0gZnJvbSBcInpvZC92NFwiO1xuXG4vLyBzcmMvZXJyb3JzL2dhdGV3YXktZXJyb3IudHNcbnZhciBtYXJrZXIgPSBcInZlcmNlbC5haS5nYXRld2F5LmVycm9yXCI7XG52YXIgc3ltYm9sID0gU3ltYm9sLmZvcihtYXJrZXIpO1xudmFyIF9hLCBfYjtcbnZhciBHYXRld2F5RXJyb3IgPSBjbGFzcyBfR2F0ZXdheUVycm9yIGV4dGVuZHMgKF9iID0gRXJyb3IsIF9hID0gc3ltYm9sLCBfYikge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgbWVzc2FnZSxcbiAgICBzdGF0dXNDb2RlID0gNTAwLFxuICAgIGNhdXNlLFxuICAgIGdlbmVyYXRpb25JZFxuICB9KSB7XG4gICAgc3VwZXIoZ2VuZXJhdGlvbklkID8gYCR7bWVzc2FnZX0gWyR7Z2VuZXJhdGlvbklkfV1gIDogbWVzc2FnZSk7XG4gICAgdGhpc1tfYV0gPSB0cnVlO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICAgIHRoaXMuZ2VuZXJhdGlvbklkID0gZ2VuZXJhdGlvbklkO1xuICB9XG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGVycm9yIGlzIGEgR2F0ZXdheSBFcnJvci5cbiAgICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIFRoZSBlcnJvciB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGVycm9yIGlzIGEgR2F0ZXdheSBFcnJvciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgc3RhdGljIGlzSW5zdGFuY2UoZXJyb3IpIHtcbiAgICByZXR1cm4gX0dhdGV3YXlFcnJvci5oYXNNYXJrZXIoZXJyb3IpO1xuICB9XG4gIHN0YXRpYyBoYXNNYXJrZXIoZXJyb3IpIHtcbiAgICByZXR1cm4gdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiICYmIGVycm9yICE9PSBudWxsICYmIHN5bWJvbCBpbiBlcnJvciAmJiBlcnJvcltzeW1ib2xdID09PSB0cnVlO1xuICB9XG59O1xuXG4vLyBzcmMvZXJyb3JzL2dhdGV3YXktYXV0aGVudGljYXRpb24tZXJyb3IudHNcbnZhciBuYW1lID0gXCJHYXRld2F5QXV0aGVudGljYXRpb25FcnJvclwiO1xudmFyIG1hcmtlcjIgPSBgdmVyY2VsLmFpLmdhdGV3YXkuZXJyb3IuJHtuYW1lfWA7XG52YXIgc3ltYm9sMiA9IFN5bWJvbC5mb3IobWFya2VyMik7XG52YXIgX2EyLCBfYjI7XG52YXIgR2F0ZXdheUF1dGhlbnRpY2F0aW9uRXJyb3IgPSBjbGFzcyBfR2F0ZXdheUF1dGhlbnRpY2F0aW9uRXJyb3IgZXh0ZW5kcyAoX2IyID0gR2F0ZXdheUVycm9yLCBfYTIgPSBzeW1ib2wyLCBfYjIpIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG1lc3NhZ2UgPSBcIkF1dGhlbnRpY2F0aW9uIGZhaWxlZFwiLFxuICAgIHN0YXR1c0NvZGUgPSA0MDEsXG4gICAgY2F1c2UsXG4gICAgZ2VuZXJhdGlvbklkXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKHsgbWVzc2FnZSwgc3RhdHVzQ29kZSwgY2F1c2UsIGdlbmVyYXRpb25JZCB9KTtcbiAgICB0aGlzW19hMl0gPSB0cnVlO1xuICAgIC8vIHVzZWQgaW4gaXNJbnN0YW5jZVxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy50eXBlID0gXCJhdXRoZW50aWNhdGlvbl9lcnJvclwiO1xuICB9XG4gIHN0YXRpYyBpc0luc3RhbmNlKGVycm9yKSB7XG4gICAgcmV0dXJuIEdhdGV3YXlFcnJvci5oYXNNYXJrZXIoZXJyb3IpICYmIHN5bWJvbDIgaW4gZXJyb3I7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb250ZXh0dWFsIGVycm9yIG1lc3NhZ2Ugd2hlbiBhdXRoZW50aWNhdGlvbiBmYWlsc1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUNvbnRleHR1YWxFcnJvcih7XG4gICAgYXBpS2V5UHJvdmlkZWQsXG4gICAgb2lkY1Rva2VuUHJvdmlkZWQsXG4gICAgbWVzc2FnZSA9IFwiQXV0aGVudGljYXRpb24gZmFpbGVkXCIsXG4gICAgc3RhdHVzQ29kZSA9IDQwMSxcbiAgICBjYXVzZSxcbiAgICBnZW5lcmF0aW9uSWRcbiAgfSkge1xuICAgIGxldCBjb250ZXh0dWFsTWVzc2FnZTtcbiAgICBpZiAoYXBpS2V5UHJvdmlkZWQpIHtcbiAgICAgIGNvbnRleHR1YWxNZXNzYWdlID0gYEFJIEdhdGV3YXkgYXV0aGVudGljYXRpb24gZmFpbGVkOiBJbnZhbGlkIEFQSSBrZXkuXG5cbkNyZWF0ZSBhIG5ldyBBUEkga2V5OiBodHRwczovL3ZlcmNlbC5jb20vZD90bz0lMkYlNUJ0ZWFtJTVEJTJGJTdFJTJGYWklMkZhcGkta2V5c1xuXG5Qcm92aWRlIHZpYSAnYXBpS2V5JyBvcHRpb24gb3IgJ0FJX0dBVEVXQVlfQVBJX0tFWScgZW52aXJvbm1lbnQgdmFyaWFibGUuYDtcbiAgICB9IGVsc2UgaWYgKG9pZGNUb2tlblByb3ZpZGVkKSB7XG4gICAgICBjb250ZXh0dWFsTWVzc2FnZSA9IGBBSSBHYXRld2F5IGF1dGhlbnRpY2F0aW9uIGZhaWxlZDogSW52YWxpZCBPSURDIHRva2VuLlxuXG5SdW4gJ25weCB2ZXJjZWwgbGluaycgdG8gbGluayB5b3VyIHByb2plY3QsIHRoZW4gJ3ZjIGVudiBwdWxsJyB0byBmZXRjaCB0aGUgdG9rZW4uXG5cbkFsdGVybmF0aXZlbHksIHVzZSBhbiBBUEkga2V5OiBodHRwczovL3ZlcmNlbC5jb20vZD90bz0lMkYlNUJ0ZWFtJTVEJTJGJTdFJTJGYWklMkZhcGkta2V5c2A7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHR1YWxNZXNzYWdlID0gYEFJIEdhdGV3YXkgYXV0aGVudGljYXRpb24gZmFpbGVkOiBObyBhdXRoZW50aWNhdGlvbiBwcm92aWRlZC5cblxuT3B0aW9uIDEgLSBBUEkga2V5OlxuQ3JlYXRlIGFuIEFQSSBrZXk6IGh0dHBzOi8vdmVyY2VsLmNvbS9kP3RvPSUyRiU1QnRlYW0lNUQlMkYlN0UlMkZhaSUyRmFwaS1rZXlzXG5Qcm92aWRlIHZpYSAnYXBpS2V5JyBvcHRpb24gb3IgJ0FJX0dBVEVXQVlfQVBJX0tFWScgZW52aXJvbm1lbnQgdmFyaWFibGUuXG5cbk9wdGlvbiAyIC0gT0lEQyB0b2tlbjpcblJ1biAnbnB4IHZlcmNlbCBsaW5rJyB0byBsaW5rIHlvdXIgcHJvamVjdCwgdGhlbiAndmMgZW52IHB1bGwnIHRvIGZldGNoIHRoZSB0b2tlbi5gO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF9HYXRld2F5QXV0aGVudGljYXRpb25FcnJvcih7XG4gICAgICBtZXNzYWdlOiBjb250ZXh0dWFsTWVzc2FnZSxcbiAgICAgIHN0YXR1c0NvZGUsXG4gICAgICBjYXVzZSxcbiAgICAgIGdlbmVyYXRpb25JZFxuICAgIH0pO1xuICB9XG59O1xuXG4vLyBzcmMvZXJyb3JzL2dhdGV3YXktaW52YWxpZC1yZXF1ZXN0LWVycm9yLnRzXG52YXIgbmFtZTIgPSBcIkdhdGV3YXlJbnZhbGlkUmVxdWVzdEVycm9yXCI7XG52YXIgbWFya2VyMyA9IGB2ZXJjZWwuYWkuZ2F0ZXdheS5lcnJvci4ke25hbWUyfWA7XG52YXIgc3ltYm9sMyA9IFN5bWJvbC5mb3IobWFya2VyMyk7XG52YXIgX2EzLCBfYjM7XG52YXIgR2F0ZXdheUludmFsaWRSZXF1ZXN0RXJyb3IgPSBjbGFzcyBleHRlbmRzIChfYjMgPSBHYXRld2F5RXJyb3IsIF9hMyA9IHN5bWJvbDMsIF9iMykge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgbWVzc2FnZSA9IFwiSW52YWxpZCByZXF1ZXN0XCIsXG4gICAgc3RhdHVzQ29kZSA9IDQwMCxcbiAgICBjYXVzZSxcbiAgICBnZW5lcmF0aW9uSWRcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyBtZXNzYWdlLCBzdGF0dXNDb2RlLCBjYXVzZSwgZ2VuZXJhdGlvbklkIH0pO1xuICAgIHRoaXNbX2EzXSA9IHRydWU7XG4gICAgLy8gdXNlZCBpbiBpc0luc3RhbmNlXG4gICAgdGhpcy5uYW1lID0gbmFtZTI7XG4gICAgdGhpcy50eXBlID0gXCJpbnZhbGlkX3JlcXVlc3RfZXJyb3JcIjtcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBHYXRld2F5RXJyb3IuaGFzTWFya2VyKGVycm9yKSAmJiBzeW1ib2wzIGluIGVycm9yO1xuICB9XG59O1xuXG4vLyBzcmMvZXJyb3JzL2dhdGV3YXktcmF0ZS1saW1pdC1lcnJvci50c1xudmFyIG5hbWUzID0gXCJHYXRld2F5UmF0ZUxpbWl0RXJyb3JcIjtcbnZhciBtYXJrZXI0ID0gYHZlcmNlbC5haS5nYXRld2F5LmVycm9yLiR7bmFtZTN9YDtcbnZhciBzeW1ib2w0ID0gU3ltYm9sLmZvcihtYXJrZXI0KTtcbnZhciBfYTQsIF9iNDtcbnZhciBHYXRld2F5UmF0ZUxpbWl0RXJyb3IgPSBjbGFzcyBleHRlbmRzIChfYjQgPSBHYXRld2F5RXJyb3IsIF9hNCA9IHN5bWJvbDQsIF9iNCkge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgbWVzc2FnZSA9IFwiUmF0ZSBsaW1pdCBleGNlZWRlZFwiLFxuICAgIHN0YXR1c0NvZGUgPSA0MjksXG4gICAgY2F1c2UsXG4gICAgZ2VuZXJhdGlvbklkXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKHsgbWVzc2FnZSwgc3RhdHVzQ29kZSwgY2F1c2UsIGdlbmVyYXRpb25JZCB9KTtcbiAgICB0aGlzW19hNF0gPSB0cnVlO1xuICAgIC8vIHVzZWQgaW4gaXNJbnN0YW5jZVxuICAgIHRoaXMubmFtZSA9IG5hbWUzO1xuICAgIHRoaXMudHlwZSA9IFwicmF0ZV9saW1pdF9leGNlZWRlZFwiO1xuICB9XG4gIHN0YXRpYyBpc0luc3RhbmNlKGVycm9yKSB7XG4gICAgcmV0dXJuIEdhdGV3YXlFcnJvci5oYXNNYXJrZXIoZXJyb3IpICYmIHN5bWJvbDQgaW4gZXJyb3I7XG4gIH1cbn07XG5cbi8vIHNyYy9lcnJvcnMvZ2F0ZXdheS1tb2RlbC1ub3QtZm91bmQtZXJyb3IudHNcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kL3Y0XCI7XG5pbXBvcnQgeyBsYXp5U2NoZW1hLCB6b2RTY2hlbWEgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xudmFyIG5hbWU0ID0gXCJHYXRld2F5TW9kZWxOb3RGb3VuZEVycm9yXCI7XG52YXIgbWFya2VyNSA9IGB2ZXJjZWwuYWkuZ2F0ZXdheS5lcnJvci4ke25hbWU0fWA7XG52YXIgc3ltYm9sNSA9IFN5bWJvbC5mb3IobWFya2VyNSk7XG52YXIgbW9kZWxOb3RGb3VuZFBhcmFtU2NoZW1hID0gbGF6eVNjaGVtYShcbiAgKCkgPT4gem9kU2NoZW1hKFxuICAgIHoub2JqZWN0KHtcbiAgICAgIG1vZGVsSWQ6IHouc3RyaW5nKClcbiAgICB9KVxuICApXG4pO1xudmFyIF9hNSwgX2I1O1xudmFyIEdhdGV3YXlNb2RlbE5vdEZvdW5kRXJyb3IgPSBjbGFzcyBleHRlbmRzIChfYjUgPSBHYXRld2F5RXJyb3IsIF9hNSA9IHN5bWJvbDUsIF9iNSkge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgbWVzc2FnZSA9IFwiTW9kZWwgbm90IGZvdW5kXCIsXG4gICAgc3RhdHVzQ29kZSA9IDQwNCxcbiAgICBtb2RlbElkLFxuICAgIGNhdXNlLFxuICAgIGdlbmVyYXRpb25JZFxuICB9ID0ge30pIHtcbiAgICBzdXBlcih7IG1lc3NhZ2UsIHN0YXR1c0NvZGUsIGNhdXNlLCBnZW5lcmF0aW9uSWQgfSk7XG4gICAgdGhpc1tfYTVdID0gdHJ1ZTtcbiAgICAvLyB1c2VkIGluIGlzSW5zdGFuY2VcbiAgICB0aGlzLm5hbWUgPSBuYW1lNDtcbiAgICB0aGlzLnR5cGUgPSBcIm1vZGVsX25vdF9mb3VuZFwiO1xuICAgIHRoaXMubW9kZWxJZCA9IG1vZGVsSWQ7XG4gIH1cbiAgc3RhdGljIGlzSW5zdGFuY2UoZXJyb3IpIHtcbiAgICByZXR1cm4gR2F0ZXdheUVycm9yLmhhc01hcmtlcihlcnJvcikgJiYgc3ltYm9sNSBpbiBlcnJvcjtcbiAgfVxufTtcblxuLy8gc3JjL2Vycm9ycy9nYXRld2F5LWludGVybmFsLXNlcnZlci1lcnJvci50c1xudmFyIG5hbWU1ID0gXCJHYXRld2F5SW50ZXJuYWxTZXJ2ZXJFcnJvclwiO1xudmFyIG1hcmtlcjYgPSBgdmVyY2VsLmFpLmdhdGV3YXkuZXJyb3IuJHtuYW1lNX1gO1xudmFyIHN5bWJvbDYgPSBTeW1ib2wuZm9yKG1hcmtlcjYpO1xudmFyIF9hNiwgX2I2O1xudmFyIEdhdGV3YXlJbnRlcm5hbFNlcnZlckVycm9yID0gY2xhc3MgZXh0ZW5kcyAoX2I2ID0gR2F0ZXdheUVycm9yLCBfYTYgPSBzeW1ib2w2LCBfYjYpIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG1lc3NhZ2UgPSBcIkludGVybmFsIHNlcnZlciBlcnJvclwiLFxuICAgIHN0YXR1c0NvZGUgPSA1MDAsXG4gICAgY2F1c2UsXG4gICAgZ2VuZXJhdGlvbklkXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKHsgbWVzc2FnZSwgc3RhdHVzQ29kZSwgY2F1c2UsIGdlbmVyYXRpb25JZCB9KTtcbiAgICB0aGlzW19hNl0gPSB0cnVlO1xuICAgIC8vIHVzZWQgaW4gaXNJbnN0YW5jZVxuICAgIHRoaXMubmFtZSA9IG5hbWU1O1xuICAgIHRoaXMudHlwZSA9IFwiaW50ZXJuYWxfc2VydmVyX2Vycm9yXCI7XG4gIH1cbiAgc3RhdGljIGlzSW5zdGFuY2UoZXJyb3IpIHtcbiAgICByZXR1cm4gR2F0ZXdheUVycm9yLmhhc01hcmtlcihlcnJvcikgJiYgc3ltYm9sNiBpbiBlcnJvcjtcbiAgfVxufTtcblxuLy8gc3JjL2Vycm9ycy9nYXRld2F5LXJlc3BvbnNlLWVycm9yLnRzXG52YXIgbmFtZTYgPSBcIkdhdGV3YXlSZXNwb25zZUVycm9yXCI7XG52YXIgbWFya2VyNyA9IGB2ZXJjZWwuYWkuZ2F0ZXdheS5lcnJvci4ke25hbWU2fWA7XG52YXIgc3ltYm9sNyA9IFN5bWJvbC5mb3IobWFya2VyNyk7XG52YXIgX2E3LCBfYjc7XG52YXIgR2F0ZXdheVJlc3BvbnNlRXJyb3IgPSBjbGFzcyBleHRlbmRzIChfYjcgPSBHYXRld2F5RXJyb3IsIF9hNyA9IHN5bWJvbDcsIF9iNykge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgbWVzc2FnZSA9IFwiSW52YWxpZCByZXNwb25zZSBmcm9tIEdhdGV3YXlcIixcbiAgICBzdGF0dXNDb2RlID0gNTAyLFxuICAgIHJlc3BvbnNlLFxuICAgIHZhbGlkYXRpb25FcnJvcixcbiAgICBjYXVzZSxcbiAgICBnZW5lcmF0aW9uSWRcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyBtZXNzYWdlLCBzdGF0dXNDb2RlLCBjYXVzZSwgZ2VuZXJhdGlvbklkIH0pO1xuICAgIHRoaXNbX2E3XSA9IHRydWU7XG4gICAgLy8gdXNlZCBpbiBpc0luc3RhbmNlXG4gICAgdGhpcy5uYW1lID0gbmFtZTY7XG4gICAgdGhpcy50eXBlID0gXCJyZXNwb25zZV9lcnJvclwiO1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvciA9IHZhbGlkYXRpb25FcnJvcjtcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBHYXRld2F5RXJyb3IuaGFzTWFya2VyKGVycm9yKSAmJiBzeW1ib2w3IGluIGVycm9yO1xuICB9XG59O1xuXG4vLyBzcmMvZXJyb3JzL2NyZWF0ZS1nYXRld2F5LWVycm9yLnRzXG5pbXBvcnQge1xuICBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWEyLFxuICBzYWZlVmFsaWRhdGVUeXBlcyxcbiAgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTJcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUdhdGV3YXlFcnJvckZyb21SZXNwb25zZSh7XG4gIHJlc3BvbnNlLFxuICBzdGF0dXNDb2RlLFxuICBkZWZhdWx0TWVzc2FnZSA9IFwiR2F0ZXdheSByZXF1ZXN0IGZhaWxlZFwiLFxuICBjYXVzZSxcbiAgYXV0aE1ldGhvZFxufSkge1xuICB2YXIgX2E5O1xuICBjb25zdCBwYXJzZVJlc3VsdCA9IGF3YWl0IHNhZmVWYWxpZGF0ZVR5cGVzKHtcbiAgICB2YWx1ZTogcmVzcG9uc2UsXG4gICAgc2NoZW1hOiBnYXRld2F5RXJyb3JSZXNwb25zZVNjaGVtYVxuICB9KTtcbiAgaWYgKCFwYXJzZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgY29uc3QgcmF3R2VuZXJhdGlvbklkID0gdHlwZW9mIHJlc3BvbnNlID09PSBcIm9iamVjdFwiICYmIHJlc3BvbnNlICE9PSBudWxsICYmIFwiZ2VuZXJhdGlvbklkXCIgaW4gcmVzcG9uc2UgPyByZXNwb25zZS5nZW5lcmF0aW9uSWQgOiB2b2lkIDA7XG4gICAgcmV0dXJuIG5ldyBHYXRld2F5UmVzcG9uc2VFcnJvcih7XG4gICAgICBtZXNzYWdlOiBgSW52YWxpZCBlcnJvciByZXNwb25zZSBmb3JtYXQ6ICR7ZGVmYXVsdE1lc3NhZ2V9YCxcbiAgICAgIHN0YXR1c0NvZGUsXG4gICAgICByZXNwb25zZSxcbiAgICAgIHZhbGlkYXRpb25FcnJvcjogcGFyc2VSZXN1bHQuZXJyb3IsXG4gICAgICBjYXVzZSxcbiAgICAgIGdlbmVyYXRpb25JZDogcmF3R2VuZXJhdGlvbklkXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgdmFsaWRhdGVkUmVzcG9uc2UgPSBwYXJzZVJlc3VsdC52YWx1ZTtcbiAgY29uc3QgZXJyb3JUeXBlID0gdmFsaWRhdGVkUmVzcG9uc2UuZXJyb3IudHlwZTtcbiAgY29uc3QgbWVzc2FnZSA9IHZhbGlkYXRlZFJlc3BvbnNlLmVycm9yLm1lc3NhZ2U7XG4gIGNvbnN0IGdlbmVyYXRpb25JZCA9IChfYTkgPSB2YWxpZGF0ZWRSZXNwb25zZS5nZW5lcmF0aW9uSWQpICE9IG51bGwgPyBfYTkgOiB2b2lkIDA7XG4gIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgY2FzZSBcImF1dGhlbnRpY2F0aW9uX2Vycm9yXCI6XG4gICAgICByZXR1cm4gR2F0ZXdheUF1dGhlbnRpY2F0aW9uRXJyb3IuY3JlYXRlQ29udGV4dHVhbEVycm9yKHtcbiAgICAgICAgYXBpS2V5UHJvdmlkZWQ6IGF1dGhNZXRob2QgPT09IFwiYXBpLWtleVwiLFxuICAgICAgICBvaWRjVG9rZW5Qcm92aWRlZDogYXV0aE1ldGhvZCA9PT0gXCJvaWRjXCIsXG4gICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgIGNhdXNlLFxuICAgICAgICBnZW5lcmF0aW9uSWRcbiAgICAgIH0pO1xuICAgIGNhc2UgXCJpbnZhbGlkX3JlcXVlc3RfZXJyb3JcIjpcbiAgICAgIHJldHVybiBuZXcgR2F0ZXdheUludmFsaWRSZXF1ZXN0RXJyb3Ioe1xuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICBjYXVzZSxcbiAgICAgICAgZ2VuZXJhdGlvbklkXG4gICAgICB9KTtcbiAgICBjYXNlIFwicmF0ZV9saW1pdF9leGNlZWRlZFwiOlxuICAgICAgcmV0dXJuIG5ldyBHYXRld2F5UmF0ZUxpbWl0RXJyb3Ioe1xuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICBjYXVzZSxcbiAgICAgICAgZ2VuZXJhdGlvbklkXG4gICAgICB9KTtcbiAgICBjYXNlIFwibW9kZWxfbm90X2ZvdW5kXCI6IHtcbiAgICAgIGNvbnN0IG1vZGVsUmVzdWx0ID0gYXdhaXQgc2FmZVZhbGlkYXRlVHlwZXMoe1xuICAgICAgICB2YWx1ZTogdmFsaWRhdGVkUmVzcG9uc2UuZXJyb3IucGFyYW0sXG4gICAgICAgIHNjaGVtYTogbW9kZWxOb3RGb3VuZFBhcmFtU2NoZW1hXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgR2F0ZXdheU1vZGVsTm90Rm91bmRFcnJvcih7XG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgIG1vZGVsSWQ6IG1vZGVsUmVzdWx0LnN1Y2Nlc3MgPyBtb2RlbFJlc3VsdC52YWx1ZS5tb2RlbElkIDogdm9pZCAwLFxuICAgICAgICBjYXVzZSxcbiAgICAgICAgZ2VuZXJhdGlvbklkXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2FzZSBcImludGVybmFsX3NlcnZlcl9lcnJvclwiOlxuICAgICAgcmV0dXJuIG5ldyBHYXRld2F5SW50ZXJuYWxTZXJ2ZXJFcnJvcih7XG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgIGNhdXNlLFxuICAgICAgICBnZW5lcmF0aW9uSWRcbiAgICAgIH0pO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbmV3IEdhdGV3YXlJbnRlcm5hbFNlcnZlckVycm9yKHtcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIGdlbmVyYXRpb25JZFxuICAgICAgfSk7XG4gIH1cbn1cbnZhciBnYXRld2F5RXJyb3JSZXNwb25zZVNjaGVtYSA9IGxhenlTY2hlbWEyKFxuICAoKSA9PiB6b2RTY2hlbWEyKFxuICAgIHoyLm9iamVjdCh7XG4gICAgICBlcnJvcjogejIub2JqZWN0KHtcbiAgICAgICAgbWVzc2FnZTogejIuc3RyaW5nKCksXG4gICAgICAgIHR5cGU6IHoyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgcGFyYW06IHoyLnVua25vd24oKS5udWxsaXNoKCksXG4gICAgICAgIGNvZGU6IHoyLnVuaW9uKFt6Mi5zdHJpbmcoKSwgejIubnVtYmVyKCldKS5udWxsaXNoKClcbiAgICAgIH0pLFxuICAgICAgZ2VuZXJhdGlvbklkOiB6Mi5zdHJpbmcoKS5udWxsaXNoKClcbiAgICB9KVxuICApXG4pO1xuXG4vLyBzcmMvZXJyb3JzL2dhdGV3YXktdGltZW91dC1lcnJvci50c1xudmFyIG5hbWU3ID0gXCJHYXRld2F5VGltZW91dEVycm9yXCI7XG52YXIgbWFya2VyOCA9IGB2ZXJjZWwuYWkuZ2F0ZXdheS5lcnJvci4ke25hbWU3fWA7XG52YXIgc3ltYm9sOCA9IFN5bWJvbC5mb3IobWFya2VyOCk7XG52YXIgX2E4LCBfYjg7XG52YXIgR2F0ZXdheVRpbWVvdXRFcnJvciA9IGNsYXNzIF9HYXRld2F5VGltZW91dEVycm9yIGV4dGVuZHMgKF9iOCA9IEdhdGV3YXlFcnJvciwgX2E4ID0gc3ltYm9sOCwgX2I4KSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBtZXNzYWdlID0gXCJSZXF1ZXN0IHRpbWVkIG91dFwiLFxuICAgIHN0YXR1c0NvZGUgPSA0MDgsXG4gICAgY2F1c2UsXG4gICAgZ2VuZXJhdGlvbklkXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKHsgbWVzc2FnZSwgc3RhdHVzQ29kZSwgY2F1c2UsIGdlbmVyYXRpb25JZCB9KTtcbiAgICB0aGlzW19hOF0gPSB0cnVlO1xuICAgIC8vIHVzZWQgaW4gaXNJbnN0YW5jZVxuICAgIHRoaXMubmFtZSA9IG5hbWU3O1xuICAgIHRoaXMudHlwZSA9IFwidGltZW91dF9lcnJvclwiO1xuICB9XG4gIHN0YXRpYyBpc0luc3RhbmNlKGVycm9yKSB7XG4gICAgcmV0dXJuIEdhdGV3YXlFcnJvci5oYXNNYXJrZXIoZXJyb3IpICYmIHN5bWJvbDggaW4gZXJyb3I7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBoZWxwZnVsIHRpbWVvdXQgZXJyb3IgbWVzc2FnZSB3aXRoIHRyb3VibGVzaG9vdGluZyBndWlkYW5jZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVRpbWVvdXRFcnJvcih7XG4gICAgb3JpZ2luYWxNZXNzYWdlLFxuICAgIHN0YXR1c0NvZGUgPSA0MDgsXG4gICAgY2F1c2UsXG4gICAgZ2VuZXJhdGlvbklkXG4gIH0pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYEdhdGV3YXkgcmVxdWVzdCB0aW1lZCBvdXQ6ICR7b3JpZ2luYWxNZXNzYWdlfVxuXG4gICAgVGhpcyBpcyBhIGNsaWVudC1zaWRlIHRpbWVvdXQuIFRvIHJlc29sdmUgdGhpcywgaW5jcmVhc2UgeW91ciB0aW1lb3V0IGNvbmZpZ3VyYXRpb246IGh0dHBzOi8vdmVyY2VsLmNvbS9kb2NzL2FpLWdhdGV3YXkvY2FwYWJpbGl0aWVzL3ZpZGVvLWdlbmVyYXRpb24jZXh0ZW5kaW5nLXRpbWVvdXRzLWZvci1ub2RlLmpzYDtcbiAgICByZXR1cm4gbmV3IF9HYXRld2F5VGltZW91dEVycm9yKHtcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBzdGF0dXNDb2RlLFxuICAgICAgY2F1c2UsXG4gICAgICBnZW5lcmF0aW9uSWRcbiAgICB9KTtcbiAgfVxufTtcblxuLy8gc3JjL2Vycm9ycy9hcy1nYXRld2F5LWVycm9yLnRzXG5mdW5jdGlvbiBpc1RpbWVvdXRFcnJvcihlcnJvcikge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBlcnJvckNvZGUgPSBlcnJvci5jb2RlO1xuICBpZiAodHlwZW9mIGVycm9yQ29kZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHVuZGljaVRpbWVvdXRDb2RlcyA9IFtcbiAgICAgIFwiVU5EX0VSUl9IRUFERVJTX1RJTUVPVVRcIixcbiAgICAgIFwiVU5EX0VSUl9CT0RZX1RJTUVPVVRcIixcbiAgICAgIFwiVU5EX0VSUl9DT05ORUNUX1RJTUVPVVRcIlxuICAgIF07XG4gICAgcmV0dXJuIHVuZGljaVRpbWVvdXRDb2Rlcy5pbmNsdWRlcyhlcnJvckNvZGUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGFzR2F0ZXdheUVycm9yKGVycm9yLCBhdXRoTWV0aG9kKSB7XG4gIHZhciBfYTk7XG4gIGlmIChHYXRld2F5RXJyb3IuaXNJbnN0YW5jZShlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbiAgaWYgKGlzVGltZW91dEVycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBHYXRld2F5VGltZW91dEVycm9yLmNyZWF0ZVRpbWVvdXRFcnJvcih7XG4gICAgICBvcmlnaW5hbE1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCIsXG4gICAgICBjYXVzZTogZXJyb3JcbiAgICB9KTtcbiAgfVxuICBpZiAoQVBJQ2FsbEVycm9yLmlzSW5zdGFuY2UoZXJyb3IpKSB7XG4gICAgaWYgKGVycm9yLmNhdXNlICYmIGlzVGltZW91dEVycm9yKGVycm9yLmNhdXNlKSkge1xuICAgICAgcmV0dXJuIEdhdGV3YXlUaW1lb3V0RXJyb3IuY3JlYXRlVGltZW91dEVycm9yKHtcbiAgICAgICAgb3JpZ2luYWxNZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICBjYXVzZTogZXJyb3JcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgY3JlYXRlR2F0ZXdheUVycm9yRnJvbVJlc3BvbnNlKHtcbiAgICAgIHJlc3BvbnNlOiBleHRyYWN0QXBpQ2FsbFJlc3BvbnNlKGVycm9yKSxcbiAgICAgIHN0YXR1c0NvZGU6IChfYTkgPSBlcnJvci5zdGF0dXNDb2RlKSAhPSBudWxsID8gX2E5IDogNTAwLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6IFwiR2F0ZXdheSByZXF1ZXN0IGZhaWxlZFwiLFxuICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgYXV0aE1ldGhvZFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBhd2FpdCBjcmVhdGVHYXRld2F5RXJyb3JGcm9tUmVzcG9uc2Uoe1xuICAgIHJlc3BvbnNlOiB7fSxcbiAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgZGVmYXVsdE1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgR2F0ZXdheSByZXF1ZXN0IGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfWAgOiBcIlVua25vd24gR2F0ZXdheSBlcnJvclwiLFxuICAgIGNhdXNlOiBlcnJvcixcbiAgICBhdXRoTWV0aG9kXG4gIH0pO1xufVxuXG4vLyBzcmMvZXJyb3JzL2V4dHJhY3QtYXBpLWNhbGwtcmVzcG9uc2UudHNcbmZ1bmN0aW9uIGV4dHJhY3RBcGlDYWxsUmVzcG9uc2UoZXJyb3IpIHtcbiAgaWYgKGVycm9yLmRhdGEgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiBlcnJvci5kYXRhO1xuICB9XG4gIGlmIChlcnJvci5yZXNwb25zZUJvZHkgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShlcnJvci5yZXNwb25zZUJvZHkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBlcnJvci5yZXNwb25zZUJvZHk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7fTtcbn1cblxuLy8gc3JjL2Vycm9ycy9wYXJzZS1hdXRoLW1ldGhvZC50c1xuaW1wb3J0IHsgeiBhcyB6MyB9IGZyb20gXCJ6b2QvdjRcIjtcbmltcG9ydCB7XG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTMsXG4gIHNhZmVWYWxpZGF0ZVR5cGVzIGFzIHNhZmVWYWxpZGF0ZVR5cGVzMixcbiAgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTNcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbnZhciBHQVRFV0FZX0FVVEhfTUVUSE9EX0hFQURFUiA9IFwiYWktZ2F0ZXdheS1hdXRoLW1ldGhvZFwiO1xuYXN5bmMgZnVuY3Rpb24gcGFyc2VBdXRoTWV0aG9kKGhlYWRlcnMpIHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FmZVZhbGlkYXRlVHlwZXMyKHtcbiAgICB2YWx1ZTogaGVhZGVyc1tHQVRFV0FZX0FVVEhfTUVUSE9EX0hFQURFUl0sXG4gICAgc2NoZW1hOiBnYXRld2F5QXV0aE1ldGhvZFNjaGVtYVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzID8gcmVzdWx0LnZhbHVlIDogdm9pZCAwO1xufVxudmFyIGdhdGV3YXlBdXRoTWV0aG9kU2NoZW1hID0gbGF6eVNjaGVtYTMoXG4gICgpID0+IHpvZFNjaGVtYTMoejMudW5pb24oW3ozLmxpdGVyYWwoXCJhcGkta2V5XCIpLCB6My5saXRlcmFsKFwib2lkY1wiKV0pKVxuKTtcblxuLy8gc3JjL2dhdGV3YXktZmV0Y2gtbWV0YWRhdGEudHNcbmltcG9ydCB7XG4gIGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcixcbiAgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcixcbiAgZ2V0RnJvbUFwaSxcbiAgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hNCxcbiAgcmVzb2x2ZSxcbiAgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTRcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejQgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgR2F0ZXdheUZldGNoTWV0YWRhdGEgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG4gIGFzeW5jIGdldEF2YWlsYWJsZU1vZGVscygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gYXdhaXQgZ2V0RnJvbUFwaSh7XG4gICAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYmFzZVVSTH0vY29uZmlnYCxcbiAgICAgICAgaGVhZGVyczogYXdhaXQgcmVzb2x2ZSh0aGlzLmNvbmZpZy5oZWFkZXJzKCkpLFxuICAgICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyKFxuICAgICAgICAgIGdhdGV3YXlBdmFpbGFibGVNb2RlbHNSZXNwb25zZVNjaGVtYVxuICAgICAgICApLFxuICAgICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcih7XG4gICAgICAgICAgZXJyb3JTY2hlbWE6IHo0LmFueSgpLFxuICAgICAgICAgIGVycm9yVG9NZXNzYWdlOiAoZGF0YSkgPT4gZGF0YVxuICAgICAgICB9KSxcbiAgICAgICAgZmV0Y2g6IHRoaXMuY29uZmlnLmZldGNoXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgYXdhaXQgYXNHYXRld2F5RXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBhc3luYyBnZXRDcmVkaXRzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXNlVXJsID0gbmV3IFVSTCh0aGlzLmNvbmZpZy5iYXNlVVJMKTtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGF3YWl0IGdldEZyb21BcGkoe1xuICAgICAgICB1cmw6IGAke2Jhc2VVcmwub3JpZ2lufS92MS9jcmVkaXRzYCxcbiAgICAgICAgaGVhZGVyczogYXdhaXQgcmVzb2x2ZSh0aGlzLmNvbmZpZy5oZWFkZXJzKCkpLFxuICAgICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyKFxuICAgICAgICAgIGdhdGV3YXlDcmVkaXRzUmVzcG9uc2VTY2hlbWFcbiAgICAgICAgKSxcbiAgICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXIoe1xuICAgICAgICAgIGVycm9yU2NoZW1hOiB6NC5hbnkoKSxcbiAgICAgICAgICBlcnJvclRvTWVzc2FnZTogKGRhdGEpID0+IGRhdGFcbiAgICAgICAgfSksXG4gICAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGF3YWl0IGFzR2F0ZXdheUVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cbn07XG52YXIgZ2F0ZXdheUF2YWlsYWJsZU1vZGVsc1Jlc3BvbnNlU2NoZW1hID0gbGF6eVNjaGVtYTQoXG4gICgpID0+IHpvZFNjaGVtYTQoXG4gICAgejQub2JqZWN0KHtcbiAgICAgIG1vZGVsczogejQuYXJyYXkoXG4gICAgICAgIHo0Lm9iamVjdCh7XG4gICAgICAgICAgaWQ6IHo0LnN0cmluZygpLFxuICAgICAgICAgIG5hbWU6IHo0LnN0cmluZygpLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB6NC5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgICAgcHJpY2luZzogejQub2JqZWN0KHtcbiAgICAgICAgICAgIGlucHV0OiB6NC5zdHJpbmcoKSxcbiAgICAgICAgICAgIG91dHB1dDogejQuc3RyaW5nKCksXG4gICAgICAgICAgICBpbnB1dF9jYWNoZV9yZWFkOiB6NC5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgICAgICBpbnB1dF9jYWNoZV93cml0ZTogejQuc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICAgICAgfSkudHJhbnNmb3JtKFxuICAgICAgICAgICAgKHsgaW5wdXQsIG91dHB1dCwgaW5wdXRfY2FjaGVfcmVhZCwgaW5wdXRfY2FjaGVfd3JpdGUgfSkgPT4gKHtcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICAgICAgLi4uaW5wdXRfY2FjaGVfcmVhZCA/IHsgY2FjaGVkSW5wdXRUb2tlbnM6IGlucHV0X2NhY2hlX3JlYWQgfSA6IHt9LFxuICAgICAgICAgICAgICAuLi5pbnB1dF9jYWNoZV93cml0ZSA/IHsgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiBpbnB1dF9jYWNoZV93cml0ZSB9IDoge31cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKS5udWxsaXNoKCksXG4gICAgICAgICAgc3BlY2lmaWNhdGlvbjogejQub2JqZWN0KHtcbiAgICAgICAgICAgIHNwZWNpZmljYXRpb25WZXJzaW9uOiB6NC5saXRlcmFsKFwidjNcIiksXG4gICAgICAgICAgICBwcm92aWRlcjogejQuc3RyaW5nKCksXG4gICAgICAgICAgICBtb2RlbElkOiB6NC5zdHJpbmcoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG1vZGVsVHlwZTogejQuZW51bShbXCJlbWJlZGRpbmdcIiwgXCJpbWFnZVwiLCBcImxhbmd1YWdlXCIsIFwidmlkZW9cIl0pLm51bGxpc2goKVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0pXG4gIClcbik7XG52YXIgZ2F0ZXdheUNyZWRpdHNSZXNwb25zZVNjaGVtYSA9IGxhenlTY2hlbWE0KFxuICAoKSA9PiB6b2RTY2hlbWE0KFxuICAgIHo0Lm9iamVjdCh7XG4gICAgICBiYWxhbmNlOiB6NC5zdHJpbmcoKSxcbiAgICAgIHRvdGFsX3VzZWQ6IHo0LnN0cmluZygpXG4gICAgfSkudHJhbnNmb3JtKCh7IGJhbGFuY2UsIHRvdGFsX3VzZWQgfSkgPT4gKHtcbiAgICAgIGJhbGFuY2UsXG4gICAgICB0b3RhbFVzZWQ6IHRvdGFsX3VzZWRcbiAgICB9KSlcbiAgKVxuKTtcblxuLy8gc3JjL2dhdGV3YXktc3BlbmQtcmVwb3J0LnRzXG5pbXBvcnQge1xuICBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXIgYXMgY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyMixcbiAgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlciBhcyBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyMixcbiAgZ2V0RnJvbUFwaSBhcyBnZXRGcm9tQXBpMixcbiAgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hNSxcbiAgcmVzb2x2ZSBhcyByZXNvbHZlMixcbiAgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTVcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejUgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgR2F0ZXdheVNwZW5kUmVwb3J0ID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBhc3luYyBnZXRTcGVuZFJlcG9ydChwYXJhbXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFzZVVybCA9IG5ldyBVUkwodGhpcy5jb25maWcuYmFzZVVSTCk7XG4gICAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICBzZWFyY2hQYXJhbXMuc2V0KFwic3RhcnRfZGF0ZVwiLCBwYXJhbXMuc3RhcnREYXRlKTtcbiAgICAgIHNlYXJjaFBhcmFtcy5zZXQoXCJlbmRfZGF0ZVwiLCBwYXJhbXMuZW5kRGF0ZSk7XG4gICAgICBpZiAocGFyYW1zLmdyb3VwQnkpIHtcbiAgICAgICAgc2VhcmNoUGFyYW1zLnNldChcImdyb3VwX2J5XCIsIHBhcmFtcy5ncm91cEJ5KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuZGF0ZVBhcnQpIHtcbiAgICAgICAgc2VhcmNoUGFyYW1zLnNldChcImRhdGVfcGFydFwiLCBwYXJhbXMuZGF0ZVBhcnQpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy51c2VySWQpIHtcbiAgICAgICAgc2VhcmNoUGFyYW1zLnNldChcInVzZXJfaWRcIiwgcGFyYW1zLnVzZXJJZCk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLm1vZGVsKSB7XG4gICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoXCJtb2RlbFwiLCBwYXJhbXMubW9kZWwpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5wcm92aWRlcikge1xuICAgICAgICBzZWFyY2hQYXJhbXMuc2V0KFwicHJvdmlkZXJcIiwgcGFyYW1zLnByb3ZpZGVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuY3JlZGVudGlhbFR5cGUpIHtcbiAgICAgICAgc2VhcmNoUGFyYW1zLnNldChcImNyZWRlbnRpYWxfdHlwZVwiLCBwYXJhbXMuY3JlZGVudGlhbFR5cGUpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50YWdzICYmIHBhcmFtcy50YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2VhcmNoUGFyYW1zLnNldChcInRhZ3NcIiwgcGFyYW1zLnRhZ3Muam9pbihcIixcIikpO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gYXdhaXQgZ2V0RnJvbUFwaTIoe1xuICAgICAgICB1cmw6IGAke2Jhc2VVcmwub3JpZ2lufS92MS9yZXBvcnQ/JHtzZWFyY2hQYXJhbXMudG9TdHJpbmcoKX1gLFxuICAgICAgICBoZWFkZXJzOiBhd2FpdCByZXNvbHZlMih0aGlzLmNvbmZpZy5oZWFkZXJzKCkpLFxuICAgICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyMihcbiAgICAgICAgICBnYXRld2F5U3BlbmRSZXBvcnRSZXNwb25zZVNjaGVtYVxuICAgICAgICApLFxuICAgICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcjIoe1xuICAgICAgICAgIGVycm9yU2NoZW1hOiB6NS5hbnkoKSxcbiAgICAgICAgICBlcnJvclRvTWVzc2FnZTogKGRhdGEpID0+IGRhdGFcbiAgICAgICAgfSksXG4gICAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGF3YWl0IGFzR2F0ZXdheUVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cbn07XG52YXIgZ2F0ZXdheVNwZW5kUmVwb3J0UmVzcG9uc2VTY2hlbWEgPSBsYXp5U2NoZW1hNShcbiAgKCkgPT4gem9kU2NoZW1hNShcbiAgICB6NS5vYmplY3Qoe1xuICAgICAgcmVzdWx0czogejUuYXJyYXkoXG4gICAgICAgIHo1Lm9iamVjdCh7XG4gICAgICAgICAgZGF5OiB6NS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgIGhvdXI6IHo1LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgdXNlcjogejUuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICBtb2RlbDogejUuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICB0YWc6IHo1LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgcHJvdmlkZXI6IHo1LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgY3JlZGVudGlhbF90eXBlOiB6NS5lbnVtKFtcImJ5b2tcIiwgXCJzeXN0ZW1cIl0pLm9wdGlvbmFsKCksXG4gICAgICAgICAgdG90YWxfY29zdDogejUubnVtYmVyKCksXG4gICAgICAgICAgbWFya2V0X2Nvc3Q6IHo1Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgaW5wdXRfdG9rZW5zOiB6NS5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICAgIG91dHB1dF90b2tlbnM6IHo1Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgY2FjaGVkX2lucHV0X3Rva2VuczogejUubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IHo1Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgcmVhc29uaW5nX3Rva2VuczogejUubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICByZXF1ZXN0X2NvdW50OiB6NS5udW1iZXIoKS5vcHRpb25hbCgpXG4gICAgICAgIH0pLnRyYW5zZm9ybShcbiAgICAgICAgICAoe1xuICAgICAgICAgICAgY3JlZGVudGlhbF90eXBlLFxuICAgICAgICAgICAgdG90YWxfY29zdCxcbiAgICAgICAgICAgIG1hcmtldF9jb3N0LFxuICAgICAgICAgICAgaW5wdXRfdG9rZW5zLFxuICAgICAgICAgICAgb3V0cHV0X3Rva2VucyxcbiAgICAgICAgICAgIGNhY2hlZF9pbnB1dF90b2tlbnMsXG4gICAgICAgICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnMsXG4gICAgICAgICAgICByZWFzb25pbmdfdG9rZW5zLFxuICAgICAgICAgICAgcmVxdWVzdF9jb3VudCxcbiAgICAgICAgICAgIC4uLnJlc3RcbiAgICAgICAgICB9KSA9PiAoe1xuICAgICAgICAgICAgLi4ucmVzdCxcbiAgICAgICAgICAgIC4uLmNyZWRlbnRpYWxfdHlwZSAhPT0gdm9pZCAwID8geyBjcmVkZW50aWFsVHlwZTogY3JlZGVudGlhbF90eXBlIH0gOiB7fSxcbiAgICAgICAgICAgIHRvdGFsQ29zdDogdG90YWxfY29zdCxcbiAgICAgICAgICAgIC4uLm1hcmtldF9jb3N0ICE9PSB2b2lkIDAgPyB7IG1hcmtldENvc3Q6IG1hcmtldF9jb3N0IH0gOiB7fSxcbiAgICAgICAgICAgIC4uLmlucHV0X3Rva2VucyAhPT0gdm9pZCAwID8geyBpbnB1dFRva2VuczogaW5wdXRfdG9rZW5zIH0gOiB7fSxcbiAgICAgICAgICAgIC4uLm91dHB1dF90b2tlbnMgIT09IHZvaWQgMCA/IHsgb3V0cHV0VG9rZW5zOiBvdXRwdXRfdG9rZW5zIH0gOiB7fSxcbiAgICAgICAgICAgIC4uLmNhY2hlZF9pbnB1dF90b2tlbnMgIT09IHZvaWQgMCA/IHsgY2FjaGVkSW5wdXRUb2tlbnM6IGNhY2hlZF9pbnB1dF90b2tlbnMgfSA6IHt9LFxuICAgICAgICAgICAgLi4uY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zICE9PSB2b2lkIDAgPyB7IGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zIH0gOiB7fSxcbiAgICAgICAgICAgIC4uLnJlYXNvbmluZ190b2tlbnMgIT09IHZvaWQgMCA/IHsgcmVhc29uaW5nVG9rZW5zOiByZWFzb25pbmdfdG9rZW5zIH0gOiB7fSxcbiAgICAgICAgICAgIC4uLnJlcXVlc3RfY291bnQgIT09IHZvaWQgMCA/IHsgcmVxdWVzdENvdW50OiByZXF1ZXN0X2NvdW50IH0gOiB7fVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9KVxuICApXG4pO1xuXG4vLyBzcmMvZ2F0ZXdheS1nZW5lcmF0aW9uLWluZm8udHNcbmltcG9ydCB7XG4gIGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlciBhcyBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXIzLFxuICBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyIGFzIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIzLFxuICBnZXRGcm9tQXBpIGFzIGdldEZyb21BcGkzLFxuICBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWE2LFxuICByZXNvbHZlIGFzIHJlc29sdmUzLFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hNlxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6NiB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBHYXRld2F5R2VuZXJhdGlvbkluZm9GZXRjaGVyID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBhc3luYyBnZXRHZW5lcmF0aW9uSW5mbyhwYXJhbXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFzZVVybCA9IG5ldyBVUkwodGhpcy5jb25maWcuYmFzZVVSTCk7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBhd2FpdCBnZXRGcm9tQXBpMyh7XG4gICAgICAgIHVybDogYCR7YmFzZVVybC5vcmlnaW59L3YxL2dlbmVyYXRpb24/aWQ9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmlkKX1gLFxuICAgICAgICBoZWFkZXJzOiBhd2FpdCByZXNvbHZlMyh0aGlzLmNvbmZpZy5oZWFkZXJzKCkpLFxuICAgICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyMyhcbiAgICAgICAgICBnYXRld2F5R2VuZXJhdGlvbkluZm9SZXNwb25zZVNjaGVtYVxuICAgICAgICApLFxuICAgICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcjMoe1xuICAgICAgICAgIGVycm9yU2NoZW1hOiB6Ni5hbnkoKSxcbiAgICAgICAgICBlcnJvclRvTWVzc2FnZTogKGRhdGEpID0+IGRhdGFcbiAgICAgICAgfSksXG4gICAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGF3YWl0IGFzR2F0ZXdheUVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cbn07XG52YXIgZ2F0ZXdheUdlbmVyYXRpb25JbmZvUmVzcG9uc2VTY2hlbWEgPSBsYXp5U2NoZW1hNihcbiAgKCkgPT4gem9kU2NoZW1hNihcbiAgICB6Ni5vYmplY3Qoe1xuICAgICAgZGF0YTogejYub2JqZWN0KHtcbiAgICAgICAgaWQ6IHo2LnN0cmluZygpLFxuICAgICAgICB0b3RhbF9jb3N0OiB6Ni5udW1iZXIoKSxcbiAgICAgICAgdXBzdHJlYW1faW5mZXJlbmNlX2Nvc3Q6IHo2Lm51bWJlcigpLFxuICAgICAgICB1c2FnZTogejYubnVtYmVyKCksXG4gICAgICAgIGNyZWF0ZWRfYXQ6IHo2LnN0cmluZygpLFxuICAgICAgICBtb2RlbDogejYuc3RyaW5nKCksXG4gICAgICAgIGlzX2J5b2s6IHo2LmJvb2xlYW4oKSxcbiAgICAgICAgcHJvdmlkZXJfbmFtZTogejYuc3RyaW5nKCksXG4gICAgICAgIHN0cmVhbWVkOiB6Ni5ib29sZWFuKCksXG4gICAgICAgIGZpbmlzaF9yZWFzb246IHo2LnN0cmluZygpLFxuICAgICAgICBsYXRlbmN5OiB6Ni5udW1iZXIoKSxcbiAgICAgICAgZ2VuZXJhdGlvbl90aW1lOiB6Ni5udW1iZXIoKSxcbiAgICAgICAgbmF0aXZlX3Rva2Vuc19wcm9tcHQ6IHo2Lm51bWJlcigpLFxuICAgICAgICBuYXRpdmVfdG9rZW5zX2NvbXBsZXRpb246IHo2Lm51bWJlcigpLFxuICAgICAgICBuYXRpdmVfdG9rZW5zX3JlYXNvbmluZzogejYubnVtYmVyKCksXG4gICAgICAgIG5hdGl2ZV90b2tlbnNfY2FjaGVkOiB6Ni5udW1iZXIoKSxcbiAgICAgICAgbmF0aXZlX3Rva2Vuc19jYWNoZV9jcmVhdGlvbjogejYubnVtYmVyKCksXG4gICAgICAgIGJpbGxhYmxlX3dlYl9zZWFyY2hfY2FsbHM6IHo2Lm51bWJlcigpXG4gICAgICB9KS50cmFuc2Zvcm0oXG4gICAgICAgICh7XG4gICAgICAgICAgdG90YWxfY29zdCxcbiAgICAgICAgICB1cHN0cmVhbV9pbmZlcmVuY2VfY29zdCxcbiAgICAgICAgICBjcmVhdGVkX2F0LFxuICAgICAgICAgIGlzX2J5b2ssXG4gICAgICAgICAgcHJvdmlkZXJfbmFtZSxcbiAgICAgICAgICBmaW5pc2hfcmVhc29uLFxuICAgICAgICAgIGdlbmVyYXRpb25fdGltZSxcbiAgICAgICAgICBuYXRpdmVfdG9rZW5zX3Byb21wdCxcbiAgICAgICAgICBuYXRpdmVfdG9rZW5zX2NvbXBsZXRpb24sXG4gICAgICAgICAgbmF0aXZlX3Rva2Vuc19yZWFzb25pbmcsXG4gICAgICAgICAgbmF0aXZlX3Rva2Vuc19jYWNoZWQsXG4gICAgICAgICAgbmF0aXZlX3Rva2Vuc19jYWNoZV9jcmVhdGlvbixcbiAgICAgICAgICBiaWxsYWJsZV93ZWJfc2VhcmNoX2NhbGxzLFxuICAgICAgICAgIC4uLnJlc3RcbiAgICAgICAgfSkgPT4gKHtcbiAgICAgICAgICAuLi5yZXN0LFxuICAgICAgICAgIHRvdGFsQ29zdDogdG90YWxfY29zdCxcbiAgICAgICAgICB1cHN0cmVhbUluZmVyZW5jZUNvc3Q6IHVwc3RyZWFtX2luZmVyZW5jZV9jb3N0LFxuICAgICAgICAgIGNyZWF0ZWRBdDogY3JlYXRlZF9hdCxcbiAgICAgICAgICBpc0J5b2s6IGlzX2J5b2ssXG4gICAgICAgICAgcHJvdmlkZXJOYW1lOiBwcm92aWRlcl9uYW1lLFxuICAgICAgICAgIGZpbmlzaFJlYXNvbjogZmluaXNoX3JlYXNvbixcbiAgICAgICAgICBnZW5lcmF0aW9uVGltZTogZ2VuZXJhdGlvbl90aW1lLFxuICAgICAgICAgIHByb21wdFRva2VuczogbmF0aXZlX3Rva2Vuc19wcm9tcHQsXG4gICAgICAgICAgY29tcGxldGlvblRva2VuczogbmF0aXZlX3Rva2Vuc19jb21wbGV0aW9uLFxuICAgICAgICAgIHJlYXNvbmluZ1Rva2VuczogbmF0aXZlX3Rva2Vuc19yZWFzb25pbmcsXG4gICAgICAgICAgY2FjaGVkVG9rZW5zOiBuYXRpdmVfdG9rZW5zX2NhY2hlZCxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uVG9rZW5zOiBuYXRpdmVfdG9rZW5zX2NhY2hlX2NyZWF0aW9uLFxuICAgICAgICAgIGJpbGxhYmxlV2ViU2VhcmNoQ2FsbHM6IGJpbGxhYmxlX3dlYl9zZWFyY2hfY2FsbHNcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KS50cmFuc2Zvcm0oKHsgZGF0YSB9KSA9PiBkYXRhKVxuICApXG4pO1xuXG4vLyBzcmMvZ2F0ZXdheS1sYW5ndWFnZS1tb2RlbC50c1xuaW1wb3J0IHtcbiAgY29tYmluZUhlYWRlcnMsXG4gIGNyZWF0ZUV2ZW50U291cmNlUmVzcG9uc2VIYW5kbGVyLFxuICBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXIgYXMgY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyNCxcbiAgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlciBhcyBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyNCxcbiAgcG9zdEpzb25Ub0FwaSxcbiAgcmVzb2x2ZSBhcyByZXNvbHZlNFxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6NyB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBHYXRld2F5TGFuZ3VhZ2VNb2RlbCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IobW9kZWxJZCwgY29uZmlnKSB7XG4gICAgdGhpcy5tb2RlbElkID0gbW9kZWxJZDtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNwZWNpZmljYXRpb25WZXJzaW9uID0gXCJ2M1wiO1xuICAgIHRoaXMuc3VwcG9ydGVkVXJscyA9IHsgXCIqLypcIjogWy8uKi9dIH07XG4gIH1cbiAgZ2V0IHByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcm92aWRlcjtcbiAgfVxuICBhc3luYyBnZXRBcmdzKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGFib3J0U2lnbmFsOiBfYWJvcnRTaWduYWwsIC4uLm9wdGlvbnNXaXRob3V0U2lnbmFsIH0gPSBvcHRpb25zO1xuICAgIHJldHVybiB7XG4gICAgICBhcmdzOiB0aGlzLm1heWJlRW5jb2RlRmlsZVBhcnRzKG9wdGlvbnNXaXRob3V0U2lnbmFsKSxcbiAgICAgIHdhcm5pbmdzOiBbXVxuICAgIH07XG4gIH1cbiAgYXN5bmMgZG9HZW5lcmF0ZShvcHRpb25zKSB7XG4gICAgY29uc3QgeyBhcmdzLCB3YXJuaW5ncyB9ID0gYXdhaXQgdGhpcy5nZXRBcmdzKG9wdGlvbnMpO1xuICAgIGNvbnN0IHsgYWJvcnRTaWduYWwgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgcmVzb2x2ZWRIZWFkZXJzID0gYXdhaXQgcmVzb2x2ZTQodGhpcy5jb25maWcuaGVhZGVycygpKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge1xuICAgICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIHZhbHVlOiByZXNwb25zZUJvZHksXG4gICAgICAgIHJhd1ZhbHVlOiByYXdSZXNwb25zZVxuICAgICAgfSA9IGF3YWl0IHBvc3RKc29uVG9BcGkoe1xuICAgICAgICB1cmw6IHRoaXMuZ2V0VXJsKCksXG4gICAgICAgIGhlYWRlcnM6IGNvbWJpbmVIZWFkZXJzKFxuICAgICAgICAgIHJlc29sdmVkSGVhZGVycyxcbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnMsXG4gICAgICAgICAgdGhpcy5nZXRNb2RlbENvbmZpZ0hlYWRlcnModGhpcy5tb2RlbElkLCBmYWxzZSksXG4gICAgICAgICAgYXdhaXQgcmVzb2x2ZTQodGhpcy5jb25maWcubzExeUhlYWRlcnMpXG4gICAgICAgICksXG4gICAgICAgIGJvZHk6IGFyZ3MsXG4gICAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXI0KHo3LmFueSgpKSxcbiAgICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXI0KHtcbiAgICAgICAgICBlcnJvclNjaGVtYTogejcuYW55KCksXG4gICAgICAgICAgZXJyb3JUb01lc3NhZ2U6IChkYXRhKSA9PiBkYXRhXG4gICAgICAgIH0pLFxuICAgICAgICAuLi5hYm9ydFNpZ25hbCAmJiB7IGFib3J0U2lnbmFsIH0sXG4gICAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5yZXNwb25zZUJvZHksXG4gICAgICAgIHJlcXVlc3Q6IHsgYm9keTogYXJncyB9LFxuICAgICAgICByZXNwb25zZTogeyBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsIGJvZHk6IHJhd1Jlc3BvbnNlIH0sXG4gICAgICAgIHdhcm5pbmdzXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBhd2FpdCBhc0dhdGV3YXlFcnJvcihlcnJvciwgYXdhaXQgcGFyc2VBdXRoTWV0aG9kKHJlc29sdmVkSGVhZGVycykpO1xuICAgIH1cbiAgfVxuICBhc3luYyBkb1N0cmVhbShvcHRpb25zKSB7XG4gICAgY29uc3QgeyBhcmdzLCB3YXJuaW5ncyB9ID0gYXdhaXQgdGhpcy5nZXRBcmdzKG9wdGlvbnMpO1xuICAgIGNvbnN0IHsgYWJvcnRTaWduYWwgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgcmVzb2x2ZWRIZWFkZXJzID0gYXdhaXQgcmVzb2x2ZTQodGhpcy5jb25maWcuaGVhZGVycygpKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB2YWx1ZTogcmVzcG9uc2UsIHJlc3BvbnNlSGVhZGVycyB9ID0gYXdhaXQgcG9zdEpzb25Ub0FwaSh7XG4gICAgICAgIHVybDogdGhpcy5nZXRVcmwoKSxcbiAgICAgICAgaGVhZGVyczogY29tYmluZUhlYWRlcnMoXG4gICAgICAgICAgcmVzb2x2ZWRIZWFkZXJzLFxuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICB0aGlzLmdldE1vZGVsQ29uZmlnSGVhZGVycyh0aGlzLm1vZGVsSWQsIHRydWUpLFxuICAgICAgICAgIGF3YWl0IHJlc29sdmU0KHRoaXMuY29uZmlnLm8xMXlIZWFkZXJzKVxuICAgICAgICApLFxuICAgICAgICBib2R5OiBhcmdzLFxuICAgICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVFdmVudFNvdXJjZVJlc3BvbnNlSGFuZGxlcih6Ny5hbnkoKSksXG4gICAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyNCh7XG4gICAgICAgICAgZXJyb3JTY2hlbWE6IHo3LmFueSgpLFxuICAgICAgICAgIGVycm9yVG9NZXNzYWdlOiAoZGF0YSkgPT4gZGF0YVxuICAgICAgICB9KSxcbiAgICAgICAgLi4uYWJvcnRTaWduYWwgJiYgeyBhYm9ydFNpZ25hbCB9LFxuICAgICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RyZWFtOiByZXNwb25zZS5waXBlVGhyb3VnaChcbiAgICAgICAgICBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgICAgIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcInN0cmVhbS1zdGFydFwiLCB3YXJuaW5ncyB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgICAgICAgICBpZiAoY2h1bmsuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbVBhcnQgPSBjaHVuay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtUGFydC50eXBlID09PSBcInJhd1wiICYmICFvcHRpb25zLmluY2x1ZGVSYXdDaHVua3MpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbVBhcnQudHlwZSA9PT0gXCJyZXNwb25zZS1tZXRhZGF0YVwiICYmIHN0cmVhbVBhcnQudGltZXN0YW1wICYmIHR5cGVvZiBzdHJlYW1QYXJ0LnRpbWVzdGFtcCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgc3RyZWFtUGFydC50aW1lc3RhbXAgPSBuZXcgRGF0ZShzdHJlYW1QYXJ0LnRpbWVzdGFtcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShzdHJlYW1QYXJ0KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgY2h1bmsuZXJyb3JcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgcmVxdWVzdDogeyBib2R5OiBhcmdzIH0sXG4gICAgICAgIHJlc3BvbnNlOiB7IGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyB9XG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBhd2FpdCBhc0dhdGV3YXlFcnJvcihlcnJvciwgYXdhaXQgcGFyc2VBdXRoTWV0aG9kKHJlc29sdmVkSGVhZGVycykpO1xuICAgIH1cbiAgfVxuICBpc0ZpbGVQYXJ0KHBhcnQpIHtcbiAgICByZXR1cm4gcGFydCAmJiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiBcInR5cGVcIiBpbiBwYXJ0ICYmIHBhcnQudHlwZSA9PT0gXCJmaWxlXCI7XG4gIH1cbiAgLyoqXG4gICAqIEVuY29kZXMgZmlsZSBwYXJ0cyBpbiB0aGUgcHJvbXB0IHRvIGJhc2U2NC4gTXV0YXRlcyB0aGUgcGFzc2VkIG9wdGlvbnNcbiAgICogaW5zdGFuY2UgZGlyZWN0bHkgdG8gYXZvaWQgY29weWluZyB0aGUgZmlsZSBkYXRhLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIHRvIGVuY29kZS5cbiAgICogQHJldHVybnMgVGhlIG9wdGlvbnMgd2l0aCB0aGUgZmlsZSBwYXJ0cyBlbmNvZGVkLlxuICAgKi9cbiAgbWF5YmVFbmNvZGVGaWxlUGFydHMob3B0aW9ucykge1xuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBvcHRpb25zLnByb21wdCkge1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIG1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICBpZiAodGhpcy5pc0ZpbGVQYXJ0KHBhcnQpKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhcnQgPSBwYXJ0O1xuICAgICAgICAgIGlmIChmaWxlUGFydC5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gVWludDhBcnJheS5mcm9tKGZpbGVQYXJ0LmRhdGEpO1xuICAgICAgICAgICAgY29uc3QgYmFzZTY0RGF0YSA9IEJ1ZmZlci5mcm9tKGJ1ZmZlcikudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gICAgICAgICAgICBmaWxlUGFydC5kYXRhID0gbmV3IFVSTChcbiAgICAgICAgICAgICAgYGRhdGE6JHtmaWxlUGFydC5tZWRpYVR5cGUgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIn07YmFzZTY0LCR7YmFzZTY0RGF0YX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuICBnZXRVcmwoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuY29uZmlnLmJhc2VVUkx9L2xhbmd1YWdlLW1vZGVsYDtcbiAgfVxuICBnZXRNb2RlbENvbmZpZ0hlYWRlcnMobW9kZWxJZCwgc3RyZWFtaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwiYWktbGFuZ3VhZ2UtbW9kZWwtc3BlY2lmaWNhdGlvbi12ZXJzaW9uXCI6IFwiM1wiLFxuICAgICAgXCJhaS1sYW5ndWFnZS1tb2RlbC1pZFwiOiBtb2RlbElkLFxuICAgICAgXCJhaS1sYW5ndWFnZS1tb2RlbC1zdHJlYW1pbmdcIjogU3RyaW5nKHN0cmVhbWluZylcbiAgICB9O1xuICB9XG59O1xuXG4vLyBzcmMvZ2F0ZXdheS1lbWJlZGRpbmctbW9kZWwudHNcbmltcG9ydCB7XG4gIGNvbWJpbmVIZWFkZXJzIGFzIGNvbWJpbmVIZWFkZXJzMixcbiAgY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyIGFzIGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcjUsXG4gIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIgYXMgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjUsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTcsXG4gIHBvc3RKc29uVG9BcGkgYXMgcG9zdEpzb25Ub0FwaTIsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZTUsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWE3XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHo4IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIEdhdGV3YXlFbWJlZGRpbmdNb2RlbCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IobW9kZWxJZCwgY29uZmlnKSB7XG4gICAgdGhpcy5tb2RlbElkID0gbW9kZWxJZDtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNwZWNpZmljYXRpb25WZXJzaW9uID0gXCJ2M1wiO1xuICAgIHRoaXMubWF4RW1iZWRkaW5nc1BlckNhbGwgPSAyMDQ4O1xuICAgIHRoaXMuc3VwcG9ydHNQYXJhbGxlbENhbGxzID0gdHJ1ZTtcbiAgfVxuICBnZXQgcHJvdmlkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb3ZpZGVyO1xuICB9XG4gIGFzeW5jIGRvRW1iZWQoe1xuICAgIHZhbHVlcyxcbiAgICBoZWFkZXJzLFxuICAgIGFib3J0U2lnbmFsLFxuICAgIHByb3ZpZGVyT3B0aW9uc1xuICB9KSB7XG4gICAgdmFyIF9hOTtcbiAgICBjb25zdCByZXNvbHZlZEhlYWRlcnMgPSBhd2FpdCByZXNvbHZlNSh0aGlzLmNvbmZpZy5oZWFkZXJzKCkpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgdmFsdWU6IHJlc3BvbnNlQm9keSxcbiAgICAgICAgcmF3VmFsdWVcbiAgICAgIH0gPSBhd2FpdCBwb3N0SnNvblRvQXBpMih7XG4gICAgICAgIHVybDogdGhpcy5nZXRVcmwoKSxcbiAgICAgICAgaGVhZGVyczogY29tYmluZUhlYWRlcnMyKFxuICAgICAgICAgIHJlc29sdmVkSGVhZGVycyxcbiAgICAgICAgICBoZWFkZXJzICE9IG51bGwgPyBoZWFkZXJzIDoge30sXG4gICAgICAgICAgdGhpcy5nZXRNb2RlbENvbmZpZ0hlYWRlcnMoKSxcbiAgICAgICAgICBhd2FpdCByZXNvbHZlNSh0aGlzLmNvbmZpZy5vMTF5SGVhZGVycylcbiAgICAgICAgKSxcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAuLi5wcm92aWRlck9wdGlvbnMgPyB7IHByb3ZpZGVyT3B0aW9ucyB9IDoge31cbiAgICAgICAgfSxcbiAgICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjUoXG4gICAgICAgICAgZ2F0ZXdheUVtYmVkZGluZ1Jlc3BvbnNlU2NoZW1hXG4gICAgICAgICksXG4gICAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyNSh7XG4gICAgICAgICAgZXJyb3JTY2hlbWE6IHo4LmFueSgpLFxuICAgICAgICAgIGVycm9yVG9NZXNzYWdlOiAoZGF0YSkgPT4gZGF0YVxuICAgICAgICB9KSxcbiAgICAgICAgLi4uYWJvcnRTaWduYWwgJiYgeyBhYm9ydFNpZ25hbCB9LFxuICAgICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW1iZWRkaW5nczogcmVzcG9uc2VCb2R5LmVtYmVkZGluZ3MsXG4gICAgICAgIHVzYWdlOiAoX2E5ID0gcmVzcG9uc2VCb2R5LnVzYWdlKSAhPSBudWxsID8gX2E5IDogdm9pZCAwLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiByZXNwb25zZUJvZHkucHJvdmlkZXJNZXRhZGF0YSxcbiAgICAgICAgcmVzcG9uc2U6IHsgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLCBib2R5OiByYXdWYWx1ZSB9LFxuICAgICAgICB3YXJuaW5nczogW11cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGF3YWl0IGFzR2F0ZXdheUVycm9yKGVycm9yLCBhd2FpdCBwYXJzZUF1dGhNZXRob2QocmVzb2x2ZWRIZWFkZXJzKSk7XG4gICAgfVxuICB9XG4gIGdldFVybCgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jb25maWcuYmFzZVVSTH0vZW1iZWRkaW5nLW1vZGVsYDtcbiAgfVxuICBnZXRNb2RlbENvbmZpZ0hlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwiYWktZW1iZWRkaW5nLW1vZGVsLXNwZWNpZmljYXRpb24tdmVyc2lvblwiOiBcIjNcIixcbiAgICAgIFwiYWktbW9kZWwtaWRcIjogdGhpcy5tb2RlbElkXG4gICAgfTtcbiAgfVxufTtcbnZhciBnYXRld2F5RW1iZWRkaW5nUmVzcG9uc2VTY2hlbWEgPSBsYXp5U2NoZW1hNyhcbiAgKCkgPT4gem9kU2NoZW1hNyhcbiAgICB6OC5vYmplY3Qoe1xuICAgICAgZW1iZWRkaW5nczogejguYXJyYXkoejguYXJyYXkoejgubnVtYmVyKCkpKSxcbiAgICAgIHVzYWdlOiB6OC5vYmplY3QoeyB0b2tlbnM6IHo4Lm51bWJlcigpIH0pLm51bGxpc2goKSxcbiAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHo4LnJlY29yZCh6OC5zdHJpbmcoKSwgejgucmVjb3JkKHo4LnN0cmluZygpLCB6OC51bmtub3duKCkpKS5vcHRpb25hbCgpXG4gICAgfSlcbiAgKVxuKTtcblxuLy8gc3JjL2dhdGV3YXktaW1hZ2UtbW9kZWwudHNcbmltcG9ydCB7XG4gIGNvbWJpbmVIZWFkZXJzIGFzIGNvbWJpbmVIZWFkZXJzMyxcbiAgY29udmVydFVpbnQ4QXJyYXlUb0Jhc2U2NCxcbiAgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlciBhcyBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyNixcbiAgY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyIGFzIGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcjYsXG4gIHBvc3RKc29uVG9BcGkgYXMgcG9zdEpzb25Ub0FwaTMsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZTZcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejkgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgR2F0ZXdheUltYWdlTW9kZWwgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsSWQsIGNvbmZpZykge1xuICAgIHRoaXMubW9kZWxJZCA9IG1vZGVsSWQ7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9IFwidjNcIjtcbiAgICAvLyBTZXQgYSB2ZXJ5IGxhcmdlIG51bWJlciB0byBwcmV2ZW50IGNsaWVudC1zaWRlIHNwbGl0dGluZyBvZiByZXF1ZXN0c1xuICAgIHRoaXMubWF4SW1hZ2VzUGVyQ2FsbCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICB9XG4gIGdldCBwcm92aWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucHJvdmlkZXI7XG4gIH1cbiAgYXN5bmMgZG9HZW5lcmF0ZSh7XG4gICAgcHJvbXB0LFxuICAgIG4sXG4gICAgc2l6ZSxcbiAgICBhc3BlY3RSYXRpbyxcbiAgICBzZWVkLFxuICAgIGZpbGVzLFxuICAgIG1hc2ssXG4gICAgcHJvdmlkZXJPcHRpb25zLFxuICAgIGhlYWRlcnMsXG4gICAgYWJvcnRTaWduYWxcbiAgfSkge1xuICAgIHZhciBfYTksIF9iOSwgX2MsIF9kO1xuICAgIGNvbnN0IHJlc29sdmVkSGVhZGVycyA9IGF3YWl0IHJlc29sdmU2KHRoaXMuY29uZmlnLmhlYWRlcnMoKSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICB2YWx1ZTogcmVzcG9uc2VCb2R5LFxuICAgICAgICByYXdWYWx1ZVxuICAgICAgfSA9IGF3YWl0IHBvc3RKc29uVG9BcGkzKHtcbiAgICAgICAgdXJsOiB0aGlzLmdldFVybCgpLFxuICAgICAgICBoZWFkZXJzOiBjb21iaW5lSGVhZGVyczMoXG4gICAgICAgICAgcmVzb2x2ZWRIZWFkZXJzLFxuICAgICAgICAgIGhlYWRlcnMgIT0gbnVsbCA/IGhlYWRlcnMgOiB7fSxcbiAgICAgICAgICB0aGlzLmdldE1vZGVsQ29uZmlnSGVhZGVycygpLFxuICAgICAgICAgIGF3YWl0IHJlc29sdmU2KHRoaXMuY29uZmlnLm8xMXlIZWFkZXJzKVxuICAgICAgICApLFxuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgcHJvbXB0LFxuICAgICAgICAgIG4sXG4gICAgICAgICAgLi4uc2l6ZSAmJiB7IHNpemUgfSxcbiAgICAgICAgICAuLi5hc3BlY3RSYXRpbyAmJiB7IGFzcGVjdFJhdGlvIH0sXG4gICAgICAgICAgLi4uc2VlZCAmJiB7IHNlZWQgfSxcbiAgICAgICAgICAuLi5wcm92aWRlck9wdGlvbnMgJiYgeyBwcm92aWRlck9wdGlvbnMgfSxcbiAgICAgICAgICAuLi5maWxlcyAmJiB7XG4gICAgICAgICAgICBmaWxlczogZmlsZXMubWFwKChmaWxlKSA9PiBtYXliZUVuY29kZUltYWdlRmlsZShmaWxlKSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLm1hc2sgJiYgeyBtYXNrOiBtYXliZUVuY29kZUltYWdlRmlsZShtYXNrKSB9XG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXI2KFxuICAgICAgICAgIGdhdGV3YXlJbWFnZVJlc3BvbnNlU2NoZW1hXG4gICAgICAgICksXG4gICAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyNih7XG4gICAgICAgICAgZXJyb3JTY2hlbWE6IHo5LmFueSgpLFxuICAgICAgICAgIGVycm9yVG9NZXNzYWdlOiAoZGF0YSkgPT4gZGF0YVxuICAgICAgICB9KSxcbiAgICAgICAgLi4uYWJvcnRTaWduYWwgJiYgeyBhYm9ydFNpZ25hbCB9LFxuICAgICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW1hZ2VzOiByZXNwb25zZUJvZHkuaW1hZ2VzLFxuICAgICAgICAvLyBBbHdheXMgYmFzZTY0IHN0cmluZ3MgZnJvbSBzZXJ2ZXJcbiAgICAgICAgd2FybmluZ3M6IChfYTkgPSByZXNwb25zZUJvZHkud2FybmluZ3MpICE9IG51bGwgPyBfYTkgOiBbXSxcbiAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogcmVzcG9uc2VCb2R5LnByb3ZpZGVyTWV0YWRhdGEsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgdGltZXN0YW1wOiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSxcbiAgICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWQsXG4gICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnJlc3BvbnNlQm9keS51c2FnZSAhPSBudWxsICYmIHtcbiAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IChfYjkgPSByZXNwb25zZUJvZHkudXNhZ2UuaW5wdXRUb2tlbnMpICE9IG51bGwgPyBfYjkgOiB2b2lkIDAsXG4gICAgICAgICAgICBvdXRwdXRUb2tlbnM6IChfYyA9IHJlc3BvbnNlQm9keS51c2FnZS5vdXRwdXRUb2tlbnMpICE9IG51bGwgPyBfYyA6IHZvaWQgMCxcbiAgICAgICAgICAgIHRvdGFsVG9rZW5zOiAoX2QgPSByZXNwb25zZUJvZHkudXNhZ2UudG90YWxUb2tlbnMpICE9IG51bGwgPyBfZCA6IHZvaWQgMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgYXdhaXQgYXNHYXRld2F5RXJyb3IoZXJyb3IsIGF3YWl0IHBhcnNlQXV0aE1ldGhvZChyZXNvbHZlZEhlYWRlcnMpKTtcbiAgICB9XG4gIH1cbiAgZ2V0VXJsKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZy5iYXNlVVJMfS9pbWFnZS1tb2RlbGA7XG4gIH1cbiAgZ2V0TW9kZWxDb25maWdIZWFkZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBcImFpLWltYWdlLW1vZGVsLXNwZWNpZmljYXRpb24tdmVyc2lvblwiOiBcIjNcIixcbiAgICAgIFwiYWktbW9kZWwtaWRcIjogdGhpcy5tb2RlbElkXG4gICAgfTtcbiAgfVxufTtcbmZ1bmN0aW9uIG1heWJlRW5jb2RlSW1hZ2VGaWxlKGZpbGUpIHtcbiAgaWYgKGZpbGUudHlwZSA9PT0gXCJmaWxlXCIgJiYgZmlsZS5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5maWxlLFxuICAgICAgZGF0YTogY29udmVydFVpbnQ4QXJyYXlUb0Jhc2U2NChmaWxlLmRhdGEpXG4gICAgfTtcbiAgfVxuICByZXR1cm4gZmlsZTtcbn1cbnZhciBwcm92aWRlck1ldGFkYXRhRW50cnlTY2hlbWEgPSB6OS5vYmplY3Qoe1xuICBpbWFnZXM6IHo5LmFycmF5KHo5LnVua25vd24oKSkub3B0aW9uYWwoKVxufSkuY2F0Y2hhbGwoejkudW5rbm93bigpKTtcbnZhciBnYXRld2F5SW1hZ2VXYXJuaW5nU2NoZW1hID0gejkuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gIHo5Lm9iamVjdCh7XG4gICAgdHlwZTogejkubGl0ZXJhbChcInVuc3VwcG9ydGVkXCIpLFxuICAgIGZlYXR1cmU6IHo5LnN0cmluZygpLFxuICAgIGRldGFpbHM6IHo5LnN0cmluZygpLm9wdGlvbmFsKClcbiAgfSksXG4gIHo5Lm9iamVjdCh7XG4gICAgdHlwZTogejkubGl0ZXJhbChcImNvbXBhdGliaWxpdHlcIiksXG4gICAgZmVhdHVyZTogejkuc3RyaW5nKCksXG4gICAgZGV0YWlsczogejkuc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KSxcbiAgejkub2JqZWN0KHtcbiAgICB0eXBlOiB6OS5saXRlcmFsKFwib3RoZXJcIiksXG4gICAgbWVzc2FnZTogejkuc3RyaW5nKClcbiAgfSlcbl0pO1xudmFyIGdhdGV3YXlJbWFnZVVzYWdlU2NoZW1hID0gejkub2JqZWN0KHtcbiAgaW5wdXRUb2tlbnM6IHo5Lm51bWJlcigpLm51bGxpc2goKSxcbiAgb3V0cHV0VG9rZW5zOiB6OS5udW1iZXIoKS5udWxsaXNoKCksXG4gIHRvdGFsVG9rZW5zOiB6OS5udW1iZXIoKS5udWxsaXNoKClcbn0pO1xudmFyIGdhdGV3YXlJbWFnZVJlc3BvbnNlU2NoZW1hID0gejkub2JqZWN0KHtcbiAgaW1hZ2VzOiB6OS5hcnJheSh6OS5zdHJpbmcoKSksXG4gIC8vIEFsd2F5cyBiYXNlNjQgc3RyaW5ncyBvdmVyIHRoZSB3aXJlXG4gIHdhcm5pbmdzOiB6OS5hcnJheShnYXRld2F5SW1hZ2VXYXJuaW5nU2NoZW1hKS5vcHRpb25hbCgpLFxuICBwcm92aWRlck1ldGFkYXRhOiB6OS5yZWNvcmQoejkuc3RyaW5nKCksIHByb3ZpZGVyTWV0YWRhdGFFbnRyeVNjaGVtYSkub3B0aW9uYWwoKSxcbiAgdXNhZ2U6IGdhdGV3YXlJbWFnZVVzYWdlU2NoZW1hLm9wdGlvbmFsKClcbn0pO1xuXG4vLyBzcmMvZ2F0ZXdheS12aWRlby1tb2RlbC50c1xuaW1wb3J0IHsgQVBJQ2FsbEVycm9yIGFzIEFQSUNhbGxFcnJvcjIgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xuaW1wb3J0IHtcbiAgY29tYmluZUhlYWRlcnMgYXMgY29tYmluZUhlYWRlcnM0LFxuICBjb252ZXJ0VWludDhBcnJheVRvQmFzZTY0IGFzIGNvbnZlcnRVaW50OEFycmF5VG9CYXNlNjQyLFxuICBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXIgYXMgY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyNyxcbiAgcGFyc2VKc29uRXZlbnRTdHJlYW0sXG4gIHBvc3RKc29uVG9BcGkgYXMgcG9zdEpzb25Ub0FwaTQsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZTdcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejEwIH0gZnJvbSBcInpvZC92NFwiO1xudmFyIEdhdGV3YXlWaWRlb01vZGVsID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihtb2RlbElkLCBjb25maWcpIHtcbiAgICB0aGlzLm1vZGVsSWQgPSBtb2RlbElkO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuc3BlY2lmaWNhdGlvblZlcnNpb24gPSBcInYzXCI7XG4gICAgLy8gU2V0IGEgdmVyeSBsYXJnZSBudW1iZXIgdG8gcHJldmVudCBjbGllbnQtc2lkZSBzcGxpdHRpbmcgb2YgcmVxdWVzdHNcbiAgICB0aGlzLm1heFZpZGVvc1BlckNhbGwgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgfVxuICBnZXQgcHJvdmlkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb3ZpZGVyO1xuICB9XG4gIGFzeW5jIGRvR2VuZXJhdGUoe1xuICAgIHByb21wdCxcbiAgICBuLFxuICAgIGFzcGVjdFJhdGlvLFxuICAgIHJlc29sdXRpb24sXG4gICAgZHVyYXRpb24sXG4gICAgZnBzLFxuICAgIHNlZWQsXG4gICAgaW1hZ2UsXG4gICAgcHJvdmlkZXJPcHRpb25zLFxuICAgIGhlYWRlcnMsXG4gICAgYWJvcnRTaWduYWxcbiAgfSkge1xuICAgIHZhciBfYTk7XG4gICAgY29uc3QgcmVzb2x2ZWRIZWFkZXJzID0gYXdhaXQgcmVzb2x2ZTcodGhpcy5jb25maWcuaGVhZGVycygpKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyByZXNwb25zZUhlYWRlcnMsIHZhbHVlOiByZXNwb25zZUJvZHkgfSA9IGF3YWl0IHBvc3RKc29uVG9BcGk0KHtcbiAgICAgICAgdXJsOiB0aGlzLmdldFVybCgpLFxuICAgICAgICBoZWFkZXJzOiBjb21iaW5lSGVhZGVyczQoXG4gICAgICAgICAgcmVzb2x2ZWRIZWFkZXJzLFxuICAgICAgICAgIGhlYWRlcnMgIT0gbnVsbCA/IGhlYWRlcnMgOiB7fSxcbiAgICAgICAgICB0aGlzLmdldE1vZGVsQ29uZmlnSGVhZGVycygpLFxuICAgICAgICAgIGF3YWl0IHJlc29sdmU3KHRoaXMuY29uZmlnLm8xMXlIZWFkZXJzKSxcbiAgICAgICAgICB7IGFjY2VwdDogXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiIH1cbiAgICAgICAgKSxcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIHByb21wdCxcbiAgICAgICAgICBuLFxuICAgICAgICAgIC4uLmFzcGVjdFJhdGlvICYmIHsgYXNwZWN0UmF0aW8gfSxcbiAgICAgICAgICAuLi5yZXNvbHV0aW9uICYmIHsgcmVzb2x1dGlvbiB9LFxuICAgICAgICAgIC4uLmR1cmF0aW9uICYmIHsgZHVyYXRpb24gfSxcbiAgICAgICAgICAuLi5mcHMgJiYgeyBmcHMgfSxcbiAgICAgICAgICAuLi5zZWVkICYmIHsgc2VlZCB9LFxuICAgICAgICAgIC4uLnByb3ZpZGVyT3B0aW9ucyAmJiB7IHByb3ZpZGVyT3B0aW9ucyB9LFxuICAgICAgICAgIC4uLmltYWdlICYmIHsgaW1hZ2U6IG1heWJlRW5jb2RlVmlkZW9GaWxlKGltYWdlKSB9XG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGFzeW5jICh7XG4gICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHJlcXVlc3RCb2R5VmFsdWVzXG4gICAgICAgIH0pID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQVBJQ2FsbEVycm9yMih7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiU1NFIHJlc3BvbnNlIGJvZHkgaXMgZW1wdHlcIixcbiAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICByZXF1ZXN0Qm9keVZhbHVlcyxcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZXZlbnRTdHJlYW0gPSBwYXJzZUpzb25FdmVudFN0cmVhbSh7XG4gICAgICAgICAgICBzdHJlYW06IHJlc3BvbnNlLmJvZHksXG4gICAgICAgICAgICBzY2hlbWE6IGdhdGV3YXlWaWRlb0V2ZW50U2NoZW1hXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcmVhZGVyID0gZXZlbnRTdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZTogcGFyc2VSZXN1bHQgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgICAgICAgaWYgKGRvbmUgfHwgIXBhcnNlUmVzdWx0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQVBJQ2FsbEVycm9yMih7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiU1NFIHN0cmVhbSBlbmRlZCB3aXRob3V0IGEgZGF0YSBldmVudFwiLFxuICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgIHJlcXVlc3RCb2R5VmFsdWVzLFxuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXBhcnNlUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBUElDYWxsRXJyb3IyKHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCJGYWlsZWQgdG8gcGFyc2UgdmlkZW8gU1NFIGV2ZW50XCIsXG4gICAgICAgICAgICAgIGNhdXNlOiBwYXJzZVJlc3VsdC5lcnJvcixcbiAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICByZXF1ZXN0Qm9keVZhbHVlcyxcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZXZlbnQgPSBwYXJzZVJlc3VsdC52YWx1ZTtcbiAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQVBJQ2FsbEVycm9yMih7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGV2ZW50Lm1lc3NhZ2UsXG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IGV2ZW50LnN0YXR1c0NvZGUsXG4gICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgcmVxdWVzdEJvZHlWYWx1ZXMsXG4gICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKFsuLi5yZXNwb25zZS5oZWFkZXJzXSksXG4gICAgICAgICAgICAgIHJlc3BvbnNlQm9keTogSlNPTi5zdHJpbmdpZnkoZXZlbnQpLFxuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGV2ZW50Lm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBldmVudC5lcnJvclR5cGUsXG4gICAgICAgICAgICAgICAgICBwYXJhbTogZXZlbnQucGFyYW1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgdmlkZW9zOiBldmVudC52aWRlb3MsXG4gICAgICAgICAgICAgIHdhcm5pbmdzOiBldmVudC53YXJuaW5ncyxcbiAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogZXZlbnQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKFsuLi5yZXNwb25zZS5oZWFkZXJzXSlcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcjcoe1xuICAgICAgICAgIGVycm9yU2NoZW1hOiB6MTAuYW55KCksXG4gICAgICAgICAgZXJyb3JUb01lc3NhZ2U6IChkYXRhKSA9PiBkYXRhXG4gICAgICAgIH0pLFxuICAgICAgICAuLi5hYm9ydFNpZ25hbCAmJiB7IGFib3J0U2lnbmFsIH0sXG4gICAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2aWRlb3M6IHJlc3BvbnNlQm9keS52aWRlb3MsXG4gICAgICAgIHdhcm5pbmdzOiAoX2E5ID0gcmVzcG9uc2VCb2R5Lndhcm5pbmdzKSAhPSBudWxsID8gX2E5IDogW10sXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHJlc3BvbnNlQm9keS5wcm92aWRlck1ldGFkYXRhLFxuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIHRpbWVzdGFtcDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksXG4gICAgICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkLFxuICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBhd2FpdCBhc0dhdGV3YXlFcnJvcihlcnJvciwgYXdhaXQgcGFyc2VBdXRoTWV0aG9kKHJlc29sdmVkSGVhZGVycykpO1xuICAgIH1cbiAgfVxuICBnZXRVcmwoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuY29uZmlnLmJhc2VVUkx9L3ZpZGVvLW1vZGVsYDtcbiAgfVxuICBnZXRNb2RlbENvbmZpZ0hlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwiYWktdmlkZW8tbW9kZWwtc3BlY2lmaWNhdGlvbi12ZXJzaW9uXCI6IFwiM1wiLFxuICAgICAgXCJhaS1tb2RlbC1pZFwiOiB0aGlzLm1vZGVsSWRcbiAgICB9O1xuICB9XG59O1xuZnVuY3Rpb24gbWF5YmVFbmNvZGVWaWRlb0ZpbGUoZmlsZSkge1xuICBpZiAoZmlsZS50eXBlID09PSBcImZpbGVcIiAmJiBmaWxlLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmZpbGUsXG4gICAgICBkYXRhOiBjb252ZXJ0VWludDhBcnJheVRvQmFzZTY0MihmaWxlLmRhdGEpXG4gICAgfTtcbiAgfVxuICByZXR1cm4gZmlsZTtcbn1cbnZhciBwcm92aWRlck1ldGFkYXRhRW50cnlTY2hlbWEyID0gejEwLm9iamVjdCh7XG4gIHZpZGVvczogejEwLmFycmF5KHoxMC51bmtub3duKCkpLm9wdGlvbmFsKClcbn0pLmNhdGNoYWxsKHoxMC51bmtub3duKCkpO1xudmFyIGdhdGV3YXlWaWRlb0RhdGFTY2hlbWEgPSB6MTAudW5pb24oW1xuICB6MTAub2JqZWN0KHtcbiAgICB0eXBlOiB6MTAubGl0ZXJhbChcInVybFwiKSxcbiAgICB1cmw6IHoxMC5zdHJpbmcoKSxcbiAgICBtZWRpYVR5cGU6IHoxMC5zdHJpbmcoKVxuICB9KSxcbiAgejEwLm9iamVjdCh7XG4gICAgdHlwZTogejEwLmxpdGVyYWwoXCJiYXNlNjRcIiksXG4gICAgZGF0YTogejEwLnN0cmluZygpLFxuICAgIG1lZGlhVHlwZTogejEwLnN0cmluZygpXG4gIH0pXG5dKTtcbnZhciBnYXRld2F5VmlkZW9XYXJuaW5nU2NoZW1hID0gejEwLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICB6MTAub2JqZWN0KHtcbiAgICB0eXBlOiB6MTAubGl0ZXJhbChcInVuc3VwcG9ydGVkXCIpLFxuICAgIGZlYXR1cmU6IHoxMC5zdHJpbmcoKSxcbiAgICBkZXRhaWxzOiB6MTAuc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KSxcbiAgejEwLm9iamVjdCh7XG4gICAgdHlwZTogejEwLmxpdGVyYWwoXCJjb21wYXRpYmlsaXR5XCIpLFxuICAgIGZlYXR1cmU6IHoxMC5zdHJpbmcoKSxcbiAgICBkZXRhaWxzOiB6MTAuc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KSxcbiAgejEwLm9iamVjdCh7XG4gICAgdHlwZTogejEwLmxpdGVyYWwoXCJvdGhlclwiKSxcbiAgICBtZXNzYWdlOiB6MTAuc3RyaW5nKClcbiAgfSlcbl0pO1xudmFyIGdhdGV3YXlWaWRlb0V2ZW50U2NoZW1hID0gejEwLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICB6MTAub2JqZWN0KHtcbiAgICB0eXBlOiB6MTAubGl0ZXJhbChcInJlc3VsdFwiKSxcbiAgICB2aWRlb3M6IHoxMC5hcnJheShnYXRld2F5VmlkZW9EYXRhU2NoZW1hKSxcbiAgICB3YXJuaW5nczogejEwLmFycmF5KGdhdGV3YXlWaWRlb1dhcm5pbmdTY2hlbWEpLm9wdGlvbmFsKCksXG4gICAgcHJvdmlkZXJNZXRhZGF0YTogejEwLnJlY29yZCh6MTAuc3RyaW5nKCksIHByb3ZpZGVyTWV0YWRhdGFFbnRyeVNjaGVtYTIpLm9wdGlvbmFsKClcbiAgfSksXG4gIHoxMC5vYmplY3Qoe1xuICAgIHR5cGU6IHoxMC5saXRlcmFsKFwiZXJyb3JcIiksXG4gICAgbWVzc2FnZTogejEwLnN0cmluZygpLFxuICAgIGVycm9yVHlwZTogejEwLnN0cmluZygpLFxuICAgIHN0YXR1c0NvZGU6IHoxMC5udW1iZXIoKSxcbiAgICBwYXJhbTogejEwLnVua25vd24oKS5udWxsYWJsZSgpXG4gIH0pXG5dKTtcblxuLy8gc3JjL3Rvb2wvcGFyYWxsZWwtc2VhcmNoLnRzXG5pbXBvcnQge1xuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSxcbiAgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hOCxcbiAgem9kU2NoZW1hIGFzIHpvZFNjaGVtYThcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejExIH0gZnJvbSBcInpvZFwiO1xudmFyIHBhcmFsbGVsU2VhcmNoSW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hOChcbiAgKCkgPT4gem9kU2NoZW1hOChcbiAgICB6MTEub2JqZWN0KHtcbiAgICAgIG9iamVjdGl2ZTogejExLnN0cmluZygpLmRlc2NyaWJlKFxuICAgICAgICBcIk5hdHVyYWwtbGFuZ3VhZ2UgZGVzY3JpcHRpb24gb2YgdGhlIHdlYiByZXNlYXJjaCBnb2FsLCBpbmNsdWRpbmcgc291cmNlIG9yIGZyZXNobmVzcyBndWlkYW5jZSBhbmQgYnJvYWRlciBjb250ZXh0IGZyb20gdGhlIHRhc2suIE1heGltdW0gNTAwMCBjaGFyYWN0ZXJzLlwiXG4gICAgICApLFxuICAgICAgc2VhcmNoX3F1ZXJpZXM6IHoxMS5hcnJheSh6MTEuc3RyaW5nKCkpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgICAgIFwiT3B0aW9uYWwgc2VhcmNoIHF1ZXJpZXMgdG8gc3VwcGxlbWVudCB0aGUgb2JqZWN0aXZlLiBNYXhpbXVtIDIwMCBjaGFyYWN0ZXJzIHBlciBxdWVyeS5cIlxuICAgICAgKSxcbiAgICAgIG1vZGU6IHoxMS5lbnVtKFtcIm9uZS1zaG90XCIsIFwiYWdlbnRpY1wiXSkub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICAgICAgJ01vZGUgcHJlc2V0OiBcIm9uZS1zaG90XCIgZm9yIGNvbXByZWhlbnNpdmUgcmVzdWx0cyB3aXRoIGxvbmdlciBleGNlcnB0cyAoZGVmYXVsdCksIFwiYWdlbnRpY1wiIGZvciBjb25jaXNlLCB0b2tlbi1lZmZpY2llbnQgcmVzdWx0cyBmb3IgbXVsdGktc3RlcCB3b3JrZmxvd3MuJ1xuICAgICAgKSxcbiAgICAgIG1heF9yZXN1bHRzOiB6MTEubnVtYmVyKCkub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICAgICAgXCJNYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybiAoMS0yMCkuIERlZmF1bHRzIHRvIDEwIGlmIG5vdCBzcGVjaWZpZWQuXCJcbiAgICAgICksXG4gICAgICBzb3VyY2VfcG9saWN5OiB6MTEub2JqZWN0KHtcbiAgICAgICAgaW5jbHVkZV9kb21haW5zOiB6MTEuYXJyYXkoejExLnN0cmluZygpKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiTGlzdCBvZiBkb21haW5zIHRvIGluY2x1ZGUgaW4gc2VhcmNoIHJlc3VsdHMuXCIpLFxuICAgICAgICBleGNsdWRlX2RvbWFpbnM6IHoxMS5hcnJheSh6MTEuc3RyaW5nKCkpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJMaXN0IG9mIGRvbWFpbnMgdG8gZXhjbHVkZSBmcm9tIHNlYXJjaCByZXN1bHRzLlwiKSxcbiAgICAgICAgYWZ0ZXJfZGF0ZTogejExLnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgICAgICAgXCJPbmx5IGluY2x1ZGUgcmVzdWx0cyBwdWJsaXNoZWQgYWZ0ZXIgdGhpcyBkYXRlIChJU08gODYwMSBmb3JtYXQpLlwiXG4gICAgICAgIClcbiAgICAgIH0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgICAgIFwiU291cmNlIHBvbGljeSBmb3IgY29udHJvbGxpbmcgd2hpY2ggZG9tYWlucyB0byBpbmNsdWRlL2V4Y2x1ZGUgYW5kIGZyZXNobmVzcy5cIlxuICAgICAgKSxcbiAgICAgIGV4Y2VycHRzOiB6MTEub2JqZWN0KHtcbiAgICAgICAgbWF4X2NoYXJzX3Blcl9yZXN1bHQ6IHoxMS5udW1iZXIoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiTWF4aW11bSBjaGFyYWN0ZXJzIHBlciByZXN1bHQuXCIpLFxuICAgICAgICBtYXhfY2hhcnNfdG90YWw6IHoxMS5udW1iZXIoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiTWF4aW11bSB0b3RhbCBjaGFyYWN0ZXJzIGFjcm9zcyBhbGwgcmVzdWx0cy5cIilcbiAgICAgIH0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFeGNlcnB0IGNvbmZpZ3VyYXRpb24gZm9yIGNvbnRyb2xsaW5nIHJlc3VsdCBsZW5ndGguXCIpLFxuICAgICAgZmV0Y2hfcG9saWN5OiB6MTEub2JqZWN0KHtcbiAgICAgICAgbWF4X2FnZV9zZWNvbmRzOiB6MTEubnVtYmVyKCkub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICAgICAgICBcIk1heGltdW0gYWdlIGluIHNlY29uZHMgZm9yIGNhY2hlZCBjb250ZW50LiBTZXQgdG8gMCB0byBhbHdheXMgZmV0Y2ggZnJlc2ggY29udGVudC5cIlxuICAgICAgICApXG4gICAgICB9KS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRmV0Y2ggcG9saWN5IGZvciBjb250cm9sbGluZyBjb250ZW50IGZyZXNobmVzcy5cIilcbiAgICB9KVxuICApXG4pO1xudmFyIHBhcmFsbGVsU2VhcmNoT3V0cHV0U2NoZW1hID0gbGF6eVNjaGVtYTgoXG4gICgpID0+IHpvZFNjaGVtYTgoXG4gICAgejExLnVuaW9uKFtcbiAgICAgIC8vIFN1Y2Nlc3MgcmVzcG9uc2VcbiAgICAgIHoxMS5vYmplY3Qoe1xuICAgICAgICBzZWFyY2hJZDogejExLnN0cmluZygpLFxuICAgICAgICByZXN1bHRzOiB6MTEuYXJyYXkoXG4gICAgICAgICAgejExLm9iamVjdCh7XG4gICAgICAgICAgICB1cmw6IHoxMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHRpdGxlOiB6MTEuc3RyaW5nKCksXG4gICAgICAgICAgICBleGNlcnB0OiB6MTEuc3RyaW5nKCksXG4gICAgICAgICAgICBwdWJsaXNoRGF0ZTogejExLnN0cmluZygpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgIHJlbGV2YW5jZVNjb3JlOiB6MTEubnVtYmVyKCkub3B0aW9uYWwoKVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIH0pLFxuICAgICAgLy8gRXJyb3IgcmVzcG9uc2VcbiAgICAgIHoxMS5vYmplY3Qoe1xuICAgICAgICBlcnJvcjogejExLmVudW0oW1xuICAgICAgICAgIFwiYXBpX2Vycm9yXCIsXG4gICAgICAgICAgXCJyYXRlX2xpbWl0XCIsXG4gICAgICAgICAgXCJ0aW1lb3V0XCIsXG4gICAgICAgICAgXCJpbnZhbGlkX2lucHV0XCIsXG4gICAgICAgICAgXCJjb25maWd1cmF0aW9uX2Vycm9yXCIsXG4gICAgICAgICAgXCJ1bmtub3duXCJcbiAgICAgICAgXSksXG4gICAgICAgIHN0YXR1c0NvZGU6IHoxMS5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICBtZXNzYWdlOiB6MTEuc3RyaW5nKClcbiAgICAgIH0pXG4gICAgXSlcbiAgKVxuKTtcbnZhciBwYXJhbGxlbFNlYXJjaFRvb2xGYWN0b3J5ID0gY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWEoe1xuICBpZDogXCJnYXRld2F5LnBhcmFsbGVsX3NlYXJjaFwiLFxuICBpbnB1dFNjaGVtYTogcGFyYWxsZWxTZWFyY2hJbnB1dFNjaGVtYSxcbiAgb3V0cHV0U2NoZW1hOiBwYXJhbGxlbFNlYXJjaE91dHB1dFNjaGVtYVxufSk7XG52YXIgcGFyYWxsZWxTZWFyY2ggPSAoY29uZmlnID0ge30pID0+IHBhcmFsbGVsU2VhcmNoVG9vbEZhY3RvcnkoY29uZmlnKTtcblxuLy8gc3JjL3Rvb2wvcGVycGxleGl0eS1zZWFyY2gudHNcbmltcG9ydCB7XG4gIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hIGFzIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hMixcbiAgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hOSxcbiAgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTlcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejEyIH0gZnJvbSBcInpvZFwiO1xudmFyIHBlcnBsZXhpdHlTZWFyY2hJbnB1dFNjaGVtYSA9IGxhenlTY2hlbWE5KFxuICAoKSA9PiB6b2RTY2hlbWE5KFxuICAgIHoxMi5vYmplY3Qoe1xuICAgICAgcXVlcnk6IHoxMi51bmlvbihbejEyLnN0cmluZygpLCB6MTIuYXJyYXkoejEyLnN0cmluZygpKV0pLmRlc2NyaWJlKFxuICAgICAgICBcIlNlYXJjaCBxdWVyeSAoc3RyaW5nKSBvciBtdWx0aXBsZSBxdWVyaWVzIChhcnJheSBvZiB1cCB0byA1IHN0cmluZ3MpLiBNdWx0aS1xdWVyeSBzZWFyY2hlcyByZXR1cm4gY29tYmluZWQgcmVzdWx0cyBmcm9tIGFsbCBxdWVyaWVzLlwiXG4gICAgICApLFxuICAgICAgbWF4X3Jlc3VsdHM6IHoxMi5udW1iZXIoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgICBcIk1heGltdW0gbnVtYmVyIG9mIHNlYXJjaCByZXN1bHRzIHRvIHJldHVybiAoMS0yMCwgZGVmYXVsdDogMTApXCJcbiAgICAgICksXG4gICAgICBtYXhfdG9rZW5zX3Blcl9wYWdlOiB6MTIubnVtYmVyKCkub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICAgICAgXCJNYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gZXh0cmFjdCBwZXIgc2VhcmNoIHJlc3VsdCBwYWdlICgyNTYtMjA0OCwgZGVmYXVsdDogMjA0OClcIlxuICAgICAgKSxcbiAgICAgIG1heF90b2tlbnM6IHoxMi5udW1iZXIoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgICBcIk1heGltdW0gdG90YWwgdG9rZW5zIGFjcm9zcyBhbGwgc2VhcmNoIHJlc3VsdHMgKGRlZmF1bHQ6IDI1MDAwLCBtYXg6IDEwMDAwMDApXCJcbiAgICAgICksXG4gICAgICBjb3VudHJ5OiB6MTIuc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICAgICAgXCJUd28tbGV0dGVyIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgZm9yIHJlZ2lvbmFsIHNlYXJjaCByZXN1bHRzIChlLmcuLCAnVVMnLCAnR0InLCAnRlInKVwiXG4gICAgICApLFxuICAgICAgc2VhcmNoX2RvbWFpbl9maWx0ZXI6IHoxMi5hcnJheSh6MTIuc3RyaW5nKCkpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgICAgIFwiTGlzdCBvZiBkb21haW5zIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSBmcm9tIHNlYXJjaCByZXN1bHRzIChtYXggMjApLiBUbyBpbmNsdWRlOiBbJ25hdHVyZS5jb20nLCAnc2NpZW5jZS5vcmcnXS4gVG8gZXhjbHVkZTogWyctZXhhbXBsZS5jb20nLCAnLXNwYW0ubmV0J11cIlxuICAgICAgKSxcbiAgICAgIHNlYXJjaF9sYW5ndWFnZV9maWx0ZXI6IHoxMi5hcnJheSh6MTIuc3RyaW5nKCkpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgICAgIFwiTGlzdCBvZiBJU08gNjM5LTEgbGFuZ3VhZ2UgY29kZXMgdG8gZmlsdGVyIHJlc3VsdHMgKG1heCAxMCwgbG93ZXJjYXNlKS4gRXhhbXBsZXM6IFsnZW4nLCAnZnInLCAnZGUnXVwiXG4gICAgICApLFxuICAgICAgc2VhcmNoX2FmdGVyX2RhdGU6IHoxMi5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgICBcIkluY2x1ZGUgb25seSByZXN1bHRzIHB1Ymxpc2hlZCBhZnRlciB0aGlzIGRhdGUuIEZvcm1hdDogJ01NL0REL1lZWVknIChlLmcuLCAnMy8xLzIwMjUnKS4gQ2Fubm90IGJlIHVzZWQgd2l0aCBzZWFyY2hfcmVjZW5jeV9maWx0ZXIuXCJcbiAgICAgICksXG4gICAgICBzZWFyY2hfYmVmb3JlX2RhdGU6IHoxMi5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgICBcIkluY2x1ZGUgb25seSByZXN1bHRzIHB1Ymxpc2hlZCBiZWZvcmUgdGhpcyBkYXRlLiBGb3JtYXQ6ICdNTS9ERC9ZWVlZJyAoZS5nLiwgJzMvMTUvMjAyNScpLiBDYW5ub3QgYmUgdXNlZCB3aXRoIHNlYXJjaF9yZWNlbmN5X2ZpbHRlci5cIlxuICAgICAgKSxcbiAgICAgIGxhc3RfdXBkYXRlZF9hZnRlcl9maWx0ZXI6IHoxMi5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgICBcIkluY2x1ZGUgb25seSByZXN1bHRzIGxhc3QgdXBkYXRlZCBhZnRlciB0aGlzIGRhdGUuIEZvcm1hdDogJ01NL0REL1lZWVknIChlLmcuLCAnMy8xLzIwMjUnKS4gQ2Fubm90IGJlIHVzZWQgd2l0aCBzZWFyY2hfcmVjZW5jeV9maWx0ZXIuXCJcbiAgICAgICksXG4gICAgICBsYXN0X3VwZGF0ZWRfYmVmb3JlX2ZpbHRlcjogejEyLnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgICAgIFwiSW5jbHVkZSBvbmx5IHJlc3VsdHMgbGFzdCB1cGRhdGVkIGJlZm9yZSB0aGlzIGRhdGUuIEZvcm1hdDogJ01NL0REL1lZWVknIChlLmcuLCAnMy8xNS8yMDI1JykuIENhbm5vdCBiZSB1c2VkIHdpdGggc2VhcmNoX3JlY2VuY3lfZmlsdGVyLlwiXG4gICAgICApLFxuICAgICAgc2VhcmNoX3JlY2VuY3lfZmlsdGVyOiB6MTIuZW51bShbXCJkYXlcIiwgXCJ3ZWVrXCIsIFwibW9udGhcIiwgXCJ5ZWFyXCJdKS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgICBcIkZpbHRlciByZXN1bHRzIGJ5IHJlbGF0aXZlIHRpbWUgcGVyaW9kLiBDYW5ub3QgYmUgdXNlZCB3aXRoIHNlYXJjaF9hZnRlcl9kYXRlIG9yIHNlYXJjaF9iZWZvcmVfZGF0ZS5cIlxuICAgICAgKVxuICAgIH0pXG4gIClcbik7XG52YXIgcGVycGxleGl0eVNlYXJjaE91dHB1dFNjaGVtYSA9IGxhenlTY2hlbWE5KFxuICAoKSA9PiB6b2RTY2hlbWE5KFxuICAgIHoxMi51bmlvbihbXG4gICAgICAvLyBTdWNjZXNzIHJlc3BvbnNlXG4gICAgICB6MTIub2JqZWN0KHtcbiAgICAgICAgcmVzdWx0czogejEyLmFycmF5KFxuICAgICAgICAgIHoxMi5vYmplY3Qoe1xuICAgICAgICAgICAgdGl0bGU6IHoxMi5zdHJpbmcoKSxcbiAgICAgICAgICAgIHVybDogejEyLnN0cmluZygpLFxuICAgICAgICAgICAgc25pcHBldDogejEyLnN0cmluZygpLFxuICAgICAgICAgICAgZGF0ZTogejEyLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICBsYXN0VXBkYXRlZDogejEyLnN0cmluZygpLm9wdGlvbmFsKClcbiAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgICBpZDogejEyLnN0cmluZygpXG4gICAgICB9KSxcbiAgICAgIC8vIEVycm9yIHJlc3BvbnNlXG4gICAgICB6MTIub2JqZWN0KHtcbiAgICAgICAgZXJyb3I6IHoxMi5lbnVtKFtcbiAgICAgICAgICBcImFwaV9lcnJvclwiLFxuICAgICAgICAgIFwicmF0ZV9saW1pdFwiLFxuICAgICAgICAgIFwidGltZW91dFwiLFxuICAgICAgICAgIFwiaW52YWxpZF9pbnB1dFwiLFxuICAgICAgICAgIFwidW5rbm93blwiXG4gICAgICAgIF0pLFxuICAgICAgICBzdGF0dXNDb2RlOiB6MTIubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgbWVzc2FnZTogejEyLnN0cmluZygpXG4gICAgICB9KVxuICAgIF0pXG4gIClcbik7XG52YXIgcGVycGxleGl0eVNlYXJjaFRvb2xGYWN0b3J5ID0gY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWEyKHtcbiAgaWQ6IFwiZ2F0ZXdheS5wZXJwbGV4aXR5X3NlYXJjaFwiLFxuICBpbnB1dFNjaGVtYTogcGVycGxleGl0eVNlYXJjaElucHV0U2NoZW1hLFxuICBvdXRwdXRTY2hlbWE6IHBlcnBsZXhpdHlTZWFyY2hPdXRwdXRTY2hlbWFcbn0pO1xudmFyIHBlcnBsZXhpdHlTZWFyY2ggPSAoY29uZmlnID0ge30pID0+IHBlcnBsZXhpdHlTZWFyY2hUb29sRmFjdG9yeShjb25maWcpO1xuXG4vLyBzcmMvZ2F0ZXdheS10b29scy50c1xudmFyIGdhdGV3YXlUb29scyA9IHtcbiAgLyoqXG4gICAqIFNlYXJjaCB0aGUgd2ViIHVzaW5nIFBhcmFsbGVsIEFJJ3MgU2VhcmNoIEFQSSBmb3IgTExNLW9wdGltaXplZCBleGNlcnB0cy5cbiAgICpcbiAgICogVGFrZXMgYSBuYXR1cmFsIGxhbmd1YWdlIG9iamVjdGl2ZSBhbmQgcmV0dXJucyByZWxldmFudCBleGNlcnB0cyxcbiAgICogcmVwbGFjaW5nIG11bHRpcGxlIGtleXdvcmQgc2VhcmNoZXMgd2l0aCBhIHNpbmdsZSBjYWxsIGZvciBicm9hZFxuICAgKiBvciBjb21wbGV4IHF1ZXJpZXMuIFN1cHBvcnRzIGRpZmZlcmVudCBzZWFyY2ggdHlwZXMgZm9yIGRlcHRoIHZzXG4gICAqIGJyZWFkdGggdHJhZGVvZmZzLlxuICAgKi9cbiAgcGFyYWxsZWxTZWFyY2gsXG4gIC8qKlxuICAgKiBTZWFyY2ggdGhlIHdlYiB1c2luZyBQZXJwbGV4aXR5J3MgU2VhcmNoIEFQSSBmb3IgcmVhbC10aW1lIGluZm9ybWF0aW9uLFxuICAgKiBuZXdzLCByZXNlYXJjaCBwYXBlcnMsIGFuZCBhcnRpY2xlcy5cbiAgICpcbiAgICogUHJvdmlkZXMgcmFua2VkIHNlYXJjaCByZXN1bHRzIHdpdGggYWR2YW5jZWQgZmlsdGVyaW5nIG9wdGlvbnMgaW5jbHVkaW5nXG4gICAqIGRvbWFpbiwgbGFuZ3VhZ2UsIGRhdGUgcmFuZ2UsIGFuZCByZWNlbmN5IGZpbHRlcnMuXG4gICAqL1xuICBwZXJwbGV4aXR5U2VhcmNoXG59O1xuXG4vLyBzcmMvdmVyY2VsLWVudmlyb25tZW50LnRzXG5pbXBvcnQgeyBnZXRDb250ZXh0IH0gZnJvbSBcIkB2ZXJjZWwvb2lkY1wiO1xuaW1wb3J0IHsgZ2V0VmVyY2VsT2lkY1Rva2VuIH0gZnJvbSBcIkB2ZXJjZWwvb2lkY1wiO1xuYXN5bmMgZnVuY3Rpb24gZ2V0VmVyY2VsUmVxdWVzdElkKCkge1xuICB2YXIgX2E5O1xuICByZXR1cm4gKF9hOSA9IGdldENvbnRleHQoKS5oZWFkZXJzKSA9PSBudWxsID8gdm9pZCAwIDogX2E5W1wieC12ZXJjZWwtaWRcIl07XG59XG5cbi8vIHNyYy9nYXRld2F5LXByb3ZpZGVyLnRzXG5pbXBvcnQgeyB3aXRoVXNlckFnZW50U3VmZml4IH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL3ZlcnNpb24udHNcbnZhciBWRVJTSU9OID0gdHJ1ZSA/IFwiMy4wLjg0XCIgOiBcIjAuMC4wLXRlc3RcIjtcblxuLy8gc3JjL2dhdGV3YXktcHJvdmlkZXIudHNcbnZhciBBSV9HQVRFV0FZX1BST1RPQ09MX1ZFUlNJT04gPSBcIjAuMC4xXCI7XG5mdW5jdGlvbiBjcmVhdGVHYXRld2F5UHJvdmlkZXIob3B0aW9ucyA9IHt9KSB7XG4gIHZhciBfYTksIF9iOTtcbiAgbGV0IHBlbmRpbmdNZXRhZGF0YSA9IG51bGw7XG4gIGxldCBtZXRhZGF0YUNhY2hlID0gbnVsbDtcbiAgY29uc3QgY2FjaGVSZWZyZXNoTWlsbGlzID0gKF9hOSA9IG9wdGlvbnMubWV0YWRhdGFDYWNoZVJlZnJlc2hNaWxsaXMpICE9IG51bGwgPyBfYTkgOiAxZTMgKiA2MCAqIDU7XG4gIGxldCBsYXN0RmV0Y2hUaW1lID0gMDtcbiAgY29uc3QgYmFzZVVSTCA9IChfYjkgPSB3aXRob3V0VHJhaWxpbmdTbGFzaChvcHRpb25zLmJhc2VVUkwpKSAhPSBudWxsID8gX2I5IDogXCJodHRwczovL2FpLWdhdGV3YXkudmVyY2VsLnNoL3YzL2FpXCI7XG4gIGNvbnN0IGdldEhlYWRlcnMgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF1dGggPSBhd2FpdCBnZXRHYXRld2F5QXV0aFRva2VuKG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHdpdGhVc2VyQWdlbnRTdWZmaXgoXG4gICAgICAgIHtcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXV0aC50b2tlbn1gLFxuICAgICAgICAgIFwiYWktZ2F0ZXdheS1wcm90b2NvbC12ZXJzaW9uXCI6IEFJX0dBVEVXQVlfUFJPVE9DT0xfVkVSU0lPTixcbiAgICAgICAgICBbR0FURVdBWV9BVVRIX01FVEhPRF9IRUFERVJdOiBhdXRoLmF1dGhNZXRob2QsXG4gICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGBhaS1zZGsvZ2F0ZXdheS8ke1ZFUlNJT059YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgR2F0ZXdheUF1dGhlbnRpY2F0aW9uRXJyb3IuY3JlYXRlQ29udGV4dHVhbEVycm9yKHtcbiAgICAgICAgYXBpS2V5UHJvdmlkZWQ6IGZhbHNlLFxuICAgICAgICBvaWRjVG9rZW5Qcm92aWRlZDogZmFsc2UsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMSxcbiAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGNyZWF0ZU8xMXlIZWFkZXJzID0gKCkgPT4ge1xuICAgIGNvbnN0IGRlcGxveW1lbnRJZCA9IGxvYWRPcHRpb25hbFNldHRpbmcoe1xuICAgICAgc2V0dGluZ1ZhbHVlOiB2b2lkIDAsXG4gICAgICBlbnZpcm9ubWVudFZhcmlhYmxlTmFtZTogXCJWRVJDRUxfREVQTE9ZTUVOVF9JRFwiXG4gICAgfSk7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBsb2FkT3B0aW9uYWxTZXR0aW5nKHtcbiAgICAgIHNldHRpbmdWYWx1ZTogdm9pZCAwLFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZU5hbWU6IFwiVkVSQ0VMX0VOVlwiXG4gICAgfSk7XG4gICAgY29uc3QgcmVnaW9uID0gbG9hZE9wdGlvbmFsU2V0dGluZyh7XG4gICAgICBzZXR0aW5nVmFsdWU6IHZvaWQgMCxcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVOYW1lOiBcIlZFUkNFTF9SRUdJT05cIlxuICAgIH0pO1xuICAgIGNvbnN0IHByb2plY3RJZCA9IGxvYWRPcHRpb25hbFNldHRpbmcoe1xuICAgICAgc2V0dGluZ1ZhbHVlOiB2b2lkIDAsXG4gICAgICBlbnZpcm9ubWVudFZhcmlhYmxlTmFtZTogXCJWRVJDRUxfUFJPSkVDVF9JRFwiXG4gICAgfSk7XG4gICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IGF3YWl0IGdldFZlcmNlbFJlcXVlc3RJZCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVwbG95bWVudElkICYmIHsgXCJhaS1vMTF5LWRlcGxveW1lbnQtaWRcIjogZGVwbG95bWVudElkIH0sXG4gICAgICAgIC4uLmVudmlyb25tZW50ICYmIHsgXCJhaS1vMTF5LWVudmlyb25tZW50XCI6IGVudmlyb25tZW50IH0sXG4gICAgICAgIC4uLnJlZ2lvbiAmJiB7IFwiYWktbzExeS1yZWdpb25cIjogcmVnaW9uIH0sXG4gICAgICAgIC4uLnJlcXVlc3RJZCAmJiB7IFwiYWktbzExeS1yZXF1ZXN0LWlkXCI6IHJlcXVlc3RJZCB9LFxuICAgICAgICAuLi5wcm9qZWN0SWQgJiYgeyBcImFpLW8xMXktcHJvamVjdC1pZFwiOiBwcm9qZWN0SWQgfVxuICAgICAgfTtcbiAgICB9O1xuICB9O1xuICBjb25zdCBjcmVhdGVMYW5ndWFnZU1vZGVsID0gKG1vZGVsSWQpID0+IHtcbiAgICByZXR1cm4gbmV3IEdhdGV3YXlMYW5ndWFnZU1vZGVsKG1vZGVsSWQsIHtcbiAgICAgIHByb3ZpZGVyOiBcImdhdGV3YXlcIixcbiAgICAgIGJhc2VVUkwsXG4gICAgICBoZWFkZXJzOiBnZXRIZWFkZXJzLFxuICAgICAgZmV0Y2g6IG9wdGlvbnMuZmV0Y2gsXG4gICAgICBvMTF5SGVhZGVyczogY3JlYXRlTzExeUhlYWRlcnMoKVxuICAgIH0pO1xuICB9O1xuICBjb25zdCBnZXRBdmFpbGFibGVNb2RlbHMgPSBhc3luYyAoKSA9PiB7XG4gICAgdmFyIF9hMTAsIF9iMTAsIF9jO1xuICAgIGNvbnN0IG5vdyA9IChfYyA9IChfYjEwID0gKF9hMTAgPSBvcHRpb25zLl9pbnRlcm5hbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMTAuY3VycmVudERhdGUpID09IG51bGwgPyB2b2lkIDAgOiBfYjEwLmNhbGwoX2ExMCkuZ2V0VGltZSgpKSAhPSBudWxsID8gX2MgOiBEYXRlLm5vdygpO1xuICAgIGlmICghcGVuZGluZ01ldGFkYXRhIHx8IG5vdyAtIGxhc3RGZXRjaFRpbWUgPiBjYWNoZVJlZnJlc2hNaWxsaXMpIHtcbiAgICAgIGxhc3RGZXRjaFRpbWUgPSBub3c7XG4gICAgICBwZW5kaW5nTWV0YWRhdGEgPSBuZXcgR2F0ZXdheUZldGNoTWV0YWRhdGEoe1xuICAgICAgICBiYXNlVVJMLFxuICAgICAgICBoZWFkZXJzOiBnZXRIZWFkZXJzLFxuICAgICAgICBmZXRjaDogb3B0aW9ucy5mZXRjaFxuICAgICAgfSkuZ2V0QXZhaWxhYmxlTW9kZWxzKCkudGhlbigobWV0YWRhdGEpID0+IHtcbiAgICAgICAgbWV0YWRhdGFDYWNoZSA9IG1ldGFkYXRhO1xuICAgICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgICB9KS5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhyb3cgYXdhaXQgYXNHYXRld2F5RXJyb3IoXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgYXdhaXQgcGFyc2VBdXRoTWV0aG9kKGF3YWl0IGdldEhlYWRlcnMoKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbWV0YWRhdGFDYWNoZSA/IFByb21pc2UucmVzb2x2ZShtZXRhZGF0YUNhY2hlKSA6IHBlbmRpbmdNZXRhZGF0YTtcbiAgfTtcbiAgY29uc3QgZ2V0Q3JlZGl0cyA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gbmV3IEdhdGV3YXlGZXRjaE1ldGFkYXRhKHtcbiAgICAgIGJhc2VVUkwsXG4gICAgICBoZWFkZXJzOiBnZXRIZWFkZXJzLFxuICAgICAgZmV0Y2g6IG9wdGlvbnMuZmV0Y2hcbiAgICB9KS5nZXRDcmVkaXRzKCkuY2F0Y2goYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBhd2FpdCBhc0dhdGV3YXlFcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGF3YWl0IHBhcnNlQXV0aE1ldGhvZChhd2FpdCBnZXRIZWFkZXJzKCkpXG4gICAgICApO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBnZXRTcGVuZFJlcG9ydCA9IGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IEdhdGV3YXlTcGVuZFJlcG9ydCh7XG4gICAgICBiYXNlVVJMLFxuICAgICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICAgIGZldGNoOiBvcHRpb25zLmZldGNoXG4gICAgfSkuZ2V0U3BlbmRSZXBvcnQocGFyYW1zKS5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgIHRocm93IGF3YWl0IGFzR2F0ZXdheUVycm9yKFxuICAgICAgICBlcnJvcixcbiAgICAgICAgYXdhaXQgcGFyc2VBdXRoTWV0aG9kKGF3YWl0IGdldEhlYWRlcnMoKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGdldEdlbmVyYXRpb25JbmZvID0gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgR2F0ZXdheUdlbmVyYXRpb25JbmZvRmV0Y2hlcih7XG4gICAgICBiYXNlVVJMLFxuICAgICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICAgIGZldGNoOiBvcHRpb25zLmZldGNoXG4gICAgfSkuZ2V0R2VuZXJhdGlvbkluZm8ocGFyYW1zKS5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgIHRocm93IGF3YWl0IGFzR2F0ZXdheUVycm9yKFxuICAgICAgICBlcnJvcixcbiAgICAgICAgYXdhaXQgcGFyc2VBdXRoTWV0aG9kKGF3YWl0IGdldEhlYWRlcnMoKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHByb3ZpZGVyID0gZnVuY3Rpb24obW9kZWxJZCkge1xuICAgIGlmIChuZXcudGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGhlIEdhdGV3YXkgUHJvdmlkZXIgbW9kZWwgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcga2V5d29yZC5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUxhbmd1YWdlTW9kZWwobW9kZWxJZCk7XG4gIH07XG4gIHByb3ZpZGVyLnNwZWNpZmljYXRpb25WZXJzaW9uID0gXCJ2M1wiO1xuICBwcm92aWRlci5nZXRBdmFpbGFibGVNb2RlbHMgPSBnZXRBdmFpbGFibGVNb2RlbHM7XG4gIHByb3ZpZGVyLmdldENyZWRpdHMgPSBnZXRDcmVkaXRzO1xuICBwcm92aWRlci5nZXRTcGVuZFJlcG9ydCA9IGdldFNwZW5kUmVwb3J0O1xuICBwcm92aWRlci5nZXRHZW5lcmF0aW9uSW5mbyA9IGdldEdlbmVyYXRpb25JbmZvO1xuICBwcm92aWRlci5pbWFnZU1vZGVsID0gKG1vZGVsSWQpID0+IHtcbiAgICByZXR1cm4gbmV3IEdhdGV3YXlJbWFnZU1vZGVsKG1vZGVsSWQsIHtcbiAgICAgIHByb3ZpZGVyOiBcImdhdGV3YXlcIixcbiAgICAgIGJhc2VVUkwsXG4gICAgICBoZWFkZXJzOiBnZXRIZWFkZXJzLFxuICAgICAgZmV0Y2g6IG9wdGlvbnMuZmV0Y2gsXG4gICAgICBvMTF5SGVhZGVyczogY3JlYXRlTzExeUhlYWRlcnMoKVxuICAgIH0pO1xuICB9O1xuICBwcm92aWRlci5sYW5ndWFnZU1vZGVsID0gY3JlYXRlTGFuZ3VhZ2VNb2RlbDtcbiAgY29uc3QgY3JlYXRlRW1iZWRkaW5nTW9kZWwgPSAobW9kZWxJZCkgPT4ge1xuICAgIHJldHVybiBuZXcgR2F0ZXdheUVtYmVkZGluZ01vZGVsKG1vZGVsSWQsIHtcbiAgICAgIHByb3ZpZGVyOiBcImdhdGV3YXlcIixcbiAgICAgIGJhc2VVUkwsXG4gICAgICBoZWFkZXJzOiBnZXRIZWFkZXJzLFxuICAgICAgZmV0Y2g6IG9wdGlvbnMuZmV0Y2gsXG4gICAgICBvMTF5SGVhZGVyczogY3JlYXRlTzExeUhlYWRlcnMoKVxuICAgIH0pO1xuICB9O1xuICBwcm92aWRlci5lbWJlZGRpbmdNb2RlbCA9IGNyZWF0ZUVtYmVkZGluZ01vZGVsO1xuICBwcm92aWRlci50ZXh0RW1iZWRkaW5nTW9kZWwgPSBjcmVhdGVFbWJlZGRpbmdNb2RlbDtcbiAgcHJvdmlkZXIudmlkZW9Nb2RlbCA9IChtb2RlbElkKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBHYXRld2F5VmlkZW9Nb2RlbChtb2RlbElkLCB7XG4gICAgICBwcm92aWRlcjogXCJnYXRld2F5XCIsXG4gICAgICBiYXNlVVJMLFxuICAgICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICAgIGZldGNoOiBvcHRpb25zLmZldGNoLFxuICAgICAgbzExeUhlYWRlcnM6IGNyZWF0ZU8xMXlIZWFkZXJzKClcbiAgICB9KTtcbiAgfTtcbiAgcHJvdmlkZXIuY2hhdCA9IHByb3ZpZGVyLmxhbmd1YWdlTW9kZWw7XG4gIHByb3ZpZGVyLmVtYmVkZGluZyA9IHByb3ZpZGVyLmVtYmVkZGluZ01vZGVsO1xuICBwcm92aWRlci5pbWFnZSA9IHByb3ZpZGVyLmltYWdlTW9kZWw7XG4gIHByb3ZpZGVyLnZpZGVvID0gcHJvdmlkZXIudmlkZW9Nb2RlbDtcbiAgcHJvdmlkZXIudG9vbHMgPSBnYXRld2F5VG9vbHM7XG4gIHJldHVybiBwcm92aWRlcjtcbn1cbnZhciBnYXRld2F5ID0gY3JlYXRlR2F0ZXdheVByb3ZpZGVyKCk7XG5hc3luYyBmdW5jdGlvbiBnZXRHYXRld2F5QXV0aFRva2VuKG9wdGlvbnMpIHtcbiAgY29uc3QgYXBpS2V5ID0gbG9hZE9wdGlvbmFsU2V0dGluZyh7XG4gICAgc2V0dGluZ1ZhbHVlOiBvcHRpb25zLmFwaUtleSxcbiAgICBlbnZpcm9ubWVudFZhcmlhYmxlTmFtZTogXCJBSV9HQVRFV0FZX0FQSV9LRVlcIlxuICB9KTtcbiAgaWYgKGFwaUtleSkge1xuICAgIHJldHVybiB7XG4gICAgICB0b2tlbjogYXBpS2V5LFxuICAgICAgYXV0aE1ldGhvZDogXCJhcGkta2V5XCJcbiAgICB9O1xuICB9XG4gIGNvbnN0IG9pZGNUb2tlbiA9IGF3YWl0IGdldFZlcmNlbE9pZGNUb2tlbigpO1xuICByZXR1cm4ge1xuICAgIHRva2VuOiBvaWRjVG9rZW4sXG4gICAgYXV0aE1ldGhvZDogXCJvaWRjXCJcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIEdhdGV3YXlBdXRoZW50aWNhdGlvbkVycm9yLFxuICBHYXRld2F5RXJyb3IsXG4gIEdhdGV3YXlJbnRlcm5hbFNlcnZlckVycm9yLFxuICBHYXRld2F5SW52YWxpZFJlcXVlc3RFcnJvcixcbiAgR2F0ZXdheU1vZGVsTm90Rm91bmRFcnJvcixcbiAgR2F0ZXdheVJhdGVMaW1pdEVycm9yLFxuICBHYXRld2F5UmVzcG9uc2VFcnJvcixcbiAgY3JlYXRlR2F0ZXdheVByb3ZpZGVyIGFzIGNyZWF0ZUdhdGV3YXksXG4gIGNyZWF0ZUdhdGV3YXlQcm92aWRlcixcbiAgZ2F0ZXdheVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/@ai-sdk+gateway@3.0.84_zod@3.25.76/node_modules/@ai-sdk/gateway/dist/index.mjs\n");
/***/ }),
/***/ "(rsc)/./node_modules/.pnpm/@ai-sdk+gateway@3.0.84_zod@3.25.76/node_modules/@ai-sdk/gateway/dist/index.mjs":
/*!***********************************************************************************************************!*\
!*** ./node_modules/.pnpm/@ai-sdk+gateway@3.0.84_zod@3.25.76/node_modules/@ai-sdk/gateway/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 */ GatewayAuthenticationError: () => (/* binding */ GatewayAuthenticationError),\n/* harmony export */ GatewayError: () => (/* binding */ GatewayError),\n/* harmony export */ GatewayInternalServerError: () => (/* binding */ GatewayInternalServerError),\n/* harmony export */ GatewayInvalidRequestError: () => (/* binding */ GatewayInvalidRequestError),\n/* harmony export */ GatewayModelNotFoundError: () => (/* binding */ GatewayModelNotFoundError),\n/* harmony export */ GatewayRateLimitError: () => (/* binding */ GatewayRateLimitError),\n/* harmony export */ GatewayResponseError: () => (/* binding */ GatewayResponseError),\n/* harmony export */ createGateway: () => (/* binding */ createGatewayProvider),\n/* harmony export */ createGatewayProvider: () => (/* binding */ createGatewayProvider),\n/* harmony export */ gateway: () => (/* binding */ gateway)\n/* harmony export */ });\n/* harmony import */ var _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__ = __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_2__ = __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_1__ = __webpack_require__(/*! zod/v4 */ \"(rsc)/./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/schemas.js\");\n/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! zod */ \"(rsc)/./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js\");\n/* harmony import */ var _vercel_oidc__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @vercel/oidc */ \"(rsc)/./node_modules/.pnpm/@vercel+oidc@3.1.0/node_modules/@vercel/oidc/dist/index.js\");\n// src/gateway-provider.ts\n\n\n// src/errors/as-gateway-error.ts\n\n\n// src/errors/create-gateway-error.ts\n\n\n// src/errors/gateway-error.ts\nvar marker = \"vercel.ai.gateway.error\";\nvar symbol = Symbol.for(marker);\nvar _a, _b;\nvar GatewayError = class _GatewayError extends (_b = Error, _a = symbol, _b) {\n constructor({\n message,\n statusCode = 500,\n cause,\n generationId\n }) {\n super(generationId ? `${message} [${generationId}]` : message);\n this[_a] = true;\n this.statusCode = statusCode;\n this.cause = cause;\n this.generationId = generationId;\n }\n /**\n * Checks if the given error is a Gateway Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is a Gateway Error, false otherwise.\n */\n static isInstance(error) {\n return _GatewayError.hasMarker(error);\n }\n static hasMarker(error) {\n return typeof error === \"object\" && error !== null && symbol in error && error[symbol] === true;\n }\n};\n\n// src/errors/gateway-authentication-error.ts\nvar name = \"GatewayAuthenticationError\";\nvar marker2 = `vercel.ai.gateway.error.${name}`;\nvar symbol2 = Symbol.for(marker2);\nvar _a2, _b2;\nvar GatewayAuthenticationError = class _GatewayAuthenticationError extends (_b2 = GatewayError, _a2 = symbol2, _b2) {\n constructor({\n message = \"Authentication failed\",\n statusCode = 401,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a2] = true;\n // used in isInstance\n this.name = name;\n this.type = \"authentication_error\";\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol2 in error;\n }\n /**\n * Creates a contextual error message when authentication fails\n */\n static createContextualError({\n apiKeyProvided,\n oidcTokenProvided,\n message = \"Authentication failed\",\n statusCode = 401,\n cause,\n generationId\n }) {\n let contextualMessage;\n if (apiKeyProvided) {\n contextualMessage = `AI Gateway authentication failed: Invalid API key.\n\nCreate a new API key: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys\n\nProvide via 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.`;\n } else if (oidcTokenProvided) {\n contextualMessage = `AI Gateway authentication failed: Invalid OIDC token.\n\nRun 'npx vercel link' to link your project, then 'vc env pull' to fetch the token.\n\nAlternatively, use an API key: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys`;\n } else {\n contextualMessage = `AI Gateway authentication failed: No authentication provided.\n\nOption 1 - API key:\nCreate an API key: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys\nProvide via 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.\n\nOption 2 - OIDC token:\nRun 'npx vercel link' to link your project, then 'vc env pull' to fetch the token.`;\n }\n return new _GatewayAuthenticationError({\n message: contextualMessage,\n statusCode,\n cause,\n generationId\n });\n }\n};\n\n// src/errors/gateway-invalid-request-error.ts\nvar name2 = \"GatewayInvalidRequestError\";\nvar marker3 = `vercel.ai.gateway.error.${name2}`;\nvar symbol3 = Symbol.for(marker3);\nvar _a3, _b3;\nvar GatewayInvalidRequestError = class extends (_b3 = GatewayError, _a3 = symbol3, _b3) {\n constructor({\n message = \"Invalid request\",\n statusCode = 400,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a3] = true;\n // used in isInstance\n this.name = name2;\n this.type = \"invalid_request_error\";\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol3 in error;\n }\n};\n\n// src/errors/gateway-rate-limit-error.ts\nvar name3 = \"GatewayRateLimitError\";\nvar marker4 = `vercel.ai.gateway.error.${name3}`;\nvar symbol4 = Symbol.for(marker4);\nvar _a4, _b4;\nvar GatewayRateLimitError = class extends (_b4 = GatewayError, _a4 = symbol4, _b4) {\n constructor({\n message = \"Rate limit exceeded\",\n statusCode = 429,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a4] = true;\n // used in isInstance\n this.name = name3;\n this.type = \"rate_limit_exceeded\";\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol4 in error;\n }\n};\n\n// src/errors/gateway-model-not-found-error.ts\n\n\nvar name4 = \"GatewayModelNotFoundError\";\nvar marker5 = `vercel.ai.gateway.error.${name4}`;\nvar symbol5 = Symbol.for(marker5);\nvar modelNotFoundParamSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n modelId: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n })\n )\n);\nvar _a5, _b5;\nvar GatewayModelNotFoundError = class extends (_b5 = GatewayError, _a5 = symbol5, _b5) {\n constructor({\n message = \"Model not found\",\n statusCode = 404,\n modelId,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a5] = true;\n // used in isInstance\n this.name = name4;\n this.type = \"model_not_found\";\n this.modelId = modelId;\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol5 in error;\n }\n};\n\n// src/errors/gateway-internal-server-error.ts\nvar name5 = \"GatewayInternalServerError\";\nvar marker6 = `vercel.ai.gateway.error.${name5}`;\nvar symbol6 = Symbol.for(marker6);\nvar _a6, _b6;\nvar GatewayInternalServerError = class extends (_b6 = GatewayError, _a6 = symbol6, _b6) {\n constructor({\n message = \"Internal server error\",\n statusCode = 500,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a6] = true;\n // used in isInstance\n this.name = name5;\n this.type = \"internal_server_error\";\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol6 in error;\n }\n};\n\n// src/errors/gateway-response-error.ts\nvar name6 = \"GatewayResponseError\";\nvar marker7 = `vercel.ai.gateway.error.${name6}`;\nvar symbol7 = Symbol.for(marker7);\nvar _a7, _b7;\nvar GatewayResponseError = class extends (_b7 = GatewayError, _a7 = symbol7, _b7) {\n constructor({\n message = \"Invalid response from Gateway\",\n statusCode = 502,\n response,\n validationError,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a7] = true;\n // used in isInstance\n this.name = name6;\n this.type = \"response_error\";\n this.response = response;\n this.validationError = validationError;\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol7 in error;\n }\n};\n\n// src/errors/create-gateway-error.ts\n\nasync function createGatewayErrorFromResponse({\n response,\n statusCode,\n defaultMessage = \"Gateway request failed\",\n cause,\n authMethod\n}) {\n var _a9;\n const parseResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.safeValidateTypes)({\n value: response,\n schema: gatewayErrorResponseSchema\n });\n if (!parseResult.success) {\n const rawGenerationId = typeof response === \"object\" && response !== null && \"generationId\" in response ? response.generationId : void 0;\n return new GatewayResponseError({\n message: `Invalid error response format: ${defaultMessage}`,\n statusCode,\n response,\n validationError: parseResult.error,\n cause,\n generationId: rawGenerationId\n });\n }\n const validatedResponse = parseResult.value;\n const errorType = validatedResponse.error.type;\n const message = validatedResponse.error.message;\n const generationId = (_a9 = validatedResponse.generationId) != null ? _a9 : void 0;\n switch (errorType) {\n case \"authentication_error\":\n return GatewayAuthenticationError.createContextualError({\n apiKeyProvided: authMethod === \"api-key\",\n oidcTokenProvided: authMethod === \"oidc\",\n statusCode,\n cause,\n generationId\n });\n case \"invalid_request_error\":\n return new GatewayInvalidRequestError({\n message,\n statusCode,\n cause,\n generationId\n });\n case \"rate_limit_exceeded\":\n return new GatewayRateLimitError({\n message,\n statusCode,\n cause,\n generationId\n });\n case \"model_not_found\": {\n const modelResult = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.safeValidateTypes)({\n value: validatedResponse.error.param,\n schema: modelNotFoundParamSchema\n });\n return new GatewayModelNotFoundError({\n message,\n statusCode,\n modelId: modelResult.success ? modelResult.value.modelId : void 0,\n cause,\n generationId\n });\n }\n case \"internal_server_error\":\n return new GatewayInternalServerError({\n message,\n statusCode,\n cause,\n generationId\n });\n default:\n return new GatewayInternalServerError({\n message,\n statusCode,\n cause,\n generationId\n });\n }\n}\nvar gatewayErrorResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n error: zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n message: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().nullish(),\n param: zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown().nullish(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_1__.union([zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_1__.number()]).nullish()\n }),\n generationId: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().nullish()\n })\n )\n);\n\n// src/errors/gateway-timeout-error.ts\nvar name7 = \"GatewayTimeoutError\";\nvar marker8 = `vercel.ai.gateway.error.${name7}`;\nvar symbol8 = Symbol.for(marker8);\nvar _a8, _b8;\nvar GatewayTimeoutError = class _GatewayTimeoutError extends (_b8 = GatewayError, _a8 = symbol8, _b8) {\n constructor({\n message = \"Request timed out\",\n statusCode = 408,\n cause,\n generationId\n } = {}) {\n super({ message, statusCode, cause, generationId });\n this[_a8] = true;\n // used in isInstance\n this.name = name7;\n this.type = \"timeout_error\";\n }\n static isInstance(error) {\n return GatewayError.hasMarker(error) && symbol8 in error;\n }\n /**\n * Creates a helpful timeout error message with troubleshooting guidance\n */\n static createTimeoutError({\n originalMessage,\n statusCode = 408,\n cause,\n generationId\n }) {\n const message = `Gateway request timed out: ${originalMessage}\n\n This is a client-side timeout. To resolve this, increase your timeout configuration: https://vercel.com/docs/ai-gateway/capabilities/video-generation#extending-timeouts-for-node.js`;\n return new _GatewayTimeoutError({\n message,\n statusCode,\n cause,\n generationId\n });\n }\n};\n\n// src/errors/as-gateway-error.ts\nfunction isTimeoutError(error) {\n if (!(error instanceof Error)) {\n return false;\n }\n const errorCode = error.code;\n if (typeof errorCode === \"string\") {\n const undiciTimeoutCodes = [\n \"UND_ERR_HEADERS_TIMEOUT\",\n \"UND_ERR_BODY_TIMEOUT\",\n \"UND_ERR_CONNECT_TIMEOUT\"\n ];\n return undiciTimeoutCodes.includes(errorCode);\n }\n return false;\n}\nasync function asGatewayError(error, authMethod) {\n var _a9;\n if (GatewayError.isInstance(error)) {\n return error;\n }\n if (isTimeoutError(error)) {\n return GatewayTimeoutError.createTimeoutError({\n originalMessage: error instanceof Error ? error.message : \"Unknown error\",\n cause: error\n });\n }\n if (_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.APICallError.isInstance(error)) {\n if (error.cause && isTimeoutError(error.cause)) {\n return GatewayTimeoutError.createTimeoutError({\n originalMessage: error.message,\n cause: error\n });\n }\n return await createGatewayErrorFromResponse({\n response: extractApiCallResponse(error),\n statusCode: (_a9 = error.statusCode) != null ? _a9 : 500,\n defaultMessage: \"Gateway request failed\",\n cause: error,\n authMethod\n });\n }\n return await createGatewayErrorFromResponse({\n response: {},\n statusCode: 500,\n defaultMessage: error instanceof Error ? `Gateway request failed: ${error.message}` : \"Unknown Gateway error\",\n cause: error,\n authMethod\n });\n}\n\n// src/errors/extract-api-call-response.ts\nfunction extractApiCallResponse(error) {\n if (error.data !== void 0) {\n return error.data;\n }\n if (error.responseBody != null) {\n try {\n return JSON.parse(error.responseBody);\n } catch (e) {\n return error.responseBody;\n }\n }\n return {};\n}\n\n// src/errors/parse-auth-method.ts\n\n\nvar GATEWAY_AUTH_METHOD_HEADER = \"ai-gateway-auth-method\";\nasync function parseAuthMethod(headers) {\n const result = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.safeValidateTypes)({\n value: headers[GATEWAY_AUTH_METHOD_HEADER],\n schema: gatewayAuthMethodSchema\n });\n return result.success ? result.value : void 0;\n}\nvar gatewayAuthMethodSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_1__.union([zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"api-key\"), zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"oidc\")]))\n);\n\n// src/gateway-fetch-metadata.ts\n\n\nvar GatewayFetchMetadata = class {\n constructor(config) {\n this.config = config;\n }\n async getAvailableModels() {\n try {\n const { value } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.getFromApi)({\n url: `${this.config.baseURL}/config`,\n headers: await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers()),\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(\n gatewayAvailableModelsResponseSchema\n ),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n fetch: this.config.fetch\n });\n return value;\n } catch (error) {\n throw await asGatewayError(error);\n }\n }\n async getCredits() {\n try {\n const baseUrl = new URL(this.config.baseURL);\n const { value } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.getFromApi)({\n url: `${baseUrl.origin}/v1/credits`,\n headers: await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers()),\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(\n gatewayCreditsResponseSchema\n ),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n fetch: this.config.fetch\n });\n return value;\n } catch (error) {\n throw await asGatewayError(error);\n }\n }\n};\nvar gatewayAvailableModelsResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n models: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().nullish(),\n pricing: zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n input: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n input_cache_read: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().nullish(),\n input_cache_write: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().nullish()\n }).transform(\n ({ input, output, input_cache_read, input_cache_write }) => ({\n input,\n output,\n ...input_cache_read ? { cachedInputTokens: input_cache_read } : {},\n ...input_cache_write ? { cacheCreationInputTokens: input_cache_write } : {}\n })\n ).nullish(),\n specification: zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n specificationVersion: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"v3\"),\n provider: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n modelId: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n }),\n modelType: zod_v4__WEBPACK_IMPORTED_MODULE_1__[\"enum\"]([\"embedding\", \"image\", \"language\", \"video\"]).nullish()\n })\n )\n })\n )\n);\nvar gatewayCreditsResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n balance: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n total_used: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n }).transform(({ balance, total_used }) => ({\n balance,\n totalUsed: total_used\n }))\n )\n);\n\n// src/gateway-spend-report.ts\n\n\nvar GatewaySpendReport = class {\n constructor(config) {\n this.config = config;\n }\n async getSpendReport(params) {\n try {\n const baseUrl = new URL(this.config.baseURL);\n const searchParams = new URLSearchParams();\n searchParams.set(\"start_date\", params.startDate);\n searchParams.set(\"end_date\", params.endDate);\n if (params.groupBy) {\n searchParams.set(\"group_by\", params.groupBy);\n }\n if (params.datePart) {\n searchParams.set(\"date_part\", params.datePart);\n }\n if (params.userId) {\n searchParams.set(\"user_id\", params.userId);\n }\n if (params.model) {\n searchParams.set(\"model\", params.model);\n }\n if (params.provider) {\n searchParams.set(\"provider\", params.provider);\n }\n if (params.credentialType) {\n searchParams.set(\"credential_type\", params.credentialType);\n }\n if (params.tags && params.tags.length > 0) {\n searchParams.set(\"tags\", params.tags.join(\",\"));\n }\n const { value } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.getFromApi)({\n url: `${baseUrl.origin}/v1/report?${searchParams.toString()}`,\n headers: await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers()),\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(\n gatewaySpendReportResponseSchema\n ),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n fetch: this.config.fetch\n });\n return value;\n } catch (error) {\n throw await asGatewayError(error);\n }\n }\n};\nvar gatewaySpendReportResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n results: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n day: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional(),\n hour: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional(),\n user: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional(),\n tag: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional(),\n provider: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional(),\n credential_type: zod_v4__WEBPACK_IMPORTED_MODULE_1__[\"enum\"]([\"byok\", \"system\"]).optional(),\n total_cost: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n market_cost: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional(),\n input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional(),\n output_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional(),\n cached_input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional(),\n cache_creation_input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional(),\n reasoning_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional(),\n request_count: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().optional()\n }).transform(\n ({\n credential_type,\n total_cost,\n market_cost,\n input_tokens,\n output_tokens,\n cached_input_tokens,\n cache_creation_input_tokens,\n reasoning_tokens,\n request_count,\n ...rest\n }) => ({\n ...rest,\n ...credential_type !== void 0 ? { credentialType: credential_type } : {},\n totalCost: total_cost,\n ...market_cost !== void 0 ? { marketCost: market_cost } : {},\n ...input_tokens !== void 0 ? { inputTokens: input_tokens } : {},\n ...output_tokens !== void 0 ? { outputTokens: output_tokens } : {},\n ...cached_input_tokens !== void 0 ? { cachedInputTokens: cached_input_tokens } : {},\n ...cache_creation_input_tokens !== void 0 ? { cacheCreationInputTokens: cache_creation_input_tokens } : {},\n ...reasoning_tokens !== void 0 ? { reasoningTokens: reasoning_tokens } : {},\n ...request_count !== void 0 ? { requestCount: request_count } : {}\n })\n )\n )\n })\n )\n);\n\n// src/gateway-generation-info.ts\n\n\nvar GatewayGenerationInfoFetcher = class {\n constructor(config) {\n this.config = config;\n }\n async getGenerationInfo(params) {\n try {\n const baseUrl = new URL(this.config.baseURL);\n const { value } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.getFromApi)({\n url: `${baseUrl.origin}/v1/generation?id=${encodeURIComponent(params.id)}`,\n headers: await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers()),\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(\n gatewayGenerationInfoResponseSchema\n ),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n fetch: this.config.fetch\n });\n return value;\n } catch (error) {\n throw await asGatewayError(error);\n }\n }\n};\nvar gatewayGenerationInfoResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n data: zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n total_cost: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n upstream_inference_cost: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n created_at: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n is_byok: zod_v4__WEBPACK_IMPORTED_MODULE_1__.boolean(),\n provider_name: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n streamed: zod_v4__WEBPACK_IMPORTED_MODULE_1__.boolean(),\n finish_reason: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n latency: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n generation_time: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n native_tokens_prompt: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n native_tokens_completion: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n native_tokens_reasoning: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n native_tokens_cached: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n native_tokens_cache_creation: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n billable_web_search_calls: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number()\n }).transform(\n ({\n total_cost,\n upstream_inference_cost,\n created_at,\n is_byok,\n provider_name,\n finish_reason,\n generation_time,\n native_tokens_prompt,\n native_tokens_completion,\n native_tokens_reasoning,\n native_tokens_cached,\n native_tokens_cache_creation,\n billable_web_search_calls,\n ...rest\n }) => ({\n ...rest,\n totalCost: total_cost,\n upstreamInferenceCost: upstream_inference_cost,\n createdAt: created_at,\n isByok: is_byok,\n providerName: provider_name,\n finishReason: finish_reason,\n generationTime: generation_time,\n promptTokens: native_tokens_prompt,\n completionTokens: native_tokens_completion,\n reasoningTokens: native_tokens_reasoning,\n cachedTokens: native_tokens_cached,\n cacheCreationTokens: native_tokens_cache_creation,\n billableWebSearchCalls: billable_web_search_calls\n })\n )\n }).transform(({ data }) => data)\n )\n);\n\n// src/gateway-language-model.ts\n\n\nvar GatewayLanguageModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n this.supportedUrls = { \"*/*\": [/.*/] };\n }\n get provider() {\n return this.config.provider;\n }\n async getArgs(options) {\n const { abortSignal: _abortSignal, ...optionsWithoutSignal } = options;\n return {\n args: this.maybeEncodeFileParts(optionsWithoutSignal),\n warnings: []\n };\n }\n async doGenerate(options) {\n const { args, warnings } = await this.getArgs(options);\n const { abortSignal } = options;\n const resolvedHeaders = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers());\n try {\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.postJsonToApi)({\n url: this.getUrl(),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.combineHeaders)(\n resolvedHeaders,\n options.headers,\n this.getModelConfigHeaders(this.modelId, false),\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.o11yHeaders)\n ),\n body: args,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(zod_v4__WEBPACK_IMPORTED_MODULE_1__.any()),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n ...abortSignal && { abortSignal },\n fetch: this.config.fetch\n });\n return {\n ...responseBody,\n request: { body: args },\n response: { headers: responseHeaders, body: rawResponse },\n warnings\n };\n } catch (error) {\n throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));\n }\n }\n async doStream(options) {\n const { args, warnings } = await this.getArgs(options);\n const { abortSignal } = options;\n const resolvedHeaders = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers());\n try {\n const { value: response, responseHeaders } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.postJsonToApi)({\n url: this.getUrl(),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.combineHeaders)(\n resolvedHeaders,\n options.headers,\n this.getModelConfigHeaders(this.modelId, true),\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.o11yHeaders)\n ),\n body: args,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createEventSourceResponseHandler)(zod_v4__WEBPACK_IMPORTED_MODULE_1__.any()),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n ...abortSignal && { abortSignal },\n fetch: this.config.fetch\n });\n return {\n stream: response.pipeThrough(\n new TransformStream({\n start(controller) {\n if (warnings.length > 0) {\n controller.enqueue({ type: \"stream-start\", warnings });\n }\n },\n transform(chunk, controller) {\n if (chunk.success) {\n const streamPart = chunk.value;\n if (streamPart.type === \"raw\" && !options.includeRawChunks) {\n return;\n }\n if (streamPart.type === \"response-metadata\" && streamPart.timestamp && typeof streamPart.timestamp === \"string\") {\n streamPart.timestamp = new Date(streamPart.timestamp);\n }\n controller.enqueue(streamPart);\n } else {\n controller.error(\n chunk.error\n );\n }\n }\n })\n ),\n request: { body: args },\n response: { headers: responseHeaders }\n };\n } catch (error) {\n throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));\n }\n }\n isFilePart(part) {\n return part && typeof part === \"object\" && \"type\" in part && part.type === \"file\";\n }\n /**\n * Encodes file parts in the prompt to base64. Mutates the passed options\n * instance directly to avoid copying the file data.\n * @param options - The options to encode.\n * @returns The options with the file parts encoded.\n */\n maybeEncodeFileParts(options) {\n for (const message of options.prompt) {\n for (const part of message.content) {\n if (this.isFilePart(part)) {\n const filePart = part;\n if (filePart.data instanceof Uint8Array) {\n const buffer = Uint8Array.from(filePart.data);\n const base64Data = Buffer.from(buffer).toString(\"base64\");\n filePart.data = new URL(\n `data:${filePart.mediaType || \"application/octet-stream\"};base64,${base64Data}`\n );\n }\n }\n }\n }\n return options;\n }\n getUrl() {\n return `${this.config.baseURL}/language-model`;\n }\n getModelConfigHeaders(modelId, streaming) {\n return {\n \"ai-language-model-specification-version\": \"3\",\n \"ai-language-model-id\": modelId,\n \"ai-language-model-streaming\": String(streaming)\n };\n }\n};\n\n// src/gateway-embedding-model.ts\n\n\nvar GatewayEmbeddingModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n this.maxEmbeddingsPerCall = 2048;\n this.supportsParallelCalls = true;\n }\n get provider() {\n return this.config.provider;\n }\n async doEmbed({\n values,\n headers,\n abortSignal,\n providerOptions\n }) {\n var _a9;\n const resolvedHeaders = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers());\n try {\n const {\n responseHeaders,\n value: responseBody,\n rawValue\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.postJsonToApi)({\n url: this.getUrl(),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.combineHeaders)(\n resolvedHeaders,\n headers != null ? headers : {},\n this.getModelConfigHeaders(),\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.o11yHeaders)\n ),\n body: {\n values,\n ...providerOptions ? { providerOptions } : {}\n },\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(\n gatewayEmbeddingResponseSchema\n ),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n ...abortSignal && { abortSignal },\n fetch: this.config.fetch\n });\n return {\n embeddings: responseBody.embeddings,\n usage: (_a9 = responseBody.usage) != null ? _a9 : void 0,\n providerMetadata: responseBody.providerMetadata,\n response: { headers: responseHeaders, body: rawValue },\n warnings: []\n };\n } catch (error) {\n throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));\n }\n }\n getUrl() {\n return `${this.config.baseURL}/embedding-model`;\n }\n getModelConfigHeaders() {\n return {\n \"ai-embedding-model-specification-version\": \"3\",\n \"ai-model-id\": this.modelId\n };\n }\n};\nvar gatewayEmbeddingResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n embeddings: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(zod_v4__WEBPACK_IMPORTED_MODULE_1__.number())),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({ tokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number() }).nullish(),\n providerMetadata: zod_v4__WEBPACK_IMPORTED_MODULE_1__.record(zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_1__.record(zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown())).optional()\n })\n )\n);\n\n// src/gateway-image-model.ts\n\n\nvar GatewayImageModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n // Set a very large number to prevent client-side splitting of requests\n this.maxImagesPerCall = Number.MAX_SAFE_INTEGER;\n }\n get provider() {\n return this.config.provider;\n }\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n files,\n mask,\n providerOptions,\n headers,\n abortSignal\n }) {\n var _a9, _b9, _c, _d;\n const resolvedHeaders = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers());\n try {\n const {\n responseHeaders,\n value: responseBody,\n rawValue\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.postJsonToApi)({\n url: this.getUrl(),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.combineHeaders)(\n resolvedHeaders,\n headers != null ? headers : {},\n this.getModelConfigHeaders(),\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.o11yHeaders)\n ),\n body: {\n prompt,\n n,\n ...size && { size },\n ...aspectRatio && { aspectRatio },\n ...seed && { seed },\n ...providerOptions && { providerOptions },\n ...files && {\n files: files.map((file) => maybeEncodeImageFile(file))\n },\n ...mask && { mask: maybeEncodeImageFile(mask) }\n },\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonResponseHandler)(\n gatewayImageResponseSchema\n ),\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n ...abortSignal && { abortSignal },\n fetch: this.config.fetch\n });\n return {\n images: responseBody.images,\n // Always base64 strings from server\n warnings: (_a9 = responseBody.warnings) != null ? _a9 : [],\n providerMetadata: responseBody.providerMetadata,\n response: {\n timestamp: /* @__PURE__ */ new Date(),\n modelId: this.modelId,\n headers: responseHeaders\n },\n ...responseBody.usage != null && {\n usage: {\n inputTokens: (_b9 = responseBody.usage.inputTokens) != null ? _b9 : void 0,\n outputTokens: (_c = responseBody.usage.outputTokens) != null ? _c : void 0,\n totalTokens: (_d = responseBody.usage.totalTokens) != null ? _d : void 0\n }\n }\n };\n } catch (error) {\n throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));\n }\n }\n getUrl() {\n return `${this.config.baseURL}/image-model`;\n }\n getModelConfigHeaders() {\n return {\n \"ai-image-model-specification-version\": \"3\",\n \"ai-model-id\": this.modelId\n };\n }\n};\nfunction maybeEncodeImageFile(file) {\n if (file.type === \"file\" && file.data instanceof Uint8Array) {\n return {\n ...file,\n data: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.convertUint8ArrayToBase64)(file.data)\n };\n }\n return file;\n}\nvar providerMetadataEntrySchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n images: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown()).optional()\n}).catchall(zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown());\nvar gatewayImageWarningSchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"unsupported\"),\n feature: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n details: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"compatibility\"),\n feature: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n details: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"other\"),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n })\n]);\nvar gatewayImageUsageSchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n inputTokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().nullish(),\n outputTokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().nullish(),\n totalTokens: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number().nullish()\n});\nvar gatewayImageResponseSchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n images: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()),\n // Always base64 strings over the wire\n warnings: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(gatewayImageWarningSchema).optional(),\n providerMetadata: zod_v4__WEBPACK_IMPORTED_MODULE_1__.record(zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(), providerMetadataEntrySchema).optional(),\n usage: gatewayImageUsageSchema.optional()\n});\n\n// src/gateway-video-model.ts\n\n\n\nvar GatewayVideoModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n // Set a very large number to prevent client-side splitting of requests\n this.maxVideosPerCall = Number.MAX_SAFE_INTEGER;\n }\n get provider() {\n return this.config.provider;\n }\n async doGenerate({\n prompt,\n n,\n aspectRatio,\n resolution,\n duration,\n fps,\n seed,\n image,\n providerOptions,\n headers,\n abortSignal\n }) {\n var _a9;\n const resolvedHeaders = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.headers());\n try {\n const { responseHeaders, value: responseBody } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.postJsonToApi)({\n url: this.getUrl(),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.combineHeaders)(\n resolvedHeaders,\n headers != null ? headers : {},\n this.getModelConfigHeaders(),\n await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.resolve)(this.config.o11yHeaders),\n { accept: \"text/event-stream\" }\n ),\n body: {\n prompt,\n n,\n ...aspectRatio && { aspectRatio },\n ...resolution && { resolution },\n ...duration && { duration },\n ...fps && { fps },\n ...seed && { seed },\n ...providerOptions && { providerOptions },\n ...image && { image: maybeEncodeVideoFile(image) }\n },\n successfulResponseHandler: async ({\n response,\n url,\n requestBodyValues\n }) => {\n if (response.body == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.APICallError({\n message: \"SSE response body is empty\",\n url,\n requestBodyValues,\n statusCode: response.status\n });\n }\n const eventStream = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.parseJsonEventStream)({\n stream: response.body,\n schema: gatewayVideoEventSchema\n });\n const reader = eventStream.getReader();\n const { done, value: parseResult } = await reader.read();\n reader.releaseLock();\n if (done || !parseResult) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.APICallError({\n message: \"SSE stream ended without a data event\",\n url,\n requestBodyValues,\n statusCode: response.status\n });\n }\n if (!parseResult.success) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.APICallError({\n message: \"Failed to parse video SSE event\",\n cause: parseResult.error,\n url,\n requestBodyValues,\n statusCode: response.status\n });\n }\n const event = parseResult.value;\n if (event.type === \"error\") {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.APICallError({\n message: event.message,\n statusCode: event.statusCode,\n url,\n requestBodyValues,\n responseHeaders: Object.fromEntries([...response.headers]),\n responseBody: JSON.stringify(event),\n data: {\n error: {\n message: event.message,\n type: event.errorType,\n param: event.param\n }\n }\n });\n }\n return {\n value: {\n videos: event.videos,\n warnings: event.warnings,\n providerMetadata: event.providerMetadata\n },\n responseHeaders: Object.fromEntries([...response.headers])\n };\n },\n failedResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createJsonErrorResponseHandler)({\n errorSchema: zod_v4__WEBPACK_IMPORTED_MODULE_1__.any(),\n errorToMessage: (data) => data\n }),\n ...abortSignal && { abortSignal },\n fetch: this.config.fetch\n });\n return {\n videos: responseBody.videos,\n warnings: (_a9 = responseBody.warnings) != null ? _a9 : [],\n providerMetadata: responseBody.providerMetadata,\n response: {\n timestamp: /* @__PURE__ */ new Date(),\n modelId: this.modelId,\n headers: responseHeaders\n }\n };\n } catch (error) {\n throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));\n }\n }\n getUrl() {\n return `${this.config.baseURL}/video-model`;\n }\n getModelConfigHeaders() {\n return {\n \"ai-video-model-specification-version\": \"3\",\n \"ai-model-id\": this.modelId\n };\n }\n};\nfunction maybeEncodeVideoFile(file) {\n if (file.type === \"file\" && file.data instanceof Uint8Array) {\n return {\n ...file,\n data: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.convertUint8ArrayToBase64)(file.data)\n };\n }\n return file;\n}\nvar providerMetadataEntrySchema2 = zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n videos: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown()).optional()\n}).catchall(zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown());\nvar gatewayVideoDataSchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"url\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"base64\"),\n data: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n })\n]);\nvar gatewayVideoWarningSchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"unsupported\"),\n feature: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n details: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"compatibility\"),\n feature: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n details: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"other\"),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string()\n })\n]);\nvar gatewayVideoEventSchema = zod_v4__WEBPACK_IMPORTED_MODULE_1__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"result\"),\n videos: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(gatewayVideoDataSchema),\n warnings: zod_v4__WEBPACK_IMPORTED_MODULE_1__.array(gatewayVideoWarningSchema).optional(),\n providerMetadata: zod_v4__WEBPACK_IMPORTED_MODULE_1__.record(zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(), providerMetadataEntrySchema2).optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_1__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_1__.literal(\"error\"),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n errorType: zod_v4__WEBPACK_IMPORTED_MODULE_1__.string(),\n statusCode: zod_v4__WEBPACK_IMPORTED_MODULE_1__.number(),\n param: zod_v4__WEBPACK_IMPORTED_MODULE_1__.unknown().nullable()\n })\n]);\n\n// src/tool/parallel-search.ts\n\n\nvar parallelSearchInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n objective: zod__WEBPACK_IMPORTED_MODULE_3__.string().describe(\n \"Natural-language description of the web research goal, including source or freshness guidance and broader context from the task. Maximum 5000 characters.\"\n ),\n search_queries: zod__WEBPACK_IMPORTED_MODULE_3__.array(zod__WEBPACK_IMPORTED_MODULE_3__.string()).optional().describe(\n \"Optional search queries to supplement the objective. Maximum 200 characters per query.\"\n ),\n mode: zod__WEBPACK_IMPORTED_MODULE_3__[\"enum\"]([\"one-shot\", \"agentic\"]).optional().describe(\n 'Mode preset: \"one-shot\" for comprehensive results with longer excerpts (default), \"agentic\" for concise, token-efficient results for multi-step workflows.'\n ),\n max_results: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\n \"Maximum number of results to return (1-20). Defaults to 10 if not specified.\"\n ),\n source_policy: zod__WEBPACK_IMPORTED_MODULE_3__.object({\n include_domains: zod__WEBPACK_IMPORTED_MODULE_3__.array(zod__WEBPACK_IMPORTED_MODULE_3__.string()).optional().describe(\"List of domains to include in search results.\"),\n exclude_domains: zod__WEBPACK_IMPORTED_MODULE_3__.array(zod__WEBPACK_IMPORTED_MODULE_3__.string()).optional().describe(\"List of domains to exclude from search results.\"),\n after_date: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional().describe(\n \"Only include results published after this date (ISO 8601 format).\"\n )\n }).optional().describe(\n \"Source policy for controlling which domains to include/exclude and freshness.\"\n ),\n excerpts: zod__WEBPACK_IMPORTED_MODULE_3__.object({\n max_chars_per_result: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\"Maximum characters per result.\"),\n max_chars_total: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\"Maximum total characters across all results.\")\n }).optional().describe(\"Excerpt configuration for controlling result length.\"),\n fetch_policy: zod__WEBPACK_IMPORTED_MODULE_3__.object({\n max_age_seconds: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\n \"Maximum age in seconds for cached content. Set to 0 to always fetch fresh content.\"\n )\n }).optional().describe(\"Fetch policy for controlling content freshness.\")\n })\n )\n);\nvar parallelSearchOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod__WEBPACK_IMPORTED_MODULE_3__.union([\n // Success response\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n searchId: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n results: zod__WEBPACK_IMPORTED_MODULE_3__.array(\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n url: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n title: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n excerpt: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n publishDate: zod__WEBPACK_IMPORTED_MODULE_3__.string().nullable().optional(),\n relevanceScore: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional()\n })\n )\n }),\n // Error response\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n error: zod__WEBPACK_IMPORTED_MODULE_3__[\"enum\"]([\n \"api_error\",\n \"rate_limit\",\n \"timeout\",\n \"invalid_input\",\n \"configuration_error\",\n \"unknown\"\n ]),\n statusCode: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional(),\n message: zod__WEBPACK_IMPORTED_MODULE_3__.string()\n })\n ])\n )\n);\nvar parallelSearchToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createProviderToolFactoryWithOutputSchema)({\n id: \"gateway.parallel_search\",\n inputSchema: parallelSearchInputSchema,\n outputSchema: parallelSearchOutputSchema\n});\nvar parallelSearch = (config = {}) => parallelSearchToolFactory(config);\n\n// src/tool/perplexity-search.ts\n\n\nvar perplexitySearchInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n query: zod__WEBPACK_IMPORTED_MODULE_3__.union([zod__WEBPACK_IMPORTED_MODULE_3__.string(), zod__WEBPACK_IMPORTED_MODULE_3__.array(zod__WEBPACK_IMPORTED_MODULE_3__.string())]).describe(\n \"Search query (string) or multiple queries (array of up to 5 strings). Multi-query searches return combined results from all queries.\"\n ),\n max_results: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\n \"Maximum number of search results to return (1-20, default: 10)\"\n ),\n max_tokens_per_page: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\n \"Maximum number of tokens to extract per search result page (256-2048, default: 2048)\"\n ),\n max_tokens: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional().describe(\n \"Maximum total tokens across all search results (default: 25000, max: 1000000)\"\n ),\n country: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional().describe(\n \"Two-letter ISO 3166-1 alpha-2 country code for regional search results (e.g., 'US', 'GB', 'FR')\"\n ),\n search_domain_filter: zod__WEBPACK_IMPORTED_MODULE_3__.array(zod__WEBPACK_IMPORTED_MODULE_3__.string()).optional().describe(\n \"List of domains to include or exclude from search results (max 20). To include: ['nature.com', 'science.org']. To exclude: ['-example.com', '-spam.net']\"\n ),\n search_language_filter: zod__WEBPACK_IMPORTED_MODULE_3__.array(zod__WEBPACK_IMPORTED_MODULE_3__.string()).optional().describe(\n \"List of ISO 639-1 language codes to filter results (max 10, lowercase). Examples: ['en', 'fr', 'de']\"\n ),\n search_after_date: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional().describe(\n \"Include only results published after this date. Format: 'MM/DD/YYYY' (e.g., '3/1/2025'). Cannot be used with search_recency_filter.\"\n ),\n search_before_date: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional().describe(\n \"Include only results published before this date. Format: 'MM/DD/YYYY' (e.g., '3/15/2025'). Cannot be used with search_recency_filter.\"\n ),\n last_updated_after_filter: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional().describe(\n \"Include only results last updated after this date. Format: 'MM/DD/YYYY' (e.g., '3/1/2025'). Cannot be used with search_recency_filter.\"\n ),\n last_updated_before_filter: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional().describe(\n \"Include only results last updated before this date. Format: 'MM/DD/YYYY' (e.g., '3/15/2025'). Cannot be used with search_recency_filter.\"\n ),\n search_recency_filter: zod__WEBPACK_IMPORTED_MODULE_3__[\"enum\"]([\"day\", \"week\", \"month\", \"year\"]).optional().describe(\n \"Filter results by relative time period. Cannot be used with search_after_date or search_before_date.\"\n )\n })\n )\n);\nvar perplexitySearchOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.zodSchema)(\n zod__WEBPACK_IMPORTED_MODULE_3__.union([\n // Success response\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n results: zod__WEBPACK_IMPORTED_MODULE_3__.array(\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n title: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n url: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n snippet: zod__WEBPACK_IMPORTED_MODULE_3__.string(),\n date: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional(),\n lastUpdated: zod__WEBPACK_IMPORTED_MODULE_3__.string().optional()\n })\n ),\n id: zod__WEBPACK_IMPORTED_MODULE_3__.string()\n }),\n // Error response\n zod__WEBPACK_IMPORTED_MODULE_3__.object({\n error: zod__WEBPACK_IMPORTED_MODULE_3__[\"enum\"]([\n \"api_error\",\n \"rate_limit\",\n \"timeout\",\n \"invalid_input\",\n \"unknown\"\n ]),\n statusCode: zod__WEBPACK_IMPORTED_MODULE_3__.number().optional(),\n message: zod__WEBPACK_IMPORTED_MODULE_3__.string()\n })\n ])\n )\n);\nvar perplexitySearchToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.createProviderToolFactoryWithOutputSchema)({\n id: \"gateway.perplexity_search\",\n inputSchema: perplexitySearchInputSchema,\n outputSchema: perplexitySearchOutputSchema\n});\nvar perplexitySearch = (config = {}) => perplexitySearchToolFactory(config);\n\n// src/gateway-tools.ts\nvar gatewayTools = {\n /**\n * Search the web using Parallel AI's Search API for LLM-optimized excerpts.\n *\n * Takes a natural language objective and returns relevant excerpts,\n * replacing multiple keyword searches with a single call for broad\n * or complex queries. Supports different search types for depth vs\n * breadth tradeoffs.\n */\n parallelSearch,\n /**\n * Search the web using Perplexity's Search API for real-time information,\n * news, research papers, and articles.\n *\n * Provides ranked search results with advanced filtering options including\n * domain, language, date range, and recency filters.\n */\n perplexitySearch\n};\n\n// src/vercel-environment.ts\n\n\nasync function getVercelRequestId() {\n var _a9;\n return (_a9 = (0,_vercel_oidc__WEBPACK_IMPORTED_MODULE_4__.getContext)().headers) == null ? void 0 : _a9[\"x-vercel-id\"];\n}\n\n// src/gateway-provider.ts\n\n\n// src/version.ts\nvar VERSION = true ? \"3.0.84\" : 0;\n\n// src/gateway-provider.ts\nvar AI_GATEWAY_PROTOCOL_VERSION = \"0.0.1\";\nfunction createGatewayProvider(options = {}) {\n var _a9, _b9;\n let pendingMetadata = null;\n let metadataCache = null;\n const cacheRefreshMillis = (_a9 = options.metadataCacheRefreshMillis) != null ? _a9 : 1e3 * 60 * 5;\n let lastFetchTime = 0;\n const baseURL = (_b9 = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.withoutTrailingSlash)(options.baseURL)) != null ? _b9 : \"https://ai-gateway.vercel.sh/v3/ai\";\n const getHeaders = async () => {\n try {\n const auth = await getGatewayAuthToken(options);\n return (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.withUserAgentSuffix)(\n {\n Authorization: `Bearer ${auth.token}`,\n \"ai-gateway-protocol-version\": AI_GATEWAY_PROTOCOL_VERSION,\n [GATEWAY_AUTH_METHOD_HEADER]: auth.authMethod,\n ...options.headers\n },\n `ai-sdk/gateway/${VERSION}`\n );\n } catch (error) {\n throw GatewayAuthenticationError.createContextualError({\n apiKeyProvided: false,\n oidcTokenProvided: false,\n statusCode: 401,\n cause: error\n });\n }\n };\n const createO11yHeaders = () => {\n const deploymentId = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.loadOptionalSetting)({\n settingValue: void 0,\n environmentVariableName: \"VERCEL_DEPLOYMENT_ID\"\n });\n const environment = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.loadOptionalSetting)({\n settingValue: void 0,\n environmentVariableName: \"VERCEL_ENV\"\n });\n const region = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.loadOptionalSetting)({\n settingValue: void 0,\n environmentVariableName: \"VERCEL_REGION\"\n });\n const projectId = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.loadOptionalSetting)({\n settingValue: void 0,\n environmentVariableName: \"VERCEL_PROJECT_ID\"\n });\n return async () => {\n const requestId = await getVercelRequestId();\n return {\n ...deploymentId && { \"ai-o11y-deployment-id\": deploymentId },\n ...environment && { \"ai-o11y-environment\": environment },\n ...region && { \"ai-o11y-region\": region },\n ...requestId && { \"ai-o11y-request-id\": requestId },\n ...projectId && { \"ai-o11y-project-id\": projectId }\n };\n };\n };\n const createLanguageModel = (modelId) => {\n return new GatewayLanguageModel(modelId, {\n provider: \"gateway\",\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n o11yHeaders: createO11yHeaders()\n });\n };\n const getAvailableModels = async () => {\n var _a10, _b10, _c;\n const now = (_c = (_b10 = (_a10 = options._internal) == null ? void 0 : _a10.currentDate) == null ? void 0 : _b10.call(_a10).getTime()) != null ? _c : Date.now();\n if (!pendingMetadata || now - lastFetchTime > cacheRefreshMillis) {\n lastFetchTime = now;\n pendingMetadata = new GatewayFetchMetadata({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch\n }).getAvailableModels().then((metadata) => {\n metadataCache = metadata;\n return metadata;\n }).catch(async (error) => {\n throw await asGatewayError(\n error,\n await parseAuthMethod(await getHeaders())\n );\n });\n }\n return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;\n };\n const getCredits = async () => {\n return new GatewayFetchMetadata({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch\n }).getCredits().catch(async (error) => {\n throw await asGatewayError(\n error,\n await parseAuthMethod(await getHeaders())\n );\n });\n };\n const getSpendReport = async (params) => {\n return new GatewaySpendReport({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch\n }).getSpendReport(params).catch(async (error) => {\n throw await asGatewayError(\n error,\n await parseAuthMethod(await getHeaders())\n );\n });\n };\n const getGenerationInfo = async (params) => {\n return new GatewayGenerationInfoFetcher({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch\n }).getGenerationInfo(params).catch(async (error) => {\n throw await asGatewayError(\n error,\n await parseAuthMethod(await getHeaders())\n );\n });\n };\n const provider = function(modelId) {\n if (new.target) {\n throw new Error(\n \"The Gateway Provider model function cannot be called with the new keyword.\"\n );\n }\n return createLanguageModel(modelId);\n };\n provider.specificationVersion = \"v3\";\n provider.getAvailableModels = getAvailableModels;\n provider.getCredits = getCredits;\n provider.getSpendReport = getSpendReport;\n provider.getGenerationInfo = getGenerationInfo;\n provider.imageModel = (modelId) => {\n return new GatewayImageModel(modelId, {\n provider: \"gateway\",\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n o11yHeaders: createO11yHeaders()\n });\n };\n provider.languageModel = createLanguageModel;\n const createEmbeddingModel = (modelId) => {\n return new GatewayEmbeddingModel(modelId, {\n provider: \"gateway\",\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n o11yHeaders: createO11yHeaders()\n });\n };\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.videoModel = (modelId) => {\n return new GatewayVideoModel(modelId, {\n provider: \"gateway\",\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n o11yHeaders: createO11yHeaders()\n });\n };\n provider.chat = provider.languageModel;\n provider.embedding = provider.embeddingModel;\n provider.image = provider.imageModel;\n provider.video = provider.videoModel;\n provider.tools = gatewayTools;\n return provider;\n}\nvar gateway = createGatewayProvider();\nasync function getGatewayAuthToken(options) {\n const apiKey = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_0__.loadOptionalSetting)({\n settingValue: options.apiKey,\n environmentVariableName: \"AI_GATEWAY_API_KEY\"\n });\n if (apiKey) {\n return {\n token: apiKey,\n authMethod: \"api-key\"\n };\n }\n const oidcToken = await (0,_vercel_oidc__WEBPACK_IMPORTED_MODULE_4__.getVercelOidcToken)();\n return {\n token: oidcToken,\n authMethod: \"oidc\"\n };\n}\n\n//# sourceMappingURL=index.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvLnBucG0vQGFpLXNkaytnYXRld2F5QDMuMC44NF96b2RAMy4yNS43Ni9ub2RlX21vZHVsZXMvQGFpLXNkay9nYXRld2F5L2Rpc3QvaW5kZXgubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBSWdDOztBQUVoQztBQUNnRDs7QUFFaEQ7QUFDaUM7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILDRCQUE0QixTQUFTLEdBQUcsYUFBYTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDLEtBQUs7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSLFlBQVksMENBQTBDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxNQUFNO0FBQ047O0FBRUE7O0FBRUE7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDLE1BQU07QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSLFlBQVksMENBQTBDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsMkVBQW1CO0FBQ3BDO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGdFQUFrQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWUU7QUFDRiIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9AYWktc2RrK2dhdGV3YXlAMy4wLjg0X3pvZEAzLjI1Ljc2L25vZGVfbW9kdWxlcy9AYWktc2RrL2dhdGV3YXkvZGlzdC9pbmRleC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc3JjL2dhdGV3YXktcHJvdmlkZXIudHNcbmltcG9ydCB7XG4gIGxvYWRPcHRpb25hbFNldHRpbmcsXG4gIHdpdGhvdXRUcmFpbGluZ1NsYXNoXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5cbi8vIHNyYy9lcnJvcnMvYXMtZ2F0ZXdheS1lcnJvci50c1xuaW1wb3J0IHsgQVBJQ2FsbEVycm9yIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcblxuLy8gc3JjL2Vycm9ycy9jcmVhdGUtZ2F0ZXdheS1lcnJvci50c1xuaW1wb3J0IHsgeiBhcyB6MiB9IGZyb20gXCJ6b2QvdjRcIjtcblxuLy8gc3JjL2Vycm9ycy9nYXRld2F5LWVycm9yLnRzXG52YXIgbWFya2VyID0gXCJ2ZXJjZWwuYWkuZ2F0ZXdheS5lcnJvclwiO1xudmFyIHN5bWJvbCA9IFN5bWJvbC5mb3IobWFya2VyKTtcbnZhciBfYSwgX2I7XG52YXIgR2F0ZXdheUVycm9yID0gY2xhc3MgX0dhdGV3YXlFcnJvciBleHRlbmRzIChfYiA9IEVycm9yLCBfYSA9IHN5bWJvbCwgX2IpIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG1lc3NhZ2UsXG4gICAgc3RhdHVzQ29kZSA9IDUwMCxcbiAgICBjYXVzZSxcbiAgICBnZW5lcmF0aW9uSWRcbiAgfSkge1xuICAgIHN1cGVyKGdlbmVyYXRpb25JZCA/IGAke21lc3NhZ2V9IFske2dlbmVyYXRpb25JZH1dYCA6IG1lc3NhZ2UpO1xuICAgIHRoaXNbX2FdID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICAgIHRoaXMuY2F1c2UgPSBjYXVzZTtcbiAgICB0aGlzLmdlbmVyYXRpb25JZCA9IGdlbmVyYXRpb25JZDtcbiAgfVxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBlcnJvciBpcyBhIEdhdGV3YXkgRXJyb3IuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBlcnJvciBpcyBhIEdhdGV3YXkgRXJyb3IsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHN0YXRpYyBpc0luc3RhbmNlKGVycm9yKSB7XG4gICAgcmV0dXJuIF9HYXRld2F5RXJyb3IuaGFzTWFya2VyKGVycm9yKTtcbiAgfVxuICBzdGF0aWMgaGFzTWFya2VyKGVycm9yKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJiBlcnJvciAhPT0gbnVsbCAmJiBzeW1ib2wgaW4gZXJyb3IgJiYgZXJyb3Jbc3ltYm9sXSA9PT0gdHJ1ZTtcbiAgfVxufTtcblxuLy8gc3JjL2Vycm9ycy9nYXRld2F5LWF1dGhlbnRpY2F0aW9uLWVycm9yLnRzXG52YXIgbmFtZSA9IFwiR2F0ZXdheUF1dGhlbnRpY2F0aW9uRXJyb3JcIjtcbnZhciBtYXJrZXIyID0gYHZlcmNlbC5haS5nYXRld2F5LmVycm9yLiR7bmFtZX1gO1xudmFyIHN5bWJvbDIgPSBTeW1ib2wuZm9yKG1hcmtlcjIpO1xudmFyIF9hMiwgX2IyO1xudmFyIEdhdGV3YXlBdXRoZW50aWNhdGlvbkVycm9yID0gY2xhc3MgX0dhdGV3YXlBdXRoZW50aWNhdGlvbkVycm9yIGV4dGVuZHMgKF9iMiA9IEdhdGV3YXlFcnJvciwgX2EyID0gc3ltYm9sMiwgX2IyKSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBtZXNzYWdlID0gXCJBdXRoZW50aWNhdGlvbiBmYWlsZWRcIixcbiAgICBzdGF0dXNDb2RlID0gNDAxLFxuICAgIGNhdXNlLFxuICAgIGdlbmVyYXRpb25JZFxuICB9ID0ge30pIHtcbiAgICBzdXBlcih7IG1lc3NhZ2UsIHN0YXR1c0NvZGUsIGNhdXNlLCBnZW5lcmF0aW9uSWQgfSk7XG4gICAgdGhpc1tfYTJdID0gdHJ1ZTtcbiAgICAvLyB1c2VkIGluIGlzSW5zdGFuY2VcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudHlwZSA9IFwiYXV0aGVudGljYXRpb25fZXJyb3JcIjtcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBHYXRld2F5RXJyb3IuaGFzTWFya2VyKGVycm9yKSAmJiBzeW1ib2wyIGluIGVycm9yO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29udGV4dHVhbCBlcnJvciBtZXNzYWdlIHdoZW4gYXV0aGVudGljYXRpb24gZmFpbHNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVDb250ZXh0dWFsRXJyb3Ioe1xuICAgIGFwaUtleVByb3ZpZGVkLFxuICAgIG9pZGNUb2tlblByb3ZpZGVkLFxuICAgIG1lc3NhZ2UgPSBcIkF1dGhlbnRpY2F0aW9uIGZhaWxlZFwiLFxuICAgIHN0YXR1c0NvZGUgPSA0MDEsXG4gICAgY2F1c2UsXG4gICAgZ2VuZXJhdGlvbklkXG4gIH0pIHtcbiAgICBsZXQgY29udGV4dHVhbE1lc3NhZ2U7XG4gICAgaWYgKGFwaUtleVByb3ZpZGVkKSB7XG4gICAgICBjb250ZXh0dWFsTWVzc2FnZSA9IGBBSSBHYXRld2F5IGF1dGhlbnRpY2F0aW9uIGZhaWxlZDogSW52YWxpZCBBUEkga2V5LlxuXG5DcmVhdGUgYSBuZXcgQVBJIGtleTogaHR0cHM6Ly92ZXJjZWwuY29tL2Q/dG89JTJGJTVCdGVhbSU1RCUyRiU3RSUyRmFpJTJGYXBpLWtleXNcblxuUHJvdmlkZSB2aWEgJ2FwaUtleScgb3B0aW9uIG9yICdBSV9HQVRFV0FZX0FQSV9LRVknIGVudmlyb25tZW50IHZhcmlhYmxlLmA7XG4gICAgfSBlbHNlIGlmIChvaWRjVG9rZW5Qcm92aWRlZCkge1xuICAgICAgY29udGV4dHVhbE1lc3NhZ2UgPSBgQUkgR2F0ZXdheSBhdXRoZW50aWNhdGlvbiBmYWlsZWQ6IEludmFsaWQgT0lEQyB0b2tlbi5cblxuUnVuICducHggdmVyY2VsIGxpbmsnIHRvIGxpbmsgeW91ciBwcm9qZWN0LCB0aGVuICd2YyBlbnYgcHVsbCcgdG8gZmV0Y2ggdGhlIHRva2VuLlxuXG5BbHRlcm5hdGl2ZWx5LCB1c2UgYW4gQVBJIGtleTogaHR0cHM6Ly92ZXJjZWwuY29tL2Q/dG89JTJGJTVCdGVhbSU1RCUyRiU3RSUyRmFpJTJGYXBpLWtleXNgO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0dWFsTWVzc2FnZSA9IGBBSSBHYXRld2F5IGF1dGhlbnRpY2F0aW9uIGZhaWxlZDogTm8gYXV0aGVudGljYXRpb24gcHJvdmlkZWQuXG5cbk9wdGlvbiAxIC0gQVBJIGtleTpcbkNyZWF0ZSBhbiBBUEkga2V5OiBodHRwczovL3ZlcmNlbC5jb20vZD90bz0lMkYlNUJ0ZWFtJTVEJTJGJTdFJTJGYWklMkZhcGkta2V5c1xuUHJvdmlkZSB2aWEgJ2FwaUtleScgb3B0aW9uIG9yICdBSV9HQVRFV0FZX0FQSV9LRVknIGVudmlyb25tZW50IHZhcmlhYmxlLlxuXG5PcHRpb24gMiAtIE9JREMgdG9rZW46XG5SdW4gJ25weCB2ZXJjZWwgbGluaycgdG8gbGluayB5b3VyIHByb2plY3QsIHRoZW4gJ3ZjIGVudiBwdWxsJyB0byBmZXRjaCB0aGUgdG9rZW4uYDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBfR2F0ZXdheUF1dGhlbnRpY2F0aW9uRXJyb3Ioe1xuICAgICAgbWVzc2FnZTogY29udGV4dHVhbE1lc3NhZ2UsXG4gICAgICBzdGF0dXNDb2RlLFxuICAgICAgY2F1c2UsXG4gICAgICBnZW5lcmF0aW9uSWRcbiAgICB9KTtcbiAgfVxufTtcblxuLy8gc3JjL2Vycm9ycy9nYXRld2F5LWludmFsaWQtcmVxdWVzdC1lcnJvci50c1xudmFyIG5hbWUyID0gXCJHYXRld2F5SW52YWxpZFJlcXVlc3RFcnJvclwiO1xudmFyIG1hcmtlcjMgPSBgdmVyY2VsLmFpLmdhdGV3YXkuZXJyb3IuJHtuYW1lMn1gO1xudmFyIHN5bWJvbDMgPSBTeW1ib2wuZm9yKG1hcmtlcjMpO1xudmFyIF9hMywgX2IzO1xudmFyIEdhdGV3YXlJbnZhbGlkUmVxdWVzdEVycm9yID0gY2xhc3MgZXh0ZW5kcyAoX2IzID0gR2F0ZXdheUVycm9yLCBfYTMgPSBzeW1ib2wzLCBfYjMpIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG1lc3NhZ2UgPSBcIkludmFsaWQgcmVxdWVzdFwiLFxuICAgIHN0YXR1c0NvZGUgPSA0MDAsXG4gICAgY2F1c2UsXG4gICAgZ2VuZXJhdGlvbklkXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKHsgbWVzc2FnZSwgc3RhdHVzQ29kZSwgY2F1c2UsIGdlbmVyYXRpb25JZCB9KTtcbiAgICB0aGlzW19hM10gPSB0cnVlO1xuICAgIC8vIHVzZWQgaW4gaXNJbnN0YW5jZVxuICAgIHRoaXMubmFtZSA9IG5hbWUyO1xuICAgIHRoaXMudHlwZSA9IFwiaW52YWxpZF9yZXF1ZXN0X2Vycm9yXCI7XG4gIH1cbiAgc3RhdGljIGlzSW5zdGFuY2UoZXJyb3IpIHtcbiAgICByZXR1cm4gR2F0ZXdheUVycm9yLmhhc01hcmtlcihlcnJvcikgJiYgc3ltYm9sMyBpbiBlcnJvcjtcbiAgfVxufTtcblxuLy8gc3JjL2Vycm9ycy9nYXRld2F5LXJhdGUtbGltaXQtZXJyb3IudHNcbnZhciBuYW1lMyA9IFwiR2F0ZXdheVJhdGVMaW1pdEVycm9yXCI7XG52YXIgbWFya2VyNCA9IGB2ZXJjZWwuYWkuZ2F0ZXdheS5lcnJvci4ke25hbWUzfWA7XG52YXIgc3ltYm9sNCA9IFN5bWJvbC5mb3IobWFya2VyNCk7XG52YXIgX2E0LCBfYjQ7XG52YXIgR2F0ZXdheVJhdGVMaW1pdEVycm9yID0gY2xhc3MgZXh0ZW5kcyAoX2I0ID0gR2F0ZXdheUVycm9yLCBfYTQgPSBzeW1ib2w0LCBfYjQpIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG1lc3NhZ2UgPSBcIlJhdGUgbGltaXQgZXhjZWVkZWRcIixcbiAgICBzdGF0dXNDb2RlID0gNDI5LFxuICAgIGNhdXNlLFxuICAgIGdlbmVyYXRpb25JZFxuICB9ID0ge30pIHtcbiAgICBzdXBlcih7IG1lc3NhZ2UsIHN0YXR1c0NvZGUsIGNhdXNlLCBnZW5lcmF0aW9uSWQgfSk7XG4gICAgdGhpc1tfYTRdID0gdHJ1ZTtcbiAgICAvLyB1c2VkIGluIGlzSW5zdGFuY2VcbiAgICB0aGlzLm5hbWUgPSBuYW1lMztcbiAgICB0aGlzLnR5cGUgPSBcInJhdGVfbGltaXRfZXhjZWVkZWRcIjtcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBHYXRld2F5RXJyb3IuaGFzTWFya2VyKGVycm9yKSAmJiBzeW1ib2w0IGluIGVycm9yO1xuICB9XG59O1xuXG4vLyBzcmMvZXJyb3JzL2dhdGV3YXktbW9kZWwtbm90LWZvdW5kLWVycm9yLnRzXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZC92NFwiO1xuaW1wb3J0IHsgbGF6eVNjaGVtYSwgem9kU2NoZW1hIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbnZhciBuYW1lNCA9IFwiR2F0ZXdheU1vZGVsTm90Rm91bmRFcnJvclwiO1xudmFyIG1hcmtlcjUgPSBgdmVyY2VsLmFpLmdhdGV3YXkuZXJyb3IuJHtuYW1lNH1gO1xudmFyIHN5bWJvbDUgPSBTeW1ib2wuZm9yKG1hcmtlcjUpO1xudmFyIG1vZGVsTm90Rm91bmRQYXJhbVNjaGVtYSA9IGxhenlTY2hlbWEoXG4gICgpID0+IHpvZFNjaGVtYShcbiAgICB6Lm9iamVjdCh7XG4gICAgICBtb2RlbElkOiB6LnN0cmluZygpXG4gICAgfSlcbiAgKVxuKTtcbnZhciBfYTUsIF9iNTtcbnZhciBHYXRld2F5TW9kZWxOb3RGb3VuZEVycm9yID0gY2xhc3MgZXh0ZW5kcyAoX2I1ID0gR2F0ZXdheUVycm9yLCBfYTUgPSBzeW1ib2w1LCBfYjUpIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG1lc3NhZ2UgPSBcIk1vZGVsIG5vdCBmb3VuZFwiLFxuICAgIHN0YXR1c0NvZGUgPSA0MDQsXG4gICAgbW9kZWxJZCxcbiAgICBjYXVzZSxcbiAgICBnZW5lcmF0aW9uSWRcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyBtZXNzYWdlLCBzdGF0dXNDb2RlLCBjYXVzZSwgZ2VuZXJhdGlvbklkIH0pO1xuICAgIHRoaXNbX2E1XSA9IHRydWU7XG4gICAgLy8gdXNlZCBpbiBpc0luc3RhbmNlXG4gICAgdGhpcy5uYW1lID0gbmFtZTQ7XG4gICAgdGhpcy50eXBlID0gXCJtb2RlbF9ub3RfZm91bmRcIjtcbiAgICB0aGlzLm1vZGVsSWQgPSBtb2RlbElkO1xuICB9XG4gIHN0YXRpYyBpc0luc3RhbmNlKGVycm9yKSB7XG4gICAgcmV0dXJuIEdhdGV3YXlFcnJvci5oYXNNYXJrZXIoZXJyb3IpICYmIHN5bWJvbDUgaW4gZXJyb3I7XG4gIH1cbn07XG5cbi8vIHNyYy9lcnJvcnMvZ2F0ZXdheS1pbnRlcm5hbC1zZXJ2ZXItZXJyb3IudHNcbnZhciBuYW1lNSA9IFwiR2F0ZXdheUludGVybmFsU2VydmVyRXJyb3JcIjtcbnZhciBtYXJrZXI2ID0gYHZlcmNlbC5haS5nYXRld2F5LmVycm9yLiR7bmFtZTV9YDtcbnZhciBzeW1ib2w2ID0gU3ltYm9sLmZvcihtYXJrZXI2KTtcbnZhciBfYTYsIF9iNjtcbnZhciBHYXRld2F5SW50ZXJuYWxTZXJ2ZXJFcnJvciA9IGNsYXNzIGV4dGVuZHMgKF9iNiA9IEdhdGV3YXlFcnJvciwgX2E2ID0gc3ltYm9sNiwgX2I2KSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBtZXNzYWdlID0gXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIixcbiAgICBzdGF0dXNDb2RlID0gNTAwLFxuICAgIGNhdXNlLFxuICAgIGdlbmVyYXRpb25JZFxuICB9ID0ge30pIHtcbiAgICBzdXBlcih7IG1lc3NhZ2UsIHN0YXR1c0NvZGUsIGNhdXNlLCBnZW5lcmF0aW9uSWQgfSk7XG4gICAgdGhpc1tfYTZdID0gdHJ1ZTtcbiAgICAvLyB1c2VkIGluIGlzSW5zdGFuY2VcbiAgICB0aGlzLm5hbWUgPSBuYW1lNTtcbiAgICB0aGlzLnR5cGUgPSBcImludGVybmFsX3NlcnZlcl9lcnJvclwiO1xuICB9XG4gIHN0YXRpYyBpc0luc3RhbmNlKGVycm9yKSB7XG4gICAgcmV0dXJuIEdhdGV3YXlFcnJvci5oYXNNYXJrZXIoZXJyb3IpICYmIHN5bWJvbDYgaW4gZXJyb3I7XG4gIH1cbn07XG5cbi8vIHNyYy9lcnJvcnMvZ2F0ZXdheS1yZXNwb25zZS1lcnJvci50c1xudmFyIG5hbWU2ID0gXCJHYXRld2F5UmVzcG9uc2VFcnJvclwiO1xudmFyIG1hcmtlcjcgPSBgdmVyY2VsLmFpLmdhdGV3YXkuZXJyb3IuJHtuYW1lNn1gO1xudmFyIHN5bWJvbDcgPSBTeW1ib2wuZm9yKG1hcmtlcjcpO1xudmFyIF9hNywgX2I3O1xudmFyIEdhdGV3YXlSZXNwb25zZUVycm9yID0gY2xhc3MgZXh0ZW5kcyAoX2I3ID0gR2F0ZXdheUVycm9yLCBfYTcgPSBzeW1ib2w3LCBfYjcpIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG1lc3NhZ2UgPSBcIkludmFsaWQgcmVzcG9uc2UgZnJvbSBHYXRld2F5XCIsXG4gICAgc3RhdHVzQ29kZSA9IDUwMixcbiAgICByZXNwb25zZSxcbiAgICB2YWxpZGF0aW9uRXJyb3IsXG4gICAgY2F1c2UsXG4gICAgZ2VuZXJhdGlvbklkXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKHsgbWVzc2FnZSwgc3RhdHVzQ29kZSwgY2F1c2UsIGdlbmVyYXRpb25JZCB9KTtcbiAgICB0aGlzW19hN10gPSB0cnVlO1xuICAgIC8vIHVzZWQgaW4gaXNJbnN0YW5jZVxuICAgIHRoaXMubmFtZSA9IG5hbWU2O1xuICAgIHRoaXMudHlwZSA9IFwicmVzcG9uc2VfZXJyb3JcIjtcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0aW9uRXJyb3I7XG4gIH1cbiAgc3RhdGljIGlzSW5zdGFuY2UoZXJyb3IpIHtcbiAgICByZXR1cm4gR2F0ZXdheUVycm9yLmhhc01hcmtlcihlcnJvcikgJiYgc3ltYm9sNyBpbiBlcnJvcjtcbiAgfVxufTtcblxuLy8gc3JjL2Vycm9ycy9jcmVhdGUtZ2F0ZXdheS1lcnJvci50c1xuaW1wb3J0IHtcbiAgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hMixcbiAgc2FmZVZhbGlkYXRlVHlwZXMsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWEyXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVHYXRld2F5RXJyb3JGcm9tUmVzcG9uc2Uoe1xuICByZXNwb25zZSxcbiAgc3RhdHVzQ29kZSxcbiAgZGVmYXVsdE1lc3NhZ2UgPSBcIkdhdGV3YXkgcmVxdWVzdCBmYWlsZWRcIixcbiAgY2F1c2UsXG4gIGF1dGhNZXRob2Rcbn0pIHtcbiAgdmFyIF9hOTtcbiAgY29uc3QgcGFyc2VSZXN1bHQgPSBhd2FpdCBzYWZlVmFsaWRhdGVUeXBlcyh7XG4gICAgdmFsdWU6IHJlc3BvbnNlLFxuICAgIHNjaGVtYTogZ2F0ZXdheUVycm9yUmVzcG9uc2VTY2hlbWFcbiAgfSk7XG4gIGlmICghcGFyc2VSZXN1bHQuc3VjY2Vzcykge1xuICAgIGNvbnN0IHJhd0dlbmVyYXRpb25JZCA9IHR5cGVvZiByZXNwb25zZSA9PT0gXCJvYmplY3RcIiAmJiByZXNwb25zZSAhPT0gbnVsbCAmJiBcImdlbmVyYXRpb25JZFwiIGluIHJlc3BvbnNlID8gcmVzcG9uc2UuZ2VuZXJhdGlvbklkIDogdm9pZCAwO1xuICAgIHJldHVybiBuZXcgR2F0ZXdheVJlc3BvbnNlRXJyb3Ioe1xuICAgICAgbWVzc2FnZTogYEludmFsaWQgZXJyb3IgcmVzcG9uc2UgZm9ybWF0OiAke2RlZmF1bHRNZXNzYWdlfWAsXG4gICAgICBzdGF0dXNDb2RlLFxuICAgICAgcmVzcG9uc2UsXG4gICAgICB2YWxpZGF0aW9uRXJyb3I6IHBhcnNlUmVzdWx0LmVycm9yLFxuICAgICAgY2F1c2UsXG4gICAgICBnZW5lcmF0aW9uSWQ6IHJhd0dlbmVyYXRpb25JZFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHZhbGlkYXRlZFJlc3BvbnNlID0gcGFyc2VSZXN1bHQudmFsdWU7XG4gIGNvbnN0IGVycm9yVHlwZSA9IHZhbGlkYXRlZFJlc3BvbnNlLmVycm9yLnR5cGU7XG4gIGNvbnN0IG1lc3NhZ2UgPSB2YWxpZGF0ZWRSZXNwb25zZS5lcnJvci5tZXNzYWdlO1xuICBjb25zdCBnZW5lcmF0aW9uSWQgPSAoX2E5ID0gdmFsaWRhdGVkUmVzcG9uc2UuZ2VuZXJhdGlvbklkKSAhPSBudWxsID8gX2E5IDogdm9pZCAwO1xuICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgIGNhc2UgXCJhdXRoZW50aWNhdGlvbl9lcnJvclwiOlxuICAgICAgcmV0dXJuIEdhdGV3YXlBdXRoZW50aWNhdGlvbkVycm9yLmNyZWF0ZUNvbnRleHR1YWxFcnJvcih7XG4gICAgICAgIGFwaUtleVByb3ZpZGVkOiBhdXRoTWV0aG9kID09PSBcImFwaS1rZXlcIixcbiAgICAgICAgb2lkY1Rva2VuUHJvdmlkZWQ6IGF1dGhNZXRob2QgPT09IFwib2lkY1wiLFxuICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICBjYXVzZSxcbiAgICAgICAgZ2VuZXJhdGlvbklkXG4gICAgICB9KTtcbiAgICBjYXNlIFwiaW52YWxpZF9yZXF1ZXN0X2Vycm9yXCI6XG4gICAgICByZXR1cm4gbmV3IEdhdGV3YXlJbnZhbGlkUmVxdWVzdEVycm9yKHtcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIGdlbmVyYXRpb25JZFxuICAgICAgfSk7XG4gICAgY2FzZSBcInJhdGVfbGltaXRfZXhjZWVkZWRcIjpcbiAgICAgIHJldHVybiBuZXcgR2F0ZXdheVJhdGVMaW1pdEVycm9yKHtcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIGdlbmVyYXRpb25JZFxuICAgICAgfSk7XG4gICAgY2FzZSBcIm1vZGVsX25vdF9mb3VuZFwiOiB7XG4gICAgICBjb25zdCBtb2RlbFJlc3VsdCA9IGF3YWl0IHNhZmVWYWxpZGF0ZVR5cGVzKHtcbiAgICAgICAgdmFsdWU6IHZhbGlkYXRlZFJlc3BvbnNlLmVycm9yLnBhcmFtLFxuICAgICAgICBzY2hlbWE6IG1vZGVsTm90Rm91bmRQYXJhbVNjaGVtYVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IEdhdGV3YXlNb2RlbE5vdEZvdW5kRXJyb3Ioe1xuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICBtb2RlbElkOiBtb2RlbFJlc3VsdC5zdWNjZXNzID8gbW9kZWxSZXN1bHQudmFsdWUubW9kZWxJZCA6IHZvaWQgMCxcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIGdlbmVyYXRpb25JZFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgXCJpbnRlcm5hbF9zZXJ2ZXJfZXJyb3JcIjpcbiAgICAgIHJldHVybiBuZXcgR2F0ZXdheUludGVybmFsU2VydmVyRXJyb3Ioe1xuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICBjYXVzZSxcbiAgICAgICAgZ2VuZXJhdGlvbklkXG4gICAgICB9KTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG5ldyBHYXRld2F5SW50ZXJuYWxTZXJ2ZXJFcnJvcih7XG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgIGNhdXNlLFxuICAgICAgICBnZW5lcmF0aW9uSWRcbiAgICAgIH0pO1xuICB9XG59XG52YXIgZ2F0ZXdheUVycm9yUmVzcG9uc2VTY2hlbWEgPSBsYXp5U2NoZW1hMihcbiAgKCkgPT4gem9kU2NoZW1hMihcbiAgICB6Mi5vYmplY3Qoe1xuICAgICAgZXJyb3I6IHoyLm9iamVjdCh7XG4gICAgICAgIG1lc3NhZ2U6IHoyLnN0cmluZygpLFxuICAgICAgICB0eXBlOiB6Mi5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgIHBhcmFtOiB6Mi51bmtub3duKCkubnVsbGlzaCgpLFxuICAgICAgICBjb2RlOiB6Mi51bmlvbihbejIuc3RyaW5nKCksIHoyLm51bWJlcigpXSkubnVsbGlzaCgpXG4gICAgICB9KSxcbiAgICAgIGdlbmVyYXRpb25JZDogejIuc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgfSlcbiAgKVxuKTtcblxuLy8gc3JjL2Vycm9ycy9nYXRld2F5LXRpbWVvdXQtZXJyb3IudHNcbnZhciBuYW1lNyA9IFwiR2F0ZXdheVRpbWVvdXRFcnJvclwiO1xudmFyIG1hcmtlcjggPSBgdmVyY2VsLmFpLmdhdGV3YXkuZXJyb3IuJHtuYW1lN31gO1xudmFyIHN5bWJvbDggPSBTeW1ib2wuZm9yKG1hcmtlcjgpO1xudmFyIF9hOCwgX2I4O1xudmFyIEdhdGV3YXlUaW1lb3V0RXJyb3IgPSBjbGFzcyBfR2F0ZXdheVRpbWVvdXRFcnJvciBleHRlbmRzIChfYjggPSBHYXRld2F5RXJyb3IsIF9hOCA9IHN5bWJvbDgsIF9iOCkge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgbWVzc2FnZSA9IFwiUmVxdWVzdCB0aW1lZCBvdXRcIixcbiAgICBzdGF0dXNDb2RlID0gNDA4LFxuICAgIGNhdXNlLFxuICAgIGdlbmVyYXRpb25JZFxuICB9ID0ge30pIHtcbiAgICBzdXBlcih7IG1lc3NhZ2UsIHN0YXR1c0NvZGUsIGNhdXNlLCBnZW5lcmF0aW9uSWQgfSk7XG4gICAgdGhpc1tfYThdID0gdHJ1ZTtcbiAgICAvLyB1c2VkIGluIGlzSW5zdGFuY2VcbiAgICB0aGlzLm5hbWUgPSBuYW1lNztcbiAgICB0aGlzLnR5cGUgPSBcInRpbWVvdXRfZXJyb3JcIjtcbiAgfVxuICBzdGF0aWMgaXNJbnN0YW5jZShlcnJvcikge1xuICAgIHJldHVybiBHYXRld2F5RXJyb3IuaGFzTWFya2VyKGVycm9yKSAmJiBzeW1ib2w4IGluIGVycm9yO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgaGVscGZ1bCB0aW1lb3V0IGVycm9yIG1lc3NhZ2Ugd2l0aCB0cm91Ymxlc2hvb3RpbmcgZ3VpZGFuY2VcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVUaW1lb3V0RXJyb3Ioe1xuICAgIG9yaWdpbmFsTWVzc2FnZSxcbiAgICBzdGF0dXNDb2RlID0gNDA4LFxuICAgIGNhdXNlLFxuICAgIGdlbmVyYXRpb25JZFxuICB9KSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBHYXRld2F5IHJlcXVlc3QgdGltZWQgb3V0OiAke29yaWdpbmFsTWVzc2FnZX1cblxuICAgIFRoaXMgaXMgYSBjbGllbnQtc2lkZSB0aW1lb3V0LiBUbyByZXNvbHZlIHRoaXMsIGluY3JlYXNlIHlvdXIgdGltZW91dCBjb25maWd1cmF0aW9uOiBodHRwczovL3ZlcmNlbC5jb20vZG9jcy9haS1nYXRld2F5L2NhcGFiaWxpdGllcy92aWRlby1nZW5lcmF0aW9uI2V4dGVuZGluZy10aW1lb3V0cy1mb3Itbm9kZS5qc2A7XG4gICAgcmV0dXJuIG5ldyBfR2F0ZXdheVRpbWVvdXRFcnJvcih7XG4gICAgICBtZXNzYWdlLFxuICAgICAgc3RhdHVzQ29kZSxcbiAgICAgIGNhdXNlLFxuICAgICAgZ2VuZXJhdGlvbklkXG4gICAgfSk7XG4gIH1cbn07XG5cbi8vIHNyYy9lcnJvcnMvYXMtZ2F0ZXdheS1lcnJvci50c1xuZnVuY3Rpb24gaXNUaW1lb3V0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZXJyb3JDb2RlID0gZXJyb3IuY29kZTtcbiAgaWYgKHR5cGVvZiBlcnJvckNvZGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB1bmRpY2lUaW1lb3V0Q29kZXMgPSBbXG4gICAgICBcIlVORF9FUlJfSEVBREVSU19USU1FT1VUXCIsXG4gICAgICBcIlVORF9FUlJfQk9EWV9USU1FT1VUXCIsXG4gICAgICBcIlVORF9FUlJfQ09OTkVDVF9USU1FT1VUXCJcbiAgICBdO1xuICAgIHJldHVybiB1bmRpY2lUaW1lb3V0Q29kZXMuaW5jbHVkZXMoZXJyb3JDb2RlKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5hc3luYyBmdW5jdGlvbiBhc0dhdGV3YXlFcnJvcihlcnJvciwgYXV0aE1ldGhvZCkge1xuICB2YXIgX2E5O1xuICBpZiAoR2F0ZXdheUVycm9yLmlzSW5zdGFuY2UoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG4gIGlmIChpc1RpbWVvdXRFcnJvcihlcnJvcikpIHtcbiAgICByZXR1cm4gR2F0ZXdheVRpbWVvdXRFcnJvci5jcmVhdGVUaW1lb3V0RXJyb3Ioe1xuICAgICAgb3JpZ2luYWxNZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiLFxuICAgICAgY2F1c2U6IGVycm9yXG4gICAgfSk7XG4gIH1cbiAgaWYgKEFQSUNhbGxFcnJvci5pc0luc3RhbmNlKGVycm9yKSkge1xuICAgIGlmIChlcnJvci5jYXVzZSAmJiBpc1RpbWVvdXRFcnJvcihlcnJvci5jYXVzZSkpIHtcbiAgICAgIHJldHVybiBHYXRld2F5VGltZW91dEVycm9yLmNyZWF0ZVRpbWVvdXRFcnJvcih7XG4gICAgICAgIG9yaWdpbmFsTWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUdhdGV3YXlFcnJvckZyb21SZXNwb25zZSh7XG4gICAgICByZXNwb25zZTogZXh0cmFjdEFwaUNhbGxSZXNwb25zZShlcnJvciksXG4gICAgICBzdGF0dXNDb2RlOiAoX2E5ID0gZXJyb3Iuc3RhdHVzQ29kZSkgIT0gbnVsbCA/IF9hOSA6IDUwMCxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiBcIkdhdGV3YXkgcmVxdWVzdCBmYWlsZWRcIixcbiAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgIGF1dGhNZXRob2RcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gYXdhaXQgY3JlYXRlR2F0ZXdheUVycm9yRnJvbVJlc3BvbnNlKHtcbiAgICByZXNwb25zZToge30sXG4gICAgc3RhdHVzQ29kZTogNTAwLFxuICAgIGRlZmF1bHRNZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYEdhdGV3YXkgcmVxdWVzdCBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gIDogXCJVbmtub3duIEdhdGV3YXkgZXJyb3JcIixcbiAgICBjYXVzZTogZXJyb3IsXG4gICAgYXV0aE1ldGhvZFxuICB9KTtcbn1cblxuLy8gc3JjL2Vycm9ycy9leHRyYWN0LWFwaS1jYWxsLXJlc3BvbnNlLnRzXG5mdW5jdGlvbiBleHRyYWN0QXBpQ2FsbFJlc3BvbnNlKGVycm9yKSB7XG4gIGlmIChlcnJvci5kYXRhICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gZXJyb3IuZGF0YTtcbiAgfVxuICBpZiAoZXJyb3IucmVzcG9uc2VCb2R5ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZXJyb3IucmVzcG9uc2VCb2R5KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZXJyb3IucmVzcG9uc2VCb2R5O1xuICAgIH1cbiAgfVxuICByZXR1cm4ge307XG59XG5cbi8vIHNyYy9lcnJvcnMvcGFyc2UtYXV0aC1tZXRob2QudHNcbmltcG9ydCB7IHogYXMgejMgfSBmcm9tIFwiem9kL3Y0XCI7XG5pbXBvcnQge1xuICBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWEzLFxuICBzYWZlVmFsaWRhdGVUeXBlcyBhcyBzYWZlVmFsaWRhdGVUeXBlczIsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWEzXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG52YXIgR0FURVdBWV9BVVRIX01FVEhPRF9IRUFERVIgPSBcImFpLWdhdGV3YXktYXV0aC1tZXRob2RcIjtcbmFzeW5jIGZ1bmN0aW9uIHBhcnNlQXV0aE1ldGhvZChoZWFkZXJzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhZmVWYWxpZGF0ZVR5cGVzMih7XG4gICAgdmFsdWU6IGhlYWRlcnNbR0FURVdBWV9BVVRIX01FVEhPRF9IRUFERVJdLFxuICAgIHNjaGVtYTogZ2F0ZXdheUF1dGhNZXRob2RTY2hlbWFcbiAgfSk7XG4gIHJldHVybiByZXN1bHQuc3VjY2VzcyA/IHJlc3VsdC52YWx1ZSA6IHZvaWQgMDtcbn1cbnZhciBnYXRld2F5QXV0aE1ldGhvZFNjaGVtYSA9IGxhenlTY2hlbWEzKFxuICAoKSA9PiB6b2RTY2hlbWEzKHozLnVuaW9uKFt6My5saXRlcmFsKFwiYXBpLWtleVwiKSwgejMubGl0ZXJhbChcIm9pZGNcIildKSlcbik7XG5cbi8vIHNyYy9nYXRld2F5LWZldGNoLW1ldGFkYXRhLnRzXG5pbXBvcnQge1xuICBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXIsXG4gIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIsXG4gIGdldEZyb21BcGksXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTQsXG4gIHJlc29sdmUsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWE0XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHo0IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIEdhdGV3YXlGZXRjaE1ldGFkYXRhID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBhc3luYyBnZXRBdmFpbGFibGVNb2RlbHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGF3YWl0IGdldEZyb21BcGkoe1xuICAgICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmJhc2VVUkx9L2NvbmZpZ2AsXG4gICAgICAgIGhlYWRlcnM6IGF3YWl0IHJlc29sdmUodGhpcy5jb25maWcuaGVhZGVycygpKSxcbiAgICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcihcbiAgICAgICAgICBnYXRld2F5QXZhaWxhYmxlTW9kZWxzUmVzcG9uc2VTY2hlbWFcbiAgICAgICAgKSxcbiAgICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXIoe1xuICAgICAgICAgIGVycm9yU2NoZW1hOiB6NC5hbnkoKSxcbiAgICAgICAgICBlcnJvclRvTWVzc2FnZTogKGRhdGEpID0+IGRhdGFcbiAgICAgICAgfSksXG4gICAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGF3YWl0IGFzR2F0ZXdheUVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgZ2V0Q3JlZGl0cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFzZVVybCA9IG5ldyBVUkwodGhpcy5jb25maWcuYmFzZVVSTCk7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBhd2FpdCBnZXRGcm9tQXBpKHtcbiAgICAgICAgdXJsOiBgJHtiYXNlVXJsLm9yaWdpbn0vdjEvY3JlZGl0c2AsXG4gICAgICAgIGhlYWRlcnM6IGF3YWl0IHJlc29sdmUodGhpcy5jb25maWcuaGVhZGVycygpKSxcbiAgICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcihcbiAgICAgICAgICBnYXRld2F5Q3JlZGl0c1Jlc3BvbnNlU2NoZW1hXG4gICAgICAgICksXG4gICAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyKHtcbiAgICAgICAgICBlcnJvclNjaGVtYTogejQuYW55KCksXG4gICAgICAgICAgZXJyb3JUb01lc3NhZ2U6IChkYXRhKSA9PiBkYXRhXG4gICAgICAgIH0pLFxuICAgICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBhd2FpdCBhc0dhdGV3YXlFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG59O1xudmFyIGdhdGV3YXlBdmFpbGFibGVNb2RlbHNSZXNwb25zZVNjaGVtYSA9IGxhenlTY2hlbWE0KFxuICAoKSA9PiB6b2RTY2hlbWE0KFxuICAgIHo0Lm9iamVjdCh7XG4gICAgICBtb2RlbHM6IHo0LmFycmF5KFxuICAgICAgICB6NC5vYmplY3Qoe1xuICAgICAgICAgIGlkOiB6NC5zdHJpbmcoKSxcbiAgICAgICAgICBuYW1lOiB6NC5zdHJpbmcoKSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogejQuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgIHByaWNpbmc6IHo0Lm9iamVjdCh7XG4gICAgICAgICAgICBpbnB1dDogejQuc3RyaW5nKCksXG4gICAgICAgICAgICBvdXRwdXQ6IHo0LnN0cmluZygpLFxuICAgICAgICAgICAgaW5wdXRfY2FjaGVfcmVhZDogejQuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgaW5wdXRfY2FjaGVfd3JpdGU6IHo0LnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICAgIH0pLnRyYW5zZm9ybShcbiAgICAgICAgICAgICh7IGlucHV0LCBvdXRwdXQsIGlucHV0X2NhY2hlX3JlYWQsIGlucHV0X2NhY2hlX3dyaXRlIH0pID0+ICh7XG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICAgIC4uLmlucHV0X2NhY2hlX3JlYWQgPyB7IGNhY2hlZElucHV0VG9rZW5zOiBpbnB1dF9jYWNoZV9yZWFkIH0gOiB7fSxcbiAgICAgICAgICAgICAgLi4uaW5wdXRfY2FjaGVfd3JpdGUgPyB7IGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogaW5wdXRfY2FjaGVfd3JpdGUgfSA6IHt9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICkubnVsbGlzaCgpLFxuICAgICAgICAgIHNwZWNpZmljYXRpb246IHo0Lm9iamVjdCh7XG4gICAgICAgICAgICBzcGVjaWZpY2F0aW9uVmVyc2lvbjogejQubGl0ZXJhbChcInYzXCIpLFxuICAgICAgICAgICAgcHJvdmlkZXI6IHo0LnN0cmluZygpLFxuICAgICAgICAgICAgbW9kZWxJZDogejQuc3RyaW5nKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtb2RlbFR5cGU6IHo0LmVudW0oW1wiZW1iZWRkaW5nXCIsIFwiaW1hZ2VcIiwgXCJsYW5ndWFnZVwiLCBcInZpZGVvXCJdKS5udWxsaXNoKClcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxuICApXG4pO1xudmFyIGdhdGV3YXlDcmVkaXRzUmVzcG9uc2VTY2hlbWEgPSBsYXp5U2NoZW1hNChcbiAgKCkgPT4gem9kU2NoZW1hNChcbiAgICB6NC5vYmplY3Qoe1xuICAgICAgYmFsYW5jZTogejQuc3RyaW5nKCksXG4gICAgICB0b3RhbF91c2VkOiB6NC5zdHJpbmcoKVxuICAgIH0pLnRyYW5zZm9ybSgoeyBiYWxhbmNlLCB0b3RhbF91c2VkIH0pID0+ICh7XG4gICAgICBiYWxhbmNlLFxuICAgICAgdG90YWxVc2VkOiB0b3RhbF91c2VkXG4gICAgfSkpXG4gIClcbik7XG5cbi8vIHNyYy9nYXRld2F5LXNwZW5kLXJlcG9ydC50c1xuaW1wb3J0IHtcbiAgY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyIGFzIGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcjIsXG4gIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIgYXMgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjIsXG4gIGdldEZyb21BcGkgYXMgZ2V0RnJvbUFwaTIsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZTIsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWE1XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHo1IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIEdhdGV3YXlTcGVuZFJlcG9ydCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cbiAgYXN5bmMgZ2V0U3BlbmRSZXBvcnQocGFyYW1zKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBuZXcgVVJMKHRoaXMuY29uZmlnLmJhc2VVUkwpO1xuICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgc2VhcmNoUGFyYW1zLnNldChcInN0YXJ0X2RhdGVcIiwgcGFyYW1zLnN0YXJ0RGF0ZSk7XG4gICAgICBzZWFyY2hQYXJhbXMuc2V0KFwiZW5kX2RhdGVcIiwgcGFyYW1zLmVuZERhdGUpO1xuICAgICAgaWYgKHBhcmFtcy5ncm91cEJ5KSB7XG4gICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoXCJncm91cF9ieVwiLCBwYXJhbXMuZ3JvdXBCeSk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmRhdGVQYXJ0KSB7XG4gICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoXCJkYXRlX3BhcnRcIiwgcGFyYW1zLmRhdGVQYXJ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMudXNlcklkKSB7XG4gICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoXCJ1c2VyX2lkXCIsIHBhcmFtcy51c2VySWQpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5tb2RlbCkge1xuICAgICAgICBzZWFyY2hQYXJhbXMuc2V0KFwibW9kZWxcIiwgcGFyYW1zLm1vZGVsKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMucHJvdmlkZXIpIHtcbiAgICAgICAgc2VhcmNoUGFyYW1zLnNldChcInByb3ZpZGVyXCIsIHBhcmFtcy5wcm92aWRlcik7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmNyZWRlbnRpYWxUeXBlKSB7XG4gICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoXCJjcmVkZW50aWFsX3R5cGVcIiwgcGFyYW1zLmNyZWRlbnRpYWxUeXBlKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMudGFncyAmJiBwYXJhbXMudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoXCJ0YWdzXCIsIHBhcmFtcy50YWdzLmpvaW4oXCIsXCIpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGF3YWl0IGdldEZyb21BcGkyKHtcbiAgICAgICAgdXJsOiBgJHtiYXNlVXJsLm9yaWdpbn0vdjEvcmVwb3J0PyR7c2VhcmNoUGFyYW1zLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgaGVhZGVyczogYXdhaXQgcmVzb2x2ZTIodGhpcy5jb25maWcuaGVhZGVycygpKSxcbiAgICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjIoXG4gICAgICAgICAgZ2F0ZXdheVNwZW5kUmVwb3J0UmVzcG9uc2VTY2hlbWFcbiAgICAgICAgKSxcbiAgICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXIyKHtcbiAgICAgICAgICBlcnJvclNjaGVtYTogejUuYW55KCksXG4gICAgICAgICAgZXJyb3JUb01lc3NhZ2U6IChkYXRhKSA9PiBkYXRhXG4gICAgICAgIH0pLFxuICAgICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBhd2FpdCBhc0dhdGV3YXlFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG59O1xudmFyIGdhdGV3YXlTcGVuZFJlcG9ydFJlc3BvbnNlU2NoZW1hID0gbGF6eVNjaGVtYTUoXG4gICgpID0+IHpvZFNjaGVtYTUoXG4gICAgejUub2JqZWN0KHtcbiAgICAgIHJlc3VsdHM6IHo1LmFycmF5KFxuICAgICAgICB6NS5vYmplY3Qoe1xuICAgICAgICAgIGRheTogejUuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICBob3VyOiB6NS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgIHVzZXI6IHo1LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgbW9kZWw6IHo1LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgdGFnOiB6NS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgIHByb3ZpZGVyOiB6NS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgIGNyZWRlbnRpYWxfdHlwZTogejUuZW51bShbXCJieW9rXCIsIFwic3lzdGVtXCJdKS5vcHRpb25hbCgpLFxuICAgICAgICAgIHRvdGFsX2Nvc3Q6IHo1Lm51bWJlcigpLFxuICAgICAgICAgIG1hcmtldF9jb3N0OiB6NS5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICAgIGlucHV0X3Rva2VuczogejUubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICBvdXRwdXRfdG9rZW5zOiB6NS5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICAgIGNhY2hlZF9pbnB1dF90b2tlbnM6IHo1Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiB6NS5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICAgIHJlYXNvbmluZ190b2tlbnM6IHo1Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgcmVxdWVzdF9jb3VudDogejUubnVtYmVyKCkub3B0aW9uYWwoKVxuICAgICAgICB9KS50cmFuc2Zvcm0oXG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIGNyZWRlbnRpYWxfdHlwZSxcbiAgICAgICAgICAgIHRvdGFsX2Nvc3QsXG4gICAgICAgICAgICBtYXJrZXRfY29zdCxcbiAgICAgICAgICAgIGlucHV0X3Rva2VucyxcbiAgICAgICAgICAgIG91dHB1dF90b2tlbnMsXG4gICAgICAgICAgICBjYWNoZWRfaW5wdXRfdG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zLFxuICAgICAgICAgICAgcmVhc29uaW5nX3Rva2VucyxcbiAgICAgICAgICAgIHJlcXVlc3RfY291bnQsXG4gICAgICAgICAgICAuLi5yZXN0XG4gICAgICAgICAgfSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnJlc3QsXG4gICAgICAgICAgICAuLi5jcmVkZW50aWFsX3R5cGUgIT09IHZvaWQgMCA/IHsgY3JlZGVudGlhbFR5cGU6IGNyZWRlbnRpYWxfdHlwZSB9IDoge30sXG4gICAgICAgICAgICB0b3RhbENvc3Q6IHRvdGFsX2Nvc3QsXG4gICAgICAgICAgICAuLi5tYXJrZXRfY29zdCAhPT0gdm9pZCAwID8geyBtYXJrZXRDb3N0OiBtYXJrZXRfY29zdCB9IDoge30sXG4gICAgICAgICAgICAuLi5pbnB1dF90b2tlbnMgIT09IHZvaWQgMCA/IHsgaW5wdXRUb2tlbnM6IGlucHV0X3Rva2VucyB9IDoge30sXG4gICAgICAgICAgICAuLi5vdXRwdXRfdG9rZW5zICE9PSB2b2lkIDAgPyB7IG91dHB1dFRva2Vuczogb3V0cHV0X3Rva2VucyB9IDoge30sXG4gICAgICAgICAgICAuLi5jYWNoZWRfaW5wdXRfdG9rZW5zICE9PSB2b2lkIDAgPyB7IGNhY2hlZElucHV0VG9rZW5zOiBjYWNoZWRfaW5wdXRfdG9rZW5zIH0gOiB7fSxcbiAgICAgICAgICAgIC4uLmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyAhPT0gdm9pZCAwID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyB9IDoge30sXG4gICAgICAgICAgICAuLi5yZWFzb25pbmdfdG9rZW5zICE9PSB2b2lkIDAgPyB7IHJlYXNvbmluZ1Rva2VuczogcmVhc29uaW5nX3Rva2VucyB9IDoge30sXG4gICAgICAgICAgICAuLi5yZXF1ZXN0X2NvdW50ICE9PSB2b2lkIDAgPyB7IHJlcXVlc3RDb3VudDogcmVxdWVzdF9jb3VudCB9IDoge31cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgfSlcbiAgKVxuKTtcblxuLy8gc3JjL2dhdGV3YXktZ2VuZXJhdGlvbi1pbmZvLnRzXG5pbXBvcnQge1xuICBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXIgYXMgY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyMyxcbiAgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlciBhcyBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyMyxcbiAgZ2V0RnJvbUFwaSBhcyBnZXRGcm9tQXBpMyxcbiAgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hNixcbiAgcmVzb2x2ZSBhcyByZXNvbHZlMyxcbiAgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTZcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejYgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgR2F0ZXdheUdlbmVyYXRpb25JbmZvRmV0Y2hlciA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cbiAgYXN5bmMgZ2V0R2VuZXJhdGlvbkluZm8ocGFyYW1zKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBuZXcgVVJMKHRoaXMuY29uZmlnLmJhc2VVUkwpO1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gYXdhaXQgZ2V0RnJvbUFwaTMoe1xuICAgICAgICB1cmw6IGAke2Jhc2VVcmwub3JpZ2lufS92MS9nZW5lcmF0aW9uP2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5pZCl9YCxcbiAgICAgICAgaGVhZGVyczogYXdhaXQgcmVzb2x2ZTModGhpcy5jb25maWcuaGVhZGVycygpKSxcbiAgICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjMoXG4gICAgICAgICAgZ2F0ZXdheUdlbmVyYXRpb25JbmZvUmVzcG9uc2VTY2hlbWFcbiAgICAgICAgKSxcbiAgICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXIzKHtcbiAgICAgICAgICBlcnJvclNjaGVtYTogejYuYW55KCksXG4gICAgICAgICAgZXJyb3JUb01lc3NhZ2U6IChkYXRhKSA9PiBkYXRhXG4gICAgICAgIH0pLFxuICAgICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBhd2FpdCBhc0dhdGV3YXlFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG59O1xudmFyIGdhdGV3YXlHZW5lcmF0aW9uSW5mb1Jlc3BvbnNlU2NoZW1hID0gbGF6eVNjaGVtYTYoXG4gICgpID0+IHpvZFNjaGVtYTYoXG4gICAgejYub2JqZWN0KHtcbiAgICAgIGRhdGE6IHo2Lm9iamVjdCh7XG4gICAgICAgIGlkOiB6Ni5zdHJpbmcoKSxcbiAgICAgICAgdG90YWxfY29zdDogejYubnVtYmVyKCksXG4gICAgICAgIHVwc3RyZWFtX2luZmVyZW5jZV9jb3N0OiB6Ni5udW1iZXIoKSxcbiAgICAgICAgdXNhZ2U6IHo2Lm51bWJlcigpLFxuICAgICAgICBjcmVhdGVkX2F0OiB6Ni5zdHJpbmcoKSxcbiAgICAgICAgbW9kZWw6IHo2LnN0cmluZygpLFxuICAgICAgICBpc19ieW9rOiB6Ni5ib29sZWFuKCksXG4gICAgICAgIHByb3ZpZGVyX25hbWU6IHo2LnN0cmluZygpLFxuICAgICAgICBzdHJlYW1lZDogejYuYm9vbGVhbigpLFxuICAgICAgICBmaW5pc2hfcmVhc29uOiB6Ni5zdHJpbmcoKSxcbiAgICAgICAgbGF0ZW5jeTogejYubnVtYmVyKCksXG4gICAgICAgIGdlbmVyYXRpb25fdGltZTogejYubnVtYmVyKCksXG4gICAgICAgIG5hdGl2ZV90b2tlbnNfcHJvbXB0OiB6Ni5udW1iZXIoKSxcbiAgICAgICAgbmF0aXZlX3Rva2Vuc19jb21wbGV0aW9uOiB6Ni5udW1iZXIoKSxcbiAgICAgICAgbmF0aXZlX3Rva2Vuc19yZWFzb25pbmc6IHo2Lm51bWJlcigpLFxuICAgICAgICBuYXRpdmVfdG9rZW5zX2NhY2hlZDogejYubnVtYmVyKCksXG4gICAgICAgIG5hdGl2ZV90b2tlbnNfY2FjaGVfY3JlYXRpb246IHo2Lm51bWJlcigpLFxuICAgICAgICBiaWxsYWJsZV93ZWJfc2VhcmNoX2NhbGxzOiB6Ni5udW1iZXIoKVxuICAgICAgfSkudHJhbnNmb3JtKFxuICAgICAgICAoe1xuICAgICAgICAgIHRvdGFsX2Nvc3QsXG4gICAgICAgICAgdXBzdHJlYW1faW5mZXJlbmNlX2Nvc3QsXG4gICAgICAgICAgY3JlYXRlZF9hdCxcbiAgICAgICAgICBpc19ieW9rLFxuICAgICAgICAgIHByb3ZpZGVyX25hbWUsXG4gICAgICAgICAgZmluaXNoX3JlYXNvbixcbiAgICAgICAgICBnZW5lcmF0aW9uX3RpbWUsXG4gICAgICAgICAgbmF0aXZlX3Rva2Vuc19wcm9tcHQsXG4gICAgICAgICAgbmF0aXZlX3Rva2Vuc19jb21wbGV0aW9uLFxuICAgICAgICAgIG5hdGl2ZV90b2tlbnNfcmVhc29uaW5nLFxuICAgICAgICAgIG5hdGl2ZV90b2tlbnNfY2FjaGVkLFxuICAgICAgICAgIG5hdGl2ZV90b2tlbnNfY2FjaGVfY3JlYXRpb24sXG4gICAgICAgICAgYmlsbGFibGVfd2ViX3NlYXJjaF9jYWxscyxcbiAgICAgICAgICAuLi5yZXN0XG4gICAgICAgIH0pID0+ICh7XG4gICAgICAgICAgLi4ucmVzdCxcbiAgICAgICAgICB0b3RhbENvc3Q6IHRvdGFsX2Nvc3QsXG4gICAgICAgICAgdXBzdHJlYW1JbmZlcmVuY2VDb3N0OiB1cHN0cmVhbV9pbmZlcmVuY2VfY29zdCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGNyZWF0ZWRfYXQsXG4gICAgICAgICAgaXNCeW9rOiBpc19ieW9rLFxuICAgICAgICAgIHByb3ZpZGVyTmFtZTogcHJvdmlkZXJfbmFtZSxcbiAgICAgICAgICBmaW5pc2hSZWFzb246IGZpbmlzaF9yZWFzb24sXG4gICAgICAgICAgZ2VuZXJhdGlvblRpbWU6IGdlbmVyYXRpb25fdGltZSxcbiAgICAgICAgICBwcm9tcHRUb2tlbnM6IG5hdGl2ZV90b2tlbnNfcHJvbXB0LFxuICAgICAgICAgIGNvbXBsZXRpb25Ub2tlbnM6IG5hdGl2ZV90b2tlbnNfY29tcGxldGlvbixcbiAgICAgICAgICByZWFzb25pbmdUb2tlbnM6IG5hdGl2ZV90b2tlbnNfcmVhc29uaW5nLFxuICAgICAgICAgIGNhY2hlZFRva2VuczogbmF0aXZlX3Rva2Vuc19jYWNoZWQsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvblRva2VuczogbmF0aXZlX3Rva2Vuc19jYWNoZV9jcmVhdGlvbixcbiAgICAgICAgICBiaWxsYWJsZVdlYlNlYXJjaENhbGxzOiBiaWxsYWJsZV93ZWJfc2VhcmNoX2NhbGxzXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSkudHJhbnNmb3JtKCh7IGRhdGEgfSkgPT4gZGF0YSlcbiAgKVxuKTtcblxuLy8gc3JjL2dhdGV3YXktbGFuZ3VhZ2UtbW9kZWwudHNcbmltcG9ydCB7XG4gIGNvbWJpbmVIZWFkZXJzLFxuICBjcmVhdGVFdmVudFNvdXJjZVJlc3BvbnNlSGFuZGxlcixcbiAgY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyIGFzIGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcjQsXG4gIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIgYXMgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjQsXG4gIHBvc3RKc29uVG9BcGksXG4gIHJlc29sdmUgYXMgcmVzb2x2ZTRcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejcgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgR2F0ZXdheUxhbmd1YWdlTW9kZWwgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsSWQsIGNvbmZpZykge1xuICAgIHRoaXMubW9kZWxJZCA9IG1vZGVsSWQ7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9IFwidjNcIjtcbiAgICB0aGlzLnN1cHBvcnRlZFVybHMgPSB7IFwiKi8qXCI6IFsvLiovXSB9O1xuICB9XG4gIGdldCBwcm92aWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucHJvdmlkZXI7XG4gIH1cbiAgYXN5bmMgZ2V0QXJncyhvcHRpb25zKSB7XG4gICAgY29uc3QgeyBhYm9ydFNpZ25hbDogX2Fib3J0U2lnbmFsLCAuLi5vcHRpb25zV2l0aG91dFNpZ25hbCB9ID0gb3B0aW9ucztcbiAgICByZXR1cm4ge1xuICAgICAgYXJnczogdGhpcy5tYXliZUVuY29kZUZpbGVQYXJ0cyhvcHRpb25zV2l0aG91dFNpZ25hbCksXG4gICAgICB3YXJuaW5nczogW11cbiAgICB9O1xuICB9XG4gIGFzeW5jIGRvR2VuZXJhdGUob3B0aW9ucykge1xuICAgIGNvbnN0IHsgYXJncywgd2FybmluZ3MgfSA9IGF3YWl0IHRoaXMuZ2V0QXJncyhvcHRpb25zKTtcbiAgICBjb25zdCB7IGFib3J0U2lnbmFsIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHJlc29sdmVkSGVhZGVycyA9IGF3YWl0IHJlc29sdmU0KHRoaXMuY29uZmlnLmhlYWRlcnMoKSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICB2YWx1ZTogcmVzcG9uc2VCb2R5LFxuICAgICAgICByYXdWYWx1ZTogcmF3UmVzcG9uc2VcbiAgICAgIH0gPSBhd2FpdCBwb3N0SnNvblRvQXBpKHtcbiAgICAgICAgdXJsOiB0aGlzLmdldFVybCgpLFxuICAgICAgICBoZWFkZXJzOiBjb21iaW5lSGVhZGVycyhcbiAgICAgICAgICByZXNvbHZlZEhlYWRlcnMsXG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgIHRoaXMuZ2V0TW9kZWxDb25maWdIZWFkZXJzKHRoaXMubW9kZWxJZCwgZmFsc2UpLFxuICAgICAgICAgIGF3YWl0IHJlc29sdmU0KHRoaXMuY29uZmlnLm8xMXlIZWFkZXJzKVxuICAgICAgICApLFxuICAgICAgICBib2R5OiBhcmdzLFxuICAgICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyNCh6Ny5hbnkoKSksXG4gICAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyNCh7XG4gICAgICAgICAgZXJyb3JTY2hlbWE6IHo3LmFueSgpLFxuICAgICAgICAgIGVycm9yVG9NZXNzYWdlOiAoZGF0YSkgPT4gZGF0YVxuICAgICAgICB9KSxcbiAgICAgICAgLi4uYWJvcnRTaWduYWwgJiYgeyBhYm9ydFNpZ25hbCB9LFxuICAgICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucmVzcG9uc2VCb2R5LFxuICAgICAgICByZXF1ZXN0OiB7IGJvZHk6IGFyZ3MgfSxcbiAgICAgICAgcmVzcG9uc2U6IHsgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLCBib2R5OiByYXdSZXNwb25zZSB9LFxuICAgICAgICB3YXJuaW5nc1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgYXdhaXQgYXNHYXRld2F5RXJyb3IoZXJyb3IsIGF3YWl0IHBhcnNlQXV0aE1ldGhvZChyZXNvbHZlZEhlYWRlcnMpKTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgZG9TdHJlYW0ob3B0aW9ucykge1xuICAgIGNvbnN0IHsgYXJncywgd2FybmluZ3MgfSA9IGF3YWl0IHRoaXMuZ2V0QXJncyhvcHRpb25zKTtcbiAgICBjb25zdCB7IGFib3J0U2lnbmFsIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHJlc29sdmVkSGVhZGVycyA9IGF3YWl0IHJlc29sdmU0KHRoaXMuY29uZmlnLmhlYWRlcnMoKSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdmFsdWU6IHJlc3BvbnNlLCByZXNwb25zZUhlYWRlcnMgfSA9IGF3YWl0IHBvc3RKc29uVG9BcGkoe1xuICAgICAgICB1cmw6IHRoaXMuZ2V0VXJsKCksXG4gICAgICAgIGhlYWRlcnM6IGNvbWJpbmVIZWFkZXJzKFxuICAgICAgICAgIHJlc29sdmVkSGVhZGVycyxcbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnMsXG4gICAgICAgICAgdGhpcy5nZXRNb2RlbENvbmZpZ0hlYWRlcnModGhpcy5tb2RlbElkLCB0cnVlKSxcbiAgICAgICAgICBhd2FpdCByZXNvbHZlNCh0aGlzLmNvbmZpZy5vMTF5SGVhZGVycylcbiAgICAgICAgKSxcbiAgICAgICAgYm9keTogYXJncyxcbiAgICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlRXZlbnRTb3VyY2VSZXNwb25zZUhhbmRsZXIoejcuYW55KCkpLFxuICAgICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcjQoe1xuICAgICAgICAgIGVycm9yU2NoZW1hOiB6Ny5hbnkoKSxcbiAgICAgICAgICBlcnJvclRvTWVzc2FnZTogKGRhdGEpID0+IGRhdGFcbiAgICAgICAgfSksXG4gICAgICAgIC4uLmFib3J0U2lnbmFsICYmIHsgYWJvcnRTaWduYWwgfSxcbiAgICAgICAgZmV0Y2g6IHRoaXMuY29uZmlnLmZldGNoXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0cmVhbTogcmVzcG9uc2UucGlwZVRocm91Z2goXG4gICAgICAgICAgbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICAgICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJzdHJlYW0tc3RhcnRcIiwgd2FybmluZ3MgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgaWYgKGNodW5rLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1QYXJ0ID0gY2h1bmsudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbVBhcnQudHlwZSA9PT0gXCJyYXdcIiAmJiAhb3B0aW9ucy5pbmNsdWRlUmF3Q2h1bmtzKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdHJlYW1QYXJ0LnR5cGUgPT09IFwicmVzcG9uc2UtbWV0YWRhdGFcIiAmJiBzdHJlYW1QYXJ0LnRpbWVzdGFtcCAmJiB0eXBlb2Ygc3RyZWFtUGFydC50aW1lc3RhbXAgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgIHN0cmVhbVBhcnQudGltZXN0YW1wID0gbmV3IERhdGUoc3RyZWFtUGFydC50aW1lc3RhbXApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoc3RyZWFtUGFydCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgIGNodW5rLmVycm9yXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHJlcXVlc3Q6IHsgYm9keTogYXJncyB9LFxuICAgICAgICByZXNwb25zZTogeyBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMgfVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgYXdhaXQgYXNHYXRld2F5RXJyb3IoZXJyb3IsIGF3YWl0IHBhcnNlQXV0aE1ldGhvZChyZXNvbHZlZEhlYWRlcnMpKTtcbiAgICB9XG4gIH1cbiAgaXNGaWxlUGFydChwYXJ0KSB7XG4gICAgcmV0dXJuIHBhcnQgJiYgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiYgXCJ0eXBlXCIgaW4gcGFydCAmJiBwYXJ0LnR5cGUgPT09IFwiZmlsZVwiO1xuICB9XG4gIC8qKlxuICAgKiBFbmNvZGVzIGZpbGUgcGFydHMgaW4gdGhlIHByb21wdCB0byBiYXNlNjQuIE11dGF0ZXMgdGhlIHBhc3NlZCBvcHRpb25zXG4gICAqIGluc3RhbmNlIGRpcmVjdGx5IHRvIGF2b2lkIGNvcHlpbmcgdGhlIGZpbGUgZGF0YS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyB0byBlbmNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBvcHRpb25zIHdpdGggdGhlIGZpbGUgcGFydHMgZW5jb2RlZC5cbiAgICovXG4gIG1heWJlRW5jb2RlRmlsZVBhcnRzKG9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2Ygb3B0aW9ucy5wcm9tcHQpIHtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBtZXNzYWdlLmNvbnRlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaWxlUGFydChwYXJ0KSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXJ0ID0gcGFydDtcbiAgICAgICAgICBpZiAoZmlsZVBhcnQuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IFVpbnQ4QXJyYXkuZnJvbShmaWxlUGFydC5kYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2U2NERhdGEgPSBCdWZmZXIuZnJvbShidWZmZXIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICAgICAgICAgICAgZmlsZVBhcnQuZGF0YSA9IG5ldyBVUkwoXG4gICAgICAgICAgICAgIGBkYXRhOiR7ZmlsZVBhcnQubWVkaWFUeXBlIHx8IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJ9O2Jhc2U2NCwke2Jhc2U2NERhdGF9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cbiAgZ2V0VXJsKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZy5iYXNlVVJMfS9sYW5ndWFnZS1tb2RlbGA7XG4gIH1cbiAgZ2V0TW9kZWxDb25maWdIZWFkZXJzKG1vZGVsSWQsIHN0cmVhbWluZykge1xuICAgIHJldHVybiB7XG4gICAgICBcImFpLWxhbmd1YWdlLW1vZGVsLXNwZWNpZmljYXRpb24tdmVyc2lvblwiOiBcIjNcIixcbiAgICAgIFwiYWktbGFuZ3VhZ2UtbW9kZWwtaWRcIjogbW9kZWxJZCxcbiAgICAgIFwiYWktbGFuZ3VhZ2UtbW9kZWwtc3RyZWFtaW5nXCI6IFN0cmluZyhzdHJlYW1pbmcpXG4gICAgfTtcbiAgfVxufTtcblxuLy8gc3JjL2dhdGV3YXktZW1iZWRkaW5nLW1vZGVsLnRzXG5pbXBvcnQge1xuICBjb21iaW5lSGVhZGVycyBhcyBjb21iaW5lSGVhZGVyczIsXG4gIGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlciBhcyBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXI1LFxuICBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyIGFzIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXI1LFxuICBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWE3LFxuICBwb3N0SnNvblRvQXBpIGFzIHBvc3RKc29uVG9BcGkyLFxuICByZXNvbHZlIGFzIHJlc29sdmU1LFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hN1xufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6OCB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBHYXRld2F5RW1iZWRkaW5nTW9kZWwgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsSWQsIGNvbmZpZykge1xuICAgIHRoaXMubW9kZWxJZCA9IG1vZGVsSWQ7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9IFwidjNcIjtcbiAgICB0aGlzLm1heEVtYmVkZGluZ3NQZXJDYWxsID0gMjA0ODtcbiAgICB0aGlzLnN1cHBvcnRzUGFyYWxsZWxDYWxscyA9IHRydWU7XG4gIH1cbiAgZ2V0IHByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcm92aWRlcjtcbiAgfVxuICBhc3luYyBkb0VtYmVkKHtcbiAgICB2YWx1ZXMsXG4gICAgaGVhZGVycyxcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBwcm92aWRlck9wdGlvbnNcbiAgfSkge1xuICAgIHZhciBfYTk7XG4gICAgY29uc3QgcmVzb2x2ZWRIZWFkZXJzID0gYXdhaXQgcmVzb2x2ZTUodGhpcy5jb25maWcuaGVhZGVycygpKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge1xuICAgICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIHZhbHVlOiByZXNwb25zZUJvZHksXG4gICAgICAgIHJhd1ZhbHVlXG4gICAgICB9ID0gYXdhaXQgcG9zdEpzb25Ub0FwaTIoe1xuICAgICAgICB1cmw6IHRoaXMuZ2V0VXJsKCksXG4gICAgICAgIGhlYWRlcnM6IGNvbWJpbmVIZWFkZXJzMihcbiAgICAgICAgICByZXNvbHZlZEhlYWRlcnMsXG4gICAgICAgICAgaGVhZGVycyAhPSBudWxsID8gaGVhZGVycyA6IHt9LFxuICAgICAgICAgIHRoaXMuZ2V0TW9kZWxDb25maWdIZWFkZXJzKCksXG4gICAgICAgICAgYXdhaXQgcmVzb2x2ZTUodGhpcy5jb25maWcubzExeUhlYWRlcnMpXG4gICAgICAgICksXG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgLi4ucHJvdmlkZXJPcHRpb25zID8geyBwcm92aWRlck9wdGlvbnMgfSA6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXI1KFxuICAgICAgICAgIGdhdGV3YXlFbWJlZGRpbmdSZXNwb25zZVNjaGVtYVxuICAgICAgICApLFxuICAgICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcjUoe1xuICAgICAgICAgIGVycm9yU2NoZW1hOiB6OC5hbnkoKSxcbiAgICAgICAgICBlcnJvclRvTWVzc2FnZTogKGRhdGEpID0+IGRhdGFcbiAgICAgICAgfSksXG4gICAgICAgIC4uLmFib3J0U2lnbmFsICYmIHsgYWJvcnRTaWduYWwgfSxcbiAgICAgICAgZmV0Y2g6IHRoaXMuY29uZmlnLmZldGNoXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVtYmVkZGluZ3M6IHJlc3BvbnNlQm9keS5lbWJlZGRpbmdzLFxuICAgICAgICB1c2FnZTogKF9hOSA9IHJlc3BvbnNlQm9keS51c2FnZSkgIT0gbnVsbCA/IF9hOSA6IHZvaWQgMCxcbiAgICAgICAgcHJvdmlkZXJNZXRhZGF0YTogcmVzcG9uc2VCb2R5LnByb3ZpZGVyTWV0YWRhdGEsXG4gICAgICAgIHJlc3BvbnNlOiB7IGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycywgYm9keTogcmF3VmFsdWUgfSxcbiAgICAgICAgd2FybmluZ3M6IFtdXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBhd2FpdCBhc0dhdGV3YXlFcnJvcihlcnJvciwgYXdhaXQgcGFyc2VBdXRoTWV0aG9kKHJlc29sdmVkSGVhZGVycykpO1xuICAgIH1cbiAgfVxuICBnZXRVcmwoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuY29uZmlnLmJhc2VVUkx9L2VtYmVkZGluZy1tb2RlbGA7XG4gIH1cbiAgZ2V0TW9kZWxDb25maWdIZWFkZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBcImFpLWVtYmVkZGluZy1tb2RlbC1zcGVjaWZpY2F0aW9uLXZlcnNpb25cIjogXCIzXCIsXG4gICAgICBcImFpLW1vZGVsLWlkXCI6IHRoaXMubW9kZWxJZFxuICAgIH07XG4gIH1cbn07XG52YXIgZ2F0ZXdheUVtYmVkZGluZ1Jlc3BvbnNlU2NoZW1hID0gbGF6eVNjaGVtYTcoXG4gICgpID0+IHpvZFNjaGVtYTcoXG4gICAgejgub2JqZWN0KHtcbiAgICAgIGVtYmVkZGluZ3M6IHo4LmFycmF5KHo4LmFycmF5KHo4Lm51bWJlcigpKSksXG4gICAgICB1c2FnZTogejgub2JqZWN0KHsgdG9rZW5zOiB6OC5udW1iZXIoKSB9KS5udWxsaXNoKCksXG4gICAgICBwcm92aWRlck1ldGFkYXRhOiB6OC5yZWNvcmQoejguc3RyaW5nKCksIHo4LnJlY29yZCh6OC5zdHJpbmcoKSwgejgudW5rbm93bigpKSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG5cbi8vIHNyYy9nYXRld2F5LWltYWdlLW1vZGVsLnRzXG5pbXBvcnQge1xuICBjb21iaW5lSGVhZGVycyBhcyBjb21iaW5lSGVhZGVyczMsXG4gIGNvbnZlcnRVaW50OEFycmF5VG9CYXNlNjQsXG4gIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIgYXMgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjYsXG4gIGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlciBhcyBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXI2LFxuICBwb3N0SnNvblRvQXBpIGFzIHBvc3RKc29uVG9BcGkzLFxuICByZXNvbHZlIGFzIHJlc29sdmU2XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHo5IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIEdhdGV3YXlJbWFnZU1vZGVsID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihtb2RlbElkLCBjb25maWcpIHtcbiAgICB0aGlzLm1vZGVsSWQgPSBtb2RlbElkO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuc3BlY2lmaWNhdGlvblZlcnNpb24gPSBcInYzXCI7XG4gICAgLy8gU2V0IGEgdmVyeSBsYXJnZSBudW1iZXIgdG8gcHJldmVudCBjbGllbnQtc2lkZSBzcGxpdHRpbmcgb2YgcmVxdWVzdHNcbiAgICB0aGlzLm1heEltYWdlc1BlckNhbGwgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgfVxuICBnZXQgcHJvdmlkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb3ZpZGVyO1xuICB9XG4gIGFzeW5jIGRvR2VuZXJhdGUoe1xuICAgIHByb21wdCxcbiAgICBuLFxuICAgIHNpemUsXG4gICAgYXNwZWN0UmF0aW8sXG4gICAgc2VlZCxcbiAgICBmaWxlcyxcbiAgICBtYXNrLFxuICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICBoZWFkZXJzLFxuICAgIGFib3J0U2lnbmFsXG4gIH0pIHtcbiAgICB2YXIgX2E5LCBfYjksIF9jLCBfZDtcbiAgICBjb25zdCByZXNvbHZlZEhlYWRlcnMgPSBhd2FpdCByZXNvbHZlNih0aGlzLmNvbmZpZy5oZWFkZXJzKCkpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgdmFsdWU6IHJlc3BvbnNlQm9keSxcbiAgICAgICAgcmF3VmFsdWVcbiAgICAgIH0gPSBhd2FpdCBwb3N0SnNvblRvQXBpMyh7XG4gICAgICAgIHVybDogdGhpcy5nZXRVcmwoKSxcbiAgICAgICAgaGVhZGVyczogY29tYmluZUhlYWRlcnMzKFxuICAgICAgICAgIHJlc29sdmVkSGVhZGVycyxcbiAgICAgICAgICBoZWFkZXJzICE9IG51bGwgPyBoZWFkZXJzIDoge30sXG4gICAgICAgICAgdGhpcy5nZXRNb2RlbENvbmZpZ0hlYWRlcnMoKSxcbiAgICAgICAgICBhd2FpdCByZXNvbHZlNih0aGlzLmNvbmZpZy5vMTF5SGVhZGVycylcbiAgICAgICAgKSxcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIHByb21wdCxcbiAgICAgICAgICBuLFxuICAgICAgICAgIC4uLnNpemUgJiYgeyBzaXplIH0sXG4gICAgICAgICAgLi4uYXNwZWN0UmF0aW8gJiYgeyBhc3BlY3RSYXRpbyB9LFxuICAgICAgICAgIC4uLnNlZWQgJiYgeyBzZWVkIH0sXG4gICAgICAgICAgLi4ucHJvdmlkZXJPcHRpb25zICYmIHsgcHJvdmlkZXJPcHRpb25zIH0sXG4gICAgICAgICAgLi4uZmlsZXMgJiYge1xuICAgICAgICAgICAgZmlsZXM6IGZpbGVzLm1hcCgoZmlsZSkgPT4gbWF5YmVFbmNvZGVJbWFnZUZpbGUoZmlsZSkpXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5tYXNrICYmIHsgbWFzazogbWF5YmVFbmNvZGVJbWFnZUZpbGUobWFzaykgfVxuICAgICAgICB9LFxuICAgICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyNihcbiAgICAgICAgICBnYXRld2F5SW1hZ2VSZXNwb25zZVNjaGVtYVxuICAgICAgICApLFxuICAgICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcjYoe1xuICAgICAgICAgIGVycm9yU2NoZW1hOiB6OS5hbnkoKSxcbiAgICAgICAgICBlcnJvclRvTWVzc2FnZTogKGRhdGEpID0+IGRhdGFcbiAgICAgICAgfSksXG4gICAgICAgIC4uLmFib3J0U2lnbmFsICYmIHsgYWJvcnRTaWduYWwgfSxcbiAgICAgICAgZmV0Y2g6IHRoaXMuY29uZmlnLmZldGNoXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGltYWdlczogcmVzcG9uc2VCb2R5LmltYWdlcyxcbiAgICAgICAgLy8gQWx3YXlzIGJhc2U2NCBzdHJpbmdzIGZyb20gc2VydmVyXG4gICAgICAgIHdhcm5pbmdzOiAoX2E5ID0gcmVzcG9uc2VCb2R5Lndhcm5pbmdzKSAhPSBudWxsID8gX2E5IDogW10sXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHJlc3BvbnNlQm9keS5wcm92aWRlck1ldGFkYXRhLFxuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIHRpbWVzdGFtcDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksXG4gICAgICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkLFxuICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICAuLi5yZXNwb25zZUJvZHkudXNhZ2UgIT0gbnVsbCAmJiB7XG4gICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiAoX2I5ID0gcmVzcG9uc2VCb2R5LnVzYWdlLmlucHV0VG9rZW5zKSAhPSBudWxsID8gX2I5IDogdm9pZCAwLFxuICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiAoX2MgPSByZXNwb25zZUJvZHkudXNhZ2Uub3V0cHV0VG9rZW5zKSAhPSBudWxsID8gX2MgOiB2b2lkIDAsXG4gICAgICAgICAgICB0b3RhbFRva2VuczogKF9kID0gcmVzcG9uc2VCb2R5LnVzYWdlLnRvdGFsVG9rZW5zKSAhPSBudWxsID8gX2QgOiB2b2lkIDBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGF3YWl0IGFzR2F0ZXdheUVycm9yKGVycm9yLCBhd2FpdCBwYXJzZUF1dGhNZXRob2QocmVzb2x2ZWRIZWFkZXJzKSk7XG4gICAgfVxuICB9XG4gIGdldFVybCgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jb25maWcuYmFzZVVSTH0vaW1hZ2UtbW9kZWxgO1xuICB9XG4gIGdldE1vZGVsQ29uZmlnSGVhZGVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJhaS1pbWFnZS1tb2RlbC1zcGVjaWZpY2F0aW9uLXZlcnNpb25cIjogXCIzXCIsXG4gICAgICBcImFpLW1vZGVsLWlkXCI6IHRoaXMubW9kZWxJZFxuICAgIH07XG4gIH1cbn07XG5mdW5jdGlvbiBtYXliZUVuY29kZUltYWdlRmlsZShmaWxlKSB7XG4gIGlmIChmaWxlLnR5cGUgPT09IFwiZmlsZVwiICYmIGZpbGUuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZmlsZSxcbiAgICAgIGRhdGE6IGNvbnZlcnRVaW50OEFycmF5VG9CYXNlNjQoZmlsZS5kYXRhKVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZpbGU7XG59XG52YXIgcHJvdmlkZXJNZXRhZGF0YUVudHJ5U2NoZW1hID0gejkub2JqZWN0KHtcbiAgaW1hZ2VzOiB6OS5hcnJheSh6OS51bmtub3duKCkpLm9wdGlvbmFsKClcbn0pLmNhdGNoYWxsKHo5LnVua25vd24oKSk7XG52YXIgZ2F0ZXdheUltYWdlV2FybmluZ1NjaGVtYSA9IHo5LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICB6OS5vYmplY3Qoe1xuICAgIHR5cGU6IHo5LmxpdGVyYWwoXCJ1bnN1cHBvcnRlZFwiKSxcbiAgICBmZWF0dXJlOiB6OS5zdHJpbmcoKSxcbiAgICBkZXRhaWxzOiB6OS5zdHJpbmcoKS5vcHRpb25hbCgpXG4gIH0pLFxuICB6OS5vYmplY3Qoe1xuICAgIHR5cGU6IHo5LmxpdGVyYWwoXCJjb21wYXRpYmlsaXR5XCIpLFxuICAgIGZlYXR1cmU6IHo5LnN0cmluZygpLFxuICAgIGRldGFpbHM6IHo5LnN0cmluZygpLm9wdGlvbmFsKClcbiAgfSksXG4gIHo5Lm9iamVjdCh7XG4gICAgdHlwZTogejkubGl0ZXJhbChcIm90aGVyXCIpLFxuICAgIG1lc3NhZ2U6IHo5LnN0cmluZygpXG4gIH0pXG5dKTtcbnZhciBnYXRld2F5SW1hZ2VVc2FnZVNjaGVtYSA9IHo5Lm9iamVjdCh7XG4gIGlucHV0VG9rZW5zOiB6OS5udW1iZXIoKS5udWxsaXNoKCksXG4gIG91dHB1dFRva2VuczogejkubnVtYmVyKCkubnVsbGlzaCgpLFxuICB0b3RhbFRva2VuczogejkubnVtYmVyKCkubnVsbGlzaCgpXG59KTtcbnZhciBnYXRld2F5SW1hZ2VSZXNwb25zZVNjaGVtYSA9IHo5Lm9iamVjdCh7XG4gIGltYWdlczogejkuYXJyYXkoejkuc3RyaW5nKCkpLFxuICAvLyBBbHdheXMgYmFzZTY0IHN0cmluZ3Mgb3ZlciB0aGUgd2lyZVxuICB3YXJuaW5nczogejkuYXJyYXkoZ2F0ZXdheUltYWdlV2FybmluZ1NjaGVtYSkub3B0aW9uYWwoKSxcbiAgcHJvdmlkZXJNZXRhZGF0YTogejkucmVjb3JkKHo5LnN0cmluZygpLCBwcm92aWRlck1ldGFkYXRhRW50cnlTY2hlbWEpLm9wdGlvbmFsKCksXG4gIHVzYWdlOiBnYXRld2F5SW1hZ2VVc2FnZVNjaGVtYS5vcHRpb25hbCgpXG59KTtcblxuLy8gc3JjL2dhdGV3YXktdmlkZW8tbW9kZWwudHNcbmltcG9ydCB7IEFQSUNhbGxFcnJvciBhcyBBUElDYWxsRXJyb3IyIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7XG4gIGNvbWJpbmVIZWFkZXJzIGFzIGNvbWJpbmVIZWFkZXJzNCxcbiAgY29udmVydFVpbnQ4QXJyYXlUb0Jhc2U2NCBhcyBjb252ZXJ0VWludDhBcnJheVRvQmFzZTY0MixcbiAgY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyIGFzIGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlcjcsXG4gIHBhcnNlSnNvbkV2ZW50U3RyZWFtLFxuICBwb3N0SnNvblRvQXBpIGFzIHBvc3RKc29uVG9BcGk0LFxuICByZXNvbHZlIGFzIHJlc29sdmU3XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoxMCB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBHYXRld2F5VmlkZW9Nb2RlbCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IobW9kZWxJZCwgY29uZmlnKSB7XG4gICAgdGhpcy5tb2RlbElkID0gbW9kZWxJZDtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNwZWNpZmljYXRpb25WZXJzaW9uID0gXCJ2M1wiO1xuICAgIC8vIFNldCBhIHZlcnkgbGFyZ2UgbnVtYmVyIHRvIHByZXZlbnQgY2xpZW50LXNpZGUgc3BsaXR0aW5nIG9mIHJlcXVlc3RzXG4gICAgdGhpcy5tYXhWaWRlb3NQZXJDYWxsID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gIH1cbiAgZ2V0IHByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcm92aWRlcjtcbiAgfVxuICBhc3luYyBkb0dlbmVyYXRlKHtcbiAgICBwcm9tcHQsXG4gICAgbixcbiAgICBhc3BlY3RSYXRpbyxcbiAgICByZXNvbHV0aW9uLFxuICAgIGR1cmF0aW9uLFxuICAgIGZwcyxcbiAgICBzZWVkLFxuICAgIGltYWdlLFxuICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICBoZWFkZXJzLFxuICAgIGFib3J0U2lnbmFsXG4gIH0pIHtcbiAgICB2YXIgX2E5O1xuICAgIGNvbnN0IHJlc29sdmVkSGVhZGVycyA9IGF3YWl0IHJlc29sdmU3KHRoaXMuY29uZmlnLmhlYWRlcnMoKSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VIZWFkZXJzLCB2YWx1ZTogcmVzcG9uc2VCb2R5IH0gPSBhd2FpdCBwb3N0SnNvblRvQXBpNCh7XG4gICAgICAgIHVybDogdGhpcy5nZXRVcmwoKSxcbiAgICAgICAgaGVhZGVyczogY29tYmluZUhlYWRlcnM0KFxuICAgICAgICAgIHJlc29sdmVkSGVhZGVycyxcbiAgICAgICAgICBoZWFkZXJzICE9IG51bGwgPyBoZWFkZXJzIDoge30sXG4gICAgICAgICAgdGhpcy5nZXRNb2RlbENvbmZpZ0hlYWRlcnMoKSxcbiAgICAgICAgICBhd2FpdCByZXNvbHZlNyh0aGlzLmNvbmZpZy5vMTF5SGVhZGVycyksXG4gICAgICAgICAgeyBhY2NlcHQ6IFwidGV4dC9ldmVudC1zdHJlYW1cIiB9XG4gICAgICAgICksXG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBwcm9tcHQsXG4gICAgICAgICAgbixcbiAgICAgICAgICAuLi5hc3BlY3RSYXRpbyAmJiB7IGFzcGVjdFJhdGlvIH0sXG4gICAgICAgICAgLi4ucmVzb2x1dGlvbiAmJiB7IHJlc29sdXRpb24gfSxcbiAgICAgICAgICAuLi5kdXJhdGlvbiAmJiB7IGR1cmF0aW9uIH0sXG4gICAgICAgICAgLi4uZnBzICYmIHsgZnBzIH0sXG4gICAgICAgICAgLi4uc2VlZCAmJiB7IHNlZWQgfSxcbiAgICAgICAgICAuLi5wcm92aWRlck9wdGlvbnMgJiYgeyBwcm92aWRlck9wdGlvbnMgfSxcbiAgICAgICAgICAuLi5pbWFnZSAmJiB7IGltYWdlOiBtYXliZUVuY29kZVZpZGVvRmlsZShpbWFnZSkgfVxuICAgICAgICB9LFxuICAgICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBhc3luYyAoe1xuICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICByZXF1ZXN0Qm9keVZhbHVlc1xuICAgICAgICB9KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmJvZHkgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFQSUNhbGxFcnJvcjIoe1xuICAgICAgICAgICAgICBtZXNzYWdlOiBcIlNTRSByZXNwb25zZSBib2R5IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgcmVxdWVzdEJvZHlWYWx1ZXMsXG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGV2ZW50U3RyZWFtID0gcGFyc2VKc29uRXZlbnRTdHJlYW0oe1xuICAgICAgICAgICAgc3RyZWFtOiByZXNwb25zZS5ib2R5LFxuICAgICAgICAgICAgc2NoZW1hOiBnYXRld2F5VmlkZW9FdmVudFNjaGVtYVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHJlYWRlciA9IGV2ZW50U3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWU6IHBhcnNlUmVzdWx0IH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgICAgIGlmIChkb25lIHx8ICFwYXJzZVJlc3VsdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFQSUNhbGxFcnJvcjIoe1xuICAgICAgICAgICAgICBtZXNzYWdlOiBcIlNTRSBzdHJlYW0gZW5kZWQgd2l0aG91dCBhIGRhdGEgZXZlbnRcIixcbiAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICByZXF1ZXN0Qm9keVZhbHVlcyxcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFwYXJzZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQVBJQ2FsbEVycm9yMih7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiRmFpbGVkIHRvIHBhcnNlIHZpZGVvIFNTRSBldmVudFwiLFxuICAgICAgICAgICAgICBjYXVzZTogcGFyc2VSZXN1bHQuZXJyb3IsXG4gICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgcmVxdWVzdEJvZHlWYWx1ZXMsXG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGV2ZW50ID0gcGFyc2VSZXN1bHQudmFsdWU7XG4gICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFQSUNhbGxFcnJvcjIoe1xuICAgICAgICAgICAgICBtZXNzYWdlOiBldmVudC5tZXNzYWdlLFxuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiBldmVudC5zdGF0dXNDb2RlLFxuICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgIHJlcXVlc3RCb2R5VmFsdWVzLFxuICAgICAgICAgICAgICByZXNwb25zZUhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhbLi4ucmVzcG9uc2UuaGVhZGVyc10pLFxuICAgICAgICAgICAgICByZXNwb25zZUJvZHk6IEpTT04uc3RyaW5naWZ5KGV2ZW50KSxcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBldmVudC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZXJyb3JUeXBlLFxuICAgICAgICAgICAgICAgICAgcGFyYW06IGV2ZW50LnBhcmFtXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIHZpZGVvczogZXZlbnQudmlkZW9zLFxuICAgICAgICAgICAgICB3YXJuaW5nczogZXZlbnQud2FybmluZ3MsXG4gICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IGV2ZW50LnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXNwb25zZUhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhbLi4ucmVzcG9uc2UuaGVhZGVyc10pXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXI3KHtcbiAgICAgICAgICBlcnJvclNjaGVtYTogejEwLmFueSgpLFxuICAgICAgICAgIGVycm9yVG9NZXNzYWdlOiAoZGF0YSkgPT4gZGF0YVxuICAgICAgICB9KSxcbiAgICAgICAgLi4uYWJvcnRTaWduYWwgJiYgeyBhYm9ydFNpZ25hbCB9LFxuICAgICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmlkZW9zOiByZXNwb25zZUJvZHkudmlkZW9zLFxuICAgICAgICB3YXJuaW5nczogKF9hOSA9IHJlc3BvbnNlQm9keS53YXJuaW5ncykgIT0gbnVsbCA/IF9hOSA6IFtdLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiByZXNwb25zZUJvZHkucHJvdmlkZXJNZXRhZGF0YSxcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICB0aW1lc3RhbXA6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLFxuICAgICAgICAgIG1vZGVsSWQ6IHRoaXMubW9kZWxJZCxcbiAgICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgYXdhaXQgYXNHYXRld2F5RXJyb3IoZXJyb3IsIGF3YWl0IHBhcnNlQXV0aE1ldGhvZChyZXNvbHZlZEhlYWRlcnMpKTtcbiAgICB9XG4gIH1cbiAgZ2V0VXJsKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZy5iYXNlVVJMfS92aWRlby1tb2RlbGA7XG4gIH1cbiAgZ2V0TW9kZWxDb25maWdIZWFkZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBcImFpLXZpZGVvLW1vZGVsLXNwZWNpZmljYXRpb24tdmVyc2lvblwiOiBcIjNcIixcbiAgICAgIFwiYWktbW9kZWwtaWRcIjogdGhpcy5tb2RlbElkXG4gICAgfTtcbiAgfVxufTtcbmZ1bmN0aW9uIG1heWJlRW5jb2RlVmlkZW9GaWxlKGZpbGUpIHtcbiAgaWYgKGZpbGUudHlwZSA9PT0gXCJmaWxlXCIgJiYgZmlsZS5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5maWxlLFxuICAgICAgZGF0YTogY29udmVydFVpbnQ4QXJyYXlUb0Jhc2U2NDIoZmlsZS5kYXRhKVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZpbGU7XG59XG52YXIgcHJvdmlkZXJNZXRhZGF0YUVudHJ5U2NoZW1hMiA9IHoxMC5vYmplY3Qoe1xuICB2aWRlb3M6IHoxMC5hcnJheSh6MTAudW5rbm93bigpKS5vcHRpb25hbCgpXG59KS5jYXRjaGFsbCh6MTAudW5rbm93bigpKTtcbnZhciBnYXRld2F5VmlkZW9EYXRhU2NoZW1hID0gejEwLnVuaW9uKFtcbiAgejEwLm9iamVjdCh7XG4gICAgdHlwZTogejEwLmxpdGVyYWwoXCJ1cmxcIiksXG4gICAgdXJsOiB6MTAuc3RyaW5nKCksXG4gICAgbWVkaWFUeXBlOiB6MTAuc3RyaW5nKClcbiAgfSksXG4gIHoxMC5vYmplY3Qoe1xuICAgIHR5cGU6IHoxMC5saXRlcmFsKFwiYmFzZTY0XCIpLFxuICAgIGRhdGE6IHoxMC5zdHJpbmcoKSxcbiAgICBtZWRpYVR5cGU6IHoxMC5zdHJpbmcoKVxuICB9KVxuXSk7XG52YXIgZ2F0ZXdheVZpZGVvV2FybmluZ1NjaGVtYSA9IHoxMC5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgejEwLm9iamVjdCh7XG4gICAgdHlwZTogejEwLmxpdGVyYWwoXCJ1bnN1cHBvcnRlZFwiKSxcbiAgICBmZWF0dXJlOiB6MTAuc3RyaW5nKCksXG4gICAgZGV0YWlsczogejEwLnN0cmluZygpLm9wdGlvbmFsKClcbiAgfSksXG4gIHoxMC5vYmplY3Qoe1xuICAgIHR5cGU6IHoxMC5saXRlcmFsKFwiY29tcGF0aWJpbGl0eVwiKSxcbiAgICBmZWF0dXJlOiB6MTAuc3RyaW5nKCksXG4gICAgZGV0YWlsczogejEwLnN0cmluZygpLm9wdGlvbmFsKClcbiAgfSksXG4gIHoxMC5vYmplY3Qoe1xuICAgIHR5cGU6IHoxMC5saXRlcmFsKFwib3RoZXJcIiksXG4gICAgbWVzc2FnZTogejEwLnN0cmluZygpXG4gIH0pXG5dKTtcbnZhciBnYXRld2F5VmlkZW9FdmVudFNjaGVtYSA9IHoxMC5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgejEwLm9iamVjdCh7XG4gICAgdHlwZTogejEwLmxpdGVyYWwoXCJyZXN1bHRcIiksXG4gICAgdmlkZW9zOiB6MTAuYXJyYXkoZ2F0ZXdheVZpZGVvRGF0YVNjaGVtYSksXG4gICAgd2FybmluZ3M6IHoxMC5hcnJheShnYXRld2F5VmlkZW9XYXJuaW5nU2NoZW1hKS5vcHRpb25hbCgpLFxuICAgIHByb3ZpZGVyTWV0YWRhdGE6IHoxMC5yZWNvcmQoejEwLnN0cmluZygpLCBwcm92aWRlck1ldGFkYXRhRW50cnlTY2hlbWEyKS5vcHRpb25hbCgpXG4gIH0pLFxuICB6MTAub2JqZWN0KHtcbiAgICB0eXBlOiB6MTAubGl0ZXJhbChcImVycm9yXCIpLFxuICAgIG1lc3NhZ2U6IHoxMC5zdHJpbmcoKSxcbiAgICBlcnJvclR5cGU6IHoxMC5zdHJpbmcoKSxcbiAgICBzdGF0dXNDb2RlOiB6MTAubnVtYmVyKCksXG4gICAgcGFyYW06IHoxMC51bmtub3duKCkubnVsbGFibGUoKVxuICB9KVxuXSk7XG5cbi8vIHNyYy90b29sL3BhcmFsbGVsLXNlYXJjaC50c1xuaW1wb3J0IHtcbiAgY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWEsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTgsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWE4XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoxMSB9IGZyb20gXCJ6b2RcIjtcbnZhciBwYXJhbGxlbFNlYXJjaElucHV0U2NoZW1hID0gbGF6eVNjaGVtYTgoXG4gICgpID0+IHpvZFNjaGVtYTgoXG4gICAgejExLm9iamVjdCh7XG4gICAgICBvYmplY3RpdmU6IHoxMS5zdHJpbmcoKS5kZXNjcmliZShcbiAgICAgICAgXCJOYXR1cmFsLWxhbmd1YWdlIGRlc2NyaXB0aW9uIG9mIHRoZSB3ZWIgcmVzZWFyY2ggZ29hbCwgaW5jbHVkaW5nIHNvdXJjZSBvciBmcmVzaG5lc3MgZ3VpZGFuY2UgYW5kIGJyb2FkZXIgY29udGV4dCBmcm9tIHRoZSB0YXNrLiBNYXhpbXVtIDUwMDAgY2hhcmFjdGVycy5cIlxuICAgICAgKSxcbiAgICAgIHNlYXJjaF9xdWVyaWVzOiB6MTEuYXJyYXkoejExLnN0cmluZygpKS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgICBcIk9wdGlvbmFsIHNlYXJjaCBxdWVyaWVzIHRvIHN1cHBsZW1lbnQgdGhlIG9iamVjdGl2ZS4gTWF4aW11bSAyMDAgY2hhcmFjdGVycyBwZXIgcXVlcnkuXCJcbiAgICAgICksXG4gICAgICBtb2RlOiB6MTEuZW51bShbXCJvbmUtc2hvdFwiLCBcImFnZW50aWNcIl0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgICAgICdNb2RlIHByZXNldDogXCJvbmUtc2hvdFwiIGZvciBjb21wcmVoZW5zaXZlIHJlc3VsdHMgd2l0aCBsb25nZXIgZXhjZXJwdHMgKGRlZmF1bHQpLCBcImFnZW50aWNcIiBmb3IgY29uY2lzZSwgdG9rZW4tZWZmaWNpZW50IHJlc3VsdHMgZm9yIG11bHRpLXN0ZXAgd29ya2Zsb3dzLidcbiAgICAgICksXG4gICAgICBtYXhfcmVzdWx0czogejExLm51bWJlcigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgICAgIFwiTWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4gKDEtMjApLiBEZWZhdWx0cyB0byAxMCBpZiBub3Qgc3BlY2lmaWVkLlwiXG4gICAgICApLFxuICAgICAgc291cmNlX3BvbGljeTogejExLm9iamVjdCh7XG4gICAgICAgIGluY2x1ZGVfZG9tYWluczogejExLmFycmF5KHoxMS5zdHJpbmcoKSkub3B0aW9uYWwoKS5kZXNjcmliZShcIkxpc3Qgb2YgZG9tYWlucyB0byBpbmNsdWRlIGluIHNlYXJjaCByZXN1bHRzLlwiKSxcbiAgICAgICAgZXhjbHVkZV9kb21haW5zOiB6MTEuYXJyYXkoejExLnN0cmluZygpKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiTGlzdCBvZiBkb21haW5zIHRvIGV4Y2x1ZGUgZnJvbSBzZWFyY2ggcmVzdWx0cy5cIiksXG4gICAgICAgIGFmdGVyX2RhdGU6IHoxMS5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgICAgIFwiT25seSBpbmNsdWRlIHJlc3VsdHMgcHVibGlzaGVkIGFmdGVyIHRoaXMgZGF0ZSAoSVNPIDg2MDEgZm9ybWF0KS5cIlxuICAgICAgICApXG4gICAgICB9KS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgICBcIlNvdXJjZSBwb2xpY3kgZm9yIGNvbnRyb2xsaW5nIHdoaWNoIGRvbWFpbnMgdG8gaW5jbHVkZS9leGNsdWRlIGFuZCBmcmVzaG5lc3MuXCJcbiAgICAgICksXG4gICAgICBleGNlcnB0czogejExLm9iamVjdCh7XG4gICAgICAgIG1heF9jaGFyc19wZXJfcmVzdWx0OiB6MTEubnVtYmVyKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIk1heGltdW0gY2hhcmFjdGVycyBwZXIgcmVzdWx0LlwiKSxcbiAgICAgICAgbWF4X2NoYXJzX3RvdGFsOiB6MTEubnVtYmVyKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIk1heGltdW0gdG90YWwgY2hhcmFjdGVycyBhY3Jvc3MgYWxsIHJlc3VsdHMuXCIpXG4gICAgICB9KS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXhjZXJwdCBjb25maWd1cmF0aW9uIGZvciBjb250cm9sbGluZyByZXN1bHQgbGVuZ3RoLlwiKSxcbiAgICAgIGZldGNoX3BvbGljeTogejExLm9iamVjdCh7XG4gICAgICAgIG1heF9hZ2Vfc2Vjb25kczogejExLm51bWJlcigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgICAgICAgXCJNYXhpbXVtIGFnZSBpbiBzZWNvbmRzIGZvciBjYWNoZWQgY29udGVudC4gU2V0IHRvIDAgdG8gYWx3YXlzIGZldGNoIGZyZXNoIGNvbnRlbnQuXCJcbiAgICAgICAgKVxuICAgICAgfSkub3B0aW9uYWwoKS5kZXNjcmliZShcIkZldGNoIHBvbGljeSBmb3IgY29udHJvbGxpbmcgY29udGVudCBmcmVzaG5lc3MuXCIpXG4gICAgfSlcbiAgKVxuKTtcbnZhciBwYXJhbGxlbFNlYXJjaE91dHB1dFNjaGVtYSA9IGxhenlTY2hlbWE4KFxuICAoKSA9PiB6b2RTY2hlbWE4KFxuICAgIHoxMS51bmlvbihbXG4gICAgICAvLyBTdWNjZXNzIHJlc3BvbnNlXG4gICAgICB6MTEub2JqZWN0KHtcbiAgICAgICAgc2VhcmNoSWQ6IHoxMS5zdHJpbmcoKSxcbiAgICAgICAgcmVzdWx0czogejExLmFycmF5KFxuICAgICAgICAgIHoxMS5vYmplY3Qoe1xuICAgICAgICAgICAgdXJsOiB6MTEuc3RyaW5nKCksXG4gICAgICAgICAgICB0aXRsZTogejExLnN0cmluZygpLFxuICAgICAgICAgICAgZXhjZXJwdDogejExLnN0cmluZygpLFxuICAgICAgICAgICAgcHVibGlzaERhdGU6IHoxMS5zdHJpbmcoKS5udWxsYWJsZSgpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICByZWxldmFuY2VTY29yZTogejExLm51bWJlcigpLm9wdGlvbmFsKClcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9KSxcbiAgICAgIC8vIEVycm9yIHJlc3BvbnNlXG4gICAgICB6MTEub2JqZWN0KHtcbiAgICAgICAgZXJyb3I6IHoxMS5lbnVtKFtcbiAgICAgICAgICBcImFwaV9lcnJvclwiLFxuICAgICAgICAgIFwicmF0ZV9saW1pdFwiLFxuICAgICAgICAgIFwidGltZW91dFwiLFxuICAgICAgICAgIFwiaW52YWxpZF9pbnB1dFwiLFxuICAgICAgICAgIFwiY29uZmlndXJhdGlvbl9lcnJvclwiLFxuICAgICAgICAgIFwidW5rbm93blwiXG4gICAgICAgIF0pLFxuICAgICAgICBzdGF0dXNDb2RlOiB6MTEubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgbWVzc2FnZTogejExLnN0cmluZygpXG4gICAgICB9KVxuICAgIF0pXG4gIClcbik7XG52YXIgcGFyYWxsZWxTZWFyY2hUb29sRmFjdG9yeSA9IGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hKHtcbiAgaWQ6IFwiZ2F0ZXdheS5wYXJhbGxlbF9zZWFyY2hcIixcbiAgaW5wdXRTY2hlbWE6IHBhcmFsbGVsU2VhcmNoSW5wdXRTY2hlbWEsXG4gIG91dHB1dFNjaGVtYTogcGFyYWxsZWxTZWFyY2hPdXRwdXRTY2hlbWFcbn0pO1xudmFyIHBhcmFsbGVsU2VhcmNoID0gKGNvbmZpZyA9IHt9KSA9PiBwYXJhbGxlbFNlYXJjaFRvb2xGYWN0b3J5KGNvbmZpZyk7XG5cbi8vIHNyYy90b29sL3BlcnBsZXhpdHktc2VhcmNoLnRzXG5pbXBvcnQge1xuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSBhcyBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTIsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTksXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWE5XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoxMiB9IGZyb20gXCJ6b2RcIjtcbnZhciBwZXJwbGV4aXR5U2VhcmNoSW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hOShcbiAgKCkgPT4gem9kU2NoZW1hOShcbiAgICB6MTIub2JqZWN0KHtcbiAgICAgIHF1ZXJ5OiB6MTIudW5pb24oW3oxMi5zdHJpbmcoKSwgejEyLmFycmF5KHoxMi5zdHJpbmcoKSldKS5kZXNjcmliZShcbiAgICAgICAgXCJTZWFyY2ggcXVlcnkgKHN0cmluZykgb3IgbXVsdGlwbGUgcXVlcmllcyAoYXJyYXkgb2YgdXAgdG8gNSBzdHJpbmdzKS4gTXVsdGktcXVlcnkgc2VhcmNoZXMgcmV0dXJuIGNvbWJpbmVkIHJlc3VsdHMgZnJvbSBhbGwgcXVlcmllcy5cIlxuICAgICAgKSxcbiAgICAgIG1heF9yZXN1bHRzOiB6MTIubnVtYmVyKCkub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICAgICAgXCJNYXhpbXVtIG51bWJlciBvZiBzZWFyY2ggcmVzdWx0cyB0byByZXR1cm4gKDEtMjAsIGRlZmF1bHQ6IDEwKVwiXG4gICAgICApLFxuICAgICAgbWF4X3Rva2Vuc19wZXJfcGFnZTogejEyLm51bWJlcigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgICAgIFwiTWF4aW11bSBudW1iZXIgb2YgdG9rZW5zIHRvIGV4dHJhY3QgcGVyIHNlYXJjaCByZXN1bHQgcGFnZSAoMjU2LTIwNDgsIGRlZmF1bHQ6IDIwNDgpXCJcbiAgICAgICksXG4gICAgICBtYXhfdG9rZW5zOiB6MTIubnVtYmVyKCkub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICAgICAgXCJNYXhpbXVtIHRvdGFsIHRva2VucyBhY3Jvc3MgYWxsIHNlYXJjaCByZXN1bHRzIChkZWZhdWx0OiAyNTAwMCwgbWF4OiAxMDAwMDAwKVwiXG4gICAgICApLFxuICAgICAgY291bnRyeTogejEyLnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgICAgIFwiVHdvLWxldHRlciBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIGZvciByZWdpb25hbCBzZWFyY2ggcmVzdWx0cyAoZS5nLiwgJ1VTJywgJ0dCJywgJ0ZSJylcIlxuICAgICAgKSxcbiAgICAgIHNlYXJjaF9kb21haW5fZmlsdGVyOiB6MTIuYXJyYXkoejEyLnN0cmluZygpKS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgICBcIkxpc3Qgb2YgZG9tYWlucyB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgZnJvbSBzZWFyY2ggcmVzdWx0cyAobWF4IDIwKS4gVG8gaW5jbHVkZTogWyduYXR1cmUuY29tJywgJ3NjaWVuY2Uub3JnJ10uIFRvIGV4Y2x1ZGU6IFsnLWV4YW1wbGUuY29tJywgJy1zcGFtLm5ldCddXCJcbiAgICAgICksXG4gICAgICBzZWFyY2hfbGFuZ3VhZ2VfZmlsdGVyOiB6MTIuYXJyYXkoejEyLnN0cmluZygpKS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgICBcIkxpc3Qgb2YgSVNPIDYzOS0xIGxhbmd1YWdlIGNvZGVzIHRvIGZpbHRlciByZXN1bHRzIChtYXggMTAsIGxvd2VyY2FzZSkuIEV4YW1wbGVzOiBbJ2VuJywgJ2ZyJywgJ2RlJ11cIlxuICAgICAgKSxcbiAgICAgIHNlYXJjaF9hZnRlcl9kYXRlOiB6MTIuc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICAgICAgXCJJbmNsdWRlIG9ubHkgcmVzdWx0cyBwdWJsaXNoZWQgYWZ0ZXIgdGhpcyBkYXRlLiBGb3JtYXQ6ICdNTS9ERC9ZWVlZJyAoZS5nLiwgJzMvMS8yMDI1JykuIENhbm5vdCBiZSB1c2VkIHdpdGggc2VhcmNoX3JlY2VuY3lfZmlsdGVyLlwiXG4gICAgICApLFxuICAgICAgc2VhcmNoX2JlZm9yZV9kYXRlOiB6MTIuc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICAgICAgXCJJbmNsdWRlIG9ubHkgcmVzdWx0cyBwdWJsaXNoZWQgYmVmb3JlIHRoaXMgZGF0ZS4gRm9ybWF0OiAnTU0vREQvWVlZWScgKGUuZy4sICczLzE1LzIwMjUnKS4gQ2Fubm90IGJlIHVzZWQgd2l0aCBzZWFyY2hfcmVjZW5jeV9maWx0ZXIuXCJcbiAgICAgICksXG4gICAgICBsYXN0X3VwZGF0ZWRfYWZ0ZXJfZmlsdGVyOiB6MTIuc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICAgICAgXCJJbmNsdWRlIG9ubHkgcmVzdWx0cyBsYXN0IHVwZGF0ZWQgYWZ0ZXIgdGhpcyBkYXRlLiBGb3JtYXQ6ICdNTS9ERC9ZWVlZJyAoZS5nLiwgJzMvMS8yMDI1JykuIENhbm5vdCBiZSB1c2VkIHdpdGggc2VhcmNoX3JlY2VuY3lfZmlsdGVyLlwiXG4gICAgICApLFxuICAgICAgbGFzdF91cGRhdGVkX2JlZm9yZV9maWx0ZXI6IHoxMi5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgICBcIkluY2x1ZGUgb25seSByZXN1bHRzIGxhc3QgdXBkYXRlZCBiZWZvcmUgdGhpcyBkYXRlLiBGb3JtYXQ6ICdNTS9ERC9ZWVlZJyAoZS5nLiwgJzMvMTUvMjAyNScpLiBDYW5ub3QgYmUgdXNlZCB3aXRoIHNlYXJjaF9yZWNlbmN5X2ZpbHRlci5cIlxuICAgICAgKSxcbiAgICAgIHNlYXJjaF9yZWNlbmN5X2ZpbHRlcjogejEyLmVudW0oW1wiZGF5XCIsIFwid2Vla1wiLCBcIm1vbnRoXCIsIFwieWVhclwiXSkub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICAgICAgXCJGaWx0ZXIgcmVzdWx0cyBieSByZWxhdGl2ZSB0aW1lIHBlcmlvZC4gQ2Fubm90IGJlIHVzZWQgd2l0aCBzZWFyY2hfYWZ0ZXJfZGF0ZSBvciBzZWFyY2hfYmVmb3JlX2RhdGUuXCJcbiAgICAgIClcbiAgICB9KVxuICApXG4pO1xudmFyIHBlcnBsZXhpdHlTZWFyY2hPdXRwdXRTY2hlbWEgPSBsYXp5U2NoZW1hOShcbiAgKCkgPT4gem9kU2NoZW1hOShcbiAgICB6MTIudW5pb24oW1xuICAgICAgLy8gU3VjY2VzcyByZXNwb25zZVxuICAgICAgejEyLm9iamVjdCh7XG4gICAgICAgIHJlc3VsdHM6IHoxMi5hcnJheShcbiAgICAgICAgICB6MTIub2JqZWN0KHtcbiAgICAgICAgICAgIHRpdGxlOiB6MTIuc3RyaW5nKCksXG4gICAgICAgICAgICB1cmw6IHoxMi5zdHJpbmcoKSxcbiAgICAgICAgICAgIHNuaXBwZXQ6IHoxMi5zdHJpbmcoKSxcbiAgICAgICAgICAgIGRhdGU6IHoxMi5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgbGFzdFVwZGF0ZWQ6IHoxMi5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgaWQ6IHoxMi5zdHJpbmcoKVxuICAgICAgfSksXG4gICAgICAvLyBFcnJvciByZXNwb25zZVxuICAgICAgejEyLm9iamVjdCh7XG4gICAgICAgIGVycm9yOiB6MTIuZW51bShbXG4gICAgICAgICAgXCJhcGlfZXJyb3JcIixcbiAgICAgICAgICBcInJhdGVfbGltaXRcIixcbiAgICAgICAgICBcInRpbWVvdXRcIixcbiAgICAgICAgICBcImludmFsaWRfaW5wdXRcIixcbiAgICAgICAgICBcInVua25vd25cIlxuICAgICAgICBdKSxcbiAgICAgICAgc3RhdHVzQ29kZTogejEyLm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICAgIG1lc3NhZ2U6IHoxMi5zdHJpbmcoKVxuICAgICAgfSlcbiAgICBdKVxuICApXG4pO1xudmFyIHBlcnBsZXhpdHlTZWFyY2hUb29sRmFjdG9yeSA9IGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hMih7XG4gIGlkOiBcImdhdGV3YXkucGVycGxleGl0eV9zZWFyY2hcIixcbiAgaW5wdXRTY2hlbWE6IHBlcnBsZXhpdHlTZWFyY2hJbnB1dFNjaGVtYSxcbiAgb3V0cHV0U2NoZW1hOiBwZXJwbGV4aXR5U2VhcmNoT3V0cHV0U2NoZW1hXG59KTtcbnZhciBwZXJwbGV4aXR5U2VhcmNoID0gKGNvbmZpZyA9IHt9KSA9PiBwZXJwbGV4aXR5U2VhcmNoVG9vbEZhY3RvcnkoY29uZmlnKTtcblxuLy8gc3JjL2dhdGV3YXktdG9vbHMudHNcbnZhciBnYXRld2F5VG9vbHMgPSB7XG4gIC8qKlxuICAgKiBTZWFyY2ggdGhlIHdlYiB1c2luZyBQYXJhbGxlbCBBSSdzIFNlYXJjaCBBUEkgZm9yIExMTS1vcHRpbWl6ZWQgZXhjZXJwdHMuXG4gICAqXG4gICAqIFRha2VzIGEgbmF0dXJhbCBsYW5ndWFnZSBvYmplY3RpdmUgYW5kIHJldHVybnMgcmVsZXZhbnQgZXhjZXJwdHMsXG4gICAqIHJlcGxhY2luZyBtdWx0aXBsZSBrZXl3b3JkIHNlYXJjaGVzIHdpdGggYSBzaW5nbGUgY2FsbCBmb3IgYnJvYWRcbiAgICogb3IgY29tcGxleCBxdWVyaWVzLiBTdXBwb3J0cyBkaWZmZXJlbnQgc2VhcmNoIHR5cGVzIGZvciBkZXB0aCB2c1xuICAgKiBicmVhZHRoIHRyYWRlb2Zmcy5cbiAgICovXG4gIHBhcmFsbGVsU2VhcmNoLFxuICAvKipcbiAgICogU2VhcmNoIHRoZSB3ZWIgdXNpbmcgUGVycGxleGl0eSdzIFNlYXJjaCBBUEkgZm9yIHJlYWwtdGltZSBpbmZvcm1hdGlvbixcbiAgICogbmV3cywgcmVzZWFyY2ggcGFwZXJzLCBhbmQgYXJ0aWNsZXMuXG4gICAqXG4gICAqIFByb3ZpZGVzIHJhbmtlZCBzZWFyY2ggcmVzdWx0cyB3aXRoIGFkdmFuY2VkIGZpbHRlcmluZyBvcHRpb25zIGluY2x1ZGluZ1xuICAgKiBkb21haW4sIGxhbmd1YWdlLCBkYXRlIHJhbmdlLCBhbmQgcmVjZW5jeSBmaWx0ZXJzLlxuICAgKi9cbiAgcGVycGxleGl0eVNlYXJjaFxufTtcblxuLy8gc3JjL3ZlcmNlbC1lbnZpcm9ubWVudC50c1xuaW1wb3J0IHsgZ2V0Q29udGV4dCB9IGZyb20gXCJAdmVyY2VsL29pZGNcIjtcbmltcG9ydCB7IGdldFZlcmNlbE9pZGNUb2tlbiB9IGZyb20gXCJAdmVyY2VsL29pZGNcIjtcbmFzeW5jIGZ1bmN0aW9uIGdldFZlcmNlbFJlcXVlc3RJZCgpIHtcbiAgdmFyIF9hOTtcbiAgcmV0dXJuIChfYTkgPSBnZXRDb250ZXh0KCkuaGVhZGVycykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hOVtcIngtdmVyY2VsLWlkXCJdO1xufVxuXG4vLyBzcmMvZ2F0ZXdheS1wcm92aWRlci50c1xuaW1wb3J0IHsgd2l0aFVzZXJBZ2VudFN1ZmZpeCB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5cbi8vIHNyYy92ZXJzaW9uLnRzXG52YXIgVkVSU0lPTiA9IHRydWUgPyBcIjMuMC44NFwiIDogXCIwLjAuMC10ZXN0XCI7XG5cbi8vIHNyYy9nYXRld2F5LXByb3ZpZGVyLnRzXG52YXIgQUlfR0FURVdBWV9QUk9UT0NPTF9WRVJTSU9OID0gXCIwLjAuMVwiO1xuZnVuY3Rpb24gY3JlYXRlR2F0ZXdheVByb3ZpZGVyKG9wdGlvbnMgPSB7fSkge1xuICB2YXIgX2E5LCBfYjk7XG4gIGxldCBwZW5kaW5nTWV0YWRhdGEgPSBudWxsO1xuICBsZXQgbWV0YWRhdGFDYWNoZSA9IG51bGw7XG4gIGNvbnN0IGNhY2hlUmVmcmVzaE1pbGxpcyA9IChfYTkgPSBvcHRpb25zLm1ldGFkYXRhQ2FjaGVSZWZyZXNoTWlsbGlzKSAhPSBudWxsID8gX2E5IDogMWUzICogNjAgKiA1O1xuICBsZXQgbGFzdEZldGNoVGltZSA9IDA7XG4gIGNvbnN0IGJhc2VVUkwgPSAoX2I5ID0gd2l0aG91dFRyYWlsaW5nU2xhc2gob3B0aW9ucy5iYXNlVVJMKSkgIT0gbnVsbCA/IF9iOSA6IFwiaHR0cHM6Ly9haS1nYXRld2F5LnZlcmNlbC5zaC92My9haVwiO1xuICBjb25zdCBnZXRIZWFkZXJzID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhdXRoID0gYXdhaXQgZ2V0R2F0ZXdheUF1dGhUb2tlbihvcHRpb25zKTtcbiAgICAgIHJldHVybiB3aXRoVXNlckFnZW50U3VmZml4KFxuICAgICAgICB7XG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F1dGgudG9rZW59YCxcbiAgICAgICAgICBcImFpLWdhdGV3YXktcHJvdG9jb2wtdmVyc2lvblwiOiBBSV9HQVRFV0FZX1BST1RPQ09MX1ZFUlNJT04sXG4gICAgICAgICAgW0dBVEVXQVlfQVVUSF9NRVRIT0RfSEVBREVSXTogYXV0aC5hdXRoTWV0aG9kLFxuICAgICAgICAgIC4uLm9wdGlvbnMuaGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBgYWktc2RrL2dhdGV3YXkvJHtWRVJTSU9OfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IEdhdGV3YXlBdXRoZW50aWNhdGlvbkVycm9yLmNyZWF0ZUNvbnRleHR1YWxFcnJvcih7XG4gICAgICAgIGFwaUtleVByb3ZpZGVkOiBmYWxzZSxcbiAgICAgICAgb2lkY1Rva2VuUHJvdmlkZWQ6IGZhbHNlLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDEsXG4gICAgICAgIGNhdXNlOiBlcnJvclxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBjcmVhdGVPMTF5SGVhZGVycyA9ICgpID0+IHtcbiAgICBjb25zdCBkZXBsb3ltZW50SWQgPSBsb2FkT3B0aW9uYWxTZXR0aW5nKHtcbiAgICAgIHNldHRpbmdWYWx1ZTogdm9pZCAwLFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZU5hbWU6IFwiVkVSQ0VMX0RFUExPWU1FTlRfSURcIlxuICAgIH0pO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID0gbG9hZE9wdGlvbmFsU2V0dGluZyh7XG4gICAgICBzZXR0aW5nVmFsdWU6IHZvaWQgMCxcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVOYW1lOiBcIlZFUkNFTF9FTlZcIlxuICAgIH0pO1xuICAgIGNvbnN0IHJlZ2lvbiA9IGxvYWRPcHRpb25hbFNldHRpbmcoe1xuICAgICAgc2V0dGluZ1ZhbHVlOiB2b2lkIDAsXG4gICAgICBlbnZpcm9ubWVudFZhcmlhYmxlTmFtZTogXCJWRVJDRUxfUkVHSU9OXCJcbiAgICB9KTtcbiAgICBjb25zdCBwcm9qZWN0SWQgPSBsb2FkT3B0aW9uYWxTZXR0aW5nKHtcbiAgICAgIHNldHRpbmdWYWx1ZTogdm9pZCAwLFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZU5hbWU6IFwiVkVSQ0VMX1BST0pFQ1RfSURcIlxuICAgIH0pO1xuICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0SWQgPSBhd2FpdCBnZXRWZXJjZWxSZXF1ZXN0SWQoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlcGxveW1lbnRJZCAmJiB7IFwiYWktbzExeS1kZXBsb3ltZW50LWlkXCI6IGRlcGxveW1lbnRJZCB9LFxuICAgICAgICAuLi5lbnZpcm9ubWVudCAmJiB7IFwiYWktbzExeS1lbnZpcm9ubWVudFwiOiBlbnZpcm9ubWVudCB9LFxuICAgICAgICAuLi5yZWdpb24gJiYgeyBcImFpLW8xMXktcmVnaW9uXCI6IHJlZ2lvbiB9LFxuICAgICAgICAuLi5yZXF1ZXN0SWQgJiYgeyBcImFpLW8xMXktcmVxdWVzdC1pZFwiOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgLi4ucHJvamVjdElkICYmIHsgXCJhaS1vMTF5LXByb2plY3QtaWRcIjogcHJvamVjdElkIH1cbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbiAgY29uc3QgY3JlYXRlTGFuZ3VhZ2VNb2RlbCA9IChtb2RlbElkKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBHYXRld2F5TGFuZ3VhZ2VNb2RlbChtb2RlbElkLCB7XG4gICAgICBwcm92aWRlcjogXCJnYXRld2F5XCIsXG4gICAgICBiYXNlVVJMLFxuICAgICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICAgIGZldGNoOiBvcHRpb25zLmZldGNoLFxuICAgICAgbzExeUhlYWRlcnM6IGNyZWF0ZU8xMXlIZWFkZXJzKClcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgZ2V0QXZhaWxhYmxlTW9kZWxzID0gYXN5bmMgKCkgPT4ge1xuICAgIHZhciBfYTEwLCBfYjEwLCBfYztcbiAgICBjb25zdCBub3cgPSAoX2MgPSAoX2IxMCA9IChfYTEwID0gb3B0aW9ucy5faW50ZXJuYWwpID09IG51bGwgPyB2b2lkIDAgOiBfYTEwLmN1cnJlbnREYXRlKSA9PSBudWxsID8gdm9pZCAwIDogX2IxMC5jYWxsKF9hMTApLmdldFRpbWUoKSkgIT0gbnVsbCA/IF9jIDogRGF0ZS5ub3coKTtcbiAgICBpZiAoIXBlbmRpbmdNZXRhZGF0YSB8fCBub3cgLSBsYXN0RmV0Y2hUaW1lID4gY2FjaGVSZWZyZXNoTWlsbGlzKSB7XG4gICAgICBsYXN0RmV0Y2hUaW1lID0gbm93O1xuICAgICAgcGVuZGluZ01ldGFkYXRhID0gbmV3IEdhdGV3YXlGZXRjaE1ldGFkYXRhKHtcbiAgICAgICAgYmFzZVVSTCxcbiAgICAgICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICAgICAgZmV0Y2g6IG9wdGlvbnMuZmV0Y2hcbiAgICAgIH0pLmdldEF2YWlsYWJsZU1vZGVscygpLnRoZW4oKG1ldGFkYXRhKSA9PiB7XG4gICAgICAgIG1ldGFkYXRhQ2FjaGUgPSBtZXRhZGF0YTtcbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgICAgfSkuY2F0Y2goYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICAgIHRocm93IGF3YWl0IGFzR2F0ZXdheUVycm9yKFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIGF3YWl0IHBhcnNlQXV0aE1ldGhvZChhd2FpdCBnZXRIZWFkZXJzKCkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhQ2FjaGUgPyBQcm9taXNlLnJlc29sdmUobWV0YWRhdGFDYWNoZSkgOiBwZW5kaW5nTWV0YWRhdGE7XG4gIH07XG4gIGNvbnN0IGdldENyZWRpdHMgPSBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBHYXRld2F5RmV0Y2hNZXRhZGF0YSh7XG4gICAgICBiYXNlVVJMLFxuICAgICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICAgIGZldGNoOiBvcHRpb25zLmZldGNoXG4gICAgfSkuZ2V0Q3JlZGl0cygpLmNhdGNoKGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgdGhyb3cgYXdhaXQgYXNHYXRld2F5RXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICBhd2FpdCBwYXJzZUF1dGhNZXRob2QoYXdhaXQgZ2V0SGVhZGVycygpKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgZ2V0U3BlbmRSZXBvcnQgPSBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBHYXRld2F5U3BlbmRSZXBvcnQoe1xuICAgICAgYmFzZVVSTCxcbiAgICAgIGhlYWRlcnM6IGdldEhlYWRlcnMsXG4gICAgICBmZXRjaDogb3B0aW9ucy5mZXRjaFxuICAgIH0pLmdldFNwZW5kUmVwb3J0KHBhcmFtcykuY2F0Y2goYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBhd2FpdCBhc0dhdGV3YXlFcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGF3YWl0IHBhcnNlQXV0aE1ldGhvZChhd2FpdCBnZXRIZWFkZXJzKCkpXG4gICAgICApO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBnZXRHZW5lcmF0aW9uSW5mbyA9IGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IEdhdGV3YXlHZW5lcmF0aW9uSW5mb0ZldGNoZXIoe1xuICAgICAgYmFzZVVSTCxcbiAgICAgIGhlYWRlcnM6IGdldEhlYWRlcnMsXG4gICAgICBmZXRjaDogb3B0aW9ucy5mZXRjaFxuICAgIH0pLmdldEdlbmVyYXRpb25JbmZvKHBhcmFtcykuY2F0Y2goYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBhd2FpdCBhc0dhdGV3YXlFcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGF3YWl0IHBhcnNlQXV0aE1ldGhvZChhd2FpdCBnZXRIZWFkZXJzKCkpXG4gICAgICApO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBwcm92aWRlciA9IGZ1bmN0aW9uKG1vZGVsSWQpIHtcbiAgICBpZiAobmV3LnRhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSBHYXRld2F5IFByb3ZpZGVyIG1vZGVsIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IGtleXdvcmQuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVMYW5ndWFnZU1vZGVsKG1vZGVsSWQpO1xuICB9O1xuICBwcm92aWRlci5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9IFwidjNcIjtcbiAgcHJvdmlkZXIuZ2V0QXZhaWxhYmxlTW9kZWxzID0gZ2V0QXZhaWxhYmxlTW9kZWxzO1xuICBwcm92aWRlci5nZXRDcmVkaXRzID0gZ2V0Q3JlZGl0cztcbiAgcHJvdmlkZXIuZ2V0U3BlbmRSZXBvcnQgPSBnZXRTcGVuZFJlcG9ydDtcbiAgcHJvdmlkZXIuZ2V0R2VuZXJhdGlvbkluZm8gPSBnZXRHZW5lcmF0aW9uSW5mbztcbiAgcHJvdmlkZXIuaW1hZ2VNb2RlbCA9IChtb2RlbElkKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBHYXRld2F5SW1hZ2VNb2RlbChtb2RlbElkLCB7XG4gICAgICBwcm92aWRlcjogXCJnYXRld2F5XCIsXG4gICAgICBiYXNlVVJMLFxuICAgICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICAgIGZldGNoOiBvcHRpb25zLmZldGNoLFxuICAgICAgbzExeUhlYWRlcnM6IGNyZWF0ZU8xMXlIZWFkZXJzKClcbiAgICB9KTtcbiAgfTtcbiAgcHJvdmlkZXIubGFuZ3VhZ2VNb2RlbCA9IGNyZWF0ZUxhbmd1YWdlTW9kZWw7XG4gIGNvbnN0IGNyZWF0ZUVtYmVkZGluZ01vZGVsID0gKG1vZGVsSWQpID0+IHtcbiAgICByZXR1cm4gbmV3IEdhdGV3YXlFbWJlZGRpbmdNb2RlbChtb2RlbElkLCB7XG4gICAgICBwcm92aWRlcjogXCJnYXRld2F5XCIsXG4gICAgICBiYXNlVVJMLFxuICAgICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICAgIGZldGNoOiBvcHRpb25zLmZldGNoLFxuICAgICAgbzExeUhlYWRlcnM6IGNyZWF0ZU8xMXlIZWFkZXJzKClcbiAgICB9KTtcbiAgfTtcbiAgcHJvdmlkZXIuZW1iZWRkaW5nTW9kZWwgPSBjcmVhdGVFbWJlZGRpbmdNb2RlbDtcbiAgcHJvdmlkZXIudGV4dEVtYmVkZGluZ01vZGVsID0gY3JlYXRlRW1iZWRkaW5nTW9kZWw7XG4gIHByb3ZpZGVyLnZpZGVvTW9kZWwgPSAobW9kZWxJZCkgPT4ge1xuICAgIHJldHVybiBuZXcgR2F0ZXdheVZpZGVvTW9kZWwobW9kZWxJZCwge1xuICAgICAgcHJvdmlkZXI6IFwiZ2F0ZXdheVwiLFxuICAgICAgYmFzZVVSTCxcbiAgICAgIGhlYWRlcnM6IGdldEhlYWRlcnMsXG4gICAgICBmZXRjaDogb3B0aW9ucy5mZXRjaCxcbiAgICAgIG8xMXlIZWFkZXJzOiBjcmVhdGVPMTF5SGVhZGVycygpXG4gICAgfSk7XG4gIH07XG4gIHByb3ZpZGVyLmNoYXQgPSBwcm92aWRlci5sYW5ndWFnZU1vZGVsO1xuICBwcm92aWRlci5lbWJlZGRpbmcgPSBwcm92aWRlci5lbWJlZGRpbmdNb2RlbDtcbiAgcHJvdmlkZXIuaW1hZ2UgPSBwcm92aWRlci5pbWFnZU1vZGVsO1xuICBwcm92aWRlci52aWRlbyA9IHByb3ZpZGVyLnZpZGVvTW9kZWw7XG4gIHByb3ZpZGVyLnRvb2xzID0gZ2F0ZXdheVRvb2xzO1xuICByZXR1cm4gcHJvdmlkZXI7XG59XG52YXIgZ2F0ZXdheSA9IGNyZWF0ZUdhdGV3YXlQcm92aWRlcigpO1xuYXN5bmMgZnVuY3Rpb24gZ2V0R2F0ZXdheUF1dGhUb2tlbihvcHRpb25zKSB7XG4gIGNvbnN0IGFwaUtleSA9IGxvYWRPcHRpb25hbFNldHRpbmcoe1xuICAgIHNldHRpbmdWYWx1ZTogb3B0aW9ucy5hcGlLZXksXG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZU5hbWU6IFwiQUlfR0FURVdBWV9BUElfS0VZXCJcbiAgfSk7XG4gIGlmIChhcGlLZXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW46IGFwaUtleSxcbiAgICAgIGF1dGhNZXRob2Q6IFwiYXBpLWtleVwiXG4gICAgfTtcbiAgfVxuICBjb25zdCBvaWRjVG9rZW4gPSBhd2FpdCBnZXRWZXJjZWxPaWRjVG9rZW4oKTtcbiAgcmV0dXJuIHtcbiAgICB0b2tlbjogb2lkY1Rva2VuLFxuICAgIGF1dGhNZXRob2Q6IFwib2lkY1wiXG4gIH07XG59XG5leHBvcnQge1xuICBHYXRld2F5QXV0aGVudGljYXRpb25FcnJvcixcbiAgR2F0ZXdheUVycm9yLFxuICBHYXRld2F5SW50ZXJuYWxTZXJ2ZXJFcnJvcixcbiAgR2F0ZXdheUludmFsaWRSZXF1ZXN0RXJyb3IsXG4gIEdhdGV3YXlNb2RlbE5vdEZvdW5kRXJyb3IsXG4gIEdhdGV3YXlSYXRlTGltaXRFcnJvcixcbiAgR2F0ZXdheVJlc3BvbnNlRXJyb3IsXG4gIGNyZWF0ZUdhdGV3YXlQcm92aWRlciBhcyBjcmVhdGVHYXRld2F5LFxuICBjcmVhdGVHYXRld2F5UHJvdmlkZXIsXG4gIGdhdGV3YXlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/.pnpm/@ai-sdk+gateway@3.0.84_zod@3.25.76/node_modules/@ai-sdk/gateway/dist/index.mjs\n");
/***/ })
};
;