@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.
Files changed (135) hide show
  1. package/README.md +2 -0
  2. package/lib/api.js +23 -7
  3. package/lib/api.mjs +41 -0
  4. package/lib/bugs/acteur-00010/plugin.test.js +139 -33
  5. package/lib/bugs/acteur-00010/plugin.test.mjs +33 -0
  6. package/lib/bugs/acteur-00010.js +166 -24
  7. package/lib/bugs/acteur-00010.mjs +31 -0
  8. package/lib/bugs/agenda-00002/plugin.test.js +178 -52
  9. package/lib/bugs/agenda-00002/plugin.test.mjs +52 -0
  10. package/lib/bugs/agenda-00002.js +507 -143
  11. package/lib/bugs/agenda-00002.mjs +197 -0
  12. package/lib/bugs/agenda-00008/plugin.test.js +143 -31
  13. package/lib/bugs/agenda-00008/plugin.test.mjs +31 -0
  14. package/lib/bugs/agenda-00008.js +180 -25
  15. package/lib/bugs/agenda-00008.mjs +30 -0
  16. package/lib/bugs/agenda-00011/plugin.test.js +371 -156
  17. package/lib/bugs/agenda-00011/plugin.test.mjs +156 -0
  18. package/lib/bugs/agenda-00011.js +416 -117
  19. package/lib/bugs/agenda-00011.mjs +150 -0
  20. package/lib/bugs.js +591 -54
  21. package/lib/bugs.mjs +93 -0
  22. package/lib/cleaners/actes_legislatifs.js +149 -61
  23. package/lib/cleaners/actes_legislatifs.mjs +311 -0
  24. package/lib/cleaners/acteurs.js +255 -123
  25. package/lib/cleaners/acteurs.mjs +211 -0
  26. package/lib/cleaners/amendements.js +242 -117
  27. package/lib/cleaners/amendements.mjs +292 -0
  28. package/lib/cleaners/documents.js +147 -62
  29. package/lib/cleaners/documents.mjs +162 -0
  30. package/lib/cleaners/dossiers_legislatifs.js +132 -45
  31. package/lib/cleaners/dossiers_legislatifs.mjs +123 -0
  32. package/lib/cleaners/index.js +64 -8
  33. package/lib/cleaners/index.mjs +8 -0
  34. package/lib/cleaners/organes.js +54 -21
  35. package/lib/cleaners/organes.mjs +64 -0
  36. package/lib/cleaners/reunions.js +237 -127
  37. package/lib/cleaners/reunions.mjs +318 -0
  38. package/lib/cleaners/scrutins.js +261 -99
  39. package/lib/cleaners/scrutins.mjs +254 -0
  40. package/lib/cleaners/xml.js +81 -16
  41. package/lib/cleaners/xml.mjs +42 -0
  42. package/lib/datasets.js +284 -153
  43. package/lib/datasets.mjs +596 -0
  44. package/lib/dates.js +93 -34
  45. package/lib/dates.mjs +98 -0
  46. package/lib/dossiers_legislatifs.js +107 -33
  47. package/lib/dossiers_legislatifs.mjs +215 -0
  48. package/lib/file_systems.js +203 -35
  49. package/lib/file_systems.mjs +64 -0
  50. package/lib/git.js +139 -41
  51. package/lib/git.mjs +114 -0
  52. package/lib/index.js +310 -16
  53. package/lib/index.mjs +16 -0
  54. package/lib/inserters.js +355 -131
  55. package/lib/inserters.mjs +413 -0
  56. package/lib/loaders.js +900 -440
  57. package/lib/loaders.mjs +678 -0
  58. package/lib/organes.js +15 -5
  59. package/lib/organes.mjs +18 -0
  60. package/lib/parsers/documents.js +241 -89
  61. package/lib/parsers/documents.mjs +433 -0
  62. package/lib/parsers/index.js +36 -3
  63. package/lib/parsers/index.mjs +3 -0
  64. package/lib/parsers/recherche_amendements.js +616 -173
  65. package/lib/parsers/recherche_amendements.mjs +189 -0
  66. package/lib/raw_types/acteurs_et_organes.d.ts +36 -148
  67. package/lib/raw_types/acteurs_et_organes.js +228 -506
  68. package/lib/raw_types/acteurs_et_organes.mjs +1240 -0
  69. package/lib/raw_types/agendas.js +165 -75
  70. package/lib/raw_types/agendas.mjs +944 -0
  71. package/lib/raw_types/amendements.js +165 -77
  72. package/lib/raw_types/amendements.mjs +1040 -0
  73. package/lib/raw_types/dossiers_legislatifs.d.ts +1 -43
  74. package/lib/raw_types/dossiers_legislatifs.js +181 -143
  75. package/lib/raw_types/dossiers_legislatifs.mjs +1792 -0
  76. package/lib/raw_types/scrutins.js +144 -61
  77. package/lib/raw_types/scrutins.mjs +645 -0
  78. package/lib/scripts/bugs_helper.js +657 -155
  79. package/lib/scripts/bugs_helper.mjs +286 -0
  80. package/lib/scripts/clean_data.js +380 -145
  81. package/lib/scripts/clean_data.mjs +190 -0
  82. package/lib/scripts/clean_reorganized_data.js +627 -331
  83. package/lib/scripts/clean_reorganized_data.mjs +520 -0
  84. package/lib/scripts/diff_amendements.js +159 -73
  85. package/lib/scripts/diff_amendements.mjs +234 -0
  86. package/lib/scripts/document_dossiers_legislatifs.js +570 -288
  87. package/lib/scripts/document_dossiers_legislatifs.mjs +494 -0
  88. package/lib/scripts/get_today_reunions.js +37 -20
  89. package/lib/scripts/get_today_reunions.mjs +41 -0
  90. package/lib/scripts/merge_scrutins.js +121 -39
  91. package/lib/scripts/merge_scrutins.mjs +69 -0
  92. package/lib/scripts/parse_textes_lois.js +179 -125
  93. package/lib/scripts/parse_textes_lois.mjs +215 -0
  94. package/lib/scripts/raw_types_from_amendements.js +276 -77
  95. package/lib/scripts/raw_types_from_amendements.mjs +118 -0
  96. package/lib/scripts/reorganize_data.js +867 -446
  97. package/lib/scripts/reorganize_data.mjs +712 -0
  98. package/lib/scripts/retrieve_deputes_photos.js +378 -157
  99. package/lib/scripts/retrieve_deputes_photos.mjs +230 -0
  100. package/lib/scripts/retrieve_documents.js +648 -172
  101. package/lib/scripts/retrieve_documents.mjs +292 -0
  102. package/lib/scripts/retrieve_open_data.js +286 -85
  103. package/lib/scripts/retrieve_open_data.mjs +125 -0
  104. package/lib/scripts/retrieve_pending_amendments.js +302 -69
  105. package/lib/scripts/retrieve_pending_amendments.mjs +130 -0
  106. package/lib/scripts/retrieve_senateurs_photos.js +374 -198
  107. package/lib/scripts/retrieve_senateurs_photos.mjs +277 -0
  108. package/lib/scripts/retrieve_textes_lois.js +343 -89
  109. package/lib/scripts/retrieve_textes_lois.mjs +168 -0
  110. package/lib/scripts/test_load.js +30 -11
  111. package/lib/scripts/test_load.mjs +26 -0
  112. package/lib/scripts/test_load_big_files.js +30 -11
  113. package/lib/scripts/test_load_big_files.mjs +26 -0
  114. package/lib/scripts/validate_json.js +370 -120
  115. package/lib/scripts/validate_json.mjs +216 -0
  116. package/lib/shared_types/codes_actes.js +50 -15
  117. package/lib/shared_types/codes_actes.mjs +228 -0
  118. package/lib/strings.js +16 -3
  119. package/lib/strings.mjs +7 -0
  120. package/lib/types/acteurs_et_organes.js +156 -71
  121. package/lib/types/acteurs_et_organes.mjs +918 -0
  122. package/lib/types/agendas.js +154 -67
  123. package/lib/types/agendas.mjs +623 -0
  124. package/lib/types/amendements.js +166 -77
  125. package/lib/types/amendements.mjs +885 -0
  126. package/lib/types/dossiers_legislatifs.d.ts +1 -42
  127. package/lib/types/dossiers_legislatifs.js +182 -143
  128. package/lib/types/dossiers_legislatifs.mjs +1120 -0
  129. package/lib/types/legislatures.js +12 -3
  130. package/lib/types/legislatures.mjs +9 -0
  131. package/lib/types/scrutins.js +144 -61
  132. package/lib/types/scrutins.mjs +528 -0
  133. package/lib/urls.js +44 -25
  134. package/lib/urls.mjs +201 -0
  135. package/package.json +33 -12
@@ -0,0 +1,712 @@
1
+ import assert from "assert";
2
+ import { execSync } from "child_process";
3
+ import commandLineArgs from "command-line-args";
4
+ import fs from "fs-extra";
5
+ import path from "path";
6
+ import { datasets, DatasetStructure, EnabledDatasets } from "../datasets.mjs";
7
+ import { existingDateToJson, patchedDateToJson } from "../dates.mjs";
8
+ import { walkDir } from "../file_systems.mjs";
9
+ import { pathFromDocumentUid, pathFromDossierParlementaireUid, 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
+ const optionsDefinitions = [{
16
+ alias: "C",
17
+ help: "clone repositories from given group (or organization) git URL",
18
+ name: "clone",
19
+ type: String
20
+ }, {
21
+ alias: "c",
22
+ help: "commit split files",
23
+ name: "commit",
24
+ type: Boolean
25
+ }, {
26
+ alias: "k",
27
+ defaultValue: ["All"],
28
+ help: "categories of datasets to reorganize",
29
+ multiple: true,
30
+ name: "categories",
31
+ type: String
32
+ }, {
33
+ alias: "r",
34
+ help: "push commit to given remote",
35
+ multiple: true,
36
+ name: "remote",
37
+ type: String
38
+ }, {
39
+ alias: "s",
40
+ help: "don't log anything",
41
+ name: "silent",
42
+ type: Boolean
43
+ }, {
44
+ alias: "V",
45
+ help: "don't validate raw data",
46
+ name: "no-validate-raw",
47
+ type: Boolean
48
+ }, {
49
+ alias: "v",
50
+ help: "verbose logs",
51
+ name: "verbose",
52
+ type: Boolean
53
+ }, {
54
+ defaultOption: true,
55
+ help: "directory containing Assemblée open data files",
56
+ name: "dataDir",
57
+ type: String
58
+ }];
59
+
60
+ function commitAndPush(repositoryDir, commit, remotes) {
61
+ let error = false;
62
+
63
+ if (commit) {
64
+ execSync(`git add .`, {
65
+ cwd: repositoryDir,
66
+ env: process.env,
67
+ encoding: "utf-8",
68
+ stdio: ["ignore", "ignore", "pipe"]
69
+ });
70
+
71
+ try {
72
+ execSync('git commit -m "Nouvelle moisson"', {
73
+ cwd: repositoryDir,
74
+ env: process.env,
75
+ encoding: "utf-8"
76
+ });
77
+ } catch (childProcess) {
78
+ if (childProcess.stderr === null || !/nothing to commit/.test(childProcess.stdout)) {
79
+ console.error(childProcess.output);
80
+ throw childProcess;
81
+ }
82
+ }
83
+
84
+ for (const remote of remotes || []) {
85
+ try {
86
+ execSync(`git push ${remote} master`, {
87
+ cwd: repositoryDir,
88
+ env: process.env,
89
+ encoding: "utf-8",
90
+ stdio: ["ignore", "ignore", "pipe"]
91
+ });
92
+ } catch (childProcess) {
93
+ // Don't stop when push fails.
94
+ console.error(childProcess.output);
95
+ error = true;
96
+ }
97
+ }
98
+ }
99
+
100
+ return error;
101
+ }
102
+
103
+ function reorganizeData(options) {
104
+ const dataDir = options.dataDir;
105
+ Date.prototype.toJSON = patchedDateToJson;
106
+ let error = false;
107
+ const gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined;
108
+ const validateRawData = !options["no-validate-raw"];
109
+ options.categories.map(datasetName => assert.notStrictEqual(EnabledDatasets[datasetName], undefined, `Unknown name of dataset: ${datasetName}`));
110
+ const enabledDatasets = options.categories.reduce((enabledDatasets, datasetName) => enabledDatasets | EnabledDatasets[datasetName], EnabledDatasets.None);
111
+
112
+ if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
113
+ for (const dataset of datasets.acteursEtOrganes) {
114
+ const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
115
+
116
+ if (!options.silent) {
117
+ console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
118
+ }
119
+
120
+ const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
121
+
122
+ if (gitGroupUrl !== undefined) {
123
+ execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
124
+ cwd: dataDir,
125
+ env: process.env,
126
+ encoding: "utf-8",
127
+ stdio: ["ignore", "ignore", "pipe"]
128
+ });
129
+ }
130
+
131
+ const datasetReorganizedDir = path.join(dataDir, datasetName);
132
+ fs.ensureDirSync(datasetReorganizedDir);
133
+
134
+ for (const filename of fs.readdirSync(datasetReorganizedDir)) {
135
+ if (filename[0] === ".") {
136
+ continue;
137
+ }
138
+
139
+ fs.removeSync(path.join(datasetReorganizedDir, filename));
140
+ }
141
+
142
+ const acteursReorganizedDir = path.join(datasetReorganizedDir, "acteurs");
143
+ fs.mkdirSync(acteursReorganizedDir);
144
+ const organesReorganizedDir = path.join(datasetReorganizedDir, "organes");
145
+ fs.mkdirSync(organesReorganizedDir);
146
+
147
+ switch (dataset.structure) {
148
+ case DatasetStructure.SingleFile:
149
+ {
150
+ const originalJson = fs.readFileSync(originalJsonDirectoryOrFilePath, {
151
+ encoding: "utf8"
152
+ });
153
+ const originalData = validateRawData ? ActeursEtOrganesRawConvert.toActeursEtOrganes(originalJson) : JSON.parse(originalJson);
154
+
155
+ for (const acteur of originalData.export.acteurs.acteur) {
156
+ const reorganizedJsonFilePath = path.join(acteursReorganizedDir, acteur.uid["#text"] + ".json");
157
+ fs.writeFileSync(reorganizedJsonFilePath, JSON.stringify(acteur, null, 2), {
158
+ encoding: "utf8"
159
+ });
160
+ }
161
+
162
+ for (const organe of originalData.export.organes.organe) {
163
+ const reorganizedJsonFilePath = path.join(organesReorganizedDir, organe.uid + ".json");
164
+ fs.writeFileSync(reorganizedJsonFilePath, JSON.stringify(organe, null, 2), {
165
+ encoding: "utf8"
166
+ });
167
+ }
168
+ }
169
+ break;
170
+
171
+ case DatasetStructure.SegmentedFiles:
172
+ {
173
+ const deportsByActeurUid = {};
174
+
175
+ if (fs.existsSync(path.join(originalJsonDirectoryOrFilePath, "deport"))) {
176
+ for (const deportSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["deport"])) {
177
+ const deportFilename = deportSplitPath[deportSplitPath.length - 1];
178
+
179
+ if (!deportFilename.endsWith(".json")) {
180
+ continue;
181
+ }
182
+
183
+ const deportOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...deportSplitPath);
184
+
185
+ if (options.verbose) {
186
+ console.log(` Loading "deport" file: ${deportOriginalFilePath}…`);
187
+ }
188
+
189
+ const deportOriginalJson = fs.readFileSync(deportOriginalFilePath, {
190
+ encoding: "utf8"
191
+ });
192
+ const deportOriginal = validateRawData ? ActeursEtOrganesRawConvert.toDeport(deportOriginalJson) : JSON.parse(deportOriginalJson);
193
+ const deport = deportOriginal.deport;
194
+ let deports = deportsByActeurUid[deport.acteurRef];
195
+
196
+ if (deports === undefined) {
197
+ deports = deportsByActeurUid[deport.acteurRef] = [];
198
+ }
199
+
200
+ deports.push(deport);
201
+ }
202
+
203
+ for (const deports of Object.values(deportsByActeurUid)) {
204
+ deports.sort((a, b) => a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length);
205
+ }
206
+ }
207
+
208
+ const mandatsByActeurUid = {};
209
+
210
+ if (fs.existsSync(path.join(originalJsonDirectoryOrFilePath, "mandat"))) {
211
+ for (const mandatSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["mandat"])) {
212
+ const mandatFilename = mandatSplitPath[mandatSplitPath.length - 1];
213
+
214
+ if (!mandatFilename.endsWith(".json")) {
215
+ continue;
216
+ }
217
+
218
+ const mandatOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...mandatSplitPath);
219
+
220
+ if (options.verbose) {
221
+ console.log(` Loading "mandat" file: ${mandatOriginalFilePath}…`);
222
+ }
223
+
224
+ const mandatOriginalJson = fs.readFileSync(mandatOriginalFilePath, {
225
+ encoding: "utf8"
226
+ });
227
+ const mandatOriginal = validateRawData ? ActeursEtOrganesRawConvert.toMandatWrapper(mandatOriginalJson) : JSON.parse(mandatOriginalJson);
228
+ const mandat = mandatOriginal.mandat;
229
+ let mandats = mandatsByActeurUid[mandat.acteurRef];
230
+
231
+ if (mandats === undefined) {
232
+ mandats = mandatsByActeurUid[mandat.acteurRef] = [];
233
+ }
234
+
235
+ mandats.push(mandat);
236
+ }
237
+
238
+ for (const mandats of Object.values(mandatsByActeurUid)) {
239
+ mandats.sort((a, b) => a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length);
240
+ }
241
+ }
242
+
243
+ for (const acteurSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["acteur"])) {
244
+ const acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
245
+
246
+ if (!acteurFilename.endsWith(".json")) {
247
+ continue;
248
+ }
249
+
250
+ const acteurOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...acteurSplitPath);
251
+
252
+ if (options.verbose) {
253
+ console.log(` Reorganizing "acteur" file: ${acteurOriginalFilePath}…`);
254
+ }
255
+
256
+ const acteurOriginalJson = fs.readFileSync(acteurOriginalFilePath, {
257
+ encoding: "utf8"
258
+ });
259
+ const acteurOriginal = validateRawData ? ActeursEtOrganesRawConvert.toActeur(acteurOriginalJson) : JSON.parse(acteurOriginalJson);
260
+ const acteur = acteurOriginal.acteur;
261
+ const acteurUid = acteur.uid["#text"];
262
+ const deports = deportsByActeurUid[acteurUid];
263
+
264
+ if (deports !== undefined) {
265
+ assert.strictEqual(acteur.deports, undefined);
266
+ acteur.deports = {
267
+ deport: deports
268
+ };
269
+ }
270
+
271
+ const mandats = mandatsByActeurUid[acteurUid];
272
+
273
+ if (mandats !== undefined) {
274
+ assert.strictEqual(acteur.mandats, undefined);
275
+ acteur.mandats = {
276
+ mandat: mandats
277
+ };
278
+ }
279
+
280
+ const acteurReorganizedJsonFilePath = path.join(acteursReorganizedDir, acteurUid + ".json");
281
+ fs.writeFileSync(acteurReorganizedJsonFilePath, JSON.stringify(acteur, null, 2), {
282
+ encoding: "utf8"
283
+ });
284
+ }
285
+
286
+ for (const organeSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["organe"])) {
287
+ const organeFilename = organeSplitPath[organeSplitPath.length - 1];
288
+
289
+ if (!organeFilename.endsWith(".json")) {
290
+ continue;
291
+ }
292
+
293
+ const organeOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...organeSplitPath);
294
+
295
+ if (options.verbose) {
296
+ console.log(` Reorganizing "organe" file: ${organeOriginalFilePath}…`);
297
+ }
298
+
299
+ const organeOriginalJson = fs.readFileSync(organeOriginalFilePath, {
300
+ encoding: "utf8"
301
+ });
302
+ const organeOriginal = validateRawData ? ActeursEtOrganesRawConvert.toOrgane(organeOriginalJson) : JSON.parse(organeOriginalJson);
303
+ const organe = organeOriginal.organe;
304
+ const organeReorganizedJsonFilePath = path.join(organesReorganizedDir, organe.uid + ".json");
305
+ fs.writeFileSync(organeReorganizedJsonFilePath, JSON.stringify(organe, null, 2), {
306
+ encoding: "utf8"
307
+ });
308
+ }
309
+ }
310
+ break;
311
+ }
312
+
313
+ if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
314
+ error = true;
315
+ }
316
+ }
317
+ }
318
+
319
+ if (enabledDatasets & EnabledDatasets.Agendas) {
320
+ for (const dataset of datasets.agendas) {
321
+ const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
322
+
323
+ if (!options.silent) {
324
+ console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
325
+ }
326
+
327
+ const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
328
+
329
+ if (gitGroupUrl !== undefined) {
330
+ execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
331
+ cwd: dataDir,
332
+ env: process.env,
333
+ encoding: "utf-8",
334
+ stdio: ["ignore", "ignore", "pipe"]
335
+ });
336
+ }
337
+
338
+ const datasetReorganizedDir = path.join(dataDir, datasetName);
339
+ fs.ensureDirSync(datasetReorganizedDir);
340
+
341
+ for (const filename of fs.readdirSync(datasetReorganizedDir)) {
342
+ if (filename[0] === ".") {
343
+ continue;
344
+ }
345
+
346
+ fs.removeSync(path.join(datasetReorganizedDir, filename));
347
+ }
348
+
349
+ switch (dataset.structure) {
350
+ case DatasetStructure.SingleFile:
351
+ {
352
+ const originalJson = fs.readFileSync(originalJsonDirectoryOrFilePath, {
353
+ encoding: "utf8"
354
+ });
355
+ const originalData = validateRawData ? AgendasRawConvert.toAgendas(originalJson) : JSON.parse(originalJson);
356
+
357
+ for (const reunion of originalData.reunions.reunion) {
358
+ writeReunionReorganizedJson(datasetReorganizedDir, reunion);
359
+ }
360
+ }
361
+ break;
362
+
363
+ case DatasetStructure.SegmentedFiles:
364
+ {
365
+ for (const reunionSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["reunion"])) {
366
+ const reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
367
+
368
+ if (!reunionFilename.endsWith(".json")) {
369
+ continue;
370
+ }
371
+
372
+ const reunionOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...reunionSplitPath);
373
+
374
+ if (options.verbose) {
375
+ console.log(` Reorganizing "reunion" file: ${reunionOriginalFilePath}…`);
376
+ }
377
+
378
+ const reunionOriginalJson = fs.readFileSync(reunionOriginalFilePath, {
379
+ encoding: "utf8"
380
+ });
381
+ const reunionOriginal = validateRawData ? AgendasRawConvert.toReunion(reunionOriginalJson) : JSON.parse(reunionOriginalJson);
382
+ const reunion = reunionOriginal.reunion;
383
+ writeReunionReorganizedJson(datasetReorganizedDir, reunion);
384
+ }
385
+ }
386
+ break;
387
+ }
388
+
389
+ if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
390
+ error = true;
391
+ }
392
+ }
393
+ }
394
+
395
+ if (enabledDatasets & EnabledDatasets.Amendements) {
396
+ for (const dataset of datasets.amendements) {
397
+ const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
398
+
399
+ if (!options.silent) {
400
+ console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
401
+ }
402
+
403
+ const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
404
+
405
+ if (gitGroupUrl !== undefined) {
406
+ execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
407
+ cwd: dataDir,
408
+ env: process.env,
409
+ encoding: "utf-8",
410
+ stdio: ["ignore", "ignore", "pipe"]
411
+ });
412
+ }
413
+
414
+ const datasetReorganizedDir = path.join(dataDir, datasetName);
415
+ fs.ensureDirSync(datasetReorganizedDir);
416
+
417
+ for (const filename of fs.readdirSync(datasetReorganizedDir)) {
418
+ if (filename[0] === ".") {
419
+ continue;
420
+ }
421
+
422
+ fs.removeSync(path.join(datasetReorganizedDir, filename));
423
+ }
424
+
425
+ switch (dataset.structure) {
426
+ case DatasetStructure.SingleFile:
427
+ {
428
+ const originalJson = fs.readFileSync(originalJsonDirectoryOrFilePath, {
429
+ encoding: "utf8"
430
+ });
431
+ const originalData = validateRawData ? AmendementsRawConvert.toAmendements(originalJson) : JSON.parse(originalJson);
432
+
433
+ for (const texteLegislatif of originalData.textesEtAmendements.texteleg) {
434
+ for (const amendement of texteLegislatif.amendements) {
435
+ writeAmendementReorganizedJson(datasetReorganizedDir, amendement);
436
+ }
437
+ }
438
+ }
439
+ break;
440
+
441
+ case DatasetStructure.SegmentedFiles:
442
+ {
443
+ for (const amendementSplitPath of walkDir(originalJsonDirectoryOrFilePath)) {
444
+ const amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
445
+
446
+ if (!amendementFilename.endsWith(".json")) {
447
+ continue;
448
+ }
449
+
450
+ const amendementOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...amendementSplitPath);
451
+
452
+ if (options.verbose) {
453
+ console.log(` Reorganizing "amendement" file: ${amendementOriginalFilePath}…`);
454
+ }
455
+
456
+ const amendementOriginalJson = fs.readFileSync(amendementOriginalFilePath, {
457
+ encoding: "utf8"
458
+ });
459
+ const amendementOriginal = validateRawData ? AmendementsRawConvert.toAmendementWrapper(amendementOriginalJson) : JSON.parse(amendementOriginalJson);
460
+ const amendement = amendementOriginal.amendement;
461
+ writeAmendementReorganizedJson(datasetReorganizedDir, amendement);
462
+ }
463
+ }
464
+ break;
465
+ }
466
+
467
+ if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
468
+ error = true;
469
+ }
470
+ }
471
+ }
472
+
473
+ if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
474
+ for (const dataset of datasets.dossiersLegislatifs) {
475
+ const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
476
+
477
+ if (!options.silent) {
478
+ console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
479
+ }
480
+
481
+ const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
482
+
483
+ if (gitGroupUrl !== undefined) {
484
+ execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
485
+ cwd: dataDir,
486
+ env: process.env,
487
+ encoding: "utf-8",
488
+ stdio: ["ignore", "ignore", "pipe"]
489
+ });
490
+ }
491
+
492
+ const datasetReorganizedDir = path.join(dataDir, datasetName);
493
+ fs.ensureDirSync(datasetReorganizedDir);
494
+
495
+ for (const filename of fs.readdirSync(datasetReorganizedDir)) {
496
+ if (filename[0] === ".") {
497
+ continue;
498
+ }
499
+
500
+ fs.removeSync(path.join(datasetReorganizedDir, filename));
501
+ }
502
+
503
+ const documentsDir = path.join(datasetReorganizedDir, "documents");
504
+ fs.mkdirSync(documentsDir);
505
+ const dossiersDir = path.join(datasetReorganizedDir, "dossiers");
506
+ fs.mkdirSync(dossiersDir);
507
+
508
+ switch (dataset.structure) {
509
+ case DatasetStructure.SingleFile:
510
+ {
511
+ const originalJson = fs.readFileSync(originalJsonDirectoryOrFilePath, {
512
+ encoding: "utf8"
513
+ });
514
+ const originalData = validateRawData ? DossiersLegislatifsRawConvert.toDossiersLegislatifs(originalJson) : JSON.parse(originalJson);
515
+
516
+ for (const document of originalData.export.textesLegislatifs.document) {
517
+ writeDocumentReorganizedJson(documentsDir, document);
518
+ }
519
+
520
+ for (const {
521
+ dossierParlementaire
522
+ } of originalData.export.dossiersLegislatifs.dossier) {
523
+ writeDossierParlementaireReorganizedJson(dossiersDir, dossierParlementaire);
524
+ }
525
+ }
526
+ break;
527
+
528
+ case DatasetStructure.SegmentedFiles:
529
+ {
530
+ for (const documentSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["document"])) {
531
+ const documentFilename = documentSplitPath[documentSplitPath.length - 1];
532
+
533
+ if (!documentFilename.endsWith(".json")) {
534
+ continue;
535
+ }
536
+
537
+ const documentOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...documentSplitPath);
538
+
539
+ if (options.verbose) {
540
+ console.log(` Reorganizing "document" file: ${documentOriginalFilePath}…`);
541
+ }
542
+
543
+ const documentOriginalJson = fs.readFileSync(documentOriginalFilePath, {
544
+ encoding: "utf8"
545
+ });
546
+ const documentOriginal = validateRawData ? DossiersLegislatifsRawConvert.toDocument(documentOriginalJson) : JSON.parse(documentOriginalJson);
547
+ const document = documentOriginal.document;
548
+ writeDocumentReorganizedJson(documentsDir, document);
549
+ }
550
+
551
+ for (const dossierParlementaireSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["dossierParlementaire"])) {
552
+ const dossierParlementaireFilename = dossierParlementaireSplitPath[dossierParlementaireSplitPath.length - 1];
553
+
554
+ if (!dossierParlementaireFilename.endsWith(".json")) {
555
+ continue;
556
+ }
557
+
558
+ const dossierParlementaireOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...dossierParlementaireSplitPath);
559
+
560
+ if (options.verbose) {
561
+ console.log(` Reorganizing "dossierParlementaire" file: ${dossierParlementaireOriginalFilePath}…`);
562
+ }
563
+
564
+ const dossierParlementaireOriginalJson = fs.readFileSync(dossierParlementaireOriginalFilePath, {
565
+ encoding: "utf8"
566
+ });
567
+ const dossierParlementaireOriginal = validateRawData ? DossiersLegislatifsRawConvert.toDossierParlementaire(dossierParlementaireOriginalJson) : JSON.parse(dossierParlementaireOriginalJson);
568
+ const dossierParlementaire = dossierParlementaireOriginal.dossierParlementaire;
569
+ writeDossierParlementaireReorganizedJson(dossiersDir, dossierParlementaire);
570
+ }
571
+ }
572
+ break;
573
+ }
574
+
575
+ if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
576
+ error = true;
577
+ }
578
+ }
579
+ }
580
+
581
+ if (enabledDatasets & EnabledDatasets.Scrutins) {
582
+ for (const dataset of datasets.scrutins) {
583
+ const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
584
+
585
+ if (!options.silent) {
586
+ console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
587
+ }
588
+
589
+ const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
590
+
591
+ if (gitGroupUrl !== undefined) {
592
+ execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
593
+ cwd: dataDir,
594
+ env: process.env,
595
+ encoding: "utf-8",
596
+ stdio: ["ignore", "ignore", "pipe"]
597
+ });
598
+ }
599
+
600
+ const datasetReorganizedDir = path.join(dataDir, datasetName);
601
+ fs.ensureDirSync(datasetReorganizedDir);
602
+
603
+ for (const filename of fs.readdirSync(datasetReorganizedDir)) {
604
+ if (filename[0] === ".") {
605
+ continue;
606
+ }
607
+
608
+ fs.removeSync(path.join(datasetReorganizedDir, filename));
609
+ }
610
+
611
+ switch (dataset.structure) {
612
+ case DatasetStructure.SingleFile:
613
+ {
614
+ const originalJson = fs.readFileSync(originalJsonDirectoryOrFilePath, {
615
+ encoding: "utf8"
616
+ });
617
+ const originalData = validateRawData ? ScrutinsRawConvert.toScrutins(originalJson) : JSON.parse(originalJson);
618
+
619
+ for (const scrutin of originalData.scrutins.scrutin) {
620
+ writeScrutinReorganizedJson(datasetReorganizedDir, scrutin);
621
+ }
622
+ }
623
+ break;
624
+
625
+ case DatasetStructure.SegmentedFiles:
626
+ {
627
+ for (const scrutinSplitPath of walkDir(originalJsonDirectoryOrFilePath)) {
628
+ const scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
629
+
630
+ if (!scrutinFilename.endsWith(".json")) {
631
+ continue;
632
+ }
633
+
634
+ const scrutinOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...scrutinSplitPath);
635
+
636
+ if (options.verbose) {
637
+ console.log(` Reorganizing "scrutin" file: ${scrutinOriginalFilePath}…`);
638
+ }
639
+
640
+ const scrutinOriginalJson = fs.readFileSync(scrutinOriginalFilePath, {
641
+ encoding: "utf8"
642
+ });
643
+ const scrutinOriginal = validateRawData ? ScrutinsRawConvert.toScrutinWrapper(scrutinOriginalJson) : JSON.parse(scrutinOriginalJson);
644
+ const scrutin = scrutinOriginal.scrutin;
645
+ writeScrutinReorganizedJson(datasetReorganizedDir, scrutin);
646
+ }
647
+ }
648
+ break;
649
+ }
650
+
651
+ if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
652
+ error = true;
653
+ }
654
+ }
655
+ } // Restore standard conversion of dates to JSON.
656
+
657
+
658
+ Date.prototype.toJSON = existingDateToJson;
659
+ return error;
660
+ }
661
+
662
+ function writeAmendementReorganizedJson(datasetReorganizedDir, amendement) {
663
+ const uidTexteLegislatif = amendement.texteLegislatifRef;
664
+ assert.notStrictEqual(uidTexteLegislatif, undefined);
665
+ const texteLegislatifDir = path.join(datasetReorganizedDir, uidTexteLegislatif);
666
+ fs.ensureDirSync(texteLegislatifDir);
667
+ const reorganizedJsonFilePath = path.join(texteLegislatifDir, amendement.uid + ".json");
668
+ fs.writeFileSync(reorganizedJsonFilePath, JSON.stringify(amendement, null, 2), {
669
+ encoding: "utf8"
670
+ });
671
+ }
672
+
673
+ function writeDocumentReorganizedJson(documentsDir, document) {
674
+ const basename = pathFromDocumentUid(documentsDir, document.uid);
675
+ fs.writeFileSync(`${basename}.json`, JSON.stringify(document, null, 2), {
676
+ encoding: "utf8"
677
+ });
678
+ }
679
+
680
+ function writeDossierParlementaireReorganizedJson(dossiersDir, dossierParlementaire) {
681
+ const basename = pathFromDossierParlementaireUid(dossiersDir, dossierParlementaire.uid);
682
+ fs.writeFileSync(`${basename}.json`, JSON.stringify(dossierParlementaire, null, 2), {
683
+ encoding: "utf8"
684
+ });
685
+ }
686
+
687
+ function writeReunionReorganizedJson(reunionsDir, reunion) {
688
+ const basename = pathFromReunionUid(reunionsDir, reunion.uid);
689
+ fs.writeFileSync(`${basename}.json`, JSON.stringify(reunion, null, 2), {
690
+ encoding: "utf8"
691
+ });
692
+ }
693
+
694
+ function writeScrutinReorganizedJson(scrutinsDir, scrutin) {
695
+ const basename = pathFromScrutinUid(scrutinsDir, scrutin.uid);
696
+ fs.writeFileSync(`${basename}.json`, JSON.stringify(scrutin, null, 2), {
697
+ encoding: "utf8"
698
+ });
699
+ }
700
+ /* istanbul ignore if */
701
+
702
+
703
+ if (process.argv[1].endsWith("reorganize_data.ts")) {
704
+ const options = commandLineArgs(optionsDefinitions);
705
+
706
+ if (reorganizeData(options)) {
707
+ process.exit(1);
708
+ } else {
709
+ process.exit(0);
710
+ }
711
+ }
712
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImRhdGFzZXRzIiwiRGF0YXNldFN0cnVjdHVyZSIsIkVuYWJsZWREYXRhc2V0cyIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInBhdGNoZWREYXRlVG9Kc29uIiwid2Fsa0RpciIsInBhdGhGcm9tRG9jdW1lbnRVaWQiLCJwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkIiwicGF0aEZyb21SZXVuaW9uVWlkIiwicGF0aEZyb21TY3J1dGluVWlkIiwiQ29udmVydCIsIkFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0IiwiQWdlbmRhc1Jhd0NvbnZlcnQiLCJBbWVuZGVtZW50c1Jhd0NvbnZlcnQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydCIsIlNjcnV0aW5zUmF3Q29udmVydCIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImFsaWFzIiwiaGVscCIsIm5hbWUiLCJ0eXBlIiwiU3RyaW5nIiwiQm9vbGVhbiIsImRlZmF1bHRWYWx1ZSIsIm11bHRpcGxlIiwiZGVmYXVsdE9wdGlvbiIsImNvbW1pdEFuZFB1c2giLCJyZXBvc2l0b3J5RGlyIiwiY29tbWl0IiwicmVtb3RlcyIsImVycm9yIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJjaGlsZFByb2Nlc3MiLCJzdGRlcnIiLCJ0ZXN0Iiwic3Rkb3V0IiwiY29uc29sZSIsIm91dHB1dCIsInJlbW90ZSIsInJlb3JnYW5pemVEYXRhIiwib3B0aW9ucyIsImRhdGFEaXIiLCJEYXRlIiwicHJvdG90eXBlIiwidG9KU09OIiwiZ2l0R3JvdXBVcmwiLCJjbG9uZSIsInRyaW0iLCJyZXBsYWNlIiwidW5kZWZpbmVkIiwidmFsaWRhdGVSYXdEYXRhIiwiY2F0ZWdvcmllcyIsIm1hcCIsImRhdGFzZXROYW1lIiwibm90U3RyaWN0RXF1YWwiLCJlbmFibGVkRGF0YXNldHMiLCJyZWR1Y2UiLCJOb25lIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXQiLCJhY3RldXJzRXRPcmdhbmVzIiwib3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCIsImpvaW4iLCJmaWxlbmFtZSIsInNpbGVudCIsImxvZyIsImJhc2VuYW1lIiwiZGF0YXNldFJlb3JnYW5pemVkRGlyIiwiZW5zdXJlRGlyU3luYyIsInJlYWRkaXJTeW5jIiwicmVtb3ZlU3luYyIsImFjdGV1cnNSZW9yZ2FuaXplZERpciIsIm1rZGlyU3luYyIsIm9yZ2FuZXNSZW9yZ2FuaXplZERpciIsInN0cnVjdHVyZSIsIlNpbmdsZUZpbGUiLCJvcmlnaW5hbEpzb24iLCJyZWFkRmlsZVN5bmMiLCJvcmlnaW5hbERhdGEiLCJ0b0FjdGV1cnNFdE9yZ2FuZXMiLCJKU09OIiwicGFyc2UiLCJhY3RldXIiLCJleHBvcnQiLCJhY3RldXJzIiwicmVvcmdhbml6ZWRKc29uRmlsZVBhdGgiLCJ1aWQiLCJ3cml0ZUZpbGVTeW5jIiwic3RyaW5naWZ5Iiwib3JnYW5lIiwib3JnYW5lcyIsIlNlZ21lbnRlZEZpbGVzIiwiZGVwb3J0c0J5QWN0ZXVyVWlkIiwiZXhpc3RzU3luYyIsImRlcG9ydFNwbGl0UGF0aCIsImRlcG9ydEZpbGVuYW1lIiwibGVuZ3RoIiwiZW5kc1dpdGgiLCJkZXBvcnRPcmlnaW5hbEZpbGVQYXRoIiwidmVyYm9zZSIsImRlcG9ydE9yaWdpbmFsSnNvbiIsImRlcG9ydE9yaWdpbmFsIiwidG9EZXBvcnQiLCJkZXBvcnQiLCJkZXBvcnRzIiwiYWN0ZXVyUmVmIiwicHVzaCIsIk9iamVjdCIsInZhbHVlcyIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJtYW5kYXRzQnlBY3RldXJVaWQiLCJtYW5kYXRTcGxpdFBhdGgiLCJtYW5kYXRGaWxlbmFtZSIsIm1hbmRhdE9yaWdpbmFsRmlsZVBhdGgiLCJtYW5kYXRPcmlnaW5hbEpzb24iLCJtYW5kYXRPcmlnaW5hbCIsInRvTWFuZGF0V3JhcHBlciIsIm1hbmRhdCIsIm1hbmRhdHMiLCJhY3RldXJTcGxpdFBhdGgiLCJhY3RldXJGaWxlbmFtZSIsImFjdGV1ck9yaWdpbmFsRmlsZVBhdGgiLCJhY3RldXJPcmlnaW5hbEpzb24iLCJhY3RldXJPcmlnaW5hbCIsInRvQWN0ZXVyIiwiYWN0ZXVyVWlkIiwic3RyaWN0RXF1YWwiLCJhY3RldXJSZW9yZ2FuaXplZEpzb25GaWxlUGF0aCIsIm9yZ2FuZVNwbGl0UGF0aCIsIm9yZ2FuZUZpbGVuYW1lIiwib3JnYW5lT3JpZ2luYWxGaWxlUGF0aCIsIm9yZ2FuZU9yaWdpbmFsSnNvbiIsIm9yZ2FuZU9yaWdpbmFsIiwidG9PcmdhbmUiLCJvcmdhbmVSZW9yZ2FuaXplZEpzb25GaWxlUGF0aCIsIkFnZW5kYXMiLCJhZ2VuZGFzIiwidG9BZ2VuZGFzIiwicmV1bmlvbiIsInJldW5pb25zIiwid3JpdGVSZXVuaW9uUmVvcmdhbml6ZWRKc29uIiwicmV1bmlvblNwbGl0UGF0aCIsInJldW5pb25GaWxlbmFtZSIsInJldW5pb25PcmlnaW5hbEZpbGVQYXRoIiwicmV1bmlvbk9yaWdpbmFsSnNvbiIsInJldW5pb25PcmlnaW5hbCIsInRvUmV1bmlvbiIsIkFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudHMiLCJ0b0FtZW5kZW1lbnRzIiwidGV4dGVMZWdpc2xhdGlmIiwidGV4dGVzRXRBbWVuZGVtZW50cyIsInRleHRlbGVnIiwiYW1lbmRlbWVudCIsIndyaXRlQW1lbmRlbWVudFJlb3JnYW5pemVkSnNvbiIsImFtZW5kZW1lbnRTcGxpdFBhdGgiLCJhbWVuZGVtZW50RmlsZW5hbWUiLCJhbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aCIsImFtZW5kZW1lbnRPcmlnaW5hbEpzb24iLCJhbWVuZGVtZW50T3JpZ2luYWwiLCJ0b0FtZW5kZW1lbnRXcmFwcGVyIiwiRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb2N1bWVudHNEaXIiLCJkb3NzaWVyc0RpciIsInRvRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvY3VtZW50IiwidGV4dGVzTGVnaXNsYXRpZnMiLCJ3cml0ZURvY3VtZW50UmVvcmdhbml6ZWRKc29uIiwiZG9zc2llclBhcmxlbWVudGFpcmUiLCJkb3NzaWVyIiwid3JpdGVEb3NzaWVyUGFybGVtZW50YWlyZVJlb3JnYW5pemVkSnNvbiIsImRvY3VtZW50U3BsaXRQYXRoIiwiZG9jdW1lbnRGaWxlbmFtZSIsImRvY3VtZW50T3JpZ2luYWxGaWxlUGF0aCIsImRvY3VtZW50T3JpZ2luYWxKc29uIiwiZG9jdW1lbnRPcmlnaW5hbCIsInRvRG9jdW1lbnQiLCJkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aCIsImRvc3NpZXJQYXJsZW1lbnRhaXJlRmlsZW5hbWUiLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGgiLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsSnNvbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWwiLCJ0b0Rvc3NpZXJQYXJsZW1lbnRhaXJlIiwiU2NydXRpbnMiLCJzY3J1dGlucyIsInRvU2NydXRpbnMiLCJzY3J1dGluIiwid3JpdGVTY3J1dGluUmVvcmdhbml6ZWRKc29uIiwic2NydXRpblNwbGl0UGF0aCIsInNjcnV0aW5GaWxlbmFtZSIsInNjcnV0aW5PcmlnaW5hbEZpbGVQYXRoIiwic2NydXRpbk9yaWdpbmFsSnNvbiIsInNjcnV0aW5PcmlnaW5hbCIsInRvU2NydXRpbldyYXBwZXIiLCJ1aWRUZXh0ZUxlZ2lzbGF0aWYiLCJ0ZXh0ZUxlZ2lzbGF0aWZSZWYiLCJ0ZXh0ZUxlZ2lzbGF0aWZEaXIiLCJyZXVuaW9uc0RpciIsInNjcnV0aW5zRGlyIiwiYXJndiIsImV4aXQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9yZW9yZ2FuaXplX2RhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCJcbmltcG9ydCB7IENoaWxkUHJvY2VzcywgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHsgZGF0YXNldHMsIERhdGFzZXRTdHJ1Y3R1cmUsIEVuYWJsZWREYXRhc2V0cyB9IGZyb20gXCIuLi9kYXRhc2V0c1wiXG5pbXBvcnQgeyBleGlzdGluZ0RhdGVUb0pzb24sIHBhdGNoZWREYXRlVG9Kc29uIH0gZnJvbSBcIi4uL2RhdGVzXCJcbmltcG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmltcG9ydCB7XG4gIHBhdGhGcm9tRG9jdW1lbnRVaWQsXG4gIHBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQsXG4gIHBhdGhGcm9tUmV1bmlvblVpZCxcbiAgcGF0aEZyb21TY3J1dGluVWlkLFxufSBmcm9tIFwiLi4vbG9hZGVyc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBZ2VuZGFzUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvYWdlbmRhc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFtZW5kZW1lbnRzUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvYW1lbmRlbWVudHNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBTY3J1dGluc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL3NjcnV0aW5zXCJcblxuY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICB7XG4gICAgYWxpYXM6IFwiQ1wiLFxuICAgIGhlbHA6IFwiY2xvbmUgcmVwb3NpdG9yaWVzIGZyb20gZ2l2ZW4gZ3JvdXAgKG9yIG9yZ2FuaXphdGlvbikgZ2l0IFVSTFwiLFxuICAgIG5hbWU6IFwiY2xvbmVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJjXCIsXG4gICAgaGVscDogXCJjb21taXQgc3BsaXQgZmlsZXNcIixcbiAgICBuYW1lOiBcImNvbW1pdFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJrXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBbXCJBbGxcIl0sXG4gICAgaGVscDogXCJjYXRlZ29yaWVzIG9mIGRhdGFzZXRzIHRvIHJlb3JnYW5pemVcIixcbiAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICBuYW1lOiBcImNhdGVnb3JpZXNcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJyXCIsXG4gICAgaGVscDogXCJwdXNoIGNvbW1pdCB0byBnaXZlbiByZW1vdGVcIixcbiAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICBuYW1lOiBcInJlbW90ZVwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInNcIixcbiAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgIG5hbWU6IFwic2lsZW50XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcIlZcIixcbiAgICBoZWxwOiBcImRvbid0IHZhbGlkYXRlIHJhdyBkYXRhXCIsXG4gICAgbmFtZTogXCJuby12YWxpZGF0ZS1yYXdcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwidlwiLFxuICAgIGhlbHA6IFwidmVyYm9zZSBsb2dzXCIsXG4gICAgbmFtZTogXCJ2ZXJib3NlXCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGRlZmF1bHRPcHRpb246IHRydWUsXG4gICAgaGVscDogXCJkaXJlY3RvcnkgY29udGFpbmluZyBBc3NlbWJsw6llIG9wZW4gZGF0YSBmaWxlc1wiLFxuICAgIG5hbWU6IFwiZGF0YURpclwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbl1cblxuZnVuY3Rpb24gY29tbWl0QW5kUHVzaChcbiAgcmVwb3NpdG9yeURpcjogc3RyaW5nLFxuICBjb21taXQ6IGJvb2xlYW4sXG4gIHJlbW90ZXM/OiBzdHJpbmdbXSxcbik6IGJvb2xlYW4ge1xuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBpZiAoY29tbWl0KSB7XG4gICAgZXhlY1N5bmMoYGdpdCBhZGQgLmAsIHtcbiAgICAgIGN3ZDogcmVwb3NpdG9yeURpcixcbiAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgZXhlY1N5bmMoJ2dpdCBjb21taXQgLW0gXCJOb3V2ZWxsZSBtb2lzc29uXCInLCB7XG4gICAgICAgIGN3ZDogcmVwb3NpdG9yeURpcixcbiAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChjaGlsZFByb2Nlc3MgYXMgQ2hpbGRQcm9jZXNzKS5zdGRlcnIgPT09IG51bGwgfHxcbiAgICAgICAgIS9ub3RoaW5nIHRvIGNvbW1pdC8udGVzdCgoY2hpbGRQcm9jZXNzIGFzIGFueSkuc3Rkb3V0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoKGNoaWxkUHJvY2VzcyBhcyBhbnkpLm91dHB1dClcbiAgICAgICAgdGhyb3cgY2hpbGRQcm9jZXNzXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVtb3RlIG9mIHJlbW90ZXMgfHwgW10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgcHVzaCAke3JlbW90ZX0gbWFzdGVyYCwge1xuICAgICAgICAgIGN3ZDogcmVwb3NpdG9yeURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICAgICAgLy8gRG9uJ3Qgc3RvcCB3aGVuIHB1c2ggZmFpbHMuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoKGNoaWxkUHJvY2VzcyBhcyBhbnkpLm91dHB1dClcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBlcnJvclxufVxuXG5mdW5jdGlvbiByZW9yZ2FuaXplRGF0YShvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBwYXRjaGVkRGF0ZVRvSnNvblxuXG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGNvbnN0IGdpdEdyb3VwVXJsID0gb3B0aW9ucy5jbG9uZVxuICAgID8gb3B0aW9ucy5jbG9uZS50cmltKCkucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICAgIDogdW5kZWZpbmVkXG4gIGNvbnN0IHZhbGlkYXRlUmF3RGF0YSA9ICFvcHRpb25zW1wibm8tdmFsaWRhdGUtcmF3XCJdXG5cbiAgb3B0aW9ucy5jYXRlZ29yaWVzLm1hcCgoZGF0YXNldE5hbWU6IHN0cmluZykgPT5cbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgICAoRW5hYmxlZERhdGFzZXRzIGFzIGFueSBhcyB7IFtuYW1lOiBzdHJpbmddOiBFbmFibGVkRGF0YXNldHMgfSlbXG4gICAgICAgIGRhdGFzZXROYW1lXG4gICAgICBdLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgYFVua25vd24gbmFtZSBvZiBkYXRhc2V0OiAke2RhdGFzZXROYW1lfWAsXG4gICAgKSxcbiAgKVxuICBjb25zdCBlbmFibGVkRGF0YXNldHMgPSBvcHRpb25zLmNhdGVnb3JpZXMucmVkdWNlKFxuICAgIChlbmFibGVkRGF0YXNldHM6IEVuYWJsZWREYXRhc2V0cywgZGF0YXNldE5hbWU6IHN0cmluZyk6IEVuYWJsZWREYXRhc2V0cyA9PlxuICAgICAgZW5hYmxlZERhdGFzZXRzIHxcbiAgICAgIChFbmFibGVkRGF0YXNldHMgYXMgYW55IGFzIHsgW25hbWU6IHN0cmluZ106IEVuYWJsZWREYXRhc2V0cyB9KVtcbiAgICAgICAgZGF0YXNldE5hbWVcbiAgICAgIF0sXG4gICAgRW5hYmxlZERhdGFzZXRzLk5vbmUsXG4gIClcblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX0uZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpKSB7XG4gICAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgZmlsZW5hbWUpKVxuICAgICAgfVxuICAgICAgY29uc3QgYWN0ZXVyc1Jlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJhY3RldXJzXCIpXG4gICAgICBmcy5ta2RpclN5bmMoYWN0ZXVyc1Jlb3JnYW5pemVkRGlyKVxuICAgICAgY29uc3Qgb3JnYW5lc1Jlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJvcmdhbmVzXCIpXG4gICAgICBmcy5ta2RpclN5bmMob3JnYW5lc1Jlb3JnYW5pemVkRGlyKVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0FjdGV1cnNFdE9yZ2FuZXMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGV1ciBvZiBvcmlnaW5hbERhdGEuZXhwb3J0LmFjdGV1cnMuYWN0ZXVyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgYWN0ZXVyc1Jlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIGFjdGV1ci51aWRbXCIjdGV4dFwiXSArIFwiLmpzb25cIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFjdGV1ciwgbnVsbCwgMiksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBvcmdhbmUgb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydC5vcmdhbmVzLm9yZ2FuZSkge1xuICAgICAgICAgICAgICBjb25zdCByZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yZ2FuZXNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBvcmdhbmUudWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZGVwb3J0c0J5QWN0ZXVyVWlkOiB7XG4gICAgICAgICAgICAgIFthY3RldXJVaWQ6IHN0cmluZ106IHsgdWlkOiBzdHJpbmcgfVtdXG4gICAgICAgICAgICB9ID0ge31cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4ob3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCwgXCJkZXBvcnRcIiksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcG9ydFNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgW1wiZGVwb3J0XCJdLFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgZGVwb3J0U3BsaXRQYXRoW2RlcG9ydFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgIGlmICghZGVwb3J0RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0T3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAuLi5kZXBvcnRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICBgICBMb2FkaW5nIFwiZGVwb3J0XCIgZmlsZTogJHtkZXBvcnRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgICAgZGVwb3J0T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0RlcG9ydChkZXBvcnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZGVwb3J0T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydCA9IGRlcG9ydE9yaWdpbmFsLmRlcG9ydFxuICAgICAgICAgICAgICAgIGxldCBkZXBvcnRzID0gZGVwb3J0c0J5QWN0ZXVyVWlkW2RlcG9ydC5hY3RldXJSZWZdXG4gICAgICAgICAgICAgICAgaWYgKGRlcG9ydHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgZGVwb3J0cyA9IGRlcG9ydHNCeUFjdGV1clVpZFtkZXBvcnQuYWN0ZXVyUmVmXSA9IFtdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlcG9ydHMucHVzaChkZXBvcnQpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcG9ydHMgb2YgT2JqZWN0LnZhbHVlcyhkZXBvcnRzQnlBY3RldXJVaWQpKSB7XG4gICAgICAgICAgICAgICAgZGVwb3J0cy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICAgICAgYS51aWQubGVuZ3RoID09PSBiLnVpZC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBhLnVpZC5sb2NhbGVDb21wYXJlKGIudWlkKVxuICAgICAgICAgICAgICAgICAgICA6IGEudWlkLmxlbmd0aCAtIGIudWlkLmxlbmd0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWFuZGF0c0J5QWN0ZXVyVWlkOiB7XG4gICAgICAgICAgICAgIFthY3RldXJVaWQ6IHN0cmluZ106IHsgdWlkOiBzdHJpbmcgfVtdXG4gICAgICAgICAgICB9ID0ge31cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4ob3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCwgXCJtYW5kYXRcIiksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hbmRhdFNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgW1wibWFuZGF0XCJdLFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgbWFuZGF0U3BsaXRQYXRoW21hbmRhdFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgIGlmICghbWFuZGF0RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0T3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAuLi5tYW5kYXRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICBgICBMb2FkaW5nIFwibWFuZGF0XCIgZmlsZTogJHttYW5kYXRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmRhdE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgICAgbWFuZGF0T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b01hbmRhdFdyYXBwZXIobWFuZGF0T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG1hbmRhdE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXQgPSBtYW5kYXRPcmlnaW5hbC5tYW5kYXRcbiAgICAgICAgICAgICAgICBsZXQgbWFuZGF0cyA9IG1hbmRhdHNCeUFjdGV1clVpZFttYW5kYXQuYWN0ZXVyUmVmXVxuICAgICAgICAgICAgICAgIGlmIChtYW5kYXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIG1hbmRhdHMgPSBtYW5kYXRzQnlBY3RldXJVaWRbbWFuZGF0LmFjdGV1clJlZl0gPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYW5kYXRzLnB1c2gobWFuZGF0KVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYW5kYXRzIG9mIE9iamVjdC52YWx1ZXMobWFuZGF0c0J5QWN0ZXVyVWlkKSkge1xuICAgICAgICAgICAgICAgIG1hbmRhdHMuc29ydCgoYSwgYikgPT5cbiAgICAgICAgICAgICAgICAgIGEudWlkLmxlbmd0aCA9PT0gYi51aWQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gYS51aWQubG9jYWxlQ29tcGFyZShiLnVpZClcbiAgICAgICAgICAgICAgICAgICAgOiBhLnVpZC5sZW5ndGggLSBiLnVpZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0ZXVyU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImFjdGV1clwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyRmlsZW5hbWUgPSBhY3RldXJTcGxpdFBhdGhbYWN0ZXVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghYWN0ZXVyRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLmFjdGV1clNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJhY3RldXJcIiBmaWxlOiAke2FjdGV1ck9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0FjdGV1cihhY3RldXJPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGFjdGV1ck9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyID0gYWN0ZXVyT3JpZ2luYWwuYWN0ZXVyXG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1clVpZCA9IGFjdGV1ci51aWRbXCIjdGV4dFwiXVxuICAgICAgICAgICAgICBjb25zdCBkZXBvcnRzID0gZGVwb3J0c0J5QWN0ZXVyVWlkW2FjdGV1clVpZF1cbiAgICAgICAgICAgICAgaWYgKGRlcG9ydHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhY3RldXIuZGVwb3J0cywgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGFjdGV1ci5kZXBvcnRzID0geyBkZXBvcnQ6IGRlcG9ydHMgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG1hbmRhdHMgPSBtYW5kYXRzQnlBY3RldXJVaWRbYWN0ZXVyVWlkXVxuICAgICAgICAgICAgICBpZiAobWFuZGF0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFjdGV1ci5tYW5kYXRzLCB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgYWN0ZXVyLm1hbmRhdHMgPSB7IG1hbmRhdDogbWFuZGF0cyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyUmVvcmdhbml6ZWRKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBhY3RldXJzUmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgYWN0ZXVyVWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYWN0ZXVyUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYWN0ZXVyLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9yZ2FuZVNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJvcmdhbmVcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZUZpbGVuYW1lID0gb3JnYW5lU3BsaXRQYXRoW29yZ2FuZVNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIW9yZ2FuZUZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZU9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5vcmdhbmVTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwib3JnYW5lXCIgZmlsZTogJHtvcmdhbmVPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZU9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIG9yZ2FuZU9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9PcmdhbmUob3JnYW5lT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmdhbmVPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZSA9IG9yZ2FuZU9yaWdpbmFsLm9yZ2FuZVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVSZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yZ2FuZXNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBvcmdhbmUudWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgb3JnYW5lUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2goZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zLmNvbW1pdCwgb3B0aW9ucy5yZW1vdGUpXG4gICAgICApIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BZ2VuZGFzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFnZW5kYXMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9LmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcilcbiAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKSkge1xuICAgICAgICBpZiAoZmlsZW5hbWVbMF0gPT09IFwiLlwiKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIGZpbGVuYW1lKSlcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gQWdlbmRhc1Jhd0NvbnZlcnQudG9BZ2VuZGFzKG9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCByZXVuaW9uIG9mIG9yaWdpbmFsRGF0YS5yZXVuaW9ucy5yZXVuaW9uKSB7XG4gICAgICAgICAgICAgIHdyaXRlUmV1bmlvblJlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIHJldW5pb24pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJldW5pb25TcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wicmV1bmlvblwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbkZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICByZXVuaW9uU3BsaXRQYXRoW3JldW5pb25TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFyZXVuaW9uRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbk9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5yZXVuaW9uU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcInJldW5pb25cIiBmaWxlOiAke3JldW5pb25PcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb25PcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICByZXVuaW9uT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQWdlbmRhc1Jhd0NvbnZlcnQudG9SZXVuaW9uKHJldW5pb25PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKHJldW5pb25PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb24gPSByZXVuaW9uT3JpZ2luYWwucmV1bmlvblxuICAgICAgICAgICAgICB3cml0ZVJldW5pb25SZW9yZ2FuaXplZEpzb24oZGF0YXNldFJlb3JnYW5pemVkRGlyLCByZXVuaW9uKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2goZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zLmNvbW1pdCwgb3B0aW9ucy5yZW1vdGUpXG4gICAgICApIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX0uZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpKSB7XG4gICAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgZmlsZW5hbWUpKVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBBbWVuZGVtZW50c1Jhd0NvbnZlcnQudG9BbWVuZGVtZW50cyhvcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdGV4dGVMZWdpc2xhdGlmIG9mIG9yaWdpbmFsRGF0YS50ZXh0ZXNFdEFtZW5kZW1lbnRzXG4gICAgICAgICAgICAgIC50ZXh0ZWxlZykge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnQgb2YgdGV4dGVMZWdpc2xhdGlmLmFtZW5kZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgd3JpdGVBbWVuZGVtZW50UmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgICAgYW1lbmRlbWVudCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYW1lbmRlbWVudFNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIGFtZW5kZW1lbnRTcGxpdFBhdGhbYW1lbmRlbWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIWFtZW5kZW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLmFtZW5kZW1lbnRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwiYW1lbmRlbWVudFwiIGZpbGU6ICR7YW1lbmRlbWVudE9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGFtZW5kZW1lbnRPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBbWVuZGVtZW50c1Jhd0NvbnZlcnQudG9BbWVuZGVtZW50V3JhcHBlcihcbiAgICAgICAgICAgICAgICAgICAgYW1lbmRlbWVudE9yaWdpbmFsSnNvbixcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoYW1lbmRlbWVudE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudCA9IGFtZW5kZW1lbnRPcmlnaW5hbC5hbWVuZGVtZW50XG4gICAgICAgICAgICAgIHdyaXRlQW1lbmRlbWVudFJlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIGFtZW5kZW1lbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMuY29tbWl0LCBvcHRpb25zLnJlbW90ZSlcbiAgICAgICkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuZG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX0uZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpKSB7XG4gICAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgZmlsZW5hbWUpKVxuICAgICAgfVxuICAgICAgY29uc3QgZG9jdW1lbnRzRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJkb2N1bWVudHNcIilcbiAgICAgIGZzLm1rZGlyU3luYyhkb2N1bWVudHNEaXIpXG4gICAgICBjb25zdCBkb3NzaWVyc0RpciA9IHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIFwiZG9zc2llcnNcIilcbiAgICAgIGZzLm1rZGlyU3luYyhkb3NzaWVyc0RpcilcblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQudG9Eb3NzaWVyc0xlZ2lzbGF0aWZzKFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCBkb2N1bWVudCBvZiBvcmlnaW5hbERhdGEuZXhwb3J0LnRleHRlc0xlZ2lzbGF0aWZzXG4gICAgICAgICAgICAgIC5kb2N1bWVudCkge1xuICAgICAgICAgICAgICB3cml0ZURvY3VtZW50UmVvcmdhbml6ZWRKc29uKGRvY3VtZW50c0RpciwgZG9jdW1lbnQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgeyBkb3NzaWVyUGFybGVtZW50YWlyZSB9IG9mIG9yaWdpbmFsRGF0YS5leHBvcnRcbiAgICAgICAgICAgICAgLmRvc3NpZXJzTGVnaXNsYXRpZnMuZG9zc2llcikge1xuICAgICAgICAgICAgICB3cml0ZURvc3NpZXJQYXJsZW1lbnRhaXJlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRvc3NpZXJzRGlyLFxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvY3VtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImRvY3VtZW50XCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudEZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBkb2N1bWVudFNwbGl0UGF0aFtkb2N1bWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uZG9jdW1lbnRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwiZG9jdW1lbnRcIiBmaWxlOiAke2RvY3VtZW50T3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGRvY3VtZW50T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0LnRvRG9jdW1lbnQoZG9jdW1lbnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGRvY3VtZW50T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IGRvY3VtZW50T3JpZ2luYWwuZG9jdW1lbnRcbiAgICAgICAgICAgICAgd3JpdGVEb2N1bWVudFJlb3JnYW5pemVkSnNvbihkb2N1bWVudHNEaXIsIGRvY3VtZW50KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImRvc3NpZXJQYXJsZW1lbnRhaXJlXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aFtcbiAgICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIGlmICghZG9zc2llclBhcmxlbWVudGFpcmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5kb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJkb3NzaWVyUGFybGVtZW50YWlyZVwiIGZpbGU6ICR7ZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZShcbiAgICAgICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZSA9XG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbC5kb3NzaWVyUGFybGVtZW50YWlyZVxuICAgICAgICAgICAgICB3cml0ZURvc3NpZXJQYXJsZW1lbnRhaXJlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRvc3NpZXJzRGlyLFxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMuY29tbWl0LCBvcHRpb25zLnJlbW90ZSlcbiAgICAgICkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlNjcnV0aW5zKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLnNjcnV0aW5zKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcikpIHtcbiAgICAgICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBmaWxlbmFtZSkpXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IFNjcnV0aW5zUmF3Q29udmVydC50b1NjcnV0aW5zKG9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCBzY3J1dGluIG9mIG9yaWdpbmFsRGF0YS5zY3J1dGlucy5zY3J1dGluKSB7XG4gICAgICAgICAgICAgIHdyaXRlU2NydXRpblJlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIHNjcnV0aW4pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNjcnV0aW5TcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbkZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBzY3J1dGluU3BsaXRQYXRoW3NjcnV0aW5TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFzY3J1dGluRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbk9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5zY3J1dGluU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcInNjcnV0aW5cIiBmaWxlOiAke3NjcnV0aW5PcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW5PcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBzY3J1dGluT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gU2NydXRpbnNSYXdDb252ZXJ0LnRvU2NydXRpbldyYXBwZXIoc2NydXRpbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uoc2NydXRpbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbiA9IHNjcnV0aW5PcmlnaW5hbC5zY3J1dGluXG4gICAgICAgICAgICAgIHdyaXRlU2NydXRpblJlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIHNjcnV0aW4pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMuY29tbWl0LCBvcHRpb25zLnJlbW90ZSlcbiAgICAgICkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXN0b3JlIHN0YW5kYXJkIGNvbnZlcnNpb24gb2YgZGF0ZXMgdG8gSlNPTi5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZXhpc3RpbmdEYXRlVG9Kc29uXG5cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIHdyaXRlQW1lbmRlbWVudFJlb3JnYW5pemVkSnNvbihcbiAgZGF0YXNldFJlb3JnYW5pemVkRGlyOiBzdHJpbmcsXG4gIGFtZW5kZW1lbnQ6IHtcbiAgICB1aWQ6IHN0cmluZ1xuICAgIHRleHRlTGVnaXNsYXRpZlJlZjogc3RyaW5nXG4gIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgdWlkVGV4dGVMZWdpc2xhdGlmID0gYW1lbmRlbWVudC50ZXh0ZUxlZ2lzbGF0aWZSZWZcbiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKHVpZFRleHRlTGVnaXNsYXRpZiwgdW5kZWZpbmVkKVxuICBjb25zdCB0ZXh0ZUxlZ2lzbGF0aWZEaXIgPSBwYXRoLmpvaW4oXG4gICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgIHVpZFRleHRlTGVnaXNsYXRpZixcbiAgKVxuICBmcy5lbnN1cmVEaXJTeW5jKHRleHRlTGVnaXNsYXRpZkRpcilcbiAgY29uc3QgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgdGV4dGVMZWdpc2xhdGlmRGlyLFxuICAgIGFtZW5kZW1lbnQudWlkICsgXCIuanNvblwiLFxuICApXG4gIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgSlNPTi5zdHJpbmdpZnkoYW1lbmRlbWVudCwgbnVsbCwgMiksXG4gICAge1xuICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgIH0sXG4gIClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb2N1bWVudFJlb3JnYW5pemVkSnNvbihcbiAgZG9jdW1lbnRzRGlyOiBzdHJpbmcsXG4gIGRvY3VtZW50OiB7IHVpZDogc3RyaW5nIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgYmFzZW5hbWUgPSBwYXRoRnJvbURvY3VtZW50VWlkKGRvY3VtZW50c0RpciwgZG9jdW1lbnQudWlkKVxuICBmcy53cml0ZUZpbGVTeW5jKGAke2Jhc2VuYW1lfS5qc29uYCwgSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnQsIG51bGwsIDIpLCB7XG4gICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICB9KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvc3NpZXJQYXJsZW1lbnRhaXJlUmVvcmdhbml6ZWRKc29uKFxuICBkb3NzaWVyc0Rpcjogc3RyaW5nLFxuICBkb3NzaWVyUGFybGVtZW50YWlyZTogeyB1aWQ6IHN0cmluZyB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IGJhc2VuYW1lID0gcGF0aEZyb21Eb3NzaWVyUGFybGVtZW50YWlyZVVpZChcbiAgICBkb3NzaWVyc0RpcixcbiAgICBkb3NzaWVyUGFybGVtZW50YWlyZS51aWQsXG4gIClcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBgJHtiYXNlbmFtZX0uanNvbmAsXG4gICAgSlNPTi5zdHJpbmdpZnkoZG9zc2llclBhcmxlbWVudGFpcmUsIG51bGwsIDIpLFxuICAgIHtcbiAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICB9LFxuICApXG59XG5cbmZ1bmN0aW9uIHdyaXRlUmV1bmlvblJlb3JnYW5pemVkSnNvbihcbiAgcmV1bmlvbnNEaXI6IHN0cmluZyxcbiAgcmV1bmlvbjogeyB1aWQ6IHN0cmluZyB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IGJhc2VuYW1lID0gcGF0aEZyb21SZXVuaW9uVWlkKHJldW5pb25zRGlyLCByZXVuaW9uLnVpZClcbiAgZnMud3JpdGVGaWxlU3luYyhgJHtiYXNlbmFtZX0uanNvbmAsIEpTT04uc3RyaW5naWZ5KHJldW5pb24sIG51bGwsIDIpLCB7XG4gICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICB9KVxufVxuXG5mdW5jdGlvbiB3cml0ZVNjcnV0aW5SZW9yZ2FuaXplZEpzb24oXG4gIHNjcnV0aW5zRGlyOiBzdHJpbmcsXG4gIHNjcnV0aW46IHsgdWlkOiBzdHJpbmcgfSxcbik6IHZvaWQge1xuICBjb25zdCBiYXNlbmFtZSA9IHBhdGhGcm9tU2NydXRpblVpZChzY3J1dGluc0Rpciwgc2NydXRpbi51aWQpXG4gIGZzLndyaXRlRmlsZVN5bmMoYCR7YmFzZW5hbWV9Lmpzb25gLCBKU09OLnN0cmluZ2lmeShzY3J1dGluLCBudWxsLCAyKSwge1xuICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgfSlcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAocHJvY2Vzcy5hcmd2WzFdLmVuZHNXaXRoKFwicmVvcmdhbml6ZV9kYXRhLnRzXCIpKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zKVxuXG4gIGlmIChyZW9yZ2FuaXplRGF0YShvcHRpb25zKSkge1xuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9IGVsc2Uge1xuICAgIHByb2Nlc3MuZXhpdCgwKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLE1BQVAsTUFBbUIsUUFBbkI7QUFDQSxTQUF1QkMsUUFBdkIsUUFBdUMsZUFBdkM7QUFDQSxPQUFPQyxlQUFQLE1BQTRCLG1CQUE1QjtBQUNBLE9BQU9DLEVBQVAsTUFBZSxVQUFmO0FBQ0EsT0FBT0MsSUFBUCxNQUFpQixNQUFqQjtTQUVTQyxRLEVBQVVDLGdCLEVBQWtCQyxlO1NBQzVCQyxrQixFQUFvQkMsaUI7U0FDcEJDLE87U0FFUEMsbUIsRUFDQUMsK0IsRUFDQUMs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