Files

897 lines
108 KiB
JavaScript

/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// node_modules/file-saver/dist/FileSaver.min.js
var require_FileSaver_min = __commonJS({
"node_modules/file-saver/dist/FileSaver.min.js"(exports, module2) {
(function(a, b) {
if (typeof define == "function" && define.amd)
define([], b);
else if (typeof exports != "undefined")
b();
else {
b(), a.FileSaver = { exports: {} }.exports;
}
})(exports, function() {
"use strict";
function b(a2, b2) {
return typeof b2 == "undefined" ? b2 = { autoBom: false } : typeof b2 != "object" && (console.warn("Deprecated: Expected third argument to be a object"), b2 = { autoBom: !b2 }), b2.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a2.type) ? new Blob(["\uFEFF", a2], { type: a2.type }) : a2;
}
function c(a2, b2, c2) {
var d2 = new XMLHttpRequest();
d2.open("GET", a2), d2.responseType = "blob", d2.onload = function() {
g(d2.response, b2, c2);
}, d2.onerror = function() {
console.error("could not download file");
}, d2.send();
}
function d(a2) {
var b2 = new XMLHttpRequest();
b2.open("HEAD", a2, false);
try {
b2.send();
} catch (a3) {
}
return 200 <= b2.status && 299 >= b2.status;
}
function e(a2) {
try {
a2.dispatchEvent(new MouseEvent("click"));
} catch (c2) {
var b2 = document.createEvent("MouseEvents");
b2.initMouseEvent("click", true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null), a2.dispatchEvent(b2);
}
}
var f = typeof window == "object" && window.window === window ? window : typeof self == "object" && self.self === self ? self : typeof global == "object" && global.global === global ? global : void 0, a = f.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent), g = f.saveAs || (typeof window != "object" || window !== f ? function() {
} : "download" in HTMLAnchorElement.prototype && !a ? function(b2, g2, h) {
var i = f.URL || f.webkitURL, j = document.createElement("a");
g2 = g2 || b2.name || "download", j.download = g2, j.rel = "noopener", typeof b2 == "string" ? (j.href = b2, j.origin === location.origin ? e(j) : d(j.href) ? c(b2, g2, h) : e(j, j.target = "_blank")) : (j.href = i.createObjectURL(b2), setTimeout(function() {
i.revokeObjectURL(j.href);
}, 4e4), setTimeout(function() {
e(j);
}, 0));
} : "msSaveOrOpenBlob" in navigator ? function(f2, g2, h) {
if (g2 = g2 || f2.name || "download", typeof f2 != "string")
navigator.msSaveOrOpenBlob(b(f2, h), g2);
else if (d(f2))
c(f2, g2, h);
else {
var i = document.createElement("a");
i.href = f2, i.target = "_blank", setTimeout(function() {
e(i);
});
}
} : function(b2, d2, e2, g2) {
if (g2 = g2 || open("", "_blank"), g2 && (g2.document.title = g2.document.body.innerText = "downloading..."), typeof b2 == "string")
return c(b2, d2, e2);
var h = b2.type === "application/octet-stream", i = /constructor/i.test(f.HTMLElement) || f.safari, j = /CriOS\/[\d]+/.test(navigator.userAgent);
if ((j || h && i || a) && typeof FileReader != "undefined") {
var k = new FileReader();
k.onloadend = function() {
var a2 = k.result;
a2 = j ? a2 : a2.replace(/^data:[^;]*;/, "data:attachment/file;"), g2 ? g2.location.href = a2 : location = a2, g2 = null;
}, k.readAsDataURL(b2);
} else {
var l = f.URL || f.webkitURL, m = l.createObjectURL(b2);
g2 ? g2.location = m : location.href = m, g2 = null, setTimeout(function() {
l.revokeObjectURL(m);
}, 4e4);
}
});
f.saveAs = g.saveAs = g, typeof module2 != "undefined" && (module2.exports = g);
});
}
});
// dom-to-image.js
var require_dom_to_image = __commonJS({
"dom-to-image.js"(exports, module2) {
var import_obsidian2 = require("obsidian");
var util = newUtil();
var inliner = newInliner();
var fontFaces = newFontFaces();
var images = newImages();
var defaultOptions = {
imagePlaceholder: void 0,
cacheBust: false
};
var domtoimage = {
toSvg,
toPng,
toJpeg,
toJpegWithClonedDom,
toBlob,
toPixelData,
toBlobWithClonedDom: toBlobWithClonedDom2,
cloneNode: cloneNode2,
impl: {
fontFaces,
images,
util,
inliner,
options: {}
}
};
function toSvg(node, options) {
options = options || {};
copyOptions(options);
return Promise.resolve(node).then(function(node2) {
return cloneNode2(node2, options.filter, true);
}).then(embedFonts).then(inlineImages).then(applyOptions).then(function(clone) {
return makeSvgDataUri(clone, options.width || util.width(node), options.height || util.height(node));
});
function applyOptions(clone) {
if (options.bgcolor)
clone.style.backgroundColor = options.bgcolor;
if (options.width)
clone.style.width = options.width + "px";
if (options.height)
clone.style.height = options.height + "px";
if (options.style)
Object.keys(options.style).forEach(function(property) {
clone.style[property] = options.style[property];
});
return clone;
}
}
function toSvgWithClonedDom(node, clone, options) {
options = options || {};
copyOptions(options);
return Promise.resolve(clone).then(embedFonts).then(inlineImages).then(applyOptions).then(function(clone2) {
return makeSvgDataUri(clone2, options.width * 2, options.height * 2);
});
function applyOptions(clone2) {
if (options.bgcolor)
clone2.style.backgroundColor = options.bgcolor;
if (options.width)
clone2.style.width = options.width + "px";
if (options.height)
clone2.style.height = options.height + "px";
if (options.style)
Object.keys(options.style).forEach(function(property) {
clone2.style[property] = options.style[property];
});
return clone2;
}
}
function toPixelData(node, options) {
return draw(node, options || {}).then(function(canvas) {
return canvas.getContext("2d").getImageData(0, 0, util.width(node), util.height(node)).data;
});
}
function toPng(node, options) {
return draw(node, options || {}).then(function(canvas) {
return canvas.toDataURL();
});
}
function toJpeg(node, options) {
options = options || {};
return draw(node, options).then(function(canvas) {
return canvas.toDataURL("image/jpeg", options.quality || 1);
});
}
function toJpegWithClonedDom(node, clone, options) {
options = options || {};
return drawWithClonedDom(node, clone, options).then(function(canvas) {
return canvas.toDataURL("image/jpeg", options.quality || 1);
});
}
function toBlob(node, options) {
return draw(node, options || {}).then(function(canvas) {
return util.canvasToBlob(canvas, options);
});
}
function toBlobWithClonedDom2(node, clone, options) {
return drawWithClonedDom(node, clone, options || {}).then(function(canvas) {
return util.canvasToBlob(canvas, options);
});
}
function copyOptions(options) {
if (typeof options.imagePlaceholder === "undefined") {
domtoimage.impl.options.imagePlaceholder = defaultOptions.imagePlaceholder;
} else {
domtoimage.impl.options.imagePlaceholder = options.imagePlaceholder;
}
if (typeof options.cacheBust === "undefined") {
domtoimage.impl.options.cacheBust = defaultOptions.cacheBust;
} else {
domtoimage.impl.options.cacheBust = options.cacheBust;
}
}
function draw(domNode, options) {
return toSvg(domNode, options).then(util.makeImage).then(util.delay(100)).then(function(image) {
var canvas = newCanvas(domNode);
canvas.getContext("2d").drawImage(image, 0, 0);
return canvas;
});
function newCanvas(domNode2) {
var canvas = document.createElement("canvas");
canvas.width = options.width || util.width(domNode2);
canvas.height = options.height || util.height(domNode2);
if (options.bgcolor) {
var ctx = canvas.getContext("2d");
ctx.fillStyle = options.bgcolor;
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
return canvas;
}
}
function drawWithClonedDom(domNode, clone, options) {
return toSvgWithClonedDom(domNode, clone, options).then(util.makeImage).then(util.delay(100)).then(function(image) {
var canvas = newCanvas();
canvas.getContext("2d").drawImage(image, 0, 0, options.width * 2, options.height * 2);
return canvas;
});
function newCanvas() {
var canvas = document.createElement("canvas");
canvas.width = options.width;
canvas.height = options.height;
if (options.bgcolor) {
var ctx = canvas.getContext("2d");
ctx.fillStyle = options.bgcolor;
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
return canvas;
}
}
function cloneNode2(node, filter, root) {
if (!root && filter && !filter(node))
return Promise.resolve();
return Promise.resolve(node).then(makeNodeCopy).then(function(clone) {
return cloneChildren(node, clone, filter);
}).then(function(clone) {
return processClone(node, clone);
});
function makeNodeCopy(node2) {
if (node2 instanceof HTMLCanvasElement)
return util.makeImage(node2.toDataURL());
return node2.cloneNode(false);
}
function cloneChildren(original, clone, filter2) {
var children = original.childNodes;
if (children.length === 0)
return Promise.resolve(clone);
return cloneChildrenInOrder(clone, util.asArray(children), filter2).then(function() {
return clone;
});
function cloneChildrenInOrder(parent, children2, filter3) {
var done = Promise.resolve();
children2.forEach(function(child) {
done = done.then(function() {
return cloneNode2(child, filter3);
}).then(function(childClone) {
if (childClone)
parent.appendChild(childClone);
});
});
return done;
}
}
function processClone(original, clone) {
if (!(clone instanceof Element))
return clone;
return Promise.resolve().then(cloneStyle).then(clonePseudoElements).then(copyUserInput).then(fixSvg).then(function() {
return clone;
});
function cloneStyle() {
copyStyle(window.getComputedStyle(original), clone.style || {});
function copyStyle(source, target) {
if (source.cssText)
target.cssText = source.cssText;
else
copyProperties(source, target);
function copyProperties(source2, target2) {
if (target2.setProperty) {
util.asArray(source2).forEach(function(name) {
target2.setProperty(name, source2.getPropertyValue(name), source2.getPropertyPriority(name));
});
}
}
}
}
function clonePseudoElements() {
[":before", ":after"].forEach(function(element) {
clonePseudoElement(element);
});
function clonePseudoElement(element) {
var style = window.getComputedStyle(original, element);
var content = style.getPropertyValue("content");
if (content === "" || content === "none")
return;
var className = util.uid();
clone.className = clone.className + " " + className;
var styleElement = document.createElement("style");
styleElement.appendChild(formatPseudoElementStyle(className, element, style));
clone.appendChild(styleElement);
function formatPseudoElementStyle(className2, element2, style2) {
var selector = "." + className2 + ":" + element2;
var cssText = style2.cssText ? formatCssText(style2) : formatCssProperties(style2);
return document.createTextNode(selector + "{" + cssText + "}");
function formatCssText(style3) {
var content2 = style3.getPropertyValue("content");
return style3.cssText + " content: " + content2 + ";";
}
function formatCssProperties(style3) {
return util.asArray(style3).map(formatProperty).join("; ") + ";";
function formatProperty(name) {
return name + ": " + style3.getPropertyValue(name) + (style3.getPropertyPriority(name) ? " !important" : "");
}
}
}
}
}
function copyUserInput() {
if (original instanceof HTMLTextAreaElement)
clone.innerHTML = original.value;
if (original instanceof HTMLInputElement)
clone.setAttribute("value", original.value);
}
function fixSvg() {
if (!(clone instanceof SVGElement))
return;
clone.setAttribute("xmlns", "http://www.w3.org/2000/svg");
if (!(clone instanceof SVGRectElement))
return;
["width", "height"].forEach(function(attribute) {
var value = clone.getAttribute(attribute);
if (!value)
return;
clone.style.setProperty(attribute, value);
});
}
}
}
function embedFonts(node) {
return fontFaces.resolveAll().then(function(cssText) {
var styleNode = document.createElement("style");
node.appendChild(styleNode);
styleNode.appendChild(document.createTextNode(cssText));
return node;
});
}
function inlineImages(node) {
return images.inlineAll(node).then(function() {
return node;
});
}
function makeSvgDataUri(node, width, height) {
return Promise.resolve(node).then(function(node2) {
node2.setAttribute("xmlns", "http://www.w3.org/1999/xhtml");
return new XMLSerializer().serializeToString(node2);
}).then(util.escapeXhtml).then(function(xhtml) {
return '<foreignObject x="0" y="0" width="100%" height="100%">' + xhtml + "</foreignObject>";
}).then(function(foreignObject) {
return '<svg xmlns="http://www.w3.org/2000/svg" width="' + width + '" height="' + height + '">' + foreignObject + "</svg>";
}).then(function(svg) {
return "data:image/svg+xml;charset=utf-8," + svg;
});
}
function newUtil() {
return {
escape,
parseExtension,
mimeType,
dataAsUrl,
isDataUrl,
canvasToBlob,
resolveUrl,
getAndEncode,
uid: uid(),
delay: delay2,
asArray,
escapeXhtml,
makeImage,
width,
height
};
function mimes() {
var WOFF = "application/font-woff";
var JPEG = "image/jpeg";
return {
"woff": WOFF,
"woff2": WOFF,
"ttf": "application/font-truetype",
"eot": "application/vnd.ms-fontobject",
"png": "image/png",
"jpg": JPEG,
"jpeg": JPEG,
"gif": "image/gif",
"tiff": "image/tiff",
"svg": "image/svg+xml"
};
}
function parseExtension(url) {
var match = /\.([^\.\/]*?)$/g.exec(url);
if (match)
return match[1];
else
return "";
}
function mimeType(url) {
var extension = parseExtension(url).toLowerCase();
return mimes()[extension] || "";
}
function isDataUrl(url) {
return url.search(/^(data:)/) !== -1;
}
function toBlob2(canvas, options) {
return new Promise(function(resolve) {
var binaryString = window.atob(canvas.toDataURL("image/jpeg", options.quality || 1).split(",")[1]);
var length = binaryString.length;
var binaryArray = new Uint8Array(length);
for (var i = 0; i < length; i++)
binaryArray[i] = binaryString.charCodeAt(i);
resolve(new Blob([binaryArray], {
type: "image/jpeg"
}));
});
}
function canvasToBlob(canvas, options) {
if (canvas.toBlob)
return new Promise(function(resolve) {
canvas.toBlob(resolve, "image/jpg", options.quality || 1);
});
return toBlob2(canvas, options);
}
function resolveUrl(url, baseUrl) {
var doc = document.implementation.createHTMLDocument();
var base = doc.createElement("base");
doc.head.appendChild(base);
var a = doc.createElement("a");
doc.body.appendChild(a);
base.href = baseUrl;
a.href = url;
return a.href;
}
function uid() {
var index = 0;
return function() {
return "u" + fourRandomChars() + index++;
function fourRandomChars() {
return ("0000" + (Math.random() * Math.pow(36, 4) << 0).toString(36)).slice(-4);
}
};
}
function makeImage(uri) {
return new Promise(function(resolve, reject) {
var image = new Image();
image.onload = function() {
resolve(image);
};
image.onerror = resolve;
image.src = uri;
});
}
function getAndEncode(url) {
var TIMEOUT = 3e4;
if (domtoimage.impl.options.cacheBust) {
url += (/\?/.test(url) ? "&" : "?") + new Date().getTime();
}
if (/^http/.test(url)) {
return (0, import_obsidian2.requestUrl)({
url,
method: "GET"
}).then((data) => {
let binary = "";
const bytes = new Uint8Array(data.arrayBuffer);
const len = bytes.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}).catch((err) => {
console.error("cannot fetch resource: " + url + ", error: " + err);
return "";
});
}
return new Promise(function(resolve) {
var request = new XMLHttpRequest();
request.onreadystatechange = done;
request.ontimeout = timeout;
request.responseType = "blob";
request.timeout = TIMEOUT;
request.open("GET", url, true);
request.send();
var placeholder;
if (domtoimage.impl.options.imagePlaceholder) {
var split = domtoimage.impl.options.imagePlaceholder.split(/,/);
if (split && split[1]) {
placeholder = split[1];
}
}
function done() {
if (request.readyState !== 4)
return;
if (request.status !== 200) {
if (placeholder) {
resolve(placeholder);
} else {
fail("cannot fetch resource: " + url + ", status: " + request.status);
}
return;
}
var encoder = new FileReader();
encoder.onloadend = function() {
var content = encoder.result.split(/,/)[1];
resolve(content);
};
encoder.readAsDataURL(request.response);
}
function timeout() {
if (placeholder) {
resolve(placeholder);
} else {
fail("timeout of " + TIMEOUT + "ms occured while fetching resource: " + url);
}
}
function fail(message) {
console.error(message);
resolve("");
}
});
}
function dataAsUrl(content, type) {
return "data:" + type + ";base64," + content;
}
function escape(string) {
return string.replace(/([.*+?^${}()|\[\]\/\\])/g, "\\$1");
}
function delay2(ms) {
return function(arg) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(arg);
}, ms);
});
};
}
function asArray(arrayLike) {
var array = [];
var length = arrayLike.length;
for (var i = 0; i < length; i++)
array.push(arrayLike[i]);
return array;
}
function escapeXhtml(string) {
return string.replace(/#/g, "%23").replace(/\n/g, "%0A");
}
function width(node) {
var leftBorder = px(node, "border-left-width");
var rightBorder = px(node, "border-right-width");
return node.scrollWidth + leftBorder + rightBorder;
}
function height(node) {
var topBorder = px(node, "border-top-width");
var bottomBorder = px(node, "border-bottom-width");
return node.scrollHeight + topBorder + bottomBorder;
}
function px(node, styleProperty) {
var value = window.getComputedStyle(node).getPropertyValue(styleProperty);
return parseFloat(value.replace("px", ""));
}
}
function newInliner() {
var URL_REGEX = /url\(['"]?([^'"]+?)['"]?\)/g;
return {
inlineAll,
shouldProcess,
impl: {
readUrls,
inline
}
};
function shouldProcess(string) {
return string.search(URL_REGEX) !== -1;
}
function readUrls(string) {
var result = [];
var match;
while ((match = URL_REGEX.exec(string)) !== null) {
result.push(match[1]);
}
return result.filter(function(url) {
return !util.isDataUrl(url);
});
}
function inline(string, url, baseUrl, get) {
return Promise.resolve(url).then(function(url2) {
return baseUrl ? util.resolveUrl(url2, baseUrl) : url2;
}).then(get || util.getAndEncode).then(function(data) {
return util.dataAsUrl(data, util.mimeType(url));
}).then(function(dataUrl) {
return string.replace(urlAsRegex(url), "$1" + dataUrl + "$3");
});
function urlAsRegex(url2) {
return new RegExp(`(url\\(['"]?)(` + util.escape(url2) + `)(['"]?\\))`, "g");
}
}
function inlineAll(string, baseUrl, get) {
if (nothingToInline())
return Promise.resolve(string);
return Promise.resolve(string).then(readUrls).then(function(urls) {
var done = Promise.resolve(string);
urls.forEach(function(url) {
done = done.then(function(string2) {
return inline(string2, url, baseUrl, get);
});
});
return done;
});
function nothingToInline() {
return !shouldProcess(string);
}
}
}
function newFontFaces() {
return {
resolveAll,
impl: {
readAll
}
};
function resolveAll() {
return readAll(document).then(function(webFonts) {
return Promise.all(webFonts.map(function(webFont) {
return webFont.resolve();
}));
}).then(function(cssStrings) {
return cssStrings.join("\n");
});
}
function readAll() {
return Promise.resolve(util.asArray(document.styleSheets)).then(getCssRules).then(selectWebFontRules).then(function(rules) {
return rules.map(newWebFont);
});
function selectWebFontRules(cssRules) {
return cssRules.filter(function(rule) {
return rule.type === CSSRule.FONT_FACE_RULE;
}).filter(function(rule) {
return inliner.shouldProcess(rule.style.getPropertyValue("src"));
});
}
function getCssRules(styleSheets) {
var cssRules = [];
styleSheets.forEach(function(sheet) {
try {
util.asArray(sheet.cssRules || []).forEach(cssRules.push.bind(cssRules));
} catch (e) {
console.log("Error while reading CSS rules from " + sheet.href, e.toString());
}
});
return cssRules;
}
function newWebFont(webFontRule) {
return {
resolve: function resolve() {
var baseUrl = (webFontRule.parentStyleSheet || {}).href;
return inliner.inlineAll(webFontRule.cssText, baseUrl);
},
src: function() {
return webFontRule.style.getPropertyValue("src");
}
};
}
}
}
function newImages() {
return {
inlineAll,
impl: {
newImage
}
};
function newImage(element) {
return {
inline
};
function inline(get) {
if (util.isDataUrl(element.src))
return Promise.resolve();
return Promise.resolve(element.src).then(get || util.getAndEncode).then(function(data) {
return util.dataAsUrl(data, util.mimeType(element.src));
}).then(function(dataUrl) {
return new Promise(function(resolve, reject) {
element.onload = resolve;
element.onerror = resolve;
element.src = dataUrl;
});
});
}
}
function inlineAll(node) {
if (!(node instanceof Element))
return Promise.resolve(node);
return inlineBackground(node).then(function() {
if (node instanceof HTMLImageElement)
return newImage(node).inline();
else
return Promise.all(util.asArray(node.childNodes).map(function(child) {
return inlineAll(child);
}));
});
function inlineBackground(node2) {
try {
var background = node2.style.getPropertyValue("background");
} catch (e) {
return Promise.resolve(node2);
}
if (!background)
return Promise.resolve(node2);
return inliner.inlineAll(background).then(function(inlined) {
node2.style.setProperty("background", inlined, node2.style.getPropertyPriority("background"));
}).then(function() {
return node2;
});
}
}
}
module2.exports = domtoimage;
}
});
// main.ts
var main_exports = {};
__export(main_exports, {
default: () => main_default
});
module.exports = __toCommonJS(main_exports);
// ExportImagePlugin.ts
var import_obsidian = require("obsidian");
var import_file_saver = __toESM(require_FileSaver_min());
// constents.ts
var DEFAULT_SETTINGS = {
width: "400"
};
// ExportImagePlugin.ts
var import_dom_to_image = __toESM(require_dom_to_image());
function delay(ms) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(void 0);
}, ms);
});
}
async function cloneDom(el, markdownView) {
const container = el.parentElement;
const scrollCache = container.scrollTop;
container.scrollTo(0, 0);
el.addClass("epxort-image-force-no-margin");
await delay(40);
const totalHeight = el.clientHeight;
const screenHeight = markdownView.contentEl.clientHeight;
let scrollIndex = 0;
let height = el.clientHeight - parseFloat(el.style.paddingBottom) + 40;
console.log("scollHeight:", height);
const clone = await (0, import_dom_to_image.cloneNode)(el);
const observer = new MutationObserver(async (records) => {
for (let r of records) {
for (let node of Array.from(r.addedNodes)) {
clone.append(await (0, import_dom_to_image.cloneNode)(node));
}
}
});
observer.observe(el, {
childList: true
});
while (scrollIndex <= totalHeight - screenHeight) {
scrollIndex += screenHeight;
container.scrollTo(0, scrollIndex);
await delay(40);
}
observer.disconnect();
container.scrollTo(0, scrollCache);
clone.addClass("export-image-clone");
document.body.appendChild(clone);
console.log(clone.clientWidth, clone.clientHeight);
el.removeClass("epxort-image-force-no-margin");
return clone;
}
var ExportImagePlugin = class extends import_obsidian.Plugin {
async onload() {
await this.loadSettings();
this.addCommand({
id: "export-to-image-zh",
name: "Export to image",
checkCallback: (checking) => {
const markdownView = this.app.workspace.getActiveViewOfType(import_obsidian.MarkdownView);
if ((markdownView == null ? void 0 : markdownView.getMode()) === "preview") {
if (!checking) {
(async () => {
const el = markdownView.contentEl.find(".markdown-preview-section");
const clone = await cloneDom(el, markdownView);
const blob = await (0, import_dom_to_image.toBlobWithClonedDom)(el, clone, {
width: clone.clientWidth * 2,
height: clone.clientHeight * 2,
bgcolor: window.getComputedStyle(el.closest(".view-content")).backgroundColor,
quality: 0.9,
style: {
transform: "scale(2)",
transformOrigin: "top left"
}
});
document.body.removeChild(clone);
(0, import_file_saver.saveAs)(blob, `${markdownView.getDisplayText().replace(/\s+/g, "_")}.jpg`);
})();
}
return true;
}
}
});
this.addCommand({
id: "copy-as-image-zh",
name: "Copy as image",
checkCallback: (checking) => {
const markdownView = this.app.workspace.getActiveViewOfType(import_obsidian.MarkdownView);
if ((markdownView == null ? void 0 : markdownView.getMode()) === "preview") {
if (!checking) {
(async () => {
const el = markdownView.contentEl.find(".markdown-preview-section");
const clone = await cloneDom(el, markdownView);
const blob = await (0, import_dom_to_image.toBlobWithClonedDom)(el, clone, {
width: clone.clientWidth * 2,
height: clone.clientHeight * 2,
bgcolor: window.getComputedStyle(el.closest(".view-content")).backgroundColor,
quality: 0.9,
style: {
transform: "scale(2)",
transformOrigin: "top left"
}
});
document.body.removeChild(clone);
const data = [
new ClipboardItem({
[blob.type]: blob
})
];
await navigator.clipboard.write(data);
new import_obsidian.Notice("Copied!");
})();
}
return true;
}
}
});
}
onunload() {
}
async loadSettings() {
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
}
async saveSettings() {
await this.saveData(this.settings);
}
};
// main.ts
var main_default = ExportImagePlugin;
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvc3JjL0ZpbGVTYXZlci5qcyIsICJkb20tdG8taW1hZ2UuanMiLCAibWFpbi50cyIsICJFeHBvcnRJbWFnZVBsdWdpbi50cyIsICJjb25zdGVudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4qIEZpbGVTYXZlci5qc1xuKiBBIHNhdmVBcygpIEZpbGVTYXZlciBpbXBsZW1lbnRhdGlvbi5cbipcbiogQnkgRWxpIEdyZXksIGh0dHA6Ly9lbGlncmV5LmNvbVxuKlxuKiBMaWNlbnNlIDogaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvRmlsZVNhdmVyLmpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWQgKE1JVClcbiogc291cmNlICA6IGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9GaWxlU2F2ZXIuanNcbiovXG5cbi8vIFRoZSBvbmUgYW5kIG9ubHkgd2F5IG9mIGdldHRpbmcgZ2xvYmFsIHNjb3BlIGluIGFsbCBlbnZpcm9ubWVudHNcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8zMjc3MTgyLzEwMDg5OTlcbnZhciBfZ2xvYmFsID0gdHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgJiYgd2luZG93LndpbmRvdyA9PT0gd2luZG93XG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgPT09ICdvYmplY3QnICYmIHNlbGYuc2VsZiA9PT0gc2VsZlxuICA/IHNlbGYgOiB0eXBlb2YgZ2xvYmFsID09PSAnb2JqZWN0JyAmJiBnbG9iYWwuZ2xvYmFsID09PSBnbG9iYWxcbiAgPyBnbG9iYWxcbiAgOiB0aGlzXG5cbmZ1bmN0aW9uIGJvbSAoYmxvYiwgb3B0cykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICd1bmRlZmluZWQnKSBvcHRzID0geyBhdXRvQm9tOiBmYWxzZSB9XG4gIGVsc2UgaWYgKHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgIGNvbnNvbGUud2FybignRGVwcmVjYXRlZDogRXhwZWN0ZWQgdGhpcmQgYXJndW1lbnQgdG8gYmUgYSBvYmplY3QnKVxuICAgIG9wdHMgPSB7IGF1dG9Cb206ICFvcHRzIH1cbiAgfVxuXG4gIC8vIHByZXBlbmQgQk9NIGZvciBVVEYtOCBYTUwgYW5kIHRleHQvKiB0eXBlcyAoaW5jbHVkaW5nIEhUTUwpXG4gIC8vIG5vdGU6IHlvdXIgYnJvd3NlciB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCBVVEYtMTYgVStGRUZGIHRvIEVGIEJCIEJGXG4gIGlmIChvcHRzLmF1dG9Cb20gJiYgL15cXHMqKD86dGV4dFxcL1xcUyp8YXBwbGljYXRpb25cXC94bWx8XFxTKlxcL1xcUypcXCt4bWwpXFxzKjsuKmNoYXJzZXRcXHMqPVxccyp1dGYtOC9pLnRlc3QoYmxvYi50eXBlKSkge1xuICAgIHJldHVybiBuZXcgQmxvYihbU3RyaW5nLmZyb21DaGFyQ29kZSgweEZFRkYpLCBibG9iXSwgeyB0eXBlOiBibG9iLnR5cGUgfSlcbiAgfVxuICByZXR1cm4gYmxvYlxufVxuXG5mdW5jdGlvbiBkb3dubG9hZCAodXJsLCBuYW1lLCBvcHRzKSB7XG4gIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICB4aHIub3BlbignR0VUJywgdXJsKVxuICB4aHIucmVzcG9uc2VUeXBlID0gJ2Jsb2InXG4gIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgc2F2ZUFzKHhoci5yZXNwb25zZSwgbmFtZSwgb3B0cylcbiAgfVxuICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zb2xlLmVycm9yKCdjb3VsZCBub3QgZG93bmxvYWQgZmlsZScpXG4gIH1cbiAgeGhyLnNlbmQoKVxufVxuXG5mdW5jdGlvbiBjb3JzRW5hYmxlZCAodXJsKSB7XG4gIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAvLyB1c2Ugc3luYyB0byBhdm9pZCBwb3B1cCBibG9ja2VyXG4gIHhoci5vcGVuKCdIRUFEJywgdXJsLCBmYWxzZSlcbiAgdHJ5IHtcbiAgICB4aHIuc2VuZCgpXG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiB4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDw9IDI5OVxufVxuXG4vLyBgYS5jbGljaygpYCBkb2Vzbid0IHdvcmsgZm9yIGFsbCBicm93c2VycyAoIzQ2NSlcbmZ1bmN0aW9uIGNsaWNrIChub2RlKSB7XG4gIHRyeSB7XG4gICAgbm9kZS5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycpKVxuICB9IGNhdGNoIChlKSB7XG4gICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpXG4gICAgZXZ0LmluaXRNb3VzZUV2ZW50KCdjbGljaycsIHRydWUsIHRydWUsIHdpbmRvdywgMCwgMCwgMCwgODAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDIwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCwgbnVsbClcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQoZXZ0KVxuICB9XG59XG5cbi8vIERldGVjdCBXZWJWaWV3IGluc2lkZSBhIG5hdGl2ZSBtYWNPUyBhcHAgYnkgcnVsaW5nIG91dCBhbGwgYnJvd3NlcnNcbi8vIFdlIGp1c3QgbmVlZCB0byBjaGVjayBmb3IgJ1NhZmFyaScgYmVjYXVzZSBhbGwgb3RoZXIgYnJvd3NlcnMgKGJlc2lkZXMgRmlyZWZveCkgaW5jbHVkZSB0aGF0IHRvb1xuLy8gaHR0cHM6Ly93d3cud2hhdGlzbXlicm93c2VyLmNvbS9ndWlkZXMvdGhlLWxhdGVzdC11c2VyLWFnZW50L21hY29zXG52YXIgaXNNYWNPU1dlYlZpZXcgPSBfZ2xvYmFsLm5hdmlnYXRvciAmJiAvTWFjaW50b3NoLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmIC9BcHBsZVdlYktpdC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhL1NhZmFyaS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KVxuXG52YXIgc2F2ZUFzID0gX2dsb2JhbC5zYXZlQXMgfHwgKFxuICAvLyBwcm9iYWJseSBpbiBzb21lIHdlYiB3b3JrZXJcbiAgKHR5cGVvZiB3aW5kb3cgIT09ICdvYmplY3QnIHx8IHdpbmRvdyAhPT0gX2dsb2JhbClcbiAgICA/IGZ1bmN0aW9uIHNhdmVBcyAoKSB7IC8qIG5vb3AgKi8gfVxuXG4gIC8vIFVzZSBkb3dubG9hZCBhdHRyaWJ1dGUgZmlyc3QgaWYgcG9zc2libGUgKCMxOTMgTHVtaWEgbW9iaWxlKSB1bmxlc3MgdGhpcyBpcyBhIG1hY09TIFdlYlZpZXdcbiAgOiAoJ2Rvd25sb2FkJyBpbiBIVE1MQW5jaG9yRWxlbWVudC5wcm90b3R5cGUgJiYgIWlzTWFjT1NXZWJWaWV3KVxuICA/IGZ1bmN0aW9uIHNhdmVBcyAoYmxvYiwgbmFtZSwgb3B0cykge1xuICAgIHZhciBVUkwgPSBfZ2xvYmFsLlVSTCB8fCBfZ2xvYmFsLndlYmtpdFVSTFxuICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgbmFtZSA9IG5hbWUgfHwgYmxvYi5uYW1lIHx8ICdkb3dubG9hZCdcblxuICAgIGEuZG93bmxvYWQgPSBuYW1lXG4gICAgYS5yZWwgPSAnbm9vcGVuZXInIC8vIHRhYm5hYmJpbmdcblxuICAgIC8vIFRPRE86IGRldGVjdCBjaHJvbWUgZXh0ZW5zaW9ucyAmIHBhY2thZ2VkIGFwcHNcbiAgICAvLyBhLnRhcmdldCA9ICdfYmxhbmsnXG5cbiAgICBpZiAodHlwZW9mIGJsb2IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBTdXBwb3J0IHJlZ3VsYXIgbGlua3NcbiAgICAgIGEuaHJlZiA9IGJsb2JcbiAgICAgIGlmIChhLm9yaWdpbiAhPT0gbG9jYXRpb24ub3JpZ2luKSB7XG4gICAgICAgIGNvcnNFbmFibGVkKGEuaHJlZilcbiAgICAgICAgICA/IGRvd25sb2FkKGJsb2IsIG5hbWUsIG9wdHMpXG4gICAgICAgICAgOiBjbGljayhhLCBhLnRhcmdldCA9ICdfYmxhbmsnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xpY2soYSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3VwcG9ydCBibG9ic1xuICAgICAgYS5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IFVSTC5yZXZva2VPYmplY3RVUkwoYS5ocmVmKSB9LCA0RTQpIC8vIDQwc1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNsaWNrKGEpIH0sIDApXG4gICAgfVxuICB9XG5cbiAgLy8gVXNlIG1zU2F2ZU9yT3BlbkJsb2IgYXMgYSBzZWNvbmQgYXBwcm9hY2hcbiAgOiAnbXNTYXZlT3JPcGVuQmxvYicgaW4gbmF2aWdhdG9yXG4gID8gZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzKSB7XG4gICAgbmFtZSA9IG5hbWUgfHwgYmxvYi5uYW1lIHx8ICdkb3dubG9hZCdcblxuICAgIGlmICh0eXBlb2YgYmxvYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChjb3JzRW5hYmxlZChibG9iKSkge1xuICAgICAgICBkb3dubG9hZChibG9iLCBuYW1lLCBvcHRzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICAgICAgYS5ocmVmID0gYmxvYlxuICAgICAgICBhLnRhcmdldCA9ICdfYmxhbmsnXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBjbGljayhhKSB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihib20oYmxvYiwgb3B0cyksIG5hbWUpXG4gICAgfVxuICB9XG5cbiAgLy8gRmFsbGJhY2sgdG8gdXNpbmcgRmlsZVJlYWRlciBhbmQgYSBwb3B1cFxuICA6IGZ1bmN0aW9uIHNhdmVBcyAoYmxvYiwgbmFtZSwgb3B0cywgcG9wdXApIHtcbiAgICAvLyBPcGVuIGEgcG9wdXAgaW1tZWRpYXRlbHkgZG8gZ28gYXJvdW5kIHBvcHVwIGJsb2NrZXJcbiAgICAvLyBNb3N0bHkgb25seSBhdmFpbGFibGUgb24gdXNlciBpbnRlcmFjdGlvbiBhbmQgdGhlIGZpbGVSZWFkZXIgaXMgYXN5bmMgc28uLi5cbiAgICBwb3B1cCA9IHBvcHVwIHx8IG9wZW4oJycsICdfYmxhbmsnKVxuICAgIGlmIChwb3B1cCkge1xuICAgICAgcG9wdXAuZG9jdW1lbnQudGl0bGUgPVxuICAgICAgcG9wdXAuZG9jdW1lbnQuYm9keS5pbm5lclRleHQgPSAnZG93bmxvYWRpbmcuLi4nXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykgcmV0dXJuIGRvd25sb2FkKGJsb2IsIG5hbWUsIG9wdHMpXG5cbiAgICB2YXIgZm9yY2UgPSBibG9iLnR5cGUgPT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gICAgdmFyIGlzU2FmYXJpID0gL2NvbnN0cnVjdG9yL2kudGVzdChfZ2xvYmFsLkhUTUxFbGVtZW50KSB8fCBfZ2xvYmFsLnNhZmFyaVxuICAgIHZhciBpc0Nocm9tZUlPUyA9IC9DcmlPU1xcL1tcXGRdKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KVxuXG4gICAgaWYgKChpc0Nocm9tZUlPUyB8fCAoZm9yY2UgJiYgaXNTYWZhcmkpIHx8IGlzTWFjT1NXZWJWaWV3KSAmJiB0eXBlb2YgRmlsZVJlYWRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFNhZmFyaSBkb2Vzbid0IGFsbG93IGRvd25sb2FkaW5nIG9mIGJsb2IgVVJMc1xuICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB1cmwgPSByZWFkZXIucmVzdWx0XG4gICAgICAgIHVybCA9IGlzQ2hyb21lSU9TID8gdXJsIDogdXJsLnJlcGxhY2UoL15kYXRhOlteO10qOy8sICdkYXRhOmF0dGFjaG1lbnQvZmlsZTsnKVxuICAgICAgICBpZiAocG9wdXApIHBvcHVwLmxvY2F0aW9uLmhyZWYgPSB1cmxcbiAgICAgICAgZWxzZSBsb2NhdGlvbiA9IHVybFxuICAgICAgICBwb3B1cCA9IG51bGwgLy8gcmV2ZXJzZS10YWJuYWJiaW5nICM0NjBcbiAgICAgIH1cbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBVUkwgPSBfZ2xvYmFsLlVSTCB8fCBfZ2xvYmFsLndlYmtpdFVSTFxuICAgICAgdmFyIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIGlmIChwb3B1cCkgcG9wdXAubG9jYXRpb24gPSB1cmxcbiAgICAgIGVsc2UgbG9jYXRpb24uaHJlZiA9IHVybFxuICAgICAgcG9wdXAgPSBudWxsIC8vIHJldmVyc2UtdGFibmFiYmluZyAjNDYwXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpIH0sIDRFNCkgLy8gNDBzXG4gICAgfVxuICB9XG4pXG5cbl9nbG9iYWwuc2F2ZUFzID0gc2F2ZUFzLnNhdmVBcyA9IHNhdmVBc1xuXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBzYXZlQXM7XG59XG4iLCAiaW1wb3J0IHsgcmVxdWVzdFVybCB9IGZyb20gJ29ic2lkaWFuJztcblxuICB2YXIgdXRpbCA9IG5ld1V0aWwoKTtcbiAgdmFyIGlubGluZXIgPSBuZXdJbmxpbmVyKCk7XG4gIHZhciBmb250RmFjZXMgPSBuZXdGb250RmFjZXMoKTtcbiAgdmFyIGltYWdlcyA9IG5ld0ltYWdlcygpO1xuXG4gIC8vIERlZmF1bHQgaW1wbCBvcHRpb25zXG4gIHZhciBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAvLyBEZWZhdWx0IGlzIHRvIGZhaWwgb24gZXJyb3IsIG5vIHBsYWNlaG9sZGVyXG4gICAgaW1hZ2VQbGFjZWhvbGRlcjogdW5kZWZpbmVkLFxuICAgIC8vIERlZmF1bHQgY2FjaGUgYnVzdCBpcyBmYWxzZSwgaXQgd2lsbCB1c2UgdGhlIGNhY2hlXG4gICAgY2FjaGVCdXN0OiBmYWxzZVxuICB9O1xuXG4gIHZhciBkb210b2ltYWdlID0ge1xuICAgIHRvU3ZnOiB0b1N2ZyxcbiAgICB0b1BuZzogdG9QbmcsXG4gICAgdG9KcGVnOiB0b0pwZWcsXG4gICAgdG9KcGVnV2l0aENsb25lZERvbTogdG9KcGVnV2l0aENsb25lZERvbSxcbiAgICB0b0Jsb2I6IHRvQmxvYixcbiAgICB0b1BpeGVsRGF0YTogdG9QaXhlbERhdGEsXG4gICAgdG9CbG9iV2l0aENsb25lZERvbTogdG9CbG9iV2l0aENsb25lZERvbSxcbiAgICBjbG9uZU5vZGU6IGNsb25lTm9kZSxcbiAgICBpbXBsOiB7XG4gICAgICBmb250RmFjZXM6IGZvbnRGYWNlcyxcbiAgICAgIGltYWdlczogaW1hZ2VzLFxuICAgICAgdXRpbDogdXRpbCxcbiAgICAgIGlubGluZXI6IGlubGluZXIsXG4gICAgICBvcHRpb25zOiB7fVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBSZW5kZXJpbmcgb3B0aW9uc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLmZpbHRlciAtIFNob3VsZCByZXR1cm4gdHJ1ZSBpZiBwYXNzZWQgbm9kZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dFxuICAgKiAgICAgICAgICAoZXhjbHVkaW5nIG5vZGUgbWVhbnMgZXhjbHVkaW5nIGl0J3MgY2hpbGRyZW4gYXMgd2VsbCkuIE5vdCBjYWxsZWQgb24gdGhlIHJvb3Qgbm9kZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuYmdjb2xvciAtIGNvbG9yIGZvciB0aGUgYmFja2dyb3VuZCwgYW55IHZhbGlkIENTUyBjb2xvciB2YWx1ZS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMud2lkdGggLSB3aWR0aCB0byBiZSBhcHBsaWVkIHRvIG5vZGUgYmVmb3JlIHJlbmRlcmluZy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuaGVpZ2h0IC0gaGVpZ2h0IHRvIGJlIGFwcGxpZWQgdG8gbm9kZSBiZWZvcmUgcmVuZGVyaW5nLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5zdHlsZSAtIGFuIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIHRvIGJlIGNvcGllZCB0byBub2RlJ3Mgc3R5bGUgYmVmb3JlIHJlbmRlcmluZy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMucXVhbGl0eSAtIGEgTnVtYmVyIGJldHdlZW4gMCBhbmQgMSBpbmRpY2F0aW5nIGltYWdlIHF1YWxpdHkgKGFwcGxpY2FibGUgdG8gSlBFRyBvbmx5KSxcbiAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gMS4wLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5pbWFnZVBsYWNlaG9sZGVyIC0gZGF0YVVSTCB0byB1c2UgYXMgYSBwbGFjZWhvbGRlciBmb3IgZmFpbGVkIGltYWdlcywgZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZmFpbCBmYXN0IG9uIGltYWdlcyB3ZSBjYW4ndCBmZXRjaFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMuY2FjaGVCdXN0IC0gc2V0IHRvIHRydWUgdG8gY2FjaGUgYnVzdCBieSBhcHBlbmRpbmcgdGhlIHRpbWUgdG8gdGhlIHJlcXVlc3QgdXJsXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSBTVkcgaW1hZ2UgZGF0YSBVUkxcbiAgICogKi9cbiAgZnVuY3Rpb24gdG9Tdmcobm9kZSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvcHlPcHRpb25zKG9wdGlvbnMpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobm9kZSlcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBjbG9uZU5vZGUobm9kZSwgb3B0aW9ucy5maWx0ZXIsIHRydWUpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKGVtYmVkRm9udHMpXG4gICAgICAudGhlbihpbmxpbmVJbWFnZXMpXG4gICAgICAudGhlbihhcHBseU9wdGlvbnMpXG4gICAgICAudGhlbihmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VTdmdEYXRhVXJpKGNsb25lLFxuICAgICAgICAgIG9wdGlvbnMud2lkdGggfHwgdXRpbC53aWR0aChub2RlKSxcbiAgICAgICAgICBvcHRpb25zLmhlaWdodCB8fCB1dGlsLmhlaWdodChub2RlKVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICBmdW5jdGlvbiBhcHBseU9wdGlvbnMoY2xvbmUpIHtcbiAgICAgIGlmIChvcHRpb25zLmJnY29sb3IpIGNsb25lLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmdjb2xvcjtcblxuICAgICAgaWYgKG9wdGlvbnMud2lkdGgpIGNsb25lLnN0eWxlLndpZHRoID0gb3B0aW9ucy53aWR0aCArICdweCc7XG4gICAgICBpZiAob3B0aW9ucy5oZWlnaHQpIGNsb25lLnN0eWxlLmhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ICsgJ3B4JztcblxuICAgICAgaWYgKG9wdGlvbnMuc3R5bGUpXG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuc3R5bGUpLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgICAgY2xvbmUuc3R5bGVbcHJvcGVydHldID0gb3B0aW9ucy5zdHlsZVtwcm9wZXJ0eV07XG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG9TdmdXaXRoQ2xvbmVkRG9tKG5vZGUsIGNsb25lLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29weU9wdGlvbnMob3B0aW9ucyk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZSlcbiAgICAgIC50aGVuKGVtYmVkRm9udHMpXG4gICAgICAudGhlbihpbmxpbmVJbWFnZXMpXG4gICAgICAudGhlbihhcHBseU9wdGlvbnMpXG4gICAgICAudGhlbihmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VTdmdEYXRhVXJpKGNsb25lLFxuICAgICAgICAgIG9wdGlvbnMud2lkdGggKiAyLFxuICAgICAgICAgIG9wdGlvbnMuaGVpZ2h0ICogMlxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICBmdW5jdGlvbiBhcHBseU9wdGlvbnMoY2xvbmUpIHtcbiAgICAgIGlmIChvcHRpb25zLmJnY29sb3IpIGNsb25lLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmdjb2xvcjtcblxuICAgICAgaWYgKG9wdGlvbnMud2lkdGgpIGNsb25lLnN0eWxlLndpZHRoID0gb3B0aW9ucy53aWR0aCArICdweCc7XG4gICAgICBpZiAob3B0aW9ucy5oZWlnaHQpIGNsb25lLnN0eWxlLmhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ICsgJ3B4JztcblxuICAgICAgaWYgKG9wdGlvbnMuc3R5bGUpXG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuc3R5bGUpLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgICAgY2xvbmUuc3R5bGVbcHJvcGVydHldID0gb3B0aW9ucy5zdHlsZVtwcm9wZXJ0eV07XG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBET00gTm9kZSBvYmplY3QgdG8gcmVuZGVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnMsIEBzZWUge0BsaW5rIHRvU3ZnfVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIGEgVWludDhBcnJheSBjb250YWluaW5nIFJHQkEgcGl4ZWwgZGF0YS5cbiAgICogKi9cbiAgZnVuY3Rpb24gdG9QaXhlbERhdGEobm9kZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBkcmF3KG5vZGUsIG9wdGlvbnMgfHwge30pXG4gICAgICAudGhlbihmdW5jdGlvbiAoY2FudmFzKSB7XG4gICAgICAgIHJldHVybiBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5nZXRJbWFnZURhdGEoXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIHV0aWwud2lkdGgobm9kZSksXG4gICAgICAgICAgdXRpbC5oZWlnaHQobm9kZSlcbiAgICAgICAgKS5kYXRhO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBSZW5kZXJpbmcgb3B0aW9ucywgQHNlZSB7QGxpbmsgdG9Tdmd9XG4gICAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSBQTkcgaW1hZ2UgZGF0YSBVUkxcbiAgICogKi9cbiAgZnVuY3Rpb24gdG9Qbmcobm9kZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBkcmF3KG5vZGUsIG9wdGlvbnMgfHwge30pXG4gICAgICAudGhlbihmdW5jdGlvbiAoY2FudmFzKSB7XG4gICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgRE9NIE5vZGUgb2JqZWN0IHRvIHJlbmRlclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zLCBAc2VlIHtAbGluayB0b1N2Z31cbiAgICogQHJldHVybiB7UHJvbWlzZX0gLSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCBhIEpQRUcgaW1hZ2UgZGF0YSBVUkxcbiAgICogKi9cbiAgZnVuY3Rpb24gdG9KcGVnKG5vZGUsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gZHJhdyhub2RlLCBvcHRpb25zKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGNhbnZhcykge1xuICAgICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIG9wdGlvbnMucXVhbGl0eSB8fCAxLjApO1xuICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b0pwZWdXaXRoQ2xvbmVkRG9tKG5vZGUsIGNsb25lICwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBkcmF3V2l0aENsb25lZERvbShub2RlLCBjbG9uZSwgb3B0aW9ucylcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChjYW52YXMpIHtcbiAgICAgICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCBvcHRpb25zLnF1YWxpdHkgfHwgMS4wKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBET00gTm9kZSBvYmplY3QgdG8gcmVuZGVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnMsIEBzZWUge0BsaW5rIHRvU3ZnfVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIGEgUE5HIGltYWdlIGJsb2JcbiAgICogKi9cbiAgZnVuY3Rpb24gdG9CbG9iKG5vZGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZHJhdyhub2RlLCBvcHRpb25zIHx8IHt9KVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGNhbnZhcykge1xuICAgICAgICByZXR1cm4gdXRpbC5jYW52YXNUb0Jsb2IoY2FudmFzLCBvcHRpb25zKTtcbiAgICAgIH0pO1xuICB9XG5cblxuICBmdW5jdGlvbiB0b0Jsb2JXaXRoQ2xvbmVkRG9tKG5vZGUsIGNsb25lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGRyYXdXaXRoQ2xvbmVkRG9tKG5vZGUsIGNsb25lLCBvcHRpb25zIHx8IHt9KVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGNhbnZhcykge1xuICAgICAgICByZXR1cm4gdXRpbC5jYW52YXNUb0Jsb2IoY2FudmFzLCBvcHRpb25zKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY29weU9wdGlvbnMob3B0aW9ucykge1xuICAgIC8vIENvcHkgb3B0aW9ucyB0byBpbXBsIG9wdGlvbnMgZm9yIHVzZSBpbiBpbXBsXG4gICAgaWYgKHR5cGVvZiAob3B0aW9ucy5pbWFnZVBsYWNlaG9sZGVyKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGRvbXRvaW1hZ2UuaW1wbC5vcHRpb25zLmltYWdlUGxhY2Vob2xkZXIgPSBkZWZhdWx0T3B0aW9ucy5pbWFnZVBsYWNlaG9sZGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb210b2ltYWdlLmltcGwub3B0aW9ucy5pbWFnZVBsYWNlaG9sZGVyID0gb3B0aW9ucy5pbWFnZVBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgKG9wdGlvbnMuY2FjaGVCdXN0KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGRvbXRvaW1hZ2UuaW1wbC5vcHRpb25zLmNhY2hlQnVzdCA9IGRlZmF1bHRPcHRpb25zLmNhY2hlQnVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9tdG9pbWFnZS5pbXBsLm9wdGlvbnMuY2FjaGVCdXN0ID0gb3B0aW9ucy5jYWNoZUJ1c3Q7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZHJhdyhkb21Ob2RlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRvU3ZnKGRvbU5vZGUsIG9wdGlvbnMpXG4gICAgICAudGhlbih1dGlsLm1ha2VJbWFnZSlcbiAgICAgIC50aGVuKHV0aWwuZGVsYXkoMTAwKSlcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChpbWFnZSkge1xuICAgICAgICB2YXIgY2FudmFzID0gbmV3Q2FudmFzKGRvbU5vZGUpO1xuICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApO1xuICAgICAgICByZXR1cm4gY2FudmFzO1xuICAgICAgfSk7XG5cbiAgICBmdW5jdGlvbiBuZXdDYW52YXMoZG9tTm9kZSkge1xuICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgY2FudmFzLndpZHRoID0gb3B0aW9ucy53aWR0aCB8fCB1dGlsLndpZHRoKGRvbU5vZGUpO1xuICAgICAgY2FudmFzLmhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0IHx8IHV0aWwuaGVpZ2h0KGRvbU5vZGUpO1xuXG4gICAgICBpZiAob3B0aW9ucy5iZ2NvbG9yKSB7XG4gICAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMuYmdjb2xvcjtcbiAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FudmFzO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkcmF3V2l0aENsb25lZERvbShkb21Ob2RlLCBjbG9uZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0b1N2Z1dpdGhDbG9uZWREb20oZG9tTm9kZSwgY2xvbmUsIG9wdGlvbnMpXG4gICAgICAudGhlbih1dGlsLm1ha2VJbWFnZSlcbiAgICAgIC50aGVuKHV0aWwuZGVsYXkoMTAwKSlcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChpbWFnZSkge1xuICAgICAgICB2YXIgY2FudmFzID0gbmV3Q2FudmFzKCk7XG4gICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgb3B0aW9ucy53aWR0aCAqIDIsIG9wdGlvbnMuaGVpZ2h0ICogMik7XG4gICAgICAgIHJldHVybiBjYW52YXM7XG4gICAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG5ld0NhbnZhcygpIHtcbiAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IG9wdGlvbnMud2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQ7XG5cbiAgICAgIGlmIChvcHRpb25zLmJnY29sb3IpIHtcbiAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5iZ2NvbG9yO1xuICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZU5vZGUobm9kZSwgZmlsdGVyLCByb290KSB7XG4gICAgaWYgKCFyb290ICYmIGZpbHRlciAmJiAhZmlsdGVyKG5vZGUpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGUpXG4gICAgICAudGhlbihtYWtlTm9kZUNvcHkpXG4gICAgICAudGhlbihmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgcmV0dXJuIGNsb25lQ2hpbGRyZW4obm9kZSwgY2xvbmUsIGZpbHRlcik7XG4gICAgICB9KVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzQ2xvbmUobm9kZSwgY2xvbmUpO1xuICAgICAgfSk7XG4gICAgZnVuY3Rpb24gbWFrZU5vZGVDb3B5KG5vZGUpIHtcbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHJldHVybiB1dGlsLm1ha2VJbWFnZShub2RlLnRvRGF0YVVSTCgpKTtcbiAgICAgIHJldHVybiBub2RlLmNsb25lTm9kZShmYWxzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmVDaGlsZHJlbihvcmlnaW5hbCwgY2xvbmUsIGZpbHRlcikge1xuICAgICAgdmFyIGNoaWxkcmVuID0gb3JpZ2luYWwuY2hpbGROb2RlcztcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2xvbmUpO1xuXG4gICAgICByZXR1cm4gY2xvbmVDaGlsZHJlbkluT3JkZXIoY2xvbmUsIHV0aWwuYXNBcnJheShjaGlsZHJlbiksIGZpbHRlcilcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjbG9uZTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNsb25lQ2hpbGRyZW5Jbk9yZGVyKHBhcmVudCwgY2hpbGRyZW4sIGZpbHRlcikge1xuICAgICAgICB2YXIgZG9uZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIGRvbmUgPSBkb25lXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjbG9uZU5vZGUoY2hpbGQsIGZpbHRlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNoaWxkQ2xvbmUpIHtcbiAgICAgICAgICAgICAgaWYgKGNoaWxkQ2xvbmUpIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZENsb25lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0Nsb25lKG9yaWdpbmFsLCBjbG9uZSkge1xuICAgICAgaWYgKCEoY2xvbmUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIGNsb25lO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgLnRoZW4oY2xvbmVTdHlsZSlcbiAgICAgICAgLnRoZW4oY2xvbmVQc2V1ZG9FbGVtZW50cylcbiAgICAgICAgLnRoZW4oY29weVVzZXJJbnB1dClcbiAgICAgICAgLnRoZW4oZml4U3ZnKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gY2xvbmVTdHlsZSgpIHtcbiAgICAgICAgY29weVN0eWxlKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG9yaWdpbmFsKSwgY2xvbmUuc3R5bGUgfHwge30pO1xuXG4gICAgICAgIGZ1bmN0aW9uIGNvcHlTdHlsZShzb3VyY2UsIHRhcmdldCkge1xuICAgICAgICAgIGlmIChzb3VyY2UuY3NzVGV4dCkgdGFyZ2V0LmNzc1RleHQgPSBzb3VyY2UuY3NzVGV4dDtcbiAgICAgICAgICBlbHNlIGNvcHlQcm9wZXJ0aWVzKHNvdXJjZSwgdGFyZ2V0KTtcblxuICAgICAgICAgIGZ1bmN0aW9uIGNvcHlQcm9wZXJ0aWVzKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LnNldFByb3BlcnR5KSB7XG4gICAgICAgICAgICAgIHV0aWwuYXNBcnJheShzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgc291cmNlLmdldFByb3BlcnR5VmFsdWUobmFtZSksXG4gICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0UHJvcGVydHlQcmlvcml0eShuYW1lKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjbG9uZVBzZXVkb0VsZW1lbnRzKCkge1xuICAgICAgICBbJzpiZWZvcmUnLCAnOmFmdGVyJ10uZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgIGNsb25lUHNldWRvRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gY2xvbmVQc2V1ZG9FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvcmlnaW5hbCwgZWxlbWVudCk7XG4gICAgICAgICAgdmFyIGNvbnRlbnQgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdjb250ZW50Jyk7XG5cbiAgICAgICAgICBpZiAoY29udGVudCA9PT0gJycgfHwgY29udGVudCA9PT0gJ25vbmUnKSByZXR1cm47XG5cbiAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gdXRpbC51aWQoKTtcbiAgICAgICAgICBjbG9uZS5jbGFzc05hbWUgPSBjbG9uZS5jbGFzc05hbWUgKyAnICcgKyBjbGFzc05hbWU7XG4gICAgICAgICAgdmFyIHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGZvcm1hdFBzZXVkb0VsZW1lbnRTdHlsZShjbGFzc05hbWUsIGVsZW1lbnQsIHN0eWxlKSk7XG4gICAgICAgICAgY2xvbmUuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTtcblxuICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdFBzZXVkb0VsZW1lbnRTdHlsZShjbGFzc05hbWUsIGVsZW1lbnQsIHN0eWxlKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSAnLicgKyBjbGFzc05hbWUgKyAnOicgKyBlbGVtZW50O1xuICAgICAgICAgICAgdmFyIGNzc1RleHQgPSBzdHlsZS5jc3NUZXh0ID8gZm9ybWF0Q3NzVGV4dChzdHlsZSkgOiBmb3JtYXRDc3NQcm9wZXJ0aWVzKHN0eWxlKTtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzZWxlY3RvciArICd7JyArIGNzc1RleHQgKyAnfScpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRDc3NUZXh0KHN0eWxlKSB7XG4gICAgICAgICAgICAgIHZhciBjb250ZW50ID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnY29udGVudCcpO1xuICAgICAgICAgICAgICByZXR1cm4gc3R5bGUuY3NzVGV4dCArICcgY29udGVudDogJyArIGNvbnRlbnQgKyAnOyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdENzc1Byb3BlcnRpZXMoc3R5bGUpIHtcblxuICAgICAgICAgICAgICByZXR1cm4gdXRpbC5hc0FycmF5KHN0eWxlKVxuICAgICAgICAgICAgICAgIC5tYXAoZm9ybWF0UHJvcGVydHkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJzsgJykgKyAnOyc7XG5cbiAgICAgICAgICAgICAgZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkobmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuYW1lICsgJzogJyArXG4gICAgICAgICAgICAgICAgICBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpICtcbiAgICAgICAgICAgICAgICAgIChzdHlsZS5nZXRQcm9wZXJ0eVByaW9yaXR5KG5hbWUpID8gJyAhaW1wb3J0YW50JyA6ICcnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjb3B5VXNlcklucHV0KCkge1xuICAgICAgICBpZiAob3JpZ2luYWwgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSBjbG9uZS5pbm5lckhUTUwgPSBvcmlnaW5hbC52YWx1ZTtcbiAgICAgICAgaWYgKG9yaWdpbmFsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgY2xvbmUuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgb3JpZ2luYWwudmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmaXhTdmcoKSB7XG4gICAgICAgIGlmICghKGNsb25lIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkpIHJldHVybjtcbiAgICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCd4bWxucycsICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycpO1xuXG4gICAgICAgIGlmICghKGNsb25lIGluc3RhbmNlb2YgU1ZHUmVjdEVsZW1lbnQpKSByZXR1cm47XG4gICAgICAgIFsnd2lkdGgnLCAnaGVpZ2h0J10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gY2xvbmUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgICAgICAgY2xvbmUuc3R5bGUuc2V0UHJvcGVydHkoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVtYmVkRm9udHMobm9kZSkge1xuICAgIHJldHVybiBmb250RmFjZXMucmVzb2x2ZUFsbCgpXG4gICAgICAudGhlbihmdW5jdGlvbiAoY3NzVGV4dCkge1xuICAgICAgICB2YXIgc3R5bGVOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdHlsZU5vZGUpO1xuICAgICAgICBzdHlsZU5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzVGV4dCkpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5saW5lSW1hZ2VzKG5vZGUpIHtcbiAgICByZXR1cm4gaW1hZ2VzLmlubGluZUFsbChub2RlKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFrZVN2Z0RhdGFVcmkobm9kZSwgd2lkdGgsIGhlaWdodCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobm9kZSlcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCd4bWxucycsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJyk7XG4gICAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKG5vZGUpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKHV0aWwuZXNjYXBlWGh0bWwpXG4gICAgICAudGhlbihmdW5jdGlvbiAoeGh0bWwpIHtcbiAgICAgICAgcmV0dXJuICc8Zm9yZWlnbk9iamVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiPicgKyB4aHRtbCArICc8L2ZvcmVpZ25PYmplY3Q+JztcbiAgICAgIH0pXG4gICAgICAudGhlbihmdW5jdGlvbiAoZm9yZWlnbk9iamVjdCkge1xuICAgICAgICByZXR1cm4gJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiJyArIHdpZHRoICsgJ1wiIGhlaWdodD1cIicgKyBoZWlnaHQgKyAnXCI+JyArXG4gICAgICAgICAgZm9yZWlnbk9iamVjdCArICc8L3N2Zz4nO1xuICAgICAgfSlcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChzdmcpIHtcbiAgICAgICAgcmV0dXJuICdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwnICsgc3ZnO1xuICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBuZXdVdGlsKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlc2NhcGU6IGVzY2FwZSxcbiAgICAgIHBhcnNlRXh0ZW5zaW9uOiBwYXJzZUV4dGVuc2lvbixcbiAgICAgIG1pbWVUeXBlOiBtaW1lVHlwZSxcbiAgICAgIGRhdGFBc1VybDogZGF0YUFzVXJsLFxuICAgICAgaXNEYXRhVXJsOiBpc0RhdGFVcmwsXG4gICAgICBjYW52YXNUb0Jsb2I6IGNhbnZhc1RvQmxvYixcbiAgICAgIHJlc29sdmVVcmw6IHJlc29sdmVVcmwsXG4gICAgICBnZXRBbmRFbmNvZGU6IGdldEFuZEVuY29kZSxcbiAgICAgIHVpZDogdWlkKCksXG4gICAgICBkZWxheTogZGVsYXksXG4gICAgICBhc0FycmF5OiBhc0FycmF5LFxuICAgICAgZXNjYXBlWGh0bWw6IGVzY2FwZVhodG1sLFxuICAgICAgbWFrZUltYWdlOiBtYWtlSW1hZ2UsXG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBtaW1lcygpIHtcbiAgICAgIC8qXG4gICAgICAgKiBPbmx5IFdPRkYgYW5kIEVPVCBtaW1lIHR5cGVzIGZvciBmb250cyBhcmUgJ3JlYWwnXG4gICAgICAgKiBzZWUgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9tZWRpYS10eXBlcy54aHRtbFxuICAgICAgICovXG4gICAgICB2YXIgV09GRiA9ICdhcHBsaWNhdGlvbi9mb250LXdvZmYnO1xuICAgICAgdmFyIEpQRUcgPSAnaW1hZ2UvanBlZyc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgICd3b2ZmJzogV09GRixcbiAgICAgICAgJ3dvZmYyJzogV09GRixcbiAgICAgICAgJ3R0Zic6ICdhcHBsaWNhdGlvbi9mb250LXRydWV0eXBlJyxcbiAgICAgICAgJ2VvdCc6ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsXG4gICAgICAgICdwbmcnOiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgJ2pwZyc6IEpQRUcsXG4gICAgICAgICdqcGVnJzogSlBFRyxcbiAgICAgICAgJ2dpZic6ICdpbWFnZS9naWYnLFxuICAgICAgICAndGlmZic6ICdpbWFnZS90aWZmJyxcbiAgICAgICAgJ3N2Zyc6ICdpbWFnZS9zdmcreG1sJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZUV4dGVuc2lvbih1cmwpIHtcbiAgICAgIHZhciBtYXRjaCA9IC9cXC4oW15cXC5cXC9dKj8pJC9nLmV4ZWModXJsKTtcbiAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdO1xuICAgICAgZWxzZSByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWltZVR5cGUodXJsKSB7XG4gICAgICB2YXIgZXh0ZW5zaW9uID0gcGFyc2VFeHRlbnNpb24odXJsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIG1pbWVzKClbZXh0ZW5zaW9uXSB8fCAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RhdGFVcmwodXJsKSB7XG4gICAgICByZXR1cm4gdXJsLnNlYXJjaCgvXihkYXRhOikvKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9CbG9iKGNhbnZhcywgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIHZhciBiaW5hcnlTdHJpbmcgPSB3aW5kb3cuYXRvYihjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJywgb3B0aW9ucy5xdWFsaXR5IHx8IDEuMCkuc3BsaXQoJywnKVsxXSk7XG4gICAgICAgIHZhciBsZW5ndGggPSBiaW5hcnlTdHJpbmcubGVuZ3RoO1xuICAgICAgICB2YXIgYmluYXJ5QXJyYXkgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspXG4gICAgICAgICAgYmluYXJ5QXJyYXlbaV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpKTtcblxuICAgICAgICByZXNvbHZlKG5ldyBCbG9iKFtiaW5hcnlBcnJheV0sIHtcbiAgICAgICAgICB0eXBlOiAnaW1hZ2UvanBlZydcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FudmFzVG9CbG9iKGNhbnZhcywgb3B0aW9ucykge1xuICAgICAgaWYgKGNhbnZhcy50b0Jsb2IpXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGNhbnZhcy50b0Jsb2IocmVzb2x2ZSwgJ2ltYWdlL2pwZycsIG9wdGlvbnMucXVhbGl0eSB8fCAxLjApO1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRvQmxvYihjYW52YXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVVcmwodXJsLCBiYXNlVXJsKSB7XG4gICAgICB2YXIgZG9jID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICB2YXIgYmFzZSA9IGRvYy5jcmVhdGVFbGVtZW50KCdiYXNlJyk7XG4gICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChiYXNlKTtcbiAgICAgIHZhciBhID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgYmFzZS5ocmVmID0gYmFzZVVybDtcbiAgICAgIGEuaHJlZiA9IHVybDtcbiAgICAgIHJldHVybiBhLmhyZWY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdWlkKCkge1xuICAgICAgdmFyIGluZGV4ID0gMDtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICd1JyArIGZvdXJSYW5kb21DaGFycygpICsgaW5kZXgrKztcblxuICAgICAgICBmdW5jdGlvbiBmb3VyUmFuZG9tQ2hhcnMoKSB7XG4gICAgICAgICAgLyogc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzYyNDg3MjIvMjUxOTM3MyAqL1xuICAgICAgICAgIHJldHVybiAoJzAwMDAnICsgKE1hdGgucmFuZG9tKCkgKiBNYXRoLnBvdygzNiwgNCkgPDwgMCkudG9TdHJpbmcoMzYpKS5zbGljZSgtNCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUltYWdlKHVyaSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXNvbHZlKGltYWdlKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2Uub25lcnJvciA9IHJlc29sdmU7XG4gICAgICAgIGltYWdlLnNyYyA9IHVyaTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEFuZEVuY29kZSh1cmwpIHtcbiAgICAgIHZhciBUSU1FT1VUID0gMzAwMDA7XG4gICAgICBpZiAoZG9tdG9pbWFnZS5pbXBsLm9wdGlvbnMuY2FjaGVCdXN0KSB7XG4gICAgICAgIC8vIENhY2hlIGJ5cGFzcyBzbyB3ZSBkb250IGhhdmUgQ09SUyBpc3N1ZXMgd2l0aCBjYWNoZWQgaW1hZ2VzXG4gICAgICAgIC8vIFNvdXJjZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQVBJL1hNTEh0dHBSZXF1ZXN0L1VzaW5nX1hNTEh0dHBSZXF1ZXN0I0J5cGFzc2luZ190aGVfY2FjaGVcbiAgICAgICAgdXJsICs9ICgoL1xcPy8pLnRlc3QodXJsKSA/IFwiJlwiIDogXCI/XCIpICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgIH1cbiAgICAgIGlmICgvXmh0dHAvLnRlc3QodXJsKSkge1xuICAgICAgICByZXR1cm4gcmVxdWVzdFVybCh7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIG1ldGhvZDogJ0dFVCdcbiAgICAgICAgfSkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICBsZXQgYmluYXJ5ID0gJyc7XG4gICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShkYXRhLmFycmF5QnVmZmVyKTtcbiAgICAgICAgICBjb25zdCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gd2luZG93LmJ0b2EoIGJpbmFyeSApO1xuICAgICAgICAgIC8vIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAvLyBjb25zdCBlbmNvZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAvLyBlbmNvZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyAgIGNvbnN0IGNvbnRlbnQgPSBlbmNvZGVyLnJlc3VsdC5zcGxpdCgvLC8pWzFdO1xuICAgICAgICAgIC8vICAgcmVzb2x2ZShjb250ZW50KTtcbiAgICAgICAgICAvLyB9O1xuICAgICAgICAgIC8vICAgZGVidWdnZXI7XG4gICAgICAgICAgLy8gZW5jb2Rlci5yZWFkQXNEYXRhVVJMKGRhdGEpO1xuICAgICAgICAgIC8vIH0pO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Nhbm5vdCBmZXRjaCByZXNvdXJjZTogJyArIHVybCArICcsIGVycm9yOiAnICsgZXJyKTtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGRvbmU7XG4gICAgICAgIHJlcXVlc3Qub250aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSAnYmxvYic7XG4gICAgICAgIHJlcXVlc3QudGltZW91dCA9IFRJTUVPVVQ7XG4gICAgICAgIHJlcXVlc3Qub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICAgICAgcmVxdWVzdC5zZW5kKCk7XG5cbiAgICAgICAgdmFyIHBsYWNlaG9sZGVyO1xuICAgICAgICBpZiAoZG9tdG9pbWFnZS5pbXBsLm9wdGlvbnMuaW1hZ2VQbGFjZWhvbGRlcikge1xuICAgICAgICAgIHZhciBzcGxpdCA9IGRvbXRvaW1hZ2UuaW1wbC5vcHRpb25zLmltYWdlUGxhY2Vob2xkZXIuc3BsaXQoLywvKTtcbiAgICAgICAgICBpZiAoc3BsaXQgJiYgc3BsaXRbMV0pIHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gc3BsaXRbMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSByZXR1cm47XG5cbiAgICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZmFpbCgnY2Fubm90IGZldGNoIHJlc291cmNlOiAnICsgdXJsICsgJywgc3RhdHVzOiAnICsgcmVxdWVzdC5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVuY29kZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgIGVuY29kZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBlbmNvZGVyLnJlc3VsdC5zcGxpdCgvLC8pWzFdO1xuICAgICAgICAgICAgcmVzb2x2ZShjb250ZW50KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGVuY29kZXIucmVhZEFzRGF0YVVSTChyZXF1ZXN0LnJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHRpbWVvdXQoKSB7XG4gICAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICByZXNvbHZlKHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmFpbCgndGltZW91dCBvZiAnICsgVElNRU9VVCArICdtcyBvY2N1cmVkIHdoaWxlIGZldGNoaW5nIHJlc291cmNlOiAnICsgdXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBmYWlsKG1lc3NhZ2UpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgIHJlc29sdmUoJycpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXRhQXNVcmwoY29udGVudCwgdHlwZSkge1xuICAgICAgcmV0dXJuICdkYXRhOicgKyB0eXBlICsgJztiYXNlNjQsJyArIGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlKHN0cmluZykge1xuICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8XFxbXFxdXFwvXFxcXF0pL2csICdcXFxcJDEnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWxheShtcykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXNvbHZlKGFyZyk7XG4gICAgICAgICAgfSwgbXMpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXNBcnJheShhcnJheUxpa2UpIHtcbiAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5TGlrZS5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSBhcnJheS5wdXNoKGFycmF5TGlrZVtpXSk7XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlWGh0bWwoc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyMvZywgJyUyMycpLnJlcGxhY2UoL1xcbi9nLCAnJTBBJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2lkdGgobm9kZSkge1xuICAgICAgdmFyIGxlZnRCb3JkZXIgPSBweChub2RlLCAnYm9yZGVyLWxlZnQtd2lkdGgnKTtcbiAgICAgIHZhciByaWdodEJvcmRlciA9IHB4KG5vZGUsICdib3JkZXItcmlnaHQtd2lkdGgnKTtcbiAgICAgIHJldHVybiBub2RlLnNjcm9sbFdpZHRoICsgbGVmdEJvcmRlciArIHJpZ2h0Qm9yZGVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhlaWdodChub2RlKSB7XG4gICAgICB2YXIgdG9wQm9yZGVyID0gcHgobm9kZSwgJ2JvcmRlci10b3Atd2lkdGgnKTtcbiAgICAgIHZhciBib3R0b21Cb3JkZXIgPSBweChub2RlLCAnYm9yZGVyLWJvdHRvbS13aWR0aCcpO1xuICAgICAgcmV0dXJuIG5vZGUuc2Nyb2xsSGVpZ2h0ICsgdG9wQm9yZGVyICsgYm90dG9tQm9yZGVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHB4KG5vZGUsIHN0eWxlUHJvcGVydHkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpLmdldFByb3BlcnR5VmFsdWUoc3R5bGVQcm9wZXJ0eSk7XG4gICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZS5yZXBsYWNlKCdweCcsICcnKSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbmV3SW5saW5lcigpIHtcbiAgICB2YXIgVVJMX1JFR0VYID0gL3VybFxcKFsnXCJdPyhbXidcIl0rPylbJ1wiXT9cXCkvZztcblxuICAgIHJldHVybiB7XG4gICAgICBpbmxpbmVBbGw6IGlubGluZUFsbCxcbiAgICAgIHNob3VsZFByb2Nlc3M6IHNob3VsZFByb2Nlc3MsXG4gICAgICBpbXBsOiB7XG4gICAgICAgIHJlYWRVcmxzOiByZWFkVXJscyxcbiAgICAgICAgaW5saW5lOiBpbmxpbmVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gc2hvdWxkUHJvY2VzcyhzdHJpbmcpIHtcbiAgICAgIHJldHVybiBzdHJpbmcuc2VhcmNoKFVSTF9SRUdFWCkgIT09IC0xO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWRVcmxzKHN0cmluZykge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIG1hdGNoO1xuICAgICAgd2hpbGUgKChtYXRjaCA9IFVSTF9SRUdFWC5leGVjKHN0cmluZykpICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG1hdGNoWzFdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgcmV0dXJuICF1dGlsLmlzRGF0YVVybCh1cmwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5saW5lKHN0cmluZywgdXJsLCBiYXNlVXJsLCBnZXQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXJsKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgICAgcmV0dXJuIGJhc2VVcmwgPyB1dGlsLnJlc29sdmVVcmwodXJsLCBiYXNlVXJsKSA6IHVybDtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oZ2V0IHx8IHV0aWwuZ2V0QW5kRW5jb2RlKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIHJldHVybiB1dGlsLmRhdGFBc1VybChkYXRhLCB1dGlsLm1pbWVUeXBlKHVybCkpO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YVVybCkge1xuICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSh1cmxBc1JlZ2V4KHVybCksICckMScgKyBkYXRhVXJsICsgJyQzJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiB1cmxBc1JlZ2V4KHVybCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCgnKHVybFxcXFwoW1xcJ1wiXT8pKCcgKyB1dGlsLmVzY2FwZSh1cmwpICsgJykoW1xcJ1wiXT9cXFxcKSknLCAnZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlubGluZUFsbChzdHJpbmcsIGJhc2VVcmwsIGdldCkge1xuICAgICAgaWYgKG5vdGhpbmdUb0lubGluZSgpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0cmluZyk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3RyaW5nKVxuICAgICAgICAudGhlbihyZWFkVXJscylcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHVybHMpIHtcbiAgICAgICAgICB2YXIgZG9uZSA9IFByb21pc2UucmVzb2x2ZShzdHJpbmcpO1xuICAgICAgICAgIHVybHMuZm9yRWFjaChmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgICAgICBkb25lID0gZG9uZS50aGVuKGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGlubGluZShzdHJpbmcsIHVybCwgYmFzZVVybCwgZ2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBkb25lO1xuICAgICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gbm90aGluZ1RvSW5saW5lKCkge1xuICAgICAgICByZXR1cm4gIXNob3VsZFByb2Nlc3Moc3RyaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBuZXdGb250RmFjZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc29sdmVBbGw6IHJlc29sdmVBbGwsXG4gICAgICBpbXBsOiB7XG4gICAgICAgIHJlYWRBbGw6IHJlYWRBbGxcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZUFsbCgpIHtcbiAgICAgIHJldHVybiByZWFkQWxsKGRvY3VtZW50KVxuICAgICAgICAudGhlbihmdW5jdGlvbiAod2ViRm9udHMpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB3ZWJGb250cy5tYXAoZnVuY3Rpb24gKHdlYkZvbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHdlYkZvbnQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihmdW5jdGlvbiAoY3NzU3RyaW5ncykge1xuICAgICAgICAgIHJldHVybiBjc3NTdHJpbmdzLmpvaW4oJ1xcbicpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWFkQWxsKCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1dGlsLmFzQXJyYXkoZG9jdW1lbnQuc3R5bGVTaGVldHMpKVxuICAgICAgICAudGhlbihnZXRDc3NSdWxlcylcbiAgICAgICAgLnRoZW4oc2VsZWN0V2ViRm9udFJ1bGVzKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAocnVsZXMpIHtcbiAgICAgICAgICByZXR1cm4gcnVsZXMubWFwKG5ld1dlYkZvbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gc2VsZWN0V2ViRm9udFJ1bGVzKGNzc1J1bGVzKSB7XG4gICAgICAgIHJldHVybiBjc3NSdWxlc1xuICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBydWxlLnR5cGUgPT09IENTU1J1bGUuRk9OVF9GQUNFX1JVTEU7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5saW5lci5zaG91bGRQcm9jZXNzKHJ1bGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnc3JjJykpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBnZXRDc3NSdWxlcyhzdHlsZVNoZWV0cykge1xuICAgICAgICB2YXIgY3NzUnVsZXMgPSBbXTtcbiAgICAgICAgc3R5bGVTaGVldHMuZm9yRWFjaChmdW5jdGlvbiAoc2hlZXQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdXRpbC5hc0FycmF5KHNoZWV0LmNzc1J1bGVzIHx8IFtdKS5mb3JFYWNoKGNzc1J1bGVzLnB1c2guYmluZChjc3NSdWxlcykpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB3aGlsZSByZWFkaW5nIENTUyBydWxlcyBmcm9tICcgKyBzaGVldC5ocmVmLCBlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjc3NSdWxlcztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbmV3V2ViRm9udCh3ZWJGb250UnVsZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoKSB7XG4gICAgICAgICAgICB2YXIgYmFzZVVybCA9ICh3ZWJGb250UnVsZS5wYXJlbnRTdHlsZVNoZWV0IHx8IHt9KS5ocmVmO1xuICAgICAgICAgICAgcmV0dXJuIGlubGluZXIuaW5saW5lQWxsKHdlYkZvbnRSdWxlLmNzc1RleHQsIGJhc2VVcmwpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc3JjOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gd2ViRm9udFJ1bGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnc3JjJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG5ld0ltYWdlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5saW5lQWxsOiBpbmxpbmVBbGwsXG4gICAgICBpbXBsOiB7XG4gICAgICAgIG5ld0ltYWdlOiBuZXdJbWFnZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBuZXdJbWFnZShlbGVtZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmxpbmU6IGlubGluZVxuICAgICAgfTtcblxuICAgICAgZnVuY3Rpb24gaW5saW5lKGdldCkge1xuICAgICAgICBpZiAodXRpbC5pc0RhdGFVcmwoZWxlbWVudC5zcmMpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlbGVtZW50LnNyYylcbiAgICAgICAgICAudGhlbihnZXQgfHwgdXRpbC5nZXRBbmRFbmNvZGUpXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlsLmRhdGFBc1VybChkYXRhLCB1dGlsLm1pbWVUeXBlKGVsZW1lbnQuc3JjKSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YVVybCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgICAgICAgICBlbGVtZW50Lm9uZXJyb3IgPSByZXNvbHZlO1xuICAgICAgICAgICAgICBlbGVtZW50LnNyYyA9IGRhdGFVcmw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbmxpbmVBbGwobm9kZSkge1xuICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGUpO1xuXG4gICAgICByZXR1cm4gaW5saW5lQmFja2dyb3VuZChub2RlKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KVxuICAgICAgICAgICAgcmV0dXJuIG5ld0ltYWdlKG5vZGUpLmlubGluZSgpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgdXRpbC5hc0FycmF5KG5vZGUuY2hpbGROb2RlcykubWFwKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVBbGwoY2hpbGQpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGlubGluZUJhY2tncm91bmQobm9kZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBiYWNrZ3JvdW5kID0gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFiYWNrZ3JvdW5kKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGUpO1xuXG4gICAgICAgIHJldHVybiBpbmxpbmVyLmlubGluZUFsbChiYWNrZ3JvdW5kKVxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChpbmxpbmVkKSB7XG4gICAgICAgICAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KFxuICAgICAgICAgICAgICAnYmFja2dyb3VuZCcsXG4gICAgICAgICAgICAgIGlubGluZWQsXG4gICAgICAgICAgICAgIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eSgnYmFja2dyb3VuZCcpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbm1vZHVsZS5leHBvcnRzID0gZG9tdG9pbWFnZTtcbiIsICJpbXBvcnQgRXhwb3J0SW1hZ2VQbHVnaW4gZnJvbSAnLi9FeHBvcnRJbWFnZVBsdWdpbic7XG5cbmV4cG9ydCBkZWZhdWx0IEV4cG9ydEltYWdlUGx1Z2luO1xuIiwgImltcG9ydCB7IEVkaXRvciwgTWFya2Rvd25WaWV3LCBNYXJrZG93blByZXZpZXdWaWV3LCBNYXJrZG93blJlbmRlcmVyLCBOb3RpY2UsIFBsdWdpbiB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHsgRXhwb3J0SW1hZ2VTZXR0aW5nVGFiIH0gZnJvbSAnLi9FeHBvcnRJbWFnZVNldHRpbmdUYWInO1xuaW1wb3J0IHsgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gXCIuL2NvbnN0ZW50c1wiO1xuaW1wb3J0IHsgY2xvbmVOb2RlLCB0b0Jsb2JXaXRoQ2xvbmVkRG9tIH0gZnJvbSAnZG9tLXRvLWltYWdlJztcblxuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dW5kZWZpbmVkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH0sIG1zKTtcbiAgfSk7XG59XG5cblxuYXN5bmMgZnVuY3Rpb24gY2xvbmVEb20oZWw6SFRNTEVsZW1lbnQsIG1hcmtkb3duVmlldzpNYXJrZG93blZpZXcpOiBQcm9taXNlPEhUTUxFbGVtZW50PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGVsLnBhcmVudEVsZW1lbnQhO1xuICBjb25zdCBzY3JvbGxDYWNoZSA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XG4gIGNvbnRhaW5lci5zY3JvbGxUbygwLCAwKTtcbiAgZWwuYWRkQ2xhc3MoJ2VweG9ydC1pbWFnZS1mb3JjZS1uby1tYXJnaW4nKTtcbiAgYXdhaXQgZGVsYXkoNDApO1xuICBjb25zdCB0b3RhbEhlaWdodCA9IGVsLmNsaWVudEhlaWdodDtcbiAgY29uc3Qgc2NyZWVuSGVpZ2h0ID0gbWFya2Rvd25WaWV3LmNvbnRlbnRFbC5jbGllbnRIZWlnaHQ7XG4gIGxldCBzY3JvbGxJbmRleCA9IDA7XG4gIGxldCBoZWlnaHQgPSBlbC5jbGllbnRIZWlnaHQgLSBwYXJzZUZsb2F0KGVsLnN0eWxlLnBhZGRpbmdCb3R0b20pICsgNDA7XG4gIGNvbnNvbGUubG9nKCdzY29sbEhlaWdodDonLCBoZWlnaHQpO1xuICBjb25zdCBjbG9uZSA9IGF3YWl0IGNsb25lTm9kZShlbCk7XG4gIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoYXN5bmMgcmVjb3JkcyA9PiB7XG4gICAgZm9yIChsZXQgciBvZiByZWNvcmRzKSB7XG4gICAgICBmb3IgKGxldCBub2RlIG9mIEFycmF5LmZyb20oci5hZGRlZE5vZGVzKSkge1xuICAgICAgICBjbG9uZS5hcHBlbmQoYXdhaXQgY2xvbmVOb2RlKG5vZGUgYXMgSFRNTEVsZW1lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBvYnNlcnZlci5vYnNlcnZlKGVsLCB7XG4gICAgY2hpbGRMaXN0OiB0cnVlXG4gIH0pO1xuICB3aGlsZSAoc2Nyb2xsSW5kZXggPD0gdG90YWxIZWlnaHQgLSBzY3JlZW5IZWlnaHQpIHtcbiAgICBzY3JvbGxJbmRleCArPSBzY3JlZW5IZWlnaHQ7XG4gICAgY29udGFpbmVyLnNjcm9sbFRvKDAsIHNjcm9sbEluZGV4KTtcbiAgICBhd2FpdCBkZWxheSg0MCk7XG4gIH1cbiAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICBjb250YWluZXIuc2Nyb2xsVG8oMCwgc2Nyb2xsQ2FjaGUpO1xuICBjbG9uZS5hZGRDbGFzcygnZXhwb3J0LWltYWdlLWNsb25lJyk7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICBjb25zb2xlLmxvZyhjbG9uZS5jbGllbnRXaWR0aCwgY2xvbmUuY2xpZW50SGVpZ2h0KTtcbiAgZWwucmVtb3ZlQ2xhc3MoJ2VweG9ydC1pbWFnZS1mb3JjZS1uby1tYXJnaW4nKTtcbiAgcmV0dXJuIGNsb25lO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXhwb3J0SW1hZ2VQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBzZXR0aW5nczogRXhwb3J0SW1hZ2VTZXR0aW5ncztcblxuICBhc3luYyBvbmxvYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcblxuXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgIGlkOiAnZXhwb3J0LXRvLWltYWdlLXpoJyxcbiAgICAgIG5hbWU6ICdFeHBvcnQgdG8gaW1hZ2UnLFxuICAgICAgY2hlY2tDYWxsYmFjazogKGNoZWNraW5nOiBib29sZWFuKSA9PiB7XG4gICAgICAgIC8vIENvbmRpdGlvbnMgdG8gY2hlY2tcbiAgICAgICAgY29uc3QgbWFya2Rvd25WaWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICAgICAgaWYgKG1hcmtkb3duVmlldz8uZ2V0TW9kZSgpID09PSAncHJldmlldycpIHtcbiAgICAgICAgICAvLyBJZiBjaGVja2luZyBpcyB0cnVlLCB3ZSdyZSBzaW1wbHkgXCJjaGVja2luZ1wiIGlmIHRoZSBjb21tYW5kIGNhbiBiZSBydW4uXG4gICAgICAgICAgLy8gSWYgY2hlY2tpbmcgaXMgZmFsc2UsIHRoZW4gd2Ugd2FudCB0byBhY3R1YWxseSBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICAgICAgaWYgKCFjaGVja2luZykge1xuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZWwgPSBtYXJrZG93blZpZXcuY29udGVudEVsLmZpbmQoJy5tYXJrZG93bi1wcmV2aWV3LXNlY3Rpb24nKTtcbiAgICAgICAgICAgICAgY29uc3QgY2xvbmUgPSBhd2FpdCBjbG9uZURvbShlbCwgbWFya2Rvd25WaWV3KTtcbiAgICAgICAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHRvQmxvYldpdGhDbG9uZWREb20oZWwsIGNsb25lLCB7XG4gICAgICAgICAgICAgICAgLy8gd2lkdGg6IHdpZHRoICogMixcbiAgICAgICAgICAgICAgICAvLyBoZWlnaHQ6IGhlaWdodCAqIDIsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGNsb25lLmNsaWVudFdpZHRoICogMixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGNsb25lLmNsaWVudEhlaWdodCAqIDIsXG4gICAgICAgICAgICAgICAgYmdjb2xvcjogd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwuY2xvc2VzdCgnLnZpZXctY29udGVudCcpISkuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgICAgIHF1YWxpdHk6IDAuOSxcbiAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMiknLFxuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjbG9uZSk7XG4gICAgICAgICAgICAgIHNhdmVBcyhibG9iLCBgJHttYXJrZG93blZpZXcuZ2V0RGlzcGxheVRleHQoKS5yZXBsYWNlKC9cXHMrL2csICdfJyl9LmpwZ2ApO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGlzIGNvbW1hbmQgd2lsbCBvbmx5IHNob3cgdXAgaW4gQ29tbWFuZCBQYWxldHRlIHdoZW4gdGhlIGNoZWNrIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cblxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICBpZDogJ2NvcHktYXMtaW1hZ2UtemgnLFxuICAgICAgbmFtZTogJ0NvcHkgYXMgaW1hZ2UnLFxuICAgICAgY2hlY2tDYWxsYmFjazogKGNoZWNraW5nOiBib29sZWFuKSA9PiB7XG4gICAgICAgIC8vIENvbmRpdGlvbnMgdG8gY2hlY2tcbiAgICAgICAgY29uc3QgbWFya2Rvd25WaWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICAgICAgaWYgKG1hcmtkb3duVmlldz8uZ2V0TW9kZSgpID09PSAncHJldmlldycpIHtcbiAgICAgICAgICAvLyBJZiBjaGVja2luZyBpcyB0cnVlLCB3ZSdyZSBzaW1wbHkgXCJjaGVja2luZ1wiIGlmIHRoZSBjb21tYW5kIGNhbiBiZSBydW4uXG4gICAgICAgICAgLy8gSWYgY2hlY2tpbmcgaXMgZmFsc2UsIHRoZW4gd2Ugd2FudCB0byBhY3R1YWxseSBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICAgICAgaWYgKCFjaGVja2luZykge1xuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZWwgPSBtYXJrZG93blZpZXcuY29udGVudEVsLmZpbmQoJy5tYXJrZG93bi1wcmV2aWV3LXNlY3Rpb24nKTtcbiAgICAgICAgICAgICAgY29uc3QgY2xvbmUgPSBhd2FpdCBjbG9uZURvbShlbCwgbWFya2Rvd25WaWV3KTtcbiAgICAgICAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHRvQmxvYldpdGhDbG9uZWREb20oZWwsIGNsb25lLCB7XG4gICAgICAgICAgICAgICAgLy8gd2lkdGg6IHdpZHRoICogMixcbiAgICAgICAgICAgICAgICAvLyBoZWlnaHQ6IGhlaWdodCAqIDIsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGNsb25lLmNsaWVudFdpZHRoICogMixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGNsb25lLmNsaWVudEhlaWdodCAqIDIsXG4gICAgICAgICAgICAgICAgYmdjb2xvcjogd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwuY2xvc2VzdCgnLnZpZXctY29udGVudCcpISkuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgICAgIHF1YWxpdHk6IDAuOSxcbiAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMiknLFxuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjbG9uZSk7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBbXG4gICAgICAgICAgICAgICAgbmV3IENsaXBib2FyZEl0ZW0oe1xuICAgICAgICAgICAgICAgICAgW2Jsb2IudHlwZV06IGJsb2IsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGUoZGF0YSlcbiAgICAgICAgICAgICAgbmV3IE5vdGljZSgnQ29waWVkIScpO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGlzIGNvbW1hbmQgd2lsbCBvbmx5IHNob3cgdXAgaW4gQ29tbWFuZCBQYWxldHRlIHdoZW4gdGhlIGNoZWNrIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIG9udW5sb2FkKCkge1xuICB9XG5cbiAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xuICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG4gIH1cbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvcHJlZmVyLWRlZmF1bHQtZXhwb3J0ICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogRXhwb3J0SW1hZ2VTZXR0aW5ncyA9IHtcbiAgd2lkdGg6ICc0MDAnLFxufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxpQkFBYyxJQUFNLElBQU07QUFBQSxlQUNKLEFBQWhCLE9BQU8sTUFBUyxjQUFhLEtBQU8sRUFBRSxTQUFPLE1BQVQsSUFDZixBQUFoQixPQUFPLE1BQVMsWUFDdkIsU0FBUSxLQUFLLG9EQUFiLEdBQ0EsS0FBTyxFQUFFLFNBQVMsQ0FBQyxHQUFaLElBS0wsR0FBSyxXQUFXLDZFQUE2RSxLQUFLLEdBQUssSUFBdkYsSUFDWCxJQUFJLEtBQUssQ0FBQSxVQUE4QixFQUE5QixHQUFxQyxFQUFFLE1BQU0sR0FBSyxLQUFiLENBQTlDLElBRUY7TUFDUjtBQUVELGlCQUFtQixJQUFLLElBQU0sSUFBTTtBQUNsQyxZQUFJLEtBQU0sSUFBSTtBQUNkLFdBQUksS0FBSyxPQUFP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