esa-pcg-cli 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  exports.INLINE_OVERRIDES = {
3
- "adapters/wrappers/node-server.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod2) => function __require() {\n return mod2 || (0, cb[__getOwnPropNames(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports;\n};\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/runtime/image-config.js\nvar require_image_config = __commonJS({\n \"dist/runtime/image-config.js\"(exports, module) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports._setMatcherForTests = exports._resetImageConfigCacheForTests = exports.validateImageUrl = void 0;\n var fs = require(\"fs\");\n var path = require(\"path\");\n var cachedConfig;\n var cachedMatcher;\n var warnedMatcherMissing = false;\n function configFilePath() {\n return path.resolve(process.cwd(), \".next\", \"required-server-files.json\");\n }\n function loadImageConfig() {\n var _a, _b, _c;\n if (cachedConfig !== void 0)\n return cachedConfig;\n const filePath = configFilePath();\n let raw;\n try {\n raw = fs.readFileSync(filePath, \"utf-8\");\n } catch (err) {\n console.warn(`[image-config] required-server-files.json not found at ${filePath} \\u2014 allowing all image URLs (${(_a = err.code) !== null && _a !== void 0 ? _a : err.message})`);\n cachedConfig = { mode: \"config-missing\" };\n return cachedConfig;\n }\n try {\n const parsed = JSON.parse(raw);\n const images = (_c = (_b = parsed === null || parsed === void 0 ? void 0 : parsed.config) === null || _b === void 0 ? void 0 : _b.images) !== null && _c !== void 0 ? _c : {};\n cachedConfig = {\n mode: \"loaded\",\n images: {\n remotePatterns: Array.isArray(images.remotePatterns) ? images.remotePatterns : [],\n domains: Array.isArray(images.domains) ? images.domains : [],\n unoptimized: images.unoptimized === true\n }\n };\n return cachedConfig;\n } catch (err) {\n console.warn(`[image-config] failed to parse ${filePath}: ${err.message} \\u2014 allowing all image URLs`);\n cachedConfig = { mode: \"config-missing\" };\n return cachedConfig;\n }\n }\n function loadMatcher() {\n if (cachedMatcher !== void 0)\n return cachedMatcher;\n try {\n const dynamicRequire = eval(\"require\");\n const mod = dynamicRequire(\"next/dist/shared/lib/match-remote-pattern\");\n const hasRemoteMatch = mod === null || mod === void 0 ? void 0 : mod.hasRemoteMatch;\n if (typeof hasRemoteMatch !== \"function\") {\n throw new Error(\"hasRemoteMatch not exported\");\n }\n cachedMatcher = hasRemoteMatch;\n return cachedMatcher;\n } catch (err) {\n if (!warnedMatcherMissing) {\n warnedMatcherMissing = true;\n console.warn(`[image-config] cannot load next/dist/shared/lib/match-remote-pattern (${err.message}) \\u2014 falling back to deny-external-only mode`);\n }\n cachedMatcher = null;\n return null;\n }\n }\n function validateImageUrl(absoluteUrl, hostHeader) {\n const cfg = loadImageConfig();\n if (cfg.mode === \"config-missing\") {\n return { ok: true, reason: \"config-missing\" };\n }\n const { images } = cfg;\n if (images.unoptimized) {\n return { ok: true, reason: \"unoptimized\" };\n }\n const reqHost = hostHeader.toLowerCase();\n const urlHost = absoluteUrl.host.toLowerCase();\n if (reqHost && reqHost === urlHost) {\n return { ok: true, reason: \"same-origin\" };\n }\n const matcher = loadMatcher();\n if (matcher === null) {\n return { ok: false, reason: \"matcher-unavailable\" };\n }\n if (matcher(images.domains, images.remotePatterns, absoluteUrl)) {\n return { ok: true, reason: \"pattern-match\" };\n }\n return { ok: false, reason: \"remote-pattern-not-matched\" };\n }\n exports.validateImageUrl = validateImageUrl;\n function _resetImageConfigCacheForTests() {\n cachedConfig = void 0;\n cachedMatcher = void 0;\n warnedMatcherMissing = false;\n }\n exports._resetImageConfigCacheForTests = _resetImageConfigCacheForTests;\n function _setMatcherForTests(impl) {\n cachedMatcher = impl;\n }\n exports._setMatcherForTests = _setMatcherForTests;\n }\n});\n\n// dist/runtime/image-proxy.js\nvar require_image_proxy = __commonJS({\n \"dist/runtime/image-proxy.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.handleImageProxy = void 0;\n var stream_1 = require(\"stream\");\n var gateway_auth_1 = require_gateway_auth();\n var image_config_1 = require_image_config();\n var GATEWAY_TIMEOUT_MS = 1e4;\n var PASSTHROUGH_HEADERS = [\n \"content-type\",\n \"content-length\",\n \"cache-control\",\n \"etag\",\n \"vary\",\n \"last-modified\",\n \"content-security-policy\"\n ];\n function resolveAbsoluteUrl(rawUrl, req) {\n if (rawUrl.startsWith(\"http://\") || rawUrl.startsWith(\"https://\")) {\n return rawUrl;\n }\n const host = req.headers[\"host\"];\n if (!host)\n return null;\n const protoHeader = req.headers[\"x-forwarded-proto\"];\n const proto = (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) || (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) || \"https\";\n const path3 = rawUrl.startsWith(\"/\") ? rawUrl : `/${rawUrl}`;\n return `${proto}://${host}${path3}`;\n }\n function writeJson(res, status, body) {\n res.statusCode = status;\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n }\n async function handleImageProxy(req, res) {\n const reqUrl = req.url || \"\";\n const qIdx = reqUrl.indexOf(\"?\");\n if (qIdx === -1) {\n return writeJson(res, 400, { error: \"Missing query parameters\" });\n }\n const params = new URLSearchParams(reqUrl.slice(qIdx + 1));\n const rawUrl = params.get(\"url\");\n const w = params.get(\"w\");\n const q = params.get(\"q\");\n if (!rawUrl || !w) {\n return writeJson(res, 400, {\n error: \"Missing required parameters: url, w\"\n });\n }\n const absoluteUrl = resolveAbsoluteUrl(rawUrl, req);\n if (!absoluteUrl) {\n return writeJson(res, 500, {\n error: \"Cannot resolve absolute URL: missing Host header\"\n });\n }\n let parsedUrl;\n try {\n parsedUrl = new URL(absoluteUrl);\n } catch (_a) {\n return writeJson(res, 400, { error: \"Invalid url parameter\" });\n }\n const hostHeader = req.headers[\"host\"] || \"\";\n const verdict = (0, image_config_1.validateImageUrl)(parsedUrl, hostHeader);\n if (!verdict.ok) {\n return writeJson(res, 400, { error: \"url not allowed\" });\n }\n const cfg = (0, gateway_auth_1.loadGatewayAuthConfig)();\n if (!cfg) {\n return writeJson(res, 500, {\n error: \"Gateway auth config missing\"\n });\n }\n const upstreamParams = new URLSearchParams({ url: absoluteUrl, w });\n if (q)\n upstreamParams.set(\"q\", q);\n const upstreamPath = `/image/optimize?${upstreamParams}`;\n const ifNoneMatch = req.headers[\"if-none-match\"];\n const upstreamHeaders = {};\n if (typeof ifNoneMatch === \"string\") {\n upstreamHeaders[\"if-none-match\"] = ifNoneMatch;\n }\n const accept = req.headers[\"accept\"];\n if (typeof accept === \"string\") {\n upstreamHeaders[\"accept\"] = accept;\n }\n let upstream;\n try {\n upstream = await (0, gateway_auth_1.gatewayFetch)(cfg, upstreamPath, {\n method: \"GET\",\n headers: upstreamHeaders,\n timeoutMs: GATEWAY_TIMEOUT_MS\n });\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[image-proxy] Gateway timeout after ${GATEWAY_TIMEOUT_MS}ms: ${absoluteUrl}`);\n return writeJson(res, 504, { error: \"Upstream timeout\" });\n }\n console.warn(`[image-proxy] Gateway fetch error: ${err.message} (url=${absoluteUrl})`);\n return writeJson(res, 502, { error: \"Bad gateway\" });\n }\n res.statusCode = upstream.status;\n for (const name of PASSTHROUGH_HEADERS) {\n const value = upstream.headers.get(name);\n if (value !== null) {\n res.setHeader(name, value);\n }\n }\n if (upstream.status === 304 || !upstream.body) {\n res.end();\n return;\n }\n try {\n const nodeStream = stream_1.Readable.fromWeb(upstream.body);\n nodeStream.on(\"error\", (err) => {\n console.warn(`[image-proxy] Stream error: ${err.message}`);\n if (!res.writableEnded)\n res.end();\n });\n nodeStream.pipe(res);\n } catch (err) {\n console.warn(`[image-proxy] Pipe setup failed: ${err.message}`);\n if (!res.headersSent) {\n writeJson(res, 502, { error: \"Stream setup failed\" });\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n }\n exports2.handleImageProxy = handleImageProxy;\n }\n});\n\n// dist/runtime/edge-context.js\nvar require_edge_context = __commonJS({\n \"dist/runtime/edge-context.js\"(exports2) {\n \"use strict\";\n var _a;\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.getEdgeContext = exports2.runWithEdgeContext = exports2.buildEdgeContextFromHeaders = void 0;\n var node_async_hooks_1 = require(\"node:async_hooks\");\n var ALS_KEY = Symbol.for(\"pcg.edgeContext.als\");\n var globalRef = globalThis;\n var storage = (_a = globalRef[ALS_KEY]) !== null && _a !== void 0 ? _a : globalRef[ALS_KEY] = new node_async_hooks_1.AsyncLocalStorage();\n var SITE_ID_HEADER = \"x-alicdn-site-id\";\n var HOSTNAME_HEADER = \"host\";\n var FORWARDED_HOSTNAME_HEADER = \"x-forwarded-host\";\n function pickHeader(headers, name) {\n var _a2;\n return (_a2 = headers[name]) !== null && _a2 !== void 0 ? _a2 : headers[name.toLowerCase()];\n }\n function parseHostname(raw) {\n var _a2;\n if (!raw)\n return void 0;\n const first = (_a2 = raw.split(\",\")[0]) === null || _a2 === void 0 ? void 0 : _a2.trim();\n return first || void 0;\n }\n function parseSiteId(raw) {\n if (!raw)\n return void 0;\n const trimmed = raw.trim();\n if (!trimmed)\n return void 0;\n const n = Number(trimmed);\n return Number.isFinite(n) && trimmed === String(n) ? n : trimmed;\n }\n function buildEdgeContextFromHeaders(headers) {\n var _a2;\n const ctx = {};\n const siteId = parseSiteId(pickHeader(headers, SITE_ID_HEADER));\n if (siteId !== void 0)\n ctx.siteId = siteId;\n const hostname = (_a2 = parseHostname(pickHeader(headers, HOSTNAME_HEADER))) !== null && _a2 !== void 0 ? _a2 : parseHostname(pickHeader(headers, FORWARDED_HOSTNAME_HEADER));\n if (hostname)\n ctx.hostname = hostname;\n return ctx;\n }\n exports2.buildEdgeContextFromHeaders = buildEdgeContextFromHeaders;\n function runWithEdgeContext(headers, fn) {\n const ctx = buildEdgeContextFromHeaders(headers);\n return storage.run(ctx, fn);\n }\n exports2.runWithEdgeContext = runWithEdgeContext;\n function getEdgeContext() {\n var _a2;\n return (_a2 = storage.getStore()) !== null && _a2 !== void 0 ? _a2 : {};\n }\n exports2.getEdgeContext = getEdgeContext;\n }\n});\n\n// dist/adapters/wrappers/node-server.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar http = require(\"http\");\nvar fs2 = require(\"fs\");\nvar path2 = require(\"path\");\nvar image_proxy_1 = require_image_proxy();\nvar edge_context_1 = require_edge_context();\nvar MIME_TYPES = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".map\": \"application/json\",\n \".txt\": \"text/plain\",\n \".webp\": \"image/webp\"\n};\nfunction parseQuery(url) {\n const idx = url.indexOf(\"?\");\n if (idx === -1)\n return {};\n const params = {};\n const searchParams = new URLSearchParams(url.slice(idx + 1));\n for (const [key, value] of searchParams) {\n const existing = params[key];\n if (existing === void 0) {\n params[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n params[key] = [existing, value];\n }\n }\n return params;\n}\nfunction parseCookies(cookieHeader) {\n if (!cookieHeader)\n return {};\n const cookies = {};\n for (const pair of cookieHeader.split(\";\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx === -1)\n continue;\n const name = pair.slice(0, eqIdx).trim();\n const value = pair.slice(eqIdx + 1).trim();\n if (name)\n cookies[name] = value;\n }\n return cookies;\n}\nfunction flattenHeaders(rawHeaders) {\n const headers = {};\n for (const [key, value] of Object.entries(rawHeaders)) {\n if (value === void 0)\n continue;\n headers[key.toLowerCase()] = Array.isArray(value) ? value.join(\", \") : value;\n }\n return headers;\n}\nasync function readBody(req) {\n if (req.method === \"GET\" || req.method === \"HEAD\")\n return void 0;\n return new Promise((resolve, reject) => {\n const chunks = [];\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n}\nfunction serveStaticFile(assetsDir, req, res) {\n var _a, _b;\n const urlPath = (_b = (_a = req.url) === null || _a === void 0 ? void 0 : _a.split(\"?\")[0]) !== null && _b !== void 0 ? _b : \"/\";\n if (urlPath === \"/\" || !urlPath.startsWith(\"/\"))\n return false;\n const filePath = path2.join(assetsDir, urlPath);\n const normalizedPath = path2.normalize(filePath);\n if (!normalizedPath.startsWith(assetsDir)) {\n res.writeHead(403);\n res.end();\n return true;\n }\n let stat;\n try {\n stat = fs2.statSync(normalizedPath);\n } catch (_c) {\n return false;\n }\n if (!stat.isFile())\n return false;\n const ext = path2.extname(normalizedPath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n const isHashedAsset = urlPath.startsWith(\"/_next/static/\");\n res.writeHead(200, {\n \"Content-Type\": contentType,\n \"Content-Length\": stat.size,\n \"Cache-Control\": isHashedAsset ? \"public, max-age=31536000, immutable\" : \"public, max-age=60\"\n });\n fs2.createReadStream(normalizedPath).pipe(res);\n return true;\n}\nfunction bridgeOpenNextHandler(handler) {\n return async (req, res) => {\n var _a, _b, _c, _d, _e, _f;\n try {\n const rawUrl = req.url || \"/\";\n const headers = flattenHeaders(req.headers);\n const body = await readBody(req);\n const host = headers[\"host\"] || `localhost:${(_a = process.env.PORT) !== null && _a !== void 0 ? _a : \"3000\"}`;\n const proto = ((_c = (_b = headers[\"x-forwarded-proto\"]) === null || _b === void 0 ? void 0 : _b.split(\",\")[0]) === null || _c === void 0 ? void 0 : _c.trim()) || \"http\";\n const absoluteUrl = new URL(`${proto}://${host}${rawUrl}`);\n const event = {\n type: \"core\",\n method: req.method || \"GET\",\n rawPath: absoluteUrl.pathname,\n url: absoluteUrl.href,\n body,\n headers,\n query: parseQuery(rawUrl),\n cookies: parseCookies(headers[\"cookie\"]),\n remoteAddress: ((_e = (_d = headers[\"x-forwarded-for\"]) === null || _d === void 0 ? void 0 : _d.split(\",\")[0]) === null || _e === void 0 ? void 0 : _e.trim()) || headers[\"x-real-ip\"] || ((_f = req.socket) === null || _f === void 0 ? void 0 : _f.remoteAddress) || \"127.0.0.1\"\n };\n const abortController = new AbortController();\n res.on(\"close\", () => abortController.abort());\n const streamCreator = {\n writeHeaders(prelude) {\n res.setHeader(\"Set-Cookie\", prelude.cookies);\n res.writeHead(prelude.statusCode, prelude.headers);\n res.flushHeaders();\n return res;\n },\n abortSignal: abortController.signal\n };\n await (0, edge_context_1.runWithEdgeContext)(headers, () => handler(event, { streamCreator }));\n } catch (err) {\n if (!res.headersSent) {\n const isDev = process.env.NODE_ENV !== \"production\";\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: \"Internal Server Error\",\n ...isDev && { message: err.message, stack: err.stack }\n }));\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n };\n}\nasync function wrapper(handler) {\n var _a;\n const port = parseInt((_a = process.env.PORT) !== null && _a !== void 0 ? _a : \"3000\", 10);\n const assetsDir = path2.resolve(process.cwd(), \"..\", \"..\", \"assets\");\n if (!fs2.existsSync(assetsDir)) {\n console.warn(`[pcg-node] assets directory not found at ${assetsDir} \\u2014 static file requests will fall through to Next handler`);\n }\n const dispatchToNext = bridgeOpenNextHandler(handler);\n const server = http.createServer(async (req, res) => {\n var _a2, _b;\n const urlPath = (_b = (_a2 = req.url) === null || _a2 === void 0 ? void 0 : _a2.split(\"?\")[0]) !== null && _b !== void 0 ? _b : \"/\";\n if (urlPath === \"/__health\") {\n res.writeHead(200, { \"Content-Type\": \"text/plain\" });\n res.end(\"OK\");\n return;\n }\n if (urlPath === \"/_next/image\") {\n try {\n await (0, image_proxy_1.handleImageProxy)(req, res);\n } catch (err) {\n console.error(\"[pcg-node] image-proxy error:\", err);\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Image proxy failed\" }));\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n return;\n }\n if (serveStaticFile(assetsDir, req, res))\n return;\n await dispatchToNext(req, res);\n });\n let shuttingDown = false;\n const shutdown = (signal) => {\n if (shuttingDown)\n return;\n shuttingDown = true;\n console.log(`[pcg-node] ${signal} received, shutting down...`);\n server.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 5e3).unref();\n };\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n await new Promise((resolve) => {\n server.listen(port, () => {\n console.log(`[pcg-node] Listening on port ${port}`);\n console.log(`[pcg-node] assets: ${assetsDir}`);\n console.log(`[pcg-node] routes: /__health, /_next/image, /_next/static/*, <next>`);\n resolve();\n });\n });\n}\nvar wrapperDef = {\n wrapper,\n name: \"pcg-node\",\n supportStreaming: true\n};\nexports.default = wrapperDef;\n",
3
+ "adapters/wrappers/node-server.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod2) => function __require() {\n return mod2 || (0, cb[__getOwnPropNames(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports;\n};\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/runtime/image-config.js\nvar require_image_config = __commonJS({\n \"dist/runtime/image-config.js\"(exports, module) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports._setMatcherForTests = exports._resetImageConfigCacheForTests = exports.validateImageUrl = void 0;\n var fs = require(\"fs\");\n var path = require(\"path\");\n var cachedConfig;\n var cachedMatcher;\n var warnedMatcherMissing = false;\n function configFilePath() {\n return path.resolve(process.cwd(), \".next\", \"required-server-files.json\");\n }\n function loadImageConfig() {\n var _a, _b, _c;\n if (cachedConfig !== void 0)\n return cachedConfig;\n const filePath = configFilePath();\n let raw;\n try {\n raw = fs.readFileSync(filePath, \"utf-8\");\n } catch (err) {\n console.warn(`[image-config] required-server-files.json not found at ${filePath} \\u2014 allowing all image URLs (${(_a = err.code) !== null && _a !== void 0 ? _a : err.message})`);\n cachedConfig = { mode: \"config-missing\" };\n return cachedConfig;\n }\n try {\n const parsed = JSON.parse(raw);\n const images = (_c = (_b = parsed === null || parsed === void 0 ? void 0 : parsed.config) === null || _b === void 0 ? void 0 : _b.images) !== null && _c !== void 0 ? _c : {};\n cachedConfig = {\n mode: \"loaded\",\n images: {\n remotePatterns: Array.isArray(images.remotePatterns) ? images.remotePatterns : [],\n domains: Array.isArray(images.domains) ? images.domains : [],\n unoptimized: images.unoptimized === true\n }\n };\n return cachedConfig;\n } catch (err) {\n console.warn(`[image-config] failed to parse ${filePath}: ${err.message} \\u2014 allowing all image URLs`);\n cachedConfig = { mode: \"config-missing\" };\n return cachedConfig;\n }\n }\n function loadMatcher() {\n if (cachedMatcher !== void 0)\n return cachedMatcher;\n try {\n const dynamicRequire = eval(\"require\");\n const mod = dynamicRequire(\"next/dist/shared/lib/match-remote-pattern\");\n const hasRemoteMatch = mod === null || mod === void 0 ? void 0 : mod.hasRemoteMatch;\n if (typeof hasRemoteMatch !== \"function\") {\n throw new Error(\"hasRemoteMatch not exported\");\n }\n cachedMatcher = hasRemoteMatch;\n return cachedMatcher;\n } catch (err) {\n if (!warnedMatcherMissing) {\n warnedMatcherMissing = true;\n console.warn(`[image-config] cannot load next/dist/shared/lib/match-remote-pattern (${err.message}) \\u2014 falling back to deny-external-only mode`);\n }\n cachedMatcher = null;\n return null;\n }\n }\n function validateImageUrl(absoluteUrl, hostHeader) {\n const cfg = loadImageConfig();\n if (cfg.mode === \"config-missing\") {\n return { ok: true, reason: \"config-missing\" };\n }\n const { images } = cfg;\n if (images.unoptimized) {\n return { ok: true, reason: \"unoptimized\" };\n }\n const reqHost = hostHeader.toLowerCase();\n const urlHost = absoluteUrl.host.toLowerCase();\n if (reqHost && reqHost === urlHost) {\n return { ok: true, reason: \"same-origin\" };\n }\n const matcher = loadMatcher();\n if (matcher === null) {\n return { ok: false, reason: \"matcher-unavailable\" };\n }\n if (matcher(images.domains, images.remotePatterns, absoluteUrl)) {\n return { ok: true, reason: \"pattern-match\" };\n }\n return { ok: false, reason: \"remote-pattern-not-matched\" };\n }\n exports.validateImageUrl = validateImageUrl;\n function _resetImageConfigCacheForTests() {\n cachedConfig = void 0;\n cachedMatcher = void 0;\n warnedMatcherMissing = false;\n }\n exports._resetImageConfigCacheForTests = _resetImageConfigCacheForTests;\n function _setMatcherForTests(impl) {\n cachedMatcher = impl;\n }\n exports._setMatcherForTests = _setMatcherForTests;\n }\n});\n\n// dist/runtime/image-proxy.js\nvar require_image_proxy = __commonJS({\n \"dist/runtime/image-proxy.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.handleImageProxy = void 0;\n var stream_1 = require(\"stream\");\n var gateway_auth_1 = require_gateway_auth();\n var image_config_1 = require_image_config();\n var GATEWAY_TIMEOUT_MS = 1e4;\n var PASSTHROUGH_HEADERS = [\n \"content-type\",\n \"content-length\",\n \"cache-control\",\n \"etag\",\n \"vary\",\n \"last-modified\",\n \"content-security-policy\"\n ];\n function resolveAbsoluteUrl(rawUrl, req) {\n if (rawUrl.startsWith(\"http://\") || rawUrl.startsWith(\"https://\")) {\n return rawUrl;\n }\n const host = req.headers[\"host\"];\n if (!host)\n return null;\n const protoHeader = req.headers[\"x-forwarded-proto\"];\n const proto = (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) || (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) || \"https\";\n const path3 = rawUrl.startsWith(\"/\") ? rawUrl : `/${rawUrl}`;\n return `${proto}://${host}${path3}`;\n }\n function writeJson(res, status, body) {\n res.statusCode = status;\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n }\n async function handleImageProxy(req, res) {\n const reqUrl = req.url || \"\";\n const qIdx = reqUrl.indexOf(\"?\");\n if (qIdx === -1) {\n return writeJson(res, 400, { error: \"Missing query parameters\" });\n }\n const params = new URLSearchParams(reqUrl.slice(qIdx + 1));\n const rawUrl = params.get(\"url\");\n const w = params.get(\"w\");\n const q = params.get(\"q\");\n if (!rawUrl || !w) {\n return writeJson(res, 400, {\n error: \"Missing required parameters: url, w\"\n });\n }\n const absoluteUrl = resolveAbsoluteUrl(rawUrl, req);\n if (!absoluteUrl) {\n return writeJson(res, 500, {\n error: \"Cannot resolve absolute URL: missing Host header\"\n });\n }\n let parsedUrl;\n try {\n parsedUrl = new URL(absoluteUrl);\n } catch (_a) {\n return writeJson(res, 400, { error: \"Invalid url parameter\" });\n }\n const hostHeader = req.headers[\"host\"] || \"\";\n const verdict = (0, image_config_1.validateImageUrl)(parsedUrl, hostHeader);\n if (!verdict.ok) {\n return writeJson(res, 400, { error: \"url not allowed\" });\n }\n const cfg = (0, gateway_auth_1.loadGatewayAuthConfig)();\n if (!cfg) {\n return writeJson(res, 500, {\n error: \"Gateway auth config missing\"\n });\n }\n const upstreamParams = new URLSearchParams({ url: absoluteUrl, w });\n if (q)\n upstreamParams.set(\"q\", q);\n const upstreamPath = `/image/optimize?${upstreamParams}`;\n const ifNoneMatch = req.headers[\"if-none-match\"];\n const upstreamHeaders = {};\n if (typeof ifNoneMatch === \"string\") {\n upstreamHeaders[\"if-none-match\"] = ifNoneMatch;\n }\n const accept = req.headers[\"accept\"];\n if (typeof accept === \"string\") {\n upstreamHeaders[\"accept\"] = accept;\n }\n let upstream;\n try {\n upstream = await (0, gateway_auth_1.gatewayFetch)(cfg, upstreamPath, {\n method: \"GET\",\n headers: upstreamHeaders,\n timeoutMs: GATEWAY_TIMEOUT_MS\n });\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[image-proxy] Gateway timeout after ${GATEWAY_TIMEOUT_MS}ms: ${absoluteUrl}`);\n return writeJson(res, 504, { error: \"Upstream timeout\" });\n }\n console.warn(`[image-proxy] Gateway fetch error: ${err.message} (url=${absoluteUrl})`);\n return writeJson(res, 502, { error: \"Bad gateway\" });\n }\n res.statusCode = upstream.status;\n for (const name of PASSTHROUGH_HEADERS) {\n const value = upstream.headers.get(name);\n if (value !== null) {\n res.setHeader(name, value);\n }\n }\n if (upstream.status === 304 || !upstream.body) {\n res.end();\n return;\n }\n try {\n const nodeStream = stream_1.Readable.fromWeb(upstream.body);\n nodeStream.on(\"error\", (err) => {\n console.warn(`[image-proxy] Stream error: ${err.message}`);\n if (!res.writableEnded)\n res.end();\n });\n nodeStream.pipe(res);\n } catch (err) {\n console.warn(`[image-proxy] Pipe setup failed: ${err.message}`);\n if (!res.headersSent) {\n writeJson(res, 502, { error: \"Stream setup failed\" });\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n }\n exports2.handleImageProxy = handleImageProxy;\n }\n});\n\n// dist/runtime/edge-context.js\nvar require_edge_context = __commonJS({\n \"dist/runtime/edge-context.js\"(exports2) {\n \"use strict\";\n var _a;\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.getCacheTags = exports2.setCacheTags = exports2.getEdgeContext = exports2.runWithEdgeContext = exports2.buildEdgeContextFromHeaders = void 0;\n var node_async_hooks_1 = require(\"node:async_hooks\");\n var ALS_KEY = Symbol.for(\"pcg.edgeContext.als\");\n var globalRef = globalThis;\n var storage = (_a = globalRef[ALS_KEY]) !== null && _a !== void 0 ? _a : globalRef[ALS_KEY] = new node_async_hooks_1.AsyncLocalStorage();\n var SITE_ID_HEADER = \"x-alicdn-site-id\";\n var HOSTNAME_HEADER = \"host\";\n var FORWARDED_HOSTNAME_HEADER = \"x-forwarded-host\";\n function pickHeader(headers, name) {\n var _a2;\n return (_a2 = headers[name]) !== null && _a2 !== void 0 ? _a2 : headers[name.toLowerCase()];\n }\n function parseHostname(raw) {\n var _a2;\n if (!raw)\n return void 0;\n const first = (_a2 = raw.split(\",\")[0]) === null || _a2 === void 0 ? void 0 : _a2.trim();\n return first || void 0;\n }\n function parseSiteId(raw) {\n if (!raw)\n return void 0;\n const trimmed = raw.trim();\n if (!trimmed)\n return void 0;\n const n = Number(trimmed);\n return Number.isFinite(n) && trimmed === String(n) ? n : trimmed;\n }\n function buildEdgeContextFromHeaders(headers) {\n var _a2;\n const ctx = {};\n const siteId = parseSiteId(pickHeader(headers, SITE_ID_HEADER));\n if (siteId !== void 0)\n ctx.siteId = siteId;\n const hostname = (_a2 = parseHostname(pickHeader(headers, HOSTNAME_HEADER))) !== null && _a2 !== void 0 ? _a2 : parseHostname(pickHeader(headers, FORWARDED_HOSTNAME_HEADER));\n if (hostname)\n ctx.hostname = hostname;\n return ctx;\n }\n exports2.buildEdgeContextFromHeaders = buildEdgeContextFromHeaders;\n function runWithEdgeContext(headers, fn) {\n const ctx = buildEdgeContextFromHeaders(headers);\n return storage.run(ctx, fn);\n }\n exports2.runWithEdgeContext = runWithEdgeContext;\n function getEdgeContext() {\n var _a2;\n return (_a2 = storage.getStore()) !== null && _a2 !== void 0 ? _a2 : {};\n }\n exports2.getEdgeContext = getEdgeContext;\n function setCacheTags(tags) {\n const store = storage.getStore();\n if (store)\n store.cacheTags = tags;\n }\n exports2.setCacheTags = setCacheTags;\n function getCacheTags() {\n var _a2;\n return (_a2 = storage.getStore()) === null || _a2 === void 0 ? void 0 : _a2.cacheTags;\n }\n exports2.getCacheTags = getCacheTags;\n }\n});\n\n// dist/adapters/wrappers/node-server.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar http = require(\"http\");\nvar fs2 = require(\"fs\");\nvar path2 = require(\"path\");\nvar image_proxy_1 = require_image_proxy();\nvar edge_context_1 = require_edge_context();\nvar MIME_TYPES = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".map\": \"application/json\",\n \".txt\": \"text/plain\",\n \".webp\": \"image/webp\"\n};\nfunction parseQuery(url) {\n const idx = url.indexOf(\"?\");\n if (idx === -1)\n return {};\n const params = {};\n const searchParams = new URLSearchParams(url.slice(idx + 1));\n for (const [key, value] of searchParams) {\n const existing = params[key];\n if (existing === void 0) {\n params[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n params[key] = [existing, value];\n }\n }\n return params;\n}\nfunction parseCookies(cookieHeader) {\n if (!cookieHeader)\n return {};\n const cookies = {};\n for (const pair of cookieHeader.split(\";\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx === -1)\n continue;\n const name = pair.slice(0, eqIdx).trim();\n const value = pair.slice(eqIdx + 1).trim();\n if (name)\n cookies[name] = value;\n }\n return cookies;\n}\nfunction flattenHeaders(rawHeaders) {\n const headers = {};\n for (const [key, value] of Object.entries(rawHeaders)) {\n if (value === void 0)\n continue;\n headers[key.toLowerCase()] = Array.isArray(value) ? value.join(\", \") : value;\n }\n return headers;\n}\nasync function readBody(req) {\n if (req.method === \"GET\" || req.method === \"HEAD\")\n return void 0;\n return new Promise((resolve, reject) => {\n const chunks = [];\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n}\nfunction serveStaticFile(assetsDir, req, res) {\n var _a, _b;\n const urlPath = (_b = (_a = req.url) === null || _a === void 0 ? void 0 : _a.split(\"?\")[0]) !== null && _b !== void 0 ? _b : \"/\";\n if (urlPath === \"/\" || !urlPath.startsWith(\"/\"))\n return false;\n const filePath = path2.join(assetsDir, urlPath);\n const normalizedPath = path2.normalize(filePath);\n if (!normalizedPath.startsWith(assetsDir)) {\n res.writeHead(403);\n res.end();\n return true;\n }\n let stat;\n try {\n stat = fs2.statSync(normalizedPath);\n } catch (_c) {\n return false;\n }\n if (!stat.isFile())\n return false;\n const ext = path2.extname(normalizedPath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n const isHashedAsset = urlPath.startsWith(\"/_next/static/\");\n res.writeHead(200, {\n \"Content-Type\": contentType,\n \"Content-Length\": stat.size,\n \"Cache-Control\": isHashedAsset ? \"public, max-age=31536000, immutable\" : \"public, max-age=60\"\n });\n fs2.createReadStream(normalizedPath).pipe(res);\n return true;\n}\nfunction bridgeOpenNextHandler(handler) {\n return async (req, res) => {\n var _a, _b, _c, _d, _e, _f;\n try {\n const rawUrl = req.url || \"/\";\n const headers = flattenHeaders(req.headers);\n const body = await readBody(req);\n const host = headers[\"host\"] || `localhost:${(_a = process.env.PORT) !== null && _a !== void 0 ? _a : \"3000\"}`;\n const proto = ((_c = (_b = headers[\"x-forwarded-proto\"]) === null || _b === void 0 ? void 0 : _b.split(\",\")[0]) === null || _c === void 0 ? void 0 : _c.trim()) || \"http\";\n const absoluteUrl = new URL(`${proto}://${host}${rawUrl}`);\n const event = {\n type: \"core\",\n method: req.method || \"GET\",\n rawPath: absoluteUrl.pathname,\n url: absoluteUrl.href,\n body,\n headers,\n query: parseQuery(rawUrl),\n cookies: parseCookies(headers[\"cookie\"]),\n remoteAddress: ((_e = (_d = headers[\"x-forwarded-for\"]) === null || _d === void 0 ? void 0 : _d.split(\",\")[0]) === null || _e === void 0 ? void 0 : _e.trim()) || headers[\"x-real-ip\"] || ((_f = req.socket) === null || _f === void 0 ? void 0 : _f.remoteAddress) || \"127.0.0.1\"\n };\n const abortController = new AbortController();\n res.on(\"close\", () => abortController.abort());\n const streamCreator = {\n writeHeaders(prelude) {\n const cacheTags = (0, edge_context_1.getCacheTags)();\n if (cacheTags) {\n res.setHeader(\"Cache-Tag\", cacheTags);\n }\n res.setHeader(\"Set-Cookie\", prelude.cookies);\n res.writeHead(prelude.statusCode, prelude.headers);\n res.flushHeaders();\n return res;\n },\n abortSignal: abortController.signal\n };\n await (0, edge_context_1.runWithEdgeContext)(headers, () => handler(event, { streamCreator }));\n } catch (err) {\n if (!res.headersSent) {\n const isDev = process.env.NODE_ENV !== \"production\";\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: \"Internal Server Error\",\n ...isDev && { message: err.message, stack: err.stack }\n }));\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n };\n}\nasync function wrapper(handler) {\n var _a;\n const port = parseInt((_a = process.env.PORT) !== null && _a !== void 0 ? _a : \"3000\", 10);\n const assetsDir = path2.resolve(process.cwd(), \"..\", \"..\", \"assets\");\n if (!fs2.existsSync(assetsDir)) {\n console.warn(`[pcg-node] assets directory not found at ${assetsDir} \\u2014 static file requests will fall through to Next handler`);\n }\n const dispatchToNext = bridgeOpenNextHandler(handler);\n const server = http.createServer(async (req, res) => {\n var _a2, _b;\n const urlPath = (_b = (_a2 = req.url) === null || _a2 === void 0 ? void 0 : _a2.split(\"?\")[0]) !== null && _b !== void 0 ? _b : \"/\";\n if (urlPath === \"/__health\") {\n res.writeHead(200, { \"Content-Type\": \"text/plain\" });\n res.end(\"OK\");\n return;\n }\n if (urlPath === \"/_next/image\") {\n try {\n await (0, image_proxy_1.handleImageProxy)(req, res);\n } catch (err) {\n console.error(\"[pcg-node] image-proxy error:\", err);\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Image proxy failed\" }));\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n return;\n }\n if (serveStaticFile(assetsDir, req, res))\n return;\n await dispatchToNext(req, res);\n });\n let shuttingDown = false;\n const shutdown = (signal) => {\n if (shuttingDown)\n return;\n shuttingDown = true;\n console.log(`[pcg-node] ${signal} received, shutting down...`);\n server.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 5e3).unref();\n };\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n await new Promise((resolve) => {\n server.listen(port, () => {\n console.log(`[pcg-node] Listening on port ${port}`);\n console.log(`[pcg-node] assets: ${assetsDir}`);\n console.log(`[pcg-node] routes: /__health, /_next/image, /_next/static/*, <next>`);\n resolve();\n });\n });\n}\nvar wrapperDef = {\n wrapper,\n name: \"pcg-node\",\n supportStreaming: true\n};\nexports.default = wrapperDef;\n",
4
4
  "adapters/converters/passthrough.js": "\"use strict\";\n\n// dist/adapters/converters/passthrough.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar converter = {\n convertFrom: async (event) => event,\n convertTo: async (result) => result,\n name: \"passthrough\"\n};\nexports.default = converter;\n",
5
- "overrides/incrementalCache/gateway.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\n\n// dist/_protocol/types.js\nvar require_types = __commonJS({\n \"dist/_protocol/types.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n }\n});\n\n// dist/_protocol/keys.js\nvar require_keys = __commonJS({\n \"dist/_protocol/keys.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.buildPageMetadataKey = exports2.buildTagKey = exports2.buildStaticAssetKey = exports2.buildOssKey = void 0;\n function stripLeadingSlash(s) {\n return s.replace(/^\\/+/, \"\");\n }\n function buildOssKey(params) {\n const { appId, buildId, cacheType = \"cache\" } = params;\n const key = stripLeadingSlash(params.key);\n if (cacheType === \"fetch\") {\n return `${appId}/__fetch/${buildId}/${key}`;\n }\n return `${appId}/${buildId}/${key}.cache`;\n }\n exports2.buildOssKey = buildOssKey;\n function buildStaticAssetKey(params) {\n const p = stripLeadingSlash(params.path);\n return `${params.appId}/_next/static/${p}`;\n }\n exports2.buildStaticAssetKey = buildStaticAssetKey;\n function buildTagKey(params) {\n return {\n app_id: params.appId,\n tag: `${params.buildId}/${params.tag}`,\n path: `${params.buildId}/${params.path}`\n };\n }\n exports2.buildTagKey = buildTagKey;\n function buildPageMetadataKey(params) {\n return {\n app_id: params.appId,\n url: params.url\n };\n }\n exports2.buildPageMetadataKey = buildPageMetadataKey;\n }\n});\n\n// dist/_protocol/endpoints.js\nvar require_endpoints = __commonJS({\n \"dist/_protocol/endpoints.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.buildCentralEndpoints = void 0;\n function stripTrailingSlashes(s) {\n return s.replace(/\\/+$/, \"\");\n }\n function buildCentralEndpoints(base) {\n const b = stripTrailingSlashes(base);\n return {\n base: b,\n cache: `${b}/cache`,\n cacheRefresh: `${b}/cache/refresh`,\n revalidateTag: `${b}/revalidate/tag`,\n revalidatePath: `${b}/revalidate/path`,\n tagByTag: `${b}/tag/by-tag`,\n tagByPath: `${b}/tag/by-path`,\n tagLastModified: `${b}/tag/last-modified`,\n tagWrite: `${b}/tag/write`,\n deploySts: `${b}/deploy/sts-token`,\n deployTags: `${b}/deploy/tags`\n };\n }\n exports2.buildCentralEndpoints = buildCentralEndpoints;\n }\n});\n\n// dist/_protocol/index.js\nvar require_protocol = __commonJS({\n \"dist/_protocol/index.js\"(exports2) {\n \"use strict\";\n var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n if (k2 === void 0) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() {\n return m[k];\n } };\n }\n Object.defineProperty(o, k2, desc);\n } : function(o, m, k, k2) {\n if (k2 === void 0) k2 = k;\n o[k2] = m[k];\n });\n var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);\n };\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n __exportStar(require_types(), exports2);\n __exportStar(require_keys(), exports2);\n __exportStar(require_endpoints(), exports2);\n }\n});\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/overrides/incrementalCache/gateway.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar protocol_1 = require_protocol();\nvar gateway_auth_1 = require_gateway_auth();\nvar GET_TIMEOUT = 5e3;\nvar SET_TIMEOUT = 1e4;\nvar DELETE_TIMEOUT = 5e3;\nfunction buildKey(config, key, isFetch) {\n return (0, protocol_1.buildOssKey)({\n appId: `${config.aliuid}/${config.routinename}`,\n buildId: config.version,\n key,\n cacheType: isFetch ? \"fetch\" : \"cache\"\n });\n}\nvar GatewayIncrementalCache = class {\n constructor() {\n this.name = \"gateway-incremental-cache\";\n this.config = null;\n this.configLoaded = false;\n }\n /**\n * 延迟加载配置,避免在构造函数中因环境变量缺失而阻塞 Function 启动。\n */\n getConfig() {\n if (!this.configLoaded) {\n this.config = (0, gateway_auth_1.loadGatewayAuthConfig)();\n this.configLoaded = true;\n }\n return this.config;\n }\n /**\n * 从 Gateway 读取缓存。\n */\n async get(key, isFetch) {\n const config = this.getConfig();\n if (!config)\n return null;\n const ossKey = buildKey(config, key, isFetch);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {\n method: \"GET\",\n timeoutMs: GET_TIMEOUT\n });\n if (res.status === 404)\n return null;\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[incrementalCache] GET \\u88AB\\u62D2\\u7EDD: key=\"${ossKey}\" (${res.status})\\uFF0C\\u8BF7\\u68C0\\u67E5\\u7B7E\\u540D secret \\u6216 key \\u524D\\u7F00`);\n } else {\n console.warn(`[incrementalCache] GET \\u5931\\u8D25: key=\"${ossKey}\", \\u72B6\\u6001\\u7801=${res.status}`);\n }\n return null;\n }\n const body = await res.text();\n let envelope;\n try {\n envelope = JSON.parse(body);\n } catch (_a) {\n console.warn(`[incrementalCache] JSON \\u89E3\\u6790\\u5931\\u8D25: key=\"${ossKey}\"`);\n return null;\n }\n if (!envelope || typeof envelope !== \"object\" || typeof envelope.lastModified !== \"number\") {\n console.warn(`[incrementalCache] envelope \\u683C\\u5F0F\\u5F02\\u5E38\\u6216\\u7F3A lastModified: key=\"${ossKey}\"`);\n return null;\n }\n return { value: envelope.value, lastModified: envelope.lastModified };\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[incrementalCache] GET \\u8D85\\u65F6: key=\"${ossKey}\" (${GET_TIMEOUT}ms)`);\n } else {\n console.warn(`[incrementalCache] GET \\u5F02\\u5E38: key=\"${ossKey}\", ${err.message}`);\n }\n return null;\n }\n }\n /**\n * 向 Gateway 写入缓存。\n */\n async set(key, value, isFetch) {\n const config = this.getConfig();\n if (!config)\n return;\n const ossKey = buildKey(config, key, isFetch);\n const body = JSON.stringify({ lastModified: Date.now(), value });\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n timeoutMs: SET_TIMEOUT\n });\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[incrementalCache] PUT \\u88AB\\u62D2\\u7EDD: key=\"${ossKey}\" (${res.status})\\uFF0C\\u8BF7\\u68C0\\u67E5\\u7B7E\\u540D secret \\u6216 key \\u524D\\u7F00`);\n } else {\n console.warn(`[incrementalCache] PUT \\u5931\\u8D25: key=\"${ossKey}\", \\u72B6\\u6001\\u7801=${res.status}`);\n }\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[incrementalCache] PUT \\u8D85\\u65F6: key=\"${ossKey}\" (${SET_TIMEOUT}ms)`);\n } else {\n console.warn(`[incrementalCache] PUT \\u5F02\\u5E38: key=\"${ossKey}\", ${err.message}`);\n }\n }\n }\n /**\n * 通过 Gateway 删除缓存。\n */\n async delete(key, isFetch) {\n const config = this.getConfig();\n if (!config)\n return;\n const ossKey = buildKey(config, key, isFetch);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {\n method: \"DELETE\",\n timeoutMs: DELETE_TIMEOUT\n });\n if (res.status === 404)\n return;\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[incrementalCache] DELETE \\u88AB\\u62D2\\u7EDD: key=\"${ossKey}\" (${res.status})\\uFF0C\\u8BF7\\u68C0\\u67E5\\u7B7E\\u540D secret \\u6216 key \\u524D\\u7F00`);\n } else {\n console.warn(`[incrementalCache] DELETE \\u5931\\u8D25: key=\"${ossKey}\", \\u72B6\\u6001\\u7801=${res.status}`);\n }\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[incrementalCache] DELETE \\u8D85\\u65F6: key=\"${ossKey}\" (${DELETE_TIMEOUT}ms)`);\n } else {\n console.warn(`[incrementalCache] DELETE \\u5F02\\u5E38: key=\"${ossKey}\", ${err.message}`);\n }\n }\n }\n};\nexports.default = GatewayIncrementalCache;\n",
6
- "overrides/tagCache/gateway.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/runtime/edge-context.js\nvar require_edge_context = __commonJS({\n \"dist/runtime/edge-context.js\"(exports2) {\n \"use strict\";\n var _a;\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.getEdgeContext = exports2.runWithEdgeContext = exports2.buildEdgeContextFromHeaders = void 0;\n var node_async_hooks_1 = require(\"node:async_hooks\");\n var ALS_KEY = Symbol.for(\"pcg.edgeContext.als\");\n var globalRef = globalThis;\n var storage = (_a = globalRef[ALS_KEY]) !== null && _a !== void 0 ? _a : globalRef[ALS_KEY] = new node_async_hooks_1.AsyncLocalStorage();\n var SITE_ID_HEADER = \"x-alicdn-site-id\";\n var HOSTNAME_HEADER = \"host\";\n var FORWARDED_HOSTNAME_HEADER = \"x-forwarded-host\";\n function pickHeader(headers, name) {\n var _a2;\n return (_a2 = headers[name]) !== null && _a2 !== void 0 ? _a2 : headers[name.toLowerCase()];\n }\n function parseHostname(raw) {\n var _a2;\n if (!raw)\n return void 0;\n const first = (_a2 = raw.split(\",\")[0]) === null || _a2 === void 0 ? void 0 : _a2.trim();\n return first || void 0;\n }\n function parseSiteId(raw) {\n if (!raw)\n return void 0;\n const trimmed = raw.trim();\n if (!trimmed)\n return void 0;\n const n = Number(trimmed);\n return Number.isFinite(n) && trimmed === String(n) ? n : trimmed;\n }\n function buildEdgeContextFromHeaders(headers) {\n var _a2;\n const ctx = {};\n const siteId = parseSiteId(pickHeader(headers, SITE_ID_HEADER));\n if (siteId !== void 0)\n ctx.siteId = siteId;\n const hostname = (_a2 = parseHostname(pickHeader(headers, HOSTNAME_HEADER))) !== null && _a2 !== void 0 ? _a2 : parseHostname(pickHeader(headers, FORWARDED_HOSTNAME_HEADER));\n if (hostname)\n ctx.hostname = hostname;\n return ctx;\n }\n exports2.buildEdgeContextFromHeaders = buildEdgeContextFromHeaders;\n function runWithEdgeContext(headers, fn) {\n const ctx = buildEdgeContextFromHeaders(headers);\n return storage.run(ctx, fn);\n }\n exports2.runWithEdgeContext = runWithEdgeContext;\n function getEdgeContext() {\n var _a2;\n return (_a2 = storage.getStore()) !== null && _a2 !== void 0 ? _a2 : {};\n }\n exports2.getEdgeContext = getEdgeContext;\n }\n});\n\n// dist/runtime/build-id.js\nvar require_build_id = __commonJS({\n \"dist/runtime/build-id.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.__setBuildIdForTest = exports2.__resetBuildIdCache = exports2.loadBuildId = void 0;\n var fs = require(\"fs\");\n var path = require(\"path\");\n var cached;\n function loadBuildId() {\n var _a;\n if (cached !== void 0)\n return cached;\n const p = path.join(__dirname, \".next\", \"BUILD_ID\");\n try {\n const v = fs.readFileSync(p, \"utf-8\").trim();\n cached = v || null;\n } catch (err) {\n if ((err === null || err === void 0 ? void 0 : err.code) !== \"ENOENT\") {\n console.warn(`[build-id] BUILD_ID read error ${p}: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);\n } else {\n console.warn(`[build-id] BUILD_ID not found at ${p}`);\n }\n cached = null;\n }\n return cached;\n }\n exports2.loadBuildId = loadBuildId;\n function __resetBuildIdCache() {\n cached = void 0;\n }\n exports2.__resetBuildIdCache = __resetBuildIdCache;\n function __setBuildIdForTest(v) {\n cached = v;\n }\n exports2.__setBuildIdForTest = __setBuildIdForTest;\n }\n});\n\n// dist/runtime/cdn-purge.js\nvar require_cdn_purge = __commonJS({\n \"dist/runtime/cdn-purge.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.createCdnPurgeClient = exports2.loadCdnPurgeConfig = void 0;\n var fs = require(\"fs\");\n var path = require(\"path\");\n var gateway_auth_12 = require_gateway_auth();\n var edge_context_1 = require_edge_context();\n var build_id_12 = require_build_id();\n var REFRESH_TIMEOUT_MS = 15e3;\n var URL_BATCH_SIZE = 100;\n var REFRESH_CONCURRENCY = 4;\n var TAG_MANIFEST_FILENAME = \"__pcg_tag_manifest.json\";\n function stripLeadingSlash2(s) {\n return s.replace(/^\\/+/, \"\");\n }\n function ensureLeadingSlash(s) {\n return s.startsWith(\"/\") ? s : `/${s}`;\n }\n function loadCdnPurgeConfig() {\n const base = (0, gateway_auth_12.loadGatewayAuthConfig)();\n if (!base)\n return null;\n return { ...base };\n }\n exports2.loadCdnPurgeConfig = loadCdnPurgeConfig;\n function createCdnPurgeClient(cfg) {\n var _a, _b;\n const buildId = (_a = cfg.buildId) !== null && _a !== void 0 ? _a : (0, build_id_12.loadBuildId)();\n const pathPrefix = buildId ? `${buildId}/` : null;\n const manifestPath = (_b = cfg.manifestPath) !== null && _b !== void 0 ? _b : path.join(__dirname, TAG_MANIFEST_FILENAME);\n let manifestPromise = null;\n async function loadManifest() {\n if (manifestPromise)\n return manifestPromise;\n manifestPromise = (async () => {\n var _a2, _b2, _c, _d;\n const map = /* @__PURE__ */ new Map();\n let raw;\n try {\n raw = await fs.promises.readFile(manifestPath, \"utf-8\");\n } catch (err) {\n if ((err === null || err === void 0 ? void 0 : err.code) !== \"ENOENT\") {\n console.warn(`[cdn-purge] manifest read error ${manifestPath}: ${(_a2 = err === null || err === void 0 ? void 0 : err.message) !== null && _a2 !== void 0 ? _a2 : err}`);\n }\n return /* @__PURE__ */ new Map();\n }\n let rows;\n try {\n const parsed = JSON.parse(raw);\n rows = Array.isArray(parsed) ? parsed : [];\n } catch (err) {\n console.warn(`[cdn-purge] manifest parse error ${manifestPath}: ${(_b2 = err === null || err === void 0 ? void 0 : err.message) !== null && _b2 !== void 0 ? _b2 : err}`);\n return /* @__PURE__ */ new Map();\n }\n for (const row of rows) {\n const tagPk = (_c = row === null || row === void 0 ? void 0 : row.tag) === null || _c === void 0 ? void 0 : _c.S;\n const pathPk = (_d = row === null || row === void 0 ? void 0 : row.path) === null || _d === void 0 ? void 0 : _d.S;\n if (typeof tagPk !== \"string\" || typeof pathPk !== \"string\")\n continue;\n let tag;\n let p;\n if (pathPrefix) {\n if (!tagPk.startsWith(pathPrefix))\n continue;\n if (!pathPk.startsWith(pathPrefix))\n continue;\n tag = tagPk.slice(pathPrefix.length);\n p = pathPk.slice(pathPrefix.length);\n } else {\n const tIdx = tagPk.indexOf(\"/\");\n const pIdx = pathPk.indexOf(\"/\");\n if (tIdx < 0 || pIdx < 0)\n continue;\n if (tagPk.slice(0, tIdx) !== pathPk.slice(0, pIdx))\n continue;\n tag = tagPk.slice(tIdx + 1);\n p = pathPk.slice(pIdx + 1);\n }\n if (!tag || !p)\n continue;\n let bucket = map.get(tag);\n if (!bucket) {\n bucket = /* @__PURE__ */ new Set();\n map.set(tag, bucket);\n }\n bucket.add(p);\n }\n const result = /* @__PURE__ */ new Map();\n let totalEntries = 0;\n for (const [tag, set] of map) {\n result.set(tag, Array.from(set));\n totalEntries += set.size;\n }\n console.log(`[cdn-purge] manifest loaded: buildId=${buildId !== null && buildId !== void 0 ? buildId : \"(auto)\"} tags=${result.size} entries=${totalEntries} (${manifestPath})`);\n return result;\n })();\n return manifestPromise;\n }\n function expandPathsToUrls(paths, hostname) {\n const normalized = /* @__PURE__ */ new Set();\n for (const p of paths) {\n if (!p)\n continue;\n normalized.add(ensureLeadingSlash(p));\n }\n if (normalized.size === 0)\n return [];\n const urls = /* @__PURE__ */ new Set();\n for (const p of normalized) {\n urls.add(`https://${hostname}${p}`);\n if (buildId) {\n const rel = stripLeadingSlash2(p);\n urls.add(`https://${hostname}/_next/data/${buildId}/${rel || \"index\"}.json`);\n }\n }\n return Array.from(urls);\n }\n async function refreshBatch(urls, hostname, siteId) {\n var _a2;\n const body = {\n hostname,\n siteId,\n urls\n };\n let res;\n try {\n res = await (0, gateway_auth_12.gatewayFetch)(cfg, \"/cache/refresh\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n timeoutMs: REFRESH_TIMEOUT_MS\n });\n } catch (err) {\n console.warn(`[cdn-purge] cache/refresh error (${urls.length} urls): ${(_a2 = err === null || err === void 0 ? void 0 : err.message) !== null && _a2 !== void 0 ? _a2 : err}`);\n return;\n }\n if (!res.ok) {\n let detail = \"\";\n try {\n detail = (await res.text()).slice(0, 200);\n } catch (_b2) {\n }\n console.warn(`[cdn-purge] cache/refresh failed status=${res.status} urls=${urls.length} ${detail}`);\n return;\n }\n console.log(`[cdn-purge] cache/refresh ok: urls=${urls.length}`);\n }\n async function refreshUrls(allUrls, hostname, siteId) {\n if (allUrls.length === 0)\n return;\n const batches = [];\n for (let i = 0; i < allUrls.length; i += URL_BATCH_SIZE) {\n batches.push(allUrls.slice(i, i + URL_BATCH_SIZE));\n }\n let cursor = 0;\n async function worker() {\n while (cursor < batches.length) {\n const idx = cursor++;\n await refreshBatch(batches[idx], hostname, siteId);\n }\n }\n const workers = Array.from({ length: Math.min(REFRESH_CONCURRENCY, batches.length) }, () => worker());\n await Promise.all(workers);\n }\n function resolveTarget(action) {\n const { hostname, siteId } = (0, edge_context_1.getEdgeContext)();\n if (!hostname || siteId === void 0 || siteId === \"\") {\n console.warn(`[cdn-purge] ${action} skip: edge context missing (hostname=${hostname !== null && hostname !== void 0 ? hostname : \"\\u2205\"} siteId=${siteId !== null && siteId !== void 0 ? siteId : \"\\u2205\"}); \\u8981\\u6C42\\u5165\\u7AD9\\u8BF7\\u6C42\\u5E26 host \\u4E0E x-alicdn-site-id`);\n return null;\n }\n return { hostname, siteId };\n }\n async function purgeByPaths(paths) {\n var _a2;\n try {\n const target = resolveTarget(\"purgeByPaths\");\n if (!target)\n return;\n const urls = expandPathsToUrls(paths, target.hostname);\n console.log(`[cdn-purge] purgeByPaths: input=${paths.length} urls=${urls.length}`);\n await refreshUrls(urls, target.hostname, target.siteId);\n } catch (err) {\n console.warn(`[cdn-purge] purgeByPaths error: ${(_a2 = err === null || err === void 0 ? void 0 : err.message) !== null && _a2 !== void 0 ? _a2 : err}`);\n }\n }\n async function purgeByTags(tags) {\n var _a2;\n try {\n const uniqueTags = Array.from(new Set(tags.map((t) => typeof t === \"string\" ? t : \"\").map((t) => t.trim()).filter(Boolean)));\n if (uniqueTags.length === 0)\n return;\n const target = resolveTarget(\"purgeByTags\");\n if (!target)\n return;\n const map = await loadManifest();\n const merged = /* @__PURE__ */ new Set();\n for (const t of uniqueTags) {\n const paths = map.get(t);\n if (!paths)\n continue;\n for (const p of paths)\n merged.add(p);\n }\n if (merged.size === 0) {\n console.log(`[cdn-purge] purgeByTags: input=${uniqueTags.length} matched=0 (manifest miss, skip)`);\n return;\n }\n const urls = expandPathsToUrls(Array.from(merged), target.hostname);\n console.log(`[cdn-purge] purgeByTags: input=${uniqueTags.length} matched=${merged.size} urls=${urls.length}`);\n await refreshUrls(urls, target.hostname, target.siteId);\n } catch (err) {\n console.warn(`[cdn-purge] purgeByTags error: ${(_a2 = err === null || err === void 0 ? void 0 : err.message) !== null && _a2 !== void 0 ? _a2 : err}`);\n }\n }\n return { purgeByPaths, purgeByTags };\n }\n exports2.createCdnPurgeClient = createCdnPurgeClient;\n }\n});\n\n// dist/overrides/tagCache/gateway.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar gateway_auth_1 = require_gateway_auth();\nvar cdn_purge_1 = require_cdn_purge();\nvar build_id_1 = require_build_id();\nvar QUERY_TIMEOUT = 3e3;\nvar WRITE_TIMEOUT = 5e3;\nvar BATCH_SIZE = 200;\nfunction stripLeadingSlash(s) {\n return s.replace(/^\\/+/, \"\");\n}\nvar GatewayTagCache = class {\n constructor() {\n this.name = \"gateway-tag-cache\";\n this.mode = \"nextMode\";\n this.config = null;\n this.configLoaded = false;\n this.purgeClient = null;\n this.purgeClientLoaded = false;\n }\n getConfig() {\n if (!this.configLoaded) {\n this.config = (0, gateway_auth_1.loadGatewayAuthConfig)();\n this.configLoaded = true;\n }\n return this.config;\n }\n getPurgeClient() {\n if (!this.purgeClientLoaded) {\n const cfg = (0, cdn_purge_1.loadCdnPurgeConfig)();\n this.purgeClient = cfg ? (0, cdn_purge_1.createCdnPurgeClient)(cfg) : null;\n this.purgeClientLoaded = true;\n }\n return this.purgeClient;\n }\n /**\n * 拼 TableStore tag 主键:`{buildId}/{tag}`。\n *\n * 使用 BUILD_ID(Next.js 构建产物身份)而非 cfg.version(ESA 平台版本号),\n * 原因:同一个 buildId 内 manifest 与 tag 行身份严格一致,避免\n * 部署侧注入 ESA_CACHE_GW_VERSION 与构建期 BUILD_ID 不一致时 key 全部错位。\n *\n * BUILD_ID 读不到(老 bundle / 错误可靠度) → 降级为不加前缀,与老版本行为兼容。\n */\n buildTagKey(tag) {\n const buildId = (0, build_id_1.loadBuildId)();\n const prefix = buildId ? `${buildId}/` : \"\";\n return `${prefix}${stripLeadingSlash(tag)}`;\n }\n async getLastRevalidated(tags) {\n const config = this.getConfig();\n if (!config)\n return 0;\n try {\n const rows = await this.batchGetTags(config, tags);\n let maxRevalidatedAt = 0;\n for (const row of rows) {\n if (row.revalidatedAt && row.revalidatedAt > maxRevalidatedAt) {\n maxRevalidatedAt = row.revalidatedAt;\n }\n }\n return maxRevalidatedAt;\n } catch (err) {\n console.warn(`[tagCache] getLastRevalidated error: ${err.message}`);\n return 0;\n }\n }\n async hasBeenRevalidated(tags, lastModified) {\n const config = this.getConfig();\n if (!config)\n return false;\n if (tags.length === 0)\n return false;\n try {\n const rows = await this.batchGetTags(config, tags);\n const now = Date.now();\n const lm = lastModified !== null && lastModified !== void 0 ? lastModified : 0;\n for (const row of rows) {\n if (row.expire !== void 0) {\n if (row.expire <= now && row.expire > lm) {\n return true;\n }\n }\n if (row.revalidatedAt !== void 0 && row.revalidatedAt > lm) {\n return true;\n }\n }\n return false;\n } catch (err) {\n console.warn(`[tagCache] hasBeenRevalidated error: ${err.message}`);\n return false;\n }\n }\n async isStale(tags, lastModified) {\n var _a;\n const config = this.getConfig();\n if (!config)\n return false;\n if (tags.length === 0)\n return false;\n try {\n const rows = await this.batchGetTags(config, tags);\n const lm = lastModified !== null && lastModified !== void 0 ? lastModified : 0;\n for (const row of rows) {\n if (row.stale === void 0)\n continue;\n const revalidatedAt = (_a = row.revalidatedAt) !== null && _a !== void 0 ? _a : 0;\n if (revalidatedAt > lm && row.stale >= lm) {\n return true;\n }\n }\n return false;\n } catch (err) {\n console.warn(`[tagCache] isStale error: ${err.message}`);\n return false;\n }\n }\n async writeTags(tags) {\n if (!tags || tags.length === 0)\n return;\n const config = this.getConfig();\n if (!config)\n return;\n const writeTs = Date.now();\n const rows = tags.map((input) => {\n const tagStr = typeof input === \"string\" ? input : input.tag;\n const stale = typeof input === \"string\" ? void 0 : input.stale;\n const expire = typeof input === \"string\" ? void 0 : input.expire;\n const tagKey = this.buildTagKey(tagStr);\n const columns = [\n { name: \"revalidatedAt\", value: writeTs }\n ];\n if (stale !== void 0) {\n columns.push({ name: \"stale\", value: stale });\n }\n if (expire !== void 0) {\n columns.push({ name: \"expire\", value: expire });\n }\n return {\n primaryKey: [\n { name: \"app_id\", value: `${config.aliuid}/${config.routinename}` },\n { name: \"tag\", value: tagKey }\n ],\n columns\n };\n });\n await this.batchWrite(config, rows);\n const purgeClient = this.getPurgeClient();\n if (purgeClient) {\n const tagStrs = tags.map((t) => typeof t === \"string\" ? t : t.tag).filter((s) => typeof s === \"string\" && s.length > 0);\n if (tagStrs.length > 0) {\n purgeClient.purgeByTags(tagStrs).catch((err) => {\n var _a;\n console.warn(`[tagCache] purge fan-out failed: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);\n });\n }\n }\n }\n // ---- private methods ----\n async batchGetTags(config, tags) {\n var _a, _b;\n const primaryKeys = tags.map((tag) => [\n { name: \"app_id\", value: `${config.aliuid}/${config.routinename}` },\n { name: \"tag\", value: this.buildTagKey(tag) }\n ]);\n const res = await (0, gateway_auth_1.gatewayFetch)(config, \"/table/batch-get-row\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ primaryKeys }),\n timeoutMs: QUERY_TIMEOUT\n });\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[tagCache] batch-get-row rejected (${res.status})`);\n } else {\n console.warn(`[tagCache] batch-get-row failed: status=${res.status}`);\n }\n return [];\n }\n const data = await res.json();\n console.log(`[tagCache] batch-get-row ok: tags=${tags.length} rows=${(_b = (_a = data.rows) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0}`);\n if (!data.rows)\n return [];\n return data.rows.map((row) => {\n var _a2;\n const result = {};\n for (const col of (_a2 = row.columns) !== null && _a2 !== void 0 ? _a2 : []) {\n if (col.name === \"revalidatedAt\" && typeof col.value === \"number\") {\n result.revalidatedAt = col.value;\n } else if (col.name === \"stale\" && typeof col.value === \"number\") {\n result.stale = col.value;\n } else if (col.name === \"expire\" && typeof col.value === \"number\") {\n result.expire = col.value;\n }\n }\n return result;\n });\n }\n async batchWrite(config, rows) {\n if (rows.length === 0)\n return;\n for (let i = 0; i < rows.length; i += BATCH_SIZE) {\n const batch = rows.slice(i, i + BATCH_SIZE);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, \"/table/batch-write\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ rows: batch }),\n timeoutMs: WRITE_TIMEOUT\n });\n if (res.status === 401 || res.status === 403) {\n console.error(`[tagCache] batch-write rejected (${res.status})`);\n return;\n }\n if (!res.ok) {\n console.warn(`[tagCache] batch-write failed: status=${res.status}`);\n } else {\n console.log(`[tagCache] batch-write ok: rows=${batch.length}`);\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[tagCache] batch-write timeout (${WRITE_TIMEOUT}ms)`);\n } else {\n console.warn(`[tagCache] batch-write error: ${err.message}`);\n }\n }\n }\n }\n};\nexports.default = GatewayTagCache;\n",
5
+ "overrides/incrementalCache/gateway.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\n\n// dist/_protocol/types.js\nvar require_types = __commonJS({\n \"dist/_protocol/types.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n }\n});\n\n// dist/_protocol/keys.js\nvar require_keys = __commonJS({\n \"dist/_protocol/keys.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.buildPageMetadataKey = exports2.buildTagKey = exports2.buildStaticAssetKey = exports2.buildOssKey = void 0;\n function stripLeadingSlash(s) {\n return s.replace(/^\\/+/, \"\");\n }\n function buildOssKey(params) {\n const { appId, buildId, cacheType = \"cache\" } = params;\n const key = stripLeadingSlash(params.key);\n if (cacheType === \"fetch\") {\n return `${appId}/__fetch/${buildId}/${key}`;\n }\n return `${appId}/${buildId}/${key}.cache`;\n }\n exports2.buildOssKey = buildOssKey;\n function buildStaticAssetKey(params) {\n const p = stripLeadingSlash(params.path);\n return `${params.appId}/_next/static/${p}`;\n }\n exports2.buildStaticAssetKey = buildStaticAssetKey;\n function buildTagKey(params) {\n return {\n app_id: params.appId,\n tag: `${params.buildId}/${params.tag}`,\n path: `${params.buildId}/${params.path}`\n };\n }\n exports2.buildTagKey = buildTagKey;\n function buildPageMetadataKey(params) {\n return {\n app_id: params.appId,\n url: params.url\n };\n }\n exports2.buildPageMetadataKey = buildPageMetadataKey;\n }\n});\n\n// dist/_protocol/endpoints.js\nvar require_endpoints = __commonJS({\n \"dist/_protocol/endpoints.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.buildCentralEndpoints = void 0;\n function stripTrailingSlashes(s) {\n return s.replace(/\\/+$/, \"\");\n }\n function buildCentralEndpoints(base) {\n const b = stripTrailingSlashes(base);\n return {\n base: b,\n cache: `${b}/cache`,\n cacheRefresh: `${b}/cache/refresh`,\n revalidateTag: `${b}/revalidate/tag`,\n revalidatePath: `${b}/revalidate/path`,\n tagByTag: `${b}/tag/by-tag`,\n tagByPath: `${b}/tag/by-path`,\n tagLastModified: `${b}/tag/last-modified`,\n tagWrite: `${b}/tag/write`,\n deploySts: `${b}/deploy/sts-token`,\n deployTags: `${b}/deploy/tags`\n };\n }\n exports2.buildCentralEndpoints = buildCentralEndpoints;\n }\n});\n\n// dist/_protocol/index.js\nvar require_protocol = __commonJS({\n \"dist/_protocol/index.js\"(exports2) {\n \"use strict\";\n var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n if (k2 === void 0) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() {\n return m[k];\n } };\n }\n Object.defineProperty(o, k2, desc);\n } : function(o, m, k, k2) {\n if (k2 === void 0) k2 = k;\n o[k2] = m[k];\n });\n var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);\n };\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n __exportStar(require_types(), exports2);\n __exportStar(require_keys(), exports2);\n __exportStar(require_endpoints(), exports2);\n }\n});\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/runtime/edge-context.js\nvar require_edge_context = __commonJS({\n \"dist/runtime/edge-context.js\"(exports2) {\n \"use strict\";\n var _a;\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.getCacheTags = exports2.setCacheTags = exports2.getEdgeContext = exports2.runWithEdgeContext = exports2.buildEdgeContextFromHeaders = void 0;\n var node_async_hooks_1 = require(\"node:async_hooks\");\n var ALS_KEY = Symbol.for(\"pcg.edgeContext.als\");\n var globalRef = globalThis;\n var storage = (_a = globalRef[ALS_KEY]) !== null && _a !== void 0 ? _a : globalRef[ALS_KEY] = new node_async_hooks_1.AsyncLocalStorage();\n var SITE_ID_HEADER = \"x-alicdn-site-id\";\n var HOSTNAME_HEADER = \"host\";\n var FORWARDED_HOSTNAME_HEADER = \"x-forwarded-host\";\n function pickHeader(headers, name) {\n var _a2;\n return (_a2 = headers[name]) !== null && _a2 !== void 0 ? _a2 : headers[name.toLowerCase()];\n }\n function parseHostname(raw) {\n var _a2;\n if (!raw)\n return void 0;\n const first = (_a2 = raw.split(\",\")[0]) === null || _a2 === void 0 ? void 0 : _a2.trim();\n return first || void 0;\n }\n function parseSiteId(raw) {\n if (!raw)\n return void 0;\n const trimmed = raw.trim();\n if (!trimmed)\n return void 0;\n const n = Number(trimmed);\n return Number.isFinite(n) && trimmed === String(n) ? n : trimmed;\n }\n function buildEdgeContextFromHeaders(headers) {\n var _a2;\n const ctx = {};\n const siteId = parseSiteId(pickHeader(headers, SITE_ID_HEADER));\n if (siteId !== void 0)\n ctx.siteId = siteId;\n const hostname = (_a2 = parseHostname(pickHeader(headers, HOSTNAME_HEADER))) !== null && _a2 !== void 0 ? _a2 : parseHostname(pickHeader(headers, FORWARDED_HOSTNAME_HEADER));\n if (hostname)\n ctx.hostname = hostname;\n return ctx;\n }\n exports2.buildEdgeContextFromHeaders = buildEdgeContextFromHeaders;\n function runWithEdgeContext(headers, fn) {\n const ctx = buildEdgeContextFromHeaders(headers);\n return storage.run(ctx, fn);\n }\n exports2.runWithEdgeContext = runWithEdgeContext;\n function getEdgeContext() {\n var _a2;\n return (_a2 = storage.getStore()) !== null && _a2 !== void 0 ? _a2 : {};\n }\n exports2.getEdgeContext = getEdgeContext;\n function setCacheTags(tags) {\n const store = storage.getStore();\n if (store)\n store.cacheTags = tags;\n }\n exports2.setCacheTags = setCacheTags;\n function getCacheTags() {\n var _a2;\n return (_a2 = storage.getStore()) === null || _a2 === void 0 ? void 0 : _a2.cacheTags;\n }\n exports2.getCacheTags = getCacheTags;\n }\n});\n\n// dist/overrides/incrementalCache/gateway.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar protocol_1 = require_protocol();\nvar gateway_auth_1 = require_gateway_auth();\nvar edge_context_1 = require_edge_context();\nvar GET_TIMEOUT = 5e3;\nvar SET_TIMEOUT = 1e4;\nvar DELETE_TIMEOUT = 5e3;\nfunction buildKey(config, key, isFetchOrType) {\n let cacheType;\n if (typeof isFetchOrType === \"string\") {\n cacheType = isFetchOrType === \"fetch\" ? \"fetch\" : \"cache\";\n } else {\n cacheType = isFetchOrType ? \"fetch\" : \"cache\";\n }\n return (0, protocol_1.buildOssKey)({\n appId: `${config.aliuid}/${config.routinename}`,\n buildId: config.version,\n key,\n cacheType\n });\n}\nvar GatewayIncrementalCache = class {\n constructor() {\n this.name = \"gateway-incremental-cache\";\n this.config = null;\n this.configLoaded = false;\n }\n /**\n * 延迟加载配置,避免在构造函数中因环境变量缺失而阻塞 Function 启动。\n */\n getConfig() {\n if (!this.configLoaded) {\n this.config = (0, gateway_auth_1.loadGatewayAuthConfig)();\n this.configLoaded = true;\n }\n return this.config;\n }\n /**\n * 从 Gateway 读取缓存。\n */\n async get(key, isFetch) {\n var _a, _b;\n const config = this.getConfig();\n if (!config)\n return null;\n const ossKey = buildKey(config, key, isFetch);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {\n method: \"GET\",\n timeoutMs: GET_TIMEOUT\n });\n if (res.status === 404)\n return null;\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[incrementalCache] GET \\u88AB\\u62D2\\u7EDD: key=\"${ossKey}\" (${res.status})\\uFF0C\\u8BF7\\u68C0\\u67E5\\u7B7E\\u540D secret \\u6216 key \\u524D\\u7F00`);\n } else {\n console.warn(`[incrementalCache] GET \\u5931\\u8D25: key=\"${ossKey}\", \\u72B6\\u6001\\u7801=${res.status}`);\n }\n return null;\n }\n const body = await res.text();\n let envelope;\n try {\n envelope = JSON.parse(body);\n } catch (_c) {\n console.warn(`[incrementalCache] JSON \\u89E3\\u6790\\u5931\\u8D25: key=\"${ossKey}\"`);\n return null;\n }\n if (!envelope || typeof envelope !== \"object\" || typeof envelope.lastModified !== \"number\") {\n console.warn(`[incrementalCache] envelope \\u683C\\u5F0F\\u5F02\\u5E38\\u6216\\u7F3A lastModified: key=\"${ossKey}\"`);\n return null;\n }\n const val = envelope.value;\n const tags = (_b = (_a = val === null || val === void 0 ? void 0 : val.meta) === null || _a === void 0 ? void 0 : _a.headers) === null || _b === void 0 ? void 0 : _b[\"x-next-cache-tags\"];\n if (typeof tags === \"string\") {\n (0, edge_context_1.setCacheTags)(tags);\n }\n return { value: envelope.value, lastModified: envelope.lastModified };\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[incrementalCache] GET \\u8D85\\u65F6: key=\"${ossKey}\" (${GET_TIMEOUT}ms)`);\n } else {\n console.warn(`[incrementalCache] GET \\u5F02\\u5E38: key=\"${ossKey}\", ${err.message}`);\n }\n return null;\n }\n }\n /**\n * 向 Gateway 写入缓存。\n */\n async set(key, value, isFetch) {\n const config = this.getConfig();\n if (!config)\n return;\n const ossKey = buildKey(config, key, isFetch);\n const body = JSON.stringify({ lastModified: Date.now(), value });\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n timeoutMs: SET_TIMEOUT\n });\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[incrementalCache] PUT \\u88AB\\u62D2\\u7EDD: key=\"${ossKey}\" (${res.status})\\uFF0C\\u8BF7\\u68C0\\u67E5\\u7B7E\\u540D secret \\u6216 key \\u524D\\u7F00`);\n } else {\n console.warn(`[incrementalCache] PUT \\u5931\\u8D25: key=\"${ossKey}\", \\u72B6\\u6001\\u7801=${res.status}`);\n }\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[incrementalCache] PUT \\u8D85\\u65F6: key=\"${ossKey}\" (${SET_TIMEOUT}ms)`);\n } else {\n console.warn(`[incrementalCache] PUT \\u5F02\\u5E38: key=\"${ossKey}\", ${err.message}`);\n }\n }\n }\n /**\n * 通过 Gateway 删除缓存。\n */\n async delete(key, isFetch) {\n const config = this.getConfig();\n if (!config)\n return;\n const ossKey = buildKey(config, key, isFetch);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {\n method: \"DELETE\",\n timeoutMs: DELETE_TIMEOUT\n });\n if (res.status === 404)\n return;\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[incrementalCache] DELETE \\u88AB\\u62D2\\u7EDD: key=\"${ossKey}\" (${res.status})\\uFF0C\\u8BF7\\u68C0\\u67E5\\u7B7E\\u540D secret \\u6216 key \\u524D\\u7F00`);\n } else {\n console.warn(`[incrementalCache] DELETE \\u5931\\u8D25: key=\"${ossKey}\", \\u72B6\\u6001\\u7801=${res.status}`);\n }\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[incrementalCache] DELETE \\u8D85\\u65F6: key=\"${ossKey}\" (${DELETE_TIMEOUT}ms)`);\n } else {\n console.warn(`[incrementalCache] DELETE \\u5F02\\u5E38: key=\"${ossKey}\", ${err.message}`);\n }\n }\n }\n};\nexports.default = GatewayIncrementalCache;\n",
6
+ "overrides/tagCache/gateway.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/runtime/edge-context.js\nvar require_edge_context = __commonJS({\n \"dist/runtime/edge-context.js\"(exports2) {\n \"use strict\";\n var _a;\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.getCacheTags = exports2.setCacheTags = exports2.getEdgeContext = exports2.runWithEdgeContext = exports2.buildEdgeContextFromHeaders = void 0;\n var node_async_hooks_1 = require(\"node:async_hooks\");\n var ALS_KEY = Symbol.for(\"pcg.edgeContext.als\");\n var globalRef = globalThis;\n var storage = (_a = globalRef[ALS_KEY]) !== null && _a !== void 0 ? _a : globalRef[ALS_KEY] = new node_async_hooks_1.AsyncLocalStorage();\n var SITE_ID_HEADER = \"x-alicdn-site-id\";\n var HOSTNAME_HEADER = \"host\";\n var FORWARDED_HOSTNAME_HEADER = \"x-forwarded-host\";\n function pickHeader(headers, name) {\n var _a2;\n return (_a2 = headers[name]) !== null && _a2 !== void 0 ? _a2 : headers[name.toLowerCase()];\n }\n function parseHostname(raw) {\n var _a2;\n if (!raw)\n return void 0;\n const first = (_a2 = raw.split(\",\")[0]) === null || _a2 === void 0 ? void 0 : _a2.trim();\n return first || void 0;\n }\n function parseSiteId(raw) {\n if (!raw)\n return void 0;\n const trimmed = raw.trim();\n if (!trimmed)\n return void 0;\n const n = Number(trimmed);\n return Number.isFinite(n) && trimmed === String(n) ? n : trimmed;\n }\n function buildEdgeContextFromHeaders(headers) {\n var _a2;\n const ctx = {};\n const siteId = parseSiteId(pickHeader(headers, SITE_ID_HEADER));\n if (siteId !== void 0)\n ctx.siteId = siteId;\n const hostname = (_a2 = parseHostname(pickHeader(headers, HOSTNAME_HEADER))) !== null && _a2 !== void 0 ? _a2 : parseHostname(pickHeader(headers, FORWARDED_HOSTNAME_HEADER));\n if (hostname)\n ctx.hostname = hostname;\n return ctx;\n }\n exports2.buildEdgeContextFromHeaders = buildEdgeContextFromHeaders;\n function runWithEdgeContext(headers, fn) {\n const ctx = buildEdgeContextFromHeaders(headers);\n return storage.run(ctx, fn);\n }\n exports2.runWithEdgeContext = runWithEdgeContext;\n function getEdgeContext() {\n var _a2;\n return (_a2 = storage.getStore()) !== null && _a2 !== void 0 ? _a2 : {};\n }\n exports2.getEdgeContext = getEdgeContext;\n function setCacheTags(tags) {\n const store = storage.getStore();\n if (store)\n store.cacheTags = tags;\n }\n exports2.setCacheTags = setCacheTags;\n function getCacheTags() {\n var _a2;\n return (_a2 = storage.getStore()) === null || _a2 === void 0 ? void 0 : _a2.cacheTags;\n }\n exports2.getCacheTags = getCacheTags;\n }\n});\n\n// dist/runtime/build-id.js\nvar require_build_id = __commonJS({\n \"dist/runtime/build-id.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.__setBuildIdForTest = exports2.__resetBuildIdCache = exports2.loadBuildId = void 0;\n var fs = require(\"fs\");\n var path = require(\"path\");\n var cached;\n function loadBuildId() {\n var _a;\n if (cached !== void 0)\n return cached;\n const p = path.join(__dirname, \".next\", \"BUILD_ID\");\n try {\n const v = fs.readFileSync(p, \"utf-8\").trim();\n cached = v || null;\n } catch (err) {\n if ((err === null || err === void 0 ? void 0 : err.code) !== \"ENOENT\") {\n console.warn(`[build-id] BUILD_ID read error ${p}: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);\n } else {\n console.warn(`[build-id] BUILD_ID not found at ${p}`);\n }\n cached = null;\n }\n return cached;\n }\n exports2.loadBuildId = loadBuildId;\n function __resetBuildIdCache() {\n cached = void 0;\n }\n exports2.__resetBuildIdCache = __resetBuildIdCache;\n function __setBuildIdForTest(v) {\n cached = v;\n }\n exports2.__setBuildIdForTest = __setBuildIdForTest;\n }\n});\n\n// dist/overrides/tagCache/gateway.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar gateway_auth_1 = require_gateway_auth();\nvar edge_context_1 = require_edge_context();\nvar build_id_1 = require_build_id();\nvar QUERY_TIMEOUT = 3e3;\nvar WRITE_TIMEOUT = 5e3;\nvar BATCH_SIZE = 200;\nvar PURGE_TIMEOUT = 15e3;\nfunction stripLeadingSlash(s) {\n return s.replace(/^\\/+/, \"\");\n}\nvar GatewayTagCache = class {\n constructor() {\n this.name = \"gateway-tag-cache\";\n this.mode = \"nextMode\";\n this.config = null;\n this.configLoaded = false;\n }\n getConfig() {\n if (!this.configLoaded) {\n this.config = (0, gateway_auth_1.loadGatewayAuthConfig)();\n this.configLoaded = true;\n }\n return this.config;\n }\n /**\n * 拼 TableStore tag 主键:`{buildId}/{tag}`。\n *\n * 使用 BUILD_ID(Next.js 构建产物身份)而非 cfg.version(ESA 平台版本号),\n * 原因:同一个 buildId 内 manifest 与 tag 行身份严格一致,避免\n * 部署侧注入 ESA_CACHE_GW_VERSION 与构建期 BUILD_ID 不一致时 key 全部错位。\n *\n * BUILD_ID 读不到(老 bundle / 错误可靠度) → 降级为不加前缀,与老版本行为兼容。\n */\n buildTagKey(tag) {\n const buildId = (0, build_id_1.loadBuildId)();\n const prefix = buildId ? `${buildId}/` : \"\";\n return `${prefix}${stripLeadingSlash(tag)}`;\n }\n async getLastRevalidated(tags) {\n const config = this.getConfig();\n if (!config)\n return 0;\n try {\n const rows = await this.batchGetTags(config, tags);\n let maxRevalidatedAt = 0;\n for (const row of rows) {\n if (row.revalidatedAt && row.revalidatedAt > maxRevalidatedAt) {\n maxRevalidatedAt = row.revalidatedAt;\n }\n }\n return maxRevalidatedAt;\n } catch (err) {\n console.warn(`[tagCache] getLastRevalidated error: ${err.message}`);\n return 0;\n }\n }\n async hasBeenRevalidated(tags, lastModified) {\n const config = this.getConfig();\n if (!config)\n return false;\n if (tags.length === 0)\n return false;\n try {\n const rows = await this.batchGetTags(config, tags);\n const now = Date.now();\n const lm = lastModified !== null && lastModified !== void 0 ? lastModified : 0;\n for (const row of rows) {\n if (row.expire !== void 0) {\n if (row.expire <= now && row.expire > lm) {\n return true;\n }\n }\n if (row.revalidatedAt !== void 0 && row.revalidatedAt > lm) {\n return true;\n }\n }\n return false;\n } catch (err) {\n console.warn(`[tagCache] hasBeenRevalidated error: ${err.message}`);\n return false;\n }\n }\n async isStale(tags, lastModified) {\n var _a;\n const config = this.getConfig();\n if (!config)\n return false;\n if (tags.length === 0)\n return false;\n try {\n const rows = await this.batchGetTags(config, tags);\n const lm = lastModified !== null && lastModified !== void 0 ? lastModified : 0;\n for (const row of rows) {\n if (row.stale === void 0)\n continue;\n const revalidatedAt = (_a = row.revalidatedAt) !== null && _a !== void 0 ? _a : 0;\n if (revalidatedAt > lm && row.stale >= lm) {\n return true;\n }\n }\n return false;\n } catch (err) {\n console.warn(`[tagCache] isStale error: ${err.message}`);\n return false;\n }\n }\n async writeTags(tags) {\n if (!tags || tags.length === 0)\n return;\n const config = this.getConfig();\n if (!config)\n return;\n const writeTs = Date.now();\n const rows = tags.map((input) => {\n const tagStr = typeof input === \"string\" ? input : input.tag;\n const stale = typeof input === \"string\" ? void 0 : input.stale;\n const expire = typeof input === \"string\" ? void 0 : input.expire;\n const tagKey = this.buildTagKey(tagStr);\n console.log(`[tagCache] writeTags: tag=\"${tagStr}\" key=\"${tagKey}\" ts=${writeTs}`);\n const columns = [\n { name: \"revalidatedAt\", value: writeTs }\n ];\n if (stale !== void 0) {\n columns.push({ name: \"stale\", value: stale });\n }\n if (expire !== void 0) {\n columns.push({ name: \"expire\", value: expire });\n }\n return {\n primaryKey: [\n { name: \"app_id\", value: `${config.aliuid}/${config.routinename}` },\n { name: \"tag\", value: tagKey }\n ],\n columns\n };\n });\n await this.batchWrite(config, rows);\n const tagStrs = tags.map((t) => typeof t === \"string\" ? t : t.tag).filter((s) => typeof s === \"string\" && s.length > 0);\n if (tagStrs.length > 0) {\n this.purgeByCacheTags(config, tagStrs).catch((err) => {\n var _a;\n console.warn(`[tagCache] cacheTags purge failed: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);\n });\n }\n }\n // ---- private methods ----\n async batchGetTags(config, tags) {\n var _a, _b;\n const tagKeys = tags.map((tag) => this.buildTagKey(tag));\n console.log(`[tagCache] batchGetTags: tags=${JSON.stringify(tags)} keys=${JSON.stringify(tagKeys)}`);\n const primaryKeys = tags.map((tag) => [\n { name: \"app_id\", value: `${config.aliuid}/${config.routinename}` },\n { name: \"tag\", value: this.buildTagKey(tag) }\n ]);\n const res = await (0, gateway_auth_1.gatewayFetch)(config, \"/table/batch-get-row\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ primaryKeys }),\n timeoutMs: QUERY_TIMEOUT\n });\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[tagCache] batch-get-row rejected (${res.status})`);\n } else {\n console.warn(`[tagCache] batch-get-row failed: status=${res.status}`);\n }\n return [];\n }\n const data = await res.json();\n console.log(`[tagCache] batch-get-row ok: tags=${tags.length} rows=${(_b = (_a = data.rows) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0}`);\n if (!data.rows)\n return [];\n return data.rows.map((row) => {\n var _a2;\n const result = {};\n for (const col of (_a2 = row.columns) !== null && _a2 !== void 0 ? _a2 : []) {\n if (col.name === \"revalidatedAt\" && typeof col.value === \"number\") {\n result.revalidatedAt = col.value;\n } else if (col.name === \"stale\" && typeof col.value === \"number\") {\n result.stale = col.value;\n } else if (col.name === \"expire\" && typeof col.value === \"number\") {\n result.expire = col.value;\n }\n }\n return result;\n });\n }\n async batchWrite(config, rows) {\n if (rows.length === 0)\n return;\n for (let i = 0; i < rows.length; i += BATCH_SIZE) {\n const batch = rows.slice(i, i + BATCH_SIZE);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, \"/table/batch-write\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ rows: batch }),\n timeoutMs: WRITE_TIMEOUT\n });\n if (res.status === 401 || res.status === 403) {\n console.error(`[tagCache] batch-write rejected (${res.status})`);\n return;\n }\n if (!res.ok) {\n console.warn(`[tagCache] batch-write failed: status=${res.status}`);\n } else {\n console.log(`[tagCache] batch-write ok: rows=${batch.length}`);\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[tagCache] batch-write timeout (${WRITE_TIMEOUT}ms)`);\n } else {\n console.warn(`[tagCache] batch-write error: ${err.message}`);\n }\n }\n }\n }\n /**\n * 调 Gateway /cache/refresh(cacheTags) 触发 ESA PurgeCaches Type=cachetag。\n * hostname / siteId 从当前请求的 edge context 读取,缺失则 skip。\n */\n async purgeByCacheTags(config, tags) {\n var _a;\n const { hostname, siteId } = (0, edge_context_1.getEdgeContext)();\n if (!hostname || siteId === void 0 || siteId === \"\") {\n console.warn(`[tagCache] cacheTags purge skip: edge context missing (hostname=${hostname !== null && hostname !== void 0 ? hostname : \"\\u2205\"} siteId=${siteId !== null && siteId !== void 0 ? siteId : \"\\u2205\"})`);\n return;\n }\n const body = { hostname, siteId, cacheTags: tags };\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, \"/cache/refresh\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n timeoutMs: PURGE_TIMEOUT\n });\n if (!res.ok) {\n let detail = \"\";\n try {\n detail = (await res.text()).slice(0, 200);\n } catch (_b) {\n }\n console.warn(`[tagCache] cacheTags purge failed: status=${res.status} tags=${tags.length} ${detail}`);\n return;\n }\n console.log(`[tagCache] cacheTags purge ok: tags=${tags.length}`);\n } catch (err) {\n console.warn(`[tagCache] cacheTags purge error: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);\n }\n }\n};\nexports.default = GatewayTagCache;\n",
7
7
  };
@@ -178,6 +178,10 @@ function bridgeOpenNextHandler(handler) {
178
178
  res.on('close', () => abortController.abort());
179
179
  const streamCreator = {
180
180
  writeHeaders(prelude) {
181
+ const cacheTags = (0, edge_context_1.getCacheTags)();
182
+ if (cacheTags) {
183
+ res.setHeader('Cache-Tag', cacheTags);
184
+ }
181
185
  res.setHeader('Set-Cookie', prelude.cookies);
182
186
  res.writeHead(prelude.statusCode, prelude.headers);
183
187
  res.flushHeaders();
@@ -285,4 +289,4 @@ const wrapperDef = {
285
289
  supportStreaming: true,
286
290
  };
287
291
  exports.default = wrapperDef;
288
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvd3JhcHBlcnMvbm9kZS1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7QUFFSCw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwyREFBNkQ7QUFDN0QsNkRBQWdFO0FBK0JoRSw0Q0FBNEM7QUFFNUMsTUFBTSxVQUFVLEdBQTJCO0lBQ3pDLEtBQUssRUFBRSx3QkFBd0I7SUFDL0IsTUFBTSxFQUFFLHdCQUF3QjtJQUNoQyxNQUFNLEVBQUUsVUFBVTtJQUNsQixPQUFPLEVBQUUsV0FBVztJQUNwQixPQUFPLEVBQUUsa0JBQWtCO0lBQzNCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLE1BQU0sRUFBRSxlQUFlO0lBQ3ZCLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLE9BQU8sRUFBRSxXQUFXO0lBQ3BCLFFBQVEsRUFBRSxZQUFZO0lBQ3RCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLE1BQU0sRUFBRSxrQkFBa0I7SUFDMUIsTUFBTSxFQUFFLFlBQVk7SUFDcEIsT0FBTyxFQUFFLFlBQVk7Q0FDdEIsQ0FBQztBQUVGLGtDQUFrQztBQUVsQyxTQUFTLFVBQVUsQ0FBQyxHQUFXO0lBQzdCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDMUIsTUFBTSxNQUFNLEdBQXNDLEVBQUUsQ0FBQztJQUNyRCxNQUFNLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFD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LENBQUMsd0VBQXdFLENBQUMsQ0FBQztZQUN0RixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBRztJQUNqQixPQUFPO0lBQ1AsSUFBSSxFQUFFLFVBQVU7SUFDaEIsZ0JBQWdCLEVBQUUsSUFBSTtDQUN2QixDQUFDO0FBRUYsa0JBQWUsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwY2cgTm9kZSBTZXJ2ZXIgV3JhcHBlclxuICpcbiAqIE9wZW5OZXh0IHdyYXBwZXIg55qE6ZW/6L+b56iL5b2i5oCBOuS4jeS+nei1liBGYWFTIHJ1bnRpbWUs6Ieq5bimIEhUVFAgc2VydmVyIOebtOaOpeebkeWQrFxuICogYHByb2Nlc3MuZW52LlBPUlRgKOm7mOiupCAzMDAwKSxgbm9kZSBpbmRleC5tanNgIOWNs+WPr+eLrOeri+i/kOihjOOAglxuICpcbiAqIOWNleS4quivt+axguS8muaMieS7peS4i+mhuuW6j+WIhuWPkTpcbiAqICAgMS4gYC9fX2hlYWx0aGAgICAgICAgICAgICAgICAgICDihpIgMjAwIE9LKOS+myBwY2cgc2VydmUgLyDlrrnlmajlsLHnu6rmjqLpkogpXG4gKiAgIDIuIGAvX25leHQvaW1hZ2VgICAgICAgICAgICAgICDihpIgaW1hZ2UtcHJveHko562+5ZCNIGNsaWVudCDosIMgR2F0ZXdheSlcbiAqICAgMy4gYC5vcGVuLW5leHQvYXNzZXRzLzx1cmxQYXRoPmAg5ZG95LitIOKGkiDnm7TmjqUgcGlwZSDmlofku7bmtYFcbiAqICAgNC4g5YW25LuWICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgT3Blbk5leHQgaGFuZGxlcihOZXh0IFNTUi9BUEkvUlNDKVxuICpcbiAqIOS4ieautemAu+i+keatpOWJjeWIhuaVo+WcqCBwbGF0Zm9ybS1mdW5jdGlvbiB3cmFwcGVyKGltYWdlIHByb3h5ICsgcmVx4oaSZXZlbnQg5qGl5o6lKVxuICog5LiOIGBwY2cgc2VydmVgIOeItui/m+eoiyjpnZnmgIHotYTmupAgKyByZXZlcnNlIHByb3h5KeS4rTvmraTmrKHnu5/kuIDov5sgd3JhcHBlcixcbiAqIOiuqSBgcGNnIHNlcnZlYCDpgIDljJbkuLrnuq/lrZDov5vnqIvnrqHnkIblmajjgIJcbiAqL1xuXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGhhbmRsZUltYWdlUHJveHkgfSBmcm9tICcuLi8uLi9ydW50aW1lL2ltYWdlLXByb3h5JztcbmltcG9ydCB7IHJ1bldpdGhFZGdlQ29udGV4dCB9IGZyb20gJy4uLy4uL3J1bnRpbWUvZWRnZS1jb250ZXh0JztcblxuLy8gPT09IE9wZW5OZXh0IOaOpeWPo+exu+WeiyjlhoXogZTpgb/lhY3noazkvp3otZYgQG9wZW5uZXh0anMvYXdzKSA9PT1cblxuaW50ZXJmYWNlIEludGVybmFsRXZlbnQge1xuICB0eXBlOiAnY29yZSc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICByYXdQYXRoOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBib2R5Pzogc3RyaW5nO1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuICBjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICByZW1vdGVBZGRyZXNzOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTdHJlYW1DcmVhdG9yIHtcbiAgd3JpdGVIZWFkZXJzKHByZWx1ZGU6IHtcbiAgICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gICAgY29va2llczogc3RyaW5nW107XG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSk6IGltcG9ydCgnc3RyZWFtJykuV3JpdGFibGU7XG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIG9uRmluaXNoPzogKCkgPT4gdm9pZDtcbn1cblxudHlwZSBPcGVuTmV4dEhhbmRsZXIgPSAoXG4gIGV2ZW50OiBJbnRlcm5hbEV2ZW50LFxuICBjdHg6IHsgc3RyZWFtQ3JlYXRvcjogU3RyZWFtQ3JlYXRvciB9XG4pID0+IFByb21pc2U8dm9pZD47XG5cbi8vID09PSDpnZnmgIHotYTmupAgTUlNRSjkuI7ljp8gcGNnIHNlcnZlIOeItui/m+eoi+WunueOsOS/neaMgeS4gOiHtCkgPT09XG5cbmNvbnN0IE1JTUVfVFlQRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICcuanMnOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsXG4gICcubWpzJzogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLFxuICAnLmNzcyc6ICd0ZXh0L2NzcycsXG4gICcuaHRtbCc6ICd0ZXh0L2h0bWwnLFxuICAnLmpzb24nOiAnYXBwbGljYXRpb24vanNvbicsXG4gICcucG5nJzogJ2ltYWdlL3BuZycsXG4gICcuanBnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmpwZWcnOiAnaW1hZ2UvanBlZycsXG4gICcuZ2lmJzogJ2ltYWdlL2dpZicsXG4gICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnLFxuICAnLmljbyc6ICdpbWFnZS94LWljb24nLFxuICAnLndvZmYnOiAnZm9udC93b2ZmJyxcbiAgJy53b2ZmMic6ICdmb250L3dvZmYyJyxcbiAgJy50dGYnOiAnZm9udC90dGYnLFxuICAnLm1hcCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgJy50eHQnOiAndGV4dC9wbGFpbicsXG4gICcud2VicCc6ICdpbWFnZS93ZWJwJyxcbn07XG5cbi8vID09PSDor7fmsYIg4oaSIEludGVybmFsRXZlbnQg5qGl5o6l5bel5YW3ID09PVxuXG5mdW5jdGlvbiBwYXJzZVF1ZXJ5KHVybDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgY29uc3QgaWR4ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgaWYgKGlkeCA9PT0gLTEpIHJldHVybiB7fTtcbiAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4gPSB7fTtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2xpY2UoaWR4ICsgMSkpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzZWFyY2hQYXJhbXMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHBhcmFtc1trZXldO1xuICAgIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgIGV4aXN0aW5nLnB1c2godmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXNba2V5XSA9IFtleGlzdGluZywgdmFsdWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFyYW1zO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvb2tpZXMoXG4gIGNvb2tpZUhlYWRlcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKCFjb29raWVIZWFkZXIpIHJldHVybiB7fTtcbiAgY29uc3QgY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IHBhaXIgb2YgY29va2llSGVhZGVyLnNwbGl0KCc7JykpIHtcbiAgICBjb25zdCBlcUlkeCA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgIGlmIChlcUlkeCA9PT0gLTEpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5hbWUgPSBwYWlyLnNsaWNlKDAsIGVxSWR4KS50cmltKCk7XG4gICAgY29uc3QgdmFsdWUgPSBwYWlyLnNsaWNlKGVxSWR4ICsgMSkudHJpbSgpO1xuICAgIGlmIChuYW1lKSBjb29raWVzW25hbWVdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGNvb2tpZXM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5IZWFkZXJzKFxuICByYXdIZWFkZXJzOiBodHRwLkluY29taW5nSHR0cEhlYWRlcnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJhd0hlYWRlcnMpKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWUuam9pbignLCAnKVxuICAgICAgOiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEJvZHkoXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2Vcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChyZXEubWV0aG9kID09PSAnR0VUJyB8fCByZXEubWV0aG9kID09PSAnSEVBRCcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgIHJlcS5vbignZGF0YScsIChjaHVuazogQnVmZmVyKSA9PiBjaHVua3MucHVzaChjaHVuaykpO1xuICAgIHJlcS5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoJ3V0Zi04JykpKTtcbiAgICByZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG59XG5cbi8vID09PSDpnZnmgIHotYTmupAgPT09XG5cbi8qKlxuICog5pyN5YqhIC5vcGVuLW5leHQvYXNzZXRzLyDkuIvnmoTpnZnmgIHmlofku7bjgIJcbiAqXG4gKiDljLnphY3kuKTnsbs6XG4gKiAgIDEuIGAvX25leHQvc3RhdGljLypgIOKAlOKAlCBOZXh0LmpzIOeUn+aIkOeahOW4piBoYXNoIOi1hOa6kCzplb/nvJPlrZggaW1tdXRhYmxlXG4gKiAgIDIuIGAvPHB1YmxpYy1maWxlPmAg4oCU4oCUIGBwdWJsaWMvYCDmj5Dlj5blh7rmnaXnmoTmoLnnuqfpnZnmgIHmlofku7Ys55+t57yT5a2YXG4gKlxuICog5LiN5a2Y5Zyo55qE6Lev5b6E6L+U5ZueIGZhbHNlIOiuqeS4iuWxgiBmYWxsYmFjayDliLAgT3Blbk5leHQgaGFuZGxlcihBUEkgLyBTU1IgL1xuICogYF9wY2cvKmAg562JKeOAglxuICovXG5mdW5jdGlvbiBzZXJ2ZVN0YXRpY0ZpbGUoXG4gIGFzc2V0c0Rpcjogc3RyaW5nLFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2Vcbik6IGJvb2xlYW4ge1xuICBjb25zdCB1cmxQYXRoID0gcmVxLnVybD8uc3BsaXQoJz8nKVswXSA/PyAnLyc7XG4gIGlmICh1cmxQYXRoID09PSAnLycgfHwgIXVybFBhdGguc3RhcnRzV2l0aCgnLycpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXNzZXRzRGlyLCB1cmxQYXRoKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChhc3NldHNEaXIpKSB7XG4gICAgcmVzLndyaXRlSGVhZCg0MDMpO1xuICAgIHJlcy5lbmQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCBzdGF0OiBmcy5TdGF0cztcbiAgdHJ5IHtcbiAgICBzdGF0ID0gZnMuc3RhdFN5bmMobm9ybWFsaXplZFBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCFzdGF0LmlzRmlsZSgpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKG5vcm1hbGl6ZWRQYXRoKTtcbiAgY29uc3QgY29udGVudFR5cGUgPSBNSU1FX1RZUEVTW2V4dF0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gIGNvbnN0IGlzSGFzaGVkQXNzZXQgPSB1cmxQYXRoLnN0YXJ0c1dpdGgoJy9fbmV4dC9zdGF0aWMvJyk7XG5cbiAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAnQ29udGVudC1UeXBlJzogY29udGVudFR5cGUsXG4gICAgJ0NvbnRlbnQtTGVuZ3RoJzogc3RhdC5zaXplLFxuICAgICdDYWNoZS1Db250cm9sJzogaXNIYXNoZWRBc3NldFxuICAgICAgPyAncHVibGljLCBtYXgtYWdlPTMxNTM2MDAwLCBpbW11dGFibGUnXG4gICAgICA6ICdwdWJsaWMsIG1heC1hZ2U9NjAnLFxuICB9KTtcbiAgZnMuY3JlYXRlUmVhZFN0cmVhbShub3JtYWxpemVkUGF0aCkucGlwZShyZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiDmioogT3Blbk5leHQg5o+Q5L6b55qEIGhhbmRsZXIg5YyF5oiQIGh0dHAgKHJlcSwgcmVzKSDlpITnkIblh73mlbDjgIJcbiAqIOi0n+i0ozogYm9keSDor7vlj5bjgIFldmVudCDnu4Too4XjgIHmtYHlvI/lk43lupTjgIE1MDAg5YWc5bqV44CCXG4gKi9cbmZ1bmN0aW9uIGJyaWRnZU9wZW5OZXh0SGFuZGxlcihoYW5kbGVyOiBPcGVuTmV4dEhhbmRsZXIpIHtcbiAgcmV0dXJuIGFzeW5jIChcbiAgICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3VXJsID0gcmVxLnVybCB8fCAnLyc7XG4gICAgICBjb25zdCBoZWFkZXJzID0gZmxhdHRlbkhlYWRlcnMocmVxLmhlYWRlcnMpO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlYWRCb2R5KHJlcSk7XG5cbiAgICAgIC8vIE9wZW5OZXh0IOWGhemDqOWvuSBldmVudC51cmwg5omn6KGMIGBuZXcgVVJMKC4uLilgLOW/hemhu+aYr+e7neWvuSBVUkwg4oCU4oCUIOeUqFxuICAgICAgLy8gaG9zdCBoZWFkZXIgKyB4LWZvcndhcmRlZC1wcm90byDov5jljp8s6KGM5Li65LiOIE9wZW5OZXh0IOWGhee9riBub2RlXG4gICAgICAvLyBjb252ZXJ0ZXIg5LiA6Ie0IChAb3Blbm5leHRqcy9hd3MvZGlzdC9vdmVycmlkZXMvY29udmVydGVycy9ub2RlLmpzKeOAglxuICAgICAgY29uc3QgaG9zdCA9IGhlYWRlcnNbJ2hvc3QnXSB8fCBgbG9jYWxob3N0OiR7cHJvY2Vzcy5lbnYuUE9SVCA/PyAnMzAwMCd9YDtcbiAgICAgIGNvbnN0IHByb3RvID0gaGVhZGVyc1sneC1mb3J3YXJkZWQtcHJvdG8nXT8uc3BsaXQoJywnKVswXT8udHJpbSgpIHx8ICdodHRwJztcbiAgICAgIGNvbnN0IGFic29sdXRlVXJsID0gbmV3IFVSTChgJHtwcm90b306Ly8ke2hvc3R9JHtyYXdVcmx9YCk7XG5cbiAgICAgIGNvbnN0IGV2ZW50OiBJbnRlcm5hbEV2ZW50ID0ge1xuICAgICAgICB0eXBlOiAnY29yZScsXG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCB8fCAnR0VUJyxcbiAgICAgICAgcmF3UGF0aDogYWJzb2x1dGVVcmwucGF0aG5hbWUsXG4gICAgICAgIHVybDogYWJzb2x1dGVVcmwuaHJlZixcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcXVlcnk6IHBhcnNlUXVlcnkocmF3VXJsKSxcbiAgICAgICAgY29va2llczogcGFyc2VDb29raWVzKGhlYWRlcnNbJ2Nvb2tpZSddKSxcbiAgICAgICAgcmVtb3RlQWRkcmVzczpcbiAgICAgICAgICBoZWFkZXJzWyd4LWZvcndhcmRlZC1mb3InXT8uc3BsaXQoJywnKVswXT8udHJpbSgpIHx8XG4gICAgICAgICAgaGVhZGVyc1sneC1yZWFsLWlwJ10gfHxcbiAgICAgICAgICByZXEuc29ja2V0Py5yZW1vdGVBZGRyZXNzIHx8XG4gICAgICAgICAgJzEyNy4wLjAuMScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICByZXMub24oJ2Nsb3NlJywgKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCkpO1xuXG4gICAgICBjb25zdCBzdHJlYW1DcmVhdG9yOiBTdHJlYW1DcmVhdG9yID0ge1xuICAgICAgICB3cml0ZUhlYWRlcnMocHJlbHVkZSkge1xuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ1NldC1Db29raWUnLCBwcmVsdWRlLmNvb2tpZXMpO1xuICAgICAgICAgIHJlcy53cml0ZUhlYWQocHJlbHVkZS5zdGF0dXNDb2RlLCBwcmVsdWRlLmhlYWRlcnMpO1xuICAgICAgICAgIHJlcy5mbHVzaEhlYWRlcnMoKTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH07XG5cbiAgICAgIC8vIOi/m+WFpSBPcGVuTmV4dCBoYW5kbGVyIOWJjeaKiuivt+axguWktCAoaG9zdCAvIHgtYWxpY2RuLXNpdGUtaWQpIOazqOWFpVxuICAgICAgLy8gQXN5bmNMb2NhbFN0b3JhZ2Us5LiL5ri4IGNkbi1wdXJnZSDljbPkvb8gZmlyZS1hbmQtZm9yZ2V0IOS5n+iDveaLv+WIsOacrOasoVxuICAgICAgLy8g6K+35rGC55qEIGhvc3RuYW1lIC8gc2l0ZUlkKHByb21pc2Ug6ZO+57un5om/5b2T5YmNIHN0b3JlKeOAglxuICAgICAgYXdhaXQgcnVuV2l0aEVkZ2VDb250ZXh0KGhlYWRlcnMsICgpID0+IGhhbmRsZXIoZXZlbnQsIHsgc3RyZWFtQ3JlYXRvciB9KSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgIGNvbnN0IGlzRGV2ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJztcbiAgICAgICAgcmVzLndyaXRlSGVhZCg1MDAsIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICAgICAgcmVzLmVuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBlcnJvcjogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gICAgICAgICAgICAuLi4oaXNEZXYgJiYgeyBtZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFjayB9KSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBPcGVuTmV4dCDlnKjliqDovb3lrowgc2VydmVyIGJ1bmRsZSDlkI7osIPnlKjmraTlh73mlbAs5oiR5Lus5Zyo5q2k5ZCv5YqoIEhUVFAgc2VydmVy44CCXG4gKlxuICogYXNzZXRzIOebruW9leino+aekOS4uiBgPGN3ZD4vLi4vLi4vYXNzZXRzYDpPcGVuTmV4dCDpu5jorqTkuqfniannu5PmnoTmmK9cbiAqIGAub3Blbi1uZXh0L3NlcnZlci1mdW5jdGlvbnMvZGVmYXVsdC9pbmRleC5tanNgLOi/kOihjOaXtuaXoOiuuuaYr+eUqOaIt+aJi+WKqFxuICogYGNkYCDlkI4gYG5vZGUgaW5kZXgubWpzYCDov5jmmK8gYHBjZyBzZXJ2ZWAgc3Bhd24oYGN3ZDogc2VydmVyRGlyYCksXG4gKiBgcHJvY2Vzcy5jd2QoKWAg6YO9562J5LqOIGBzZXJ2ZXItZnVuY3Rpb25zL2RlZmF1bHQvYCxhc3NldHMg5b+F5ZyoIGAuLi8uLi9hc3NldHMvYOOAglxuICovXG5hc3luYyBmdW5jdGlvbiB3cmFwcGVyKGhhbmRsZXI6IE9wZW5OZXh0SGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwb3J0ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUE9SVCA/PyAnMzAwMCcsIDEwKTtcbiAgY29uc3QgYXNzZXRzRGlyID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuLicsICcuLicsICdhc3NldHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFzc2V0c0RpcikpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW3BjZy1ub2RlXSBhc3NldHMgZGlyZWN0b3J5IG5vdCBmb3VuZCBhdCAke2Fzc2V0c0Rpcn0g4oCUIHN0YXRpYyBmaWxlIHJlcXVlc3RzIHdpbGwgZmFsbCB0aHJvdWdoIHRvIE5leHQgaGFuZGxlcmBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZGlzcGF0Y2hUb05leHQgPSBicmlkZ2VPcGVuTmV4dEhhbmRsZXIoaGFuZGxlcik7XG5cbiAgY29uc3Qgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3QgdXJsUGF0aCA9IHJlcS51cmw/LnNwbGl0KCc/JylbMF0gPz8gJy8nO1xuXG4gICAgLy8gMS4gaGVhbHRoIGNoZWNrXG4gICAgaWYgKHVybFBhdGggPT09ICcvX19oZWFsdGgnKSB7XG4gICAgICByZXMud3JpdGVIZWFkKDIwMCwgeyAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nIH0pO1xuICAgICAgcmVzLmVuZCgnT0snKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAyLiDlm77niYfkvJjljJbku6PnkIYg4oCU4oCUIOaLpuaIqiBOZXh0IOm7mOiupOeahCAvX25leHQvaW1hZ2U/dXJsPS4uLixzZXJ2ZXIg5L6n5Luj5Y+RXG4gICAgLy8gICAg562+5ZCN6K+35rGC5YiwIEdhdGV3YXnjgILov5nmoLfnlKjmiLcgbmV4dC5jb25maWcg5LiN6ZyA6KaB6YWNIGN1c3RvbSBsb2FkZXIsXG4gICAgLy8gICAgPEltYWdlPiDotbAgTmV4dCDlhoXnva4gVVJMIOeUn+aIkOmAu+i+keWNs+WPr+OAglxuICAgIGlmICh1cmxQYXRoID09PSAnL19uZXh0L2ltYWdlJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaGFuZGxlSW1hZ2VQcm94eShyZXEsIHJlcyk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbcGNnLW5vZGVdIGltYWdlLXByb3h5IGVycm9yOicsIGVycik7XG4gICAgICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgICAgcmVzLndyaXRlSGVhZCg1MDAsIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICAgICAgICByZXMuZW5kKEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6ICdJbWFnZSBwcm94eSBmYWlsZWQnIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAzLiDpnZnmgIHotYTmupAoLm9wZW4tbmV4dC9hc3NldHMvKVxuICAgIGlmIChzZXJ2ZVN0YXRpY0ZpbGUoYXNzZXRzRGlyLCByZXEsIHJlcykpIHJldHVybjtcblxuICAgIC8vIDQuIGZhbGxiYWNrIOKAlOKAlCBPcGVuTmV4dCBOZXh0LmpzIGhhbmRsZXJcbiAgICBhd2FpdCBkaXNwYXRjaFRvTmV4dChyZXEsIHJlcyk7XG4gIH0pO1xuXG4gIC8vIOS8mOmbheWFs+mXrTrlgZzmraLmjqXmlLbmlrDov57mjqUs562JIGluLWZsaWdodCDor7fmsYLoh6rnhLbnu5PmnZ8sNXMg5YWc5bqV5by65Yi26YCA5Ye6XG4gIGxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbiAgY29uc3Qgc2h1dGRvd24gPSAoc2lnbmFsOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICBjb25zb2xlLmxvZyhgW3BjZy1ub2RlXSAke3NpZ25hbH0gcmVjZWl2ZWQsIHNodXR0aW5nIGRvd24uLi5gKTtcbiAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4gcHJvY2Vzcy5leGl0KDApKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHByb2Nlc3MuZXhpdCgwKSwgNTAwMCkudW5yZWYoKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4gc2h1dGRvd24oJ1NJR0lOVCcpKTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsICgpID0+IHNodXRkb3duKCdTSUdURVJNJykpO1xuXG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYFtwY2ctbm9kZV0gTGlzdGVuaW5nIG9uIHBvcnQgJHtwb3J0fWApO1xuICAgICAgY29uc29sZS5sb2coYFtwY2ctbm9kZV0gICBhc3NldHM6ICAke2Fzc2V0c0Rpcn1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbcGNnLW5vZGVdICAgcm91dGVzOiAgL19faGVhbHRoLCAvX25leHQvaW1hZ2UsIC9fbmV4dC9zdGF0aWMvKiwgPG5leHQ+YCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIE9wZW5OZXh0IOm7mOiupOWvvOWHuuWlkee6pjpgeyB3cmFwcGVyLCBuYW1lLCBzdXBwb3J0U3RyZWFtaW5nIH1g44CCXG4gKi9cbmNvbnN0IHdyYXBwZXJEZWYgPSB7XG4gIHdyYXBwZXIsXG4gIG5hbWU6ICdwY2ctbm9kZScsXG4gIHN1cHBvcnRTdHJlYW1pbmc6IHRydWUsXG59O1xuXG5leHBvcnQgZGVmYXVsdCB3cmFwcGVyRGVmO1xuIl19
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvd3JhcHBlcnMvbm9kZS1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7QUFFSCw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwyREFBNkQ7QUFDN0QsNkRBQThFO0FBK0I5RSw0Q0FBNEM7QUFFNUMsTUFBTSxVQUFVLEdBQTJCO0lBQ3pDLEtBQUssRUFBRSx3QkFBd0I7SUFDL0IsTUFBTSxFQUFFLHdCQUF3QjtJQUNoQyxNQUFNLEVBQUUsVUFBVTtJQUNsQixPQUFPLEVBQUUsV0FBVztJQUNwQixPQUFPLEVBQUUsa0JBQWtCO0lBQzNCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLE1BQU0sRUFBRSxlQUFlO0lBQ3ZCLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLE9BQU8sRUFBRSxXQUFXO0lBQ3BCLFFBQVEsRUFBRSxZQUFZO0lBQ3RCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLE1BQU0sRUFBRSxrQkFBa0I7SUFDMUIsTUFBTSxFQUFFLFlBQVk7SUFDcEIsT0FBTyxFQUFFLFlBQVk7Q0FDdEIsQ0FBQztBQUVGLGtDQUFrQztBQUVsQyxTQUFTLFVBQVUsQ0FBQyxHQUFXO0lBQzdCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDMUIsTUFBTSxNQUFNLEdBQXNDLEVBQUUsQ0FBQztJQUNyRCxNQUFNLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFD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QixPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDbEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO1lBQ3RGLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxHQUFHO0lBQ2pCLE9BQU87SUFDUCxJQUFJLEVBQUUsVUFBVTtJQUNoQixnQkFBZ0IsRUFBRSxJQUFJO0NBQ3ZCLENBQUM7QUFFRixrQkFBZSxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBjZyBOb2RlIFNlcnZlciBXcmFwcGVyXG4gKlxuICogT3Blbk5leHQgd3JhcHBlciDnmoTplb/ov5vnqIvlvaLmgIE65LiN5L6d6LWWIEZhYVMgcnVudGltZSzoh6rluKYgSFRUUCBzZXJ2ZXIg55u05o6l55uR5ZCsXG4gKiBgcHJvY2Vzcy5lbnYuUE9SVGAo6buY6K6kIDMwMDApLGBub2RlIGluZGV4Lm1qc2Ag5Y2z5Y+v54us56uL6L+Q6KGM44CCXG4gKlxuICog5Y2V5Liq6K+35rGC5Lya5oyJ5Lul5LiL6aG65bqP5YiG5Y+ROlxuICogICAxLiBgL19faGVhbHRoYCAgICAgICAgICAgICAgICAgIOKGkiAyMDAgT0so5L6bIHBjZyBzZXJ2ZSAvIOWuueWZqOWwsee7quaOoumSiClcbiAqICAgMi4gYC9fbmV4dC9pbWFnZWAgICAgICAgICAgICAgIOKGkiBpbWFnZS1wcm94eSjnrb7lkI0gY2xpZW50IOiwgyBHYXRld2F5KVxuICogICAzLiBgLm9wZW4tbmV4dC9hc3NldHMvPHVybFBhdGg+YCDlkb3kuK0g4oaSIOebtOaOpSBwaXBlIOaWh+S7tua1gVxuICogICA0LiDlhbbku5YgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBPcGVuTmV4dCBoYW5kbGVyKE5leHQgU1NSL0FQSS9SU0MpXG4gKlxuICog5LiJ5q616YC76L6R5q2k5YmN5YiG5pWj5ZyoIHBsYXRmb3JtLWZ1bmN0aW9uIHdyYXBwZXIoaW1hZ2UgcHJveHkgKyByZXHihpJldmVudCDmoaXmjqUpXG4gKiDkuI4gYHBjZyBzZXJ2ZWAg54i26L+b56iLKOmdmeaAgei1hOa6kCArIHJldmVyc2UgcHJveHkp5LitO+atpOasoee7n+S4gOi/myB3cmFwcGVyLFxuICog6K6pIGBwY2cgc2VydmVgIOmAgOWMluS4uue6r+WtkOi/m+eoi+euoeeQhuWZqOOAglxuICovXG5cbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgaGFuZGxlSW1hZ2VQcm94eSB9IGZyb20gJy4uLy4uL3J1bnRpbWUvaW1hZ2UtcHJveHknO1xuaW1wb3J0IHsgcnVuV2l0aEVkZ2VDb250ZXh0LCBnZXRDYWNoZVRhZ3MgfSBmcm9tICcuLi8uLi9ydW50aW1lL2VkZ2UtY29udGV4dCc7XG5cbi8vID09PSBPcGVuTmV4dCDmjqXlj6Pnsbvlnoso5YaF6IGU6YG/5YWN56Gs5L6d6LWWIEBvcGVubmV4dGpzL2F3cykgPT09XG5cbmludGVyZmFjZSBJbnRlcm5hbEV2ZW50IHtcbiAgdHlwZTogJ2NvcmUnO1xuICBtZXRob2Q6IHN0cmluZztcbiAgcmF3UGF0aDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgYm9keT86IHN0cmluZztcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcXVlcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPjtcbiAgY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcmVtb3RlQWRkcmVzczogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU3RyZWFtQ3JlYXRvciB7XG4gIHdyaXRlSGVhZGVycyhwcmVsdWRlOiB7XG4gICAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICAgIGNvb2tpZXM6IHN0cmluZ1tdO1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH0pOiBpbXBvcnQoJ3N0cmVhbScpLldyaXRhYmxlO1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBvbkZpbmlzaD86ICgpID0+IHZvaWQ7XG59XG5cbnR5cGUgT3Blbk5leHRIYW5kbGVyID0gKFxuICBldmVudDogSW50ZXJuYWxFdmVudCxcbiAgY3R4OiB7IHN0cmVhbUNyZWF0b3I6IFN0cmVhbUNyZWF0b3IgfVxuKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vLyA9PT0g6Z2Z5oCB6LWE5rqQIE1JTUUo5LiO5Y6fIHBjZyBzZXJ2ZSDniLbov5vnqIvlrp7njrDkv53mjIHkuIDoh7QpID09PVxuXG5jb25zdCBNSU1FX1RZUEVTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnLmpzJzogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLFxuICAnLm1qcyc6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JyxcbiAgJy5jc3MnOiAndGV4dC9jc3MnLFxuICAnLmh0bWwnOiAndGV4dC9odG1sJyxcbiAgJy5qc29uJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAnLnBuZyc6ICdpbWFnZS9wbmcnLFxuICAnLmpwZyc6ICdpbWFnZS9qcGVnJyxcbiAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmdpZic6ICdpbWFnZS9naWYnLFxuICAnLnN2Zyc6ICdpbWFnZS9zdmcreG1sJyxcbiAgJy5pY28nOiAnaW1hZ2UveC1pY29uJyxcbiAgJy53b2ZmJzogJ2ZvbnQvd29mZicsXG4gICcud29mZjInOiAnZm9udC93b2ZmMicsXG4gICcudHRmJzogJ2ZvbnQvdHRmJyxcbiAgJy5tYXAnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICcudHh0JzogJ3RleHQvcGxhaW4nLFxuICAnLndlYnAnOiAnaW1hZ2Uvd2VicCcsXG59O1xuXG4vLyA9PT0g6K+35rGCIOKGkiBJbnRlcm5hbEV2ZW50IOahpeaOpeW3peWFtyA9PT1cblxuZnVuY3Rpb24gcGFyc2VRdWVyeSh1cmw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIGNvbnN0IGlkeCA9IHVybC5pbmRleE9mKCc/Jyk7XG4gIGlmIChpZHggPT09IC0xKSByZXR1cm4ge307XG4gIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+ID0ge307XG4gIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNsaWNlKGlkeCArIDEpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc2VhcmNoUGFyYW1zKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBwYXJhbXNba2V5XTtcbiAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICBleGlzdGluZy5wdXNoKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zW2tleV0gPSBbZXhpc3RpbmcsIHZhbHVlXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuZnVuY3Rpb24gcGFyc2VDb29raWVzKFxuICBjb29raWVIZWFkZXI6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmICghY29va2llSGVhZGVyKSByZXR1cm4ge307XG4gIGNvbnN0IGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBwYWlyIG9mIGNvb2tpZUhlYWRlci5zcGxpdCgnOycpKSB7XG4gICAgY29uc3QgZXFJZHggPSBwYWlyLmluZGV4T2YoJz0nKTtcbiAgICBpZiAoZXFJZHggPT09IC0xKSBjb250aW51ZTtcbiAgICBjb25zdCBuYW1lID0gcGFpci5zbGljZSgwLCBlcUlkeCkudHJpbSgpO1xuICAgIGNvbnN0IHZhbHVlID0gcGFpci5zbGljZShlcUlkeCArIDEpLnRyaW0oKTtcbiAgICBpZiAobmFtZSkgY29va2llc1tuYW1lXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBjb29raWVzO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuSGVhZGVycyhcbiAgcmF3SGVhZGVyczogaHR0cC5JbmNvbWluZ0h0dHBIZWFkZXJzXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyYXdIZWFkZXJzKSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICA/IHZhbHVlLmpvaW4oJywgJylcbiAgICAgIDogdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRCb2R5KFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAocmVxLm1ldGhvZCA9PT0gJ0dFVCcgfHwgcmVxLm1ldGhvZCA9PT0gJ0hFQUQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgICByZXEub24oJ2RhdGEnLCAoY2h1bms6IEJ1ZmZlcikgPT4gY2h1bmtzLnB1c2goY2h1bmspKTtcbiAgICByZXEub24oJ2VuZCcsICgpID0+IHJlc29sdmUoQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCd1dGYtOCcpKSk7XG4gICAgcmVxLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pO1xufVxuXG4vLyA9PT0g6Z2Z5oCB6LWE5rqQID09PVxuXG4vKipcbiAqIOacjeWKoSAub3Blbi1uZXh0L2Fzc2V0cy8g5LiL55qE6Z2Z5oCB5paH5Lu244CCXG4gKlxuICog5Yy56YWN5Lik57G7OlxuICogICAxLiBgL19uZXh0L3N0YXRpYy8qYCDigJTigJQgTmV4dC5qcyDnlJ/miJDnmoTluKYgaGFzaCDotYTmupAs6ZW/57yT5a2YIGltbXV0YWJsZVxuICogICAyLiBgLzxwdWJsaWMtZmlsZT5gIOKAlOKAlCBgcHVibGljL2Ag5o+Q5Y+W5Ye65p2l55qE5qC557qn6Z2Z5oCB5paH5Lu2LOefree8k+WtmFxuICpcbiAqIOS4jeWtmOWcqOeahOi3r+W+hOi/lOWbniBmYWxzZSDorqnkuIrlsYIgZmFsbGJhY2sg5YiwIE9wZW5OZXh0IGhhbmRsZXIoQVBJIC8gU1NSIC9cbiAqIGBfcGNnLypgIOetiSnjgIJcbiAqL1xuZnVuY3Rpb24gc2VydmVTdGF0aWNGaWxlKFxuICBhc3NldHNEaXI6IHN0cmluZyxcbiAgcmVxOiBodHRwLkluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdXJsUGF0aCA9IHJlcS51cmw/LnNwbGl0KCc/JylbMF0gPz8gJy8nO1xuICBpZiAodXJsUGF0aCA9PT0gJy8nIHx8ICF1cmxQYXRoLnN0YXJ0c1dpdGgoJy8nKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgdXJsUGF0aCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZmlsZVBhdGgpO1xuICBpZiAoIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoYXNzZXRzRGlyKSkge1xuICAgIHJlcy53cml0ZUhlYWQoNDAzKTtcbiAgICByZXMuZW5kKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBsZXQgc3RhdDogZnMuU3RhdHM7XG4gIHRyeSB7XG4gICAgc3RhdCA9IGZzLnN0YXRTeW5jKG5vcm1hbGl6ZWRQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghc3RhdC5pc0ZpbGUoKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShub3JtYWxpemVkUGF0aCk7XG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gTUlNRV9UWVBFU1tleHRdIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuICBjb25zdCBpc0hhc2hlZEFzc2V0ID0gdXJsUGF0aC5zdGFydHNXaXRoKCcvX25leHQvc3RhdGljLycpO1xuXG4gIHJlcy53cml0ZUhlYWQoMjAwLCB7XG4gICAgJ0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlLFxuICAgICdDb250ZW50LUxlbmd0aCc6IHN0YXQuc2l6ZSxcbiAgICAnQ2FjaGUtQ29udHJvbCc6IGlzSGFzaGVkQXNzZXRcbiAgICAgID8gJ3B1YmxpYywgbWF4LWFnZT0zMTUzNjAwMCwgaW1tdXRhYmxlJ1xuICAgICAgOiAncHVibGljLCBtYXgtYWdlPTYwJyxcbiAgfSk7XG4gIGZzLmNyZWF0ZVJlYWRTdHJlYW0obm9ybWFsaXplZFBhdGgpLnBpcGUocmVzKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICog5oqKIE9wZW5OZXh0IOaPkOS+m+eahCBoYW5kbGVyIOWMheaIkCBodHRwIChyZXEsIHJlcykg5aSE55CG5Ye95pWw44CCXG4gKiDotJ/otKM6IGJvZHkg6K+75Y+W44CBZXZlbnQg57uE6KOF44CB5rWB5byP5ZON5bqU44CBNTAwIOWFnOW6leOAglxuICovXG5mdW5jdGlvbiBicmlkZ2VPcGVuTmV4dEhhbmRsZXIoaGFuZGxlcjogT3Blbk5leHRIYW5kbGVyKSB7XG4gIHJldHVybiBhc3luYyAoXG4gICAgcmVxOiBodHRwLkluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2VcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhd1VybCA9IHJlcS51cmwgfHwgJy8nO1xuICAgICAgY29uc3QgaGVhZGVycyA9IGZsYXR0ZW5IZWFkZXJzKHJlcS5oZWFkZXJzKTtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZWFkQm9keShyZXEpO1xuXG4gICAgICAvLyBPcGVuTmV4dCDlhoXpg6jlr7kgZXZlbnQudXJsIOaJp+ihjCBgbmV3IFVSTCguLi4pYCzlv4XpobvmmK/nu53lr7kgVVJMIOKAlOKAlCDnlKhcbiAgICAgIC8vIGhvc3QgaGVhZGVyICsgeC1mb3J3YXJkZWQtcHJvdG8g6L+Y5Y6fLOihjOS4uuS4jiBPcGVuTmV4dCDlhoXnva4gbm9kZVxuICAgICAgLy8gY29udmVydGVyIOS4gOiHtCAoQG9wZW5uZXh0anMvYXdzL2Rpc3Qvb3ZlcnJpZGVzL2NvbnZlcnRlcnMvbm9kZS5qcynjgIJcbiAgICAgIGNvbnN0IGhvc3QgPSBoZWFkZXJzWydob3N0J10gfHwgYGxvY2FsaG9zdDoke3Byb2Nlc3MuZW52LlBPUlQgPz8gJzMwMDAnfWA7XG4gICAgICBjb25zdCBwcm90byA9IGhlYWRlcnNbJ3gtZm9yd2FyZGVkLXByb3RvJ10/LnNwbGl0KCcsJylbMF0/LnRyaW0oKSB8fCAnaHR0cCc7XG4gICAgICBjb25zdCBhYnNvbHV0ZVVybCA9IG5ldyBVUkwoYCR7cHJvdG99Oi8vJHtob3N0fSR7cmF3VXJsfWApO1xuXG4gICAgICBjb25zdCBldmVudDogSW50ZXJuYWxFdmVudCA9IHtcbiAgICAgICAgdHlwZTogJ2NvcmUnLFxuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QgfHwgJ0dFVCcsXG4gICAgICAgIHJhd1BhdGg6IGFic29sdXRlVXJsLnBhdGhuYW1lLFxuICAgICAgICB1cmw6IGFic29sdXRlVXJsLmhyZWYsXG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHF1ZXJ5OiBwYXJzZVF1ZXJ5KHJhd1VybCksXG4gICAgICAgIGNvb2tpZXM6IHBhcnNlQ29va2llcyhoZWFkZXJzWydjb29raWUnXSksXG4gICAgICAgIHJlbW90ZUFkZHJlc3M6XG4gICAgICAgICAgaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ10/LnNwbGl0KCcsJylbMF0/LnRyaW0oKSB8fFxuICAgICAgICAgIGhlYWRlcnNbJ3gtcmVhbC1pcCddIHx8XG4gICAgICAgICAgcmVxLnNvY2tldD8ucmVtb3RlQWRkcmVzcyB8fFxuICAgICAgICAgICcxMjcuMC4wLjEnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgcmVzLm9uKCdjbG9zZScsICgpID0+IGFib3J0Q29udHJvbGxlci5hYm9ydCgpKTtcblxuICAgICAgY29uc3Qgc3RyZWFtQ3JlYXRvcjogU3RyZWFtQ3JlYXRvciA9IHtcbiAgICAgICAgd3JpdGVIZWFkZXJzKHByZWx1ZGUpIHtcbiAgICAgICAgICBjb25zdCBjYWNoZVRhZ3MgPSBnZXRDYWNoZVRhZ3MoKTtcbiAgICAgICAgICBpZiAoY2FjaGVUYWdzKSB7XG4gICAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDYWNoZS1UYWcnLCBjYWNoZVRhZ3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ1NldC1Db29raWUnLCBwcmVsdWRlLmNvb2tpZXMpO1xuICAgICAgICAgIHJlcy53cml0ZUhlYWQocHJlbHVkZS5zdGF0dXNDb2RlLCBwcmVsdWRlLmhlYWRlcnMpO1xuICAgICAgICAgIHJlcy5mbHVzaEhlYWRlcnMoKTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH07XG5cbiAgICAgIC8vIOi/m+WFpSBPcGVuTmV4dCBoYW5kbGVyIOWJjeaKiuivt+axguWktCAoaG9zdCAvIHgtYWxpY2RuLXNpdGUtaWQpIOazqOWFpVxuICAgICAgLy8gQXN5bmNMb2NhbFN0b3JhZ2Us5LiL5ri4IGNkbi1wdXJnZSDljbPkvb8gZmlyZS1hbmQtZm9yZ2V0IOS5n+iDveaLv+WIsOacrOasoVxuICAgICAgLy8g6K+35rGC55qEIGhvc3RuYW1lIC8gc2l0ZUlkKHByb21pc2Ug6ZO+57un5om/5b2T5YmNIHN0b3JlKeOAglxuICAgICAgYXdhaXQgcnVuV2l0aEVkZ2VDb250ZXh0KGhlYWRlcnMsICgpID0+IGhhbmRsZXIoZXZlbnQsIHsgc3RyZWFtQ3JlYXRvciB9KSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgIGNvbnN0IGlzRGV2ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJztcbiAgICAgICAgcmVzLndyaXRlSGVhZCg1MDAsIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICAgICAgcmVzLmVuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBlcnJvcjogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gICAgICAgICAgICAuLi4oaXNEZXYgJiYgeyBtZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFjayB9KSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBPcGVuTmV4dCDlnKjliqDovb3lrowgc2VydmVyIGJ1bmRsZSDlkI7osIPnlKjmraTlh73mlbAs5oiR5Lus5Zyo5q2k5ZCv5YqoIEhUVFAgc2VydmVy44CCXG4gKlxuICogYXNzZXRzIOebruW9leino+aekOS4uiBgPGN3ZD4vLi4vLi4vYXNzZXRzYDpPcGVuTmV4dCDpu5jorqTkuqfniannu5PmnoTmmK9cbiAqIGAub3Blbi1uZXh0L3NlcnZlci1mdW5jdGlvbnMvZGVmYXVsdC9pbmRleC5tanNgLOi/kOihjOaXtuaXoOiuuuaYr+eUqOaIt+aJi+WKqFxuICogYGNkYCDlkI4gYG5vZGUgaW5kZXgubWpzYCDov5jmmK8gYHBjZyBzZXJ2ZWAgc3Bhd24oYGN3ZDogc2VydmVyRGlyYCksXG4gKiBgcHJvY2Vzcy5jd2QoKWAg6YO9562J5LqOIGBzZXJ2ZXItZnVuY3Rpb25zL2RlZmF1bHQvYCxhc3NldHMg5b+F5ZyoIGAuLi8uLi9hc3NldHMvYOOAglxuICovXG5hc3luYyBmdW5jdGlvbiB3cmFwcGVyKGhhbmRsZXI6IE9wZW5OZXh0SGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwb3J0ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUE9SVCA/PyAnMzAwMCcsIDEwKTtcbiAgY29uc3QgYXNzZXRzRGlyID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuLicsICcuLicsICdhc3NldHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFzc2V0c0RpcikpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW3BjZy1ub2RlXSBhc3NldHMgZGlyZWN0b3J5IG5vdCBmb3VuZCBhdCAke2Fzc2V0c0Rpcn0g4oCUIHN0YXRpYyBmaWxlIHJlcXVlc3RzIHdpbGwgZmFsbCB0aHJvdWdoIHRvIE5leHQgaGFuZGxlcmBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZGlzcGF0Y2hUb05leHQgPSBicmlkZ2VPcGVuTmV4dEhhbmRsZXIoaGFuZGxlcik7XG5cbiAgY29uc3Qgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3QgdXJsUGF0aCA9IHJlcS51cmw/LnNwbGl0KCc/JylbMF0gPz8gJy8nO1xuXG4gICAgLy8gMS4gaGVhbHRoIGNoZWNrXG4gICAgaWYgKHVybFBhdGggPT09ICcvX19oZWFsdGgnKSB7XG4gICAgICByZXMud3JpdGVIZWFkKDIwMCwgeyAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nIH0pO1xuICAgICAgcmVzLmVuZCgnT0snKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAyLiDlm77niYfkvJjljJbku6PnkIYg4oCU4oCUIOaLpuaIqiBOZXh0IOm7mOiupOeahCAvX25leHQvaW1hZ2U/dXJsPS4uLixzZXJ2ZXIg5L6n5Luj5Y+RXG4gICAgLy8gICAg562+5ZCN6K+35rGC5YiwIEdhdGV3YXnjgILov5nmoLfnlKjmiLcgbmV4dC5jb25maWcg5LiN6ZyA6KaB6YWNIGN1c3RvbSBsb2FkZXIsXG4gICAgLy8gICAgPEltYWdlPiDotbAgTmV4dCDlhoXnva4gVVJMIOeUn+aIkOmAu+i+keWNs+WPr+OAglxuICAgIGlmICh1cmxQYXRoID09PSAnL19uZXh0L2ltYWdlJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaGFuZGxlSW1hZ2VQcm94eShyZXEsIHJlcyk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbcGNnLW5vZGVdIGltYWdlLXByb3h5IGVycm9yOicsIGVycik7XG4gICAgICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgICAgcmVzLndyaXRlSGVhZCg1MDAsIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICAgICAgICByZXMuZW5kKEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6ICdJbWFnZSBwcm94eSBmYWlsZWQnIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAzLiDpnZnmgIHotYTmupAoLm9wZW4tbmV4dC9hc3NldHMvKVxuICAgIGlmIChzZXJ2ZVN0YXRpY0ZpbGUoYXNzZXRzRGlyLCByZXEsIHJlcykpIHJldHVybjtcblxuICAgIC8vIDQuIGZhbGxiYWNrIOKAlOKAlCBPcGVuTmV4dCBOZXh0LmpzIGhhbmRsZXJcbiAgICBhd2FpdCBkaXNwYXRjaFRvTmV4dChyZXEsIHJlcyk7XG4gIH0pO1xuXG4gIC8vIOS8mOmbheWFs+mXrTrlgZzmraLmjqXmlLbmlrDov57mjqUs562JIGluLWZsaWdodCDor7fmsYLoh6rnhLbnu5PmnZ8sNXMg5YWc5bqV5by65Yi26YCA5Ye6XG4gIGxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbiAgY29uc3Qgc2h1dGRvd24gPSAoc2lnbmFsOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICBjb25zb2xlLmxvZyhgW3BjZy1ub2RlXSAke3NpZ25hbH0gcmVjZWl2ZWQsIHNodXR0aW5nIGRvd24uLi5gKTtcbiAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4gcHJvY2Vzcy5leGl0KDApKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHByb2Nlc3MuZXhpdCgwKSwgNTAwMCkudW5yZWYoKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4gc2h1dGRvd24oJ1NJR0lOVCcpKTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsICgpID0+IHNodXRkb3duKCdTSUdURVJNJykpO1xuXG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYFtwY2ctbm9kZV0gTGlzdGVuaW5nIG9uIHBvcnQgJHtwb3J0fWApO1xuICAgICAgY29uc29sZS5sb2coYFtwY2ctbm9kZV0gICBhc3NldHM6ICAke2Fzc2V0c0Rpcn1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbcGNnLW5vZGVdICAgcm91dGVzOiAgL19faGVhbHRoLCAvX25leHQvaW1hZ2UsIC9fbmV4dC9zdGF0aWMvKiwgPG5leHQ+YCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIE9wZW5OZXh0IOm7mOiupOWvvOWHuuWlkee6pjpgeyB3cmFwcGVyLCBuYW1lLCBzdXBwb3J0U3RyZWFtaW5nIH1g44CCXG4gKi9cbmNvbnN0IHdyYXBwZXJEZWYgPSB7XG4gIHdyYXBwZXIsXG4gIG5hbWU6ICdwY2ctbm9kZScsXG4gIHN1cHBvcnRTdHJlYW1pbmc6IHRydWUsXG59O1xuXG5leHBvcnQgZGVmYXVsdCB3cmFwcGVyRGVmO1xuIl19
@@ -41,29 +41,6 @@ function isNextMajorUnsupported(major) {
41
41
  // Relative form needed because absolute __dirname paths break when the CLI is
42
42
  // ncc-bundled into a single file (subdirectory tree no longer exists).
43
43
  const PCG_OVERRIDES_REL = '.pcg/overrides';
44
- // Filename for the tag→path manifest embedded into the FC bundle. Read at
45
- // FC cold start by runtime/cdn-purge to map revalidateTag → CDN purge URLs
46
- // without a server round trip. Resolved via __dirname inside cache.cjs.
47
- const TAG_MANIFEST_FILENAME = '__pcg_tag_manifest.json';
48
- async function embedTagManifest(openNextDir) {
49
- var _a;
50
- const src = path.join(openNextDir, 'dynamodb-provider', 'dynamodb-cache.json');
51
- const dst = path.join(openNextDir, 'server-functions', 'default', TAG_MANIFEST_FILENAME);
52
- try {
53
- await fs.access(src);
54
- }
55
- catch (_b) {
56
- console.warn(`[build] dynamodb-provider/dynamodb-cache.json not found — auto CDN purge will have an empty tag map`);
57
- return;
58
- }
59
- try {
60
- await fs.copyFile(src, dst);
61
- console.log(`[build] Embedded tag manifest → ${TAG_MANIFEST_FILENAME}`);
62
- }
63
- catch (err) {
64
- console.warn(`[build] Failed to embed tag manifest: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
65
- }
66
- }
67
44
  async function materializeOverrides(projectDir) {
68
45
  // Lazy require — keeps the inline-overrides bundle out of the import graph
69
46
  // for code paths that don't auto-generate the config.
@@ -164,7 +141,6 @@ async function runBuild(opts) {
164
141
  finally {
165
142
  process.chdir(prevCwd);
166
143
  }
167
- await embedTagManifest(openNextDir);
168
144
  console.log('[build] Build complete!');
169
145
  }
170
146
  finally {
@@ -204,4 +180,4 @@ function createBuildCommand() {
204
180
  });
205
181
  }
206
182
  exports.createBuildCommand = createBuildCommand;
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLGtDQUFrQztBQUNsQyx5Q0FBb0M7QUFDcEMsbUNBQXVDO0FBQ3ZDLGlGQUEyRTtBQUUzRSx5RUFBeUU7QUFDekUsaUZBQWlGO0FBQ2pGLDJEQUEyRDtBQUMzRCxNQUFNLGtCQUFrQixHQUEyQjtJQUNqRCxFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtDQUNqQixDQUFDO0FBQ0YsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7QUFFcEMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxVQUFrQjtJQUMvQyxJQUFJO1FBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDdkIsVUFBVSxFQUNWLGNBQWMsRUFDZCxNQUFNLEVBQ04sY0FBYyxDQUNmLENBQUM7UUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUMzQztJQUFDLFdBQU07UUFDTixPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsS0FBYTtJ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QkFBb0I7U0FDbkQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBakJELGdEQWlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGRpckV4aXN0cyB9IGZyb20gJy4uL3V0aWwvZnMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEZWZhdWx0Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2RlZmF1bHQtb3Blbi1uZXh0LWNvbmZpZyc7XG5cbi8vIE1pcnJvciBvZiBPcGVuTmV4dCdzIE5FWFRfUkVMRUFTRV9EQVRFUyAoaGVscGVyLmpzKS4gVXNlZCB0byBhdXRvLXBhc3Ncbi8vIC0tZm9yY2UtdW5zdXBwb3J0ZWQtbmV4dCB3aGVuIHRoZSB1c2VyJ3MgTmV4dCBtYWpvciBpcyBwYXN0IGl0cyAyLXllYXIgd2luZG93LFxuLy8gc28gcGlwZWxpbmUgYnVpbGRzIGRvbid0IGZhaWwgb24gT3Blbk5leHQncyBwb2xpY3kgZ2F0ZS5cbmNvbnN0IE5FWFRfUkVMRUFTRV9EQVRFUzogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcbiAgMTY6ICcyMDI1LTEwLTIxJyxcbiAgMTU6ICcyMDI0LTEwLTIxJyxcbiAgMTQ6ICcyMDIzLTEwLTI2JyxcbiAgMTM6ICcyMDIyLTEwLTI2JyxcbiAgMTI6ICcyMDIxLTEwLTI2Jyxcbn07XG5jb25zdCBORVhUX1NVUFBPUlRfV0lORE9XX1lFQVJTID0gMjtcblxuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0TmV4dE1ham9yKHByb2plY3REaXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBrZ1BhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwcm9qZWN0RGlyLFxuICAgICAgJ25vZGVfbW9kdWxlcycsXG4gICAgICAnbmV4dCcsXG4gICAgICAncGFja2FnZS5qc29uJ1xuICAgICk7XG4gICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShwa2dQYXRoLCAndXRmLTgnKSk7XG4gICAgY29uc3QgbWFqb3IgPSBwYXJzZUludChTdHJpbmcocGtnLnZlcnNpb24pLnNwbGl0KCcuJylbMF0sIDEwKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG1ham9yKSA/IG51bGwgOiBtYWpvcjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOZXh0TWFqb3JVbnN1cHBvcnRlZChtYWpvcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGVhc2VEYXRlID0gTkVYVF9SRUxFQVNFX0RBVEVTW21ham9yXTtcbiAgaWYgKCFyZWxlYXNlRGF0ZSkgcmV0dXJuIG1ham9yIDwgMTI7XG4gIGNvbnN0IGVvbCA9IG5ldyBEYXRlKHJlbGVhc2VEYXRlKTtcbiAgZW9sLnNldEZ1bGxZZWFyKGVvbC5nZXRGdWxsWWVhcigpICsgTkVYVF9TVVBQT1JUX1dJTkRPV19ZRUFSUyk7XG4gIHJldHVybiBEYXRlLm5vdygpID4gZW9sLmdldFRpbWUoKTtcbn1cblxuLy8gUGF0aCBpbnNpZGUgPHByb2plY3REaXI+IHdoZXJlIHdlIG1hdGVyaWFsaXplIG92ZXJyaWRlIGJ1bmRsZXMgc28gdGhlXG4vLyBhdXRvLWdlbmVyYXRlZCBvcGVuLW5leHQuY29uZmlnIGNhbiByZWZlcmVuY2UgdGhlbSB2aWEgYSByZWxhdGl2ZSBwYXRoLlxuLy8gUmVsYXRpdmUgZm9ybSBuZWVkZWQgYmVjYXVzZSBhYnNvbHV0ZSBfX2Rpcm5hbWUgcGF0aHMgYnJlYWsgd2hlbiB0aGUgQ0xJIGlzXG4vLyBuY2MtYnVuZGxlZCBpbnRvIGEgc2luZ2xlIGZpbGUgKHN1YmRpcmVjdG9yeSB0cmVlIG5vIGxvbmdlciBleGlzdHMpLlxuY29uc3QgUENHX09WRVJSSURFU19SRUwgPSAnLnBjZy9vdmVycmlkZXMnO1xuXG4vLyBGaWxlbmFtZSBmb3IgdGhlIHRhZ+KGknBhdGggbWFuaWZlc3QgZW1iZWRkZWQgaW50byB0aGUgRkMgYnVuZGxlLiBSZWFkIGF0XG4vLyBGQyBjb2xkIHN0YXJ0IGJ5IHJ1bnRpbWUvY2RuLXB1cmdlIHRvIG1hcCByZXZhbGlkYXRlVGFnIOKGkiBDRE4gcHVyZ2UgVVJMc1xuLy8gd2l0aG91dCBhIHNlcnZlciByb3VuZCB0cmlwLiBSZXNvbHZlZCB2aWEgX19kaXJuYW1lIGluc2lkZSBjYWNoZS5janMuXG5jb25zdCBUQUdfTUFOSUZFU1RfRklMRU5BTUUgPSAnX19wY2dfdGFnX21hbmlmZXN0Lmpzb24nO1xuXG5hc3luYyBmdW5jdGlvbiBlbWJlZFRhZ01hbmlmZXN0KG9wZW5OZXh0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3JjID0gcGF0aC5qb2luKFxuICAgIG9wZW5OZXh0RGlyLFxuICAgICdkeW5hbW9kYi1wcm92aWRlcicsXG4gICAgJ2R5bmFtb2RiLWNhY2hlLmpzb24nXG4gICk7XG4gIGNvbnN0IGRzdCA9IHBhdGguam9pbihcbiAgICBvcGVuTmV4dERpcixcbiAgICAnc2VydmVyLWZ1bmN0aW9ucycsXG4gICAgJ2RlZmF1bHQnLFxuICAgIFRBR19NQU5JRkVTVF9GSUxFTkFNRVxuICApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLmFjY2VzcyhzcmMpO1xuICB9IGNhdGNoIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW2J1aWxkXSBkeW5hbW9kYi1wcm92aWRlci9keW5hbW9kYi1jYWNoZS5qc29uIG5vdCBmb3VuZCDigJQgYXV0byBDRE4gcHVyZ2Ugd2lsbCBoYXZlIGFuIGVtcHR5IHRhZyBtYXBgXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmMsIGRzdCk7XG4gICAgY29uc29sZS5sb2coYFtidWlsZF0gRW1iZWRkZWQgdGFnIG1hbmlmZXN0IOKGkiAke1RBR19NQU5JRkVTVF9GSUxFTkFNRX1gKTtcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLndhcm4oYFtidWlsZF0gRmFpbGVkIHRvIGVtYmVkIHRhZyBtYW5pZmVzdDogJHtlcnI/Lm1lc3NhZ2UgPz8gZXJyfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1hdGVyaWFsaXplT3ZlcnJpZGVzKHByb2plY3REaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBMYXp5IHJlcXVpcmUg4oCUIGtlZXBzIHRoZSBpbmxpbmUtb3ZlcnJpZGVzIGJ1bmRsZSBvdXQgb2YgdGhlIGltcG9ydCBncmFwaFxuICAvLyBmb3IgY29kZSBwYXRocyB0aGF0IGRvbid0IGF1dG8tZ2VuZXJhdGUgdGhlIGNvbmZpZy5cbiAgbGV0IElOTElORV9PVkVSUklERVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHRyeSB7XG4gICAgKHsgSU5MSU5FX09WRVJSSURFUyB9ID0gcmVxdWlyZSgnLi4vX2lubGluZS1vdmVycmlkZXMnKSk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdbYnVpbGRdIGRpc3QvX2lubGluZS1vdmVycmlkZXMuanMgbWlzc2luZyBmcm9tIGVzYS1wY2ctY2xpLiAnICtcbiAgICAgICAgICAnVGhlIHB1Ymxpc2hlZCBwYWNrYWdlIHdhcyBidWlsdCB3aXRob3V0IHNjcmlwdHMvYnVuZGxlLW92ZXJyaWRlcy5qcy4gJyArXG4gICAgICAgICAgJ1JlaW5zdGFsbCBhIG5ld2VyIGVzYS1wY2ctY2xpIChidWlsdCB3aXRoIHRoZSBmdWxsIGBwbnBtIGJ1aWxkYCBwaXBlbGluZSkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgUENHX09WRVJSSURFU19SRUwpO1xuICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKElOTElORV9PVkVSUklERVMpIGFzIFtcbiAgICBzdHJpbmcsXG4gICAgc3RyaW5nLFxuICBdW10pIHtcbiAgICBjb25zdCB0YXJnZXQgPSBwYXRoLmpvaW4ob3ZlcnJpZGVzUm9vdCwgcmVsUGF0aCk7XG4gICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHRhcmdldCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0YXJnZXQsIHNvdXJjZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cE92ZXJyaWRlcyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCBQQ0dfT1ZFUlJJREVTX1JFTCk7XG4gIGF3YWl0IGZzLnJtKG92ZXJyaWRlc1Jvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgLy8gQWxzbyB0cnkgdG8gcmVtb3ZlIHRoZSAucGNnIHBhcmVudCBpZiBpdCdzIGVtcHR5OyBpZ25vcmUgaWYgbm90LlxuICBhd2FpdCBmcy5ybWRpcihwYXRoLmpvaW4ocHJvamVjdERpciwgJy5wY2cnKSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIGRpcjogc3RyaW5nO1xuICBjb25maWc/OiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgZm9yY2VVbnN1cHBvcnRlZE5leHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGQob3B0czogQnVpbGRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLnJlc29sdmUob3B0cy5kaXIpO1xuXG4gIGNvbnN0IHBrZ0pzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5hY2Nlc3MocGtnSnNvblBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTmV4dC5qcyBwcm9qZWN0IG5vdCBmb3VuZCBhdCAke3Byb2plY3REaXJ9IChubyBwYWNrYWdlLmpzb24pYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBvcGVuTmV4dERpciA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnLm9wZW4tbmV4dCcpO1xuXG4gIGxldCBjb25maWdQYXRoID0gb3B0cy5jb25maWc7XG4gIGxldCB0ZW1wQ29uZmlnID0gZmFsc2U7XG5cbiAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFsnb3Blbi1uZXh0LmNvbmZpZy50cycsICdvcGVuLW5leHQuY29uZmlnLmpzJ107XG4gICAgZm9yIChjb25zdCBjIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgYyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MocCk7XG4gICAgICAgIGNvbmZpZ1BhdGggPSBwO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdbYnVpbGRdIE5vIG9wZW4tbmV4dC5jb25maWcgZm91bmQsIGdlbmVyYXRpbmcgZGVmYXVsdCBjb25maWcuLi4nXG4gICAgKTtcbiAgICBjb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvcGVuLW5leHQuY29uZmlnLnRzJyk7XG4gICAgYXdhaXQgbWF0ZXJpYWxpemVPdmVycmlkZXMocHJvamVjdERpcik7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGdlbmVyYXRlRGVmYXVsdENvbmZpZyh7XG4gICAgICBvdmVycmlkZXNEaXI6IGAuLyR7UENHX09WRVJSSURFU19SRUx9YCxcbiAgICB9KTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoY29uZmlnUGF0aCwgY29uZmlnQ29udGVudCk7XG4gICAgdGVtcENvbmZpZyA9IHRydWU7XG4gIH1cblxuICBpZiAob3B0cy5kcnlSdW4pIHtcbiAgICBjb25zb2xlLmxvZygnW2J1aWxkXSBEcnkgcnVuIG1vZGUg4oCUIGJ1aWxkIHBsYW46Jyk7XG4gICAgY29uc29sZS5sb2coYCAgUHJvamVjdCBkaXI6ICR7cHJvamVjdERpcn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBDb25maWc6ICR7Y29uZmlnUGF0aH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBPdXRwdXQ6ICR7b3Blbk5leHREaXJ9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZGlyRXhpc3RzKG9wZW5OZXh0RGlyKSkge1xuICAgICAgY29uc29sZS5sb2coJ1tidWlsZF0gQ2xlYW5pbmcgb2xkIC5vcGVuLW5leHQvIGRpcmVjdG9yeS4uLicpO1xuICAgICAgYXdhaXQgZnMucm0ob3Blbk5leHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWJ1Zykge1xuICAgICAgcHJvY2Vzcy5lbnYuT1BFTl9ORVhUX0RFQlVHID0gJ3RydWUnO1xuICAgIH1cblxuICAgIGxldCBmb3JjZVVuc3VwcG9ydGVkID0gb3B0cy5mb3JjZVVuc3VwcG9ydGVkTmV4dCA9PT0gdHJ1ZTtcbiAgICBpZiAoIWZvcmNlVW5zdXBwb3J0ZWQgJiYgcHJvY2Vzcy5lbnYuUENHX1NUUklDVF9ORVhUX1NVUFBPUlQgIT09ICcxJykge1xuICAgICAgY29uc3QgbmV4dE1ham9yID0gYXdhaXQgZGV0ZWN0TmV4dE1ham9yKHByb2plY3REaXIpO1xuICAgICAgaWYgKG5leHRNYWpvciAhPT0gbnVsbCAmJiBpc05leHRNYWpvclVuc3VwcG9ydGVkKG5leHRNYWpvcikpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbYnVpbGRdIE5leHQgJHtuZXh0TWFqb3J9LnggaXMgcGFzdCBPcGVuTmV4dCdzICR7TkVYVF9TVVBQT1JUX1dJTkRPV19ZRUFSU30teWVhciBzdXBwb3J0IHdpbmRvdyDigJQgYCArXG4gICAgICAgICAgICAnYXV0by1lbmFibGluZyAtLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQuICcgK1xuICAgICAgICAgICAgJ1NldCBQQ0dfU1RSSUNUX05FWFRfU1VQUE9SVD0xIHRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4nXG4gICAgICAgICk7XG4gICAgICAgIGZvcmNlVW5zdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdbYnVpbGRdIFJ1bm5pbmcgT3Blbk5leHQgYnVpbGQuLi4nKTtcbiAgICBjb25zdCBwcmV2Q3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcm9qZWN0RGlyKTtcbiAgICAgIC8vIE9wZW5OZXh0IHJlc29sdmVzIGBuZXh0YCB2aWEgcHJvY2Vzcy5jd2QoKSAvIHsgcGF0aHM6IFthcHBQYXRoXSB9LFxuICAgICAgLy8gc28gbG9hZGluZyBpdCBmcm9tIHRoZSBDTEkncyBvd24gbm9kZV9tb2R1bGVzIHN0aWxsIGZpbmRzIHRoZSB1c2VyJ3MgTmV4dC5cbiAgICAgIGNvbnN0IG9wZW5OZXh0QnVpbGQgPSByZXF1aXJlKCdAb3Blbm5leHRqcy9hd3MvYnVpbGQuanMnKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlQ29uZmlnUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdERpciwgY29uZmlnUGF0aCEpO1xuICAgICAgYXdhaXQgb3Blbk5leHRCdWlsZC5idWlsZChcbiAgICAgICAgcmVsYXRpdmVDb25maWdQYXRoLFxuICAgICAgICAnQG9wZW5uZXh0anMvYXdzJyxcbiAgICAgICAgZm9yY2VVbnN1cHBvcnRlZFxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcmV2Q3dkKTtcbiAgICB9XG5cbiAgICBhd2FpdCBlbWJlZFRhZ01hbmlmZXN0KG9wZW5OZXh0RGlyKTtcblxuICAgIGNvbnNvbGUubG9nKCdbYnVpbGRdIEJ1aWxkIGNvbXBsZXRlIScpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICh0ZW1wQ29uZmlnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsoY29uZmlnUGF0aCEpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW2J1aWxkXSBXYXJuaW5nOiBmYWlsZWQgdG8gY2xlYW4gdXAgdGVtcG9yYXJ5IGNvbmZpZyBmaWxlJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xlYW51cE92ZXJyaWRlcyhwcm9qZWN0RGlyKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtidWlsZF0gV2FybmluZzogZmFpbGVkIHRvIGNsZWFuIHVwICR7UENHX09WRVJSSURFU19SRUx9L2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJ1aWxkQ29tbWFuZCgpOiBDb21tYW5kIHtcbiAgcmV0dXJuIG5ldyBDb21tYW5kKCdidWlsZCcpXG4gICAgLmRlc2NyaXB0aW9uKCdCdWlsZCBOZXh0LmpzIHByb2plY3QgZm9yIGRlcGxveW1lbnQgdmlhIHBhZ2VzLWNhY2hlLWdhdGV3YXknKVxuICAgIC5vcHRpb24oJy0tZGlyIDxwYXRoPicsICdOZXh0LmpzIHByb2plY3QgZGlyZWN0b3J5JywgJy4nKVxuICAgIC5vcHRpb24oJy0tY29uZmlnIDxwYXRoPicsICdvcGVuLW5leHQuY29uZmlnLnRzIHBhdGgnKVxuICAgIC5vcHRpb24oJy0tZGVidWcnLCAnRW5hYmxlIGRlYnVnIG1vZGUnKVxuICAgIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdTaG93IGJ1aWxkIHBsYW4gd2l0aG91dCBleGVjdXRpbmcnKVxuICAgIC5vcHRpb24oJy0tZm9yY2UtdW5zdXBwb3J0ZWQtbmV4dCcsICdBbGxvdyB1bnN1cHBvcnRlZCBOZXh0LmpzIHZlcnNpb25zJylcbiAgICAuYWN0aW9uKGFzeW5jIG9wdGlvbnMgPT4ge1xuICAgICAgYXdhaXQgcnVuQnVpbGQoe1xuICAgICAgICBkaXI6IG9wdGlvbnMuZGlyLFxuICAgICAgICBjb25maWc6IG9wdGlvbnMuY29uZmlnLFxuICAgICAgICBkZWJ1Zzogb3B0aW9ucy5kZWJ1ZyxcbiAgICAgICAgZHJ5UnVuOiBvcHRpb25zLmRyeVJ1bixcbiAgICAgICAgZm9yY2VVbnN1cHBvcnRlZE5leHQ6IG9wdGlvbnMuZm9yY2VVbnN1cHBvcnRlZE5leHQsXG4gICAgICB9KTtcbiAgICB9KTtcbn1cbiJdfQ==
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLGtDQUFrQztBQUNsQyx5Q0FBb0M7QUFDcEMsbUNBQXVDO0FBQ3ZDLGlGQUEyRTtBQUUzRSx5RUFBeUU7QUFDekUsaUZBQWlGO0FBQ2pGLDJEQUEyRDtBQUMzRCxNQUFNLGtCQUFrQixHQUEyQjtJQUNqRCxFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtDQUNqQixDQUFDO0FBQ0YsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7QUFFcEMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxVQUFrQjtJQUMvQyxJQUFJO1FBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDdkIsVUFBVSxFQUNWLGNBQWMsRUFDZCxNQUFNLEVBQ04sY0FBYyxDQUNmLENBQUM7UUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUMzQztJQUFDLFdBQU07UUFDTixPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsS0FBYTtJ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T0FBTyxFQUFDLEVBQUU7UUFDdEIsTUFBTSxRQUFRLENBQUM7WUFDYixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtTQUNuRCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFqQkQsZ0RBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgZGlyRXhpc3RzIH0gZnJvbSAnLi4vdXRpbC9mcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURlZmF1bHRDb25maWcgfSBmcm9tICcuLi9jb25maWcvZGVmYXVsdC1vcGVuLW5leHQtY29uZmlnJztcblxuLy8gTWlycm9yIG9mIE9wZW5OZXh0J3MgTkVYVF9SRUxFQVNFX0RBVEVTIChoZWxwZXIuanMpLiBVc2VkIHRvIGF1dG8tcGFzc1xuLy8gLS1mb3JjZS11bnN1cHBvcnRlZC1uZXh0IHdoZW4gdGhlIHVzZXIncyBOZXh0IG1ham9yIGlzIHBhc3QgaXRzIDIteWVhciB3aW5kb3csXG4vLyBzbyBwaXBlbGluZSBidWlsZHMgZG9uJ3QgZmFpbCBvbiBPcGVuTmV4dCdzIHBvbGljeSBnYXRlLlxuY29uc3QgTkVYVF9SRUxFQVNFX0RBVEVTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAxNjogJzIwMjUtMTAtMjEnLFxuICAxNTogJzIwMjQtMTAtMjEnLFxuICAxNDogJzIwMjMtMTAtMjYnLFxuICAxMzogJzIwMjItMTAtMjYnLFxuICAxMjogJzIwMjEtMTAtMjYnLFxufTtcbmNvbnN0IE5FWFRfU1VQUE9SVF9XSU5ET1dfWUVBUlMgPSAyO1xuXG5hc3luYyBmdW5jdGlvbiBkZXRlY3ROZXh0TWFqb3IocHJvamVjdERpcjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGtnUGF0aCA9IHBhdGguam9pbihcbiAgICAgIHByb2plY3REaXIsXG4gICAgICAnbm9kZV9tb2R1bGVzJyxcbiAgICAgICduZXh0JyxcbiAgICAgICdwYWNrYWdlLmpzb24nXG4gICAgKTtcbiAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBrZ1BhdGgsICd1dGYtOCcpKTtcbiAgICBjb25zdCBtYWpvciA9IHBhcnNlSW50KFN0cmluZyhwa2cudmVyc2lvbikuc3BsaXQoJy4nKVswXSwgMTApO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4obWFqb3IpID8gbnVsbCA6IG1ham9yO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05leHRNYWpvclVuc3VwcG9ydGVkKG1ham9yOiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgcmVsZWFzZURhdGUgPSBORVhUX1JFTEVBU0VfREFURVNbbWFqb3JdO1xuICBpZiAoIXJlbGVhc2VEYXRlKSByZXR1cm4gbWFqb3IgPCAxMjtcbiAgY29uc3QgZW9sID0gbmV3IERhdGUocmVsZWFzZURhdGUpO1xuICBlb2wuc2V0RnVsbFllYXIoZW9sLmdldEZ1bGxZZWFyKCkgKyBORVhUX1NVUFBPUlRfV0lORE9XX1lFQVJTKTtcbiAgcmV0dXJuIERhdGUubm93KCkgPiBlb2wuZ2V0VGltZSgpO1xufVxuXG4vLyBQYXRoIGluc2lkZSA8cHJvamVjdERpcj4gd2hlcmUgd2UgbWF0ZXJpYWxpemUgb3ZlcnJpZGUgYnVuZGxlcyBzbyB0aGVcbi8vIGF1dG8tZ2VuZXJhdGVkIG9wZW4tbmV4dC5jb25maWcgY2FuIHJlZmVyZW5jZSB0aGVtIHZpYSBhIHJlbGF0aXZlIHBhdGguXG4vLyBSZWxhdGl2ZSBmb3JtIG5lZWRlZCBiZWNhdXNlIGFic29sdXRlIF9fZGlybmFtZSBwYXRocyBicmVhayB3aGVuIHRoZSBDTEkgaXNcbi8vIG5jYy1idW5kbGVkIGludG8gYSBzaW5nbGUgZmlsZSAoc3ViZGlyZWN0b3J5IHRyZWUgbm8gbG9uZ2VyIGV4aXN0cykuXG5jb25zdCBQQ0dfT1ZFUlJJREVTX1JFTCA9ICcucGNnL292ZXJyaWRlcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1hdGVyaWFsaXplT3ZlcnJpZGVzKHByb2plY3REaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBMYXp5IHJlcXVpcmUg4oCUIGtlZXBzIHRoZSBpbmxpbmUtb3ZlcnJpZGVzIGJ1bmRsZSBvdXQgb2YgdGhlIGltcG9ydCBncmFwaFxuICAvLyBmb3IgY29kZSBwYXRocyB0aGF0IGRvbid0IGF1dG8tZ2VuZXJhdGUgdGhlIGNvbmZpZy5cbiAgbGV0IElOTElORV9PVkVSUklERVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHRyeSB7XG4gICAgKHsgSU5MSU5FX09WRVJSSURFUyB9ID0gcmVxdWlyZSgnLi4vX2lubGluZS1vdmVycmlkZXMnKSk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdbYnVpbGRdIGRpc3QvX2lubGluZS1vdmVycmlkZXMuanMgbWlzc2luZyBmcm9tIGVzYS1wY2ctY2xpLiAnICtcbiAgICAgICAgICAnVGhlIHB1Ymxpc2hlZCBwYWNrYWdlIHdhcyBidWlsdCB3aXRob3V0IHNjcmlwdHMvYnVuZGxlLW92ZXJyaWRlcy5qcy4gJyArXG4gICAgICAgICAgJ1JlaW5zdGFsbCBhIG5ld2VyIGVzYS1wY2ctY2xpIChidWlsdCB3aXRoIHRoZSBmdWxsIGBwbnBtIGJ1aWxkYCBwaXBlbGluZSkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgUENHX09WRVJSSURFU19SRUwpO1xuICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKElOTElORV9PVkVSUklERVMpIGFzIFtcbiAgICBzdHJpbmcsXG4gICAgc3RyaW5nLFxuICBdW10pIHtcbiAgICBjb25zdCB0YXJnZXQgPSBwYXRoLmpvaW4ob3ZlcnJpZGVzUm9vdCwgcmVsUGF0aCk7XG4gICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHRhcmdldCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0YXJnZXQsIHNvdXJjZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cE92ZXJyaWRlcyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCBQQ0dfT1ZFUlJJREVTX1JFTCk7XG4gIGF3YWl0IGZzLnJtKG92ZXJyaWRlc1Jvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgLy8gQWxzbyB0cnkgdG8gcmVtb3ZlIHRoZSAucGNnIHBhcmVudCBpZiBpdCdzIGVtcHR5OyBpZ25vcmUgaWYgbm90LlxuICBhd2FpdCBmcy5ybWRpcihwYXRoLmpvaW4ocHJvamVjdERpciwgJy5wY2cnKSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIGRpcjogc3RyaW5nO1xuICBjb25maWc/OiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgZm9yY2VVbnN1cHBvcnRlZE5leHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGQob3B0czogQnVpbGRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLnJlc29sdmUob3B0cy5kaXIpO1xuXG4gIGNvbnN0IHBrZ0pzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5hY2Nlc3MocGtnSnNvblBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTmV4dC5qcyBwcm9qZWN0IG5vdCBmb3VuZCBhdCAke3Byb2plY3REaXJ9IChubyBwYWNrYWdlLmpzb24pYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBvcGVuTmV4dERpciA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnLm9wZW4tbmV4dCcpO1xuXG4gIGxldCBjb25maWdQYXRoID0gb3B0cy5jb25maWc7XG4gIGxldCB0ZW1wQ29uZmlnID0gZmFsc2U7XG5cbiAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFsnb3Blbi1uZXh0LmNvbmZpZy50cycsICdvcGVuLW5leHQuY29uZmlnLmpzJ107XG4gICAgZm9yIChjb25zdCBjIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgYyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MocCk7XG4gICAgICAgIGNvbmZpZ1BhdGggPSBwO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdbYnVpbGRdIE5vIG9wZW4tbmV4dC5jb25maWcgZm91bmQsIGdlbmVyYXRpbmcgZGVmYXVsdCBjb25maWcuLi4nXG4gICAgKTtcbiAgICBjb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvcGVuLW5leHQuY29uZmlnLnRzJyk7XG4gICAgYXdhaXQgbWF0ZXJpYWxpemVPdmVycmlkZXMocHJvamVjdERpcik7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGdlbmVyYXRlRGVmYXVsdENvbmZpZyh7XG4gICAgICBvdmVycmlkZXNEaXI6IGAuLyR7UENHX09WRVJSSURFU19SRUx9YCxcbiAgICB9KTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoY29uZmlnUGF0aCwgY29uZmlnQ29udGVudCk7XG4gICAgdGVtcENvbmZpZyA9IHRydWU7XG4gIH1cblxuICBpZiAob3B0cy5kcnlSdW4pIHtcbiAgICBjb25zb2xlLmxvZygnW2J1aWxkXSBEcnkgcnVuIG1vZGUg4oCUIGJ1aWxkIHBsYW46Jyk7XG4gICAgY29uc29sZS5sb2coYCAgUHJvamVjdCBkaXI6ICR7cHJvamVjdERpcn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBDb25maWc6ICR7Y29uZmlnUGF0aH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBPdXRwdXQ6ICR7b3Blbk5leHREaXJ9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZGlyRXhpc3RzKG9wZW5OZXh0RGlyKSkge1xuICAgICAgY29uc29sZS5sb2coJ1tidWlsZF0gQ2xlYW5pbmcgb2xkIC5vcGVuLW5leHQvIGRpcmVjdG9yeS4uLicpO1xuICAgICAgYXdhaXQgZnMucm0ob3Blbk5leHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWJ1Zykge1xuICAgICAgcHJvY2Vzcy5lbnYuT1BFTl9ORVhUX0RFQlVHID0gJ3RydWUnO1xuICAgIH1cblxuICAgIGxldCBmb3JjZVVuc3VwcG9ydGVkID0gb3B0cy5mb3JjZVVuc3VwcG9ydGVkTmV4dCA9PT0gdHJ1ZTtcbiAgICBpZiAoIWZvcmNlVW5zdXBwb3J0ZWQgJiYgcHJvY2Vzcy5lbnYuUENHX1NUUklDVF9ORVhUX1NVUFBPUlQgIT09ICcxJykge1xuICAgICAgY29uc3QgbmV4dE1ham9yID0gYXdhaXQgZGV0ZWN0TmV4dE1ham9yKHByb2plY3REaXIpO1xuICAgICAgaWYgKG5leHRNYWpvciAhPT0gbnVsbCAmJiBpc05leHRNYWpvclVuc3VwcG9ydGVkKG5leHRNYWpvcikpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbYnVpbGRdIE5leHQgJHtuZXh0TWFqb3J9LnggaXMgcGFzdCBPcGVuTmV4dCdzICR7TkVYVF9TVVBQT1JUX1dJTkRPV19ZRUFSU30teWVhciBzdXBwb3J0IHdpbmRvdyDigJQgYCArXG4gICAgICAgICAgICAnYXV0by1lbmFibGluZyAtLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQuICcgK1xuICAgICAgICAgICAgJ1NldCBQQ0dfU1RSSUNUX05FWFRfU1VQUE9SVD0xIHRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4nXG4gICAgICAgICk7XG4gICAgICAgIGZvcmNlVW5zdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdbYnVpbGRdIFJ1bm5pbmcgT3Blbk5leHQgYnVpbGQuLi4nKTtcbiAgICBjb25zdCBwcmV2Q3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcm9qZWN0RGlyKTtcbiAgICAgIC8vIE9wZW5OZXh0IHJlc29sdmVzIGBuZXh0YCB2aWEgcHJvY2Vzcy5jd2QoKSAvIHsgcGF0aHM6IFthcHBQYXRoXSB9LFxuICAgICAgLy8gc28gbG9hZGluZyBpdCBmcm9tIHRoZSBDTEkncyBvd24gbm9kZV9tb2R1bGVzIHN0aWxsIGZpbmRzIHRoZSB1c2VyJ3MgTmV4dC5cbiAgICAgIGNvbnN0IG9wZW5OZXh0QnVpbGQgPSByZXF1aXJlKCdAb3Blbm5leHRqcy9hd3MvYnVpbGQuanMnKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlQ29uZmlnUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdERpciwgY29uZmlnUGF0aCEpO1xuICAgICAgYXdhaXQgb3Blbk5leHRCdWlsZC5idWlsZChcbiAgICAgICAgcmVsYXRpdmVDb25maWdQYXRoLFxuICAgICAgICAnQG9wZW5uZXh0anMvYXdzJyxcbiAgICAgICAgZm9yY2VVbnN1cHBvcnRlZFxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcmV2Q3dkKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW2J1aWxkXSBCdWlsZCBjb21wbGV0ZSEnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcENvbmZpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKGNvbmZpZ1BhdGghKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tidWlsZF0gV2FybmluZzogZmFpbGVkIHRvIGNsZWFuIHVwIHRlbXBvcmFyeSBjb25maWcgZmlsZSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsZWFudXBPdmVycmlkZXMocHJvamVjdERpcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbYnVpbGRdIFdhcm5pbmc6IGZhaWxlZCB0byBjbGVhbiB1cCAke1BDR19PVkVSUklERVNfUkVMfS9gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdWlsZENvbW1hbmQoKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgnYnVpbGQnKVxuICAgIC5kZXNjcmlwdGlvbignQnVpbGQgTmV4dC5qcyBwcm9qZWN0IGZvciBkZXBsb3ltZW50IHZpYSBwYWdlcy1jYWNoZS1nYXRld2F5JylcbiAgICAub3B0aW9uKCctLWRpciA8cGF0aD4nLCAnTmV4dC5qcyBwcm9qZWN0IGRpcmVjdG9yeScsICcuJylcbiAgICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnb3Blbi1uZXh0LmNvbmZpZy50cyBwYXRoJylcbiAgICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSBkZWJ1ZyBtb2RlJylcbiAgICAub3B0aW9uKCctLWRyeS1ydW4nLCAnU2hvdyBidWlsZCBwbGFuIHdpdGhvdXQgZXhlY3V0aW5nJylcbiAgICAub3B0aW9uKCctLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQnLCAnQWxsb3cgdW5zdXBwb3J0ZWQgTmV4dC5qcyB2ZXJzaW9ucycpXG4gICAgLmFjdGlvbihhc3luYyBvcHRpb25zID0+IHtcbiAgICAgIGF3YWl0IHJ1bkJ1aWxkKHtcbiAgICAgICAgZGlyOiBvcHRpb25zLmRpcixcbiAgICAgICAgY29uZmlnOiBvcHRpb25zLmNvbmZpZyxcbiAgICAgICAgZGVidWc6IG9wdGlvbnMuZGVidWcsXG4gICAgICAgIGRyeVJ1bjogb3B0aW9ucy5kcnlSdW4sXG4gICAgICAgIGZvcmNlVW5zdXBwb3J0ZWROZXh0OiBvcHRpb25zLmZvcmNlVW5zdXBwb3J0ZWROZXh0LFxuICAgICAgfSk7XG4gICAgfSk7XG59XG4iXX0=
@@ -17,16 +17,16 @@ export default class GatewayIncrementalCache {
17
17
  /**
18
18
  * 从 Gateway 读取缓存。
19
19
  */
20
- get(key: string, isFetch?: boolean): Promise<{
20
+ get(key: string, isFetch?: boolean | string): Promise<{
21
21
  value: any;
22
22
  lastModified: number;
23
23
  } | null>;
24
24
  /**
25
25
  * 向 Gateway 写入缓存。
26
26
  */
27
- set(key: string, value: any, isFetch?: boolean): Promise<void>;
27
+ set(key: string, value: any, isFetch?: boolean | string): Promise<void>;
28
28
  /**
29
29
  * 通过 Gateway 删除缓存。
30
30
  */
31
- delete(key: string, isFetch?: boolean): Promise<void>;
31
+ delete(key: string, isFetch?: boolean | string): Promise<void>;
32
32
  }
@@ -10,15 +10,23 @@
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
11
  const protocol_1 = require("../../_protocol");
12
12
  const gateway_auth_1 = require("../../runtime/gateway-auth");
13
+ const edge_context_1 = require("../../runtime/edge-context");
13
14
  const GET_TIMEOUT = 5000;
14
15
  const SET_TIMEOUT = 10000;
15
16
  const DELETE_TIMEOUT = 5000;
16
- function buildKey(config, key, isFetch) {
17
+ function buildKey(config, key, isFetchOrType) {
18
+ let cacheType;
19
+ if (typeof isFetchOrType === 'string') {
20
+ cacheType = isFetchOrType === 'fetch' ? 'fetch' : 'cache';
21
+ }
22
+ else {
23
+ cacheType = isFetchOrType ? 'fetch' : 'cache';
24
+ }
17
25
  return (0, protocol_1.buildOssKey)({
18
26
  appId: `${config.aliuid}/${config.routinename}`,
19
27
  buildId: config.version,
20
28
  key,
21
- cacheType: isFetch ? 'fetch' : 'cache',
29
+ cacheType,
22
30
  });
23
31
  }
24
32
  class GatewayIncrementalCache {
@@ -41,6 +49,7 @@ class GatewayIncrementalCache {
41
49
  * 从 Gateway 读取缓存。
42
50
  */
43
51
  async get(key, isFetch) {
52
+ var _a, _b;
44
53
  const config = this.getConfig();
45
54
  if (!config)
46
55
  return null;
@@ -66,7 +75,7 @@ class GatewayIncrementalCache {
66
75
  try {
67
76
  envelope = JSON.parse(body);
68
77
  }
69
- catch (_a) {
78
+ catch (_c) {
70
79
  console.warn(`[incrementalCache] JSON 解析失败: key="${ossKey}"`);
71
80
  return null;
72
81
  }
@@ -76,6 +85,11 @@ class GatewayIncrementalCache {
76
85
  console.warn(`[incrementalCache] envelope 格式异常或缺 lastModified: key="${ossKey}"`);
77
86
  return null;
78
87
  }
88
+ const val = envelope.value;
89
+ const tags = (_b = (_a = val === null || val === void 0 ? void 0 : val.meta) === null || _a === void 0 ? void 0 : _a.headers) === null || _b === void 0 ? void 0 : _b['x-next-cache-tags'];
90
+ if (typeof tags === 'string') {
91
+ (0, edge_context_1.setCacheTags)(tags);
92
+ }
79
93
  return { value: envelope.value, lastModified: envelope.lastModified };
80
94
  }
81
95
  catch (err) {
@@ -157,4 +171,4 @@ class GatewayIncrementalCache {
157
171
  }
158
172
  }
159
173
  exports.default = GatewayIncrementalCache;
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvaW5jcmVtZW50YWxDYWNoZS9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOztBQUVILDRDQUE0QztBQUM1Qyw2REFJb0M7QUFFcEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFFNUIsU0FBUyxRQUFRLENBQ2YsTUFBeUIsRUFDekIsR0FBVyxFQUNYLE9BQWlCO0lBRWpCLE9BQU8sSUFBQSxzQkFBVyxFQUFDO1FBQ2pCLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUMvQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsR0FBRztRQUNILFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTztLQUN2QyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBcUIsdUJBQXVCO0lBQTVDO1FBQ0UsU0FBSSxHQUFHLDJCQUFvQyxDQUFDO1FBRXBDLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBQ3hDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO0lBcUsvQixDQUFDO0lBbktDOztPQUVHO0lBQ0ssU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBQSxvQ0FBcUIsR0FBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQ1AsR0FBVyxFQUNYLE9BQWlCO1FBRWpC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Z0JBQ2hCLFNBQVMsRUFBRSxjQUFjO2FBQzFCLENBQUMsQ0FBQztZQUVILElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHO2dCQUFFLE9BQU87WUFFL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQ1gsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtvQkFDNUMsT0FBTyxDQUFDLEtBQUssQ0FDWCx1Q0FBdUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLHlCQUF5QixDQUN2RixDQUFDO2lCQUNIO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxJQUFJLENBQ1Ysc0NBQXNDLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQ25FLENBQUM7aUJBQ0g7YUFDRjtTQUNGO1FBQUMsT0FBTyxHQUFRLEVBQUU7WUFDakIsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTtnQkFDN0IsT0FBTyxDQUFDLElBQUksQ0FDVixzQ0FBc0MsTUFBTSxNQUFNLGNBQWMsS0FBSyxDQUN0RSxDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FDVixzQ0FBc0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDaEUsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0NBQ0Y7QUF6S0QsMENBeUtDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHYXRld2F5IOWinumHj+e8k+WtmCBPdmVycmlkZVxuICpcbiAqIE5leHQuanMgRnVuY3Rpb24g6L+Q6KGM5pe255qE5aKe6YeP57yT5a2Y5a6e546w77yM6YCa6L+HIEdhdGV3YXkg5Luj55CG6K+75YaZIE9TU+OAglxuICog6Ym05p2D57uf5LiA6LWwIHJ1bnRpbWUvZ2F0ZXdheS1hdXRo77yISE1BQyDnrb7lkI0gKyA0IGhlYWRlcu+8ieOAglxuICpcbiAqIEBzZWUgc3BlY3MvcnVudGltZS9pbmNyZW1lbnRhbC1jYWNoZS1vdmVycmlkZS5zcGVjLm1kXG4gKi9cblxuaW1wb3J0IHsgYnVpbGRPc3NLZXkgfSBmcm9tICdAcGNnL3Byb3RvY29sJztcbmltcG9ydCB7XG4gIGxvYWRHYXRld2F5QXV0aENvbmZpZyxcbiAgZ2F0ZXdheUZldGNoLFxuICBHYXRld2F5QXV0aENvbmZpZyxcbn0gZnJvbSAnLi4vLi4vcnVudGltZS9nYXRld2F5LWF1dGgnO1xuXG5jb25zdCBHRVRfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBTRVRfVElNRU9VVCA9IDEwMDAwO1xuY29uc3QgREVMRVRFX1RJTUVPVVQgPSA1MDAwO1xuXG5mdW5jdGlvbiBidWlsZEtleShcbiAgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyxcbiAga2V5OiBzdHJpbmcsXG4gIGlzRmV0Y2g/OiBib29sZWFuXG4pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRPc3NLZXkoe1xuICAgIGFwcElkOiBgJHtjb25maWcuYWxpdWlkfS8ke2NvbmZpZy5yb3V0aW5lbmFtZX1gLFxuICAgIGJ1aWxkSWQ6IGNvbmZpZy52ZXJzaW9uLFxuICAgIGtleSxcbiAgICBjYWNoZVR5cGU6IGlzRmV0Y2ggPyAnZmV0Y2gnIDogJ2NhY2hlJyxcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhdGV3YXlJbmNyZW1lbnRhbENhY2hlIHtcbiAgbmFtZSA9ICdnYXRld2F5LWluY3JlbWVudGFsLWNhY2hlJyBhcyBjb25zdDtcblxuICBwcml2YXRlIGNvbmZpZzogR2F0ZXdheUF1dGhDb25maWcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25maWdMb2FkZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICog5bu26L+f5Yqg6L296YWN572u77yM6YG/5YWN5Zyo5p6E6YCg5Ye95pWw5Lit5Zug546v5aKD5Y+Y6YeP57y65aSx6ICM6Zi75aGeIEZ1bmN0aW9uIOWQr+WKqOOAglxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb25maWcoKTogR2F0ZXdheUF1dGhDb25maWcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnTG9hZGVkKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IGxvYWRHYXRld2F5QXV0aENvbmZpZygpO1xuICAgICAgdGhpcy5jb25maWdMb2FkZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICAvKipcbiAgICog5LuOIEdhdGV3YXkg6K+75Y+W57yT5a2Y44CCXG4gICAqL1xuICBhc3luYyBnZXQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgaXNGZXRjaD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTx7IHZhbHVlOiBhbnk7IGxhc3RNb2RpZmllZDogbnVtYmVyIH0gfCBudWxsPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBvc3NLZXkgPSBidWlsZEtleShjb25maWcsIGtleSwgaXNGZXRjaCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgYC9zdG9yYWdlLyR7b3NzS2V5fWAsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgdGltZW91dE1zOiBHRVRfVElNRU9VVCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDA0KSByZXR1cm4gbnVsbDtcblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBHRVQg6KKr5ouS57udOiBrZXk9XCIke29zc0tleX1cIiAoJHtyZXMuc3RhdHVzfSnvvIzor7fmo4Dmn6Xnrb7lkI0gc2VjcmV0IOaIliBrZXkg5YmN57yAYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBHRVQg5aSx6LSlOiBrZXk9XCIke29zc0tleX1cIiwg54q25oCB56CBPSR7cmVzLnN0YXR1c31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICBsZXQgZW52ZWxvcGU6IHsgbGFzdE1vZGlmaWVkPzogdW5rbm93bjsgdmFsdWU/OiB1bmtub3duIH07XG4gICAgICB0cnkge1xuICAgICAgICBlbnZlbG9wZSA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbaW5jcmVtZW50YWxDYWNoZV0gSlNPTiDop6PmnpDlpLHotKU6IGtleT1cIiR7b3NzS2V5fVwiYCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhZW52ZWxvcGUgfHxcbiAgICAgICAgdHlwZW9mIGVudmVsb3BlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICB0eXBlb2YgZW52ZWxvcGUubGFzdE1vZGlmaWVkICE9PSAnbnVtYmVyJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIGVudmVsb3BlIOagvOW8j+W8guW4uOaIlue8uiBsYXN0TW9kaWZpZWQ6IGtleT1cIiR7b3NzS2V5fVwiYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHZhbHVlOiBlbnZlbG9wZS52YWx1ZSwgbGFzdE1vZGlmaWVkOiBlbnZlbG9wZS5sYXN0TW9kaWZpZWQgfTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gR0VUIOi2heaXtjoga2V5PVwiJHtvc3NLZXl9XCIgKCR7R0VUX1RJTUVPVVR9bXMpYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gR0VUIOW8guW4uDoga2V5PVwiJHtvc3NLZXl9XCIsICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWQkSBHYXRld2F5IOWGmeWFpee8k+WtmOOAglxuICAgKi9cbiAgYXN5bmMgc2V0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnksXG4gICAgaXNGZXRjaD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3NzS2V5ID0gYnVpbGRLZXkoY29uZmlnLCBrZXksIGlzRmV0Y2gpO1xuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeSh7IGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSwgdmFsdWUgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgYC9zdG9yYWdlLyR7b3NzS2V5fWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHksXG4gICAgICAgIHRpbWVvdXRNczogU0VUX1RJTUVPVVQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBQVVQg6KKr5ouS57udOiBrZXk9XCIke29zc0tleX1cIiAoJHtyZXMuc3RhdHVzfSnvvIzor7fmo4Dmn6Xnrb7lkI0gc2VjcmV0IOaIliBrZXkg5YmN57yAYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBQVVQg5aSx6LSlOiBrZXk9XCIke29zc0tleX1cIiwg54q25oCB56CBPSR7cmVzLnN0YXR1c31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBQVVQg6LaF5pe2OiBrZXk9XCIke29zc0tleX1cIiAoJHtTRVRfVElNRU9VVH1tcylgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBQVVQg5byC5bi4OiBrZXk9XCIke29zc0tleX1cIiwgJHtlcnIubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/hyBHYXRld2F5IOWIoOmZpOe8k+WtmOOAglxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nLCBpc0ZldGNoPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICAgIGNvbnN0IG9zc0tleSA9IGJ1aWxkS2V5KGNvbmZpZywga2V5LCBpc0ZldGNoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBnYXRld2F5RmV0Y2goY29uZmlnLCBgL3N0b3JhZ2UvJHtvc3NLZXl9YCwge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICB0aW1lb3V0TXM6IERFTEVURV9USU1FT1VULFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDQpIHJldHVybjtcblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBERUxFVEUg6KKr5ouS57udOiBrZXk9XCIke29zc0tleX1cIiAoJHtyZXMuc3RhdHVzfSnvvIzor7fmo4Dmn6Xnrb7lkI0gc2VjcmV0IOaIliBrZXkg5YmN57yAYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBERUxFVEUg5aSx6LSlOiBrZXk9XCIke29zc0tleX1cIiwg54q25oCB56CBPSR7cmVzLnN0YXR1c31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBERUxFVEUg6LaF5pe2OiBrZXk9XCIke29zc0tleX1cIiAoJHtERUxFVEVfVElNRU9VVH1tcylgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBERUxFVEUg5byC5bi4OiBrZXk9XCIke29zc0tleX1cIiwgJHtlcnIubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvaW5jcmVtZW50YWxDYWNoZS9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOztBQUVILDRDQUE0QztBQUM1Qyw2REFJb0M7QUFDcEMsNkRBQTBEO0FBRTFELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztBQUN6QixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDMUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBRTVCLFNBQVMsUUFBUSxDQUNmLE1BQXlCLEVBQ3pCLEdBQVcsRUFDWCxhQUFnQztJQUVoQyxJQUFJLFNBQWlCLENBQUM7SUFDdEIsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUU7UUFDckMsU0FBUyxHQUFHLGFBQWEsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0tBQzNEO1NBQU07UUFDTCxTQUFTLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztLQUMvQztJQUNELE9BQU8sSUFBQSxzQkFBVyxFQUFDO1FBQ2pCLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUMvQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsR0FBRztRQUNILFNBQVM7S0FDVixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBcUIsdUJBQXVCO0lBQTVDO1FBQ0UsU0FBSSxHQUFHLDJCQUFvQyxDQUFDO1FBRXBDLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBQ3hDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO0lBMksvQixDQUFDO0lBektDOztPQUVHO0lBQ0ssU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUks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aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FDVixzQ0FBc0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDaEUsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0NBQ0Y7QUEvS0QsMENBK0tDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHYXRld2F5IOWinumHj+e8k+WtmCBPdmVycmlkZVxuICpcbiAqIE5leHQuanMgRnVuY3Rpb24g6L+Q6KGM5pe255qE5aKe6YeP57yT5a2Y5a6e546w77yM6YCa6L+HIEdhdGV3YXkg5Luj55CG6K+75YaZIE9TU+OAglxuICog6Ym05p2D57uf5LiA6LWwIHJ1bnRpbWUvZ2F0ZXdheS1hdXRo77yISE1BQyDnrb7lkI0gKyA0IGhlYWRlcu+8ieOAglxuICpcbiAqIEBzZWUgc3BlY3MvcnVudGltZS9pbmNyZW1lbnRhbC1jYWNoZS1vdmVycmlkZS5zcGVjLm1kXG4gKi9cblxuaW1wb3J0IHsgYnVpbGRPc3NLZXkgfSBmcm9tICdAcGNnL3Byb3RvY29sJztcbmltcG9ydCB7XG4gIGxvYWRHYXRld2F5QXV0aENvbmZpZyxcbiAgZ2F0ZXdheUZldGNoLFxuICBHYXRld2F5QXV0aENvbmZpZyxcbn0gZnJvbSAnLi4vLi4vcnVudGltZS9nYXRld2F5LWF1dGgnO1xuaW1wb3J0IHsgc2V0Q2FjaGVUYWdzIH0gZnJvbSAnLi4vLi4vcnVudGltZS9lZGdlLWNvbnRleHQnO1xuXG5jb25zdCBHRVRfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBTRVRfVElNRU9VVCA9IDEwMDAwO1xuY29uc3QgREVMRVRFX1RJTUVPVVQgPSA1MDAwO1xuXG5mdW5jdGlvbiBidWlsZEtleShcbiAgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyxcbiAga2V5OiBzdHJpbmcsXG4gIGlzRmV0Y2hPclR5cGU/OiBib29sZWFuIHwgc3RyaW5nXG4pOiBzdHJpbmcge1xuICBsZXQgY2FjaGVUeXBlOiBzdHJpbmc7XG4gIGlmICh0eXBlb2YgaXNGZXRjaE9yVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjYWNoZVR5cGUgPSBpc0ZldGNoT3JUeXBlID09PSAnZmV0Y2gnID8gJ2ZldGNoJyA6ICdjYWNoZSc7XG4gIH0gZWxzZSB7XG4gICAgY2FjaGVUeXBlID0gaXNGZXRjaE9yVHlwZSA/ICdmZXRjaCcgOiAnY2FjaGUnO1xuICB9XG4gIHJldHVybiBidWlsZE9zc0tleSh7XG4gICAgYXBwSWQ6IGAke2NvbmZpZy5hbGl1aWR9LyR7Y29uZmlnLnJvdXRpbmVuYW1lfWAsXG4gICAgYnVpbGRJZDogY29uZmlnLnZlcnNpb24sXG4gICAga2V5LFxuICAgIGNhY2hlVHlwZSxcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhdGV3YXlJbmNyZW1lbnRhbENhY2hlIHtcbiAgbmFtZSA9ICdnYXRld2F5LWluY3JlbWVudGFsLWNhY2hlJyBhcyBjb25zdDtcblxuICBwcml2YXRlIGNvbmZpZzogR2F0ZXdheUF1dGhDb25maWcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25maWdMb2FkZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICog5bu26L+f5Yqg6L296YWN572u77yM6YG/5YWN5Zyo5p6E6YCg5Ye95pWw5Lit5Zug546v5aKD5Y+Y6YeP57y65aSx6ICM6Zi75aGeIEZ1bmN0aW9uIOWQr+WKqOOAglxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb25maWcoKTogR2F0ZXdheUF1dGhDb25maWcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnTG9hZGVkKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IGxvYWRHYXRld2F5QXV0aENvbmZpZygpO1xuICAgICAgdGhpcy5jb25maWdMb2FkZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICAvKipcbiAgICog5LuOIEdhdGV3YXkg6K+75Y+W57yT5a2Y44CCXG4gICAqL1xuICBhc3luYyBnZXQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgaXNGZXRjaD86IGJvb2xlYW4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTx7IHZhbHVlOiBhbnk7IGxhc3RNb2RpZmllZDogbnVtYmVyIH0gfCBudWxsPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBvc3NLZXkgPSBidWlsZEtleShjb25maWcsIGtleSwgaXNGZXRjaCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgYC9zdG9yYWdlLyR7b3NzS2V5fWAsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgdGltZW91dE1zOiBHRVRfVElNRU9VVCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDA0KSByZXR1cm4gbnVsbDtcblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBHRVQg6KKr5ouS57udOiBrZXk9XCIke29zc0tleX1cIiAoJHtyZXMuc3RhdHVzfSnvvIzor7fmo4Dmn6Xnrb7lkI0gc2VjcmV0IOaIliBrZXkg5YmN57yAYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBHRVQg5aSx6LSlOiBrZXk9XCIke29zc0tleX1cIiwg54q25oCB56CBPSR7cmVzLnN0YXR1c31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICBsZXQgZW52ZWxvcGU6IHsgbGFzdE1vZGlmaWVkPzogdW5rbm93bjsgdmFsdWU/OiB1bmtub3duIH07XG4gICAgICB0cnkge1xuICAgICAgICBlbnZlbG9wZSA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbaW5jcmVtZW50YWxDYWNoZV0gSlNPTiDop6PmnpDlpLHotKU6IGtleT1cIiR7b3NzS2V5fVwiYCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhZW52ZWxvcGUgfHxcbiAgICAgICAgdHlwZW9mIGVudmVsb3BlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICB0eXBlb2YgZW52ZWxvcGUubGFzdE1vZGlmaWVkICE9PSAnbnVtYmVyJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIGVudmVsb3BlIOagvOW8j+W8guW4uOaIlue8uiBsYXN0TW9kaWZpZWQ6IGtleT1cIiR7b3NzS2V5fVwiYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbCA9IGVudmVsb3BlLnZhbHVlIGFzIGFueTtcbiAgICAgIGNvbnN0IHRhZ3MgPSB2YWw/Lm1ldGE/LmhlYWRlcnM/LlsneC1uZXh0LWNhY2hlLXRhZ3MnXTtcbiAgICAgIGlmICh0eXBlb2YgdGFncyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2V0Q2FjaGVUYWdzKHRhZ3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyB2YWx1ZTogZW52ZWxvcGUudmFsdWUsIGxhc3RNb2RpZmllZDogZW52ZWxvcGUubGFzdE1vZGlmaWVkIH07XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIEdFVCDotoXml7Y6IGtleT1cIiR7b3NzS2V5fVwiICgke0dFVF9USU1FT1VUfW1zKWBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIEdFVCDlvILluLg6IGtleT1cIiR7b3NzS2V5fVwiLCAke2Vyci5tZXNzYWdlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlkJEgR2F0ZXdheSDlhpnlhaXnvJPlrZjjgIJcbiAgICovXG4gIGFzeW5jIHNldChcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55LFxuICAgIGlzRmV0Y2g/OiBib29sZWFuIHwgc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICAgIGNvbnN0IG9zc0tleSA9IGJ1aWxkS2V5KGNvbmZpZywga2V5LCBpc0ZldGNoKTtcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoeyBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCksIHZhbHVlIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdhdGV3YXlGZXRjaChjb25maWcsIGAvc3RvcmFnZS8ke29zc0tleX1gLCB7XG4gICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5LFxuICAgICAgICB0aW1lb3V0TXM6IFNFVF9USU1FT1VULFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDEgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gUFVUIOiiq+aLkue7nToga2V5PVwiJHtvc3NLZXl9XCIgKCR7cmVzLnN0YXR1c30p77yM6K+35qOA5p+l562+5ZCNIHNlY3JldCDmiJYga2V5IOWJjee8gGBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gUFVUIOWksei0pToga2V5PVwiJHtvc3NLZXl9XCIsIOeKtuaAgeeggT0ke3Jlcy5zdGF0dXN9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gUFVUIOi2heaXtjoga2V5PVwiJHtvc3NLZXl9XCIgKCR7U0VUX1RJTUVPVVR9bXMpYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gUFVUIOW8guW4uDoga2V5PVwiJHtvc3NLZXl9XCIsICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrov4cgR2F0ZXdheSDliKDpmaTnvJPlrZjjgIJcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShrZXk6IHN0cmluZywgaXNGZXRjaD86IGJvb2xlYW4gfCBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm47XG5cbiAgICBjb25zdCBvc3NLZXkgPSBidWlsZEtleShjb25maWcsIGtleSwgaXNGZXRjaCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgYC9zdG9yYWdlLyR7b3NzS2V5fWAsIHtcbiAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgdGltZW91dE1zOiBERUxFVEVfVElNRU9VVCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDA0KSByZXR1cm47XG5cbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDEgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gREVMRVRFIOiiq+aLkue7nToga2V5PVwiJHtvc3NLZXl9XCIgKCR7cmVzLnN0YXR1c30p77yM6K+35qOA5p+l562+5ZCNIHNlY3JldCDmiJYga2V5IOWJjee8gGBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gREVMRVRFIOWksei0pToga2V5PVwiJHtvc3NLZXl9XCIsIOeKtuaAgeeggT0ke3Jlcy5zdGF0dXN9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gREVMRVRFIOi2heaXtjoga2V5PVwiJHtvc3NLZXl9XCIgKCR7REVMRVRFX1RJTUVPVVR9bXMpYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gREVMRVRFIOW8guW4uDoga2V5PVwiJHtvc3NLZXl9XCIsICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -3,6 +3,10 @@
3
3
  *
4
4
  * 使用 OpenNext 的 nextMode 接口,通过 Gateway 代理读写 TableStore。
5
5
  * 鉴权统一走 runtime/gateway-auth(HMAC 签名 + 4 header)。
6
+ *
7
+ * CDN 失效:writeTags 写库后直接调 Gateway /cache/refresh(cacheTags),
8
+ * 由 ESA PurgeCaches Type=cachetag 原生按 Cache-Tag 刷新边缘缓存,
9
+ * 不再维护 tag→path manifest 映射。
6
10
  */
7
11
  declare type NextModeTagCacheWriteInput = string | {
8
12
  tag: string;
@@ -14,10 +18,7 @@ export default class GatewayTagCache {
14
18
  mode: "nextMode";
15
19
  private config;
16
20
  private configLoaded;
17
- private purgeClient;
18
- private purgeClientLoaded;
19
21
  private getConfig;
20
- private getPurgeClient;
21
22
  /**
22
23
  * 拼 TableStore tag 主键:`{buildId}/{tag}`。
23
24
  *
@@ -34,5 +35,10 @@ export default class GatewayTagCache {
34
35
  writeTags(tags: NextModeTagCacheWriteInput[]): Promise<void>;
35
36
  private batchGetTags;
36
37
  private batchWrite;
38
+ /**
39
+ * 调 Gateway /cache/refresh(cacheTags) 触发 ESA PurgeCaches Type=cachetag。
40
+ * hostname / siteId 从当前请求的 edge context 读取,缺失则 skip。
41
+ */
42
+ private purgeByCacheTags;
37
43
  }
38
44
  export {};
@@ -4,14 +4,19 @@
4
4
  *
5
5
  * 使用 OpenNext 的 nextMode 接口,通过 Gateway 代理读写 TableStore。
6
6
  * 鉴权统一走 runtime/gateway-auth(HMAC 签名 + 4 header)。
7
+ *
8
+ * CDN 失效:writeTags 写库后直接调 Gateway /cache/refresh(cacheTags),
9
+ * 由 ESA PurgeCaches Type=cachetag 原生按 Cache-Tag 刷新边缘缓存,
10
+ * 不再维护 tag→path manifest 映射。
7
11
  */
8
12
  Object.defineProperty(exports, "__esModule", { value: true });
9
13
  const gateway_auth_1 = require("../../runtime/gateway-auth");
10
- const cdn_purge_1 = require("../../runtime/cdn-purge");
14
+ const edge_context_1 = require("../../runtime/edge-context");
11
15
  const build_id_1 = require("../../runtime/build-id");
12
16
  const QUERY_TIMEOUT = 3000;
13
17
  const WRITE_TIMEOUT = 5000;
14
18
  const BATCH_SIZE = 200;
19
+ const PURGE_TIMEOUT = 15000;
15
20
  function stripLeadingSlash(s) {
16
21
  return s.replace(/^\/+/, '');
17
22
  }
@@ -21,8 +26,6 @@ class GatewayTagCache {
21
26
  this.mode = 'nextMode';
22
27
  this.config = null;
23
28
  this.configLoaded = false;
24
- this.purgeClient = null;
25
- this.purgeClientLoaded = false;
26
29
  }
27
30
  getConfig() {
28
31
  if (!this.configLoaded) {
@@ -31,14 +34,6 @@ class GatewayTagCache {
31
34
  }
32
35
  return this.config;
33
36
  }
34
- getPurgeClient() {
35
- if (!this.purgeClientLoaded) {
36
- const cfg = (0, cdn_purge_1.loadCdnPurgeConfig)();
37
- this.purgeClient = cfg ? (0, cdn_purge_1.createCdnPurgeClient)(cfg) : null;
38
- this.purgeClientLoaded = true;
39
- }
40
- return this.purgeClient;
41
- }
42
37
  /**
43
38
  * 拼 TableStore tag 主键:`{buildId}/{tag}`。
44
39
  *
@@ -136,6 +131,7 @@ class GatewayTagCache {
136
131
  const stale = typeof input === 'string' ? undefined : input.stale;
137
132
  const expire = typeof input === 'string' ? undefined : input.expire;
138
133
  const tagKey = this.buildTagKey(tagStr);
134
+ console.log(`[tagCache] writeTags: tag="${tagStr}" key="${tagKey}" ts=${writeTs}`);
139
135
  const columns = [
140
136
  { name: 'revalidatedAt', value: writeTs },
141
137
  ];
@@ -154,24 +150,22 @@ class GatewayTagCache {
154
150
  };
155
151
  });
156
152
  await this.batchWrite(config, rows);
157
- // 写库成功后,fire-and-forget 触发 ESA 边缘缓存失效。
158
- // 任何失败都不应回灌到调用方,所以 catch 直接 warn,不 throw、不 await。
159
- const purgeClient = this.getPurgeClient();
160
- if (purgeClient) {
161
- const tagStrs = tags
162
- .map(t => (typeof t === 'string' ? t : t.tag))
163
- .filter((s) => typeof s === 'string' && s.length > 0);
164
- if (tagStrs.length > 0) {
165
- purgeClient.purgeByTags(tagStrs).catch(err => {
166
- var _a;
167
- console.warn(`[tagCache] purge fan-out failed: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
168
- });
169
- }
153
+ // 写库成功后,fire-and-forget 触发 ESA 边缘缓存 tag 级失效。
154
+ const tagStrs = tags
155
+ .map(t => (typeof t === 'string' ? t : t.tag))
156
+ .filter((s) => typeof s === 'string' && s.length > 0);
157
+ if (tagStrs.length > 0) {
158
+ this.purgeByCacheTags(config, tagStrs).catch(err => {
159
+ var _a;
160
+ console.warn(`[tagCache] cacheTags purge failed: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
161
+ });
170
162
  }
171
163
  }
172
164
  // ---- private methods ----
173
165
  async batchGetTags(config, tags) {
174
166
  var _a, _b;
167
+ const tagKeys = tags.map(tag => this.buildTagKey(tag));
168
+ console.log(`[tagCache] batchGetTags: tags=${JSON.stringify(tags)} keys=${JSON.stringify(tagKeys)}`);
175
169
  const primaryKeys = tags.map(tag => [
176
170
  { name: 'app_id', value: `${config.aliuid}/${config.routinename}` },
177
171
  { name: 'tag', value: this.buildTagKey(tag) },
@@ -245,6 +239,41 @@ class GatewayTagCache {
245
239
  }
246
240
  }
247
241
  }
242
+ /**
243
+ * 调 Gateway /cache/refresh(cacheTags) 触发 ESA PurgeCaches Type=cachetag。
244
+ * hostname / siteId 从当前请求的 edge context 读取,缺失则 skip。
245
+ */
246
+ async purgeByCacheTags(config, tags) {
247
+ var _a;
248
+ const { hostname, siteId } = (0, edge_context_1.getEdgeContext)();
249
+ if (!hostname || siteId === undefined || siteId === '') {
250
+ console.warn(`[tagCache] cacheTags purge skip: edge context missing ` +
251
+ `(hostname=${hostname !== null && hostname !== void 0 ? hostname : '∅'} siteId=${siteId !== null && siteId !== void 0 ? siteId : '∅'})`);
252
+ return;
253
+ }
254
+ const body = { hostname, siteId, cacheTags: tags };
255
+ try {
256
+ const res = await (0, gateway_auth_1.gatewayFetch)(config, '/cache/refresh', {
257
+ method: 'POST',
258
+ headers: { 'Content-Type': 'application/json' },
259
+ body: JSON.stringify(body),
260
+ timeoutMs: PURGE_TIMEOUT,
261
+ });
262
+ if (!res.ok) {
263
+ let detail = '';
264
+ try {
265
+ detail = (await res.text()).slice(0, 200);
266
+ }
267
+ catch ( /* ignore */_b) { /* ignore */ }
268
+ console.warn(`[tagCache] cacheTags purge failed: status=${res.status} tags=${tags.length} ${detail}`);
269
+ return;
270
+ }
271
+ console.log(`[tagCache] cacheTags purge ok: tags=${tags.length}`);
272
+ }
273
+ catch (err) {
274
+ console.warn(`[tagCache] cacheTags purge error: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
275
+ }
276
+ }
248
277
  }
249
278
  exports.default = GatewayTagCache;
250
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvdGFnQ2FjaGUvZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7O0FBRUgsNkRBSW9DO0FBQ3BDLHVEQUlpQztBQUNqQyxxREFBcUQ7QUFFckQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUM7QUFFdkIsU0FBUyxpQkFBaUIsQ0FBQyxDQUFTO0lBQ2xDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQWdCRCxNQUFxQixlQUFlO0lBQXBDO1FBQ0UsU0FBSSxHQUFHLG1CQUE0QixDQUFDO1FBQ3BDLFNBQUksR0FBRyxVQUFtQixDQUFDO1FBRW5CLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBQ3hDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXJCLGdCQUFXLEdBQTBCLElBQUksQ0FBQztRQUMxQyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFnUXBDLENBQUM7SUE5UFMsU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBQSxvQ0FBcUIsR0FBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBQSw4QkFBa0IsR0FBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdDQUFvQixFQUFD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LENBQUMsQ0FBQztnQkFFSCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO29CQUM1QyxPQUFPLENBQUMsS0FBSyxDQUNYLG9DQUFvQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQ2xELENBQUM7b0JBQ0YsT0FBTztpQkFDUjtnQkFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtvQkFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDckU7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7aUJBQ2hFO2FBQ0Y7WUFBQyxPQUFPLEdBQVEsRUFBRTtnQkFDakIsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTtvQkFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsYUFBYSxLQUFLLENBQUMsQ0FBQztpQkFDckU7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7aUJBQzlEO2FBQ0Y7U0FDRjtJQUNILENBQUM7Q0FDRjtBQXhRRCxrQ0F3UUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdhdGV3YXkgVGFnIOe8k+WtmCBPdmVycmlkZSAobmV4dE1vZGUpXG4gKlxuICog5L2/55SoIE9wZW5OZXh0IOeahCBuZXh0TW9kZSDmjqXlj6PvvIzpgJrov4cgR2F0ZXdheSDku6PnkIbor7vlhpkgVGFibGVTdG9yZeOAglxuICog6Ym05p2D57uf5LiA6LWwIHJ1bnRpbWUvZ2F0ZXdheS1hdXRo77yISE1BQyDnrb7lkI0gKyA0IGhlYWRlcu+8ieOAglxuICovXG5cbmltcG9ydCB7XG4gIGxvYWRHYXRld2F5QXV0aENvbmZpZyxcbiAgZ2F0ZXdheUZldGNoLFxuICBHYXRld2F5QXV0aENvbmZpZyxcbn0gZnJvbSAnLi4vLi4vcnVudGltZS9nYXRld2F5LWF1dGgnO1xuaW1wb3J0IHtcbiAgbG9hZENkblB1cmdlQ29uZmlnLFxuICBjcmVhdGVDZG5QdXJnZUNsaWVudCxcbiAgQ2RuUHVyZ2VDbGllbnQsXG59IGZyb20gJy4uLy4uL3J1bnRpbWUvY2RuLXB1cmdlJztcbmltcG9ydCB7IGxvYWRCdWlsZElkIH0gZnJvbSAnLi4vLi4vcnVudGltZS9idWlsZC1pZCc7XG5cbmNvbnN0IFFVRVJZX1RJTUVPVVQgPSAzMDAwO1xuY29uc3QgV1JJVEVfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBCQVRDSF9TSVpFID0gMjAwO1xuXG5mdW5jdGlvbiBzdHJpcExlYWRpbmdTbGFzaChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKC9eXFwvKy8sICcnKTtcbn1cblxudHlwZSBOZXh0TW9kZVRhZ0NhY2hlV3JpdGVJbnB1dCA9XG4gIHwgc3RyaW5nXG4gIHwge1xuICAgICAgdGFnOiBzdHJpbmc7XG4gICAgICBzdGFsZT86IG51bWJlcjtcbiAgICAgIGV4cGlyZT86IG51bWJlcjtcbiAgICB9O1xuXG5pbnRlcmZhY2UgVGFnUm93IHtcbiAgcmV2YWxpZGF0ZWRBdD86IG51bWJlcjtcbiAgc3RhbGU/OiBudW1iZXI7XG4gIGV4cGlyZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2F0ZXdheVRhZ0NhY2hlIHtcbiAgbmFtZSA9ICdnYXRld2F5LXRhZy1jYWNoZScgYXMgY29uc3Q7XG4gIG1vZGUgPSAnbmV4dE1vZGUnIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbmZpZ0xvYWRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcHVyZ2VDbGllbnQ6IENkblB1cmdlQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHVyZ2VDbGllbnRMb2FkZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGdldENvbmZpZygpOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5jb25maWdMb2FkZWQpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gbG9hZEdhdGV3YXlBdXRoQ29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZ0xvYWRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHVyZ2VDbGllbnQoKTogQ2RuUHVyZ2VDbGllbnQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMucHVyZ2VDbGllbnRMb2FkZWQpIHtcbiAgICAgIGNvbnN0IGNmZyA9IGxvYWRDZG5QdXJnZUNvbmZpZygpO1xuICAgICAgdGhpcy5wdXJnZUNsaWVudCA9IGNmZyA/IGNyZWF0ZUNkblB1cmdlQ2xpZW50KGNmZykgOiBudWxsO1xuICAgICAgdGhpcy5wdXJnZUNsaWVudExvYWRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnB1cmdlQ2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIOaLvCBUYWJsZVN0b3JlIHRhZyDkuLvplK46YHtidWlsZElkfS97dGFnfWDjgIJcbiAgICpcbiAgICog5L2/55SoIEJVSUxEX0lEKE5leHQuanMg5p6E5bu65Lqn54mp6Lqr5Lu9KeiAjOmdniBjZmcudmVyc2lvbihFU0Eg5bmz5Y+w54mI5pys5Y+3KSxcbiAgICog5Y6f5ZugOuWQjOS4gOS4qiBidWlsZElkIOWGhSBtYW5pZmVzdCDkuI4gdGFnIOihjOi6q+S7veS4peagvOS4gOiHtCzpgb/lhY1cbiAgICog6YOo572y5L6n5rOo5YWlIEVTQV9DQUNIRV9HV19WRVJTSU9OIOS4juaehOW7uuacnyBCVUlMRF9JRCDkuI3kuIDoh7Tml7Yga2V5IOWFqOmDqOmUmeS9jeOAglxuICAgKlxuICAgKiBCVUlMRF9JRCDor7vkuI3liLAo6ICBIGJ1bmRsZSAvIOmUmeivr+WPr+mdoOW6pikg4oaSIOmZjee6p+S4uuS4jeWKoOWJjee8gCzkuI7ogIHniYjmnKzooYzkuLrlhbzlrrnjgIJcbiAgICovXG4gIHByaXZhdGUgYnVpbGRUYWdLZXkodGFnOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1aWxkSWQgPSBsb2FkQnVpbGRJZCgpO1xuICAgIGNvbnN0IHByZWZpeCA9IGJ1aWxkSWQgPyBgJHtidWlsZElkfS9gIDogJyc7XG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke3N0cmlwTGVhZGluZ1NsYXNoKHRhZyl9YDtcbiAgfVxuXG4gIGFzeW5jIGdldExhc3RSZXZhbGlkYXRlZCh0YWdzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIDA7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuYmF0Y2hHZXRUYWdzKGNvbmZpZywgdGFncyk7XG4gICAgICBsZXQgbWF4UmV2YWxpZGF0ZWRBdCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGlmIChyb3cucmV2YWxpZGF0ZWRBdCAmJiByb3cucmV2YWxpZGF0ZWRBdCA+IG1heFJldmFsaWRhdGVkQXQpIHtcbiAgICAgICAgICBtYXhSZXZhbGlkYXRlZEF0ID0gcm93LnJldmFsaWRhdGVkQXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXhSZXZhbGlkYXRlZEF0O1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gZ2V0TGFzdFJldmFsaWRhdGVkIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaGFzQmVlblJldmFsaWRhdGVkKFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuICAgIGxhc3RNb2RpZmllZD86IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFncy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5iYXRjaEdldFRhZ3MoY29uZmlnLCB0YWdzKTtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBsbSA9IGxhc3RNb2RpZmllZCA/PyAwO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGlmIChyb3cuZXhwaXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocm93LmV4cGlyZSA8PSBub3cgJiYgcm93LmV4cGlyZSA+IGxtKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdy5yZXZhbGlkYXRlZEF0ICE9PSB1bmRlZmluZWQgJiYgcm93LnJldmFsaWRhdGVkQXQgPiBsbSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBoYXNCZWVuUmV2YWxpZGF0ZWQgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaXNTdGFsZSh0YWdzOiBzdHJpbmdbXSwgbGFzdE1vZGlmaWVkPzogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHRhZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuYmF0Y2hHZXRUYWdzKGNvbmZpZywgdGFncyk7XG4gICAgICBjb25zdCBsbSA9IGxhc3RNb2RpZmllZCA/PyAwO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGlmIChyb3cuc3RhbGUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHJldmFsaWRhdGVkQXQgPSByb3cucmV2YWxpZGF0ZWRBdCA/PyAwO1xuICAgICAgICBpZiAocmV2YWxpZGF0ZWRBdCA+IGxtICYmIHJvdy5zdGFsZSA+PSBsbSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBpc1N0YWxlIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHdyaXRlVGFncyh0YWdzOiBOZXh0TW9kZVRhZ0NhY2hlV3JpdGVJbnB1dFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0YWdzIHx8IHRhZ3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm47XG5cbiAgICBjb25zdCB3cml0ZVRzID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHJvd3MgPSB0YWdzLm1hcChpbnB1dCA9PiB7XG4gICAgICBjb25zdCB0YWdTdHIgPSB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gaW5wdXQgOiBpbnB1dC50YWc7XG4gICAgICBjb25zdCBzdGFsZSA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyB1bmRlZmluZWQgOiBpbnB1dC5zdGFsZTtcbiAgICAgIGNvbnN0IGV4cGlyZSA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyB1bmRlZmluZWQgOiBpbnB1dC5leHBpcmU7XG4gICAgICBjb25zdCB0YWdLZXkgPSB0aGlzLmJ1aWxkVGFnS2V5KHRhZ1N0cik7XG5cbiAgICAgIGNvbnN0IGNvbHVtbnM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH1bXSA9IFtcbiAgICAgICAgeyBuYW1lOiAncmV2YWxpZGF0ZWRBdCcsIHZhbHVlOiB3cml0ZVRzIH0sXG4gICAgICBdO1xuICAgICAgaWYgKHN0YWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKHsgbmFtZTogJ3N0YWxlJywgdmFsdWU6IHN0YWxlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGV4cGlyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbHVtbnMucHVzaCh7IG5hbWU6ICdleHBpcmUnLCB2YWx1ZTogZXhwaXJlIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmltYXJ5S2V5OiBbXG4gICAgICAgICAgeyBuYW1lOiAnYXBwX2lkJywgdmFsdWU6IGAke2NvbmZpZy5hbGl1aWR9LyR7Y29uZmlnLnJvdXRpbmVuYW1lfWAgfSxcbiAgICAgICAgICB7IG5hbWU6ICd0YWcnLCB2YWx1ZTogdGFnS2V5IH0sXG4gICAgICAgIF0sXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5iYXRjaFdyaXRlKGNvbmZpZywgcm93cyk7XG5cbiAgICAvLyDlhpnlupPmiJDlip/lkI4sZmlyZS1hbmQtZm9yZ2V0IOinpuWPkSBFU0Eg6L6557yY57yT5a2Y5aSx5pWI44CCXG4gICAgLy8g5Lu75L2V5aSx6LSl6YO95LiN5bqU5Zue54GM5Yiw6LCD55So5pa5LOaJgOS7pSBjYXRjaCDnm7TmjqUgd2FybizkuI0gdGhyb3fjgIHkuI0gYXdhaXTjgIJcbiAgICBjb25zdCBwdXJnZUNsaWVudCA9IHRoaXMuZ2V0UHVyZ2VDbGllbnQoKTtcbiAgICBpZiAocHVyZ2VDbGllbnQpIHtcbiAgICAgIGNvbnN0IHRhZ1N0cnMgPSB0YWdzXG4gICAgICAgIC5tYXAodCA9PiAodHlwZW9mIHQgPT09ICdzdHJpbmcnID8gdCA6IHQudGFnKSlcbiAgICAgICAgLmZpbHRlcigocyk6IHMgaXMgc3RyaW5nID0+IHR5cGVvZiBzID09PSAnc3RyaW5nJyAmJiBzLmxlbmd0aCA+IDApO1xuICAgICAgaWYgKHRhZ1N0cnMubGVuZ3RoID4gMCkge1xuICAgICAgICBwdXJnZUNsaWVudC5wdXJnZUJ5VGFncyh0YWdTdHJzKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBwdXJnZSBmYW4tb3V0IGZhaWxlZDogJHtlcnI/Lm1lc3NhZ2UgPz8gZXJyfWApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAtLS0tIHByaXZhdGUgbWV0aG9kcyAtLS0tXG5cbiAgcHJpdmF0ZSBhc3luYyBiYXRjaEdldFRhZ3MoXG4gICAgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyxcbiAgICB0YWdzOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPFRhZ1Jvd1tdPiB7XG4gICAgY29uc3QgcHJpbWFyeUtleXMgPSB0YWdzLm1hcCh0YWcgPT4gW1xuICAgICAgeyBuYW1lOiAnYXBwX2lkJywgdmFsdWU6IGAke2NvbmZpZy5hbGl1aWR9LyR7Y29uZmlnLnJvdXRpbmVuYW1lfWAgfSxcbiAgICAgIHsgbmFtZTogJ3RhZycsIHZhbHVlOiB0aGlzLmJ1aWxkVGFnS2V5KHRhZykgfSxcbiAgICBdKTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdhdGV3YXlGZXRjaChjb25maWcsICcvdGFibGUvYmF0Y2gtZ2V0LXJvdycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHByaW1hcnlLZXlzIH0pLFxuICAgICAgdGltZW91dE1zOiBRVUVSWV9USU1FT1VULFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDEgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFt0YWdDYWNoZV0gYmF0Y2gtZ2V0LXJvdyByZWplY3RlZCAoJHtyZXMuc3RhdHVzfSlgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gYmF0Y2gtZ2V0LXJvdyBmYWlsZWQ6IHN0YXR1cz0ke3Jlcy5zdGF0dXN9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7XG4gICAgICByb3dzPzoge1xuICAgICAgICBwcmltYXJ5S2V5PzogYW55W107XG4gICAgICAgIGNvbHVtbnM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IG51bWJlciB9W107XG4gICAgICB9W107XG4gICAgfTtcblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFt0YWdDYWNoZV0gYmF0Y2gtZ2V0LXJvdyBvazogdGFncz0ke3RhZ3MubGVuZ3RofSByb3dzPSR7ZGF0YS5yb3dzPy5sZW5ndGggPz8gMH1gXG4gICAgKTtcblxuICAgIGlmICghZGF0YS5yb3dzKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gZGF0YS5yb3dzLm1hcChyb3cgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0OiBUYWdSb3cgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgY29sIG9mIHJvdy5jb2x1bW5zID8/IFtdKSB7XG4gICAgICAgIGlmIChjb2wubmFtZSA9PT0gJ3JldmFsaWRhdGVkQXQnICYmIHR5cGVvZiBjb2wudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmVzdWx0LnJldmFsaWRhdGVkQXQgPSBjb2wudmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29sLm5hbWUgPT09ICdzdGFsZScgJiYgdHlwZW9mIGNvbC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXN1bHQuc3RhbGUgPSBjb2wudmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29sLm5hbWUgPT09ICdleHBpcmUnICYmIHR5cGVvZiBjb2wudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmVzdWx0LmV4cGlyZSA9IGNvbC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYmF0Y2hXcml0ZShcbiAgICBjb25maWc6IEdhdGV3YXlBdXRoQ29uZmlnLFxuICAgIHJvd3M6IHtcbiAgICAgIHByaW1hcnlLZXk6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIH1bXTtcbiAgICAgIGNvbHVtbnM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIH1bXTtcbiAgICB9W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpICs9IEJBVENIX1NJWkUpIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gcm93cy5zbGljZShpLCBpICsgQkFUQ0hfU0laRSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdhdGV3YXlGZXRjaChjb25maWcsICcvdGFibGUvYmF0Y2gtd3JpdGUnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyByb3dzOiBiYXRjaCB9KSxcbiAgICAgICAgICB0aW1lb3V0TXM6IFdSSVRFX1RJTUVPVVQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDEgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIHJlamVjdGVkICgke3Jlcy5zdGF0dXN9KWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIGZhaWxlZDogc3RhdHVzPSR7cmVzLnN0YXR1c31gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW3RhZ0NhY2hlXSBiYXRjaC13cml0ZSBvazogcm93cz0ke2JhdGNoLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgdGltZW91dCAoJHtXUklURV9USU1FT1VUfW1zKWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBiYXRjaC13cml0ZSBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
279
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvdGFnQ2FjaGUvZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOztBQUVILDZEQUlvQztBQUNwQyw2REFBNEQ7QUFDNUQscURBQXFEO0FBRXJELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBQ3ZCLE1BQU0sYUFBYSxHQUFHLEtBQU0sQ0FBQztBQUU3QixTQUFTLGlCQUFpQixDQUFDLENBQVM7SUFDbEMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBZ0JELE1BQXFCLGVBQWU7SUFBcEM7UUFDRSxTQUFJLEdBQUcsbUJBQTRCLENBQUM7UUFDcEMsU0FBSSxHQUFHLFVBQW1CLENBQUM7UUFFbkIsV0FBTSxHQUE2QixJQUFJLENBQUM7UUFDeEMsaUJBQVksR0FBRyxLQUFLLENBQUM7SUFxUy9CLENBQUM7SUFuU1MsU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBQSxvQ0FBcUIsR0FBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLFdBQVcsQ0FBQyxHQUFXO1FBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUEsc0JBQVcsR0FBRSxDQUFDO1FBQzlCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVDLE9BQU8sR0FB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QUk7WUFDRixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUEsMkJBQVksRUFBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ3ZELE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtnQkFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEVBQUUsYUFBYTthQUN6QixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFDWCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ2hCLElBQUk7b0JBQUUsTUFBTSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lCQUFFO2dCQUFDLFFBQVEsWUFBWSxJQUFkLEVBQUUsWUFBWSxFQUFFO2dCQUN6RSxPQUFPLENBQUMsSUFBSSxDQUNWLDZDQUE2QyxHQUFHLENBQUMsTUFBTSxTQUFTLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxFQUFFLENBQ3hGLENBQUM7Z0JBQ0YsT0FBTzthQUNSO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDbkU7UUFBQyxPQUFPLEdBQVEsRUFBRTtZQUNqQixPQUFPLENBQUMsSUFBSSxDQUNWLHFDQUFxQyxNQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxPQUFPLG1DQUFJLEdBQUcsRUFBRSxDQUMzRCxDQUFDO1NBQ0g7SUFDSCxDQUFDO0NBQ0Y7QUExU0Qsa0NBMFNDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHYXRld2F5IFRhZyDnvJPlrZggT3ZlcnJpZGUgKG5leHRNb2RlKVxuICpcbiAqIOS9v+eUqCBPcGVuTmV4dCDnmoQgbmV4dE1vZGUg5o6l5Y+j77yM6YCa6L+HIEdhdGV3YXkg5Luj55CG6K+75YaZIFRhYmxlU3RvcmXjgIJcbiAqIOmJtOadg+e7n+S4gOi1sCBydW50aW1lL2dhdGV3YXktYXV0aO+8iEhNQUMg562+5ZCNICsgNCBoZWFkZXLvvInjgIJcbiAqXG4gKiBDRE4g5aSx5pWI77yad3JpdGVUYWdzIOWGmeW6k+WQjuebtOaOpeiwgyBHYXRld2F5IC9jYWNoZS9yZWZyZXNoKGNhY2hlVGFncynvvIxcbiAqIOeUsSBFU0EgUHVyZ2VDYWNoZXMgVHlwZT1jYWNoZXRhZyDljp/nlJ/mjIkgQ2FjaGUtVGFnIOWIt+aWsOi+uee8mOe8k+WtmO+8jFxuICog5LiN5YaN57u05oqkIHRhZ+KGknBhdGggbWFuaWZlc3Qg5pig5bCE44CCXG4gKi9cblxuaW1wb3J0IHtcbiAgbG9hZEdhdGV3YXlBdXRoQ29uZmlnLFxuICBnYXRld2F5RmV0Y2gsXG4gIEdhdGV3YXlBdXRoQ29uZmlnLFxufSBmcm9tICcuLi8uLi9ydW50aW1lL2dhdGV3YXktYXV0aCc7XG5pbXBvcnQgeyBnZXRFZGdlQ29udGV4dCB9IGZyb20gJy4uLy4uL3J1bnRpbWUvZWRnZS1jb250ZXh0JztcbmltcG9ydCB7IGxvYWRCdWlsZElkIH0gZnJvbSAnLi4vLi4vcnVudGltZS9idWlsZC1pZCc7XG5cbmNvbnN0IFFVRVJZX1RJTUVPVVQgPSAzMDAwO1xuY29uc3QgV1JJVEVfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBCQVRDSF9TSVpFID0gMjAwO1xuY29uc3QgUFVSR0VfVElNRU9VVCA9IDE1XzAwMDtcblxuZnVuY3Rpb24gc3RyaXBMZWFkaW5nU2xhc2goczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvXlxcLysvLCAnJyk7XG59XG5cbnR5cGUgTmV4dE1vZGVUYWdDYWNoZVdyaXRlSW5wdXQgPVxuICB8IHN0cmluZ1xuICB8IHtcbiAgICAgIHRhZzogc3RyaW5nO1xuICAgICAgc3RhbGU/OiBudW1iZXI7XG4gICAgICBleHBpcmU/OiBudW1iZXI7XG4gICAgfTtcblxuaW50ZXJmYWNlIFRhZ1JvdyB7XG4gIHJldmFsaWRhdGVkQXQ/OiBudW1iZXI7XG4gIHN0YWxlPzogbnVtYmVyO1xuICBleHBpcmU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhdGV3YXlUYWdDYWNoZSB7XG4gIG5hbWUgPSAnZ2F0ZXdheS10YWctY2FjaGUnIGFzIGNvbnN0O1xuICBtb2RlID0gJ25leHRNb2RlJyBhcyBjb25zdDtcblxuICBwcml2YXRlIGNvbmZpZzogR2F0ZXdheUF1dGhDb25maWcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25maWdMb2FkZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGdldENvbmZpZygpOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5jb25maWdMb2FkZWQpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gbG9hZEdhdGV3YXlBdXRoQ29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZ0xvYWRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiDmi7wgVGFibGVTdG9yZSB0YWcg5Li76ZSuOmB7YnVpbGRJZH0ve3RhZ31g44CCXG4gICAqXG4gICAqIOS9v+eUqCBCVUlMRF9JRChOZXh0LmpzIOaehOW7uuS6p+eJqei6q+S7vSnogIzpnZ4gY2ZnLnZlcnNpb24oRVNBIOW5s+WPsOeJiOacrOWPtyksXG4gICAqIOWOn+WboDrlkIzkuIDkuKogYnVpbGRJZCDlhoUgbWFuaWZlc3Qg5LiOIHRhZyDooYzouqvku73kuKXmoLzkuIDoh7Qs6YG/5YWNXG4gICAqIOmDqOe9suS+p+azqOWFpSBFU0FfQ0FDSEVfR1dfVkVSU0lPTiDkuI7mnoTlu7rmnJ8gQlVJTERfSUQg5LiN5LiA6Ie05pe2IGtleSDlhajpg6jplJnkvY3jgIJcbiAgICpcbiAgICogQlVJTERfSUQg6K+75LiN5YiwKOiAgSBidW5kbGUgLyDplJnor6/lj6/pnaDluqYpIOKGkiDpmY3nuqfkuLrkuI3liqDliY3nvIAs5LiO6ICB54mI5pys6KGM5Li65YW85a6544CCXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVGFnS2V5KHRhZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBidWlsZElkID0gbG9hZEJ1aWxkSWQoKTtcbiAgICBjb25zdCBwcmVmaXggPSBidWlsZElkID8gYCR7YnVpbGRJZH0vYCA6ICcnO1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtzdHJpcExlYWRpbmdTbGFzaCh0YWcpfWA7XG4gIH1cblxuICBhc3luYyBnZXRMYXN0UmV2YWxpZGF0ZWQodGFnczogc3RyaW5nW10pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmJhdGNoR2V0VGFncyhjb25maWcsIHRhZ3MpO1xuICAgICAgbGV0IG1heFJldmFsaWRhdGVkQXQgPSAwO1xuICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBpZiAocm93LnJldmFsaWRhdGVkQXQgJiYgcm93LnJldmFsaWRhdGVkQXQgPiBtYXhSZXZhbGlkYXRlZEF0KSB7XG4gICAgICAgICAgbWF4UmV2YWxpZGF0ZWRBdCA9IHJvdy5yZXZhbGlkYXRlZEF0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF4UmV2YWxpZGF0ZWRBdDtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGdldExhc3RSZXZhbGlkYXRlZCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhc0JlZW5SZXZhbGlkYXRlZChcbiAgICB0YWdzOiBzdHJpbmdbXSxcbiAgICBsYXN0TW9kaWZpZWQ/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHRhZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuYmF0Y2hHZXRUYWdzKGNvbmZpZywgdGFncyk7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgbG0gPSBsYXN0TW9kaWZpZWQgPz8gMDtcblxuICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBpZiAocm93LmV4cGlyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHJvdy5leHBpcmUgPD0gbm93ICYmIHJvdy5leHBpcmUgPiBsbSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyb3cucmV2YWxpZGF0ZWRBdCAhPT0gdW5kZWZpbmVkICYmIHJvdy5yZXZhbGlkYXRlZEF0ID4gbG0pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gaGFzQmVlblJldmFsaWRhdGVkIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGlzU3RhbGUodGFnczogc3RyaW5nW10sIGxhc3RNb2RpZmllZD86IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0YWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmJhdGNoR2V0VGFncyhjb25maWcsIHRhZ3MpO1xuICAgICAgY29uc3QgbG0gPSBsYXN0TW9kaWZpZWQgPz8gMDtcblxuICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBpZiAocm93LnN0YWxlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCByZXZhbGlkYXRlZEF0ID0gcm93LnJldmFsaWRhdGVkQXQgPz8gMDtcbiAgICAgICAgaWYgKHJldmFsaWRhdGVkQXQgPiBsbSAmJiByb3cuc3RhbGUgPj0gbG0pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gaXNTdGFsZSBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB3cml0ZVRhZ3ModGFnczogTmV4dE1vZGVUYWdDYWNoZVdyaXRlSW5wdXRbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGFncyB8fCB0YWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuXG4gICAgY29uc3Qgd3JpdGVUcyA9IERhdGUubm93KCk7XG5cbiAgICBjb25zdCByb3dzID0gdGFncy5tYXAoaW5wdXQgPT4ge1xuICAgICAgY29uc3QgdGFnU3RyID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IGlucHV0IDogaW5wdXQudGFnO1xuICAgICAgY29uc3Qgc3RhbGUgPSB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gdW5kZWZpbmVkIDogaW5wdXQuc3RhbGU7XG4gICAgICBjb25zdCBleHBpcmUgPSB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gdW5kZWZpbmVkIDogaW5wdXQuZXhwaXJlO1xuICAgICAgY29uc3QgdGFnS2V5ID0gdGhpcy5idWlsZFRhZ0tleSh0YWdTdHIpO1xuXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFt0YWdDYWNoZV0gd3JpdGVUYWdzOiB0YWc9XCIke3RhZ1N0cn1cIiBrZXk9XCIke3RhZ0tleX1cIiB0cz0ke3dyaXRlVHN9YFxuICAgICAgKTtcblxuICAgICAgY29uc3QgY29sdW1uczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfVtdID0gW1xuICAgICAgICB7IG5hbWU6ICdyZXZhbGlkYXRlZEF0JywgdmFsdWU6IHdyaXRlVHMgfSxcbiAgICAgIF07XG4gICAgICBpZiAoc3RhbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb2x1bW5zLnB1c2goeyBuYW1lOiAnc3RhbGUnLCB2YWx1ZTogc3RhbGUgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXhwaXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKHsgbmFtZTogJ2V4cGlyZScsIHZhbHVlOiBleHBpcmUgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByaW1hcnlLZXk6IFtcbiAgICAgICAgICB7IG5hbWU6ICdhcHBfaWQnLCB2YWx1ZTogYCR7Y29uZmlnLmFsaXVpZH0vJHtjb25maWcucm91dGluZW5hbWV9YCB9LFxuICAgICAgICAgIHsgbmFtZTogJ3RhZycsIHZhbHVlOiB0YWdLZXkgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmJhdGNoV3JpdGUoY29uZmlnLCByb3dzKTtcblxuICAgIC8vIOWGmeW6k+aIkOWKn+WQjixmaXJlLWFuZC1mb3JnZXQg6Kem5Y+RIEVTQSDovrnnvJjnvJPlrZggdGFnIOe6p+WkseaViOOAglxuICAgIGNvbnN0IHRhZ1N0cnMgPSB0YWdzXG4gICAgICAubWFwKHQgPT4gKHR5cGVvZiB0ID09PSAnc3RyaW5nJyA/IHQgOiB0LnRhZykpXG4gICAgICAuZmlsdGVyKChzKTogcyBpcyBzdHJpbmcgPT4gdHlwZW9mIHMgPT09ICdzdHJpbmcnICYmIHMubGVuZ3RoID4gMCk7XG4gICAgaWYgKHRhZ1N0cnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5wdXJnZUJ5Q2FjaGVUYWdzKGNvbmZpZywgdGFnU3RycykuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGNhY2hlVGFncyBwdXJnZSBmYWlsZWQ6ICR7ZXJyPy5tZXNzYWdlID8/IGVycn1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0gcHJpdmF0ZSBtZXRob2RzIC0tLS1cblxuICBwcml2YXRlIGFzeW5jIGJhdGNoR2V0VGFncyhcbiAgICBjb25maWc6IEdhdGV3YXlBdXRoQ29uZmlnLFxuICAgIHRhZ3M6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8VGFnUm93W10+IHtcbiAgICBjb25zdCB0YWdLZXlzID0gdGFncy5tYXAodGFnID0+IHRoaXMuYnVpbGRUYWdLZXkodGFnKSk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgW3RhZ0NhY2hlXSBiYXRjaEdldFRhZ3M6IHRhZ3M9JHtKU09OLnN0cmluZ2lmeSh0YWdzKX0ga2V5cz0ke0pTT04uc3RyaW5naWZ5KHRhZ0tleXMpfWBcbiAgICApO1xuXG4gICAgY29uc3QgcHJpbWFyeUtleXMgPSB0YWdzLm1hcCh0YWcgPT4gW1xuICAgICAgeyBuYW1lOiAnYXBwX2lkJywgdmFsdWU6IGAke2NvbmZpZy5hbGl1aWR9LyR7Y29uZmlnLnJvdXRpbmVuYW1lfWAgfSxcbiAgICAgIHsgbmFtZTogJ3RhZycsIHZhbHVlOiB0aGlzLmJ1aWxkVGFnS2V5KHRhZykgfSxcbiAgICBdKTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdhdGV3YXlGZXRjaChjb25maWcsICcvdGFibGUvYmF0Y2gtZ2V0LXJvdycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHByaW1hcnlLZXlzIH0pLFxuICAgICAgdGltZW91dE1zOiBRVUVSWV9USU1FT1VULFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDEgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFt0YWdDYWNoZV0gYmF0Y2gtZ2V0LXJvdyByZWplY3RlZCAoJHtyZXMuc3RhdHVzfSlgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gYmF0Y2gtZ2V0LXJvdyBmYWlsZWQ6IHN0YXR1cz0ke3Jlcy5zdGF0dXN9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7XG4gICAgICByb3dzPzoge1xuICAgICAgICBwcmltYXJ5S2V5PzogYW55W107XG4gICAgICAgIGNvbHVtbnM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IG51bWJlciB9W107XG4gICAgICB9W107XG4gICAgfTtcblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFt0YWdDYWNoZV0gYmF0Y2gtZ2V0LXJvdyBvazogdGFncz0ke3RhZ3MubGVuZ3RofSByb3dzPSR7ZGF0YS5yb3dzPy5sZW5ndGggPz8gMH1gXG4gICAgKTtcblxuICAgIGlmICghZGF0YS5yb3dzKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gZGF0YS5yb3dzLm1hcChyb3cgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0OiBUYWdSb3cgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgY29sIG9mIHJvdy5jb2x1bW5zID8/IFtdKSB7XG4gICAgICAgIGlmIChjb2wubmFtZSA9PT0gJ3JldmFsaWRhdGVkQXQnICYmIHR5cGVvZiBjb2wudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmVzdWx0LnJldmFsaWRhdGVkQXQgPSBjb2wudmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29sLm5hbWUgPT09ICdzdGFsZScgJiYgdHlwZW9mIGNvbC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXN1bHQuc3RhbGUgPSBjb2wudmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29sLm5hbWUgPT09ICdleHBpcmUnICYmIHR5cGVvZiBjb2wudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmVzdWx0LmV4cGlyZSA9IGNvbC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYmF0Y2hXcml0ZShcbiAgICBjb25maWc6IEdhdGV3YXlBdXRoQ29uZmlnLFxuICAgIHJvd3M6IHtcbiAgICAgIHByaW1hcnlLZXk6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIH1bXTtcbiAgICAgIGNvbHVtbnM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIH1bXTtcbiAgICB9W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpICs9IEJBVENIX1NJWkUpIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gcm93cy5zbGljZShpLCBpICsgQkFUQ0hfU0laRSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdhdGV3YXlGZXRjaChjb25maWcsICcvdGFibGUvYmF0Y2gtd3JpdGUnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyByb3dzOiBiYXRjaCB9KSxcbiAgICAgICAgICB0aW1lb3V0TXM6IFdSSVRFX1RJTUVPVVQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDEgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIHJlamVjdGVkICgke3Jlcy5zdGF0dXN9KWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIGZhaWxlZDogc3RhdHVzPSR7cmVzLnN0YXR1c31gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW3RhZ0NhY2hlXSBiYXRjaC13cml0ZSBvazogcm93cz0ke2JhdGNoLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgdGltZW91dCAoJHtXUklURV9USU1FT1VUfW1zKWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBiYXRjaC13cml0ZSBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDosIMgR2F0ZXdheSAvY2FjaGUvcmVmcmVzaChjYWNoZVRhZ3MpIOinpuWPkSBFU0EgUHVyZ2VDYWNoZXMgVHlwZT1jYWNoZXRhZ+OAglxuICAgKiBob3N0bmFtZSAvIHNpdGVJZCDku47lvZPliY3or7fmsYLnmoQgZWRnZSBjb250ZXh0IOivu+WPliznvLrlpLHliJkgc2tpcOOAglxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwdXJnZUJ5Q2FjaGVUYWdzKFxuICAgIGNvbmZpZzogR2F0ZXdheUF1dGhDb25maWcsXG4gICAgdGFnczogc3RyaW5nW11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBob3N0bmFtZSwgc2l0ZUlkIH0gPSBnZXRFZGdlQ29udGV4dCgpO1xuICAgIGlmICghaG9zdG5hbWUgfHwgc2l0ZUlkID09PSB1bmRlZmluZWQgfHwgc2l0ZUlkID09PSAnJykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW3RhZ0NhY2hlXSBjYWNoZVRhZ3MgcHVyZ2Ugc2tpcDogZWRnZSBjb250ZXh0IG1pc3NpbmcgYCArXG4gICAgICAgICAgYChob3N0bmFtZT0ke2hvc3RuYW1lID8/ICfiiIUnfSBzaXRlSWQ9JHtzaXRlSWQgPz8gJ+KIhSd9KWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IHsgaG9zdG5hbWUsIHNpdGVJZCwgY2FjaGVUYWdzOiB0YWdzIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdhdGV3YXlGZXRjaChjb25maWcsICcvY2FjaGUvcmVmcmVzaCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgdGltZW91dE1zOiBQVVJHRV9USU1FT1VULFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICBsZXQgZGV0YWlsID0gJyc7XG4gICAgICAgIHRyeSB7IGRldGFpbCA9IChhd2FpdCByZXMudGV4dCgpKS5zbGljZSgwLCAyMDApOyB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbdGFnQ2FjaGVdIGNhY2hlVGFncyBwdXJnZSBmYWlsZWQ6IHN0YXR1cz0ke3Jlcy5zdGF0dXN9IHRhZ3M9JHt0YWdzLmxlbmd0aH0gJHtkZXRhaWx9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZyhgW3RhZ0NhY2hlXSBjYWNoZVRhZ3MgcHVyZ2Ugb2s6IHRhZ3M9JHt0YWdzLmxlbmd0aH1gKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW3RhZ0NhY2hlXSBjYWNoZVRhZ3MgcHVyZ2UgZXJyb3I6ICR7ZXJyPy5tZXNzYWdlID8/IGVycn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -20,7 +20,10 @@
20
20
  export interface EdgeContext {
21
21
  siteId?: string | number;
22
22
  hostname?: string;
23
+ cacheTags?: string;
23
24
  }
24
25
  export declare function buildEdgeContextFromHeaders(headers: Record<string, string | undefined>): EdgeContext;
25
26
  export declare function runWithEdgeContext<T>(headers: Record<string, string | undefined>, fn: () => T): T;
26
27
  export declare function getEdgeContext(): EdgeContext;
28
+ export declare function setCacheTags(tags: string): void;
29
+ export declare function getCacheTags(): string | undefined;
@@ -20,7 +20,7 @@
20
20
  */
21
21
  var _a;
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.getEdgeContext = exports.runWithEdgeContext = exports.buildEdgeContextFromHeaders = void 0;
23
+ exports.getCacheTags = exports.setCacheTags = exports.getEdgeContext = exports.runWithEdgeContext = exports.buildEdgeContextFromHeaders = void 0;
24
24
  const node_async_hooks_1 = require("node:async_hooks");
25
25
  // OpenNext build 把 wrapper / tagCache 等分别作为 esbuild 入口打包,即便同一 routine
26
26
  // 里 edge-context.ts 也会被复制成多份 —— 每份各自 `new AsyncLocalStorage()`,
@@ -74,4 +74,15 @@ function getEdgeContext() {
74
74
  return (_a = storage.getStore()) !== null && _a !== void 0 ? _a : {};
75
75
  }
76
76
  exports.getEdgeContext = getEdgeContext;
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvZWRnZS1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHOzs7O0FBRUgsdURBQXFEO0FBT3JELHNFQUFzRTtBQUN0RSxnRUFBZ0U7QUFDaEUsNERBQTREO0FBQzVELCtDQUErQztBQUMvQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFJbEQsTUFBTSxTQUFTLEdBQUcsVUFBMkIsQ0FBQztBQUM5QyxNQUFNLE9BQU8sR0FDWCxNQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUNBQ2xCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksb0NBQWlCLEVBQWUsQ0FBQyxDQUFDO0FBRTlELE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUMvQixNQUFNLHlCQUF5QixHQUFHLGtCQUFrQixDQUFDO0FBRXJELFNBQVMsVUFBVSxDQUNqQixPQUEyQyxFQUMzQyxJQUFZOztJQUVaLE9BQU8sTUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsR0FBdUI7O0lBQzVDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsTUFBTSxLQUFLLEdBQUcsTUFBQSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxJQUFJLEVBQUUsQ0FBQztJQUN4QyxPQUFPLEtBQUssSUFBSSxTQUFTLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEdBQXVCO0lBQzFDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDL0IsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUNuRSxDQUFDO0FBRUQsU0FBZ0IsMkJBQTJCLENBQ3pDLE9BQTJDOztJQUUzQyxNQUFNLEdBQUcsR0FBZ0IsRUFBRSxDQUFDO0lBQzVCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQzlDLE1BQU0sUUFBUSxHQUNaLE1BQUEsYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUMsbUNBQ25ELGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLHlCQUF5QixDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLFFBQVE7UUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUN0QyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFYRCxrRUFXQztBQUVELFNBQWdCLGtCQUFrQixDQUNoQyxPQUEyQyxFQUMzQyxFQUFXO0lBRVgsTUFBTSxHQUFHLEdBQUcsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBTkQsZ0RBTUM7QUFFRCxTQUFnQixjQUFjOztJQUM1QixPQUFPLE1BQUEsT0FBTyxDQUFDLFFBQVEsRUFBRSxtQ0FBSSxFQUFFLENBQUM7QUFDbEMsQ0FBQztBQUZELHdDQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFZGdlIFJlcXVlc3QgQ29udGV4dFxuICpcbiAqIOWcqCBFU0EgLyDovrnnvJjnjq/looMsc2l0ZUlkIOWSjCBob3N0bmFtZSDku47lhaXnq5nor7fmsYIgaGVhZGVyIOWPlizkuI3lho3kvp3otZZcbiAqIOWQr+WKqOaXtiBlbnYg5rOo5YWl44CC5Y6f5ZugOlxuICogICAtIOS4gOS4qiByb3V0aW5lIOWunuS+i+WPr+iDveacjeWKoeWkmuS4qiBzaXRlIC8gaG9zdG5hbWUo54Gw5bqm44CB5aSa54mI5pys44CB6IGa5ZCI5Z+fKSxcbiAqICAgICDlkK/liqjml7YgZW52IOaXoOazleihqOi+viBwZXItcmVxdWVzdCDlj5jljJZcbiAqICAgLSDorqkgb3BzIOS4jeW/heWGjeS4uuavj+S4qumDqOe9sumineWklumFjeS4pOS4qiBlbnZcbiAqXG4gKiDlrp7njrDnlKggQXN5bmNMb2NhbFN0b3JhZ2U6XG4gKiAgIC0gbm9kZS1zZXJ2ZXIgd3JhcHBlciDlnKggaGFuZGxlciDlhaXlj6PlpIQgcnVuV2l0aEVkZ2VDb250ZXh0KGhlYWRlcnMsIGZuKVxuICogICAtIOS4i+a4uCBjZG4tcHVyZ2UgLyDlhbbku5bmqKHlnZfnlKggZ2V0RWRnZUNvbnRleHQoKSDlkIzmraXor7vlj5ZcbiAqICAgLSDljbPkvb8gcHVyZ2Ug5pivIGZpcmUtYW5kLWZvcmdldCxwcm9taXNlIOmTvuS5n+S8mue7p+aJv+W9k+WJjSBBTFMsXG4gKiAgICAgcmVmcmVzaEJhdGNoIOWGheS7jeiDveaLv+WIsOW9k+aXtuivt+axgueahCBjdHhcbiAqXG4gKiDlhbPplK4gaGVhZGVyOlxuICogICAtIHgtYWxpY2RuLXNpdGUtaWQgIOKGkiBzaXRlSWRcbiAqICAgLSBob3N0IC8geC1mb3J3YXJkZWQtaG9zdCDihpIgaG9zdG5hbWUo6aaW6YCJIGhvc3Qs57y65aSx5omN6YCAIHgtZm9yd2FyZGVkLWhvc3QpXG4gKi9cblxuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcblxuZXhwb3J0IGludGVyZmFjZSBFZGdlQ29udGV4dCB7XG4gIHNpdGVJZD86IHN0cmluZyB8IG51bWJlcjtcbiAgaG9zdG5hbWU/OiBzdHJpbmc7XG59XG5cbi8vIE9wZW5OZXh0IGJ1aWxkIOaKiiB3cmFwcGVyIC8gdGFnQ2FjaGUg562J5YiG5Yir5L2c5Li6IGVzYnVpbGQg5YWl5Y+j5omT5YyFLOWNs+S+v+WQjOS4gCByb3V0aW5lXG4vLyDph4wgZWRnZS1jb250ZXh0LnRzIOS5n+S8muiiq+WkjeWItuaIkOWkmuS7vSDigJTigJQg5q+P5Lu95ZCE6IeqIGBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKWAsXG4vLyBzdG9yZSDkupLkuI3lj6/op4Esd3JhcHBlciDms6jlhaXnmoQgY3R4IOWcqCBjZG4tcHVyZ2Ug5LiA5L6n6K+75Yiw5rC46L+c5pivIHVuZGVmaW5lZOOAglxuLy8g55SoIFN5bWJvbC5mb3Ig5oqK5Y2V5L6L5oyC5YiwIGdsb2JhbFRoaXMs5omA5pyJ5Ymv5pys5ou/5Yiw5ZCM5LiA5LiqIEFMU+OAglxuY29uc3QgQUxTX0tFWSA9IFN5bWJvbC5mb3IoJ3BjZy5lZGdlQ29udGV4dC5hbHMnKTtcbnR5cGUgR2xvYmFsV2l0aEFscyA9IHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICBbQUxTX0tFWV0/OiBBc3luY0xvY2FsU3RvcmFnZTxFZGdlQ29udGV4dD47XG59O1xuY29uc3QgZ2xvYmFsUmVmID0gZ2xvYmFsVGhpcyBhcyBHbG9iYWxXaXRoQWxzO1xuY29uc3Qgc3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8RWRnZUNvbnRleHQ+ID1cbiAgZ2xvYmFsUmVmW0FMU19LRVldID8/XG4gIChnbG9iYWxSZWZbQUxTX0tFWV0gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8RWRnZUNvbnRleHQ+KCkpO1xuXG5jb25zdCBTSVRFX0lEX0hFQURFUiA9ICd4LWFsaWNkbi1zaXRlLWlkJztcbmNvbnN0IEhPU1ROQU1FX0hFQURFUiA9ICdob3N0JztcbmNvbnN0IEZPUldBUkRFRF9IT1NUTkFNRV9IRUFERVIgPSAneC1mb3J3YXJkZWQtaG9zdCc7XG5cbmZ1bmN0aW9uIHBpY2tIZWFkZXIoXG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGhlYWRlcnNbbmFtZV0gPz8gaGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldO1xufVxuXG5mdW5jdGlvbiBwYXJzZUhvc3RuYW1lKHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpcnN0ID0gcmF3LnNwbGl0KCcsJylbMF0/LnRyaW0oKTtcbiAgcmV0dXJuIGZpcnN0IHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VTaXRlSWQocmF3OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdHJpbW1lZCA9IHJhdy50cmltKCk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IE51bWJlcih0cmltbWVkKTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSAmJiB0cmltbWVkID09PSBTdHJpbmcobikgPyBuIDogdHJpbW1lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRWRnZUNvbnRleHRGcm9tSGVhZGVycyhcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPlxuKTogRWRnZUNvbnRleHQge1xuICBjb25zdCBjdHg6IEVkZ2VDb250ZXh0ID0ge307XG4gIGNvbnN0IHNpdGVJZCA9IHBhcnNlU2l0ZUlkKHBpY2tIZWFkZXIoaGVhZGVycywgU0lURV9JRF9IRUFERVIpKTtcbiAgaWYgKHNpdGVJZCAhPT0gdW5kZWZpbmVkKSBjdHguc2l0ZUlkID0gc2l0ZUlkO1xuICBjb25zdCBob3N0bmFtZSA9XG4gICAgcGFyc2VIb3N0bmFtZShwaWNrSGVhZGVyKGhlYWRlcnMsIEhPU1ROQU1FX0hFQURFUikpID8/XG4gICAgcGFyc2VIb3N0bmFtZShwaWNrSGVhZGVyKGhlYWRlcnMsIEZPUldBUkRFRF9IT1NUTkFNRV9IRUFERVIpKTtcbiAgaWYgKGhvc3RuYW1lKSBjdHguaG9zdG5hbWUgPSBob3N0bmFtZTtcbiAgcmV0dXJuIGN0eDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhFZGdlQ29udGV4dDxUPihcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgZm46ICgpID0+IFRcbik6IFQge1xuICBjb25zdCBjdHggPSBidWlsZEVkZ2VDb250ZXh0RnJvbUhlYWRlcnMoaGVhZGVycyk7XG4gIHJldHVybiBzdG9yYWdlLnJ1bihjdHgsIGZuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVkZ2VDb250ZXh0KCk6IEVkZ2VDb250ZXh0IHtcbiAgcmV0dXJuIHN0b3JhZ2UuZ2V0U3RvcmUoKSA/PyB7fTtcbn1cbiJdfQ==
77
+ function setCacheTags(tags) {
78
+ const store = storage.getStore();
79
+ if (store)
80
+ store.cacheTags = tags;
81
+ }
82
+ exports.setCacheTags = setCacheTags;
83
+ function getCacheTags() {
84
+ var _a;
85
+ return (_a = storage.getStore()) === null || _a === void 0 ? void 0 : _a.cacheTags;
86
+ }
87
+ exports.getCacheTags = getCacheTags;
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvZWRnZS1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHOzs7O0FBRUgsdURBQXFEO0FBUXJELHNFQUFzRTtBQUN0RSxnRUFBZ0U7QUFDaEUsNERBQTREO0FBQzVELCtDQUErQztBQUMvQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFJbEQsTUFBTSxTQUFTLEdBQUcsVUFBMkIsQ0FBQztBQUM5QyxNQUFNLE9BQU8sR0FDWCxNQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUNBQ2xCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksb0NBQWlCLEVBQWUsQ0FBQyxDQUFDO0FBRTlELE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUMvQixNQUFNLHlCQUF5QixHQUFHLGtCQUFrQixDQUFDO0FBRXJELFNBQVMsVUFBVSxDQUNqQixPQUEyQyxFQUMzQyxJQUFZOztJQUVaLE9BQU8sTUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsR0FBdUI7O0lBQzVDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsTUFBTSxLQUFLLEdBQUcsTUFBQSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxJQUFJLEVBQUUsQ0FBQztJQUN4QyxPQUFPLEtBQUssSUFBSSxTQUFTLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEdBQXVCO0lBQzFDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDL0IsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUNuRSxDQUFDO0FBRUQsU0FBZ0IsMkJBQTJCLENBQ3pDLE9BQTJDOztJQUUzQyxNQUFNLEdBQUcsR0FBZ0IsRUFBRSxDQUFDO0lBQzVCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQzlDLE1BQU0sUUFBUSxHQUNaLE1BQUEsYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUMsbUNBQ25ELGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLHlCQUF5QixDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLFFBQVE7UUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUN0QyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFYRCxrRUFXQztBQUVELFNBQWdCLGtCQUFrQixDQUNoQyxPQUEyQyxFQUMzQyxFQUFXO0lBRVgsTUFBTSxHQUFHLEdBQUcsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBTkQsZ0RBTUM7QUFFRCxTQUFnQixjQUFjOztJQUM1QixPQUFPLE1BQUEsT0FBTyxDQUFDLFFBQVEsRUFBRSxtQ0FBSSxFQUFFLENBQUM7QUFDbEMsQ0FBQztBQUZELHdDQUVDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLElBQVk7SUFDdkMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2pDLElBQUksS0FBSztRQUFFLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLENBQUM7QUFIRCxvQ0FHQztBQUVELFNBQWdCLFlBQVk7O0lBQzFCLE9BQU8sTUFBQSxPQUFPLENBQUMsUUFBUSxFQUFFLDBDQUFFLFNBQVMsQ0FBQztBQUN2QyxDQUFDO0FBRkQsb0NBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVkZ2UgUmVxdWVzdCBDb250ZXh0XG4gKlxuICog5ZyoIEVTQSAvIOi+uee8mOeOr+WigyxzaXRlSWQg5ZKMIGhvc3RuYW1lIOS7juWFpeermeivt+axgiBoZWFkZXIg5Y+WLOS4jeWGjeS+nei1llxuICog5ZCv5Yqo5pe2IGVudiDms6jlhaXjgILljp/lm6A6XG4gKiAgIC0g5LiA5LiqIHJvdXRpbmUg5a6e5L6L5Y+v6IO95pyN5Yqh5aSa5LiqIHNpdGUgLyBob3N0bmFtZSjngbDluqbjgIHlpJrniYjmnKzjgIHogZrlkIjln58pLFxuICogICAgIOWQr+WKqOaXtiBlbnYg5peg5rOV6KGo6L6+IHBlci1yZXF1ZXN0IOWPmOWMllxuICogICAtIOiuqSBvcHMg5LiN5b+F5YaN5Li65q+P5Liq6YOo572y6aKd5aSW6YWN5Lik5LiqIGVudlxuICpcbiAqIOWunueOsOeUqCBBc3luY0xvY2FsU3RvcmFnZTpcbiAqICAgLSBub2RlLXNlcnZlciB3cmFwcGVyIOWcqCBoYW5kbGVyIOWFpeWPo+WkhCBydW5XaXRoRWRnZUNvbnRleHQoaGVhZGVycywgZm4pXG4gKiAgIC0g5LiL5ri4IGNkbi1wdXJnZSAvIOWFtuS7luaooeWdl+eUqCBnZXRFZGdlQ29udGV4dCgpIOWQjOatpeivu+WPllxuICogICAtIOWNs+S9vyBwdXJnZSDmmK8gZmlyZS1hbmQtZm9yZ2V0LHByb21pc2Ug6ZO+5Lmf5Lya57un5om/5b2T5YmNIEFMUyxcbiAqICAgICByZWZyZXNoQmF0Y2gg5YaF5LuN6IO95ou/5Yiw5b2T5pe26K+35rGC55qEIGN0eFxuICpcbiAqIOWFs+mUriBoZWFkZXI6XG4gKiAgIC0geC1hbGljZG4tc2l0ZS1pZCAg4oaSIHNpdGVJZFxuICogICAtIGhvc3QgLyB4LWZvcndhcmRlZC1ob3N0IOKGkiBob3N0bmFtZSjpppbpgIkgaG9zdCznvLrlpLHmiY3pgIAgeC1mb3J3YXJkZWQtaG9zdClcbiAqL1xuXG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVkZ2VDb250ZXh0IHtcbiAgc2l0ZUlkPzogc3RyaW5nIHwgbnVtYmVyO1xuICBob3N0bmFtZT86IHN0cmluZztcbiAgY2FjaGVUYWdzPzogc3RyaW5nO1xufVxuXG4vLyBPcGVuTmV4dCBidWlsZCDmioogd3JhcHBlciAvIHRhZ0NhY2hlIOetieWIhuWIq+S9nOS4uiBlc2J1aWxkIOWFpeWPo+aJk+WMhSzljbPkvr/lkIzkuIAgcm91dGluZVxuLy8g6YeMIGVkZ2UtY29udGV4dC50cyDkuZ/kvJrooqvlpI3liLbmiJDlpJrku70g4oCU4oCUIOavj+S7veWQhOiHqiBgbmV3IEFzeW5jTG9jYWxTdG9yYWdlKClgLFxuLy8gc3RvcmUg5LqS5LiN5Y+v6KeBLHdyYXBwZXIg5rOo5YWl55qEIGN0eCDlnKggY2RuLXB1cmdlIOS4gOS+p+ivu+WIsOawuOi/nOaYryB1bmRlZmluZWTjgIJcbi8vIOeUqCBTeW1ib2wuZm9yIOaKiuWNleS+i+aMguWIsCBnbG9iYWxUaGlzLOaJgOacieWJr+acrOaLv+WIsOWQjOS4gOS4qiBBTFPjgIJcbmNvbnN0IEFMU19LRVkgPSBTeW1ib2wuZm9yKCdwY2cuZWRnZUNvbnRleHQuYWxzJyk7XG50eXBlIEdsb2JhbFdpdGhBbHMgPSB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgW0FMU19LRVldPzogQXN5bmNMb2NhbFN0b3JhZ2U8RWRnZUNvbnRleHQ+O1xufTtcbmNvbnN0IGdsb2JhbFJlZiA9IGdsb2JhbFRoaXMgYXMgR2xvYmFsV2l0aEFscztcbmNvbnN0IHN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPEVkZ2VDb250ZXh0PiA9XG4gIGdsb2JhbFJlZltBTFNfS0VZXSA/P1xuICAoZ2xvYmFsUmVmW0FMU19LRVldID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPEVkZ2VDb250ZXh0PigpKTtcblxuY29uc3QgU0lURV9JRF9IRUFERVIgPSAneC1hbGljZG4tc2l0ZS1pZCc7XG5jb25zdCBIT1NUTkFNRV9IRUFERVIgPSAnaG9zdCc7XG5jb25zdCBGT1JXQVJERURfSE9TVE5BTUVfSEVBREVSID0gJ3gtZm9yd2FyZGVkLWhvc3QnO1xuXG5mdW5jdGlvbiBwaWNrSGVhZGVyKFxuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LFxuICBuYW1lOiBzdHJpbmdcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBoZWFkZXJzW25hbWVdID8/IGhlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXTtcbn1cblxuZnVuY3Rpb24gcGFyc2VIb3N0bmFtZShyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBmaXJzdCA9IHJhdy5zcGxpdCgnLCcpWzBdPy50cmltKCk7XG4gIHJldHVybiBmaXJzdCB8fCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2l0ZUlkKHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG4gPSBOdW1iZXIodHJpbW1lZCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobikgJiYgdHJpbW1lZCA9PT0gU3RyaW5nKG4pID8gbiA6IHRyaW1tZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVkZ2VDb250ZXh0RnJvbUhlYWRlcnMoXG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD5cbik6IEVkZ2VDb250ZXh0IHtcbiAgY29uc3QgY3R4OiBFZGdlQ29udGV4dCA9IHt9O1xuICBjb25zdCBzaXRlSWQgPSBwYXJzZVNpdGVJZChwaWNrSGVhZGVyKGhlYWRlcnMsIFNJVEVfSURfSEVBREVSKSk7XG4gIGlmIChzaXRlSWQgIT09IHVuZGVmaW5lZCkgY3R4LnNpdGVJZCA9IHNpdGVJZDtcbiAgY29uc3QgaG9zdG5hbWUgPVxuICAgIHBhcnNlSG9zdG5hbWUocGlja0hlYWRlcihoZWFkZXJzLCBIT1NUTkFNRV9IRUFERVIpKSA/P1xuICAgIHBhcnNlSG9zdG5hbWUocGlja0hlYWRlcihoZWFkZXJzLCBGT1JXQVJERURfSE9TVE5BTUVfSEVBREVSKSk7XG4gIGlmIChob3N0bmFtZSkgY3R4Lmhvc3RuYW1lID0gaG9zdG5hbWU7XG4gIHJldHVybiBjdHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoRWRnZUNvbnRleHQ8VD4oXG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIGZuOiAoKSA9PiBUXG4pOiBUIHtcbiAgY29uc3QgY3R4ID0gYnVpbGRFZGdlQ29udGV4dEZyb21IZWFkZXJzKGhlYWRlcnMpO1xuICByZXR1cm4gc3RvcmFnZS5ydW4oY3R4LCBmbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGdlQ29udGV4dCgpOiBFZGdlQ29udGV4dCB7XG4gIHJldHVybiBzdG9yYWdlLmdldFN0b3JlKCkgPz8ge307XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWNoZVRhZ3ModGFnczogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHN0b3JlID0gc3RvcmFnZS5nZXRTdG9yZSgpO1xuICBpZiAoc3RvcmUpIHN0b3JlLmNhY2hlVGFncyA9IHRhZ3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYWNoZVRhZ3MoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHN0b3JhZ2UuZ2V0U3RvcmUoKT8uY2FjaGVUYWdzO1xufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "esa-pcg-cli",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "CLI for building and deploying Next.js apps onto pages-cache-gateway (PCG)",
5
5
  "keywords": [
6
6
  "next",