@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
@@ -1,18 +1,96 @@
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.js";
7
- import { existingDateToJson, patchedDateToJson } from "../dates.js";
8
- import { walkDir } from "../file_systems.js";
9
- import { pathFromDocumentUid, pathFromDossierParlementaireUid, pathFromReunionUid, pathFromScrutinUid } from "../loaders.js";
10
- import { Convert as ActeursEtOrganesRawConvert } from "../raw_types/acteurs_et_organes.js";
11
- import { Convert as AgendasRawConvert } from "../raw_types/agendas.js";
12
- import { Convert as AmendementsRawConvert } from "../raw_types/amendements.js";
13
- import { Convert as DossiersLegislatifsRawConvert } from "../raw_types/dossiers_legislatifs.js";
14
- import { Convert as ScrutinsRawConvert } from "../raw_types/scrutins.js";
15
- const optionsDefinitions = [{
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.array.slice.js");
4
+
5
+ require("core-js/modules/es.function.name.js");
6
+
7
+ require("core-js/modules/es.array.from.js");
8
+
9
+ require("core-js/modules/es.string.iterator.js");
10
+
11
+ require("core-js/modules/es.symbol.js");
12
+
13
+ require("core-js/modules/es.symbol.description.js");
14
+
15
+ require("core-js/modules/es.symbol.iterator.js");
16
+
17
+ require("core-js/modules/es.array.iterator.js");
18
+
19
+ require("core-js/modules/web.dom-collections.iterator.js");
20
+
21
+ require("core-js/modules/es.array.is-array.js");
22
+
23
+ require("core-js/modules/es.regexp.exec.js");
24
+
25
+ require("core-js/modules/es.date.to-json.js");
26
+
27
+ require("core-js/modules/es.date.to-string.js");
28
+
29
+ require("core-js/modules/es.string.replace.js");
30
+
31
+ require("core-js/modules/es.string.trim.js");
32
+
33
+ require("core-js/modules/es.array.map.js");
34
+
35
+ require("core-js/modules/es.array.reduce.js");
36
+
37
+ require("core-js/modules/es.object.to-string.js");
38
+
39
+ require("core-js/modules/es.array.join.js");
40
+
41
+ require("core-js/modules/es.array.concat.js");
42
+
43
+ require("core-js/modules/es.object.values.js");
44
+
45
+ require("core-js/modules/es.array.sort.js");
46
+
47
+ require("core-js/modules/es.string.ends-with.js");
48
+
49
+ var _assert = _interopRequireDefault(require("assert"));
50
+
51
+ var _child_process = require("child_process");
52
+
53
+ var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
54
+
55
+ var _fsExtra = _interopRequireDefault(require("fs-extra"));
56
+
57
+ var _path = _interopRequireDefault(require("path"));
58
+
59
+ var _datasets = require("../datasets");
60
+
61
+ var _dates = require("../dates");
62
+
63
+ var _file_systems = require("../file_systems");
64
+
65
+ var _loaders = require("../loaders");
66
+
67
+ var _acteurs_et_organes = require("../raw_types/acteurs_et_organes");
68
+
69
+ var _agendas = require("../raw_types/agendas");
70
+
71
+ var _amendements = require("../raw_types/amendements");
72
+
73
+ var _dossiers_legislatifs = require("../raw_types/dossiers_legislatifs");
74
+
75
+ var _scrutins = require("../raw_types/scrutins");
76
+
77
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
78
+
79
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
80
+
81
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
82
+
83
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
84
+
85
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
86
+
87
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
88
+
89
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
90
+
91
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
92
+
93
+ var optionsDefinitions = [{
16
94
  alias: "C",
17
95
  help: "clone repositories from given group (or organization) git URL",
18
96
  name: "clone",
@@ -58,10 +136,10 @@ const optionsDefinitions = [{
58
136
  }];
59
137
 
60
138
  function commitAndPush(repositoryDir, commit, remotes) {
61
- let error = false;
139
+ var error = false;
62
140
 
63
141
  if (commit) {
64
- execSync(`git add .`, {
142
+ (0, _child_process.execSync)("git add .", {
65
143
  cwd: repositoryDir,
66
144
  env: process.env,
67
145
  encoding: "utf-8",
@@ -69,7 +147,7 @@ function commitAndPush(repositoryDir, commit, remotes) {
69
147
  });
70
148
 
71
149
  try {
72
- execSync('git commit -m "Nouvelle moisson"', {
150
+ (0, _child_process.execSync)('git commit -m "Nouvelle moisson"', {
73
151
  cwd: repositoryDir,
74
152
  env: process.env,
75
153
  encoding: "utf-8"
@@ -81,19 +159,30 @@ function commitAndPush(repositoryDir, commit, remotes) {
81
159
  }
82
160
  }
83
161
 
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;
162
+ var _iterator = _createForOfIteratorHelper(remotes || []),
163
+ _step;
164
+
165
+ try {
166
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
167
+ var remote = _step.value;
168
+
169
+ try {
170
+ (0, _child_process.execSync)("git push ".concat(remote, " master"), {
171
+ cwd: repositoryDir,
172
+ env: process.env,
173
+ encoding: "utf-8",
174
+ stdio: ["ignore", "ignore", "pipe"]
175
+ });
176
+ } catch (childProcess) {
177
+ // Don't stop when push fails.
178
+ console.error(childProcess.output);
179
+ error = true;
180
+ }
96
181
  }
182
+ } catch (err) {
183
+ _iterator.e(err);
184
+ } finally {
185
+ _iterator.f();
97
186
  }
98
187
  }
99
188
 
@@ -101,599 +190,931 @@ function commitAndPush(repositoryDir, commit, remotes) {
101
190
  }
102
191
 
103
192
  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
- }
193
+ var dataDir = options.dataDir;
194
+ Date.prototype.toJSON = _dates.patchedDateToJson;
195
+ var error = false;
196
+ var gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined;
197
+ var validateRawData = !options["no-validate-raw"];
198
+ options.categories.map(function (datasetName) {
199
+ return _assert["default"].notStrictEqual(_datasets.EnabledDatasets[datasetName], undefined, "Unknown name of dataset: ".concat(datasetName));
200
+ });
201
+ var enabledDatasets = options.categories.reduce(function (enabledDatasets, datasetName) {
202
+ return enabledDatasets | _datasets.EnabledDatasets[datasetName];
203
+ }, _datasets.EnabledDatasets.None);
119
204
 
120
- const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
205
+ if (enabledDatasets & _datasets.EnabledDatasets.ActeursEtOrganes) {
206
+ var _iterator2 = _createForOfIteratorHelper(_datasets.datasets.acteursEtOrganes),
207
+ _step2;
121
208
 
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
- }
209
+ try {
210
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
211
+ var dataset = _step2.value;
130
212
 
131
- const datasetReorganizedDir = path.join(dataDir, datasetName);
132
- fs.ensureDirSync(datasetReorganizedDir);
213
+ var originalJsonDirectoryOrFilePath = _path["default"].join(dataDir, dataset.filename);
133
214
 
134
- for (const filename of fs.readdirSync(datasetReorganizedDir)) {
135
- if (filename[0] === ".") {
136
- continue;
215
+ if (!options.silent) {
216
+ console.log("Reorganizing ".concat(originalJsonDirectoryOrFilePath));
137
217
  }
138
218
 
139
- fs.removeSync(path.join(datasetReorganizedDir, filename));
140
- }
219
+ var datasetName = _path["default"].basename(originalJsonDirectoryOrFilePath, ".json");
141
220
 
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
- });
221
+ if (gitGroupUrl !== undefined) {
222
+ (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(datasetName, ".git"), {
223
+ cwd: dataDir,
224
+ env: process.env,
225
+ encoding: "utf-8",
226
+ stdio: ["ignore", "ignore", "pipe"]
227
+ });
228
+ }
229
+
230
+ var datasetReorganizedDir = _path["default"].join(dataDir, datasetName);
231
+
232
+ _fsExtra["default"].ensureDirSync(datasetReorganizedDir);
233
+
234
+ var _iterator3 = _createForOfIteratorHelper(_fsExtra["default"].readdirSync(datasetReorganizedDir)),
235
+ _step3;
236
+
237
+ try {
238
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
239
+ var filename = _step3.value;
240
+
241
+ if (filename[0] === ".") {
242
+ continue;
160
243
  }
161
244
 
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), {
245
+ _fsExtra["default"].removeSync(_path["default"].join(datasetReorganizedDir, filename));
246
+ }
247
+ } catch (err) {
248
+ _iterator3.e(err);
249
+ } finally {
250
+ _iterator3.f();
251
+ }
252
+
253
+ var acteursReorganizedDir = _path["default"].join(datasetReorganizedDir, "acteurs");
254
+
255
+ _fsExtra["default"].mkdirSync(acteursReorganizedDir);
256
+
257
+ var organesReorganizedDir = _path["default"].join(datasetReorganizedDir, "organes");
258
+
259
+ _fsExtra["default"].mkdirSync(organesReorganizedDir);
260
+
261
+ switch (dataset.structure) {
262
+ case _datasets.DatasetStructure.SingleFile:
263
+ {
264
+ var originalJson = _fsExtra["default"].readFileSync(originalJsonDirectoryOrFilePath, {
165
265
  encoding: "utf8"
166
266
  });
167
- }
168
- }
169
- break;
170
267
 
171
- case DatasetStructure.SegmentedFiles:
172
- {
173
- const deportsByActeurUid = {};
268
+ var originalData = validateRawData ? _acteurs_et_organes.Convert.toActeursEtOrganes(originalJson) : JSON.parse(originalJson);
174
269
 
175
- if (fs.existsSync(path.join(originalJsonDirectoryOrFilePath, "deport"))) {
176
- for (const deportSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["deport"])) {
177
- const deportFilename = deportSplitPath[deportSplitPath.length - 1];
270
+ var _iterator4 = _createForOfIteratorHelper(originalData["export"].acteurs.acteur),
271
+ _step4;
178
272
 
179
- if (!deportFilename.endsWith(".json")) {
180
- continue;
181
- }
273
+ try {
274
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
275
+ var acteur = _step4.value;
182
276
 
183
- const deportOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...deportSplitPath);
277
+ var reorganizedJsonFilePath = _path["default"].join(acteursReorganizedDir, acteur.uid["#text"] + ".json");
184
278
 
185
- if (options.verbose) {
186
- console.log(` Loading "deport" file: ${deportOriginalFilePath}…`);
279
+ _fsExtra["default"].writeFileSync(reorganizedJsonFilePath, JSON.stringify(acteur, null, 2), {
280
+ encoding: "utf8"
281
+ });
187
282
  }
283
+ } catch (err) {
284
+ _iterator4.e(err);
285
+ } finally {
286
+ _iterator4.f();
287
+ }
188
288
 
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];
289
+ var _iterator5 = _createForOfIteratorHelper(originalData["export"].organes.organe),
290
+ _step5;
195
291
 
196
- if (deports === undefined) {
197
- deports = deportsByActeurUid[deport.acteurRef] = [];
198
- }
292
+ try {
293
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
294
+ var organe = _step5.value;
199
295
 
200
- deports.push(deport);
201
- }
296
+ var _reorganizedJsonFilePath = _path["default"].join(organesReorganizedDir, organe.uid + ".json");
202
297
 
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);
298
+ _fsExtra["default"].writeFileSync(_reorganizedJsonFilePath, JSON.stringify(organe, null, 2), {
299
+ encoding: "utf8"
300
+ });
301
+ }
302
+ } catch (err) {
303
+ _iterator5.e(err);
304
+ } finally {
305
+ _iterator5.f();
205
306
  }
206
307
  }
308
+ break;
207
309
 
208
- const mandatsByActeurUid = {};
310
+ case _datasets.DatasetStructure.SegmentedFiles:
311
+ {
312
+ var deportsByActeurUid = {};
209
313
 
210
- if (fs.existsSync(path.join(originalJsonDirectoryOrFilePath, "mandat"))) {
211
- for (const mandatSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["mandat"])) {
212
- const mandatFilename = mandatSplitPath[mandatSplitPath.length - 1];
314
+ if (_fsExtra["default"].existsSync(_path["default"].join(originalJsonDirectoryOrFilePath, "deport"))) {
315
+ var _iterator6 = _createForOfIteratorHelper((0, _file_systems.walkDir)(originalJsonDirectoryOrFilePath, ["deport"])),
316
+ _step6;
213
317
 
214
- if (!mandatFilename.endsWith(".json")) {
215
- continue;
216
- }
318
+ try {
319
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
320
+ var deportSplitPath = _step6.value;
321
+ var deportFilename = deportSplitPath[deportSplitPath.length - 1];
217
322
 
218
- const mandatOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...mandatSplitPath);
323
+ if (!deportFilename.endsWith(".json")) {
324
+ continue;
325
+ }
219
326
 
220
- if (options.verbose) {
221
- console.log(` Loading "mandat" file: ${mandatOriginalFilePath}…`);
222
- }
327
+ var deportOriginalFilePath = _path["default"].join.apply(_path["default"], [originalJsonDirectoryOrFilePath].concat(_toConsumableArray(deportSplitPath)));
223
328
 
224
- const mandatOriginalJson = fs.readFileSync(mandatOriginalFilePath, {
225
- encoding: "utf8"
226
- });
227
- const mandatOriginal = validateRawData ? ActeursEtOrganesRawConvert.toMandat(mandatOriginalJson) : JSON.parse(mandatOriginalJson);
228
- const mandat = mandatOriginal.mandat;
229
- let mandats = mandatsByActeurUid[mandat.acteurRef];
329
+ if (options.verbose) {
330
+ console.log(" Loading \"deport\" file: ".concat(deportOriginalFilePath, "\u2026"));
331
+ }
230
332
 
231
- if (mandats === undefined) {
232
- mandats = mandatsByActeurUid[mandat.acteurRef] = [];
333
+ var deportOriginalJson = _fsExtra["default"].readFileSync(deportOriginalFilePath, {
334
+ encoding: "utf8"
335
+ });
336
+
337
+ var deportOriginal = validateRawData ? _acteurs_et_organes.Convert.toDeport(deportOriginalJson) : JSON.parse(deportOriginalJson);
338
+ var deport = deportOriginal.deport;
339
+ var _deports = deportsByActeurUid[deport.acteurRef];
340
+
341
+ if (_deports === undefined) {
342
+ _deports = deportsByActeurUid[deport.acteurRef] = [];
343
+ }
344
+
345
+ _deports.push(deport);
346
+ }
347
+ } catch (err) {
348
+ _iterator6.e(err);
349
+ } finally {
350
+ _iterator6.f();
233
351
  }
234
352
 
235
- mandats.push(mandat);
353
+ for (var _i = 0, _Object$values = Object.values(deportsByActeurUid); _i < _Object$values.length; _i++) {
354
+ var deports = _Object$values[_i];
355
+ deports.sort(function (a, b) {
356
+ return a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length;
357
+ });
358
+ }
236
359
  }
237
360
 
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
- }
361
+ var mandatsByActeurUid = {};
242
362
 
243
- for (const acteurSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["acteur"])) {
244
- const acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
363
+ if (_fsExtra["default"].existsSync(_path["default"].join(originalJsonDirectoryOrFilePath, "mandat"))) {
364
+ var _iterator7 = _createForOfIteratorHelper((0, _file_systems.walkDir)(originalJsonDirectoryOrFilePath, ["mandat"])),
365
+ _step7;
245
366
 
246
- if (!acteurFilename.endsWith(".json")) {
247
- continue;
248
- }
367
+ try {
368
+ for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
369
+ var mandatSplitPath = _step7.value;
370
+ var mandatFilename = mandatSplitPath[mandatSplitPath.length - 1];
249
371
 
250
- const acteurOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...acteurSplitPath);
372
+ if (!mandatFilename.endsWith(".json")) {
373
+ continue;
374
+ }
251
375
 
252
- if (options.verbose) {
253
- console.log(` Reorganizing "acteur" file: ${acteurOriginalFilePath}…`);
254
- }
376
+ var mandatOriginalFilePath = _path["default"].join.apply(_path["default"], [originalJsonDirectoryOrFilePath].concat(_toConsumableArray(mandatSplitPath)));
255
377
 
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
- }
378
+ if (options.verbose) {
379
+ console.log(" Loading \"mandat\" file: ".concat(mandatOriginalFilePath, "\u2026"));
380
+ }
270
381
 
271
- const mandats = mandatsByActeurUid[acteurUid];
382
+ var mandatOriginalJson = _fsExtra["default"].readFileSync(mandatOriginalFilePath, {
383
+ encoding: "utf8"
384
+ });
272
385
 
273
- if (mandats !== undefined) {
274
- assert.strictEqual(acteur.mandats, undefined);
275
- acteur.mandats = {
276
- mandat: mandats
277
- };
278
- }
386
+ var mandatOriginal = validateRawData ? _acteurs_et_organes.Convert.toMandatWrapper(mandatOriginalJson) : JSON.parse(mandatOriginalJson);
387
+ var mandat = mandatOriginal.mandat;
388
+ var _mandats = mandatsByActeurUid[mandat.acteurRef];
279
389
 
280
- const acteurReorganizedJsonFilePath = path.join(acteursReorganizedDir, acteurUid + ".json");
281
- fs.writeFileSync(acteurReorganizedJsonFilePath, JSON.stringify(acteur, null, 2), {
282
- encoding: "utf8"
283
- });
284
- }
390
+ if (_mandats === undefined) {
391
+ _mandats = mandatsByActeurUid[mandat.acteurRef] = [];
392
+ }
285
393
 
286
- for (const organeSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["organe"])) {
287
- const organeFilename = organeSplitPath[organeSplitPath.length - 1];
394
+ _mandats.push(mandat);
395
+ }
396
+ } catch (err) {
397
+ _iterator7.e(err);
398
+ } finally {
399
+ _iterator7.f();
400
+ }
288
401
 
289
- if (!organeFilename.endsWith(".json")) {
290
- continue;
402
+ for (var _i2 = 0, _Object$values2 = Object.values(mandatsByActeurUid); _i2 < _Object$values2.length; _i2++) {
403
+ var mandats = _Object$values2[_i2];
404
+ mandats.sort(function (a, b) {
405
+ return a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length;
406
+ });
407
+ }
291
408
  }
292
409
 
293
- const organeOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...organeSplitPath);
410
+ var _iterator8 = _createForOfIteratorHelper((0, _file_systems.walkDir)(originalJsonDirectoryOrFilePath, ["acteur"])),
411
+ _step8;
412
+
413
+ try {
414
+ for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
415
+ var acteurSplitPath = _step8.value;
416
+ var acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
417
+
418
+ if (!acteurFilename.endsWith(".json")) {
419
+ continue;
420
+ }
421
+
422
+ var acteurOriginalFilePath = _path["default"].join.apply(_path["default"], [originalJsonDirectoryOrFilePath].concat(_toConsumableArray(acteurSplitPath)));
294
423
 
295
- if (options.verbose) {
296
- console.log(` Reorganizing "organe" file: ${organeOriginalFilePath}…`);
424
+ if (options.verbose) {
425
+ console.log(" Reorganizing \"acteur\" file: ".concat(acteurOriginalFilePath, "\u2026"));
426
+ }
427
+
428
+ var acteurOriginalJson = _fsExtra["default"].readFileSync(acteurOriginalFilePath, {
429
+ encoding: "utf8"
430
+ });
431
+
432
+ var acteurOriginal = validateRawData ? _acteurs_et_organes.Convert.toActeur(acteurOriginalJson) : JSON.parse(acteurOriginalJson);
433
+ var _acteur = acteurOriginal.acteur;
434
+ var _acteurUid = _acteur.uid["#text"];
435
+ var _deports2 = deportsByActeurUid[_acteurUid];
436
+
437
+ if (_deports2 !== undefined) {
438
+ _assert["default"].strictEqual(_acteur.deports, undefined);
439
+
440
+ _acteur.deports = {
441
+ deport: _deports2
442
+ };
443
+ }
444
+
445
+ var _mandats2 = mandatsByActeurUid[_acteurUid];
446
+
447
+ if (_mandats2 !== undefined) {
448
+ _assert["default"].strictEqual(_acteur.mandats, undefined);
449
+
450
+ _acteur.mandats = {
451
+ mandat: _mandats2
452
+ };
453
+ }
454
+
455
+ var acteurReorganizedJsonFilePath = _path["default"].join(acteursReorganizedDir, _acteurUid + ".json");
456
+
457
+ _fsExtra["default"].writeFileSync(acteurReorganizedJsonFilePath, JSON.stringify(_acteur, null, 2), {
458
+ encoding: "utf8"
459
+ });
460
+ }
461
+ } catch (err) {
462
+ _iterator8.e(err);
463
+ } finally {
464
+ _iterator8.f();
297
465
  }
298
466
 
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
- });
467
+ var _iterator9 = _createForOfIteratorHelper((0, _file_systems.walkDir)(originalJsonDirectoryOrFilePath, ["organe"])),
468
+ _step9;
469
+
470
+ try {
471
+ for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
472
+ var organeSplitPath = _step9.value;
473
+ var organeFilename = organeSplitPath[organeSplitPath.length - 1];
474
+
475
+ if (!organeFilename.endsWith(".json")) {
476
+ continue;
477
+ }
478
+
479
+ var organeOriginalFilePath = _path["default"].join.apply(_path["default"], [originalJsonDirectoryOrFilePath].concat(_toConsumableArray(organeSplitPath)));
480
+
481
+ if (options.verbose) {
482
+ console.log(" Reorganizing \"organe\" file: ".concat(organeOriginalFilePath, "\u2026"));
483
+ }
484
+
485
+ var organeOriginalJson = _fsExtra["default"].readFileSync(organeOriginalFilePath, {
486
+ encoding: "utf8"
487
+ });
488
+
489
+ var organeOriginal = validateRawData ? _acteurs_et_organes.Convert.toOrgane(organeOriginalJson) : JSON.parse(organeOriginalJson);
490
+ var _organe = organeOriginal.organe;
491
+
492
+ var organeReorganizedJsonFilePath = _path["default"].join(organesReorganizedDir, _organe.uid + ".json");
493
+
494
+ _fsExtra["default"].writeFileSync(organeReorganizedJsonFilePath, JSON.stringify(_organe, null, 2), {
495
+ encoding: "utf8"
496
+ });
497
+ }
498
+ } catch (err) {
499
+ _iterator9.e(err);
500
+ } finally {
501
+ _iterator9.f();
502
+ }
308
503
  }
309
- }
310
- break;
311
- }
504
+ break;
505
+ }
312
506
 
313
- if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
314
- error = true;
507
+ if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
508
+ error = true;
509
+ }
315
510
  }
511
+ } catch (err) {
512
+ _iterator2.e(err);
513
+ } finally {
514
+ _iterator2.f();
316
515
  }
317
516
  }
318
517
 
319
- if (enabledDatasets & EnabledDatasets.Agendas) {
320
- for (const dataset of datasets.agendas) {
321
- const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
518
+ if (enabledDatasets & _datasets.EnabledDatasets.Agendas) {
519
+ var _iterator10 = _createForOfIteratorHelper(_datasets.datasets.agendas),
520
+ _step10;
322
521
 
323
- if (!options.silent) {
324
- console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
325
- }
522
+ try {
523
+ for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
524
+ var _dataset = _step10.value;
326
525
 
327
- const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
526
+ var _originalJsonDirectoryOrFilePath = _path["default"].join(dataDir, _dataset.filename);
328
527
 
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
- }
528
+ if (!options.silent) {
529
+ console.log("Reorganizing ".concat(_originalJsonDirectoryOrFilePath));
530
+ }
337
531
 
338
- const datasetReorganizedDir = path.join(dataDir, datasetName);
339
- fs.ensureDirSync(datasetReorganizedDir);
532
+ var _datasetName = _path["default"].basename(_originalJsonDirectoryOrFilePath, ".json");
340
533
 
341
- for (const filename of fs.readdirSync(datasetReorganizedDir)) {
342
- if (filename[0] === ".") {
343
- continue;
534
+ if (gitGroupUrl !== undefined) {
535
+ (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(_datasetName, ".git"), {
536
+ cwd: dataDir,
537
+ env: process.env,
538
+ encoding: "utf-8",
539
+ stdio: ["ignore", "ignore", "pipe"]
540
+ });
344
541
  }
345
542
 
346
- fs.removeSync(path.join(datasetReorganizedDir, filename));
347
- }
543
+ var _datasetReorganizedDir = _path["default"].join(dataDir, _datasetName);
348
544
 
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);
545
+ _fsExtra["default"].ensureDirSync(_datasetReorganizedDir);
356
546
 
357
- for (const reunion of originalData.reunions.reunion) {
358
- writeReunionReorganizedJson(datasetReorganizedDir, reunion);
547
+ var _iterator11 = _createForOfIteratorHelper(_fsExtra["default"].readdirSync(_datasetReorganizedDir)),
548
+ _step11;
549
+
550
+ try {
551
+ for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
552
+ var _filename = _step11.value;
553
+
554
+ if (_filename[0] === ".") {
555
+ continue;
359
556
  }
557
+
558
+ _fsExtra["default"].removeSync(_path["default"].join(_datasetReorganizedDir, _filename));
360
559
  }
361
- break;
560
+ } catch (err) {
561
+ _iterator11.e(err);
562
+ } finally {
563
+ _iterator11.f();
564
+ }
362
565
 
363
- case DatasetStructure.SegmentedFiles:
364
- {
365
- for (const reunionSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["reunion"])) {
366
- const reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
566
+ switch (_dataset.structure) {
567
+ case _datasets.DatasetStructure.SingleFile:
568
+ {
569
+ var _originalJson = _fsExtra["default"].readFileSync(_originalJsonDirectoryOrFilePath, {
570
+ encoding: "utf8"
571
+ });
367
572
 
368
- if (!reunionFilename.endsWith(".json")) {
369
- continue;
370
- }
573
+ var _originalData = validateRawData ? _agendas.Convert.toAgendas(_originalJson) : JSON.parse(_originalJson);
371
574
 
372
- const reunionOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...reunionSplitPath);
575
+ var _iterator12 = _createForOfIteratorHelper(_originalData.reunions.reunion),
576
+ _step12;
373
577
 
374
- if (options.verbose) {
375
- console.log(` Reorganizing "reunion" file: ${reunionOriginalFilePath}…`);
578
+ try {
579
+ for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
580
+ var reunion = _step12.value;
581
+ writeReunionReorganizedJson(_datasetReorganizedDir, reunion);
582
+ }
583
+ } catch (err) {
584
+ _iterator12.e(err);
585
+ } finally {
586
+ _iterator12.f();
376
587
  }
588
+ }
589
+ break;
377
590
 
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);
591
+ case _datasets.DatasetStructure.SegmentedFiles:
592
+ {
593
+ var _iterator13 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_originalJsonDirectoryOrFilePath, ["reunion"])),
594
+ _step13;
595
+
596
+ try {
597
+ for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
598
+ var reunionSplitPath = _step13.value;
599
+ var reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
600
+
601
+ if (!reunionFilename.endsWith(".json")) {
602
+ continue;
603
+ }
604
+
605
+ var reunionOriginalFilePath = _path["default"].join.apply(_path["default"], [_originalJsonDirectoryOrFilePath].concat(_toConsumableArray(reunionSplitPath)));
606
+
607
+ if (options.verbose) {
608
+ console.log(" Reorganizing \"reunion\" file: ".concat(reunionOriginalFilePath, "\u2026"));
609
+ }
610
+
611
+ var reunionOriginalJson = _fsExtra["default"].readFileSync(reunionOriginalFilePath, {
612
+ encoding: "utf8"
613
+ });
614
+
615
+ var reunionOriginal = validateRawData ? _agendas.Convert.toReunion(reunionOriginalJson) : JSON.parse(reunionOriginalJson);
616
+ var _reunion = reunionOriginal.reunion;
617
+ writeReunionReorganizedJson(_datasetReorganizedDir, _reunion);
618
+ }
619
+ } catch (err) {
620
+ _iterator13.e(err);
621
+ } finally {
622
+ _iterator13.f();
623
+ }
384
624
  }
385
- }
386
- break;
387
- }
625
+ break;
626
+ }
388
627
 
389
- if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
390
- error = true;
628
+ if (commitAndPush(_datasetReorganizedDir, options.commit, options.remote)) {
629
+ error = true;
630
+ }
391
631
  }
632
+ } catch (err) {
633
+ _iterator10.e(err);
634
+ } finally {
635
+ _iterator10.f();
392
636
  }
393
637
  }
394
638
 
395
- if (enabledDatasets & EnabledDatasets.Amendements) {
396
- for (const dataset of datasets.amendements) {
397
- const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
639
+ if (enabledDatasets & _datasets.EnabledDatasets.Amendements) {
640
+ var _iterator14 = _createForOfIteratorHelper(_datasets.datasets.amendements),
641
+ _step14;
398
642
 
399
- if (!options.silent) {
400
- console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
401
- }
643
+ try {
644
+ for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
645
+ var _dataset2 = _step14.value;
402
646
 
403
- const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
647
+ var _originalJsonDirectoryOrFilePath2 = _path["default"].join(dataDir, _dataset2.filename);
404
648
 
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
- }
649
+ if (!options.silent) {
650
+ console.log("Reorganizing ".concat(_originalJsonDirectoryOrFilePath2));
651
+ }
413
652
 
414
- const datasetReorganizedDir = path.join(dataDir, datasetName);
415
- fs.ensureDirSync(datasetReorganizedDir);
653
+ var _datasetName2 = _path["default"].basename(_originalJsonDirectoryOrFilePath2, ".json");
416
654
 
417
- for (const filename of fs.readdirSync(datasetReorganizedDir)) {
418
- if (filename[0] === ".") {
419
- continue;
655
+ if (gitGroupUrl !== undefined) {
656
+ (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(_datasetName2, ".git"), {
657
+ cwd: dataDir,
658
+ env: process.env,
659
+ encoding: "utf-8",
660
+ stdio: ["ignore", "ignore", "pipe"]
661
+ });
420
662
  }
421
663
 
422
- fs.removeSync(path.join(datasetReorganizedDir, filename));
423
- }
664
+ var _datasetReorganizedDir2 = _path["default"].join(dataDir, _datasetName2);
424
665
 
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
- }
666
+ _fsExtra["default"].ensureDirSync(_datasetReorganizedDir2);
667
+
668
+ var _iterator15 = _createForOfIteratorHelper(_fsExtra["default"].readdirSync(_datasetReorganizedDir2)),
669
+ _step15;
670
+
671
+ try {
672
+ for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
673
+ var _filename2 = _step15.value;
674
+
675
+ if (_filename2[0] === ".") {
676
+ continue;
437
677
  }
678
+
679
+ _fsExtra["default"].removeSync(_path["default"].join(_datasetReorganizedDir2, _filename2));
438
680
  }
439
- break;
681
+ } catch (err) {
682
+ _iterator15.e(err);
683
+ } finally {
684
+ _iterator15.f();
685
+ }
440
686
 
441
- case DatasetStructure.SegmentedFiles:
442
- {
443
- for (const amendementSplitPath of walkDir(originalJsonDirectoryOrFilePath)) {
444
- const amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
687
+ switch (_dataset2.structure) {
688
+ case _datasets.DatasetStructure.SingleFile:
689
+ {
690
+ var _originalJson2 = _fsExtra["default"].readFileSync(_originalJsonDirectoryOrFilePath2, {
691
+ encoding: "utf8"
692
+ });
445
693
 
446
- if (!amendementFilename.endsWith(".json")) {
447
- continue;
448
- }
694
+ var _originalData2 = validateRawData ? _amendements.Convert.toAmendements(_originalJson2) : JSON.parse(_originalJson2);
695
+
696
+ var _iterator16 = _createForOfIteratorHelper(_originalData2.textesEtAmendements.texteleg),
697
+ _step16;
449
698
 
450
- const amendementOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...amendementSplitPath);
699
+ try {
700
+ for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
701
+ var texteLegislatif = _step16.value;
451
702
 
452
- if (options.verbose) {
453
- console.log(` Reorganizing "amendement" file: ${amendementOriginalFilePath}…`);
703
+ var _iterator17 = _createForOfIteratorHelper(texteLegislatif.amendements),
704
+ _step17;
705
+
706
+ try {
707
+ for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {
708
+ var amendement = _step17.value;
709
+ writeAmendementReorganizedJson(_datasetReorganizedDir2, amendement);
710
+ }
711
+ } catch (err) {
712
+ _iterator17.e(err);
713
+ } finally {
714
+ _iterator17.f();
715
+ }
716
+ }
717
+ } catch (err) {
718
+ _iterator16.e(err);
719
+ } finally {
720
+ _iterator16.f();
454
721
  }
722
+ }
723
+ break;
455
724
 
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);
725
+ case _datasets.DatasetStructure.SegmentedFiles:
726
+ {
727
+ var _iterator18 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_originalJsonDirectoryOrFilePath2)),
728
+ _step18;
729
+
730
+ try {
731
+ for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {
732
+ var amendementSplitPath = _step18.value;
733
+ var amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
734
+
735
+ if (!amendementFilename.endsWith(".json")) {
736
+ continue;
737
+ }
738
+
739
+ var amendementOriginalFilePath = _path["default"].join.apply(_path["default"], [_originalJsonDirectoryOrFilePath2].concat(_toConsumableArray(amendementSplitPath)));
740
+
741
+ if (options.verbose) {
742
+ console.log(" Reorganizing \"amendement\" file: ".concat(amendementOriginalFilePath, "\u2026"));
743
+ }
744
+
745
+ var amendementOriginalJson = _fsExtra["default"].readFileSync(amendementOriginalFilePath, {
746
+ encoding: "utf8"
747
+ });
748
+
749
+ var amendementOriginal = validateRawData ? _amendements.Convert.toAmendementWrapper(amendementOriginalJson) : JSON.parse(amendementOriginalJson);
750
+ var _amendement = amendementOriginal.amendement;
751
+ writeAmendementReorganizedJson(_datasetReorganizedDir2, _amendement);
752
+ }
753
+ } catch (err) {
754
+ _iterator18.e(err);
755
+ } finally {
756
+ _iterator18.f();
757
+ }
462
758
  }
463
- }
464
- break;
465
- }
759
+ break;
760
+ }
466
761
 
467
- if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
468
- error = true;
762
+ if (commitAndPush(_datasetReorganizedDir2, options.commit, options.remote)) {
763
+ error = true;
764
+ }
469
765
  }
766
+ } catch (err) {
767
+ _iterator14.e(err);
768
+ } finally {
769
+ _iterator14.f();
470
770
  }
471
771
  }
472
772
 
473
- if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
474
- for (const dataset of datasets.dossiersLegislatifs) {
475
- const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
773
+ if (enabledDatasets & _datasets.EnabledDatasets.DossiersLegislatifs) {
774
+ var _iterator19 = _createForOfIteratorHelper(_datasets.datasets.dossiersLegislatifs),
775
+ _step19;
476
776
 
477
- if (!options.silent) {
478
- console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
479
- }
777
+ try {
778
+ for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {
779
+ var _dataset3 = _step19.value;
480
780
 
481
- const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
781
+ var _originalJsonDirectoryOrFilePath3 = _path["default"].join(dataDir, _dataset3.filename);
482
782
 
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
- }
783
+ if (!options.silent) {
784
+ console.log("Reorganizing ".concat(_originalJsonDirectoryOrFilePath3));
785
+ }
491
786
 
492
- const datasetReorganizedDir = path.join(dataDir, datasetName);
493
- fs.ensureDirSync(datasetReorganizedDir);
787
+ var _datasetName3 = _path["default"].basename(_originalJsonDirectoryOrFilePath3, ".json");
494
788
 
495
- for (const filename of fs.readdirSync(datasetReorganizedDir)) {
496
- if (filename[0] === ".") {
497
- continue;
789
+ if (gitGroupUrl !== undefined) {
790
+ (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(_datasetName3, ".git"), {
791
+ cwd: dataDir,
792
+ env: process.env,
793
+ encoding: "utf-8",
794
+ stdio: ["ignore", "ignore", "pipe"]
795
+ });
498
796
  }
499
797
 
500
- fs.removeSync(path.join(datasetReorganizedDir, filename));
501
- }
798
+ var _datasetReorganizedDir3 = _path["default"].join(dataDir, _datasetName3);
502
799
 
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
- }
800
+ _fsExtra["default"].ensureDirSync(_datasetReorganizedDir3);
801
+
802
+ var _iterator20 = _createForOfIteratorHelper(_fsExtra["default"].readdirSync(_datasetReorganizedDir3)),
803
+ _step20;
519
804
 
520
- for (const {
521
- dossierParlementaire
522
- } of originalData.export.dossiersLegislatifs.dossier) {
523
- writeDossierParlementaireReorganizedJson(dossiersDir, dossierParlementaire);
805
+ try {
806
+ for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {
807
+ var _filename3 = _step20.value;
808
+
809
+ if (_filename3[0] === ".") {
810
+ continue;
524
811
  }
812
+
813
+ _fsExtra["default"].removeSync(_path["default"].join(_datasetReorganizedDir3, _filename3));
525
814
  }
526
- break;
815
+ } catch (err) {
816
+ _iterator20.e(err);
817
+ } finally {
818
+ _iterator20.f();
819
+ }
527
820
 
528
- case DatasetStructure.SegmentedFiles:
529
- {
530
- for (const documentSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["document"])) {
531
- const documentFilename = documentSplitPath[documentSplitPath.length - 1];
821
+ var documentsDir = _path["default"].join(_datasetReorganizedDir3, "documents");
532
822
 
533
- if (!documentFilename.endsWith(".json")) {
534
- continue;
535
- }
823
+ _fsExtra["default"].mkdirSync(documentsDir);
536
824
 
537
- const documentOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...documentSplitPath);
825
+ var dossiersDir = _path["default"].join(_datasetReorganizedDir3, "dossiers");
538
826
 
539
- if (options.verbose) {
540
- console.log(` Reorganizing "document" file: ${documentOriginalFilePath}…`);
541
- }
827
+ _fsExtra["default"].mkdirSync(dossiersDir);
542
828
 
543
- const documentOriginalJson = fs.readFileSync(documentOriginalFilePath, {
829
+ switch (_dataset3.structure) {
830
+ case _datasets.DatasetStructure.SingleFile:
831
+ {
832
+ var _originalJson3 = _fsExtra["default"].readFileSync(_originalJsonDirectoryOrFilePath3, {
544
833
  encoding: "utf8"
545
834
  });
546
- const documentOriginal = validateRawData ? DossiersLegislatifsRawConvert.toDocument(documentOriginalJson) : JSON.parse(documentOriginalJson);
547
- const document = documentOriginal.document;
548
- writeDocumentReorganizedJson(documentsDir, document);
549
- }
550
835
 
551
- for (const dossierParlementaireSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["dossierParlementaire"])) {
552
- const dossierParlementaireFilename = dossierParlementaireSplitPath[dossierParlementaireSplitPath.length - 1];
836
+ var _originalData3 = validateRawData ? _dossiers_legislatifs.Convert.toDossiersLegislatifs(_originalJson3) : JSON.parse(_originalJson3);
837
+
838
+ var _iterator21 = _createForOfIteratorHelper(_originalData3["export"].textesLegislatifs.document),
839
+ _step21;
553
840
 
554
- if (!dossierParlementaireFilename.endsWith(".json")) {
555
- continue;
841
+ try {
842
+ for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {
843
+ var document = _step21.value;
844
+ writeDocumentReorganizedJson(documentsDir, document);
845
+ }
846
+ } catch (err) {
847
+ _iterator21.e(err);
848
+ } finally {
849
+ _iterator21.f();
556
850
  }
557
851
 
558
- const dossierParlementaireOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...dossierParlementaireSplitPath);
852
+ var _iterator22 = _createForOfIteratorHelper(_originalData3["export"].dossiersLegislatifs.dossier),
853
+ _step22;
559
854
 
560
- if (options.verbose) {
561
- console.log(` Reorganizing "dossierParlementaire" file: ${dossierParlementaireOriginalFilePath}…`);
855
+ try {
856
+ for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {
857
+ var dossierParlementaire = _step22.value.dossierParlementaire;
858
+ writeDossierParlementaireReorganizedJson(dossiersDir, dossierParlementaire);
859
+ }
860
+ } catch (err) {
861
+ _iterator22.e(err);
862
+ } finally {
863
+ _iterator22.f();
562
864
  }
865
+ }
866
+ break;
563
867
 
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);
868
+ case _datasets.DatasetStructure.SegmentedFiles:
869
+ {
870
+ var _iterator23 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_originalJsonDirectoryOrFilePath3, ["document"])),
871
+ _step23;
872
+
873
+ try {
874
+ for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {
875
+ var documentSplitPath = _step23.value;
876
+ var documentFilename = documentSplitPath[documentSplitPath.length - 1];
877
+
878
+ if (!documentFilename.endsWith(".json")) {
879
+ continue;
880
+ }
881
+
882
+ var documentOriginalFilePath = _path["default"].join.apply(_path["default"], [_originalJsonDirectoryOrFilePath3].concat(_toConsumableArray(documentSplitPath)));
883
+
884
+ if (options.verbose) {
885
+ console.log(" Reorganizing \"document\" file: ".concat(documentOriginalFilePath, "\u2026"));
886
+ }
887
+
888
+ var documentOriginalJson = _fsExtra["default"].readFileSync(documentOriginalFilePath, {
889
+ encoding: "utf8"
890
+ });
891
+
892
+ var documentOriginal = validateRawData ? _dossiers_legislatifs.Convert.toDocument(documentOriginalJson) : JSON.parse(documentOriginalJson);
893
+ var _document = documentOriginal.document;
894
+ writeDocumentReorganizedJson(documentsDir, _document);
895
+ }
896
+ } catch (err) {
897
+ _iterator23.e(err);
898
+ } finally {
899
+ _iterator23.f();
900
+ }
901
+
902
+ var _iterator24 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_originalJsonDirectoryOrFilePath3, ["dossierParlementaire"])),
903
+ _step24;
904
+
905
+ try {
906
+ for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {
907
+ var dossierParlementaireSplitPath = _step24.value;
908
+ var dossierParlementaireFilename = dossierParlementaireSplitPath[dossierParlementaireSplitPath.length - 1];
909
+
910
+ if (!dossierParlementaireFilename.endsWith(".json")) {
911
+ continue;
912
+ }
913
+
914
+ var dossierParlementaireOriginalFilePath = _path["default"].join.apply(_path["default"], [_originalJsonDirectoryOrFilePath3].concat(_toConsumableArray(dossierParlementaireSplitPath)));
915
+
916
+ if (options.verbose) {
917
+ console.log(" Reorganizing \"dossierParlementaire\" file: ".concat(dossierParlementaireOriginalFilePath, "\u2026"));
918
+ }
919
+
920
+ var dossierParlementaireOriginalJson = _fsExtra["default"].readFileSync(dossierParlementaireOriginalFilePath, {
921
+ encoding: "utf8"
922
+ });
923
+
924
+ var dossierParlementaireOriginal = validateRawData ? _dossiers_legislatifs.Convert.toDossierParlementaire(dossierParlementaireOriginalJson) : JSON.parse(dossierParlementaireOriginalJson);
925
+ var _dossierParlementaire = dossierParlementaireOriginal.dossierParlementaire;
926
+ writeDossierParlementaireReorganizedJson(dossiersDir, _dossierParlementaire);
927
+ }
928
+ } catch (err) {
929
+ _iterator24.e(err);
930
+ } finally {
931
+ _iterator24.f();
932
+ }
570
933
  }
571
- }
572
- break;
573
- }
934
+ break;
935
+ }
574
936
 
575
- if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
576
- error = true;
937
+ if (commitAndPush(_datasetReorganizedDir3, options.commit, options.remote)) {
938
+ error = true;
939
+ }
577
940
  }
941
+ } catch (err) {
942
+ _iterator19.e(err);
943
+ } finally {
944
+ _iterator19.f();
578
945
  }
579
946
  }
580
947
 
581
- if (enabledDatasets & EnabledDatasets.Scrutins) {
582
- for (const dataset of datasets.scrutins) {
583
- const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
948
+ if (enabledDatasets & _datasets.EnabledDatasets.Scrutins) {
949
+ var _iterator25 = _createForOfIteratorHelper(_datasets.datasets.scrutins),
950
+ _step25;
584
951
 
585
- if (!options.silent) {
586
- console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
587
- }
952
+ try {
953
+ for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {
954
+ var _dataset4 = _step25.value;
588
955
 
589
- const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
956
+ var _originalJsonDirectoryOrFilePath4 = _path["default"].join(dataDir, _dataset4.filename);
590
957
 
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
- }
958
+ if (!options.silent) {
959
+ console.log("Reorganizing ".concat(_originalJsonDirectoryOrFilePath4));
960
+ }
599
961
 
600
- const datasetReorganizedDir = path.join(dataDir, datasetName);
601
- fs.ensureDirSync(datasetReorganizedDir);
962
+ var _datasetName4 = _path["default"].basename(_originalJsonDirectoryOrFilePath4, ".json");
602
963
 
603
- for (const filename of fs.readdirSync(datasetReorganizedDir)) {
604
- if (filename[0] === ".") {
605
- continue;
964
+ if (gitGroupUrl !== undefined) {
965
+ (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(_datasetName4, ".git"), {
966
+ cwd: dataDir,
967
+ env: process.env,
968
+ encoding: "utf-8",
969
+ stdio: ["ignore", "ignore", "pipe"]
970
+ });
606
971
  }
607
972
 
608
- fs.removeSync(path.join(datasetReorganizedDir, filename));
609
- }
973
+ var _datasetReorganizedDir4 = _path["default"].join(dataDir, _datasetName4);
974
+
975
+ _fsExtra["default"].ensureDirSync(_datasetReorganizedDir4);
976
+
977
+ var _iterator26 = _createForOfIteratorHelper(_fsExtra["default"].readdirSync(_datasetReorganizedDir4)),
978
+ _step26;
610
979
 
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);
980
+ try {
981
+ for (_iterator26.s(); !(_step26 = _iterator26.n()).done;) {
982
+ var _filename4 = _step26.value;
618
983
 
619
- for (const scrutin of originalData.scrutins.scrutin) {
620
- writeScrutinReorganizedJson(datasetReorganizedDir, scrutin);
984
+ if (_filename4[0] === ".") {
985
+ continue;
621
986
  }
987
+
988
+ _fsExtra["default"].removeSync(_path["default"].join(_datasetReorganizedDir4, _filename4));
622
989
  }
623
- break;
990
+ } catch (err) {
991
+ _iterator26.e(err);
992
+ } finally {
993
+ _iterator26.f();
994
+ }
624
995
 
625
- case DatasetStructure.SegmentedFiles:
626
- {
627
- for (const scrutinSplitPath of walkDir(originalJsonDirectoryOrFilePath)) {
628
- const scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
996
+ switch (_dataset4.structure) {
997
+ case _datasets.DatasetStructure.SingleFile:
998
+ {
999
+ var _originalJson4 = _fsExtra["default"].readFileSync(_originalJsonDirectoryOrFilePath4, {
1000
+ encoding: "utf8"
1001
+ });
629
1002
 
630
- if (!scrutinFilename.endsWith(".json")) {
631
- continue;
632
- }
1003
+ var _originalData4 = validateRawData ? _scrutins.Convert.toScrutins(_originalJson4) : JSON.parse(_originalJson4);
633
1004
 
634
- const scrutinOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...scrutinSplitPath);
1005
+ var _iterator27 = _createForOfIteratorHelper(_originalData4.scrutins.scrutin),
1006
+ _step27;
635
1007
 
636
- if (options.verbose) {
637
- console.log(` Reorganizing "scrutin" file: ${scrutinOriginalFilePath}…`);
1008
+ try {
1009
+ for (_iterator27.s(); !(_step27 = _iterator27.n()).done;) {
1010
+ var scrutin = _step27.value;
1011
+ writeScrutinReorganizedJson(_datasetReorganizedDir4, scrutin);
1012
+ }
1013
+ } catch (err) {
1014
+ _iterator27.e(err);
1015
+ } finally {
1016
+ _iterator27.f();
638
1017
  }
1018
+ }
1019
+ break;
639
1020
 
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);
1021
+ case _datasets.DatasetStructure.SegmentedFiles:
1022
+ {
1023
+ var _iterator28 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_originalJsonDirectoryOrFilePath4)),
1024
+ _step28;
1025
+
1026
+ try {
1027
+ for (_iterator28.s(); !(_step28 = _iterator28.n()).done;) {
1028
+ var scrutinSplitPath = _step28.value;
1029
+ var scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
1030
+
1031
+ if (!scrutinFilename.endsWith(".json")) {
1032
+ continue;
1033
+ }
1034
+
1035
+ var scrutinOriginalFilePath = _path["default"].join.apply(_path["default"], [_originalJsonDirectoryOrFilePath4].concat(_toConsumableArray(scrutinSplitPath)));
1036
+
1037
+ if (options.verbose) {
1038
+ console.log(" Reorganizing \"scrutin\" file: ".concat(scrutinOriginalFilePath, "\u2026"));
1039
+ }
1040
+
1041
+ var scrutinOriginalJson = _fsExtra["default"].readFileSync(scrutinOriginalFilePath, {
1042
+ encoding: "utf8"
1043
+ });
1044
+
1045
+ var scrutinOriginal = validateRawData ? _scrutins.Convert.toScrutinWrapper(scrutinOriginalJson) : JSON.parse(scrutinOriginalJson);
1046
+ var _scrutin = scrutinOriginal.scrutin;
1047
+ writeScrutinReorganizedJson(_datasetReorganizedDir4, _scrutin);
1048
+ }
1049
+ } catch (err) {
1050
+ _iterator28.e(err);
1051
+ } finally {
1052
+ _iterator28.f();
1053
+ }
646
1054
  }
647
- }
648
- break;
649
- }
1055
+ break;
1056
+ }
650
1057
 
651
- if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
652
- error = true;
1058
+ if (commitAndPush(_datasetReorganizedDir4, options.commit, options.remote)) {
1059
+ error = true;
1060
+ }
653
1061
  }
1062
+ } catch (err) {
1063
+ _iterator25.e(err);
1064
+ } finally {
1065
+ _iterator25.f();
654
1066
  }
655
1067
  } // Restore standard conversion of dates to JSON.
656
1068
 
657
1069
 
658
- Date.prototype.toJSON = existingDateToJson;
1070
+ Date.prototype.toJSON = _dates.existingDateToJson;
659
1071
  return error;
660
1072
  }
661
1073
 
662
1074
  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), {
1075
+ var uidTexteLegislatif = amendement.texteLegislatifRef;
1076
+
1077
+ _assert["default"].notStrictEqual(uidTexteLegislatif, undefined);
1078
+
1079
+ var texteLegislatifDir = _path["default"].join(datasetReorganizedDir, uidTexteLegislatif);
1080
+
1081
+ _fsExtra["default"].ensureDirSync(texteLegislatifDir);
1082
+
1083
+ var reorganizedJsonFilePath = _path["default"].join(texteLegislatifDir, amendement.uid + ".json");
1084
+
1085
+ _fsExtra["default"].writeFileSync(reorganizedJsonFilePath, JSON.stringify(amendement, null, 2), {
669
1086
  encoding: "utf8"
670
1087
  });
671
1088
  }
672
1089
 
673
1090
  function writeDocumentReorganizedJson(documentsDir, document) {
674
- const basename = pathFromDocumentUid(documentsDir, document.uid);
675
- fs.writeFileSync(`${basename}.json`, JSON.stringify(document, null, 2), {
1091
+ var basename = (0, _loaders.pathFromDocumentUid)(documentsDir, document.uid);
1092
+
1093
+ _fsExtra["default"].writeFileSync("".concat(basename, ".json"), JSON.stringify(document, null, 2), {
676
1094
  encoding: "utf8"
677
1095
  });
678
1096
  }
679
1097
 
680
1098
  function writeDossierParlementaireReorganizedJson(dossiersDir, dossierParlementaire) {
681
- const basename = pathFromDossierParlementaireUid(dossiersDir, dossierParlementaire.uid);
682
- fs.writeFileSync(`${basename}.json`, JSON.stringify(dossierParlementaire, null, 2), {
1099
+ var basename = (0, _loaders.pathFromDossierParlementaireUid)(dossiersDir, dossierParlementaire.uid);
1100
+
1101
+ _fsExtra["default"].writeFileSync("".concat(basename, ".json"), JSON.stringify(dossierParlementaire, null, 2), {
683
1102
  encoding: "utf8"
684
1103
  });
685
1104
  }
686
1105
 
687
1106
  function writeReunionReorganizedJson(reunionsDir, reunion) {
688
- const basename = pathFromReunionUid(reunionsDir, reunion.uid);
689
- fs.writeFileSync(`${basename}.json`, JSON.stringify(reunion, null, 2), {
1107
+ var basename = (0, _loaders.pathFromReunionUid)(reunionsDir, reunion.uid);
1108
+
1109
+ _fsExtra["default"].writeFileSync("".concat(basename, ".json"), JSON.stringify(reunion, null, 2), {
690
1110
  encoding: "utf8"
691
1111
  });
692
1112
  }
693
1113
 
694
1114
  function writeScrutinReorganizedJson(scrutinsDir, scrutin) {
695
- const basename = pathFromScrutinUid(scrutinsDir, scrutin.uid);
696
- fs.writeFileSync(`${basename}.json`, JSON.stringify(scrutin, null, 2), {
1115
+ var basename = (0, _loaders.pathFromScrutinUid)(scrutinsDir, scrutin.uid);
1116
+
1117
+ _fsExtra["default"].writeFileSync("".concat(basename, ".json"), JSON.stringify(scrutin, null, 2), {
697
1118
  encoding: "utf8"
698
1119
  });
699
1120
  }
@@ -701,7 +1122,7 @@ function writeScrutinReorganizedJson(scrutinsDir, scrutin) {
701
1122
 
702
1123
 
703
1124
  if (process.argv[1].endsWith("reorganize_data.ts")) {
704
- const options = commandLineArgs(optionsDefinitions);
1125
+ var options = (0, _commandLineArgs["default"])(optionsDefinitions);
705
1126
 
706
1127
  if (reorganizeData(options)) {
707
1128
  process.exit(1);
@@ -709,4 +1130,4 @@ if (process.argv[1].endsWith("reorganize_data.ts")) {
709
1130
  process.exit(0);
710
1131
  }
711
1132
  }
712
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImRhdGFzZXRzIiwiRGF0YXNldFN0cnVjdHVyZSIsIkVuYWJsZWREYXRhc2V0cyIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInBhdGNoZWREYXRlVG9Kc29uIiwid2Fsa0RpciIsInBhdGhGcm9tRG9jdW1lbnRVaWQiLCJwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkIiwicGF0aEZyb21SZXVuaW9uVWlkIiwicGF0aEZyb21TY3J1dGluVWlkIiwiQ29udmVydCIsIkFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0IiwiQWdlbmRhc1Jhd0NvbnZlcnQiLCJBbWVuZGVtZW50c1Jhd0NvbnZlcnQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydCIsIlNjcnV0aW5zUmF3Q29udmVydCIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImFsaWFzIiwiaGVscCIsIm5hbWUiLCJ0eXBlIiwiU3RyaW5nIiwiQm9vbGVhbiIsImRlZmF1bHRWYWx1ZSIsIm11bHRpcGxlIiwiZGVmYXVsdE9wdGlvbiIsImNvbW1pdEFuZFB1c2giLCJyZXBvc2l0b3J5RGlyIiwiY29tbWl0IiwicmVtb3RlcyIsImVycm9yIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJjaGlsZFByb2Nlc3MiLCJzdGRlcnIiLCJ0ZXN0Iiwic3Rkb3V0IiwiY29uc29sZSIsIm91dHB1dCIsInJlbW90ZSIsInJlb3JnYW5pemVEYXRhIiwib3B0aW9ucyIsImRhdGFEaXIiLCJEYXRlIiwicHJvdG90eXBlIiwidG9KU09OIiwiZ2l0R3JvdXBVcmwiLCJjbG9uZSIsInRyaW0iLCJyZXBsYWNlIiwidW5kZWZpbmVkIiwidmFsaWRhdGVSYXdEYXRhIiwiY2F0ZWdvcmllcyIsIm1hcCIsImRhdGFzZXROYW1lIiwibm90U3RyaWN0RXF1YWwiLCJlbmFibGVkRGF0YXNldHMiLCJyZWR1Y2UiLCJOb25lIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXQiLCJhY3RldXJzRXRPcmdhbmVzIiwib3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCIsImpvaW4iLCJmaWxlbmFtZSIsInNpbGVudCIsImxvZyIsImJhc2VuYW1lIiwiZGF0YXNldFJlb3JnYW5pemVkRGlyIiwiZW5zdXJlRGlyU3luYyIsInJlYWRkaXJTeW5jIiwicmVtb3ZlU3luYyIsImFjdGV1cnNSZW9yZ2FuaXplZERpciIsIm1rZGlyU3luYyIsIm9yZ2FuZXNSZW9yZ2FuaXplZERpciIsInN0cnVjdHVyZSIsIlNpbmdsZUZpbGUiLCJvcmlnaW5hbEpzb24iLCJyZWFkRmlsZVN5bmMiLCJvcmlnaW5hbERhdGEiLCJ0b0FjdGV1cnNFdE9yZ2FuZXMiLCJKU09OIiwicGFyc2UiLCJhY3RldXIiLCJleHBvcnQiLCJhY3RldXJzIiwicmVvcmdhbml6ZWRKc29uRmlsZVBhdGgiLCJ1aWQiLCJ3cml0ZUZpbGVTeW5jIiwic3RyaW5naWZ5Iiwib3JnYW5lIiwib3JnYW5lcyIsIlNlZ21lbnRlZEZpbGVzIiwiZGVwb3J0c0J5QWN0ZXVyVWlkIiwiZXhpc3RzU3luYyIsImRlcG9ydFNwbGl0UGF0aCIsImRlcG9ydEZpbGVuYW1lIiwibGVuZ3RoIiwiZW5kc1dpdGgiLCJkZXBvcnRPcmlnaW5hbEZpbGVQYXRoIiwidmVyYm9zZSIsImRlcG9ydE9yaWdpbmFsSnNvbiIsImRlcG9ydE9yaWdpbmFsIiwidG9EZXBvcnQiLCJkZXBvcnQiLCJkZXBvcnRzIiwiYWN0ZXVyUmVmIiwicHVzaCIsIk9iamVjdCIsInZhbHVlcyIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJtYW5kYXRzQnlBY3RldXJVaWQiLCJtYW5kYXRTcGxpdFBhdGgiLCJtYW5kYXRGaWxlbmFtZSIsIm1hbmRhdE9yaWdpbmFsRmlsZVBhdGgiLCJtYW5kYXRPcmlnaW5hbEpzb24iLCJtYW5kYXRPcmlnaW5hbCIsInRvTWFuZGF0IiwibWFuZGF0IiwibWFuZGF0cyIsImFjdGV1clNwbGl0UGF0aCIsImFjdGV1ckZpbGVuYW1lIiwiYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCIsImFjdGV1ck9yaWdpbmFsSnNvbiIsImFjdGV1ck9yaWdpbmFsIiwidG9BY3RldXIiLCJhY3RldXJVaWQiLCJzdHJpY3RFcXVhbCIsImFjdGV1clJlb3JnYW5pemVkSnNvbkZpbGVQYXRoIiwib3JnYW5lU3BsaXRQYXRoIiwib3JnYW5lRmlsZW5hbWUiLCJvcmdhbmVPcmlnaW5hbEZpbGVQYXRoIiwib3JnYW5lT3JpZ2luYWxKc29uIiwib3JnYW5lT3JpZ2luYWwiLCJ0b09yZ2FuZSIsIm9yZ2FuZVJlb3JnYW5pemVkSnNvbkZpbGVQYXRoIiwiQWdlbmRhcyIsImFnZW5kYXMiLCJ0b0FnZW5kYXMiLCJyZXVuaW9uIiwicmV1bmlvbnMiLCJ3cml0ZVJldW5pb25SZW9yZ2FuaXplZEpzb24iLCJyZXVuaW9uU3BsaXRQYXRoIiwicmV1bmlvbkZpbGVuYW1lIiwicmV1bmlvbk9yaWdpbmFsRmlsZVBhdGgiLCJyZXVuaW9uT3JpZ2luYWxKc29uIiwicmV1bmlvbk9yaWdpbmFsIiwidG9SZXVuaW9uIiwiQW1lbmRlbWVudHMiLCJhbWVuZGVtZW50cyIsInRvQW1lbmRlbWVudHMiLCJ0ZXh0ZUxlZ2lzbGF0aWYiLCJ0ZXh0ZXNFdEFtZW5kZW1lbnRzIiwidGV4dGVsZWciLCJhbWVuZGVtZW50Iiwid3JpdGVBbWVuZGVtZW50UmVvcmdhbml6ZWRKc29uIiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsImFtZW5kZW1lbnRGaWxlbmFtZSIsImFtZW5kZW1lbnRPcmlnaW5hbEZpbGVQYXRoIiwiYW1lbmRlbWVudE9yaWdpbmFsSnNvbiIsImFtZW5kZW1lbnRPcmlnaW5hbCIsInRvQW1lbmRlbWVudFdyYXBwZXIiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9zc2llcnNMZWdpc2xhdGlmcyIsImRvY3VtZW50c0RpciIsImRvc3NpZXJzRGlyIiwidG9Eb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9jdW1lbnQiLCJ0ZXh0ZXNMZWdpc2xhdGlmcyIsIndyaXRlRG9jdW1lbnRSZW9yZ2FuaXplZEpzb24iLCJkb3NzaWVyUGFybGVtZW50YWlyZSIsImRvc3NpZXIiLCJ3cml0ZURvc3NpZXJQYXJsZW1lbnRhaXJlUmVvcmdhbml6ZWRKc29uIiwiZG9jdW1lbnRTcGxpdFBhdGgiLCJkb2N1bWVudEZpbGVuYW1lIiwiZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRoIiwiZG9jdW1lbnRPcmlnaW5hbEpzb24iLCJkb2N1bWVudE9yaWdpbmFsIiwidG9Eb2N1bWVudCIsImRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoIiwiZG9zc2llclBhcmxlbWVudGFpcmVGaWxlbmFtZSIsImRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxGaWxlUGF0aCIsImRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uIiwiZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbCIsInRvRG9zc2llclBhcmxlbWVudGFpcmUiLCJTY3J1dGlucyIsInNjcnV0aW5zIiwidG9TY3J1dGlucyIsInNjcnV0aW4iLCJ3cml0ZVNjcnV0aW5SZW9yZ2FuaXplZEpzb24iLCJzY3J1dGluU3BsaXRQYXRoIiwic2NydXRpbkZpbGVuYW1lIiwic2NydXRpbk9yaWdpbmFsRmlsZVBhdGgiLCJzY3J1dGluT3JpZ2luYWxKc29uIiwic2NydXRpbk9yaWdpbmFsIiwidG9TY3J1dGluV3JhcHBlciIsInVpZFRleHRlTGVnaXNsYXRpZiIsInRleHRlTGVnaXNsYXRpZlJlZiIsInRleHRlTGVnaXNsYXRpZkRpciIsInJldW5pb25zRGlyIiwic2NydXRpbnNEaXIiLCJhcmd2IiwiZXhpdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3Jlb3JnYW5pemVfZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IHsgQ2hpbGRQcm9jZXNzLCBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5pbXBvcnQgeyBkYXRhc2V0cywgRGF0YXNldFN0cnVjdHVyZSwgRW5hYmxlZERhdGFzZXRzIH0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IGV4aXN0aW5nRGF0ZVRvSnNvbiwgcGF0Y2hlZERhdGVUb0pzb24gfSBmcm9tIFwiLi4vZGF0ZXNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0IHtcbiAgcGF0aEZyb21Eb2N1bWVudFVpZCxcbiAgcGF0aEZyb21Eb3NzaWVyUGFybGVtZW50YWlyZVVpZCxcbiAgcGF0aEZyb21SZXVuaW9uVWlkLFxuICBwYXRoRnJvbVNjcnV0aW5VaWQsXG59IGZyb20gXCIuLi9sb2FkZXJzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFnZW5kYXNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQW1lbmRlbWVudHNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9kb3NzaWVyc19sZWdpc2xhdGlmc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIFNjcnV0aW5zUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvc2NydXRpbnNcIlxuXG5jb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gIHtcbiAgICBhbGlhczogXCJDXCIsXG4gICAgaGVscDogXCJjbG9uZSByZXBvc2l0b3JpZXMgZnJvbSBnaXZlbiBncm91cCAob3Igb3JnYW5pemF0aW9uKSBnaXQgVVJMXCIsXG4gICAgbmFtZTogXCJjbG9uZVwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcImNcIixcbiAgICBoZWxwOiBcImNvbW1pdCBzcGxpdCBmaWxlc1wiLFxuICAgIG5hbWU6IFwiY29tbWl0XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcImtcIixcbiAgICBkZWZhdWx0VmFsdWU6IFtcIkFsbFwiXSxcbiAgICBoZWxwOiBcImNhdGVnb3JpZXMgb2YgZGF0YXNldHMgdG8gcmVvcmdhbml6ZVwiLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG5hbWU6IFwiY2F0ZWdvcmllc1wiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInJcIixcbiAgICBoZWxwOiBcInB1c2ggY29tbWl0IHRvIGdpdmVuIHJlbW90ZVwiLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG5hbWU6IFwicmVtb3RlXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwic1wiLFxuICAgIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gICAgbmFtZTogXCJzaWxlbnRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwiVlwiLFxuICAgIGhlbHA6IFwiZG9uJ3QgdmFsaWRhdGUgcmF3IGRhdGFcIixcbiAgICBuYW1lOiBcIm5vLXZhbGlkYXRlLXJhd1wiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJ2XCIsXG4gICAgaGVscDogXCJ2ZXJib3NlIGxvZ3NcIixcbiAgICBuYW1lOiBcInZlcmJvc2VcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICBoZWxwOiBcImRpcmVjdG9yeSBjb250YWluaW5nIEFzc2VtYmzDqWUgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuXG5mdW5jdGlvbiBjb21taXRBbmRQdXNoKFxuICByZXBvc2l0b3J5RGlyOiBzdHJpbmcsXG4gIGNvbW1pdDogYm9vbGVhbixcbiAgcmVtb3Rlcz86IHN0cmluZ1tdLFxuKTogYm9vbGVhbiB7XG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGlmIChjb21taXQpIHtcbiAgICBleGVjU3luYyhgZ2l0IGFkZCAuYCwge1xuICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICBleGVjU3luYygnZ2l0IGNvbW1pdCAtbSBcIk5vdXZlbGxlIG1vaXNzb25cIicsIHtcbiAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGNoaWxkUHJvY2VzcyBhcyBDaGlsZFByb2Nlc3MpLnN0ZGVyciA9PT0gbnVsbCB8fFxuICAgICAgICAhL25vdGhpbmcgdG8gY29tbWl0Ly50ZXN0KChjaGlsZFByb2Nlc3MgYXMgYW55KS5zdGRvdXQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICB0aHJvdyBjaGlsZFByb2Nlc3NcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCByZW1vdGUgb2YgcmVtb3RlcyB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBwdXNoICR7cmVtb3RlfSBtYXN0ZXJgLCB7XG4gICAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICAvLyBEb24ndCBzdG9wIHdoZW4gcHVzaCBmYWlscy5cbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIHJlb3JnYW5pemVEYXRhKG9wdGlvbnM6IGFueSk6IGJvb2xlYW4ge1xuICBjb25zdCBkYXRhRGlyID0gb3B0aW9ucy5kYXRhRGlyXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IHBhdGNoZWREYXRlVG9Kc29uXG5cbiAgbGV0IGVycm9yID0gZmFsc2VcbiAgY29uc3QgZ2l0R3JvdXBVcmwgPSBvcHRpb25zLmNsb25lXG4gICAgPyBvcHRpb25zLmNsb25lLnRyaW0oKS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgOiB1bmRlZmluZWRcbiAgY29uc3QgdmFsaWRhdGVSYXdEYXRhID0gIW9wdGlvbnNbXCJuby12YWxpZGF0ZS1yYXdcIl1cblxuICBvcHRpb25zLmNhdGVnb3JpZXMubWFwKChkYXRhc2V0TmFtZTogc3RyaW5nKSA9PlxuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICAgIChFbmFibGVkRGF0YXNldHMgYXMgYW55IGFzIHsgW25hbWU6IHN0cmluZ106IEVuYWJsZWREYXRhc2V0cyB9KVtcbiAgICAgICAgZGF0YXNldE5hbWVcbiAgICAgIF0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBgVW5rbm93biBuYW1lIG9mIGRhdGFzZXQ6ICR7ZGF0YXNldE5hbWV9YCxcbiAgICApLFxuICApXG4gIGNvbnN0IGVuYWJsZWREYXRhc2V0cyA9IG9wdGlvbnMuY2F0ZWdvcmllcy5yZWR1Y2UoXG4gICAgKGVuYWJsZWREYXRhc2V0czogRW5hYmxlZERhdGFzZXRzLCBkYXRhc2V0TmFtZTogc3RyaW5nKTogRW5hYmxlZERhdGFzZXRzID0+XG4gICAgICBlbmFibGVkRGF0YXNldHMgfFxuICAgICAgKEVuYWJsZWREYXRhc2V0cyBhcyBhbnkgYXMgeyBbbmFtZTogc3RyaW5nXTogRW5hYmxlZERhdGFzZXRzIH0pW1xuICAgICAgICBkYXRhc2V0TmFtZVxuICAgICAgXSxcbiAgICBFbmFibGVkRGF0YXNldHMuTm9uZSxcbiAgKVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWN0ZXVyc0V0T3JnYW5lcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcikpIHtcbiAgICAgICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBmaWxlbmFtZSkpXG4gICAgICB9XG4gICAgICBjb25zdCBhY3RldXJzUmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBcImFjdGV1cnNcIilcbiAgICAgIGZzLm1rZGlyU3luYyhhY3RldXJzUmVvcmdhbml6ZWREaXIpXG4gICAgICBjb25zdCBvcmdhbmVzUmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBcIm9yZ2FuZXNcIilcbiAgICAgIGZzLm1rZGlyU3luYyhvcmdhbmVzUmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvQWN0ZXVyc0V0T3JnYW5lcyhvcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0ZXVyIG9mIG9yaWdpbmFsRGF0YS5leHBvcnQuYWN0ZXVycy5hY3RldXIpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBhY3RldXJzUmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgYWN0ZXVyLnVpZFtcIiN0ZXh0XCJdICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYWN0ZXVyLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9yZ2FuZSBvZiBvcmlnaW5hbERhdGEuZXhwb3J0Lm9yZ2FuZXMub3JnYW5lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JnYW5lc1Jlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIG9yZ2FuZS51aWQgKyBcIi5qc29uXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgICAgICByZW9yZ2FuaXplZEpzb25GaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShvcmdhbmUsIG51bGwsIDIpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBkZXBvcnRzQnlBY3RldXJVaWQ6IHtcbiAgICAgICAgICAgICAgW2FjdGV1clVpZDogc3RyaW5nXTogeyB1aWQ6IHN0cmluZyB9W11cbiAgICAgICAgICAgIH0gPSB7fVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKFxuICAgICAgICAgICAgICAgIHBhdGguam9pbihvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLCBcImRlcG9ydFwiKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZGVwb3J0U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBbXCJkZXBvcnRcIl0sXG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnRGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgICBkZXBvcnRTcGxpdFBhdGhbZGVwb3J0U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgICAgaWYgKCFkZXBvcnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIC4uLmRlcG9ydFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGAgIExvYWRpbmcgXCJkZXBvcnRcIiBmaWxlOiAke2RlcG9ydE9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICBkZXBvcnRPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnRPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvRGVwb3J0KGRlcG9ydE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShkZXBvcnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0ID0gZGVwb3J0T3JpZ2luYWwuZGVwb3J0XG4gICAgICAgICAgICAgICAgbGV0IGRlcG9ydHMgPSBkZXBvcnRzQnlBY3RldXJVaWRbZGVwb3J0LmFjdGV1clJlZl1cbiAgICAgICAgICAgICAgICBpZiAoZGVwb3J0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBkZXBvcnRzID0gZGVwb3J0c0J5QWN0ZXVyVWlkW2RlcG9ydC5hY3RldXJSZWZdID0gW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVwb3J0cy5wdXNoKGRlcG9ydClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZGVwb3J0cyBvZiBPYmplY3QudmFsdWVzKGRlcG9ydHNCeUFjdGV1clVpZCkpIHtcbiAgICAgICAgICAgICAgICBkZXBvcnRzLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICAgICAgICBhLnVpZC5sZW5ndGggPT09IGIudWlkLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IGEudWlkLmxvY2FsZUNvbXBhcmUoYi51aWQpXG4gICAgICAgICAgICAgICAgICAgIDogYS51aWQubGVuZ3RoIC0gYi51aWQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtYW5kYXRzQnlBY3RldXJVaWQ6IHtcbiAgICAgICAgICAgICAgW2FjdGV1clVpZDogc3RyaW5nXTogeyB1aWQ6IHN0cmluZyB9W11cbiAgICAgICAgICAgIH0gPSB7fVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKFxuICAgICAgICAgICAgICAgIHBhdGguam9pbihvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLCBcIm1hbmRhdFwiKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbWFuZGF0U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBbXCJtYW5kYXRcIl0sXG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXRGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgICBtYW5kYXRTcGxpdFBhdGhbbWFuZGF0U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgICAgaWYgKCFtYW5kYXRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIC4uLm1hbmRhdFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGAgIExvYWRpbmcgXCJtYW5kYXRcIiBmaWxlOiAke21hbmRhdE9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICBtYW5kYXRPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXRPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvTWFuZGF0KG1hbmRhdE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShtYW5kYXRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0ID0gbWFuZGF0T3JpZ2luYWwubWFuZGF0XG4gICAgICAgICAgICAgICAgbGV0IG1hbmRhdHMgPSBtYW5kYXRzQnlBY3RldXJVaWRbbWFuZGF0LmFjdGV1clJlZl1cbiAgICAgICAgICAgICAgICBpZiAobWFuZGF0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBtYW5kYXRzID0gbWFuZGF0c0J5QWN0ZXVyVWlkW21hbmRhdC5hY3RldXJSZWZdID0gW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFuZGF0cy5wdXNoKG1hbmRhdClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbWFuZGF0cyBvZiBPYmplY3QudmFsdWVzKG1hbmRhdHNCeUFjdGV1clVpZCkpIHtcbiAgICAgICAgICAgICAgICBtYW5kYXRzLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICAgICAgICBhLnVpZC5sZW5ndGggPT09IGIudWlkLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IGEudWlkLmxvY2FsZUNvbXBhcmUoYi51aWQpXG4gICAgICAgICAgICAgICAgICAgIDogYS51aWQubGVuZ3RoIC0gYi51aWQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGV1clNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJhY3RldXJcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1ckZpbGVuYW1lID0gYWN0ZXVyU3BsaXRQYXRoW2FjdGV1clNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIWFjdGV1ckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1ck9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5hY3RldXJTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwiYWN0ZXVyXCIgZmlsZTogJHthY3RldXJPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1ck9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGFjdGV1ck9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9BY3RldXIoYWN0ZXVyT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShhY3RldXJPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1ciA9IGFjdGV1ck9yaWdpbmFsLmFjdGV1clxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJVaWQgPSBhY3RldXIudWlkW1wiI3RleHRcIl1cbiAgICAgICAgICAgICAgY29uc3QgZGVwb3J0cyA9IGRlcG9ydHNCeUFjdGV1clVpZFthY3RldXJVaWRdXG4gICAgICAgICAgICAgIGlmIChkZXBvcnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0ZXVyLmRlcG9ydHMsIHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBhY3RldXIuZGVwb3J0cyA9IHsgZGVwb3J0OiBkZXBvcnRzIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBtYW5kYXRzID0gbWFuZGF0c0J5QWN0ZXVyVWlkW2FjdGV1clVpZF1cbiAgICAgICAgICAgICAgaWYgKG1hbmRhdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhY3RldXIubWFuZGF0cywgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGFjdGV1ci5tYW5kYXRzID0geyBtYW5kYXQ6IG1hbmRhdHMgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1clJlb3JnYW5pemVkSnNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgYWN0ZXVyc1Jlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIGFjdGV1clVpZCArIFwiLmpzb25cIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGFjdGV1clJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFjdGV1ciwgbnVsbCwgMiksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBvcmdhbmVTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wib3JnYW5lXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVGaWxlbmFtZSA9IG9yZ2FuZVNwbGl0UGF0aFtvcmdhbmVTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFvcmdhbmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4ub3JnYW5lU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcIm9yZ2FuZVwiIGZpbGU6ICR7b3JnYW5lT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBvcmdhbmVPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZU9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvT3JnYW5lKG9yZ2FuZU9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JnYW5lT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmUgPSBvcmdhbmVPcmlnaW5hbC5vcmdhbmVcbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lUmVvcmdhbml6ZWRKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmdhbmVzUmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgb3JnYW5lLnVpZCArIFwiLmpzb25cIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIG9yZ2FuZVJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9yZ2FuZSwgbnVsbCwgMiksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucy5jb21taXQsIG9wdGlvbnMucmVtb3RlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcikpIHtcbiAgICAgICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBmaWxlbmFtZSkpXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IEFnZW5kYXNSYXdDb252ZXJ0LnRvQWdlbmRhcyhvcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmV1bmlvbiBvZiBvcmlnaW5hbERhdGEucmV1bmlvbnMucmV1bmlvbikge1xuICAgICAgICAgICAgICB3cml0ZVJldW5pb25SZW9yZ2FuaXplZEpzb24oZGF0YXNldFJlb3JnYW5pemVkRGlyLCByZXVuaW9uKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXVuaW9uU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcInJldW5pb25cIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb25GaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgcmV1bmlvblNwbGl0UGF0aFtyZXVuaW9uU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghcmV1bmlvbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb25PcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4ucmV1bmlvblNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJyZXVuaW9uXCIgZmlsZTogJHtyZXVuaW9uT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgcmV1bmlvbk9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbk9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IEFnZW5kYXNSYXdDb252ZXJ0LnRvUmV1bmlvbihyZXVuaW9uT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShyZXVuaW9uT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uID0gcmV1bmlvbk9yaWdpbmFsLnJldW5pb25cbiAgICAgICAgICAgICAgd3JpdGVSZXVuaW9uUmVvcmdhbml6ZWRKc29uKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgcmV1bmlvbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucy5jb21taXQsIG9wdGlvbnMucmVtb3RlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQW1lbmRlbWVudHMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYW1lbmRlbWVudHMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9LmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcilcbiAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKSkge1xuICAgICAgICBpZiAoZmlsZW5hbWVbMF0gPT09IFwiLlwiKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIGZpbGVuYW1lKSlcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gQW1lbmRlbWVudHNSYXdDb252ZXJ0LnRvQW1lbmRlbWVudHMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRleHRlTGVnaXNsYXRpZiBvZiBvcmlnaW5hbERhdGEudGV4dGVzRXRBbWVuZGVtZW50c1xuICAgICAgICAgICAgICAudGV4dGVsZWcpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50IG9mIHRleHRlTGVnaXNsYXRpZi5hbWVuZGVtZW50cykge1xuICAgICAgICAgICAgICAgIHdyaXRlQW1lbmRlbWVudFJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICAgIGFtZW5kZW1lbnQsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudEZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBhbWVuZGVtZW50U3BsaXRQYXRoW2FtZW5kZW1lbnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFhbWVuZGVtZW50RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudE9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5hbWVuZGVtZW50U3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcImFtZW5kZW1lbnRcIiBmaWxlOiAke2FtZW5kZW1lbnRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBhbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQW1lbmRlbWVudHNSYXdDb252ZXJ0LnRvQW1lbmRlbWVudFdyYXBwZXIoXG4gICAgICAgICAgICAgICAgICAgIGFtZW5kZW1lbnRPcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGFtZW5kZW1lbnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnQgPSBhbWVuZGVtZW50T3JpZ2luYWwuYW1lbmRlbWVudFxuICAgICAgICAgICAgICB3cml0ZUFtZW5kZW1lbnRSZW9yZ2FuaXplZEpzb24oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBhbWVuZGVtZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2goZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zLmNvbW1pdCwgb3B0aW9ucy5yZW1vdGUpXG4gICAgICApIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9LmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcilcbiAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKSkge1xuICAgICAgICBpZiAoZmlsZW5hbWVbMF0gPT09IFwiLlwiKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIGZpbGVuYW1lKSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRvY3VtZW50c0RpciA9IHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIFwiZG9jdW1lbnRzXCIpXG4gICAgICBmcy5ta2RpclN5bmMoZG9jdW1lbnRzRGlyKVxuICAgICAgY29uc3QgZG9zc2llcnNEaXIgPSBwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBcImRvc3NpZXJzXCIpXG4gICAgICBmcy5ta2RpclN5bmMoZG9zc2llcnNEaXIpXG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0LnRvRG9zc2llcnNMZWdpc2xhdGlmcyhcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbixcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jdW1lbnQgb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydC50ZXh0ZXNMZWdpc2xhdGlmc1xuICAgICAgICAgICAgICAuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgd3JpdGVEb2N1bWVudFJlb3JnYW5pemVkSnNvbihkb2N1bWVudHNEaXIsIGRvY3VtZW50KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgZG9zc2llclBhcmxlbWVudGFpcmUgfSBvZiBvcmlnaW5hbERhdGEuZXhwb3J0XG4gICAgICAgICAgICAgIC5kb3NzaWVyc0xlZ2lzbGF0aWZzLmRvc3NpZXIpIHtcbiAgICAgICAgICAgICAgd3JpdGVEb3NzaWVyUGFybGVtZW50YWlyZVJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICBkb3NzaWVyc0RpcixcbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb2N1bWVudFNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJkb2N1bWVudFwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTcGxpdFBhdGhbZG9jdW1lbnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50T3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLmRvY3VtZW50U3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcImRvY3VtZW50XCIgZmlsZTogJHtkb2N1bWVudE9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBkb2N1bWVudE9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydC50b0RvY3VtZW50KGRvY3VtZW50T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShkb2N1bWVudE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBkb2N1bWVudE9yaWdpbmFsLmRvY3VtZW50XG4gICAgICAgICAgICAgIHdyaXRlRG9jdW1lbnRSZW9yZ2FuaXplZEpzb24oZG9jdW1lbnRzRGlyLCBkb2N1bWVudClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJkb3NzaWVyUGFybGVtZW50YWlyZVwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVTcGxpdFBhdGhbXG4gICAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aC5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICBpZiAoIWRvc3NpZXJQYXJsZW1lbnRhaXJlRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uZG9zc2llclBhcmxlbWVudGFpcmVTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwiZG9zc2llclBhcmxlbWVudGFpcmVcIiBmaWxlOiAke2Rvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0LnRvRG9zc2llclBhcmxlbWVudGFpcmUoXG4gICAgICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmUgPVxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWwuZG9zc2llclBhcmxlbWVudGFpcmVcbiAgICAgICAgICAgICAgd3JpdGVEb3NzaWVyUGFybGVtZW50YWlyZVJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICBkb3NzaWVyc0RpcixcbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2goZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zLmNvbW1pdCwgb3B0aW9ucy5yZW1vdGUpXG4gICAgICApIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5TY3J1dGlucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5zY3J1dGlucykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX0uZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpKSB7XG4gICAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgZmlsZW5hbWUpKVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBTY3J1dGluc1Jhd0NvbnZlcnQudG9TY3J1dGlucyhvcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2NydXRpbiBvZiBvcmlnaW5hbERhdGEuc2NydXRpbnMuc2NydXRpbikge1xuICAgICAgICAgICAgICB3cml0ZVNjcnV0aW5SZW9yZ2FuaXplZEpzb24oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBzY3J1dGluKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzY3J1dGluU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW5GaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgc2NydXRpblNwbGl0UGF0aFtzY3J1dGluU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghc2NydXRpbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW5PcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uc2NydXRpblNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJzY3J1dGluXCIgZmlsZTogJHtzY3J1dGluT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgc2NydXRpbk9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbk9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IFNjcnV0aW5zUmF3Q29udmVydC50b1NjcnV0aW5XcmFwcGVyKHNjcnV0aW5PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKHNjcnV0aW5PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW4gPSBzY3J1dGluT3JpZ2luYWwuc2NydXRpblxuICAgICAgICAgICAgICB3cml0ZVNjcnV0aW5SZW9yZ2FuaXplZEpzb24oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBzY3J1dGluKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2goZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zLmNvbW1pdCwgb3B0aW9ucy5yZW1vdGUpXG4gICAgICApIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdG9yZSBzdGFuZGFyZCBjb252ZXJzaW9uIG9mIGRhdGVzIHRvIEpTT04uXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGV4aXN0aW5nRGF0ZVRvSnNvblxuXG4gIHJldHVybiBlcnJvclxufVxuXG5mdW5jdGlvbiB3cml0ZUFtZW5kZW1lbnRSZW9yZ2FuaXplZEpzb24oXG4gIGRhdGFzZXRSZW9yZ2FuaXplZERpcjogc3RyaW5nLFxuICBhbWVuZGVtZW50OiB7XG4gICAgdWlkOiBzdHJpbmdcbiAgICB0ZXh0ZUxlZ2lzbGF0aWZSZWY6IHN0cmluZ1xuICB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IHVpZFRleHRlTGVnaXNsYXRpZiA9IGFtZW5kZW1lbnQudGV4dGVMZWdpc2xhdGlmUmVmXG4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbCh1aWRUZXh0ZUxlZ2lzbGF0aWYsIHVuZGVmaW5lZClcbiAgY29uc3QgdGV4dGVMZWdpc2xhdGlmRGlyID0gcGF0aC5qb2luKFxuICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICB1aWRUZXh0ZUxlZ2lzbGF0aWYsXG4gIClcbiAgZnMuZW5zdXJlRGlyU3luYyh0ZXh0ZUxlZ2lzbGF0aWZEaXIpXG4gIGNvbnN0IHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgIHRleHRlTGVnaXNsYXRpZkRpcixcbiAgICBhbWVuZGVtZW50LnVpZCArIFwiLmpzb25cIixcbiAgKVxuICBmcy53cml0ZUZpbGVTeW5jKFxuICAgIHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgIEpTT04uc3RyaW5naWZ5KGFtZW5kZW1lbnQsIG51bGwsIDIpLFxuICAgIHtcbiAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICB9LFxuICApXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG9jdW1lbnRSZW9yZ2FuaXplZEpzb24oXG4gIGRvY3VtZW50c0Rpcjogc3RyaW5nLFxuICBkb2N1bWVudDogeyB1aWQ6IHN0cmluZyB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IGJhc2VuYW1lID0gcGF0aEZyb21Eb2N1bWVudFVpZChkb2N1bWVudHNEaXIsIGRvY3VtZW50LnVpZClcbiAgZnMud3JpdGVGaWxlU3luYyhgJHtiYXNlbmFtZX0uanNvbmAsIEpTT04uc3RyaW5naWZ5KGRvY3VtZW50LCBudWxsLCAyKSwge1xuICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgfSlcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3NzaWVyUGFybGVtZW50YWlyZVJlb3JnYW5pemVkSnNvbihcbiAgZG9zc2llcnNEaXI6IHN0cmluZyxcbiAgZG9zc2llclBhcmxlbWVudGFpcmU6IHsgdWlkOiBzdHJpbmcgfSxcbik6IHZvaWQge1xuICBjb25zdCBiYXNlbmFtZSA9IHBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQoXG4gICAgZG9zc2llcnNEaXIsXG4gICAgZG9zc2llclBhcmxlbWVudGFpcmUudWlkLFxuICApXG4gIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgYCR7YmFzZW5hbWV9Lmpzb25gLFxuICAgIEpTT04uc3RyaW5naWZ5KGRvc3NpZXJQYXJsZW1lbnRhaXJlLCBudWxsLCAyKSxcbiAgICB7XG4gICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgfSxcbiAgKVxufVxuXG5mdW5jdGlvbiB3cml0ZVJldW5pb25SZW9yZ2FuaXplZEpzb24oXG4gIHJldW5pb25zRGlyOiBzdHJpbmcsXG4gIHJldW5pb246IHsgdWlkOiBzdHJpbmcgfSxcbik6IHZvaWQge1xuICBjb25zdCBiYXNlbmFtZSA9IHBhdGhGcm9tUmV1bmlvblVpZChyZXVuaW9uc0RpciwgcmV1bmlvbi51aWQpXG4gIGZzLndyaXRlRmlsZVN5bmMoYCR7YmFzZW5hbWV9Lmpzb25gLCBKU09OLnN0cmluZ2lmeShyZXVuaW9uLCBudWxsLCAyKSwge1xuICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgfSlcbn1cblxuZnVuY3Rpb24gd3JpdGVTY3J1dGluUmVvcmdhbml6ZWRKc29uKFxuICBzY3J1dGluc0Rpcjogc3RyaW5nLFxuICBzY3J1dGluOiB7IHVpZDogc3RyaW5nIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgYmFzZW5hbWUgPSBwYXRoRnJvbVNjcnV0aW5VaWQoc2NydXRpbnNEaXIsIHNjcnV0aW4udWlkKVxuICBmcy53cml0ZUZpbGVTeW5jKGAke2Jhc2VuYW1lfS5qc29uYCwgSlNPTi5zdHJpbmdpZnkoc2NydXRpbiwgbnVsbCwgMiksIHtcbiAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gIH0pXG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKHByb2Nlc3MuYXJndlsxXS5lbmRzV2l0aChcInJlb3JnYW5pemVfZGF0YS50c1wiKSkge1xuICBjb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucylcblxuICBpZiAocmVvcmdhbml6ZURhdGEob3B0aW9ucykpIHtcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLmV4aXQoMClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxNQUFQLE1BQW1CLFFBQW5CO0FBQ0EsU0FBdUJDLFFBQXZCLFFBQXVDLGVBQXZDO0FBQ0EsT0FBT0MsZUFBUCxNQUE0QixtQkFBNUI7QUFDQSxPQUFPQyxFQUFQLE1BQWUsVUFBZjtBQUNBLE9BQU9DLElBQVAsTUFBaUIsTUFBakI7U0FFU0MsUSxFQUFVQyxnQixFQUFrQkMsZTtTQUM1QkMsa0IsRUFBb0JDLGlCO1NBQ3BCQyxPO1NBRVBDLG1CLEVBQ0FDLCtCLEVBQ0FDLGtCLEVBQ0FDLGtCO1NB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
1133
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIlN0cmluZyIsIkJvb2xlYW4iLCJkZWZhdWx0VmFsdWUiLCJtdWx0aXBsZSIsImRlZmF1bHRPcHRpb24iLCJjb21taXRBbmRQdXNoIiwicmVwb3NpdG9yeURpciIsImNvbW1pdCIsInJlbW90ZXMiLCJlcnJvciIsImV4ZWNTeW5jIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJjaGlsZFByb2Nlc3MiLCJzdGRlcnIiLCJ0ZXN0Iiwic3Rkb3V0IiwiY29uc29sZSIsIm91dHB1dCIsInJlbW90ZSIsInJlb3JnYW5pemVEYXRhIiwib3B0aW9ucyIsImRhdGFEaXIiLCJEYXRlIiwicHJvdG90eXBlIiwidG9KU09OIiwicGF0Y2hlZERhdGVUb0pzb24iLCJnaXRHcm91cFVybCIsImNsb25lIiwidHJpbSIsInJlcGxhY2UiLCJ1bmRlZmluZWQiLCJ2YWxpZGF0ZVJhd0RhdGEiLCJjYXRlZ29yaWVzIiwibWFwIiwiZGF0YXNldE5hbWUiLCJhc3NlcnQiLCJub3RTdHJpY3RFcXVhbCIsIkVuYWJsZWREYXRhc2V0cyIsImVuYWJsZWREYXRhc2V0cyIsInJlZHVjZSIsIk5vbmUiLCJBY3RldXJzRXRPcmdhbmVzIiwiZGF0YXNldHMiLCJhY3RldXJzRXRPcmdhbmVzIiwiZGF0YXNldCIsIm9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgiLCJwYXRoIiwiam9pbiIsImZpbGVuYW1lIiwic2lsZW50IiwibG9nIiwiYmFzZW5hbWUiLCJkYXRhc2V0UmVvcmdhbml6ZWREaXIiLCJmcyIsImVuc3VyZURpclN5bmMiLCJyZWFkZGlyU3luYyIsInJlbW92ZVN5bmMiLCJhY3RldXJzUmVvcmdhbml6ZWREaXIiLCJta2RpclN5bmMiLCJvcmdhbmVzUmVvcmdhbml6ZWREaXIiLCJzdHJ1Y3R1cmUiLCJEYXRhc2V0U3RydWN0dXJlIiwiU2luZ2xlRmlsZSIsIm9yaWdpbmFsSnNvbiIsInJlYWRGaWxlU3luYyIsIm9yaWdpbmFsRGF0YSIsIkFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0IiwidG9BY3RldXJzRXRPcmdhbmVzIiwiSlNPTiIsInBhcnNlIiwiYWN0ZXVycyIsImFjdGV1ciIsInJlb3JnYW5pemVkSnNvbkZpbGVQYXRoIiwidWlkIiwid3JpdGVGaWxlU3luYyIsInN0cmluZ2lmeSIsIm9yZ2FuZXMiLCJvcmdhbmUiLCJTZWdtZW50ZWRGaWxlcyIsImRlcG9ydHNCeUFjdGV1clVpZCIsImV4aXN0c1N5bmMiLCJ3YWxrRGlyIiwiZGVwb3J0U3BsaXRQYXRoIiwiZGVwb3J0RmlsZW5hbWUiLCJsZW5ndGgiLCJlbmRzV2l0aCIsImRlcG9ydE9yaWdpbmFsRmlsZVBhdGgiLCJ2ZXJib3NlIiwiZGVwb3J0T3JpZ2luYWxKc29uIiwiZGVwb3J0T3JpZ2luYWwiLCJ0b0RlcG9ydCIsImRlcG9ydCIsImRlcG9ydHMiLCJhY3RldXJSZWYiLCJwdXNoIiwiT2JqZWN0IiwidmFsdWVzIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsIm1hbmRhdHNCeUFjdGV1clVpZCIsIm1hbmRhdFNwbGl0UGF0aCIsIm1hbmRhdEZpbGVuYW1lIiwibWFuZGF0T3JpZ2luYWxGaWxlUGF0aCIsIm1hbmRhdE9yaWdpbmFsSnNvbiIsIm1hbmRhdE9yaWdpbmFsIiwidG9NYW5kYXRXcmFwcGVyIiwibWFuZGF0IiwibWFuZGF0cyIsImFjdGV1clNwbGl0UGF0aCIsImFjdGV1ckZpbGVuYW1lIiwiYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCIsImFjdGV1ck9yaWdpbmFsSnNvbiIsImFjdGV1ck9yaWdpbmFsIiwidG9BY3RldXIiLCJhY3RldXJVaWQiLCJzdHJpY3RFcXVhbCIsImFjdGV1clJlb3JnYW5pemVkSnNvbkZpbGVQYXRoIiwib3JnYW5lU3BsaXRQYXRoIiwib3JnYW5lRmlsZW5hbWUiLCJvcmdhbmVPcmlnaW5hbEZpbGVQYXRoIiwib3JnYW5lT3JpZ2luYWxKc29uIiwib3JnYW5lT3JpZ2luYWwiLCJ0b09yZ2FuZSIsIm9yZ2FuZVJlb3JnYW5pemVkSnNvbkZpbGVQYXRoIiwiQWdlbmRhcyIsImFnZW5kYXMiLCJBZ2VuZGFzUmF3Q29udmVydCIsInRvQWdlbmRhcyIsInJldW5pb25zIiwicmV1bmlvbiIsIndyaXRlUmV1bmlvblJlb3JnYW5pemVkSnNvbiIsInJldW5pb25TcGxpdFBhdGgiLCJyZXVuaW9uRmlsZW5hbWUiLCJyZXVuaW9uT3JpZ2luYWxGaWxlUGF0aCIsInJldW5pb25PcmlnaW5hbEpzb24iLCJyZXVuaW9uT3JpZ2luYWwiLCJ0b1JldW5pb24iLCJBbWVuZGVtZW50cyIsImFtZW5kZW1lbnRzIiwiQW1lbmRlbWVudHNSYXdDb252ZXJ0IiwidG9BbWVuZGVtZW50cyIsInRleHRlc0V0QW1lbmRlbWVudHMiLCJ0ZXh0ZWxlZyIsInRleHRlTGVnaXNsYXRpZiIsImFtZW5kZW1lbnQiLCJ3cml0ZUFtZW5kZW1lbnRSZW9yZ2FuaXplZEpzb24iLCJhbWVuZGVtZW50U3BsaXRQYXRoIiwiYW1lbmRlbWVudEZpbGVuYW1lIiwiYW1lbmRlbWVudE9yaWdpbmFsRmlsZVBhdGgiLCJhbWVuZGVtZW50T3JpZ2luYWxKc29uIiwiYW1lbmRlbWVudE9yaWdpbmFsIiwidG9BbWVuZGVtZW50V3JhcHBlciIsIkRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9jdW1lbnRzRGlyIiwiZG9zc2llcnNEaXIiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydCIsInRvRG9zc2llcnNMZWdpc2xhdGlmcyIsInRleHRlc0xlZ2lzbGF0aWZzIiwiZG9jdW1lbnQiLCJ3cml0ZURvY3VtZW50UmVvcmdhbml6ZWRKc29uIiwiZG9zc2llciIsImRvc3NpZXJQYXJsZW1lbnRhaXJlIiwid3JpdGVEb3NzaWVyUGFybGVtZW50YWlyZVJlb3JnYW5pemVkSnNvbiIsImRvY3VtZW50U3BsaXRQYXRoIiwiZG9jdW1lbnRGaWxlbmFtZSIsImRvY3VtZW50T3JpZ2luYWxGaWxlUGF0aCIsImRvY3VtZW50T3JpZ2luYWxKc29uIiwiZG9jdW1lbnRPcmlnaW5hbCIsInRvRG9jdW1lbnQiLCJkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aCIsImRvc3NpZXJQYXJsZW1lbnRhaXJlRmlsZW5hbWUiLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGgiLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsSnNvbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWwiLCJ0b0Rvc3NpZXJQYXJsZW1lbnRhaXJlIiwiU2NydXRpbnMiLCJzY3J1dGlucyIsIlNjcnV0aW5zUmF3Q29udmVydCIsInRvU2NydXRpbnMiLCJzY3J1dGluIiwid3JpdGVTY3J1dGluUmVvcmdhbml6ZWRKc29uIiwic2NydXRpblNwbGl0UGF0aCIsInNjcnV0aW5GaWxlbmFtZSIsInNjcnV0aW5PcmlnaW5hbEZpbGVQYXRoIiwic2NydXRpbk9yaWdpbmFsSnNvbiIsInNjcnV0aW5PcmlnaW5hbCIsInRvU2NydXRpbldyYXBwZXIiLCJleGlzdGluZ0RhdGVUb0pzb24iLCJ1aWRUZXh0ZUxlZ2lzbGF0aWYiLCJ0ZXh0ZUxlZ2lzbGF0aWZSZWYiLCJ0ZXh0ZUxlZ2lzbGF0aWZEaXIiLCJwYXRoRnJvbURvY3VtZW50VWlkIiwicGF0aEZyb21Eb3NzaWVyUGFybGVtZW50YWlyZVVpZCIsInJldW5pb25zRGlyIiwicGF0aEZyb21SZXVuaW9uVWlkIiwic2NydXRpbnNEaXIiLCJwYXRoRnJvbVNjcnV0aW5VaWQiLCJhcmd2IiwiY29tbWFuZExpbmVBcmdzIiwiZXhpdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3Jlb3JnYW5pemVfZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IHsgQ2hpbGRQcm9jZXNzLCBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5pbXBvcnQgeyBkYXRhc2V0cywgRGF0YXNldFN0cnVjdHVyZSwgRW5hYmxlZERhdGFzZXRzIH0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IGV4aXN0aW5nRGF0ZVRvSnNvbiwgcGF0Y2hlZERhdGVUb0pzb24gfSBmcm9tIFwiLi4vZGF0ZXNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0IHtcbiAgcGF0aEZyb21Eb2N1bWVudFVpZCxcbiAgcGF0aEZyb21Eb3NzaWVyUGFybGVtZW50YWlyZVVpZCxcbiAgcGF0aEZyb21SZXVuaW9uVWlkLFxuICBwYXRoRnJvbVNjcnV0aW5VaWQsXG59IGZyb20gXCIuLi9sb2FkZXJzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFnZW5kYXNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQW1lbmRlbWVudHNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9kb3NzaWVyc19sZWdpc2xhdGlmc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIFNjcnV0aW5zUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvc2NydXRpbnNcIlxuXG5jb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gIHtcbiAgICBhbGlhczogXCJDXCIsXG4gICAgaGVscDogXCJjbG9uZSByZXBvc2l0b3JpZXMgZnJvbSBnaXZlbiBncm91cCAob3Igb3JnYW5pemF0aW9uKSBnaXQgVVJMXCIsXG4gICAgbmFtZTogXCJjbG9uZVwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcImNcIixcbiAgICBoZWxwOiBcImNvbW1pdCBzcGxpdCBmaWxlc1wiLFxuICAgIG5hbWU6IFwiY29tbWl0XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcImtcIixcbiAgICBkZWZhdWx0VmFsdWU6IFtcIkFsbFwiXSxcbiAgICBoZWxwOiBcImNhdGVnb3JpZXMgb2YgZGF0YXNldHMgdG8gcmVvcmdhbml6ZVwiLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG5hbWU6IFwiY2F0ZWdvcmllc1wiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInJcIixcbiAgICBoZWxwOiBcInB1c2ggY29tbWl0IHRvIGdpdmVuIHJlbW90ZVwiLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG5hbWU6IFwicmVtb3RlXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwic1wiLFxuICAgIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gICAgbmFtZTogXCJzaWxlbnRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwiVlwiLFxuICAgIGhlbHA6IFwiZG9uJ3QgdmFsaWRhdGUgcmF3IGRhdGFcIixcbiAgICBuYW1lOiBcIm5vLXZhbGlkYXRlLXJhd1wiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJ2XCIsXG4gICAgaGVscDogXCJ2ZXJib3NlIGxvZ3NcIixcbiAgICBuYW1lOiBcInZlcmJvc2VcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICBoZWxwOiBcImRpcmVjdG9yeSBjb250YWluaW5nIEFzc2VtYmzDqWUgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuXG5mdW5jdGlvbiBjb21taXRBbmRQdXNoKFxuICByZXBvc2l0b3J5RGlyOiBzdHJpbmcsXG4gIGNvbW1pdDogYm9vbGVhbixcbiAgcmVtb3Rlcz86IHN0cmluZ1tdLFxuKTogYm9vbGVhbiB7XG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGlmIChjb21taXQpIHtcbiAgICBleGVjU3luYyhgZ2l0IGFkZCAuYCwge1xuICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICBleGVjU3luYygnZ2l0IGNvbW1pdCAtbSBcIk5vdXZlbGxlIG1vaXNzb25cIicsIHtcbiAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGNoaWxkUHJvY2VzcyBhcyBDaGlsZFByb2Nlc3MpLnN0ZGVyciA9PT0gbnVsbCB8fFxuICAgICAgICAhL25vdGhpbmcgdG8gY29tbWl0Ly50ZXN0KChjaGlsZFByb2Nlc3MgYXMgYW55KS5zdGRvdXQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICB0aHJvdyBjaGlsZFByb2Nlc3NcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCByZW1vdGUgb2YgcmVtb3RlcyB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBwdXNoICR7cmVtb3RlfSBtYXN0ZXJgLCB7XG4gICAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICAvLyBEb24ndCBzdG9wIHdoZW4gcHVzaCBmYWlscy5cbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIHJlb3JnYW5pemVEYXRhKG9wdGlvbnM6IGFueSk6IGJvb2xlYW4ge1xuICBjb25zdCBkYXRhRGlyID0gb3B0aW9ucy5kYXRhRGlyXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IHBhdGNoZWREYXRlVG9Kc29uXG5cbiAgbGV0IGVycm9yID0gZmFsc2VcbiAgY29uc3QgZ2l0R3JvdXBVcmwgPSBvcHRpb25zLmNsb25lXG4gICAgPyBvcHRpb25zLmNsb25lLnRyaW0oKS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgOiB1bmRlZmluZWRcbiAgY29uc3QgdmFsaWRhdGVSYXdEYXRhID0gIW9wdGlvbnNbXCJuby12YWxpZGF0ZS1yYXdcIl1cblxuICBvcHRpb25zLmNhdGVnb3JpZXMubWFwKChkYXRhc2V0TmFtZTogc3RyaW5nKSA9PlxuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICAgIChFbmFibGVkRGF0YXNldHMgYXMgYW55IGFzIHsgW25hbWU6IHN0cmluZ106IEVuYWJsZWREYXRhc2V0cyB9KVtcbiAgICAgICAgZGF0YXNldE5hbWVcbiAgICAgIF0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBgVW5rbm93biBuYW1lIG9mIGRhdGFzZXQ6ICR7ZGF0YXNldE5hbWV9YCxcbiAgICApLFxuICApXG4gIGNvbnN0IGVuYWJsZWREYXRhc2V0cyA9IG9wdGlvbnMuY2F0ZWdvcmllcy5yZWR1Y2UoXG4gICAgKGVuYWJsZWREYXRhc2V0czogRW5hYmxlZERhdGFzZXRzLCBkYXRhc2V0TmFtZTogc3RyaW5nKTogRW5hYmxlZERhdGFzZXRzID0+XG4gICAgICBlbmFibGVkRGF0YXNldHMgfFxuICAgICAgKEVuYWJsZWREYXRhc2V0cyBhcyBhbnkgYXMgeyBbbmFtZTogc3RyaW5nXTogRW5hYmxlZERhdGFzZXRzIH0pW1xuICAgICAgICBkYXRhc2V0TmFtZVxuICAgICAgXSxcbiAgICBFbmFibGVkRGF0YXNldHMuTm9uZSxcbiAgKVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWN0ZXVyc0V0T3JnYW5lcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcikpIHtcbiAgICAgICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBmaWxlbmFtZSkpXG4gICAgICB9XG4gICAgICBjb25zdCBhY3RldXJzUmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBcImFjdGV1cnNcIilcbiAgICAgIGZzLm1rZGlyU3luYyhhY3RldXJzUmVvcmdhbml6ZWREaXIpXG4gICAgICBjb25zdCBvcmdhbmVzUmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBcIm9yZ2FuZXNcIilcbiAgICAgIGZzLm1rZGlyU3luYyhvcmdhbmVzUmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvQWN0ZXVyc0V0T3JnYW5lcyhvcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0ZXVyIG9mIG9yaWdpbmFsRGF0YS5leHBvcnQuYWN0ZXVycy5hY3RldXIpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBhY3RldXJzUmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgYWN0ZXVyLnVpZFtcIiN0ZXh0XCJdICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYWN0ZXVyLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9yZ2FuZSBvZiBvcmlnaW5hbERhdGEuZXhwb3J0Lm9yZ2FuZXMub3JnYW5lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JnYW5lc1Jlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIG9yZ2FuZS51aWQgKyBcIi5qc29uXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgICAgICByZW9yZ2FuaXplZEpzb25GaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShvcmdhbmUsIG51bGwsIDIpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBkZXBvcnRzQnlBY3RldXJVaWQ6IHtcbiAgICAgICAgICAgICAgW2FjdGV1clVpZDogc3RyaW5nXTogeyB1aWQ6IHN0cmluZyB9W11cbiAgICAgICAgICAgIH0gPSB7fVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKFxuICAgICAgICAgICAgICAgIHBhdGguam9pbihvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLCBcImRlcG9ydFwiKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZGVwb3J0U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBbXCJkZXBvcnRcIl0sXG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnRGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgICBkZXBvcnRTcGxpdFBhdGhbZGVwb3J0U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgICAgaWYgKCFkZXBvcnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIC4uLmRlcG9ydFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGAgIExvYWRpbmcgXCJkZXBvcnRcIiBmaWxlOiAke2RlcG9ydE9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICBkZXBvcnRPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnRPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvRGVwb3J0KGRlcG9ydE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShkZXBvcnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0ID0gZGVwb3J0T3JpZ2luYWwuZGVwb3J0XG4gICAgICAgICAgICAgICAgbGV0IGRlcG9ydHMgPSBkZXBvcnRzQnlBY3RldXJVaWRbZGVwb3J0LmFjdGV1clJlZl1cbiAgICAgICAgICAgICAgICBpZiAoZGVwb3J0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBkZXBvcnRzID0gZGVwb3J0c0J5QWN0ZXVyVWlkW2RlcG9ydC5hY3RldXJSZWZdID0gW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVwb3J0cy5wdXNoKGRlcG9ydClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZGVwb3J0cyBvZiBPYmplY3QudmFsdWVzKGRlcG9ydHNCeUFjdGV1clVpZCkpIHtcbiAgICAgICAgICAgICAgICBkZXBvcnRzLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICAgICAgICBhLnVpZC5sZW5ndGggPT09IGIudWlkLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IGEudWlkLmxvY2FsZUNvbXBhcmUoYi51aWQpXG4gICAgICAgICAgICAgICAgICAgIDogYS51aWQubGVuZ3RoIC0gYi51aWQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtYW5kYXRzQnlBY3RldXJVaWQ6IHtcbiAgICAgICAgICAgICAgW2FjdGV1clVpZDogc3RyaW5nXTogeyB1aWQ6IHN0cmluZyB9W11cbiAgICAgICAgICAgIH0gPSB7fVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKFxuICAgICAgICAgICAgICAgIHBhdGguam9pbihvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLCBcIm1hbmRhdFwiKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbWFuZGF0U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBbXCJtYW5kYXRcIl0sXG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXRGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgICBtYW5kYXRTcGxpdFBhdGhbbWFuZGF0U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgICAgaWYgKCFtYW5kYXRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIC4uLm1hbmRhdFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGAgIExvYWRpbmcgXCJtYW5kYXRcIiBmaWxlOiAke21hbmRhdE9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICBtYW5kYXRPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXRPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvTWFuZGF0V3JhcHBlcihtYW5kYXRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UobWFuZGF0T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmRhdCA9IG1hbmRhdE9yaWdpbmFsLm1hbmRhdFxuICAgICAgICAgICAgICAgIGxldCBtYW5kYXRzID0gbWFuZGF0c0J5QWN0ZXVyVWlkW21hbmRhdC5hY3RldXJSZWZdXG4gICAgICAgICAgICAgICAgaWYgKG1hbmRhdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgbWFuZGF0cyA9IG1hbmRhdHNCeUFjdGV1clVpZFttYW5kYXQuYWN0ZXVyUmVmXSA9IFtdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hbmRhdHMucHVzaChtYW5kYXQpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hbmRhdHMgb2YgT2JqZWN0LnZhbHVlcyhtYW5kYXRzQnlBY3RldXJVaWQpKSB7XG4gICAgICAgICAgICAgICAgbWFuZGF0cy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICAgICAgYS51aWQubGVuZ3RoID09PSBiLnVpZC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBhLnVpZC5sb2NhbGVDb21wYXJlKGIudWlkKVxuICAgICAgICAgICAgICAgICAgICA6IGEudWlkLmxlbmd0aCAtIGIudWlkLmxlbmd0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBhY3RldXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wiYWN0ZXVyXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBhY3RldXJGaWxlbmFtZSA9IGFjdGV1clNwbGl0UGF0aFthY3RldXJTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFhY3RldXJGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uYWN0ZXVyU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcImFjdGV1clwiIGZpbGU6ICR7YWN0ZXVyT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBhY3RldXJPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1ck9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvQWN0ZXVyKGFjdGV1ck9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoYWN0ZXVyT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXIgPSBhY3RldXJPcmlnaW5hbC5hY3RldXJcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyVWlkID0gYWN0ZXVyLnVpZFtcIiN0ZXh0XCJdXG4gICAgICAgICAgICAgIGNvbnN0IGRlcG9ydHMgPSBkZXBvcnRzQnlBY3RldXJVaWRbYWN0ZXVyVWlkXVxuICAgICAgICAgICAgICBpZiAoZGVwb3J0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFjdGV1ci5kZXBvcnRzLCB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgYWN0ZXVyLmRlcG9ydHMgPSB7IGRlcG9ydDogZGVwb3J0cyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgbWFuZGF0cyA9IG1hbmRhdHNCeUFjdGV1clVpZFthY3RldXJVaWRdXG4gICAgICAgICAgICAgIGlmIChtYW5kYXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0ZXVyLm1hbmRhdHMsIHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBhY3RldXIubWFuZGF0cyA9IHsgbWFuZGF0OiBtYW5kYXRzIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJSZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIGFjdGV1cnNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBhY3RldXJVaWQgKyBcIi5qc29uXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBhY3RldXJSZW9yZ2FuaXplZEpzb25GaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShhY3RldXIsIG51bGwsIDIpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3JnYW5lU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcIm9yZ2FuZVwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lRmlsZW5hbWUgPSBvcmdhbmVTcGxpdFBhdGhbb3JnYW5lU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghb3JnYW5lRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLm9yZ2FuZVNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJvcmdhbmVcIiBmaWxlOiAke29yZ2FuZU9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgb3JnYW5lT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b09yZ2FuZShvcmdhbmVPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yZ2FuZU9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lID0gb3JnYW5lT3JpZ2luYWwub3JnYW5lXG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZVJlb3JnYW5pemVkSnNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JnYW5lc1Jlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIG9yZ2FuZS51aWQgKyBcIi5qc29uXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBvcmdhbmVSZW9yZ2FuaXplZEpzb25GaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShvcmdhbmUsIG51bGwsIDIpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMuY29tbWl0LCBvcHRpb25zLnJlbW90ZSlcbiAgICAgICkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFnZW5kYXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYWdlbmRhcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX0uZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpKSB7XG4gICAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgZmlsZW5hbWUpKVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBBZ2VuZGFzUmF3Q29udmVydC50b0FnZW5kYXMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJldW5pb24gb2Ygb3JpZ2luYWxEYXRhLnJldW5pb25zLnJldW5pb24pIHtcbiAgICAgICAgICAgICAgd3JpdGVSZXVuaW9uUmVvcmdhbml6ZWRKc29uKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgcmV1bmlvbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmV1bmlvblNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJyZXVuaW9uXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uRmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIHJldW5pb25TcGxpdFBhdGhbcmV1bmlvblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIXJldW5pb25GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLnJldW5pb25TcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwicmV1bmlvblwiIGZpbGU6ICR7cmV1bmlvbk9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbk9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHJldW5pb25PcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb25PcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBZ2VuZGFzUmF3Q29udmVydC50b1JldW5pb24ocmV1bmlvbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UocmV1bmlvbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbiA9IHJldW5pb25PcmlnaW5hbC5yZXVuaW9uXG4gICAgICAgICAgICAgIHdyaXRlUmV1bmlvblJlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIHJldW5pb24pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMuY29tbWl0LCBvcHRpb25zLnJlbW90ZSlcbiAgICAgICkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFtZW5kZW1lbnRzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFtZW5kZW1lbnRzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcikpIHtcbiAgICAgICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBmaWxlbmFtZSkpXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IEFtZW5kZW1lbnRzUmF3Q29udmVydC50b0FtZW5kZW1lbnRzKG9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCB0ZXh0ZUxlZ2lzbGF0aWYgb2Ygb3JpZ2luYWxEYXRhLnRleHRlc0V0QW1lbmRlbWVudHNcbiAgICAgICAgICAgICAgLnRleHRlbGVnKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgYW1lbmRlbWVudCBvZiB0ZXh0ZUxlZ2lzbGF0aWYuYW1lbmRlbWVudHMpIHtcbiAgICAgICAgICAgICAgICB3cml0ZUFtZW5kZW1lbnRSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgICBhbWVuZGVtZW50LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgYW1lbmRlbWVudFNwbGl0UGF0aFthbWVuZGVtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghYW1lbmRlbWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uYW1lbmRlbWVudFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJhbWVuZGVtZW50XCIgZmlsZTogJHthbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYW1lbmRlbWVudE9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudE9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IEFtZW5kZW1lbnRzUmF3Q29udmVydC50b0FtZW5kZW1lbnRXcmFwcGVyKFxuICAgICAgICAgICAgICAgICAgICBhbWVuZGVtZW50T3JpZ2luYWxKc29uLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShhbWVuZGVtZW50T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50ID0gYW1lbmRlbWVudE9yaWdpbmFsLmFtZW5kZW1lbnRcbiAgICAgICAgICAgICAgd3JpdGVBbWVuZGVtZW50UmVvcmdhbml6ZWRKc29uKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgYW1lbmRlbWVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucy5jb21taXQsIG9wdGlvbnMucmVtb3RlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuRG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5kb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcikpIHtcbiAgICAgICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBmaWxlbmFtZSkpXG4gICAgICB9XG4gICAgICBjb25zdCBkb2N1bWVudHNEaXIgPSBwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBcImRvY3VtZW50c1wiKVxuICAgICAgZnMubWtkaXJTeW5jKGRvY3VtZW50c0RpcilcbiAgICAgIGNvbnN0IGRvc3NpZXJzRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJkb3NzaWVyc1wiKVxuICAgICAgZnMubWtkaXJTeW5jKGRvc3NpZXJzRGlyKVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydC50b0Rvc3NpZXJzTGVnaXNsYXRpZnMoXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvY3VtZW50IG9mIG9yaWdpbmFsRGF0YS5leHBvcnQudGV4dGVzTGVnaXNsYXRpZnNcbiAgICAgICAgICAgICAgLmRvY3VtZW50KSB7XG4gICAgICAgICAgICAgIHdyaXRlRG9jdW1lbnRSZW9yZ2FuaXplZEpzb24oZG9jdW1lbnRzRGlyLCBkb2N1bWVudClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCB7IGRvc3NpZXJQYXJsZW1lbnRhaXJlIH0gb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydFxuICAgICAgICAgICAgICAuZG9zc2llcnNMZWdpc2xhdGlmcy5kb3NzaWVyKSB7XG4gICAgICAgICAgICAgIHdyaXRlRG9zc2llclBhcmxlbWVudGFpcmVSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgZG9zc2llcnNEaXIsXG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmUsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jdW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wiZG9jdW1lbnRcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIGRvY3VtZW50U3BsaXRQYXRoW2RvY3VtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghZG9jdW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5kb2N1bWVudFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJkb2N1bWVudFwiIGZpbGU6ICR7ZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQudG9Eb2N1bWVudChkb2N1bWVudE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZG9jdW1lbnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gZG9jdW1lbnRPcmlnaW5hbC5kb2N1bWVudFxuICAgICAgICAgICAgICB3cml0ZURvY3VtZW50UmVvcmdhbml6ZWRKc29uKGRvY3VtZW50c0RpciwgZG9jdW1lbnQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wiZG9zc2llclBhcmxlbWVudGFpcmVcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlRmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoW1xuICAgICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVTcGxpdFBhdGgubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgaWYgKCFkb3NzaWVyUGFybGVtZW50YWlyZUZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLmRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcImRvc3NpZXJQYXJsZW1lbnRhaXJlXCIgZmlsZTogJHtkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydC50b0Rvc3NpZXJQYXJsZW1lbnRhaXJlKFxuICAgICAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsSnNvbixcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlID1cbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsLmRvc3NpZXJQYXJsZW1lbnRhaXJlXG4gICAgICAgICAgICAgIHdyaXRlRG9zc2llclBhcmxlbWVudGFpcmVSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgZG9zc2llcnNEaXIsXG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmUsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucy5jb21taXQsIG9wdGlvbnMucmVtb3RlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuU2NydXRpbnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuc2NydXRpbnMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9LmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcilcbiAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKSkge1xuICAgICAgICBpZiAoZmlsZW5hbWVbMF0gPT09IFwiLlwiKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIGZpbGVuYW1lKSlcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gU2NydXRpbnNSYXdDb252ZXJ0LnRvU2NydXRpbnMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNjcnV0aW4gb2Ygb3JpZ2luYWxEYXRhLnNjcnV0aW5zLnNjcnV0aW4pIHtcbiAgICAgICAgICAgICAgd3JpdGVTY3J1dGluUmVvcmdhbml6ZWRKc29uKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgc2NydXRpbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2NydXRpblNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluRmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIHNjcnV0aW5TcGxpdFBhdGhbc2NydXRpblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIXNjcnV0aW5GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLnNjcnV0aW5TcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwic2NydXRpblwiIGZpbGU6ICR7c2NydXRpbk9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbk9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHNjcnV0aW5PcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW5PcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBTY3J1dGluc1Jhd0NvbnZlcnQudG9TY3J1dGluV3JhcHBlcihzY3J1dGluT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShzY3J1dGluT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluID0gc2NydXRpbk9yaWdpbmFsLnNjcnV0aW5cbiAgICAgICAgICAgICAgd3JpdGVTY3J1dGluUmVvcmdhbml6ZWRKc29uKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgc2NydXRpbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucy5jb21taXQsIG9wdGlvbnMucmVtb3RlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc3RvcmUgc3RhbmRhcmQgY29udmVyc2lvbiBvZiBkYXRlcyB0byBKU09OLlxuICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBleGlzdGluZ0RhdGVUb0pzb25cblxuICByZXR1cm4gZXJyb3Jcbn1cblxuZnVuY3Rpb24gd3JpdGVBbWVuZGVtZW50UmVvcmdhbml6ZWRKc29uKFxuICBkYXRhc2V0UmVvcmdhbml6ZWREaXI6IHN0cmluZyxcbiAgYW1lbmRlbWVudDoge1xuICAgIHVpZDogc3RyaW5nXG4gICAgdGV4dGVMZWdpc2xhdGlmUmVmOiBzdHJpbmdcbiAgfSxcbik6IHZvaWQge1xuICBjb25zdCB1aWRUZXh0ZUxlZ2lzbGF0aWYgPSBhbWVuZGVtZW50LnRleHRlTGVnaXNsYXRpZlJlZlxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwodWlkVGV4dGVMZWdpc2xhdGlmLCB1bmRlZmluZWQpXG4gIGNvbnN0IHRleHRlTGVnaXNsYXRpZkRpciA9IHBhdGguam9pbihcbiAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgdWlkVGV4dGVMZWdpc2xhdGlmLFxuICApXG4gIGZzLmVuc3VyZURpclN5bmModGV4dGVMZWdpc2xhdGlmRGlyKVxuICBjb25zdCByZW9yZ2FuaXplZEpzb25GaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICB0ZXh0ZUxlZ2lzbGF0aWZEaXIsXG4gICAgYW1lbmRlbWVudC51aWQgKyBcIi5qc29uXCIsXG4gIClcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICByZW9yZ2FuaXplZEpzb25GaWxlUGF0aCxcbiAgICBKU09OLnN0cmluZ2lmeShhbWVuZGVtZW50LCBudWxsLCAyKSxcbiAgICB7XG4gICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgfSxcbiAgKVxufVxuXG5mdW5jdGlvbiB3cml0ZURvY3VtZW50UmVvcmdhbml6ZWRKc29uKFxuICBkb2N1bWVudHNEaXI6IHN0cmluZyxcbiAgZG9jdW1lbnQ6IHsgdWlkOiBzdHJpbmcgfSxcbik6IHZvaWQge1xuICBjb25zdCBiYXNlbmFtZSA9IHBhdGhGcm9tRG9jdW1lbnRVaWQoZG9jdW1lbnRzRGlyLCBkb2N1bWVudC51aWQpXG4gIGZzLndyaXRlRmlsZVN5bmMoYCR7YmFzZW5hbWV9Lmpzb25gLCBKU09OLnN0cmluZ2lmeShkb2N1bWVudCwgbnVsbCwgMiksIHtcbiAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG9zc2llclBhcmxlbWVudGFpcmVSZW9yZ2FuaXplZEpzb24oXG4gIGRvc3NpZXJzRGlyOiBzdHJpbmcsXG4gIGRvc3NpZXJQYXJsZW1lbnRhaXJlOiB7IHVpZDogc3RyaW5nIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgYmFzZW5hbWUgPSBwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkKFxuICAgIGRvc3NpZXJzRGlyLFxuICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlLnVpZCxcbiAgKVxuICBmcy53cml0ZUZpbGVTeW5jKFxuICAgIGAke2Jhc2VuYW1lfS5qc29uYCxcbiAgICBKU09OLnN0cmluZ2lmeShkb3NzaWVyUGFybGVtZW50YWlyZSwgbnVsbCwgMiksXG4gICAge1xuICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgIH0sXG4gIClcbn1cblxuZnVuY3Rpb24gd3JpdGVSZXVuaW9uUmVvcmdhbml6ZWRKc29uKFxuICByZXVuaW9uc0Rpcjogc3RyaW5nLFxuICByZXVuaW9uOiB7IHVpZDogc3RyaW5nIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgYmFzZW5hbWUgPSBwYXRoRnJvbVJldW5pb25VaWQocmV1bmlvbnNEaXIsIHJldW5pb24udWlkKVxuICBmcy53cml0ZUZpbGVTeW5jKGAke2Jhc2VuYW1lfS5qc29uYCwgSlNPTi5zdHJpbmdpZnkocmV1bmlvbiwgbnVsbCwgMiksIHtcbiAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHdyaXRlU2NydXRpblJlb3JnYW5pemVkSnNvbihcbiAgc2NydXRpbnNEaXI6IHN0cmluZyxcbiAgc2NydXRpbjogeyB1aWQ6IHN0cmluZyB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IGJhc2VuYW1lID0gcGF0aEZyb21TY3J1dGluVWlkKHNjcnV0aW5zRGlyLCBzY3J1dGluLnVpZClcbiAgZnMud3JpdGVGaWxlU3luYyhgJHtiYXNlbmFtZX0uanNvbmAsIEpTT04uc3RyaW5naWZ5KHNjcnV0aW4sIG51bGwsIDIpLCB7XG4gICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICB9KVxufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChwcm9jZXNzLmFyZ3ZbMV0uZW5kc1dpdGgoXCJyZW9yZ2FuaXplX2RhdGEudHNcIikpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG5cbiAgaWYgKHJlb3JnYW5pemVEYXRhKG9wdGlvbnMpKSB7XG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH0gZWxzZSB7XG4gICAgcHJvY2Vzcy5leGl0KDApXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBTUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLGtCQUFrQixHQUFHLENBQ3pCO0VBQ0VDLEtBQUssRUFBRSxHQURUO0VBRUVDLElBQUksRUFBRSwrREFGUjtFQUdFQyxJQUFJLEVBQUUsT0FI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