@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
325 lines (321 loc) • 57.7 kB
JavaScript
"use strict";
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
require("core-js/modules/es.symbol.js");
require("core-js/modules/es.symbol.description.js");
require("core-js/modules/es.symbol.async-iterator.js");
require("core-js/modules/es.symbol.iterator.js");
require("core-js/modules/es.symbol.to-string-tag.js");
require("core-js/modules/es.array.for-each.js");
require("core-js/modules/es.array.iterator.js");
require("core-js/modules/es.array.reverse.js");
require("core-js/modules/es.array.slice.js");
require("core-js/modules/es.function.name.js");
require("core-js/modules/es.json.to-string-tag.js");
require("core-js/modules/es.math.to-string-tag.js");
require("core-js/modules/es.object.create.js");
require("core-js/modules/es.object.define-property.js");
require("core-js/modules/es.object.get-prototype-of.js");
require("core-js/modules/es.object.set-prototype-of.js");
require("core-js/modules/es.object.to-string.js");
require("core-js/modules/es.promise.js");
require("core-js/modules/es.string.iterator.js");
require("core-js/modules/web.dom-collections.for-each.js");
require("core-js/modules/web.dom-collections.iterator.js");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.DocumentUrlFormat = void 0;
exports.iterDocumentOrDivisionUrls = iterDocumentOrDivisionUrls;
exports.urlFromDocument = urlFromDocument;
exports.urlFromScrutin = urlFromScrutin;
require("core-js/modules/es.array.concat.js");
require("core-js/modules/es.regexp.exec.js");
require("core-js/modules/es.string.replace.js");
require("core-js/modules/esnext.string.replace-all.js");
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
var DocumentUrlFormat = exports.DocumentUrlFormat = /*#__PURE__*/function (DocumentUrlFormat) {
DocumentUrlFormat["Html"] = "html";
DocumentUrlFormat["Pdf"] = "pdf";
DocumentUrlFormat["RawHtml"] = "raw-html"; // The version of the document that can be parsed to extract divisions & articles
return DocumentUrlFormat;
}({});
var documentUrlFragmentsByType = {
ACIN: {
directory: "projets",
prefix: "pl",
suffix: "-ai"
},
AVCEPRJLOI: {
directory: "projets",
prefix: "pl",
suffix: "-ace"
},
AVCELETTRE: {
directory: "projets",
prefix: "pl",
suffix: "-ace"
},
AVCEPIONLOI: {
directory: "propositions",
prefix: "pion",
suffix: "-ace"
},
AVIS: {
directory: "rapports",
prefix: "r",
suffix: ""
},
ETDI: {
directory: "projets",
prefix: "pl",
suffix: "-ei"
},
LETT: {
directory: "projets",
prefix: "pl",
suffix: "-l"
},
PION: {
directory: "propositions",
prefix: "pion",
suffix: ""
},
PNRE: {
directory: "propositions",
prefix: "pion",
suffix: ""
},
PNREAPPART341: {
directory: "propositions",
prefix: "pion",
suffix: ""
},
PNRECOMENQ: {
directory: "propositions",
prefix: "pion",
suffix: ""
},
PNREMODREGLTAN: {
directory: "propositions",
prefix: "pion",
suffix: ""
},
PNRETVXINSTITEUROP: {
directory: "europe/resolutions",
prefix: "ppe",
suffix: ""
},
PRJL: {
directory: "projets",
prefix: "pl",
suffix: ""
},
RAPP: {
directory: "rapports",
prefix: "r",
suffix: ""
},
RINF: {
directory: "rap-info",
prefix: "i",
suffix: ""
},
RION: {
directory: "",
prefix: "",
suffix: ""
},
TADO: {
directory: "ta",
prefix: "ta",
suffix: ""
},
TCOM: {
directory: "ta-commission",
prefix: "r",
suffix: "-a0"
},
TCOMCOMENQ: {
directory: "ta-commission",
prefix: "r",
suffix: "-a0"
},
TCOMMODREGLTAN: {
directory: "ta-commission",
prefix: "r",
suffix: "-a0"
},
TCOMTVXINSTITEUROP: {
directory: "ta-commission",
prefix: "r",
suffix: "-a0"
}
};
function extensionFromDocumentUrlFormat(format) {
switch (format) {
case DocumentUrlFormat.Html:
return ".asp";
case DocumentUrlFormat.Pdf:
return ".pdf";
case DocumentUrlFormat.RawHtml:
return ".asp";
}
}
function iterDocumentOrDivisionUrls(documentOrDivision) {
var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
return /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
var urlInfos, _urlInfos, _urlInfos2;
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (!(format === undefined || format === DocumentUrlFormat.RawHtml)) {
_context.next = 9;
break;
}
_context.next = 3;
return {
format: DocumentUrlFormat.RawHtml,
type: "dyn-opendata",
url: "https://www.assemblee-nationale.fr/dyn/opendata/".concat(documentOrDivision.uid, ".html")
};
case 3:
_context.next = 5;
return {
format: DocumentUrlFormat.RawHtml,
type: "dyn-docs",
url: "https://www.assemblee-nationale.fr/dyn/docs/".concat(documentOrDivision.uid, ".raw")
};
case 5:
urlInfos = urlInfosFromDocumentOrDivision(documentOrDivision, DocumentUrlFormat.RawHtml);
if (!(urlInfos !== null)) {
_context.next = 9;
break;
}
_context.next = 9;
return {
format: DocumentUrlFormat.RawHtml,
type: urlInfos.directory.replaceAll("/", "-"),
url: urlInfos.url
};
case 9:
if (!(format === undefined || format === DocumentUrlFormat.Html)) {
_context.next = 14;
break;
}
_urlInfos = urlInfosFromDocumentOrDivision(documentOrDivision, DocumentUrlFormat.Html);
if (!(_urlInfos !== null)) {
_context.next = 14;
break;
}
_context.next = 14;
return {
format: DocumentUrlFormat.Html,
type: _urlInfos.directory.replaceAll("/", "-"),
url: _urlInfos.url
};
case 14:
if (!(format === undefined || format === DocumentUrlFormat.Pdf)) {
_context.next = 23;
break;
}
_context.next = 17;
return {
format: DocumentUrlFormat.RawHtml,
type: "dyn-opendata",
url: "https://www.assemblee-nationale.fr/dyn/opendata/".concat(documentOrDivision.uid, ".html")
};
case 17:
_context.next = 19;
return {
format: DocumentUrlFormat.Pdf,
type: "dyn-docs",
url: "https://www.assemblee-nationale.fr/dyn/docs/".concat(documentOrDivision.uid, ".pdf")
};
case 19:
_urlInfos2 = urlInfosFromDocumentOrDivision(documentOrDivision, DocumentUrlFormat.Pdf);
if (!(_urlInfos2 !== null)) {
_context.next = 23;
break;
}
_context.next = 23;
return {
format: DocumentUrlFormat.Pdf,
type: _urlInfos2.directory.replaceAll("/", "-"),
url: _urlInfos2.url
};
case 23:
case "end":
return _context.stop();
}
}, _callee);
})();
}
/// Note: This function doesn't use the "modern" Assemblée URLs for documents.
/// Use generator `iterDocumentOrDivisionUrls` instead.
function urlFromDocument(documentOrDivision, format) {
var urlInfos = urlInfosFromDocumentOrDivision(documentOrDivision, format);
return urlInfos === null ? null : urlInfos.url;
}
function urlFromScrutin(scrutin) {
// Sample UIDs: VTANR5L15V389
var match = /^VTANR([0-9]+)L([0-9]+)V([0-9]+)$/.exec(scrutin.uid);
if (match === null) {
console.log("Unable to generate URL from scrutin with unexpected UID: \"".concat(scrutin.uid, "\""));
return null;
}
var legislature = match[2];
var numero = match[3];
return "http://www2.assemblee-nationale.fr/scrutins/detail/(legislature)/".concat(legislature, "/(num)/").concat(numero);
}
/// Note: This function doesn't use the modern Assemblée URLs for documents.
/// Use generator `iterDocumentOrDivisionUrls` instead.
function urlInfosFromDocumentOrDivision(documentOrDivision, format) {
// Code taken from function `an_text_url` in project anpy:
// https://github.com/regardscitoyens/anpy/blob/master/anpy/dossier_from_opendata.py
// See https://www.assemblee-nationale.fr/opendata/Implementation_Referentiel/Identifiants_Referentiels.html
// for a description of the format of an UID.
var extension = extensionFromDocumentUrlFormat(format);
var match = /^(.{4})([ANS]*)(R[0-9])([LS]*)([0-9]*)([BTACP]*)(.*)$/.exec(documentOrDivision.uid);
if (match === null) {
console.log("Unable to generate URL from document or division with unexpected UID: \"".concat(documentOrDivision.uid, "\""));
return null;
}
var chambre = match[2];
if (chambre === "SN") {
console.log("Unable to generate URL for document or division in S\xE9nat. UID: \"".concat(documentOrDivision.uid, "\""));
return null;
}
var legislature = match[5];
var number = match[7];
if (format === DocumentUrlFormat.RawHtml) {
return {
directory: "textes",
url: "https://www.assemblee-nationale.fr/".concat(legislature, "/textes/").concat(number).concat(extension)
};
}
var documentType = {
BTC: "TCOM",
BTA: "TADO",
TAP: "TADO"
}[match[6]] || match[1];
if (documentOrDivision.classification !== undefined && documentOrDivision.classification.sousType !== undefined && documentOrDivision.classification.sousType.code === "COMPA") {
// Annexe au rapport : Texte comparatif COMPA
number = number.replace(/-COMPA/, "-aCOMPA");
}
if (documentType == "AVCE") {
var _documentOrDivision$c;
documentType = "AVCE".concat((_documentOrDivision$c = documentOrDivision.classification.famille) === null || _documentOrDivision$c === void 0 ? void 0 : _documentOrDivision$c.classe.code);
}
var fragments = documentUrlFragmentsByType[documentType];
if (fragments === undefined) {
// For example: ALCNANR5L15B0002 (allocution du président)
console.log("Unable to generate URL from document or division of UID \"".concat(documentOrDivision.uid, "\" and type \"").concat(documentType, "\""));
return null;
}
var directory = format === DocumentUrlFormat.Pdf ? "pdf/".concat(fragments.directory) : fragments.directory;
return {
directory: directory,
url: "https://www.assemblee-nationale.fr/".concat(legislature, "/").concat(directory, "/").concat(fragments.prefix).concat(number).concat(fragments.suffix).concat(extension)
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZSIsInQiLCJyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwibiIsImhhc093blByb3BlcnR5IiwibyIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJpIiwiU3ltYm9sIiwiYSIsIml0ZXJhdG9yIiwiYyIsImFzeW5jSXRlcmF0b3IiLCJ1IiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ3cmFwIiwiR2VuZXJhdG9yIiwiY3JlYXRlIiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsInR5cGUiLCJhcmciLCJjYWxsIiwiaCIsImwiLCJmIiwicyIsInkiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwicCIsImQiLCJnZXRQcm90b3R5cGVPZiIsInYiLCJ2YWx1ZXMiLCJnIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiaW52b2tlIiwiX3R5cGVvZiIsInJlc29sdmUiLCJfX2F3YWl0IiwidGhlbiIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiRXJyb3IiLCJkb25lIiwibWV0aG9kIiwiZGVsZWdhdGUiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJUeXBlRXJyb3IiLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsImlzTmFOIiwibGVuZ3RoIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJrZXlzIiwicmV2ZXJzZSIsInBvcCIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJydmFsIiwiaGFuZGxlIiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJkZWxlZ2F0ZVlpZWxkIiwiRG9jdW1lbnRVcmxGb3JtYXQiLCJleHBvcnRzIiwiZG9jdW1lbnRVcmxGcmFnbWVudHNCeVR5cGUiLCJBQ0lOIiwiZGlyZWN0b3J5IiwicHJlZml4Iiwic3VmZml4IiwiQVZDRVBSSkxPSSIsIkFWQ0VMRVRUUkUiLCJBVkNFUElPTkxPSSIsIkFWSVMiLCJFVERJIiwiTEVUVCIsIlBJT04iLCJQTlJFIiwiUE5SRUFQUEFSVDM0MSIsIlBOUkVDT01FTlEiLCJQTlJFTU9EUkVHTFRBTiIsIlBOUkVUVlhJTlNUSVRFVVJPUCIsIlBSSkwiLCJSQVBQIiwiUklORiIsIlJJT04iLCJUQURPIiwiVENPTSIsIlRDT01DT01FTlEiLCJUQ09NTU9EUkVHTFRBTiIsIlRDT01UVlhJTlNUSVRFVVJPUCIsImV4dGVuc2lvbkZyb21Eb2N1bWVudFVybEZvcm1hdCIsImZvcm1hdCIsIkh0bWwiLCJQZGYiLCJSYXdIdG1sIiwiaXRlckRvY3VtZW50T3JEaXZpc2lvblVybHMiLCJkb2N1bWVudE9yRGl2aXNpb24iLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJfY2FsbGVlIiwidXJsSW5mb3MiLCJfdXJsSW5mb3MiLCJfdXJsSW5mb3MyIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInVybCIsImNvbmNhdCIsInVpZCIsInVybEluZm9zRnJvbURvY3VtZW50T3JEaXZpc2lvbiIsInJlcGxhY2VBbGwiLCJ1cmxGcm9tRG9jdW1lbnQiLCJ1cmxGcm9tU2NydXRpbiIsInNjcnV0aW4iLCJtYXRjaCIsImV4ZWMiLCJjb25zb2xlIiwibG9nIiwibGVnaXNsYXR1cmUiLCJudW1lcm8iLCJleHRlbnNpb24iLCJjaGFtYnJlIiwibnVtYmVyIiwiZG9jdW1lbnRUeXBlIiwiQlRDIiwiQlRBIiwiVEFQIiwiY2xhc3NpZmljYXRpb24iLCJzb3VzVHlwZSIsImNvZGUiLCJyZXBsYWNlIiwiX2RvY3VtZW50T3JEaXZpc2lvbiRjIiwiZmFtaWxsZSIsImNsYXNzZSIsImZyYWdtZW50cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy91cmxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRG9jdW1lbnQsIERpdmlzaW9uIH0gZnJvbSBcIi4vdHlwZXMvZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0IHR5cGUgeyBTY3J1dGluIH0gZnJvbSBcIi4vdHlwZXMvc2NydXRpbnNcIlxuXG5leHBvcnQgZW51bSBEb2N1bWVudFVybEZvcm1hdCB7XG4gIEh0bWwgPSBcImh0bWxcIixcbiAgUGRmID0gXCJwZGZcIixcbiAgUmF3SHRtbCA9IFwicmF3LWh0bWxcIiwgLy8gVGhlIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IHRoYXQgY2FuIGJlIHBhcnNlZCB0byBleHRyYWN0IGRpdmlzaW9ucyAmIGFydGljbGVzXG59XG5cbmNvbnN0IGRvY3VtZW50VXJsRnJhZ21lbnRzQnlUeXBlOiB7XG4gIFt0eXBlOiBzdHJpbmddOiB7XG4gICAgZGlyZWN0b3J5OiBzdHJpbmdcbiAgICBwcmVmaXg6IHN0cmluZ1xuICAgIHN1ZmZpeDogc3RyaW5nXG4gIH1cbn0gPSB7XG4gIEFDSU46IHtcbiAgICBkaXJlY3Rvcnk6IFwicHJvamV0c1wiLFxuICAgIHByZWZpeDogXCJwbFwiLFxuICAgIHN1ZmZpeDogXCItYWlcIixcbiAgfSxcbiAgQVZDRVBSSkxPSToge1xuICAgIGRpcmVjdG9yeTogXCJwcm9qZXRzXCIsXG4gICAgcHJlZml4OiBcInBsXCIsXG4gICAgc3VmZml4OiBcIi1hY2VcIixcbiAgfSxcbiAgQVZDRUxFVFRSRToge1xuICAgIGRpcmVjdG9yeTogXCJwcm9qZXRzXCIsXG4gICAgcHJlZml4OiBcInBsXCIsXG4gICAgc3VmZml4OiBcIi1hY2VcIixcbiAgfSxcbiAgQVZDRVBJT05MT0k6IHtcbiAgICBkaXJlY3Rvcnk6IFwicHJvcG9zaXRpb25zXCIsXG4gICAgcHJlZml4OiBcInBpb25cIixcbiAgICBzdWZmaXg6IFwiLWFjZVwiLFxuICB9LFxuICBBVklTOiB7XG4gICAgZGlyZWN0b3J5OiBcInJhcHBvcnRzXCIsXG4gICAgcHJlZml4OiBcInJcIixcbiAgICBzdWZmaXg6IFwiXCIsXG4gIH0sXG4gIEVUREk6IHtcbiAgICBkaXJlY3Rvcnk6IFwicHJvamV0c1wiLFxuICAgIHByZWZpeDogXCJwbFwiLFxuICAgIHN1ZmZpeDogXCItZWlcIixcbiAgfSxcbiAgTEVUVDoge1xuICAgIGRpcmVjdG9yeTogXCJwcm9qZXRzXCIsXG4gICAgcHJlZml4OiBcInBsXCIsXG4gICAgc3VmZml4OiBcIi1sXCIsXG4gIH0sXG4gIFBJT046IHtcbiAgICBkaXJlY3Rvcnk6IFwicHJvcG9zaXRpb25zXCIsXG4gICAgcHJlZml4OiBcInBpb25cIixcbiAgICBzdWZmaXg6IFwiXCIsXG4gIH0sXG4gIFBOUkU6IHtcbiAgICBkaXJlY3Rvcnk6IFwicHJvcG9zaXRpb25zXCIsXG4gICAgcHJlZml4OiBcInBpb25cIixcbiAgICBzdWZmaXg6IFwiXCIsXG4gIH0sXG4gIFBOUkVBUFBBUlQzNDE6IHtcbiAgICBkaXJlY3Rvcnk6IFwicHJvcG9zaXRpb25zXCIsXG4gICAgcHJlZml4OiBcInBpb25cIixcbiAgICBzdWZmaXg6IFwiXCIsXG4gIH0sXG4gIFBOUkVDT01FTlE6IHtcbiAgICBkaXJlY3Rvcnk6IFwicHJvcG9zaXRpb25zXCIsXG4gICAgcHJlZml4OiBcInBpb25cIixcbiAgICBzdWZmaXg6IFwiXCIsXG4gIH0sXG4gIFBOUkVNT0RSRUdMVEFOOiB7XG4gICAgZGlyZWN0b3J5OiBcInByb3Bvc2l0aW9uc1wiLFxuICAgIHByZWZpeDogXCJwaW9uXCIsXG4gICAgc3VmZml4OiBcIlwiLFxuICB9LFxuICBQTlJFVFZYSU5TVElURVVST1A6IHtcbiAgICBkaXJlY3Rvcnk6IFwiZXVyb3BlL3Jlc29sdXRpb25zXCIsXG4gICAgcHJlZml4OiBcInBwZVwiLFxuICAgIHN1ZmZpeDogXCJcIixcbiAgfSxcbiAgUFJKTDoge1xuICAgIGRpcmVjdG9yeTogXCJwcm9qZXRzXCIsXG4gICAgcHJlZml4OiBcInBsXCIsXG4gICAgc3VmZml4OiBcIlwiLFxuICB9LFxuICBSQVBQOiB7XG4gICAgZGlyZWN0b3J5OiBcInJhcHBvcnRzXCIsXG4gICAgcHJlZml4OiBcInJcIixcbiAgICBzdWZmaXg6IFwiXCIsXG4gIH0sXG4gIFJJTkY6IHtcbiAgICBkaXJlY3Rvcnk6IFwicmFwLWluZm9cIixcbiAgICBwcmVmaXg6IFwiaVwiLFxuICAgIHN1ZmZpeDogXCJcIixcbiAgfSxcbiAgUklPTjoge1xuICAgIGRpcmVjdG9yeTogXCJcIixcbiAgICBwcmVmaXg6IFwiXCIsXG4gICAgc3VmZml4OiBcIlwiLFxuICB9LFxuICBUQURPOiB7XG4gICAgZGlyZWN0b3J5OiBcInRhXCIsXG4gICAgcHJlZml4OiBcInRhXCIsXG4gICAgc3VmZml4OiBcIlwiLFxuICB9LFxuICBUQ09NOiB7XG4gICAgZGlyZWN0b3J5OiBcInRhLWNvbW1pc3Npb25cIixcbiAgICBwcmVmaXg6IFwiclwiLFxuICAgIHN1ZmZpeDogXCItYTBcIixcbiAgfSxcbiAgVENPTUNPTUVOUToge1xuICAgIGRpcmVjdG9yeTogXCJ0YS1jb21taXNzaW9uXCIsXG4gICAgcHJlZml4OiBcInJcIixcbiAgICBzdWZmaXg6IFwiLWEwXCIsXG4gIH0sXG4gIFRDT01NT0RSRUdMVEFOOiB7XG4gICAgZGlyZWN0b3J5OiBcInRhLWNvbW1pc3Npb25cIixcbiAgICBwcmVmaXg6IFwiclwiLFxuICAgIHN1ZmZpeDogXCItYTBcIixcbiAgfSxcbiAgVENPTVRWWElOU1RJVEVVUk9QOiB7XG4gICAgZGlyZWN0b3J5OiBcInRhLWNvbW1pc3Npb25cIixcbiAgICBwcmVmaXg6IFwiclwiLFxuICAgIHN1ZmZpeDogXCItYTBcIixcbiAgfSxcbn1cblxuZnVuY3Rpb24gZXh0ZW5zaW9uRnJvbURvY3VtZW50VXJsRm9ybWF0KGZvcm1hdDogRG9jdW1lbnRVcmxGb3JtYXQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgRG9jdW1lbnRVcmxGb3JtYXQuSHRtbDpcbiAgICAgIHJldHVybiBcIi5hc3BcIlxuICAgIGNhc2UgRG9jdW1lbnRVcmxGb3JtYXQuUGRmOlxuICAgICAgcmV0dXJuIFwiLnBkZlwiXG4gICAgY2FzZSBEb2N1bWVudFVybEZvcm1hdC5SYXdIdG1sOlxuICAgICAgcmV0dXJuIFwiLmFzcFwiXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBpdGVyRG9jdW1lbnRPckRpdmlzaW9uVXJscyhcbiAgZG9jdW1lbnRPckRpdmlzaW9uOiBEb2N1bWVudCB8IERpdmlzaW9uLFxuICBmb3JtYXQ6IERvY3VtZW50VXJsRm9ybWF0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuKTogR2VuZXJhdG9yPFxuICB7IGZvcm1hdDogRG9jdW1lbnRVcmxGb3JtYXQ7IHR5cGU6IHN0cmluZzsgdXJsOiBzdHJpbmcgfSxcbiAgdm9pZCxcbiAgdW5rbm93blxuPiB7XG4gIC8vIFJhdyBIVE1MXG4gIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCB8fCBmb3JtYXQgPT09IERvY3VtZW50VXJsRm9ybWF0LlJhd0h0bWwpIHtcbiAgICAvLyBOb3RlOiBCb3RoIFVSTHMgc2hvdWxkIHdvcmsgYW5kIHJldHVybiB0aGUgc2FtZSByZXN1bHQuXG4gICAgeWllbGQge1xuICAgICAgZm9ybWF0OiBEb2N1bWVudFVybEZvcm1hdC5SYXdIdG1sLFxuICAgICAgdHlwZTogXCJkeW4tb3BlbmRhdGFcIixcbiAgICAgIHVybDogYGh0dHBzOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvZHluL29wZW5kYXRhLyR7ZG9jdW1lbnRPckRpdmlzaW9uLnVpZH0uaHRtbGAsXG4gICAgfVxuICAgIHlpZWxkIHtcbiAgICAgIGZvcm1hdDogRG9jdW1lbnRVcmxGb3JtYXQuUmF3SHRtbCxcbiAgICAgIHR5cGU6IFwiZHluLWRvY3NcIixcbiAgICAgIHVybDogYGh0dHBzOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvZHluL2RvY3MvJHtkb2N1bWVudE9yRGl2aXNpb24udWlkfS5yYXdgLFxuICAgIH1cbiAgICBjb25zdCB1cmxJbmZvcyA9IHVybEluZm9zRnJvbURvY3VtZW50T3JEaXZpc2lvbihcbiAgICAgIGRvY3VtZW50T3JEaXZpc2lvbixcbiAgICAgIERvY3VtZW50VXJsRm9ybWF0LlJhd0h0bWwsXG4gICAgKVxuICAgIGlmICh1cmxJbmZvcyAhPT0gbnVsbCkge1xuICAgICAgeWllbGQge1xuICAgICAgICBmb3JtYXQ6IERvY3VtZW50VXJsRm9ybWF0LlJhd0h0bWwsXG4gICAgICAgIHR5cGU6IHVybEluZm9zLmRpcmVjdG9yeS5yZXBsYWNlQWxsKFwiL1wiLCBcIi1cIiksXG4gICAgICAgIHVybDogdXJsSW5mb3MudXJsLFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhUTUxcbiAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkIHx8IGZvcm1hdCA9PT0gRG9jdW1lbnRVcmxGb3JtYXQuSHRtbCkge1xuICAgIGNvbnN0IHVybEluZm9zID0gdXJsSW5mb3NGcm9tRG9jdW1lbnRPckRpdmlzaW9uKFxuICAgICAgZG9jdW1lbnRPckRpdmlzaW9uLFxuICAgICAgRG9jdW1lbnRVcmxGb3JtYXQuSHRtbCxcbiAgICApXG4gICAgaWYgKHVybEluZm9zICE9PSBudWxsKSB7XG4gICAgICB5aWVsZCB7XG4gICAgICAgIGZvcm1hdDogRG9jdW1lbnRVcmxGb3JtYXQuSHRtbCxcbiAgICAgICAgdHlwZTogdXJsSW5mb3MuZGlyZWN0b3J5LnJlcGxhY2VBbGwoXCIvXCIsIFwiLVwiKSxcbiAgICAgICAgdXJsOiB1cmxJbmZvcy51cmwsXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUERGXG4gIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCB8fCBmb3JtYXQgPT09IERvY3VtZW50VXJsRm9ybWF0LlBkZikge1xuICAgIC8vIE5vdGU6IEJvdGggVVJMcyBzaG91bGQgd29yayBhbmQgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC5cbiAgICB5aWVsZCB7XG4gICAgICBmb3JtYXQ6IERvY3VtZW50VXJsRm9ybWF0LlJhd0h0bWwsXG4gICAgICB0eXBlOiBcImR5bi1vcGVuZGF0YVwiLFxuICAgICAgdXJsOiBgaHR0cHM6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci9keW4vb3BlbmRhdGEvJHtkb2N1bWVudE9yRGl2aXNpb24udWlkfS5odG1sYCxcbiAgICB9XG4gICAgeWllbGQge1xuICAgICAgZm9ybWF0OiBEb2N1bWVudFVybEZvcm1hdC5QZGYsXG4gICAgICB0eXBlOiBcImR5bi1kb2NzXCIsXG4gICAgICB1cmw6IGBodHRwczovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyL2R5bi9kb2NzLyR7ZG9jdW1lbnRPckRpdmlzaW9uLnVpZH0ucGRmYCxcbiAgICB9XG4gICAgY29uc3QgdXJsSW5mb3MgPSB1cmxJbmZvc0Zyb21Eb2N1bWVudE9yRGl2aXNpb24oXG4gICAgICBkb2N1bWVudE9yRGl2aXNpb24sXG4gICAgICBEb2N1bWVudFVybEZvcm1hdC5QZGYsXG4gICAgKVxuICAgIGlmICh1cmxJbmZvcyAhPT0gbnVsbCkge1xuICAgICAgeWllbGQge1xuICAgICAgICBmb3JtYXQ6IERvY3VtZW50VXJsRm9ybWF0LlBkZixcbiAgICAgICAgdHlwZTogdXJsSW5mb3MuZGlyZWN0b3J5LnJlcGxhY2VBbGwoXCIvXCIsIFwiLVwiKSxcbiAgICAgICAgdXJsOiB1cmxJbmZvcy51cmwsXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdXNlIHRoZSBcIm1vZGVyblwiIEFzc2VtYmzDqWUgVVJMcyBmb3IgZG9jdW1lbnRzLlxuLy8vIFVzZSBnZW5lcmF0b3IgYGl0ZXJEb2N1bWVudE9yRGl2aXNpb25VcmxzYCBpbnN0ZWFkLlxuZXhwb3J0IGZ1bmN0aW9uIHVybEZyb21Eb2N1bWVudChcbiAgZG9jdW1lbnRPckRpdmlzaW9uOiBEb2N1bWVudCB8IERpdmlzaW9uLFxuICBmb3JtYXQ6IERvY3VtZW50VXJsRm9ybWF0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHVybEluZm9zID0gdXJsSW5mb3NGcm9tRG9jdW1lbnRPckRpdmlzaW9uKGRvY3VtZW50T3JEaXZpc2lvbiwgZm9ybWF0KVxuICByZXR1cm4gdXJsSW5mb3MgPT09IG51bGwgPyBudWxsIDogdXJsSW5mb3MudXJsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cmxGcm9tU2NydXRpbihzY3J1dGluOiBTY3J1dGluKSB7XG4gIC8vIFNhbXBsZSBVSURzOiBWVEFOUjVMMTVWMzg5XG4gIGNvbnN0IG1hdGNoID0gL15WVEFOUihbMC05XSspTChbMC05XSspVihbMC05XSspJC8uZXhlYyhzY3J1dGluLnVpZClcbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgVW5hYmxlIHRvIGdlbmVyYXRlIFVSTCBmcm9tIHNjcnV0aW4gd2l0aCB1bmV4cGVjdGVkIFVJRDogXCIke3NjcnV0aW4udWlkfVwiYCxcbiAgICApXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCBsZWdpc2xhdHVyZSA9IG1hdGNoWzJdXG4gIGNvbnN0IG51bWVybyA9IG1hdGNoWzNdXG4gIHJldHVybiBgaHR0cDovL3d3dzIuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci9zY3J1dGlucy9kZXRhaWwvKGxlZ2lzbGF0dXJlKS8ke2xlZ2lzbGF0dXJlfS8obnVtKS8ke251bWVyb31gXG59XG5cbi8vLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdXNlIHRoZSBtb2Rlcm4gQXNzZW1ibMOpZSBVUkxzIGZvciBkb2N1bWVudHMuXG4vLy8gVXNlIGdlbmVyYXRvciBgaXRlckRvY3VtZW50T3JEaXZpc2lvblVybHNgIGluc3RlYWQuXG5mdW5jdGlvbiB1cmxJbmZvc0Zyb21Eb2N1bWVudE9yRGl2aXNpb24oXG4gIGRvY3VtZW50T3JEaXZpc2lvbjogRG9jdW1lbnQgfCBEaXZpc2lvbixcbiAgZm9ybWF0OiBEb2N1bWVudFVybEZvcm1hdCxcbik6IHsgZGlyZWN0b3J5OiBzdHJpbmc7IHVybDogc3RyaW5nIH0gfCBudWxsIHtcbiAgLy8gQ29kZSB0YWtlbiBmcm9tIGZ1bmN0aW9uIGBhbl90ZXh0X3VybGAgaW4gcHJvamVjdCBhbnB5OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVnYXJkc2NpdG95ZW5zL2FucHkvYmxvYi9tYXN0ZXIvYW5weS9kb3NzaWVyX2Zyb21fb3BlbmRhdGEucHlcbiAgLy8gU2VlIGh0dHBzOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvb3BlbmRhdGEvSW1wbGVtZW50YXRpb25fUmVmZXJlbnRpZWwvSWRlbnRpZmlhbnRzX1JlZmVyZW50aWVscy5odG1sXG4gIC8vIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQgb2YgYW4gVUlELlxuXG4gIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbkZyb21Eb2N1bWVudFVybEZvcm1hdChmb3JtYXQpXG4gIGNvbnN0IG1hdGNoID0gL14oLns0fSkoW0FOU10qKShSWzAtOV0pKFtMU10qKShbMC05XSopKFtCVEFDUF0qKSguKikkLy5leGVjKFxuICAgIGRvY3VtZW50T3JEaXZpc2lvbi51aWQsXG4gIClcbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgVW5hYmxlIHRvIGdlbmVyYXRlIFVSTCBmcm9tIGRvY3VtZW50IG9yIGRpdmlzaW9uIHdpdGggdW5leHBlY3RlZCBVSUQ6IFwiJHtkb2N1bWVudE9yRGl2aXNpb24udWlkfVwiYCxcbiAgICApXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCBjaGFtYnJlID0gbWF0Y2hbMl1cbiAgaWYgKGNoYW1icmUgPT09IFwiU05cIikge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFVuYWJsZSB0byBnZW5lcmF0ZSBVUkwgZm9yIGRvY3VtZW50IG9yIGRpdmlzaW9uIGluIFPDqW5hdC4gVUlEOiBcIiR7ZG9jdW1lbnRPckRpdmlzaW9uLnVpZH1cImAsXG4gICAgKVxuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgbGVnaXNsYXR1cmUgPSBtYXRjaFs1XVxuICBsZXQgbnVtYmVyID0gbWF0Y2hbN11cbiAgaWYgKGZvcm1hdCA9PT0gRG9jdW1lbnRVcmxGb3JtYXQuUmF3SHRtbCkge1xuICAgIHJldHVybiB7XG4gICAgICBkaXJlY3Rvcnk6IFwidGV4dGVzXCIsXG4gICAgICB1cmw6IGBodHRwczovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyLyR7bGVnaXNsYXR1cmV9L3RleHRlcy8ke251bWJlcn0ke2V4dGVuc2lvbn1gLFxuICAgIH1cbiAgfVxuICBsZXQgZG9jdW1lbnRUeXBlID1cbiAgICAoXG4gICAgICB7XG4gICAgICAgIEJUQzogXCJUQ09NXCIsXG4gICAgICAgIEJUQTogXCJUQURPXCIsXG4gICAgICAgIFRBUDogXCJUQURPXCIsXG4gICAgICB9IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1cbiAgICApW21hdGNoWzZdXSB8fCBtYXRjaFsxXVxuICBpZiAoXG4gICAgZG9jdW1lbnRPckRpdmlzaW9uLmNsYXNzaWZpY2F0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICBkb2N1bWVudE9yRGl2aXNpb24uY2xhc3NpZmljYXRpb24uc291c1R5cGUgIT09IHVuZGVmaW5lZCAmJlxuICAgIGRvY3VtZW50T3JEaXZpc2lvbi5jbGFzc2lmaWNhdGlvbi5zb3VzVHlwZS5jb2RlID09PSBcIkNPTVBBXCJcbiAgKSB7XG4gICAgLy8gQW5uZXhlIGF1IHJhcHBvcnQgOiBUZXh0ZSBjb21wYXJhdGlmIENPTVBBXG4gICAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UoLy1DT01QQS8sIFwiLWFDT01QQVwiKVxuICB9XG4gIGlmIChkb2N1bWVudFR5cGUgPT0gXCJBVkNFXCIpIHtcbiAgICBkb2N1bWVudFR5cGUgPSBgQVZDRSR7ZG9jdW1lbnRPckRpdmlzaW9uLmNsYXNzaWZpY2F0aW9uLmZhbWlsbGU/LmNsYXNzZS5jb2RlfWBcbiAgfVxuICBjb25zdCBmcmFnbWVudHMgPSBkb2N1bWVudFVybEZyYWdtZW50c0J5VHlwZVtkb2N1bWVudFR5cGVdXG4gIGlmIChmcmFnbWVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEZvciBleGFtcGxlOiBBTENOQU5SNUwxNUIwMDAyIChhbGxvY3V0aW9uIGR1IHByw6lzaWRlbnQpXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgVW5hYmxlIHRvIGdlbmVyYXRlIFVSTCBmcm9tIGRvY3VtZW50IG9yIGRpdmlzaW9uIG9mIFVJRCBcIiR7ZG9jdW1lbnRPckRpdmlzaW9uLnVpZH1cIiBhbmQgdHlwZSBcIiR7ZG9jdW1lbnRUeXBlfVwiYCxcbiAgICApXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCBkaXJlY3RvcnkgPVxuICAgIGZvcm1hdCA9PT0gRG9jdW1lbnRVcmxGb3JtYXQuUGRmXG4gICAgICA/IGBwZGYvJHtmcmFnbWVudHMuZGlyZWN0b3J5fWBcbiAgICAgIDogZnJhZ21lbnRzLmRpcmVjdG9yeVxuICByZXR1cm4ge1xuICAgIGRpcmVjdG9yeSxcbiAgICB1cmw6IGBodHRwczovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyLyR7bGVnaXNsYXR1cmV9LyR7ZGlyZWN0b3J5fS8ke2ZyYWdtZW50cy5wcmVmaXh9JHtudW1iZXJ9JHtmcmFnbWVudHMuc3VmZml4fSR7ZXh0ZW5zaW9ufWAsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0NBQ0EscUpBQUFBLG1CQUFBLFlBQUFBLG9CQUFBLFdBQUFDLENBQUEsU0FBQUMsQ0FBQSxFQUFBRCxDQUFBLE9BQUFFLENBQUEsR0FBQUMsTUFBQSxD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