@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
172 lines • 26.2 kB
JavaScript
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
import { glob } from "glob";
import { parse } from "node-html-parser";
import fs from "fs-extra";
import { getFiles } from "../file_systems.mjs";
import { BasePlugin } from "../bugs/index.mjs";
import { masterUrl } from "../datasets.mjs";
export let remapJo = {
RUANR5L15S2017IDS20667: "20172002",
RUANR5L15S2018IDS20817: "20180086",
RUANR5L15S2018IDS20864: "20180121",
RUANR5L15S2018IDS20981: "20180174",
RUANR5L15S2019IDS21507: "20190153",
RUANR5L15S2019IDS21608: "20190218",
RUANR5L15S2020IDS21840: "20200002",
RUANR5L15S2020IDS21841: "20200003",
RUANR5L15S2020IDS21859: "20200001",
RUANR5L15S2020IDS21970: "20200090",
RUANR5L15S2020IDS21983: "20200092",
RUANR5L15S2020IDS22019: "20200117",
RUANR5L15S2020IDS22020: "20200118",
RUANR5L15S2020IDS22021: "20200119",
RUANR5L15S2020IDS22054: "20200134",
RUANR5L15S2020IDS22055: "20200135",
RUANR5L15S2020IDS22056: "20200136",
RUANR5L15S2020IDS22057: "20200137",
RUANR5L15S2020IDS22087: "20200139",
RUANR5L15S2020IDS22089: "20200140",
RUANR5L15S2020IDS22106: "20200125"
};
export class Plugin extends BasePlugin {
constructor(options) {
super(options, "agenda-00002");
_defineProperty(this, "cr2filenames", void 0);
_defineProperty(this, "date2crs", void 0);
_defineProperty(this, "cr2date", void 0);
_defineProperty(this, "filename2date", void 0);
}
async preCheck() {
if (this.options.cr == undefined) throw "--cr is required";
this.filename2date = {};
this.cr2filenames = {};
this.date2crs = {};
this.cr2date = {};
for (const cr of getFiles([`${this.options.cr}/*.asp`])) {
this.cr2filenames[cr] = [];
const content = fs.readFileSync(cr, {
encoding: "utf-8"
});
const doc = parse(content);
const root = doc;
let found = false;
for (const meta of root.querySelectorAll("meta")) {
if (meta.attributes["name"] == "QUANTIEME_SEANCE") {
const date = meta.attributes["content"].split(" ").splice(-3).join(" ");
if (!(date in this.date2crs)) this.date2crs[date] = [];
this.date2crs[date].push(cr);
this.cr2date[cr] = date;
found = true;
break;
}
}
if (!found) {
console.error(`${cr} is missing the meta name="QUANTIEME_SEANCE"`);
}
}
}
static comptesRendusUrls(filename) {
const re = "^.*/comptes-rendus/(.*)";
const match = new RegExp(re).exec(filename);
if (match == null) return filename;
const file = match[1];
return `[${file}](https://git.en-root.org/tricoteuses/html/comptes-rendus/-/tree/master/${file})`;
}
async check(agenda, filename) {
if (agenda.xsiType != "seance_type" || agenda.lieu.code != "AN" || agenda.cycleDeVie.etat == "Supprimé" || agenda.cycleDeVie.etat == "Annulé") return null;
if (this.options.verbose) console.log(`agenda-00002: ${filename}`);
let status = "ok";
let info = [];
const dateSeance = new Date(agenda.identifiants.dateSeance.substring(0, 10));
const year = dateSeance.toLocaleDateString("fr", {
year: "numeric"
});
const day = dateSeance.toLocaleDateString("fr", {
day: "2-digit"
});
const month = dateSeance.toLocaleDateString("fr", {
month: "long"
});
const dateSeanceString = `${day} ${month} ${year}`;
this.filename2date[filename] = dateSeanceString;
let idJo;
if (agenda.identifiants == undefined || agenda.identifiants.idJo == undefined) {
const week = 7 * 24 * 60 * 60 * 1000;
if (dateSeance >= new Date(new Date().getTime() - week)) {
return null;
} else {
idJo = undefined;
}
} else {
idJo = agenda.identifiants.idJo;
}
if (agenda.uid in remapJo) {
if (idJo == remapJo[agenda.uid]) {
info.push(`idJo already is ${idJo}`);
status = "already-fixed";
} else {
idJo = remapJo[agenda.uid];
status = "will-be-fixed";
}
}
if (idJo == undefined) {
return {
status: "needs-fixing",
info: ["idJo field is missing"]
};
}
const pattern = `${this.options.cr}/*_${idJo}.asp`;
const expanded = glob.globSync(pattern);
let cr;
if (expanded.length > 0) cr = expanded[0];else cr = undefined;
if (cr != undefined) {
this.cr2filenames[cr].push(filename);
if (dateSeanceString != this.cr2date[cr]) {
info.push(`${Plugin.comptesRendusUrls(cr)} meta QUANTIEME_SEANCE contains ${this.cr2date[cr]} instead of the expected ${dateSeanceString}`);
status = "needs-fixing";
}
} else {
if (status != "will-be-fixed") {
info.push(`${pattern} does not exist`);
status = "needs-fixing";
}
}
return {
status: status,
info: info
};
}
findCandidates(filename) {
const date = this.filename2date[filename];
if (!(date in this.date2crs)) return [];
let candidates = [];
for (const cr of this.date2crs[date]) {
if (this.cr2filenames[cr].length > 0) candidates.push(`${Plugin.comptesRendusUrls(cr)} is not a candidate because it is referenced by ${masterUrl(this.cr2filenames[cr])}`);else candidates.push(`${Plugin.comptesRendusUrls(cr)} is a candidate`);
}
return candidates;
}
async postCheck(analysis) {
for (const filename of Object.keys(analysis)) {
const result = analysis[filename]["agenda-00002"];
if (result == null || result["status"] != "needs-fixing") continue;
const info = result["info"].join("");
if (info.includes("meta QUANTIEME") || info.includes("idJo field is missing")) {
result["info"] = result["info"].concat(this.findCandidates(filename));
}
}
}
async fix(agenda) {
if (!(agenda.uid in remapJo)) {
return null;
}
const idJo = remapJo[agenda.uid];
const numSeanceJo = String(Number(idJo.substring(5)));
if (agenda.identifiants.idJo == idJo && agenda.identifiants.numSeanceJo == numSeanceJo) return false;
agenda.identifiants.idJo = idJo;
agenda.identifiants.numSeanceJo = numSeanceJo;
return true;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnbG9iIiwicGFyc2UiLCJmcyIsImdldEZpbGVzIiwiQmFzZVBsdWdpbiIsIm1hc3RlclVybCIsInJlbWFwSm8iLCJSVUFOUjVMMTVTMjAxN0lEUzIwNjY3IiwiUlVBTlI1TDE1UzIwMThJRFMyMDgxNyIsIlJVQU5SNUwxNVMyMDE4SURTMjA4NjQiLCJSVUFOUjVMMTVTMjAxOElEUzIwOTgxIiwiUlVBTlI1TDE1UzIwMTlJRFMyMTUwNyIsIlJVQU5SNUwxNVMyMDE5SURTMjE2MDgiLCJSVUFOUjVMMTVTMjAyMElEUzIxODQwIiwiUlVBTlI1TDE1UzIwMjBJRFMyMTg0MSIsIlJVQU5SNUwxNVMyMDIwSURTMjE4NTkiLCJSVUFOUjVMMTVTMjAyMElEUzIxOTcwIiwiUlVBTlI1TDE1UzIwMjBJRFMyMTk4MyIsIlJVQU5SNUwxNVMyMDIwSURTMjIwMTkiLCJSVUFOUjVMMTVTMjAyMElEUzIyMDIwIiwiUlVBTlI1TDE1UzIwMjBJRFMyMjAyMSIsIlJVQU5SNUwxNVMyMDIwSURTMjIwNTQiLCJSVUFOUjVMMTVTMjAyMElEUzIyMDU1IiwiUlVBTlI1TDE1UzIwMjBJRFMyMjA1NiIsIlJVQU5SNUwxNVMyMDIwSURTMjIwNTciLCJSVUFOUjVMMTVTMjAyMElEUzIyMDg3IiwiUlVBTlI1TDE1UzIwMjBJRFMyMjA4OSIsIlJVQU5SNUwxNVMyMDIwSURTMjIxMDYiLCJQbHVnaW4iLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJfZGVmaW5lUHJvcGVydHkiLCJwcmVDaGVjayIsImNyIiwidW5kZWZpbmVkIiwiZmlsZW5hbWUyZGF0ZSIsImNyMmZpbGVuYW1lcyIsImRhdGUyY3JzIiwiY3IyZGF0ZSIsImNvbnRlbnQiLCJyZWFkRmlsZVN5bmMiLCJlbmNvZGluZyIsImRvYyIsInJvb3QiLCJmb3VuZCIsIm1ldGEiLCJxdWVyeVNlbGVjdG9yQWxsIiwiYXR0cmlidXRlcyIsImRhdGUiLCJzcGxpdCIsInNwbGljZSIsImpvaW4iLCJwdXNoIiwiY29uc29sZSIsImVycm9yIiwiY29tcHRlc1JlbmR1c1VybHMiLCJmaWxlbmFtZSIsInJlIiwibWF0Y2giLCJSZWdFeHAiLCJleGVjIiwiZmlsZSIsImNoZWNrIiwiYWdlbmRhIiwieHNpVHlwZSIsImxpZXUiLCJjb2RlIiwiY3ljbGVEZVZpZSIsImV0YXQiLCJ2ZXJib3NlIiwibG9nIiwic3RhdHVzIiwiaW5mbyIsImRhdGVTZWFuY2UiLCJEYXRlIiwiaWRlbnRpZmlhbnRzIiwic3Vic3RyaW5nIiwieWVhciIsInRvTG9jYWxlRGF0ZVN0cmluZyIsImRheSIsIm1vbnRoIiwiZGF0ZVNlYW5jZVN0cmluZyIsImlkSm8iLCJ3ZWVrIiwiZ2V0VGltZSIsInVpZCIsInBhdHRlcm4iLCJleHBhbmRlZCIsImdsb2JTeW5jIiwibGVuZ3RoIiwiZmluZENhbmRpZGF0ZXMiLCJjYW5kaWRhdGVzIiwicG9zdENoZWNrIiwiYW5hbHlzaXMiLCJPYmplY3QiLCJrZXlzIiwicmVzdWx0IiwiaW5jbHVkZXMiLCJjb25jYXQiLCJmaXgiLCJudW1TZWFuY2VKbyIsIlN0cmluZyIsIk51bWJlciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWdzL2FnZW5kYS0wMDAwMi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnbG9iIH0gZnJvbSBcImdsb2JcIlxuaW1wb3J0IHsgSFRNTEVsZW1lbnQsIHBhcnNlLCBUZXh0Tm9kZSB9IGZyb20gXCJub2RlLWh0bWwtcGFyc2VyXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHsgZ2V0RmlsZXMgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmltcG9ydCB7IEJhc2VQbHVnaW4gfSBmcm9tIFwiLi4vYnVnc1wiXG5pbXBvcnQgeyBtYXN0ZXJVcmwgfSBmcm9tIFwiLi4vZGF0YXNldHNcIlxuXG5leHBvcnQgbGV0IHJlbWFwSm86IGFueSA9IHtcbiAgUlVBTlI1TDE1UzIwMTdJRFMyMDY2NzogXCIyMDE3MjAwMlwiLFxuICBSVUFOUjVMMTVTMjAxOElEUzIwODE3OiBcIjIwMTgwMDg2XCIsXG4gIFJVQU5SNUwxNVMyMDE4SURTMjA4NjQ6IFwiMjAxODAxMjFcIixcbiAgUlVBTlI1TDE1UzIwMThJRFMyMDk4MTogXCIyMDE4MDE3NFwiLFxuICBSVUFOUjVMMTVTMjAxOUlEUzIxNTA3OiBcIjIwMTkwMTUzXCIsXG4gIFJVQU5SNUwxNVMyMDE5SURTMjE2MDg6IFwiMjAxOTAyMThcIixcbiAgUlVBTlI1TDE1UzIwMjBJRFMyMTg0MDogXCIyMDIwMDAwMlwiLFxuICBSVUFOUjVMMTVTMjAyMElEUzIxODQxOiBcIjIwMjAwMDAzXCIsXG4gIFJVQU5SNUwxNVMyMDIwSURTMjE4NTk6IFwiMjAyMDAwMDFcIixcbiAgUlVBTlI1TDE1UzIwMjBJRFMyMTk3MDogXCIyMDIwMDA5MFwiLFxuICBSVUFOUjVMMTVTMjAyMElEUzIxOTgzOiBcIjIwMjAwMDkyXCIsXG4gIFJVQU5SNUwxNVMyMDIwSURTMjIwMTk6IFwiMjAyMDAxMTdcIixcbiAgUlVBTlI1TDE1UzIwMjBJRFMyMjAyMDogXCIyMDIwMDExOFwiLFxuICBSVUFOUjVMMTVTMjAyMElEUzIyMDIxOiBcIjIwMjAwMTE5XCIsXG4gIFJVQU5SNUwxNVMyMDIwSURTMjIwNTQ6IFwiMjAyMDAxMzRcIixcbiAgUlVBTlI1TDE1UzIwMjBJRFMyMjA1NTogXCIyMDIwMDEzNVwiLFxuICBSVUFOUjVMMTVTMjAyMElEUzIyMDU2OiBcIjIwMjAwMTM2XCIsXG4gIFJVQU5SNUwxNVMyMDIwSURTMjIwNTc6IFwiMjAyMDAxMzdcIixcbiAgUlVBTlI1TDE1UzIwMjBJRFMyMjA4NzogXCIyMDIwMDEzOVwiLFxuICBSVUFOUjVMMTVTMjAyMElEUzIyMDg5OiBcIjIwMjAwMTQwXCIsXG4gIFJVQU5SNUwxNVMyMDIwSURTMjIxMDY6IFwiMjAyMDAxMjVcIixcbn1cblxuZXhwb3J0IGNsYXNzIFBsdWdpbiBleHRlbmRzIEJhc2VQbHVnaW4ge1xuICBjcjJmaWxlbmFtZXM6IGFueVxuICBkYXRlMmNyczogYW55XG4gIGNyMmRhdGU6IGFueVxuICBmaWxlbmFtZTJkYXRlOiBhbnlcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBhbnkpIHtcbiAgICBzdXBlcihvcHRpb25zLCBcImFnZW5kYS0wMDAwMlwiKVxuICB9XG5cbiAgYXN5bmMgcHJlQ2hlY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jciA9PSB1bmRlZmluZWQpIHRocm93IFwiLS1jciBpcyByZXF1aXJlZFwiXG4gICAgdGhpcy5maWxlbmFtZTJkYXRlID0ge31cbiAgICB0aGlzLmNyMmZpbGVuYW1lcyA9IHt9XG4gICAgdGhpcy5kYXRlMmNycyA9IHt9XG4gICAgdGhpcy5jcjJkYXRlID0ge31cbiAgICBmb3IgKGNvbnN0IGNyIG9mIGdldEZpbGVzKFtgJHt0aGlzLm9wdGlvbnMuY3J9LyouYXNwYF0pKSB7XG4gICAgICB0aGlzLmNyMmZpbGVuYW1lc1tjcl0gPSBbXVxuXG4gICAgICBjb25zdCBjb250ZW50OiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoY3IsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KVxuXG4gICAgICB0eXBlIFBhcnNlUmVzdWx0ID1cbiAgICAgICAgfCAoVGV4dE5vZGUgJiB7IHZhbGlkPzogYm9vbGVhbiB9KVxuICAgICAgICB8IChIVE1MRWxlbWVudCAmIHsgdmFsaWQ/OiBib29sZWFuIH0pXG4gICAgICBjb25zdCBkb2M6IFBhcnNlUmVzdWx0ID0gcGFyc2UoY29udGVudClcbiAgICAgIGNvbnN0IHJvb3QgPSBkb2MgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudFxuICAgICAgbGV0IGZvdW5kID0gZmFsc2VcbiAgICAgIGZvciAoY29uc3QgbWV0YSBvZiByb290LnF1ZXJ5U2VsZWN0b3JBbGwoXCJtZXRhXCIpKSB7XG4gICAgICAgIGlmIChtZXRhLmF0dHJpYnV0ZXNbXCJuYW1lXCJdID09IFwiUVVBTlRJRU1FX1NFQU5DRVwiKSB7XG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG1ldGEuYXR0cmlidXRlc1tcImNvbnRlbnRcIl1cbiAgICAgICAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgICAgICAgIC5zcGxpY2UoLTMpXG4gICAgICAgICAgICAuam9pbihcIiBcIilcbiAgICAgICAgICBpZiAoIShkYXRlIGluIHRoaXMuZGF0ZTJjcnMpKSB0aGlzLmRhdGUyY3JzW2RhdGVdID0gW11cbiAgICAgICAgICB0aGlzLmRhdGUyY3JzW2RhdGVdLnB1c2goY3IpXG4gICAgICAgICAgdGhpcy5jcjJkYXRlW2NyXSA9IGRhdGVcbiAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7Y3J9IGlzIG1pc3NpbmcgdGhlIG1ldGEgbmFtZT1cIlFVQU5USUVNRV9TRUFOQ0VcImApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNvbXB0ZXNSZW5kdXNVcmxzKGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlID0gXCJeLiovY29tcHRlcy1yZW5kdXMvKC4qKVwiXG4gICAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKHJlKS5leGVjKGZpbGVuYW1lKVxuICAgIGlmIChtYXRjaCA9PSBudWxsKSByZXR1cm4gZmlsZW5hbWVcbiAgICBjb25zdCBmaWxlID0gbWF0Y2hbMV1cbiAgICByZXR1cm4gYFske2ZpbGV9XShodHRwczovL2dpdC5lbi1yb290Lm9yZy90cmljb3RldXNlcy9odG1sL2NvbXB0ZXMtcmVuZHVzLy0vdHJlZS9tYXN0ZXIvJHtmaWxlfSlgXG4gIH1cblxuICBhc3luYyBjaGVjayhhZ2VuZGE6IGFueSwgZmlsZW5hbWU6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKFxuICAgICAgYWdlbmRhLnhzaVR5cGUgIT0gXCJzZWFuY2VfdHlwZVwiIHx8XG4gICAgICBhZ2VuZGEubGlldS5jb2RlICE9IFwiQU5cIiB8fFxuICAgICAgYWdlbmRhLmN5Y2xlRGVWaWUuZXRhdCA9PSBcIlN1cHByaW3DqVwiIHx8XG4gICAgICBhZ2VuZGEuY3ljbGVEZVZpZS5ldGF0ID09IFwiQW5udWzDqVwiXG4gICAgKVxuICAgICAgcmV0dXJuIG51bGxcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkgY29uc29sZS5sb2coYGFnZW5kYS0wMDAwMjogJHtmaWxlbmFtZX1gKVxuICAgIGxldCBzdGF0dXMgPSBcIm9rXCJcbiAgICBsZXQgaW5mbzogYW55ID0gW11cblxuICAgIGNvbnN0IGRhdGVTZWFuY2UgPSBuZXcgRGF0ZShhZ2VuZGEuaWRlbnRpZmlhbnRzLmRhdGVTZWFuY2Uuc3Vic3RyaW5nKDAsIDEwKSlcbiAgICBjb25zdCB5ZWFyID0gZGF0ZVNlYW5jZS50b0xvY2FsZURhdGVTdHJpbmcoXCJmclwiLCB7IHllYXI6IFwibnVtZXJpY1wiIH0pXG4gICAgY29uc3QgZGF5ID0gZGF0ZVNlYW5jZS50b0xvY2FsZURhdGVTdHJpbmcoXCJmclwiLCB7IGRheTogXCIyLWRpZ2l0XCIgfSlcbiAgICBjb25zdCBtb250aCA9IGRhdGVTZWFuY2UudG9Mb2NhbGVEYXRlU3RyaW5nKFwiZnJcIiwgeyBtb250aDogXCJsb25nXCIgfSlcbiAgICBjb25zdCBkYXRlU2VhbmNlU3RyaW5nID0gYCR7ZGF5fSAke21vbnRofSAke3llYXJ9YFxuICAgIHRoaXMuZmlsZW5hbWUyZGF0ZVtmaWxlbmFtZV0gPSBkYXRlU2VhbmNlU3RyaW5nXG5cbiAgICBsZXQgaWRKb1xuXG4gICAgaWYgKFxuICAgICAgYWdlbmRhLmlkZW50aWZpYW50cyA9PSB1bmRlZmluZWQgfHxcbiAgICAgIGFnZW5kYS5pZGVudGlmaWFudHMuaWRKbyA9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IHdlZWsgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICAgICAgaWYgKGRhdGVTZWFuY2UgPj0gbmV3IERhdGUobmV3IERhdGUoKS5nZXRUaW1lKCkgLSB3ZWVrKSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWRKbyA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZEpvID0gYWdlbmRhLmlkZW50aWZpYW50cy5pZEpvXG4gICAgfVxuXG4gICAgaWYgKGFnZW5kYS51aWQgaW4gcmVtYXBKbykge1xuICAgICAgaWYgKGlkSm8gPT0gcmVtYXBKb1thZ2VuZGEudWlkXSkge1xuICAgICAgICBpbmZvLnB1c2goYGlkSm8gYWxyZWFkeSBpcyAke2lkSm99YClcbiAgICAgICAgc3RhdHVzID0gXCJhbHJlYWR5LWZpeGVkXCJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlkSm8gPSByZW1hcEpvW2FnZW5kYS51aWRdXG4gICAgICAgIHN0YXR1cyA9IFwid2lsbC1iZS1maXhlZFwiXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlkSm8gPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6IFwibmVlZHMtZml4aW5nXCIsXG4gICAgICAgIGluZm86IFtcImlkSm8gZmllbGQgaXMgbWlzc2luZ1wiXSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJuID0gYCR7dGhpcy5vcHRpb25zLmNyfS8qXyR7aWRKb30uYXNwYFxuICAgIGNvbnN0IGV4cGFuZGVkID0gZ2xvYi5nbG9iU3luYyhwYXR0ZXJuKVxuICAgIGxldCBjclxuICAgIGlmIChleHBhbmRlZC5sZW5ndGggPiAwKSBjciA9IGV4cGFuZGVkWzBdXG4gICAgZWxzZSBjciA9IHVuZGVmaW5lZFxuICAgIGlmIChjciAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY3IyZmlsZW5hbWVzW2NyXS5wdXNoKGZpbGVuYW1lKVxuXG4gICAgICBpZiAoZGF0ZVNlYW5jZVN0cmluZyAhPSB0aGlzLmNyMmRhdGVbY3JdKSB7XG4gICAgICAgIGluZm8ucHVzaChcbiAgICAgICAgICBgJHtQbHVnaW4uY29tcHRlc1JlbmR1c1VybHMoY3IpfSBtZXRhIFFVQU5USUVNRV9TRUFOQ0UgY29udGFpbnMgJHtcbiAgICAgICAgICAgIHRoaXMuY3IyZGF0ZVtjcl1cbiAgICAgICAgICB9IGluc3RlYWQgb2YgdGhlIGV4cGVjdGVkICR7ZGF0ZVNlYW5jZVN0cmluZ31gLFxuICAgICAgICApXG4gICAgICAgIHN0YXR1cyA9IFwibmVlZHMtZml4aW5nXCJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXR1cyAhPSBcIndpbGwtYmUtZml4ZWRcIikge1xuICAgICAgICBpbmZvLnB1c2goYCR7cGF0dGVybn0gZG9lcyBub3QgZXhpc3RgKVxuICAgICAgICBzdGF0dXMgPSBcIm5lZWRzLWZpeGluZ1wiXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLCBpbmZvOiBpbmZvIH1cbiAgfVxuXG4gIGZpbmRDYW5kaWRhdGVzKGZpbGVuYW1lOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmZpbGVuYW1lMmRhdGVbZmlsZW5hbWVdXG4gICAgaWYgKCEoZGF0ZSBpbiB0aGlzLmRhdGUyY3JzKSkgcmV0dXJuIFtdXG4gICAgbGV0IGNhbmRpZGF0ZXMgPSBbXVxuICAgIGZvciAoY29uc3QgY3Igb2YgdGhpcy5kYXRlMmNyc1tkYXRlXSkge1xuICAgICAgaWYgKHRoaXMuY3IyZmlsZW5hbWVzW2NyXS5sZW5ndGggPiAwKVxuICAgICAgICBjYW5kaWRhdGVzLnB1c2goXG4gICAgICAgICAgYCR7UGx1Z2luLmNvbXB0ZXNSZW5kdXNVcmxzKFxuICAgICAgICAgICAgY3IsXG4gICAgICAgICAgKX0gaXMgbm90IGEgY2FuZGlkYXRlIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZCBieSAke21hc3RlclVybChcbiAgICAgICAgICAgIHRoaXMuY3IyZmlsZW5hbWVzW2NyXSxcbiAgICAgICAgICApfWAsXG4gICAgICAgIClcbiAgICAgIGVsc2UgY2FuZGlkYXRlcy5wdXNoKGAke1BsdWdpbi5jb21wdGVzUmVuZHVzVXJscyhjcil9IGlzIGEgY2FuZGlkYXRlYClcbiAgICB9XG4gICAgcmV0dXJuIGNhbmRpZGF0ZXNcbiAgfVxuXG4gIGFzeW5jIHBvc3RDaGVjayhhbmFseXNpczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIE9iamVjdC5rZXlzKGFuYWx5c2lzKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYW5hbHlzaXNbZmlsZW5hbWVdW1wiYWdlbmRhLTAwMDAyXCJdXG4gICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0W1wic3RhdHVzXCJdICE9IFwibmVlZHMtZml4aW5nXCIpIGNvbnRpbnVlXG4gICAgICBjb25zdCBpbmZvID0gcmVzdWx0W1wiaW5mb1wiXS5qb2luKFwiXCIpXG4gICAgICBpZiAoXG4gICAgICAgIGluZm8uaW5jbHVkZXMoXCJtZXRhIFFVQU5USUVNRVwiKSB8fFxuICAgICAgICBpbmZvLmluY2x1ZGVzKFwiaWRKbyBmaWVsZCBpcyBtaXNzaW5nXCIpXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0W1wiaW5mb1wiXSA9IHJlc3VsdFtcImluZm9cIl0uY29uY2F0KHRoaXMuZmluZENhbmRpZGF0ZXMoZmlsZW5hbWUpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZpeChhZ2VuZGE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCEoYWdlbmRhLnVpZCBpbiByZW1hcEpvKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCBpZEpvID0gcmVtYXBKb1thZ2VuZGEudWlkXVxuICAgIGNvbnN0IG51bVNlYW5jZUpvID0gU3RyaW5nKE51bWJlcihpZEpvLnN1YnN0cmluZyg1KSkpXG4gICAgaWYgKFxuICAgICAgYWdlbmRhLmlkZW50aWZpYW50cy5pZEpvID09IGlkSm8gJiZcbiAgICAgIGFnZW5kYS5pZGVudGlmaWFudHMubnVtU2VhbmNlSm8gPT0gbnVtU2VhbmNlSm9cbiAgICApXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBhZ2VuZGEuaWRlbnRpZmlhbnRzLmlkSm8gPSBpZEpvXG4gICAgYWdlbmRhLmlkZW50aWZpYW50cy5udW1TZWFuY2VKbyA9IG51bVNlYW5jZUpvXG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFBQSxTQUFTQSxJQUFJLFFBQVEsTUFBTTtBQUMzQixTQUFzQkMsS0FBSyxRQUFrQixrQkFBa0I7QUFDL0QsT0FBT0MsRUFBRSxNQUFNLFVBQVU7QUFBQSxTQUNoQkMsUUFBUTtBQUFBLFNBQ1JDLFVBQVU7QUFBQSxTQUNWQyxTQUFTO0FBRWxCLE9BQU8sSUFBSUMsT0FBWSxHQUFHO0VBQ3hCQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDQyxzQkFBc0IsRUFBRTtBQUMxQixDQUFDO0FBRUQsT0FBTyxNQUFNQyxNQUFNLFNBQVN4QixVQUFVLENBQUM7RUFNckN5QixXQUFXQSxDQUFDQyxPQUFZLEVBQUU7SUFDeEIsS0FBSyxDQUFDQSxPQUFPLEVBQUUs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