#!/usr/bin/env node
// coding-tools/figma-tools/js/src/_utils/cli-args.ts
function parseArgs(argv = process.argv.slice(2)) {
const args = { _: [] };
for (let i = 0; i < argv.length; i += 1) {
const arg = argv[i];
if (!arg.startsWith("-") || arg === "-") {
args._.push(arg);
continue;
}
if (arg === "--") {
const remaining = argv.slice(i + 1);
args._.push(...remaining);
break;
}
const [rawKey, inlineValue] = arg.split("=", 2);
const normalisedKey = rawKey.replace(/^-+/, "");
let value;
if (inlineValue !== void 0) {
value = inlineValue;
} else {
const next = argv[i + 1];
if (next !== void 0 && !next.startsWith("-")) {
value = next;
i += 1;
} else {
value = true;
}
}
args[normalisedKey] = value;
}
return args;
}
// coding-tools/figma-tools/js/src/_utils/url-parse.ts
var FILE_KEY_REGEX = /figma\.com\/(?:file|design)\/([A-Za-z0-9]+)\//i;
function parseFigmaUrl(input) {
if (!input) return { fileKey: null, nodeId: null };
try {
const url = new URL(input);
const match = url.href.match(FILE_KEY_REGEX);
const fileKey = match ? match[1] : null;
const nodeParam = url.searchParams.get("node-id");
const nodeId = nodeParam ? ensureNodeId(nodeParam) : null;
return { fileKey, nodeId };
} catch {
return { fileKey: null, nodeId: null };
}
}
function ensureNodeId(value) {
if (!value) return null;
const decoded = decodeURIComponent(value);
if (decoded.includes(":")) return decoded;
if (/^[0-9]+-[0-9]+$/.test(decoded)) {
const [left, right] = decoded.split("-", 2);
return `${left}:${right}`;
}
return decoded;
}
// coding-tools/figma-tools/js/src/_utils/config.ts
var config_default = {
schemaVersion: "1.0.0",
source: "agentic-coding-templates/figma-tools",
http: {
maxAttempts: 5,
initialDelayMs: 250
}
};
// coding-tools/figma-tools/js/src/_utils/envelope.ts
function buildRateLimitMeta(rateLimit = {}) {
return {
remaining: rateLimit.remaining ?? null,
resetAt: rateLimit.resetAt ?? null,
attempts: rateLimit.attempts ?? 1,
lastWaitMs: rateLimit.lastWaitMs ?? 0
};
}
function createEnvelope({
tool,
input = {},
data = {},
warnings = [],
errors = [],
rateLimit,
schemaVersion
}) {
return {
schemaVersion: schemaVersion ?? config_default.schemaVersion,
tool,
input,
meta: {
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
source: config_default.source,
rateLimit: buildRateLimitMeta(rateLimit)
},
data,
warnings,
errors
};
}
// coding-tools/figma-tools/js/src/_utils/errors.ts
var ERROR_EXIT_CODES = {
INPUT_INVALID: 1,
CONFIG_INVALID: 1,
FIGMA_AUTH: 1,
FIGMA_NOT_FOUND: 2,
FIGMA_RATE_LIMIT: 2,
NETWORK: 2,
INTERNAL: 3
};
function createError(code, message, detail) {
return {
code,
message,
detail: detail ?? null
};
}
function getExitCode(errors = []) {
if (!errors.length) {
return 0;
}
return errors.reduce((max, error) => {
const exitCode = ERROR_EXIT_CODES[error.code] ?? 1;
return Math.max(max, exitCode);
}, 0);
}
// coding-tools/figma-tools/js/src/_utils/http-client.ts
var BASE_URL = "https://api.figma.com";
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function parseJsonSafely(text) {
try {
return text ? JSON.parse(text) : {};
} catch {
return { raw: text };
}
}
function parseRateLimit(headers, attempts, lastWaitMs) {
const remainingHeader = headers.get("x-ratelimit-remaining");
const resetHeader = headers.get("x-ratelimit-reset");
let remaining = null;
if (remainingHeader !== null && remainingHeader !== void 0) {
const parsed = Number(remainingHeader);
remaining = Number.isNaN(parsed) ? null : parsed;
}
let resetAt = null;
if (resetHeader) {
const numericReset = Number(resetHeader);
if (!Number.isNaN(numericReset)) {
resetAt = new Date(numericReset * 1e3).toISOString();
} else {
const date = new Date(resetHeader);
if (!Number.isNaN(date.valueOf())) {
resetAt = date.toISOString();
}
}
}
return {
remaining,
resetAt,
attempts,
lastWaitMs
};
}
function computeBackoffMs(attempt, initialDelayMs) {
return initialDelayMs * 2 ** (attempt - 1);
}
async function figmaRequest(options) {
const {
path,
method = "GET",
token,
headers = {},
body,
searchParams,
maxAttempts = config_default.http?.maxAttempts ?? 5,
initialDelayMs = config_default.http?.initialDelayMs ?? 250
} = options;
if (!token) {
return {
ok: false,
error: createError("FIGMA_AUTH", "FIGMA_ACCESS_TOKEN is missing from the environment."),
status: null,
rateLimit: null
};
}
const url = new URL(path, BASE_URL);
if (searchParams) {
Object.entries(searchParams).forEach(([key, value]) => {
if (value === void 0 || value === null) return;
url.searchParams.append(key, String(value));
});
}
let attempt = 0;
let lastWaitMs = 0;
while (attempt < maxAttempts) {
attempt += 1;
const response = await fetch(url, {
method,
headers: {
"Content-Type": "application/json",
"X-Figma-Token": token,
...headers
},
body: body ? JSON.stringify(body) : void 0
});
const text = await response.text();
const payload = parseJsonSafely(text);
const rateLimit = parseRateLimit(response.headers, attempt, lastWaitMs);
if (response.ok) {
return { ok: true, data: payload, rateLimit };
}
const status = response.status;
if (status === 401 || status === 403) {
return { ok: false, error: createError("FIGMA_AUTH", payload?.message ?? "Figma token is unauthorized.", { status }), status, rateLimit };
}
if (status === 404) {
return { ok: false, error: createError("FIGMA_NOT_FOUND", payload?.message ?? "Resource not found.", { status }), status, rateLimit };
}
if (status === 429 || status >= 500) {
if (attempt >= maxAttempts) {
return {
ok: false,
error: createError(status === 429 ? "FIGMA_RATE_LIMIT" : "NETWORK", payload?.message ?? "Figma request failed after maximum retries.", { status }),
status,
rateLimit
};
}
let waitMs = computeBackoffMs(attempt, initialDelayMs);
const resetHeader = response.headers.get("x-ratelimit-reset");
if (resetHeader) {
const asNumber = Number(resetHeader);
if (!Number.isNaN(asNumber)) {
const resetMs = asNumber * 1e3;
const delta = resetMs - Date.now();
if (delta > 0) waitMs = Math.max(waitMs, delta);
}
}
const jitter = Math.floor(Math.random() * 100);
lastWaitMs = waitMs + jitter;
await sleep(lastWaitMs);
continue;
}
return { ok: false, error: createError("INTERNAL", payload?.message ?? "Unexpected error from Figma API.", { status }), status, rateLimit };
}
return {
ok: false,
error: createError("NETWORK", "Unable to reach Figma API."),
status: null,
rateLimit: { remaining: null, resetAt: null, attempts: maxAttempts, lastWaitMs }
};
}
// coding-tools/figma-tools/js/src/get-metadata.ts
var TOOL_NAME = "get-metadata";
function log(message, verbose) {
if (verbose) {
process.stderr.write(`[${TOOL_NAME}] ${message}
`);
}
}
function toOptionalString(value) {
return typeof value === "string" && value.length > 0 ? value : null;
}
function exitWithEnvelope(envelope, errors = []) {
process.stdout.write(`${JSON.stringify(envelope, null, 2)}
`);
process.exit(getExitCode(errors));
}
function mapNode(node, index = 0, parentId = null) {
const children = Array.isArray(node.children) ? node.children.map((child, idx) => mapNode(child, idx, node.id)) : [];
return {
id: node.id,
name: node.name,
type: node.type,
visible: node.visible ?? true,
locked: node.locked ?? false,
index,
parentId,
characters: node.characters ?? null,
blendMode: node.blendMode ?? null,
opacity: node.opacity ?? 1,
isMask: node.isMask ?? false,
relativeTransform: node.relativeTransform ?? null,
absoluteBoundingBox: node.absoluteBoundingBox ?? null,
size: node.size ?? null,
fills: node.fills ?? [],
strokes: node.strokes ?? [],
strokeWeight: node.strokeWeight ?? null,
strokeAlign: node.strokeAlign ?? null,
effects: node.effects ?? [],
constraints: node.constraints ?? null,
layoutAlign: node.layoutAlign ?? null,
layoutGrow: node.layoutGrow ?? null,
layoutMode: node.layoutMode ?? null,
primaryAxisSizingMode: node.primaryAxisSizingMode ?? null,
counterAxisSizingMode: node.counterAxisSizingMode ?? null,
primaryAxisAlignItems: node.primaryAxisAlignItems ?? null,
counterAxisAlignItems: node.counterAxisAlignItems ?? null,
itemSpacing: node.itemSpacing ?? null,
paddingLeft: node.paddingLeft ?? null,
paddingRight: node.paddingRight ?? null,
paddingTop: node.paddingTop ?? null,
paddingBottom: node.paddingBottom ?? null,
clipsContent: node.clipsContent ?? false,
layoutGrids: node.layoutGrids ?? [],
exportSettings: node.exportSettings ?? [],
transitionNodeID: node.transitionNodeID ?? null,
overlayPositionType: node.overlayPositionType ?? null,
overlayRelativePosition: node.overlayRelativePosition ?? null,
children
};
}
function escapeXml(value) {
return value.replace(/&/g, "&").replace(//g, ">").replace(/\"/g, """).replace(/'/g, "'");
}
function nodeToXml(node) {
const attrs = [
`id="${escapeXml(node.id)}"`,
node.type ? `type="${escapeXml(node.type)}"` : null,
node.name ? `name="${escapeXml(node.name)}"` : null,
node.visible === false ? 'visible="false"' : null,
node.locked ? 'locked="true"' : null,
node.parentId ? `parentId="${escapeXml(node.parentId)}"` : null,
node.absoluteBoundingBox ? `x="${node.absoluteBoundingBox.x ?? 0}" y="${node.absoluteBoundingBox.y ?? 0}" width="${node.absoluteBoundingBox.width ?? 0}" height="${node.absoluteBoundingBox.height ?? 0}"` : null
].filter(Boolean);
const childXml = node.children.map(nodeToXml).join("");
return `${childXml}`;
}
async function main() {
const args = parseArgs();
const verbose = Boolean(args.verbose ?? args.v);
const schemaVersion = toOptionalString(args["schema-version"]) ?? void 0;
const warnings = [];
const errors = [];
const token = process.env.FIGMA_ACCESS_TOKEN;
if (!token || !token.trim()) {
errors.push(createError("FIGMA_AUTH", "FIGMA_ACCESS_TOKEN is required but was not provided."));
const envelope2 = createEnvelope({
tool: TOOL_NAME,
input: { fileKey: null, nodeId: null, format: "json" },
warnings,
errors,
schemaVersion,
data: {}
});
exitWithEnvelope(envelope2, errors);
}
const urlInput = toOptionalString(args.url) ?? toOptionalString(args.u);
let fileKey = toOptionalString(args["file-key"]) ?? void 0;
let nodeId = ensureNodeId(toOptionalString(args["node-id"]));
if (urlInput) {
const parsed = parseFigmaUrl(urlInput);
fileKey = fileKey || parsed.fileKey || void 0;
nodeId = nodeId || parsed.nodeId;
}
let format = String(args.format ?? "json").toLowerCase();
let outputMode;
if (format === "json" || format === "xml" || format === "both") {
outputMode = format;
} else {
warnings.push(`Unknown format "${format}". Defaulting to json.`);
outputMode = "json";
}
const input = {
fileKey: fileKey ?? null,
nodeId: nodeId ?? null,
format: outputMode
};
if (!fileKey) {
errors.push(createError("INPUT_INVALID", "A valid Figma file key is required (--file-key or --url)."));
}
if (!nodeId) {
errors.push(createError("INPUT_INVALID", "A valid Figma node id is required (--node-id or --url with node-id)."));
}
if (errors.length) {
const envelope2 = createEnvelope({
tool: TOOL_NAME,
input,
warnings,
errors,
data: {},
schemaVersion
});
exitWithEnvelope(envelope2, errors);
}
const resolvedFileKey = fileKey;
const resolvedNodeId = nodeId;
log(`Fetching metadata for node ${resolvedNodeId} in file ${resolvedFileKey}`, verbose);
const nodeResponse = await figmaRequest({
path: `/v1/files/${resolvedFileKey}/nodes`,
token,
searchParams: { ids: resolvedNodeId }
});
if (!nodeResponse.ok) {
errors.push(nodeResponse.error ?? createError("INTERNAL", "Failed to fetch node metadata."));
const envelope2 = createEnvelope({
tool: TOOL_NAME,
input,
warnings,
errors,
rateLimit: nodeResponse.rateLimit ?? void 0,
data: {},
schemaVersion
});
exitWithEnvelope(envelope2, errors);
}
const nodesMap = nodeResponse.data?.nodes ?? {};
const nodeWrapper = nodesMap[resolvedNodeId];
if (!nodeWrapper || !nodeWrapper.document) {
errors.push(createError("FIGMA_NOT_FOUND", `Node ${resolvedNodeId} was not found in file ${resolvedFileKey}.`));
const envelope2 = createEnvelope({
tool: TOOL_NAME,
input,
warnings,
errors,
rateLimit: nodeResponse.rateLimit ?? void 0,
data: {},
schemaVersion
});
exitWithEnvelope(envelope2, errors);
}
const rootNode = nodeWrapper.document;
const metadataTree = mapNode(rootNode);
let xmlDocument;
if (outputMode === "xml" || outputMode === "both") {
xmlDocument = `${nodeToXml(metadataTree)}`;
}
const data = {
file: {
key: resolvedFileKey,
name: nodeResponse.data?.name ?? null,
lastModified: nodeResponse.data?.lastModified ?? null
},
metadata: metadataTree,
xml: xmlDocument
};
const envelope = createEnvelope({
tool: TOOL_NAME,
input,
data,
warnings,
errors,
rateLimit: nodeResponse.rateLimit ?? void 0,
schemaVersion
});
process.stdout.write(`${JSON.stringify(envelope, null, 2)}
`);
process.exit(getExitCode(errors));
}
main().catch((error) => {
const message = error instanceof Error ? error.message : "Unknown error";
const envelope = createEnvelope({
tool: TOOL_NAME,
input: { fileKey: null, nodeId: null, format: "json" },
errors: [createError("INTERNAL", message, { stack: error instanceof Error ? error.stack : void 0 })],
data: {}
});
process.stdout.write(`${JSON.stringify(envelope, null, 2)}
`);
process.exit(3);
});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL191dGlscy9jbGktYXJncy50cyIsICIuLi9zcmMvX3V0aWxzL3VybC1wYXJzZS50cyIsICIuLi9zcmMvX3V0aWxzL2NvbmZpZy50cyIsICIuLi9zcmMvX3V0aWxzL2VudmVsb3BlLnRzIiwgIi4uL3NyYy9fdXRpbHMvZXJyb3JzLnRzIiwgIi4uL3NyYy9fdXRpbHMvaHR0cC1jbGllbnQudHMiLCAiLi4vc3JjL2dldC1tZXRhZGF0YS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHR5cGUgQ2xpQXJnVmFsdWUgPSBzdHJpbmcgfCBib29sZWFuO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsaUFyZ3Mge1xuICBfOiBzdHJpbmdbXTtcbiAgW2tleTogc3RyaW5nXTogQ2xpQXJnVmFsdWUgfCBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXJncyhhcmd2OiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndi5zbGljZSgyKSk6IENsaUFyZ3Mge1xuICBjb25zdCBhcmdzOiBDbGlBcmdzID0geyBfOiBbXSB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3ZbaV07XG5cbiAgICBpZiAoIWFyZy5zdGFydHNXaXRoKCctJykgfHwgYXJnID09PSAnLScpIHtcbiAgICAgIGFyZ3MuXy5wdXNoKGFyZyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBhcmd2LnNsaWNlKGkgKyAxKTtcbiAgICAgIGFyZ3MuXy5wdXNoKC4uLnJlbWFpbmluZyk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCBbcmF3S2V5LCBpbmxpbmVWYWx1ZV0gPSBhcmcuc3BsaXQoJz0nLCAyKTtcbiAgICBjb25zdCBub3JtYWxpc2VkS2V5ID0gcmF3S2V5LnJlcGxhY2UoL14tKy8sICcnKTtcblxuICAgIGxldCB2YWx1ZTogQ2xpQXJnVmFsdWU7XG4gICAgaWYgKGlubGluZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gaW5saW5lVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5leHQgPSBhcmd2W2kgKyAxXTtcbiAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgIW5leHQuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHZhbHVlID0gbmV4dDtcbiAgICAgICAgaSArPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFyZ3Nbbm9ybWFsaXNlZEtleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBhcmdzO1xufVxuXG4iLCAiY29uc3QgRklMRV9LRVlfUkVHRVggPSAvZmlnbWFcXC5jb21cXC8oPzpmaWxlfGRlc2lnbilcXC8oW0EtWmEtejAtOV0rKVxcLy9pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZEZpZ21hVXJsIHtcbiAgZmlsZUtleTogc3RyaW5nIHwgbnVsbDtcbiAgbm9kZUlkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGaWdtYVVybChpbnB1dDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFBhcnNlZEZpZ21hVXJsIHtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIHsgZmlsZUtleTogbnVsbCwgbm9kZUlkOiBudWxsIH07XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChpbnB1dCk7XG4gICAgY29uc3QgbWF0Y2ggPSB1cmwuaHJlZi5tYXRjaChGSUxFX0tFWV9SRUdFWCk7XG4gICAgY29uc3QgZmlsZUtleSA9IG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsO1xuICAgIGNvbnN0IG5vZGVQYXJhbSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCdub2RlLWlkJyk7XG4gICAgY29uc3Qgbm9kZUlkID0gbm9kZVBhcmFtID8gZW5zdXJlTm9kZUlkKG5vZGVQYXJhbSkgOiBudWxsO1xuICAgIHJldHVybiB7IGZpbGVLZXksIG5vZGVJZCB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBmaWxlS2V5OiBudWxsLCBub2RlSWQ6IG51bGwgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlTm9kZUlkKHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgaWYgKGRlY29kZWQuaW5jbHVkZXMoJzonKSkgcmV0dXJuIGRlY29kZWQ7XG4gIGlmICgvXlswLTldKy1bMC05XSskLy50ZXN0KGRlY29kZWQpKSB7XG4gICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGRlY29kZWQuc3BsaXQoJy0nLCAyKTtcbiAgICByZXR1cm4gYCR7bGVmdH06JHtyaWdodH1gO1xuICB9XG4gIHJldHVybiBkZWNvZGVkO1xufVxuXG4iLCAiZXhwb3J0IGRlZmF1bHQge1xuICBzY2hlbWFWZXJzaW9uOiAnMS4wLjAnLFxuICBzb3VyY2U6ICdhZ2VudGljLWNvZGluZy10ZW1wbGF0ZXMvZmlnbWEtdG9vbHMnLFxuICBodHRwOiB7XG4gICAgbWF4QXR0ZW1wdHM6IDUsXG4gICAgaW5pdGlhbERlbGF5TXM6IDI1MCxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbiIsICJpbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnLnRzJztcbmltcG9ydCB0eXBlIHsgVG9vbEVycm9yIH0gZnJvbSAnLi9lcnJvcnMudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhdGVMaW1pdE1ldGEge1xuICByZW1haW5pbmc6IG51bWJlciB8IG51bGw7XG4gIHJlc2V0QXQ6IHN0cmluZyB8IG51bGw7XG4gIGF0dGVtcHRzOiBudW1iZXI7XG4gIGxhc3RXYWl0TXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb29sRW52ZWxvcGU8XG4gIFRJbnB1dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIFREYXRhID0gdW5rbm93blxuPiB7XG4gIHNjaGVtYVZlcnNpb246IHN0cmluZztcbiAgdG9vbDogc3RyaW5nO1xuICBpbnB1dDogVElucHV0O1xuICBtZXRhOiB7XG4gICAgZ2VuZXJhdGVkQXQ6IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZztcbiAgICByYXRlTGltaXQ6IFJhdGVMaW1pdE1ldGE7XG4gIH07XG4gIGRhdGE6IFREYXRhO1xuICB3YXJuaW5nczogc3RyaW5nW107XG4gIGVycm9yczogVG9vbEVycm9yW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRW52ZWxvcGVPcHRpb25zPFxuICBUSW5wdXQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBURGF0YSA9IHVua25vd25cbj4ge1xuICB0b29sOiBzdHJpbmc7XG4gIGlucHV0PzogVElucHV0O1xuICBkYXRhPzogVERhdGE7XG4gIHdhcm5pbmdzPzogc3RyaW5nW107XG4gIGVycm9ycz86IFRvb2xFcnJvcltdO1xuICByYXRlTGltaXQ/OiBQYXJ0aWFsPFJhdGVMaW1pdE1ldGE+O1xuICBzY2hlbWFWZXJzaW9uPzogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBidWlsZFJhdGVMaW1pdE1ldGEocmF0ZUxpbWl0OiBQYXJ0aWFsPFJhdGVMaW1pdE1ldGE+ID0ge30pOiBSYXRlTGltaXRNZXRhIHtcbiAgcmV0dXJuIHtcbiAgICByZW1haW5pbmc6IHJhdGVMaW1pdC5yZW1haW5pbmcgPz8gbnVsbCxcbiAgICByZXNldEF0OiByYXRlTGltaXQucmVzZXRBdCA/PyBudWxsLFxuICAgIGF0dGVtcHRzOiByYXRlTGltaXQuYXR0ZW1wdHMgPz8gMSxcbiAgICBsYXN0V2FpdE1zOiByYXRlTGltaXQubGFzdFdhaXRNcyA/PyAwLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52ZWxvcGU8XG4gIFRJbnB1dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIFREYXRhID0gdW5rbm93blxuPih7XG4gIHRvb2wsXG4gIGlucHV0ID0ge30gYXMgVElucHV0LFxuICBkYXRhID0ge30gYXMgVERhdGEsXG4gIHdhcm5pbmdzID0gW10sXG4gIGVycm9ycyA9IFtdLFxuICByYXRlTGltaXQsXG4gIHNjaGVtYVZlcnNpb24sXG59OiBDcmVhdGVFbnZlbG9wZU9wdGlvbnM8VElucHV0LCBURGF0YT4pOiBUb29sRW52ZWxvcGU8VElucHV0LCBURGF0YT4ge1xuICByZXR1cm4ge1xuICAgIHNjaGVtYVZlcnNpb246IHNjaGVtYVZlcnNpb24gPz8gY29uZmlnLnNjaGVtYVZlcnNpb24sXG4gICAgdG9vbCxcbiAgICBpbnB1dCxcbiAgICBtZXRhOiB7XG4gICAgICBnZW5lcmF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgc291cmNlOiBjb25maWcuc291cmNlLFxuICAgICAgcmF0ZUxpbWl0OiBidWlsZFJhdGVMaW1pdE1ldGEocmF0ZUxpbWl0KSxcbiAgICB9LFxuICAgIGRhdGEsXG4gICAgd2FybmluZ3MsXG4gICAgZXJyb3JzLFxuICB9O1xufVxuXG4iLCAiZXhwb3J0IGNvbnN0IEVSUk9SX0VYSVRfQ09ERVMgPSB7XG4gIElOUFVUX0lOVkFMSUQ6IDEsXG4gIENPTkZJR19JTlZBTElEOiAxLFxuICBGSUdNQV9BVVRIOiAxLFxuICBGSUdNQV9OT1RfRk9VTkQ6IDIsXG4gIEZJR01BX1JBVEVfTElNSVQ6IDIsXG4gIE5FVFdPUks6IDIsXG4gIElOVEVSTkFMOiAzLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRXJyb3JDb2RlID0ga2V5b2YgdHlwZW9mIEVSUk9SX0VYSVRfQ09ERVM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbEVycm9yPFREZXRhaWwgPSB1bmtub3duPiB7XG4gIGNvZGU6IEVycm9yQ29kZSB8IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkZXRhaWw/OiBURGV0YWlsIHwgbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9yPFREZXRhaWwgPSB1bmtub3duPihcbiAgY29kZTogRXJyb3JDb2RlIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIGRldGFpbD86IFREZXRhaWwgfCBudWxsXG4pOiBUb29sRXJyb3I8VERldGFpbD4ge1xuICByZXR1cm4ge1xuICAgIGNvZGUsXG4gICAgbWVzc2FnZSxcbiAgICBkZXRhaWw6IGRldGFpbCA/PyBudWxsLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhpdENvZGUoZXJyb3JzOiBUb29sRXJyb3JbXSA9IFtdKTogbnVtYmVyIHtcbiAgaWYgKCFlcnJvcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gZXJyb3JzLnJlZHVjZSgobWF4LCBlcnJvcikgPT4ge1xuICAgIGNvbnN0IGV4aXRDb2RlID0gRVJST1JfRVhJVF9DT0RFU1tlcnJvci5jb2RlIGFzIEVycm9yQ29kZV0gPz8gMTtcbiAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBleGl0Q29kZSk7XG4gIH0sIDApO1xufVxuXG4iLCAiaW1wb3J0IGNvbmZpZyBmcm9tICcuL2NvbmZpZy50cyc7XG5pbXBvcnQgeyBjcmVhdGVFcnJvciB9IGZyb20gJy4vZXJyb3JzLnRzJztcbmltcG9ydCB0eXBlIHsgVG9vbEVycm9yIH0gZnJvbSAnLi9lcnJvcnMudHMnO1xuaW1wb3J0IHR5cGUgeyBSYXRlTGltaXRNZXRhIH0gZnJvbSAnLi9lbnZlbG9wZS50cyc7XG5cbmNvbnN0IEJBU0VfVVJMID0gJ2h0dHBzOi8vYXBpLmZpZ21hLmNvbSc7XG5cbnR5cGUgU2VhcmNoUGFyYW1zID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ+O1xuXG5pbnRlcmZhY2UgRmlnbWFSZXF1ZXN0T3B0aW9ucyB7XG4gIHBhdGg6IHN0cmluZztcbiAgbWV0aG9kPzogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGJvZHk/OiB1bmtub3duO1xuICBzZWFyY2hQYXJhbXM/OiBTZWFyY2hQYXJhbXM7XG4gIG1heEF0dGVtcHRzPzogbnVtYmVyO1xuICBpbml0aWFsRGVsYXlNcz86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEZpZ21hU3VjY2VzczxURGF0YT4ge1xuICBvazogdHJ1ZTtcbiAgZGF0YTogVERhdGE7XG4gIHJhdGVMaW1pdDogUmF0ZUxpbWl0TWV0YTtcbn1cblxuaW50ZXJmYWNlIEZpZ21hRmFpbHVyZSB7XG4gIG9rOiBmYWxzZTtcbiAgZXJyb3I6IFRvb2xFcnJvcjx7IHN0YXR1cz86IG51bWJlciB9PjtcbiAgc3RhdHVzPzogbnVtYmVyIHwgbnVsbDtcbiAgcmF0ZUxpbWl0OiBSYXRlTGltaXRNZXRhIHwgbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgRmlnbWFSZXNwb25zZTxURGF0YT4gPSBGaWdtYVN1Y2Nlc3M8VERhdGE+IHwgRmlnbWFGYWlsdXJlO1xuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUpzb25TYWZlbHkodGV4dDogc3RyaW5nKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRleHQgPyBKU09OLnBhcnNlKHRleHQpIDoge307XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IHJhdzogdGV4dCB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmF0ZUxpbWl0KGhlYWRlcnM6IEhlYWRlcnMsIGF0dGVtcHRzOiBudW1iZXIsIGxhc3RXYWl0TXM6IG51bWJlcik6IFJhdGVMaW1pdE1ldGEge1xuICBjb25zdCByZW1haW5pbmdIZWFkZXIgPSBoZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVtYWluaW5nJyk7XG4gIGNvbnN0IHJlc2V0SGVhZGVyID0gaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LXJlc2V0Jyk7XG5cbiAgbGV0IHJlbWFpbmluZzogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGlmIChyZW1haW5pbmdIZWFkZXIgIT09IG51bGwgJiYgcmVtYWluaW5nSGVhZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIocmVtYWluaW5nSGVhZGVyKTtcbiAgICByZW1haW5pbmcgPSBOdW1iZXIuaXNOYU4ocGFyc2VkKSA/IG51bGwgOiBwYXJzZWQ7XG4gIH1cblxuICBsZXQgcmVzZXRBdDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGlmIChyZXNldEhlYWRlcikge1xuICAgIGNvbnN0IG51bWVyaWNSZXNldCA9IE51bWJlcihyZXNldEhlYWRlcik7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtZXJpY1Jlc2V0KSkge1xuICAgICAgcmVzZXRBdCA9IG5ldyBEYXRlKG51bWVyaWNSZXNldCAqIDEwMDApLnRvSVNPU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShyZXNldEhlYWRlcik7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihkYXRlLnZhbHVlT2YoKSkpIHtcbiAgICAgICAgcmVzZXRBdCA9IGRhdGUudG9JU09TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlbWFpbmluZyxcbiAgICByZXNldEF0LFxuICAgIGF0dGVtcHRzLFxuICAgIGxhc3RXYWl0TXMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVCYWNrb2ZmTXMoYXR0ZW1wdDogbnVtYmVyLCBpbml0aWFsRGVsYXlNczogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGluaXRpYWxEZWxheU1zICogMiAqKiAoYXR0ZW1wdCAtIDEpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlnbWFSZXF1ZXN0PFREYXRhID0gdW5rbm93bj4oXG4gIG9wdGlvbnM6IEZpZ21hUmVxdWVzdE9wdGlvbnNcbik6IFByb21pc2U8RmlnbWFSZXNwb25zZTxURGF0YT4+IHtcbiAgY29uc3Qge1xuICAgIHBhdGgsXG4gICAgbWV0aG9kID0gJ0dFVCcsXG4gICAgdG9rZW4sXG4gICAgaGVhZGVycyA9IHt9LFxuICAgIGJvZHksXG4gICAgc2VhcmNoUGFyYW1zLFxuICAgIG1heEF0dGVtcHRzID0gY29uZmlnLmh0dHA/Lm1heEF0dGVtcHRzID8/IDUsXG4gICAgaW5pdGlhbERlbGF5TXMgPSBjb25maWcuaHR0cD8uaW5pdGlhbERlbGF5TXMgPz8gMjUwLFxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoIXRva2VuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIGVycm9yOiBjcmVhdGVFcnJvcignRklHTUFfQVVUSCcsICdGSUdNQV9BQ0NFU1NfVE9LRU4gaXMgbWlzc2luZyBmcm9tIHRoZSBlbnZpcm9ubWVudC4nKSxcbiAgICAgIHN0YXR1czogbnVsbCxcbiAgICAgIHJhdGVMaW1pdDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoLCBCQVNFX1VSTCk7XG5cbiAgaWYgKHNlYXJjaFBhcmFtcykge1xuICAgIE9iamVjdC5lbnRyaWVzKHNlYXJjaFBhcmFtcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGxldCBhdHRlbXB0ID0gMDtcbiAgbGV0IGxhc3RXYWl0TXMgPSAwO1xuXG4gIHdoaWxlIChhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICBhdHRlbXB0ICs9IDE7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnWC1GaWdtYS1Ub2tlbic6IHRva2VuLFxuICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IGJvZHkgPyBKU09OLnN0cmluZ2lmeShib2R5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgY29uc3QgcGF5bG9hZCA9IHBhcnNlSnNvblNhZmVseSh0ZXh0KSBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfTtcbiAgICBjb25zdCByYXRlTGltaXQgPSBwYXJzZVJhdGVMaW1pdChyZXNwb25zZS5oZWFkZXJzLCBhdHRlbXB0LCBsYXN0V2FpdE1zKTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGRhdGE6IHBheWxvYWQgYXMgVERhdGEsIHJhdGVMaW1pdCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcblxuICAgIGlmIChzdGF0dXMgPT09IDQwMSB8fCBzdGF0dXMgPT09IDQwMykge1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogY3JlYXRlRXJyb3IoJ0ZJR01BX0FVVEgnLCBwYXlsb2FkPy5tZXNzYWdlID8/ICdGaWdtYSB0b2tlbiBpcyB1bmF1dGhvcml6ZWQuJywgeyBzdGF0dXMgfSksIHN0YXR1cywgcmF0ZUxpbWl0IH07XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBjcmVhdGVFcnJvcignRklHTUFfTk9UX0ZPVU5EJywgcGF5bG9hZD8ubWVzc2FnZSA/PyAnUmVzb3VyY2Ugbm90IGZvdW5kLicsIHsgc3RhdHVzIH0pLCBzdGF0dXMsIHJhdGVMaW1pdCB9O1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQyOSB8fCBzdGF0dXMgPj0gNTAwKSB7XG4gICAgICBpZiAoYXR0ZW1wdCA+PSBtYXhBdHRlbXB0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogY3JlYXRlRXJyb3Ioc3RhdHVzID09PSA0MjkgPyAnRklHTUFfUkFURV9MSU1JVCcgOiAnTkVUV09SSycsIHBheWxvYWQ/Lm1lc3NhZ2UgPz8gJ0ZpZ21hIHJlcXVlc3QgZmFpbGVkIGFmdGVyIG1heGltdW0gcmV0cmllcy4nLCB7IHN0YXR1cyB9KSxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgcmF0ZUxpbWl0LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBsZXQgd2FpdE1zID0gY29tcHV0ZUJhY2tvZmZNcyhhdHRlbXB0LCBpbml0aWFsRGVsYXlNcyk7XG4gICAgICBjb25zdCByZXNldEhlYWRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZXNldCcpO1xuICAgICAgaWYgKHJlc2V0SGVhZGVyKSB7XG4gICAgICAgIGNvbnN0IGFzTnVtYmVyID0gTnVtYmVyKHJlc2V0SGVhZGVyKTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oYXNOdW1iZXIpKSB7XG4gICAgICAgICAgY29uc3QgcmVzZXRNcyA9IGFzTnVtYmVyICogMTAwMDtcbiAgICAgICAgICBjb25zdCBkZWx0YSA9IHJlc2V0TXMgLSBEYXRlLm5vdygpO1xuICAgICAgICAgIGlmIChkZWx0YSA+IDApIHdhaXRNcyA9IE1hdGgubWF4KHdhaXRNcywgZGVsdGEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGppdHRlciA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMCk7XG4gICAgICBsYXN0V2FpdE1zID0gd2FpdE1zICsgaml0dGVyO1xuICAgICAgYXdhaXQgc2xlZXAobGFzdFdhaXRNcyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBjcmVhdGVFcnJvcignSU5URVJOQUwnLCBwYXlsb2FkPy5tZXNzYWdlID8/ICdVbmV4cGVjdGVkIGVycm9yIGZyb20gRmlnbWEgQVBJLicsIHsgc3RhdHVzIH0pLCBzdGF0dXMsIHJhdGVMaW1pdCB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvazogZmFsc2UsXG4gICAgZXJyb3I6IGNyZWF0ZUVycm9yKCdORVRXT1JLJywgJ1VuYWJsZSB0byByZWFjaCBGaWdtYSBBUEkuJyksXG4gICAgc3RhdHVzOiBudWxsLFxuICAgIHJhdGVMaW1pdDogeyByZW1haW5pbmc6IG51bGwsIHJlc2V0QXQ6IG51bGwsIGF0dGVtcHRzOiBtYXhBdHRlbXB0cywgbGFzdFdhaXRNcyB9LFxuICB9O1xufVxuXG4iLCAiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBwYXJzZUFyZ3MsIHR5cGUgQ2xpQXJncyB9IGZyb20gJy4vX3V0aWxzL2NsaS1hcmdzLnRzJ1xuaW1wb3J0IHsgcGFyc2VGaWdtYVVybCwgZW5zdXJlTm9kZUlkIH0gZnJvbSAnLi9fdXRpbHMvdXJsLXBhcnNlLnRzJ1xuaW1wb3J0IHsgY3JlYXRlRW52ZWxvcGUsIHR5cGUgVG9vbEVudmVsb3BlIH0gZnJvbSAnLi9fdXRpbHMvZW52ZWxvcGUudHMnXG5pbXBvcnQgeyBjcmVhdGVFcnJvciwgZ2V0RXhpdENvZGUsIHR5cGUgVG9vbEVycm9yIH0gZnJvbSAnLi9fdXRpbHMvZXJyb3JzLnRzJ1xuaW1wb3J0IHsgZmlnbWFSZXF1ZXN0IH0gZnJvbSAnLi9fdXRpbHMvaHR0cC1jbGllbnQudHMnXG5cbmNvbnN0IFRPT0xfTkFNRSA9ICdnZXQtbWV0YWRhdGEnXG50eXBlIEVtcHR5RGF0YSA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPlxuXG5pbnRlcmZhY2UgVG9vbElucHV0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBmaWxlS2V5OiBzdHJpbmcgfCBudWxsXG4gIG5vZGVJZDogc3RyaW5nIHwgbnVsbFxuICBmb3JtYXQ6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgRmlnbWFOb2RlIHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIHR5cGU/OiBzdHJpbmdcbiAgdmlzaWJsZT86IGJvb2xlYW5cbiAgbG9ja2VkPzogYm9vbGVhblxuICBjaGFyYWN0ZXJzPzogc3RyaW5nXG4gIGJsZW5kTW9kZT86IHN0cmluZ1xuICBvcGFjaXR5PzogbnVtYmVyXG4gIGlzTWFzaz86IGJvb2xlYW5cbiAgcmVsYXRpdmVUcmFuc2Zvcm0/OiB1bmtub3duXG4gIGFic29sdXRlQm91bmRpbmdCb3g/OiB7IHg/OiBudW1iZXI7IHk/OiBudW1iZXI7IHdpZHRoPzogbnVtYmVyOyBoZWlnaHQ/OiBudW1iZXIgfVxuICBzaXplPzogdW5rbm93blxuICBmaWxscz86IHVua25vd25bXVxuICBzdHJva2VzPzogdW5rbm93bltdXG4gIHN0cm9rZVdlaWdodD86IG51bWJlclxuICBzdHJva2VBbGlnbj86IHN0cmluZ1xuICBlZmZlY3RzPzogdW5rbm93bltdXG4gIGNvbnN0cmFpbnRzPzogdW5rbm93blxuICBsYXlvdXRBbGlnbj86IHN0cmluZ1xuICBsYXlvdXRHcm93PzogbnVtYmVyXG4gIGxheW91dE1vZGU/OiBzdHJpbmdcbiAgcHJpbWFyeUF4aXNTaXppbmdNb2RlPzogc3RyaW5nXG4gIGNvdW50ZXJBeGlzU2l6aW5nTW9kZT86IHN0cmluZ1xuICBwcmltYXJ5QXhpc0FsaWduSXRlbXM/OiBzdHJpbmdcbiAgY291bnRlckF4aXNBbGlnbkl0ZW1zPzogc3RyaW5nXG4gIGl0ZW1TcGFjaW5nPzogbnVtYmVyXG4gIHBhZGRpbmdMZWZ0PzogbnVtYmVyXG4gIHBhZGRpbmdSaWdodD86IG51bWJlclxuICBwYWRkaW5nVG9wPzogbnVtYmVyXG4gIHBhZGRpbmdCb3R0b20/OiBudW1iZXJcbiAgY2xpcHNDb250ZW50PzogYm9vbGVhblxuICBsYXlvdXRHcmlkcz86IHVua25vd25bXVxuICBleHBvcnRTZXR0aW5ncz86IHVua25vd25bXVxuICB0cmFuc2l0aW9uTm9kZUlEPzogc3RyaW5nXG4gIG92ZXJsYXlQb3NpdGlvblR5cGU/OiBzdHJpbmdcbiAgb3ZlcmxheVJlbGF0aXZlUG9zaXRpb24/OiB1bmtub3duXG4gIGNoaWxkcmVuPzogRmlnbWFOb2RlW11cbn1cblxuaW50ZXJmYWNlIE5vZGVzUmVzcG9uc2VQYXlsb2FkIHtcbiAgbmFtZT86IHN0cmluZ1xuICBsYXN0TW9kaWZpZWQ/OiBzdHJpbmdcbiAgbm9kZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IGRvY3VtZW50PzogRmlnbWFOb2RlIH0+XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YU5vZGUge1xuICBpZDogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgdHlwZT86IHN0cmluZ1xuICB2aXNpYmxlOiBib29sZWFuXG4gIGxvY2tlZDogYm9vbGVhblxuICBpbmRleDogbnVtYmVyXG4gIHBhcmVudElkOiBzdHJpbmcgfCBudWxsXG4gIGNoYXJhY3RlcnM6IHN0cmluZyB8IG51bGxcbiAgYmxlbmRNb2RlOiBzdHJpbmcgfCBudWxsXG4gIG9wYWNpdHk6IG51bWJlclxuICBpc01hc2s6IGJvb2xlYW5cbiAgcmVsYXRpdmVUcmFuc2Zvcm06IHVua25vd25cbiAgYWJzb2x1dGVCb3VuZGluZ0JveDogeyB4PzogbnVtYmVyOyB5PzogbnVtYmVyOyB3aWR0aD86IG51bWJlcjsgaGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsXG4gIHNpemU6IHVua25vd25cbiAgZmlsbHM6IHVua25vd25bXVxuICBzdHJva2VzOiB1bmtub3duW11cbiAgc3Ryb2tlV2VpZ2h0OiBudW1iZXIgfCBudWxsXG4gIHN0cm9rZUFsaWduOiBzdHJpbmcgfCBudWxsXG4gIGVmZmVjdHM6IHVua25vd25bXVxuICBjb25zdHJhaW50czogdW5rbm93blxuICBsYXlvdXRBbGlnbjogc3RyaW5nIHwgbnVsbFxuICBsYXlvdXRHcm93OiBudW1iZXIgfCBudWxsXG4gIGxheW91dE1vZGU6IHN0cmluZyB8IG51bGxcbiAgcHJpbWFyeUF4aXNTaXppbmdNb2RlOiBzdHJpbmcgfCBudWxsXG4gIGNvdW50ZXJBeGlzU2l6aW5nTW9kZTogc3RyaW5nIHwgbnVsbFxuICBwcmltYXJ5QXhpc0FsaWduSXRlbXM6IHN0cmluZyB8IG51bGxcbiAgY291bnRlckF4aXNBbGlnbkl0ZW1zOiBzdHJpbmcgfCBudWxsXG4gIGl0ZW1TcGFjaW5nOiBudW1iZXIgfCBudWxsXG4gIHBhZGRpbmdMZWZ0OiBudW1iZXIgfCBudWxsXG4gIHBhZGRpbmdSaWdodDogbnVtYmVyIHwgbnVsbFxuICBwYWRkaW5nVG9wOiBudW1iZXIgfCBudWxsXG4gIHBhZGRpbmdCb3R0b206IG51bWJlciB8IG51bGxcbiAgY2xpcHNDb250ZW50OiBib29sZWFuXG4gIGxheW91dEdyaWRzOiB1bmtub3duW11cbiAgZXhwb3J0U2V0dGluZ3M6IHVua25vd25bXVxuICB0cmFuc2l0aW9uTm9kZUlEOiBzdHJpbmcgfCBudWxsXG4gIG92ZXJsYXlQb3NpdGlvblR5cGU6IHN0cmluZyB8IG51bGxcbiAgb3ZlcmxheVJlbGF0aXZlUG9zaXRpb246IHVua25vd25cbiAgY2hpbGRyZW46IE1ldGFkYXRhTm9kZVtdXG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURhdGEge1xuICBmaWxlOiB7XG4gICAga2V5OiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsXG4gICAgbGFzdE1vZGlmaWVkOiBzdHJpbmcgfCBudWxsXG4gIH1cbiAgbWV0YWRhdGE6IE1ldGFkYXRhTm9kZVxuICB4bWw/OiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gbG9nKG1lc3NhZ2U6IHN0cmluZywgdmVyYm9zZTogYm9vbGVhbik6IHZvaWQge1xuICBpZiAodmVyYm9zZSkge1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBbJHtUT09MX05BTUV9XSAke21lc3NhZ2V9XFxuYClcbiAgfVxufVxuXG5mdW5jdGlvbiB0b09wdGlvbmFsU3RyaW5nKHZhbHVlOiBDbGlBcmdzW3N0cmluZ10pOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMCA/IHZhbHVlIDogbnVsbFxufVxuXG5mdW5jdGlvbiBleGl0V2l0aEVudmVsb3BlKFxuICBlbnZlbG9wZTogVG9vbEVudmVsb3BlPFRvb2xJbnB1dCwgTWV0YWRhdGFEYXRhIHwgRW1wdHlEYXRhPixcbiAgZXJyb3JzOiBUb29sRXJyb3JbXSA9IFtdXG4pOiBuZXZlciB7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGVudmVsb3BlLCBudWxsLCAyKX1cXG5gKVxuICBwcm9jZXNzLmV4aXQoZ2V0RXhpdENvZGUoZXJyb3JzKSlcbn1cblxuZnVuY3Rpb24gbWFwTm9kZShub2RlOiBGaWdtYU5vZGUsIGluZGV4ID0gMCwgcGFyZW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsKTogTWV0YWRhdGFOb2RlIHtcbiAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5pc0FycmF5KG5vZGUuY2hpbGRyZW4pXG4gICAgPyBub2RlLmNoaWxkcmVuLm1hcCgoY2hpbGQsIGlkeCkgPT4gbWFwTm9kZShjaGlsZCwgaWR4LCBub2RlLmlkKSlcbiAgICA6IFtdXG5cbiAgcmV0dXJuIHtcbiAgICBpZDogbm9kZS5pZCxcbiAgICBuYW1lOiBub2RlLm5hbWUsXG4gICAgdHlwZTogbm9kZS50eXBlLFxuICAgIHZpc2libGU6IG5vZGUudmlzaWJsZSA/PyB0cnVlLFxuICAgIGxvY2tlZDogbm9kZS5sb2NrZWQgPz8gZmFsc2UsXG4gICAgaW5kZXgsXG4gICAgcGFyZW50SWQsXG4gICAgY2hhcmFjdGVyczogbm9kZS5jaGFyYWN0ZXJzID8/IG51bGwsXG4gICAgYmxlbmRNb2RlOiBub2RlLmJsZW5kTW9kZSA/PyBudWxsLFxuICAgIG9wYWNpdHk6IG5vZGUub3BhY2l0eSA/PyAxLFxuICAgIGlzTWFzazogbm9kZS5pc01hc2sgPz8gZmFsc2UsXG4gICAgcmVsYXRpdmVUcmFuc2Zvcm06IG5vZGUucmVsYXRpdmVUcmFuc2Zvcm0gPz8gbnVsbCxcbiAgICBhYnNvbHV0ZUJvdW5kaW5nQm94OiBub2RlLmFic29sdXRlQm91bmRpbmdCb3ggPz8gbnVsbCxcbiAgICBzaXplOiBub2RlLnNpemUgPz8gbnVsbCxcbiAgICBmaWxsczogbm9kZS5maWxscyA/PyBbXSxcbiAgICBzdHJva2VzOiBub2RlLnN0cm9rZXMgPz8gW10sXG4gICAgc3Ryb2tlV2VpZ2h0OiBub2RlLnN0cm9rZVdlaWdodCA/PyBudWxsLFxuICAgIHN0cm9rZUFsaWduOiBub2RlLnN0cm9rZUFsaWduID8/IG51bGwsXG4gICAgZWZmZWN0czogbm9kZS5lZmZlY3RzID8/IFtdLFxuICAgIGNvbnN0cmFpbnRzOiBub2RlLmNvbnN0cmFpbnRzID8/IG51bGwsXG4gICAgbGF5b3V0QWxpZ246IG5vZGUubGF5b3V0QWxpZ24gPz8gbnVsbCxcbiAgICBsYXlvdXRHcm93OiBub2RlLmxheW91dEdyb3cgPz8gbnVsbCxcbiAgICBsYXlvdXRNb2RlOiBub2RlLmxheW91dE1vZGUgPz8gbnVsbCxcbiAgICBwcmltYXJ5QXhpc1NpemluZ01vZGU6IG5vZGUucHJpbWFyeUF4aXNTaXppbmdNb2RlID8/IG51bGwsXG4gICAgY291bnRlckF4aXNTaXppbmdNb2RlOiBub2RlLmNvdW50ZXJBeGlzU2l6aW5nTW9kZSA/PyBudWxsLFxuICAgIHByaW1hcnlBeGlzQWxpZ25JdGVtczogbm9kZS5wcmltYXJ5QXhpc0FsaWduSXRlbXMgPz8gbnVsbCxcbiAgICBjb3VudGVyQXhpc0FsaWduSXRlbXM6IG5vZGUuY291bnRlckF4aXNBbGlnbkl0ZW1zID8/IG51bGwsXG4gICAgaXRlbVNwYWNpbmc6IG5vZGUuaXRlbVNwYWNpbmcgPz8gbnVsbCxcbiAgICBwYWRkaW5nTGVmdDogbm9kZS5wYWRkaW5nTGVmdCA/PyBudWxsLFxuICAgIHBhZGRpbmdSaWdodDogbm9kZS5wYWRkaW5nUmlnaHQgPz8gbnVsbCxcbiAgICBwYWRkaW5nVG9wOiBub2RlLnBhZGRpbmdUb3AgPz8gbnVsbCxcbiAgICBwYWRkaW5nQm90dG9tOiBub2RlLnBhZGRpbmdCb3R0b20gPz8gbnVsbCxcbiAgICBjbGlwc0NvbnRlbnQ6IG5vZGUuY2xpcHNDb250ZW50ID8/IGZhbHNlLFxuICAgIGxheW91dEdyaWRzOiBub2RlLmxheW91dEdyaWRzID8/IFtdLFxuICAgIGV4cG9ydFNldHRpbmdzOiBub2RlLmV4cG9ydFNldHRpbmdzID8/IFtdLFxuICAgIHRyYW5zaXRpb25Ob2RlSUQ6IG5vZGUudHJhbnNpdGlvbk5vZGVJRCA/PyBudWxsLFxuICAgIG92ZXJsYXlQb3NpdGlvblR5cGU6IG5vZGUub3ZlcmxheVBvc2l0aW9uVHlwZSA/PyBudWxsLFxuICAgIG92ZXJsYXlSZWxhdGl2ZVBvc2l0aW9uOiBub2RlLm92ZXJsYXlSZWxhdGl2ZVBvc2l0aW9uID8/IG51bGwsXG4gICAgY2hpbGRyZW4sXG4gIH1cbn1cblxuZnVuY3Rpb24gZXNjYXBlWG1sKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWVcbiAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgLnJlcGxhY2UoL1xcXCIvZywgJyZxdW90OycpXG4gICAgLnJlcGxhY2UoLycvZywgJyZhcG9zOycpXG59XG5cbmZ1bmN0aW9uIG5vZGVUb1htbChub2RlOiBNZXRhZGF0YU5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBhdHRycyA9IFtcbiAgICBgaWQ9XFxcIiR7ZXNjYXBlWG1sKG5vZGUuaWQpfVxcXCJgLFxuICAgIG5vZGUudHlwZSA/IGB0eXBlPVxcXCIke2VzY2FwZVhtbChub2RlLnR5cGUpfVxcXCJgIDogbnVsbCxcbiAgICBub2RlLm5hbWUgPyBgbmFtZT1cXFwiJHtlc2NhcGVYbWwobm9kZS5uYW1lKX1cXFwiYCA6IG51bGwsXG4gICAgbm9kZS52aXNpYmxlID09PSBmYWxzZSA/ICd2aXNpYmxlPVxcXCJmYWxzZVxcXCInIDogbnVsbCxcbiAgICBub2RlLmxvY2tlZCA/ICdsb2NrZWQ9XFxcInRydWVcXFwiJyA6IG51bGwsXG4gICAgbm9kZS5wYXJlbnRJZCA/IGBwYXJlbnRJZD1cXFwiJHtlc2NhcGVYbWwobm9kZS5wYXJlbnRJZCl9XFxcImAgOiBudWxsLFxuICAgIG5vZGUuYWJzb2x1dGVCb3VuZGluZ0JveFxuICAgICAgPyBgeD1cXFwiJHtub2RlLmFic29sdXRlQm91bmRpbmdCb3gueCA/PyAwfVxcXCIgeT1cXFwiJHtub2RlLmFic29sdXRlQm91bmRpbmdCb3gueSA/PyAwfVxcXCIgd2lkdGg9XFxcIiR7bm9kZS5hYnNvbHV0ZUJvdW5kaW5nQm94LndpZHRoID8/IDB9XFxcIiBoZWlnaHQ9XFxcIiR7bm9kZS5hYnNvbHV0ZUJvdW5kaW5nQm94LmhlaWdodCA/PyAwfVxcXCJgXG4gICAgICA6IG51bGwsXG4gIF0uZmlsdGVyKEJvb2xlYW4pXG5cbiAgY29uc3QgY2hpbGRYbWwgPSBub2RlLmNoaWxkcmVuLm1hcChub2RlVG9YbWwpLmpvaW4oJycpXG4gIHJldHVybiBgPG5vZGUgJHthdHRycy5qb2luKCcgJyl9PiR7Y2hpbGRYbWx9PC9ub2RlPmBcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJncyA9IHBhcnNlQXJncygpXG4gIGNvbnN0IHZlcmJvc2UgPSBCb29sZWFuKGFyZ3MudmVyYm9zZSA/PyBhcmdzLnYpXG4gIGNvbnN0IHNjaGVtYVZlcnNpb24gPSB0b09wdGlvbmFsU3RyaW5nKGFyZ3NbJ3NjaGVtYS12ZXJzaW9uJ10pID8/IHVuZGVmaW5lZFxuXG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdXG4gIGNvbnN0IGVycm9yczogVG9vbEVycm9yW10gPSBbXVxuXG4gIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnYuRklHTUFfQUNDRVNTX1RPS0VOXG5cbiAgaWYgKCF0b2tlbiB8fCAhdG9rZW4udHJpbSgpKSB7XG4gICAgZXJyb3JzLnB1c2goY3JlYXRlRXJyb3IoJ0ZJR01BX0FVVEgnLCAnRklHTUFfQUNDRVNTX1RPS0VOIGlzIHJlcXVpcmVkIGJ1dCB3YXMgbm90IHByb3ZpZGVkLicpKVxuICAgIGNvbnN0IGVudmVsb3BlID0gY3JlYXRlRW52ZWxvcGU8VG9vbElucHV0LCBFbXB0eURhdGE+KHtcbiAgICAgIHRvb2w6IFRPT0xfTkFNRSxcbiAgICAgIGlucHV0OiB7IGZpbGVLZXk6IG51bGwsIG5vZGVJZDogbnVsbCwgZm9ybWF0OiAnanNvbicgfSxcbiAgICAgIHdhcm5pbmdzLFxuICAgICAgZXJyb3JzLFxuICAgICAgc2NoZW1hVmVyc2lvbixcbiAgICAgIGRhdGE6IHt9IGFzIEVtcHR5RGF0YSxcbiAgICB9KVxuICAgIGV4aXRXaXRoRW52ZWxvcGUoZW52ZWxvcGUsIGVycm9ycylcbiAgfVxuXG4gIGNvbnN0IHVybElucHV0ID0gdG9PcHRpb25hbFN0cmluZyhhcmdzLnVybCkgPz8gdG9PcHRpb25hbFN0cmluZyhhcmdzLnUpXG4gIGxldCBmaWxlS2V5ID0gdG9PcHRpb25hbFN0cmluZyhhcmdzWydmaWxlLWtleSddKSA/PyB1bmRlZmluZWRcbiAgbGV0IG5vZGVJZCA9IGVuc3VyZU5vZGVJZCh0b09wdGlvbmFsU3RyaW5nKGFyZ3NbJ25vZGUtaWQnXSkpXG5cbiAgaWYgKHVybElucHV0KSB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VGaWdtYVVybCh1cmxJbnB1dClcbiAgICBmaWxlS2V5ID0gZmlsZUtleSB8fCBwYXJzZWQuZmlsZUtleSB8fCB1bmRlZmluZWRcbiAgICBub2RlSWQgPSBub2RlSWQgfHwgcGFyc2VkLm5vZGVJZFxuICB9XG5cbiAgbGV0IGZvcm1hdCA9IFN0cmluZyhhcmdzLmZvcm1hdCA/PyAnanNvbicpLnRvTG93ZXJDYXNlKClcbiAgbGV0IG91dHB1dE1vZGU6ICdqc29uJyB8ICd4bWwnIHwgJ2JvdGgnXG4gIGlmIChmb3JtYXQgPT09ICdqc29uJyB8fCBmb3JtYXQgPT09ICd4bWwnIHx8IGZvcm1hdCA9PT0gJ2JvdGgnKSB7XG4gICAgb3V0cHV0TW9kZSA9IGZvcm1hdCBhcyAnanNvbicgfCAneG1sJyB8ICdib3RoJ1xuICB9IGVsc2Uge1xuICAgIHdhcm5pbmdzLnB1c2goYFVua25vd24gZm9ybWF0IFxcXCIke2Zvcm1hdH1cXFwiLiBEZWZhdWx0aW5nIHRvIGpzb24uYClcbiAgICBvdXRwdXRNb2RlID0gJ2pzb24nXG4gIH1cblxuICBjb25zdCBpbnB1dDogVG9vbElucHV0ID0ge1xuICAgIGZpbGVLZXk6IGZpbGVLZXkgPz8gbnVsbCxcbiAgICBub2RlSWQ6IG5vZGVJZCA/PyBudWxsLFxuICAgIGZvcm1hdDogb3V0cHV0TW9kZSxcbiAgfVxuXG4gIGlmICghZmlsZUtleSkge1xuICAgIGVycm9ycy5wdXNoKGNyZWF0ZUVycm9yKCdJTlBVVF9JTlZBTElEJywgJ0EgdmFsaWQgRmlnbWEgZmlsZSBrZXkgaXMgcmVxdWlyZWQgKC0tZmlsZS1rZXkgb3IgLS11cmwpLicpKVxuICB9XG5cbiAgaWYgKCFub2RlSWQpIHtcbiAgICBlcnJvcnMucHVzaChjcmVhdGVFcnJvcignSU5QVVRfSU5WQUxJRCcsICdBIHZhbGlkIEZpZ21hIG5vZGUgaWQgaXMgcmVxdWlyZWQgKC0tbm9kZS1pZCBvciAtLXVybCB3aXRoIG5vZGUtaWQpLicpKVxuICB9XG5cbiAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICBjb25zdCBlbnZlbG9wZSA9IGNyZWF0ZUVudmVsb3BlPFRvb2xJbnB1dCwgRW1wdHlEYXRhPih7XG4gICAgICB0b29sOiBUT09MX05BTUUsXG4gICAgICBpbnB1dCxcbiAgICAgIHdhcm5pbmdzLFxuICAgICAgZXJyb3JzLFxuICAgICAgZGF0YToge30gYXMgRW1wdHlEYXRhLFxuICAgICAgc2NoZW1hVmVyc2lvbixcbiAgICB9KVxuICAgIGV4aXRXaXRoRW52ZWxvcGUoZW52ZWxvcGUsIGVycm9ycylcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkRmlsZUtleSA9IGZpbGVLZXkgYXMgc3RyaW5nXG4gIGNvbnN0IHJlc29sdmVkTm9kZUlkID0gbm9kZUlkIGFzIHN0cmluZ1xuXG4gIGxvZyhgRmV0Y2hpbmcgbWV0YWRhdGEgZm9yIG5vZGUgJHtyZXNvbHZlZE5vZGVJZH0gaW4gZmlsZSAke3Jlc29sdmVkRmlsZUtleX1gLCB2ZXJib3NlKVxuXG4gIGNvbnN0IG5vZGVSZXNwb25zZSA9IGF3YWl0IGZpZ21hUmVxdWVzdDxOb2Rlc1Jlc3BvbnNlUGF5bG9hZD4oe1xuICAgIHBhdGg6IGAvdjEvZmlsZXMvJHtyZXNvbHZlZEZpbGVLZXl9L25vZGVzYCxcbiAgICB0b2tlbixcbiAgICBzZWFyY2hQYXJhbXM6IHsgaWRzOiByZXNvbHZlZE5vZGVJZCB9LFxuICB9KVxuXG4gIGlmICghbm9kZVJlc3BvbnNlLm9rKSB7XG4gICAgZXJyb3JzLnB1c2gobm9kZVJlc3BvbnNlLmVycm9yID8/IGNyZWF0ZUVycm9yKCdJTlRFUk5BTCcsICdGYWlsZWQgdG8gZmV0Y2ggbm9kZSBtZXRhZGF0YS4nKSlcbiAgICBjb25zdCBlbnZlbG9wZSA9IGNyZWF0ZUVudmVsb3BlPFRvb2xJbnB1dCwgRW1wdHlEYXRhPih7XG4gICAgICB0b29sOiBUT09MX05BTUUsXG4gICAgICBpbnB1dCxcbiAgICAgIHdhcm5pbmdzLFxuICAgICAgZXJyb3JzLFxuICAgICAgcmF0ZUxpbWl0OiBub2RlUmVzcG9uc2UucmF0ZUxpbWl0ID8/IHVuZGVmaW5lZCxcbiAgICAgIGRhdGE6IHt9IGFzIEVtcHR5RGF0YSxcbiAgICAgIHNjaGVtYVZlcnNpb24sXG4gICAgfSlcbiAgICBleGl0V2l0aEVudmVsb3BlKGVudmVsb3BlLCBlcnJvcnMpXG4gIH1cblxuICBjb25zdCBub2Rlc01hcCA9IG5vZGVSZXNwb25zZS5kYXRhPy5ub2RlcyA/PyB7fVxuICBjb25zdCBub2RlV3JhcHBlciA9IG5vZGVzTWFwW3Jlc29sdmVkTm9kZUlkXVxuXG4gIGlmICghbm9kZVdyYXBwZXIgfHwgIW5vZGVXcmFwcGVyLmRvY3VtZW50KSB7XG4gICAgZXJyb3JzLnB1c2goY3JlYXRlRXJyb3IoJ0ZJR01BX05PVF9GT1VORCcsIGBOb2RlICR7cmVzb2x2ZWROb2RlSWR9IHdhcyBub3QgZm91bmQgaW4gZmlsZSAke3Jlc29sdmVkRmlsZUtleX0uYCkpXG4gICAgY29uc3QgZW52ZWxvcGUgPSBjcmVhdGVFbnZlbG9wZTxUb29sSW5wdXQsIEVtcHR5RGF0YT4oe1xuICAgICAgdG9vbDogVE9PTF9OQU1FLFxuICAgICAgaW5wdXQsXG4gICAgICB3YXJuaW5ncyxcbiAgICAgIGVycm9ycyxcbiAgICAgIHJhdGVMaW1pdDogbm9kZVJlc3BvbnNlLnJhdGVMaW1pdCA/PyB1bmRlZmluZWQsXG4gICAgICBkYXRhOiB7fSBhcyBFbXB0eURhdGEsXG4gICAgICBzY2hlbWFWZXJzaW9uLFxuICAgIH0pXG4gICAgZXhpdFdpdGhFbnZlbG9wZShlbnZlbG9wZSwgZXJyb3JzKVxuICB9XG5cbiAgY29uc3Qgcm9vdE5vZGUgPSBub2RlV3JhcHBlci5kb2N1bWVudFxuICBjb25zdCBtZXRhZGF0YVRyZWUgPSBtYXBOb2RlKHJvb3ROb2RlKVxuXG4gIGxldCB4bWxEb2N1bWVudDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIGlmIChvdXRwdXRNb2RlID09PSAneG1sJyB8fCBvdXRwdXRNb2RlID09PSAnYm90aCcpIHtcbiAgICB4bWxEb2N1bWVudCA9IGA8ZmlnbWFNZXRhZGF0YSB2ZXJzaW9uPVxcXCIxLjBcXFwiPiR7bm9kZVRvWG1sKG1ldGFkYXRhVHJlZSl9PC9maWdtYU1ldGFkYXRhPmBcbiAgfVxuXG4gIGNvbnN0IGRhdGE6IE1ldGFkYXRhRGF0YSA9IHtcbiAgICBmaWxlOiB7XG4gICAgICBrZXk6IHJlc29sdmVkRmlsZUtleSxcbiAgICAgIG5hbWU6IG5vZGVSZXNwb25zZS5kYXRhPy5uYW1lID8/IG51bGwsXG4gICAgICBsYXN0TW9kaWZpZWQ6IG5vZGVSZXNwb25zZS5kYXRhPy5sYXN0TW9kaWZpZWQgPz8gbnVsbCxcbiAgICB9LFxuICAgIG1ldGFkYXRhOiBtZXRhZGF0YVRyZWUsXG4gICAgeG1sOiB4bWxEb2N1bWVudCxcbiAgfVxuXG4gIGNvbnN0IGVudmVsb3BlID0gY3JlYXRlRW52ZWxvcGU8VG9vbElucHV0LCBNZXRhZGF0YURhdGE+KHtcbiAgICB0b29sOiBUT09MX05BTUUsXG4gICAgaW5wdXQsXG4gICAgZGF0YSxcbiAgICB3YXJuaW5ncyxcbiAgICBlcnJvcnMsXG4gICAgcmF0ZUxpbWl0OiBub2RlUmVzcG9uc2UucmF0ZUxpbWl0ID8/IHVuZGVmaW5lZCxcbiAgICBzY2hlbWFWZXJzaW9uLFxuICB9KVxuXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGVudmVsb3BlLCBudWxsLCAyKX1cXG5gKVxuICBwcm9jZXNzLmV4aXQoZ2V0RXhpdENvZGUoZXJyb3JzKSlcbn1cblxubWFpbigpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcidcbiAgY29uc3QgZW52ZWxvcGUgPSBjcmVhdGVFbnZlbG9wZTxUb29sSW5wdXQsIEVtcHR5RGF0YT4oe1xuICAgIHRvb2w6IFRPT0xfTkFNRSxcbiAgICBpbnB1dDogeyBmaWxlS2V5OiBudWxsLCBub2RlSWQ6IG51bGwsIGZvcm1hdDogJ2pzb24nIH0sXG4gICAgZXJyb3JzOiBbY3JlYXRlRXJyb3IoJ0lOVEVSTkFMJywgbWVzc2FnZSwgeyBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkIH0pXSxcbiAgICBkYXRhOiB7fSBhcyBFbXB0eURhdGEsXG4gIH0pXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGVudmVsb3BlLCBudWxsLCAyKX1cXG5gKVxuICBwcm9jZXNzLmV4aXQoMylcbn0pXG5cbiJdLAogICJtYXBwaW5ncyI6ICI7OztBQU9PLFNBQVMsVUFBVSxPQUFpQixRQUFRLEtBQUssTUFBTSxDQUFDLEdBQVk7QUFDekUsUUFBTSxPQUFnQixFQUFFLEdBQUcsQ0FBQyxFQUFFO0FBRTlCLFdBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUssR0FBRztBQUN2QyxVQUFNLE1BQU0sS0FBSyxDQUFDO0FBRWxCLFFBQUksQ0FBQyxJQUFJLFdBQVcsR0FBRyxLQUFLLFFBQVEsS0FBSztBQUN2QyxXQUFLLEVBQUUsS0FBSyxHQUFHO0FBQ2Y7QUFBQSxJQUNGO0FBRUEsUUFBSSxRQUFRLE1BQU07QUFDaEIsWUFBTSxZQUFZLEtBQUssTUFBTSxJQUFJLENBQUM7QUFDbEMsV0FBSyxFQUFFLEtBQUssR0FBRyxTQUFTO0FBQ3hCO0FBQUEsSUFDRjtBQUVBLFVBQU0sQ0FBQyxRQUFRLFdBQVcsSUFBSSxJQUFJLE1BQU0sS0FBSyxDQUFDO0FBQzlDLFVBQU0sZ0JBQWdCLE9BQU8sUUFBUSxPQUFPLEVBQUU7QUFFOUMsUUFBSTtBQUNKLFFBQUksZ0JBQWdCLFFBQVc7QUFDN0IsY0FBUTtBQUFBLElBQ1YsT0FBTztBQUNMLFlBQU0sT0FBTyxLQUFLLElBQUksQ0FBQztBQUN2QixVQUFJLFNBQVMsVUFBYSxDQUFDLEtBQUssV0FBVyxHQUFHLEdBQUc7QUFDL0MsZ0JBQVE7QUFDUixhQUFLO0FBQUEsTUFDUCxPQUFPO0FBQ0wsZ0JBQVE7QUFBQSxNQUNWO0FBQUEsSUFDRjtBQUVBLFNBQUssYUFBYSxJQUFJO0FBQUEsRUFDeEI7QUFFQSxTQUFPO0FBQ1Q7OztBQzVDQSxJQUFNLGlCQUFpQjtBQU9oQixTQUFTLGNBQWMsT0FBa0Q7QUFDOUUsTUFBSSxDQUFDLE1BQU8sUUFB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