UNPKG

site-metadata-extractor

Version:
270 lines 34.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.sanitizeJsonLdString = void 0; const cheerio_1 = __importDefault(require("cheerio")); function cleanArticleTags(doc) { const articles = doc("article"); articles.each((_index, element) => { doc(element).removeAttr("id"); doc(element).removeAttr("name"); doc(element).removeAttr("class"); }); return doc; } function cleanBadTags(doc) { const removeNodesRe = "^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|partner-gravity-ad|video-full-transcript|storytopbar-bucket|utility-bar|inline-share-tools|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|cnn_html_slideshow|cnn_strylftcntnt|links|meta$|shoutbox|sponsor|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers|communitypromo|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text|legende|ajoutVideo|timestamp|js_replies"; const regex = new RegExp(removeNodesRe, "i"); const toRemove = doc("*").filter((_index, el) => { const idEl = doc(el).attr("id"); const classEl = doc(el).attr("class"); const nameEl = doc(el).attr("name"); if (idEl) { return idEl.match(regex) !== null; } else if (classEl) { return classEl.match(regex) !== null; } else if (nameEl) { return nameEl.match(regex) !== null; } return false; }); doc(toRemove).remove(); return doc; } function cleanCodeBlocks(doc) { const nodes = doc("[class*='highlight-'], pre code, code, pre, ul.task-list"); nodes.each((_index, element) => { doc(element).replaceWith(doc(element).text()); }); return doc; } function cleanEmTags(doc) { const ems = doc("em"); ems.each((_index, element) => { const images = ems.find("img"); if (images.length === 0) { const htmlEl = doc(element).html(); if (htmlEl) { doc(element).replaceWith(htmlEl); } } }); return doc; } function cleanErrantLineBreaks(doc) { doc("p").each((_index, element) => { const node = doc(element); const contents = node.contents(); doc(contents).each((_cindex, cElement) => { const contentsNode = doc(cElement); if (contentsNode && contentsNode[0] && contentsNode[0].type === "text") { contentsNode.replaceWith(contentsNode.text().replace(/([^\n])\n([^\n])/g, "$1 $2")); } }); }); return doc; } function cleanParaSpans(doc) { const nodes = doc("p span"); nodes.each((_index, element) => { const htmlEl = doc(element).html(); if (htmlEl) { doc(element).replaceWith(htmlEl); } }); return doc; } function cleanUnderlines(doc) { const nodes = doc("u"); nodes.each((_index, element) => { const htmlEl = doc(element).html(); if (htmlEl) { doc(element).replaceWith(htmlEl); } }); return doc; } function divToPara(doc, domType) { const divs = doc(domType); const tags = [ "a", "blockquote", "dl", "div", "img", "ol", "p", "pre", "table", "ul", ]; divs.each((_index, element) => { const div = doc(element); const items = div.find(tags.join(", ")); if (items.length === 0) { replaceWithPara(doc, element); } else { const replaceNodes = getReplacementNodes(doc, div); let html = ""; replaceNodes.forEach((node) => { if (node.text() !== "") { html += `<p>${node}</p>`; } }); div.empty(); doc(div).replaceWith(`${html}`); } }); return doc; } function getReplacementNodes(doc, div) { let replacementText = []; const nodesToReturn = []; const nodesToRemove = []; const children = div.contents(); children.each((_index, element) => { const child = doc(element); if (child.get(0) && child.get(0).tagName === "p" && replacementText.length > 0) { const text = replacementText.join(""); const textNodeLoad = cheerio_1.default.load(`<p>${text}</p>`); const textNode = doc(textNodeLoad); // create a node out of text and push nodesToReturn.push(textNode); replacementText = []; const childEl = doc(element); if (childEl) { nodesToReturn.push(childEl); } } else if (child.get(0) && child.get(0).type === "text") { const childTextNode = child; const childText = child.text(); const replaceText = childText .replace(/\n/g, "\n\n") .replace(/\t/g, "") .replace(/^\s+$/g, ""); if (replaceText.length > 1) { let previousSiblingNode = childTextNode.prev(); while (previousSiblingNode.get(0) && previousSiblingNode.get(0).tagName === "a" && previousSiblingNode.attr("grv-usedalready") !== "yes") { const outer = " " + doc.html(previousSiblingNode) + " "; replacementText.push(outer); nodesToRemove.push(previousSiblingNode); previousSiblingNode.attr("grv-usedalready", "yes"); previousSiblingNode = previousSiblingNode.prev(); } replacementText.push(replaceText); const nextSiblingNode = childTextNode.next(); while (nextSiblingNode.get(0) && nextSiblingNode.get(0).tagName === "a" && nextSiblingNode.attr("grv-usedalready") !== "yes") { const outer = " " + doc.html(nextSiblingNode) + " "; replacementText.push(outer); nodesToRemove.push(nextSiblingNode); nextSiblingNode.attr("grv-usedalready", "yes"); previousSiblingNode = nextSiblingNode.next(); } } // otherwise } else { const childEl = doc(child); if (childEl) { nodesToReturn.push(childEl); } } }); // flush out anything still remaining if (replacementText.length > 0) { const text = replacementText.join(""); const textNodeLoad = cheerio_1.default.load(`<p>${text}</p>`); const textNode = doc(textNodeLoad); nodesToReturn.push(textNode); replacementText = []; } nodesToRemove.forEach((node) => { doc(node).remove(); }); return nodesToReturn; } function removeBodyClasses(doc) { doc("body").removeClass(); return doc; } function removeDropCaps(doc) { const nodes = doc("span[class~=dropcap], span[class~=drop_cap]"); nodes.each((_index, element) => { const htmlEl = doc(element).html(); if (htmlEl) { doc(element).replaceWith(htmlEl); } }); return doc; } function removeNodesRegex(doc, pattern) { const toRemove = doc("div").filter((_index, element) => { const idEl = doc(element).attr("id"); const classEl = doc(element).attr("class"); if (idEl) { return idEl.match(pattern) !== null; } else if (classEl) { return classEl.match(pattern) !== null; } return false; }); doc(toRemove).remove(); return doc; } function removeScriptsStyles(doc) { doc("script").remove(); doc("style").remove(); const comments = doc("*") .contents() .filter((_index, element) => { return element.type === "comment"; }); return doc(comments).remove(); } function replaceWithPara(doc, div) { const divContent = doc(div).html(); doc(div).replaceWith(`<p>${divContent}</p>`); return doc; } const cleaner = (doc) => { removeBodyClasses(doc); cleanArticleTags(doc); cleanEmTags(doc); cleanCodeBlocks(doc); removeDropCaps(doc); removeScriptsStyles(doc); cleanBadTags(doc); removeNodesRegex(doc, /^caption$/); removeNodesRegex(doc, / google /); removeNodesRegex(doc, /^[^entry-]more.*$/); removeNodesRegex(doc, /[^-]facebook/); removeNodesRegex(doc, /facebook-broadcasting/); removeNodesRegex(doc, /[^-]twitter/); cleanParaSpans(doc); cleanUnderlines(doc); cleanErrantLineBreaks(doc); divToPara(doc, "div"); divToPara(doc, "span"); return doc; }; // Sanitization function to remove HTML/XML tags const sanitizeJsonLdString = (jsonLdString) => { // Remove anything that looks like an HTML/XML tag (this is a basic example, might need adjustments) return jsonLdString.replace(/<\/?[^>]+(>|$)/g, "").trim(); }; exports.sanitizeJsonLdString = sanitizeJsonLdString; exports.default = cleaner; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGVhbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHNEQUE4QjtBQUU5QixTQUFTLGdCQUFnQixDQUFDLEdBQWlCO0lBQ3pDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBYyxFQUFFLE9BQXdCLEVBQUUsRUFBRTtRQUN6RCxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEdBQWlCO0lBQ3JDLE1BQU0sYUFBYSxHQUNqQixpcEJBQWlwQixDQUFDO0lBQ3BwQixNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFN0MsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUM5QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNw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QUMsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQztBQUVGLGdEQUFnRDtBQUN6QyxNQUFNLG9CQUFvQixHQUFHLENBQUMsWUFBb0IsRUFBVSxFQUFFO0lBQ25FLG9HQUFvRztJQUNwRyxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDNUQsQ0FBQyxDQUFDO0FBSFcsUUFBQSxvQkFBb0Isd0JBRy9CO0FBRUYsa0JBQWUsT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoZWVyaW8gZnJvbSBcImNoZWVyaW9cIjtcblxuZnVuY3Rpb24gY2xlYW5BcnRpY2xlVGFncyhkb2M6IGNoZWVyaW8uUm9vdCkge1xuICBjb25zdCBhcnRpY2xlcyA9IGRvYyhcImFydGljbGVcIik7XG4gIGFydGljbGVzLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBjaGVlcmlvLkVsZW1lbnQpID0+IHtcbiAgICBkb2MoZWxlbWVudCkucmVtb3ZlQXR0cihcImlkXCIpO1xuICAgIGRvYyhlbGVtZW50KS5yZW1vdmVBdHRyKFwibmFtZVwiKTtcbiAgICBkb2MoZWxlbWVudCkucmVtb3ZlQXR0cihcImNsYXNzXCIpO1xuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5CYWRUYWdzKGRvYzogY2hlZXJpby5Sb290KSB7XG4gIGNvbnN0IHJlbW92ZU5vZGVzUmUgPVxuICAgIFwiXnNpZGUkfGNvbWJ4fHJldHdlZXR8bWVkaWFhcnRpY2xlcmVsYXRlZHxtZW51Y29udGFpbmVyfG5hdmJhcnxwYXJ0bmVyLWdyYXZpdHktYWR8dmlkZW8tZnVsbC10cmFuc2NyaXB0fHN0b3J5dG9wYmFyLWJ1Y2tldHx1dGlsaXR5LWJhcnxpbmxpbmUtc2hhcmUtdG9vbHN8Y29tbWVudHxQb3B1bGFyUXVlc3Rpb25zfGNvbnRhY3R8Zm9vdHxmb290ZXJ8Rm9vdGVyfGZvb3Rub3RlfGNubl9zdHJ5Y2FwdGlvbnR4dHxjbm5faHRtbF9zbGlkZXNob3d8Y25uX3N0cnlsZnRjbnRudHxsaW5rc3xtZXRhJHxzaG91dGJveHxzcG9uc29yfHRhZ3N8c29jaWFsbmV0d29ya2luZ3xzb2NpYWxOZXR3b3JraW5nfGNublN0cnlIZ2hMZ2h0fGNubl9zdHJ5c3BjdmJ4fF5pbnNldCR8cGFnZXRvb2xzfHBvc3QtYXR0cmlidXRlc3x3ZWxjb21lX2Zvcm18Y29udGVudFRvb2xzMnx0aGVfYW5zd2Vyc3xjb21tdW5pdHlwcm9tb3xydW5hcm91bmRMZWZ0fHN1YnNjcmliZXx2Y2FyZHxhcnRpY2xlaGVhZGluZ3N8ZGF0ZXxecHJpbnQkfHBvcHVwfGF1dGhvci1kcm9wZG93bnx0b29sc3xzb2NpYWx0b29sc3xieWxpbmV8a29uYWZpbHRlcnxLb25hRmlsdGVyfGJyZWFkY3J1bWJzfF5mbiR8d3AtY2FwdGlvbi10ZXh0fGxlZ2VuZGV8YWpvdXRWaWRlb3x0aW1lc3RhbXB8anNfcmVwbGllc1wiO1xuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocmVtb3ZlTm9kZXNSZSwgXCJpXCIpO1xuXG4gIGNvbnN0IHRvUmVtb3ZlID0gZG9jKFwiKlwiKS5maWx0ZXIoKF9pbmRleCwgZWwpID0+IHtcbiAgICBjb25zdCBpZEVsID0gZG9jKGVsKS5hdHRyKFwiaWRcIik7XG4gICAgY29uc3QgY2xhc3NFbCA9IGRvYyhlbCkuYXR0cihcImNsYXNzXCIpO1xuICAgIGNvbnN0IG5hbWVFbCA9IGRvYyhlbCkuYXR0cihcIm5hbWVcIik7XG4gICAgaWYgKGlkRWwpIHtcbiAgICAgIHJldHVybiBpZEVsLm1hdGNoKHJlZ2V4KSAhPT0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGNsYXNzRWwpIHtcbiAgICAgIHJldHVybiBjbGFzc0VsLm1hdGNoKHJlZ2V4KSAhPT0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKG5hbWVFbCkge1xuICAgICAgcmV0dXJuIG5hbWVFbC5tYXRjaChyZWdleCkgIT09IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgZG9jKHRvUmVtb3ZlKS5yZW1vdmUoKTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5Db2RlQmxvY2tzKGRvYzogY2hlZXJpby5Sb290KSB7XG4gIGNvbnN0IG5vZGVzID0gZG9jKFwiW2NsYXNzKj0naGlnaGxpZ2h0LSddLCBwcmUgY29kZSwgY29kZSwgcHJlLCB1bC50YXNrLWxpc3RcIik7XG4gIG5vZGVzLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBjaGVlcmlvLkVsZW1lbnQpID0+IHtcbiAgICBkb2MoZWxlbWVudCkucmVwbGFjZVdpdGgoZG9jKGVsZW1lbnQpLnRleHQoKSk7XG4gIH0pO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiBjbGVhbkVtVGFncyhkb2M6IGNoZWVyaW8uUm9vdCkge1xuICBjb25zdCBlbXMgPSBkb2MoXCJlbVwiKTtcbiAgZW1zLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBjaGVlcmlvLkVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBpbWFnZXMgPSBlbXMuZmluZChcImltZ1wiKTtcbiAgICBpZiAoaW1hZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgaHRtbEVsID0gZG9jKGVsZW1lbnQpLmh0bWwoKTtcbiAgICAgIGlmIChodG1sRWwpIHtcbiAgICAgICAgZG9jKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGh0bWxFbCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5FcnJhbnRMaW5lQnJlYWtzKGRvYzogY2hlZXJpby5Sb290KSB7XG4gIGRvYyhcInBcIikuZWFjaCgoX2luZGV4OiBudW1iZXIsIGVsZW1lbnQ6IGNoZWVyaW8uRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBkb2MoZWxlbWVudCk7XG4gICAgY29uc3QgY29udGVudHMgPSBub2RlLmNvbnRlbnRzKCk7XG5cbiAgICBkb2MoY29udGVudHMpLmVhY2goKF9jaW5kZXg6IG51bWJlciwgY0VsZW1lbnQ6IGNoZWVyaW8uRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgY29udGVudHNOb2RlID0gZG9jKGNFbGVtZW50KTtcbiAgICAgIGlmIChjb250ZW50c05vZGUgJiYgY29udGVudHNOb2RlWzBdICYmIGNvbnRlbnRzTm9kZVswXS50eXBlID09PSBcInRleHRcIikge1xuICAgICAgICBjb250ZW50c05vZGUucmVwbGFjZVdpdGgoXG4gICAgICAgICAgY29udGVudHNOb2RlLnRleHQoKS5yZXBsYWNlKC8oW15cXG5dKVxcbihbXlxcbl0pL2csIFwiJDEgJDJcIiksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiBjbGVhblBhcmFTcGFucyhkb2M6IGNoZWVyaW8uUm9vdCkge1xuICBjb25zdCBub2RlcyA9IGRvYyhcInAgc3BhblwiKTtcbiAgbm9kZXMuZWFjaCgoX2luZGV4OiBudW1iZXIsIGVsZW1lbnQ6IGNoZWVyaW8uRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGh0bWxFbCA9IGRvYyhlbGVtZW50KS5odG1sKCk7XG4gICAgaWYgKGh0bWxFbCkge1xuICAgICAgZG9jKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGh0bWxFbCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5VbmRlcmxpbmVzKGRvYzogY2hlZXJpby5Sb290KSB7XG4gIGNvbnN0IG5vZGVzID0gZG9jKFwidVwiKTtcbiAgbm9kZXMuZWFjaCgoX2luZGV4OiBudW1iZXIsIGVsZW1lbnQ6IGNoZWVyaW8uRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGh0bWxFbCA9IGRvYyhlbGVtZW50KS5odG1sKCk7XG4gICAgaWYgKGh0bWxFbCkge1xuICAgICAgZG9jKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGh0bWxFbCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gZGl2VG9QYXJhKGRvYzogY2hlZXJpby5Sb290LCBkb21UeXBlOiBzdHJpbmcpIHtcbiAgY29uc3QgZGl2cyA9IGRvYyhkb21UeXBlKTtcblxuICBjb25zdCB0YWdzID0gW1xuICAgIFwiYVwiLFxuICAgIFwiYmxvY2txdW90ZVwiLFxuICAgIFwiZGxcIixcbiAgICBcImRpdlwiLFxuICAgIFwiaW1nXCIsXG4gICAgXCJvbFwiLFxuICAgIFwicFwiLFxuICAgIFwicHJlXCIsXG4gICAgXCJ0YWJsZVwiLFxuICAgIFwidWxcIixcbiAgXTtcblxuICBkaXZzLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBjaGVlcmlvLkVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBkaXYgPSBkb2MoZWxlbWVudCk7XG4gICAgY29uc3QgaXRlbXMgPSBkaXYuZmluZCh0YWdzLmpvaW4oXCIsIFwiKSk7XG5cbiAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXBsYWNlV2l0aFBhcmEoZG9jLCBlbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVwbGFjZU5vZGVzID0gZ2V0UmVwbGFjZW1lbnROb2Rlcyhkb2MsIGRpdik7XG5cbiAgICAgIGxldCBodG1sID0gXCJcIjtcbiAgICAgIHJlcGxhY2VOb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIGlmIChub2RlLnRleHQoKSAhPT0gXCJcIikge1xuICAgICAgICAgIGh0bWwgKz0gYDxwPiR7bm9kZX08L3A+YDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGRpdi5lbXB0eSgpO1xuICAgICAgZG9jKGRpdikucmVwbGFjZVdpdGgoYCR7aHRtbH1gKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiBnZXRSZXBsYWNlbWVudE5vZGVzKFxuICBkb2M6IGNoZWVyaW8uUm9vdCxcbiAgZGl2OiBjaGVlcmlvLkNoZWVyaW8sXG4pOiBjaGVlcmlvLkNoZWVyaW9bXSB7XG4gIGxldCByZXBsYWNlbWVudFRleHQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IG5vZGVzVG9SZXR1cm46IGNoZWVyaW8uQ2hlZXJpb1tdID0gW107XG4gIGNvbnN0IG5vZGVzVG9SZW1vdmU6IGNoZWVyaW8uQ2hlZXJpb1tdID0gW107XG4gIGNvbnN0IGNoaWxkcmVuID0gZGl2LmNvbnRlbnRzKCk7XG5cbiAgY2hpbGRyZW4uZWFjaCgoX2luZGV4OiBudW1iZXIsIGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGRvYyhlbGVtZW50KTtcblxuICAgIGlmIChcbiAgICAgIGNoaWxkLmdldCgwKSAmJlxuICAgICAgY2hpbGQuZ2V0KDApLnRhZ05hbWUgPT09IFwicFwiICYmXG4gICAgICByZXBsYWNlbWVudFRleHQubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgY29uc3QgdGV4dCA9IHJlcGxhY2VtZW50VGV4dC5qb2luKFwiXCIpO1xuICAgICAgY29uc3QgdGV4dE5vZGVMb2FkID0gY2hlZXJpby5sb2FkKGA8cD4ke3RleHR9PC9wPmApO1xuICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2ModGV4dE5vZGVMb2FkKTtcbiAgICAgIC8vIGNyZWF0ZSBhIG5vZGUgb3V0IG9mIHRleHQgYW5kIHB1c2hcbiAgICAgIG5vZGVzVG9SZXR1cm4ucHVzaCh0ZXh0Tm9kZSk7XG4gICAgICByZXBsYWNlbWVudFRleHQgPSBbXTtcbiAgICAgIGNvbnN0IGNoaWxkRWwgPSBkb2MoZWxlbWVudCk7XG4gICAgICBpZiAoY2hpbGRFbCkge1xuICAgICAgICBub2Rlc1RvUmV0dXJuLnB1c2goY2hpbGRFbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGlsZC5nZXQoMCkgJiYgY2hpbGQuZ2V0KDApLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICBjb25zdCBjaGlsZFRleHROb2RlID0gY2hpbGQ7XG4gICAgICBjb25zdCBjaGlsZFRleHQgPSBjaGlsZC50ZXh0KCk7XG4gICAgICBjb25zdCByZXBsYWNlVGV4dCA9IGNoaWxkVGV4dFxuICAgICAgICAucmVwbGFjZSgvXFxuL2csIFwiXFxuXFxuXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCJcIilcbiAgICAgICAgLnJlcGxhY2UoL15cXHMrJC9nLCBcIlwiKTtcblxuICAgICAgaWYgKHJlcGxhY2VUZXh0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGV0IHByZXZpb3VzU2libGluZ05vZGUgPSBjaGlsZFRleHROb2RlLnByZXYoKTtcblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgcHJldmlvdXNTaWJsaW5nTm9kZS5nZXQoMCkgJiZcbiAgICAgICAgICBwcmV2aW91c1NpYmxpbmdOb2RlLmdldCgwKS50YWdOYW1lID09PSBcImFcIiAmJlxuICAgICAgICAgIHByZXZpb3VzU2libGluZ05vZGUuYXR0cihcImdydi11c2VkYWxyZWFkeVwiKSAhPT0gXCJ5ZXNcIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBvdXRlciA9IFwiIFwiICsgZG9jLmh0bWwocHJldmlvdXNTaWJsaW5nTm9kZSkgKyBcIiBcIjtcbiAgICAgICAgICByZXBsYWNlbWVudFRleHQucHVzaChvdXRlcik7XG4gICAgICAgICAgbm9kZXNUb1JlbW92ZS5wdXNoKHByZXZpb3VzU2libGluZ05vZGUpO1xuICAgICAgICAgIHByZXZpb3VzU2libGluZ05vZGUuYXR0cihcImdydi11c2VkYWxyZWFkeVwiLCBcInllc1wiKTtcbiAgICAgICAgICBwcmV2aW91c1NpYmxpbmdOb2RlID0gcHJldmlvdXNTaWJsaW5nTm9kZS5wcmV2KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXBsYWNlbWVudFRleHQucHVzaChyZXBsYWNlVGV4dCk7XG4gICAgICAgIGNvbnN0IG5leHRTaWJsaW5nTm9kZSA9IGNoaWxkVGV4dE5vZGUubmV4dCgpO1xuXG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICBuZXh0U2libGluZ05vZGUuZ2V0KDApICYmXG4gICAgICAgICAgbmV4dFNpYmxpbmdOb2RlLmdldCgwKS50YWdOYW1lID09PSBcImFcIiAmJlxuICAgICAgICAgIG5leHRTaWJsaW5nTm9kZS5hdHRyKFwiZ3J2LXVzZWRhbHJlYWR5XCIpICE9PSBcInllc1wiXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG91dGVyID0gXCIgXCIgKyBkb2MuaHRtbChuZXh0U2libGluZ05vZGUpICsgXCIgXCI7XG4gICAgICAgICAgcmVwbGFjZW1lbnRUZXh0LnB1c2gob3V0ZXIpO1xuICAgICAgICAgIG5vZGVzVG9SZW1vdmUucHVzaChuZXh0U2libGluZ05vZGUpO1xuICAgICAgICAgIG5leHRTaWJsaW5nTm9kZS5hdHRyKFwiZ3J2LXVzZWRhbHJlYWR5XCIsIFwieWVzXCIpO1xuICAgICAgICAgIHByZXZpb3VzU2libGluZ05vZGUgPSBuZXh0U2libGluZ05vZGUubmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvdGhlcndpc2VcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2hpbGRFbCA9IGRvYyhjaGlsZCk7XG4gICAgICBpZiAoY2hpbGRFbCkge1xuICAgICAgICBub2Rlc1RvUmV0dXJuLnB1c2goY2hpbGRFbCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBmbHVzaCBvdXQgYW55dGhpbmcgc3RpbGwgcmVtYWluaW5nXG4gIGlmIChyZXBsYWNlbWVudFRleHQubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHRleHQgPSByZXBsYWNlbWVudFRleHQuam9pbihcIlwiKTtcbiAgICBjb25zdCB0ZXh0Tm9kZUxvYWQgPSBjaGVlcmlvLmxvYWQoYDxwPiR7dGV4dH08L3A+YCk7XG4gICAgY29uc3QgdGV4dE5vZGUgPSBkb2ModGV4dE5vZGVMb2FkKTtcbiAgICBub2Rlc1RvUmV0dXJuLnB1c2godGV4dE5vZGUpO1xuICAgIHJlcGxhY2VtZW50VGV4dCA9IFtdO1xuICB9XG5cbiAgbm9kZXNUb1JlbW92ZS5mb3JFYWNoKChub2RlOiBjaGVlcmlvLkNoZWVyaW8pID0+IHtcbiAgICBkb2Mobm9kZSkucmVtb3ZlKCk7XG4gIH0pO1xuXG4gIHJldHVybiBub2Rlc1RvUmV0dXJuO1xufVxuXG5mdW5jdGlvbiByZW1vdmVCb2R5Q2xhc3Nlcyhkb2M6IGNoZWVyaW8uUm9vdCk6IGNoZWVyaW8uUm9vdCB7XG4gIGRvYyhcImJvZHlcIikucmVtb3ZlQ2xhc3MoKTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRHJvcENhcHMoZG9jOiBjaGVlcmlvLlJvb3QpOiBjaGVlcmlvLlJvb3Qge1xuICBjb25zdCBub2RlcyA9IGRvYyhcInNwYW5bY2xhc3N+PWRyb3BjYXBdLCBzcGFuW2NsYXNzfj1kcm9wX2NhcF1cIik7XG4gIG5vZGVzLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBjaGVlcmlvLkVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBodG1sRWwgPSBkb2MoZWxlbWVudCkuaHRtbCgpO1xuICAgIGlmIChodG1sRWwpIHtcbiAgICAgIGRvYyhlbGVtZW50KS5yZXBsYWNlV2l0aChodG1sRWwpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkb2M7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGVzUmVnZXgoZG9jOiBjaGVlcmlvLlJvb3QsIHBhdHRlcm46IFJlZ0V4cCkge1xuICBjb25zdCB0b1JlbW92ZSA9IGRvYyhcImRpdlwiKS5maWx0ZXIoKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGlkRWwgPSBkb2MoZWxlbWVudCkuYXR0cihcImlkXCIpO1xuICAgIGNvbnN0IGNsYXNzRWwgPSBkb2MoZWxlbWVudCkuYXR0cihcImNsYXNzXCIpO1xuICAgIGlmIChpZEVsKSB7XG4gICAgICByZXR1cm4gaWRFbC5tYXRjaChwYXR0ZXJuKSAhPT0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGNsYXNzRWwpIHtcbiAgICAgIHJldHVybiBjbGFzc0VsLm1hdGNoKHBhdHRlcm4pICE9PSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xuICBkb2ModG9SZW1vdmUpLnJlbW92ZSgpO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTY3JpcHRzU3R5bGVzKGRvYzogY2hlZXJpby5Sb290KTogY2hlZXJpby5DaGVlcmlvIHtcbiAgZG9jKFwic2NyaXB0XCIpLnJlbW92ZSgpO1xuICBkb2MoXCJzdHlsZVwiKS5yZW1vdmUoKTtcblxuICBjb25zdCBjb21tZW50cyA9IGRvYyhcIipcIilcbiAgICAuY29udGVudHMoKVxuICAgIC5maWx0ZXIoKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBjaGVlcmlvLkVsZW1lbnQpID0+IHtcbiAgICAgIHJldHVybiBlbGVtZW50LnR5cGUgPT09IFwiY29tbWVudFwiO1xuICAgIH0pO1xuXG4gIHJldHVybiBkb2MoY29tbWVudHMpLnJlbW92ZSgpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aFBhcmEoXG4gIGRvYzogY2hlZXJpby5Sb290LFxuICBkaXY6IGNoZWVyaW8uRWxlbWVudCxcbik6IGNoZWVyaW8uUm9vdCB7XG4gIGNvbnN0IGRpdkNvbnRlbnQgPSBkb2MoZGl2KS5odG1sKCk7XG4gIGRvYyhkaXYpLnJlcGxhY2VXaXRoKGA8cD4ke2RpdkNvbnRlbnR9PC9wPmApO1xuICByZXR1cm4gZG9jO1xufVxuXG5jb25zdCBjbGVhbmVyID0gKGRvYzogY2hlZXJpby5Sb290KTogY2hlZXJpby5Sb290ID0+IHtcbiAgcmVtb3ZlQm9keUNsYXNzZXMoZG9jKTtcbiAgY2xlYW5BcnRpY2xlVGFncyhkb2MpO1xuICBjbGVhbkVtVGFncyhkb2MpO1xuICBjbGVhbkNvZGVCbG9ja3MoZG9jKTtcbiAgcmVtb3ZlRHJvcENhcHMoZG9jKTtcbiAgcmVtb3ZlU2NyaXB0c1N0eWxlcyhkb2MpO1xuICBjbGVhbkJhZFRhZ3MoZG9jKTtcbiAgcmVtb3ZlTm9kZXNSZWdleChkb2MsIC9eY2FwdGlvbiQvKTtcbiAgcmVtb3ZlTm9kZXNSZWdleChkb2MsIC8gZ29vZ2xlIC8pO1xuICByZW1vdmVOb2Rlc1JlZ2V4KGRvYywgL15bXmVudHJ5LV1tb3JlLiokLyk7XG4gIHJlbW92ZU5vZGVzUmVnZXgoZG9jLCAvW14tXWZhY2Vib29rLyk7XG4gIHJlbW92ZU5vZGVzUmVnZXgoZG9jLCAvZmFjZWJvb2stYnJvYWRjYXN0aW5nLyk7XG4gIHJlbW92ZU5vZGVzUmVnZXgoZG9jLCAvW14tXXR3aXR0ZXIvKTtcbiAgY2xlYW5QYXJhU3BhbnMoZG9jKTtcbiAgY2xlYW5VbmRlcmxpbmVzKGRvYyk7XG4gIGNsZWFuRXJyYW50TGluZUJyZWFrcyhkb2MpO1xuICBkaXZUb1BhcmEoZG9jLCBcImRpdlwiKTtcbiAgZGl2VG9QYXJhKGRvYywgXCJzcGFuXCIpO1xuICByZXR1cm4gZG9jO1xufTtcblxuLy8gU2FuaXRpemF0aW9uIGZ1bmN0aW9uIHRvIHJlbW92ZSBIVE1ML1hNTCB0YWdzXG5leHBvcnQgY29uc3Qgc2FuaXRpemVKc29uTGRTdHJpbmcgPSAoanNvbkxkU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAvLyBSZW1vdmUgYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGFuIEhUTUwvWE1MIHRhZyAodGhpcyBpcyBhIGJhc2ljIGV4YW1wbGUsIG1pZ2h0IG5lZWQgYWRqdXN0bWVudHMpXG4gIHJldHVybiBqc29uTGRTdHJpbmcucmVwbGFjZSgvPFxcLz9bXj5dKyg+fCQpL2csIFwiXCIpLnRyaW0oKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsZWFuZXI7XG4iXX0=