UNPKG

@tricoteuses/arbre-de-la-loi

Version:

Generate ASTs from the French bills & laws; manipulate & export them to Markdown, etc.

370 lines (289 loc) 35.6 kB
"use strict"; require("core-js/modules/es.array.slice.js"); require("core-js/modules/es.function.name.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.is-array.js"); require("core-js/modules/es.object.define-property.js"); Object.defineProperty(exports, "__esModule", { value: true }); exports.parseTexteMarkdown = parseTexteMarkdown; exports.restructureTexteMarkdown = restructureTexteMarkdown; exports.stringifyTree = stringifyTree; exports.NodeType = void 0; require("core-js/modules/es.string.replace.js"); require("core-js/modules/es.regexp.exec.js"); require("core-js/modules/es.string.split.js"); require("core-js/modules/es.string.trim.js"); require("core-js/modules/es.array.includes.js"); require("core-js/modules/es.string.includes.js"); require("core-js/modules/es.string.match.js"); require("core-js/modules/es.object.to-string.js"); require("core-js/modules/es.array.iterator.js"); require("core-js/modules/web.dom-collections.iterator.js"); require("core-js/modules/es.array.join.js"); require("core-js/modules/es.array.map.js"); require("core-js/modules/es.array.filter.js"); require("core-js/modules/es.string.trim-end.js"); require("core-js/modules/es.array.concat.js"); require("core-js/modules/es.string.repeat.js"); function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } 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(_e2) { throw _e2; }, 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(_e3) { didErr = true; err = _e3; }, 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; } var NodeType; exports.NodeType = NodeType; (function (NodeType) { NodeType[NodeType["TEXTE"] = 0] = "TEXTE"; NodeType[NodeType["TOME"] = 1] = "TOME"; NodeType[NodeType["PARTIE"] = 2] = "PARTIE"; NodeType[NodeType["LIVRE"] = 3] = "LIVRE"; NodeType[NodeType["TITRE"] = 4] = "TITRE"; NodeType[NodeType["SOUS_TITRE"] = 5] = "SOUS_TITRE"; NodeType[NodeType["CHAPITRE"] = 6] = "CHAPITRE"; NodeType[NodeType["SECTION"] = 7] = "SECTION"; NodeType[NodeType["SOUS_SECTION"] = 8] = "SOUS_SECTION"; NodeType[NodeType["ARTICLE"] = 9] = "ARTICLE"; NodeType[NodeType["ANNEXE"] = 10] = "ANNEXE"; NodeType[NodeType["ETAT"] = 11] = "ETAT"; NodeType[NodeType["EXPOSE_DES_MOTIFS"] = 12] = "EXPOSE_DES_MOTIFS"; NodeType[NodeType["AUTRE"] = 13] = "AUTRE"; })(NodeType || (exports.NodeType = NodeType = {})); function headerFromLine(line) { var header = line // Remove bold (generated by Turndown) from header. .replace(/^\*\*(.+)\*\*$/, "$1"); return header; } function parseTexteMarkdown(markdown, texteHeaders) { var rootNodes = [{ headers: ["Autre"], type: NodeType.AUTRE }]; var breadcrumb = [rootNodes[0]]; var _iterator = _createForOfIteratorHelper(markdown.split("\n")), _step; try { linesLoop: for (_iterator.s(); !(_step = _iterator.n()).done;) { var line = _step.value; var currentRootNode = rootNodes[rootNodes.length - 1]; var lineSimplified = line.normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/\*\*/g, "") // Remove Markdown bold (added by Turndown). .replace(/\(nouveau\)/, "").replace(/\(Pour coordination\)/, "").replace(/\(Supprimés?\)/, "").replace(/ /g, " ").replace(/[\-,.…]/g, "").trim().replace(/ {1,}/g, "_").toUpperCase(); var _iterator2 = _createForOfIteratorHelper([// "Exposé des motifs" without content: // * http://www.assemblee-nationale.fr/15/textes/0702.asp // "Exposé des motifs" with content: // * http://www.assemblee-nationale.fr/15/textes/1326.asp // * http://www.assemblee-nationale.fr/15/textes/1610.asp [/^EXPOSE_DES_MOTIFS$/, NodeType.EXPOSE_DES_MOTIFS], // "Projet de loi" ou "Proposition de loi": // * http://www.assemblee-nationale.fr/15/textes/0232.asp // * http://www.assemblee-nationale.fr/15/textes/0626.asp // * http://www.assemblee-nationale.fr/15/textes/0676.asp [/^(PROJET|PROPOSITION)_DE_LOI(_|$)/, NodeType.TEXTE], [/^TEXTE_(DE_LA_PROPOSITION|DU_PROJET)_DE_LOI(_|$)/, NodeType.TEXTE]]), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var _step2$value = _slicedToArray(_step2.value, 2), _regExp2 = _step2$value[0], _headingType2 = _step2$value[1]; if (lineSimplified.match(_regExp2) !== null) { currentRootNode = { headers: [headerFromLine(line)], type: _headingType2 }; rootNodes.push(currentRootNode); breadcrumb[0] = currentRootNode; breadcrumb.length = 1; continue linesLoop; } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } if ([NodeType.AUTRE, NodeType.TEXTE].includes(currentRootNode.type)) { var _iterator3 = _createForOfIteratorHelper([[/^ARTICLES?_/, NodeType.ARTICLE], [/^CHAPITRE_/, NodeType.CHAPITRE], [/^LIVRE_/, NodeType.LIVRE], [/^PARTIE_/, NodeType.PARTIE], [/^(PREMIERE|SECONDE|DEUXIEME|TROISIEME|QUATRIEME)_PARTIE(_|$)/, NodeType.PARTIE], [/^SECTION_/, NodeType.SECTION], [/^SOUSSECTION_/, NodeType.SOUS_SECTION], [/^SOUSTITRE_/, NodeType.SOUS_TITRE], [/^TITRE_/, NodeType.TITRE], [/^TOME_/, NodeType.TOME]]), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var _step3$value = _slicedToArray(_step3.value, 2), _regExp = _step3$value[0], _headingType = _step3$value[1]; if (lineSimplified.match(_regExp) !== null) { var _node3 = { headers: [headerFromLine(line)], type: _headingType }; if (currentRootNode.type !== NodeType.TEXTE) { currentRootNode = { headers: texteHeaders, type: NodeType.TEXTE }; rootNodes.push(currentRootNode); breadcrumb[0] = currentRootNode; breadcrumb.length = 1; } // Try to retrieve a node of the same type in breadcrumb and // append new node to it. var _iterator5 = _createForOfIteratorHelper(breadcrumb.entries()), _step5; try { for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { var _step5$value = _slicedToArray(_step5.value, 2), depth = _step5$value[0], breadcrumbNode = _step5$value[1]; if (breadcrumbNode.type === _headingType) { breadcrumb[depth - 1].children.push(_node3); breadcrumb[depth] = _node3; breadcrumb.length = depth + 1; continue linesLoop; } } // Create a new level in breadcrumb for the new node } catch (err) { _iterator5.e(err); } finally { _iterator5.f(); } var parentNode = breadcrumb[breadcrumb.length - 1]; console.assert(parentNode.children === undefined); parentNode.children = [_node3]; breadcrumb.push(_node3); continue linesLoop; } } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } if (currentRootNode.type === NodeType.TEXTE) { var _iterator4 = _createForOfIteratorHelper([[/^ETAT_/, NodeType.ETAT], [/^(RAPPORT_)?ANNEXE(_|$)/, NodeType.ANNEXE]]), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var _step4$value = _slicedToArray(_step4.value, 2), regExp = _step4$value[0], headingType = _step4$value[1]; if (lineSimplified.match(regExp) !== null) { var _node2 = { headers: [headerFromLine(line)], type: headingType }; if (currentRootNode.children === undefined) { currentRootNode.children = [_node2]; console.assert(breadcrumb.length === 1); breadcrumb.push(_node2); } else { currentRootNode.children.push(_node2); console.assert(breadcrumb.length >= 2); breadcrumb[1] = _node2; breadcrumb.length = 2; } continue linesLoop; } } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } var _node = breadcrumb[breadcrumb.length - 1]; if (_node.alineas === undefined && _node.headers.length === 1 && ![NodeType.ARTICLE, NodeType.EXPOSE_DES_MOTIFS].includes(_node.type)) { if (line.trim()) { // Second title of node _node.headers.push(headerFromLine(line)); } continue linesLoop; } if (_node.alineas === undefined) { _node.alineas = []; } // Remove (optional) "pastille" (aka alinea number) from alinea. var alinea = line.replace(/^\(\d+\)\s*/, ""); _node.alineas.push(alinea); continue linesLoop; } } // The currentRootNode is not of type TEXTE. var node = breadcrumb[breadcrumb.length - 1]; if (node.alineas === undefined) { node.alineas = []; } node.alineas.push(line); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } // console.log(JSON.stringify(rootNodes, null, 2)) return rootNodes; } function restructureTexteMarkdown(markdown, texteHeaders) { markdown = markdown // Replace non-breaking Hyphen with normal hyphen. .replace(/\u2011/g, "-"); markdown = parseTexteMarkdown(markdown, texteHeaders).filter(function (node) { return node.type === NodeType.TEXTE; }).map(function (node) { return stringifyTree(node); }).join("\n\n") // Replace multiple spaces with a single space. .replace(/ {2,}/g, " ") // Replace sequences of more than 2 \n with exactly 2 \n. .replace(/\n{3,}/g, "\n\n") // Remove leading line breaks. .replace(/^\n+/, "") // Remove trailing line breaks. .replace(/\n{2,}$/, ""); return markdown; } function stringifyNodeToLines(node, depth, lines) { var _iterator6 = _createForOfIteratorHelper(node.headers), _step6; try { for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { var header = _step6.value; if (lines.length > 0 && lines[lines.length - 1] !== "") { lines.push(""); } lines.push("".concat("#".repeat(depth + 1), " ").concat(header.trim())); lines.push(""); } } catch (err) { _iterator6.e(err); } finally { _iterator6.f(); } if (node.alineas !== undefined) { var _iterator7 = _createForOfIteratorHelper(node.alineas), _step7; try { for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) { var alinea = _step7.value; lines.push(alinea.trimRight()); } } catch (err) { _iterator7.e(err); } finally { _iterator7.f(); } } if (node.children !== undefined) { var _iterator8 = _createForOfIteratorHelper(node.children), _step8; try { for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) { var child = _step8.value; stringifyNodeToLines(child, depth + 1, lines); } } catch (err) { _iterator8.e(err); } finally { _iterator8.f(); } } } function stringifyTree(node) { var lines = []; stringifyNodeToLines(node, 0, lines); return lines.join("\n"); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy90ZXh0ZXMudHMiXSwibmFtZXMiOlsiTm9kZVR5cGUiLCJoZWFkZXJGcm9tTGluZSIsImxpbmUiLCJoZWFkZXIiLCJyZXBsYWNlIiwicGFyc2VUZXh0ZU1hcmtkb3duIiwibWFya2Rvd24iLCJ0ZXh0ZUhlYWRlcnMiLCJyb290Tm9kZXMiLCJoZWFkZXJzIiwidHlwZSIsIkFVVFJFIiwiYnJlYWRjcnVtYiIsInNwbGl0IiwibGluZXNMb29wIiwiY3VycmVudFJvb3ROb2RlIiwibGVuZ3RoIiwibGluZVNpbXBsaWZpZWQiLCJub3JtYWxpemUiLCJ0cmltIiwidG9VcHBlckNhc2UiLCJFWFBPU0VfREVTX01PVElGUyIsIlRFWFRFIiwicmVnRXhwIiwiaGVhZGluZ1R5cGUiLCJtYXRjaCIsInB1c2giLCJpbmNsdWRlcyIsIkFSVElDTEUiLCJDSEFQSVRSRSIsIkxJVlJFIiwiUEFSVElFIiwiU0VDVElPTiIsIlNPVVNfU0VDVElPTiIsIlNPVVNfVElUUkUiLCJUSVRSRSIsIlRPTUUiLCJub2RlIiwiZW50cmllcyIsImRlcHRoIiwiYnJlYWRjcnVtYk5vZGUiLCJjaGlsZHJlbiIsInBhcmVudE5vZGUiLCJjb25zb2xlIiwiYXNzZXJ0IiwidW5kZWZpbmVkIiwiRVRBVCIsIkFOTkVYRSIsImFsaW5lYXMiLCJhbGluZWEiLCJyZXN0cnVjdHVyZVRleHRlTWFya2Rvd24iLCJmaWx0ZXIiLCJtYXAiLCJzdHJpbmdpZnlUcmVlIiwiam9pbiIsInN0cmluZ2lmeU5vZGVUb0xpbmVzIiwibGluZXMiLCJyZXBlYXQiLCJ0cmltUmlnaHQiLCJjaGlsZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFPWUEsUTs7O1dBQUFBLFE7QUFBQUEsRUFBQUEsUSxDQUFBQSxRO0FBQUFBLEVBQUFBLFEsQ0FBQUEsUTtBQUFBQSxFQUFBQSxRLENBQUFBLFE7QUFB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YWNlIE5vZGUge1xuICBhbGluZWFzPzogc3RyaW5nW11cbiAgY2hpbGRyZW4/OiBOb2RlW11cbiAgaGVhZGVyczogc3RyaW5nW11cbiAgdHlwZTogTm9kZVR5cGVcbn1cblxuZXhwb3J0IGVudW0gTm9kZVR5cGUge1xuICBURVhURSxcbiAgVE9NRSxcbiAgUEFSVElFLFxuICBMSVZSRSxcbiAgVElUUkUsXG4gIFNPVVNfVElUUkUsXG4gIENIQVBJVFJFLFxuICBTRUNUSU9OLFxuICBTT1VTX1NFQ1RJT04sXG4gIEFSVElDTEUsXG4gIC8vIE5vZGVzIHRoYXQgYXJlIGFsd2F5cyBkaXJlY3QgY2hpbGRyZW4gb2YgXCJURVhURVwiOlxuICBBTk5FWEUsXG4gIEVUQVQsXG4gIC8vIE5vZGVzIHRoYXQgYXJlIGFsd2F5cyByb290IG5vZGVzOlxuICBFWFBPU0VfREVTX01PVElGUyxcbiAgQVVUUkUsXG59XG5cbmZ1bmN0aW9uIGhlYWRlckZyb21MaW5lKGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhlYWRlciA9IGxpbmVcbiAgICAvLyBSZW1vdmUgYm9sZCAoZ2VuZXJhdGVkIGJ5IFR1cm5kb3duKSBmcm9tIGhlYWRlci5cbiAgICAucmVwbGFjZSgvXlxcKlxcKiguKylcXCpcXCokLywgXCIkMVwiKVxuICByZXR1cm4gaGVhZGVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRleHRlTWFya2Rvd24obWFya2Rvd246IHN0cmluZywgdGV4dGVIZWFkZXJzOiBzdHJpbmdbXSk6IE5vZGVbXSB7XG4gIGNvbnN0IHJvb3ROb2RlczogTm9kZVtdID0gW1xuICAgIHtcbiAgICAgIGhlYWRlcnM6IFtcIkF1dHJlXCJdLFxuICAgICAgdHlwZTogTm9kZVR5cGUuQVVUUkUsXG4gICAgfSxcbiAgXVxuICBjb25zdCBicmVhZGNydW1iOiBOb2RlW10gPSBbcm9vdE5vZGVzWzBdXVxuICBsaW5lc0xvb3A6IGZvciAoY29uc3QgbGluZSBvZiBtYXJrZG93bi5zcGxpdChcIlxcblwiKSkge1xuICAgIGxldCBjdXJyZW50Um9vdE5vZGUgPSByb290Tm9kZXNbcm9vdE5vZGVzLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgbGluZVNpbXBsaWZpZWQgPSBsaW5lXG4gICAgICAubm9ybWFsaXplKFwiTkZEXCIpXG4gICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9cXCpcXCovZywgXCJcIikgLy8gUmVtb3ZlIE1hcmtkb3duIGJvbGQgKGFkZGVkIGJ5IFR1cm5kb3duKS5cbiAgICAgIC5yZXBsYWNlKC9cXChub3V2ZWF1XFwpLywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9cXChQb3VyIGNvb3JkaW5hdGlvblxcKS8sIFwiXCIpXG4gICAgICAucmVwbGFjZSgvXFwoU3VwcHJpbcOpcz9cXCkvLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoL8KgL2csIFwiIFwiKVxuICAgICAgLnJlcGxhY2UoL1tcXC0sLuKApl0vZywgXCJcIilcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlKC8gezEsfS9nLCBcIl9cIilcbiAgICAgIC50b1VwcGVyQ2FzZSgpXG5cbiAgICBmb3IgKGNvbnN0IFtyZWdFeHAsIGhlYWRpbmdUeXBlXSBvZiBbXG4gICAgICAvLyBcIkV4cG9zw6kgZGVzIG1vdGlmc1wiIHdpdGhvdXQgY29udGVudDpcbiAgICAgIC8vICogaHR0cDovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyLzE1L3RleHRlcy8wNzAyLmFzcFxuICAgICAgLy8gXCJFeHBvc8OpIGRlcyBtb3RpZnNcIiB3aXRoIGNvbnRlbnQ6XG4gICAgICAvLyAqIGh0dHA6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci8xNS90ZXh0ZXMvMTMyNi5hc3BcbiAgICAgIC8vICogaHR0cDovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyLzE1L3RleHRlcy8xNjEwLmFzcFxuICAgICAgWy9eRVhQT1NFX0RFU19NT1RJRlMkLywgTm9kZVR5cGUuRVhQT1NFX0RFU19NT1RJRlNdLFxuICAgICAgLy8gXCJQcm9qZXQgZGUgbG9pXCIgb3UgXCJQcm9wb3NpdGlvbiBkZSBsb2lcIjpcbiAgICAgIC8vICogaHR0cDovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyLzE1L3RleHRlcy8wMjMyLmFzcFxuICAgICAgLy8gKiBodHRwOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvMTUvdGV4dGVzLzA2MjYuYXNwXG4gICAgICAvLyAqIGh0dHA6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci8xNS90ZXh0ZXMvMDY3Ni5hc3BcbiAgICAgIFsvXihQUk9KRVR8UFJPUE9TSVRJT04pX0RFX0xPSShffCQpLywgTm9kZVR5cGUuVEVYVEVdLFxuICAgICAgWy9eVEVYVEVfKERFX0xBX1BST1BPU0lUSU9OfERVX1BST0pFVClfREVfTE9JKF98JCkvLCBOb2RlVHlwZS5URVhURV0sXG4gICAgXSBhcyBbUmVnRXhwLCBOb2RlVHlwZV1bXSkge1xuICAgICAgaWYgKGxpbmVTaW1wbGlmaWVkLm1hdGNoKHJlZ0V4cCkgIT09IG51bGwpIHtcbiAgICAgICAgY3VycmVudFJvb3ROb2RlID0ge1xuICAgICAgICAgIGhlYWRlcnM6IFtoZWFkZXJGcm9tTGluZShsaW5lKV0sXG4gICAgICAgICAgdHlwZTogaGVhZGluZ1R5cGUsXG4gICAgICAgIH1cbiAgICAgICAgcm9vdE5vZGVzLnB1c2goY3VycmVudFJvb3ROb2RlKVxuICAgICAgICBicmVhZGNydW1iWzBdID0gY3VycmVudFJvb3ROb2RlXG4gICAgICAgIGJyZWFkY3J1bWIubGVuZ3RoID0gMVxuICAgICAgICBjb250aW51ZSBsaW5lc0xvb3BcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoW05vZGVUeXBlLkFVVFJFLCBOb2RlVHlwZS5URVhURV0uaW5jbHVkZXMoY3VycmVudFJvb3ROb2RlLnR5cGUpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtyZWdFeHAsIGhlYWRpbmdUeXBlXSBvZiBbXG4gICAgICAgIFsvXkFSVElDTEVTP18vLCBOb2RlVHlwZS5BUlRJQ0xFXSxcbiAgICAgICAgWy9eQ0hBUElUUkVfLywgTm9kZVR5cGUuQ0hBUElUUkVdLFxuICAgICAgICBbL15MSVZSRV8vLCBOb2RlVHlwZS5MSVZSRV0sXG4gICAgICAgIFsvXlBBUlRJRV8vLCBOb2RlVHlwZS5QQVJUSUVdLFxuICAgICAgICBbL14oUFJFTUlFUkV8U0VDT05ERXxERVVYSUVNRXxUUk9JU0lFTUV8UVVBVFJJRU1FKV9QQVJUSUUoX3wkKS8sIE5vZGVUeXBlLlBBUlRJRV0sXG4gICAgICAgIFsvXlNFQ1RJT05fLywgTm9kZVR5cGUuU0VDVElPTl0sXG4gICAgICAgIFsvXlNPVVNTRUNUSU9OXy8sIE5vZGVUeXBlLlNPVVNfU0VDVElPTl0sXG4gICAgICAgIFsvXlNPVVNUSVRSRV8vLCBOb2RlVHlwZS5TT1VTX1RJVFJFXSxcbiAgICAgICAgWy9eVElUUkVfLywgTm9kZVR5cGUuVElUUkVdLFxuICAgICAgICBbL15UT01FXy8sIE5vZGVUeXBlLlRPTUVdLFxuICAgICAgXSBhcyBbUmVnRXhwLCBOb2RlVHlwZV1bXSkge1xuICAgICAgICBpZiAobGluZVNpbXBsaWZpZWQubWF0Y2gocmVnRXhwKSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IG5vZGU6IE5vZGUgPSB7XG4gICAgICAgICAgICBoZWFkZXJzOiBbaGVhZGVyRnJvbUxpbmUobGluZSldLFxuICAgICAgICAgICAgdHlwZTogaGVhZGluZ1R5cGUsXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjdXJyZW50Um9vdE5vZGUudHlwZSAhPT0gTm9kZVR5cGUuVEVYVEUpIHtcbiAgICAgICAgICAgIGN1cnJlbnRSb290Tm9kZSA9IHtcbiAgICAgICAgICAgICAgaGVhZGVyczogdGV4dGVIZWFkZXJzLFxuICAgICAgICAgICAgICB0eXBlOiBOb2RlVHlwZS5URVhURSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvb3ROb2Rlcy5wdXNoKGN1cnJlbnRSb290Tm9kZSlcbiAgICAgICAgICAgIGJyZWFkY3J1bWJbMF0gPSBjdXJyZW50Um9vdE5vZGVcbiAgICAgICAgICAgIGJyZWFkY3J1bWIubGVuZ3RoID0gMVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRyeSB0byByZXRyaWV2ZSBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSBpbiBicmVhZGNydW1iIGFuZFxuICAgICAgICAgIC8vIGFwcGVuZCBuZXcgbm9kZSB0byBpdC5cbiAgICAgICAgICBmb3IgKGNvbnN0IFtkZXB0aCwgYnJlYWRjcnVtYk5vZGVdIG9mIGJyZWFkY3J1bWIuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoYnJlYWRjcnVtYk5vZGUudHlwZSA9PT0gaGVhZGluZ1R5cGUpIHtcbiAgICAgICAgICAgICAgYnJlYWRjcnVtYltkZXB0aCAtIDFdLmNoaWxkcmVuIS5wdXNoKG5vZGUpXG4gICAgICAgICAgICAgIGJyZWFkY3J1bWJbZGVwdGhdID0gbm9kZVxuICAgICAgICAgICAgICBicmVhZGNydW1iLmxlbmd0aCA9IGRlcHRoICsgMVxuICAgICAgICAgICAgICBjb250aW51ZSBsaW5lc0xvb3BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGxldmVsIGluIGJyZWFkY3J1bWIgZm9yIHRoZSBuZXcgbm9kZVxuICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBicmVhZGNydW1iW2JyZWFkY3J1bWIubGVuZ3RoIC0gMV1cbiAgICAgICAgICBjb25zb2xlLmFzc2VydChwYXJlbnROb2RlLmNoaWxkcmVuID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZHJlbiA9IFtub2RlXVxuICAgICAgICAgIGJyZWFkY3J1bWIucHVzaChub2RlKVxuICAgICAgICAgIGNvbnRpbnVlIGxpbmVzTG9vcFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50Um9vdE5vZGUudHlwZSA9PT0gTm9kZVR5cGUuVEVYVEUpIHtcbiAgICAgICAgZm9yIChjb25zdCBbcmVnRXhwLCBoZWFkaW5nVHlwZV0gb2YgW1xuICAgICAgICAgIFsvXkVUQVRfLywgTm9kZVR5cGUuRVRBVF0sXG4gICAgICAgICAgWy9eKFJBUFBPUlRfKT9BTk5FWEUoX3wkKS8sIE5vZGVUeXBlLkFOTkVYRV0sXG4gICAgICAgIF0gYXMgW1JlZ0V4cCwgTm9kZVR5cGVdW10pIHtcbiAgICAgICAgICBpZiAobGluZVNpbXBsaWZpZWQubWF0Y2gocmVnRXhwKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IHtcbiAgICAgICAgICAgICAgaGVhZGVyczogW2hlYWRlckZyb21MaW5lKGxpbmUpXSxcbiAgICAgICAgICAgICAgdHlwZTogaGVhZGluZ1R5cGUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VycmVudFJvb3ROb2RlLmNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY3VycmVudFJvb3ROb2RlLmNoaWxkcmVuID0gW25vZGVdXG4gICAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGJyZWFkY3J1bWIubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgICBicmVhZGNydW1iLnB1c2gobm9kZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRSb290Tm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpXG4gICAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGJyZWFkY3J1bWIubGVuZ3RoID49IDIpXG4gICAgICAgICAgICAgIGJyZWFkY3J1bWJbMV0gPSBub2RlXG4gICAgICAgICAgICAgIGJyZWFkY3J1bWIubGVuZ3RoID0gMlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWUgbGluZXNMb29wXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IGJyZWFkY3J1bWJbYnJlYWRjcnVtYi5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoXG4gICAgICAgICAgbm9kZS5hbGluZWFzID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBub2RlLmhlYWRlcnMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgIVtOb2RlVHlwZS5BUlRJQ0xFLCBOb2RlVHlwZS5FWFBPU0VfREVTX01PVElGU10uaW5jbHVkZXMobm9kZS50eXBlKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAobGluZS50cmltKCkpIHtcbiAgICAgICAgICAgIC8vIFNlY29uZCB0aXRsZSBvZiBub2RlXG4gICAgICAgICAgICBub2RlLmhlYWRlcnMucHVzaChoZWFkZXJGcm9tTGluZShsaW5lKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWUgbGluZXNMb29wXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5hbGluZWFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBub2RlLmFsaW5lYXMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSAob3B0aW9uYWwpIFwicGFzdGlsbGVcIiAoYWthIGFsaW5lYSBudW1iZXIpIGZyb20gYWxpbmVhLlxuICAgICAgICBjb25zdCBhbGluZWEgPSBsaW5lLnJlcGxhY2UoL15cXChcXGQrXFwpXFxzKi8sIFwiXCIpXG4gICAgICAgIG5vZGUuYWxpbmVhcy5wdXNoKGFsaW5lYSlcblxuICAgICAgICBjb250aW51ZSBsaW5lc0xvb3BcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgY3VycmVudFJvb3ROb2RlIGlzIG5vdCBvZiB0eXBlIFRFWFRFLlxuICAgIGNvbnN0IG5vZGUgPSBicmVhZGNydW1iW2JyZWFkY3J1bWIubGVuZ3RoIC0gMV1cbiAgICBpZiAobm9kZS5hbGluZWFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5vZGUuYWxpbmVhcyA9IFtdXG4gICAgfVxuICAgIG5vZGUuYWxpbmVhcy5wdXNoKGxpbmUpXG4gIH1cblxuICAvLyBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyb290Tm9kZXMsIG51bGwsIDIpKVxuICByZXR1cm4gcm9vdE5vZGVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXN0cnVjdHVyZVRleHRlTWFya2Rvd24oXG4gIG1hcmtkb3duOiBzdHJpbmcsXG4gIHRleHRlSGVhZGVyczogc3RyaW5nW10sXG4pOiBzdHJpbmcge1xuICBtYXJrZG93biA9IG1hcmtkb3duXG4gICAgLy8gUmVwbGFjZSBub24tYnJlYWtpbmcgSHlwaGVuIHdpdGggbm9ybWFsIGh5cGhlbi5cbiAgICAucmVwbGFjZSgvXFx1ezIwMTF9L2d1LCBcIi1cIilcbiAgbWFya2Rvd24gPSBwYXJzZVRleHRlTWFya2Rvd24obWFya2Rvd24sIHRleHRlSGVhZGVycylcbiAgICAuZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlID09PSBOb2RlVHlwZS5URVhURSlcbiAgICAubWFwKG5vZGUgPT4gc3RyaW5naWZ5VHJlZShub2RlKSlcbiAgICAuam9pbihcIlxcblxcblwiKVxuICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2UuXG4gICAgLnJlcGxhY2UoLyB7Mix9L2csIFwiIFwiKVxuICAgIC8vIFJlcGxhY2Ugc2VxdWVuY2VzIG9mIG1vcmUgdGhhbiAyIFxcbiB3aXRoIGV4YWN0bHkgMiBcXG4uXG4gICAgLnJlcGxhY2UoL1xcbnszLH0vZywgXCJcXG5cXG5cIilcbiAgICAvLyBSZW1vdmUgbGVhZGluZyBsaW5lIGJyZWFrcy5cbiAgICAucmVwbGFjZSgvXlxcbisvLCBcIlwiKVxuICAgIC8vIFJlbW92ZSB0cmFpbGluZyBsaW5lIGJyZWFrcy5cbiAgICAucmVwbGFjZSgvXFxuezIsfSQvLCBcIlwiKVxuICByZXR1cm4gbWFya2Rvd25cbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5Tm9kZVRvTGluZXMobm9kZTogTm9kZSwgZGVwdGg6IG51bWJlciwgbGluZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaGVhZGVyIG9mIG5vZGUuaGVhZGVycykge1xuICAgIGlmIChsaW5lcy5sZW5ndGggPiAwICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdICE9PSBcIlwiKSB7XG4gICAgICBsaW5lcy5wdXNoKFwiXCIpXG4gICAgfVxuICAgIGxpbmVzLnB1c2goYCR7XCIjXCIucmVwZWF0KGRlcHRoICsgMSl9ICR7aGVhZGVyLnRyaW0oKX1gKVxuICAgIGxpbmVzLnB1c2goXCJcIilcbiAgfVxuICBpZiAobm9kZS5hbGluZWFzICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IGFsaW5lYSBvZiBub2RlLmFsaW5lYXMpIHtcbiAgICAgIGxpbmVzLnB1c2goYWxpbmVhLnRyaW1SaWdodCgpKVxuICAgIH1cbiAgfVxuICBpZiAobm9kZS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICBzdHJpbmdpZnlOb2RlVG9MaW5lcyhjaGlsZCwgZGVwdGggKyAxLCBsaW5lcylcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVRyZWUobm9kZTogTm9kZSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdXG4gIHN0cmluZ2lmeU5vZGVUb0xpbmVzKG5vZGUsIDAsIGxpbmVzKVxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKVxufVxuIl19