__vite_ssr_exportName__("markdownHtmlContent", () => { try { return markdownHtmlContent } catch {} });
__vite_ssr_exportName__("markdownWithHtml", () => { try { return markdownWithHtml } catch {} });
__vite_ssr_exportName__("markdownWithInlineFileLinks", () => { try { return markdownWithInlineFileLinks } catch {} });
__vite_ssr_exportName__("markdownWithTableBreaks", () => { try { return markdownWithTableBreaks } catch {} });
__vite_ssr_exportName__("parseMarkdownDocument", () => { try { return parseMarkdownDocument } catch {} });
__vite_ssr_exportName__("markdownForNativeRendering", () => { try { return markdownForNativeRendering } catch {} });
const __vite_ssr_import_0__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/unified@11.0.5/node_modules/unified/index.js", {"importedNames":["unified"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/remark-parse@11.0.0_supports-color@8.1.1/node_modules/remark-parse/index.js", {"importedNames":["default"]});
const __vite_ssr_import_2__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/remark-gfm@4.0.1_supports-color@8.1.1/node_modules/remark-gfm/index.js", {"importedNames":["default"]});



const parser = (0,__vite_ssr_import_0__.unified)().use((0,__vite_ssr_import_1__.default)).use((0,__vite_ssr_import_2__.default));
function applyMarkdownEdits(markdown, edits) {
	if (edits.length === 0) return markdown;
	const parts = [];
	let offset = 0;
	// AST traversal emits disjoint edits in source order.
	for (const edit of edits) {
		parts.push(markdown.slice(offset, edit.start), edit.content);
		offset = edit.end;
	};
	parts.push(markdown.slice(offset));
	return parts.join("");
}
function decodeCodePoint(codePoint, entity) {
	if (!Number.isInteger(codePoint) || codePoint < 0 || codePoint > 1114111) {
		return entity;
	};
	return String.fromCodePoint(codePoint);
}
function decodeHtmlEntities(value) {
	return value.replace(/&(?:#(\d+)|#x([0-9a-f]+)|amp|apos|gt|lt|nbsp|quot);/gi, (entity, decimal, hexadecimal) => {
		if (decimal) {
			return decodeCodePoint(Number.parseInt(decimal, 10), entity);
		};
		if (hexadecimal) {
			return decodeCodePoint(Number.parseInt(hexadecimal, 16), entity);
		};
		switch (entity.toLowerCase()) {
			case "&amp;": return "&";
			case "&apos;": return "'";
			case "&gt;": return ">";
			case "&lt;": return "<";
			case "&nbsp;": return "\xA0";
			case "&quot;": return "\"";
			default: return entity;
		}
	});
}
const HTML_TAG = /<!--[\s\S]*?-->|<\/?[a-z](?:[^>"']|"[^"]*"|'[^']*')*>/gi;
function attribute(tag, name) {
	const attributes = /([\w:-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/g;
	for (const match of tag.matchAll(attributes)) {
		if (match[1]?.toLowerCase() === name) {
			return decodeHtmlEntities(match[2] ?? match[3] ?? match[4] ?? "");
		}
	};
	return null;
}
function markdownDestination(url) {
	return `<${url.replace(/&/g, "\\&").replace(/</g, "%3C").replace(/>/g, "%3E").replace(/\|/g, "%7C").replace(/\n/g, "")}>`;
}
const ANCHOR_TAG = /^<\/?a[\s/>]/i;
// Code spans keep their text; an odd trailing backslash would escape the closing "]".
function escapeLinkLabel(text) {
	return text.replace(/(`+)[\s\S]*?\1|\\*[[\]]/g, (match) => match.startsWith("`") || match.length % 2 === 0 ? match : `${match.slice(0, -1)}\\${match.slice(-1)}`).replace(/\\+$/, (slashes) => slashes.length % 2 ? `${slashes}\\` : slashes);
}
// An unescaped "!" before the inserted "[" would turn the link into an image.
function bangBefore(text, index) {
	if (text[index - 1] !== "!") return false;
	let backslashes = 0;
	while (text[index - 2 - backslashes] === "\\") backslashes += 1;
	return backslashes % 2 === 0;
}
/**
* Pairs `<a>` tags in order. Only a closed anchor with an http(s) or mailto href becomes a
* Markdown link; any other anchor keeps its text unlinked.
*/
function anchorMarkdown(tags) {
	const replacements = tags.map(() => "");
	const open = [];
	tags.forEach((tag, index) => {
		if (tag[1] !== "/") {
			const href = attribute(tag, "href")?.trim();
			open.push({
				index,
				href: href && /^(?:https?|mailto):/i.test(href) ? href : undefined
			});
			return;
		};
		const opening = open.pop();
		if (!opening?.href) return;
		replacements[opening.index] = "[";
		replacements[index] = `](${markdownDestination(opening.href)})`;
	});
	return {
		pending: replacements,
		open: 0
	};
}
function markdownHtmlTags(content) {
	// An HTML block such as <details> can also contain Markdown fences and code spans.
	const codeRanges = [];
	const tags = [...content.matchAll(HTML_TAG)];
	let tagIndex = 0;
	const delimiters = [...content.matchAll(/`+|~{3,}/g)].filter((delimiter) => {
		while (tags[tagIndex] && tags[tagIndex].index + tags[tagIndex][0].length <= delimiter.index) tagIndex += 1;
		const tag = tags[tagIndex];
		return !tag || delimiter.index < tag.index;
	});
	for (let index = 0; index < delimiters.length; index += 1) {
		const opening = delimiters[index];
		const lineStart = content.lastIndexOf("\n", opening.index - 1) + 1;
		const fenced = opening[0].length >= 3 && /^ {0,3}$/.test(content.slice(lineStart, opening.index));
		if (opening[0][0] === "~" && !fenced) continue;
		let closingIndex = -1;
		for (let candidate = index + 1; candidate < delimiters.length; candidate += 1) {
			const closing = delimiters[candidate];
			if (!fenced && closing[0] === opening[0]) {
				closingIndex = candidate;
				break;
			};
			if (!fenced || closing[0][0] !== opening[0][0] || closing[0].length < opening[0].length) continue;
			const start = content.lastIndexOf("\n", closing.index - 1) + 1;
			const nextLine = content.indexOf("\n", closing.index);
			const end = nextLine === -1 ? content.length : nextLine;
			if (/^ {0,3}$/.test(content.slice(start, closing.index)) && /^\s*$/.test(content.slice(closing.index + closing[0].length, end))) {
				closingIndex = candidate;
				break;
			}
		};
		if (closingIndex === -1) {
			if (fenced) codeRanges.push({
				start: opening.index,
				end: content.length
			});
			continue;
		};
		const closing = delimiters[closingIndex];
		codeRanges.push({
			start: opening.index,
			end: closing.index + closing[0].length
		});
		index = closingIndex;
	};
	return tags.filter((tag) => !codeRanges.some((range) => tag.index >= range.start && tag.index < range.end));
}
/**
* Called only for parsed HTML nodes, so Markdown code examples keep their literal tags.
* `anchors` is shared across sibling inline HTML nodes because each of those carries a single tag.
*/
function markdownHtmlContent(content, options = {}) {
	const tags = markdownHtmlTags(content);
	const anchors = options.anchors ?? anchorMarkdown(tags.map((tag) => tag[0]).filter((tag) => ANCHOR_TAG.test(tag)));
	let result = "";
	let end = 0;
	for (const match of tags) {
		const text = content.slice(end, match.index);
		result += anchors.open > 0 ? escapeLinkLabel(text) : text;
		const replacement = htmlTagMarkdown(match[0], anchors, options);
		if (replacement === "[" && bangBefore(result, result.length)) result = `${result.slice(0, -1)}\\!`;
		result += anchors.open > 0 && /[\s[]/.test(result.at(-1) ?? "") ? replacement.replace(/^ /, "") : replacement;
		end = match.index + match[0].length;
	};
	const text = content.slice(end);
	return result + (anchors.open > 0 ? escapeLinkLabel(text) : text);
};
function htmlTagMarkdown(tag, anchors, options) {
	if (tag.startsWith("<!--")) return "";
	if (ANCHOR_TAG.test(tag)) {
		const replacement = anchors.pending.shift() ?? "";
		if (replacement === "[") anchors.open += 1;
		else if (replacement) anchors.open -= 1;
		return replacement;
	};
	if (/^<img\b/i.test(tag)) {
		const src = attribute(tag, "src");
		if (!src) return "";
		const alt = (attribute(tag, "alt") ?? "").replace(/[\\[\]&]/g, "\\$&");
		return `![${alt}](${markdownDestination(src)})`;
	};
	// A blank line inside an open link label would end the paragraph before its "]".
	const blockBreak = anchors.open === 0 ? "\n\n" : " ";
	if (/^<summary\b/i.test(tag)) return `${blockBreak}**`;
	if (/^<\/summary\s*>/i.test(tag)) return `**${blockBreak}`;
	// A line break would end the table row, so a cell keeps its content on one line.
	if (/^<br\b/i.test(tag)) return options.inTableCell ? " " : "  \n";
	if (/^<\/?(?:p|div|details)\b/i.test(tag)) return blockBreak;
	return "";
}
function markdownWithHtml(markdown) {
	if (!/<(?:!--|\/?[a-z])/i.test(markdown)) return markdown;
	const edits = [];
	const visit = (node, inTableCell, inLink) => {
		if (!("children" in node)) return;
		inTableCell ||= node.type === "tableCell";
		const children = node.children;
		// Inline HTML arrives one tag per node, so anchors pair across phrasing siblings.
		const anchors = node.type === "root" || node.type === "blockquote" || node.type === "listItem" ? undefined : anchorMarkdown(children.flatMap((child) => child.type === "html" ? markdownHtmlTags(child.value).map((tag) => tag[0]).filter((tag) => ANCHOR_TAG.test(tag)) : []));
		for (const child of children) {
			const start = child.position?.start.offset;
			const end = child.position?.end.offset;
			const linkLabel = inLink || (anchors?.open ?? 0) > 0;
			if (child.type === "text") {
				if (linkLabel && start !== undefined && end !== undefined) {
					const content = escapeLinkLabel(markdown.slice(start, end));
					if (content !== markdown.slice(start, end)) edits.push({
						start,
						end,
						content
					});
				};
				continue;
			};
			if (child.type !== "html") {
				visit(child, inTableCell, linkLabel);
				continue;
			};
			const content = markdownHtmlContent(child.value, {
				anchors,
				inTableCell
			});
			if (start === undefined || end === undefined) continue;
			// Text before an outermost link is never edited, so this edit cannot overlap another.
			if (content.startsWith("[") && !linkLabel && bangBefore(markdown, start)) edits.push({
				start: start - 1,
				end: start,
				content: "\\!"
			});
			edits.push({
				start,
				end,
				content
			});
		}
	};
	visit(parser.parse(markdown), false, false);
	for (const edit of edits.reverse()) markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
	return markdown;
};
// Start only at the beginning of a backtick run to avoid retrying every suffix.
const INLINE_CODE_SPAN = /(?<!`)`+([^`\r\n]+)`+/g;
function markdownWithInlineFileLinks(markdown, fileLink) {
	return transformNativeMarkdown(markdown, fileLink, false);
};
function transformNativeMarkdown(markdown, fileLink, tableBreaks) {
	const breakTables = tableBreaks && mayHaveTableUnderText(markdown);
	let linkFiles = false;
	if (fileLink) {
		for (const [, code] of markdown.matchAll(INLINE_CODE_SPAN)) {
			if (fileLink.test(code.trim())) {
				linkFiles = true;
				break;
			}
		}
	};
	if (!linkFiles && !breakTables) return markdown;
	const edits = [];
	const fileEdits = [];
	let rewritesPipe = false;
	const visit = (node) => {
		if (linkFiles && node.type === "inlineCode") {
			const start = node.position?.start.offset;
			const end = node.position?.end.offset;
			const escaped = node.value.replace(/[\\[\]&]/g, "\\$&");
			if (start !== undefined && end !== undefined && fileLink?.test(node.value) && !/[<>]/.test(node.value)) {
				const edit = {
					start,
					end,
					content: `[${escaped}](<${escaped}>)`
				};
				edits.push(edit);
				fileEdits.push(edit);
				if (node.value.includes("|")) rewritesPipe = true;
			}
		} else if (node.type !== "link" && node.type !== "linkReference" && "children" in node) node.children.forEach((child, index) => {
			const previous = node.children[index - 1];
			const start = child.position?.start;
			if (breakTables && child.type === "table" && previous?.type === "paragraph" && start?.offset !== undefined && previous.position?.end.line === start.line - 1) {
				let lineStart = start.offset;
				while (lineStart > 0 && !/[\r\n]/.test(markdown[lineStart - 1])) lineStart -= 1;
				// Replace only the container prefix, leaving cell edits disjoint from the table break.
				const [, header = "", , ending = "\n", markers = ""] = /^([ \t>]*)([^\r\n]*)(\r\n|\r|\n)([ \t>]*)/.exec(markdown.slice(lineStart)) ?? [];
				edits.push({
					start: lineStart,
					end: lineStart + header.length,
					content: `${markers.trimEnd()}${ending}${markers}`
				});
			};
			visit(child);
		});
	};
	visit(parser.parse(markdown));
	// Rewritten pipes can change table structure, so preserve the original pass ordering.
	if (breakTables && rewritesPipe) return markdownWithTableBreaks(applyMarkdownEdits(markdown, fileEdits));
	return applyMarkdownEdits(markdown, edits);
}
// A delimiter row such as `|---|:--:|`, possibly inside a blockquote or list item.
function isTableDelimiterRow(line) {
	if (!line.includes("-")) return false;
	const row = line.replace(/^[ \t>]+/, "").trim();
	return row.replace(/^\||\|$/g, "").split("|").every((cell) => /^:?-+:?$/.test(cell.trim()));
}
function mayHaveTableUnderText(markdown) {
	if (!markdown.includes("|")) return false;
	const lines = markdown.split(/\r\n|\r|\n/);
	for (let index = 2; index < lines.length; index += 1) {
		if (isTableDelimiterRow(lines[index]) && /[^\s>]/.test(lines[index - 2])) return true;
	};
	return false;
}
/** md4c starts tables only at paragraph starts; insert breaks to match GFM. */
function markdownWithTableBreaks(markdown) {
	return transformNativeMarkdown(markdown, undefined, true);
};
function parseMarkdownDocument(markdown) {
	return parser.parse(markdownWithHtml(markdown));
};
function markdownForNativeRendering(markdown, fileLink) {
	// HTML wrappers can expose Markdown that wasn't in the first AST, so normalize them first.
	return transformNativeMarkdown(markdownWithHtml(markdown), fileLink, true);
}
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,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QUFTLDJCQUEyQixVQUFrQixVQUEwQjs7Q0FFckYsT0FBTyx3QkFBd0IsaUJBQWlCLFFBQVEsR0FBRyxVQUFVLElBQUk7QUFDM0UiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIm1hcmtkb3duRG9jdW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSb290LCBSb290Q29udGVudCB9IGZyb20gXCJtZGFzdFwiO1xuaW1wb3J0IHsgdW5pZmllZCB9IGZyb20gXCJ1bmlmaWVkXCI7XG5pbXBvcnQgcmVtYXJrUGFyc2UgZnJvbSBcInJlbWFyay1wYXJzZVwiO1xuaW1wb3J0IHJlbWFya0dmbSBmcm9tIFwicmVtYXJrLWdmbVwiO1xuXG5jb25zdCBwYXJzZXIgPSB1bmlmaWVkKCkudXNlKHJlbWFya1BhcnNlKS51c2UocmVtYXJrR2ZtKTtcbmV4cG9ydCB0eXBlIE1hcmtkb3duTm9kZSA9IFJvb3QgfCBSb290Q29udGVudDtcblxuaW50ZXJmYWNlIE1hcmtkb3duRWRpdCB7XG4gIHJlYWRvbmx5IHN0YXJ0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGVuZDogbnVtYmVyO1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWFya2Rvd25FZGl0cyhtYXJrZG93bjogc3RyaW5nLCBlZGl0czogTWFya2Rvd25FZGl0W10pOiBzdHJpbmcge1xuICBpZiAoZWRpdHMubGVuZ3RoID09PSAwKSByZXR1cm4gbWFya2Rvd247XG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgLy8gQVNUIHRyYXZlcnNhbCBlbWl0cyBkaXNqb2ludCBlZGl0cyBpbiBzb3VyY2Ugb3JkZXIuXG4gIGZvciAoY29uc3QgZWRpdCBvZiBlZGl0cykge1xuICAgIHBhcnRzLnB1c2gobWFya2Rvd24uc2xpY2Uob2Zmc2V0LCBlZGl0LnN0YXJ0KSwgZWRpdC5jb250ZW50KTtcbiAgICBvZmZzZXQgPSBlZGl0LmVuZDtcbiAgfVxuICBwYXJ0cy5wdXNoKG1hcmtkb3duLnNsaWNlKG9mZnNldCkpO1xuICByZXR1cm4gcGFydHMuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50KGNvZGVQb2ludDogbnVtYmVyLCBlbnRpdHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihjb2RlUG9pbnQpIHx8IGNvZGVQb2ludCA8IDAgfHwgY29kZVBvaW50ID4gMHgxMGZmZmYpIHtcbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG4gIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlUG9pbnQpO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVIdG1sRW50aXRpZXModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKFxuICAgIC8mKD86IyhcXGQrKXwjeChbMC05YS1mXSspfGFtcHxhcG9zfGd0fGx0fG5ic3B8cXVvdCk7L2dpLFxuICAgIChlbnRpdHksIGRlY2ltYWw6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGV4YWRlY2ltYWw6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGRlY2ltYWwpIHtcbiAgICAgICAgcmV0dXJuIGRlY29kZUNvZGVQb2ludChOdW1iZXIucGFyc2VJbnQoZGVjaW1hbCwgMTApLCBlbnRpdHkpO1xuICAgICAgfVxuICAgICAgaWYgKGhleGFkZWNpbWFsKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVDb2RlUG9pbnQoTnVtYmVyLnBhcnNlSW50KGhleGFkZWNpbWFsLCAxNiksIGVudGl0eSk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGVudGl0eS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgXCImYW1wO1wiOlxuICAgICAgICAgIHJldHVybiBcIiZcIjtcbiAgICAgICAgY2FzZSBcIiZhcG9zO1wiOlxuICAgICAgICAgIHJldHVybiBcIidcIjtcbiAgICAgICAgY2FzZSBcIiZndDtcIjpcbiAgICAgICAgICByZXR1cm4gXCI+XCI7XG4gICAgICAgIGNhc2UgXCImbHQ7XCI6XG4gICAgICAgICAgcmV0dXJuIFwiPFwiO1xuICAgICAgICBjYXNlIFwiJm5ic3A7XCI6XG4gICAgICAgICAgcmV0dXJuIFwiXFx1MDBhMFwiO1xuICAgICAgICBjYXNlIFwiJnF1b3Q7XCI6XG4gICAgICAgICAgcmV0dXJuICdcIic7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGVudGl0eTtcbiAgICAgIH1cbiAgICB9LFxuICApO1xufVxuXG5jb25zdCBIVE1MX1RBRyA9IC88IS0tW1xcc1xcU10qPy0tPnw8XFwvP1thLXpdKD86W14+XCInXXxcIlteXCJdKlwifCdbXiddKicpKj4vZ2k7XG5cbmZ1bmN0aW9uIGF0dHJpYnV0ZSh0YWc6IHN0cmluZywgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSAvKFtcXHc6LV0rKVxccyo9XFxzKig/OlwiKFteXCJdKilcInwnKFteJ10qKSd8KFteXFxzPl0rKSkvZztcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB0YWcubWF0Y2hBbGwoYXR0cmlidXRlcykpIHtcbiAgICBpZiAobWF0Y2hbMV0/LnRvTG93ZXJDYXNlKCkgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBkZWNvZGVIdG1sRW50aXRpZXMobWF0Y2hbMl0gPz8gbWF0Y2hbM10gPz8gbWF0Y2hbNF0gPz8gXCJcIik7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtYXJrZG93bkRlc3RpbmF0aW9uKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGA8JHt1cmwucmVwbGFjZSgvJi9nLCBcIlxcXFwmXCIpLnJlcGxhY2UoLzwvZywgXCIlM0NcIikucmVwbGFjZSgvPi9nLCBcIiUzRVwiKS5yZXBsYWNlKC9cXHwvZywgXCIlN0NcIikucmVwbGFjZSgvXFxuL2csIFwiXCIpfT5gO1xufVxuXG5jb25zdCBBTkNIT1JfVEFHID0gL148XFwvP2FbXFxzLz5dL2k7XG5cbi8qKiBSZXBsYWNlbWVudHMgZm9yIHRoZSBhbmNob3IgdGFncyBzdGlsbCBhaGVhZCwgYW5kIGhvdyBtYW55IGVtaXR0ZWQgbGlua3MgYXJlIG9wZW4uICovXG50eXBlIEFuY2hvclN0YXRlID0geyByZWFkb25seSBwZW5kaW5nOiBzdHJpbmdbXTsgb3BlbjogbnVtYmVyIH07XG5cbi8vIENvZGUgc3BhbnMga2VlcCB0aGVpciB0ZXh0OyBhbiBvZGQgdHJhaWxpbmcgYmFja3NsYXNoIHdvdWxkIGVzY2FwZSB0aGUgY2xvc2luZyBcIl1cIi5cbmZ1bmN0aW9uIGVzY2FwZUxpbmtMYWJlbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC5yZXBsYWNlKC8oYCspW1xcc1xcU10qP1xcMXxcXFxcKltbXFxdXS9nLCAobWF0Y2gpID0+XG4gICAgICBtYXRjaC5zdGFydHNXaXRoKFwiYFwiKSB8fCBtYXRjaC5sZW5ndGggJSAyID09PSAwXG4gICAgICAgID8gbWF0Y2hcbiAgICAgICAgOiBgJHttYXRjaC5zbGljZSgwLCAtMSl9XFxcXCR7bWF0Y2guc2xpY2UoLTEpfWAsXG4gICAgKVxuICAgIC5yZXBsYWNlKC9cXFxcKyQvLCAoc2xhc2hlcykgPT4gKHNsYXNoZXMubGVuZ3RoICUgMiA/IGAke3NsYXNoZXN9XFxcXGAgOiBzbGFzaGVzKSk7XG59XG5cbi8vIEFuIHVuZXNjYXBlZCBcIiFcIiBiZWZvcmUgdGhlIGluc2VydGVkIFwiW1wiIHdvdWxkIHR1cm4gdGhlIGxpbmsgaW50byBhbiBpbWFnZS5cbmZ1bmN0aW9uIGJhbmdCZWZvcmUodGV4dDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmICh0ZXh0W2luZGV4IC0gMV0gIT09IFwiIVwiKSByZXR1cm4gZmFsc2U7XG4gIGxldCBiYWNrc2xhc2hlcyA9IDA7XG4gIHdoaWxlICh0ZXh0W2luZGV4IC0gMiAtIGJhY2tzbGFzaGVzXSA9PT0gXCJcXFxcXCIpIGJhY2tzbGFzaGVzICs9IDE7XG4gIHJldHVybiBiYWNrc2xhc2hlcyAlIDIgPT09IDA7XG59XG5cbi8qKlxuICogUGFpcnMgYDxhPmAgdGFncyBpbiBvcmRlci4gT25seSBhIGNsb3NlZCBhbmNob3Igd2l0aCBhbiBodHRwKHMpIG9yIG1haWx0byBocmVmIGJlY29tZXMgYVxuICogTWFya2Rvd24gbGluazsgYW55IG90aGVyIGFuY2hvciBrZWVwcyBpdHMgdGV4dCB1bmxpbmtlZC5cbiAqL1xuZnVuY3Rpb24gYW5jaG9yTWFya2Rvd24odGFnczogcmVhZG9ubHkgc3RyaW5nW10pOiBBbmNob3JTdGF0ZSB7XG4gIGNvbnN0IHJlcGxhY2VtZW50cyA9IHRhZ3MubWFwKCgpID0+IFwiXCIpO1xuICBjb25zdCBvcGVuOiBBcnJheTx7IGluZGV4OiBudW1iZXI7IGhyZWY6IHN0cmluZyB8IHVuZGVmaW5lZCB9PiA9IFtdO1xuICB0YWdzLmZvckVhY2goKHRhZywgaW5kZXgpID0+IHtcbiAgICBpZiAodGFnWzFdICE9PSBcIi9cIikge1xuICAgICAgY29uc3QgaHJlZiA9IGF0dHJpYnV0ZSh0YWcsIFwiaHJlZlwiKT8udHJpbSgpO1xuICAgICAgb3Blbi5wdXNoKHsgaW5kZXgsIGhyZWY6IGhyZWYgJiYgL14oPzpodHRwcz98bWFpbHRvKTovaS50ZXN0KGhyZWYpID8gaHJlZiA6IHVuZGVmaW5lZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3BlbmluZyA9IG9wZW4ucG9wKCk7XG4gICAgaWYgKCFvcGVuaW5nPy5ocmVmKSByZXR1cm47XG4gICAgcmVwbGFjZW1lbnRzW29wZW5pbmcuaW5kZXhdID0gXCJbXCI7XG4gICAgcmVwbGFjZW1lbnRzW2luZGV4XSA9IGBdKCR7bWFya2Rvd25EZXN0aW5hdGlvbihvcGVuaW5nLmhyZWYpfSlgO1xuICB9KTtcbiAgcmV0dXJuIHsgcGVuZGluZzogcmVwbGFjZW1lbnRzLCBvcGVuOiAwIH07XG59XG5cbmZ1bmN0aW9uIG1hcmtkb3duSHRtbFRhZ3MoY29udGVudDogc3RyaW5nKTogUmVnRXhwRXhlY0FycmF5W10ge1xuICAvLyBBbiBIVE1MIGJsb2NrIHN1Y2ggYXMgPGRldGFpbHM+IGNhbiBhbHNvIGNvbnRhaW4gTWFya2Rvd24gZmVuY2VzIGFuZCBjb2RlIHNwYW5zLlxuICBjb25zdCBjb2RlUmFuZ2VzOiBBcnJheTx7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0+ID0gW107XG4gIGNvbnN0IHRhZ3MgPSBbLi4uY29udGVudC5tYXRjaEFsbChIVE1MX1RBRyldO1xuICBsZXQgdGFnSW5kZXggPSAwO1xuICBjb25zdCBkZWxpbWl0ZXJzID0gWy4uLmNvbnRlbnQubWF0Y2hBbGwoL2ArfH57Myx9L2cpXS5maWx0ZXIoKGRlbGltaXRlcikgPT4ge1xuICAgIHdoaWxlICh0YWdzW3RhZ0luZGV4XSAmJiB0YWdzW3RhZ0luZGV4XSEuaW5kZXggKyB0YWdzW3RhZ0luZGV4XSFbMF0ubGVuZ3RoIDw9IGRlbGltaXRlci5pbmRleClcbiAgICAgIHRhZ0luZGV4ICs9IDE7XG4gICAgY29uc3QgdGFnID0gdGFnc1t0YWdJbmRleF07XG4gICAgcmV0dXJuICF0YWcgfHwgZGVsaW1pdGVyLmluZGV4IDwgdGFnLmluZGV4O1xuICB9KTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRlbGltaXRlcnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3Qgb3BlbmluZyA9IGRlbGltaXRlcnNbaW5kZXhdITtcbiAgICBjb25zdCBsaW5lU3RhcnQgPSBjb250ZW50Lmxhc3RJbmRleE9mKFwiXFxuXCIsIG9wZW5pbmcuaW5kZXggLSAxKSArIDE7XG4gICAgY29uc3QgZmVuY2VkID1cbiAgICAgIG9wZW5pbmdbMF0ubGVuZ3RoID49IDMgJiYgL14gezAsM30kLy50ZXN0KGNvbnRlbnQuc2xpY2UobGluZVN0YXJ0LCBvcGVuaW5nLmluZGV4KSk7XG4gICAgaWYgKG9wZW5pbmdbMF1bMF0gPT09IFwiflwiICYmICFmZW5jZWQpIGNvbnRpbnVlO1xuICAgIGxldCBjbG9zaW5nSW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBjYW5kaWRhdGUgPSBpbmRleCArIDE7IGNhbmRpZGF0ZSA8IGRlbGltaXRlcnMubGVuZ3RoOyBjYW5kaWRhdGUgKz0gMSkge1xuICAgICAgY29uc3QgY2xvc2luZyA9IGRlbGltaXRlcnNbY2FuZGlkYXRlXSE7XG4gICAgICBpZiAoIWZlbmNlZCAmJiBjbG9zaW5nWzBdID09PSBvcGVuaW5nWzBdKSB7XG4gICAgICAgIGNsb3NpbmdJbmRleCA9IGNhbmRpZGF0ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoIWZlbmNlZCB8fCBjbG9zaW5nWzBdWzBdICE9PSBvcGVuaW5nWzBdWzBdIHx8IGNsb3NpbmdbMF0ubGVuZ3RoIDwgb3BlbmluZ1swXS5sZW5ndGgpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgY29uc3Qgc3RhcnQgPSBjb250ZW50Lmxhc3RJbmRleE9mKFwiXFxuXCIsIGNsb3NpbmcuaW5kZXggLSAxKSArIDE7XG4gICAgICBjb25zdCBuZXh0TGluZSA9IGNvbnRlbnQuaW5kZXhPZihcIlxcblwiLCBjbG9zaW5nLmluZGV4KTtcbiAgICAgIGNvbnN0IGVuZCA9IG5leHRMaW5lID09PSAtMSA/IGNvbnRlbnQubGVuZ3RoIDogbmV4dExpbmU7XG4gICAgICBpZiAoXG4gICAgICAgIC9eIHswLDN9JC8udGVzdChjb250ZW50LnNsaWNlKHN0YXJ0LCBjbG9zaW5nLmluZGV4KSkgJiZcbiAgICAgICAgL15cXHMqJC8udGVzdChjb250ZW50LnNsaWNlKGNsb3NpbmcuaW5kZXggKyBjbG9zaW5nWzBdLmxlbmd0aCwgZW5kKSlcbiAgICAgICkge1xuICAgICAgICBjbG9zaW5nSW5kZXggPSBjYW5kaWRhdGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2xvc2luZ0luZGV4ID09PSAtMSkge1xuICAgICAgaWYgKGZlbmNlZCkgY29kZVJhbmdlcy5wdXNoKHsgc3RhcnQ6IG9wZW5pbmcuaW5kZXgsIGVuZDogY29udGVudC5sZW5ndGggfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY2xvc2luZyA9IGRlbGltaXRlcnNbY2xvc2luZ0luZGV4XSE7XG4gICAgY29kZVJhbmdlcy5wdXNoKHsgc3RhcnQ6IG9wZW5pbmcuaW5kZXgsIGVuZDogY2xvc2luZy5pbmRleCArIGNsb3NpbmdbMF0ubGVuZ3RoIH0pO1xuICAgIGluZGV4ID0gY2xvc2luZ0luZGV4O1xuICB9XG4gIHJldHVybiB0YWdzLmZpbHRlcihcbiAgICAodGFnKSA9PiAhY29kZVJhbmdlcy5zb21lKChyYW5nZSkgPT4gdGFnLmluZGV4ID49IHJhbmdlLnN0YXJ0ICYmIHRhZy5pbmRleCA8IHJhbmdlLmVuZCksXG4gICk7XG59XG5cbi8qKlxuICogQ2FsbGVkIG9ubHkgZm9yIHBhcnNlZCBIVE1MIG5vZGVzLCBzbyBNYXJrZG93biBjb2RlIGV4YW1wbGVzIGtlZXAgdGhlaXIgbGl0ZXJhbCB0YWdzLlxuICogYGFuY2hvcnNgIGlzIHNoYXJlZCBhY3Jvc3Mgc2libGluZyBpbmxpbmUgSFRNTCBub2RlcyBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgY2FycmllcyBhIHNpbmdsZSB0YWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZG93bkh0bWxDb250ZW50KFxuICBjb250ZW50OiBzdHJpbmcsXG4gIG9wdGlvbnM6IHsgcmVhZG9ubHkgYW5jaG9ycz86IEFuY2hvclN0YXRlOyByZWFkb25seSBpblRhYmxlQ2VsbD86IGJvb2xlYW4gfSA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdGFncyA9IG1hcmtkb3duSHRtbFRhZ3MoY29udGVudCk7XG4gIGNvbnN0IGFuY2hvcnMgPVxuICAgIG9wdGlvbnMuYW5jaG9ycyA/P1xuICAgIGFuY2hvck1hcmtkb3duKHRhZ3MubWFwKCh0YWcpID0+IHRhZ1swXSkuZmlsdGVyKCh0YWcpID0+IEFOQ0hPUl9UQUcudGVzdCh0YWcpKSk7XG4gIGxldCByZXN1bHQgPSBcIlwiO1xuICBsZXQgZW5kID0gMDtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB0YWdzKSB7XG4gICAgY29uc3QgdGV4dCA9IGNvbnRlbnQuc2xpY2UoZW5kLCBtYXRjaC5pbmRleCk7XG4gICAgcmVzdWx0ICs9IGFuY2hvcnMub3BlbiA+IDAgPyBlc2NhcGVMaW5rTGFiZWwodGV4dCkgOiB0ZXh0O1xuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gaHRtbFRhZ01hcmtkb3duKG1hdGNoWzBdLCBhbmNob3JzLCBvcHRpb25zKTtcbiAgICBpZiAocmVwbGFjZW1lbnQgPT09IFwiW1wiICYmIGJhbmdCZWZvcmUocmVzdWx0LCByZXN1bHQubGVuZ3RoKSlcbiAgICAgIHJlc3VsdCA9IGAke3Jlc3VsdC5zbGljZSgwLCAtMSl9XFxcXCFgO1xuICAgIHJlc3VsdCArPVxuICAgICAgYW5jaG9ycy5vcGVuID4gMCAmJiAvW1xcc1tdLy50ZXN0KHJlc3VsdC5hdCgtMSkgPz8gXCJcIilcbiAgICAgICAgPyByZXBsYWNlbWVudC5yZXBsYWNlKC9eIC8sIFwiXCIpXG4gICAgICAgIDogcmVwbGFjZW1lbnQ7XG4gICAgZW5kID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gIH1cbiAgY29uc3QgdGV4dCA9IGNvbnRlbnQuc2xpY2UoZW5kKTtcbiAgcmV0dXJuIHJlc3VsdCArIChhbmNob3JzLm9wZW4gPiAwID8gZXNjYXBlTGlua0xhYmVsKHRleHQpIDogdGV4dCk7XG59XG5cbmZ1bmN0aW9uIGh0bWxUYWdNYXJrZG93bihcbiAgdGFnOiBzdHJpbmcsXG4gIGFuY2hvcnM6IEFuY2hvclN0YXRlLFxuICBvcHRpb25zOiB7IHJlYWRvbmx5IGluVGFibGVDZWxsPzogYm9vbGVhbiB9LFxuKTogc3RyaW5nIHtcbiAgaWYgKHRhZy5zdGFydHNXaXRoKFwiPCEtLVwiKSkgcmV0dXJuIFwiXCI7XG4gIGlmIChBTkNIT1JfVEFHLnRlc3QodGFnKSkge1xuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gYW5jaG9ycy5wZW5kaW5nLnNoaWZ0KCkgPz8gXCJcIjtcbiAgICBpZiAocmVwbGFjZW1lbnQgPT09IFwiW1wiKSBhbmNob3JzLm9wZW4gKz0gMTtcbiAgICBlbHNlIGlmIChyZXBsYWNlbWVudCkgYW5jaG9ycy5vcGVuIC09IDE7XG4gICAgcmV0dXJuIHJlcGxhY2VtZW50O1xuICB9XG4gIGlmICgvXjxpbWdcXGIvaS50ZXN0KHRhZykpIHtcbiAgICBjb25zdCBzcmMgPSBhdHRyaWJ1dGUodGFnLCBcInNyY1wiKTtcbiAgICBpZiAoIXNyYykgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgYWx0ID0gKGF0dHJpYnV0ZSh0YWcsIFwiYWx0XCIpID8/IFwiXCIpLnJlcGxhY2UoL1tcXFxcW1xcXSZdL2csIFwiXFxcXCQmXCIpO1xuICAgIHJldHVybiBgIVske2FsdH1dKCR7bWFya2Rvd25EZXN0aW5hdGlvbihzcmMpfSlgO1xuICB9XG4gIC8vIEEgYmxhbmsgbGluZSBpbnNpZGUgYW4gb3BlbiBsaW5rIGxhYmVsIHdvdWxkIGVuZCB0aGUgcGFyYWdyYXBoIGJlZm9yZSBpdHMgXCJdXCIuXG4gIGNvbnN0IGJsb2NrQnJlYWsgPSBhbmNob3JzLm9wZW4gPT09IDAgPyBcIlxcblxcblwiIDogXCIgXCI7XG4gIGlmICgvXjxzdW1tYXJ5XFxiL2kudGVzdCh0YWcpKSByZXR1cm4gYCR7YmxvY2tCcmVha30qKmA7XG4gIGlmICgvXjxcXC9zdW1tYXJ5XFxzKj4vaS50ZXN0KHRhZykpIHJldHVybiBgKioke2Jsb2NrQnJlYWt9YDtcbiAgLy8gQSBsaW5lIGJyZWFrIHdvdWxkIGVuZCB0aGUgdGFibGUgcm93LCBzbyBhIGNlbGwga2VlcHMgaXRzIGNvbnRlbnQgb24gb25lIGxpbmUuXG4gIGlmICgvXjxiclxcYi9pLnRlc3QodGFnKSkgcmV0dXJuIG9wdGlvbnMuaW5UYWJsZUNlbGwgPyBcIiBcIiA6IFwiICBcXG5cIjtcbiAgaWYgKC9ePFxcLz8oPzpwfGRpdnxkZXRhaWxzKVxcYi9pLnRlc3QodGFnKSkgcmV0dXJuIGJsb2NrQnJlYWs7XG4gIHJldHVybiBcIlwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFya2Rvd25XaXRoSHRtbChtYXJrZG93bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCEvPCg/OiEtLXxcXC8/W2Etel0pL2kudGVzdChtYXJrZG93bikpIHJldHVybiBtYXJrZG93bjtcbiAgY29uc3QgZWRpdHM6IEFycmF5PHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IGNvbnRlbnQ6IHN0cmluZyB9PiA9IFtdO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiBNYXJrZG93bk5vZGUsIGluVGFibGVDZWxsOiBib29sZWFuLCBpbkxpbms6IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoIShcImNoaWxkcmVuXCIgaW4gbm9kZSkpIHJldHVybjtcbiAgICBpblRhYmxlQ2VsbCB8fD0gbm9kZS50eXBlID09PSBcInRhYmxlQ2VsbFwiO1xuICAgIGNvbnN0IGNoaWxkcmVuOiByZWFkb25seSBNYXJrZG93bk5vZGVbXSA9IG5vZGUuY2hpbGRyZW47XG4gICAgLy8gSW5saW5lIEhUTUwgYXJyaXZlcyBvbmUgdGFnIHBlciBub2RlLCBzbyBhbmNob3JzIHBhaXIgYWNyb3NzIHBocmFzaW5nIHNpYmxpbmdzLlxuICAgIGNvbnN0IGFuY2hvcnMgPVxuICAgICAgbm9kZS50eXBlID09PSBcInJvb3RcIiB8fCBub2RlLnR5cGUgPT09IFwiYmxvY2txdW90ZVwiIHx8IG5vZGUudHlwZSA9PT0gXCJsaXN0SXRlbVwiXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogYW5jaG9yTWFya2Rvd24oXG4gICAgICAgICAgICBjaGlsZHJlbi5mbGF0TWFwKChjaGlsZCkgPT5cbiAgICAgICAgICAgICAgY2hpbGQudHlwZSA9PT0gXCJodG1sXCJcbiAgICAgICAgICAgICAgICA/IG1hcmtkb3duSHRtbFRhZ3MoY2hpbGQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHRhZykgPT4gdGFnWzBdKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh0YWcpID0+IEFOQ0hPUl9UQUcudGVzdCh0YWcpKVxuICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgY29uc3Qgc3RhcnQgPSBjaGlsZC5wb3NpdGlvbj8uc3RhcnQub2Zmc2V0O1xuICAgICAgY29uc3QgZW5kID0gY2hpbGQucG9zaXRpb24/LmVuZC5vZmZzZXQ7XG4gICAgICBjb25zdCBsaW5rTGFiZWwgPSBpbkxpbmsgfHwgKGFuY2hvcnM/Lm9wZW4gPz8gMCkgPiAwO1xuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIGlmIChsaW5rTGFiZWwgJiYgc3RhcnQgIT09IHVuZGVmaW5lZCAmJiBlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlc2NhcGVMaW5rTGFiZWwobWFya2Rvd24uc2xpY2Uoc3RhcnQsIGVuZCkpO1xuICAgICAgICAgIGlmIChjb250ZW50ICE9PSBtYXJrZG93bi5zbGljZShzdGFydCwgZW5kKSkgZWRpdHMucHVzaCh7IHN0YXJ0LCBlbmQsIGNvbnRlbnQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGQudHlwZSAhPT0gXCJodG1sXCIpIHtcbiAgICAgICAgdmlzaXQoY2hpbGQsIGluVGFibGVDZWxsLCBsaW5rTGFiZWwpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBtYXJrZG93bkh0bWxDb250ZW50KGNoaWxkLnZhbHVlLCB7IGFuY2hvcnMsIGluVGFibGVDZWxsIH0pO1xuICAgICAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgZW5kID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgLy8gVGV4dCBiZWZvcmUgYW4gb3V0ZXJtb3N0IGxpbmsgaXMgbmV2ZXIgZWRpdGVkLCBzbyB0aGlzIGVkaXQgY2Fubm90IG92ZXJsYXAgYW5vdGhlci5cbiAgICAgIGlmIChjb250ZW50LnN0YXJ0c1dpdGgoXCJbXCIpICYmICFsaW5rTGFiZWwgJiYgYmFuZ0JlZm9yZShtYXJrZG93biwgc3RhcnQpKVxuICAgICAgICBlZGl0cy5wdXNoKHsgc3RhcnQ6IHN0YXJ0IC0gMSwgZW5kOiBzdGFydCwgY29udGVudDogXCJcXFxcIVwiIH0pO1xuICAgICAgZWRpdHMucHVzaCh7IHN0YXJ0LCBlbmQsIGNvbnRlbnQgfSk7XG4gICAgfVxuICB9O1xuICB2aXNpdChwYXJzZXIucGFyc2UobWFya2Rvd24pLCBmYWxzZSwgZmFsc2UpO1xuICBmb3IgKGNvbnN0IGVkaXQgb2YgZWRpdHMucmV2ZXJzZSgpKVxuICAgIG1hcmtkb3duID0gbWFya2Rvd24uc2xpY2UoMCwgZWRpdC5zdGFydCkgKyBlZGl0LmNvbnRlbnQgKyBtYXJrZG93bi5zbGljZShlZGl0LmVuZCk7XG4gIHJldHVybiBtYXJrZG93bjtcbn1cblxuLy8gU3RhcnQgb25seSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgYmFja3RpY2sgcnVuIHRvIGF2b2lkIHJldHJ5aW5nIGV2ZXJ5IHN1ZmZpeC5cbmNvbnN0IElOTElORV9DT0RFX1NQQU4gPSAvKD88IWApYCsoW15gXFxyXFxuXSspYCsvZztcblxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtkb3duV2l0aElubGluZUZpbGVMaW5rcyhtYXJrZG93bjogc3RyaW5nLCBmaWxlTGluazogUmVnRXhwKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRyYW5zZm9ybU5hdGl2ZU1hcmtkb3duKG1hcmtkb3duLCBmaWxlTGluaywgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1OYXRpdmVNYXJrZG93bihcbiAgbWFya2Rvd246IHN0cmluZyxcbiAgZmlsZUxpbms6IFJlZ0V4cCB8IHVuZGVmaW5lZCxcbiAgdGFibGVCcmVha3M6IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBicmVha1RhYmxlcyA9IHRhYmxlQnJlYWtzICYmIG1heUhhdmVUYWJsZVVuZGVyVGV4dChtYXJrZG93bik7XG4gIGxldCBsaW5rRmlsZXMgPSBmYWxzZTtcbiAgaWYgKGZpbGVMaW5rKSB7XG4gICAgZm9yIChjb25zdCBbLCBjb2RlXSBvZiBtYXJrZG93bi5tYXRjaEFsbChJTkxJTkVfQ09ERV9TUEFOKSkge1xuICAgICAgaWYgKGZpbGVMaW5rLnRlc3QoY29kZSEudHJpbSgpKSkge1xuICAgICAgICBsaW5rRmlsZXMgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCFsaW5rRmlsZXMgJiYgIWJyZWFrVGFibGVzKSByZXR1cm4gbWFya2Rvd247XG4gIGNvbnN0IGVkaXRzOiBNYXJrZG93bkVkaXRbXSA9IFtdO1xuICBjb25zdCBmaWxlRWRpdHM6IE1hcmtkb3duRWRpdFtdID0gW107XG4gIGxldCByZXdyaXRlc1BpcGUgPSBmYWxzZTtcbiAgY29uc3QgdmlzaXQgPSAobm9kZTogTWFya2Rvd25Ob2RlKSA9PiB7XG4gICAgaWYgKGxpbmtGaWxlcyAmJiBub2RlLnR5cGUgPT09IFwiaW5saW5lQ29kZVwiKSB7XG4gICAgICBjb25zdCBzdGFydCA9IG5vZGUucG9zaXRpb24/LnN0YXJ0Lm9mZnNldDtcbiAgICAgIGNvbnN0IGVuZCA9IG5vZGUucG9zaXRpb24/LmVuZC5vZmZzZXQ7XG4gICAgICBjb25zdCBlc2NhcGVkID0gbm9kZS52YWx1ZS5yZXBsYWNlKC9bXFxcXFtcXF0mXS9nLCBcIlxcXFwkJlwiKTtcbiAgICAgIGlmIChcbiAgICAgICAgc3RhcnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBlbmQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBmaWxlTGluaz8udGVzdChub2RlLnZhbHVlKSAmJlxuICAgICAgICAhL1s8Pl0vLnRlc3Qobm9kZS52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBlZGl0ID0ge1xuICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgIGVuZCxcbiAgICAgICAgICBjb250ZW50OiBgWyR7ZXNjYXBlZH1dKDwke2VzY2FwZWR9PilgLFxuICAgICAgICB9O1xuICAgICAgICBlZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBmaWxlRWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKG5vZGUudmFsdWUuaW5jbHVkZXMoXCJ8XCIpKSByZXdyaXRlc1BpcGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlICE9PSBcImxpbmtcIiAmJiBub2RlLnR5cGUgIT09IFwibGlua1JlZmVyZW5jZVwiICYmIFwiY2hpbGRyZW5cIiBpbiBub2RlKVxuICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBub2RlLmNoaWxkcmVuW2luZGV4IC0gMV07XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gY2hpbGQucG9zaXRpb24/LnN0YXJ0O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYnJlYWtUYWJsZXMgJiZcbiAgICAgICAgICBjaGlsZC50eXBlID09PSBcInRhYmxlXCIgJiZcbiAgICAgICAgICBwcmV2aW91cz8udHlwZSA9PT0gXCJwYXJhZ3JhcGhcIiAmJlxuICAgICAgICAgIHN0YXJ0Py5vZmZzZXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHByZXZpb3VzLnBvc2l0aW9uPy5lbmQubGluZSA9PT0gc3RhcnQubGluZSAtIDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IGxpbmVTdGFydCA9IHN0YXJ0Lm9mZnNldDtcbiAgICAgICAgICB3aGlsZSAobGluZVN0YXJ0ID4gMCAmJiAhL1tcXHJcXG5dLy50ZXN0KG1hcmtkb3duW2xpbmVTdGFydCAtIDFdISkpIGxpbmVTdGFydCAtPSAxO1xuICAgICAgICAgIC8vIFJlcGxhY2Ugb25seSB0aGUgY29udGFpbmVyIHByZWZpeCwgbGVhdmluZyBjZWxsIGVkaXRzIGRpc2pvaW50IGZyb20gdGhlIHRhYmxlIGJyZWFrLlxuICAgICAgICAgIGNvbnN0IFssIGhlYWRlciA9IFwiXCIsICwgZW5kaW5nID0gXCJcXG5cIiwgbWFya2VycyA9IFwiXCJdID1cbiAgICAgICAgICAgIC9eKFsgXFx0Pl0qKShbXlxcclxcbl0qKShcXHJcXG58XFxyfFxcbikoWyBcXHQ+XSopLy5leGVjKG1hcmtkb3duLnNsaWNlKGxpbmVTdGFydCkpID8/IFtdO1xuICAgICAgICAgIGVkaXRzLnB1c2goe1xuICAgICAgICAgICAgc3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgICAgICAgIGVuZDogbGluZVN0YXJ0ICsgaGVhZGVyLmxlbmd0aCxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGAke21hcmtlcnMudHJpbUVuZCgpfSR7ZW5kaW5nfSR7bWFya2Vyc31gLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZpc2l0KGNoaWxkKTtcbiAgICAgIH0pO1xuICB9O1xuICB2aXNpdChwYXJzZXIucGFyc2UobWFya2Rvd24pKTtcbiAgLy8gUmV3cml0dGVuIHBpcGVzIGNhbiBjaGFuZ2UgdGFibGUgc3RydWN0dXJlLCBzbyBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgcGFzcyBvcmRlcmluZy5cbiAgaWYgKGJyZWFrVGFibGVzICYmIHJld3JpdGVzUGlwZSlcbiAgICByZXR1cm4gbWFya2Rvd25XaXRoVGFibGVCcmVha3MoYXBwbHlNYXJrZG93bkVkaXRzKG1hcmtkb3duLCBmaWxlRWRpdHMpKTtcbiAgcmV0dXJuIGFwcGx5TWFya2Rvd25FZGl0cyhtYXJrZG93biwgZWRpdHMpO1xufVxuXG4vLyBBIGRlbGltaXRlciByb3cgc3VjaCBhcyBgfC0tLXw6LS06fGAsIHBvc3NpYmx5IGluc2lkZSBhIGJsb2NrcXVvdGUgb3IgbGlzdCBpdGVtLlxuZnVuY3Rpb24gaXNUYWJsZURlbGltaXRlclJvdyhsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFsaW5lLmluY2x1ZGVzKFwiLVwiKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByb3cgPSBsaW5lLnJlcGxhY2UoL15bIFxcdD5dKy8sIFwiXCIpLnRyaW0oKTtcbiAgcmV0dXJuIHJvd1xuICAgIC5yZXBsYWNlKC9eXFx8fFxcfCQvZywgXCJcIilcbiAgICAuc3BsaXQoXCJ8XCIpXG4gICAgLmV2ZXJ5KChjZWxsKSA9PiAvXjo/LSs6PyQvLnRlc3QoY2VsbC50cmltKCkpKTtcbn1cblxuZnVuY3Rpb24gbWF5SGF2ZVRhYmxlVW5kZXJUZXh0KG1hcmtkb3duOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFtYXJrZG93bi5pbmNsdWRlcyhcInxcIikpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbGluZXMgPSBtYXJrZG93bi5zcGxpdCgvXFxyXFxufFxccnxcXG4vKTtcbiAgZm9yIChsZXQgaW5kZXggPSAyOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGlmIChpc1RhYmxlRGVsaW1pdGVyUm93KGxpbmVzW2luZGV4XSEpICYmIC9bXlxccz5dLy50ZXN0KGxpbmVzW2luZGV4IC0gMl0hKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogbWQ0YyBzdGFydHMgdGFibGVzIG9ubHkgYXQgcGFyYWdyYXBoIHN0YXJ0czsgaW5zZXJ0IGJyZWFrcyB0byBtYXRjaCBHRk0uICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2Rvd25XaXRoVGFibGVCcmVha3MobWFya2Rvd246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0cmFuc2Zvcm1OYXRpdmVNYXJrZG93bihtYXJrZG93biwgdW5kZWZpbmVkLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWFya2Rvd25Eb2N1bWVudChtYXJrZG93bjogc3RyaW5nKTogUm9vdCB7XG4gIHJldHVybiBwYXJzZXIucGFyc2UobWFya2Rvd25XaXRoSHRtbChtYXJrZG93bikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFya2Rvd25Gb3JOYXRpdmVSZW5kZXJpbmcobWFya2Rvd246IHN0cmluZywgZmlsZUxpbms6IFJlZ0V4cCk6IHN0cmluZyB7XG4gIC8vIEhUTUwgd3JhcHBlcnMgY2FuIGV4cG9zZSBNYXJrZG93biB0aGF0IHdhc24ndCBpbiB0aGUgZmlyc3QgQVNULCBzbyBub3JtYWxpemUgdGhlbSBmaXJzdC5cbiAgcmV0dXJuIHRyYW5zZm9ybU5hdGl2ZU1hcmtkb3duKG1hcmtkb3duV2l0aEh0bWwobWFya2Rvd24pLCBmaWxlTGluaywgdHJ1ZSk7XG59XG4iXSwiZmlsZSI6Ii9zcmMvbGliL21hcmtkb3duRG9jdW1lbnQudHMifQ==

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvYXBwcy9tb2JpbGUvc3JjL2xpYi9tYXJrZG93bkRvY3VtZW50LnRzIiwiL3NyYy9saWIvbWFya2Rvd25Eb2N1bWVudC50cyIseyJ1cmxzIjoiNiIsImlkcyI6IjcifSxbIjgiLCI5IiwiMTAiXSxbXSxbIjgiLCI5IiwiMTAiXSx7fSwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vdW5pZmllZEAxMS4wLjUvbm9kZV9tb2R1bGVzL3VuaWZpZWQvaW5kZXguanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstcGFyc2VAMTEuMC4wX3N1cHBvcnRzLWNvbG9yQDguMS4xL25vZGVfbW9kdWxlcy9yZW1hcmstcGFyc2UvaW5kZXguanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstZ2ZtQDQuMC4xX3N1cHBvcnRzLWNvbG9yQDguMS4xL25vZGVfbW9kdWxlcy9yZW1hcmstZ2ZtL2luZGV4LmpzIl0=