@tricoteuses/arbre-de-la-loi
Version:
Generate ASTs from the French bills & laws; manipulate & export them to Markdown, etc.
675 lines (524 loc) • 53.2 kB
JavaScript
"use strict";
require("core-js/modules/es.array.slice.js");
require("core-js/modules/es.object.to-string.js");
require("core-js/modules/es.array.from.js");
require("core-js/modules/es.string.iterator.js");
require("core-js/modules/es.symbol.js");
require("core-js/modules/es.symbol.description.js");
require("core-js/modules/es.symbol.iterator.js");
require("core-js/modules/es.array.iterator.js");
require("core-js/modules/web.dom-collections.iterator.js");
require("core-js/modules/es.array.is-array.js");
require("core-js/modules/es.object.define-property.js");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.billFromSenatAkomaNtosoXast = billFromSenatAkomaNtosoXast;
require("core-js/modules/es.function.name.js");
require("core-js/modules/es.array.includes.js");
require("core-js/modules/es.array.concat.js");
require("core-js/modules/es.string.match.js");
require("core-js/modules/es.regexp.exec.js");
var _xastUtilToString = _interopRequireDefault(require("xast-util-to-string"));
var _documents = require("./documents");
var _hast = require("./hast");
var _hast_from_xast = _interopRequireDefault(require("./hast_from_xast"));
var _xast = require("./xast");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function billFromSenatAkomaNtosoXast(node) {
var bill = {
children: [],
type: _documents.DocumentNodeType.Bill
};
var _iterator = _createForOfIteratorHelper(node.children),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var child = _step.value;
switch (child.type) {
case _xast.XastType.Cdata:
case _xast.XastType.Comment:
warnUnexpectedNode(child, node);
break;
case _xast.XastType.Doctype:
break;
case _xast.XastType.Element:
if (child.name === "akomaNtoso") {
convertAkomaNtoso(child, bill);
} else {
warnUnexpectedElement(child, node);
}
break;
case _xast.XastType.Instruction:
break;
case _xast.XastType.Text:
warnWhenNonEmptyText(child, node);
break;
default:
(0, _xast.assertNeverXastNode)(child);
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return bill;
}
function convertAkomaNtoso(node, bill) {
console.assert(node.name === "akomaNtoso", "convertAkomaNtoso: Unexpected node name: ".concat(node.name));
var _iterator2 = _createForOfIteratorHelper(node.children),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var child = _step2.value;
switch (child.type) {
case _xast.XastType.Cdata:
case _xast.XastType.Comment:
case _xast.XastType.Instruction:
warnUnexpectedNode(child, node);
break;
case _xast.XastType.Element:
if (child.name === "bill") {
convertBill(child, bill);
} else {
warnUnexpectedElement(child, node);
}
break;
case _xast.XastType.Text:
warnWhenNonEmptyText(child, node);
break;
default:
(0, _xast.assertNeverXastNode)(child);
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
}
function convertBill(node, bill) {
console.assert(node.name === "bill", "convertBill: Unexpected node name: ".concat(node.name)); // const name = node.attributes?.name
// if (name !== undefined) {
// bill.name = name
// }
var _iterator3 = _createForOfIteratorHelper(node.children),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var child = _step3.value;
switch (child.type) {
case _xast.XastType.Cdata:
case _xast.XastType.Comment:
case _xast.XastType.Instruction:
warnUnexpectedNode(child, node);
break;
case _xast.XastType.Element:
switch (child.name) {
case "body":
convertBody(child, bill);
break;
case "meta":
break;
case "preamble":
convertPreamble(child, bill);
break;
default:
warnUnexpectedElement(child, node);
}
break;
case _xast.XastType.Text:
warnWhenNonEmptyText(child, node);
break;
default:
(0, _xast.assertNeverXastNode)(child);
}
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
}
function convertBody(node, bill) {
console.assert(node.name === "body", "convertBody: Unexpected node name: ".concat(node.name));
var _iterator4 = _createForOfIteratorHelper(node.children),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var child = _step4.value;
switch (child.type) {
case _xast.XastType.Cdata:
case _xast.XastType.Comment:
case _xast.XastType.Instruction:
warnUnexpectedNode(child, node);
break;
case _xast.XastType.Element:
switch (child.name) {
case "article":
convertToArticle(child, bill, bill);
break;
case "chapter":
case "part":
case "title":
convertToHierarchyItem(child, bill, bill);
break;
default:
warnUnexpectedElement(child, node);
}
break;
case _xast.XastType.Text:
warnWhenNonEmptyText(child, node);
break;
default:
(0, _xast.assertNeverXastNode)(child);
}
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
}
function convertPreamble(node, bill) {
console.assert(node.name === "preamble", "convertPreamble: Unexpected node name: ".concat(node.name));
var _iterator5 = _createForOfIteratorHelper(node.children),
_step5;
try {
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
var child = _step5.value;
switch (child.type) {
case _xast.XastType.Cdata:
case _xast.XastType.Comment:
case _xast.XastType.Instruction:
warnUnexpectedNode(child, node);
break;
case _xast.XastType.Element:
switch (child.name) {
case "docTitle":
console.assert(bill.headlines === undefined, "convertPreamble: bill.preamble.docTitle is present more than once");
bill.headlines = [{
type: _hast.HastType.Text,
value: (0, _xastUtilToString["default"])(child)
}];
break;
default:
warnUnexpectedElement(child, node);
}
break;
case _xast.XastType.Text:
warnWhenNonEmptyText(child, node);
break;
default:
(0, _xast.assertNeverXastNode)(child);
}
}
} catch (err) {
_iterator5.e(err);
} finally {
_iterator5.f();
}
}
function convertToAlinea(node, _bill, parent) {
console.assert(node.name === "alinea", "convertToAlinea: Unexpected node name: ".concat(node.name));
if (parent.lines === undefined) {
parent.lines = [];
} // const alinea: Alinea = {
// content: [],
// number: -1,
// type: DocumentNodeType.Alinea,
// }
// const chip = node.attributes?.["data:pastille"]
// if (chip !== undefined) {
// alinea.number = parseInt(chip)
// }
// const eId = node.attributes?.eId
// if (eId !== undefined) {
// alinea.eId = eId
// }
// const guid = node.attributes?.GUID
// if (guid !== undefined) {
// alinea.guid = guid
// }
var _iterator6 = _createForOfIteratorHelper(node.children),
_step6;
try {
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
var child = _step6.value;
switch (child.type) {
case _xast.XastType.Cdata:
case _xast.XastType.Comment:
case _xast.XastType.Instruction:
warnUnexpectedNode(child, node);
break;
case _xast.XastType.Element:
switch (child.name) {
case "content":
var _iterator7 = _createForOfIteratorHelper(child.children),
_step7;
try {
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
var xastNode = _step7.value;
parent.lines.push((0, _hast_from_xast["default"])(xastNode));
}
} catch (err) {
_iterator7.e(err);
} finally {
_iterator7.f();
}
break;
default:
warnUnexpectedElement(child, node);
}
break;
case _xast.XastType.Text:
warnWhenNonEmptyText(child, node);
break;
default:
(0, _xast.assertNeverXastNode)(child);
}
}
} catch (err) {
_iterator6.e(err);
} finally {
_iterator6.f();
}
}
function convertToAnnex(node, _bill, parent) {
var _node$attributes, _node$attributes2;
var annex = {
lines: [],
type: _documents.DocumentNodeType.Annex
};
var eId = (_node$attributes = node.attributes) === null || _node$attributes === void 0 ? void 0 : _node$attributes.eId;
if (eId !== undefined) {
annex.eId = eId;
}
var guid = (_node$attributes2 = node.attributes) === null || _node$attributes2 === void 0 ? void 0 : _node$attributes2.GUID;
if (guid !== undefined) {
annex.guid = guid;
}
var _iterator8 = _createForOfIteratorHelper(node.children),
_step8;
try {
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
var child = _step8.value;
switch (child.type) {
case _xast.XastType.Cdata:
case _xast.XastType.Comment:
case _xast.XastType.Instruction:
warnUnexpectedNode(child, node);
break;
case _xast.XastType.Element:
switch (child.name) {
case "alinea":
// TODO
break;
case "headlines":
console.assert(annex.headlines === undefined, "convertToAnnex: ".concat(node.name, ".headlines is present more than once"));
annex.headlines = [{
type: _hast.HastType.Text,
value: (0, _xastUtilToString["default"])(child)
}];
break;
case "num":
// console.assert(
// annex.number === undefined,
// `convertToAnnex: ${node.name}.num is present more than once`,
// )
// annex.number = xastToString(child)
break;
default:
warnUnexpectedElement(child, node);
}
break;
case _xast.XastType.Text:
warnWhenNonEmptyText(child, node);
break;
default:
(0, _xast.assertNeverXastNode)(child);
}
}
} catch (err) {
_iterator8.e(err);
} finally {
_iterator8.f();
}
parent.children.push(annex);
}
function convertToArticle(node, bill, parent) {
var _node$attributes3, _node$attributes4, _node$attributes5;
console.assert(node.name === "article", "convertToArticle: Unexpected node name: ".concat(node.name));
if (node.name === "article" && ((_node$attributes3 = node.attributes) === null || _node$attributes3 === void 0 ? void 0 : _node$attributes3["class"]) === "annexe") {
return convertToAnnex(node, bill, parent);
}
var article = {
children: [],
type: _documents.DocumentNodeType.Article
};
var eId = (_node$attributes4 = node.attributes) === null || _node$attributes4 === void 0 ? void 0 : _node$attributes4.eId;
if (eId !== undefined) {
article.eId = eId;
}
var guid = (_node$attributes5 = node.attributes) === null || _node$attributes5 === void 0 ? void 0 : _node$attributes5.GUID;
if (guid !== undefined) {
article.guid = guid;
}
var _iterator9 = _createForOfIteratorHelper(node.children),
_step9;
try {
for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
var child = _step9.value;
switch (child.type) {
case _xast.XastType.Cdata:
case _xast.XastType.Comment:
case _xast.XastType.Instruction:
warnUnexpectedNode(child, node);
break;
case _xast.XastType.Element:
switch (child.name) {
case "alinea":
convertToAlinea(child, bill, article);
break;
case "num":
// console.assert(
// article.number === undefined,
// `convertToArticle: ${node.name}.num is present more than once`,
// )
// article.number = xastToString(child)
break;
default:
warnUnexpectedElement(child, node);
}
break;
case _xast.XastType.Text:
warnWhenNonEmptyText(child, node);
break;
default:
(0, _xast.assertNeverXastNode)(child);
}
}
} catch (err) {
_iterator9.e(err);
} finally {
_iterator9.f();
}
parent.children.push(article);
}
function convertToHierarchyItem(node, bill, parent) {
var _node$attributes6, _node$attributes7, _node$attributes8;
console.assert(["article", "chapter", "title", "part"].includes(node.name), "convertToHierarchyItem: Unexpected node name: ".concat(node.name));
var hierarchy = {
children: [],
type: node.name
};
if (node.name === "article" && ((_node$attributes6 = node.attributes) === null || _node$attributes6 === void 0 ? void 0 : _node$attributes6["class"]) === "annexe") {
;
hierarchy.type = _documents.DocumentNodeType.Annex;
}
var eId = (_node$attributes7 = node.attributes) === null || _node$attributes7 === void 0 ? void 0 : _node$attributes7.eId;
if (eId !== undefined) {
hierarchy.eId = eId;
}
var guid = (_node$attributes8 = node.attributes) === null || _node$attributes8 === void 0 ? void 0 : _node$attributes8.GUID;
if (guid !== undefined) {
hierarchy.guid = guid;
}
var _iterator10 = _createForOfIteratorHelper(node.children),
_step10;
try {
for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
var child = _step10.value;
switch (child.type) {
case _xast.XastType.Cdata:
case _xast.XastType.Comment:
case _xast.XastType.Instruction:
warnUnexpectedNode(child, node);
break;
case _xast.XastType.Element:
switch (child.name) {
case "article":
convertToArticle(child, bill, hierarchy);
break;
case "chapter":
case "part":
case "title":
convertToHierarchyItem(child, bill, hierarchy);
break;
case "headlines":
console.assert(_documents.documentNodeWithHeadlinesTypes.has(hierarchy.type), "convertToHierarchyItem: Element ${node.name} is not expected to have a headlines");
console.assert(hierarchy.headlines === undefined, "convertToHierarchyItem: ".concat(node.name, ".headlines is present more than once"));
hierarchy.headlines = [{
type: _hast.HastType.Text,
value: (0, _xastUtilToString["default"])(child)
}];
break;
case "num":
// console.assert(
// hierarchy.number === undefined,
// `convertToHierarchyItem: ${node.name}.num is present more than once`,
// )
// hierarchy.number = xastToString(child)
break;
default:
warnUnexpectedElement(child, node);
}
break;
case _xast.XastType.Text:
warnWhenNonEmptyText(child, node);
break;
default:
(0, _xast.assertNeverXastNode)(child);
}
}
} catch (err) {
_iterator10.e(err);
} finally {
_iterator10.f();
}
parent.children.push(hierarchy);
}
function warnUnexpectedElement(node, parent) {
switch (parent.type) {
case _xast.XastType.Element:
console.warn("Unexpected element of name \"".concat(node.name, "\" in node of name: ").concat(parent.name));
break;
case _xast.XastType.Root:
console.warn("Unexpected element of name \"".concat(node.name, "\" in node of type: ").concat(parent.type));
break;
default:
(0, _xast.assertNeverXastNode)(parent);
} // console.warn(JSON.stringify(parent, null, 2))
}
function warnUnexpectedNode(node, parent) {
switch (parent.type) {
case _xast.XastType.Element:
console.warn("Unexpected node of type \"".concat(node.type, "\" in node of name: ").concat(parent.name));
break;
case _xast.XastType.Root:
console.warn("Unexpected node of type \"".concat(node.type, "\" in node of type: ").concat(parent.type));
break;
default:
(0, _xast.assertNeverXastNode)(parent);
} // console.warn(JSON.stringify(parent, null, 2))
}
function warnWhenNonEmptyText(node, parent) {
// See <https://html.spec.whatwg.org/#space-character>.
if (!node.value.match(/^[ \t\n\f\r]*$/)) {
switch (parent.type) {
case _xast.XastType.Element:
console.warn("Unexpected non empty text \"".concat(node.value, "\" in node of name: ").concat(parent.name));
break;
case _xast.XastType.Root:
console.warn("Unexpected non empty text \"".concat(node.value, "\" in node of type: ").concat(parent.type));
break;
default:
(0, _xast.assertNeverXastNode)(parent);
}
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zZW5hdF9ha29tYV9udG9zb19wYXJzZXIudHMiXSwibmFtZXMiOlsiYmlsbEZyb21TZW5hdEFrb21hTnRvc29YYXN0Iiwibm9kZSIsImJpbGwiLCJjaGlsZHJlbiIsInR5cGUiLCJEb2N1bWVudE5vZGVUeXBlIiwiQmlsbCIsImNoaWxkIiwiWGFzdFR5cGUiLCJDZGF0YSIsIkNvbW1lbnQiLCJ3YXJuVW5leHBlY3RlZE5vZGUiLCJEb2N0eXBlIiwiRWxlbWVudCIsIm5hbWUiLCJjb252ZXJ0QWtvbWFOdG9zbyIsIndhcm5VbmV4cGVjdGVkRWxlbWVudCIsIkluc3RydWN0aW9uIiwiVGV4dCIsIndhcm5XaGVuTm9uRW1wdHlUZXh0IiwiY29uc29sZSIsImFzc2VydCIsImNvbnZlcnRCaWxsIiwiY29udmVydEJvZHkiLCJjb252ZXJ0UHJlYW1ibGUiLCJjb252ZXJ0VG9BcnRpY2xlIiwiY29udmVydFRvSGllcmFyY2h5SXRlbSIsImhlYWRsaW5lcyIsInVuZGVmaW5lZCIsIkhhc3RUeXBlIiwidmFsdWUiLCJjb252ZXJ0VG9BbGluZWEiLCJfYmlsbCIsInBhcmVudCIsImxpbmVzIiwieGFzdE5vZGUiLCJwdXNoIiwiY29udmVydFRvQW5uZXgiLCJhbm5leCIsIkFubmV4IiwiZUlkIiwiYXR0cmlidXRlcyIsImd1aWQiLCJHVUlEIiwiYXJ0aWNsZSIsIkFydGljbGUiLCJpbmNsdWRlcyIsImhpZXJhcmNoeSIsImRvY3VtZW50Tm9kZVdpdGhIZWFkbGluZXNUeXBlcyIsImhhcyIsIndhcm4iLCJSb290IiwibWF0Y2giXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBOztBQVdBOztBQUNBOztBQUNBOzs7Ozs7Ozs7O0FBU08sU0FBU0EsMkJBQVQsQ0FBcUNDLElBQXJDLEVBQTJEO0FBQ2hFLE1BQU1DLElBQVUsR0FBRztBQUFFQyxJQUFBQSxRQUFRLEVBQUUsRUFBWjtBQUFnQkMsSUFB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QUFSLHFDQUM4QmpELElBQUksQ0FBQ0csSUFEbkMsaUNBQzZENkIsTUFBTSxDQUFDN0IsSUFEcEU7QUFHQTs7QUFFRjtBQUNFLHFDQUFvQjZCLE1BQXBCO0FBZEosR0FETSxDQWlCTjs7QUFDRDs7QUFFRCxTQUFTZCxvQkFBVCxDQUNFbEIsSUFERixFQUVFZ0MsTUFGRixFQUdRO0FBQ047QUFDQSxNQUFJLENBQUNoQyxJQUFJLENBQUM2QixLQUFMLENBQVdzQixLQUFYLENBQWlCLGdCQUFqQixDQUFMLEVBQXlDO0FBQ3ZDLFlBQVFuQixNQUFNLENBQUM3QixJQUFmO0FBQ0UsV0FBS0ksZUFBU0ssT0FBZDtBQUNFTyxRQUFBQSxPQUFPLENBQUM4QixJQUFSLHVDQUNnQ2pELElBQUksQ0FBQzZCLEtBRHJDLGlDQUNnRUcsTUFBTSxDQUFDbkIsSUFEdkU7QUFHQTs7QUFFRixXQUFLTixlQUFTMkMsSUFBZDtBQUNFL0IsUUFBQUEsT0FBTyxDQUFDOEIsSUFBUix1Q0FDZ0NqRCxJQUFJLENBQUM2QixLQURyQyxpQ0FDZ0VHLE1BQU0sQ0FBQzdCLElBRHZFO0FBR0E7O0FBRUY7QUFDRSx1Q0FBb0I2QixNQUFwQjtBQWRKO0FBZ0JEO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeGFzdFRvU3RyaW5nIGZyb20gXCJ4YXN0LXV0aWwtdG8tc3RyaW5nXCJcblxuaW1wb3J0IHtcbiAgQW5uZXgsXG4gIEFydGljbGUsXG4gIEJpbGwsXG4gIERpdmlzaW9uLFxuICBEaXZpc2lvblR5cGUsXG4gIERvY3VtZW50LFxuICBEb2N1bWVudE5vZGVUeXBlLFxuICBkb2N1bWVudE5vZGVXaXRoSGVhZGxpbmVzVHlwZXMsXG4gIFVuc3RydWN0dXJlZCxcbn0gZnJvbSBcIi4vZG9jdW1lbnRzXCJcbmltcG9ydCB7IEhhc3RFbGVtZW50LCBIYXN0VHlwZSB9IGZyb20gXCIuL2hhc3RcIlxuaW1wb3J0IGhhc3RGcm9tWGFzdCBmcm9tIFwiLi9oYXN0X2Zyb21feGFzdFwiXG5pbXBvcnQge1xuICBhc3NlcnROZXZlclhhc3ROb2RlLFxuICBYYXN0RWxlbWVudCxcbiAgWGFzdE5vZGUsXG4gIFhhc3RSb290LFxuICBYYXN0VGV4dCxcbiAgWGFzdFR5cGUsXG59IGZyb20gXCIuL3hhc3RcIlxuXG5leHBvcnQgZnVuY3Rpb24gYmlsbEZyb21TZW5hdEFrb21hTnRvc29YYXN0KG5vZGU6IFhhc3RSb290KTogQmlsbCB7XG4gIGNvbnN0IGJpbGw6IEJpbGwgPSB7IGNoaWxkcmVuOiBbXSwgdHlwZTogRG9jdW1lbnROb2RlVHlwZS5CaWxsIH1cbiAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICBjYXNlIFhhc3RUeXBlLkNkYXRhOlxuICAgICAgY2FzZSBYYXN0VHlwZS5Db21tZW50OlxuICAgICAgICB3YXJuVW5leHBlY3RlZE5vZGUoY2hpbGQsIG5vZGUpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgWGFzdFR5cGUuRG9jdHlwZTpcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBYYXN0VHlwZS5FbGVtZW50OlxuICAgICAgICBpZiAoY2hpbGQubmFtZSA9PT0gXCJha29tYU50b3NvXCIpIHtcbiAgICAgICAgICBjb252ZXJ0QWtvbWFOdG9zbyhjaGlsZCwgYmlsbClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3YXJuVW5leHBlY3RlZEVsZW1lbnQoY2hpbGQsIG5vZGUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBYYXN0VHlwZS5JbnN0cnVjdGlvbjpcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBYYXN0VHlwZS5UZXh0OlxuICAgICAgICB3YXJuV2hlbk5vbkVtcHR5VGV4dChjaGlsZCwgbm9kZSlcbiAgICAgICAgYnJlYWtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXNzZXJ0TmV2ZXJYYXN0Tm9kZShjaGlsZClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJpbGwgYXMgQmlsbFxufVxuXG5mdW5jdGlvbiBjb252ZXJ0QWtvbWFOdG9zbyhub2RlOiBYYXN0RWxlbWVudCwgYmlsbDogQmlsbCkge1xuICBjb25zb2xlLmFzc2VydChcbiAgICBub2RlLm5hbWUgPT09IFwiYWtvbWFOdG9zb1wiLFxuICAgIGBjb252ZXJ0QWtvbWFOdG9zbzogVW5leHBlY3RlZCBub2RlIG5hbWU6ICR7bm9kZS5uYW1lfWAsXG4gIClcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICBjYXNlIFhhc3RUeXBlLkNkYXRhOlxuICAgICAgY2FzZSBYYXN0VHlwZS5Db21tZW50OlxuICAgICAgY2FzZSBYYXN0VHlwZS5JbnN0cnVjdGlvbjpcbiAgICAgICAgd2FyblVuZXhwZWN0ZWROb2RlKGNoaWxkLCBub2RlKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFhhc3RUeXBlLkVsZW1lbnQ6XG4gICAgICAgIGlmIChjaGlsZC5uYW1lID09PSBcImJpbGxcIikge1xuICAgICAgICAgIGNvbnZlcnRCaWxsKGNoaWxkLCBiaWxsKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm5VbmV4cGVjdGVkRWxlbWVudChjaGlsZCwgbm9kZSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFhhc3RUeXBlLlRleHQ6XG4gICAgICAgIHdhcm5XaGVuTm9uRW1wdHlUZXh0KGNoaWxkLCBub2RlKVxuICAgICAgICBicmVha1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlclhhc3ROb2RlKGNoaWxkKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0QmlsbChub2RlOiBYYXN0RWxlbWVudCwgYmlsbDogQmlsbCk6IHZvaWQge1xuICBjb25zb2xlLmFzc2VydChcbiAgICBub2RlLm5hbWUgPT09IFwiYmlsbFwiLFxuICAgIGBjb252ZXJ0QmlsbDogVW5leHBlY3RlZCBub2RlIG5hbWU6ICR7bm9kZS5uYW1lfWAsXG4gIClcblxuICAvLyBjb25zdCBuYW1lID0gbm9kZS5hdHRyaWJ1dGVzPy5uYW1lXG4gIC8vIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgLy8gICBiaWxsLm5hbWUgPSBuYW1lXG4gIC8vIH1cblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgWGFzdFR5cGUuQ2RhdGE6XG4gICAgICBjYXNlIFhhc3RUeXBlLkNvbW1lbnQ6XG4gICAgICBjYXNlIFhhc3RUeXBlLkluc3RydWN0aW9uOlxuICAgICAgICB3YXJuVW5leHBlY3RlZE5vZGUoY2hpbGQsIG5vZGUpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgWGFzdFR5cGUuRWxlbWVudDpcbiAgICAgICAgc3dpdGNoIChjaGlsZC5uYW1lKSB7XG4gICAgICAgICAgY2FzZSBcImJvZHlcIjpcbiAgICAgICAgICAgIGNvbnZlcnRCb2R5KGNoaWxkLCBiaWxsKVxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgY2FzZSBcInByZWFtYmxlXCI6XG4gICAgICAgICAgICBjb252ZXJ0UHJlYW1ibGUoY2hpbGQsIGJpbGwpXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHdhcm5VbmV4cGVjdGVkRWxlbWVudChjaGlsZCwgbm9kZSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFhhc3RUeXBlLlRleHQ6XG4gICAgICAgIHdhcm5XaGVuTm9uRW1wdHlUZXh0KGNoaWxkLCBub2RlKVxuICAgICAgICBicmVha1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlclhhc3ROb2RlKGNoaWxkKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0Qm9keShub2RlOiBYYXN0RWxlbWVudCwgYmlsbDogQmlsbCk6IHZvaWQge1xuICBjb25zb2xlLmFzc2VydChcbiAgICBub2RlLm5hbWUgPT09IFwiYm9keVwiLFxuICAgIGBjb252ZXJ0Qm9keTogVW5leHBlY3RlZCBub2RlIG5hbWU6ICR7bm9kZS5uYW1lfWAsXG4gIClcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICBjYXNlIFhhc3RUeXBlLkNkYXRhOlxuICAgICAgY2FzZSBYYXN0VHlwZS5Db21tZW50OlxuICAgICAgY2FzZSBYYXN0VHlwZS5JbnN0cnVjdGlvbjpcbiAgICAgICAgd2FyblVuZXhwZWN0ZWROb2RlKGNoaWxkLCBub2RlKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFhhc3RUeXBlLkVsZW1lbnQ6XG4gICAgICAgIHN3aXRjaCAoY2hpbGQubmFtZSkge1xuICAgICAgICAgIGNhc2UgXCJhcnRpY2xlXCI6XG4gICAgICAgICAgICBjb252ZXJ0VG9BcnRpY2xlKGNoaWxkLCBiaWxsLCBiaWxsKVxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGNhc2UgXCJjaGFwdGVyXCI6XG4gICAgICAgICAgY2FzZSBcInBhcnRcIjpcbiAgICAgICAgICBjYXNlIFwidGl0bGVcIjpcbiAgICAgICAgICAgIGNvbnZlcnRUb0hpZXJhcmNoeUl0ZW0oY2hpbGQsIGJpbGwsIGJpbGwpXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHdhcm5VbmV4cGVjdGVkRWxlbWVudChjaGlsZCwgbm9kZSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFhhc3RUeXBlLlRleHQ6XG4gICAgICAgIHdhcm5XaGVuTm9uRW1wdHlUZXh0KGNoaWxkLCBub2RlKVxuICAgICAgICBicmVha1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlclhhc3ROb2RlKGNoaWxkKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0UHJlYW1ibGUobm9kZTogWGFzdEVsZW1lbnQsIGJpbGw6IEJpbGwpOiB2b2lkIHtcbiAgY29uc29sZS5hc3NlcnQoXG4gICAgbm9kZS5uYW1lID09PSBcInByZWFtYmxlXCIsXG4gICAgYGNvbnZlcnRQcmVhbWJsZTogVW5leHBlY3RlZCBub2RlIG5hbWU6ICR7bm9kZS5uYW1lfWAsXG4gIClcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICBjYXNlIFhhc3RUeXBlLkNkYXRhOlxuICAgICAgY2FzZSBYYXN0VHlwZS5Db21tZW50OlxuICAgICAgY2FzZSBYYXN0VHlwZS5JbnN0cnVjdGlvbjpcbiAgICAgICAgd2FyblVuZXhwZWN0ZWROb2RlKGNoaWxkLCBub2RlKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFhhc3RUeXBlLkVsZW1lbnQ6XG4gICAgICAgIHN3aXRjaCAoY2hpbGQubmFtZSkge1xuICAgICAgICAgIGNhc2UgXCJkb2NUaXRsZVwiOlxuICAgICAgICAgICAgY29uc29sZS5hc3NlcnQoXG4gICAgICAgICAgICAgIGJpbGwuaGVhZGxpbmVzID09PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIFwiY29udmVydFByZWFtYmxlOiBiaWxsLnByZWFtYmxlLmRvY1RpdGxlIGlzIHByZXNlbnQgbW9yZSB0aGFuIG9uY2VcIixcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGJpbGwuaGVhZGxpbmVzID0gW3sgdHlwZTogSGFzdFR5cGUuVGV4dCwgdmFsdWU6IHhhc3RUb1N0cmluZyhjaGlsZCkgfV1cbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgd2FyblVuZXhwZWN0ZWRFbGVtZW50KGNoaWxkLCBub2RlKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgWGFzdFR5cGUuVGV4dDpcbiAgICAgICAgd2FybldoZW5Ob25FbXB0eVRleHQoY2hpbGQsIG5vZGUpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFzc2VydE5ldmVyWGFzdE5vZGUoY2hpbGQpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUb0FsaW5lYShcbiAgbm9kZTogWGFzdEVsZW1lbnQsXG4gIF9iaWxsOiBCaWxsLFxuICBwYXJlbnQ6IEFydGljbGUsXG4pOiB2b2lkIHtcbiAgY29uc29sZS5hc3NlcnQoXG4gICAgbm9kZS5uYW1lID09PSBcImFsaW5lYVwiLFxuICAgIGBjb252ZXJ0VG9BbGluZWE6IFVuZXhwZWN0ZWQgbm9kZSBuYW1lOiAke25vZGUubmFtZX1gLFxuICApXG4gIGlmIChwYXJlbnQubGluZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHBhcmVudC5saW5lcyA9IFtdXG4gIH1cbiAgLy8gY29uc3QgYWxpbmVhOiBBbGluZWEgPSB7XG4gIC8vICAgY29udGVudDogW10sXG4gIC8vICAgbnVtYmVyOiAtMSxcbiAgLy8gICB0eXBlOiBEb2N1bWVudE5vZGVUeXBlLkFsaW5lYSxcbiAgLy8gfVxuXG4gIC8vIGNvbnN0IGNoaXAgPSBub2RlLmF0dHJpYnV0ZXM/LltcImRhdGE6cGFzdGlsbGVcIl1cbiAgLy8gaWYgKGNoaXAgIT09IHVuZGVmaW5lZCkge1xuICAvLyAgIGFsaW5lYS5udW1iZXIgPSBwYXJzZUludChjaGlwKVxuICAvLyB9XG4gIC8vIGNvbnN0IGVJZCA9IG5vZGUuYXR0cmlidXRlcz8uZUlkXG4gIC8vIGlmIChlSWQgIT09IHVuZGVmaW5lZCkge1xuICAvLyAgIGFsaW5lYS5lSWQgPSBlSWRcbiAgLy8gfVxuICAvLyBjb25zdCBndWlkID0gbm9kZS5hdHRyaWJ1dGVzPy5HVUlEXG4gIC8vIGlmIChndWlkICE9PSB1bmRlZmluZWQpIHtcbiAgLy8gICBhbGluZWEuZ3VpZCA9IGd1aWRcbiAgLy8gfVxuXG4gIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xuICAgICAgY2FzZSBYYXN0VHlwZS5DZGF0YTpcbiAgICAgIGNhc2UgWGFzdFR5cGUuQ29tbWVudDpcbiAgICAgIGNhc2UgWGFzdFR5cGUuSW5zdHJ1Y3Rpb246XG4gICAgICAgIHdhcm5VbmV4cGVjdGVkTm9kZShjaGlsZCwgbm9kZSlcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBYYXN0VHlwZS5FbGVtZW50OlxuICAgICAgICBzd2l0Y2ggKGNoaWxkLm5hbWUpIHtcbiAgICAgICAgICBjYXNlIFwiY29udGVudFwiOlxuICAgICAgICAgICAgZm9yIChjb25zdCB4YXN0Tm9kZSBvZiBjaGlsZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICBwYXJlbnQubGluZXMucHVzaChoYXN0RnJvbVhhc3QoeGFzdE5vZGUpIGFzIEhhc3RFbGVtZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB3YXJuVW5leHBlY3RlZEVsZW1lbnQoY2hpbGQsIG5vZGUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBYYXN0VHlwZS5UZXh0OlxuICAgICAgICB3YXJuV2hlbk5vbkVtcHR5VGV4dChjaGlsZCwgbm9kZSlcbiAgICAgICAgYnJlYWtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXNzZXJ0TmV2ZXJYYXN0Tm9kZShjaGlsZClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFRvQW5uZXgoXG4gIG5vZGU6IFhhc3RFbGVtZW50LFxuICBfYmlsbDogQmlsbCxcbiAgcGFyZW50OiBEaXZpc2lvbiB8IERvY3VtZW50IHwgVW5zdHJ1Y3R1cmVkLFxuKTogdm9pZCB7XG4gIGNvbnN0IGFubmV4OiBBbm5leCA9IHtcbiAgICBsaW5lczogW10sXG4gICAgdHlwZTogRG9jdW1lbnROb2RlVHlwZS5Bbm5leCxcbiAgfVxuXG4gIGNvbnN0IGVJZCA9IG5vZGUuYXR0cmlidXRlcz8uZUlkXG4gIGlmIChlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFubmV4LmVJZCA9IGVJZFxuICB9XG4gIGNvbnN0IGd1aWQgPSBub2RlLmF0dHJpYnV0ZXM/LkdVSURcbiAgaWYgKGd1aWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFubmV4Lmd1aWQgPSBndWlkXG4gIH1cblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgWGFzdFR5cGUuQ2RhdGE6XG4gICAgICBjYXNlIFhhc3RUeXBlLkNvbW1lbnQ6XG4gICAgICBjYXNlIFhhc3RUeXBlLkluc3RydWN0aW9uOlxuICAgICAgICB3YXJuVW5leHBlY3RlZE5vZGUoY2hpbGQsIG5vZGUpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgWGFzdFR5cGUuRWxlbWVudDpcbiAgICAgICAgc3dpdGNoIChjaGlsZC5uYW1lKSB7XG4gICAgICAgICAgY2FzZSBcImFsaW5lYVwiOlxuICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGNhc2UgXCJoZWFkbGluZXNcIjpcbiAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KFxuICAgICAgICAgICAgICBhbm5leC5oZWFkbGluZXMgPT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgYGNvbnZlcnRUb0FubmV4OiAke25vZGUubmFtZX0uaGVhZGxpbmVzIGlzIHByZXNlbnQgbW9yZSB0aGFuIG9uY2VgLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYW5uZXguaGVhZGxpbmVzID0gW1xuICAgICAgICAgICAgICB7IHR5cGU6IEhhc3RUeXBlLlRleHQsIHZhbHVlOiB4YXN0VG9TdHJpbmcoY2hpbGQpIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgY2FzZSBcIm51bVwiOlxuICAgICAgICAgICAgLy8gY29uc29sZS5hc3NlcnQoXG4gICAgICAgICAgICAvLyAgIGFubmV4Lm51bWJlciA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgLy8gICBgY29udmVydFRvQW5uZXg6ICR7bm9kZS5uYW1lfS5udW0gaXMgcHJlc2VudCBtb3JlIHRoYW4gb25jZWAsXG4gICAgICAgICAgICAvLyApXG4gICAgICAgICAgICAvLyBhbm5leC5udW1iZXIgPSB4YXN0VG9TdHJpbmcoY2hpbGQpXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHdhcm5VbmV4cGVjdGVkRWxlbWVudChjaGlsZCwgbm9kZSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFhhc3RUeXBlLlRleHQ6XG4gICAgICAgIHdhcm5XaGVuTm9uRW1wdHlUZXh0KGNoaWxkLCBub2RlKVxuICAgICAgICBicmVha1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlclhhc3ROb2RlKGNoaWxkKVxuICAgIH1cbiAgfVxuXG4gIHBhcmVudC5jaGlsZHJlbiEucHVzaChhbm5leClcbn1cblxuZnVuY3Rpb24gY29udmVydFRvQXJ0aWNsZShcbiAgbm9kZTogWGFzdEVsZW1lbnQsXG4gIGJpbGw6IEJpbGwsXG4gIHBhcmVudDogRGl2aXNpb24gfCBEb2N1bWVudCB8IFVuc3RydWN0dXJlZCxcbik6IHZvaWQge1xuICBjb25zb2xlLmFzc2VydChcbiAgICBub2RlLm5hbWUgPT09IFwiYXJ0aWNsZVwiLFxuICAgIGBjb252ZXJ0VG9BcnRpY2xlOiBVbmV4cGVjdGVkIG5vZGUgbmFtZTogJHtub2RlLm5hbWV9YCxcbiAgKVxuICBpZiAobm9kZS5uYW1lID09PSBcImFydGljbGVcIiAmJiBub2RlLmF0dHJpYnV0ZXM/LmNsYXNzID09PSBcImFubmV4ZVwiKSB7XG4gICAgcmV0dXJuIGNvbnZlcnRUb0FubmV4KG5vZGUsIGJpbGwsIHBhcmVudClcbiAgfVxuICBjb25zdCBhcnRpY2xlOiBBcnRpY2xlID0ge1xuICAgIGNoaWxkcmVuOiBbXSxcbiAgICB0eXBlOiBEb2N1bWVudE5vZGVUeXBlLkFydGljbGUsXG4gIH1cblxuICBjb25zdCBlSWQgPSBub2RlLmF0dHJpYnV0ZXM/LmVJZFxuICBpZiAoZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhcnRpY2xlLmVJZCA9IGVJZFxuICB9XG4gIGNvbnN0IGd1aWQgPSBub2RlLmF0dHJpYnV0ZXM/LkdVSURcbiAgaWYgKGd1aWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFydGljbGUuZ3VpZCA9IGd1aWRcbiAgfVxuXG4gIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xuICAgICAgY2FzZSBYYXN0VHlwZS5DZGF0YTpcbiAgICAgIGNhc2UgWGFzdFR5cGUuQ29tbWVudDpcbiAgICAgIGNhc2UgWGFzdFR5cGUuSW5zdHJ1Y3Rpb246XG4gICAgICAgIHdhcm5VbmV4cGVjdGVkTm9kZShjaGlsZCwgbm9kZSlcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBYYXN0VHlwZS5FbGVtZW50OlxuICAgICAgICBzd2l0Y2ggKGNoaWxkLm5hbWUpIHtcbiAgICAgICAgICBjYXNlIFwiYWxpbmVhXCI6XG4gICAgICAgICAgICBjb252ZXJ0VG9BbGluZWEoY2hpbGQsIGJpbGwsIGFydGljbGUpXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgY2FzZSBcIm51bVwiOlxuICAgICAgICAgICAgLy8gY29uc29sZS5hc3NlcnQoXG4gICAgICAgICAgICAvLyAgIGFydGljbGUubnVtYmVyID09PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAvLyAgIGBjb252ZXJ0VG9BcnRpY2xlOiAke25vZGUubmFtZX0ubnVtIGlzIHByZXNlbnQgbW9yZSB0aGFuIG9uY2VgLFxuICAgICAgICAgICAgLy8gKVxuICAgICAgICAgICAgLy8gYXJ0aWNsZS5udW1iZXIgPSB4YXN0VG9TdHJpbmcoY2hpbGQpXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHdhcm5VbmV4cGVjdGVkRWxlbWVudChjaGlsZCwgbm9kZSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFhhc3RUeXBlLlRleHQ6XG4gICAgICAgIHdhcm5XaGVuTm9uRW1wdHlUZXh0KGNoaWxkLCBub2RlKVxuICAgICAgICBicmVha1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlclhhc3ROb2RlKGNoaWxkKVxuICAgIH1cbiAgfVxuXG4gIHBhcmVudC5jaGlsZHJlbiEucHVzaChhcnRpY2xlIGFzIEFydGljbGUpXG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUb0hpZXJhcmNoeUl0ZW0oXG4gIG5vZGU6IFhhc3RFbGVtZW50LFxuICBiaWxsOiBCaWxsLFxuICBwYXJlbnQ6IERpdmlzaW9uIHwgRG9jdW1lbnQgfCBVbnN0cnVjdHVyZWQsXG4pOiB2b2lkIHtcbiAgY29uc29sZS5hc3NlcnQoXG4gICAgW1wiYXJ0aWNsZVwiLCBcImNoYXB0ZXJcIiwgXCJ0aXRsZVwiLCBcInBhcnRcIl0uaW5jbHVkZXMobm9kZS5uYW1lKSxcbiAgICBgY29udmVydFRvSGllcmFyY2h5SXRlbTogVW5leHBlY3RlZCBub2RlIG5hbWU6ICR7bm9kZS5uYW1lfWAsXG4gIClcbiAgY29uc3QgaGllcmFyY2h5OiBEaXZpc2lvbiA9IHtcbiAgICBjaGlsZHJlbjogW10sXG4gICAgdHlwZTogbm9kZS5uYW1lIGFzIERpdmlzaW9uVHlwZSxcbiAgfVxuICBpZiAobm9kZS5uYW1lID09PSBcImFydGljbGVcIiAmJiBub2RlLmF0dHJpYnV0ZXM/LmNsYXNzID09PSBcImFubmV4ZVwiKSB7XG4gICAgOyhoaWVyYXJjaHkgYXMgRGl2aXNpb24gfCBVbnN0cnVjdHVyZWQpLnR5cGUgPSBEb2N1bWVudE5vZGVUeXBlLkFubmV4XG4gIH1cblxuICBjb25zdCBlSWQgPSBub2RlLmF0dHJpYnV0ZXM/LmVJZFxuICBpZiAoZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBoaWVyYXJjaHkuZUlkID0gZUlkXG4gIH1cbiAgY29uc3QgZ3VpZCA9IG5vZGUuYXR0cmlidXRlcz8uR1VJRFxuICBpZiAoZ3VpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaGllcmFyY2h5Lmd1aWQgPSBndWlkXG4gIH1cblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgWGFzdFR5cGUuQ2RhdGE6XG4gICAgICBjYXNlIFhhc3RUeXBlLkNvbW1lbnQ6XG4gICAgICBjYXNlIFhhc3RUeXBlLkluc3RydWN0aW9uOlxuICAgICAgICB3YXJuVW5leHBlY3RlZE5vZGUoY2hpbGQsIG5vZGUpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgWGFzdFR5cGUuRWxlbWVudDpcbiAgICAgICAgc3dpdGNoIChjaGlsZC5uYW1lKSB7XG4gICAgICAgICAgY2FzZSBcImFydGljbGVcIjpcbiAgICAgICAgICAgIGNvbnZlcnRUb0FydGljbGUoY2hpbGQsIGJpbGwsIGhpZXJhcmNoeSlcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlIFwiY2hhcHRlclwiOlxuICAgICAgICAgIGNhc2UgXCJwYXJ0XCI6XG4gICAgICAgICAgY2FzZSBcInRpdGxlXCI6XG4gICAgICAgICAgICBjb252ZXJ0VG9IaWVyYXJjaHlJdGVtKGNoaWxkLCBiaWxsLCBoaWVyYXJjaHkpXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgY2FzZSBcImhlYWRsaW5lc1wiOlxuICAgICAgICAgICAgY29uc29sZS5hc3NlcnQoXG4gICAgICAgICAgICAgIGRvY3VtZW50Tm9kZVdpdGhIZWFkbGluZXNUeXBlcy5oYXMoaGllcmFyY2h5LnR5cGUhKSxcbiAgICAgICAgICAgICAgXCJjb252ZXJ0VG9IaWVyYXJjaHlJdGVtOiBFbGVtZW50ICR7bm9kZS5uYW1lfSBpcyBub3QgZXhwZWN0ZWQgdG8gaGF2ZSBhIGhlYWRsaW5lc1wiLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc29sZS5hc3NlcnQoXG4gICAgICAgICAgICAgIGhpZXJhcmNoeS5oZWFkbGluZXMgPT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgYGNvbnZlcnRUb0hpZXJhcmNoeUl0ZW06ICR7bm9kZS5uYW1lfS5oZWFkbGluZXMgaXMgcHJlc2VudCBtb3JlIHRoYW4gb25jZWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBoaWVyYXJjaHkuaGVhZGxpbmVzID0gW1xuICAgICAgICAgICAgICB7IHR5cGU6I