UNPKG

angular-xml-editor

Version:
255 lines (254 loc) 27.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { XmlToolbox } from '../xmlToolbox.class'; import { Xml2htmlAttributeWorker } from './xml2htmlAttributeWorker.class'; var Xml2html = /** @class */ (function () { function Xml2html(rules) { this.rules = rules; this.attributeWorker = new Xml2htmlAttributeWorker(rules); } /** * @param {?} node * @return {?} */ Xml2html.getTagNameFromNode = /** * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var elem = /** @type {?} */ (node); /** @type {?} */ var name = ''; if (elem) { name = elem.getAttribute(Xml2html.DataTagName); } if (name === undefined || name === null || name === '') { throw new Error("node has no DataTagName attribute " + XmlToolbox.GetNodeDebugContext(node)); } return name; }; /** * @param {?} node * @return {?} */ Xml2html.isFloatingElement = /** * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var elem = /** @type {?} */ (node); if (elem && elem.classList) { return elem.classList.contains(Xml2html.FloatingTagClassName); } return false; }; /** * @param {?} node * @return {?} */ Xml2html.isNoClosingElement = /** * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var elem = /** @type {?} */ (node); if (elem && elem.classList) { return elem.classList.contains(Xml2html.NoClosingTagClassName); } return false; }; /** * @param {?} xml * @return {?} */ Xml2html.prototype.ToHtml = /** * @param {?} xml * @return {?} */ function (xml) { if (xml === '' || xml === undefined || xml === null) { return ''; } // alert(xml); // remove newline / carriage return xml = xml.replace(/\n/g, ''); xml = xml.replace(/\r/g, ''); // remove whitespace (tabs) before tags xml = xml.replace(/[\t]+\</g, '<'); // remove whitespace between tags xml = xml.replace(/\>[\t]+\</g, '><'); // remove whitespace after tags xml = xml.replace(/\>[\t]+$/g, '>'); /** @type {?} */ var domparser = new DOMParser(); /** @type {?} */ var domdoc = domparser.parseFromString(xml, 'text/xml'); /** @type {?} */ var targetDocument = new Document(); if (domdoc.documentElement === null) { return ''; } /** @type {?} */ var body = this.GetHtmlElementFromXmlElement(domdoc.documentElement, targetDocument); if (body && body.nodeType === Node.ELEMENT_NODE) { /** @type {?} */ var html = (/** @type {?} */ (body)).outerHTML; return html; } else { throw new Error("root node " + XmlToolbox.GetNodeDebugContext(body) + " is no element"); } }; /** * @param {?} ruleElem * @return {?} */ Xml2html.prototype.createNewElementHtml = /** * @param {?} ruleElem * @return {?} */ function (ruleElem) { /** @type {?} */ var elem = this.createNewElementByName(ruleElem.tagName); return elem.outerHTML; }; /** * @param {?} tagName * @return {?} */ Xml2html.prototype.createNewElementByName = /** * @param {?} tagName * @return {?} */ function (tagName) { /** @type {?} */ var tempDoc = new Document(); /** @type {?} */ var newElement = tempDoc.createElement('div'); /** @type {?} */ var rule = this.rules.ruleElements.get(tagName); if (rule && rule.floating === true) { newElement.classList.add(Xml2html.FloatingTagClassName); } // visualize closing tag or not? if (rule && rule.empty === true) { newElement.classList.add(Xml2html.NoClosingTagClassName); } newElement.setAttribute(Xml2html.DataTagName, tagName); return newElement; }; /** * @param {?} node * @param {?} targetDocument * @return {?} */ Xml2html.prototype.GetHtmlElementFromXmlElement = /** * @param {?} node * @param {?} targetDocument * @return {?} */ function (node, targetDocument) { switch (node.nodeType) { case Node.ELEMENT_NODE: // element node /** @type {?} */ var asElement = /** @type {?} */ (node); /** @type {?} */ var nodeName = asElement.nodeName; /** @type {?} */ var newElement = targetDocument.createElement('div'); /** @type {?} */ var rule = this.rules.ruleElements.get(nodeName); if (rule && rule.floating) { newElement.classList.add(Xml2html.FloatingTagClassName); } // visualize closing tag or not? if (rule && rule.empty) { newElement.classList.add(Xml2html.NoClosingTagClassName); } newElement.setAttribute(Xml2html.DataTagName, nodeName); /** @type {?} */ var children = asElement.childNodes; if (children.length === 0) { newElement.appendChild(targetDocument.createTextNode('')); // to prevent non closing tags } else { for (var i = 0; i < children.length; ++i) { /** @type {?} */ var childAsHtml = this.GetHtmlElementFromXmlElement(children[i], targetDocument); if (childAsHtml !== undefined) { newElement.appendChild(childAsHtml); } } } // insert attributes this.attributeWorker.writeAllXmlAttributesToHtml(asElement, newElement); return newElement; case Node.TEXT_NODE: // text node /** @type {?} */ var content = (/** @type {?} */ (node)).textContent; if (content.length > 0) { return targetDocument.createTextNode(content); } else { return undefined; } case Node.COMMENT_NODE: // create element node newElement = targetDocument.createElement('div'); newElement.classList.add(Xml2html.CommentTagClassName); newElement.setAttribute(Xml2html.DataTagName, 'comment'); newElement.textContent = (/** @type {?} */ (node)).textContent; return newElement; /* yet not implemented types */ case Node.PROCESSING_INSTRUCTION_NODE: console.warn("nodeType \"PROCESSING_INSTRUCTION_NODE\" " + XmlToolbox.GetNodeDebugContext(node) + " not implemented yet"); return undefined; case Node.DOCUMENT_NODE: throw new Error("nodeType \"Node.DOCUMENT_NODE\" " + XmlToolbox.GetNodeDebugContext(node) + " not implemented yet"); case Node.DOCUMENT_TYPE_NODE: throw new Error("nodeType \"Node.DOCUMENT_NODE\" " + XmlToolbox.GetNodeDebugContext(node) + " not implemented yet"); case Node.DOCUMENT_FRAGMENT_NODE: throw new Error("nodeType \"Node.DOCUMENT_FRAGMENT_NODE\" " + XmlToolbox.GetNodeDebugContext(node) + " not implemented yet"); /* Depreached node types */ case Node.ATTRIBUTE_NODE: throw new Error("nodeType \"Node.ATTRIBUTE_NODE\" " + XmlToolbox.GetNodeDebugContext(node) + " is depreached"); case Node.CDATA_SECTION_NODE: throw new Error("nodeType \"Node.CDATA_SECTION_NODE\" " + XmlToolbox.GetNodeDebugContext(node) + " is depreached"); case Node.ENTITY_REFERENCE_NODE: throw new Error("nodeType \"Node.ENTITY_REFERENCE_NODE\" " + XmlToolbox.GetNodeDebugContext(node) + " is depreached"); case Node.ENTITY_NODE: throw new Error("nodeType \"Node.ENTITY_NODE\" " + XmlToolbox.GetNodeDebugContext(node) + " is depreached"); case Node.NOTATION_NODE: throw new Error("nodeType \"Node.NOTATION_NODE\" " + XmlToolbox.GetNodeDebugContext(node) + " is depreached"); default: // tslint:disable-next-line:max-line-length throw new Error("unknown xmlElement nodeType " + node.nodeType + " in value: " + XmlToolbox.GetNodeDebugContext(node)); } }; Xml2html.DataTagName = 'data-tagname'; Xml2html.NoClosingTagClassName = 'xmlTagNoClosing'; Xml2html.FloatingTagClassName = 'floating'; Xml2html.CommentTagClassName = 'comment'; return Xml2html; }()); export { Xml2html }; if (false) { /** @type {?} */ Xml2html.DataTagName; /** @type {?} */ Xml2html.NoClosingTagClassName; /** @type {?} */ Xml2html.FloatingTagClassName; /** @type {?} */ Xml2html.CommentTagClassName; /** @type {?} */ Xml2html.prototype.attributeWorker; /** @type {?} */ Xml2html.prototype.rules; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sMmh0bWwuY2xhc3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXhtbC1lZGl0b3IvIiwic291cmNlcyI6WyJsaWIvY29kZS94bWwtaHRtbC1jb252ZXJ0ZXIveG1sMmh0bWwuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7SUFXeEUsa0JBQW1CLEtBQWU7UUFBZixVQUFLLEdBQUwsS0FBSyxDQUFVO1FBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMzRDs7Ozs7SUFFTSwyQkFBa0I7Ozs7SUFBekIsVUFBMEIsSUFBVTs7UUFDbEMsSUFBTSxJQUFJLHFCQUFHLElBQWUsRUFBQzs7UUFDN0IsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxJQUFJLEVBQUU7WUFDUixJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFO1lBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUcsQ0FBQyxDQUFDO1NBQzlGO1FBQ0QsT0FBTyxJQUFJLENBQUM7S0FDYjs7Ozs7SUFFTSwwQkFBaUI7Ozs7SUFBeEIsVUFBeUIsSUFBVTs7UUFDakMsSUFBTSxJQUFJLHFCQUFHLElBQWUsRUFBQztRQUM3QixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQzFCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENB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QixDQUFDLENBQUM7WUFFekc7O2dCQUVFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQStCLElBQUksQ0FBQyxRQUFRLG1CQUFjLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUcsQ0FBQyxDQUFDO1NBQ3JIOzsyQkFoTDBCLGNBQWM7cUNBQ0wsaUJBQWlCO29DQUNsQixVQUFVO21DQUNYLFNBQVM7bUJBVC9DOztTQUthLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBYbWxSdWxlcyB9IGZyb20gJy4uL3htbC1ydWxlcy1jaGVjay94bWxSdWxlcy5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbFRvb2xib3ggfSBmcm9tICcuLi94bWxUb29sYm94LmNsYXNzJztcclxuaW1wb3J0IHsgWG1sMmh0bWxBdHRyaWJ1dGVXb3JrZXIgfSBmcm9tICcuL3htbDJodG1sQXR0cmlidXRlV29ya2VyLmNsYXNzJztcclxuaW1wb3J0IHsgWG1sUnVsZUVsZW1lbnQgfSBmcm9tICcuLi94bWwtcnVsZXMtY2hlY2sveG1sUnVsZUVsZW1lbnQuY2xhc3MnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFhtbDJodG1sIHtcclxuICBwcml2YXRlIHN0YXRpYyBEYXRhVGFnTmFtZSA9ICdkYXRhLXRhZ25hbWUnO1xyXG4gIHB1YmxpYyBzdGF0aWMgTm9DbG9zaW5nVGFnQ2xhc3NOYW1lID0gJ3htbFRhZ05vQ2xvc2luZyc7XHJcbiAgcHVibGljIHN0YXRpYyBGbG9hdGluZ1RhZ0NsYXNzTmFtZSA9ICdmbG9hdGluZyc7XHJcbiAgcHVibGljIHN0YXRpYyBDb21tZW50VGFnQ2xhc3NOYW1lID0gJ2NvbW1lbnQnO1xyXG5cclxuICBwcml2YXRlIGF0dHJpYnV0ZVdvcmtlcjogWG1sMmh0bWxBdHRyaWJ1dGVXb3JrZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBydWxlczogWG1sUnVsZXMpIHtcclxuICAgIHRoaXMuYXR0cmlidXRlV29ya2VyID0gbmV3IFhtbDJodG1sQXR0cmlidXRlV29ya2VyKHJ1bGVzKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRUYWdOYW1lRnJvbU5vZGUobm9kZTogTm9kZSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xyXG4gICAgbGV0IG5hbWUgPSAnJztcclxuICAgIGlmIChlbGVtKSB7XHJcbiAgICAgIG5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZShYbWwyaHRtbC5EYXRhVGFnTmFtZSk7XHJcbiAgICB9XHJcbiAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkIHx8IG5hbWUgPT09IG51bGwgfHwgbmFtZSA9PT0gJycpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBub2RlIGhhcyBubyBEYXRhVGFnTmFtZSBhdHRyaWJ1dGUgJHtYbWxUb29sYm94LkdldE5vZGVEZWJ1Z0NvbnRleHQobm9kZSl9YCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc0Zsb2F0aW5nRWxlbWVudChub2RlOiBOb2RlKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xyXG4gICAgaWYgKGVsZW0gJiYgZWxlbS5jbGFzc0xpc3QpIHtcclxuICAgICAgcmV0dXJuIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKFhtbDJodG1sLkZsb2F0aW5nVGFnQ2xhc3NOYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc05vQ2xvc2luZ0VsZW1lbnQobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcclxuICAgIGlmIChlbGVtICYmIGVsZW0uY2xhc3NMaXN0KSB7XHJcbiAgICAgIHJldHVybiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhYbWwyaHRtbC5Ob0Nsb3NpbmdUYWdDbGFzc05hbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFRvSHRtbCh4bWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoeG1sID09PSAnJyB8fCB4bWwgPT09IHVuZGVmaW5lZCB8fCB4bWwgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFsZXJ0KHhtbCk7XHJcblxyXG4gICAgLy8gcmVtb3ZlIG5ld2xpbmUgLyBjYXJyaWFnZSByZXR1cm5cclxuICAgIHhtbCA9IHhtbC5yZXBsYWNlKC9cXG4vZywgJycpO1xyXG4gICAgeG1sID0geG1sLnJlcGxhY2UoL1xcci9nLCAnJyk7XHJcbiAgICAvLyByZW1vdmUgd2hpdGVzcGFjZSAodGFicykgYmVmb3JlIHRhZ3NcclxuICAgIHhtbCA9IHhtbC5yZXBsYWNlKC9bXFx0XStcXDwvZywgJzwnKTtcclxuICAgIC8vIHJlbW92ZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGFnc1xyXG4gICAgeG1sID0geG1sLnJlcGxhY2UoL1xcPltcXHRdK1xcPC9nLCAnPjwnKTtcclxuICAgIC8vIHJlbW92ZSB3aGl0ZXNwYWNlIGFmdGVyIHRhZ3NcclxuICAgIHhtbCA9IHhtbC5yZXBsYWNlKC9cXD5bXFx0XSskL2csICc+Jyk7XHJcblxyXG4gICAgY29uc3QgZG9tcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgY29uc3QgZG9tZG9jID0gZG9tcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWwsICd0ZXh0L3htbCcpO1xyXG5cclxuICAgIGNvbnN0IHRhcmdldERvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7XHJcblxyXG4gICAgaWYgKGRvbWRvYy5kb2N1bWVudEVsZW1lbnQgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJvZHkgPSB0aGlzLkdldEh0bWxFbGVtZW50RnJvbVhtbEVsZW1lbnQoZG9tZG9jLmRvY3VtZW50RWxlbWVudCwgdGFyZ2V0RG9jdW1lbnQpO1xyXG4gICAgaWYgKGJvZHkgJiYgYm9keS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgY29uc3QgaHRtbCA9IChib2R5IGFzIEVsZW1lbnQpLm91dGVySFRNTDtcclxuICAgICAgcmV0dXJuIGh0bWw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHJvb3Qgbm9kZSAke1htbFRvb2xib3guR2V0Tm9kZURlYnVnQ29udGV4dChib2R5KX0gaXMgbm8gZWxlbWVudGApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlTmV3RWxlbWVudEh0bWwocnVsZUVsZW06IFhtbFJ1bGVFbGVtZW50KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGVsZW0gPSB0aGlzLmNyZWF0ZU5ld0VsZW1lbnRCeU5hbWUocnVsZUVsZW0udGFnTmFtZSk7XHJcbiAgICByZXR1cm4gZWxlbS5vdXRlckhUTUw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlTmV3RWxlbWVudEJ5TmFtZSh0YWdOYW1lOiBzdHJpbmcpOiBFbGVtZW50IHtcclxuICAgIGNvbnN0IHRlbXBEb2MgPSBuZXcgRG9jdW1lbnQoKTtcclxuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB0ZW1wRG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgLy8gZmxvYXRpbmcgZWxlbWVudCBvciBub3Q/XHJcbiAgICBjb25zdCBydWxlID0gdGhpcy5ydWxlcy5ydWxlRWxlbWVudHMuZ2V0KHRhZ05hbWUpO1xyXG4gICAgaWYgKHJ1bGUgJiYgcnVsZS5mbG9hdGluZyA9PT0gdHJ1ZSkge1xyXG4gICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoWG1sMmh0bWwuRmxvYXRpbmdUYWdDbGFzc05hbWUpO1xyXG4gICAgfVxyXG4gICAgLy8gdmlzdWFsaXplIGNsb3NpbmcgdGFnIG9yIG5vdD9cclxuICAgIGlmIChydWxlICYmIHJ1bGUuZW1wdHkgPT09IHRydWUpIHtcclxuICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKFhtbDJodG1sLk5vQ2xvc2luZ1RhZ0NsYXNzTmFtZSk7XHJcbiAgICB9XHJcbiAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShYbWwyaHRtbC5EYXRhVGFnTmFtZSwgdGFnTmFtZSk7XHJcbiAgICByZXR1cm4gbmV3RWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgR2V0SHRtbEVsZW1lbnRGcm9tWG1sRWxlbWVudChub2RlOiBOb2RlLCB0YXJnZXREb2N1bWVudDogRG9jdW1lbnQpOiBOb2RlIHtcclxuICAgIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xyXG4gICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOiAvLyBlbGVtZW50IG5vZGVcclxuICAgICAgICBjb25zdCBhc0VsZW1lbnQgPSBub2RlIGFzIEVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBhc0VsZW1lbnQubm9kZU5hbWU7XHJcblxyXG4gICAgICAgIC8vIGNyZWF0ZSBlbGVtZW50IG5vZGVcclxuICAgICAgICBsZXQgbmV3RWxlbWVudCA9IHRhcmdldERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cclxuICAgICAgICAvLyBmbG9hdGluZyBlbGVtZW50IG9yIG5vdD9cclxuICAgICAgICBjb25zdCBydWxlID0gdGhpcy5ydWxlcy5ydWxlRWxlbWVudHMuZ2V0KG5vZGVOYW1lKTtcclxuICAgICAgICBpZiAocnVsZSAmJiBydWxlLmZsb2F0aW5nKSB7XHJcbiAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoWG1sMmh0bWwuRmxvYXRpbmdUYWdDbGFzc05hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB2aXN1YWxpemUgY2xvc2luZyB0YWcgb3Igbm90P1xyXG4gICAgICAgIGlmIChydWxlICYmIHJ1bGUuZW1wdHkpIHtcclxuICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChYbWwyaHRtbC5Ob0Nsb3NpbmdUYWdDbGFzc05hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShYbWwyaHRtbC5EYXRhVGFnTmFtZSwgbm9kZU5hbWUpO1xyXG5cclxuICAgICAgICAvLyBhcHBlbmQgY2hpbGQgZWxlbWVudHMgcmVjdXJzaXZlXHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBhc0VsZW1lbnQuY2hpbGROb2RlcztcclxuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKHRhcmdldERvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKSk7IC8vIHRvIHByZXZlbnQgbm9uIGNsb3NpbmcgdGFnc1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkQXNIdG1sID0gdGhpcy5HZXRIdG1sRWxlbWVudEZyb21YbWxFbGVtZW50KGNoaWxkcmVuW2ldLCB0YXJnZXREb2N1bWVudCk7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZEFzSHRtbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEFzSHRtbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGluc2VydCBhdHRyaWJ1dGVzXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVXb3JrZXIud3JpdGVBbGxYbWxBdHRyaWJ1dGVzVG9IdG1sKGFzRWxlbWVudCwgbmV3RWxlbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXdFbGVtZW50O1xyXG5cclxuICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERTogLy8gdGV4dCBub2RlXHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IChub2RlIGFzIEVsZW1lbnQpLnRleHRDb250ZW50O1xyXG4gICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHJldHVybiB0YXJnZXREb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOlxyXG4gICAgICAgIC8vIGNyZWF0ZSBlbGVtZW50IG5vZGVcclxuICAgICAgICBuZXdFbGVtZW50ID0gdGFyZ2V0RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKFhtbDJodG1sLkNvbW1lbnRUYWdDbGFzc05hbWUpO1xyXG4gICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKFhtbDJodG1sLkRhdGFUYWdOYW1lLCAnY29tbWVudCcpO1xyXG4gICAgICAgIG5ld0VsZW1lbnQudGV4dENvbnRlbnQgPSAobm9kZSBhcyBFbGVtZW50KS50ZXh0Q29udGVudDtcclxuICAgICAgICByZXR1cm4gbmV3RWxlbWVudDtcclxuXHJcbiAgICAgIC8qIHlldCBub3QgaW1wbGVtZW50ZWQgdHlwZXMgKi9cclxuICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTpcclxuICAgICAgICBjb25zb2xlLndhcm4oYG5vZGVUeXBlIFwiUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFXCIgJHtYbWxUb29sYm94LkdldE5vZGVEZWJ1Z0NvbnRleHQobm9kZSl9IG5vdCBpbXBsZW1lbnRlZCB5ZXRgKTtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub2RlVHlwZSBcIk5vZGUuRE9DVU1FTlRfTk9ERVwiICR7WG1sVG9vbGJveC5HZXROb2RlRGVidWdDb250ZXh0KG5vZGUpfSBub3QgaW1wbGVtZW50ZWQgeWV0YCk7XHJcbiAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub2RlVHlwZSBcIk5vZGUuRE9DVU1FTlRfTk9ERVwiICR7WG1sVG9vbGJveC5HZXROb2RlRGVidWdDb250ZXh0KG5vZGUpfSBub3QgaW1wbGVtZW50ZWQgeWV0YCk7XHJcbiAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgbm9kZVR5cGUgXCJOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREVcIiAke1htbFRvb2xib3guR2V0Tm9kZURlYnVnQ29udGV4dChub2RlKX0gbm90IGltcGxlbWVudGVkIHlldGApO1xyXG5cclxuICAgICAgLyogRGVwcmVhY2hlZCBub2RlIHR5cGVzICovXHJcbiAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERTpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vZGVUeXBlIFwiTm9kZS5BVFRSSUJVVEVfTk9ERVwiICR7WG1sVG9vbGJveC5HZXROb2RlRGVidWdDb250ZXh0KG5vZGUpfSBpcyBkZXByZWFjaGVkYCk7XHJcbiAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub2RlVHlwZSBcIk5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFXCIgJHtYbWxUb29sYm94LkdldE5vZGVEZWJ1Z0NvbnRleHQobm9kZSl9IGlzIGRlcHJlYWNoZWRgKTtcclxuICAgICAgY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERTpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vZGVUeXBlIFwiTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREVcIiAke1htbFRvb2xib3guR2V0Tm9kZURlYnVnQ29udGV4dChub2RlKX0gaXMgZGVwcmVhY2hlZGApO1xyXG4gICAgICBjYXNlIE5vZGUuRU5USVRZX05PREU6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub2RlVHlwZSBcIk5vZGUuRU5USVRZX05PREVcIiAke1htbFRvb2xib3guR2V0Tm9kZURlYnVnQ29udGV4dChub2RlKX0gaXMgZGVwcmVhY2hlZGApO1xyXG4gICAgICBjYXNlIE5vZGUuTk9UQVRJT05fTk9ERTpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vZGVUeXBlIFwiTm9kZS5OT1RBVElPTl9OT0RFXCIgJHtYbWxUb29sYm94LkdldE5vZGVEZWJ1Z0NvbnRleHQobm9kZSl9IGlzIGRlcHJlYWNoZWRgKTtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biB4bWxFbGVtZW50IG5vZGVUeXBlICR7bm9kZS5ub2RlVHlwZX0gaW4gdmFsdWU6ICR7WG1sVG9vbGJveC5HZXROb2RlRGVidWdDb250ZXh0KG5vZGUpfWApO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=