angular-xml-editor
Version:
XML editor component for Angular
311 lines (310 loc) • 27 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Xml2html } from '../xml-html-converter/xml2html.class';
var DomDummyNodeManager = /** @class */ (function () {
function DomDummyNodeManager() {
}
/**
* @param {?} node
* @return {?}
*/
DomDummyNodeManager.IsDummyNode = /**
* @param {?} node
* @return {?}
*/
function (node) {
/** @type {?} */
var asElem = /** @type {?} */ (node);
if (asElem && node.nodeType === Node.ELEMENT_NODE) {
return asElem.classList.contains(DomDummyNodeManager.DummyNodeClassName);
}
return false;
};
/**
* @param {?} node
* @return {?}
*/
DomDummyNodeManager.IsBeforeFirstTagDummyNode = /**
* @param {?} node
* @return {?}
*/
function (node) {
if (DomDummyNodeManager.IsDummyNode(node)) {
/** @type {?} */
var asElem = /** @type {?} */ (node);
if (asElem && node.nodeType === Node.ELEMENT_NODE) {
return asElem.classList.contains(DomDummyNodeManager.DummyNodeBeforeFirstTagClassName);
}
return false;
}
else {
return false;
}
};
/**
* @param {?} node
* @return {?}
*/
DomDummyNodeManager.getPreviousSibling = /**
* @param {?} node
* @return {?}
*/
function (node) {
if (!node) {
return undefined;
}
while (node) {
node = node.previousSibling;
if (node) {
if (DomDummyNodeManager.IsDummyNode(node)) {
}
else {
return node;
}
}
}
return undefined;
};
/**
* @param {?} node
* @return {?}
*/
DomDummyNodeManager.getNextSibling = /**
* @param {?} node
* @return {?}
*/
function (node) {
if (!node) {
return undefined;
}
while (node) {
node = node.nextSibling;
if (node) {
if (DomDummyNodeManager.IsDummyNode(node)) {
}
else {
return node;
}
}
}
return undefined;
};
/**
* @param {?} node
* @return {?}
*/
DomDummyNodeManager.getChildNodeCount = /**
* @param {?} node
* @return {?}
*/
function (node) {
if (!node) {
return 0;
}
/** @type {?} */
var count = 0;
for (var i = 0; i < node.childNodes.length; i++) {
if (!DomDummyNodeManager.IsDummyNode(node.childNodes[i])) {
count++;
}
}
return count;
};
/**
* @param {?} node
* @return {?}
*/
DomDummyNodeManager.getFirstChild = /**
* @param {?} node
* @return {?}
*/
function (node) {
if (!node) {
return undefined;
}
/** @type {?} */
var first = /** @type {?} */ (node.firstChild);
while (DomDummyNodeManager.IsDummyNode(first)) {
first = first.nextSibling;
}
return first;
};
/**
* @param {?} node
* @return {?}
*/
DomDummyNodeManager.getLastChild = /**
* @param {?} node
* @return {?}
*/
function (node) {
if (!node) {
return undefined;
}
/** @type {?} */
var last = /** @type {?} */ (node.lastChild);
while (DomDummyNodeManager.IsDummyNode(last)) {
last = last.previousSibling;
}
return last;
};
/**
* @param {?} node
* @param {?=} nodeDepth
* @return {?}
*/
DomDummyNodeManager.prototype.RemoveAllDummyNodes = /**
* @param {?} node
* @param {?=} nodeDepth
* @return {?}
*/
function (node, nodeDepth) {
var _this = this;
if (nodeDepth === void 0) { nodeDepth = 0; }
/** @type {?} */
var children = [];
for (var i = 0; i < node.childNodes.length; ++i) {
children.push(node.childNodes[i]);
}
// delete all dummy node children
children.forEach(function (child) {
if (DomDummyNodeManager.IsDummyNode(child)) {
node.removeChild(child);
}
});
children = [];
for (var i = 0; i < node.childNodes.length; ++i) {
children.push(node.childNodes[i]);
}
// update child nodes
children.forEach(function (child) {
_this.RemoveAllDummyNodes(child, nodeDepth + 1);
});
};
/**
* @param {?} node
* @param {?=} nodeDepth
* @return {?}
*/
DomDummyNodeManager.prototype.UpdateDummyNodes = /**
* @param {?} node
* @param {?=} nodeDepth
* @return {?}
*/
function (node, nodeDepth) {
var _this = this;
if (nodeDepth === void 0) { nodeDepth = 0; }
/** @type {?} */
var document = node.ownerDocument;
/** @type {?} */
var asElement = /** @type {?} */ (node);
/** @type {?} */
var children = [];
for (var i = 0; i < node.childNodes.length; ++i) {
children.push(node.childNodes[i]);
}
if (asElement && !DomDummyNodeManager.IsDummyNode(asElement) && !DomDummyNodeManager.IsDummyNode(asElement.parentElement)) {
if (asElement.nodeType === Node.TEXT_NODE) {
/** @type {?} */
var before = asElement.previousSibling;
if (before.nodeType === Node.TEXT_NODE) {
// textnode after text node: dont insert dummy node!
}
else {
if (!DomDummyNodeManager.IsDummyNode(before)) {
asElement.parentNode.insertBefore(this.createDummyNode(document), asElement);
}
}
}
if (asElement.nodeType === Node.ELEMENT_NODE) {
/** @type {?} */
var firstChild = node.firstChild;
if (!firstChild) {
// create dummy node in empty tag
node.appendChild(this.createDummyNode(document));
firstChild = node.firstChild;
}
if (Xml2html.isNoClosingElement(node)) {
}
else {
firstChild = node.firstChild;
if (!firstChild) {
// create dummy node in empty tag
node.appendChild(this.createDummyNode(document));
firstChild = node.firstChild;
}
// Insert a dummy node before the first child
if (!DomDummyNodeManager.IsDummyNode(firstChild)) {
if (firstChild) {
node.insertBefore(this.createDummyNode(document), firstChild);
firstChild = node.firstChild;
}
else {
node.appendChild(this.createDummyNode(document));
}
}
/** @type {?} */
var lastChild = node.lastChild;
if (!DomDummyNodeManager.IsDummyNode(lastChild)) {
node.appendChild(this.createDummyNode(document));
lastChild = node.lastChild;
}
// Insert a dummy node before the first (dummy child) but optical in front of the node (to show the cursor in front of the node)
if (nodeDepth > 0) {
if (DomDummyNodeManager.IsDummyNode(firstChild) && !DomDummyNodeManager.IsBeforeFirstTagDummyNode(firstChild)) {
/** @type {?} */
var dummyNode = this.createDummyNode(document);
dummyNode.classList.add(DomDummyNodeManager.DummyNodeBeforeFirstTagClassName);
asElement.insertBefore(dummyNode, firstChild);
}
}
}
}
}
// update child nodes
children.forEach(function (child) {
_this.UpdateDummyNodes(child, nodeDepth + 1);
});
};
/**
* @param {?} targetDocument
* @param {?=} content
* @return {?}
*/
DomDummyNodeManager.prototype.createDummyNode = /**
* @param {?} targetDocument
* @param {?=} content
* @return {?}
*/
function (targetDocument, content) {
/** @type {?} */
var dummyNode = targetDocument.createElement('span');
/** @type {?} */
var dummy2TextNode;
if (content === undefined) {
dummy2TextNode = targetDocument.createTextNode(DomDummyNodeManager.DummyNodeContent);
}
else {
dummy2TextNode = targetDocument.createTextNode(content);
}
dummyNode.classList.add(DomDummyNodeManager.DummyNodeClassName);
dummyNode.appendChild(dummy2TextNode);
return dummyNode;
};
DomDummyNodeManager.DummyNodeClassName = 'dummyNode';
DomDummyNodeManager.DummyNodeBeforeFirstTagClassName = 'beforefirstTag';
DomDummyNodeManager.DummyNodeContent = String.fromCharCode(160);
return DomDummyNodeManager;
}());
export { DomDummyNodeManager };
if (false) {
/** @type {?} */
DomDummyNodeManager.DummyNodeClassName;
/** @type {?} */
DomDummyNodeManager.DummyNodeBeforeFirstTagClassName;
/** @type {?} */
DomDummyNodeManager.DummyNodeContent;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tRHVtbXlOb2RlTWFuYWdlci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIteG1sLWVkaXRvci8iLCJzb3VyY2VzIjpbImxpYi9jb2RlL2R1bW15Tm9kZXMvZG9tRHVtbXlOb2RlTWFuYWdlci5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOztJQU85RDtLQUFnQjs7Ozs7SUFFRiwrQkFBVzs7OztjQUFDLElBQVU7O1FBQ2xDLElBQU0sTUFBTSxxQkFBRyxJQUFlLEVBQUM7UUFDL0IsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUMxRTtRQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7SUFHRCw2Q0FBeUI7Ozs7Y0FBQyxJQUFVO1FBQ2hELElBQUksbUJBQW1CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFOztZQUN6QyxJQUFNLE1BQU0scUJBQUcsSUFBZSxFQUFDO1lBQy9CLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDakQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO2FBQ3hGO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNO1lBQ0wsT0FBTyxLQUFLLENBQUM7U0FDZDs7Ozs7O0lBSVcsc0NBQWtCOzs7O2NBQUMsSUFBVTtRQUN6QyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFDRCxPQUFPLElBQUksRUFBRTtZQUNYLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzVC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VyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sU0FBUyxDQUFDOzs2Q0E5TWdCLFdBQVc7MkRBQ0csZ0JBQWdCOzJDQUNoQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQzs4QkFMM0Q7O1NBRWEsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgWG1sMmh0bWwgfSBmcm9tICcuLi94bWwtaHRtbC1jb252ZXJ0ZXIveG1sMmh0bWwuY2xhc3MnO1xyXG5cclxuZXhwb3J0IGNsYXNzIERvbUR1bW15Tm9kZU1hbmFnZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgRHVtbXlOb2RlQ2xhc3NOYW1lID0gJ2R1bW15Tm9kZSc7XHJcbiAgcHVibGljIHN0YXRpYyBEdW1teU5vZGVCZWZvcmVGaXJzdFRhZ0NsYXNzTmFtZSA9ICdiZWZvcmVmaXJzdFRhZyc7XHJcbiAgcHVibGljIHN0YXRpYyBEdW1teU5vZGVDb250ZW50ID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgSXNEdW1teU5vZGUobm9kZTogTm9kZSkge1xyXG4gICAgY29uc3QgYXNFbGVtID0gbm9kZSBhcyBFbGVtZW50O1xyXG4gICAgaWYgKGFzRWxlbSAmJiBub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgICByZXR1cm4gYXNFbGVtLmNsYXNzTGlzdC5jb250YWlucyhEb21EdW1teU5vZGVNYW5hZ2VyLkR1bW15Tm9kZUNsYXNzTmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIElzQmVmb3JlRmlyc3RUYWdEdW1teU5vZGUobm9kZTogTm9kZSkge1xyXG4gICAgaWYgKERvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUobm9kZSkpIHtcclxuICAgICAgY29uc3QgYXNFbGVtID0gbm9kZSBhcyBFbGVtZW50O1xyXG4gICAgICBpZiAoYXNFbGVtICYmIG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XHJcbiAgICAgICAgcmV0dXJuIGFzRWxlbS5jbGFzc0xpc3QuY29udGFpbnMoRG9tRHVtbXlOb2RlTWFuYWdlci5EdW1teU5vZGVCZWZvcmVGaXJzdFRhZ0NsYXNzTmFtZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IHByZXZpb3Mgc2libGluZyAtIGV4Y2VwdCBkdW1teSBub2Rlc1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UHJldmlvdXNTaWJsaW5nKG5vZGU6IE5vZGUpOiBOb2RlIHtcclxuICAgIGlmICghbm9kZSkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgd2hpbGUgKG5vZGUpIHtcclxuICAgICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xyXG4gICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgIGlmIChEb21EdW1teU5vZGVNYW5hZ2VyLklzRHVtbXlOb2RlKG5vZGUpKSB7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8vIGdldCBuZXh0IHNpYmxpbmcgLSBleGNlcHQgZHVtbXkgbm9kZXNcclxuICBwdWJsaWMgc3RhdGljIGdldE5leHRTaWJsaW5nKG5vZGU6IE5vZGUpOiBOb2RlIHtcclxuICAgIGlmICghbm9kZSkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgd2hpbGUgKG5vZGUpIHtcclxuICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XHJcbiAgICAgIGlmIChub2RlKSB7XHJcbiAgICAgICAgaWYgKERvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUobm9kZSkpIHtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IGNoaWxkcmVuIGNvdW50IC0gZXhjZXB0IGR1bW15IG5vZGVzXHJcbiAgcHVibGljIHN0YXRpYyBnZXRDaGlsZE5vZGVDb3VudChub2RlOiBOb2RlKTogbnVtYmVyIHtcclxuICAgIGlmICghbm9kZSkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoIURvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUobm9kZS5jaGlsZE5vZGVzW2ldKSkge1xyXG4gICAgICAgIGNvdW50Kys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb3VudDtcclxuICB9XHJcblxyXG4gIC8vIGdldCBmaXJzdCBjaGlsZCAtIGV4Y2VwdCBkdW1teSBub2Rlc1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Rmlyc3RDaGlsZChub2RlOiBOb2RlKTogTm9kZSB7XHJcbiAgICBpZiAoIW5vZGUpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGxldCBmaXJzdCA9IG5vZGUuZmlyc3RDaGlsZCBhcyBOb2RlO1xyXG4gICAgd2hpbGUgKERvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUoZmlyc3QpKSB7XHJcbiAgICAgIGZpcnN0ID0gZmlyc3QubmV4dFNpYmxpbmc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmlyc3Q7XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgbGFzdCBjaGlsZCAtIGV4Y2VwdCBkdW1teSBub2Rlc1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TGFzdENoaWxkKG5vZGU6IE5vZGUpOiBOb2RlIHtcclxuICAgIGlmICghbm9kZSkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgbGV0IGxhc3QgPSBub2RlLmxhc3RDaGlsZCBhcyBOb2RlO1xyXG4gICAgd2hpbGUgKERvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUobGFzdCkpIHtcclxuICAgICAgbGFzdCA9IGxhc3QucHJldmlvdXNTaWJsaW5nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxhc3Q7XHJcbiAgfVxyXG5cclxuICBSZW1vdmVBbGxEdW1teU5vZGVzKG5vZGU6IE5vZGUsIG5vZGVEZXB0aCA9IDApOiB2b2lkIHtcclxuICAgIGxldCBjaGlsZHJlbjogTm9kZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjaGlsZHJlbi5wdXNoKG5vZGUuY2hpbGROb2Rlc1tpXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGVsZXRlIGFsbCBkdW1teSBub2RlIGNoaWxkcmVuXHJcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcclxuICAgICAgaWYgKERvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUoY2hpbGQpKSB7XHJcbiAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNoaWxkcmVuID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjaGlsZHJlbi5wdXNoKG5vZGUuY2hpbGROb2Rlc1tpXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXBkYXRlIGNoaWxkIG5vZGVzXHJcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcclxuICAgICAgdGhpcy5SZW1vdmVBbGxEdW1teU5vZGVzKGNoaWxkLCBub2RlRGVwdGggKyAxKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgVXBkYXRlRHVtbXlOb2Rlcyhub2RlOiBOb2RlLCBub2RlRGVwdGggPSAwKSB7XHJcbiAgICBjb25zdCBkb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcclxuICAgIGNvbnN0IGFzRWxlbWVudCA9IG5vZGUgYXMgRWxlbWVudDtcclxuXHJcbiAgICBjb25zdCBjaGlsZHJlbjogTm9kZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjaGlsZHJlbi5wdXNoKG5vZGUuY2hpbGROb2Rlc1tpXSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFzRWxlbWVudCAmJiAhRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShhc0VsZW1lbnQpICYmICFEb21EdW1teU5vZGVNYW5hZ2VyLklzRHVtbXlOb2RlKGFzRWxlbWVudC5wYXJlbnRFbGVtZW50KSkge1xyXG4gICAgICBpZiAoYXNFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IGFzRWxlbWVudC5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgIC8vIHRleHRub2RlIGFmdGVyIHRleHQgbm9kZTogZG9udCBpbnNlcnQgZHVtbXkgbm9kZSFcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKCFEb21EdW1teU5vZGVNYW5hZ2VyLklzRHVtbXlOb2RlKGJlZm9yZSkpIHtcclxuICAgICAgICAgICAgYXNFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuY3JlYXRlRHVtbXlOb2RlKGRvY3VtZW50KSwgYXNFbGVtZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChhc0VsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XHJcbiAgICAgICAgbGV0IGZpcnN0Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgaWYgKCFmaXJzdENoaWxkKSB7XHJcbiAgICAgICAgICAvLyBjcmVhdGUgZHVtbXkgbm9kZSBpbiBlbXB0eSB0YWdcclxuICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVEdW1teU5vZGUoZG9jdW1lbnQpKTtcclxuICAgICAgICAgIGZpcnN0Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoWG1sMmh0bWwuaXNOb0Nsb3NpbmdFbGVtZW50KG5vZGUpKSB7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGZpcnN0Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XHJcblxyXG4gICAgICAgICAgaWYgKCFmaXJzdENoaWxkKSB7XHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBkdW1teSBub2RlIGluIGVtcHR5IHRhZ1xyXG4gICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRHVtbXlOb2RlKGRvY3VtZW50KSk7XHJcbiAgICAgICAgICAgIGZpcnN0Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gSW5zZXJ0IGEgZHVtbXkgbm9kZSBiZWZvcmUgdGhlIGZpcnN0IGNoaWxkXHJcbiAgICAgICAgICBpZiAoIURvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUoZmlyc3RDaGlsZCkpIHtcclxuICAgICAgICAgICAgaWYgKGZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICBub2RlLmluc2VydEJlZm9yZSh0aGlzLmNyZWF0ZUR1bW15Tm9kZShkb2N1bWVudCksIGZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgIGZpcnN0Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUR1bW15Tm9kZShkb2N1bWVudCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gSW5zZXJ0IGEgZHVtbXkgbm9kZSBhZnRlciB0aGUgbGFzdCBjaGlsZFxyXG4gICAgICAgICAgbGV0IGxhc3RDaGlsZCA9IG5vZGUubGFzdENoaWxkO1xyXG4gICAgICAgICAgaWYgKCFEb21EdW1teU5vZGVNYW5hZ2VyLklzRHVtbXlOb2RlKGxhc3RDaGlsZCkpIHtcclxuICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUR1bW15Tm9kZShkb2N1bWVudCkpO1xyXG4gICAgICAgICAgICBsYXN0Q2hpbGQgPSBub2RlLmxhc3RDaGlsZDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBJbnNlcnQgYSBkdW1teSBub2RlIGJlZm9yZSB0aGUgZmlyc3QgKGR1bW15IGNoaWxkKSBidXQgb3B0aWNhbCBpbiBmcm9udCBvZiB0aGUgbm9kZSAodG8gc2hvdyB0aGUgY3Vyc29yIGluIGZyb250IG9mIHRoZSBub2RlKVxyXG4gICAgICAgICAgaWYgKG5vZGVEZXB0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKERvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUoZmlyc3RDaGlsZCkgJiYgIURvbUR1bW15Tm9kZU1hbmFnZXIuSXNCZWZvcmVGaXJzdFRhZ0R1bW15Tm9kZShmaXJzdENoaWxkKSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGR1bW15Tm9kZSA9IHRoaXMuY3JlYXRlRHVtbXlOb2RlKGRvY3VtZW50KTtcclxuICAgICAgICAgICAgICBkdW1teU5vZGUuY2xhc3NMaXN0LmFkZChEb21EdW1teU5vZGVNYW5hZ2VyLkR1bW15Tm9kZUJlZm9yZUZpcnN0VGFnQ2xhc3NOYW1lKTtcclxuICAgICAgICAgICAgICBhc0VsZW1lbnQuaW5zZXJ0QmVmb3JlKGR1bW15Tm9kZSwgZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyB1cGRhdGUgY2hpbGQgbm9kZXNcclxuICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICB0aGlzLlVwZGF0ZUR1bW15Tm9kZXMoY2hpbGQsIG5vZGVEZXB0aCArIDEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlRHVtbXlOb2RlKHRhcmdldERvY3VtZW50OiBEb2N1bWVudCwgY29udGVudD86IHN0cmluZyk6IEVsZW1lbnQge1xyXG4gICAgY29uc3QgZHVtbXlOb2RlID0gdGFyZ2V0RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgbGV0IGR1bW15MlRleHROb2RlO1xyXG4gICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBkdW1teTJUZXh0Tm9kZSA9IHRhcmdldERvY3VtZW50LmNyZWF0ZVRleHROb2RlKERvbUR1bW15Tm9kZU1hbmFnZXIuRHVtbXlOb2RlQ29udGVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkdW1teTJUZXh0Tm9kZSA9IHRhcmdldERvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpO1xyXG4gICAgfVxyXG4gICAgZHVtbXlOb2RlLmNsYXNzTGlzdC5hZGQoRG9tRHVtbXlOb2RlTWFuYWdlci5EdW1teU5vZGVDbGFzc05hbWUpO1xyXG4gICAgZHVtbXlOb2RlLmFwcGVuZENoaWxkKGR1bW15MlRleHROb2RlKTtcclxuICAgIHJldHVybiBkdW1teU5vZGU7XHJcbiAgfVxyXG59XHJcbiJdfQ==