@tricoteuses/assemblee 1.0.0-next.2 → 1.0.2
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 +2 -0
- package/lib/api.js +23 -7
- package/lib/api.mjs +41 -0
- package/lib/bugs/acteur-00010/plugin.test.js +139 -33
- package/lib/bugs/acteur-00010/plugin.test.mjs +33 -0
- package/lib/bugs/acteur-00010.js +166 -24
- package/lib/bugs/acteur-00010.mjs +31 -0
- package/lib/bugs/agenda-00002/plugin.test.js +178 -52
- package/lib/bugs/agenda-00002/plugin.test.mjs +52 -0
- package/lib/bugs/agenda-00002.js +507 -143
- package/lib/bugs/agenda-00002.mjs +197 -0
- package/lib/bugs/agenda-00008/plugin.test.js +143 -31
- package/lib/bugs/agenda-00008/plugin.test.mjs +31 -0
- package/lib/bugs/agenda-00008.js +180 -25
- package/lib/bugs/agenda-00008.mjs +30 -0
- package/lib/bugs/agenda-00011/plugin.test.js +371 -156
- package/lib/bugs/agenda-00011/plugin.test.mjs +156 -0
- package/lib/bugs/agenda-00011.js +416 -117
- package/lib/bugs/agenda-00011.mjs +150 -0
- package/lib/bugs.js +591 -54
- package/lib/bugs.mjs +93 -0
- package/lib/cleaners/actes_legislatifs.js +149 -61
- package/lib/cleaners/actes_legislatifs.mjs +311 -0
- package/lib/cleaners/acteurs.js +255 -123
- package/lib/cleaners/acteurs.mjs +211 -0
- package/lib/cleaners/amendements.js +242 -117
- package/lib/cleaners/amendements.mjs +292 -0
- package/lib/cleaners/documents.js +147 -62
- package/lib/cleaners/documents.mjs +162 -0
- package/lib/cleaners/dossiers_legislatifs.js +132 -45
- package/lib/cleaners/dossiers_legislatifs.mjs +123 -0
- package/lib/cleaners/index.js +64 -8
- package/lib/cleaners/index.mjs +8 -0
- package/lib/cleaners/organes.js +54 -21
- package/lib/cleaners/organes.mjs +64 -0
- package/lib/cleaners/reunions.js +237 -127
- package/lib/cleaners/reunions.mjs +318 -0
- package/lib/cleaners/scrutins.js +261 -99
- package/lib/cleaners/scrutins.mjs +254 -0
- package/lib/cleaners/xml.js +81 -16
- package/lib/cleaners/xml.mjs +42 -0
- package/lib/datasets.js +284 -153
- package/lib/datasets.mjs +596 -0
- package/lib/dates.js +93 -34
- package/lib/dates.mjs +98 -0
- package/lib/dossiers_legislatifs.js +107 -33
- package/lib/dossiers_legislatifs.mjs +215 -0
- package/lib/file_systems.js +203 -35
- package/lib/file_systems.mjs +64 -0
- package/lib/git.js +139 -41
- package/lib/git.mjs +114 -0
- package/lib/index.js +310 -16
- package/lib/index.mjs +16 -0
- package/lib/inserters.js +355 -131
- package/lib/inserters.mjs +413 -0
- package/lib/loaders.js +900 -440
- package/lib/loaders.mjs +678 -0
- package/lib/organes.js +15 -5
- package/lib/organes.mjs +18 -0
- package/lib/parsers/documents.js +241 -89
- package/lib/parsers/documents.mjs +433 -0
- package/lib/parsers/index.js +36 -3
- package/lib/parsers/index.mjs +3 -0
- package/lib/parsers/recherche_amendements.js +616 -173
- package/lib/parsers/recherche_amendements.mjs +189 -0
- package/lib/raw_types/acteurs_et_organes.d.ts +36 -148
- package/lib/raw_types/acteurs_et_organes.js +228 -506
- package/lib/raw_types/acteurs_et_organes.mjs +1240 -0
- package/lib/raw_types/agendas.js +165 -75
- package/lib/raw_types/agendas.mjs +944 -0
- package/lib/raw_types/amendements.js +165 -77
- package/lib/raw_types/amendements.mjs +1040 -0
- package/lib/raw_types/dossiers_legislatifs.d.ts +1 -43
- package/lib/raw_types/dossiers_legislatifs.js +181 -143
- package/lib/raw_types/dossiers_legislatifs.mjs +1792 -0
- package/lib/raw_types/scrutins.js +144 -61
- package/lib/raw_types/scrutins.mjs +645 -0
- package/lib/scripts/bugs_helper.js +657 -155
- package/lib/scripts/bugs_helper.mjs +286 -0
- package/lib/scripts/clean_data.js +380 -145
- package/lib/scripts/clean_data.mjs +190 -0
- package/lib/scripts/clean_reorganized_data.js +627 -331
- package/lib/scripts/clean_reorganized_data.mjs +520 -0
- package/lib/scripts/diff_amendements.js +159 -73
- package/lib/scripts/diff_amendements.mjs +234 -0
- package/lib/scripts/document_dossiers_legislatifs.js +570 -288
- package/lib/scripts/document_dossiers_legislatifs.mjs +494 -0
- package/lib/scripts/get_today_reunions.js +37 -20
- package/lib/scripts/get_today_reunions.mjs +41 -0
- package/lib/scripts/merge_scrutins.js +121 -39
- package/lib/scripts/merge_scrutins.mjs +69 -0
- package/lib/scripts/parse_textes_lois.js +179 -125
- package/lib/scripts/parse_textes_lois.mjs +215 -0
- package/lib/scripts/raw_types_from_amendements.js +276 -77
- package/lib/scripts/raw_types_from_amendements.mjs +118 -0
- package/lib/scripts/reorganize_data.js +867 -446
- package/lib/scripts/reorganize_data.mjs +712 -0
- package/lib/scripts/retrieve_deputes_photos.js +378 -157
- package/lib/scripts/retrieve_deputes_photos.mjs +230 -0
- package/lib/scripts/retrieve_documents.js +648 -172
- package/lib/scripts/retrieve_documents.mjs +292 -0
- package/lib/scripts/retrieve_open_data.js +286 -85
- package/lib/scripts/retrieve_open_data.mjs +125 -0
- package/lib/scripts/retrieve_pending_amendments.js +302 -69
- package/lib/scripts/retrieve_pending_amendments.mjs +130 -0
- package/lib/scripts/retrieve_senateurs_photos.js +374 -198
- package/lib/scripts/retrieve_senateurs_photos.mjs +277 -0
- package/lib/scripts/retrieve_textes_lois.js +343 -89
- package/lib/scripts/retrieve_textes_lois.mjs +168 -0
- package/lib/scripts/test_load.js +30 -11
- package/lib/scripts/test_load.mjs +26 -0
- package/lib/scripts/test_load_big_files.js +30 -11
- package/lib/scripts/test_load_big_files.mjs +26 -0
- package/lib/scripts/validate_json.js +370 -120
- package/lib/scripts/validate_json.mjs +216 -0
- package/lib/shared_types/codes_actes.js +50 -15
- package/lib/shared_types/codes_actes.mjs +228 -0
- package/lib/strings.js +16 -3
- package/lib/strings.mjs +7 -0
- package/lib/types/acteurs_et_organes.js +156 -71
- package/lib/types/acteurs_et_organes.mjs +918 -0
- package/lib/types/agendas.js +154 -67
- package/lib/types/agendas.mjs +623 -0
- package/lib/types/amendements.js +166 -77
- package/lib/types/amendements.mjs +885 -0
- package/lib/types/dossiers_legislatifs.d.ts +1 -42
- package/lib/types/dossiers_legislatifs.js +182 -143
- package/lib/types/dossiers_legislatifs.mjs +1120 -0
- package/lib/types/legislatures.js +12 -3
- package/lib/types/legislatures.mjs +9 -0
- package/lib/types/scrutins.js +144 -61
- package/lib/types/scrutins.mjs +528 -0
- package/lib/urls.js +44 -25
- package/lib/urls.mjs +201 -0
- package/package.json +33 -12
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import assert from "assert";
|
|
2
|
+
import commandLineArgs from "command-line-args";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { cleanActeur } from "../cleaners/acteurs.mjs";
|
|
6
|
+
import { cleanTexteLegislatif } from "../cleaners/amendements.mjs";
|
|
7
|
+
import { cleanDocumentOrDivision } from "../cleaners/documents.mjs";
|
|
8
|
+
import { cleanDossierParlementaire } from "../cleaners/dossiers_legislatifs.mjs";
|
|
9
|
+
import { cleanOrgane } from "../cleaners/organes.mjs";
|
|
10
|
+
import { cleanReunion } from "../cleaners/reunions.mjs";
|
|
11
|
+
import { cleanScrutin } from "../cleaners/scrutins.mjs";
|
|
12
|
+
import { datasets, EnabledDatasets } from "../datasets.mjs";
|
|
13
|
+
import { existingDateToJson, patchedDateToJson } from "../dates.mjs";
|
|
14
|
+
import { Convert as ActeursEtOrganesConvert } from "../types/acteurs_et_organes.mjs";
|
|
15
|
+
import { Convert as AgendasConvert } from "../types/agendas.mjs";
|
|
16
|
+
import { Convert as AmendementsConvert } from "../types/amendements.mjs";
|
|
17
|
+
import { Convert as DossiersLegislatifsConvert } from "../types/dossiers_legislatifs.mjs";
|
|
18
|
+
import { Convert as ScrutinsConvert } from "../types/scrutins.mjs";
|
|
19
|
+
import { Convert as ActeursEtOrganesRawConvert } from "../raw_types/acteurs_et_organes.mjs";
|
|
20
|
+
import { Convert as AgendasRawConvert } from "../raw_types/agendas.mjs";
|
|
21
|
+
import { Convert as AmendementsRawConvert } from "../raw_types/amendements.mjs";
|
|
22
|
+
import { Convert as DossiersLegislatifsRawConvert } from "../raw_types/dossiers_legislatifs.mjs";
|
|
23
|
+
import { Convert as ScrutinsRawConvert } from "../raw_types/scrutins.mjs";
|
|
24
|
+
const optionsDefinitions = [{
|
|
25
|
+
alias: "k",
|
|
26
|
+
defaultValue: ["All"],
|
|
27
|
+
help: "categories of datasets to reorganize",
|
|
28
|
+
multiple: true,
|
|
29
|
+
name: "categories",
|
|
30
|
+
type: String
|
|
31
|
+
}, {
|
|
32
|
+
defaultOption: true,
|
|
33
|
+
help: "directory containing Assemblée open data files",
|
|
34
|
+
name: "dataDir",
|
|
35
|
+
type: String
|
|
36
|
+
}];
|
|
37
|
+
const options = commandLineArgs(optionsDefinitions);
|
|
38
|
+
|
|
39
|
+
function cleanData(dataDir) {
|
|
40
|
+
Date.prototype.toJSON = patchedDateToJson;
|
|
41
|
+
options.categories.map(datasetName => assert.notStrictEqual(EnabledDatasets[datasetName], undefined, `Unknown name of dataset: ${datasetName}`));
|
|
42
|
+
const enabledDatasets = options.categories.reduce((enabledDatasets, datasetName) => enabledDatasets | EnabledDatasets[datasetName], EnabledDatasets.None);
|
|
43
|
+
|
|
44
|
+
if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
|
|
45
|
+
for (const dataset of datasets.acteursEtOrganes) {
|
|
46
|
+
const rawJsonFilePath = path.join(dataDir, dataset.filename);
|
|
47
|
+
console.log(`Loading file: ${rawJsonFilePath}`);
|
|
48
|
+
const rawJson = fs.readFileSync(rawJsonFilePath, {
|
|
49
|
+
encoding: "utf8"
|
|
50
|
+
});
|
|
51
|
+
const acteursEtOrganes = ActeursEtOrganesRawConvert.toActeursEtOrganes(rawJson); // const acteurs = jp.query(acteursEtOrganes, "$.export.acteurs.acteur")[0]
|
|
52
|
+
|
|
53
|
+
const organes = acteursEtOrganes.export.organes.organe;
|
|
54
|
+
acteursEtOrganes.organes = organes;
|
|
55
|
+
const acteurs = acteursEtOrganes.export.acteurs.acteur;
|
|
56
|
+
acteursEtOrganes.acteurs = acteurs;
|
|
57
|
+
delete acteursEtOrganes.export;
|
|
58
|
+
|
|
59
|
+
for (const acteur of acteurs) {
|
|
60
|
+
cleanActeur(acteur);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
for (const organe of organes) {
|
|
64
|
+
cleanOrgane(organe);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const acteursEtOrganesJson = JSON.stringify(acteursEtOrganes, null, 2); // Validate generated JSON.
|
|
68
|
+
|
|
69
|
+
const acteursEtOrganesClean = ActeursEtOrganesConvert.toActeursEtOrganes(acteursEtOrganesJson);
|
|
70
|
+
const acteursEtOrganesCleanJson = ActeursEtOrganesConvert.acteursEtOrganesToJson(acteursEtOrganesClean);
|
|
71
|
+
const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
|
|
72
|
+
fs.writeFileSync(jsonFilePath, acteursEtOrganesCleanJson, {
|
|
73
|
+
encoding: "utf8"
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (enabledDatasets & EnabledDatasets.Agendas) {
|
|
79
|
+
for (const dataset of datasets.agendas) {
|
|
80
|
+
const rawJsonFilePath = path.join(dataDir, dataset.filename);
|
|
81
|
+
console.log(`Loading file: ${rawJsonFilePath}`);
|
|
82
|
+
const rawJson = fs.readFileSync(rawJsonFilePath, {
|
|
83
|
+
encoding: "utf8"
|
|
84
|
+
});
|
|
85
|
+
const agendas = AgendasRawConvert.toAgendas(rawJson);
|
|
86
|
+
agendas.reunions = agendas.reunions.reunion;
|
|
87
|
+
|
|
88
|
+
for (const reunion of agendas.reunions) {
|
|
89
|
+
cleanReunion(reunion);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const agendasJson = JSON.stringify(agendas, null, 2); // Validate generated JSON.
|
|
93
|
+
|
|
94
|
+
const agendasClean = AgendasConvert.toAgendas(agendasJson);
|
|
95
|
+
const agendasCleanJson = AgendasConvert.agendasToJson(agendasClean);
|
|
96
|
+
const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
|
|
97
|
+
fs.writeFileSync(jsonFilePath, agendasCleanJson, {
|
|
98
|
+
encoding: "utf8"
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (enabledDatasets & EnabledDatasets.Amendements) {
|
|
104
|
+
for (const dataset of datasets.amendements) {
|
|
105
|
+
const rawJsonFilePath = path.join(dataDir, dataset.filename);
|
|
106
|
+
console.log(`Loading file: ${rawJsonFilePath}`);
|
|
107
|
+
const rawJson = fs.readFileSync(rawJsonFilePath, {
|
|
108
|
+
encoding: "utf8"
|
|
109
|
+
});
|
|
110
|
+
const amendements = AmendementsRawConvert.toAmendements(rawJson);
|
|
111
|
+
amendements.textesLegislatifs = amendements.textesEtAmendements.texteleg;
|
|
112
|
+
delete amendements.textesEtAmendements;
|
|
113
|
+
|
|
114
|
+
for (const texteLegislatif of amendements.textesLegislatifs) {
|
|
115
|
+
cleanTexteLegislatif(texteLegislatif);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const amendementsJson = JSON.stringify(amendements, null, 2); // Validate generated JSON.
|
|
119
|
+
|
|
120
|
+
const amendementsClean = AmendementsConvert.toAmendements(amendementsJson);
|
|
121
|
+
const amendementsCleanJson = AmendementsConvert.amendementsToJson(amendementsClean);
|
|
122
|
+
const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
|
|
123
|
+
fs.writeFileSync(jsonFilePath, amendementsCleanJson, {
|
|
124
|
+
encoding: "utf8"
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
|
|
130
|
+
for (const dataset of datasets.dossiersLegislatifs) {
|
|
131
|
+
const rawJsonFilePath = path.join(dataDir, dataset.filename);
|
|
132
|
+
console.log(`Loading file: ${rawJsonFilePath}`);
|
|
133
|
+
const rawJson = fs.readFileSync(rawJsonFilePath, {
|
|
134
|
+
encoding: "utf8"
|
|
135
|
+
});
|
|
136
|
+
const dossiersLegislatifs = DossiersLegislatifsRawConvert.toDossiersLegislatifs(rawJson);
|
|
137
|
+
dossiersLegislatifs.textesLegislatifs = dossiersLegislatifs.export.textesLegislatifs.document;
|
|
138
|
+
dossiersLegislatifs.dossiersParlementaires = dossiersLegislatifs.export.dossiersLegislatifs.dossier.map(dossier => dossier.dossierParlementaire);
|
|
139
|
+
delete dossiersLegislatifs.export;
|
|
140
|
+
|
|
141
|
+
for (const document of dossiersLegislatifs.textesLegislatifs) {
|
|
142
|
+
cleanDocumentOrDivision(document);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
for (const dossierParlementaire of dossiersLegislatifs.dossiersParlementaires) {
|
|
146
|
+
cleanDossierParlementaire(dossierParlementaire);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const dossiersLegislatifsJson = JSON.stringify(dossiersLegislatifs, null, 2); // Validate generated JSON.
|
|
150
|
+
|
|
151
|
+
const dossiersLegislatifsClean = DossiersLegislatifsConvert.toDossiersLegislatifs(dossiersLegislatifsJson);
|
|
152
|
+
const dossiersLegislatifsCleanJson = DossiersLegislatifsConvert.dossiersLegislatifsToJson(dossiersLegislatifsClean);
|
|
153
|
+
const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
|
|
154
|
+
fs.writeFileSync(jsonFilePath, dossiersLegislatifsCleanJson, {
|
|
155
|
+
encoding: "utf8"
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (enabledDatasets & EnabledDatasets.Scrutins) {
|
|
161
|
+
for (const dataset of datasets.scrutins) {
|
|
162
|
+
const rawJsonFilePath = path.join(dataDir, dataset.filename);
|
|
163
|
+
console.log(`Loading file: ${rawJsonFilePath}`);
|
|
164
|
+
const rawJson = fs.readFileSync(rawJsonFilePath, {
|
|
165
|
+
encoding: "utf8"
|
|
166
|
+
});
|
|
167
|
+
const scrutins = ScrutinsRawConvert.toScrutins(rawJson);
|
|
168
|
+
scrutins.scrutins = scrutins.scrutins.scrutin;
|
|
169
|
+
|
|
170
|
+
for (const scrutin of scrutins.scrutins) {
|
|
171
|
+
cleanScrutin(scrutin);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const scrutinsJson = JSON.stringify(scrutins, null, 2); // Validate generated JSON.
|
|
175
|
+
|
|
176
|
+
const scrutinsClean = ScrutinsConvert.toScrutins(scrutinsJson);
|
|
177
|
+
const scrutinsCleanJson = ScrutinsConvert.scrutinsToJson(scrutinsClean);
|
|
178
|
+
const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
|
|
179
|
+
fs.writeFileSync(jsonFilePath, scrutinsCleanJson, {
|
|
180
|
+
encoding: "utf8"
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
} // Restore standard conversion of dates to JSON.
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
Date.prototype.toJSON = existingDateToJson;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
cleanData(options.dataDir);
|
|
190
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjb21tYW5kTGluZUFyZ3MiLCJmcyIsInBhdGgiLCJjbGVhbkFjdGV1ciIsImNsZWFuVGV4dGVMZWdpc2xhdGlmIiwiY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24iLCJjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiY2xlYW5PcmdhbmUiLCJjbGVhblJldW5pb24iLCJjbGVhblNjcnV0aW4iLCJkYXRhc2V0cyIsIkVuYWJsZWREYXRhc2V0cyIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInBhdGNoZWREYXRlVG9Kc29uIiwiQ29udmVydCIsIkFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0IiwiQWdlbmRhc0NvbnZlcnQiLCJBbWVuZGVtZW50c0NvbnZlcnQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydCIsIlNjcnV0aW5zQ29udmVydCIsIkFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0IiwiQWdlbmRhc1Jhd0NvbnZlcnQiLCJBbWVuZGVtZW50c1Jhd0NvbnZlcnQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydCIsIlNjcnV0aW5zUmF3Q29udmVydCIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImFsaWFzIiwiZGVmYXVsdFZhbHVlIiwiaGVscCIsIm11bHRpcGxlIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsImNsZWFuRGF0YSIsImRhdGFEaXIiLCJEYXRlIiwicHJvdG90eXBlIiwidG9KU09OIiwiY2F0ZWdvcmllcyIsIm1hcCIsImRhdGFzZXROYW1lIiwibm90U3RyaWN0RXF1YWwiLCJ1bmRlZmluZWQiLCJlbmFibGVkRGF0YXNldHMiLCJyZWR1Y2UiLCJOb25lIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXQiLCJhY3RldXJzRXRPcmdhbmVzIiwicmF3SnNvbkZpbGVQYXRoIiwiam9pbiIsImZpbGVuYW1lIiwiY29uc29sZSIsImxvZyIsInJhd0pzb24iLCJyZWFkRmlsZVN5bmMiLCJlbmNvZGluZyIsInRvQWN0ZXVyc0V0T3JnYW5lcyIsIm9yZ2FuZXMiLCJleHBvcnQiLCJvcmdhbmUiLCJhY3RldXJzIiwiYWN0ZXVyIiwiYWN0ZXVyc0V0T3JnYW5lc0pzb24iLCJKU09OIiwic3RyaW5naWZ5IiwiYWN0ZXVyc0V0T3JnYW5lc0NsZWFuIiwiYWN0ZXVyc0V0T3JnYW5lc0NsZWFuSnNvbiIsImFjdGV1cnNFdE9yZ2FuZXNUb0pzb24iLCJqc29uRmlsZVBhdGgiLCJyZXBsYWNlIiwid3JpdGVGaWxlU3luYyIsIkFnZW5kYXMiLCJhZ2VuZGFzIiwidG9BZ2VuZGFzIiwicmV1bmlvbnMiLCJyZXVuaW9uIiwiYWdlbmRhc0pzb24iLCJhZ2VuZGFzQ2xlYW4iLCJhZ2VuZGFzQ2xlYW5Kc29uIiwiYWdlbmRhc1RvSnNvbiIsIkFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudHMiLCJ0b0FtZW5kZW1lbnRzIiwidGV4dGVzTGVnaXNsYXRpZnMiLCJ0ZXh0ZXNFdEFtZW5kZW1lbnRzIiwidGV4dGVsZWciLCJ0ZXh0ZUxlZ2lzbGF0aWYiLCJhbWVuZGVtZW50c0pzb24iLCJhbWVuZGVtZW50c0NsZWFuIiwiYW1lbmRlbWVudHNDbGVhbkpzb24iLCJhbWVuZGVtZW50c1RvSnNvbiIsIkRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb3NzaWVyc0xlZ2lzbGF0aWZzIiwidG9Eb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9jdW1lbnQiLCJkb3NzaWVyc1BhcmxlbWVudGFpcmVzIiwiZG9zc2llciIsImRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiZG9zc2llcnNMZWdpc2xhdGlmc0pzb24iLCJkb3NzaWVyc0xlZ2lzbGF0aWZzQ2xlYW4iLCJkb3NzaWVyc0xlZ2lzbGF0aWZzQ2xlYW5Kc29uIiwiZG9zc2llcnNMZWdpc2xhdGlmc1RvSnNvbiIsIlNjcnV0aW5zIiwic2NydXRpbnMiLCJ0b1NjcnV0aW5zIiwic2NydXRpbiIsInNjcnV0aW5zSnNvbiIsInNjcnV0aW5zQ2xlYW4iLCJzY3J1dGluc0NsZWFuSnNvbiIsInNjcnV0aW5zVG9Kc29uIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvY2xlYW5fZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IGZzIGZyb20gXCJmc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmltcG9ydCB7IGNsZWFuQWN0ZXVyIH0gZnJvbSBcIi4uL2NsZWFuZXJzL2FjdGV1cnNcIlxuaW1wb3J0IHsgY2xlYW5UZXh0ZUxlZ2lzbGF0aWYgfSBmcm9tIFwiLi4vY2xlYW5lcnMvYW1lbmRlbWVudHNcIlxuaW1wb3J0IHsgY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24gfSBmcm9tIFwiLi4vY2xlYW5lcnMvZG9jdW1lbnRzXCJcbmltcG9ydCB7IGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUgfSBmcm9tIFwiLi4vY2xlYW5lcnMvZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0IHsgY2xlYW5PcmdhbmUgfSBmcm9tIFwiLi4vY2xlYW5lcnMvb3JnYW5lc1wiXG5pbXBvcnQgeyBjbGVhblJldW5pb24gfSBmcm9tIFwiLi4vY2xlYW5lcnMvcmV1bmlvbnNcIlxuaW1wb3J0IHsgY2xlYW5TY3J1dGluIH0gZnJvbSBcIi4uL2NsZWFuZXJzL3NjcnV0aW5zXCJcbmltcG9ydCB7IGRhdGFzZXRzLCBFbmFibGVkRGF0YXNldHMgfSBmcm9tIFwiLi4vZGF0YXNldHNcIlxuaW1wb3J0IHsgZXhpc3RpbmdEYXRlVG9Kc29uLCBwYXRjaGVkRGF0ZVRvSnNvbiB9IGZyb20gXCIuLi9kYXRlc1wiXG5pbXBvcnQge1xuICBBY3RldXJzRXRPcmdhbmVzLFxuICBDb252ZXJ0IGFzIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LFxufSBmcm9tIFwiLi4vdHlwZXMvYWN0ZXVyc19ldF9vcmdhbmVzXCJcbmltcG9ydCB7IEFnZW5kYXMsIENvbnZlcnQgYXMgQWdlbmRhc0NvbnZlcnQgfSBmcm9tIFwiLi4vdHlwZXMvYWdlbmRhc1wiXG5pbXBvcnQge1xuICBBbWVuZGVtZW50cyxcbiAgQ29udmVydCBhcyBBbWVuZGVtZW50c0NvbnZlcnQsXG59IGZyb20gXCIuLi90eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQge1xuICBEb3NzaWVyc0xlZ2lzbGF0aWZzLFxuICBDb252ZXJ0IGFzIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LFxufSBmcm9tIFwiLi4vdHlwZXMvZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBTY3J1dGluc0NvbnZlcnQsIFNjcnV0aW5zIH0gZnJvbSBcIi4uL3R5cGVzL3NjcnV0aW5zXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFnZW5kYXNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQW1lbmRlbWVudHNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQge1xuICBDb252ZXJ0IGFzIERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0LFxuICBEb3NzaWVyIGFzIERvc3NpZXJSYXcsXG59IGZyb20gXCIuLi9yYXdfdHlwZXMvZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBTY3J1dGluc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL3NjcnV0aW5zXCJcblxuY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICB7XG4gICAgYWxpYXM6IFwia1wiLFxuICAgIGRlZmF1bHRWYWx1ZTogW1wiQWxsXCJdLFxuICAgIGhlbHA6IFwiY2F0ZWdvcmllcyBvZiBkYXRhc2V0cyB0byByZW9yZ2FuaXplXCIsXG4gICAgbXVsdGlwbGU6IHRydWUsXG4gICAgbmFtZTogXCJjYXRlZ29yaWVzXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICBoZWxwOiBcImRpcmVjdG9yeSBjb250YWluaW5nIEFzc2VtYmzDqWUgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG5cbmZ1bmN0aW9uIGNsZWFuRGF0YShkYXRhRGlyOiBzdHJpbmcpOiB2b2lkIHtcbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gcGF0Y2hlZERhdGVUb0pzb25cblxuICBvcHRpb25zLmNhdGVnb3JpZXMubWFwKChkYXRhc2V0TmFtZTogc3RyaW5nKSA9PlxuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICAgIChFbmFibGVkRGF0YXNldHMgYXMgYW55IGFzIHsgW25hbWU6IHN0cmluZ106IEVuYWJsZWREYXRhc2V0cyB9KVtcbiAgICAgICAgZGF0YXNldE5hbWVcbiAgICAgIF0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBgVW5rbm93biBuYW1lIG9mIGRhdGFzZXQ6ICR7ZGF0YXNldE5hbWV9YCxcbiAgICApLFxuICApXG4gIGNvbnN0IGVuYWJsZWREYXRhc2V0cyA9IG9wdGlvbnMuY2F0ZWdvcmllcy5yZWR1Y2UoXG4gICAgKGVuYWJsZWREYXRhc2V0czogRW5hYmxlZERhdGFzZXRzLCBkYXRhc2V0TmFtZTogc3RyaW5nKTogRW5hYmxlZERhdGFzZXRzID0+XG4gICAgICBlbmFibGVkRGF0YXNldHMgfFxuICAgICAgKEVuYWJsZWREYXRhc2V0cyBhcyBhbnkgYXMgeyBbbmFtZTogc3RyaW5nXTogRW5hYmxlZERhdGFzZXRzIH0pW1xuICAgICAgICBkYXRhc2V0TmFtZVxuICAgICAgXSxcbiAgICBFbmFibGVkRGF0YXNldHMuTm9uZSxcbiAgKVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWN0ZXVyc0V0T3JnYW5lcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgICBjb25zdCByYXdKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0LmZpbGVuYW1lKVxuICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtyYXdKc29uRmlsZVBhdGh9YClcbiAgICAgIGNvbnN0IHJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhyYXdKc29uRmlsZVBhdGgsIHtcbiAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgYWN0ZXVyc0V0T3JnYW5lczogYW55ID1cbiAgICAgICAgQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9BY3RldXJzRXRPcmdhbmVzKHJhd0pzb24pXG4gICAgICAvLyBjb25zdCBhY3RldXJzID0ganAucXVlcnkoYWN0ZXVyc0V0T3JnYW5lcywgXCIkLmV4cG9ydC5hY3RldXJzLmFjdGV1clwiKVswXVxuICAgICAgY29uc3Qgb3JnYW5lcyA9IGFjdGV1cnNFdE9yZ2FuZXMuZXhwb3J0Lm9yZ2FuZXMub3JnYW5lXG4gICAgICBhY3RldXJzRXRPcmdhbmVzLm9yZ2FuZXMgPSBvcmdhbmVzXG4gICAgICBjb25zdCBhY3RldXJzID0gYWN0ZXVyc0V0T3JnYW5lcy5leHBvcnQuYWN0ZXVycy5hY3RldXJcbiAgICAgIGFjdGV1cnNFdE9yZ2FuZXMuYWN0ZXVycyA9IGFjdGV1cnNcbiAgICAgIGRlbGV0ZSBhY3RldXJzRXRPcmdhbmVzLmV4cG9ydFxuXG4gICAgICBmb3IgKGNvbnN0IGFjdGV1ciBvZiBhY3RldXJzKSB7XG4gICAgICAgIGNsZWFuQWN0ZXVyKGFjdGV1cilcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBvcmdhbmUgb2Ygb3JnYW5lcykge1xuICAgICAgICBjbGVhbk9yZ2FuZShvcmdhbmUpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdGV1cnNFdE9yZ2FuZXNKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgYWN0ZXVyc0V0T3JnYW5lcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMixcbiAgICAgIClcbiAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgY29uc3QgYWN0ZXVyc0V0T3JnYW5lc0NsZWFuOiBBY3RldXJzRXRPcmdhbmVzID1cbiAgICAgICAgQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9BY3RldXJzRXRPcmdhbmVzKGFjdGV1cnNFdE9yZ2FuZXNKc29uKVxuICAgICAgY29uc3QgYWN0ZXVyc0V0T3JnYW5lc0NsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQuYWN0ZXVyc0V0T3JnYW5lc1RvSnNvbihhY3RldXJzRXRPcmdhbmVzQ2xlYW4pXG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWUuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoanNvbkZpbGVQYXRoLCBhY3RldXJzRXRPcmdhbmVzQ2xlYW5Kc29uLCB7XG4gICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BZ2VuZGFzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFnZW5kYXMpIHtcbiAgICAgIGNvbnN0IHJhd0pzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXQuZmlsZW5hbWUpXG4gICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke3Jhd0pzb25GaWxlUGF0aH1gKVxuICAgICAgY29uc3QgcmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHJhd0pzb25GaWxlUGF0aCwge1xuICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBhZ2VuZGFzOiBhbnkgPSBBZ2VuZGFzUmF3Q29udmVydC50b0FnZW5kYXMocmF3SnNvbilcbiAgICAgIGFnZW5kYXMucmV1bmlvbnMgPSBhZ2VuZGFzLnJldW5pb25zLnJldW5pb25cblxuICAgICAgZm9yIChjb25zdCByZXVuaW9uIG9mIGFnZW5kYXMucmV1bmlvbnMpIHtcbiAgICAgICAgY2xlYW5SZXVuaW9uKHJldW5pb24pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFnZW5kYXNKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShhZ2VuZGFzLCBudWxsLCAyKVxuICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICBjb25zdCBhZ2VuZGFzQ2xlYW46IEFnZW5kYXMgPSBBZ2VuZGFzQ29udmVydC50b0FnZW5kYXMoYWdlbmRhc0pzb24pXG4gICAgICBjb25zdCBhZ2VuZGFzQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICBBZ2VuZGFzQ29udmVydC5hZ2VuZGFzVG9Kc29uKGFnZW5kYXNDbGVhbilcbiAgICAgIGNvbnN0IGpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZS5qc29uXCIpLFxuICAgICAgKVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhqc29uRmlsZVBhdGgsIGFnZW5kYXNDbGVhbkpzb24sIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgICAgY29uc3QgcmF3SnNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldC5maWxlbmFtZSlcbiAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7cmF3SnNvbkZpbGVQYXRofWApXG4gICAgICBjb25zdCByYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMocmF3SnNvbkZpbGVQYXRoLCB7XG4gICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRzOiBhbnkgPSBBbWVuZGVtZW50c1Jhd0NvbnZlcnQudG9BbWVuZGVtZW50cyhyYXdKc29uKVxuICAgICAgYW1lbmRlbWVudHMudGV4dGVzTGVnaXNsYXRpZnMgPSBhbWVuZGVtZW50cy50ZXh0ZXNFdEFtZW5kZW1lbnRzLnRleHRlbGVnXG4gICAgICBkZWxldGUgYW1lbmRlbWVudHMudGV4dGVzRXRBbWVuZGVtZW50c1xuXG4gICAgICBmb3IgKGNvbnN0IHRleHRlTGVnaXNsYXRpZiBvZiBhbWVuZGVtZW50cy50ZXh0ZXNMZWdpc2xhdGlmcykge1xuICAgICAgICBjbGVhblRleHRlTGVnaXNsYXRpZih0ZXh0ZUxlZ2lzbGF0aWYpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRzSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoYW1lbmRlbWVudHMsIG51bGwsIDIpXG4gICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRzQ2xlYW46IEFtZW5kZW1lbnRzID1cbiAgICAgICAgQW1lbmRlbWVudHNDb252ZXJ0LnRvQW1lbmRlbWVudHMoYW1lbmRlbWVudHNKc29uKVxuICAgICAgY29uc3QgYW1lbmRlbWVudHNDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgIEFtZW5kZW1lbnRzQ29udmVydC5hbWVuZGVtZW50c1RvSnNvbihhbWVuZGVtZW50c0NsZWFuKVxuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llLmpzb25cIiksXG4gICAgICApXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGpzb25GaWxlUGF0aCwgYW1lbmRlbWVudHNDbGVhbkpzb24sIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGNvbnN0IHJhd0pzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXQuZmlsZW5hbWUpXG4gICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke3Jhd0pzb25GaWxlUGF0aH1gKVxuICAgICAgY29uc3QgcmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHJhd0pzb25GaWxlUGF0aCwge1xuICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBkb3NzaWVyc0xlZ2lzbGF0aWZzOiBhbnkgPVxuICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydC50b0Rvc3NpZXJzTGVnaXNsYXRpZnMocmF3SnNvbilcbiAgICAgIGRvc3NpZXJzTGVnaXNsYXRpZnMudGV4dGVzTGVnaXNsYXRpZnMgPVxuICAgICAgICBkb3NzaWVyc0xlZ2lzbGF0aWZzLmV4cG9ydC50ZXh0ZXNMZWdpc2xhdGlmcy5kb2N1bWVudFxuICAgICAgZG9zc2llcnNMZWdpc2xhdGlmcy5kb3NzaWVyc1BhcmxlbWVudGFpcmVzID0gKFxuICAgICAgICBkb3NzaWVyc0xlZ2lzbGF0aWZzLmV4cG9ydC5kb3NzaWVyc0xlZ2lzbGF0aWZzLmRvc3NpZXIgYXMgRG9zc2llclJhd1tdXG4gICAgICApLm1hcCgoZG9zc2llcikgPT4gZG9zc2llci5kb3NzaWVyUGFybGVtZW50YWlyZSlcbiAgICAgIGRlbGV0ZSBkb3NzaWVyc0xlZ2lzbGF0aWZzLmV4cG9ydFxuXG4gICAgICBmb3IgKGNvbnN0IGRvY3VtZW50IG9mIGRvc3NpZXJzTGVnaXNsYXRpZnMudGV4dGVzTGVnaXNsYXRpZnMpIHtcbiAgICAgICAgY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24oZG9jdW1lbnQpXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmUgb2YgZG9zc2llcnNMZWdpc2xhdGlmcy5kb3NzaWVyc1BhcmxlbWVudGFpcmVzKSB7XG4gICAgICAgIGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUoZG9zc2llclBhcmxlbWVudGFpcmUpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRvc3NpZXJzTGVnaXNsYXRpZnNKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgZG9zc2llcnNMZWdpc2xhdGlmcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMixcbiAgICAgIClcbiAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgY29uc3QgZG9zc2llcnNMZWdpc2xhdGlmc0NsZWFuOiBEb3NzaWVyc0xlZ2lzbGF0aWZzID1cbiAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb3NzaWVyc0xlZ2lzbGF0aWZzKFxuICAgICAgICAgIGRvc3NpZXJzTGVnaXNsYXRpZnNKc29uLFxuICAgICAgICApXG4gICAgICBjb25zdCBkb3NzaWVyc0xlZ2lzbGF0aWZzQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC5kb3NzaWVyc0xlZ2lzbGF0aWZzVG9Kc29uKFxuICAgICAgICAgIGRvc3NpZXJzTGVnaXNsYXRpZnNDbGVhbixcbiAgICAgICAgKVxuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llLmpzb25cIiksXG4gICAgICApXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGpzb25GaWxlUGF0aCwgZG9zc2llcnNMZWdpc2xhdGlmc0NsZWFuSnNvbiwge1xuICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuU2NydXRpbnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuc2NydXRpbnMpIHtcbiAgICAgIGNvbnN0IHJhd0pzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXQuZmlsZW5hbWUpXG4gICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke3Jhd0pzb25GaWxlUGF0aH1gKVxuICAgICAgY29uc3QgcmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHJhd0pzb25GaWxlUGF0aCwge1xuICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBzY3J1dGluczogYW55ID0gU2NydXRpbnNSYXdDb252ZXJ0LnRvU2NydXRpbnMocmF3SnNvbilcbiAgICAgIHNjcnV0aW5zLnNjcnV0aW5zID0gc2NydXRpbnMuc2NydXRpbnMuc2NydXRpblxuXG4gICAgICBmb3IgKGNvbnN0IHNjcnV0aW4gb2Ygc2NydXRpbnMuc2NydXRpbnMpIHtcbiAgICAgICAgY2xlYW5TY3J1dGluKHNjcnV0aW4pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcnV0aW5zSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoc2NydXRpbnMsIG51bGwsIDIpXG4gICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgIGNvbnN0IHNjcnV0aW5zQ2xlYW46IFNjcnV0aW5zID0gU2NydXRpbnNDb252ZXJ0LnRvU2NydXRpbnMoc2NydXRpbnNKc29uKVxuICAgICAgY29uc3Qgc2NydXRpbnNDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgIFNjcnV0aW5zQ29udmVydC5zY3J1dGluc1RvSnNvbihzY3J1dGluc0NsZWFuKVxuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llLmpzb25cIiksXG4gICAgICApXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGpzb25GaWxlUGF0aCwgc2NydXRpbnNDbGVhbkpzb24sIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdG9yZSBzdGFuZGFyZCBjb252ZXJzaW9uIG9mIGRhdGVzIHRvIEpTT04uXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGV4aXN0aW5nRGF0ZVRvSnNvblxufVxuXG5jbGVhbkRhdGEob3B0aW9ucy5kYXRhRGlyKVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxNQUFQLE1BQW1CLFFBQW5CO0FBQ0EsT0FBT0MsZUFBUCxNQUE0QixtQkFBNUI7QUFDQSxPQUFPQyxFQUFQLE1BQWUsSUFBZjtBQUNBLE9BQU9DLElBQVAsTUFBaUIsTUFBakI7U0FFU0MsVztTQUNBQyxvQjtTQUNBQyx1QjtTQUNBQyx5QjtTQUNBQyxXO1NBQ0FDLFk7U0FDQUMsWTtTQUNBQyxRLEVB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
|