@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
221 lines • 25.7 kB
JavaScript
import assert from "assert";
import { cleanBooleanAttribute, cleanIntegerAttribute, cleanXmlArtefacts } from "./xml.mjs";
function cleanDecompteNominatif(decompteNominatif) {
cleanXmlArtefacts(decompteNominatif);
let nonVotants = decompteNominatif.nonVotants;
if (nonVotants === undefined) {
nonVotants = decompteNominatif.nonVotant;
delete decompteNominatif.nonVotant;
} else {
assert.strictEqual(decompteNominatif.nonVotant, undefined);
}
if (nonVotants !== undefined) {
if (typeof nonVotants === "string") {
assert.strictEqual(nonVotants, "0");
nonVotants = [];
} else if (!Array.isArray(nonVotants)) {
assert(nonVotants);
nonVotants = [nonVotants];
}
const nonVotantsArray = nonVotants;
nonVotants = [];
for (let nonVotant of nonVotantsArray) {
if (nonVotant === null) {
continue;
}
nonVotant = nonVotant.votant;
if (Array.isArray(nonVotant)) {
nonVotants.push(...nonVotant);
} else {
assert(nonVotant);
nonVotants.push(nonVotant);
}
}
if (nonVotants.length === 0) {
delete decompteNominatif.nonVotants;
} else {
decompteNominatif.nonVotants = nonVotants;
for (const votant of nonVotants) {
cleanVotant(votant);
}
}
}
let pour = decompteNominatif.pour;
if (pour === undefined) {
pour = decompteNominatif.pours;
delete decompteNominatif.pours;
} else {
assert.strictEqual(decompteNominatif.pours, undefined);
}
if (pour !== undefined) {
pour = pour.votant;
if (!Array.isArray(pour)) {
assert(pour);
pour = [pour];
}
if (pour.length === 0) {
delete decompteNominatif.pour;
} else {
decompteNominatif.pour = pour;
for (const votant of pour) {
cleanVotant(votant);
}
}
}
let contre = decompteNominatif.contre;
if (contre === undefined) {
contre = decompteNominatif.contres;
delete decompteNominatif.contres;
} else {
assert.strictEqual(decompteNominatif.contres, undefined);
}
if (contre !== undefined) {
contre = contre.votant;
if (!Array.isArray(contre)) {
assert(contre);
contre = [contre];
}
if (contre.length === 0) {
delete decompteNominatif.contre;
} else {
decompteNominatif.contre = contre;
for (const votant of contre) {
cleanVotant(votant);
}
}
}
let abstentions = decompteNominatif.abstentions;
if (abstentions === undefined) {
abstentions = decompteNominatif.abstention;
delete decompteNominatif.abstention;
} else {
assert.strictEqual(decompteNominatif.abstention, undefined);
}
if (abstentions !== undefined) {
if (!Array.isArray(abstentions)) {
assert(abstentions);
abstentions = [abstentions];
}
const abstentionsArray = abstentions;
abstentions = [];
for (let absentionsItem of abstentionsArray) {
if (absentionsItem === null) {
continue;
}
absentionsItem = absentionsItem.votant;
if (Array.isArray(absentionsItem)) {
abstentions.push(...absentionsItem);
} else {
assert(absentionsItem);
abstentions.push(absentionsItem);
}
}
if (abstentions.length === 0) {
delete decompteNominatif.abstentions;
} else {
decompteNominatif.abstentions = abstentions;
for (const votant of abstentions) {
cleanVotant(votant);
}
}
}
let nonVotantsVolontaires = decompteNominatif.nonVotantsVolontaires;
if (nonVotantsVolontaires !== undefined) {
if (!Array.isArray(nonVotantsVolontaires)) {
nonVotantsVolontaires = [nonVotantsVolontaires];
}
const nonVotantsVolontairesArray = nonVotantsVolontaires;
nonVotantsVolontaires = [];
for (let absentionsItem of nonVotantsVolontairesArray) {
if (absentionsItem === null) {
continue;
}
absentionsItem = absentionsItem.votant;
if (Array.isArray(absentionsItem)) {
nonVotantsVolontaires.push(...absentionsItem);
} else {
assert(absentionsItem);
nonVotantsVolontaires.push(absentionsItem);
}
}
if (nonVotantsVolontaires.length === 0) {
delete decompteNominatif.nonVotantsVolontaires;
} else {
decompteNominatif.nonVotantsVolontaires = nonVotantsVolontaires;
for (const votant of nonVotantsVolontaires) {
cleanVotant(votant);
}
}
}
}
export function cleanScrutin(scrutin) {
cleanXmlArtefacts(scrutin);
const demandeur = scrutin.demandeur;
assert(demandeur);
{
cleanXmlArtefacts(demandeur);
assert.strictEqual(demandeur.referenceLegislative, undefined);
}
const objet = scrutin.objet;
assert(objet);
{
cleanXmlArtefacts(objet);
assert.strictEqual(objet.referenceLegislative, undefined);
}
let ventilationVotes = scrutin.ventilationVotes;
assert(ventilationVotes);
{
ventilationVotes = ventilationVotes.organe;
assert(ventilationVotes);
let groupes = ventilationVotes.groupes;
assert(groupes);
{
groupes = groupes.groupe;
assert(Array.isArray(groupes));
for (const groupe of groupes) {
const vote = groupe.vote;
assert(vote);
{
const decompteVoix = vote.decompteVoix;
assert(decompteVoix);
{
if (decompteVoix.abstention !== undefined) {
assert.strictEqual(decompteVoix.abstentions, undefined);
decompteVoix.abstentions = decompteVoix.abstention;
delete decompteVoix.abstention;
}
if (decompteVoix.nonVotant !== undefined) {
assert.strictEqual(decompteVoix.nonVotants, undefined);
decompteVoix.nonVotants = decompteVoix.nonVotant;
delete decompteVoix.nonVotant;
}
}
const decompteNominatif = vote.decompteNominatif;
assert(decompteNominatif);
cleanDecompteNominatif(decompteNominatif);
}
}
ventilationVotes.groupes = groupes;
}
scrutin.ventilationVotes = ventilationVotes;
}
const miseAuPoint = scrutin.miseAuPoint;
if (miseAuPoint !== undefined) {
cleanDecompteNominatif(miseAuPoint);
let dysfonctionnement = miseAuPoint.dysfonctionnement;
if (dysfonctionnement !== undefined) {
cleanDecompteNominatif(dysfonctionnement);
if (Object.values(dysfonctionnement).filter(value => value !== undefined).length === 0) {
delete miseAuPoint.dysfonctionnement;
}
}
if (Object.values(miseAuPoint).filter(value => value !== undefined).length === 0) {
delete scrutin.miseAuPoint;
}
}
}
function cleanVotant(votant) {
cleanBooleanAttribute(votant, "parDelegation");
cleanIntegerAttribute(votant, "numPlace");
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjbGVhbkJvb2xlYW5BdHRyaWJ1dGUiLCJjbGVhbkludGVnZXJBdHRyaWJ1dGUiLCJjbGVhblhtbEFydGVmYWN0cyIsImNsZWFuRGVjb21wdGVOb21pbmF0aWYiLCJkZWNvbXB0ZU5vbWluYXRpZiIsIm5vblZvdGFudHMiLCJ1bmRlZmluZWQiLCJub25Wb3RhbnQiLCJzdHJpY3RFcXVhbCIsIkFycmF5IiwiaXNBcnJheSIsIm5vblZvdGFudHNBcnJheSIsInZvdGFudCIsInB1c2giLCJsZW5ndGgiLCJjbGVhblZvdGFudCIsInBvdXIiLCJwb3VycyIsImNvbnRyZSIsImNvbnRyZXMiLCJhYnN0ZW50aW9ucyIsImFic3RlbnRpb24iLCJhYnN0ZW50aW9uc0FycmF5IiwiYWJzZW50aW9uc0l0ZW0iLCJub25Wb3RhbnRzVm9sb250YWlyZXMiLCJub25Wb3RhbnRzVm9sb250YWlyZXNBcnJheSIsImNsZWFuU2NydXRpbiIsInNjcnV0aW4iLCJkZW1hbmRldXIiLCJyZWZlcmVuY2VMZWdpc2xhdGl2ZSIsIm9iamV0IiwidmVudGlsYXRpb25Wb3RlcyIsIm9yZ2FuZSIsImdyb3VwZXMiLCJncm91cGUiLCJ2b3RlIiwiZGVjb21wdGVWb2l4IiwibWlzZUF1UG9pbnQiLCJkeXNmb25jdGlvbm5lbWVudCIsIk9iamVjdCIsInZhbHVlcyIsImZpbHRlciIsInZhbHVlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsZWFuZXJzL3NjcnV0aW5zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5cbmltcG9ydCB7XG4gIGNsZWFuQm9vbGVhbkF0dHJpYnV0ZSxcbiAgY2xlYW5JbnRlZ2VyQXR0cmlidXRlLFxuICBjbGVhblhtbEFydGVmYWN0cyxcbn0gZnJvbSBcIi4veG1sXCJcblxuZnVuY3Rpb24gY2xlYW5EZWNvbXB0ZU5vbWluYXRpZihkZWNvbXB0ZU5vbWluYXRpZjogYW55KSB7XG4gIGNsZWFuWG1sQXJ0ZWZhY3RzKGRlY29tcHRlTm9taW5hdGlmKVxuXG4gIGxldCBub25Wb3RhbnRzID0gZGVjb21wdGVOb21pbmF0aWYubm9uVm90YW50c1xuICBpZiAobm9uVm90YW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbm9uVm90YW50cyA9IGRlY29tcHRlTm9taW5hdGlmLm5vblZvdGFudFxuICAgIGRlbGV0ZSBkZWNvbXB0ZU5vbWluYXRpZi5ub25Wb3RhbnRcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjb21wdGVOb21pbmF0aWYubm9uVm90YW50LCB1bmRlZmluZWQpXG4gIH1cbiAgaWYgKG5vblZvdGFudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2Ygbm9uVm90YW50cyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5vblZvdGFudHMsIFwiMFwiKVxuICAgICAgbm9uVm90YW50cyA9IFtdXG4gICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShub25Wb3RhbnRzKSkge1xuICAgICAgYXNzZXJ0KG5vblZvdGFudHMpXG4gICAgICBub25Wb3RhbnRzID0gW25vblZvdGFudHNdXG4gICAgfVxuICAgIGNvbnN0IG5vblZvdGFudHNBcnJheSA9IG5vblZvdGFudHNcbiAgICBub25Wb3RhbnRzID0gW11cbiAgICBmb3IgKGxldCBub25Wb3RhbnQgb2Ygbm9uVm90YW50c0FycmF5KSB7XG4gICAgICBpZiAobm9uVm90YW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBub25Wb3RhbnQgPSBub25Wb3RhbnQudm90YW50XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShub25Wb3RhbnQpKSB7XG4gICAgICAgIG5vblZvdGFudHMucHVzaCguLi5ub25Wb3RhbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQobm9uVm90YW50KVxuICAgICAgICBub25Wb3RhbnRzLnB1c2gobm9uVm90YW50KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9uVm90YW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBkZWNvbXB0ZU5vbWluYXRpZi5ub25Wb3RhbnRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY29tcHRlTm9taW5hdGlmLm5vblZvdGFudHMgPSBub25Wb3RhbnRzXG4gICAgICBmb3IgKGNvbnN0IHZvdGFudCBvZiBub25Wb3RhbnRzKSB7XG4gICAgICAgIGNsZWFuVm90YW50KHZvdGFudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgcG91ciA9IGRlY29tcHRlTm9taW5hdGlmLnBvdXJcbiAgaWYgKHBvdXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHBvdXIgPSBkZWNvbXB0ZU5vbWluYXRpZi5wb3Vyc1xuICAgIGRlbGV0ZSBkZWNvbXB0ZU5vbWluYXRpZi5wb3Vyc1xuICB9IGVsc2Uge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNvbXB0ZU5vbWluYXRpZi5wb3VycywgdW5kZWZpbmVkKVxuICB9XG4gIGlmIChwb3VyICE9PSB1bmRlZmluZWQpIHtcbiAgICBwb3VyID0gcG91ci52b3RhbnRcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocG91cikpIHtcbiAgICAgIGFzc2VydChwb3VyKVxuICAgICAgcG91ciA9IFtwb3VyXVxuICAgIH1cbiAgICBpZiAocG91ci5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBkZWNvbXB0ZU5vbWluYXRpZi5wb3VyXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY29tcHRlTm9taW5hdGlmLnBvdXIgPSBwb3VyXG4gICAgICBmb3IgKGNvbnN0IHZvdGFudCBvZiBwb3VyKSB7XG4gICAgICAgIGNsZWFuVm90YW50KHZvdGFudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgY29udHJlID0gZGVjb21wdGVOb21pbmF0aWYuY29udHJlXG4gIGlmIChjb250cmUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnRyZSA9IGRlY29tcHRlTm9taW5hdGlmLmNvbnRyZXNcbiAgICBkZWxldGUgZGVjb21wdGVOb21pbmF0aWYuY29udHJlc1xuICB9IGVsc2Uge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNvbXB0ZU5vbWluYXRpZi5jb250cmVzLCB1bmRlZmluZWQpXG4gIH1cbiAgaWYgKGNvbnRyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29udHJlID0gY29udHJlLnZvdGFudFxuICAgIGlmICghQXJyYXkuaXNBcnJheShjb250cmUpKSB7XG4gICAgICBhc3NlcnQoY29udHJlKVxuICAgICAgY29udHJlID0gW2NvbnRyZV1cbiAgICB9XG4gICAgaWYgKGNvbnRyZS5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBkZWNvbXB0ZU5vbWluYXRpZi5jb250cmVcbiAgICB9IGVsc2Uge1xuICAgICAgZGVjb21wdGVOb21pbmF0aWYuY29udHJlID0gY29udHJlXG4gICAgICBmb3IgKGNvbnN0IHZvdGFudCBvZiBjb250cmUpIHtcbiAgICAgICAgY2xlYW5Wb3RhbnQodm90YW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBhYnN0ZW50aW9ucyA9IGRlY29tcHRlTm9taW5hdGlmLmFic3RlbnRpb25zXG4gIGlmIChhYnN0ZW50aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYWJzdGVudGlvbnMgPSBkZWNvbXB0ZU5vbWluYXRpZi5hYnN0ZW50aW9uXG4gICAgZGVsZXRlIGRlY29tcHRlTm9taW5hdGlmLmFic3RlbnRpb25cbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjb21wdGVOb21pbmF0aWYuYWJzdGVudGlvbiwgdW5kZWZpbmVkKVxuICB9XG4gIGlmIChhYnN0ZW50aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFic3RlbnRpb25zKSkge1xuICAgICAgYXNzZXJ0KGFic3RlbnRpb25zKVxuICAgICAgYWJzdGVudGlvbnMgPSBbYWJzdGVudGlvbnNdXG4gICAgfVxuICAgIGNvbnN0IGFic3RlbnRpb25zQXJyYXkgPSBhYnN0ZW50aW9uc1xuICAgIGFic3RlbnRpb25zID0gW11cbiAgICBmb3IgKGxldCBhYnNlbnRpb25zSXRlbSBvZiBhYnN0ZW50aW9uc0FycmF5KSB7XG4gICAgICBpZiAoYWJzZW50aW9uc0l0ZW0gPT09IG51bGwpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGFic2VudGlvbnNJdGVtID0gYWJzZW50aW9uc0l0ZW0udm90YW50XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhYnNlbnRpb25zSXRlbSkpIHtcbiAgICAgICAgYWJzdGVudGlvbnMucHVzaCguLi5hYnNlbnRpb25zSXRlbSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydChhYnNlbnRpb25zSXRlbSlcbiAgICAgICAgYWJzdGVudGlvbnMucHVzaChhYnNlbnRpb25zSXRlbSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFic3RlbnRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIGRlY29tcHRlTm9taW5hdGlmLmFic3RlbnRpb25zXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY29tcHRlTm9taW5hdGlmLmFic3RlbnRpb25zID0gYWJzdGVudGlvbnNcbiAgICAgIGZvciAoY29uc3Qgdm90YW50IG9mIGFic3RlbnRpb25zKSB7XG4gICAgICAgIGNsZWFuVm90YW50KHZvdGFudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgbm9uVm90YW50c1ZvbG9udGFpcmVzID0gZGVjb21wdGVOb21pbmF0aWYubm9uVm90YW50c1ZvbG9udGFpcmVzXG4gIGlmIChub25Wb3RhbnRzVm9sb250YWlyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShub25Wb3RhbnRzVm9sb250YWlyZXMpKSB7XG4gICAgICBub25Wb3RhbnRzVm9sb250YWlyZXMgPSBbbm9uVm90YW50c1ZvbG9udGFpcmVzXVxuICAgIH1cbiAgICBjb25zdCBub25Wb3RhbnRzVm9sb250YWlyZXNBcnJheSA9IG5vblZvdGFudHNWb2xvbnRhaXJlc1xuICAgIG5vblZvdGFudHNWb2xvbnRhaXJlcyA9IFtdXG4gICAgZm9yIChsZXQgYWJzZW50aW9uc0l0ZW0gb2Ygbm9uVm90YW50c1ZvbG9udGFpcmVzQXJyYXkpIHtcbiAgICAgIGlmIChhYnNlbnRpb25zSXRlbSA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgYWJzZW50aW9uc0l0ZW0gPSBhYnNlbnRpb25zSXRlbS52b3RhbnRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFic2VudGlvbnNJdGVtKSkge1xuICAgICAgICBub25Wb3RhbnRzVm9sb250YWlyZXMucHVzaCguLi5hYnNlbnRpb25zSXRlbSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydChhYnNlbnRpb25zSXRlbSlcbiAgICAgICAgbm9uVm90YW50c1ZvbG9udGFpcmVzLnB1c2goYWJzZW50aW9uc0l0ZW0pXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChub25Wb3RhbnRzVm9sb250YWlyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgZGVjb21wdGVOb21pbmF0aWYubm9uVm90YW50c1ZvbG9udGFpcmVzXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY29tcHRlTm9taW5hdGlmLm5vblZvdGFudHNWb2xvbnRhaXJlcyA9IG5vblZvdGFudHNWb2xvbnRhaXJlc1xuICAgICAgZm9yIChjb25zdCB2b3RhbnQgb2Ygbm9uVm90YW50c1ZvbG9udGFpcmVzKSB7XG4gICAgICAgIGNsZWFuVm90YW50KHZvdGFudClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuU2NydXRpbihzY3J1dGluOiBhbnkpOiB2b2lkIHtcbiAgY2xlYW5YbWxBcnRlZmFjdHMoc2NydXRpbilcblxuICBjb25zdCBkZW1hbmRldXIgPSBzY3J1dGluLmRlbWFuZGV1clxuICBhc3NlcnQoZGVtYW5kZXVyKVxuICB7XG4gICAgY2xlYW5YbWxBcnRlZmFjdHMoZGVtYW5kZXVyKVxuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRlbWFuZGV1ci5yZWZlcmVuY2VMZWdpc2xhdGl2ZSwgdW5kZWZpbmVkKVxuICB9XG5cbiAgY29uc3Qgb2JqZXQgPSBzY3J1dGluLm9iamV0XG4gIGFzc2VydChvYmpldClcbiAge1xuICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKG9iamV0KVxuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9iamV0LnJlZmVyZW5jZUxlZ2lzbGF0aXZlLCB1bmRlZmluZWQpXG4gIH1cblxuICBsZXQgdmVudGlsYXRpb25Wb3RlcyA9IHNjcnV0aW4udmVudGlsYXRpb25Wb3Rlc1xuICBhc3NlcnQodmVudGlsYXRpb25Wb3RlcylcbiAge1xuICAgIHZlbnRpbGF0aW9uVm90ZXMgPSB2ZW50aWxhdGlvblZvdGVzLm9yZ2FuZVxuICAgIGFzc2VydCh2ZW50aWxhdGlvblZvdGVzKVxuXG4gICAgbGV0IGdyb3VwZXMgPSB2ZW50aWxhdGlvblZvdGVzLmdyb3VwZXNcbiAgICBhc3NlcnQoZ3JvdXBlcylcbiAgICB7XG4gICAgICBncm91cGVzID0gZ3JvdXBlcy5ncm91cGVcbiAgICAgIGFzc2VydChBcnJheS5pc0FycmF5KGdyb3VwZXMpKVxuICAgICAgZm9yIChjb25zdCBncm91cGUgb2YgZ3JvdXBlcykge1xuICAgICAgICBjb25zdCB2b3RlID0gZ3JvdXBlLnZvdGVcbiAgICAgICAgYXNzZXJ0KHZvdGUpXG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBkZWNvbXB0ZVZvaXggPSB2b3RlLmRlY29tcHRlVm9peFxuICAgICAgICAgIGFzc2VydChkZWNvbXB0ZVZvaXgpXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGRlY29tcHRlVm9peC5hYnN0ZW50aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRlY29tcHRlVm9peC5hYnN0ZW50aW9ucywgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICBkZWNvbXB0ZVZvaXguYWJzdGVudGlvbnMgPSBkZWNvbXB0ZVZvaXguYWJzdGVudGlvblxuICAgICAgICAgICAgICBkZWxldGUgZGVjb21wdGVWb2l4LmFic3RlbnRpb25cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRlY29tcHRlVm9peC5ub25Wb3RhbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjb21wdGVWb2l4Lm5vblZvdGFudHMsIHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgZGVjb21wdGVWb2l4Lm5vblZvdGFudHMgPSBkZWNvbXB0ZVZvaXgubm9uVm90YW50XG4gICAgICAgICAgICAgIGRlbGV0ZSBkZWNvbXB0ZVZvaXgubm9uVm90YW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZGVjb21wdGVOb21pbmF0aWYgPSB2b3RlLmRlY29tcHRlTm9taW5hdGlmXG4gICAgICAgICAgYXNzZXJ0KGRlY29tcHRlTm9taW5hdGlmKVxuICAgICAgICAgIGNsZWFuRGVjb21wdGVOb21pbmF0aWYoZGVjb21wdGVOb21pbmF0aWYpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZlbnRpbGF0aW9uVm90ZXMuZ3JvdXBlcyA9IGdyb3VwZXNcbiAgICB9XG5cbiAgICBzY3J1dGluLnZlbnRpbGF0aW9uVm90ZXMgPSB2ZW50aWxhdGlvblZvdGVzXG4gIH1cblxuICBjb25zdCBtaXNlQXVQb2ludCA9IHNjcnV0aW4ubWlzZUF1UG9pbnRcbiAgaWYgKG1pc2VBdVBvaW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhbkRlY29tcHRlTm9taW5hdGlmKG1pc2VBdVBvaW50KVxuXG4gICAgbGV0IGR5c2ZvbmN0aW9ubmVtZW50ID0gbWlzZUF1UG9pbnQuZHlzZm9uY3Rpb25uZW1lbnRcbiAgICBpZiAoZHlzZm9uY3Rpb25uZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYW5EZWNvbXB0ZU5vbWluYXRpZihkeXNmb25jdGlvbm5lbWVudClcbiAgICAgIGlmIChcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhkeXNmb25jdGlvbm5lbWVudCkuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIG1pc2VBdVBvaW50LmR5c2ZvbmN0aW9ubmVtZW50XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgT2JqZWN0LnZhbHVlcyhtaXNlQXVQb2ludCkuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgZGVsZXRlIHNjcnV0aW4ubWlzZUF1UG9pbnRcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW5Wb3RhbnQodm90YW50OiBhbnkpIHtcbiAgY2xlYW5Cb29sZWFuQXR0cmlidXRlKHZvdGFudCwgXCJwYXJEZWxlZ2F0aW9uXCIpXG4gIGNsZWFuSW50ZWdlckF0dHJpYnV0ZSh2b3RhbnQsIFwibnVtUGxhY2VcIilcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFBQSxTQUd6QkMscUJBQXFCLEVBQ3JCQyxxQkFBcUIsRUFDckJDLGlCQUFpQjtBQUduQixTQUFTQyxzQkFBc0JBLENBQUNDLGlCQUFzQixFQUFFO0VBQ3RERixpQkFBaUIsQ0FBQ0UsaUJBQWlCLENBQUM7RUFFcEMsSUFBSUMsVUFBVSxHQUFHRCxpQkFBaUIsQ0FBQ0MsVUFBVTtFQUM3QyxJQUFJQSxVQUFVLEtBQUtDLFNBQVMsRUFBRTtJQUM1QkQsVUFBVSxHQUFHRCxpQkFBaUIsQ0FBQ0csU0FBUztJQUN4QyxPQUFPSCxpQkFBaUIsQ0FBQ0csU0FBUztFQUNwQyxDQUFDLE1BQU07SUFDTFIsTUFBTSxDQUFDUyxXQUFX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