@tricoteuses/assemblee 1.0.0-next.2 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +2 -0
  2. package/lib/api.js +23 -7
  3. package/lib/api.mjs +41 -0
  4. package/lib/bugs/acteur-00010/plugin.test.js +139 -33
  5. package/lib/bugs/acteur-00010/plugin.test.mjs +33 -0
  6. package/lib/bugs/acteur-00010.js +166 -24
  7. package/lib/bugs/acteur-00010.mjs +31 -0
  8. package/lib/bugs/agenda-00002/plugin.test.js +178 -52
  9. package/lib/bugs/agenda-00002/plugin.test.mjs +52 -0
  10. package/lib/bugs/agenda-00002.js +507 -143
  11. package/lib/bugs/agenda-00002.mjs +197 -0
  12. package/lib/bugs/agenda-00008/plugin.test.js +143 -31
  13. package/lib/bugs/agenda-00008/plugin.test.mjs +31 -0
  14. package/lib/bugs/agenda-00008.js +180 -25
  15. package/lib/bugs/agenda-00008.mjs +30 -0
  16. package/lib/bugs/agenda-00011/plugin.test.js +371 -156
  17. package/lib/bugs/agenda-00011/plugin.test.mjs +156 -0
  18. package/lib/bugs/agenda-00011.js +416 -117
  19. package/lib/bugs/agenda-00011.mjs +150 -0
  20. package/lib/bugs.js +591 -54
  21. package/lib/bugs.mjs +93 -0
  22. package/lib/cleaners/actes_legislatifs.js +149 -61
  23. package/lib/cleaners/actes_legislatifs.mjs +311 -0
  24. package/lib/cleaners/acteurs.js +255 -123
  25. package/lib/cleaners/acteurs.mjs +211 -0
  26. package/lib/cleaners/amendements.js +242 -117
  27. package/lib/cleaners/amendements.mjs +292 -0
  28. package/lib/cleaners/documents.js +147 -62
  29. package/lib/cleaners/documents.mjs +162 -0
  30. package/lib/cleaners/dossiers_legislatifs.js +132 -45
  31. package/lib/cleaners/dossiers_legislatifs.mjs +123 -0
  32. package/lib/cleaners/index.js +64 -8
  33. package/lib/cleaners/index.mjs +8 -0
  34. package/lib/cleaners/organes.js +54 -21
  35. package/lib/cleaners/organes.mjs +64 -0
  36. package/lib/cleaners/reunions.js +237 -127
  37. package/lib/cleaners/reunions.mjs +318 -0
  38. package/lib/cleaners/scrutins.js +261 -99
  39. package/lib/cleaners/scrutins.mjs +254 -0
  40. package/lib/cleaners/xml.js +81 -16
  41. package/lib/cleaners/xml.mjs +42 -0
  42. package/lib/datasets.js +284 -153
  43. package/lib/datasets.mjs +596 -0
  44. package/lib/dates.js +93 -34
  45. package/lib/dates.mjs +98 -0
  46. package/lib/dossiers_legislatifs.js +107 -33
  47. package/lib/dossiers_legislatifs.mjs +215 -0
  48. package/lib/file_systems.js +203 -35
  49. package/lib/file_systems.mjs +64 -0
  50. package/lib/git.js +139 -41
  51. package/lib/git.mjs +114 -0
  52. package/lib/index.js +310 -16
  53. package/lib/index.mjs +16 -0
  54. package/lib/inserters.js +355 -131
  55. package/lib/inserters.mjs +413 -0
  56. package/lib/loaders.js +900 -440
  57. package/lib/loaders.mjs +678 -0
  58. package/lib/organes.js +15 -5
  59. package/lib/organes.mjs +18 -0
  60. package/lib/parsers/documents.js +241 -89
  61. package/lib/parsers/documents.mjs +433 -0
  62. package/lib/parsers/index.js +36 -3
  63. package/lib/parsers/index.mjs +3 -0
  64. package/lib/parsers/recherche_amendements.js +616 -173
  65. package/lib/parsers/recherche_amendements.mjs +189 -0
  66. package/lib/raw_types/acteurs_et_organes.d.ts +36 -148
  67. package/lib/raw_types/acteurs_et_organes.js +228 -506
  68. package/lib/raw_types/acteurs_et_organes.mjs +1240 -0
  69. package/lib/raw_types/agendas.js +165 -75
  70. package/lib/raw_types/agendas.mjs +944 -0
  71. package/lib/raw_types/amendements.js +165 -77
  72. package/lib/raw_types/amendements.mjs +1040 -0
  73. package/lib/raw_types/dossiers_legislatifs.d.ts +1 -43
  74. package/lib/raw_types/dossiers_legislatifs.js +181 -143
  75. package/lib/raw_types/dossiers_legislatifs.mjs +1792 -0
  76. package/lib/raw_types/scrutins.js +144 -61
  77. package/lib/raw_types/scrutins.mjs +645 -0
  78. package/lib/scripts/bugs_helper.js +657 -155
  79. package/lib/scripts/bugs_helper.mjs +286 -0
  80. package/lib/scripts/clean_data.js +380 -145
  81. package/lib/scripts/clean_data.mjs +190 -0
  82. package/lib/scripts/clean_reorganized_data.js +627 -331
  83. package/lib/scripts/clean_reorganized_data.mjs +520 -0
  84. package/lib/scripts/diff_amendements.js +159 -73
  85. package/lib/scripts/diff_amendements.mjs +234 -0
  86. package/lib/scripts/document_dossiers_legislatifs.js +570 -288
  87. package/lib/scripts/document_dossiers_legislatifs.mjs +494 -0
  88. package/lib/scripts/get_today_reunions.js +37 -20
  89. package/lib/scripts/get_today_reunions.mjs +41 -0
  90. package/lib/scripts/merge_scrutins.js +121 -39
  91. package/lib/scripts/merge_scrutins.mjs +69 -0
  92. package/lib/scripts/parse_textes_lois.js +179 -125
  93. package/lib/scripts/parse_textes_lois.mjs +215 -0
  94. package/lib/scripts/raw_types_from_amendements.js +276 -77
  95. package/lib/scripts/raw_types_from_amendements.mjs +118 -0
  96. package/lib/scripts/reorganize_data.js +867 -446
  97. package/lib/scripts/reorganize_data.mjs +712 -0
  98. package/lib/scripts/retrieve_deputes_photos.js +378 -157
  99. package/lib/scripts/retrieve_deputes_photos.mjs +230 -0
  100. package/lib/scripts/retrieve_documents.js +648 -172
  101. package/lib/scripts/retrieve_documents.mjs +292 -0
  102. package/lib/scripts/retrieve_open_data.js +286 -85
  103. package/lib/scripts/retrieve_open_data.mjs +125 -0
  104. package/lib/scripts/retrieve_pending_amendments.js +302 -69
  105. package/lib/scripts/retrieve_pending_amendments.mjs +130 -0
  106. package/lib/scripts/retrieve_senateurs_photos.js +374 -198
  107. package/lib/scripts/retrieve_senateurs_photos.mjs +277 -0
  108. package/lib/scripts/retrieve_textes_lois.js +343 -89
  109. package/lib/scripts/retrieve_textes_lois.mjs +168 -0
  110. package/lib/scripts/test_load.js +30 -11
  111. package/lib/scripts/test_load.mjs +26 -0
  112. package/lib/scripts/test_load_big_files.js +30 -11
  113. package/lib/scripts/test_load_big_files.mjs +26 -0
  114. package/lib/scripts/validate_json.js +370 -120
  115. package/lib/scripts/validate_json.mjs +216 -0
  116. package/lib/shared_types/codes_actes.js +50 -15
  117. package/lib/shared_types/codes_actes.mjs +228 -0
  118. package/lib/strings.js +16 -3
  119. package/lib/strings.mjs +7 -0
  120. package/lib/types/acteurs_et_organes.js +156 -71
  121. package/lib/types/acteurs_et_organes.mjs +918 -0
  122. package/lib/types/agendas.js +154 -67
  123. package/lib/types/agendas.mjs +623 -0
  124. package/lib/types/amendements.js +166 -77
  125. package/lib/types/amendements.mjs +885 -0
  126. package/lib/types/dossiers_legislatifs.d.ts +1 -42
  127. package/lib/types/dossiers_legislatifs.js +182 -143
  128. package/lib/types/dossiers_legislatifs.mjs +1120 -0
  129. package/lib/types/legislatures.js +12 -3
  130. package/lib/types/legislatures.mjs +9 -0
  131. package/lib/types/scrutins.js +144 -61
  132. package/lib/types/scrutins.mjs +528 -0
  133. package/lib/urls.js +44 -25
  134. package/lib/urls.mjs +201 -0
  135. package/package.json +33 -12
package/lib/loaders.js CHANGED
@@ -1,678 +1,1138 @@
1
- /// Load data from files
2
- import assert from "assert";
3
- import fs from "fs-extra";
4
- import path from "path";
5
- export { EnabledDatasets } from "./datasets.js";
6
- import { datasets, EnabledDatasets } from "./datasets.js";
7
- export { walkDir } from "./file_systems.js";
8
- import { walkDir } from "./file_systems.js";
9
- import { Convert as ActeursEtOrganesConvert } from "./types/acteurs_et_organes.js";
10
- import { Convert as AgendasConvert } from "./types/agendas.js";
11
- import { Convert as AmendementsConvert } from "./types/amendements.js";
12
- import { Convert as DossiersLegislatifsConvert } from "./types/dossiers_legislatifs.js";
13
- import { Legislature } from "./types/legislatures.js";
14
- import { Convert as ScrutinsConvert } from "./types/scrutins.js";
15
- const documentUidRegex = /^(ACIN|ALCN|AVCE|AVIS|DECL|ETDI|LETT|MESS|PION|PNRE|PRJL|RAPP|RINF|RION)(AN|SN)(R\d+)[LS](\d+)(B|BTA|BTC|TAP)(\d+)(-.*)?$/;
16
- const dossierUidRegex = /^DL(R\d+)(L\d+)N(\d+)$/;
17
- const reunionUidRegex = /^RU(AN|CG|SN)(R\d+)(L\d+)([AS]\d{4})(IDC|IDFL?|IDS)(\d+)$/;
18
- const scrutinUidRegex = /^VTAN(R\d+)(L\d+)V(\d+)$/;
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.array.slice.js");
4
+
5
+ require("core-js/modules/es.object.to-string.js");
6
+
7
+ require("core-js/modules/es.function.name.js");
8
+
9
+ require("core-js/modules/es.array.from.js");
10
+
11
+ require("core-js/modules/es.string.iterator.js");
12
+
13
+ require("core-js/modules/es.symbol.js");
14
+
15
+ require("core-js/modules/es.symbol.description.js");
16
+
17
+ require("core-js/modules/es.symbol.iterator.js");
18
+
19
+ require("core-js/modules/es.array.iterator.js");
20
+
21
+ require("core-js/modules/web.dom-collections.iterator.js");
22
+
23
+ require("core-js/modules/es.array.is-array.js");
24
+
25
+ require("core-js/modules/es.object.define-property.js");
26
+
27
+ Object.defineProperty(exports, "__esModule", {
28
+ value: true
29
+ });
30
+ Object.defineProperty(exports, "EnabledDatasets", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _datasets.EnabledDatasets;
34
+ }
35
+ });
36
+ exports.loadAssembleeData = loadAssembleeData;
37
+ exports.loadAssembleeDataFromBigFiles = loadAssembleeDataFromBigFiles;
38
+ exports.pathFromDocumentUid = pathFromDocumentUid;
39
+ exports.pathFromDossierParlementaireUid = pathFromDossierParlementaireUid;
40
+ exports.pathFromReunionUid = pathFromReunionUid;
41
+ exports.pathFromScrutinUid = pathFromScrutinUid;
42
+ Object.defineProperty(exports, "walkDir", {
43
+ enumerable: true,
44
+ get: function get() {
45
+ return _file_systems.walkDir;
46
+ }
47
+ });
48
+
49
+ require("core-js/modules/es.array.join.js");
50
+
51
+ require("core-js/modules/es.regexp.exec.js");
52
+
53
+ require("core-js/modules/es.string.replace.js");
54
+
55
+ require("core-js/modules/es.string.ends-with.js");
56
+
57
+ require("core-js/modules/es.array.concat.js");
58
+
59
+ require("core-js/modules/es.string.split.js");
60
+
61
+ require("core-js/modules/es.date.to-iso-string.js");
62
+
63
+ require("core-js/modules/es.object.assign.js");
64
+
65
+ var _assert = _interopRequireDefault(require("assert"));
66
+
67
+ var _fsExtra = _interopRequireDefault(require("fs-extra"));
68
+
69
+ var _path = _interopRequireDefault(require("path"));
70
+
71
+ var _datasets = require("./datasets");
72
+
73
+ var _file_systems = require("./file_systems");
74
+
75
+ var _acteurs_et_organes = require("./types/acteurs_et_organes");
76
+
77
+ var _agendas = require("./types/agendas");
78
+
79
+ var _amendements = require("./types/amendements");
80
+
81
+ var _dossiers_legislatifs = require("./types/dossiers_legislatifs");
82
+
83
+ var _legislatures = require("./types/legislatures");
84
+
85
+ var _scrutins = require("./types/scrutins");
86
+
87
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
88
+
89
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
90
+
91
+ 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."); }
92
+
93
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
94
+
95
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
96
+
97
+ 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; } } }; }
98
+
99
+ 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); }
100
+
101
+ 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; }
102
+
103
+ var documentUidRegex = /^(ACIN|ALCN|AVCE|AVIS|DECL|ETDI|LETT|MESS|PION|PNRE|PRJL|RAPP|RINF|RION)(AN|SN)(R\d+)[LS](\d+)(B|BTA|BTC|TAP)(\d+)(-.*)?$/;
104
+ var dossierUidRegex = /^DL(R\d+)(L\d+)N(\d+)$/;
105
+ var reunionUidRegex = /^RU(AN|CG|SN)(R\d+)(L\d+)([AS]\d{4})(IDC|IDFL?|IDS)(\d+)$/;
106
+ var scrutinUidRegex = /^VTAN(R\d+)(L\d+)V(\d+)$/;
19
107
  /** Load data from split files. */
20
108
 
21
- export function loadAssembleeData(dataDir, enabledDatasets, legislature, {
22
- log = false
23
- } = {}) {
24
- const acteurByUid = {};
25
- const organeByUid = {};
109
+ function loadAssembleeData(dataDir, enabledDatasets, legislature) {
110
+ var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {},
111
+ _ref$log = _ref.log,
112
+ log = _ref$log === void 0 ? false : _ref$log;
26
113
 
27
- if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
28
- for (const dataset of datasets.acteursEtOrganes) {
29
- if (dataset.ignoreForWeb) {
30
- continue;
31
- }
114
+ var acteurByUid = {};
115
+ var organeByUid = {};
32
116
 
33
- if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
34
- continue;
35
- }
117
+ if (enabledDatasets & _datasets.EnabledDatasets.ActeursEtOrganes) {
118
+ var _iterator = _createForOfIteratorHelper(_datasets.datasets.acteursEtOrganes),
119
+ _step;
36
120
 
37
- const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
121
+ try {
122
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
123
+ var dataset = _step.value;
38
124
 
39
- for (const acteurSplitPath of walkDir(datasetDir, ["acteurs"])) {
40
- const acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
125
+ if (dataset.ignoreForWeb) {
126
+ continue;
127
+ }
41
128
 
42
- if (!acteurFilename.endsWith(".json")) {
129
+ if (legislature !== _legislatures.Legislature.All && dataset.legislature !== _legislatures.Legislature.All && legislature !== dataset.legislature) {
43
130
  continue;
44
131
  }
45
132
 
46
- const acteurFilePath = path.join(datasetDir, ...acteurSplitPath);
133
+ var datasetDir = _path["default"].join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
47
134
 
48
- if (log) {
49
- console.log(`Loading file: ${acteurFilePath}…`);
50
- }
135
+ var _iterator2 = _createForOfIteratorHelper((0, _file_systems.walkDir)(datasetDir, ["acteurs"])),
136
+ _step2;
51
137
 
52
- const acteurJson = fs.readFileSync(acteurFilePath, {
53
- encoding: "utf8"
54
- });
55
- const acteur = ActeursEtOrganesConvert.toActeur(acteurJson); // Keep the first existing "acteur", because the first wrapper is the most complete.
138
+ try {
139
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
140
+ var acteurSplitPath = _step2.value;
141
+ var acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
56
142
 
57
- if (acteurByUid[acteur.uid] === undefined) {
58
- acteurByUid[acteur.uid] = acteur;
59
- }
60
- }
143
+ if (!acteurFilename.endsWith(".json")) {
144
+ continue;
145
+ }
61
146
 
62
- for (const organeSplitPath of walkDir(datasetDir, ["organes"])) {
63
- const organeFilename = organeSplitPath[organeSplitPath.length - 1];
147
+ var acteurFilePath = _path["default"].join.apply(_path["default"], [datasetDir].concat(_toConsumableArray(acteurSplitPath)));
64
148
 
65
- if (!organeFilename.endsWith(".json")) {
66
- continue;
67
- }
149
+ if (log) {
150
+ console.log("Loading file: ".concat(acteurFilePath, "\u2026"));
151
+ }
68
152
 
69
- const organeFilePath = path.join(datasetDir, ...organeSplitPath);
153
+ var acteurJson = _fsExtra["default"].readFileSync(acteurFilePath, {
154
+ encoding: "utf8"
155
+ });
70
156
 
71
- if (log) {
72
- console.log(`Loading file: ${organeFilePath}…`);
157
+ var acteur = _acteurs_et_organes.Convert.toActeur(acteurJson); // Keep the first existing "acteur", because the first wrapper is the most complete.
158
+
159
+
160
+ if (acteurByUid[acteur.uid] === undefined) {
161
+ acteurByUid[acteur.uid] = acteur;
162
+ }
163
+ }
164
+ } catch (err) {
165
+ _iterator2.e(err);
166
+ } finally {
167
+ _iterator2.f();
73
168
  }
74
169
 
75
- const organeJson = fs.readFileSync(organeFilePath, {
76
- encoding: "utf8"
77
- });
78
- const organe = ActeursEtOrganesConvert.toOrgane(organeJson); // Keep the first existing "organe", because the first wrapper is the most complete.
170
+ var _iterator3 = _createForOfIteratorHelper((0, _file_systems.walkDir)(datasetDir, ["organes"])),
171
+ _step3;
172
+
173
+ try {
174
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
175
+ var organeSplitPath = _step3.value;
176
+ var organeFilename = organeSplitPath[organeSplitPath.length - 1];
177
+
178
+ if (!organeFilename.endsWith(".json")) {
179
+ continue;
180
+ }
181
+
182
+ var organeFilePath = _path["default"].join.apply(_path["default"], [datasetDir].concat(_toConsumableArray(organeSplitPath)));
183
+
184
+ if (log) {
185
+ console.log("Loading file: ".concat(organeFilePath, "\u2026"));
186
+ }
79
187
 
80
- if (organeByUid[organe.uid] === undefined) {
81
- organeByUid[organe.uid] = organe;
188
+ var organeJson = _fsExtra["default"].readFileSync(organeFilePath, {
189
+ encoding: "utf8"
190
+ });
191
+
192
+ var organe = _acteurs_et_organes.Convert.toOrgane(organeJson); // Keep the first existing "organe", because the first wrapper is the most complete.
193
+
194
+
195
+ if (organeByUid[organe.uid] === undefined) {
196
+ organeByUid[organe.uid] = organe;
197
+ }
198
+ }
199
+ } catch (err) {
200
+ _iterator3.e(err);
201
+ } finally {
202
+ _iterator3.f();
82
203
  }
83
204
  }
205
+ } catch (err) {
206
+ _iterator.e(err);
207
+ } finally {
208
+ _iterator.f();
84
209
  }
85
210
  }
86
211
 
87
- const reunionByUid = {};
88
- const reunionsByDay = {};
89
- const reunionsByDossierUid = {};
212
+ var reunionByUid = {};
213
+ var reunionsByDay = {};
214
+ var reunionsByDossierUid = {};
90
215
 
91
- if (enabledDatasets & EnabledDatasets.Agendas) {
92
- for (const dataset of datasets.agendas) {
93
- if (dataset.ignoreForWeb) {
94
- continue;
95
- }
96
-
97
- if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
98
- continue;
99
- }
216
+ if (enabledDatasets & _datasets.EnabledDatasets.Agendas) {
217
+ var _iterator4 = _createForOfIteratorHelper(_datasets.datasets.agendas),
218
+ _step4;
100
219
 
101
- const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
220
+ try {
221
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
222
+ var _dataset = _step4.value;
102
223
 
103
- for (const reunionSplitPath of walkDir(datasetDir)) {
104
- const reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
224
+ if (_dataset.ignoreForWeb) {
225
+ continue;
226
+ }
105
227
 
106
- if (!reunionFilename.endsWith(".json")) {
228
+ if (legislature !== _legislatures.Legislature.All && _dataset.legislature !== _legislatures.Legislature.All && legislature !== _dataset.legislature) {
107
229
  continue;
108
230
  }
109
231
 
110
- const reunionFilePath = path.join(datasetDir, ...reunionSplitPath);
232
+ var _datasetDir = _path["default"].join(dataDir, _dataset.filename.replace(/\.json$/, "_nettoye"));
111
233
 
112
- if (log) {
113
- console.log(`Loading file: ${reunionFilePath}…`);
114
- }
234
+ var _iterator5 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetDir)),
235
+ _step5;
115
236
 
116
- const reunionJson = fs.readFileSync(reunionFilePath, {
117
- encoding: "utf8"
118
- });
119
- const reunion = AgendasConvert.toReunion(reunionJson);
237
+ try {
238
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
239
+ var reunionSplitPath = _step5.value;
240
+ var reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
120
241
 
121
- if (reunionByUid[reunion.uid] === undefined) {
122
- reunionByUid[reunion.uid] = reunion;
123
- }
242
+ if (!reunionFilename.endsWith(".json")) {
243
+ continue;
244
+ }
124
245
 
125
- const day = reunion.timestampDebut.toISOString().split("T")[0];
126
- let reunionsAtDay = reunionsByDay[day];
246
+ var reunionFilePath = _path["default"].join.apply(_path["default"], [_datasetDir].concat(_toConsumableArray(reunionSplitPath)));
127
247
 
128
- if (reunionsAtDay === undefined) {
129
- reunionsAtDay = reunionsByDay[day] = [];
130
- }
248
+ if (log) {
249
+ console.log("Loading file: ".concat(reunionFilePath, "\u2026"));
250
+ }
131
251
 
132
- reunionsAtDay.push(reunion);
133
- const odj = reunion.odj;
252
+ var reunionJson = _fsExtra["default"].readFileSync(reunionFilePath, {
253
+ encoding: "utf8"
254
+ });
134
255
 
135
- if (odj !== undefined) {
136
- for (const pointOdj of odj.pointsOdj || []) {
137
- for (const dossierLegislatifRef of pointOdj.dossiersLegislatifsRefs || []) {
138
- let reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef];
256
+ var reunion = _agendas.Convert.toReunion(reunionJson);
139
257
 
140
- if (reunionsAtDossierUid === undefined) {
141
- reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef] = [];
142
- }
258
+ if (reunionByUid[reunion.uid] === undefined) {
259
+ reunionByUid[reunion.uid] = reunion;
260
+ }
261
+
262
+ var _day = reunion.timestampDebut.toISOString().split("T")[0];
263
+ var reunionsAtDay = reunionsByDay[_day];
143
264
 
144
- reunionsAtDossierUid.push(reunion);
265
+ if (reunionsAtDay === undefined) {
266
+ reunionsAtDay = reunionsByDay[_day] = [];
267
+ }
268
+
269
+ reunionsAtDay.push(reunion);
270
+ var odj = reunion.odj;
271
+
272
+ if (odj !== undefined) {
273
+ var _iterator6 = _createForOfIteratorHelper(odj.pointsOdj || []),
274
+ _step6;
275
+
276
+ try {
277
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
278
+ var pointOdj = _step6.value;
279
+
280
+ var _iterator7 = _createForOfIteratorHelper(pointOdj.dossiersLegislatifsRefs || []),
281
+ _step7;
282
+
283
+ try {
284
+ for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
285
+ var dossierLegislatifRef = _step7.value;
286
+ var reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef];
287
+
288
+ if (reunionsAtDossierUid === undefined) {
289
+ reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef] = [];
290
+ }
291
+
292
+ reunionsAtDossierUid.push(reunion);
293
+ }
294
+ } catch (err) {
295
+ _iterator7.e(err);
296
+ } finally {
297
+ _iterator7.f();
298
+ }
299
+ }
300
+ } catch (err) {
301
+ _iterator6.e(err);
302
+ } finally {
303
+ _iterator6.f();
304
+ }
145
305
  }
146
306
  }
307
+ } catch (err) {
308
+ _iterator5.e(err);
309
+ } finally {
310
+ _iterator5.f();
147
311
  }
148
312
  }
313
+ } catch (err) {
314
+ _iterator4.e(err);
315
+ } finally {
316
+ _iterator4.f();
149
317
  }
150
318
  }
151
319
 
152
- const amendementByUid = {};
320
+ var amendementByUid = {};
153
321
 
154
- if (enabledDatasets & EnabledDatasets.Amendements) {
155
- for (const dataset of datasets.amendements) {
156
- if (dataset.ignoreForWeb) {
157
- continue;
158
- }
159
-
160
- if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
161
- continue;
162
- }
322
+ if (enabledDatasets & _datasets.EnabledDatasets.Amendements) {
323
+ var _iterator8 = _createForOfIteratorHelper(_datasets.datasets.amendements),
324
+ _step8;
163
325
 
164
- const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
326
+ try {
327
+ for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
328
+ var _dataset2 = _step8.value;
165
329
 
166
- for (const amendementSplitPath of walkDir(datasetDir)) {
167
- const amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
330
+ if (_dataset2.ignoreForWeb) {
331
+ continue;
332
+ }
168
333
 
169
- if (!amendementFilename.endsWith(".json")) {
334
+ if (legislature !== _legislatures.Legislature.All && _dataset2.legislature !== _legislatures.Legislature.All && legislature !== _dataset2.legislature) {
170
335
  continue;
171
336
  }
172
337
 
173
- const amendementFilePath = path.join(datasetDir, ...amendementSplitPath);
338
+ var _datasetDir2 = _path["default"].join(dataDir, _dataset2.filename.replace(/\.json$/, "_nettoye"));
174
339
 
175
- if (log) {
176
- console.log(`Loading file: ${amendementFilePath}…`);
177
- }
340
+ var _iterator9 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetDir2)),
341
+ _step9;
178
342
 
179
- const amendementJson = fs.readFileSync(amendementFilePath, {
180
- encoding: "utf8"
181
- });
182
- const amendement = AmendementsConvert.toAmendement(amendementJson);
343
+ try {
344
+ for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
345
+ var amendementSplitPath = _step9.value;
346
+ var amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
347
+
348
+ if (!amendementFilename.endsWith(".json")) {
349
+ continue;
350
+ }
351
+
352
+ var amendementFilePath = _path["default"].join.apply(_path["default"], [_datasetDir2].concat(_toConsumableArray(amendementSplitPath)));
353
+
354
+ if (log) {
355
+ console.log("Loading file: ".concat(amendementFilePath, "\u2026"));
356
+ }
357
+
358
+ var amendementJson = _fsExtra["default"].readFileSync(amendementFilePath, {
359
+ encoding: "utf8"
360
+ });
183
361
 
184
- if (amendementByUid[amendement.uid] === undefined) {
185
- amendementByUid[amendement.uid] = amendement;
362
+ var amendement = _amendements.Convert.toAmendement(amendementJson);
363
+
364
+ if (amendementByUid[amendement.uid] === undefined) {
365
+ amendementByUid[amendement.uid] = amendement;
366
+ }
367
+ }
368
+ } catch (err) {
369
+ _iterator9.e(err);
370
+ } finally {
371
+ _iterator9.f();
186
372
  }
187
373
  }
374
+ } catch (err) {
375
+ _iterator8.e(err);
376
+ } finally {
377
+ _iterator8.f();
188
378
  }
189
379
  }
190
380
 
191
- const documentByUid = {};
192
- const dossierParlementaireBySenatChemin = {};
193
- const dossierParlementaireByTitreChemin = {};
194
- const dossierParlementaireByUid = {};
195
-
196
- if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
197
- for (const dataset of datasets.dossiersLegislatifs) {
198
- if (dataset.ignoreForWeb) {
199
- continue;
200
- }
381
+ var documentByUid = {};
382
+ var dossierParlementaireBySenatChemin = {};
383
+ var dossierParlementaireByTitreChemin = {};
384
+ var dossierParlementaireByUid = {};
201
385
 
202
- if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
203
- continue;
204
- }
386
+ if (enabledDatasets & _datasets.EnabledDatasets.DossiersLegislatifs) {
387
+ var _iterator10 = _createForOfIteratorHelper(_datasets.datasets.dossiersLegislatifs),
388
+ _step10;
205
389
 
206
- const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
390
+ try {
391
+ for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
392
+ var _dataset3 = _step10.value;
207
393
 
208
- for (const documentSplitPath of walkDir(datasetDir, ["documents"])) {
209
- const documentFilename = documentSplitPath[documentSplitPath.length - 1];
394
+ if (_dataset3.ignoreForWeb) {
395
+ continue;
396
+ }
210
397
 
211
- if (!documentFilename.endsWith(".json")) {
398
+ if (legislature !== _legislatures.Legislature.All && _dataset3.legislature !== _legislatures.Legislature.All && legislature !== _dataset3.legislature) {
212
399
  continue;
213
400
  }
214
401
 
215
- const documentFilePath = path.join(datasetDir, ...documentSplitPath);
402
+ var _datasetDir3 = _path["default"].join(dataDir, _dataset3.filename.replace(/\.json$/, "_nettoye"));
216
403
 
217
- if (log) {
218
- console.log(`Loading file: ${documentFilePath}…`);
219
- }
404
+ var _iterator11 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetDir3, ["documents"])),
405
+ _step11;
220
406
 
221
- const documentJson = fs.readFileSync(documentFilePath, {
222
- encoding: "utf8"
223
- });
224
- const document = DossiersLegislatifsConvert.toDocument(documentJson);
407
+ try {
408
+ for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
409
+ var documentSplitPath = _step11.value;
410
+ var documentFilename = documentSplitPath[documentSplitPath.length - 1];
225
411
 
226
- if (documentByUid[document.uid] === undefined) {
227
- documentByUid[document.uid] = document;
228
- }
229
- }
412
+ if (!documentFilename.endsWith(".json")) {
413
+ continue;
414
+ }
230
415
 
231
- for (const dossierSplitPath of walkDir(datasetDir, ["dossiers"])) {
232
- const dossierFilename = dossierSplitPath[dossierSplitPath.length - 1];
416
+ var documentFilePath = _path["default"].join.apply(_path["default"], [_datasetDir3].concat(_toConsumableArray(documentSplitPath)));
233
417
 
234
- if (!dossierFilename.endsWith(".json")) {
235
- continue;
236
- }
418
+ if (log) {
419
+ console.log("Loading file: ".concat(documentFilePath, "\u2026"));
420
+ }
237
421
 
238
- const dossierFilePath = path.join(datasetDir, ...dossierSplitPath);
422
+ var documentJson = _fsExtra["default"].readFileSync(documentFilePath, {
423
+ encoding: "utf8"
424
+ });
239
425
 
240
- if (log) {
241
- console.log(`Loading file: ${dossierFilePath}…`);
426
+ var document = _dossiers_legislatifs.Convert.toDocument(documentJson);
427
+
428
+ if (documentByUid[document.uid] === undefined) {
429
+ documentByUid[document.uid] = document;
430
+ }
431
+ }
432
+ } catch (err) {
433
+ _iterator11.e(err);
434
+ } finally {
435
+ _iterator11.f();
242
436
  }
243
437
 
244
- const dossierJson = fs.readFileSync(dossierFilePath, {
245
- encoding: "utf8"
246
- });
247
- const dossier = DossiersLegislatifsConvert.toDossierParlementaire(dossierJson);
248
- const titreDossier = dossier.titreDossier;
438
+ var _iterator12 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetDir3, ["dossiers"])),
439
+ _step12;
249
440
 
250
- if (titreDossier.senatChemin && dossierParlementaireBySenatChemin[titreDossier.senatChemin] === undefined) {
251
- dossierParlementaireBySenatChemin[titreDossier.senatChemin] = dossier;
252
- }
441
+ try {
442
+ for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
443
+ var dossierSplitPath = _step12.value;
444
+ var dossierFilename = dossierSplitPath[dossierSplitPath.length - 1];
253
445
 
254
- if (titreDossier.titreChemin && dossierParlementaireByTitreChemin[titreDossier.titreChemin] === undefined) {
255
- dossierParlementaireByTitreChemin[titreDossier.titreChemin] = dossier;
256
- }
446
+ if (!dossierFilename.endsWith(".json")) {
447
+ continue;
448
+ }
449
+
450
+ var dossierFilePath = _path["default"].join.apply(_path["default"], [_datasetDir3].concat(_toConsumableArray(dossierSplitPath)));
451
+
452
+ if (log) {
453
+ console.log("Loading file: ".concat(dossierFilePath, "\u2026"));
454
+ }
257
455
 
258
- if (dossierParlementaireByUid[dossier.uid] === undefined) {
259
- dossierParlementaireByUid[dossier.uid] = dossier;
456
+ var dossierJson = _fsExtra["default"].readFileSync(dossierFilePath, {
457
+ encoding: "utf8"
458
+ });
459
+
460
+ var dossier = _dossiers_legislatifs.Convert.toDossierParlementaire(dossierJson);
461
+
462
+ var titreDossier = dossier.titreDossier;
463
+
464
+ if (titreDossier.senatChemin && dossierParlementaireBySenatChemin[titreDossier.senatChemin] === undefined) {
465
+ dossierParlementaireBySenatChemin[titreDossier.senatChemin] = dossier;
466
+ }
467
+
468
+ if (titreDossier.titreChemin && dossierParlementaireByTitreChemin[titreDossier.titreChemin] === undefined) {
469
+ dossierParlementaireByTitreChemin[titreDossier.titreChemin] = dossier;
470
+ }
471
+
472
+ if (dossierParlementaireByUid[dossier.uid] === undefined) {
473
+ dossierParlementaireByUid[dossier.uid] = dossier;
474
+ }
475
+ }
476
+ } catch (err) {
477
+ _iterator12.e(err);
478
+ } finally {
479
+ _iterator12.f();
260
480
  }
261
481
  }
482
+ } catch (err) {
483
+ _iterator10.e(err);
484
+ } finally {
485
+ _iterator10.f();
262
486
  }
263
487
  }
264
488
 
265
- let photoByUid = {};
489
+ var photoByUid = {};
266
490
 
267
- if (enabledDatasets & EnabledDatasets.Photos) {
491
+ if (enabledDatasets & _datasets.EnabledDatasets.Photos) {
268
492
  {
269
- const jsonFilePath = path.join(dataDir, `photos_deputes_${// TODO: Handle Legislature.All.
270
- legislature === Legislature.All ? Legislature.Seize : legislature}`, "deputes.json");
493
+ var jsonFilePath = _path["default"].join(dataDir, "photos_deputes_".concat( // TODO: Handle Legislature.All.
494
+ legislature === _legislatures.Legislature.All ? _legislatures.Legislature.Seize : legislature), "deputes.json");
271
495
 
272
- if (fs.existsSync(jsonFilePath)) {
496
+ if (_fsExtra["default"].existsSync(jsonFilePath)) {
273
497
  if (log) {
274
- console.log(`Loading file: ${jsonFilePath}`);
498
+ console.log("Loading file: ".concat(jsonFilePath));
275
499
  }
276
500
 
277
- const json = fs.readFileSync(jsonFilePath, {
501
+ var json = _fsExtra["default"].readFileSync(jsonFilePath, {
278
502
  encoding: "utf8"
279
503
  });
504
+
280
505
  Object.assign(photoByUid, JSON.parse(json));
281
506
  } else if (log) {
282
- console.log(`Ignoring missing file: ${jsonFilePath}`);
507
+ console.log("Ignoring missing file: ".concat(jsonFilePath));
283
508
  }
284
509
  }
285
510
  {
286
- const jsonFilePath = path.join(dataDir, "photos_senateurs", "senateurs.json");
511
+ var _jsonFilePath = _path["default"].join(dataDir, "photos_senateurs", "senateurs.json");
287
512
 
288
- if (fs.existsSync(jsonFilePath)) {
513
+ if (_fsExtra["default"].existsSync(_jsonFilePath)) {
289
514
  if (log) {
290
- console.log(`Loading file: ${jsonFilePath}`);
515
+ console.log("Loading file: ".concat(_jsonFilePath));
291
516
  }
292
517
 
293
- const json = fs.readFileSync(jsonFilePath, {
518
+ var _json = _fsExtra["default"].readFileSync(_jsonFilePath, {
294
519
  encoding: "utf8"
295
520
  });
296
- Object.assign(photoByUid, JSON.parse(json));
521
+
522
+ Object.assign(photoByUid, JSON.parse(_json));
297
523
  } else if (log) {
298
- console.log(`Ignoring missing file: ${jsonFilePath}`);
524
+ console.log("Ignoring missing file: ".concat(_jsonFilePath));
299
525
  }
300
526
  }
301
527
  }
302
528
 
303
- const scrutinByUid = {};
529
+ var scrutinByUid = {};
304
530
 
305
- if (enabledDatasets & EnabledDatasets.Scrutins) {
306
- for (const dataset of datasets.scrutins) {
307
- if (dataset.ignoreForWeb) {
308
- continue;
309
- }
310
-
311
- if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
312
- continue;
313
- }
531
+ if (enabledDatasets & _datasets.EnabledDatasets.Scrutins) {
532
+ var _iterator13 = _createForOfIteratorHelper(_datasets.datasets.scrutins),
533
+ _step13;
314
534
 
315
- const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
535
+ try {
536
+ for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
537
+ var _dataset4 = _step13.value;
316
538
 
317
- for (const scrutinSplitPath of walkDir(datasetDir)) {
318
- const scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
539
+ if (_dataset4.ignoreForWeb) {
540
+ continue;
541
+ }
319
542
 
320
- if (!scrutinFilename.endsWith(".json")) {
543
+ if (legislature !== _legislatures.Legislature.All && _dataset4.legislature !== _legislatures.Legislature.All && legislature !== _dataset4.legislature) {
321
544
  continue;
322
545
  }
323
546
 
324
- const scrutinFilePath = path.join(datasetDir, ...scrutinSplitPath);
547
+ var _datasetDir4 = _path["default"].join(dataDir, _dataset4.filename.replace(/\.json$/, "_nettoye"));
325
548
 
326
- if (log) {
327
- console.log(`Loading file: ${scrutinFilePath}…`);
328
- }
549
+ var _iterator14 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetDir4)),
550
+ _step14;
329
551
 
330
- const scrutinJson = fs.readFileSync(scrutinFilePath, {
331
- encoding: "utf8"
332
- });
333
- const scrutin = ScrutinsConvert.toScrutin(scrutinJson);
552
+ try {
553
+ for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
554
+ var scrutinSplitPath = _step14.value;
555
+ var scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
556
+
557
+ if (!scrutinFilename.endsWith(".json")) {
558
+ continue;
559
+ }
560
+
561
+ var scrutinFilePath = _path["default"].join.apply(_path["default"], [_datasetDir4].concat(_toConsumableArray(scrutinSplitPath)));
334
562
 
335
- if (scrutinByUid[scrutin.uid] === undefined) {
336
- scrutinByUid[scrutin.uid] = scrutin;
563
+ if (log) {
564
+ console.log("Loading file: ".concat(scrutinFilePath, "\u2026"));
565
+ }
566
+
567
+ var scrutinJson = _fsExtra["default"].readFileSync(scrutinFilePath, {
568
+ encoding: "utf8"
569
+ });
570
+
571
+ var scrutin = _scrutins.Convert.toScrutin(scrutinJson);
572
+
573
+ if (scrutinByUid[scrutin.uid] === undefined) {
574
+ scrutinByUid[scrutin.uid] = scrutin;
575
+ }
576
+ }
577
+ } catch (err) {
578
+ _iterator14.e(err);
579
+ } finally {
580
+ _iterator14.f();
337
581
  }
338
582
  }
583
+ } catch (err) {
584
+ _iterator13.e(err);
585
+ } finally {
586
+ _iterator13.f();
339
587
  }
340
588
  }
341
589
 
342
590
  return {
343
- acteurByUid,
344
- amendementByUid,
345
- documentByUid,
346
- dossierParlementaireBySenatChemin,
347
- dossierParlementaireByTitreChemin,
348
- dossierParlementaireByUid,
349
- organeByUid,
350
- photoByUid,
351
- reunionByUid,
352
- reunionsByDay,
353
- reunionsByDossierUid,
354
- scrutinByUid
591
+ acteurByUid: acteurByUid,
592
+ amendementByUid: amendementByUid,
593
+ documentByUid: documentByUid,
594
+ dossierParlementaireBySenatChemin: dossierParlementaireBySenatChemin,
595
+ dossierParlementaireByTitreChemin: dossierParlementaireByTitreChemin,
596
+ dossierParlementaireByUid: dossierParlementaireByUid,
597
+ organeByUid: organeByUid,
598
+ photoByUid: photoByUid,
599
+ reunionByUid: reunionByUid,
600
+ reunionsByDay: reunionsByDay,
601
+ reunionsByDossierUid: reunionsByDossierUid,
602
+ scrutinByUid: scrutinByUid
355
603
  };
356
604
  }
357
605
  /** Load data from big monolytic files. */
358
606
 
359
- export function loadAssembleeDataFromBigFiles(dataDir, enabledDatasets, legislature, {
360
- log = false
361
- } = {}) {
362
- const acteurByUid = {};
363
- const organeByUid = {};
364
607
 
365
- if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
366
- for (const dataset of datasets.acteursEtOrganes) {
367
- if (dataset.ignoreForWeb) {
368
- continue;
369
- }
608
+ function loadAssembleeDataFromBigFiles(dataDir, enabledDatasets, legislature) {
609
+ var _ref2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {},
610
+ _ref2$log = _ref2.log,
611
+ log = _ref2$log === void 0 ? false : _ref2$log;
370
612
 
371
- if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
372
- continue;
373
- }
613
+ var acteurByUid = {};
614
+ var organeByUid = {};
374
615
 
375
- const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
616
+ if (enabledDatasets & _datasets.EnabledDatasets.ActeursEtOrganes) {
617
+ var _iterator15 = _createForOfIteratorHelper(_datasets.datasets.acteursEtOrganes),
618
+ _step15;
376
619
 
377
- if (log) {
378
- console.log(`Loading file: ${jsonFilePath}`);
379
- }
620
+ try {
621
+ for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
622
+ var dataset = _step15.value;
380
623
 
381
- const json = fs.readFileSync(jsonFilePath, {
382
- encoding: "utf8"
383
- });
384
- const acteursEtOrganes = ActeursEtOrganesConvert.toActeursEtOrganes(json);
624
+ if (dataset.ignoreForWeb) {
625
+ continue;
626
+ }
385
627
 
386
- for (const acteur of acteursEtOrganes.acteurs) {
387
- // Keep the first existing "acteur", because the first wrapper is the most complete.
388
- if (acteurByUid[acteur.uid] === undefined) {
389
- acteurByUid[acteur.uid] = acteur;
628
+ if (legislature !== _legislatures.Legislature.All && dataset.legislature !== _legislatures.Legislature.All && legislature !== dataset.legislature) {
629
+ continue;
390
630
  }
391
- }
392
631
 
393
- for (const organe of acteursEtOrganes.organes) {
394
- // Keep the first existing "organe", because the first wrapper is the most complete.
395
- if (organeByUid[organe.uid] === undefined) {
396
- organeByUid[organe.uid] = organe;
632
+ var jsonFilePath = _path["default"].join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
633
+
634
+ if (log) {
635
+ console.log("Loading file: ".concat(jsonFilePath));
636
+ }
637
+
638
+ var json = _fsExtra["default"].readFileSync(jsonFilePath, {
639
+ encoding: "utf8"
640
+ });
641
+
642
+ var acteursEtOrganes = _acteurs_et_organes.Convert.toActeursEtOrganes(json);
643
+
644
+ var _iterator16 = _createForOfIteratorHelper(acteursEtOrganes.acteurs),
645
+ _step16;
646
+
647
+ try {
648
+ for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
649
+ var acteur = _step16.value;
650
+
651
+ // Keep the first existing "acteur", because the first wrapper is the most complete.
652
+ if (acteurByUid[acteur.uid] === undefined) {
653
+ acteurByUid[acteur.uid] = acteur;
654
+ }
655
+ }
656
+ } catch (err) {
657
+ _iterator16.e(err);
658
+ } finally {
659
+ _iterator16.f();
660
+ }
661
+
662
+ var _iterator17 = _createForOfIteratorHelper(acteursEtOrganes.organes),
663
+ _step17;
664
+
665
+ try {
666
+ for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {
667
+ var organe = _step17.value;
668
+
669
+ // Keep the first existing "organe", because the first wrapper is the most complete.
670
+ if (organeByUid[organe.uid] === undefined) {
671
+ organeByUid[organe.uid] = organe;
672
+ }
673
+ }
674
+ } catch (err) {
675
+ _iterator17.e(err);
676
+ } finally {
677
+ _iterator17.f();
397
678
  }
398
679
  }
680
+ } catch (err) {
681
+ _iterator15.e(err);
682
+ } finally {
683
+ _iterator15.f();
399
684
  }
400
685
  }
401
686
 
402
- const reunionByUid = {};
403
- const reunionsByDay = {};
404
- const reunionsByDossierUid = {};
687
+ var reunionByUid = {};
688
+ var reunionsByDay = {};
689
+ var reunionsByDossierUid = {};
405
690
 
406
- if (enabledDatasets & EnabledDatasets.Agendas) {
407
- for (const dataset of datasets.agendas) {
408
- if (dataset.ignoreForWeb) {
409
- continue;
410
- }
691
+ if (enabledDatasets & _datasets.EnabledDatasets.Agendas) {
692
+ var _iterator18 = _createForOfIteratorHelper(_datasets.datasets.agendas),
693
+ _step18;
411
694
 
412
- if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
413
- continue;
414
- }
695
+ try {
696
+ for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {
697
+ var _dataset5 = _step18.value;
415
698
 
416
- const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
699
+ if (_dataset5.ignoreForWeb) {
700
+ continue;
701
+ }
417
702
 
418
- if (log) {
419
- console.log(`Loading file: ${jsonFilePath}`);
420
- }
703
+ if (legislature !== _legislatures.Legislature.All && _dataset5.legislature !== _legislatures.Legislature.All && legislature !== _dataset5.legislature) {
704
+ continue;
705
+ }
421
706
 
422
- const json = fs.readFileSync(jsonFilePath, {
423
- encoding: "utf8"
424
- });
425
- const agendas = AgendasConvert.toAgendas(json);
707
+ var _jsonFilePath2 = _path["default"].join(dataDir, _dataset5.filename.replace(/\.json$/, "_nettoye.json"));
426
708
 
427
- for (const reunion of agendas.reunions) {
428
- if (reunionByUid[reunion.uid] === undefined) {
429
- reunionByUid[reunion.uid] = reunion;
709
+ if (log) {
710
+ console.log("Loading file: ".concat(_jsonFilePath2));
430
711
  }
431
712
 
432
- const day = reunion.timestampDebut.toISOString().split("T")[0];
433
- let reunionsAtDay = reunionsByDay[day];
713
+ var _json2 = _fsExtra["default"].readFileSync(_jsonFilePath2, {
714
+ encoding: "utf8"
715
+ });
716
+
717
+ var agendas = _agendas.Convert.toAgendas(_json2);
434
718
 
435
- if (reunionsAtDay === undefined) {
436
- reunionsAtDay = reunionsByDay[day] = [];
437
- }
719
+ var _iterator19 = _createForOfIteratorHelper(agendas.reunions),
720
+ _step19;
438
721
 
439
- reunionsAtDay.push(reunion);
440
- const odj = reunion.odj;
722
+ try {
723
+ for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {
724
+ var reunion = _step19.value;
441
725
 
442
- if (odj !== undefined) {
443
- for (const pointOdj of odj.pointsOdj || []) {
444
- for (const dossierLegislatifRef of pointOdj.dossiersLegislatifsRefs || []) {
445
- let reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef];
726
+ if (reunionByUid[reunion.uid] === undefined) {
727
+ reunionByUid[reunion.uid] = reunion;
728
+ }
446
729
 
447
- if (reunionsAtDossierUid === undefined) {
448
- reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef] = [];
449
- }
730
+ var _day2 = reunion.timestampDebut.toISOString().split("T")[0];
731
+ var reunionsAtDay = reunionsByDay[_day2];
450
732
 
451
- reunionsAtDossierUid.push(reunion);
733
+ if (reunionsAtDay === undefined) {
734
+ reunionsAtDay = reunionsByDay[_day2] = [];
735
+ }
736
+
737
+ reunionsAtDay.push(reunion);
738
+ var odj = reunion.odj;
739
+
740
+ if (odj !== undefined) {
741
+ var _iterator20 = _createForOfIteratorHelper(odj.pointsOdj || []),
742
+ _step20;
743
+
744
+ try {
745
+ for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {
746
+ var pointOdj = _step20.value;
747
+
748
+ var _iterator21 = _createForOfIteratorHelper(pointOdj.dossiersLegislatifsRefs || []),
749
+ _step21;
750
+
751
+ try {
752
+ for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {
753
+ var dossierLegislatifRef = _step21.value;
754
+ var reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef];
755
+
756
+ if (reunionsAtDossierUid === undefined) {
757
+ reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef] = [];
758
+ }
759
+
760
+ reunionsAtDossierUid.push(reunion);
761
+ }
762
+ } catch (err) {
763
+ _iterator21.e(err);
764
+ } finally {
765
+ _iterator21.f();
766
+ }
767
+ }
768
+ } catch (err) {
769
+ _iterator20.e(err);
770
+ } finally {
771
+ _iterator20.f();
772
+ }
452
773
  }
453
774
  }
775
+ } catch (err) {
776
+ _iterator19.e(err);
777
+ } finally {
778
+ _iterator19.f();
454
779
  }
455
780
  }
781
+ } catch (err) {
782
+ _iterator18.e(err);
783
+ } finally {
784
+ _iterator18.f();
456
785
  }
457
786
  }
458
787
 
459
- const amendementByUid = {};
788
+ var amendementByUid = {};
460
789
 
461
- if (enabledDatasets & EnabledDatasets.Amendements) {
462
- for (const dataset of datasets.amendements) {
463
- if (dataset.ignoreForWeb) {
464
- continue;
465
- }
790
+ if (enabledDatasets & _datasets.EnabledDatasets.Amendements) {
791
+ var _iterator22 = _createForOfIteratorHelper(_datasets.datasets.amendements),
792
+ _step22;
466
793
 
467
- if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
468
- continue;
469
- }
794
+ try {
795
+ for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {
796
+ var _dataset6 = _step22.value;
470
797
 
471
- const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
798
+ if (_dataset6.ignoreForWeb) {
799
+ continue;
800
+ }
472
801
 
473
- if (log) {
474
- console.log(`Loading file: ${jsonFilePath}`);
475
- }
802
+ if (legislature !== _legislatures.Legislature.All && _dataset6.legislature !== _legislatures.Legislature.All && legislature !== _dataset6.legislature) {
803
+ continue;
804
+ }
476
805
 
477
- const json = fs.readFileSync(jsonFilePath, {
478
- encoding: "utf8"
479
- });
480
- const amendements = AmendementsConvert.toAmendements(json);
806
+ var _jsonFilePath3 = _path["default"].join(dataDir, _dataset6.filename.replace(/\.json$/, "_nettoye.json"));
481
807
 
482
- for (const texteLegislatif of amendements.textesLegislatifs) {
483
- for (const amendement of texteLegislatif.amendements) {
484
- if (amendementByUid[amendement.uid] === undefined) {
485
- amendementByUid[amendement.uid] = amendement;
808
+ if (log) {
809
+ console.log("Loading file: ".concat(_jsonFilePath3));
810
+ }
811
+
812
+ var _json3 = _fsExtra["default"].readFileSync(_jsonFilePath3, {
813
+ encoding: "utf8"
814
+ });
815
+
816
+ var amendements = _amendements.Convert.toAmendements(_json3);
817
+
818
+ var _iterator23 = _createForOfIteratorHelper(amendements.textesLegislatifs),
819
+ _step23;
820
+
821
+ try {
822
+ for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {
823
+ var texteLegislatif = _step23.value;
824
+
825
+ var _iterator24 = _createForOfIteratorHelper(texteLegislatif.amendements),
826
+ _step24;
827
+
828
+ try {
829
+ for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {
830
+ var amendement = _step24.value;
831
+
832
+ if (amendementByUid[amendement.uid] === undefined) {
833
+ amendementByUid[amendement.uid] = amendement;
834
+ }
835
+ }
836
+ } catch (err) {
837
+ _iterator24.e(err);
838
+ } finally {
839
+ _iterator24.f();
840
+ }
486
841
  }
842
+ } catch (err) {
843
+ _iterator23.e(err);
844
+ } finally {
845
+ _iterator23.f();
487
846
  }
488
847
  }
848
+ } catch (err) {
849
+ _iterator22.e(err);
850
+ } finally {
851
+ _iterator22.f();
489
852
  }
490
853
  }
491
854
 
492
- const documentByUid = {};
493
- const dossierParlementaireBySenatChemin = {};
494
- const dossierParlementaireByTitreChemin = {};
495
- const dossierParlementaireByUid = {};
855
+ var documentByUid = {};
856
+ var dossierParlementaireBySenatChemin = {};
857
+ var dossierParlementaireByTitreChemin = {};
858
+ var dossierParlementaireByUid = {};
496
859
 
497
- if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
498
- for (const dataset of datasets.dossiersLegislatifs) {
499
- if (dataset.ignoreForWeb) {
500
- continue;
501
- }
860
+ if (enabledDatasets & _datasets.EnabledDatasets.DossiersLegislatifs) {
861
+ var _iterator25 = _createForOfIteratorHelper(_datasets.datasets.dossiersLegislatifs),
862
+ _step25;
502
863
 
503
- if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
504
- continue;
505
- }
864
+ try {
865
+ for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {
866
+ var _dataset7 = _step25.value;
506
867
 
507
- const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
868
+ if (_dataset7.ignoreForWeb) {
869
+ continue;
870
+ }
508
871
 
509
- if (log) {
510
- console.log(`Loading file: ${jsonFilePath}`);
511
- }
872
+ if (legislature !== _legislatures.Legislature.All && _dataset7.legislature !== _legislatures.Legislature.All && legislature !== _dataset7.legislature) {
873
+ continue;
874
+ }
512
875
 
513
- const json = fs.readFileSync(jsonFilePath, {
514
- encoding: "utf8"
515
- });
516
- const dossiersLegislatifs = DossiersLegislatifsConvert.toDossiersLegislatifs(json);
876
+ var _jsonFilePath4 = _path["default"].join(dataDir, _dataset7.filename.replace(/\.json$/, "_nettoye.json"));
517
877
 
518
- for (const document of dossiersLegislatifs.textesLegislatifs) {
519
- if (documentByUid[document.uid] === undefined) {
520
- documentByUid[document.uid] = document;
878
+ if (log) {
879
+ console.log("Loading file: ".concat(_jsonFilePath4));
521
880
  }
522
- }
523
881
 
524
- for (const dossier of dossiersLegislatifs.dossiersParlementaires) {
525
- const titreDossier = dossier.titreDossier;
882
+ var _json4 = _fsExtra["default"].readFileSync(_jsonFilePath4, {
883
+ encoding: "utf8"
884
+ });
885
+
886
+ var dossiersLegislatifs = _dossiers_legislatifs.Convert.toDossiersLegislatifs(_json4);
526
887
 
527
- if (titreDossier.senatChemin && dossierParlementaireBySenatChemin[titreDossier.senatChemin] === undefined) {
528
- dossierParlementaireBySenatChemin[titreDossier.senatChemin] = dossier;
529
- }
888
+ var _iterator26 = _createForOfIteratorHelper(dossiersLegislatifs.textesLegislatifs),
889
+ _step26;
890
+
891
+ try {
892
+ for (_iterator26.s(); !(_step26 = _iterator26.n()).done;) {
893
+ var document = _step26.value;
530
894
 
531
- if (titreDossier.titreChemin && dossierParlementaireByTitreChemin[titreDossier.titreChemin] === undefined) {
532
- dossierParlementaireByTitreChemin[titreDossier.titreChemin] = dossier;
895
+ if (documentByUid[document.uid] === undefined) {
896
+ documentByUid[document.uid] = document;
897
+ }
898
+ }
899
+ } catch (err) {
900
+ _iterator26.e(err);
901
+ } finally {
902
+ _iterator26.f();
533
903
  }
534
904
 
535
- if (dossierParlementaireByUid[dossier.uid] === undefined) {
536
- dossierParlementaireByUid[dossier.uid] = dossier;
905
+ var _iterator27 = _createForOfIteratorHelper(dossiersLegislatifs.dossiersParlementaires),
906
+ _step27;
907
+
908
+ try {
909
+ for (_iterator27.s(); !(_step27 = _iterator27.n()).done;) {
910
+ var dossier = _step27.value;
911
+ var titreDossier = dossier.titreDossier;
912
+
913
+ if (titreDossier.senatChemin && dossierParlementaireBySenatChemin[titreDossier.senatChemin] === undefined) {
914
+ dossierParlementaireBySenatChemin[titreDossier.senatChemin] = dossier;
915
+ }
916
+
917
+ if (titreDossier.titreChemin && dossierParlementaireByTitreChemin[titreDossier.titreChemin] === undefined) {
918
+ dossierParlementaireByTitreChemin[titreDossier.titreChemin] = dossier;
919
+ }
920
+
921
+ if (dossierParlementaireByUid[dossier.uid] === undefined) {
922
+ dossierParlementaireByUid[dossier.uid] = dossier;
923
+ }
924
+ }
925
+ } catch (err) {
926
+ _iterator27.e(err);
927
+ } finally {
928
+ _iterator27.f();
537
929
  }
538
930
  }
931
+ } catch (err) {
932
+ _iterator25.e(err);
933
+ } finally {
934
+ _iterator25.f();
539
935
  }
540
936
  }
541
937
 
542
- const photoByUid = {};
938
+ var photoByUid = {};
543
939
 
544
- if (enabledDatasets & EnabledDatasets.Photos) {
545
- const photoByUid = {};
940
+ if (enabledDatasets & _datasets.EnabledDatasets.Photos) {
941
+ var _photoByUid = {};
546
942
  {
547
- const jsonFilePath = path.join(dataDir, `photos_deputes_${// TODO: Handle Legislature.All.
548
- legislature === Legislature.All ? Legislature.Seize : legislature}`, "deputes.json");
943
+ var _jsonFilePath5 = _path["default"].join(dataDir, "photos_deputes_".concat( // TODO: Handle Legislature.All.
944
+ legislature === _legislatures.Legislature.All ? _legislatures.Legislature.Seize : legislature), "deputes.json");
549
945
 
550
- if (fs.existsSync(jsonFilePath)) {
946
+ if (_fsExtra["default"].existsSync(_jsonFilePath5)) {
551
947
  if (log) {
552
- console.log(`Loading file: ${jsonFilePath}`);
948
+ console.log("Loading file: ".concat(_jsonFilePath5));
553
949
  }
554
950
 
555
- const json = fs.readFileSync(jsonFilePath, {
951
+ var _json5 = _fsExtra["default"].readFileSync(_jsonFilePath5, {
556
952
  encoding: "utf8"
557
953
  });
558
- Object.assign(photoByUid, JSON.parse(json));
954
+
955
+ Object.assign(_photoByUid, JSON.parse(_json5));
559
956
  } else if (log) {
560
- console.log(`Ignoring missing file: ${jsonFilePath}`);
957
+ console.log("Ignoring missing file: ".concat(_jsonFilePath5));
561
958
  }
562
959
  }
563
960
  {
564
- const jsonFilePath = path.join(dataDir, "photos_senateurs", "senateurs.json");
961
+ var _jsonFilePath6 = _path["default"].join(dataDir, "photos_senateurs", "senateurs.json");
565
962
 
566
- if (fs.existsSync(jsonFilePath)) {
963
+ if (_fsExtra["default"].existsSync(_jsonFilePath6)) {
567
964
  if (log) {
568
- console.log(`Loading file: ${jsonFilePath}`);
965
+ console.log("Loading file: ".concat(_jsonFilePath6));
569
966
  }
570
967
 
571
- const json = fs.readFileSync(jsonFilePath, {
968
+ var _json6 = _fsExtra["default"].readFileSync(_jsonFilePath6, {
572
969
  encoding: "utf8"
573
970
  });
574
- Object.assign(photoByUid, JSON.parse(json));
971
+
972
+ Object.assign(_photoByUid, JSON.parse(_json6));
575
973
  } else if (log) {
576
- console.log(`Ignoring missing file: ${jsonFilePath}`);
974
+ console.log("Ignoring missing file: ".concat(_jsonFilePath6));
577
975
  }
578
976
  }
579
977
  }
580
978
 
581
- const scrutinByUid = {};
979
+ var scrutinByUid = {};
582
980
 
583
- if (enabledDatasets & EnabledDatasets.Scrutins) {
584
- for (const dataset of datasets.scrutins) {
585
- if (dataset.ignoreForWeb) {
586
- continue;
587
- }
981
+ if (enabledDatasets & _datasets.EnabledDatasets.Scrutins) {
982
+ var _iterator28 = _createForOfIteratorHelper(_datasets.datasets.scrutins),
983
+ _step28;
588
984
 
589
- if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
590
- continue;
591
- }
985
+ try {
986
+ for (_iterator28.s(); !(_step28 = _iterator28.n()).done;) {
987
+ var _dataset8 = _step28.value;
988
+
989
+ if (_dataset8.ignoreForWeb) {
990
+ continue;
991
+ }
592
992
 
593
- const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
993
+ if (legislature !== _legislatures.Legislature.All && _dataset8.legislature !== _legislatures.Legislature.All && legislature !== _dataset8.legislature) {
994
+ continue;
995
+ }
594
996
 
595
- if (log) {
596
- console.log(`Loading file: ${jsonFilePath}`);
597
- }
997
+ var _jsonFilePath7 = _path["default"].join(dataDir, _dataset8.filename.replace(/\.json$/, "_nettoye.json"));
598
998
 
599
- const json = fs.readFileSync(jsonFilePath, {
600
- encoding: "utf8"
601
- });
602
- const scrutins = ScrutinsConvert.toScrutins(json);
999
+ if (log) {
1000
+ console.log("Loading file: ".concat(_jsonFilePath7));
1001
+ }
1002
+
1003
+ var _json7 = _fsExtra["default"].readFileSync(_jsonFilePath7, {
1004
+ encoding: "utf8"
1005
+ });
603
1006
 
604
- for (const scrutin of scrutins.scrutins) {
605
- if (scrutinByUid[scrutin.uid] === undefined) {
606
- scrutinByUid[scrutin.uid] = scrutin;
1007
+ var scrutins = _scrutins.Convert.toScrutins(_json7);
1008
+
1009
+ var _iterator29 = _createForOfIteratorHelper(scrutins.scrutins),
1010
+ _step29;
1011
+
1012
+ try {
1013
+ for (_iterator29.s(); !(_step29 = _iterator29.n()).done;) {
1014
+ var scrutin = _step29.value;
1015
+
1016
+ if (scrutinByUid[scrutin.uid] === undefined) {
1017
+ scrutinByUid[scrutin.uid] = scrutin;
1018
+ }
1019
+ }
1020
+ } catch (err) {
1021
+ _iterator29.e(err);
1022
+ } finally {
1023
+ _iterator29.f();
607
1024
  }
608
1025
  }
1026
+ } catch (err) {
1027
+ _iterator28.e(err);
1028
+ } finally {
1029
+ _iterator28.f();
609
1030
  }
610
1031
  }
611
1032
 
612
1033
  return {
613
- acteurByUid,
614
- amendementByUid,
615
- documentByUid,
616
- dossierParlementaireBySenatChemin,
617
- dossierParlementaireByTitreChemin,
618
- dossierParlementaireByUid,
619
- organeByUid,
620
- photoByUid,
621
- reunionByUid,
622
- reunionsByDay,
623
- reunionsByDossierUid,
624
- scrutinByUid
1034
+ acteurByUid: acteurByUid,
1035
+ amendementByUid: amendementByUid,
1036
+ documentByUid: documentByUid,
1037
+ dossierParlementaireBySenatChemin: dossierParlementaireBySenatChemin,
1038
+ dossierParlementaireByTitreChemin: dossierParlementaireByTitreChemin,
1039
+ dossierParlementaireByUid: dossierParlementaireByUid,
1040
+ organeByUid: organeByUid,
1041
+ photoByUid: photoByUid,
1042
+ reunionByUid: reunionByUid,
1043
+ reunionsByDay: reunionsByDay,
1044
+ reunionsByDossierUid: reunionsByDossierUid,
1045
+ scrutinByUid: scrutinByUid
625
1046
  };
626
1047
  }
627
- export function pathFromDocumentUid(documentsDir, uid) {
628
- const match = documentUidRegex.exec(uid);
629
- assert.notStrictEqual(match, null, `Unexpected structure for document UID: ${uid}`);
630
- const documentType = path.join(documentsDir, match[1]);
631
- const chambreDir = path.join(documentType, match[2]);
632
- const republiqueDir = path.join(chambreDir, match[3]);
633
- const legislatureDir = path.join(republiqueDir, match[4]);
634
- const etatDir = path.join(legislatureDir, match[5]);
635
- let numero = "000000" + match[6];
1048
+
1049
+ function pathFromDocumentUid(documentsDir, uid) {
1050
+ var match = documentUidRegex.exec(uid);
1051
+
1052
+ _assert["default"].notStrictEqual(match, null, "Unexpected structure for document UID: ".concat(uid));
1053
+
1054
+ var documentType = _path["default"].join(documentsDir, match[1]);
1055
+
1056
+ var chambreDir = _path["default"].join(documentType, match[2]);
1057
+
1058
+ var republiqueDir = _path["default"].join(chambreDir, match[3]);
1059
+
1060
+ var legislatureDir = _path["default"].join(republiqueDir, match[4]);
1061
+
1062
+ var etatDir = _path["default"].join(legislatureDir, match[5]);
1063
+
1064
+ var numero = "000000" + match[6];
636
1065
  numero = numero.substr(numero.length - 6);
637
- const numeroMilliersDir = path.join(etatDir, numero.substr(0, 3));
638
- fs.ensureDirSync(numeroMilliersDir);
639
- return path.join(numeroMilliersDir, uid);
1066
+
1067
+ var numeroMilliersDir = _path["default"].join(etatDir, numero.substr(0, 3));
1068
+
1069
+ _fsExtra["default"].ensureDirSync(numeroMilliersDir);
1070
+
1071
+ return _path["default"].join(numeroMilliersDir, uid);
640
1072
  }
641
- export function pathFromDossierParlementaireUid(dossiersDir, uid) {
642
- const match = dossierUidRegex.exec(uid);
643
- assert.notStrictEqual(match, null, `Unexpected structure for dossier parlementaire UID: ${uid}`);
644
- const republiqueDir = path.join(dossiersDir, match[1]);
645
- const legislatureDir = path.join(republiqueDir, match[2]);
646
- let numero = "000000" + match[3];
1073
+
1074
+ function pathFromDossierParlementaireUid(dossiersDir, uid) {
1075
+ var match = dossierUidRegex.exec(uid);
1076
+
1077
+ _assert["default"].notStrictEqual(match, null, "Unexpected structure for dossier parlementaire UID: ".concat(uid));
1078
+
1079
+ var republiqueDir = _path["default"].join(dossiersDir, match[1]);
1080
+
1081
+ var legislatureDir = _path["default"].join(republiqueDir, match[2]);
1082
+
1083
+ var numero = "000000" + match[3];
647
1084
  numero = numero.substr(numero.length - 6);
648
- const numeroMilliersDir = path.join(legislatureDir, numero.substr(0, 3));
649
- fs.ensureDirSync(numeroMilliersDir);
650
- return path.join(numeroMilliersDir, uid);
1085
+
1086
+ var numeroMilliersDir = _path["default"].join(legislatureDir, numero.substr(0, 3));
1087
+
1088
+ _fsExtra["default"].ensureDirSync(numeroMilliersDir);
1089
+
1090
+ return _path["default"].join(numeroMilliersDir, uid);
651
1091
  }
652
- export function pathFromReunionUid(reunionsDir, uid) {
653
- const match = reunionUidRegex.exec(uid);
654
- assert.notStrictEqual(match, null, `Unexpected structure for reunion UID: ${uid}`);
655
- const chambreDir = path.join(reunionsDir, match[1]);
656
- const republiqueDir = path.join(chambreDir, match[2]);
657
- const legislatureDir = path.join(republiqueDir, match[3]);
658
- const sessionDir = path.join(legislatureDir, match[4]);
659
- const idDir = path.join(sessionDir, match[5]);
660
- let numero = "000000000" + match[6];
1092
+
1093
+ function pathFromReunionUid(reunionsDir, uid) {
1094
+ var match = reunionUidRegex.exec(uid);
1095
+
1096
+ _assert["default"].notStrictEqual(match, null, "Unexpected structure for reunion UID: ".concat(uid));
1097
+
1098
+ var chambreDir = _path["default"].join(reunionsDir, match[1]);
1099
+
1100
+ var republiqueDir = _path["default"].join(chambreDir, match[2]);
1101
+
1102
+ var legislatureDir = _path["default"].join(republiqueDir, match[3]);
1103
+
1104
+ var sessionDir = _path["default"].join(legislatureDir, match[4]);
1105
+
1106
+ var idDir = _path["default"].join(sessionDir, match[5]);
1107
+
1108
+ var numero = "000000000" + match[6];
661
1109
  numero = numero.substr(numero.length - 9);
662
- const numeroMillionsDir = path.join(idDir, numero.substr(0, 3));
663
- const numeroMilliersDir = path.join(numeroMillionsDir, numero.substr(3, 3));
664
- fs.ensureDirSync(numeroMilliersDir);
665
- return path.join(numeroMilliersDir, uid);
1110
+
1111
+ var numeroMillionsDir = _path["default"].join(idDir, numero.substr(0, 3));
1112
+
1113
+ var numeroMilliersDir = _path["default"].join(numeroMillionsDir, numero.substr(3, 3));
1114
+
1115
+ _fsExtra["default"].ensureDirSync(numeroMilliersDir);
1116
+
1117
+ return _path["default"].join(numeroMilliersDir, uid);
666
1118
  }
667
- export function pathFromScrutinUid(scrutinsDir, uid) {
668
- const match = scrutinUidRegex.exec(uid);
669
- assert.notStrictEqual(match, null, `Unexpected structure for scrutin UID: ${uid}`);
670
- const republiqueDir = path.join(scrutinsDir, match[1]);
671
- const legislatureDir = path.join(republiqueDir, match[2]);
672
- let numero = "000000" + match[3];
1119
+
1120
+ function pathFromScrutinUid(scrutinsDir, uid) {
1121
+ var match = scrutinUidRegex.exec(uid);
1122
+
1123
+ _assert["default"].notStrictEqual(match, null, "Unexpected structure for scrutin UID: ".concat(uid));
1124
+
1125
+ var republiqueDir = _path["default"].join(scrutinsDir, match[1]);
1126
+
1127
+ var legislatureDir = _path["default"].join(republiqueDir, match[2]);
1128
+
1129
+ var numero = "000000" + match[3];
673
1130
  numero = numero.substr(numero.length - 6);
674
- const numeroMilliersDir = path.join(legislatureDir, numero.substr(0, 3));
675
- fs.ensureDirSync(numeroMilliersDir);
676
- return path.join(numeroMilliersDir, uid);
1131
+
1132
+ var numeroMilliersDir = _path["default"].join(legislatureDir, numero.substr(0, 3));
1133
+
1134
+ _fsExtra["default"].ensureDirSync(numeroMilliersDir);
1135
+
1136
+ return _path["default"].join(numeroMilliersDir, uid);
677
1137
  }
678
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJmcyIsInBhdGgiLCJFbmFibGVkRGF0YXNldHMiLCJkYXRhc2V0cyIsIndhbGtEaXIiLCJDb252ZXJ0IiwiQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQiLCJBZ2VuZGFzQ29udmVydCIsIkFtZW5kZW1lbnRzQ29udmVydCIsIkRvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0IiwiTGVnaXNsYXR1cmUiLCJTY3J1dGluc0NvbnZlcnQiLCJkb2N1bWVudFVpZFJlZ2V4IiwiZG9zc2llclVpZFJlZ2V4IiwicmV1bmlvblVpZFJlZ2V4Iiwic2NydXRpblVpZFJlZ2V4IiwibG9hZEFzc2VtYmxlZURhdGEiLCJkYXRhRGlyIiwiZW5hYmxlZERhdGFzZXRzIiwibGVnaXNsYXR1cmUiLCJsb2ciLCJhY3RldXJCeVVpZCIsIm9yZ2FuZUJ5VWlkIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXQiLCJhY3RldXJzRXRPcmdhbmVzIiwiaWdub3JlRm9yV2ViIiwiQWxsIiwiZGF0YXNldERpciIsImpvaW4iLCJmaWxlbmFtZSIsInJlcGxhY2UiLCJhY3RldXJTcGxpdFBhdGgiLCJhY3RldXJGaWxlbmFtZSIsImxlbmd0aCIsImVuZHNXaXRoIiwiYWN0ZXVyRmlsZVBhdGgiLCJjb25zb2xlIiwiYWN0ZXVySnNvbiIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwiYWN0ZXVyIiwidG9BY3RldXIiLCJ1aWQiLCJ1bmRlZmluZWQiLCJvcmdhbmVTcGxpdFBhdGgiLCJvcmdhbmVGaWxlbmFtZSIsIm9yZ2FuZUZpbGVQYXRoIiwib3JnYW5lSnNvbiIsIm9yZ2FuZSIsInRvT3JnYW5lIiwicmV1bmlvbkJ5VWlkIiwicmV1bmlvbnNCeURheSIsInJldW5pb25zQnlEb3NzaWVyVWlkIiwiQWdlbmRhcyIsImFnZW5kYXMiLCJyZXVuaW9uU3BsaXRQYXRoIiwicmV1bmlvbkZpbGVuYW1lIiwicmV1bmlvbkZpbGVQYXRoIiwicmV1bmlvbkpzb24iLCJyZXVuaW9uIiwidG9SZXVuaW9uIiwiZGF5IiwidGltZXN0YW1wRGVidXQiLCJ0b0lTT1N0cmluZyIsInNwbGl0IiwicmV1bmlvbnNBdERheSIsInB1c2giLCJvZGoiLCJwb2ludE9kaiIsInBvaW50c09kaiIsImRvc3NpZXJMZWdpc2xhdGlmUmVmIiwiZG9zc2llcnNMZWdpc2xhdGlmc1JlZnMiLCJyZXVuaW9uc0F0RG9zc2llclVpZCIsImFtZW5kZW1lbnRCeVVpZCIsIkFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudHMiLCJhbWVuZGVtZW50U3BsaXRQYXRoIiwiYW1lbmRlbWVudEZpbGVuYW1lIiwiYW1lbmRlbWVudEZpbGVQYXRoIiwiYW1lbmRlbWVudEpzb24iLCJhbWVuZGVtZW50IiwidG9BbWVuZGVtZW50IiwiZG9jdW1lbnRCeVVpZCIsImRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9zc2llcnNMZWdpc2xhdGlmcyIsImRvY3VtZW50U3BsaXRQYXRoIiwiZG9jdW1lbnRGaWxlbmFtZSIsImRvY3VtZW50RmlsZVBhdGgiLCJkb2N1bWVudEpzb24iLCJkb2N1bWVudCIsInRvRG9jdW1lbnQiLCJkb3NzaWVyU3BsaXRQYXRoIiwiZG9zc2llckZpbGVuYW1lIiwiZG9zc2llckZpbGVQYXRoIiwiZG9zc2llckpzb24iLCJkb3NzaWVyIiwidG9Eb3NzaWVyUGFybGVtZW50YWlyZSIsInRpdHJlRG9zc2llciIsInNlbmF0Q2hlbWluIiwidGl0cmVDaGVtaW4iLCJwaG90b0J5VWlkIiwiUGhvdG9zIiwianNvbkZpbGVQYXRoIiwiU2VpemUiLCJleGlzdHNTeW5jIiwianNvbiIsIk9iamVjdCIsImFzc2lnbiIsIkpTT04iLCJwYXJzZSIsInNjcnV0aW5CeVVpZCIsIlNjcnV0aW5zIiwic2NydXRpbnMiLCJzY3J1dGluU3BsaXRQYXRoIiwic2NydXRpbkZpbGVuYW1lIiwic2NydXRpbkZpbGVQYXRoIiwic2NydXRpbkpzb24iLCJzY3J1dGluIiwidG9TY3J1dGluIiwibG9hZEFzc2VtYmxlZURhdGFGcm9tQmlnRmlsZXMiLCJ0b0FjdGV1cnNFdE9yZ2FuZXMiLCJhY3RldXJzIiwib3JnYW5lcyIsInRvQWdlbmRhcyIsInJldW5pb25zIiwidG9BbWVuZGVtZW50cyIsInRleHRlTGVnaXNsYXRpZiIsInRleHRlc0xlZ2lzbGF0aWZzIiwidG9Eb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9zc2llcnNQYXJsZW1lbnRhaXJlcyIsInRvU2NydXRpbnMiLCJwYXRoRnJvbURvY3VtZW50VWlkIiwiZG9jdW1lbnRzRGlyIiwibWF0Y2giLCJleGVjIiwibm90U3RyaWN0RXF1YWwiLCJkb2N1bWVudFR5cGUiLCJjaGFtYnJlRGlyIiwicmVwdWJsaXF1ZURpciIsImxlZ2lzbGF0dXJlRGlyIiwiZXRhdERpciIsIm51bWVybyIsInN1YnN0ciIsIm51bWVyb01pbGxpZXJzRGlyIiwiZW5zdXJlRGlyU3luYyIsInBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQiLCJkb3NzaWVyc0RpciIsInBhdGhGcm9tUmV1bmlvblVpZCIsInJldW5pb25zRGlyIiwic2Vzc2lvbkRpciIsImlkRGlyIiwibnVtZXJvTWlsbGlvbnNEaXIiLCJwYXRoRnJvbVNjcnV0aW5VaWQiLCJzY3J1dGluc0RpciJdLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2FkZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vLyBMb2FkIGRhdGEgZnJvbSBmaWxlc1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmV4cG9ydCB7IEVuYWJsZWREYXRhc2V0cyB9IGZyb20gXCIuL2RhdGFzZXRzXCJcbmltcG9ydCB7IGRhdGFzZXRzLCBFbmFibGVkRGF0YXNldHMgfSBmcm9tIFwiLi9kYXRhc2V0c1wiXG5leHBvcnQgeyB3YWxrRGlyIH0gZnJvbSBcIi4vZmlsZV9zeXN0ZW1zXCJcbmltcG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0IHtcbiAgQWN0ZXVyLFxuICBDb252ZXJ0IGFzIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LFxuICBPcmdhbmUsXG4gIFBob3RvLFxufSBmcm9tIFwiLi90eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBZ2VuZGFzQ29udmVydCwgUmV1bmlvbiB9IGZyb20gXCIuL3R5cGVzL2FnZW5kYXNcIlxuaW1wb3J0IHsgQW1lbmRlbWVudCwgQ29udmVydCBhcyBBbWVuZGVtZW50c0NvbnZlcnQgfSBmcm9tIFwiLi90eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQge1xuICBDb252ZXJ0IGFzIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LFxuICBEb2N1bWVudCxcbiAgRG9zc2llclBhcmxlbWVudGFpcmUsXG59IGZyb20gXCIuL3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IExlZ2lzbGF0dXJlIH0gZnJvbSBcIi4vdHlwZXMvbGVnaXNsYXR1cmVzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgU2NydXRpbnNDb252ZXJ0LCBTY3J1dGluIH0gZnJvbSBcIi4vdHlwZXMvc2NydXRpbnNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGEge1xuICByZWFkb25seSBhY3RldXJCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBBY3RldXIgfVxuICByZWFkb25seSBhbWVuZGVtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogQW1lbmRlbWVudCB9XG4gIHJlYWRvbmx5IGRvY3VtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogRG9jdW1lbnQgfVxuICByZWFkb25seSBkb3NzaWVyUGFybGVtZW50YWlyZUJ5U2VuYXRDaGVtaW46IHtcbiAgICBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZVxuICB9XG4gIHJlYWRvbmx5IGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pbjoge1xuICAgIFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlXG4gIH1cbiAgcmVhZG9ubHkgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZSB9XG4gIHJlYWRvbmx5IG9yZ2FuZUJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IE9yZ2FuZSB9XG4gIHJlYWRvbmx5IHBob3RvQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogUGhvdG8gfVxuICByZWFkb25seSByZXVuaW9uQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogUmV1bmlvbiB9XG4gIHJlYWRvbmx5IHJldW5pb25zQnlEYXk6IHsgW2RheTogc3RyaW5nXTogUmV1bmlvbltdIH1cbiAgcmVhZG9ubHkgcmV1bmlvbnNCeURvc3NpZXJVaWQ6IHsgW2Rvc3NpZXJVaWQ6IHN0cmluZ106IFJldW5pb25bXSB9XG4gIHJlYWRvbmx5IHNjcnV0aW5CeVVpZDogeyBbdWlkOiBzdHJpbmddOiBTY3J1dGluIH1cbn1cblxuY29uc3QgZG9jdW1lbnRVaWRSZWdleCA9XG4gIC9eKEFDSU58QUxDTnxBVkNFfEFWSVN8REVDTHxFVERJfExFVFR8TUVTU3xQSU9OfFBOUkV8UFJKTHxSQVBQfFJJTkZ8UklPTikoQU58U04pKFJcXGQrKVtMU10oXFxkKykoQnxCVEF8QlRDfFRBUCkoXFxkKykoLS4qKT8kL1xuY29uc3QgZG9zc2llclVpZFJlZ2V4ID0gL15ETChSXFxkKykoTFxcZCspTihcXGQrKSQvXG5jb25zdCByZXVuaW9uVWlkUmVnZXggPVxuICAvXlJVKEFOfENHfFNOKShSXFxkKykoTFxcZCspKFtBU11cXGR7NH0pKElEQ3xJREZMP3xJRFMpKFxcZCspJC9cbmNvbnN0IHNjcnV0aW5VaWRSZWdleCA9IC9eVlRBTihSXFxkKykoTFxcZCspVihcXGQrKSQvXG5cbi8qKiBMb2FkIGRhdGEgZnJvbSBzcGxpdCBmaWxlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQXNzZW1ibGVlRGF0YShcbiAgZGF0YURpcjogc3RyaW5nLFxuICBlbmFibGVkRGF0YXNldHM6IEVuYWJsZWREYXRhc2V0cyxcbiAgbGVnaXNsYXR1cmU6IExlZ2lzbGF0dXJlLFxuICB7IGxvZyA9IGZhbHNlIH0gPSB7fSxcbik6IERhdGEge1xuICBjb25zdCBhY3RldXJCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBBY3RldXIgfSA9IHt9XG4gIGNvbnN0IG9yZ2FuZUJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IE9yZ2FuZSB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0RGlyID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZVwiKSxcbiAgICAgIClcblxuICAgICAgZm9yIChjb25zdCBhY3RldXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyLCBbXCJhY3RldXJzXCJdKSkge1xuICAgICAgICBjb25zdCBhY3RldXJGaWxlbmFtZSA9IGFjdGV1clNwbGl0UGF0aFthY3RldXJTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFhY3RldXJGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3RldXJGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5hY3RldXJTcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2FjdGV1ckZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0ZXVySnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGFjdGV1ckZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBhY3RldXIgPSBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b0FjdGV1cihhY3RldXJKc29uKVxuICAgICAgICAvLyBLZWVwIHRoZSBmaXJzdCBleGlzdGluZyBcImFjdGV1clwiLCBiZWNhdXNlIHRoZSBmaXJzdCB3cmFwcGVyIGlzIHRoZSBtb3N0IGNvbXBsZXRlLlxuICAgICAgICBpZiAoYWN0ZXVyQnlVaWRbYWN0ZXVyLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFjdGV1ckJ5VWlkW2FjdGV1ci51aWRdID0gYWN0ZXVyXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBvcmdhbmVTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyLCBbXCJvcmdhbmVzXCJdKSkge1xuICAgICAgICBjb25zdCBvcmdhbmVGaWxlbmFtZSA9IG9yZ2FuZVNwbGl0UGF0aFtvcmdhbmVTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFvcmdhbmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmdhbmVGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5vcmdhbmVTcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke29yZ2FuZUZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JnYW5lSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKG9yZ2FuZUZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBvcmdhbmUgPSBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b09yZ2FuZShvcmdhbmVKc29uKVxuICAgICAgICAvLyBLZWVwIHRoZSBmaXJzdCBleGlzdGluZyBcIm9yZ2FuZVwiLCBiZWNhdXNlIHRoZSBmaXJzdCB3cmFwcGVyIGlzIHRoZSBtb3N0IGNvbXBsZXRlLlxuICAgICAgICBpZiAob3JnYW5lQnlVaWRbb3JnYW5lLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9yZ2FuZUJ5VWlkW29yZ2FuZS51aWRdID0gb3JnYW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZXVuaW9uQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogUmV1bmlvbiB9ID0ge31cbiAgY29uc3QgcmV1bmlvbnNCeURheTogeyBbZGF5OiBzdHJpbmddOiBSZXVuaW9uW10gfSA9IHt9XG4gIGNvbnN0IHJldW5pb25zQnlEb3NzaWVyVWlkOiB7IFtkb3NzaWVyVWlkOiBzdHJpbmddOiBSZXVuaW9uW10gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBpZiAoZGF0YXNldC5pZ25vcmVGb3JXZWIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBkYXRhc2V0LmxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IGRhdGFzZXQubGVnaXNsYXR1cmVcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QgZGF0YXNldERpciA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWVcIiksXG4gICAgICApXG4gICAgICBmb3IgKGNvbnN0IHJldW5pb25TcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyKSkge1xuICAgICAgICBjb25zdCByZXVuaW9uRmlsZW5hbWUgPSByZXVuaW9uU3BsaXRQYXRoW3JldW5pb25TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFyZXVuaW9uRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV1bmlvbkZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXREaXIsIC4uLnJldW5pb25TcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke3JldW5pb25GaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldW5pb25Kc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMocmV1bmlvbkZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCByZXVuaW9uID0gQWdlbmRhc0NvbnZlcnQudG9SZXVuaW9uKHJldW5pb25Kc29uKVxuICAgICAgICBpZiAocmV1bmlvbkJ5VWlkW3JldW5pb24udWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV1bmlvbkJ5VWlkW3JldW5pb24udWlkXSA9IHJldW5pb25cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRheSA9IHJldW5pb24udGltZXN0YW1wRGVidXQudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF1cbiAgICAgICAgbGV0IHJldW5pb25zQXREYXkgPSByZXVuaW9uc0J5RGF5W2RheV1cbiAgICAgICAgaWYgKHJldW5pb25zQXREYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldW5pb25zQXREYXkgPSByZXVuaW9uc0J5RGF5W2RheV0gPSBbXVxuICAgICAgICB9XG4gICAgICAgIHJldW5pb25zQXREYXkucHVzaChyZXVuaW9uKVxuXG4gICAgICAgIGNvbnN0IG9kaiA9IHJldW5pb24ub2RqXG4gICAgICAgIGlmIChvZGogIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZvciAoY29uc3QgcG9pbnRPZGogb2Ygb2RqLnBvaW50c09kaiB8fCBbXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb3NzaWVyTGVnaXNsYXRpZlJlZiBvZiBwb2ludE9kai5kb3NzaWVyc0xlZ2lzbGF0aWZzUmVmcyB8fFxuICAgICAgICAgICAgICBbXSkge1xuICAgICAgICAgICAgICBsZXQgcmV1bmlvbnNBdERvc3NpZXJVaWQgPVxuICAgICAgICAgICAgICAgIHJldW5pb25zQnlEb3NzaWVyVWlkW2Rvc3NpZXJMZWdpc2xhdGlmUmVmXVxuICAgICAgICAgICAgICBpZiAocmV1bmlvbnNBdERvc3NpZXJVaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldW5pb25zQXREb3NzaWVyVWlkID0gcmV1bmlvbnNCeURvc3NpZXJVaWRbXG4gICAgICAgICAgICAgICAgICBkb3NzaWVyTGVnaXNsYXRpZlJlZlxuICAgICAgICAgICAgICAgIF0gPSBbXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldW5pb25zQXREb3NzaWVyVWlkLnB1c2gocmV1bmlvbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBhbWVuZGVtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogQW1lbmRlbWVudCB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGFzZXREaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llXCIpLFxuICAgICAgKVxuXG4gICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyKSkge1xuICAgICAgICBjb25zdCBhbWVuZGVtZW50RmlsZW5hbWUgPVxuICAgICAgICAgIGFtZW5kZW1lbnRTcGxpdFBhdGhbYW1lbmRlbWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWFtZW5kZW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldERpciwgLi4uYW1lbmRlbWVudFNwbGl0UGF0aClcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7YW1lbmRlbWVudEZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhhbWVuZGVtZW50RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnQgPSBBbWVuZGVtZW50c0NvbnZlcnQudG9BbWVuZGVtZW50KGFtZW5kZW1lbnRKc29uKVxuICAgICAgICBpZiAoYW1lbmRlbWVudEJ5VWlkW2FtZW5kZW1lbnQudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYW1lbmRlbWVudEJ5VWlkW2FtZW5kZW1lbnQudWlkXSA9IGFtZW5kZW1lbnRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRvY3VtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogRG9jdW1lbnQgfSA9IHt9XG4gIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbjoge1xuICAgIFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlXG4gIH0gPSB7fVxuICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW46IHtcbiAgICBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZVxuICB9ID0ge31cbiAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZSB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0RGlyID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZVwiKSxcbiAgICAgIClcblxuICAgICAgZm9yIChjb25zdCBkb2N1bWVudFNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXREaXIsIFtcImRvY3VtZW50c1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRGaWxlbmFtZSA9IGRvY3VtZW50U3BsaXRQYXRoW2RvY3VtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9jdW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb2N1bWVudEZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXREaXIsIC4uLmRvY3VtZW50U3BsaXRQYXRoKVxuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtkb2N1bWVudEZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9jdW1lbnRKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoZG9jdW1lbnRGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0RvY3VtZW50KGRvY3VtZW50SnNvbilcbiAgICAgICAgaWYgKGRvY3VtZW50QnlVaWRbZG9jdW1lbnQudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZG9jdW1lbnRCeVVpZFtkb2N1bWVudC51aWRdID0gZG9jdW1lbnRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRvc3NpZXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyLCBbXCJkb3NzaWVyc1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9zc2llckZpbGVuYW1lID0gZG9zc2llclNwbGl0UGF0aFtkb3NzaWVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9zc2llckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvc3NpZXJGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5kb3NzaWVyU3BsaXRQYXRoKVxuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtkb3NzaWVyRmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb3NzaWVySnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGRvc3NpZXJGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9zc2llciA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZShkb3NzaWVySnNvbilcbiAgICAgICAgY29uc3QgdGl0cmVEb3NzaWVyID0gZG9zc2llci50aXRyZURvc3NpZXJcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRpdHJlRG9zc2llci5zZW5hdENoZW1pbiAmJlxuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pblt0aXRyZURvc3NpZXIuc2VuYXRDaGVtaW5dID09PVxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pblt0aXRyZURvc3NpZXIuc2VuYXRDaGVtaW5dID0gZG9zc2llclxuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aXRyZURvc3NpZXIudGl0cmVDaGVtaW4gJiZcbiAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW5bdGl0cmVEb3NzaWVyLnRpdHJlQ2hlbWluXSA9PT1cbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW5bdGl0cmVEb3NzaWVyLnRpdHJlQ2hlbWluXSA9IGRvc3NpZXJcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZFtkb3NzaWVyLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWRbZG9zc2llci51aWRdID0gZG9zc2llclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IHBob3RvQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogUGhvdG8gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuUGhvdG9zKSB7XG4gICAge1xuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGBwaG90b3NfZGVwdXRlc18ke1xuICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBMZWdpc2xhdHVyZS5BbGwuXG4gICAgICAgICAgbGVnaXNsYXR1cmUgPT09IExlZ2lzbGF0dXJlLkFsbCA/IExlZ2lzbGF0dXJlLlNlaXplIDogbGVnaXNsYXR1cmVcbiAgICAgICAgfWAsXG4gICAgICAgIFwiZGVwdXRlcy5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhqc29uRmlsZVBhdGgpKSB7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGhvdG9CeVVpZCwgSlNPTi5wYXJzZShqc29uKSlcbiAgICAgIH0gZWxzZSBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyBtaXNzaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIFwicGhvdG9zX3NlbmF0ZXVyc1wiLFxuICAgICAgICBcInNlbmF0ZXVycy5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhqc29uRmlsZVBhdGgpKSB7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGhvdG9CeVVpZCwgSlNPTi5wYXJzZShqc29uKSlcbiAgICAgIH0gZWxzZSBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyBtaXNzaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2NydXRpbkJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFNjcnV0aW4gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuU2NydXRpbnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuc2NydXRpbnMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0RGlyID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZVwiKSxcbiAgICAgIClcblxuICAgICAgZm9yIChjb25zdCBzY3J1dGluU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldERpcikpIHtcbiAgICAgICAgY29uc3Qgc2NydXRpbkZpbGVuYW1lID0gc2NydXRpblNwbGl0UGF0aFtzY3J1dGluU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghc2NydXRpbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjcnV0aW5GaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5zY3J1dGluU3BsaXRQYXRoKVxuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtzY3J1dGluRmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY3J1dGluSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHNjcnV0aW5GaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3Qgc2NydXRpbiA9IFNjcnV0aW5zQ29udmVydC50b1NjcnV0aW4oc2NydXRpbkpzb24pXG4gICAgICAgIGlmIChzY3J1dGluQnlVaWRbc2NydXRpbi51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzY3J1dGluQnlVaWRbc2NydXRpbi51aWRdID0gc2NydXRpblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhY3RldXJCeVVpZCxcbiAgICBhbWVuZGVtZW50QnlVaWQsXG4gICAgZG9jdW1lbnRCeVVpZCxcbiAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5U2VuYXRDaGVtaW4sXG4gICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVRpdHJlQ2hlbWluLFxuICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWQsXG4gICAgb3JnYW5lQnlVaWQsXG4gICAgcGhvdG9CeVVpZCxcbiAgICByZXVuaW9uQnlVaWQsXG4gICAgcmV1bmlvbnNCeURheSxcbiAgICByZXVuaW9uc0J5RG9zc2llclVpZCxcbiAgICBzY3J1dGluQnlVaWQsXG4gIH1cbn1cblxuLyoqIExvYWQgZGF0YSBmcm9tIGJpZyBtb25vbHl0aWMgZmlsZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEFzc2VtYmxlZURhdGFGcm9tQmlnRmlsZXMoXG4gIGRhdGFEaXI6IHN0cmluZyxcbiAgZW5hYmxlZERhdGFzZXRzOiBFbmFibGVkRGF0YXNldHMsXG4gIGxlZ2lzbGF0dXJlOiBMZWdpc2xhdHVyZSxcbiAgeyBsb2cgPSBmYWxzZSB9ID0ge30sXG4pOiBEYXRhIHtcbiAgY29uc3QgYWN0ZXVyQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogQWN0ZXVyIH0gPSB7fVxuICBjb25zdCBvcmdhbmVCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBPcmdhbmUgfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWN0ZXVyc0V0T3JnYW5lcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgICBpZiAoZGF0YXNldC5pZ25vcmVGb3JXZWIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBkYXRhc2V0LmxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IGRhdGFzZXQubGVnaXNsYXR1cmVcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llLmpzb25cIiksXG4gICAgICApXG4gICAgICBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoanNvbkZpbGVQYXRoLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KVxuICAgICAgY29uc3QgYWN0ZXVyc0V0T3JnYW5lcyA9IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LnRvQWN0ZXVyc0V0T3JnYW5lcyhqc29uKVxuICAgICAgZm9yIChjb25zdCBhY3RldXIgb2YgYWN0ZXVyc0V0T3JnYW5lcy5hY3RldXJzKSB7XG4gICAgICAgIC8vIEtlZXAgdGhlIGZpcnN0IGV4aXN0aW5nIFwiYWN0ZXVyXCIsIGJlY2F1c2UgdGhlIGZpcnN0IHdyYXBwZXIgaXMgdGhlIG1vc3QgY29tcGxldGUuXG4gICAgICAgIGlmIChhY3RldXJCeVVpZFthY3RldXIudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0ZXVyQnlVaWRbYWN0ZXVyLnVpZF0gPSBhY3RldXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBvcmdhbmUgb2YgYWN0ZXVyc0V0T3JnYW5lcy5vcmdhbmVzKSB7XG4gICAgICAgIC8vIEtlZXAgdGhlIGZpcnN0IGV4aXN0aW5nIFwib3JnYW5lXCIsIGJlY2F1c2UgdGhlIGZpcnN0IHdyYXBwZXIgaXMgdGhlIG1vc3QgY29tcGxldGUuXG4gICAgICAgIGlmIChvcmdhbmVCeVVpZFtvcmdhbmUudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3JnYW5lQnlVaWRbb3JnYW5lLnVpZF0gPSBvcmdhbmVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJldW5pb25CeVVpZDogeyBbdWlkOiBzdHJpbmddOiBSZXVuaW9uIH0gPSB7fVxuICBjb25zdCByZXVuaW9uc0J5RGF5OiB7IFtkYXk6IHN0cmluZ106IFJldW5pb25bXSB9ID0ge31cbiAgY29uc3QgcmV1bmlvbnNCeURvc3NpZXJVaWQ6IHsgW2Rvc3NpZXJVaWQ6IHN0cmluZ106IFJldW5pb25bXSB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BZ2VuZGFzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFnZW5kYXMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWUuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICBjb25zdCBhZ2VuZGFzID0gQWdlbmRhc0NvbnZlcnQudG9BZ2VuZGFzKGpzb24pXG4gICAgICBmb3IgKGNvbnN0IHJldW5pb24gb2YgYWdlbmRhcy5yZXVuaW9ucykge1xuICAgICAgICBpZiAocmV1bmlvbkJ5VWlkW3JldW5pb24udWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV1bmlvbkJ5VWlkW3JldW5pb24udWlkXSA9IHJldW5pb25cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRheSA9IHJldW5pb24udGltZXN0YW1wRGVidXQudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF1cbiAgICAgICAgbGV0IHJldW5pb25zQXREYXkgPSByZXVuaW9uc0J5RGF5W2RheV1cbiAgICAgICAgaWYgKHJldW5pb25zQXREYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldW5pb25zQXREYXkgPSByZXVuaW9uc0J5RGF5W2RheV0gPSBbXVxuICAgICAgICB9XG4gICAgICAgIHJldW5pb25zQXREYXkucHVzaChyZXVuaW9uKVxuXG4gICAgICAgIGNvbnN0IG9kaiA9IHJldW5pb24ub2RqXG4gICAgICAgIGlmIChvZGogIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZvciAoY29uc3QgcG9pbnRPZGogb2Ygb2RqLnBvaW50c09kaiB8fCBbXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb3NzaWVyTGVnaXNsYXRpZlJlZiBvZiBwb2ludE9kai5kb3NzaWVyc0xlZ2lzbGF0aWZzUmVmcyB8fFxuICAgICAgICAgICAgICBbXSkge1xuICAgICAgICAgICAgICBsZXQgcmV1bmlvbnNBdERvc3NpZXJVaWQgPVxuICAgICAgICAgICAgICAgIHJldW5pb25zQnlEb3NzaWVyVWlkW2Rvc3NpZXJMZWdpc2xhdGlmUmVmXVxuICAgICAgICAgICAgICBpZiAocmV1bmlvbnNBdERvc3NpZXJVaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldW5pb25zQXREb3NzaWVyVWlkID0gcmV1bmlvbnNCeURvc3NpZXJVaWRbXG4gICAgICAgICAgICAgICAgICBkb3NzaWVyTGVnaXNsYXRpZlJlZlxuICAgICAgICAgICAgICAgIF0gPSBbXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldW5pb25zQXREb3NzaWVyVWlkLnB1c2gocmV1bmlvbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBhbWVuZGVtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogQW1lbmRlbWVudCB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZS5qc29uXCIpLFxuICAgICAgKVxuICAgICAgaWYgKGxvZykge1xuICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgfVxuICAgICAgY29uc3QganNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRzID0gQW1lbmRlbWVudHNDb252ZXJ0LnRvQW1lbmRlbWVudHMoanNvbilcbiAgICAgIGZvciAoY29uc3QgdGV4dGVMZWdpc2xhdGlmIG9mIGFtZW5kZW1lbnRzLnRleHRlc0xlZ2lzbGF0aWZzKSB7XG4gICAgICAgIGZvciAoY29uc3QgYW1lbmRlbWVudCBvZiB0ZXh0ZUxlZ2lzbGF0aWYuYW1lbmRlbWVudHMpIHtcbiAgICAgICAgICBpZiAoYW1lbmRlbWVudEJ5VWlkW2FtZW5kZW1lbnQudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhbWVuZGVtZW50QnlVaWRbYW1lbmRlbWVudC51aWRdID0gYW1lbmRlbWVudFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRvY3VtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogRG9jdW1lbnQgfSA9IHt9XG4gIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbjoge1xuICAgIFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlXG4gIH0gPSB7fVxuICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW46IHtcbiAgICBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZVxuICB9ID0ge31cbiAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZSB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWUuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICBjb25zdCBkb3NzaWVyc0xlZ2lzbGF0aWZzID1cbiAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb3NzaWVyc0xlZ2lzbGF0aWZzKGpzb24pXG4gICAgICBmb3IgKGNvbnN0IGRvY3VtZW50IG9mIGRvc3NpZXJzTGVnaXNsYXRpZnMudGV4dGVzTGVnaXNsYXRpZnMpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50QnlVaWRbZG9jdW1lbnQudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZG9jdW1lbnRCeVVpZFtkb2N1bWVudC51aWRdID0gZG9jdW1lbnRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBkb3NzaWVyIG9mIGRvc3NpZXJzTGVnaXNsYXRpZnMuZG9zc2llcnNQYXJsZW1lbnRhaXJlcykge1xuICAgICAgICBjb25zdCB0aXRyZURvc3NpZXIgPSBkb3NzaWVyLnRpdHJlRG9zc2llclxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGl0cmVEb3NzaWVyLnNlbmF0Q2hlbWluICYmXG4gICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVNlbmF0Q2hlbWluW3RpdHJlRG9zc2llci5zZW5hdENoZW1pbl0gPT09XG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVNlbmF0Q2hlbWluW3RpdHJlRG9zc2llci5zZW5hdENoZW1pbl0gPSBkb3NzaWVyXG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRpdHJlRG9zc2llci50aXRyZUNoZW1pbiAmJlxuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pblt0aXRyZURvc3NpZXIudGl0cmVDaGVtaW5dID09PVxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pblt0aXRyZURvc3NpZXIudGl0cmVDaGVtaW5dID0gZG9zc2llclxuICAgICAgICB9XG4gICAgICAgIGlmIChkb3NzaWVyUGFybGVtZW50YWlyZUJ5VWlkW2Rvc3NpZXIudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZFtkb3NzaWVyLnVpZF0gPSBkb3NzaWVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwaG90b0J5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFBob3RvIH0gPSB7fVxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlBob3Rvcykge1xuICAgIGNvbnN0IHBob3RvQnlVaWQgPSB7fVxuXG4gICAge1xuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGBwaG90b3NfZGVwdXRlc18ke1xuICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBMZWdpc2xhdHVyZS5BbGwuXG4gICAgICAgICAgbGVnaXNsYXR1cmUgPT09IExlZ2lzbGF0dXJlLkFsbCA/IExlZ2lzbGF0dXJlLlNlaXplIDogbGVnaXNsYXR1cmVcbiAgICAgICAgfWAsXG4gICAgICAgIFwiZGVwdXRlcy5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhqc29uRmlsZVBhdGgpKSB7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGhvdG9CeVVpZCwgSlNPTi5wYXJzZShqc29uKSlcbiAgICAgIH0gZWxzZSBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyBtaXNzaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIFwicGhvdG9zX3NlbmF0ZXVyc1wiLFxuICAgICAgICBcInNlbmF0ZXVycy5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhqc29uRmlsZVBhdGgpKSB7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGhvdG9CeVVpZCwgSlNPTi5wYXJzZShqc29uKSlcbiAgICAgIH0gZWxzZSBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyBtaXNzaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2NydXRpbkJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFNjcnV0aW4gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuU2NydXRpbnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuc2NydXRpbnMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWUuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICBjb25zdCBzY3J1dGlucyA9IFNjcnV0aW5zQ29udmVydC50b1NjcnV0aW5zKGpzb24pXG4gICAgICBmb3IgKGNvbnN0IHNjcnV0aW4gb2Ygc2NydXRpbnMuc2NydXRpbnMpIHtcbiAgICAgICAgaWYgKHNjcnV0aW5CeVVpZFtzY3J1dGluLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNjcnV0aW5CeVVpZFtzY3J1dGluLnVpZF0gPSBzY3J1dGluXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFjdGV1ckJ5VWlkLFxuICAgIGFtZW5kZW1lbnRCeVVpZCxcbiAgICBkb2N1bWVudEJ5VWlkLFxuICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbixcbiAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW4sXG4gICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZCxcbiAgICBvcmdhbmVCeVVpZCxcbiAgICBwaG90b0J5VWlkLFxuICAgIHJldW5pb25CeVVpZCxcbiAgICByZXVuaW9uc0J5RGF5LFxuICAgIHJldW5pb25zQnlEb3NzaWVyVWlkLFxuICAgIHNjcnV0aW5CeVVpZCxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aEZyb21Eb2N1bWVudFVpZChkb2N1bWVudHNEaXI6IHN0cmluZywgdWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtYXRjaCA9IGRvY3VtZW50VWlkUmVnZXguZXhlYyh1aWQpXG4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICBtYXRjaCxcbiAgICBudWxsLFxuICAgIGBVbmV4cGVjdGVkIHN0cnVjdHVyZSBmb3IgZG9jdW1lbnQgVUlEOiAke3VpZH1gLFxuICApXG4gIGNvbnN0IGRvY3VtZW50VHlwZSA9IHBhdGguam9pbihkb2N1bWVudHNEaXIsIG1hdGNoIVsxXSlcbiAgY29uc3QgY2hhbWJyZURpciA9IHBhdGguam9pbihkb2N1bWVudFR5cGUsIG1hdGNoIVsyXSlcbiAgY29uc3QgcmVwdWJsaXF1ZURpciA9IHBhdGguam9pbihjaGFtYnJlRGlyLCBtYXRjaCFbM10pXG4gIGNvbnN0IGxlZ2lzbGF0dXJlRGlyID0gcGF0aC5qb2luKHJlcHVibGlxdWVEaXIsIG1hdGNoIVs0XSlcbiAgY29uc3QgZXRhdERpciA9IHBhdGguam9pbihsZWdpc2xhdHVyZURpciwgbWF0Y2ghWzVdKVxuICBsZXQgbnVtZXJvID0gXCIwMDAwMDBcIiArIG1hdGNoIVs2XVxuICBudW1lcm8gPSBudW1lcm8uc3Vic3RyKG51bWVyby5sZW5ndGggLSA2KVxuICBjb25zdCBudW1lcm9NaWxsaWVyc0RpciA9IHBhdGguam9pbihldGF0RGlyLCBudW1lcm8uc3Vic3RyKDAsIDMpKVxuICBmcy5lbnN1cmVEaXJTeW5jKG51bWVyb01pbGxpZXJzRGlyKVxuICByZXR1cm4gcGF0aC5qb2luKG51bWVyb01pbGxpZXJzRGlyLCB1aWQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkKFxuICBkb3NzaWVyc0Rpcjogc3RyaW5nLFxuICB1aWQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1hdGNoID0gZG9zc2llclVpZFJlZ2V4LmV4ZWModWlkKVxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgbWF0Y2gsXG4gICAgbnVsbCxcbiAgICBgVW5leHBlY3RlZCBzdHJ1Y3R1cmUgZm9yIGRvc3NpZXIgcGFybGVtZW50YWlyZSBVSUQ6ICR7dWlkfWAsXG4gIClcbiAgY29uc3QgcmVwdWJsaXF1ZURpciA9IHBhdGguam9pbihkb3NzaWVyc0RpciwgbWF0Y2ghWzFdKVxuICBjb25zdCBsZWdpc2xhdHVyZURpciA9IHBhdGguam9pbihyZXB1YmxpcXVlRGlyLCBtYXRjaCFbMl0pXG4gIGxldCBudW1lcm8gPSBcIjAwMDAwMFwiICsgbWF0Y2ghWzNdXG4gIG51bWVybyA9IG51bWVyby5zdWJzdHIobnVtZXJvLmxlbmd0aCAtIDYpXG4gIGNvbnN0IG51bWVyb01pbGxpZXJzRGlyID0gcGF0aC5qb2luKGxlZ2lzbGF0dXJlRGlyLCBudW1lcm8uc3Vic3RyKDAsIDMpKVxuICBmcy5lbnN1cmVEaXJTeW5jKG51bWVyb01pbGxpZXJzRGlyKVxuICByZXR1cm4gcGF0aC5qb2luKG51bWVyb01pbGxpZXJzRGlyLCB1aWQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoRnJvbVJldW5pb25VaWQocmV1bmlvbnNEaXI6IHN0cmluZywgdWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtYXRjaCA9IHJldW5pb25VaWRSZWdleC5leGVjKHVpZClcbiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgIG1hdGNoLFxuICAgIG51bGwsXG4gICAgYFVuZXhwZWN0ZWQgc3RydWN0dXJlIGZvciByZXVuaW9uIFVJRDogJHt1aWR9YCxcbiAgKVxuICBjb25zdCBjaGFtYnJlRGlyID0gcGF0aC5qb2luKHJldW5pb25zRGlyLCBtYXRjaCFbMV0pXG4gIGNvbnN0IHJlcHVibGlxdWVEaXIgPSBwYXRoLmpvaW4oY2hhbWJyZURpciwgbWF0Y2ghWzJdKVxuICBjb25zdCBsZWdpc2xhdHVyZURpciA9IHBhdGguam9pbihyZXB1YmxpcXVlRGlyLCBtYXRjaCFbM10pXG4gIGNvbnN0IHNlc3Npb25EaXIgPSBwYXRoLmpvaW4obGVnaXNsYXR1cmVEaXIsIG1hdGNoIVs0XSlcbiAgY29uc3QgaWREaXIgPSBwYXRoLmpvaW4oc2Vzc2lvbkRpciwgbWF0Y2ghWzVdKVxuICBsZXQgbnVtZXJvID0gXCIwMDAwMDAwMDBcIiArIG1hdGNoIVs2XVxuICBudW1lcm8gPSBudW1lcm8uc3Vic3RyKG51bWVyby5sZW5ndGggLSA5KVxuICBjb25zdCBudW1lcm9NaWxsaW9uc0RpciA9IHBhdGguam9pbihpZERpciwgbnVtZXJvLnN1YnN0cigwLCAzKSlcbiAgY29uc3QgbnVtZXJvTWlsbGllcnNEaXIgPSBwYXRoLmpvaW4obnVtZXJvTWlsbGlvbnNEaXIsIG51bWVyby5zdWJzdHIoMywgMykpXG4gIGZzLmVuc3VyZURpclN5bmMobnVtZXJvTWlsbGllcnNEaXIpXG4gIHJldHVybiBwYXRoLmpvaW4obnVtZXJvTWlsbGllcnNEaXIsIHVpZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhGcm9tU2NydXRpblVpZChzY3J1dGluc0Rpcjogc3RyaW5nLCB1aWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1hdGNoID0gc2NydXRpblVpZFJlZ2V4LmV4ZWModWlkKVxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgbWF0Y2gsXG4gICAgbnVsbCxcbiAgICBgVW5leHBlY3RlZCBzdHJ1Y3R1cmUgZm9yIHNjcnV0aW4gVUlEOiAke3VpZH1gLFxuICApXG4gIGNvbnN0IHJlcHVibGlxdWVEaXIgPSBwYXRoLmpvaW4oc2NydXRpbnNEaXIsIG1hdGNoIVsxXSlcbiAgY29uc3QgbGVnaXNsYXR1cmVEaXIgPSBwYXRoLmpvaW4ocmVwdWJsaXF1ZURpciwgbWF0Y2ghWzJdKVxuICBsZXQgbnVtZXJvID0gXCIwMDAwMDBcIiArIG1hdGNoIVszXVxuICBudW1lcm8gPSBudW1lcm8uc3Vic3RyKG51bWVyby5sZW5ndGggLSA2KVxuICBjb25zdCBudW1lcm9NaWxsaWVyc0RpciA9IHBhdGguam9pbihsZWdpc2xhdHVyZURpciwgbnVtZXJvLnN1YnN0cigwLCAzKSlcbiAgZnMuZW5zdXJlRGlyU3luYyhudW1lcm9NaWxsaWVyc0RpcilcbiAgcmV0dXJuIHBhdGguam9pbihudW1lcm9NaWxsaWVyc0RpciwgdWlkKVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUVBLE9BQU9BLE1BQVAsTUFBbUIsUUFBbkI7QUFDQSxPQUFPQyxFQUFQLE1BQWUsVUFBZjtBQUNBLE9BQU9DLElBQVAsTUFBaUIsTUFBakI7U0FFU0MsZTtTQUNBQyxRLEVBQVVELGU7U0FDVkUsTztTQUNBQSxPO1NBR1BDLE9BQU8sSUFBSUMsdUI7U0FJSkQsT0FBTyxJQUFJRSxjO1NBQ0NGLE9BQU8sSUFBSUcsa0I7U0FFOUJILE9BQU8sSUFBSUksMEI7U0FJSkMsVztTQUNBTCxPQUFPLElBQUlNLGU7QUFxQnBCLE1BQU1DLGdCQUFnQixHQUNwQiwySEFERjtBQUVBLE1BQU1DLGVBQWUsR0FBRyx3QkFBeEI7QUFDQSxNQUFNQyxlQUFlLEdBQ25CLDJEQURGO0FBRUEsTUFBTUMsZUFBZSxHQUFHLDBCQUF4QjtBQUVBOztBQUNBLE9BQU8sU0FBU0MsaUJB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
1138
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkb2N1bWVudFVpZFJlZ2V4IiwiZG9zc2llclVpZFJlZ2V4IiwicmV1bmlvblVpZFJlZ2V4Iiwic2NydXRpblVpZFJlZ2V4IiwibG9hZEFzc2VtYmxlZURhdGEiLCJkYXRhRGlyIiwiZW5hYmxlZERhdGFzZXRzIiwibGVnaXNsYXR1cmUiLCJsb2ciLCJhY3RldXJCeVVpZCIsIm9yZ2FuZUJ5VWlkIiwiRW5hYmxlZERhdGFzZXRzIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXRzIiwiYWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXQiLCJpZ25vcmVGb3JXZWIiLCJMZWdpc2xhdHVyZSIsIkFsbCIsImRhdGFzZXREaXIiLCJwYXRoIiwiam9pbiIsImZpbGVuYW1lIiwicmVwbGFjZSIsIndhbGtEaXIiLCJhY3RldXJTcGxpdFBhdGgiLCJhY3RldXJGaWxlbmFtZSIsImxlbmd0aCIsImVuZHNXaXRoIiwiYWN0ZXVyRmlsZVBhdGgiLCJjb25zb2xlIiwiYWN0ZXVySnNvbiIsImZzIiwicmVhZEZpbGVTeW5jIiwiZW5jb2RpbmciLCJhY3RldXIiLCJBY3RldXJzRXRPcmdhbmVzQ29udmVydCIsInRvQWN0ZXVyIiwidWlkIiwidW5kZWZpbmVkIiwib3JnYW5lU3BsaXRQYXRoIiwib3JnYW5lRmlsZW5hbWUiLCJvcmdhbmVGaWxlUGF0aCIsIm9yZ2FuZUpzb24iLCJvcmdhbmUiLCJ0b09yZ2FuZSIsInJldW5pb25CeVVpZCIsInJldW5pb25zQnlEYXkiLCJyZXVuaW9uc0J5RG9zc2llclVpZCIsIkFnZW5kYXMiLCJhZ2VuZGFzIiwicmV1bmlvblNwbGl0UGF0aCIsInJldW5pb25GaWxlbmFtZSIsInJldW5pb25GaWxlUGF0aCIsInJldW5pb25Kc29uIiwicmV1bmlvbiIsIkFnZW5kYXNDb252ZXJ0IiwidG9SZXVuaW9uIiwiZGF5IiwidGltZXN0YW1wRGVidXQiLCJ0b0lTT1N0cmluZyIsInNwbGl0IiwicmV1bmlvbnNBdERheSIsInB1c2giLCJvZGoiLCJwb2ludHNPZGoiLCJwb2ludE9kaiIsImRvc3NpZXJzTGVnaXNsYXRpZnNSZWZzIiwiZG9zc2llckxlZ2lzbGF0aWZSZWYiLCJyZXVuaW9uc0F0RG9zc2llclVpZCIsImFtZW5kZW1lbnRCeVVpZCIsIkFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudHMiLCJhbWVuZGVtZW50U3BsaXRQYXRoIiwiYW1lbmRlbWVudEZpbGVuYW1lIiwiYW1lbmRlbWVudEZpbGVQYXRoIiwiYW1lbmRlbWVudEpzb24iLCJhbWVuZGVtZW50IiwiQW1lbmRlbWVudHNDb252ZXJ0IiwidG9BbWVuZGVtZW50IiwiZG9jdW1lbnRCeVVpZCIsImRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9zc2llcnNMZWdpc2xhdGlmcyIsImRvY3VtZW50U3BsaXRQYXRoIiwiZG9jdW1lbnRGaWxlbmFtZSIsImRvY3VtZW50RmlsZVBhdGgiLCJkb2N1bWVudEpzb24iLCJkb2N1bWVudCIsIkRvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0IiwidG9Eb2N1bWVudCIsImRvc3NpZXJTcGxpdFBhdGgiLCJkb3NzaWVyRmlsZW5hbWUiLCJkb3NzaWVyRmlsZVBhdGgiLCJkb3NzaWVySnNvbiIsImRvc3NpZXIiLCJ0b0Rvc3NpZXJQYXJsZW1lbnRhaXJlIiwidGl0cmVEb3NzaWVyIiwic2VuYXRDaGVtaW4iLCJ0aXRyZUNoZW1pbiIsInBob3RvQnlVaWQiLCJQaG90b3MiLCJqc29uRmlsZVBhdGgiLCJTZWl6ZSIsImV4aXN0c1N5bmMiLCJqc29uIiwiT2JqZWN0IiwiYXNzaWduIiwiSlNPTiIsInBhcnNlIiwic2NydXRpbkJ5VWlkIiwiU2NydXRpbnMiLCJzY3J1dGlucyIsInNjcnV0aW5TcGxpdFBhdGgiLCJzY3J1dGluRmlsZW5hbWUiLCJzY3J1dGluRmlsZVBhdGgiLCJzY3J1dGluSnNvbiIsInNjcnV0aW4iLCJTY3J1dGluc0NvbnZlcnQiLCJ0b1NjcnV0aW4iLCJsb2FkQXNzZW1ibGVlRGF0YUZyb21CaWdGaWxlcyIsInRvQWN0ZXVyc0V0T3JnYW5lcyIsImFjdGV1cnMiLCJvcmdhbmVzIiwidG9BZ2VuZGFzIiwicmV1bmlvbnMiLCJ0b0FtZW5kZW1lbnRzIiwidGV4dGVzTGVnaXNsYXRpZnMiLCJ0ZXh0ZUxlZ2lzbGF0aWYiLCJ0b0Rvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb3NzaWVyc1BhcmxlbWVudGFpcmVzIiwidG9TY3J1dGlucyIsInBhdGhGcm9tRG9jdW1lbnRVaWQiLCJkb2N1bWVudHNEaXIiLCJtYXRjaCIsImV4ZWMiLCJhc3NlcnQiLCJub3RTdHJpY3RFcXVhbCIsImRvY3VtZW50VHlwZSIsImNoYW1icmVEaXIiLCJyZXB1YmxpcXVlRGlyIiwibGVnaXNsYXR1cmVEaXIiLCJldGF0RGlyIiwibnVtZXJvIiwic3Vic3RyIiwibnVtZXJvTWlsbGllcnNEaXIiLCJlbnN1cmVEaXJTeW5jIiwicGF0aEZyb21Eb3NzaWVyUGFybGVtZW50YWlyZVVpZCIsImRvc3NpZXJzRGlyIiwicGF0aEZyb21SZXVuaW9uVWlkIiwicmV1bmlvbnNEaXIiLCJzZXNzaW9uRGlyIiwiaWREaXIiLCJudW1lcm9NaWxsaW9uc0RpciIsInBhdGhGcm9tU2NydXRpblVpZCIsInNjcnV0aW5zRGlyIl0sInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8vIExvYWQgZGF0YSBmcm9tIGZpbGVzXG5cbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuZXhwb3J0IHsgRW5hYmxlZERhdGFzZXRzIH0gZnJvbSBcIi4vZGF0YXNldHNcIlxuaW1wb3J0IHsgZGF0YXNldHMsIEVuYWJsZWREYXRhc2V0cyB9IGZyb20gXCIuL2RhdGFzZXRzXCJcbmV4cG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuL2ZpbGVfc3lzdGVtc1wiXG5pbXBvcnQge1xuICBBY3RldXIsXG4gIENvbnZlcnQgYXMgQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQsXG4gIE9yZ2FuZSxcbiAgUGhvdG8sXG59IGZyb20gXCIuL3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFnZW5kYXNDb252ZXJ0LCBSZXVuaW9uIH0gZnJvbSBcIi4vdHlwZXMvYWdlbmRhc1wiXG5pbXBvcnQgeyBBbWVuZGVtZW50LCBDb252ZXJ0IGFzIEFtZW5kZW1lbnRzQ29udmVydCB9IGZyb20gXCIuL3R5cGVzL2FtZW5kZW1lbnRzXCJcbmltcG9ydCB7XG4gIENvbnZlcnQgYXMgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQsXG4gIERvY3VtZW50LFxuICBEb3NzaWVyUGFybGVtZW50YWlyZSxcbn0gZnJvbSBcIi4vdHlwZXMvZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0IHsgTGVnaXNsYXR1cmUgfSBmcm9tIFwiLi90eXBlcy9sZWdpc2xhdHVyZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBTY3J1dGluc0NvbnZlcnQsIFNjcnV0aW4gfSBmcm9tIFwiLi90eXBlcy9zY3J1dGluc1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YSB7XG4gIHJlYWRvbmx5IGFjdGV1ckJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IEFjdGV1ciB9XG4gIHJlYWRvbmx5IGFtZW5kZW1lbnRCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBBbWVuZGVtZW50IH1cbiAgcmVhZG9ubHkgZG9jdW1lbnRCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBEb2N1bWVudCB9XG4gIHJlYWRvbmx5IGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbjoge1xuICAgIFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlXG4gIH1cbiAgcmVhZG9ubHkgZG9zc2llclBhcmxlbWVudGFpcmVCeVRpdHJlQ2hlbWluOiB7XG4gICAgW3VpZDogc3RyaW5nXTogRG9zc2llclBhcmxlbWVudGFpcmVcbiAgfVxuICByZWFkb25seSBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlIH1cbiAgcmVhZG9ubHkgb3JnYW5lQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogT3JnYW5lIH1cbiAgcmVhZG9ubHkgcGhvdG9CeVVpZDogeyBbdWlkOiBzdHJpbmddOiBQaG90byB9XG4gIHJlYWRvbmx5IHJldW5pb25CeVVpZDogeyBbdWlkOiBzdHJpbmddOiBSZXVuaW9uIH1cbiAgcmVhZG9ubHkgcmV1bmlvbnNCeURheTogeyBbZGF5OiBzdHJpbmddOiBSZXVuaW9uW10gfVxuICByZWFkb25seSByZXVuaW9uc0J5RG9zc2llclVpZDogeyBbZG9zc2llclVpZDogc3RyaW5nXTogUmV1bmlvbltdIH1cbiAgcmVhZG9ubHkgc2NydXRpbkJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFNjcnV0aW4gfVxufVxuXG5jb25zdCBkb2N1bWVudFVpZFJlZ2V4ID1cbiAgL14oQUNJTnxBTENOfEFWQ0V8QVZJU3xERUNMfEVUREl8TEVUVHxNRVNTfFBJT058UE5SRXxQUkpMfFJBUFB8UklORnxSSU9OKShBTnxTTikoUlxcZCspW0xTXShcXGQrKShCfEJUQXxCVEN8VEFQKShcXGQrKSgtLiopPyQvXG5jb25zdCBkb3NzaWVyVWlkUmVnZXggPSAvXkRMKFJcXGQrKShMXFxkKylOKFxcZCspJC9cbmNvbnN0IHJldW5pb25VaWRSZWdleCA9XG4gIC9eUlUoQU58Q0d8U04pKFJcXGQrKShMXFxkKykoW0FTXVxcZHs0fSkoSURDfElERkw/fElEUykoXFxkKykkL1xuY29uc3Qgc2NydXRpblVpZFJlZ2V4ID0gL15WVEFOKFJcXGQrKShMXFxkKylWKFxcZCspJC9cblxuLyoqIExvYWQgZGF0YSBmcm9tIHNwbGl0IGZpbGVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRBc3NlbWJsZWVEYXRhKFxuICBkYXRhRGlyOiBzdHJpbmcsXG4gIGVuYWJsZWREYXRhc2V0czogRW5hYmxlZERhdGFzZXRzLFxuICBsZWdpc2xhdHVyZTogTGVnaXNsYXR1cmUsXG4gIHsgbG9nID0gZmFsc2UgfSA9IHt9LFxuKTogRGF0YSB7XG4gIGNvbnN0IGFjdGV1ckJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IEFjdGV1ciB9ID0ge31cbiAgY29uc3Qgb3JnYW5lQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogT3JnYW5lIH0gPSB7fVxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lcykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGFzZXREaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llXCIpLFxuICAgICAgKVxuXG4gICAgICBmb3IgKGNvbnN0IGFjdGV1clNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXREaXIsIFtcImFjdGV1cnNcIl0pKSB7XG4gICAgICAgIGNvbnN0IGFjdGV1ckZpbGVuYW1lID0gYWN0ZXVyU3BsaXRQYXRoW2FjdGV1clNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWFjdGV1ckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjdGV1ckZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXREaXIsIC4uLmFjdGV1clNwbGl0UGF0aClcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7YWN0ZXVyRmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3RldXJKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoYWN0ZXVyRmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGFjdGV1ciA9IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LnRvQWN0ZXVyKGFjdGV1ckpzb24pXG4gICAgICAgIC8vIEtlZXAgdGhlIGZpcnN0IGV4aXN0aW5nIFwiYWN0ZXVyXCIsIGJlY2F1c2UgdGhlIGZpcnN0IHdyYXBwZXIgaXMgdGhlIG1vc3QgY29tcGxldGUuXG4gICAgICAgIGlmIChhY3RldXJCeVVpZFthY3RldXIudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0ZXVyQnlVaWRbYWN0ZXVyLnVpZF0gPSBhY3RldXJcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IG9yZ2FuZVNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXREaXIsIFtcIm9yZ2FuZXNcIl0pKSB7XG4gICAgICAgIGNvbnN0IG9yZ2FuZUZpbGVuYW1lID0gb3JnYW5lU3BsaXRQYXRoW29yZ2FuZVNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIW9yZ2FuZUZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yZ2FuZUZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXREaXIsIC4uLm9yZ2FuZVNwbGl0UGF0aClcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7b3JnYW5lRmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmdhbmVKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMob3JnYW5lRmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IG9yZ2FuZSA9IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LnRvT3JnYW5lKG9yZ2FuZUpzb24pXG4gICAgICAgIC8vIEtlZXAgdGhlIGZpcnN0IGV4aXN0aW5nIFwib3JnYW5lXCIsIGJlY2F1c2UgdGhlIGZpcnN0IHdyYXBwZXIgaXMgdGhlIG1vc3QgY29tcGxldGUuXG4gICAgICAgIGlmIChvcmdhbmVCeVVpZFtvcmdhbmUudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3JnYW5lQnlVaWRbb3JnYW5lLnVpZF0gPSBvcmdhbmVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJldW5pb25CeVVpZDogeyBbdWlkOiBzdHJpbmddOiBSZXVuaW9uIH0gPSB7fVxuICBjb25zdCByZXVuaW9uc0J5RGF5OiB7IFtkYXk6IHN0cmluZ106IFJldW5pb25bXSB9ID0ge31cbiAgY29uc3QgcmV1bmlvbnNCeURvc3NpZXJVaWQ6IHsgW2Rvc3NpZXJVaWQ6IHN0cmluZ106IFJldW5pb25bXSB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BZ2VuZGFzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFnZW5kYXMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0RGlyID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZVwiKSxcbiAgICAgIClcbiAgICAgIGZvciAoY29uc3QgcmV1bmlvblNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXREaXIpKSB7XG4gICAgICAgIGNvbnN0IHJldW5pb25GaWxlbmFtZSA9IHJldW5pb25TcGxpdFBhdGhbcmV1bmlvblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIXJldW5pb25GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXVuaW9uRmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldERpciwgLi4ucmV1bmlvblNwbGl0UGF0aClcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7cmV1bmlvbkZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV1bmlvbkpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhyZXVuaW9uRmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHJldW5pb24gPSBBZ2VuZGFzQ29udmVydC50b1JldW5pb24ocmV1bmlvbkpzb24pXG4gICAgICAgIGlmIChyZXVuaW9uQnlVaWRbcmV1bmlvbi51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXVuaW9uQnlVaWRbcmV1bmlvbi51aWRdID0gcmV1bmlvblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF5ID0gcmV1bmlvbi50aW1lc3RhbXBEZWJ1dC50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXVxuICAgICAgICBsZXQgcmV1bmlvbnNBdERheSA9IHJldW5pb25zQnlEYXlbZGF5XVxuICAgICAgICBpZiAocmV1bmlvbnNBdERheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV1bmlvbnNBdERheSA9IHJldW5pb25zQnlEYXlbZGF5XSA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgcmV1bmlvbnNBdERheS5wdXNoKHJldW5pb24pXG5cbiAgICAgICAgY29uc3Qgb2RqID0gcmV1bmlvbi5vZGpcbiAgICAgICAgaWYgKG9kaiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwb2ludE9kaiBvZiBvZGoucG9pbnRzT2RqIHx8IFtdKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvc3NpZXJMZWdpc2xhdGlmUmVmIG9mIHBvaW50T2RqLmRvc3NpZXJzTGVnaXNsYXRpZnNSZWZzIHx8XG4gICAgICAgICAgICAgIFtdKSB7XG4gICAgICAgICAgICAgIGxldCByZXVuaW9uc0F0RG9zc2llclVpZCA9XG4gICAgICAgICAgICAgICAgcmV1bmlvbnNCeURvc3NpZXJVaWRbZG9zc2llckxlZ2lzbGF0aWZSZWZdXG4gICAgICAgICAgICAgIGlmIChyZXVuaW9uc0F0RG9zc2llclVpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV1bmlvbnNBdERvc3NpZXJVaWQgPSByZXVuaW9uc0J5RG9zc2llclVpZFtcbiAgICAgICAgICAgICAgICAgIGRvc3NpZXJMZWdpc2xhdGlmUmVmXG4gICAgICAgICAgICAgICAgXSA9IFtdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV1bmlvbnNBdERvc3NpZXJVaWQucHVzaChyZXVuaW9uKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFtZW5kZW1lbnRCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBBbWVuZGVtZW50IH0gPSB7fVxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFtZW5kZW1lbnRzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFtZW5kZW1lbnRzKSB7XG4gICAgICBpZiAoZGF0YXNldC5pZ25vcmVGb3JXZWIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBkYXRhc2V0LmxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IGRhdGFzZXQubGVnaXNsYXR1cmVcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QgZGF0YXNldERpciA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWVcIiksXG4gICAgICApXG5cbiAgICAgIGZvciAoY29uc3QgYW1lbmRlbWVudFNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXREaXIpKSB7XG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRGaWxlbmFtZSA9XG4gICAgICAgICAgYW1lbmRlbWVudFNwbGl0UGF0aFthbWVuZGVtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghYW1lbmRlbWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5hbWVuZGVtZW50U3BsaXRQYXRoKVxuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHthbWVuZGVtZW50RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGFtZW5kZW1lbnRGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudCA9IEFtZW5kZW1lbnRzQ29udmVydC50b0FtZW5kZW1lbnQoYW1lbmRlbWVudEpzb24pXG4gICAgICAgIGlmIChhbWVuZGVtZW50QnlVaWRbYW1lbmRlbWVudC51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhbWVuZGVtZW50QnlVaWRbYW1lbmRlbWVudC51aWRdID0gYW1lbmRlbWVudFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZG9jdW1lbnRCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBEb2N1bWVudCB9ID0ge31cbiAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVCeVNlbmF0Q2hlbWluOiB7XG4gICAgW3VpZDogc3RyaW5nXTogRG9zc2llclBhcmxlbWVudGFpcmVcbiAgfSA9IHt9XG4gIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pbjoge1xuICAgIFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlXG4gIH0gPSB7fVxuICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlIH0gPSB7fVxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuZG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGFzZXREaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llXCIpLFxuICAgICAgKVxuXG4gICAgICBmb3IgKGNvbnN0IGRvY3VtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldERpciwgW1wiZG9jdW1lbnRzXCJdKSkge1xuICAgICAgICBjb25zdCBkb2N1bWVudEZpbGVuYW1lID0gZG9jdW1lbnRTcGxpdFBhdGhbZG9jdW1lbnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFkb2N1bWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvY3VtZW50RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldERpciwgLi4uZG9jdW1lbnRTcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2RvY3VtZW50RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb2N1bWVudEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhkb2N1bWVudEZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBkb2N1bWVudCA9IERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LnRvRG9jdW1lbnQoZG9jdW1lbnRKc29uKVxuICAgICAgICBpZiAoZG9jdW1lbnRCeVVpZFtkb2N1bWVudC51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkb2N1bWVudEJ5VWlkW2RvY3VtZW50LnVpZF0gPSBkb2N1bWVudFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZG9zc2llclNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXREaXIsIFtcImRvc3NpZXJzXCJdKSkge1xuICAgICAgICBjb25zdCBkb3NzaWVyRmlsZW5hbWUgPSBkb3NzaWVyU3BsaXRQYXRoW2Rvc3NpZXJTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFkb3NzaWVyRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9zc2llckZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXREaXIsIC4uLmRvc3NpZXJTcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2Rvc3NpZXJGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvc3NpZXJKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoZG9zc2llckZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBkb3NzaWVyID1cbiAgICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0Rvc3NpZXJQYXJsZW1lbnRhaXJlKGRvc3NpZXJKc29uKVxuICAgICAgICBjb25zdCB0aXRyZURvc3NpZXIgPSBkb3NzaWVyLnRpdHJlRG9zc2llclxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGl0cmVEb3NzaWVyLnNlbmF0Q2hlbWluICYmXG4gICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVNlbmF0Q2hlbWluW3RpdHJlRG9zc2llci5zZW5hdENoZW1pbl0gPT09XG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVNlbmF0Q2hlbWluW3RpdHJlRG9zc2llci5zZW5hdENoZW1pbl0gPSBkb3NzaWVyXG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRpdHJlRG9zc2llci50aXRyZUNoZW1pbiAmJlxuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pblt0aXRyZURvc3NpZXIudGl0cmVDaGVtaW5dID09PVxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pblt0aXRyZURvc3NpZXIudGl0cmVDaGVtaW5dID0gZG9zc2llclxuICAgICAgICB9XG4gICAgICAgIGlmIChkb3NzaWVyUGFybGVtZW50YWlyZUJ5VWlkW2Rvc3NpZXIudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZFtkb3NzaWVyLnVpZF0gPSBkb3NzaWVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgcGhvdG9CeVVpZDogeyBbdWlkOiBzdHJpbmddOiBQaG90byB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5QaG90b3MpIHtcbiAgICB7XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgYHBob3Rvc19kZXB1dGVzXyR7XG4gICAgICAgICAgLy8gVE9ETzogSGFuZGxlIExlZ2lzbGF0dXJlLkFsbC5cbiAgICAgICAgICBsZWdpc2xhdHVyZSA9PT0gTGVnaXNsYXR1cmUuQWxsID8gTGVnaXNsYXR1cmUuU2VpemUgOiBsZWdpc2xhdHVyZVxuICAgICAgICB9YCxcbiAgICAgICAgXCJkZXB1dGVzLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGpzb25GaWxlUGF0aCkpIHtcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QganNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwaG90b0J5VWlkLCBKU09OLnBhcnNlKGpzb24pKVxuICAgICAgfSBlbHNlIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYElnbm9yaW5nIG1pc3NpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgXCJwaG90b3Nfc2VuYXRldXJzXCIsXG4gICAgICAgIFwic2VuYXRldXJzLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGpzb25GaWxlUGF0aCkpIHtcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QganNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwaG90b0J5VWlkLCBKU09OLnBhcnNlKGpzb24pKVxuICAgICAgfSBlbHNlIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYElnbm9yaW5nIG1pc3NpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzY3J1dGluQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogU2NydXRpbiB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5TY3J1dGlucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5zY3J1dGlucykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGFzZXREaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llXCIpLFxuICAgICAgKVxuXG4gICAgICBmb3IgKGNvbnN0IHNjcnV0aW5TcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyKSkge1xuICAgICAgICBjb25zdCBzY3J1dGluRmlsZW5hbWUgPSBzY3J1dGluU3BsaXRQYXRoW3NjcnV0aW5TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFzY3J1dGluRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NydXRpbkZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXREaXIsIC4uLnNjcnV0aW5TcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke3NjcnV0aW5GaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjcnV0aW5Kc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoc2NydXRpbkZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBzY3J1dGluID0gU2NydXRpbnNDb252ZXJ0LnRvU2NydXRpbihzY3J1dGluSnNvbilcbiAgICAgICAgaWYgKHNjcnV0aW5CeVVpZFtzY3J1dGluLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNjcnV0aW5CeVVpZFtzY3J1dGluLnVpZF0gPSBzY3J1dGluXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFjdGV1ckJ5VWlkLFxuICAgIGFtZW5kZW1lbnRCeVVpZCxcbiAgICBkb2N1bWVudEJ5VWlkLFxuICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbixcbiAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW4sXG4gICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZCxcbiAgICBvcmdhbmVCeVVpZCxcbiAgICBwaG90b0J5VWlkLFxuICAgIHJldW5pb25CeVVpZCxcbiAgICByZXVuaW9uc0J5RGF5LFxuICAgIHJldW5pb25zQnlEb3NzaWVyVWlkLFxuICAgIHNjcnV0aW5CeVVpZCxcbiAgfVxufVxuXG4vKiogTG9hZCBkYXRhIGZyb20gYmlnIG1vbm9seXRpYyBmaWxlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQXNzZW1ibGVlRGF0YUZyb21CaWdGaWxlcyhcbiAgZGF0YURpcjogc3RyaW5nLFxuICBlbmFibGVkRGF0YXNldHM6IEVuYWJsZWREYXRhc2V0cyxcbiAgbGVnaXNsYXR1cmU6IExlZ2lzbGF0dXJlLFxuICB7IGxvZyA9IGZhbHNlIH0gPSB7fSxcbik6IERhdGEge1xuICBjb25zdCBhY3RldXJCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBBY3RldXIgfSA9IHt9XG4gIGNvbnN0IG9yZ2FuZUJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IE9yZ2FuZSB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWUuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICBjb25zdCBhY3RldXJzRXRPcmdhbmVzID0gQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9BY3RldXJzRXRPcmdhbmVzKGpzb24pXG4gICAgICBmb3IgKGNvbnN0IGFjdGV1ciBvZiBhY3RldXJzRXRPcmdhbmVzLmFjdGV1cnMpIHtcbiAgICAgICAgLy8gS2VlcCB0aGUgZmlyc3QgZXhpc3RpbmcgXCJhY3RldXJcIiwgYmVjYXVzZSB0aGUgZmlyc3Qgd3JhcHBlciBpcyB0aGUgbW9zdCBjb21wbGV0ZS5cbiAgICAgICAgaWYgKGFjdGV1ckJ5VWlkW2FjdGV1ci51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3RldXJCeVVpZFthY3RldXIudWlkXSA9IGFjdGV1clxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IG9yZ2FuZSBvZiBhY3RldXJzRXRPcmdhbmVzLm9yZ2FuZXMpIHtcbiAgICAgICAgLy8gS2VlcCB0aGUgZmlyc3QgZXhpc3RpbmcgXCJvcmdhbmVcIiwgYmVjYXVzZSB0aGUgZmlyc3Qgd3JhcHBlciBpcyB0aGUgbW9zdCBjb21wbGV0ZS5cbiAgICAgICAgaWYgKG9yZ2FuZUJ5VWlkW29yZ2FuZS51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvcmdhbmVCeVVpZFtvcmdhbmUudWlkXSA9IG9yZ2FuZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmV1bmlvbkJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFJldW5pb24gfSA9IHt9XG4gIGNvbnN0IHJldW5pb25zQnlEYXk6IHsgW2RheTogc3RyaW5nXTogUmV1bmlvbltdIH0gPSB7fVxuICBjb25zdCByZXVuaW9uc0J5RG9zc2llclVpZDogeyBbZG9zc2llclVpZDogc3RyaW5nXTogUmV1bmlvbltdIH0gPSB7fVxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFnZW5kYXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYWdlbmRhcykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZS5qc29uXCIpLFxuICAgICAgKVxuICAgICAgaWYgKGxvZykge1xuICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgfVxuICAgICAgY29uc3QganNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgIGNvbnN0IGFnZW5kYXMgPSBBZ2VuZGFzQ29udmVydC50b0FnZW5kYXMoanNvbilcbiAgICAgIGZvciAoY29uc3QgcmV1bmlvbiBvZiBhZ2VuZGFzLnJldW5pb25zKSB7XG4gICAgICAgIGlmIChyZXVuaW9uQnlVaWRbcmV1bmlvbi51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXVuaW9uQnlVaWRbcmV1bmlvbi51aWRdID0gcmV1bmlvblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF5ID0gcmV1bmlvbi50aW1lc3RhbXBEZWJ1dC50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXVxuICAgICAgICBsZXQgcmV1bmlvbnNBdERheSA9IHJldW5pb25zQnlEYXlbZGF5XVxuICAgICAgICBpZiAocmV1bmlvbnNBdERheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV1bmlvbnNBdERheSA9IHJldW5pb25zQnlEYXlbZGF5XSA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgcmV1bmlvbnNBdERheS5wdXNoKHJldW5pb24pXG5cbiAgICAgICAgY29uc3Qgb2RqID0gcmV1bmlvbi5vZGpcbiAgICAgICAgaWYgKG9kaiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwb2ludE9kaiBvZiBvZGoucG9pbnRzT2RqIHx8IFtdKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvc3NpZXJMZWdpc2xhdGlmUmVmIG9mIHBvaW50T2RqLmRvc3NpZXJzTGVnaXNsYXRpZnNSZWZzIHx8XG4gICAgICAgICAgICAgIFtdKSB7XG4gICAgICAgICAgICAgIGxldCByZXVuaW9uc0F0RG9zc2llclVpZCA9XG4gICAgICAgICAgICAgICAgcmV1bmlvbnNCeURvc3NpZXJVaWRbZG9zc2llckxlZ2lzbGF0aWZSZWZdXG4gICAgICAgICAgICAgIGlmIChyZXVuaW9uc0F0RG9zc2llclVpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV1bmlvbnNBdERvc3NpZXJVaWQgPSByZXVuaW9uc0J5RG9zc2llclVpZFtcbiAgICAgICAgICAgICAgICAgIGRvc3NpZXJMZWdpc2xhdGlmUmVmXG4gICAgICAgICAgICAgICAgXSA9IFtdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV1bmlvbnNBdERvc3NpZXJVaWQucHVzaChyZXVuaW9uKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFtZW5kZW1lbnRCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBBbWVuZGVtZW50IH0gPSB7fVxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFtZW5kZW1lbnRzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFtZW5kZW1lbnRzKSB7XG4gICAgICBpZiAoZGF0YXNldC5pZ25vcmVGb3JXZWIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBkYXRhc2V0LmxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IGRhdGFzZXQubGVnaXNsYXR1cmVcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llLmpzb25cIiksXG4gICAgICApXG4gICAgICBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoanNvbkZpbGVQYXRoLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KVxuICAgICAgY29uc3QgYW1lbmRlbWVudHMgPSBBbWVuZGVtZW50c0NvbnZlcnQudG9BbWVuZGVtZW50cyhqc29uKVxuICAgICAgZm9yIChjb25zdCB0ZXh0ZUxlZ2lzbGF0aWYgb2YgYW1lbmRlbWVudHMudGV4dGVzTGVnaXNsYXRpZnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50IG9mIHRleHRlTGVnaXNsYXRpZi5hbWVuZGVtZW50cykge1xuICAgICAgICAgIGlmIChhbWVuZGVtZW50QnlVaWRbYW1lbmRlbWVudC51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFtZW5kZW1lbnRCeVVpZFthbWVuZGVtZW50LnVpZF0gPSBhbWVuZGVtZW50XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZG9jdW1lbnRCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBEb2N1bWVudCB9ID0ge31cbiAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVCeVNlbmF0Q2hlbWluOiB7XG4gICAgW3VpZDogc3RyaW5nXTogRG9zc2llclBhcmxlbWVudGFpcmVcbiAgfSA9IHt9XG4gIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pbjoge1xuICAgIFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlXG4gIH0gPSB7fVxuICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlIH0gPSB7fVxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuZG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZS5qc29uXCIpLFxuICAgICAgKVxuICAgICAgaWYgKGxvZykge1xuICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgfVxuICAgICAgY29uc3QganNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgIGNvbnN0IGRvc3NpZXJzTGVnaXNsYXRpZnMgPVxuICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0Rvc3NpZXJzTGVnaXNsYXRpZnMoanNvbilcbiAgICAgIGZvciAoY29uc3QgZG9jdW1lbnQgb2YgZG9zc2llcnNMZWdpc2xhdGlmcy50ZXh0ZXNMZWdpc2xhdGlmcykge1xuICAgICAgICBpZiAoZG9jdW1lbnRCeVVpZFtkb2N1bWVudC51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkb2N1bWVudEJ5VWlkW2RvY3VtZW50LnVpZF0gPSBkb2N1bWVudFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRvc3NpZXIgb2YgZG9zc2llcnNMZWdpc2xhdGlmcy5kb3NzaWVyc1BhcmxlbWVudGFpcmVzKSB7XG4gICAgICAgIGNvbnN0IHRpdHJlRG9zc2llciA9IGRvc3NpZXIudGl0cmVEb3NzaWVyXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aXRyZURvc3NpZXIuc2VuYXRDaGVtaW4gJiZcbiAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5U2VuYXRDaGVtaW5bdGl0cmVEb3NzaWVyLnNlbmF0Q2hlbWluXSA9PT1cbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5U2VuYXRDaGVtaW5bdGl0cmVEb3NzaWVyLnNlbmF0Q2hlbWluXSA9IGRvc3NpZXJcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGl0cmVEb3NzaWVyLnRpdHJlQ2hlbWluICYmXG4gICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVRpdHJlQ2hlbWluW3RpdHJlRG9zc2llci50aXRyZUNoZW1pbl0gPT09XG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVRpdHJlQ2hlbWluW3RpdHJlRG9zc2llci50aXRyZUNoZW1pbl0gPSBkb3NzaWVyXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWRbZG9zc2llci51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VWlkW2Rvc3NpZXIudWlkXSA9IGRvc3NpZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBob3RvQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogUGhvdG8gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuUGhvdG9zKSB7XG4gICAgY29uc3QgcGhvdG9CeVVpZCA9IHt9XG5cbiAgICB7XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgYHBob3Rvc19kZXB1dGVzXyR7XG4gICAgICAgICAgLy8gVE9ETzogSGFuZGxlIExlZ2lzbGF0dXJlLkFsbC5cbiAgICAgICAgICBsZWdpc2xhdHVyZSA9PT0gTGVnaXNsYXR1cmUuQWxsID8gTGVnaXNsYXR1cmUuU2VpemUgOiBsZWdpc2xhdHVyZVxuICAgICAgICB9YCxcbiAgICAgICAgXCJkZXB1dGVzLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGpzb25GaWxlUGF0aCkpIHtcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QganNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwaG90b0J5VWlkLCBKU09OLnBhcnNlKGpzb24pKVxuICAgICAgfSBlbHNlIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYElnbm9yaW5nIG1pc3NpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgXCJwaG90b3Nfc2VuYXRldXJzXCIsXG4gICAgICAgIFwic2VuYXRldXJzLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGpzb25GaWxlUGF0aCkpIHtcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QganNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwaG90b0J5VWlkLCBKU09OLnBhcnNlKGpzb24pKVxuICAgICAgfSBlbHNlIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYElnbm9yaW5nIG1pc3NpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzY3J1dGluQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogU2NydXRpbiB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5TY3J1dGlucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5zY3J1dGlucykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZS5qc29uXCIpLFxuICAgICAgKVxuICAgICAgaWYgKGxvZykge1xuICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgfVxuICAgICAgY29uc3QganNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgIGNvbnN0IHNjcnV0aW5zID0gU2NydXRpbnNDb252ZXJ0LnRvU2NydXRpbnMoanNvbilcbiAgICAgIGZvciAoY29uc3Qgc2NydXRpbiBvZiBzY3J1dGlucy5zY3J1dGlucykge1xuICAgICAgICBpZiAoc2NydXRpbkJ5VWlkW3NjcnV0aW4udWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2NydXRpbkJ5VWlkW3NjcnV0aW4udWlkXSA9IHNjcnV0aW5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYWN0ZXVyQnlVaWQsXG4gICAgYW1lbmRlbWVudEJ5VWlkLFxuICAgIGRvY3VtZW50QnlVaWQsXG4gICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVNlbmF0Q2hlbWluLFxuICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pbixcbiAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VWlkLFxuICAgIG9yZ2FuZUJ5VWlkLFxuICAgIHBob3RvQnlVaWQsXG4gICAgcmV1bmlvbkJ5VWlkLFxuICAgIHJldW5pb25zQnlEYXksXG4gICAgcmV1bmlvbnNCeURvc3NpZXJVaWQsXG4gICAgc2NydXRpbkJ5VWlkLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoRnJvbURvY3VtZW50VWlkKGRvY3VtZW50c0Rpcjogc3RyaW5nLCB1aWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1hdGNoID0gZG9jdW1lbnRVaWRSZWdleC5leGVjKHVpZClcbiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgIG1hdGNoLFxuICAgIG51bGwsXG4gICAgYFVuZXhwZWN0ZWQgc3RydWN0dXJlIGZvciBkb2N1bWVudCBVSUQ6ICR7dWlkfWAsXG4gIClcbiAgY29uc3QgZG9jdW1lbnRUeXBlID0gcGF0aC5qb2luKGRvY3VtZW50c0RpciwgbWF0Y2ghWzFdKVxuICBjb25zdCBjaGFtYnJlRGlyID0gcGF0aC5qb2luKGRvY3VtZW50VHlwZSwgbWF0Y2ghWzJdKVxuICBjb25zdCByZXB1YmxpcXVlRGlyID0gcGF0aC5qb2luKGNoYW1icmVEaXIsIG1hdGNoIVszXSlcbiAgY29uc3QgbGVnaXNsYXR1cmVEaXIgPSBwYXRoLmpvaW4ocmVwdWJsaXF1ZURpciwgbWF0Y2ghWzRdKVxuICBjb25zdCBldGF0RGlyID0gcGF0aC5qb2luKGxlZ2lzbGF0dXJlRGlyLCBtYXRjaCFbNV0pXG4gIGxldCBudW1lcm8gPSBcIjAwMDAwMFwiICsgbWF0Y2ghWzZdXG4gIG51bWVybyA9IG51bWVyby5zdWJzdHIobnVtZXJvLmxlbmd0aCAtIDYpXG4gIGNvbnN0IG51bWVyb01pbGxpZXJzRGlyID0gcGF0aC5qb2luKGV0YXREaXIsIG51bWVyby5zdWJzdHIoMCwgMykpXG4gIGZzLmVuc3VyZURpclN5bmMobnVtZXJvTWlsbGllcnNEaXIpXG4gIHJldHVybiBwYXRoLmpvaW4obnVtZXJvTWlsbGllcnNEaXIsIHVpZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQoXG4gIGRvc3NpZXJzRGlyOiBzdHJpbmcsXG4gIHVpZDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgbWF0Y2ggPSBkb3NzaWVyVWlkUmVnZXguZXhlYyh1aWQpXG4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICBtYXRjaCxcbiAgICBudWxsLFxuICAgIGBVbmV4cGVjdGVkIHN0cnVjdHVyZSBmb3IgZG9zc2llciBwYXJsZW1lbnRhaXJlIFVJRDogJHt1aWR9YCxcbiAgKVxuICBjb25zdCByZXB1YmxpcXVlRGlyID0gcGF0aC5qb2luKGRvc3NpZXJzRGlyLCBtYXRjaCFbMV0pXG4gIGNvbnN0IGxlZ2lzbGF0dXJlRGlyID0gcGF0aC5qb2luKHJlcHVibGlxdWVEaXIsIG1hdGNoIVsyXSlcbiAgbGV0IG51bWVybyA9IFwiMDAwMDAwXCIgKyBtYXRjaCFbM11cbiAgbnVtZXJvID0gbnVtZXJvLnN1YnN0cihudW1lcm8ubGVuZ3RoIC0gNilcbiAgY29uc3QgbnVtZXJvTWlsbGllcnNEaXIgPSBwYXRoLmpvaW4obGVnaXNsYXR1cmVEaXIsIG51bWVyby5zdWJzdHIoMCwgMykpXG4gIGZzLmVuc3VyZURpclN5bmMobnVtZXJvTWlsbGllcnNEaXIpXG4gIHJldHVybiBwYXRoLmpvaW4obnVtZXJvTWlsbGllcnNEaXIsIHVpZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhGcm9tUmV1bmlvblVpZChyZXVuaW9uc0Rpcjogc3RyaW5nLCB1aWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1hdGNoID0gcmV1bmlvblVpZFJlZ2V4LmV4ZWModWlkKVxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgbWF0Y2gsXG4gICAgbnVsbCxcbiAgICBgVW5leHBlY3RlZCBzdHJ1Y3R1cmUgZm9yIHJldW5pb24gVUlEOiAke3VpZH1gLFxuICApXG4gIGNvbnN0IGNoYW1icmVEaXIgPSBwYXRoLmpvaW4ocmV1bmlvbnNEaXIsIG1hdGNoIVsxXSlcbiAgY29uc3QgcmVwdWJsaXF1ZURpciA9IHBhdGguam9pbihjaGFtYnJlRGlyLCBtYXRjaCFbMl0pXG4gIGNvbnN0IGxlZ2lzbGF0dXJlRGlyID0gcGF0aC5qb2luKHJlcHVibGlxdWVEaXIsIG1hdGNoIVszXSlcbiAgY29uc3Qgc2Vzc2lvbkRpciA9IHBhdGguam9pbihsZWdpc2xhdHVyZURpciwgbWF0Y2ghWzRdKVxuICBjb25zdCBpZERpciA9IHBhdGguam9pbihzZXNzaW9uRGlyLCBtYXRjaCFbNV0pXG4gIGxldCBudW1lcm8gPSBcIjAwMDAwMDAwMFwiICsgbWF0Y2ghWzZdXG4gIG51bWVybyA9IG51bWVyby5zdWJzdHIobnVtZXJvLmxlbmd0aCAtIDkpXG4gIGNvbnN0IG51bWVyb01pbGxpb25zRGlyID0gcGF0aC5qb2luKGlkRGlyLCBudW1lcm8uc3Vic3RyKDAsIDMpKVxuICBjb25zdCBudW1lcm9NaWxsaWVyc0RpciA9IHBhdGguam9pbihudW1lcm9NaWxsaW9uc0RpciwgbnVtZXJvLnN1YnN0cigzLCAzKSlcbiAgZnMuZW5zdXJlRGlyU3luYyhudW1lcm9NaWxsaWVyc0RpcilcbiAgcmV0dXJuIHBhdGguam9pbihudW1lcm9NaWxsaWVyc0RpciwgdWlkKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aEZyb21TY3J1dGluVWlkKHNjcnV0aW5zRGlyOiBzdHJpbmcsIHVpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbWF0Y2ggPSBzY3J1dGluVWlkUmVnZXguZXhlYyh1aWQpXG4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICBtYXRjaCxcbiAgICBudWxsLFxuICAgIGBVbmV4cGVjdGVkIHN0cnVjdHVyZSBmb3Igc2NydXRpbiBVSUQ6ICR7dWlkfWAsXG4gIClcbiAgY29uc3QgcmVwdWJsaXF1ZURpciA9IHBhdGguam9pbihzY3J1dGluc0RpciwgbWF0Y2ghWzFdKVxuICBjb25zdCBsZWdpc2xhdHVyZURpciA9IHBhdGguam9pbihyZXB1YmxpcXVlRGlyLCBtYXRjaCFbMl0pXG4gIGxldCBudW1lcm8gPSBcIjAwMDAwMFwiICsgbWF0Y2ghWzNdXG4gIG51bWVybyA9IG51bWVyby5zdWJzdHIobnVtZXJvLmxlbmd0aCAtIDYpXG4gIGNvbnN0IG51bWVyb01pbGxpZXJzRGlyID0gcGF0aC5qb2luKGxlZ2lzbGF0dXJlRGlyLCBudW1lcm8uc3Vic3RyKDAsIDMpKVxuICBmcy5lbnN1cmVEaXJTeW5jKG51bWVyb01pbGxpZXJzRGlyKVxuICByZXR1cm4gcGF0aC5qb2luKG51bWVyb01pbGxpZXJzRGlyLCB1aWQpXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFNQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLElBQU1BLGdCQUFnQixHQUNwQiwySEFERjtBQUVBLElBQU1DLGVBQWUsR0FBRyx3QkFBeEI7QUFDQSxJQUFNQyxlQUFlLEdBQ25CLDJEQURGO0FBRUEsSUFBTUMsZUFBZSxHQUFHLDBCQUF4QjtBQUVBOztBQUNPLFNBQVNDLGlCQUFULENBQ0xDLE9BREssRUFFTEMsZUFGSyxFQUdMQyxXQUhLLEVBS0M7RUFBQSwrRUFEWSxFQUNaO0VBQUEsb0JBREpDLEdBQ0k7RUFBQSxJQURKQSxHQUNJLHlCQURFLEtBQ0Y7O0VBQ04sSUFBTUMsV0FBc0MsR0FBRyxFQUEvQztFQUNBLElBQU1DLFdBQXNDLEdBQUcsRUFBL0M7O0VBQ0EsSUFBSUosZUFBZSxHQUFHSyx5QkFBQSxDQUFnQkMsZ0JBQXRDLEVBQXdEO0lBQUEsMkNBQ2hDQyxrQkFBQSxDQUFTQyxnQkFEdUI7SUFBQTs7SUFBQTtNQUN0RCxvREFBaUQ7UUFBQSxJQUF0Q0MsT0FBc0M7O1FBQy9DLElBQUlBLE9BQU8sQ0FBQ0MsWUFBWixFQUEwQjtVQUN4QjtRQUNEOztRQUNELElBQ0VULFdBQVcsS0FBS1UseUJBQUEsQ0FBWUMsR0FBNUIsSUFDQUgsT0FBTyxDQUFDUixXQUFSLEtBQXdCVSx5QkFBQSxDQUFZQyxHQURwQyxJQUVBWCxXQUFXLEtBQUtRLE9BQU8sQ0FBQ1IsV0FIMUIsRUFJRTtVQUNBO1FBQ0Q7O1FBQ0QsSUFBTVksVUFBVSxHQUFHQyxnQkFBQSxDQUFLQyxJQUFMLENBQ2pCaEIsT0FEaUIsRUFFakJVLE9BQU8sQ0FBQ08sUUFBUixDQUFpQkMsT0FBakIsQ0FBeUIsU0FBekIsRUFBb0MsVUFBcEMsQ0FGaUIsQ0FBbkI7O1FBWCtDLDRDQWdCakIsSUFBQUMscUJBQUEsRUFBUUwsVUFBUixFQUFvQixDQUFDLFNBQUQsQ0FBcEIsQ0FoQmlCO1FBQUE7O1FBQUE7VUFnQi9DLHVEQUFnRTtZQUFBLElBQXJETSxlQUFxRDtZQUM5RCxJQUFNQyxjQUFjLEdBQUdELGVBQWUsQ0FBQ0EsZUFBZSxDQUFDRSxNQUFoQixHQUF5QixDQUExQixDQUF0Qzs7WUFDQSxJQUFJLENBQUNELGNBQWMsQ0FBQ0UsUUFBZixDQUF3QixPQUF4QixDQUFMLEVBQXVDO2NBQ3JDO1lBQ0Q7O1lBQ0QsSUFBTUMsY0FBYyxHQUFHVCxnQkFBQSxDQUFLQyxJQUFMLE9BQUFELGdCQUFBLEdBQVVELFVBQVYsNEJBQXlCTSxlQUF6QixHQUF2Qjs7WUFDQSxJQUFJakIsR0FBSixFQUFTO2NBQ1BzQixPQUFPLENBQUN0QixHQUFSLHlCQUE2QnFCLGNBQTdCO1lBQ0Q7O1lBQ0QsSUFBTUUsVUFBa0IsR0FBR0MsbUJBQUEsQ0FBR0MsWUFBSCxDQUFnQkosY0FBaEIsRUFBZ0M7Y0FDekRLLFFBQVEsRUFBRTtZQUQrQyxDQUFoQyxDQUEzQjs7WUFHQSxJQUFNQyxNQUFNLEdBQUdDLDJCQUFBLENBQXdCQyxRQUF4QixDQUFpQ04sVUFBakMsQ0FBZixDQVo4RCxDQWE5RDs7O1lBQ0EsSUFBSXRCLFdBQVcsQ0FBQzBCLE1BQU0sQ0FBQ0csR0FBUixDQUFYLEtBQTRCQyxTQUFoQyxFQUEyQztjQUN6QzlCLFdBQVcsQ0FBQzBCLE1BQU0sQ0FBQ0csR0FBUixDQUFYLEdBQTBCSCxNQUExQjtZQUNEO1VBQ0Y7UUFqQzhDO1VBQUE7UUFBQTtVQUFBO1FBQUE7O1FBQUEsNENBbUNqQixJQUFBWCxxQkFBQSxFQUFRTCxVQUFSLEVBQW9CLENBQUMsU0FBRCxDQUFwQixDQW5DaUI7UUFBQTs7UUFBQTtVQW1DL0MsdURBQWdFO1lBQUEsSUFBckRxQixlQUFxRDtZQUM5RCxJQUFNQyxjQUFjLEdBQUdELGVBQWUsQ0FBQ0EsZUFBZSxDQUFDYixNQUFoQixHQUF5QixDQUExQixDQUF0Qzs7WUFDQSxJQUFJLENBQUNjLGNBQWMsQ0FBQ2IsUUFBZixDQUF3QixPQUF4QixDQUFMLEVBQXVDO2NBQ3JDO1lBQ0Q7O1lBQ0QsSUFBTWMsY0FBYyxHQUFHdEIsZ0JBQUEsQ0FBS0MsSUFBTCxPQUFBRCxnQkFBQSxHQUFVRCxVQUFWLDRCQUF5QnFCLGVBQXpCLEdBQXZCOztZQUNBLElBQUloQyxHQUFKLEVBQVM7Y0FDUHNCLE9BQU8sQ0FBQ3RCLEdBQVIseUJBQTZCa0MsY0FBN0I7WUFDRDs7WUFDRCxJQUFNQyxVQUFrQixHQUFHWCxtQkFBQSxDQUFHQyxZQUFILENBQWdCUyxjQUFoQixFQUFnQztjQUN6RFIsUUFBUSxFQUFFO1lBRCtDLENBQWhDLENBQTNCOztZQUdBLElBQU1VLE1BQU0sR0FBR1IsMkJBQUEsQ0FBd0JTLFFBQXhCLENBQWlDRixVQUFqQyxDQUFmLENBWjhELENBYTlEOzs7WUFDQSxJQUFJakMsV0FBVyxDQUFDa0MsTUFBTSxDQUFDTixHQUFSLENBQVgsS0FBNEJDLFNBQWhDLEVBQTJDO2NBQ3pDN0IsV0FBVyxDQUFDa0MsTUFBTSxDQUFDTixHQUFSLENBQVgsR0FBMEJNLE1BQTFCO1lBQ0Q7VUFDRjtRQXBEOEM7VUFBQTtRQUFBO1VBQUE7UUFBQTtNQXFEaEQ7SUF0RHFEO01BQUE7SUFBQTtNQUFBO0lBQUE7RUF1RHZEOztFQUVELElBQU1FLFlBQXdDLEdBQUcsRUFBakQ7RUFDQSxJQUFNQyxhQUEyQyxHQUFHLEVBQXBEO0VBQ0EsSUFBTUMsb0JBQXlELEdBQUcsRUFBbEU7O0VBQ0EsSUFBSTFDLGVBQWUsR0FBR0sseUJBQUEsQ0FBZ0JzQyxPQUF0QyxFQUErQztJQUFBLDRDQUN2QnBDLGtCQUFBLENBQVNxQyxPQURjO0lBQUE7O0lBQUE7TUFDN0MsdURBQXdDO1FBQUEsSUFBN0JuQyxRQUE2Qjs7UUFDdEMsSUFBSUEsUUFBTyxDQUFDQyxZQUFaLEVBQTBCO1VBQ3hCO1FBQ0Q7O1FBQ0QsSUFDRVQsV0FBVyxLQUFLVSx5QkFBQSxDQUFZQyxHQUE1QixJQUNBSCxRQUFPLENBQUNSLFdBQVIsS0FBd0JVLHlCQUFBLENBQVlDLEdBRHBDLElBRUFYLFdBQVcsS0FBS1EsUUFBTyxDQUFDUixXQUgxQixFQUlFO1VBQ0E7UUFDRDs7UUFDRCxJQUFNWSxXQUFVLEdBQUdDLGdCQUFBLENBQUtDLElBQUwsQ0FDakJoQixPQURpQixFQUVqQlUsUUFBTyxDQUFDTyxRQUFSLENBQWlCQyxPQUFqQixDQUF5QixTQUF6QixFQUFvQyxVQUFwQyxDQUZpQixDQUFuQjs7UUFYc0MsNENBZVAsSUFBQUMscUJBQUEsRUFBUUwsV0FBUixDQWZPO1FBQUE7O1FBQUE7VUFldEMsdURBQW9EO1lBQUEsSUFBekNnQyxnQkFBeUM7WUFDbEQsSUFBTUMsZUFBZSxHQUFHRCxnQkFBZ0IsQ0FBQ0EsZ0JBQWdCLENBQUN4QixNQUFqQixHQUEwQixDQUEzQixDQUF4Qzs7WUFDQSxJQUFJLENBQUN5QixlQUFlLENBQUN4QixRQUFoQixDQUF5QixPQUF6QixDQUFMLEVBQXdDO2NBQ3RDO1lBQ0Q7O1lBQ0QsSUFBTXlCLGVBQWUsR0FBR2pDLGdCQUFBLENBQUtDLElBQUwsT0FBQUQsZ0JBQUEsR0FBVUQsV0FBViw0QkFBeUJnQyxnQkFBekIsR0FBeEI7O1lBQ0EsSUFBSTNDLEdBQUosRUFBUztjQUNQc0IsT0FBTyxDQUFDdEIsR0FBUix5QkFBNkI2QyxlQUE3QjtZQUNEOztZQUNELElBQU1DLFdBQW1CLEdBQUd0QixtQkFBQSxDQUFHQyxZQUFILENBQWdCb0IsZUFBaEIsRUFBaUM7Y0FDM0RuQixRQUFRLEVBQUU7WUFEaUQsQ0FBakMsQ0FBNUI7O1lBR0EsSUFBTXFCLE9BQU8sR0FBR0MsZ0JBQUEsQ0FBZUMsU0FBZixDQUF5QkgsV0FBekIsQ0FBaEI7O1lBQ0EsSUFBSVIsWUFBWSxDQUFDUyxPQUFPLENBQUNqQixHQUFULENBQVosS0FBOEJDLFNBQWxDLEVBQTZDO2NBQzNDTyxZQUFZLENBQUNTLE9BQU8sQ0FBQ2pCLEdBQVQsQ0FBWixHQUE0QmlCLE9BQTVCO1lBQ0Q7O1lBRUQsSUFBTUcsSUFBRyxHQUFHSCxPQUFPLENBQUNJLGNBQVIsQ0FBdUJDLFdBQXZCLEdBQXFDQyxLQUFyQyxDQUEyQyxHQUEzQyxFQUFnRCxDQUFoRCxDQUFaO1lBQ0EsSUFBSUMsYUFBYSxHQUFHZixhQUFhLENBQUNXLElBQUQsQ0FBakM7O1lBQ0EsSUFBSUksYUFBYSxLQUFLdkIsU0FBdEIsRUFBaUM7Y0FDL0J1QixhQUFhLEdBQUdmLGFBQWEsQ0FBQ1csSUFBRCxDQUFiLEdBQXFCLEVBQXJDO1lBQ0Q7O1lBQ0RJLGFBQWEsQ0FBQ0MsSUFBZCxDQUFtQlIsT0FBbkI7WUFFQSxJQUFNUyxHQUFHLEdBQUdULE9BQU8sQ0FBQ1MsR0FBcEI7O1lBQ0EsSUFBSUEsR0FBRyxLQUFLekIsU0FBWixFQUF1QjtjQUFBLDRDQUNFeUIsR0FBRyxDQUFDQyxTQUFKLElBQWlCLEVBRG5CO2NBQUE7O2NBQUE7Z0JBQ3JCLHVEQUE0QztrQkFBQSxJQUFqQ0MsUUFBaUM7O2tCQUFBLDRDQUNQQSxRQUFRLENBQUNDLHVCQUFULElBQ2pDLEVBRndDO2tCQUFBOztrQkFBQTtvQkFDMUMsdURBQ007c0JBQUEsSUFES0Msb0JBQ0w7c0JBQ0osSUFBSUMsb0JBQW9CLEdBQ3RCckIsb0JBQW9CLENBQUNvQixvQkFBRCxDQUR0Qjs7c0JBRUEsSUFBSUMsb0JBQW9CLEtBQUs5QixTQUE3QixFQUF3Qzt3QkFDdEM4QixvQkFBb0IsR0FBR3JCLG9CQUFvQixDQUN6Q29CLG9CQUR5QyxDQUFwQixHQUVuQixFQUZKO3NCQUdEOztzQkFDREMsb0JBQW9CLENBQUNOLElBQXJCLENBQTBCUixPQUExQjtvQkFDRDtrQkFYeUM7b0JBQUE7a0JBQUE7b0JBQUE7a0JBQUE7Z0JBWTNDO2NBYm9CO2dCQUFBO2NBQUE7Z0JBQUE7Y0FBQTtZQWN0QjtVQUNGO1FBdkRxQztVQUFBO1FBQUE7VUFBQTtRQUFBO01Bd0R2QztJQXpENEM7TUFBQTtJQUFBO01BQUE7SUFBQTtFQTBEOUM7O0VBRUQsSUFBTWUsZUFBOEMsR0FBRyxFQUF2RDs7RUFDQSxJQUFJaEUsZUFBZSxHQUFHSyx5QkFBQSxDQUFnQjRELFdBQXRDLEVBQW1EO0lBQUEsNENBQzNCMUQsa0JBQUEsQ0FBUzJELFdBRGtCO0lBQUE7O0lBQUE7TUFDakQsdURBQTRDO1FBQUEsSUFBakN6RCxTQUFpQzs7UUFDMUMsSUFBSUEsU0FBTyxDQUFDQyxZQUFaLEVBQTBCO1VBQ3hCO1FBQ0Q7O1FBQ0QsSUFDRVQsV0FBVyxLQUFLVSx5QkFBQSxDQUFZQyxHQUE1QixJQUNBSCxTQUFPLENBQUNSLFdBQVIsS0FBd0JVLHlCQUFBLENBQVlDLEdBRHBDLElBRUFYLFdBQVcsS0FBS1EsU0FBTyxDQUFDUixXQUgxQixFQUlFO1VBQ0E7UUFDRDs7UUFDRCxJQUFNWSxZQUFVLEdBQUdDLGdCQUFBLENBQUtDLElBQUwsQ0FDakJoQixPQURpQixFQUVqQlUsU0FBTyxDQUFDTyxRQUFSLENBQWlCQyxPQUFqQixDQUF5QixTQUF6QixFQUFvQyxVQUFwQyxDQUZpQixDQUFuQjs7UUFYMEMsNENBZ0JSLElBQUFDLHFCQUFBLEVBQVFMLFlBQVIsQ0FoQlE7UUFBQTs7UUFBQTtVQWdCMUMsdURBQXVEO1lBQUEsSUFBNUNzRCxtQkFBNEM7WUFDckQsSUFBTUMsa0JBQWtCLEdBQ3RCRCxtQkFBbUIsQ0FBQ0EsbUJBQW1CLENBQUM5QyxNQUFwQixHQUE2QixDQUE5QixDQURyQjs7WUFFQSxJQUFJLENBQUMrQyxrQkFBa0IsQ0FBQzlDLFFBQW5CLENBQTRCLE9BQTVCLENBQUwsRUFBMkM7Y0FDekM7WUFDRDs7WUFDRCxJQUFNK0Msa0JBQWtCLEdBQUd2RCxnQkFBQSxDQUFLQyxJQUFMLE9BQUFELGdCQUFBLEdBQVVELFlBQVYsNEJBQXlCc0QsbUJBQXpCLEdBQTNCOztZQUNBLElBQUlqRSxHQUFKLEVBQVM7Y0FDUHNCLE9BQU8sQ0FBQ3RCLEdBQVIseUJBQTZCbUUsa0JBQTdCO1lBQ0Q7O1lBQ0QsSUFBTUMsY0FBc0IsR0FBRzVDLG1CQUFBLENBQUdDLFlBQUgsQ0FBZ0IwQyxrQkFBaEIsRUFBb0M7Y0FDakV6QyxRQUFRLEVBQUU7WUFEdUQsQ0FBcEMsQ0FBL0I7O1lBR0EsSUFBTTJDLFVBQVUsR0FBR0Msb0JBQUEsQ0FBbUJDLFlBQW5CLENBQWdDSCxjQUFoQyxDQUFuQjs7WUFDQSxJQUFJTixlQUFlLENBQUNPLFVBQVUsQ0FBQ3ZDLEdBQVosQ0FBZixLQUFvQ0MsU0FBeEMsRUFBbUQ7Y0FDakQrQixlQUFlLENBQUNPLFVBQVUsQ0FBQ3ZDLEdBQVosQ0FBZixHQUFrQ3VDLFVBQWxDO1lBQ0Q7VUFDRjtRQWpDeUM7VUFBQTtRQUFBO1VBQUE7UUFBQTtNQWtDM0M7SUFuQ2dEO01BQUE7SUFBQTtNQUFBO0lBQUE7RUFvQ2xEOztFQUVELElBQU1HLGFBQTBDLEdBQUcsRUFBbkQ7RUFDQSxJQUFNQyxpQ0FFTCxHQUFHLEVBRko7RUFHQSxJQUFNQyxpQ0FFTCxHQUFHLEVBRko7RUFHQSxJQUFNQyx5QkFBa0UsR0FBRyxFQUEzRTs7RUFDQSxJQUFJN0UsZUFBZSxHQUFHSyx5QkFBQSxDQUFnQnlFLG1CQUF0QyxFQUEyRDtJQUFBLDZDQUNuQ3ZFLGtCQUFBLENBQVN3RSxtQkFEMEI7SUFBQTs7SUFBQTtNQUN6RCwwREFBb0Q7UUFBQSxJQUF6Q3RFLFNBQXlDOztRQUNsRCxJQUFJQSxTQUFPLENBQUNDLFlBQVosRUFBMEI7VUFDeEI7UUFDRDs7UUFDRCxJQUNFVCxXQUFXLEtBQUtVLHlCQUFBLENBQVlDLEdBQTVCLElBQ0FILFNBQU8sQ0FBQ1IsV0FBUixLQUF3QlUseUJBQUEsQ0FBWUMsR0FEcEMsSUFFQVgsV0FBVyxLQUFLUSxTQUFPLENBQUNSLFdBSDFCLEVBSUU7VUFDQTtRQUNEOztRQUNELElBQU1ZLFlBQVUsR0FBR0MsZ0JBQUEsQ0FBS0MsSUFBTCxDQUNqQmhCLE9BRGlCLEVBRWpCVSxTQUFPLENBQUNPLFFBQVIsQ0FBaUJDLE9BQWpCLENBQXlCLFNBQXpCLEVBQW9DLFVBQXBDLENBRmlCLENBQW5COztRQVhrRCw2Q0FnQmxCLElBQUFDLHFCQUFBLEVBQVFMLFlBQVIsRUFBb0IsQ0FBQyxXQUFELENBQXBCLENBaEJrQjtRQUFBOztRQUFBO1VBZ0JsRCwwREFBb0U7WUFBQSxJQUF6RG1FLGlCQUF5RDtZQUNsRSxJQUFNQyxnQkFBZ0IsR0FBR0QsaUJBQWlCLENBQUNBLGlCQUFpQixDQUFDM0QsTUFBbEIsR0FBMkIsQ0FBNUIsQ0FBMUM7O1lBQ0EsSUFBSSxDQUFDNEQsZ0JBQWdCLENBQUMzRCxRQUFqQixDQUEwQixPQUExQixDQUFMLEVBQXlDO2NBQ3ZDO1lBQ0Q7O1lBQ0QsSUFBTTRELGdCQUFnQixHQUFHcEUsZ0JBQUEsQ0FBS0MsSUFBTCxPQUFBRCxnQkFBQSxHQUFVRCxZQUFWLDRCQUF5Qm1FLGlCQUF6QixHQUF6Qjs7WUFDQSxJQUFJOUUsR0FBSixFQUFTO2NBQ1BzQixPQUFPLENBQUN0QixHQUFSLHlCQUE2QmdGLGdCQUE3QjtZQUNEOztZQUNELElBQU1DLFlBQW9CLEdBQUd6RCxtQkFBQSxDQUFHQyxZQUFILENBQWdCdUQsZ0JBQWhCLEVBQWtDO2NBQzdEdEQsUUFBUSxFQUFFO1lBRG1ELENBQWxDLENBQTdCOztZQUdBLElBQU13RCxRQUFRLEdBQUdDLDZCQUFBLENBQTJCQyxVQUEzQixDQUFzQ0gsWUFBdEMsQ0FBakI7O1lBQ0EsSUFBSVQsYUFBYSxDQUFDVSxRQUFRLENBQUNwRCxHQUFWLENBQWIsS0FBZ0NDLFNBQXBDLEVBQStDO2NBQzdDeUMsYUFBYSxDQUFDVSxRQUFRLENBQUNwRCxHQUFWLENBQWIsR0FBOEJvRCxRQUE5QjtZQUNEO1VBQ0Y7UUFoQ2lEO1VBQUE7UUFBQTtVQUFBO1FBQUE7O1FBQUEsNkNBa0NuQixJQUFBbEUscUJBQUEsRUFBUUwsWUFBUixFQUFvQixDQUFDLFVBQUQsQ0FBcEIsQ0FsQ21CO1FBQUE7O1FBQUE7VUFrQ2xELDBEQUFrRTtZQUFBLElBQXZEMEUsZ0JBQXVEO1lBQ2hFLElBQU1DLGVBQWUsR0FBR0QsZ0JBQWdCLENBQUNBLGdCQUFnQixDQUFDbEUsTUFBakIsR0FBMEIsQ0FBM0IsQ0FBeEM7O1lBQ0EsSUFBSSxDQUFDbUUsZUFBZSxDQUFDbEUsUUFBaEIsQ0FBeUIsT0FBekIsQ0FBTCxFQUF3QztjQUN0QztZQUNEOztZQUNELElBQU1tRSxlQUFlLEdBQUczRSxnQkFBQSxDQUFLQyxJQUFMLE9BQUFELGdCQUFBLEdBQVVELFlBQVYsNEJBQXlCMEUsZ0JBQXpCLEdBQXhCOztZQUNBLElBQUlyRixHQUFKLEVBQVM7Y0FDUHNCLE9BQU8sQ0FBQ3RCLEdBQVIseUJBQTZCdUYsZUFBN0I7WUFDRDs7WUFDRCxJQUFNQyxXQUFtQixHQUFHaEUsbUJBQUEsQ0FBR0MsWUFBSCxDQUFnQjhELGVBQWhCLEVBQWlDO2NBQzNEN0QsUUFBUSxFQUFFO1lBRGlELENBQWpDLENBQTVCOztZQUdBLElBQU0rRCxPQUFPLEdBQ1hOLDZCQUFBLENBQTJCTyxzQkFBM0IsQ0FBa0RGLFdBQWxELENBREY7O1lBRUEsSUFBTUcsWUFBWSxHQUFHRixPQUFPLENBQUNFLFlBQTdCOztZQUNBLElBQ0VBLFlBQVksQ0FBQ0MsV0FBYixJQUNBbkIsaUNBQWlDLENBQUNrQixZQUFZLENBQUNDLFdBQWQsQ0FBakMsS0FDRTdELFNBSEosRUFJRTtjQUNBMEMsaUNBQWlDLENBQUNrQixZQUFZLENBQUNDLFdBQWQsQ0FBakMsR0FBOERILE9BQTlEO1lBQ0Q7O1lBQ0QsSUFDRUUsWUFBWSxDQUFDRSxXQUFiLElBQ0FuQixpQ0FBaUMsQ0FBQ2lCLFlBQVksQ0FBQ0UsV0FBZCxDQUFqQyxLQUNFOUQsU0FISixFQUlFO2NBQ0EyQyxpQ0FBaUMsQ0FBQ2lCLFlBQVksQ0FBQ0UsV0FBZCxDQUFqQyxHQUE4REosT0FBOUQ7WUFDRDs7WUFDRCxJQUFJZCx5QkFBeUIsQ0FBQ2MsT0FBTyxDQUFDM0QsR0FBVCxDQUF6QixLQUEyQ0MsU0FBL0MsRUFBMEQ7Y0FDeEQ0Qyx5QkFBeUIsQ0FBQ2MsT0FBTyxDQUFDM0QsR0FBVCxDQUF6QixHQUF5QzJELE9BQXpDO1lBQ0Q7VUFDRjtRQWxFaUQ7VUFBQTtRQUFBO1VBQUE7UUFBQTtNQW1FbkQ7SUFwRXdEO01BQUE7SUFBQTtNQUFBO0lBQUE7RUFxRTFEOztFQUVELElBQUlLLFVBQW9DLEdBQUcsRUFBM0M7O0VBQ0EsSUFBSWhHLGVBQWUsR0FBR0sseUJBQUEsQ0FBZ0I0RixNQUF0QyxFQUE4QztJQUM1QztNQUNFLElBQU1DLFlBQW9CLEdBQUdwRixnQkFBQSxDQUFLQyxJQUFMLENBQzNCaEIsT0FEMkIsNEJBR3pCO01BQ0FFLFdBQVcsS0FBS1UseUJBQUEsQ0FBWUMsR0FBNUIsR0FBa0NELHlCQUFBLENBQVl3RixLQUE5QyxHQUFzRGxHLFdBSjdCLEdBTTNCLGNBTjJCLENBQTdCOztNQVFBLElBQUl5QixtQkFBQSxDQUFHMEUsVUFBSCxDQUFjRixZQUFkLENBQUosRUFBaUM7UUFDL0IsSUFBSWhHLEdBQUosRUFBUztVQUNQc0IsT0FBTyxDQUFDdEIsR0FBUix5QkFBNkJnRyxZQUE3QjtRQUNEOztRQUNELElBQU1HLElBQVksR0FBRzNFLG1CQUFBLENBQUdDLFlBQUgsQ0FBZ0J1RSxZQUFoQixFQUE4QjtVQUFFdEUsUUFBUSxFQUFFO1FBQVosQ0FBOUIsQ0FBckI7O1FBQ0EwRSxNQUFNLENBQUNDLE1BQVAsQ0FBY1AsVUFBZCxFQUEwQlEsSUFBSSxDQUFDQyxLQUFMLENBQVdKLElBQVgsQ0FBMUI7TUFDRCxDQU5ELE1BTU8sSUFBSW5HLEdBQUosRUFBUztRQUNkc0IsT0FBTyxDQUFDdEIsR0FBUixrQ0FBc0NnRyxZQUF0QztNQUNEO0lBQ0Y7SUFFRDtNQUNFLElBQU1BLGFBQW9CLEdBQUdwRixnQkFBQSxDQUFLQyxJQUFMLENBQzNCaEIsT0FEMkIsRUFFM0Isa0JBRjJCLEVBRzNCLGdCQUgyQixDQUE3Qjs7TUFLQSxJQUFJMkIsbUJBQUEsQ0FBRzBFLFVBQUgsQ0FBY0YsYUFBZCxDQUFKLEVBQWlDO1FBQy9CLElBQUloRyxHQUFKLEVBQVM7VUFDUHNCLE9BQU8sQ0FBQ3RCLEdBQVIseUJBQTZCZ0csYUFBN0I7UUFDRDs7UUFDRCxJQUFNRyxLQUFZLEdBQUczRSxtQkFBQSxDQUFHQyxZQUFILENBQWdCdUUsYUFBaEIsRUFBOEI7VUFBRXRFLFFBQVEsRUFBRTtRQUFaLENBQTlCLENBQXJCOztRQUNBMEUsTUFBTSxDQUFDQyxNQUFQLENBQWNQLFVBQWQsRUFBMEJRLElBQUksQ0FBQ0MsS0FBTCxDQUFXSixLQUFYLENBQTFCO01BQ0QsQ0FORCxNQU1PLElBQUluRyxHQUFKLEVBQVM7UUFDZHNCLE9BQU8sQ0FBQ3RCLEdBQVIsa0NBQXNDZ0csYUFBdEM7TUFDRDtJQUNGO0VBQ0Y7O0VBRUQsSUFBTVEsWUFBd0MsR0FBRyxFQUFqRDs7RUFDQSxJQUFJMUcsZUFBZSxHQUFHSyx5QkFBQSxDQUFnQnNHLFFBQXRDLEVBQWdEO0lBQUEsNkNBQ3hCcEcsa0JBQUEsQ0FBU3FHLFFBRGU7SUFBQTs7SUFBQTtNQUM5QywwREFBeUM7UUFBQSxJQUE5Qm5HLFNBQThCOztRQUN2QyxJQUFJQSxTQUFPLENBQUNDLFlBQVosRUFBMEI7VUFDeEI7UUFDRDs7UUFDRCxJQUNFVCxXQUFXLEtBQUtVLHlCQUFBLENBQVlDLEdBQTVCLElBQ0FILFNBQU8sQ0FBQ1IsV0FBUixLQUF3QlUseUJBQUEsQ0FBWUMsR0FEcEMsSUFFQVgsV0FBVyxLQUFLUSxTQUFPLENBQUNSLFdBSDFCLEVBSUU7VUFDQTtRQUNEOztRQUNELElBQU1ZLFlBQVUsR0FBR0MsZ0JBQUEsQ0FBS0MsSUFBTCxDQUNqQmhCLE9BRGlCLEVBRWpCVSxTQUFPLENBQUNPLFFBQVIsQ0FBaUJDLE9BQWpCLENBQXlCLFNBQXpCLEVBQW9DLFVBQXBDLENBRmlCLENBQW5COztRQVh1Qyw2Q0FnQlIsSUFBQUMscUJBQUEsRUFBUUwsWUFBUixDQWhCUTtRQUFBOztRQUFBO1VBZ0J2QywwREFBb0Q7WUFBQSxJQUF6Q2dHLGdCQUF5QztZQUNsRCxJQUFNQyxlQUFlLEdBQUdELGdCQUFnQixDQUFDQSxnQkFBZ0IsQ0FBQ3hGLE1BQWpCLEdBQTBCLENBQTNCLENBQXhDOztZQUNBLElBQUksQ0FBQ3lGLGVBQWUsQ0FBQ3hGLFFBQWhCLENBQXlCLE9BQXpCLENBQUwsRUFBd0M7Y0FDdEM7WUFDRDs7WUFDRCxJQUFNeUYsZUFBZSxHQUFHakcsZ0JBQUEsQ0FBS0MsSUFBTCxPQUFBRCxnQkFBQSxHQUFVRCxZQUFWLDRCQUF5QmdHLGdCQUF6QixHQUF4Qjs7WUFDQSxJQUFJM0csR0FBSixFQUFTO2NBQ1BzQixPQUFPLENBQUN0QixHQUFSLHlCQUE2QjZHLGVBQTdCO1lBQ0Q7O1lBQ0QsSUFBTUMsV0FBbUIsR0FBR3RGLG1CQUFBLENBQUdDLFlBQUgsQ0FBZ0JvRixlQUFoQixFQUFpQztjQUMzRG5GLFFBQVEsRUFBRTtZQURpRCxDQUFqQyxDQUE1Qjs7WUFHQSxJQUFNcUYsT0FBTyxHQUFHQyxpQkFBQSxDQUFnQkMsU0FBaEIsQ0FBMEJILFdBQTFCLENBQWhCOztZQUNBLElBQUlOLFlBQVksQ0FBQ08sT0FBTyxDQUFDakYsR0FBVCxDQUFaLEtBQThCQyxTQUFsQyxFQUE2QztjQUMzQ3lFLFlBQVksQ0FBQ08sT0FBTyxDQUFDakYsR0FBVCxDQUFaLEdBQTRCaUYsT0FBNUI7WUFDRDtVQUNGO1FBaENzQztVQUFBO1FBQUE7VUFBQTtRQUFBO01BaUN4QztJQWxDNkM7TUFBQTtJQUFBO01BQUE7SUFBQTtFQW1DL0M7O0VBRUQsT0FBTztJQUNMOUcsV0FBVyxFQUFYQSxXQURLO0lBRUw2RCxlQUFlLEVBQWZBLGVBRks7SUFHTFUsYUFBYSxFQUFiQSxhQUhLO0lBSUxDLGlDQUFpQyxFQUFqQ0EsaUNBSks7SUFLTEMsaUNBQWlDLEVBQWpDQSxpQ0FMSztJQU1MQyx5QkFBeUIsRUFBekJBLHlCQU5LO0lBT0x6RSxXQUFXLEVBQVhBLFdBUEs7SUFRTDRGLFVBQVUsRUFBVkEsVUFSSztJQVNMeEQsWUFBWSxFQUFaQSxZQVRLO0lBVUxDLGFBQWEsRUFBYkEsYUFWSztJQVdMQyxvQkFBb0IsRUFBcEJBLG9CQVhLO0lBWUxnRSxZQUFZLEVBQVpBO0VBWkssQ0FBUDtBQWNEO0FBRUQ7OztBQUNPLFNBQVNVLDZCQUFULENBQ0xySCxPQURLLEVBRUxDLGVBRkssRUFHTEMsV0FISyxFQUtDO0VBQUEsZ0ZBRFksRUFDWjtFQUFBLHNCQURKQyxHQUNJO0VBQUEsSUFESkEsR0FDSSwwQkFERSxLQUNGOztFQUNOLElBQU1DLFdBQXNDLEdBQUcsRUFBL0M7RUFDQSxJQUFNQyxXQUFzQyxHQUFHLEVBQS9DOztFQUNBLElBQUlKLGVBQWUsR0FBR0sseUJBQUEsQ0FBZ0JDLGdCQUF0QyxFQUF3RDtJQUFBLDZDQUNoQ0Msa0JBQUEsQ0FBU0MsZ0JBRHVCO0lBQUE7O0lBQUE7TUFDdEQsMERBQWlEO1FBQUEsSUFBdENDLE9BQXNDOztRQUMvQyxJQUFJQSxPQUFPLENBQUNDLFlBQVosRUFBMEI7VUFDeEI7UUFDRDs7UUFDRCxJQUNFVCxXQUFXLEtBQUtVLHlCQUFBLENBQVlDLEdBQTVCLElBQ0FILE9BQU8sQ0FBQ1IsV0FBUixLQUF3QlUseUJBQUEsQ0FBWUMsR0FEcEMsSUFFQVgsV0FBVyxLQUFLUSxPQUFPLENBQUNSLFdBSDFCLEVBSUU7VUFDQTtRQUNEOztRQUNELElBQU1pRyxZQUFvQixHQUFHcEYsZ0JBQUEsQ0FBS0MsSUFBTCxDQUMzQmhCLE9BRDJCLEVBRTNCVSxPQUFPLENBQUNPLFFBQVIsQ0FBaUJDLE9BQWpCLENBQXlCLFNBQXpCLEVBQW9DLGVBQXBDLENBRjJCLENBQTdCOztRQUlBLElBQUlmLEdBQUosRUFBUztVQUNQc0IsT0FBTyxDQUFDdEIsR0FBUix5QkFBNkJnRyxZQUE3QjtRQUNEOztRQUNELElBQU1HLElBQVksR0FBRzNFLG1CQUFBLENBQUdDLFlBQUgsQ0FBZ0J1RSxZQUFoQixFQUE4QjtVQUFFdEUsUUFBUSxFQUFFO1FBQVosQ0FBOUIsQ0FBckI7O1FBQ0EsSUFBTXBCLGdCQUFnQixHQUFHc0IsMkJBQUEsQ0FBd0J1RixrQkFBeEIsQ0FBMkNoQixJQUEzQyxDQUF6Qjs7UUFuQitDLDZDQW9CMUI3RixnQkFBZ0IsQ0FBQzhHLE9BcEJTO1FBQUE7O1FBQUE7VUFvQi9DLDBEQUErQztZQUFBLElBQXBDekYsTUFBb0M7O1lBQzdDO1lBQ0EsSUFBSTFCLFdBQVcsQ0FBQzBCLE1BQU0sQ0FBQ0csR0FBUixDQUFYLEtBQTRCQyxTQUFoQyxFQUEyQztjQUN6QzlCLFdBQVcsQ0FBQzBCLE1BQU0sQ0FBQ0csR0FBUixDQUFYLEdBQTBCSCxNQUExQjtZQUNEO1VBQ0Y7UUF6QjhDO1VBQUE7UUFBQTtVQUFBO1FBQUE7O1FBQUEsNkNBMEIxQnJCLGdCQUFnQixDQUFDK0csT0ExQlM7UUFBQTs7UUFBQTtVQTBCL0MsMERBQStDO1lBQUEsSUFBcENqRixNQUFvQzs7WUFDN0M7WUFDQSxJQUFJbEMsV0FBVyxDQUFDa0MsTUFBTSxDQUFDTixHQUFSLENBQVgsS0FBNEJDLFNBQWhDLEVBQTJDO2NBQ3pDN0IsV0FBVyxDQUFDa0MsTUFBTSxDQUFDTixHQUFSLENBQVgsR0FBMEJNLE1BQTFCO1lBQ0Q7VUFDRjtRQS9COEM7VUFBQTtRQUFBO1VBQUE7UUFBQTtNQWdDaEQ7SUFqQ3FEO01BQUE7SUFBQTtNQUFBO0lBQUE7RUFrQ3ZEOztFQUVELElBQU1FLFlBQXdDLEdBQUcsRUFBakQ7RUFDQSxJQUFNQyxhQUEyQyxHQUFHLEVBQXBEO0VBQ0EsSUFBTUMsb0JBQXlELEdBQUcsRUFBbEU7O0VBQ0EsSUFBSTFDLGVBQWUsR0FBR0sseUJBQUEsQ0FBZ0JzQyxPQUF0QyxFQUErQztJQUFBLDZDQUN2QnBDLGtCQUFBLENBQVNxQyxPQURjO0lBQUE7O0lBQUE7TUFDN0MsMERBQXdDO1FBQUEsSUFBN0JuQyxTQUE2Qjs7UUFDdEMsSUFBSUEsU0FBTyxDQUFDQyxZQUFaLEVBQTBCO1VBQ3hCO1FBQ0Q7O1FBQ0QsSUFDRVQsV0FBVyxLQUFLVSx5QkFBQSxDQUFZQyxHQUE1QixJQUNBSCxTQUFPLENBQUNSLFdBQVIsS0FBd0JVLHlCQUFBLENBQVlDLEdBRHBDLElBRUFYLFdBQVcsS0FBS1EsU0FBTyxDQUFDUixXQUgxQixFQUlFO1VBQ0E7UUFDRDs7UUFDRCxJQUFNaUcsY0FBb0IsR0FBR3BGLGdCQUFBLENBQUtDLElBQUwsQ0FDM0JoQixPQUQyQixFQUUzQlUsU0FBTyxDQUFDTyxRQUFSLENBQWlCQyxPQUFqQixDQUF5QixTQUF6QixFQUFvQyxlQUFwQyxDQUYyQixDQUE3Qjs7UUFJQSxJQUFJZixHQUFKLEVBQVM7VUFDUHNCLE9BQU8sQ0FBQ3RCLEdBQVIseUJBQTZCZ0csY0FBN0I7UUFDRDs7UUFDRCxJQUFNRyxNQUFZLEdBQUczRSxtQkFBQSxDQUFHQyxZQUFILENBQWdCdUUsY0FBaEIsRUFBOEI7VUFBRXRFLFFBQVEsRUFBRTtRQUFaLENBQTlCLENBQXJCOztRQUNBLElBQU1nQixPQUFPLEdBQUdNLGdCQUFBLENBQWVzRSxTQUFmLENBQXlCbkIsTUFBekIsQ0FBaEI7O1FBbkJzQyw2Q0FvQmhCekQsT0FBTyxDQUFDNkUsUUFwQlE7UUFBQTs7UUFBQTtVQW9CdEMsMERBQXdDO1lBQUEsSUFBN0J4RSxPQUE2Qjs7WUFDdEMsSUFBSVQsWUFBWSxDQUFDUyxPQUFPLENBQUNqQixHQUFULENBQVosS0FBOEJDLFNBQWxDLEVBQTZDO2NBQzNDTyxZQUFZLENBQUNTLE9BQU8sQ0FBQ2pCLEdBQVQsQ0FBWixHQUE0QmlCLE9BQTVCO1lBQ0Q7O1lBRUQsSUFBTUcsS0FBRyxHQUFHSCxPQUFPLENBQUNJLGNBQVIsQ0FBdUJDLFdBQXZCLEdBQXFDQyxLQUFyQyxDQUEyQyxHQUEzQyxFQUFnRCxDQUFoRCxDQUFaO1lBQ0EsSUFBSUMsYUFBYSxHQUFHZixhQUFhLENBQUNXLEtBQUQsQ0FBakM7O1lBQ0EsSUFBSUksYUFBYSxLQUFLdkIsU0FBdEIsRUFBaUM7Y0FDL0J1QixhQUFhLEdBQUdmLGFBQWEsQ0FBQ1csS0FBRCxDQUFiLEdBQXFCLEVBQXJDO1lBQ0Q7O1lBQ0RJLGFBQWEsQ0FBQ0MsSUFBZCxDQUFtQlIsT0FBbkI7WUFFQSxJQUFNUyxHQUFHLEdBQUdULE9BQU8sQ0FBQ1MsR0FBcEI7O1lBQ0EsSUFBSUEsR0FBRyxLQUFLekIsU0FBWixFQUF1QjtjQUFBLDZDQUNFeUIsR0FBRyxDQUFDQyxTQUFKLElBQWlCLEVBRG5CO2NBQUE7O2NBQUE7Z0JBQ3JCLDBEQUE0QztrQkFBQSxJQUFqQ0MsUUFBaUM7O2tCQUFBLDZDQUNQQSxRQUFRLENBQUNDLHVCQUFULElBQ2pDLEVBRndDO2tCQUFBOztrQkFBQTtvQkFDMUMsMERBQ007c0JBQUEsSUFES0Msb0JBQ0w7c0JBQ0osSUFBSUMsb0JBQW9CLEdBQ3RCckIsb0JBQW9CLENBQUNvQixvQkFBRCxDQUR0Qjs7c0JBRUEsSUFBSUMsb0JBQW9CLEtBQUs5QixTQUE3QixFQUF3Qzt3QkFDdEM4QixvQkFBb0IsR0FBR3JCLG9CQUFvQixDQUN6Q29CLG9CQUR5QyxDQUFwQixHQUVuQixFQUZKO3NCQUdEOztzQkFDREMsb0JBQW9CLENBQUNOLElBQXJCLENBQTBCUixPQUExQjtvQkFDRDtrQkFYeUM7b0JBQUE7a0JBQUE7b0JBQUE7a0JBQUE7Z0JBWTNDO2NBYm9CO2dCQUFBO2NBQUE7Z0JBQUE7Y0FBQTtZQWN0QjtVQUNGO1FBaERxQztVQUFBO1FBQUE7VUFBQTtRQUFBO01BaUR2QztJQWxENEM7TUFBQTtJQUFBO01BQUE7SUFBQTtFQW1EOUM7O0VBRUQsSUFBTWUsZUFBOEMsR0FBRyxFQUF2RDs7RUFDQSxJQUFJaEUsZUFBZSxHQUFHSyx5QkFBQSxDQUFnQjRELFdBQXRDLEVBQW1EO0lBQUEsNkNBQzNCMUQsa0JBQUEsQ0FBUzJELFdBRGtCO0lBQUE7O0lBQUE7TUFDakQsMERBQTRDO1FBQUEsSUFBakN6RCxTQUFpQzs7UUFDMUMsSUFBSUEsU0FBTyxDQUFDQyxZQUFaLEVBQTBCO1VBQ3hCO1FBQ0Q7O1FBQ0QsSUFDRVQsV0FBVyxLQUFLVSx5QkFBQSxDQUFZQyxHQUE1QixJQUNBSCxTQUFPLENBQUNSLFdBQVIsS0FBd0JVLHlCQUFBLENBQVlDLEdBRHBDLElBRUFYLFdBQVcsS0FBS1EsU0FBTyxDQUFDUixXQUgxQixFQUlFO1VBQ0E7UUFDRDs7UUFDRCxJQUFNaUcsY0FBb0IsR0FBR3BGLGdCQUFBLENBQUtDLElBQUwsQ0FDM0JoQixPQUQyQixFQUUzQlUsU0FBTyxDQUFDTyxRQUFSLENBQWlCQyxPQUFqQixDQUF5QixTQUF6QixFQUFvQyxlQUFwQyxDQUYyQixDQUE3Qjs7UUFJQSxJQUFJZixHQUFKLEVBQVM7VUFDUHNCLE9BQU8sQ0FBQ3RCLEdBQVIseUJBQTZCZ0csY0FBN0I7UUFDRDs7UUFDRCxJQUFNRyxNQUFZLEdBQUczRSxtQkFBQSxDQUFHQyxZQUFILENBQWdCdUUsY0FBaEIsRUFBOEI7VUFBRXRFLFFBQVEsRUFBRTtRQUFaLENBQTlCLENBQXJCOztRQUNBLElBQU1zQyxXQUFXLEdBQUdNLG9CQUFBLENBQW1Ca0QsYUFBbkIsQ0FBaUNyQixNQUFqQyxDQUFwQjs7UUFuQjBDLDZDQW9CWm5DLFdBQVcsQ0FBQ3lELGlCQXBCQTtRQUFBOztRQUFBO1VBb0IxQywwREFBNkQ7WUFBQSxJQUFsREMsZUFBa0Q7O1lBQUEsNkNBQ2xDQSxlQUFlLENBQUMxRCxXQURrQjtZQUFBOztZQUFBO2NBQzNELDBEQUFzRDtnQkFBQSxJQUEzQ0ssVUFBMkM7O2dCQUNwRCxJQUFJUCxlQUFlLENBQUNPLFVBQVUsQ0FBQ3ZDLEdBQVosQ0FBZixLQUFvQ0MsU0FBeEMsRUFBbUQ7a0JBQ2pEK0IsZUFBZSxDQUFDTyxVQUFVLENBQUN2QyxHQUFaLENBQWYsR0FBa0N1QyxVQUFsQztnQkFDRDtjQUNGO1lBTDBEO2NBQUE7WUFBQTtjQUFBO1lBQUE7VUFNNUQ7UUExQnlDO1VBQUE7UUFBQTtVQUFBO1FBQUE7TUEyQjNDO0lBNUJnRDtNQUFBO0lBQUE7TUFBQTtJQUFBO0VBNkJsRDs7RUFFRCxJQUFNRyxhQUEwQyxHQUFHLEVBQW5EO0VBQ0EsSUFBTUMsaUNBRUwsR0FBRyxFQUZKO0VBR0EsSUFBTUMsaUNBRUwsR0FBRyxFQUZKO0VBR0EsSUFBTUMseUJBQWtFLEdBQUcsRUFBM0U7O0VBQ0EsSUFBSTdFLGVBQWUsR0FBR0sseUJBQUEsQ0FBZ0J5RSxtQkFBdEMsRUFBMkQ7SUFBQSw2Q0FDbkN2RSxrQkFBQSxDQUFTd0UsbUJBRDBCO0lBQUE7O0lBQUE7TUFDekQsMERBQW9EO1FBQUEsSUFBekN0RSxTQUF5Qzs7UUFDbEQsSUFBSUEsU0FBTyxDQUFDQyxZQUFaLEVBQTBCO1VBQ3hCO1FBQ0Q7O1FBQ0QsSUFDRVQsV0FBVyxLQUFLVSx5QkFBQSxDQUFZQyxHQUE1QixJQUNBSCxTQUFPLENBQUNSLFdBQVIsS0FBd0JVLHlCQUFBLENBQVlDLEdBRHBDLElBRUFYLFdBQVcsS0FBS1EsU0FBTyxDQUFDUixXQUgxQixFQUlFO1VBQ0E7UUFDRDs7UUFDRCxJQUFNaUcsY0FBb0IsR0FBR3BGLGdCQUFBLENBQUtDLElBQUwsQ0FDM0JoQixPQUQyQixFQUUzQlUsU0FBTyxDQUFDTyxRQUFSLENBQWlCQyxPQUFqQixDQUF5QixTQUF6QixFQUFvQyxlQUFwQyxDQUYyQixDQUE3Qjs7UUFJQSxJQUFJZixHQUFKLEVBQVM7VUFDUHNCLE9BQU8sQ0FBQ3RCLEdBQVIseUJBQTZCZ0csY0FBN0I7UUFDRDs7UUFDRCxJQUFNRyxNQUFZLEdBQUczRSxtQkFBQSxDQUFHQyxZQUFILENBQWdCdUUsY0FBaEIsRUFBOEI7VUFBRXRFLFFBQVEsRUFBRTtRQUFaLENBQTlCLENBQXJCOztRQUNBLElBQU1tRCxtQkFBbUIsR0FDdkJNLDZCQUFBLENBQTJCd0MscUJBQTNCLENBQWlEeEIsTUFBakQsQ0FERjs7UUFuQmtELDZDQXFCM0J0QixtQkFBbUIsQ0FBQzRDLGlCQXJCTztRQUFBOztRQUFBO1VBcUJsRCwwREFBOEQ7WUFBQSxJQUFuRHZDLFFBQW1EOztZQUM1RCxJQUFJVixhQUFhLENBQUNVLFFBQVEsQ0FBQ3BELEdBQVYsQ0FBYixLQUFnQ0MsU0FBcEMsRUFBK0M7Y0FDN0N5QyxhQUFhLENBQUNVLFFBQVEsQ0FBQ3BELEdBQVYsQ0FBYixHQUE4Qm9ELFFBQTlCO1lBQ0Q7VUFDRjtRQXpCaUQ7VUFBQTtRQUFBO1VBQUE7UUFBQTs7UUFBQSw2Q0EwQjVCTCxtQkFBbUIsQ0FBQytDLHNCQTFCUTtRQUFBOztRQUFBO1VBMEJsRCwwREFBa0U7WUFBQSxJQUF2RG5DLE9BQXVEO1lBQ2hFLElBQU1FLFlBQVksR0FBR0YsT0FBTyxDQUFDRSxZQUE3Qjs7WUFDQSxJQUNFQSxZQUFZLENBQUNDLFdBQWIsSUFDQW5CLGlDQUFpQyxDQUFDa0IsWUFBWSxDQUFDQyxXQUFkLENBQWpDLEtBQ0U3RCxTQUhKLEVBSUU7Y0FDQTBDLGlDQUFpQyxDQUFDa0IsWUFBWSxDQUFDQyxXQUFkLENBQWpDLEdBQThESCxPQUE5RDtZQUNEOztZQUNELElBQ0VFLFlBQVksQ0FBQ0UsV0FBYixJQUNBbkIsaUNBQWlDLENBQUNpQixZQUFZLENBQUNFLFdBQWQsQ0FBakMsS0FDRTlELFNBSEosRUFJRTtjQUNBMkMsaUNBQWlDLENBQUNpQixZQUFZLENBQUNFLFdBQWQsQ0FBakMsR0FBOERKLE9BQTlEO1lBQ0Q7O1lBQ0QsSUFBSWQseUJBQXlCLENBQUNjLE9BQU8sQ0FBQzNELEdBQVQsQ0FBekIsS0FBMkNDLFNBQS9DLEVBQTBEO2NBQ3hENEMseUJBQXlCLENBQUNjLE9BQU8sQ0FBQzNELEdBQVQsQ0FBekIsR0FBeUMyRCxPQUF6QztZQUNEO1VBQ0Y7UUE3Q2lEO1VBQUE7UUFBQTtVQUFBO1FBQUE7TUE4Q25EO0lBL0N3RDtNQUFBO0lBQUE7TUFBQTtJQUFBO0VBZ0QxRDs7RUFFRCxJQUFNSyxVQUFvQyxHQUFHLEVBQTdDOztFQUNBLElBQUloRyxlQUFlLEdBQUdLLHlCQUFBLENBQWdCNEYsTUFBdEMsRUFBOEM7SUFDNUMsSUFBTUQsV0FBVSxHQUFHLEVBQW5CO0lBRUE7TUFDRSxJQUFNRSxjQUFvQixHQUFHcEYsZ0JBQUEsQ0FBS0MsSUFBTCxDQUMzQmhCLE9BRDJCLDRCQUd6QjtNQUNBRSxXQUFXLEtBQUtVLHlCQUFBLENBQVlDLEdBQTVCLEdBQWtDRCx5QkFBQSxDQUFZd0YsS0FBOUMsR0FBc0RsRyxXQUo3QixHQU0zQixjQU4yQixDQUE3Qjs7TUFRQSxJQUFJeUIsbUJBQUEsQ0FBRzBFLFVBQUgsQ0FBY0YsY0FBZCxDQUFKLEVBQWlDO1FBQy9CLElBQUloRyxHQUFKLEVBQVM7VUFDUHNCLE9BQU8sQ0FBQ3RCLEdBQVIseUJBQTZCZ0csY0FBN0I7UUFDRDs7UUFDRCxJQUFNRyxNQUFZLEdBQUczRSxtQkFBQSxDQUFHQyxZQUFILENBQWdCdUUsY0FBaEIsRUFBOEI7VUFBRXRFLFFBQVEsRUFBRTtRQUFaLENBQTlCLENBQXJCOztRQUNBMEUsTUFBTSxDQUFDQyxNQUFQLENBQWNQLFdBQWQsRUFBMEJRLElBQUksQ0FBQ0MsS0FBTCxDQUFXSixNQUFYLENBQTFCO01BQ0QsQ0FORCxNQU1PLElBQUluRyxHQUFKLEVBQVM7UUFDZHNCLE9BQU8sQ0FBQ3RCLEdBQVIsa0NBQXNDZ0csY0FBdEM7TUFDRDtJQUNGO0lBRUQ7TUFDRSxJQUFNQSxjQUFvQixHQUFHcEYsZ0JBQUEsQ0FBS0MsSUFBTCxDQUMzQmhCLE9BRDJCLEVBRTNCLGtCQUYyQixFQUczQixnQkFIMkIsQ0FBN0I7O01BS0EsSUFBSTJCLG1CQUFBLENBQUcwRSxVQUFILENBQWNGLGNBQWQsQ0FBSixFQUFpQztRQUMvQixJQUFJaEcsR0FBSixFQUFTO1VBQ1BzQixPQUFPLENBQUN0QixHQUFSLHlCQUE2QmdHLGNBQTdCO1FBQ0Q7O1FBQ0QsSUFBTUcsTUFBWSxHQUFHM0UsbUJBQUEsQ0FBR0MsWUFBSCxDQUFnQnVFLGNBQWhCLEVBQThCO1VBQUV0RSxRQUFRLEVBQUU7UUFBWixDQUE5QixDQUFyQjs7UUFDQTBFLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjUCxXQUFkLEVBQTBCUSxJQUFJLENBQUNDLEtBQUwsQ0FBV0osTUFBWCxDQUExQjtNQUNELENBTkQsTUFNTyxJQUFJbkcsR0FBSixFQUFTO1FBQ2RzQixPQUFPLENBQUN0QixHQUFSLGtDQUFzQ2dHLGNBQXRDO01BQ0Q7SUFDRjtFQUNGOztFQUVELElBQU1RLFlBQXdDLEdBQUcsRUFBakQ7O0VBQ0EsSUFBSTFHLGVBQWUsR0FBR0sseUJBQUEsQ0FBZ0JzRyxRQUF0QyxFQUFnRDtJQUFBLDZDQUN4QnBHLGtCQUFBLENBQVNxRyxRQURlO0lBQUE7O0lBQUE7TUFDOUMsMERBQXlDO1FBQUEsSUFBOUJuRyxTQUE4Qjs7UUFDdkMsSUFBSUEsU0FBTyxDQUFDQyxZQUFaLEVBQTBCO1VBQ3hCO1FBQ0Q7O1FBQ0QsSUFDRVQsV0FBVyxLQUFLVSx5QkFBQSxDQUFZQyxHQUE1QixJQUNBSCxTQUFPLENBQUNSLFdBQVIsS0FBd0JVLHlCQUFBLENBQVlDLEdBRHBDLElBRUFYLFdBQVcsS0FBS1EsU0FBTyxDQUFDUixXQUgxQixFQUlFO1VBQ0E7UUFDRDs7UUFDRCxJQUFNaUcsY0FBb0IsR0FBR3BGLGdCQUFBLENBQUtDLElBQUwsQ0FDM0JoQixPQUQyQixFQUUzQlUsU0FBTyxDQUFDTyxRQUFSLENBQWlCQyxPQUFqQixDQUF5QixTQUF6QixFQUFvQyxlQUFwQyxDQUYyQixDQUE3Qjs7UUFJQSxJQUFJZixHQUFKLEVBQVM7VUFDUHNCLE9BQU8sQ0FBQ3RCLEdBQVIseUJBQTZCZ0csY0FBN0I7UUFDRDs7UUFDRCxJQUFNRyxNQUFZLEdBQUczRSxtQkFBQSxDQUFHQyxZQUFILENBQWdCdUUsY0FBaEIsRUFBOEI7VUFBRXRFLFFBQVEsRUFBRTtRQUFaLENBQTlCLENBQXJCOztRQUNBLElBQU1nRixRQUFRLEdBQUdNLGlCQUFBLENBQWdCYSxVQUFoQixDQUEyQjFCLE1BQTNCLENBQWpCOztRQW5CdUMsNkNBb0JqQk8sUUFBUSxDQUFDQSxRQXBCUTtRQUFBOztRQUFBO1VBb0J2QywwREFBeUM7WUFBQSxJQUE5QkssT0FBOEI7O1lBQ3ZDLElBQUlQLFlBQVksQ0FBQ08sT0FBTyxDQUFDakYsR0FBVCxDQUFaLEtBQThCQyxTQUFsQyxFQUE2QztjQUMzQ3lFLFlBQVksQ0FBQ08sT0FBTyxDQUFDakYsR0FBVCxDQUFaLEdBQTRCaUYsT0FBNUI7WUFDRDtVQUNGO1FBeEJzQztVQUFBO1FBQUE7VUFBQTtRQUFBO01BeUJ4QztJQTFCNkM7TUFBQTtJQUFBO01BQUE7SUFBQTtFQTJCL0M7O0VBRUQsT0FBTztJQUNMOUcsV0FBVyxFQUFYQSxXQURLO0lBRUw2RCxlQUFlLEVBQWZBLGVBRks7SUFHTFUsYUFBYSxFQUFiQSxhQUhLO0lBSUxDLGlDQUFpQyxFQUFqQ0EsaUNBSks7SUFLTEMsaUNBQWlDLEVBQWpDQSxpQ0FMSztJQU1MQyx5QkFBeUIsRUFBekJBLHlCQU5LO0lBT0x6RSxXQUFXLEVBQVhBLFdBUEs7SUFRTDRGLFVBQVUsRUFBVkEsVUFSSztJQVNMeEQsWUFBWSxFQUFaQSxZQVRLO0lBVUxDLGFBQWEsRUFBYkEsYUFWSztJQVdMQyxvQkFBb0IsRUFBcEJBLG9CQVhLO0lBWUxnRSxZQUFZLEVBQVpBO0VBWkssQ0FBUDtBQWNEOztBQUVNLFNBQVNzQixtQkFBVCxDQUE2QkMsWUFBN0IsRUFBbURqRyxHQUFuRCxFQUF3RTtFQUM3RSxJQUFNa0csS0FBSyxHQUFHeEksZ0JBQWdCLENBQUN5SSxJQUFqQixDQUFzQm5HLEdBQXRCLENBQWQ7O0VBQ0FvRyxrQkFBQSxDQUFPQyxjQUFQLENBQ0VILEtBREYsRUFFRSxJQUZGLG1EQUc0Q2xHLEdBSDVDOztFQUtBLElBQU1zRyxZQUFZLEdBQUd4SCxnQkFBQSxDQUFLQyxJQUFMLENBQVVrSCxZQUFWLEVBQXdCQyxLQUFLLENBQUUsQ0FBRixDQUE3QixDQUFyQjs7RUFDQSxJQUFNSyxVQUFVLEdBQUd6SCxnQkFBQSxDQUFLQyxJQUFMLENBQVV1SCxZQUFWLEVBQXdCSixLQUFLLENBQUUsQ0FBRixDQUE3QixDQUFuQjs7RUFDQSxJQUFNTSxhQUFhLEdBQUcxSCxnQkFBQSxDQUFLQyxJQUFMLENBQVV3SCxVQUFWLEVBQXNCTCxLQUFLLENBQUUsQ0FBRixDQUEzQixDQUF0Qjs7RUFDQSxJQUFNTyxjQUFjLEdBQUczSCxnQkFBQSxDQUFLQyxJQUFMLENBQVV5SCxhQUFWLEVBQXlCTixLQUFLLENBQUUsQ0FBRixDQUE5QixDQUF2Qjs7RUFDQSxJQUFNUSxPQUFPLEdBQUc1SCxnQkFBQSxDQUFLQyxJQUFMLENBQVUwSCxjQUFWLEVBQTBCUCxLQUFLLENBQUUsQ0FBRixDQUEvQixDQUFoQjs7RUFDQSxJQUFJUyxNQUFNLEdBQUcsV0FBV1QsS0FBSyxDQUFFLENBQUYsQ0FBN0I7RUFDQVMsTUFBTSxHQUFHQSxNQUFNLENBQUNDLE1BQVAsQ0FBY0QsTUFBTSxDQUFDdEgsTUFBUCxHQUFnQixDQUE5QixDQUFUOztFQUNBLElBQU13SCxpQkFBaUIsR0FBRy9ILGdCQUFBLENBQUtDLElBQUwsQ0FBVTJILE9BQVYsRUFBbUJDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLENBQWQsRUFBaUIsQ0FBakIsQ0FBbkIsQ0FBMUI7O0VBQ0FsSCxtQkFBQSxDQUFHb0gsYUFBSCxDQUFpQkQsaUJBQWpCOztFQUNBLE9BQU8vSCxnQkFBQSxDQUFLQyxJQUFMLENBQVU4SCxpQkFBVixFQUE2QjdHLEdBQTdCLENBQVA7QUFDRDs7QUFFTSxTQUFTK0csK0JBQVQsQ0FDTEMsV0FESyxFQUVMaEgsR0FGSyxFQUdHO0VBQ1IsSUFBTWtHLEtBQUssR0FBR3ZJLGVBQWUsQ0FBQ3dJLElBQWhCLENBQXFCbkcsR0FBckIsQ0FBZDs7RUFDQW9HLGtCQUFBLENBQU9DLGNBQVAsQ0FDRUgsS0FERixFQUVFLElBRkYsZ0VBR3lEbEcsR0FIekQ7O0VBS0EsSUFBTXdHLGFBQWEsR0FBRzFILGdCQUFBLENBQUtDLElBQUwsQ0FBVWlJLFdBQVYsRUFBdUJkLEtBQUssQ0FBRSxDQUFGLENBQTVCLENBQXRCOztFQUNBLElBQU1PLGNBQWMsR0FBRzNILGdCQUFBLENBQUtDLElBQUwsQ0FBVXlILGFBQVYsRUFBeUJOLEtBQUssQ0FBRSxDQUFGLENBQTlCLENBQXZCOztFQUNBLElBQUlTLE1BQU0sR0FBRyxXQUFXVCxLQUFLLENBQUUsQ0FBRixDQUE3QjtFQUNBUyxNQUFNLEdBQUdBLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjRCxNQUFNLENBQUN0SCxNQUFQLEdBQWdCLENBQTlCLENBQVQ7O0VBQ0EsSUFBTXdILGlCQUFpQixHQUFHL0gsZ0JBQUEsQ0FBS0MsSUFBTCxDQUFVMEgsY0FBVixFQUEwQkUsTUFBTSxDQUFDQyxNQUFQLENBQWMsQ0FBZCxFQUFpQixDQUFqQixDQUExQixDQUExQjs7RUFDQWxILG1CQUFBLENBQUdvSCxhQUFILENBQWlCRCxpQkFBakI7O0VBQ0EsT0FBTy9ILGdCQUFBLENBQUtDLElBQUwsQ0FBVThILGlCQUFWLEVBQTZCN0csR0FBN0IsQ0FBUDtBQUNEOztBQUVNLFNBQVNpSCxrQkFBVCxDQUE0QkMsV0FBNUIsRUFBaURsSCxHQUFqRCxFQUFzRTtFQUMzRSxJQUFNa0csS0FBSyxHQUFHdEksZUFBZSxDQUFDdUksSUFBaEIsQ0FBcUJuRyxHQUFyQixDQUFkOztFQUNBb0csa0JBQUEsQ0FBT0MsY0FBUCxDQUNFSCxLQURGLEVBRUUsSUFGRixrREFHMkNsRyxHQUgzQzs7RUFLQSxJQUFNdUcsVUFBVSxHQUFHekgsZ0JBQUEsQ0FBS0MsSUFBTCxDQUFVbUksV0FBVixFQUF1QmhCLEtBQUssQ0FBRSxDQUFGLENBQTVCLENBQW5COztFQUNBLElBQU1NLGFBQWEsR0FBRzFILGdCQUFBLENBQUtDLElBQUwsQ0FBVXdILFVBQVYsRUFBc0JMLEtBQUssQ0FBRSxDQUFGLENBQTNCLENBQXRCOztFQUNBLElBQU1PLGNBQWMsR0FBRzNILGdCQUFBLENBQUtDLElBQUwsQ0FBVXlILGFBQVYsRUFBeUJOLEtBQUssQ0FBRSxDQUFGLENBQTlCLENBQXZCOztFQUNBLElBQU1pQixVQUFVLEdBQUdySSxnQkFBQSxDQUFLQyxJQUFMLENBQVUwSCxjQUFWLEVBQTBCUCxLQUFLLENBQUUsQ0FBRixDQUEvQixDQUFuQjs7RUFDQSxJQUFNa0IsS0FBSyxHQUFHdEksZ0JBQUEsQ0FBS0MsSUFBTCxDQUFVb0ksVUFBVixFQUFzQmpCLEtBQUssQ0FBRSxDQUFGLENBQTNCLENBQWQ7O0VBQ0EsSUFBSVMsTUFBTSxHQUFHLGNBQWNULEtBQUssQ0FBRSxDQUFGLENBQWhDO0VBQ0FTLE1BQU0sR0FBR0EsTUFBTSxDQUFDQyxNQUFQLENBQWNELE1BQU0sQ0FBQ3RILE1BQVAsR0FBZ0IsQ0FBOUIsQ0FBVDs7RUFDQSxJQUFNZ0ksaUJBQWlCLEdBQUd2SSxnQkFBQSxDQUFLQyxJQUFMLENBQVVxSSxLQUFWLEVBQWlCVCxNQUFNLENBQUNDLE1BQVAsQ0FBYyxDQUFkLEVBQWlCLENBQWpCLENBQWpCLENBQTFCOztFQUNBLElBQU1DLGlCQUFpQixHQUFHL0gsZ0JBQUEsQ0FBS0MsSUFBTCxDQUFVc0ksaUJBQVYsRUFBNkJWLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLENBQWQsRUFBaUIsQ0FBakIsQ0FBN0IsQ0FBMUI7O0VBQ0FsSCxtQkFBQSxDQUFHb0gsYUFBSCxDQUFpQkQsaUJBQWpCOztFQUNBLE9BQU8vSCxnQkFBQSxDQUFLQyxJQUFMLENBQVU4SCxpQkFBVixFQUE2QjdHLEdBQTdCLENBQVA7QUFDRDs7QUFFTSxTQUFTc0gsa0JBQVQsQ0FBNEJDLFdBQTVCLEVBQWlEdkgsR0FBakQsRUFBc0U7RUFDM0UsSUFBTWtHLEtBQUssR0FBR3JJLGVBQWUsQ0FBQ3NJLElBQWhCLENBQXFCbkcsR0FBckIsQ0FBZDs7RUFDQW9HLGtCQUFBLENBQU9DLGNBQVAsQ0FDRUgsS0FERixFQUVFLElBRkYsa0RBRzJDbEcsR0FIM0M7O0VBS0EsSUFBTXdHLGFBQWEsR0FBRzFILGdCQUFBLENBQUtDLElBQUwsQ0FBVXdJLFdBQVYsRUFBdUJyQixLQUFLLENBQUUsQ0FBRixDQUE1QixDQUF0Qjs7RUFDQSxJQUFNTyxjQUFjLEdBQUczSCxnQkFBQSxDQUFLQyxJQUFMLENBQVV5SCxhQUFWLEVBQXlCTixLQUFLLENBQUUsQ0FBRixDQUE5QixDQUF2Qjs7RUFDQSxJQUFJUyxNQUFNLEdBQUcsV0FBV1QsS0FBSyxDQUFFLENBQUYsQ0FBN0I7RUFDQVMsTUFBTSxHQUFHQSxNQUFNLENBQUNDLE1BQVAsQ0FBY0QsTUFBTSxDQUFDdEgsTUFBUCxHQUFnQixDQUE5QixDQUFUOztFQUNBLElBQU13SCxpQkFBaUIsR0FBRy9ILGdCQUFBLENBQUtDLElBQUwsQ0FBVTBILGNBQVYsRUFBMEJFLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLENBQWQsRUFBaUIsQ0FBakIsQ0FBMUIsQ0FBMUI7O0VBQ0FsSCxtQkFBQSxDQUFHb0gsYUFBSCxDQUFpQkQsaUJBQWpCOztFQUNBLE9BQU8vSCxnQkFBQSxDQUFLQyxJQUFMLENBQVU4SCxpQkFBVixFQUE2QjdHLEdBQTdCLENBQVA7QUFDRCJ9