@tricoteuses/assemblee 1.10.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/lib/amendements-79bwpkvR.js +154 -0
- package/lib/amendements-CV3s5a0M.js +667 -0
- package/lib/cleaners/index.d.ts +9 -9
- package/lib/cleaners.js +564 -0
- package/lib/datasets.d.ts +3 -3
- package/lib/dossiers_legislatifs.d.ts +2 -2
- package/lib/index.d.ts +17 -22
- package/lib/index.js +1542 -314
- package/lib/inserters.d.ts +5 -5
- package/lib/loaders-9mHdTl9L.js +4158 -0
- package/lib/loaders.d.ts +12 -12
- package/lib/loaders.js +29 -1689
- package/lib/organes.d.ts +1 -1
- package/lib/parse-Ccs6wcUg.js +2512 -0
- package/lib/parsers/index.d.ts +2 -3
- package/lib/parsers/plf.d.ts +1 -0
- package/lib/parsers/recherche_amendements.d.ts +2 -2
- package/lib/parsers/textes_lois.d.ts +1 -23
- package/lib/parsers.js +398 -0
- package/lib/raw_types/acteurs_et_organes.d.ts +4 -2
- package/lib/raw_types/debats.d.ts +2 -2
- package/lib/raw_types/dossiers_legislatifs.d.ts +1 -1
- package/lib/schemas/acteurs_et_organes.json +1166 -0
- package/lib/schemas/agendas.json +1745 -0
- package/lib/schemas/amendements.json +2085 -0
- package/lib/schemas/debats.json +842 -0
- package/lib/schemas/dossiers_legislatifs.json +3874 -0
- package/lib/schemas/legislatures.json +17 -0
- package/lib/schemas/questions.json +704 -0
- package/lib/schemas/scrutins.json +701 -0
- package/lib/scripts/retrieve_deputes_photos.d.ts +1 -1
- package/lib/types/acteurs_et_organes.d.ts +344 -2
- package/lib/types/agendas.d.ts +236 -10
- package/lib/types/amendements.d.ts +276 -1
- package/lib/types/debats.d.ts +52 -2
- package/lib/types/dossiers_legislatifs.d.ts +403 -9
- package/lib/types/questions.d.ts +99 -2
- package/lib/types/scrutins.d.ts +101 -0
- package/lib/urls.d.ts +2 -2
- package/package.json +33 -95
- package/lib/api.js +0 -52
- package/lib/api.mjs +0 -45
- package/lib/bugs/acteur-00010/plugin.test.js +0 -90
- package/lib/bugs/acteur-00010/plugin.test.mjs +0 -33
- package/lib/bugs/acteur-00010.d.ts +0 -7
- package/lib/bugs/acteur-00010.js +0 -116
- package/lib/bugs/acteur-00010.mjs +0 -26
- package/lib/bugs/agenda-00002/plugin.test.js +0 -124
- package/lib/bugs/agenda-00002/plugin.test.mjs +0 -50
- package/lib/bugs/agenda-00002.d.ts +0 -15
- package/lib/bugs/agenda-00002.js +0 -406
- package/lib/bugs/agenda-00002.mjs +0 -172
- package/lib/bugs/agenda-00008/plugin.test.js +0 -92
- package/lib/bugs/agenda-00008/plugin.test.mjs +0 -31
- package/lib/bugs/agenda-00008.d.ts +0 -7
- package/lib/bugs/agenda-00008.js +0 -123
- package/lib/bugs/agenda-00008.mjs +0 -26
- package/lib/bugs/agenda-00011/plugin.test.d.ts +0 -1
- package/lib/bugs/agenda-00011/plugin.test.js +0 -263
- package/lib/bugs/agenda-00011/plugin.test.mjs +0 -152
- package/lib/bugs/agenda-00011.d.ts +0 -16
- package/lib/bugs/agenda-00011.js +0 -333
- package/lib/bugs/agenda-00011.mjs +0 -125
- package/lib/bugs.d.ts +0 -21
- package/lib/bugs.js +0 -452
- package/lib/bugs.mjs +0 -70
- package/lib/cleaners/actes_legislatifs.js +0 -315
- package/lib/cleaners/actes_legislatifs.mjs +0 -253
- package/lib/cleaners/acteurs.js +0 -265
- package/lib/cleaners/acteurs.mjs +0 -180
- package/lib/cleaners/amendements.js +0 -294
- package/lib/cleaners/amendements.mjs +0 -227
- package/lib/cleaners/debats.js +0 -12
- package/lib/cleaners/debats.mjs +0 -5
- package/lib/cleaners/documents.js +0 -205
- package/lib/cleaners/documents.mjs +0 -133
- package/lib/cleaners/dossiers_legislatifs.js +0 -131
- package/lib/cleaners/dossiers_legislatifs.mjs +0 -70
- package/lib/cleaners/index.js +0 -70
- package/lib/cleaners/index.mjs +0 -10
- package/lib/cleaners/organes.js +0 -65
- package/lib/cleaners/organes.mjs +0 -48
- package/lib/cleaners/questions.js +0 -12
- package/lib/cleaners/questions.mjs +0 -5
- package/lib/cleaners/reunions.js +0 -312
- package/lib/cleaners/reunions.mjs +0 -255
- package/lib/cleaners/scrutins.js +0 -340
- package/lib/cleaners/scrutins.mjs +0 -221
- package/lib/cleaners/xml.js +0 -95
- package/lib/cleaners/xml.mjs +0 -58
- package/lib/datasets.js +0 -837
- package/lib/datasets.mjs +0 -755
- package/lib/dates.js +0 -124
- package/lib/dates.mjs +0 -100
- package/lib/dossiers_legislatifs.js +0 -346
- package/lib/dossiers_legislatifs.mjs +0 -208
- package/lib/file_systems.js +0 -162
- package/lib/file_systems.mjs +0 -62
- package/lib/git.js +0 -223
- package/lib/git.mjs +0 -151
- package/lib/index.mjs +0 -17
- package/lib/inserters.js +0 -521
- package/lib/inserters.mjs +0 -337
- package/lib/loaders.mjs +0 -886
- package/lib/logger.js +0 -35
- package/lib/logger.mjs +0 -26
- package/lib/organes.js +0 -22
- package/lib/organes.mjs +0 -15
- package/lib/parsers/documents.d.ts +0 -62
- package/lib/parsers/documents.js +0 -453
- package/lib/parsers/documents.mjs +0 -370
- package/lib/parsers/index.js +0 -40
- package/lib/parsers/index.mjs +0 -4
- package/lib/parsers/recherche_amendements.js +0 -403
- package/lib/parsers/recherche_amendements.mjs +0 -167
- package/lib/parsers/textes_lois.js +0 -307
- package/lib/parsers/textes_lois.mjs +0 -264
- package/lib/raw_types/acteurs_et_organes.js +0 -1213
- package/lib/raw_types/acteurs_et_organes.mjs +0 -1146
- package/lib/raw_types/agendas.js +0 -777
- package/lib/raw_types/agendas.mjs +0 -724
- package/lib/raw_types/amendements.js +0 -1052
- package/lib/raw_types/amendements.mjs +0 -993
- package/lib/raw_types/debats.js +0 -630
- package/lib/raw_types/debats.mjs +0 -573
- package/lib/raw_types/dossiers_legislatifs.js +0 -1529
- package/lib/raw_types/dossiers_legislatifs.mjs +0 -1471
- package/lib/raw_types/questions.js +0 -469
- package/lib/raw_types/questions.mjs +0 -416
- package/lib/raw_types/scrutins.js +0 -651
- package/lib/raw_types/scrutins.mjs +0 -598
- package/lib/schemas/acteur/Acteur.json +0 -56
- package/lib/schemas/acteur/AdresseElectronique.json +0 -52
- package/lib/schemas/acteur/AdressePostale.json +0 -75
- package/lib/schemas/acteur/Civ.json +0 -14
- package/lib/schemas/acteur/Collaborateur.json +0 -29
- package/lib/schemas/acteur/EtatCivil.json +0 -51
- package/lib/schemas/acteur/Ident.json +0 -40
- package/lib/schemas/acteur/Lieu.json +0 -66
- package/lib/schemas/acteur/Mandat.json +0 -192
- package/lib/schemas/acteur/Profession.json +0 -46
- package/lib/schemas/agenda/Agenda.json +0 -318
- package/lib/schemas/agenda/CycleDeVie.json +0 -45
- package/lib/schemas/agenda/PointOdj.json +0 -82
- package/lib/schemas/amendement/Amendement.json +0 -246
- package/lib/schemas/amendement/Diff.json +0 -25
- package/lib/schemas/amendement/DispositifAmdtCredit.json +0 -85
- package/lib/schemas/amendement/Identifiant.json +0 -62
- package/lib/schemas/amendement/PointeurFragmentTexte.json +0 -127
- package/lib/schemas/amendement/Representation.json +0 -67
- package/lib/schemas/amendement/Total.json +0 -26
- package/lib/schemas/converted_from_type/acteurs_et_organes.json +0 -666
- package/lib/schemas/converted_from_type/agendas.json +0 -1100
- package/lib/schemas/converted_from_type/amendements.json +0 -3191
- package/lib/schemas/converted_from_type/debats.json +0 -682
- package/lib/schemas/converted_from_type/deputes.json +0 -26
- package/lib/schemas/converted_from_type/dossiers_legislatifs.json +0 -2918
- package/lib/schemas/converted_from_type/legislatures.json +0 -16
- package/lib/schemas/converted_from_type/questions.json +0 -328
- package/lib/schemas/converted_from_type/scrutins.json +0 -393
- package/lib/schemas/debat/Contenu.json +0 -75
- package/lib/schemas/debat/Debat.json +0 -40
- package/lib/schemas/debat/Metadonnees.json +0 -75
- package/lib/schemas/debat/Orateur.json +0 -60
- package/lib/schemas/debat/Point.json +0 -169
- package/lib/schemas/debat/Sommaire.json +0 -71
- package/lib/schemas/debat/SommaireElement.json +0 -108
- package/lib/schemas/debat/Texte.json +0 -34
- package/lib/schemas/document/CodeLibelle.json +0 -25
- package/lib/schemas/document/Document.json +0 -385
- package/lib/schemas/document/Indexation.json +0 -38
- package/lib/schemas/dossier/ActeLegislatif.json +0 -211
- package/lib/schemas/dossier/ActeLegislatifBase.json +0 -62
- package/lib/schemas/dossier/Agenda.json +0 -23
- package/lib/schemas/dossier/ConseilConstitutionnel.json +0 -35
- package/lib/schemas/dossier/Decision.json +0 -25
- package/lib/schemas/dossier/Dossier.json +0 -124
- package/lib/schemas/dossier/EtudeImpact.json +0 -29
- package/lib/schemas/dossier/EtudePlf.json +0 -105
- package/lib/schemas/dossier/Europe.json +0 -42
- package/lib/schemas/dossier/FamCodeLibelle.json +0 -25
- package/lib/schemas/dossier/InfoJO.json +0 -23
- package/lib/schemas/dossier/Initiateur.json +0 -36
- package/lib/schemas/dossier/Motion.json +0 -27
- package/lib/schemas/dossier/Promulgation.json +0 -62
- package/lib/schemas/dossier/Rapporteur.json +0 -36
- package/lib/schemas/dossier/Texte.json +0 -47
- package/lib/schemas/organe/CodeTypeOrgane.json +0 -43
- package/lib/schemas/organe/Organe.json +0 -136
- package/lib/schemas/organe/ViMoDe.json +0 -28
- package/lib/schemas/question/Auteur.json +0 -58
- package/lib/schemas/question/Cloture.json +0 -28
- package/lib/schemas/question/InfoJO.json +0 -40
- package/lib/schemas/question/MinAttribElement.json +0 -30
- package/lib/schemas/question/Question.json +0 -172
- package/lib/schemas/question/Renouvellement.json +0 -17
- package/lib/schemas/question/Signalement.json +0 -21
- package/lib/schemas/question/Texte.json +0 -24
- package/lib/schemas/scrutin/DecompteVoix.json +0 -35
- package/lib/schemas/scrutin/Dysfonctionnement.json +0 -50
- package/lib/schemas/scrutin/MiseAuPoint.json +0 -53
- package/lib/schemas/scrutin/OrganeVotant.json +0 -88
- package/lib/schemas/scrutin/Scrutin.json +0 -187
- package/lib/schemas/scrutin/Votant.json +0 -37
- package/lib/scripts/bugs_helper.d.ts +0 -13
- package/lib/scripts/bugs_helper.js +0 -595
- package/lib/scripts/bugs_helper.mjs +0 -251
- package/lib/scripts/clean_reorganized_data.js +0 -610
- package/lib/scripts/clean_reorganized_data.mjs +0 -273
- package/lib/scripts/diff_amendements.js +0 -249
- package/lib/scripts/diff_amendements.mjs +0 -202
- package/lib/scripts/document_dossiers_legislatifs.js +0 -655
- package/lib/scripts/document_dossiers_legislatifs.mjs +0 -414
- package/lib/scripts/get_today_reunions.js +0 -37
- package/lib/scripts/get_today_reunions.mjs +0 -31
- package/lib/scripts/merge_scrutins.js +0 -97
- package/lib/scripts/merge_scrutins.mjs +0 -47
- package/lib/scripts/parse_textes_lois.d.ts +0 -1
- package/lib/scripts/parse_textes_lois.js +0 -171
- package/lib/scripts/parse_textes_lois.mjs +0 -140
- package/lib/scripts/process_open_dataset.js +0 -301
- package/lib/scripts/process_open_dataset.mjs +0 -134
- package/lib/scripts/raw_types_from_amendements.js +0 -135
- package/lib/scripts/raw_types_from_amendements.mjs +0 -134
- package/lib/scripts/reorganize_data.js +0 -805
- package/lib/scripts/reorganize_data.mjs +0 -517
- package/lib/scripts/retrieve_deputes_photos.js +0 -310
- package/lib/scripts/retrieve_deputes_photos.mjs +0 -158
- package/lib/scripts/retrieve_documents.js +0 -547
- package/lib/scripts/retrieve_documents.mjs +0 -242
- package/lib/scripts/retrieve_open_data.js +0 -107
- package/lib/scripts/retrieve_open_data.mjs +0 -26
- package/lib/scripts/retrieve_pending_amendments.js +0 -206
- package/lib/scripts/retrieve_pending_amendments.mjs +0 -57
- package/lib/scripts/retrieve_senateurs_photos.js +0 -234
- package/lib/scripts/retrieve_senateurs_photos.mjs +0 -116
- package/lib/scripts/retrieve_textes_lois.d.ts +0 -1
- package/lib/scripts/retrieve_textes_lois.js +0 -240
- package/lib/scripts/retrieve_textes_lois.mjs +0 -85
- package/lib/scripts/shared/cli_helpers.js +0 -89
- package/lib/scripts/shared/cli_helpers.mjs +0 -81
- package/lib/scripts/test_iter_load.js +0 -155
- package/lib/scripts/test_iter_load.mjs +0 -72
- package/lib/scripts/test_load.js +0 -26
- package/lib/scripts/test_load.mjs +0 -16
- package/lib/scripts/test_load_big_files.js +0 -26
- package/lib/scripts/test_load_big_files.mjs +0 -16
- package/lib/scripts/validate_json.js +0 -353
- package/lib/scripts/validate_json.mjs +0 -184
- package/lib/shared_types/codes_actes.js +0 -231
- package/lib/shared_types/codes_actes.mjs +0 -224
- package/lib/strings.js +0 -16
- package/lib/strings.mjs +0 -7
- package/lib/types/acteurs_et_organes.js +0 -963
- package/lib/types/acteurs_et_organes.mjs +0 -904
- package/lib/types/agendas.js +0 -628
- package/lib/types/agendas.mjs +0 -575
- package/lib/types/amendements.js +0 -899
- package/lib/types/amendements.mjs +0 -842
- package/lib/types/debats.js +0 -619
- package/lib/types/debats.mjs +0 -562
- package/lib/types/dossiers_legislatifs.js +0 -1188
- package/lib/types/dossiers_legislatifs.mjs +0 -1130
- package/lib/types/legislatures.js +0 -17
- package/lib/types/legislatures.mjs +0 -10
- package/lib/types/questions.js +0 -454
- package/lib/types/questions.mjs +0 -401
- package/lib/types/scrutins.js +0 -556
- package/lib/types/scrutins.mjs +0 -503
- package/lib/urls.js +0 -325
- package/lib/urls.mjs +0 -258
- /package/lib/{bugs/acteur-00010/plugin.test.d.ts → scripts/add_links_to_documents.d.ts} +0 -0
- /package/lib/{bugs/agenda-00002/plugin.test.d.ts → scripts/copy-schemas.d.ts} +0 -0
- /package/lib/{bugs/agenda-00008/plugin.test.d.ts → scripts/generate-json-schemas.d.ts} +0 -0
|
@@ -1,517 +0,0 @@
|
|
|
1
|
-
import assert from "assert";
|
|
2
|
-
import commandLineArgs from "command-line-args";
|
|
3
|
-
import fs from "fs-extra";
|
|
4
|
-
import path from "path";
|
|
5
|
-
import { datasets, DatasetStructure, EnabledDatasets, getEnabledDatasets, filterByLegislature } from "../datasets.mjs";
|
|
6
|
-
import { existingDateToJson, patchedDateToJson } from "../dates.mjs";
|
|
7
|
-
import * as git from "../git.mjs";
|
|
8
|
-
import { walkDir } from "../file_systems.mjs";
|
|
9
|
-
import { pathFromCompteRenduUid, pathFromDocumentUid, pathFromDossierParlementaireUid, pathFromQuestionUid, pathFromReunionUid, pathFromScrutinUid } from "../loaders.mjs";
|
|
10
|
-
import { Convert as ActeursEtOrganesRawConvert } from "../raw_types/acteurs_et_organes.mjs";
|
|
11
|
-
import { Convert as AgendasRawConvert } from "../raw_types/agendas.mjs";
|
|
12
|
-
import { Convert as AmendementsRawConvert } from "../raw_types/amendements.mjs";
|
|
13
|
-
import { Convert as DossiersLegislatifsRawConvert } from "../raw_types/dossiers_legislatifs.mjs";
|
|
14
|
-
import { Convert as ScrutinsRawConvert } from "../raw_types/scrutins.mjs";
|
|
15
|
-
import { Convert as QuestionsRawConvert } from "../raw_types/questions.mjs";
|
|
16
|
-
import { Convert as ComptesRendusRawConvert } from "../raw_types/debats.mjs";
|
|
17
|
-
import { cloneOption, commitOption, categoriesOption, legislatureOption, remoteOption, silentOption, verboseOption, dataDirDefaultOption, pullOption, fetchDocumentsOption, parseDocumentsOption, documentFormatOption } from "./shared/cli_helpers.mjs";
|
|
18
|
-
function parseArgs(argv) {
|
|
19
|
-
const optionsDefinitions = [cloneOption, commitOption, categoriesOption, legislatureOption, remoteOption, silentOption, verboseOption, dataDirDefaultOption, fetchDocumentsOption, parseDocumentsOption, documentFormatOption, pullOption, {
|
|
20
|
-
alias: "V",
|
|
21
|
-
help: "don't validate raw data",
|
|
22
|
-
name: "no-validate-raw",
|
|
23
|
-
type: Boolean
|
|
24
|
-
}];
|
|
25
|
-
const options = commandLineArgs(optionsDefinitions, {
|
|
26
|
-
argv: argv
|
|
27
|
-
});
|
|
28
|
-
return options;
|
|
29
|
-
}
|
|
30
|
-
function clearDirectory(dirPath) {
|
|
31
|
-
fs.ensureDirSync(dirPath);
|
|
32
|
-
for (const filename of fs.readdirSync(dirPath)) {
|
|
33
|
-
if (!filename.startsWith(".")) {
|
|
34
|
-
fs.removeSync(path.join(dirPath, filename));
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
function cloneGit(gitGroupUrl, datasetName, dataDir) {
|
|
39
|
-
git.clone(gitGroupUrl, datasetName, dataDir);
|
|
40
|
-
}
|
|
41
|
-
function reorganizeData(options) {
|
|
42
|
-
const dataDir = options.dataDir;
|
|
43
|
-
Date.prototype.toJSON = patchedDateToJson;
|
|
44
|
-
let exitCode = options.commit ? 10 : 0;
|
|
45
|
-
const gitGroupUrl = options.clone?.trim().replace(/\/+$/, "");
|
|
46
|
-
const validateRawData = !options["no-validate-raw"];
|
|
47
|
-
const enabledDatasets = getEnabledDatasets(options.categories);
|
|
48
|
-
let chosenDatasets = filterByLegislature(datasets, options.legislature);
|
|
49
|
-
function commitGit(datasetReorganizedDir, options) {
|
|
50
|
-
if (options.commit) {
|
|
51
|
-
const errorCode = git.commitAndPush(datasetReorganizedDir, "Nouvelle moisson", options.remote);
|
|
52
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
53
|
-
exitCode = errorCode;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
|
|
58
|
-
for (const dataset of chosenDatasets.acteursEtOrganes) {
|
|
59
|
-
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
60
|
-
if (!options.silent) {
|
|
61
|
-
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
62
|
-
}
|
|
63
|
-
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
64
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
65
|
-
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
66
|
-
if (options.pull) {
|
|
67
|
-
git.resetAndPull(datasetReorganizedDir);
|
|
68
|
-
}
|
|
69
|
-
clearDirectory(datasetReorganizedDir);
|
|
70
|
-
const acteursReorganizedDir = path.join(datasetReorganizedDir, "acteurs");
|
|
71
|
-
fs.mkdirSync(acteursReorganizedDir);
|
|
72
|
-
const organesReorganizedDir = path.join(datasetReorganizedDir, "organes");
|
|
73
|
-
fs.mkdirSync(organesReorganizedDir);
|
|
74
|
-
switch (dataset.structure) {
|
|
75
|
-
case DatasetStructure.SingleFile:
|
|
76
|
-
{
|
|
77
|
-
const originalJson = fs.readFileSync(originalJsonDirectoryOrFilePath, {
|
|
78
|
-
encoding: "utf8"
|
|
79
|
-
});
|
|
80
|
-
const originalData = validateRawData ? ActeursEtOrganesRawConvert.toActeursEtOrganes(originalJson) : JSON.parse(originalJson);
|
|
81
|
-
for (const acteur of originalData.export.acteurs.acteur) {
|
|
82
|
-
const reorganizedJsonFilePath = path.join(acteursReorganizedDir, acteur.uid["#text"] + ".json");
|
|
83
|
-
fs.writeFileSync(reorganizedJsonFilePath, JSON.stringify(acteur, null, 2), {
|
|
84
|
-
encoding: "utf8"
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
for (const organe of originalData.export.organes.organe) {
|
|
88
|
-
const reorganizedJsonFilePath = path.join(organesReorganizedDir, organe.uid + ".json");
|
|
89
|
-
fs.writeFileSync(reorganizedJsonFilePath, JSON.stringify(organe, null, 2), {
|
|
90
|
-
encoding: "utf8"
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
break;
|
|
95
|
-
case DatasetStructure.SegmentedFiles:
|
|
96
|
-
{
|
|
97
|
-
const deportsByActeurUid = {};
|
|
98
|
-
if (fs.existsSync(path.join(originalJsonDirectoryOrFilePath, "deport"))) {
|
|
99
|
-
for (const deportSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["deport"])) {
|
|
100
|
-
const deportFilename = deportSplitPath[deportSplitPath.length - 1];
|
|
101
|
-
if (!deportFilename.endsWith(".json")) {
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
const deportOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...deportSplitPath);
|
|
105
|
-
if (options.verbose) {
|
|
106
|
-
console.log(` Loading "deport" file: ${deportOriginalFilePath}…`);
|
|
107
|
-
}
|
|
108
|
-
const deportOriginalJson = fs.readFileSync(deportOriginalFilePath, {
|
|
109
|
-
encoding: "utf8"
|
|
110
|
-
});
|
|
111
|
-
const deportOriginal = validateRawData ? ActeursEtOrganesRawConvert.toDeport(deportOriginalJson) : JSON.parse(deportOriginalJson);
|
|
112
|
-
const deport = deportOriginal.deport;
|
|
113
|
-
let deports = deportsByActeurUid[deport.acteurRef];
|
|
114
|
-
if (deports === undefined) {
|
|
115
|
-
deports = deportsByActeurUid[deport.acteurRef] = [];
|
|
116
|
-
}
|
|
117
|
-
deports.push(deport);
|
|
118
|
-
}
|
|
119
|
-
for (const deports of Object.values(deportsByActeurUid)) {
|
|
120
|
-
deports.sort((a, b) => a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
const mandatsByActeurUid = {};
|
|
124
|
-
if (fs.existsSync(path.join(originalJsonDirectoryOrFilePath, "mandat"))) {
|
|
125
|
-
for (const mandatSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["mandat"])) {
|
|
126
|
-
const mandatFilename = mandatSplitPath[mandatSplitPath.length - 1];
|
|
127
|
-
if (!mandatFilename.endsWith(".json")) {
|
|
128
|
-
continue;
|
|
129
|
-
}
|
|
130
|
-
const mandatOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...mandatSplitPath);
|
|
131
|
-
if (options.verbose) {
|
|
132
|
-
console.log(` Loading "mandat" file: ${mandatOriginalFilePath}…`);
|
|
133
|
-
}
|
|
134
|
-
const mandatOriginalJson = fs.readFileSync(mandatOriginalFilePath, {
|
|
135
|
-
encoding: "utf8"
|
|
136
|
-
});
|
|
137
|
-
const mandatOriginal = validateRawData ? ActeursEtOrganesRawConvert.toMandatWrapper(mandatOriginalJson) : JSON.parse(mandatOriginalJson);
|
|
138
|
-
const mandat = mandatOriginal.mandat;
|
|
139
|
-
let mandats = mandatsByActeurUid[mandat.acteurRef];
|
|
140
|
-
if (mandats === undefined) {
|
|
141
|
-
mandats = mandatsByActeurUid[mandat.acteurRef] = [];
|
|
142
|
-
}
|
|
143
|
-
mandats.push(mandat);
|
|
144
|
-
}
|
|
145
|
-
for (const mandats of Object.values(mandatsByActeurUid)) {
|
|
146
|
-
mandats.sort((a, b) => a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
for (const acteurSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["acteur"])) {
|
|
150
|
-
const acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
|
|
151
|
-
if (!acteurFilename.endsWith(".json")) {
|
|
152
|
-
continue;
|
|
153
|
-
}
|
|
154
|
-
const acteurOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...acteurSplitPath);
|
|
155
|
-
if (options.verbose) {
|
|
156
|
-
console.log(` Reorganizing "acteur" file: ${acteurOriginalFilePath}…`);
|
|
157
|
-
}
|
|
158
|
-
const acteurOriginalJson = fs.readFileSync(acteurOriginalFilePath, {
|
|
159
|
-
encoding: "utf8"
|
|
160
|
-
});
|
|
161
|
-
const acteurOriginal = validateRawData ? ActeursEtOrganesRawConvert.toActeur(acteurOriginalJson) : JSON.parse(acteurOriginalJson);
|
|
162
|
-
const acteur = acteurOriginal.acteur;
|
|
163
|
-
const acteurUid = acteur.uid["#text"];
|
|
164
|
-
const deports = deportsByActeurUid[acteurUid];
|
|
165
|
-
if (deports !== undefined) {
|
|
166
|
-
assert.strictEqual(acteur.deports, undefined);
|
|
167
|
-
acteur.deports = {
|
|
168
|
-
deport: deports
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
const mandats = mandatsByActeurUid[acteurUid];
|
|
172
|
-
if (mandats !== undefined) {
|
|
173
|
-
assert.strictEqual(acteur.mandats, undefined);
|
|
174
|
-
acteur.mandats = {
|
|
175
|
-
mandat: mandats
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
const acteurReorganizedJsonFilePath = path.join(acteursReorganizedDir, acteurUid + ".json");
|
|
179
|
-
fs.writeFileSync(acteurReorganizedJsonFilePath, JSON.stringify(acteur, null, 2), {
|
|
180
|
-
encoding: "utf8"
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
for (const organeSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["organe"])) {
|
|
184
|
-
const organeFilename = organeSplitPath[organeSplitPath.length - 1];
|
|
185
|
-
if (!organeFilename.endsWith(".json")) {
|
|
186
|
-
continue;
|
|
187
|
-
}
|
|
188
|
-
const organeOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...organeSplitPath);
|
|
189
|
-
if (options.verbose) {
|
|
190
|
-
console.log(` Reorganizing "organe" file: ${organeOriginalFilePath}…`);
|
|
191
|
-
}
|
|
192
|
-
const organeOriginalJson = fs.readFileSync(organeOriginalFilePath, {
|
|
193
|
-
encoding: "utf8"
|
|
194
|
-
});
|
|
195
|
-
const organeOriginal = validateRawData ? ActeursEtOrganesRawConvert.toOrgane(organeOriginalJson) : JSON.parse(organeOriginalJson);
|
|
196
|
-
const organe = organeOriginal.organe;
|
|
197
|
-
const organeReorganizedJsonFilePath = path.join(organesReorganizedDir, organe.uid + ".json");
|
|
198
|
-
fs.writeFileSync(organeReorganizedJsonFilePath, JSON.stringify(organe, null, 2), {
|
|
199
|
-
encoding: "utf8"
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
commitGit(datasetReorganizedDir, options);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
if (enabledDatasets & EnabledDatasets.Agendas) {
|
|
209
|
-
for (const dataset of chosenDatasets.agendas) {
|
|
210
|
-
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
211
|
-
if (!options.silent) {
|
|
212
|
-
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
213
|
-
}
|
|
214
|
-
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
215
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
216
|
-
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
217
|
-
clearDirectory(datasetReorganizedDir);
|
|
218
|
-
switch (dataset.structure) {
|
|
219
|
-
case DatasetStructure.SingleFile:
|
|
220
|
-
{
|
|
221
|
-
const originalJson = fs.readFileSync(originalJsonDirectoryOrFilePath, {
|
|
222
|
-
encoding: "utf8"
|
|
223
|
-
});
|
|
224
|
-
const originalData = validateRawData ? AgendasRawConvert.toAgendas(originalJson) : JSON.parse(originalJson);
|
|
225
|
-
for (const reunion of originalData.reunions.reunion) {
|
|
226
|
-
writeReorganizedJson(datasetReorganizedDir, reunion, pathFromReunionUid);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
break;
|
|
230
|
-
case DatasetStructure.SegmentedFiles:
|
|
231
|
-
{
|
|
232
|
-
for (const reunionSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["reunion"])) {
|
|
233
|
-
const reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
|
|
234
|
-
if (!reunionFilename.endsWith(".json")) {
|
|
235
|
-
continue;
|
|
236
|
-
}
|
|
237
|
-
const reunionOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...reunionSplitPath);
|
|
238
|
-
if (options.verbose) {
|
|
239
|
-
console.log(` Reorganizing "reunion" file: ${reunionOriginalFilePath}…`);
|
|
240
|
-
}
|
|
241
|
-
const reunionOriginalJson = fs.readFileSync(reunionOriginalFilePath, {
|
|
242
|
-
encoding: "utf8"
|
|
243
|
-
});
|
|
244
|
-
const reunionOriginal = validateRawData ? AgendasRawConvert.toReunion(reunionOriginalJson) : JSON.parse(reunionOriginalJson);
|
|
245
|
-
const reunion = reunionOriginal.reunion;
|
|
246
|
-
writeReorganizedJson(datasetReorganizedDir, reunion, pathFromReunionUid);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
251
|
-
commitGit(datasetReorganizedDir, options);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
if (enabledDatasets & EnabledDatasets.Amendements) {
|
|
255
|
-
for (const dataset of chosenDatasets.amendements) {
|
|
256
|
-
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
257
|
-
if (!options.silent) {
|
|
258
|
-
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
259
|
-
}
|
|
260
|
-
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
261
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
262
|
-
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
263
|
-
clearDirectory(datasetReorganizedDir);
|
|
264
|
-
switch (dataset.structure) {
|
|
265
|
-
case DatasetStructure.SingleFile:
|
|
266
|
-
{
|
|
267
|
-
const originalJson = fs.readFileSync(originalJsonDirectoryOrFilePath, {
|
|
268
|
-
encoding: "utf8"
|
|
269
|
-
});
|
|
270
|
-
const originalData = validateRawData ? AmendementsRawConvert.toAmendements(originalJson) : JSON.parse(originalJson);
|
|
271
|
-
for (const texteLegislatif of originalData.textesEtAmendements.texteleg) {
|
|
272
|
-
for (const amendement of texteLegislatif.amendements) {
|
|
273
|
-
writeAmendementReorganizedJson(datasetReorganizedDir, amendement);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
break;
|
|
278
|
-
case DatasetStructure.SegmentedFiles:
|
|
279
|
-
{
|
|
280
|
-
for (const amendementSplitPath of walkDir(originalJsonDirectoryOrFilePath)) {
|
|
281
|
-
const amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
|
|
282
|
-
if (!amendementFilename.endsWith(".json")) {
|
|
283
|
-
continue;
|
|
284
|
-
}
|
|
285
|
-
const amendementOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...amendementSplitPath);
|
|
286
|
-
if (options.verbose) {
|
|
287
|
-
console.log(` Reorganizing "amendement" file: ${amendementOriginalFilePath}…`);
|
|
288
|
-
}
|
|
289
|
-
const amendementOriginalJson = fs.readFileSync(amendementOriginalFilePath, {
|
|
290
|
-
encoding: "utf8"
|
|
291
|
-
});
|
|
292
|
-
const amendementOriginal = validateRawData ? AmendementsRawConvert.toAmendementWrapper(amendementOriginalJson) : JSON.parse(amendementOriginalJson);
|
|
293
|
-
const amendement = amendementOriginal.amendement;
|
|
294
|
-
writeAmendementReorganizedJson(datasetReorganizedDir, amendement);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
break;
|
|
298
|
-
}
|
|
299
|
-
commitGit(datasetReorganizedDir, options);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
|
|
303
|
-
for (const dataset of chosenDatasets.dossiersLegislatifs) {
|
|
304
|
-
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
305
|
-
if (!options.silent) {
|
|
306
|
-
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
307
|
-
}
|
|
308
|
-
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
309
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
310
|
-
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
311
|
-
clearDirectory(datasetReorganizedDir);
|
|
312
|
-
const documentsDir = path.join(datasetReorganizedDir, "documents");
|
|
313
|
-
fs.mkdirSync(documentsDir);
|
|
314
|
-
const dossiersDir = path.join(datasetReorganizedDir, "dossiers");
|
|
315
|
-
fs.mkdirSync(dossiersDir);
|
|
316
|
-
switch (dataset.structure) {
|
|
317
|
-
case DatasetStructure.SingleFile:
|
|
318
|
-
{
|
|
319
|
-
const originalJson = fs.readFileSync(originalJsonDirectoryOrFilePath, {
|
|
320
|
-
encoding: "utf8"
|
|
321
|
-
});
|
|
322
|
-
const originalData = validateRawData ? DossiersLegislatifsRawConvert.toDossiersLegislatifs(originalJson) : JSON.parse(originalJson);
|
|
323
|
-
for (const document of originalData.export.textesLegislatifs.document) {
|
|
324
|
-
writeReorganizedJson(documentsDir, document, pathFromDocumentUid);
|
|
325
|
-
}
|
|
326
|
-
for (const {
|
|
327
|
-
dossierParlementaire
|
|
328
|
-
} of originalData.export.dossiersLegislatifs.dossier) {
|
|
329
|
-
writeReorganizedJson(dossiersDir, dossierParlementaire, pathFromDossierParlementaireUid);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
break;
|
|
333
|
-
case DatasetStructure.SegmentedFiles:
|
|
334
|
-
{
|
|
335
|
-
for (const documentSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["document"])) {
|
|
336
|
-
const documentFilename = documentSplitPath[documentSplitPath.length - 1];
|
|
337
|
-
if (!documentFilename.endsWith(".json")) {
|
|
338
|
-
continue;
|
|
339
|
-
}
|
|
340
|
-
const documentOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...documentSplitPath);
|
|
341
|
-
if (options.verbose) {
|
|
342
|
-
console.log(` Reorganizing "document" file: ${documentOriginalFilePath}…`);
|
|
343
|
-
}
|
|
344
|
-
const documentOriginalJson = fs.readFileSync(documentOriginalFilePath, {
|
|
345
|
-
encoding: "utf8"
|
|
346
|
-
});
|
|
347
|
-
const documentOriginal = validateRawData ? DossiersLegislatifsRawConvert.toDocument(documentOriginalJson) : JSON.parse(documentOriginalJson);
|
|
348
|
-
const document = documentOriginal.document;
|
|
349
|
-
writeReorganizedJson(documentsDir, document, pathFromDocumentUid);
|
|
350
|
-
}
|
|
351
|
-
for (const dossierParlementaireSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["dossierParlementaire"])) {
|
|
352
|
-
const dossierParlementaireFilename = dossierParlementaireSplitPath[dossierParlementaireSplitPath.length - 1];
|
|
353
|
-
if (!dossierParlementaireFilename.endsWith(".json")) {
|
|
354
|
-
continue;
|
|
355
|
-
}
|
|
356
|
-
const dossierParlementaireOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...dossierParlementaireSplitPath);
|
|
357
|
-
if (options.verbose) {
|
|
358
|
-
console.log(` Reorganizing "dossierParlementaire" file: ${dossierParlementaireOriginalFilePath}…`);
|
|
359
|
-
}
|
|
360
|
-
const dossierParlementaireOriginalJson = fs.readFileSync(dossierParlementaireOriginalFilePath, {
|
|
361
|
-
encoding: "utf8"
|
|
362
|
-
});
|
|
363
|
-
const dossierParlementaireOriginal = validateRawData ? DossiersLegislatifsRawConvert.toDossierParlementaire(dossierParlementaireOriginalJson) : JSON.parse(dossierParlementaireOriginalJson);
|
|
364
|
-
const dossierParlementaire = dossierParlementaireOriginal.dossierParlementaire;
|
|
365
|
-
writeReorganizedJson(dossiersDir, dossierParlementaire, pathFromDossierParlementaireUid);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
break;
|
|
369
|
-
}
|
|
370
|
-
commitGit(datasetReorganizedDir, options);
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
if (enabledDatasets & EnabledDatasets.Scrutins) {
|
|
374
|
-
for (let dataset of chosenDatasets.scrutins) {
|
|
375
|
-
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
376
|
-
if (!options.silent) {
|
|
377
|
-
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
378
|
-
}
|
|
379
|
-
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
380
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
381
|
-
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
382
|
-
clearDirectory(datasetReorganizedDir);
|
|
383
|
-
switch (dataset.structure) {
|
|
384
|
-
case DatasetStructure.SingleFile:
|
|
385
|
-
{
|
|
386
|
-
const originalJson = fs.readFileSync(originalJsonDirectoryOrFilePath, {
|
|
387
|
-
encoding: "utf8"
|
|
388
|
-
});
|
|
389
|
-
const originalData = validateRawData ? ScrutinsRawConvert.toScrutins(originalJson) : JSON.parse(originalJson);
|
|
390
|
-
for (const scrutin of originalData.scrutins.scrutin) {
|
|
391
|
-
writeReorganizedJson(datasetReorganizedDir, scrutin, pathFromScrutinUid);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
break;
|
|
395
|
-
case DatasetStructure.SegmentedFiles:
|
|
396
|
-
{
|
|
397
|
-
for (const scrutinSplitPath of walkDir(originalJsonDirectoryOrFilePath)) {
|
|
398
|
-
const scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
|
|
399
|
-
if (!scrutinFilename.endsWith(".json")) {
|
|
400
|
-
continue;
|
|
401
|
-
}
|
|
402
|
-
const scrutinOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...scrutinSplitPath);
|
|
403
|
-
if (options.verbose) {
|
|
404
|
-
console.log(` Reorganizing "scrutin" file: ${scrutinOriginalFilePath}…`);
|
|
405
|
-
}
|
|
406
|
-
const scrutinOriginalJson = fs.readFileSync(scrutinOriginalFilePath, {
|
|
407
|
-
encoding: "utf8"
|
|
408
|
-
});
|
|
409
|
-
const scrutinOriginal = validateRawData ? ScrutinsRawConvert.toScrutinWrapper(scrutinOriginalJson) : JSON.parse(scrutinOriginalJson);
|
|
410
|
-
const scrutin = scrutinOriginal.scrutin;
|
|
411
|
-
writeReorganizedJson(datasetReorganizedDir, scrutin, pathFromScrutinUid);
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
break;
|
|
415
|
-
}
|
|
416
|
-
commitGit(datasetReorganizedDir, options);
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
if (enabledDatasets & EnabledDatasets.Questions) {
|
|
420
|
-
for (const dataset of datasets.questions) {
|
|
421
|
-
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
422
|
-
if (!options.silent) {
|
|
423
|
-
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
424
|
-
}
|
|
425
|
-
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
426
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
427
|
-
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
428
|
-
clearDirectory(datasetReorganizedDir);
|
|
429
|
-
switch (dataset.structure) {
|
|
430
|
-
case DatasetStructure.SegmentedFiles:
|
|
431
|
-
{
|
|
432
|
-
for (const questionSplitPath of walkDir(originalJsonDirectoryOrFilePath)) {
|
|
433
|
-
const questionFilename = questionSplitPath[questionSplitPath.length - 1];
|
|
434
|
-
if (!questionFilename.endsWith(".json")) {
|
|
435
|
-
continue;
|
|
436
|
-
}
|
|
437
|
-
const questionOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...questionSplitPath);
|
|
438
|
-
if (options.verbose) {
|
|
439
|
-
console.log(` Reorganizing "question" file: ${questionOriginalFilePath}…`);
|
|
440
|
-
}
|
|
441
|
-
const questionOriginalJson = fs.readFileSync(questionOriginalFilePath, {
|
|
442
|
-
encoding: "utf8"
|
|
443
|
-
});
|
|
444
|
-
const questionOriginal = validateRawData ? QuestionsRawConvert.toQuestionWrapper(questionOriginalJson) : JSON.parse(questionOriginalJson);
|
|
445
|
-
const question = questionOriginal.question;
|
|
446
|
-
writeReorganizedJson(datasetReorganizedDir, question, pathFromQuestionUid);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
break;
|
|
450
|
-
}
|
|
451
|
-
commitGit(datasetReorganizedDir, options);
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
if (enabledDatasets & EnabledDatasets.ComptesRendusSeances) {
|
|
455
|
-
for (const dataset of datasets.comptesRendusSeances) {
|
|
456
|
-
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
457
|
-
if (!options.silent) {
|
|
458
|
-
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
459
|
-
}
|
|
460
|
-
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".xml");
|
|
461
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
462
|
-
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
463
|
-
clearDirectory(datasetReorganizedDir);
|
|
464
|
-
switch (dataset.structure) {
|
|
465
|
-
case DatasetStructure.SegmentedFiles:
|
|
466
|
-
{
|
|
467
|
-
for (const compteRenduSeanceSplitPath of walkDir(originalJsonDirectoryOrFilePath)) {
|
|
468
|
-
const compteRenduSeanceFilename = compteRenduSeanceSplitPath[compteRenduSeanceSplitPath.length - 1];
|
|
469
|
-
if (!compteRenduSeanceFilename.endsWith(".json")) {
|
|
470
|
-
continue;
|
|
471
|
-
}
|
|
472
|
-
const compteRenduSeanceOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...compteRenduSeanceSplitPath);
|
|
473
|
-
if (options.verbose) {
|
|
474
|
-
console.log(` Reorganizing "compteRenduSeance" file: ${compteRenduSeanceOriginalFilePath}…`);
|
|
475
|
-
}
|
|
476
|
-
const compteRenduSeanceOriginalJson = fs.readFileSync(compteRenduSeanceOriginalFilePath, {
|
|
477
|
-
encoding: "utf8"
|
|
478
|
-
});
|
|
479
|
-
const compteRenduSeanceOriginal = validateRawData ? ComptesRendusRawConvert.toCompteRenduWrapper(compteRenduSeanceOriginalJson) : JSON.parse(compteRenduSeanceOriginalJson);
|
|
480
|
-
const compteRenduSeance = compteRenduSeanceOriginal.compteRendu;
|
|
481
|
-
writeReorganizedJson(datasetReorganizedDir, compteRenduSeance, pathFromCompteRenduUid);
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
break;
|
|
485
|
-
}
|
|
486
|
-
commitGit(datasetReorganizedDir, options);
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
// Restore standard conversion of dates to JSON.
|
|
491
|
-
Date.prototype.toJSON = existingDateToJson;
|
|
492
|
-
return exitCode;
|
|
493
|
-
}
|
|
494
|
-
function writeAmendementReorganizedJson(datasetReorganizedDir, amendement) {
|
|
495
|
-
const uidTexteLegislatif = amendement.texteLegislatifRef;
|
|
496
|
-
assert.notStrictEqual(uidTexteLegislatif, undefined);
|
|
497
|
-
const texteLegislatifDir = path.join(datasetReorganizedDir, uidTexteLegislatif);
|
|
498
|
-
fs.ensureDirSync(texteLegislatifDir);
|
|
499
|
-
const reorganizedJsonFilePath = path.join(texteLegislatifDir, amendement.uid + ".json");
|
|
500
|
-
fs.writeFileSync(reorganizedJsonFilePath, JSON.stringify(amendement, null, 2), {
|
|
501
|
-
encoding: "utf8"
|
|
502
|
-
});
|
|
503
|
-
}
|
|
504
|
-
function writeReorganizedJson(dir, obj, pathFromUid) {
|
|
505
|
-
const basename = pathFromUid(dir, obj.uid);
|
|
506
|
-
fs.writeFileSync(`${basename}.json`, JSON.stringify(obj, null, 2), {
|
|
507
|
-
encoding: "utf8"
|
|
508
|
-
});
|
|
509
|
-
}
|
|
510
|
-
function main(argv) {
|
|
511
|
-
const options = parseArgs(argv);
|
|
512
|
-
return reorganizeData(options);
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
/* istanbul ignore if */
|
|
516
|
-
if (process.argv[1].endsWith("reorganize_data.ts")) process.exit(main(process.argv));
|
|
517
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjb21tYW5kTGluZUFyZ3MiLCJmcyIsInBhdGgiLCJkYXRhc2V0cyIsIkRhdGFzZXRTdHJ1Y3R1cmUiLCJFbmFibGVkRGF0YXNldHMiLCJnZXRFbmFibGVkRGF0YXNldHMiLCJmaWx0ZXJCeUxlZ2lzbGF0dXJlIiwiZXhpc3RpbmdEYXRlVG9Kc29uIiwicGF0Y2hlZERhdGVUb0pzb24iLCJnaXQiLCJ3YWxrRGlyIiwicGF0aEZyb21Db21wdGVSZW5kdVVpZCIsInBhdGhGcm9tRG9jdW1lbnRVaWQiLCJwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkIiwicGF0aEZyb21RdWVzdGlvblVpZCIsInBhdGhGcm9tUmV1bmlvblVpZCIsInBhdGhGcm9tU2NydXRpblVpZCIsIkNvbnZlcnQiLCJBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydCIsIkFnZW5kYXNSYXdDb252ZXJ0IiwiQW1lbmRlbWVudHNSYXdDb252ZXJ0IiwiRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQiLCJTY3J1dGluc1Jhd0NvbnZlcnQiLCJRdWVzdGlvbnNSYXdDb252ZXJ0IiwiQ29tcHRlc1JlbmR1c1Jhd0NvbnZlcnQiLCJjbG9uZU9wdGlvbiIsImNvbW1pdE9wdGlvbiIsImNhdGVnb3JpZXNPcHRpb24iLCJsZWdpc2xhdHVyZU9wdGlvbiIsInJlbW90ZU9wdGlvbiIsInNpbGVudE9wdGlvbiIsInZlcmJvc2VPcHRpb24iLCJkYXRhRGlyRGVmYXVsdE9wdGlvbiIsInB1bGxPcHRpb24iLCJmZXRjaERvY3VtZW50c09wdGlvbiIsInBhcnNlRG9jdW1lbnRzT3B0aW9uIiwiZG9jdW1lbnRGb3JtYXRPcHRpb24iLCJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJCb29sZWFuIiwib3B0aW9ucyIsImNsZWFyRGlyZWN0b3J5IiwiZGlyUGF0aCIsImVuc3VyZURpclN5bmMiLCJmaWxlbmFtZSIsInJlYWRkaXJTeW5jIiwic3RhcnRzV2l0aCIsInJlbW92ZVN5bmMiLCJqb2luIiwiY2xvbmVHaXQiLCJnaXRHcm91cFVybCIsImRhdGFzZXROYW1lIiwiZGF0YURpciIsImNsb25lIiwicmVvcmdhbml6ZURhdGEiLCJEYXRlIiwicHJvdG90eXBlIiwidG9KU09OIiwiZXhpdENvZGUiLCJjb21taXQiLCJ0cmltIiwicmVwbGFjZSIsInZhbGlkYXRlUmF3RGF0YSIsImVuYWJsZWREYXRhc2V0cyIsImNhdGVnb3JpZXMiLCJjaG9zZW5EYXRhc2V0cyIsImxlZ2lzbGF0dXJlIiwiY29tbWl0R2l0IiwiZGF0YXNldFJlb3JnYW5pemVkRGlyIiwiZXJyb3JDb2RlIiwiY29tbWl0QW5kUHVzaCIsInJlbW90ZSIsIkFjdGV1cnNFdE9yZ2FuZXMiLCJkYXRhc2V0IiwiYWN0ZXVyc0V0T3JnYW5lcyIsIm9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgiLCJzaWxlbnQiLCJjb25zb2xlIiwibG9nIiwiYmFzZW5hbWUiLCJwdWxsIiwicmVzZXRBbmRQdWxsIiwiYWN0ZXVyc1Jlb3JnYW5pemVkRGlyIiwibWtkaXJTeW5jIiwib3JnYW5lc1Jlb3JnYW5pemVkRGlyIiwic3RydWN0dXJlIiwiU2luZ2xlRmlsZSIsIm9yaWdpbmFsSnNvbiIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwib3JpZ2luYWxEYXRhIiwidG9BY3RldXJzRXRPcmdhbmVzIiwiSlNPTiIsInBhcnNlIiwiYWN0ZXVyIiwiZXhwb3J0IiwiYWN0ZXVycyIsInJlb3JnYW5pemVkSnNvbkZpbGVQYXRoIiwidWlkIiwid3JpdGVGaWxlU3luYyIsInN0cmluZ2lmeSIsIm9yZ2FuZSIsIm9yZ2FuZXMiLCJTZWdtZW50ZWRGaWxlcyIsImRlcG9ydHNCeUFjdGV1clVpZCIsImV4aXN0c1N5bmMiLCJkZXBvcnRTcGxpdFBhdGgiLCJkZXBvcnRGaWxlbmFtZSIsImxlbmd0aCIsImVuZHNXaXRoIiwiZGVwb3J0T3JpZ2luYWxGaWxlUGF0aCIsInZlcmJvc2UiLCJkZXBvcnRPcmlnaW5hbEpzb24iLCJkZXBvcnRPcmlnaW5hbCIsInRvRGVwb3J0IiwiZGVwb3J0IiwiZGVwb3J0cyIsImFjdGV1clJlZiIsInVuZGVmaW5lZCIsInB1c2giLCJPYmplY3QiLCJ2YWx1ZXMiLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwibWFuZGF0c0J5QWN0ZXVyVWlkIiwibWFuZGF0U3BsaXRQYXRoIiwibWFuZGF0RmlsZW5hbWUiLCJtYW5kYXRPcmlnaW5hbEZpbGVQYXRoIiwibWFuZGF0T3JpZ2luYWxKc29uIiwibWFuZGF0T3JpZ2luYWwiLCJ0b01hbmRhdFdyYXBwZXIiLCJtYW5kYXQiLCJtYW5kYXRzIiwiYWN0ZXVyU3BsaXRQYXRoIiwiYWN0ZXVyRmlsZW5hbWUiLCJhY3RldXJPcmlnaW5hbEZpbGVQYXRoIiwiYWN0ZXVyT3JpZ2luYWxKc29uIiwiYWN0ZXVyT3JpZ2luYWwiLCJ0b0FjdGV1ciIsImFjdGV1clVpZCIsInN0cmljdEVxdWFsIiwiYWN0ZXVyUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgiLCJvcmdhbmVTcGxpdFBhdGgiLCJvcmdhbmVGaWxlbmFtZSIsIm9yZ2FuZU9yaWdpbmFsRmlsZVBhdGgiLCJvcmdhbmVPcmlnaW5hbEpzb24iLCJvcmdhbmVPcmlnaW5hbCIsInRvT3JnYW5lIiwib3JnYW5lUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgiLCJBZ2VuZGFzIiwiYWdlbmRhcyIsInRvQWdlbmRhcyIsInJldW5pb24iLCJyZXVuaW9ucyIsIndyaXRlUmVvcmdhbml6ZWRKc29uIiwicmV1bmlvblNwbGl0UGF0aCIsInJldW5pb25GaWxlbmFtZSIsInJldW5pb25PcmlnaW5hbEZpbGVQYXRoIiwicmV1bmlvbk9yaWdpbmFsSnNvbiIsInJldW5pb25PcmlnaW5hbCIsInRvUmV1bmlvbiIsIkFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudHMiLCJ0b0FtZW5kZW1lbnRzIiwidGV4dGVMZWdpc2xhdGlmIiwidGV4dGVzRXRBbWVuZGVtZW50cyIsInRleHRlbGVnIiwiYW1lbmRlbWVudCIsIndyaXRlQW1lbmRlbWVudFJlb3JnYW5pemVkSnNvbiIsImFtZW5kZW1lbnRTcGxpdFBhdGgiLCJhbWVuZGVtZW50RmlsZW5hbWUiLCJhbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aCIsImFtZW5kZW1lbnRPcmlnaW5hbEpzb24iLCJhbWVuZGVtZW50T3JpZ2luYWwiLCJ0b0FtZW5kZW1lbnRXcmFwcGVyIiwiRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb2N1bWVudHNEaXIiLCJkb3NzaWVyc0RpciIsInRvRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvY3VtZW50IiwidGV4dGVzTGVnaXNsYXRpZnMiLCJkb3NzaWVyUGFybGVtZW50YWlyZSIsImRvc3NpZXIiLCJkb2N1bWVudFNwbGl0UGF0aCIsImRvY3VtZW50RmlsZW5hbWUiLCJkb2N1bWVudE9yaWdpbmFsRmlsZVBhdGgiLCJkb2N1bWVudE9yaWdpbmFsSnNvbiIsImRvY3VtZW50T3JpZ2luYWwiLCJ0b0RvY3VtZW50IiwiZG9zc2llclBhcmxlbWVudGFpcmVTcGxpdFBhdGgiLCJkb3NzaWVyUGFybGVtZW50YWlyZUZpbGVuYW1lIiwiZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRoIiwiZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEpzb24iLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsIiwidG9Eb3NzaWVyUGFybGVtZW50YWlyZSIsIlNjcnV0aW5zIiwic2NydXRpbnMiLCJ0b1NjcnV0aW5zIiwic2NydXRpbiIsInNjcnV0aW5TcGxpdFBhdGgiLCJzY3J1dGluRmlsZW5hbWUiLCJzY3J1dGluT3JpZ2luYWxGaWxlUGF0aCIsInNjcnV0aW5PcmlnaW5hbEpzb24iLCJzY3J1dGluT3JpZ2luYWwiLCJ0b1NjcnV0aW5XcmFwcGVyIiwiUXVlc3Rpb25zIiwicXVlc3Rpb25zIiwicXVlc3Rpb25TcGxpdFBhdGgiLCJxdWVzdGlvbkZpbGVuYW1lIiwicXVlc3Rpb25PcmlnaW5hbEZpbGVQYXRoIiwicXVlc3Rpb25PcmlnaW5hbEpzb24iLCJxdWVzdGlvbk9yaWdpbmFsIiwidG9RdWVzdGlvbldyYXBwZXIiLCJxdWVzdGlvbiIsIkNvbXB0ZXNSZW5kdXNTZWFuY2VzIiwiY29tcHRlc1JlbmR1c1NlYW5jZXMiLCJjb21wdGVSZW5kdVNlYW5jZVNwbGl0UGF0aCIsImNvbXB0ZVJlbmR1U2VhbmNlRmlsZW5hbWUiLCJjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsRmlsZVBhdGgiLCJjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsSnNvbiIsImNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWwiLCJ0b0NvbXB0ZVJlbmR1V3JhcHBlciIsImNvbXB0ZVJlbmR1U2VhbmNlIiwiY29tcHRlUmVuZHUiLCJ1aWRUZXh0ZUxlZ2lzbGF0aWYiLCJ0ZXh0ZUxlZ2lzbGF0aWZSZWYiLCJub3RTdHJpY3RFcXVhbCIsInRleHRlTGVnaXNsYXRpZkRpciIsImRpciIsIm9iaiIsInBhdGhGcm9tVWlkIiwibWFpbiIsInByb2Nlc3MiLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvcmVvcmdhbml6ZV9kYXRhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7XG4gIGRhdGFzZXRzLFxuICBEYXRhc2V0U3RydWN0dXJlLFxuICBFbmFibGVkRGF0YXNldHMsXG4gIGdldEVuYWJsZWREYXRhc2V0cyxcbiAgZmlsdGVyQnlMZWdpc2xhdHVyZSxcbn0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IGV4aXN0aW5nRGF0ZVRvSnNvbiwgcGF0Y2hlZERhdGVUb0pzb24gfSBmcm9tIFwiLi4vZGF0ZXNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0IHtcbiAgcGF0aEZyb21Db21wdGVSZW5kdVVpZCxcbiAgcGF0aEZyb21Eb2N1bWVudFVpZCxcbiAgcGF0aEZyb21Eb3NzaWVyUGFybGVtZW50YWlyZVVpZCxcbiAgcGF0aEZyb21RdWVzdGlvblVpZCxcbiAgcGF0aEZyb21SZXVuaW9uVWlkLFxuICBwYXRoRnJvbVNjcnV0aW5VaWQsXG59IGZyb20gXCIuLi9sb2FkZXJzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFnZW5kYXNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQW1lbmRlbWVudHNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9kb3NzaWVyc19sZWdpc2xhdGlmc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIFNjcnV0aW5zUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvc2NydXRpbnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBRdWVzdGlvbnNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9xdWVzdGlvbnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBDb21wdGVzUmVuZHVzUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvZGViYXRzXCJcbmltcG9ydCB7XG4gIGNsb25lT3B0aW9uLFxuICBjb21taXRPcHRpb24sXG4gIGNhdGVnb3JpZXNPcHRpb24sXG4gIGxlZ2lzbGF0dXJlT3B0aW9uLFxuICByZW1vdGVPcHRpb24sXG4gIHNpbGVudE9wdGlvbixcbiAgdmVyYm9zZU9wdGlvbixcbiAgZGF0YURpckRlZmF1bHRPcHRpb24sXG4gIHB1bGxPcHRpb24sXG4gIGZldGNoRG9jdW1lbnRzT3B0aW9uLFxuICBwYXJzZURvY3VtZW50c09wdGlvbixcbiAgZG9jdW1lbnRGb3JtYXRPcHRpb24sXG59IGZyb20gXCIuL3NoYXJlZC9jbGlfaGVscGVyc1wiXG5cbmZ1bmN0aW9uIHBhcnNlQXJncyhhcmd2OiBzdHJpbmdbXSk6IGFueSB7XG4gIGNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAgICBjbG9uZU9wdGlvbixcbiAgICBjb21taXRPcHRpb24sXG4gICAgY2F0ZWdvcmllc09wdGlvbixcbiAgICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgICByZW1vdGVPcHRpb24sXG4gICAgc2lsZW50T3B0aW9uLFxuICAgIHZlcmJvc2VPcHRpb24sXG4gICAgZGF0YURpckRlZmF1bHRPcHRpb24sXG4gICAgZmV0Y2hEb2N1bWVudHNPcHRpb24sXG4gICAgcGFyc2VEb2N1bWVudHNPcHRpb24sXG4gICAgZG9jdW1lbnRGb3JtYXRPcHRpb24sXG4gICAgcHVsbE9wdGlvbixcbiAgICB7XG4gICAgICBhbGlhczogXCJWXCIsXG4gICAgICBoZWxwOiBcImRvbid0IHZhbGlkYXRlIHJhdyBkYXRhXCIsXG4gICAgICBuYW1lOiBcIm5vLXZhbGlkYXRlLXJhd1wiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICBdXG4gIGNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zLCB7XG4gICAgYXJndjogYXJndixcbiAgfSlcbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuZnVuY3Rpb24gY2xlYXJEaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGZzLmVuc3VyZURpclN5bmMoZGlyUGF0aClcbiAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKSkge1xuICAgIGlmICghZmlsZW5hbWUuc3RhcnRzV2l0aChcIi5cIikpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRpclBhdGgsIGZpbGVuYW1lKSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvbmVHaXQoXG4gIGdpdEdyb3VwVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGRhdGFzZXROYW1lOiBzdHJpbmcsXG4gIGRhdGFEaXI6IHN0cmluZyxcbik6IHZvaWQge1xuICBnaXQuY2xvbmUoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxufVxuXG5mdW5jdGlvbiByZW9yZ2FuaXplRGF0YShvcHRpb25zOiBhbnkpOiBudW1iZXIge1xuICBjb25zdCBkYXRhRGlyID0gb3B0aW9ucy5kYXRhRGlyXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IHBhdGNoZWREYXRlVG9Kc29uXG4gIGxldCBleGl0Q29kZSA9IG9wdGlvbnMuY29tbWl0ID8gMTAgOiAwXG4gIGNvbnN0IGdpdEdyb3VwVXJsID0gb3B0aW9ucy5jbG9uZT8udHJpbSgpLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgY29uc3QgdmFsaWRhdGVSYXdEYXRhID0gIW9wdGlvbnNbXCJuby12YWxpZGF0ZS1yYXdcIl1cbiAgY29uc3QgZW5hYmxlZERhdGFzZXRzID0gZ2V0RW5hYmxlZERhdGFzZXRzKG9wdGlvbnMuY2F0ZWdvcmllcylcbiAgbGV0IGNob3NlbkRhdGFzZXRzID0gZmlsdGVyQnlMZWdpc2xhdHVyZShkYXRhc2V0cywgb3B0aW9ucy5sZWdpc2xhdHVyZSlcblxuICBmdW5jdGlvbiBjb21taXRHaXQoZGF0YXNldFJlb3JnYW5pemVkRGlyOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2l0LmNvbW1pdEFuZFB1c2goXG4gICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgXCJOb3V2ZWxsZSBtb2lzc29uXCIsXG4gICAgICAgIG9wdGlvbnMucmVtb3RlLFxuICAgICAgKVxuICAgICAgaWYgKFxuICAgICAgICAoZXhpdENvZGUgPT09IDEwICYmIGVycm9yQ29kZSAhPT0gMTApIHx8XG4gICAgICAgIChleGl0Q29kZSA9PT0gMCAmJiBlcnJvckNvZGUgIT09IDAgJiYgZXJyb3JDb2RlICE9PSAxMClcbiAgICAgICkge1xuICAgICAgICBleGl0Q29kZSA9IGVycm9yQ29kZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWN0ZXVyc0V0T3JnYW5lcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5hY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBpZiAob3B0aW9ucy5wdWxsKSB7XG4gICAgICAgIGdpdC5yZXNldEFuZFB1bGwoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgfVxuICAgICAgY2xlYXJEaXJlY3RvcnkoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuXG4gICAgICBjb25zdCBhY3RldXJzUmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBcImFjdGV1cnNcIilcbiAgICAgIGZzLm1rZGlyU3luYyhhY3RldXJzUmVvcmdhbml6ZWREaXIpXG4gICAgICBjb25zdCBvcmdhbmVzUmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBcIm9yZ2FuZXNcIilcbiAgICAgIGZzLm1rZGlyU3luYyhvcmdhbmVzUmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvQWN0ZXVyc0V0T3JnYW5lcyhvcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0ZXVyIG9mIG9yaWdpbmFsRGF0YS5leHBvcnQuYWN0ZXVycy5hY3RldXIpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBhY3RldXJzUmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgYWN0ZXVyLnVpZFtcIiN0ZXh0XCJdICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYWN0ZXVyLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9yZ2FuZSBvZiBvcmlnaW5hbERhdGEuZXhwb3J0Lm9yZ2FuZXMub3JnYW5lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JnYW5lc1Jlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIG9yZ2FuZS51aWQgKyBcIi5qc29uXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgICAgICByZW9yZ2FuaXplZEpzb25GaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShvcmdhbmUsIG51bGwsIDIpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBkZXBvcnRzQnlBY3RldXJVaWQ6IHtcbiAgICAgICAgICAgICAgW2FjdGV1clVpZDogc3RyaW5nXTogeyB1aWQ6IHN0cmluZyB9W11cbiAgICAgICAgICAgIH0gPSB7fVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKFxuICAgICAgICAgICAgICAgIHBhdGguam9pbihvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLCBcImRlcG9ydFwiKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZGVwb3J0U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBbXCJkZXBvcnRcIl0sXG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnRGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgICBkZXBvcnRTcGxpdFBhdGhbZGVwb3J0U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgICAgaWYgKCFkZXBvcnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIC4uLmRlcG9ydFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGAgIExvYWRpbmcgXCJkZXBvcnRcIiBmaWxlOiAke2RlcG9ydE9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICBkZXBvcnRPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnRPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvRGVwb3J0KGRlcG9ydE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShkZXBvcnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0ID0gZGVwb3J0T3JpZ2luYWwuZGVwb3J0XG4gICAgICAgICAgICAgICAgbGV0IGRlcG9ydHMgPSBkZXBvcnRzQnlBY3RldXJVaWRbZGVwb3J0LmFjdGV1clJlZl1cbiAgICAgICAgICAgICAgICBpZiAoZGVwb3J0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBkZXBvcnRzID0gZGVwb3J0c0J5QWN0ZXVyVWlkW2RlcG9ydC5hY3RldXJSZWZdID0gW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVwb3J0cy5wdXNoKGRlcG9ydClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZGVwb3J0cyBvZiBPYmplY3QudmFsdWVzKGRlcG9ydHNCeUFjdGV1clVpZCkpIHtcbiAgICAgICAgICAgICAgICBkZXBvcnRzLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICAgICAgICBhLnVpZC5sZW5ndGggPT09IGIudWlkLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IGEudWlkLmxvY2FsZUNvbXBhcmUoYi51aWQpXG4gICAgICAgICAgICAgICAgICAgIDogYS51aWQubGVuZ3RoIC0gYi51aWQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtYW5kYXRzQnlBY3RldXJVaWQ6IHtcbiAgICAgICAgICAgICAgW2FjdGV1clVpZDogc3RyaW5nXTogeyB1aWQ6IHN0cmluZyB9W11cbiAgICAgICAgICAgIH0gPSB7fVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKFxuICAgICAgICAgICAgICAgIHBhdGguam9pbihvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLCBcIm1hbmRhdFwiKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbWFuZGF0U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBbXCJtYW5kYXRcIl0sXG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXRGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgICBtYW5kYXRTcGxpdFBhdGhbbWFuZGF0U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgICAgaWYgKCFtYW5kYXRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIC4uLm1hbmRhdFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGAgIExvYWRpbmcgXCJtYW5kYXRcIiBmaWxlOiAke21hbmRhdE9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICBtYW5kYXRPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXRPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvTWFuZGF0V3JhcHBlcihcbiAgICAgICAgICAgICAgICAgICAgICBtYW5kYXRPcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShtYW5kYXRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0ID0gbWFuZGF0T3JpZ2luYWwubWFuZGF0XG4gICAgICAgICAgICAgICAgbGV0IG1hbmRhdHMgPSBtYW5kYXRzQnlBY3RldXJVaWRbbWFuZGF0LmFjdGV1clJlZl1cbiAgICAgICAgICAgICAgICBpZiAobWFuZGF0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBtYW5kYXRzID0gbWFuZGF0c0J5QWN0ZXVyVWlkW21hbmRhdC5hY3RldXJSZWZdID0gW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFuZGF0cy5wdXNoKG1hbmRhdClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbWFuZGF0cyBvZiBPYmplY3QudmFsdWVzKG1hbmRhdHNCeUFjdGV1clVpZCkpIHtcbiAgICAgICAgICAgICAgICBtYW5kYXRzLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICAgICAgICBhLnVpZC5sZW5ndGggPT09IGIudWlkLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IGEudWlkLmxvY2FsZUNvbXBhcmUoYi51aWQpXG4gICAgICAgICAgICAgICAgICAgIDogYS51aWQubGVuZ3RoIC0gYi51aWQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGV1clNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJhY3RldXJcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1ckZpbGVuYW1lID0gYWN0ZXVyU3BsaXRQYXRoW2FjdGV1clNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIWFjdGV1ckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1ck9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5hY3RldXJTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwiYWN0ZXVyXCIgZmlsZTogJHthY3RldXJPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1ck9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGFjdGV1ck9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9BY3RldXIoYWN0ZXVyT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShhY3RldXJPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1ciA9IGFjdGV1ck9yaWdpbmFsLmFjdGV1clxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJVaWQgPSBhY3RldXIudWlkW1wiI3RleHRcIl1cbiAgICAgICAgICAgICAgY29uc3QgZGVwb3J0cyA9IGRlcG9ydHNCeUFjdGV1clVpZFthY3RldXJVaWRdXG4gICAgICAgICAgICAgIGlmIChkZXBvcnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0ZXVyLmRlcG9ydHMsIHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBhY3RldXIuZGVwb3J0cyA9IHsgZGVwb3J0OiBkZXBvcnRzIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBtYW5kYXRzID0gbWFuZGF0c0J5QWN0ZXVyVWlkW2FjdGV1clVpZF1cbiAgICAgICAgICAgICAgaWYgKG1hbmRhdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhY3RldXIubWFuZGF0cywgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGFjdGV1ci5tYW5kYXRzID0geyBtYW5kYXQ6IG1hbmRhdHMgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1clJlb3JnYW5pemVkSnNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgYWN0ZXVyc1Jlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIGFjdGV1clVpZCArIFwiLmpzb25cIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGFjdGV1clJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFjdGV1ciwgbnVsbCwgMiksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBvcmdhbmVTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wib3JnYW5lXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVGaWxlbmFtZSA9IG9yZ2FuZVNwbGl0UGF0aFtvcmdhbmVTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFvcmdhbmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4ub3JnYW5lU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcIm9yZ2FuZVwiIGZpbGU6ICR7b3JnYW5lT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBvcmdhbmVPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZU9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvT3JnYW5lKG9yZ2FuZU9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JnYW5lT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmUgPSBvcmdhbmVPcmlnaW5hbC5vcmdhbmVcbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lUmVvcmdhbml6ZWRKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmdhbmVzUmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgb3JnYW5lLnVpZCArIFwiLmpzb25cIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIG9yZ2FuZVJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9yZ2FuZSwgbnVsbCwgMiksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY29tbWl0R2l0KGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFnZW5kYXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMuYWdlbmRhcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY2xlYXJEaXJlY3RvcnkoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBBZ2VuZGFzUmF3Q29udmVydC50b0FnZW5kYXMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJldW5pb24gb2Ygb3JpZ2luYWxEYXRhLnJldW5pb25zLnJldW5pb24pIHtcbiAgICAgICAgICAgICAgd3JpdGVSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIHJldW5pb24sXG4gICAgICAgICAgICAgICAgcGF0aEZyb21SZXVuaW9uVWlkLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJldW5pb25TcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wicmV1bmlvblwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbkZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICByZXVuaW9uU3BsaXRQYXRoW3JldW5pb25TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFyZXVuaW9uRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbk9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5yZXVuaW9uU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcInJldW5pb25cIiBmaWxlOiAke3JldW5pb25PcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb25PcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICByZXVuaW9uT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQWdlbmRhc1Jhd0NvbnZlcnQudG9SZXVuaW9uKHJldW5pb25PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKHJldW5pb25PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb24gPSByZXVuaW9uT3JpZ2luYWwucmV1bmlvblxuICAgICAgICAgICAgICB3cml0ZVJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgcmV1bmlvbixcbiAgICAgICAgICAgICAgICBwYXRoRnJvbVJldW5pb25VaWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY29tbWl0R2l0KGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFtZW5kZW1lbnRzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmFtZW5kZW1lbnRzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjbGVhckRpcmVjdG9yeShkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IEFtZW5kZW1lbnRzUmF3Q29udmVydC50b0FtZW5kZW1lbnRzKG9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCB0ZXh0ZUxlZ2lzbGF0aWYgb2Ygb3JpZ2luYWxEYXRhLnRleHRlc0V0QW1lbmRlbWVudHNcbiAgICAgICAgICAgICAgLnRleHRlbGVnKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgYW1lbmRlbWVudCBvZiB0ZXh0ZUxlZ2lzbGF0aWYuYW1lbmRlbWVudHMpIHtcbiAgICAgICAgICAgICAgICB3cml0ZUFtZW5kZW1lbnRSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgICBhbWVuZGVtZW50LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgYW1lbmRlbWVudFNwbGl0UGF0aFthbWVuZGVtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghYW1lbmRlbWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uYW1lbmRlbWVudFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJhbWVuZGVtZW50XCIgZmlsZTogJHthbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYW1lbmRlbWVudE9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudE9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IEFtZW5kZW1lbnRzUmF3Q29udmVydC50b0FtZW5kZW1lbnRXcmFwcGVyKFxuICAgICAgICAgICAgICAgICAgICBhbWVuZGVtZW50T3JpZ2luYWxKc29uLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShhbWVuZGVtZW50T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50ID0gYW1lbmRlbWVudE9yaWdpbmFsLmFtZW5kZW1lbnRcbiAgICAgICAgICAgICAgd3JpdGVBbWVuZGVtZW50UmVvcmdhbml6ZWRKc29uKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgYW1lbmRlbWVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY29tbWl0R2l0KGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMuZG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY2xlYXJEaXJlY3RvcnkoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuXG4gICAgICBjb25zdCBkb2N1bWVudHNEaXIgPSBwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBcImRvY3VtZW50c1wiKVxuICAgICAgZnMubWtkaXJTeW5jKGRvY3VtZW50c0RpcilcbiAgICAgIGNvbnN0IGRvc3NpZXJzRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJkb3NzaWVyc1wiKVxuICAgICAgZnMubWtkaXJTeW5jKGRvc3NpZXJzRGlyKVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydC50b0Rvc3NpZXJzTGVnaXNsYXRpZnMoXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvY3VtZW50IG9mIG9yaWdpbmFsRGF0YS5leHBvcnQudGV4dGVzTGVnaXNsYXRpZnNcbiAgICAgICAgICAgICAgLmRvY3VtZW50KSB7XG4gICAgICAgICAgICAgIHdyaXRlUmVvcmdhbml6ZWRKc29uKGRvY3VtZW50c0RpciwgZG9jdW1lbnQsIHBhdGhGcm9tRG9jdW1lbnRVaWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgeyBkb3NzaWVyUGFybGVtZW50YWlyZSB9IG9mIG9yaWdpbmFsRGF0YS5leHBvcnRcbiAgICAgICAgICAgICAgLmRvc3NpZXJzTGVnaXNsYXRpZnMuZG9zc2llcikge1xuICAgICAgICAgICAgICB3cml0ZVJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICBkb3NzaWVyc0RpcixcbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgICAgICAgICAgICAgICBwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvY3VtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImRvY3VtZW50XCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudEZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBkb2N1bWVudFNwbGl0UGF0aFtkb2N1bWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uZG9jdW1lbnRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwiZG9jdW1lbnRcIiBmaWxlOiAke2RvY3VtZW50T3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGRvY3VtZW50T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0LnRvRG9jdW1lbnQoZG9jdW1lbnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGRvY3VtZW50T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IGRvY3VtZW50T3JpZ2luYWwuZG9jdW1lbnRcbiAgICAgICAgICAgICAgd3JpdGVSZW9yZ2FuaXplZEpzb24oZG9jdW1lbnRzRGlyLCBkb2N1bWVudCwgcGF0aEZyb21Eb2N1bWVudFVpZClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJkb3NzaWVyUGFybGVtZW50YWlyZVwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVTcGxpdFBhdGhbXG4gICAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aC5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICBpZiAoIWRvc3NpZXJQYXJsZW1lbnRhaXJlRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uZG9zc2llclBhcmxlbWVudGFpcmVTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwiZG9zc2llclBhcmxlbWVudGFpcmVcIiBmaWxlOiAke2Rvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0LnRvRG9zc2llclBhcmxlbWVudGFpcmUoXG4gICAgICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmUgPVxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWwuZG9zc2llclBhcmxlbWVudGFpcmVcbiAgICAgICAgICAgICAgd3JpdGVSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgZG9zc2llcnNEaXIsXG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmUsXG4gICAgICAgICAgICAgICAgcGF0aEZyb21Eb3NzaWVyUGFybGVtZW50YWlyZVVpZCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb21taXRHaXQoZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlNjcnV0aW5zKSB7XG4gICAgZm9yIChsZXQgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5zY3J1dGlucykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY2xlYXJEaXJlY3RvcnkoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBTY3J1dGluc1Jhd0NvbnZlcnQudG9TY3J1dGlucyhvcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2NydXRpbiBvZiBvcmlnaW5hbERhdGEuc2NydXRpbnMuc2NydXRpbikge1xuICAgICAgICAgICAgICB3cml0ZVJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgc2NydXRpbixcbiAgICAgICAgICAgICAgICBwYXRoRnJvbVNjcnV0aW5VaWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2NydXRpblNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluRmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIHNjcnV0aW5TcGxpdFBhdGhbc2NydXRpblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIXNjcnV0aW5GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLnNjcnV0aW5TcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwic2NydXRpblwiIGZpbGU6ICR7c2NydXRpbk9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbk9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHNjcnV0aW5PcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW5PcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBTY3J1dGluc1Jhd0NvbnZlcnQudG9TY3J1dGluV3JhcHBlcihzY3J1dGluT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShzY3J1dGluT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluID0gc2NydXRpbk9yaWdpbmFsLnNjcnV0aW5cbiAgICAgICAgICAgICAgd3JpdGVSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIHNjcnV0aW4sXG4gICAgICAgICAgICAgICAgcGF0aEZyb21TY3J1dGluVWlkLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNvbW1pdEdpdChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5RdWVzdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMucXVlc3Rpb25zKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjbGVhckRpcmVjdG9yeShkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcXVlc3Rpb25TcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb25GaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgcXVlc3Rpb25TcGxpdFBhdGhbcXVlc3Rpb25TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFxdWVzdGlvbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLnF1ZXN0aW9uU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcInF1ZXN0aW9uXCIgZmlsZTogJHtxdWVzdGlvbk9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb25PcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBxdWVzdGlvbk9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbk9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IFF1ZXN0aW9uc1Jhd0NvbnZlcnQudG9RdWVzdGlvbldyYXBwZXIocXVlc3Rpb25PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKHF1ZXN0aW9uT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbiA9IHF1ZXN0aW9uT3JpZ2luYWwucXVlc3Rpb25cbiAgICAgICAgICAgICAgd3JpdGVSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICAgICAgICAgIHBhdGhGcm9tUXVlc3Rpb25VaWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY29tbWl0R2l0KGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkNvbXB0ZXNSZW5kdXNTZWFuY2VzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmNvbXB0ZXNSZW5kdXNTZWFuY2VzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLCBcIi54bWxcIilcbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY2xlYXJEaXJlY3RvcnkoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbXB0ZVJlbmR1U2VhbmNlU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1U2VhbmNlRmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIGNvbXB0ZVJlbmR1U2VhbmNlU3BsaXRQYXRoW1xuICAgICAgICAgICAgICAgICAgY29tcHRlUmVuZHVTZWFuY2VTcGxpdFBhdGgubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgaWYgKCFjb21wdGVSZW5kdVNlYW5jZUZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLmNvbXB0ZVJlbmR1U2VhbmNlU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcImNvbXB0ZVJlbmR1U2VhbmNlXCIgZmlsZTogJHtjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgY29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgY29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBDb21wdGVzUmVuZHVzUmF3Q29udmVydC50b0NvbXB0ZVJlbmR1V3JhcHBlcihcbiAgICAgICAgICAgICAgICAgICAgY29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1U2VhbmNlID0gY29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbC5jb21wdGVSZW5kdVxuICAgICAgICAgICAgICB3cml0ZVJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgY29tcHRlUmVuZHVTZWFuY2UsXG4gICAgICAgICAgICAgICAgcGF0aEZyb21Db21wdGVSZW5kdVVpZCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb21taXRHaXQoZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc3RvcmUgc3RhbmRhcmQgY29udmVyc2lvbiBvZiBkYXRlcyB0byBKU09OLlxuICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBleGlzdGluZ0RhdGVUb0pzb25cblxuICByZXR1cm4gZXhpdENvZGVcbn1cblxuZnVuY3Rpb24gd3JpdGVBbWVuZGVtZW50UmVvcmdhbml6ZWRKc29uKFxuICBkYXRhc2V0UmVvcmdhbml6ZWREaXI6IHN0cmluZyxcbiAgYW1lbmRlbWVudDoge1xuICAgIHVpZDogc3RyaW5nXG4gICAgdGV4dGVMZWdpc2xhdGlmUmVmOiBzdHJpbmdcbiAgfSxcbik6IHZvaWQge1xuICBjb25zdCB1aWRUZXh0ZUxlZ2lzbGF0aWYgPSBhbWVuZGVtZW50LnRleHRlTGVnaXNsYXRpZlJlZlxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwodWlkVGV4dGVMZWdpc2xhdGlmLCB1bmRlZmluZWQpXG4gIGNvbnN0IHRleHRlTGVnaXNsYXRpZkRpciA9IHBhdGguam9pbihcbiAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgdWlkVGV4dGVMZWdpc2xhdGlmLFxuICApXG4gIGZzLmVuc3VyZURpclN5bmModGV4dGVMZWdpc2xhdGlmRGlyKVxuICBjb25zdCByZW9yZ2FuaXplZEpzb25GaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICB0ZXh0ZUxlZ2lzbGF0aWZEaXIsXG4gICAgYW1lbmRlbWVudC51aWQgKyBcIi5qc29uXCIsXG4gIClcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICByZW9yZ2FuaXplZEpzb25GaWxlUGF0aCxcbiAgICBKU09OLnN0cmluZ2lmeShhbWVuZGVtZW50LCBudWxsLCAyKSxcbiAgICB7XG4gICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgfSxcbiAgKVxufVxuXG5mdW5jdGlvbiB3cml0ZVJlb3JnYW5pemVkSnNvbjxUIGV4dGVuZHMgeyB1aWQ6IHN0cmluZyB9PihcbiAgZGlyOiBzdHJpbmcsXG4gIG9iajogVCxcbiAgcGF0aEZyb21VaWQ6IChkaXI6IHN0cmluZywgdWlkOiBzdHJpbmcpID0+IHN0cmluZyxcbik6IHZvaWQge1xuICBjb25zdCBiYXNlbmFtZSA9IHBhdGhGcm9tVWlkKGRpciwgb2JqLnVpZClcbiAgZnMud3JpdGVGaWxlU3luYyhgJHtiYXNlbmFtZX0uanNvbmAsIEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMiksIHtcbiAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gIH0pXG59XG5cbmZ1bmN0aW9uIG1haW4oYXJndjogYW55KTogbnVtYmVyIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlQXJncyhhcmd2KVxuICByZXR1cm4gcmVvcmdhbml6ZURhdGEob3B0aW9ucylcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAocHJvY2Vzcy5hcmd2WzFdLmVuZHNXaXRoKFwicmVvcmdhbml6ZV9kYXRhLnRzXCIpKVxuICBwcm9jZXNzLmV4aXQobWFpbihwcm9jZXNzLmFyZ3YpKVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxNQUFNLE1BQU0sUUFBUTtBQUMzQixPQUFPQyxlQUFlLE1BQU0sbUJBQW1CO0FBQy9DLE9BQU9DLEVBQUUsTUFBTSxVQUFVO0FBQ3pCLE9BQU9DLElBQUksTUFBTSxNQUFNO0FBQUEsU0FFckJDLFFBQVEsRUFDUkMsZ0JBQWdCLEVBQ2hCQyxlQUFlLEVBQ2ZDLGtCQUFrQixFQUNsQkMsbUJBQW1CO0FBQUEsU0FFWkMsa0JBQWtCLEVBQUVDLGlCQUFpQjtBQUFBLE9BQ3ZDLEtBQUtDLEdBQUc7QUFBQSxTQUNOQyxPQUFPO0FBQUEsU0FFZEMsc0JBQXNCLEVBQ3RCQyxtQkFBbUIsRUFDbkJDLCtCQUErQixFQUMvQkMsbUJBQW1CLEVBQ25CQyxrQkFBa0IsRUFDbEJDLGtCQUFrQjtBQUFBLFNBRVhDLE9BQU8sSUFBSUMsMEJBQTBCO0FBQUEsU0FDckNELE9BQU8sSUFBSUUsaUJBQWlCO0FBQUEsU0FDNUJGLE9BQU8sSUFBSUcscUJBQXFCO0FBQUEsU0FDaENILE9BQU8sSUFBSUksNkJBQTZCO0FBQUEsU0FDeENKLE9BQU8sSUFBSUssa0JBQWtCO0FBQUEsU0FDN0JMLE9BQU8sSUFBSU0sbUJBQW1CO0FBQUEsU0FDOUJOLE9BQU8sSUFBSU8sdUJBQXVCO0FBQUEsU0FFekNDLFdBQVcsRUFDWEMsWUFBWSxFQUNaQyxnQkFBZ0IsRUFDaEJDLGlCQUFpQixFQUNq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
|