@tricoteuses/assemblee 1.0.7 → 1.1.0

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