easy-file-system 5.0.45 → 5.0.49

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 (50) hide show
  1. package/lib/button/toggle.js +42 -164
  2. package/lib/constants.js +6 -6
  3. package/lib/customEventTypes.js +9 -9
  4. package/lib/div/item/entry/drag/directoryName.js +24 -122
  5. package/lib/div/item/entry/drag/fileName.js +15 -112
  6. package/lib/div/item/entry/drag.js +19 -120
  7. package/lib/div/item/entry/marker.js +10 -107
  8. package/lib/div/item/entry.js +25 -187
  9. package/lib/entryTypes.js +5 -5
  10. package/lib/example/preamble.js +2 -2
  11. package/lib/example/view/button.js +12 -23
  12. package/lib/example/view/explorer/first.js +20 -120
  13. package/lib/example/view/explorer/second.js +17 -117
  14. package/lib/example/view/rubbishBin.js +10 -88
  15. package/lib/example/view.js +88 -233
  16. package/lib/example.js +6 -6
  17. package/lib/explorer.js +393 -740
  18. package/lib/index.js +17 -17
  19. package/lib/item/entry/drag/directoryName.js +130 -289
  20. package/lib/item/entry/drag/fileName.js +61 -182
  21. package/lib/item/entry/drag.js +179 -375
  22. package/lib/item/entry/marker/directoryName.js +20 -117
  23. package/lib/item/entry/marker/fileName.js +21 -118
  24. package/lib/item/entry/marker.js +13 -110
  25. package/lib/item/entry.js +54 -249
  26. package/lib/list/entries.js +464 -808
  27. package/lib/mixins/dragEntryItem.js +19 -19
  28. package/lib/mixins/explorer.js +28 -28
  29. package/lib/mixins/nameSpan.js +12 -12
  30. package/lib/mixins/rubbishBin.js +8 -8
  31. package/lib/rubbishBin.js +180 -415
  32. package/lib/span/name.js +93 -262
  33. package/lib/styles.js +14 -14
  34. package/lib/svg/directoryName.js +31 -142
  35. package/lib/svg/fileName.js +32 -143
  36. package/lib/svg/marker.js +25 -136
  37. package/lib/svg/rubbishBin/closed.js +48 -163
  38. package/lib/svg/rubbishBin/open.js +52 -167
  39. package/lib/svg/toggle/down.js +29 -145
  40. package/lib/svg/toggle/up.js +30 -146
  41. package/lib/svg.js +12 -149
  42. package/lib/utilities/name.js +12 -12
  43. package/lib/utilities/path.js +5 -5
  44. package/lib/utilities/pathMap.js +7 -7
  45. package/package.json +8 -4
  46. package/.aiignore +0 -14
  47. package/.swcrc +0 -11
  48. package/bin/main.js +0 -15
  49. package/example.js +0 -41953
  50. package/index.html +0 -46
@@ -8,847 +8,503 @@ Object.defineProperty(exports, "default", {
8
8
  return _default;
9
9
  }
10
10
  });
11
- var _easywithstyle = /*#__PURE__*/ _interop_require_default(require("easy-with-style"));
12
- var _easy = require("easy");
13
- var _necessary = require("necessary");
14
- var _styles = require("../styles");
15
- var _entryTypes = require("../entryTypes");
16
- function _array_like_to_array(arr, len) {
17
- if (len == null || len > arr.length) len = arr.length;
18
- for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
19
- return arr2;
20
- }
21
- function _array_without_holes(arr) {
22
- if (Array.isArray(arr)) return _array_like_to_array(arr);
23
- }
24
- function _assert_this_initialized(self) {
25
- if (self === void 0) {
26
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
27
- }
28
- return self;
29
- }
30
- function _call_super(_this, derived, args) {
31
- derived = _get_prototype_of(derived);
32
- return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
33
- }
34
- function _class_call_check(instance, Constructor) {
35
- if (!(instance instanceof Constructor)) {
36
- throw new TypeError("Cannot call a class as a function");
37
- }
38
- }
39
- function _construct(Parent, args, Class) {
40
- if (_is_native_reflect_construct()) {
41
- _construct = Reflect.construct;
42
- } else {
43
- _construct = function construct(Parent, args, Class) {
44
- var a = [
45
- null
46
- ];
47
- a.push.apply(a, args);
48
- var Constructor = Function.bind.apply(Parent, a);
49
- var instance = new Constructor();
50
- if (Class) _set_prototype_of(instance, Class.prototype);
51
- return instance;
52
- };
53
- }
54
- return _construct.apply(null, arguments);
55
- }
56
- function _defineProperties(target, props) {
57
- for(var i = 0; i < props.length; i++){
58
- var descriptor = props[i];
59
- descriptor.enumerable = descriptor.enumerable || false;
60
- descriptor.configurable = true;
61
- if ("value" in descriptor) descriptor.writable = true;
62
- Object.defineProperty(target, descriptor.key, descriptor);
63
- }
64
- }
65
- function _create_class(Constructor, protoProps, staticProps) {
66
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
67
- if (staticProps) _defineProperties(Constructor, staticProps);
68
- return Constructor;
69
- }
70
- function _define_property(obj, key, value) {
71
- if (key in obj) {
72
- Object.defineProperty(obj, key, {
73
- value: value,
74
- enumerable: true,
75
- configurable: true,
76
- writable: true
77
- });
78
- } else {
79
- obj[key] = value;
80
- }
81
- return obj;
82
- }
83
- function _get_prototype_of(o) {
84
- _get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {
85
- return o.__proto__ || Object.getPrototypeOf(o);
86
- };
87
- return _get_prototype_of(o);
88
- }
89
- function _inherits(subClass, superClass) {
90
- if (typeof superClass !== "function" && superClass !== null) {
91
- throw new TypeError("Super expression must either be null or a function");
92
- }
93
- subClass.prototype = Object.create(superClass && superClass.prototype, {
94
- constructor: {
95
- value: subClass,
96
- writable: true,
97
- configurable: true
98
- }
99
- });
100
- if (superClass) _set_prototype_of(subClass, superClass);
101
- }
11
+ const _easywithstyle = /*#__PURE__*/ _interop_require_default(require("easy-with-style"));
12
+ const _easy = require("easy");
13
+ const _necessary = require("necessary");
14
+ const _styles = require("../styles");
15
+ const _entryTypes = require("../entryTypes");
102
16
  function _interop_require_default(obj) {
103
17
  return obj && obj.__esModule ? obj : {
104
18
  default: obj
105
19
  };
106
20
  }
107
- function _is_native_function(fn) {
108
- return Function.toString.call(fn).indexOf("[native code]") !== -1;
109
- }
110
- function _iterable_to_array(iter) {
111
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
112
- }
113
- function _non_iterable_spread() {
114
- throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
115
- }
116
- function _possible_constructor_return(self, call) {
117
- if (call && (_type_of(call) === "object" || typeof call === "function")) {
118
- return call;
119
- }
120
- return _assert_this_initialized(self);
121
- }
122
- function _set_prototype_of(o, p) {
123
- _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {
124
- o.__proto__ = p;
125
- return o;
126
- };
127
- return _set_prototype_of(o, p);
128
- }
129
- function _tagged_template_literal(strings, raw) {
130
- if (!raw) {
131
- raw = strings.slice(0);
132
- }
133
- return Object.freeze(Object.defineProperties(strings, {
134
- raw: {
135
- value: Object.freeze(raw)
136
- }
137
- }));
138
- }
139
- function _to_consumable_array(arr) {
140
- return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
141
- }
142
- function _type_of(obj) {
143
- "@swc/helpers - typeof";
144
- return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
145
- }
146
- function _unsupported_iterable_to_array(o, minLen) {
147
- if (!o) return;
148
- if (typeof o === "string") return _array_like_to_array(o, minLen);
149
- var n = Object.prototype.toString.call(o).slice(8, -1);
150
- if (n === "Object" && o.constructor) n = o.constructor.name;
151
- if (n === "Map" || n === "Set") return Array.from(n);
152
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
153
- }
154
- function _wrap_native_super(Class) {
155
- var _cache = typeof Map === "function" ? new Map() : undefined;
156
- _wrap_native_super = function wrapNativeSuper(Class) {
157
- if (Class === null || !_is_native_function(Class)) return Class;
158
- if (typeof Class !== "function") {
159
- throw new TypeError("Super expression must either be null or a function");
160
- }
161
- if (typeof _cache !== "undefined") {
162
- if (_cache.has(Class)) return _cache.get(Class);
163
- _cache.set(Class, Wrapper);
164
- }
165
- function Wrapper() {
166
- return _construct(Class, arguments, _get_prototype_of(this).constructor);
167
- }
168
- Wrapper.prototype = Object.create(Class.prototype, {
169
- constructor: {
170
- value: Wrapper,
171
- enumerable: false,
172
- writable: true,
173
- configurable: true
174
- }
175
- });
176
- return _set_prototype_of(Wrapper, Class);
177
- };
178
- return _wrap_native_super(Class);
179
- }
180
- function _is_native_reflect_construct() {
181
- try {
182
- var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
183
- } catch (_) {}
184
- return (_is_native_reflect_construct = function() {
185
- return !!result;
186
- })();
187
- }
188
- function _templateObject() {
189
- var data = _tagged_template_literal([
190
- "\n\n list-style: none;\n padding-left: ",
191
- ";\n \n .topmost {\n padding-left: 0;\n }\n \n .collapsed {\n display: none;\n }\n \n"
192
- ]);
193
- _templateObject = function _templateObject() {
194
- return data;
195
- };
196
- return data;
197
- }
198
- var filter = _necessary.arrayUtilities.filter, topmostDirectoryNameFromPath = _necessary.pathUtilities.topmostDirectoryNameFromPath, pathWithoutTopmostDirectoryNameFromPath = _necessary.pathUtilities.pathWithoutTopmostDirectoryNameFromPath;
21
+ const { filter } = _necessary.arrayUtilities, { topmostDirectoryNameFromPath, pathWithoutTopmostDirectoryNameFromPath } = _necessary.pathUtilities;
199
22
  function getMarkerEntryItem() {
200
- var markerEntryItem = globalThis.markerEntryItem;
23
+ const { markerEntryItem } = globalThis;
201
24
  return markerEntryItem;
202
25
  }
203
26
  function setMarkerEntryItem(markerEntryItem) {
204
27
  Object.assign(globalThis, {
205
- markerEntryItem: markerEntryItem
28
+ markerEntryItem
206
29
  });
207
30
  }
208
31
  function resetMarkerEntryItem() {
209
- var markerEntryItem = null;
32
+ const markerEntryItem = null;
210
33
  setMarkerEntryItem(markerEntryItem);
211
34
  }
212
35
  Object.assign(globalThis, {
213
- getMarkerEntryItem: getMarkerEntryItem,
214
- setMarkerEntryItem: setMarkerEntryItem,
215
- resetMarkerEntryItem: resetMarkerEntryItem
36
+ getMarkerEntryItem,
37
+ setMarkerEntryItem,
38
+ resetMarkerEntryItem
216
39
  });
217
40
  resetMarkerEntryItem();
218
- var EntriesList = /*#__PURE__*/ function(Element) {
219
- _inherits(EntriesList, Element);
220
- function EntriesList() {
221
- _class_call_check(this, EntriesList);
222
- return _call_super(this, EntriesList, arguments);
223
- }
224
- _create_class(EntriesList, [
225
- {
226
- key: "isTopmost",
227
- value: function isTopmost() {
228
- var _this_properties = this.properties, _this_properties_topmost = _this_properties.topmost, topmost = _this_properties_topmost === void 0 ? false : _this_properties_topmost;
229
- return topmost;
230
- }
231
- },
232
- {
233
- key: "getExplorer",
234
- value: function getExplorer() {
235
- var explorer = this.properties.explorer;
236
- return explorer;
237
- }
238
- },
239
- {
240
- key: "getEntryItems",
241
- value: function getEntryItems() {
242
- var childEntryItemElements = this.getChildElements("li.entry"), entryItems = childEntryItemElements; ///
243
- return entryItems;
244
- }
245
- },
246
- {
247
- key: "getEntryItemsLength",
248
- value: function getEntryItemsLength() {
249
- var entryItems = this.getEntryItems(), entryItemsLength = entryItems.length;
250
- return entryItemsLength;
251
- }
252
- },
253
- {
254
- key: "isCollapsed",
255
- value: function isCollapsed() {
256
- var collapsed = this.hasClass("collapsed");
257
- return collapsed;
258
- }
259
- },
260
- {
261
- key: "isEmpty",
262
- value: function isEmpty() {
263
- var entryItems = this.getEntryItems(), entryItemsLength = entryItems.length, empty = entryItemsLength === 0;
264
- return empty;
265
- }
266
- },
267
- {
268
- key: "addMarker",
269
- value: function addMarker(markerEntryItemPath, dragEntryItemType) {
270
- var topmostDirectoryName = topmostDirectoryNameFromPath(markerEntryItemPath);
271
- if (topmostDirectoryName === null) {
272
- var markerEntryItemName = markerEntryItemPath; ///
273
- this.addMarkerEntryItem(markerEntryItemName, dragEntryItemType);
274
- } else {
275
- var topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName), markerEntryItemPathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(markerEntryItemPath);
276
- markerEntryItemPath = markerEntryItemPathWithoutTopmostDirectoryName; ///
277
- topmostDirectoryNameDragEntryItem.addMarker(markerEntryItemPath, dragEntryItemType);
278
- }
279
- }
280
- },
281
- {
282
- key: "removeMarker",
283
- value: function removeMarker() {
284
- this.removeMarkerEntryItem();
285
- }
286
- },
287
- {
288
- key: "selectPath",
289
- value: function selectPath(path) {
290
- var dragEntryItem = null;
291
- var topmostDirectoryName = topmostDirectoryNameFromPath(path);
292
- if (topmostDirectoryName === null) {
293
- var name = path; ///
294
- dragEntryItem = this.findDragEntryItem(name);
295
- if (dragEntryItem !== null) {
296
- dragEntryItem.select();
297
- }
298
- } else {
299
- var topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName);
300
- if (topmostDirectoryNameDragEntryItem !== null) {
301
- var filePathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(path);
302
- path = filePathWithoutTopmostDirectoryName; ///
303
- topmostDirectoryNameDragEntryItem.expand();
304
- dragEntryItem = topmostDirectoryNameDragEntryItem.selectPath(path);
305
- }
306
- }
307
- return dragEntryItem;
308
- }
309
- },
310
- {
311
- key: "deselectPath",
312
- value: function deselectPath(path) {
313
- var dragEntryItem = null;
314
- var topmostDirectoryName = topmostDirectoryNameFromPath(path);
315
- if (topmostDirectoryName === null) {
316
- var name = path; ///
317
- dragEntryItem = this.findDragEntryItem(name);
318
- if (dragEntryItem !== null) {
319
- dragEntryItem.deselect();
320
- }
321
- } else {
322
- var topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName);
323
- if (topmostDirectoryNameDragEntryItem !== null) {
324
- var filePathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(path);
325
- path = filePathWithoutTopmostDirectoryName; ///
326
- dragEntryItem = topmostDirectoryNameDragEntryItem.deselectPath(path);
327
- }
328
- }
329
- return dragEntryItem;
330
- }
331
- },
332
- {
333
- key: "addFilePath",
334
- value: function addFilePath(filePath) {
335
- var readOnly = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
336
- var fileNameDragEntryItem;
337
- var topmostDirectoryName = topmostDirectoryNameFromPath(filePath);
338
- if (topmostDirectoryName === null) {
339
- var fileName = filePath; ///
340
- fileNameDragEntryItem = this.findFileNameDragEntryItem(fileName);
341
- if (fileNameDragEntryItem === null) {
342
- fileNameDragEntryItem = this.createFileNameDragEntryItem(fileName, readOnly);
343
- this.addEntryItem(fileNameDragEntryItem);
344
- }
345
- } else {
346
- var topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName);
347
- if (topmostDirectoryNameDragEntryItem === null) {
348
- var collapsed = true;
349
- topmostDirectoryNameDragEntryItem = this.createDirectoryNameDragEntryItem(topmostDirectoryName, readOnly, collapsed);
350
- this.addEntryItem(topmostDirectoryNameDragEntryItem);
351
- }
352
- var filePathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(filePath);
353
- filePath = filePathWithoutTopmostDirectoryName; ///
354
- fileNameDragEntryItem = topmostDirectoryNameDragEntryItem.addFilePath(filePath, readOnly);
355
- }
356
- return fileNameDragEntryItem;
357
- }
358
- },
359
- {
360
- key: "removeFilePath",
361
- value: function removeFilePath(filePath) {
362
- var removeEmptyParentDirectories = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
363
- var topmostDirectoryName = topmostDirectoryNameFromPath(filePath);
364
- if (topmostDirectoryName === null) {
365
- var fileName = filePath, fileNameDragEntryItem = this.findFileNameDragEntryItem(fileName);
366
- if (fileNameDragEntryItem !== null) {
367
- this.removeEntryItem(fileNameDragEntryItem);
368
- }
369
- } else {
370
- var topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName);
371
- if (topmostDirectoryNameDragEntryItem !== null) {
372
- var filePathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(filePath);
373
- filePath = filePathWithoutTopmostDirectoryName; ///
374
- topmostDirectoryNameDragEntryItem.removeFilePath(filePath, removeEmptyParentDirectories);
375
- if (removeEmptyParentDirectories) {
376
- var topmostDirectoryNameDragEntryItemEmpty = topmostDirectoryNameDragEntryItem.isEmpty();
377
- if (topmostDirectoryNameDragEntryItemEmpty) {
378
- this.removeEntryItem(topmostDirectoryNameDragEntryItem);
379
- }
380
- }
381
- }
382
- }
383
- }
384
- },
385
- {
386
- key: "removeAllPaths",
387
- value: function removeAllPaths() {
388
- this.removeEntryItems();
389
- }
390
- },
391
- {
392
- key: "deselectAllPaths",
393
- value: function deselectAllPaths() {
394
- var dragEntryItems = this.retrieveDragEntryItems();
395
- dragEntryItems.forEach(function(dragEntryItem) {
396
- dragEntryItem.deselect();
397
- });
41
+ class EntriesList extends _easy.Element {
42
+ isTopmost() {
43
+ const { topmost = false } = this.properties;
44
+ return topmost;
45
+ }
46
+ getExplorer() {
47
+ const { explorer } = this.properties;
48
+ return explorer;
49
+ }
50
+ getEntryItems() {
51
+ const childEntryItemElements = this.getChildElements("li.entry"), entryItems = childEntryItemElements; ///
52
+ return entryItems;
53
+ }
54
+ getEntryItemsLength() {
55
+ const entryItems = this.getEntryItems(), entryItemsLength = entryItems.length;
56
+ return entryItemsLength;
57
+ }
58
+ isCollapsed() {
59
+ const collapsed = this.hasClass("collapsed");
60
+ return collapsed;
61
+ }
62
+ isEmpty() {
63
+ const entryItems = this.getEntryItems(), entryItemsLength = entryItems.length, empty = entryItemsLength === 0;
64
+ return empty;
65
+ }
66
+ addMarker(markerEntryItemPath, dragEntryItemType) {
67
+ const topmostDirectoryName = topmostDirectoryNameFromPath(markerEntryItemPath);
68
+ if (topmostDirectoryName === null) {
69
+ const markerEntryItemName = markerEntryItemPath; ///
70
+ this.addMarkerEntryItem(markerEntryItemName, dragEntryItemType);
71
+ } else {
72
+ const topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName), markerEntryItemPathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(markerEntryItemPath);
73
+ markerEntryItemPath = markerEntryItemPathWithoutTopmostDirectoryName; ///
74
+ topmostDirectoryNameDragEntryItem.addMarker(markerEntryItemPath, dragEntryItemType);
75
+ }
76
+ }
77
+ removeMarker() {
78
+ this.removeMarkerEntryItem();
79
+ }
80
+ selectPath(path) {
81
+ let dragEntryItem = null;
82
+ const topmostDirectoryName = topmostDirectoryNameFromPath(path);
83
+ if (topmostDirectoryName === null) {
84
+ const name = path; ///
85
+ dragEntryItem = this.findDragEntryItem(name);
86
+ if (dragEntryItem !== null) {
87
+ dragEntryItem.select();
88
+ }
89
+ } else {
90
+ let topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName);
91
+ if (topmostDirectoryNameDragEntryItem !== null) {
92
+ const filePathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(path);
93
+ path = filePathWithoutTopmostDirectoryName; ///
94
+ topmostDirectoryNameDragEntryItem.expand();
95
+ dragEntryItem = topmostDirectoryNameDragEntryItem.selectPath(path);
398
96
  }
399
- },
400
- {
401
- key: "addDirectoryPath",
402
- value: function addDirectoryPath(directoryPath) {
403
- var readOnly = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false, collapsed = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
404
- var directoryNameDragEntryItem;
405
- var topmostDirectoryName = topmostDirectoryNameFromPath(directoryPath);
406
- if (topmostDirectoryName === null) {
407
- var directoryName = directoryPath; ///
408
- directoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(directoryName);
409
- if (directoryNameDragEntryItem === null) {
410
- directoryNameDragEntryItem = this.createDirectoryNameDragEntryItem(directoryName, readOnly, collapsed);
411
- this.addEntryItem(directoryNameDragEntryItem);
412
- } else {
413
- collapsed ? directoryNameDragEntryItem.collapse() : directoryNameDragEntryItem.expand();
414
- }
415
- } else {
416
- var topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName);
417
- if (topmostDirectoryNameDragEntryItem === null) {
418
- topmostDirectoryNameDragEntryItem = this.createDirectoryNameDragEntryItem(topmostDirectoryName, readOnly, collapsed);
419
- this.addEntryItem(topmostDirectoryNameDragEntryItem);
420
- }
421
- var directoryPathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(directoryPath);
422
- directoryPath = directoryPathWithoutTopmostDirectoryName; ///
423
- directoryNameDragEntryItem = topmostDirectoryNameDragEntryItem.addDirectoryPath(directoryPath, readOnly, collapsed);
424
- }
425
- return directoryNameDragEntryItem;
97
+ }
98
+ return dragEntryItem;
99
+ }
100
+ deselectPath(path) {
101
+ let dragEntryItem = null;
102
+ const topmostDirectoryName = topmostDirectoryNameFromPath(path);
103
+ if (topmostDirectoryName === null) {
104
+ const name = path; ///
105
+ dragEntryItem = this.findDragEntryItem(name);
106
+ if (dragEntryItem !== null) {
107
+ dragEntryItem.deselect();
108
+ }
109
+ } else {
110
+ let topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName);
111
+ if (topmostDirectoryNameDragEntryItem !== null) {
112
+ const filePathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(path);
113
+ path = filePathWithoutTopmostDirectoryName; ///
114
+ dragEntryItem = topmostDirectoryNameDragEntryItem.deselectPath(path);
426
115
  }
427
- },
428
- {
429
- key: "removeDirectoryPath",
430
- value: function removeDirectoryPath(directoryPath) {
431
- var removeEmptyParentDirectories = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
432
- var topmostDirectoryName = topmostDirectoryNameFromPath(directoryPath);
433
- if (topmostDirectoryName === null) {
434
- var directoryName = directoryPath, directoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(directoryName);
435
- if (directoryNameDragEntryItem !== null) {
436
- this.removeEntryItem(directoryNameDragEntryItem);
437
- }
438
- } else {
439
- var topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName);
440
- if (topmostDirectoryNameDragEntryItem !== null) {
441
- var directoryPathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(directoryPath);
442
- directoryPath = directoryPathWithoutTopmostDirectoryName; ///
443
- topmostDirectoryNameDragEntryItem.removeDirectoryPath(directoryPath, removeEmptyParentDirectories);
444
- if (removeEmptyParentDirectories) {
445
- var topmostDirectoryNameDragEntryItemEmpty = topmostDirectoryNameDragEntryItem.isEmpty();
446
- if (topmostDirectoryNameDragEntryItemEmpty) {
447
- this.removeEntryItem(topmostDirectoryNameDragEntryItem);
448
- }
449
- }
116
+ }
117
+ return dragEntryItem;
118
+ }
119
+ addFilePath(filePath, readOnly = false) {
120
+ let fileNameDragEntryItem;
121
+ const topmostDirectoryName = topmostDirectoryNameFromPath(filePath);
122
+ if (topmostDirectoryName === null) {
123
+ const fileName = filePath; ///
124
+ fileNameDragEntryItem = this.findFileNameDragEntryItem(fileName);
125
+ if (fileNameDragEntryItem === null) {
126
+ fileNameDragEntryItem = this.createFileNameDragEntryItem(fileName, readOnly);
127
+ this.addEntryItem(fileNameDragEntryItem);
128
+ }
129
+ } else {
130
+ let topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName);
131
+ if (topmostDirectoryNameDragEntryItem === null) {
132
+ const collapsed = true;
133
+ topmostDirectoryNameDragEntryItem = this.createDirectoryNameDragEntryItem(topmostDirectoryName, readOnly, collapsed);
134
+ this.addEntryItem(topmostDirectoryNameDragEntryItem);
135
+ }
136
+ const filePathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(filePath);
137
+ filePath = filePathWithoutTopmostDirectoryName; ///
138
+ fileNameDragEntryItem = topmostDirectoryNameDragEntryItem.addFilePath(filePath, readOnly);
139
+ }
140
+ return fileNameDragEntryItem;
141
+ }
142
+ removeFilePath(filePath, removeEmptyParentDirectories = false) {
143
+ const topmostDirectoryName = topmostDirectoryNameFromPath(filePath);
144
+ if (topmostDirectoryName === null) {
145
+ const fileName = filePath, fileNameDragEntryItem = this.findFileNameDragEntryItem(fileName);
146
+ if (fileNameDragEntryItem !== null) {
147
+ this.removeEntryItem(fileNameDragEntryItem);
148
+ }
149
+ } else {
150
+ const topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName);
151
+ if (topmostDirectoryNameDragEntryItem !== null) {
152
+ const filePathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(filePath);
153
+ filePath = filePathWithoutTopmostDirectoryName; ///
154
+ topmostDirectoryNameDragEntryItem.removeFilePath(filePath, removeEmptyParentDirectories);
155
+ if (removeEmptyParentDirectories) {
156
+ const topmostDirectoryNameDragEntryItemEmpty = topmostDirectoryNameDragEntryItem.isEmpty();
157
+ if (topmostDirectoryNameDragEntryItemEmpty) {
158
+ this.removeEntryItem(topmostDirectoryNameDragEntryItem);
450
159
  }
451
160
  }
452
161
  }
453
- },
454
- {
455
- key: "addEntryItem",
456
- value: function addEntryItem(entryItem) {
457
- var nextEntryItem = entryItem, previousEntryItem = this.findEntryItem(function(entryItem) {
458
- var nextEntryBeforeEntryItem = nextEntryItem.isBefore(entryItem);
459
- if (nextEntryBeforeEntryItem) {
460
- return true;
162
+ }
163
+ }
164
+ removeAllPaths() {
165
+ this.removeEntryItems();
166
+ }
167
+ deselectAllPaths() {
168
+ const dragEntryItems = this.retrieveDragEntryItems();
169
+ dragEntryItems.forEach((dragEntryItem)=>{
170
+ dragEntryItem.deselect();
171
+ });
172
+ }
173
+ addDirectoryPath(directoryPath, readOnly = false, collapsed = true) {
174
+ let directoryNameDragEntryItem;
175
+ const topmostDirectoryName = topmostDirectoryNameFromPath(directoryPath);
176
+ if (topmostDirectoryName === null) {
177
+ const directoryName = directoryPath; ///
178
+ directoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(directoryName);
179
+ if (directoryNameDragEntryItem === null) {
180
+ directoryNameDragEntryItem = this.createDirectoryNameDragEntryItem(directoryName, readOnly, collapsed);
181
+ this.addEntryItem(directoryNameDragEntryItem);
182
+ } else {
183
+ collapsed ? directoryNameDragEntryItem.collapse() : directoryNameDragEntryItem.expand();
184
+ }
185
+ } else {
186
+ let topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName);
187
+ if (topmostDirectoryNameDragEntryItem === null) {
188
+ topmostDirectoryNameDragEntryItem = this.createDirectoryNameDragEntryItem(topmostDirectoryName, readOnly, collapsed);
189
+ this.addEntryItem(topmostDirectoryNameDragEntryItem);
190
+ }
191
+ const directoryPathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(directoryPath);
192
+ directoryPath = directoryPathWithoutTopmostDirectoryName; ///
193
+ directoryNameDragEntryItem = topmostDirectoryNameDragEntryItem.addDirectoryPath(directoryPath, readOnly, collapsed);
194
+ }
195
+ return directoryNameDragEntryItem;
196
+ }
197
+ removeDirectoryPath(directoryPath, removeEmptyParentDirectories = false) {
198
+ const topmostDirectoryName = topmostDirectoryNameFromPath(directoryPath);
199
+ if (topmostDirectoryName === null) {
200
+ const directoryName = directoryPath, directoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(directoryName);
201
+ if (directoryNameDragEntryItem !== null) {
202
+ this.removeEntryItem(directoryNameDragEntryItem);
203
+ }
204
+ } else {
205
+ const topmostDirectoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(topmostDirectoryName);
206
+ if (topmostDirectoryNameDragEntryItem !== null) {
207
+ const directoryPathWithoutTopmostDirectoryName = pathWithoutTopmostDirectoryNameFromPath(directoryPath);
208
+ directoryPath = directoryPathWithoutTopmostDirectoryName; ///
209
+ topmostDirectoryNameDragEntryItem.removeDirectoryPath(directoryPath, removeEmptyParentDirectories);
210
+ if (removeEmptyParentDirectories) {
211
+ const topmostDirectoryNameDragEntryItemEmpty = topmostDirectoryNameDragEntryItem.isEmpty();
212
+ if (topmostDirectoryNameDragEntryItemEmpty) {
213
+ this.removeEntryItem(topmostDirectoryNameDragEntryItem);
461
214
  }
462
- });
463
- if (previousEntryItem === null) {
464
- this.mount(entryItem);
465
- } else {
466
- entryItem.mountBefore(previousEntryItem);
467
- }
468
- }
469
- },
470
- {
471
- key: "removeEntryItem",
472
- value: function removeEntryItem(entryItem) {
473
- this.unmount(entryItem);
474
- }
475
- },
476
- {
477
- key: "removeEntryItems",
478
- value: function removeEntryItems() {
479
- var _this = this;
480
- var entryItems = this.getEntryItems();
481
- entryItems.forEach(function(entryItem) {
482
- _this.removeEntryItem(entryItem);
483
- });
484
- }
485
- },
486
- {
487
- key: "addMarkerEntryItem",
488
- value: function addMarkerEntryItem(markerEntryItemName, dragEntryItemType) {
489
- var markerEntryItem;
490
- var name = markerEntryItemName, type = dragEntryItemType; ///
491
- switch(type){
492
- case _entryTypes.FILE_NAME_DRAG_ENTRY_TYPE:
493
- {
494
- var explorer = this.getExplorer(), FileNameMarkerEntryItem = explorer.getFileNameMarkerEntryItem(), fileNameMarkerEntryItem = /*#__PURE__*/ React.createElement(FileNameMarkerEntryItem, {
495
- name: name,
496
- explorer: explorer
497
- });
498
- markerEntryItem = fileNameMarkerEntryItem; ///
499
- break;
500
- }
501
- case _entryTypes.DIRECTORY_NAME_DRAG_ENTRY_TYPE:
502
- {
503
- var explorer1 = this.getExplorer(), DirectoryNameMarkerEntryItem = explorer1.getDirectoryNameMarkerEntryItem(), directoryNameMarkerEntryItem = /*#__PURE__*/ React.createElement(DirectoryNameMarkerEntryItem, {
504
- name: name,
505
- explorer: explorer1
506
- });
507
- markerEntryItem = directoryNameMarkerEntryItem; ///
508
- break;
509
- }
510
- }
511
- var entryItem = markerEntryItem; ///
512
- this.addEntryItem(entryItem);
513
- setMarkerEntryItem(markerEntryItem);
514
- }
515
- },
516
- {
517
- key: "removeMarkerEntryItem",
518
- value: function removeMarkerEntryItem() {
519
- var markerEntryItem = this.retrieveMarkerEntryItem();
520
- markerEntryItem.remove();
521
- resetMarkerEntryItem();
522
- resetDropElement();
523
- }
524
- },
525
- {
526
- key: "createFileNameDragEntryItem",
527
- value: function createFileNameDragEntryItem(fileName, readOnly) {
528
- var name = fileName, explorer = this.getExplorer(), FileNameDragEntryItem = explorer.getFileNameDragEntryItem(readOnly), fileNameDragEntryItem = /*#__PURE__*/ React.createElement(FileNameDragEntryItem, {
529
- name: name,
530
- readOnly: readOnly,
531
- explorer: explorer
532
- });
533
- return fileNameDragEntryItem;
534
- }
535
- },
536
- {
537
- key: "createDirectoryNameDragEntryItem",
538
- value: function createDirectoryNameDragEntryItem(directoryName, readOnly, collapsed) {
539
- var name = directoryName, topmost = this.isTopmost(), explorer = this.getExplorer(), DirectoryNameDragEntryItem = explorer.getDirectoryNameDragEntryItem(readOnly, topmost), directoryNameDragEntryItem = /*#__PURE__*/ React.createElement(DirectoryNameDragEntryItem, {
540
- name: name,
541
- explorer: explorer,
542
- readOnly: readOnly,
543
- topmost: topmost,
544
- collapsed: collapsed
545
- });
546
- return directoryNameDragEntryItem;
547
- }
548
- },
549
- {
550
- key: "isFileNameDragEntryItemPresent",
551
- value: function isFileNameDragEntryItemPresent(fileName) {
552
- var fileNameDragEntryItem = this.findFileNameDragEntryItem(fileName), fileNameDragEntryItemPresent = fileNameDragEntryItem !== null;
553
- return fileNameDragEntryItemPresent;
554
- }
555
- },
556
- {
557
- key: "isDirectoryNameDragEntryItemPresent",
558
- value: function isDirectoryNameDragEntryItemPresent(directoryName) {
559
- var directoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(directoryName), directoryNameDragEntryItemPresent = directoryNameDragEntryItem !== null;
560
- return directoryNameDragEntryItemPresent;
561
- }
562
- },
563
- {
564
- key: "forEachEntryItemByTypes",
565
- value: function forEachEntryItemByTypes(callback) {
566
- for(var _len = arguments.length, types = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){
567
- types[_key - 1] = arguments[_key];
568
215
  }
569
- var entryItems = this.getEntryItems();
570
- entryItems.forEach(function(entryItem) {
571
- var entryItemType = entryItem.getType(), typesIncludesEntryItemType = types.includes(entryItemType);
572
- if (typesIncludesEntryItemType) {
573
- callback(entryItem);
574
- }
575
- });
576
- }
577
- },
578
- {
579
- key: "forEachDragEntryItem",
580
- value: function forEachDragEntryItem(callback) {
581
- this.forEachEntryItemByTypes(callback, _entryTypes.FILE_NAME_DRAG_ENTRY_TYPE, _entryTypes.DIRECTORY_NAME_DRAG_ENTRY_TYPE);
582
- }
583
- },
584
- {
585
- key: "forEachFileNameDragEntryItem",
586
- value: function forEachFileNameDragEntryItem(callback) {
587
- this.forEachEntryItemByTypes(callback, _entryTypes.FILE_NAME_DRAG_ENTRY_TYPE);
588
216
  }
589
- },
590
- {
591
- key: "forEachDirectoryNameDragEntryItem",
592
- value: function forEachDirectoryNameDragEntryItem(callback) {
593
- this.forEachEntryItemByTypes(callback, _entryTypes.DIRECTORY_NAME_DRAG_ENTRY_TYPE);
594
- }
595
- },
596
- {
597
- key: "findEntryItem",
598
- value: function findEntryItem(callback) {
599
- var entryItems = this.getEntryItems(), entryItem = entryItems.find(callback) || null; ///
600
- return entryItem;
601
- }
602
- },
603
- {
604
- key: "findEntryItemByTypes",
605
- value: function findEntryItemByTypes(callback) {
606
- for(var _len = arguments.length, types = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){
607
- types[_key - 1] = arguments[_key];
608
- }
609
- var entryItems = this.getEntryItems(), entryItem = entryItems.find(function(entryItem) {
610
- var entryItemType = entryItem.getType(), typesIncludesEntryItemType = types.includes(entryItemType);
611
- if (typesIncludesEntryItemType) {
612
- var result = callback(entryItem);
613
- if (result) {
614
- return true;
615
- }
616
- }
617
- }) || null; ///;
618
- return entryItem;
217
+ }
218
+ }
219
+ addEntryItem(entryItem) {
220
+ const nextEntryItem = entryItem, previousEntryItem = this.findEntryItem((entryItem)=>{
221
+ const nextEntryBeforeEntryItem = nextEntryItem.isBefore(entryItem);
222
+ if (nextEntryBeforeEntryItem) {
223
+ return true;
619
224
  }
620
- },
621
- {
622
- key: "findEntryItemsByTypes",
623
- value: function findEntryItemsByTypes() {
624
- for(var _len = arguments.length, types = new Array(_len), _key = 0; _key < _len; _key++){
625
- types[_key] = arguments[_key];
225
+ });
226
+ if (previousEntryItem === null) {
227
+ this.mount(entryItem);
228
+ } else {
229
+ entryItem.mountBefore(previousEntryItem);
230
+ }
231
+ }
232
+ removeEntryItem(entryItem) {
233
+ this.unmount(entryItem);
234
+ }
235
+ removeEntryItems() {
236
+ const entryItems = this.getEntryItems();
237
+ entryItems.forEach((entryItem)=>{
238
+ this.removeEntryItem(entryItem);
239
+ });
240
+ }
241
+ addMarkerEntryItem(markerEntryItemName, dragEntryItemType) {
242
+ let markerEntryItem;
243
+ const name = markerEntryItemName, type = dragEntryItemType; ///
244
+ switch(type){
245
+ case _entryTypes.FILE_NAME_DRAG_ENTRY_TYPE:
246
+ {
247
+ const explorer = this.getExplorer(), FileNameMarkerEntryItem = explorer.getFileNameMarkerEntryItem(), fileNameMarkerEntryItem = /*#__PURE__*/ React.createElement(FileNameMarkerEntryItem, {
248
+ name: name,
249
+ explorer: explorer
250
+ });
251
+ markerEntryItem = fileNameMarkerEntryItem; ///
252
+ break;
626
253
  }
627
- var entryItems = this.getEntryItems();
628
- filter(entryItems, function(entryItem) {
629
- var entryItemType = entryItem.getType(), typesIncludesEntryItemType = types.includes(entryItemType);
630
- if (typesIncludesEntryItemType) {
631
- return true;
632
- }
633
- });
634
- return entryItems;
635
- }
636
- },
637
- {
638
- key: "findEntryItemByNameAndTypes",
639
- value: function findEntryItemByNameAndTypes(name) {
640
- for(var _len = arguments.length, types = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){
641
- types[_key - 1] = arguments[_key];
254
+ case _entryTypes.DIRECTORY_NAME_DRAG_ENTRY_TYPE:
255
+ {
256
+ const explorer = this.getExplorer(), DirectoryNameMarkerEntryItem = explorer.getDirectoryNameMarkerEntryItem(), directoryNameMarkerEntryItem = /*#__PURE__*/ React.createElement(DirectoryNameMarkerEntryItem, {
257
+ name: name,
258
+ explorer: explorer
259
+ });
260
+ markerEntryItem = directoryNameMarkerEntryItem; ///
261
+ break;
642
262
  }
643
- var entryItem = this.findEntryItemByTypes.apply(this, [
644
- function(entryItem) {
645
- var entryItemName = entryItem.getName();
646
- if (entryItemName === name) {
647
- return true;
648
- }
649
- }
650
- ].concat(_to_consumable_array(types))) || null;
651
- return entryItem;
652
- }
653
- },
654
- {
655
- key: "findDragEntryItem",
656
- value: function findDragEntryItem(name) {
657
- var entryItem = this.findEntryItemByNameAndTypes(name, _entryTypes.FILE_NAME_DRAG_ENTRY_TYPE, _entryTypes.DIRECTORY_NAME_DRAG_ENTRY_TYPE), dragEntryItem = entryItem; ///
658
- return dragEntryItem;
659
- }
660
- },
661
- {
662
- key: "findDragEntryItems",
663
- value: function findDragEntryItems() {
664
- var entryItems = this.findEntryItemsByTypes(_entryTypes.FILE_NAME_DRAG_ENTRY_TYPE, _entryTypes.DIRECTORY_NAME_DRAG_ENTRY_TYPE), dragEntryItems = entryItems; ///
665
- return dragEntryItems;
666
- }
667
- },
668
- {
669
- key: "findFileNameDragEntryItem",
670
- value: function findFileNameDragEntryItem(fileName) {
671
- var name = fileName, entryItem = this.findEntryItemByNameAndTypes(name, _entryTypes.FILE_NAME_DRAG_ENTRY_TYPE), fileNameDragEntryItem = entryItem; ///
672
- return fileNameDragEntryItem;
673
- }
674
- },
675
- {
676
- key: "findDirectoryNameDragEntryItem",
677
- value: function findDirectoryNameDragEntryItem(directoryName) {
678
- var entryItem = this.findEntryItemByNameAndTypes(directoryName, _entryTypes.DIRECTORY_NAME_DRAG_ENTRY_TYPE), directoryNameDragEntryItem = entryItem; ///
679
- return directoryNameDragEntryItem;
680
- }
681
- },
682
- {
683
- key: "retrieveDragEntryItems",
684
- value: function retrieveDragEntryItems() {
685
- var dragEntryItems = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
686
- this.forEachDirectoryNameDragEntryItem(function(directoryNameDragEntryItem) {
687
- var dragEntryItem = directoryNameDragEntryItem; ///
688
- directoryNameDragEntryItem.retrieveDragEntryItems(dragEntryItems);
689
- dragEntryItems.push(dragEntryItem);
690
- });
691
- this.forEachFileNameDragEntryItem(function(fileNameDragEntryItem) {
692
- var dragEntryItem = fileNameDragEntryItem; ///
693
- dragEntryItems.push(dragEntryItem);
694
- });
695
- return dragEntryItems;
696
- }
697
- },
698
- {
699
- key: "retrieveFileNameDragEntryItems",
700
- value: function retrieveFileNameDragEntryItems() {
701
- var fileNameDragEntryItems = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
702
- this.forEachDragEntryItem(function(dragEntryItem) {
703
- var dragEntryItemDirectoryNameDragEntryItem = dragEntryItem.isDirectoryNameDragEntryItem();
704
- if (dragEntryItemDirectoryNameDragEntryItem) {
705
- var directoryNameDragEntryItem = dragEntryItem; ///
706
- directoryNameDragEntryItem.retrieveFileNameDragEntryItems(fileNameDragEntryItems);
707
- } else {
708
- var fileNameDragEntryItem = dragEntryItem; ///
709
- fileNameDragEntryItems.push(fileNameDragEntryItem);
710
- }
711
- });
712
- return fileNameDragEntryItems;
713
- }
714
- },
715
- {
716
- key: "retrieveDirectoryNameDragEntryItems",
717
- value: function retrieveDirectoryNameDragEntryItems() {
718
- var directoryNameDragEntryItems = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
719
- this.forEachDirectoryNameDragEntryItem(function(directoryNameDragEntryItem) {
720
- directoryNameDragEntryItem.retrieveDirectoryNameDragEntryItems(directoryNameDragEntryItems);
721
- directoryNameDragEntryItems.push(directoryNameDragEntryItem);
722
- });
723
- return directoryNameDragEntryItems;
724
- }
725
- },
726
- {
727
- key: "retrieveMarkerEntryItem",
728
- value: function retrieveMarkerEntryItem() {
729
- var markerEntryItem = getMarkerEntryItem();
730
- return markerEntryItem;
731
- }
732
- },
733
- {
734
- key: "retrieveEditableDragEntryItem",
735
- value: function retrieveEditableDragEntryItem() {
736
- var dragEntryItems = this.retrieveDragEntryItems(), editableDragEntryItem = dragEntryItems.find(function(dragEntryItem) {
737
- var dragEntryItemEditable = dragEntryItem.isEditable();
738
- if (dragEntryItemEditable) {
739
- return true;
740
- }
741
- }) || null;
742
- return editableDragEntryItem;
743
- }
744
- },
745
- {
746
- key: "retrieveSelectedDragEntryItem",
747
- value: function retrieveSelectedDragEntryItem() {
748
- var dragEntryItems = this.retrieveDragEntryItems(), selectedDragEntryItem = dragEntryItems.find(function(dragEntryItem) {
749
- var selected = dragEntryItem.isSelected();
750
- if (selected) {
751
- return true;
752
- }
753
- }) || null;
754
- return selectedDragEntryItem;
755
- }
756
- },
757
- {
758
- key: "retrieveFileNameDragEntryItem",
759
- value: function retrieveFileNameDragEntryItem(filePath) {
760
- var fileNameDragEntryItems = this.retrieveFileNameDragEntryItems(), fileNameDragEntryItem = fileNameDragEntryItems.find(function(fileNameDragEntryItem) {
761
- var fileNameDragEntryItemPath = fileNameDragEntryItem.getPath();
762
- if (fileNameDragEntryItemPath === filePath) {
763
- return true;
764
- }
765
- }) || null; ///
766
- return fileNameDragEntryItem;
767
- }
768
- },
769
- {
770
- key: "retrieveDirectoryNameDragEntryItem",
771
- value: function retrieveDirectoryNameDragEntryItem(directoryPath) {
772
- var directoryNameDragEntryItems = this.retrieveDirectoryNameDragEntryItems(), directoryNameDragEntryItem = directoryNameDragEntryItems.find(function(directoryNameDragEntryItem) {
773
- var directoryNameDragEntryItemPath = directoryNameDragEntryItem.getPath();
774
- if (directoryNameDragEntryItemPath === directoryPath) {
775
- return true;
776
- }
777
- }) || null; ///
778
- return directoryNameDragEntryItem;
779
- }
780
- },
781
- {
782
- key: "collapse",
783
- value: function collapse() {
784
- this.addClass("collapsed");
785
- }
786
- },
787
- {
788
- key: "expand",
789
- value: function expand() {
790
- this.removeClass("collapsed");
263
+ }
264
+ const entryItem = markerEntryItem; ///
265
+ this.addEntryItem(entryItem);
266
+ setMarkerEntryItem(markerEntryItem);
267
+ }
268
+ removeMarkerEntryItem() {
269
+ const markerEntryItem = this.retrieveMarkerEntryItem();
270
+ markerEntryItem.remove();
271
+ resetMarkerEntryItem();
272
+ resetDropElement();
273
+ }
274
+ createFileNameDragEntryItem(fileName, readOnly) {
275
+ const name = fileName, explorer = this.getExplorer(), FileNameDragEntryItem = explorer.getFileNameDragEntryItem(readOnly), fileNameDragEntryItem = /*#__PURE__*/ React.createElement(FileNameDragEntryItem, {
276
+ name: name,
277
+ readOnly: readOnly,
278
+ explorer: explorer
279
+ });
280
+ return fileNameDragEntryItem;
281
+ }
282
+ createDirectoryNameDragEntryItem(directoryName, readOnly, collapsed) {
283
+ const name = directoryName, topmost = this.isTopmost(), explorer = this.getExplorer(), DirectoryNameDragEntryItem = explorer.getDirectoryNameDragEntryItem(readOnly, topmost), directoryNameDragEntryItem = /*#__PURE__*/ React.createElement(DirectoryNameDragEntryItem, {
284
+ name: name,
285
+ explorer: explorer,
286
+ readOnly: readOnly,
287
+ topmost: topmost,
288
+ collapsed: collapsed
289
+ });
290
+ return directoryNameDragEntryItem;
291
+ }
292
+ isFileNameDragEntryItemPresent(fileName) {
293
+ const fileNameDragEntryItem = this.findFileNameDragEntryItem(fileName), fileNameDragEntryItemPresent = fileNameDragEntryItem !== null;
294
+ return fileNameDragEntryItemPresent;
295
+ }
296
+ isDirectoryNameDragEntryItemPresent(directoryName) {
297
+ const directoryNameDragEntryItem = this.findDirectoryNameDragEntryItem(directoryName), directoryNameDragEntryItemPresent = directoryNameDragEntryItem !== null;
298
+ return directoryNameDragEntryItemPresent;
299
+ }
300
+ forEachEntryItemByTypes(callback, ...types) {
301
+ const entryItems = this.getEntryItems();
302
+ entryItems.forEach((entryItem)=>{
303
+ const entryItemType = entryItem.getType(), typesIncludesEntryItemType = types.includes(entryItemType);
304
+ if (typesIncludesEntryItemType) {
305
+ callback(entryItem);
791
306
  }
792
- },
793
- {
794
- key: "didMount",
795
- value: function didMount() {
796
- var topmost = this.isTopmost();
797
- if (topmost) {
798
- this.addClass("topmost");
307
+ });
308
+ }
309
+ forEachDragEntryItem(callback) {
310
+ this.forEachEntryItemByTypes(callback, _entryTypes.FILE_NAME_DRAG_ENTRY_TYPE, _entryTypes.DIRECTORY_NAME_DRAG_ENTRY_TYPE);
311
+ }
312
+ forEachFileNameDragEntryItem(callback) {
313
+ this.forEachEntryItemByTypes(callback, _entryTypes.FILE_NAME_DRAG_ENTRY_TYPE);
314
+ }
315
+ forEachDirectoryNameDragEntryItem(callback) {
316
+ this.forEachEntryItemByTypes(callback, _entryTypes.DIRECTORY_NAME_DRAG_ENTRY_TYPE);
317
+ }
318
+ findEntryItem(callback) {
319
+ const entryItems = this.getEntryItems(), entryItem = entryItems.find(callback) || null; ///
320
+ return entryItem;
321
+ }
322
+ findEntryItemByTypes(callback, ...types) {
323
+ const entryItems = this.getEntryItems(), entryItem = entryItems.find((entryItem)=>{
324
+ const entryItemType = entryItem.getType(), typesIncludesEntryItemType = types.includes(entryItemType);
325
+ if (typesIncludesEntryItemType) {
326
+ const result = callback(entryItem);
327
+ if (result) {
328
+ return true;
799
329
  }
800
330
  }
801
- },
802
- {
803
- key: "willUnmount",
804
- value: function willUnmount() {
805
- ///
331
+ }) || null; ///;
332
+ return entryItem;
333
+ }
334
+ findEntryItemsByTypes(...types) {
335
+ const entryItems = this.getEntryItems();
336
+ filter(entryItems, (entryItem)=>{
337
+ const entryItemType = entryItem.getType(), typesIncludesEntryItemType = types.includes(entryItemType);
338
+ if (typesIncludesEntryItemType) {
339
+ return true;
806
340
  }
807
- },
808
- {
809
- key: "parentContext",
810
- value: function parentContext() {
811
- var expandEntriesList = this.expand.bind(this), collapseEntriesList = this.collapse.bind(this), isEntriesListCollapsed = this.isCollapsed.bind(this), isEmpty = this.isEmpty.bind(this), addMarker = this.addMarker.bind(this), selectPath = this.selectPath.bind(this), addFilePath = this.addFilePath.bind(this), deselectPath = this.deselectPath.bind(this), removeMarker = this.removeMarker.bind(this), addEntryItem = this.addEntryItem.bind(this), removeFilePath = this.removeFilePath.bind(this), removeAllPaths = this.removeAllPaths.bind(this), removeEntryItem = this.removeEntryItem.bind(this), deselectAllPaths = this.deselectAllPaths.bind(this), addDirectoryPath = this.addDirectoryPath.bind(this), removeDirectoryPath = this.removeDirectoryPath.bind(this), forEachDragEntryItem = this.forEachDragEntryItem.bind(this), retrieveDragEntryItems = this.retrieveDragEntryItems.bind(this), retrieveMarkerEntryItem = this.retrieveMarkerEntryItem.bind(this), retrieveSelectedDragEntryItem = this.retrieveSelectedDragEntryItem.bind(this), retrieveEditableDragEntryItem = this.retrieveEditableDragEntryItem.bind(this), retrieveFileNameDragEntryItem = this.retrieveFileNameDragEntryItem.bind(this), retrieveFileNameDragEntryItems = this.retrieveFileNameDragEntryItems.bind(this), retrieveDirectoryNameDragEntryItem = this.retrieveDirectoryNameDragEntryItem.bind(this), retrieveDirectoryNameDragEntryItems = this.retrieveDirectoryNameDragEntryItems.bind(this);
812
- return {
813
- expandEntriesList: expandEntriesList,
814
- collapseEntriesList: collapseEntriesList,
815
- isEntriesListCollapsed: isEntriesListCollapsed,
816
- isEmpty: isEmpty,
817
- addMarker: addMarker,
818
- selectPath: selectPath,
819
- addFilePath: addFilePath,
820
- deselectPath: deselectPath,
821
- removeMarker: removeMarker,
822
- addEntryItem: addEntryItem,
823
- removeFilePath: removeFilePath,
824
- removeAllPaths: removeAllPaths,
825
- removeEntryItem: removeEntryItem,
826
- deselectAllPaths: deselectAllPaths,
827
- addDirectoryPath: addDirectoryPath,
828
- removeDirectoryPath: removeDirectoryPath,
829
- forEachDragEntryItem: forEachDragEntryItem,
830
- retrieveDragEntryItems: retrieveDragEntryItems,
831
- retrieveMarkerEntryItem: retrieveMarkerEntryItem,
832
- retrieveSelectedDragEntryItem: retrieveSelectedDragEntryItem,
833
- retrieveEditableDragEntryItem: retrieveEditableDragEntryItem,
834
- retrieveFileNameDragEntryItem: retrieveFileNameDragEntryItem,
835
- retrieveFileNameDragEntryItems: retrieveFileNameDragEntryItems,
836
- retrieveDirectoryNameDragEntryItem: retrieveDirectoryNameDragEntryItem,
837
- retrieveDirectoryNameDragEntryItems: retrieveDirectoryNameDragEntryItems
838
- };
341
+ });
342
+ return entryItems;
343
+ }
344
+ findEntryItemByNameAndTypes(name, ...types) {
345
+ const entryItem = this.findEntryItemByTypes((entryItem)=>{
346
+ const entryItemName = entryItem.getName();
347
+ if (entryItemName === name) {
348
+ return true;
349
+ }
350
+ }, ...types) || null;
351
+ return entryItem;
352
+ }
353
+ findDragEntryItem(name) {
354
+ const entryItem = this.findEntryItemByNameAndTypes(name, _entryTypes.FILE_NAME_DRAG_ENTRY_TYPE, _entryTypes.DIRECTORY_NAME_DRAG_ENTRY_TYPE), dragEntryItem = entryItem; ///
355
+ return dragEntryItem;
356
+ }
357
+ findDragEntryItems() {
358
+ const entryItems = this.findEntryItemsByTypes(_entryTypes.FILE_NAME_DRAG_ENTRY_TYPE, _entryTypes.DIRECTORY_NAME_DRAG_ENTRY_TYPE), dragEntryItems = entryItems; ///
359
+ return dragEntryItems;
360
+ }
361
+ findFileNameDragEntryItem(fileName) {
362
+ const name = fileName, entryItem = this.findEntryItemByNameAndTypes(name, _entryTypes.FILE_NAME_DRAG_ENTRY_TYPE), fileNameDragEntryItem = entryItem; ///
363
+ return fileNameDragEntryItem;
364
+ }
365
+ findDirectoryNameDragEntryItem(directoryName) {
366
+ const entryItem = this.findEntryItemByNameAndTypes(directoryName, _entryTypes.DIRECTORY_NAME_DRAG_ENTRY_TYPE), directoryNameDragEntryItem = entryItem; ///
367
+ return directoryNameDragEntryItem;
368
+ }
369
+ retrieveDragEntryItems(dragEntryItems = []) {
370
+ this.forEachDirectoryNameDragEntryItem((directoryNameDragEntryItem)=>{
371
+ const dragEntryItem = directoryNameDragEntryItem; ///
372
+ directoryNameDragEntryItem.retrieveDragEntryItems(dragEntryItems);
373
+ dragEntryItems.push(dragEntryItem);
374
+ });
375
+ this.forEachFileNameDragEntryItem((fileNameDragEntryItem)=>{
376
+ const dragEntryItem = fileNameDragEntryItem; ///
377
+ dragEntryItems.push(dragEntryItem);
378
+ });
379
+ return dragEntryItems;
380
+ }
381
+ retrieveFileNameDragEntryItems(fileNameDragEntryItems = []) {
382
+ this.forEachDragEntryItem((dragEntryItem)=>{
383
+ const dragEntryItemDirectoryNameDragEntryItem = dragEntryItem.isDirectoryNameDragEntryItem();
384
+ if (dragEntryItemDirectoryNameDragEntryItem) {
385
+ const directoryNameDragEntryItem = dragEntryItem; ///
386
+ directoryNameDragEntryItem.retrieveFileNameDragEntryItems(fileNameDragEntryItems);
387
+ } else {
388
+ const fileNameDragEntryItem = dragEntryItem; ///
389
+ fileNameDragEntryItems.push(fileNameDragEntryItem);
839
390
  }
391
+ });
392
+ return fileNameDragEntryItems;
393
+ }
394
+ retrieveDirectoryNameDragEntryItems(directoryNameDragEntryItems = []) {
395
+ this.forEachDirectoryNameDragEntryItem((directoryNameDragEntryItem)=>{
396
+ directoryNameDragEntryItem.retrieveDirectoryNameDragEntryItems(directoryNameDragEntryItems);
397
+ directoryNameDragEntryItems.push(directoryNameDragEntryItem);
398
+ });
399
+ return directoryNameDragEntryItems;
400
+ }
401
+ retrieveMarkerEntryItem() {
402
+ const markerEntryItem = getMarkerEntryItem();
403
+ return markerEntryItem;
404
+ }
405
+ retrieveEditableDragEntryItem() {
406
+ const dragEntryItems = this.retrieveDragEntryItems(), editableDragEntryItem = dragEntryItems.find((dragEntryItem)=>{
407
+ const dragEntryItemEditable = dragEntryItem.isEditable();
408
+ if (dragEntryItemEditable) {
409
+ return true;
410
+ }
411
+ }) || null;
412
+ return editableDragEntryItem;
413
+ }
414
+ retrieveSelectedDragEntryItem() {
415
+ const dragEntryItems = this.retrieveDragEntryItems(), selectedDragEntryItem = dragEntryItems.find((dragEntryItem)=>{
416
+ const selected = dragEntryItem.isSelected();
417
+ if (selected) {
418
+ return true;
419
+ }
420
+ }) || null;
421
+ return selectedDragEntryItem;
422
+ }
423
+ retrieveFileNameDragEntryItem(filePath) {
424
+ const fileNameDragEntryItems = this.retrieveFileNameDragEntryItems(), fileNameDragEntryItem = fileNameDragEntryItems.find((fileNameDragEntryItem)=>{
425
+ const fileNameDragEntryItemPath = fileNameDragEntryItem.getPath();
426
+ if (fileNameDragEntryItemPath === filePath) {
427
+ return true;
428
+ }
429
+ }) || null; ///
430
+ return fileNameDragEntryItem;
431
+ }
432
+ retrieveDirectoryNameDragEntryItem(directoryPath) {
433
+ const directoryNameDragEntryItems = this.retrieveDirectoryNameDragEntryItems(), directoryNameDragEntryItem = directoryNameDragEntryItems.find((directoryNameDragEntryItem)=>{
434
+ const directoryNameDragEntryItemPath = directoryNameDragEntryItem.getPath();
435
+ if (directoryNameDragEntryItemPath === directoryPath) {
436
+ return true;
437
+ }
438
+ }) || null; ///
439
+ return directoryNameDragEntryItem;
440
+ }
441
+ collapse() {
442
+ this.addClass("collapsed");
443
+ }
444
+ expand() {
445
+ this.removeClass("collapsed");
446
+ }
447
+ didMount() {
448
+ const topmost = this.isTopmost();
449
+ if (topmost) {
450
+ this.addClass("topmost");
840
451
  }
841
- ]);
842
- return EntriesList;
843
- }(_wrap_native_super(_easy.Element));
844
- _define_property(EntriesList, "tagName", "ul");
845
- _define_property(EntriesList, "ignoredProperties", [
846
- "topmost",
847
- "explorer"
848
- ]);
849
- _define_property(EntriesList, "defaultProperties", {
850
- className: "entries"
851
- });
852
- var _default = (0, _easywithstyle.default)(EntriesList)(_templateObject(), _styles.entriesListPaddingLeft);
452
+ }
453
+ willUnmount() {
454
+ ///
455
+ }
456
+ parentContext() {
457
+ const expandEntriesList = this.expand.bind(this), collapseEntriesList = this.collapse.bind(this), isEntriesListCollapsed = this.isCollapsed.bind(this), isEmpty = this.isEmpty.bind(this), addMarker = this.addMarker.bind(this), selectPath = this.selectPath.bind(this), addFilePath = this.addFilePath.bind(this), deselectPath = this.deselectPath.bind(this), removeMarker = this.removeMarker.bind(this), addEntryItem = this.addEntryItem.bind(this), removeFilePath = this.removeFilePath.bind(this), removeAllPaths = this.removeAllPaths.bind(this), removeEntryItem = this.removeEntryItem.bind(this), deselectAllPaths = this.deselectAllPaths.bind(this), addDirectoryPath = this.addDirectoryPath.bind(this), removeDirectoryPath = this.removeDirectoryPath.bind(this), forEachDragEntryItem = this.forEachDragEntryItem.bind(this), retrieveDragEntryItems = this.retrieveDragEntryItems.bind(this), retrieveMarkerEntryItem = this.retrieveMarkerEntryItem.bind(this), retrieveSelectedDragEntryItem = this.retrieveSelectedDragEntryItem.bind(this), retrieveEditableDragEntryItem = this.retrieveEditableDragEntryItem.bind(this), retrieveFileNameDragEntryItem = this.retrieveFileNameDragEntryItem.bind(this), retrieveFileNameDragEntryItems = this.retrieveFileNameDragEntryItems.bind(this), retrieveDirectoryNameDragEntryItem = this.retrieveDirectoryNameDragEntryItem.bind(this), retrieveDirectoryNameDragEntryItems = this.retrieveDirectoryNameDragEntryItems.bind(this);
458
+ return {
459
+ expandEntriesList,
460
+ collapseEntriesList,
461
+ isEntriesListCollapsed,
462
+ isEmpty,
463
+ addMarker,
464
+ selectPath,
465
+ addFilePath,
466
+ deselectPath,
467
+ removeMarker,
468
+ addEntryItem,
469
+ removeFilePath,
470
+ removeAllPaths,
471
+ removeEntryItem,
472
+ deselectAllPaths,
473
+ addDirectoryPath,
474
+ removeDirectoryPath,
475
+ forEachDragEntryItem,
476
+ retrieveDragEntryItems,
477
+ retrieveMarkerEntryItem,
478
+ retrieveSelectedDragEntryItem,
479
+ retrieveEditableDragEntryItem,
480
+ retrieveFileNameDragEntryItem,
481
+ retrieveFileNameDragEntryItems,
482
+ retrieveDirectoryNameDragEntryItem,
483
+ retrieveDirectoryNameDragEntryItems
484
+ };
485
+ }
486
+ static tagName = "ul";
487
+ static ignoredProperties = [
488
+ "topmost",
489
+ "explorer"
490
+ ];
491
+ static defaultProperties = {
492
+ className: "entries"
493
+ };
494
+ }
495
+ const _default = (0, _easywithstyle.default)(EntriesList)`
496
+
497
+ list-style: none;
498
+ padding-left: ${_styles.entriesListPaddingLeft};
499
+
500
+ .topmost {
501
+ padding-left: 0;
502
+ }
503
+
504
+ .collapsed {
505
+ display: none;
506
+ }
507
+
508
+ `;
853
509
 
854
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saXN0L2VudHJpZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB3aXRoU3R5bGUgZnJvbSBcImVhc3ktd2l0aC1zdHlsZVwiOyAgLy8vXG5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tIFwiZWFzeVwiO1xuaW1wb3J0IHsgcGF0aFV0aWxpdGllcywgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCB7IGVudHJpZXNMaXN0UGFkZGluZ0xlZnQgfSBmcm9tIFwiLi4vc3R5bGVzXCI7XG5pbXBvcnQgeyBGSUxFX05BTUVfRFJBR19FTlRSWV9UWVBFLCBESVJFQ1RPUllfTkFNRV9EUkFHX0VOVFJZX1RZUEUgfSBmcm9tIFwiLi4vZW50cnlUeXBlc1wiO1xuXG5jb25zdCB7IGZpbHRlciB9ID0gYXJyYXlVdGlsaXRpZXMsXG4gICAgICB7IHRvcG1vc3REaXJlY3RvcnlOYW1lRnJvbVBhdGgsIHBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aCB9ID0gcGF0aFV0aWxpdGllcztcblxuZnVuY3Rpb24gZ2V0TWFya2VyRW50cnlJdGVtKCkge1xuICBjb25zdCB7IG1hcmtlckVudHJ5SXRlbSB9ID0gZ2xvYmFsVGhpcztcblxuICByZXR1cm4gbWFya2VyRW50cnlJdGVtO1xufVxuXG5mdW5jdGlvbiBzZXRNYXJrZXJFbnRyeUl0ZW0obWFya2VyRW50cnlJdGVtKSB7XG4gIE9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge1xuICAgIG1hcmtlckVudHJ5SXRlbVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRNYXJrZXJFbnRyeUl0ZW0oKSB7XG4gIGNvbnN0IG1hcmtlckVudHJ5SXRlbSA9IG51bGw7XG5cbiAgc2V0TWFya2VyRW50cnlJdGVtKG1hcmtlckVudHJ5SXRlbSk7XG59XG5cbk9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge1xuICBnZXRNYXJrZXJFbnRyeUl0ZW0sXG4gIHNldE1hcmtlckVudHJ5SXRlbSxcbiAgcmVzZXRNYXJrZXJFbnRyeUl0ZW1cbn0pO1xuXG5yZXNldE1hcmtlckVudHJ5SXRlbSgpO1xuXG5jbGFzcyBFbnRyaWVzTGlzdCBleHRlbmRzIEVsZW1lbnQge1xuICBpc1RvcG1vc3QoKSB7XG4gICAgY29uc3QgeyB0b3Btb3N0ID0gZmFsc2UgfSA9IHRoaXMucHJvcGVydGllcztcblxuICAgIHJldHVybiB0b3Btb3N0O1xuICB9XG5cbiAgZ2V0RXhwbG9yZXIoKSB7XG5cdFx0Y29uc3QgeyBleHBsb3JlciB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuXG5cdFx0cmV0dXJuIGV4cGxvcmVyO1xuXHR9XG5cblx0Z2V0RW50cnlJdGVtcygpIHtcblx0XHRjb25zdCBjaGlsZEVudHJ5SXRlbUVsZW1lbnRzID0gdGhpcy5nZXRDaGlsZEVsZW1lbnRzKFwibGkuZW50cnlcIiksXG5cdFx0XHRcdFx0ZW50cnlJdGVtcyA9IGNoaWxkRW50cnlJdGVtRWxlbWVudHM7ICAvLy9cblxuXHRcdHJldHVybiBlbnRyeUl0ZW1zO1xuXHR9XG5cblx0Z2V0RW50cnlJdGVtc0xlbmd0aCgpIHtcbiAgICBjb25zdCBlbnRyeUl0ZW1zID0gdGhpcy5nZXRFbnRyeUl0ZW1zKCksXG4gICAgICAgICAgZW50cnlJdGVtc0xlbmd0aCA9IGVudHJ5SXRlbXMubGVuZ3RoO1xuXG4gICAgcmV0dXJuIGVudHJ5SXRlbXNMZW5ndGg7XG4gIH1cblxuICBpc0NvbGxhcHNlZCgpIHtcbiAgICBjb25zdCBjb2xsYXBzZWQgPSB0aGlzLmhhc0NsYXNzKFwiY29sbGFwc2VkXCIpO1xuXG4gICAgcmV0dXJuIGNvbGxhcHNlZDtcbiAgfVxuXG4gIGlzRW1wdHkoKSB7XG4gICAgY29uc3QgZW50cnlJdGVtcyA9IHRoaXMuZ2V0RW50cnlJdGVtcygpLFxuICAgICAgICAgIGVudHJ5SXRlbXNMZW5ndGggPSBlbnRyeUl0ZW1zLmxlbmd0aCxcbiAgICAgICAgICBlbXB0eSA9IChlbnRyeUl0ZW1zTGVuZ3RoID09PSAwKTtcblxuICAgIHJldHVybiBlbXB0eTtcbiAgfVxuXG4gIGFkZE1hcmtlcihtYXJrZXJFbnRyeUl0ZW1QYXRoLCBkcmFnRW50cnlJdGVtVHlwZSkge1xuICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lID0gdG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aChtYXJrZXJFbnRyeUl0ZW1QYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgbWFya2VyRW50cnlJdGVtTmFtZSA9IG1hcmtlckVudHJ5SXRlbVBhdGg7ICAvLy9cblxuICAgICAgdGhpcy5hZGRNYXJrZXJFbnRyeUl0ZW0obWFya2VyRW50cnlJdGVtTmFtZSwgZHJhZ0VudHJ5SXRlbVR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gPSB0aGlzLmZpbmREaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSh0b3Btb3N0RGlyZWN0b3J5TmFtZSksXG4gICAgICAgICAgICBtYXJrZXJFbnRyeUl0ZW1QYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lID0gcGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoKG1hcmtlckVudHJ5SXRlbVBhdGgpO1xuXG4gICAgICBtYXJrZXJFbnRyeUl0ZW1QYXRoID0gbWFya2VyRW50cnlJdGVtUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZTsgLy8vXG5cbiAgICAgIHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbS5hZGRNYXJrZXIobWFya2VyRW50cnlJdGVtUGF0aCwgZHJhZ0VudHJ5SXRlbVR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZU1hcmtlcigpIHtcbiAgICB0aGlzLnJlbW92ZU1hcmtlckVudHJ5SXRlbSgpO1xuICB9XG5cbiAgc2VsZWN0UGF0aChwYXRoKSB7XG4gICAgbGV0IGRyYWdFbnRyeUl0ZW0gPSBudWxsO1xuXG4gICAgY29uc3QgdG9wbW9zdERpcmVjdG9yeU5hbWUgPSB0b3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoKHBhdGgpO1xuXG4gICAgaWYgKHRvcG1vc3REaXJlY3RvcnlOYW1lID09PSBudWxsKSB7XG4gICAgICBjb25zdCBuYW1lID0gcGF0aDsgIC8vL1xuXG4gICAgICBkcmFnRW50cnlJdGVtID0gdGhpcy5maW5kRHJhZ0VudHJ5SXRlbShuYW1lKTtcblxuICAgICAgaWYgKGRyYWdFbnRyeUl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgZHJhZ0VudHJ5SXRlbS5zZWxlY3QoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuZmluZERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lKTtcblxuICAgICAgaWYgKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBmaWxlUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSA9IHBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aChwYXRoKTtcblxuICAgICAgICBwYXRoID0gZmlsZVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWU7IC8vL1xuXG4gICAgICAgIHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbS5leHBhbmQoKTtcblxuICAgICAgICBkcmFnRW50cnlJdGVtID0gdG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLnNlbGVjdFBhdGgocGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyYWdFbnRyeUl0ZW07XG4gIH1cblxuICBkZXNlbGVjdFBhdGgocGF0aCkge1xuICAgIGxldCBkcmFnRW50cnlJdGVtID0gbnVsbDtcblxuICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lID0gdG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aChwYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgbmFtZSA9IHBhdGg7ICAvLy9cblxuICAgICAgZHJhZ0VudHJ5SXRlbSA9IHRoaXMuZmluZERyYWdFbnRyeUl0ZW0obmFtZSk7XG5cbiAgICAgIGlmIChkcmFnRW50cnlJdGVtICE9PSBudWxsKSB7XG4gICAgICAgIGRyYWdFbnRyeUl0ZW0uZGVzZWxlY3QoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuZmluZERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lKTtcblxuICAgICAgaWYgKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBmaWxlUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSA9IHBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aChwYXRoKTtcblxuICAgICAgICBwYXRoID0gZmlsZVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWU7IC8vL1xuXG4gICAgICAgIGRyYWdFbnRyeUl0ZW0gPSB0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0uZGVzZWxlY3RQYXRoKHBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkcmFnRW50cnlJdGVtO1xuICB9XG5cbiAgYWRkRmlsZVBhdGgoZmlsZVBhdGgsIHJlYWRPbmx5ID0gZmFsc2UpIHtcblx0XHRsZXQgZmlsZU5hbWVEcmFnRW50cnlJdGVtO1xuXG4gICAgY29uc3QgdG9wbW9zdERpcmVjdG9yeU5hbWUgPSB0b3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoKGZpbGVQYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aDsgIC8vL1xuXG4gICAgICBmaWxlTmFtZURyYWdFbnRyeUl0ZW0gPSB0aGlzLmZpbmRGaWxlTmFtZURyYWdFbnRyeUl0ZW0oZmlsZU5hbWUpO1xuXG4gICAgICBpZiAoZmlsZU5hbWVEcmFnRW50cnlJdGVtID09PSBudWxsKSB7XG4gICAgICAgIGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuY3JlYXRlRmlsZU5hbWVEcmFnRW50cnlJdGVtKGZpbGVOYW1lLCByZWFkT25seSk7XG5cbiAgICAgICAgdGhpcy5hZGRFbnRyeUl0ZW0oZmlsZU5hbWVEcmFnRW50cnlJdGVtKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuZmluZERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lKTtcblxuICAgICAgaWYgKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjb2xsYXBzZWQgPSB0cnVlO1xuXG4gICAgICAgIHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuY3JlYXRlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0odG9wbW9zdERpcmVjdG9yeU5hbWUsIHJlYWRPbmx5LCBjb2xsYXBzZWQpO1xuXG4gICAgICAgIHRoaXMuYWRkRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lID0gcGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoKGZpbGVQYXRoKTtcblxuICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZTsgLy8vXG5cbiAgICAgIGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSA9IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbS5hZGRGaWxlUGF0aChmaWxlUGF0aCwgcmVhZE9ubHkpO1xuICAgIH1cblxuXHRcdHJldHVybiBmaWxlTmFtZURyYWdFbnRyeUl0ZW07XG5cdH1cblxuICByZW1vdmVGaWxlUGF0aChmaWxlUGF0aCwgcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgdG9wbW9zdERpcmVjdG9yeU5hbWUgPSB0b3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoKGZpbGVQYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aCwgIC8vL1xuICAgICAgICAgICAgZmlsZU5hbWVEcmFnRW50cnlJdGVtID0gdGhpcy5maW5kRmlsZU5hbWVEcmFnRW50cnlJdGVtKGZpbGVOYW1lKTtcblxuICAgICAgaWYgKGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5SXRlbShmaWxlTmFtZURyYWdFbnRyeUl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gPSB0aGlzLmZpbmREaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSh0b3Btb3N0RGlyZWN0b3J5TmFtZSk7XG5cbiAgICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWUgPSBwYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lRnJvbVBhdGgoZmlsZVBhdGgpO1xuXG4gICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWU7IC8vL1xuXG4gICAgICAgIHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbS5yZW1vdmVGaWxlUGF0aChmaWxlUGF0aCwgcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3Rvcmllcyk7XG5cbiAgICAgICAgaWYgKHJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXMpIHtcbiAgICAgICAgICBjb25zdCB0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1FbXB0eSA9IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbS5pc0VtcHR5KCk7XG5cbiAgICAgICAgICBpZiAodG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQWxsUGF0aHMoKSB7XG4gICAgdGhpcy5yZW1vdmVFbnRyeUl0ZW1zKCk7XG4gIH1cblxuICBkZXNlbGVjdEFsbFBhdGhzKCkge1xuICAgIGNvbnN0IGRyYWdFbnRyeUl0ZW1zID0gdGhpcy5yZXRyaWV2ZURyYWdFbnRyeUl0ZW1zKCk7XG5cbiAgICBkcmFnRW50cnlJdGVtcy5mb3JFYWNoKChkcmFnRW50cnlJdGVtKSA9PiB7XG4gICAgICBkcmFnRW50cnlJdGVtLmRlc2VsZWN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBhZGREaXJlY3RvcnlQYXRoKGRpcmVjdG9yeVBhdGgsIHJlYWRPbmx5ID0gZmFsc2UsIGNvbGxhcHNlZCA9IHRydWUpIHtcbiAgICBsZXQgZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW07XG5cbiAgICBjb25zdCB0b3Btb3N0RGlyZWN0b3J5TmFtZSA9IHRvcG1vc3REaXJlY3RvcnlOYW1lRnJvbVBhdGgoZGlyZWN0b3J5UGF0aCk7XG5cbiAgICBpZiAodG9wbW9zdERpcmVjdG9yeU5hbWUgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRpcmVjdG9yeU5hbWUgPSBkaXJlY3RvcnlQYXRoOyAgLy8vXG5cbiAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtID0gdGhpcy5maW5kRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oZGlyZWN0b3J5TmFtZSk7XG5cbiAgICAgIGlmIChkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9PT0gbnVsbCkge1xuICAgICAgICBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuY3JlYXRlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oZGlyZWN0b3J5TmFtZSwgcmVhZE9ubHksIGNvbGxhcHNlZCk7XG5cbiAgICAgICAgdGhpcy5hZGRFbnRyeUl0ZW0oZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sbGFwc2VkID9cbiAgICAgICAgICBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbS5jb2xsYXBzZSgpIDpcbiAgICAgICAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLmV4cGFuZCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtID0gdGhpcy5maW5kRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0odG9wbW9zdERpcmVjdG9yeU5hbWUpO1xuXG4gICAgICBpZiAodG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtID09PSBudWxsKSB7XG4gICAgICAgIHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuY3JlYXRlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0odG9wbW9zdERpcmVjdG9yeU5hbWUsIHJlYWRPbmx5LCBjb2xsYXBzZWQpO1xuXG4gICAgICAgIHRoaXMuYWRkRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpcmVjdG9yeVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWUgPSBwYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lRnJvbVBhdGgoZGlyZWN0b3J5UGF0aCk7XG5cbiAgICAgIGRpcmVjdG9yeVBhdGggPSBkaXJlY3RvcnlQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lOyAvLy9cblxuICAgICAgZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gPSB0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0uYWRkRGlyZWN0b3J5UGF0aChkaXJlY3RvcnlQYXRoLCByZWFkT25seSwgY29sbGFwc2VkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW07XG4gIH1cblxuICByZW1vdmVEaXJlY3RvcnlQYXRoKGRpcmVjdG9yeVBhdGgsIHJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lID0gdG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aChkaXJlY3RvcnlQYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgZGlyZWN0b3J5TmFtZSA9IGRpcmVjdG9yeVBhdGgsICAvLy9cbiAgICAgICAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtID0gdGhpcy5maW5kRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oZGlyZWN0b3J5TmFtZSk7XG5cbiAgICAgIGlmIChkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5SXRlbShkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuZmluZERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lKTtcblxuICAgICAgaWYgKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnlQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lID0gcGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoKGRpcmVjdG9yeVBhdGgpO1xuXG4gICAgICAgIGRpcmVjdG9yeVBhdGggPSBkaXJlY3RvcnlQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lOyAvLy9cblxuICAgICAgICB0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0ucmVtb3ZlRGlyZWN0b3J5UGF0aChkaXJlY3RvcnlQYXRoLCByZW1vdmVFbXB0eVBhcmVudERpcmVjdG9yaWVzKTtcblxuICAgICAgICBpZiAocmVtb3ZlRW1wdHlQYXJlbnREaXJlY3Rvcmllcykge1xuICAgICAgICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbUVtcHR5ID0gdG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLmlzRW1wdHkoKTtcblxuICAgICAgICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1FbXB0eSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVFbnRyeUl0ZW0odG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRFbnRyeUl0ZW0oZW50cnlJdGVtKSB7XG4gICAgY29uc3QgbmV4dEVudHJ5SXRlbSA9IGVudHJ5SXRlbSwgIC8vL1xuICAgICAgICAgIHByZXZpb3VzRW50cnlJdGVtID0gdGhpcy5maW5kRW50cnlJdGVtKChlbnRyeUl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRFbnRyeUJlZm9yZUVudHJ5SXRlbSA9IG5leHRFbnRyeUl0ZW0uaXNCZWZvcmUoZW50cnlJdGVtKTtcblxuICAgICAgICAgICAgaWYgKG5leHRFbnRyeUJlZm9yZUVudHJ5SXRlbSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgIGlmIChwcmV2aW91c0VudHJ5SXRlbSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5tb3VudChlbnRyeUl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRyeUl0ZW0ubW91bnRCZWZvcmUocHJldmlvdXNFbnRyeUl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUVudHJ5SXRlbShlbnRyeUl0ZW0pIHtcbiAgICB0aGlzLnVubW91bnQoZW50cnlJdGVtKTtcbiAgfVxuXG4gIHJlbW92ZUVudHJ5SXRlbXMoKSB7XG4gICAgY29uc3QgZW50cnlJdGVtcyA9IHRoaXMuZ2V0RW50cnlJdGVtcygpO1xuXG4gICAgZW50cnlJdGVtcy5mb3JFYWNoKChlbnRyeUl0ZW0pID0+IHtcbiAgICAgIHRoaXMucmVtb3ZlRW50cnlJdGVtKGVudHJ5SXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRNYXJrZXJFbnRyeUl0ZW0obWFya2VyRW50cnlJdGVtTmFtZSwgZHJhZ0VudHJ5SXRlbVR5cGUpIHtcbiAgICBsZXQgbWFya2VyRW50cnlJdGVtO1xuXG4gICAgY29uc3QgbmFtZSA9IG1hcmtlckVudHJ5SXRlbU5hbWUsIC8vL1xuICAgICAgICAgIHR5cGUgPSBkcmFnRW50cnlJdGVtVHlwZTsgIC8vL1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEZJTEVfTkFNRV9EUkFHX0VOVFJZX1RZUEUgOiB7XG4gICAgICAgIGNvbnN0IGV4cGxvcmVyID0gdGhpcy5nZXRFeHBsb3JlcigpLFxuICAgICAgICAgICAgICBGaWxlTmFtZU1hcmtlckVudHJ5SXRlbSA9IGV4cGxvcmVyLmdldEZpbGVOYW1lTWFya2VyRW50cnlJdGVtKCksXG4gICAgICAgICAgICAgIGZpbGVOYW1lTWFya2VyRW50cnlJdGVtID1cblxuICAgICAgICAgICAgICAgIDxGaWxlTmFtZU1hcmtlckVudHJ5SXRlbSBuYW1lPXtuYW1lfSBleHBsb3Jlcj17ZXhwbG9yZXJ9IC8+XG5cbiAgICAgICAgICAgICAgO1xuXG4gICAgICAgIG1hcmtlckVudHJ5SXRlbSA9IGZpbGVOYW1lTWFya2VyRW50cnlJdGVtOyAgLy8vXG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRElSRUNUT1JZX05BTUVfRFJBR19FTlRSWV9UWVBFIDoge1xuICAgICAgICBjb25zdCBleHBsb3JlciA9IHRoaXMuZ2V0RXhwbG9yZXIoKSxcbiAgICAgICAgICAgICAgRGlyZWN0b3J5TmFtZU1hcmtlckVudHJ5SXRlbSA9IGV4cGxvcmVyLmdldERpcmVjdG9yeU5hbWVNYXJrZXJFbnRyeUl0ZW0oKSxcbiAgICAgICAgICAgICAgZGlyZWN0b3J5TmFtZU1hcmtlckVudHJ5SXRlbSA9XG5cbiAgICAgICAgICAgICAgICA8RGlyZWN0b3J5TmFtZU1hcmtlckVudHJ5SXRlbSBuYW1lPXtuYW1lfSBleHBsb3Jlcj17ZXhwbG9yZXJ9IC8+XG5cbiAgICAgICAgICAgICAgO1xuXG4gICAgICAgIG1hcmtlckVudHJ5SXRlbSA9IGRpcmVjdG9yeU5hbWVNYXJrZXJFbnRyeUl0ZW07IC8vL1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5SXRlbSA9IG1hcmtlckVudHJ5SXRlbTsgLy8vXG5cbiAgICB0aGlzLmFkZEVudHJ5SXRlbShlbnRyeUl0ZW0pO1xuXG4gICAgc2V0TWFya2VyRW50cnlJdGVtKG1hcmtlckVudHJ5SXRlbSk7XG4gIH1cblxuICByZW1vdmVNYXJrZXJFbnRyeUl0ZW0oKSB7XG4gICAgY29uc3QgbWFya2VyRW50cnlJdGVtID0gdGhpcy5yZXRyaWV2ZU1hcmtlckVudHJ5SXRlbSgpO1xuXG4gICAgbWFya2VyRW50cnlJdGVtLnJlbW92ZSgpO1xuXG4gICAgcmVzZXRNYXJrZXJFbnRyeUl0ZW0oKTtcblxuICAgIHJlc2V0RHJvcEVsZW1lbnQoKTtcbiAgfVxuXG4gIGNyZWF0ZUZpbGVOYW1lRHJhZ0VudHJ5SXRlbShmaWxlTmFtZSwgcmVhZE9ubHkpIHtcblx0XHRjb25zdCBuYW1lID0gZmlsZU5hbWUsXHQvLy9cblx0XHRcdFx0XHRleHBsb3JlciA9IHRoaXMuZ2V0RXhwbG9yZXIoKSxcblx0XHRcdFx0XHRGaWxlTmFtZURyYWdFbnRyeUl0ZW0gPSBleHBsb3Jlci5nZXRGaWxlTmFtZURyYWdFbnRyeUl0ZW0ocmVhZE9ubHkpLFxuXHRcdFx0XHRcdGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSA9XG5cblx0XHRcdFx0XHRcdDxGaWxlTmFtZURyYWdFbnRyeUl0ZW0gbmFtZT17bmFtZX0gcmVhZE9ubHk9e3JlYWRPbmx5fSBleHBsb3Jlcj17ZXhwbG9yZXJ9IC8+XG5cblx0XHRcdFx0XHQ7XG5cblx0XHRyZXR1cm4gZmlsZU5hbWVEcmFnRW50cnlJdGVtO1xuXHR9XG5cblx0Y3JlYXRlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oZGlyZWN0b3J5TmFtZSwgcmVhZE9ubHksIGNvbGxhcHNlZCkge1xuXHRcdGNvbnN0IG5hbWUgPSBkaXJlY3RvcnlOYW1lLFx0Ly8vXG4gICAgICAgICAgdG9wbW9zdCA9IHRoaXMuaXNUb3Btb3N0KCksXG5cdFx0XHRcdFx0ZXhwbG9yZXIgPSB0aGlzLmdldEV4cGxvcmVyKCksXG5cdFx0XHRcdFx0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gPSBleHBsb3Jlci5nZXREaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbShyZWFkT25seSwgdG9wbW9zdCksXG5cdFx0XHRcdFx0ZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gPVxuXG5cdFx0XHRcdFx0XHQ8RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gbmFtZT17bmFtZX0gZXhwbG9yZXI9e2V4cGxvcmVyfSByZWFkT25seT17cmVhZE9ubHl9IHRvcG1vc3Q9e3RvcG1vc3R9IGNvbGxhcHNlZD17Y29sbGFwc2VkfSAvPlxuXG5cdFx0XHRcdFx0O1xuXG5cdFx0cmV0dXJuIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtO1xuXHR9XG5cblx0aXNGaWxlTmFtZURyYWdFbnRyeUl0ZW1QcmVzZW50KGZpbGVOYW1lKSB7XG5cdFx0Y29uc3QgZmlsZU5hbWVEcmFnRW50cnlJdGVtID0gdGhpcy5maW5kRmlsZU5hbWVEcmFnRW50cnlJdGVtKGZpbGVOYW1lKSxcblx0XHRcdFx0XHRmaWxlTmFtZURyYWdFbnRyeUl0ZW1QcmVzZW50ID0gKGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCk7XG5cblx0XHRyZXR1cm4gZmlsZU5hbWVEcmFnRW50cnlJdGVtUHJlc2VudDtcblx0fVxuXG5cdGlzRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1QcmVzZW50KGRpcmVjdG9yeU5hbWUpIHtcblx0XHRjb25zdCBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuZmluZERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKGRpcmVjdG9yeU5hbWUpLFxuXHRcdFx0XHRcdGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtUHJlc2VudCA9IChkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCk7XG5cblx0XHRyZXR1cm4gZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1QcmVzZW50O1xuXHR9XG5cbiAgZm9yRWFjaEVudHJ5SXRlbUJ5VHlwZXMoY2FsbGJhY2ssIC4uLnR5cGVzKSB7XG4gICAgY29uc3QgZW50cnlJdGVtcyA9IHRoaXMuZ2V0RW50cnlJdGVtcygpO1xuXG4gICAgZW50cnlJdGVtcy5mb3JFYWNoKChlbnRyeUl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5SXRlbVR5cGUgPSBlbnRyeUl0ZW0uZ2V0VHlwZSgpLFxuICAgICAgICAgIHR5cGVzSW5jbHVkZXNFbnRyeUl0ZW1UeXBlID0gdHlwZXMuaW5jbHVkZXMoZW50cnlJdGVtVHlwZSk7XG5cbiAgICAgIGlmICh0eXBlc0luY2x1ZGVzRW50cnlJdGVtVHlwZSkge1xuICAgICAgICBjYWxsYmFjayhlbnRyeUl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yRWFjaERyYWdFbnRyeUl0ZW0oY2FsbGJhY2spIHsgdGhpcy5mb3JFYWNoRW50cnlJdGVtQnlUeXBlcyhjYWxsYmFjaywgRklMRV9OQU1FX0RSQUdfRU5UUllfVFlQRSwgRElSRUNUT1JZX05BTUVfRFJBR19FTlRSWV9UWVBFKTsgfVxuXG4gIGZvckVhY2hGaWxlTmFtZURyYWdFbnRyeUl0ZW0oY2FsbGJhY2spIHsgdGhpcy5mb3JFYWNoRW50cnlJdGVtQnlUeXBlcyhjYWxsYmFjaywgRklMRV9OQU1FX0RSQUdfRU5UUllfVFlQRSk7IH1cblxuICBmb3JFYWNoRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oY2FsbGJhY2spIHsgdGhpcy5mb3JFYWNoRW50cnlJdGVtQnlUeXBlcyhjYWxsYmFjaywgRElSRUNUT1JZX05BTUVfRFJBR19FTlRSWV9UWVBFKTsgfVxuXG4gIGZpbmRFbnRyeUl0ZW0oY2FsbGJhY2spIHtcbiAgICBjb25zdCBlbnRyeUl0ZW1zID0gdGhpcy5nZXRFbnRyeUl0ZW1zKCksXG4gICAgICAgICAgZW50cnlJdGVtID0gZW50cnlJdGVtcy5maW5kKGNhbGxiYWNrKSB8fCBudWxsOyAvLy9cblxuICAgIHJldHVybiBlbnRyeUl0ZW07XG4gIH1cblxuICBmaW5kRW50cnlJdGVtQnlUeXBlcyhjYWxsYmFjaywgLi4udHlwZXMpIHtcbiAgICBjb25zdCBlbnRyeUl0ZW1zID0gdGhpcy5nZXRFbnRyeUl0ZW1zKCksXG4gICAgICAgICAgZW50cnlJdGVtID0gZW50cnlJdGVtcy5maW5kKChlbnRyeUl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5SXRlbVR5cGUgPSBlbnRyeUl0ZW0uZ2V0VHlwZSgpLFxuICAgICAgICAgICAgICAgIHR5cGVzSW5jbHVkZXNFbnRyeUl0ZW1UeXBlID0gdHlwZXMuaW5jbHVkZXMoZW50cnlJdGVtVHlwZSk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlc0luY2x1ZGVzRW50cnlJdGVtVHlwZSkge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjayhlbnRyeUl0ZW0pO1xuXG4gICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7IC8vLztcblxuICAgIHJldHVybiBlbnRyeUl0ZW07XG4gIH1cblxuICBmaW5kRW50cnlJdGVtc0J5VHlwZXMoLi4udHlwZXMpIHtcbiAgICBjb25zdCBlbnRyeUl0ZW1zID0gdGhpcy5nZXRFbnRyeUl0ZW1zKCk7XG5cbiAgICBmaWx0ZXIoZW50cnlJdGVtcywgKGVudHJ5SXRlbSkgPT4ge1xuICAgICAgY29uc3QgZW50cnlJdGVtVHlwZSA9IGVudHJ5SXRlbS5nZXRUeXBlKCksXG4gICAgICAgICAgICB0eXBlc0luY2x1ZGVzRW50cnlJdGVtVHlwZSA9IHR5cGVzLmluY2x1ZGVzKGVudHJ5SXRlbVR5cGUpO1xuXG4gICAgICBpZiAodHlwZXNJbmNsdWRlc0VudHJ5SXRlbVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW50cnlJdGVtcztcbiAgfVxuXG4gIGZpbmRFbnRyeUl0ZW1CeU5hbWVBbmRUeXBlcyhuYW1lLCAuLi50eXBlcykge1xuICAgIGNvbnN0IGVudHJ5SXRlbSA9IHRoaXMuZmluZEVudHJ5SXRlbUJ5VHlwZXMoKGVudHJ5SXRlbSkgPT4ge1xuICAgICAgY29uc3QgZW50cnlJdGVtTmFtZSA9IGVudHJ5SXRlbS5nZXROYW1lKCk7XG5cbiAgICAgIGlmIChlbnRyeUl0ZW1OYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0sIC4uLnR5cGVzKSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGVudHJ5SXRlbTtcbiAgfVxuXG4gIGZpbmREcmFnRW50cnlJdGVtKG5hbWUpIHtcbiAgICBjb25zdCBlbnRyeUl0ZW0gPSB0aGlzLmZpbmRFbnRyeUl0ZW1CeU5hbWVBbmRUeXBlcyhuYW1lLCBGSUxFX05BTUVfRFJBR19FTlRSWV9UWVBFLCBESVJFQ1RPUllfTkFNRV9EUkFHX0VOVFJZX1RZUEUpLFxuICAgICAgICAgIGRyYWdFbnRyeUl0ZW0gPSBlbnRyeUl0ZW07ICAvLy9cblxuICAgIHJldHVybiBkcmFnRW50cnlJdGVtO1xuICB9XG5cbiAgZmluZERyYWdFbnRyeUl0ZW1zKCkge1xuICAgIGNvbnN0IGVudHJ5SXRlbXMgPSB0aGlzLmZpbmRFbnRyeUl0ZW1zQnlUeXBlcyhGSUxFX05BTUVfRFJBR19FTlRSWV9UWVBFLCBESVJFQ1RPUllfTkFNRV9EUkFHX0VOVFJZX1RZUEUpLFxuICAgICAgICAgIGRyYWdFbnRyeUl0ZW1zID0gZW50cnlJdGVtczsgIC8vL1xuXG4gICAgcmV0dXJuIGRyYWdFbnRyeUl0ZW1zO1xuICB9XG5cbiAgZmluZEZpbGVOYW1lRHJhZ0VudHJ5SXRlbShmaWxlTmFtZSkge1xuICAgIGNvbnN0IG5hbWUgPSBmaWxlTmFtZSwgIC8vL1xuICAgICAgICAgIGVudHJ5SXRlbSA9IHRoaXMuZmluZEVudHJ5SXRlbUJ5TmFtZUFuZFR5cGVzKG5hbWUsIEZJTEVfTkFNRV9EUkFHX0VOVFJZX1RZUEUpLFxuICAgICAgICAgIGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSA9IGVudHJ5SXRlbTsgIC8vL1xuXG4gICAgcmV0dXJuIGZpbGVOYW1lRHJhZ0VudHJ5SXRlbTtcbiAgfVxuXG4gIGZpbmREaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbShkaXJlY3RvcnlOYW1lKSB7XG4gICAgY29uc3QgZW50cnlJdGVtID0gdGhpcy5maW5kRW50cnlJdGVtQnlOYW1lQW5kVHlwZXMoZGlyZWN0b3J5TmFtZSwgRElSRUNUT1JZX05BTUVfRFJBR19FTlRSWV9UWVBFKSxcbiAgICAgICAgICBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IGVudHJ5SXRlbTsgLy8vXG5cbiAgICByZXR1cm4gZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW07XG4gIH1cblxuICByZXRyaWV2ZURyYWdFbnRyeUl0ZW1zKGRyYWdFbnRyeUl0ZW1zID0gW10pIHtcbiAgICB0aGlzLmZvckVhY2hEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSgoZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGRyYWdFbnRyeUl0ZW0gPSBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbTsgLy8vXG5cbiAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLnJldHJpZXZlRHJhZ0VudHJ5SXRlbXMoZHJhZ0VudHJ5SXRlbXMpO1xuXG4gICAgICBkcmFnRW50cnlJdGVtcy5wdXNoKGRyYWdFbnRyeUl0ZW0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JFYWNoRmlsZU5hbWVEcmFnRW50cnlJdGVtKChmaWxlTmFtZURyYWdFbnRyeUl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGRyYWdFbnRyeUl0ZW0gPSBmaWxlTmFtZURyYWdFbnRyeUl0ZW07ICAvLy9cblxuICAgICAgZHJhZ0VudHJ5SXRlbXMucHVzaChkcmFnRW50cnlJdGVtKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkcmFnRW50cnlJdGVtcztcbiAgfVxuXG4gIHJldHJpZXZlRmlsZU5hbWVEcmFnRW50cnlJdGVtcyhmaWxlTmFtZURyYWdFbnRyeUl0ZW1zID0gW10pIHtcbiAgICB0aGlzLmZvckVhY2hEcmFnRW50cnlJdGVtKChkcmFnRW50cnlJdGVtKSA9PiB7XG4gICAgICBjb25zdCBkcmFnRW50cnlJdGVtRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gPSBkcmFnRW50cnlJdGVtLmlzRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oKTtcblxuICAgICAgaWYgKGRyYWdFbnRyeUl0ZW1EaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSkge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IGRyYWdFbnRyeUl0ZW07IC8vL1xuXG4gICAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLnJldHJpZXZlRmlsZU5hbWVEcmFnRW50cnlJdGVtcyhmaWxlTmFtZURyYWdFbnRyeUl0ZW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSA9IGRyYWdFbnRyeUl0ZW07ICAvLy9cblxuICAgICAgICBmaWxlTmFtZURyYWdFbnRyeUl0ZW1zLnB1c2goZmlsZU5hbWVEcmFnRW50cnlJdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmaWxlTmFtZURyYWdFbnRyeUl0ZW1zO1xuICB9XG5cbiAgcmV0cmlldmVEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbXMoZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1zID0gW10pIHtcbiAgICB0aGlzLmZvckVhY2hEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSgoZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0pID0+IHtcbiAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLnJldHJpZXZlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1zKGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtcyk7XG5cbiAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtcy5wdXNoKGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbXM7XG4gIH1cblxuICByZXRyaWV2ZU1hcmtlckVudHJ5SXRlbSgpIHtcbiAgICBjb25zdCBtYXJrZXJFbnRyeUl0ZW0gPSBnZXRNYXJrZXJFbnRyeUl0ZW0oKTtcblxuICAgIHJldHVybiBtYXJrZXJFbnRyeUl0ZW07XG4gIH1cblxuICByZXRyaWV2ZUVkaXRhYmxlRHJhZ0VudHJ5SXRlbSgpIHtcbiAgICBjb25zdCBkcmFnRW50cnlJdGVtcyA9IHRoaXMucmV0cmlldmVEcmFnRW50cnlJdGVtcygpLFxuICAgICAgICAgIGVkaXRhYmxlRHJhZ0VudHJ5SXRlbSA9IGRyYWdFbnRyeUl0ZW1zLmZpbmQoKGRyYWdFbnRyeUl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRyYWdFbnRyeUl0ZW1FZGl0YWJsZSA9IGRyYWdFbnRyeUl0ZW0uaXNFZGl0YWJsZSgpO1xuXG4gICAgICAgICAgICBpZiAoZHJhZ0VudHJ5SXRlbUVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gZWRpdGFibGVEcmFnRW50cnlJdGVtO1xuICB9XG5cbiAgcmV0cmlldmVTZWxlY3RlZERyYWdFbnRyeUl0ZW0oKSB7XG4gICAgY29uc3QgZHJhZ0VudHJ5SXRlbXMgPSB0aGlzLnJldHJpZXZlRHJhZ0VudHJ5SXRlbXMoKSxcbiAgICAgICAgICBzZWxlY3RlZERyYWdFbnRyeUl0ZW0gPSBkcmFnRW50cnlJdGVtcy5maW5kKChkcmFnRW50cnlJdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGRyYWdFbnRyeUl0ZW0uaXNTZWxlY3RlZCgpO1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBzZWxlY3RlZERyYWdFbnRyeUl0ZW07XG4gIH1cblxuICByZXRyaWV2ZUZpbGVOYW1lRHJhZ0VudHJ5SXRlbShmaWxlUGF0aCkge1xuICAgIGNvbnN0IGZpbGVOYW1lRHJhZ0VudHJ5SXRlbXMgPSB0aGlzLnJldHJpZXZlRmlsZU5hbWVEcmFnRW50cnlJdGVtcygpLFxuICAgICAgICAgIGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSA9IGZpbGVOYW1lRHJhZ0VudHJ5SXRlbXMuZmluZCgoZmlsZU5hbWVEcmFnRW50cnlJdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZURyYWdFbnRyeUl0ZW1QYXRoID0gZmlsZU5hbWVEcmFnRW50cnlJdGVtLmdldFBhdGgoKTtcblxuICAgICAgICAgICAgaWYgKGZpbGVOYW1lRHJhZ0VudHJ5SXRlbVBhdGggPT09IGZpbGVQYXRoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7IC8vL1xuXG4gICAgcmV0dXJuIGZpbGVOYW1lRHJhZ0VudHJ5SXRlbTtcbiAgfVxuXG4gIHJldHJpZXZlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oZGlyZWN0b3J5UGF0aCkge1xuICAgIGNvbnN0IGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtcyA9IHRoaXMucmV0cmlldmVEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbXMoKSxcbiAgICAgICAgICBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtcy5maW5kKChkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1QYXRoID0gZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0uZ2V0UGF0aCgpO1xuXG4gICAgICAgICAgICBpZiAoZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1QYXRoID09PSBkaXJlY3RvcnlQYXRoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7IC8vL1xuXG4gICAgcmV0dXJuIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtO1xuICB9XG5cbiAgY29sbGFwc2UoKSB7XG5cdCAgdGhpcy5hZGRDbGFzcyhcImNvbGxhcHNlZFwiKTtcbiAgfVxuXG5cdGV4cGFuZCgpIHtcblx0ICB0aGlzLnJlbW92ZUNsYXNzKFwiY29sbGFwc2VkXCIpO1xuICB9XG5cbiAgZGlkTW91bnQoKSB7XG4gICAgY29uc3QgdG9wbW9zdCA9IHRoaXMuaXNUb3Btb3N0KCk7XG5cbiAgICBpZiAodG9wbW9zdCkge1xuICAgICAgdGhpcy5hZGRDbGFzcyhcInRvcG1vc3RcIik7XG4gICAgfVxuICB9XG5cbiAgd2lsbFVubW91bnQoKSB7XG4gICAgLy8vXG4gIH1cblxuICBwYXJlbnRDb250ZXh0KCkge1xuXHRcdGNvbnN0IGV4cGFuZEVudHJpZXNMaXN0ID0gdGhpcy5leHBhbmQuYmluZCh0aGlzKSwgIC8vL1xuICAgICAgICAgIGNvbGxhcHNlRW50cmllc0xpc3QgPSB0aGlzLmNvbGxhcHNlLmJpbmQodGhpcyksICAvLy9cbiAgICAgICAgICBpc0VudHJpZXNMaXN0Q29sbGFwc2VkID0gdGhpcy5pc0NvbGxhcHNlZC5iaW5kKHRoaXMpLCAvLy9cbiAgICAgICAgICBpc0VtcHR5ID0gdGhpcy5pc0VtcHR5LmJpbmQodGhpcyksXG4gICAgICAgICAgYWRkTWFya2VyID0gdGhpcy5hZGRNYXJrZXIuYmluZCh0aGlzKSxcbiAgICAgICAgICBzZWxlY3RQYXRoID0gdGhpcy5zZWxlY3RQYXRoLmJpbmQodGhpcyksXG4gICAgICAgICAgYWRkRmlsZVBhdGggPSB0aGlzLmFkZEZpbGVQYXRoLmJpbmQodGhpcyksXG4gICAgICAgICAgZGVzZWxlY3RQYXRoID0gdGhpcy5kZXNlbGVjdFBhdGguYmluZCh0aGlzKSxcbiAgICAgICAgICByZW1vdmVNYXJrZXIgPSB0aGlzLnJlbW92ZU1hcmtlci5iaW5kKHRoaXMpLFxuICAgICAgICAgIGFkZEVudHJ5SXRlbSA9IHRoaXMuYWRkRW50cnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgICAgcmVtb3ZlRmlsZVBhdGggPSB0aGlzLnJlbW92ZUZpbGVQYXRoLmJpbmQodGhpcyksXG4gICAgICAgICAgcmVtb3ZlQWxsUGF0aHMgPSB0aGlzLnJlbW92ZUFsbFBhdGhzLmJpbmQodGhpcyksXG4gICAgICAgICAgcmVtb3ZlRW50cnlJdGVtID0gdGhpcy5yZW1vdmVFbnRyeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgICBkZXNlbGVjdEFsbFBhdGhzID0gdGhpcy5kZXNlbGVjdEFsbFBhdGhzLmJpbmQodGhpcyksXG4gICAgICAgICAgYWRkRGlyZWN0b3J5UGF0aCA9IHRoaXMuYWRkRGlyZWN0b3J5UGF0aC5iaW5kKHRoaXMpLFxuICAgICAgICAgIHJlbW92ZURpcmVjdG9yeVBhdGggPSB0aGlzLnJlbW92ZURpcmVjdG9yeVBhdGguYmluZCh0aGlzKSxcbiAgICAgICAgICBmb3JFYWNoRHJhZ0VudHJ5SXRlbSA9IHRoaXMuZm9yRWFjaERyYWdFbnRyeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgICByZXRyaWV2ZURyYWdFbnRyeUl0ZW1zID0gdGhpcy5yZXRyaWV2ZURyYWdFbnRyeUl0ZW1zLmJpbmQodGhpcyksXG4gICAgICAgICAgcmV0cmlldmVNYXJrZXJFbnRyeUl0ZW0gPSB0aGlzLnJldHJpZXZlTWFya2VyRW50cnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgICAgcmV0cmlldmVTZWxlY3RlZERyYWdFbnRyeUl0ZW0gPSB0aGlzLnJldHJpZXZlU2VsZWN0ZWREcmFnRW50cnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgICAgcmV0cmlldmVFZGl0YWJsZURyYWdFbnRyeUl0ZW0gPSB0aGlzLnJldHJpZXZlRWRpdGFibGVEcmFnRW50cnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgICAgcmV0cmlldmVGaWxlTmFtZURyYWdFbnRyeUl0ZW0gPSB0aGlzLnJldHJpZXZlRmlsZU5hbWVEcmFnRW50cnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgICAgcmV0cmlldmVGaWxlTmFtZURyYWdFbnRyeUl0ZW1zID0gdGhpcy5yZXRyaWV2ZUZpbGVOYW1lRHJhZ0VudHJ5SXRlbXMuYmluZCh0aGlzKSxcbiAgICAgICAgICByZXRyaWV2ZURpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtID0gdGhpcy5yZXRyaWV2ZURpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgICAgcmV0cmlldmVEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbXMgPSB0aGlzLnJldHJpZXZlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1zLmJpbmQodGhpcyk7XG5cblx0XHRyZXR1cm4gKHtcbiAgICAgIGV4cGFuZEVudHJpZXNMaXN0LFxuICAgICAgY29sbGFwc2VFbnRyaWVzTGlzdCxcbiAgICAgIGlzRW50cmllc0xpc3RDb2xsYXBzZWQsXG4gICAgICBpc0VtcHR5LFxuICAgICAgYWRkTWFya2VyLFxuICAgICAgc2VsZWN0UGF0aCxcblx0XHRcdGFkZEZpbGVQYXRoLFxuICAgICAgZGVzZWxlY3RQYXRoLFxuICAgICAgcmVtb3ZlTWFya2VyLFxuICAgICAgYWRkRW50cnlJdGVtLFxuICAgICAgcmVtb3ZlRmlsZVBhdGgsXG4gICAgICByZW1vdmVBbGxQYXRocyxcbiAgICAgIHJlbW92ZUVudHJ5SXRlbSxcbiAgICAgIGRlc2VsZWN0QWxsUGF0aHMsXG4gICAgICBhZGREaXJlY3RvcnlQYXRoLFxuICAgICAgcmVtb3ZlRGlyZWN0b3J5UGF0aCxcbiAgICAgIGZvckVhY2hEcmFnRW50cnlJdGVtLFxuICAgICAgcmV0cmlldmVEcmFnRW50cnlJdGVtcyxcbiAgICAgIHJldHJpZXZlTWFya2VyRW50cnlJdGVtLFxuICAgICAgcmV0cmlldmVTZWxlY3RlZERyYWdFbnRyeUl0ZW0sXG4gICAgICByZXRyaWV2ZUVkaXRhYmxlRHJhZ0VudHJ5SXRlbSxcbiAgICAgIHJldHJpZXZlRmlsZU5hbWVEcmFnRW50cnlJdGVtLFxuICAgICAgcmV0cmlldmVGaWxlTmFtZURyYWdFbnRyeUl0ZW1zLFxuICAgICAgcmV0cmlldmVEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSxcbiAgICAgIHJldHJpZXZlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1zXG5cdFx0fSk7XG5cdH1cblxuXHRzdGF0aWMgdGFnTmFtZSA9IFwidWxcIjtcblxuICBzdGF0aWMgaWdub3JlZFByb3BlcnRpZXMgPSBbXG4gICAgXCJ0b3Btb3N0XCIsXG4gICAgXCJleHBsb3JlclwiXG4gIF07XG5cbiAgc3RhdGljIGRlZmF1bHRQcm9wZXJ0aWVzID0ge1xuICAgIGNsYXNzTmFtZTogXCJlbnRyaWVzXCJcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlKEVudHJpZXNMaXN0KWBcblxuICBsaXN0LXN0eWxlOiBub25lO1xuICBwYWRkaW5nLWxlZnQ6ICR7ZW50cmllc0xpc3RQYWRkaW5nTGVmdH07XG4gIFxuICAudG9wbW9zdCB7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICB9XG4gIFxuICAuY29sbGFwc2VkIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4gICAgICBcbmA7XG4iXSwibmFtZXMiOlsiZmlsdGVyIiwiYXJyYXlVdGlsaXRpZXMiLCJ0b3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoIiwicGF0aFV0aWxpdGllcyIsInBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aCIsImdldE1hcmtlckVudHJ5SXRlbSIsIm1hcmtlckVudHJ5SXRlbSIsImdsb2JhbFRoaXMiLCJzZXRNYXJrZXJFbnRyeUl0ZW0iLCJPYmplY3QiLCJhc3NpZ24iLCJyZXNldE1hcmtlckVudHJ5SXRlbSIsIkVudHJpZXNMaXN0IiwiaXNUb3Btb3N0IiwicHJvcGVydGllcyIsInRvcG1vc3QiLCJnZXRFeHBsb3JlciIsImV4cGxvcmVyIiwiZ2V0RW50cnlJdGVtcyIsImNoaWxkRW50cnlJdGVtRWxlbWVudHMiLCJnZXRDaGlsZEVsZW1lbnRzIiwiZW50cnlJdGVtcyIsImdldEVudHJ5SXRlbXNMZW5ndGgiLCJlbnRyeUl0ZW1zTGVuZ3RoIiwibGVuZ3RoIiwiaXNDb2xsYXBzZWQiLCJjb2xsYXBzZWQiLCJoYXNDbGFzcyIsImlzRW1wdHkiLCJlbXB0eSIsImFkZE1hcmtlciIsIm1hcmtlckVudHJ5SXRlbVBhdGgiLCJkcmFnRW50cnlJdGVtVHlwZSIsInRvcG1vc3REaXJlY3RvcnlOYW1lIiwibWFya2VyRW50cnlJdGVtTmFtZSIsImFkZE1hcmtlckVudHJ5SXRlbSIsInRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSIsImZpbmREaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSIsIm1hcmtlckVudHJ5SXRlbVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWUiLCJyZW1vdmVNYXJrZXIiLCJyZW1vdmVNYXJrZXJFbnRyeUl0ZW0iLCJzZWxlY3RQYXRoIiwicGF0aCIsImRyYWdFbnRyeUl0ZW0iLCJuYW1lIiwiZmluZERyYWdFbnRyeUl0ZW0iLCJzZWxlY3QiLCJmaWxlUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSIsImV4cGFuZCIsImRlc2VsZWN0UGF0aCIsImRlc2VsZWN0IiwiYWRkRmlsZVBhdGgiLCJmaWxlUGF0aCIsInJlYWRPbmx5IiwiZmlsZU5hbWVEcmFnRW50cnlJdGVtIiwiZmlsZU5hbWUiLCJmaW5kRmlsZU5hbWVEcmFnRW50cnlJdGVtIiwiY3JlYXRlRmlsZU5hbWVEcmFnRW50cnlJdGVtIiwiYWRkRW50cnlJdGVtIiwiY3JlYXRlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0iLCJyZW1vdmVGaWxlUGF0aCIsInJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXMiLCJyZW1vdmVFbnRyeUl0ZW0iLCJ0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1FbXB0eSIsInJlbW92ZUFsbFBhdGhzIiwicmVtb3ZlRW50cnlJdGVtcyIsImRlc2VsZWN0QWxsUGF0aHMiLCJkcmFnRW50cnlJdGVtcyIsInJldHJpZXZlRHJhZ0VudHJ5SXRlbXMiLCJmb3JFYWNoIiwiYWRkRGlyZWN0b3J5UGF0aCIsImRpcmVjdG9yeVBhdGgiLCJkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSIsImRpcmVjdG9yeU5hbWUiLCJjb2xsYXBzZSIsImRpcmVjdG9yeVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWUiLCJyZW1vdmVEaXJlY3RvcnlQYXRoIiwiZW50cnlJdGVtIiwibmV4dEVudHJ5SXRlbSIsInByZXZpb3VzRW50cnlJdGVtIiwiZmluZEVudHJ5SXRlbSIsIm5leHRFbnRyeUJlZm9yZUVudHJ5SXRlbSIsImlzQmVmb3JlIiwibW91bnQiLCJtb3VudEJlZm9yZSIsInVubW91bnQiLCJ0eXBlIiwiRklMRV9OQU1FX0RSQUdfRU5UUllfVFlQRSIsIkZpbGVOYW1lTWFya2VyRW50cnlJdGVtIiwiZ2V0RmlsZU5hbWVNYXJrZXJFbnRyeUl0ZW0iLCJmaWxlTmFtZU1hcmtlckVudHJ5SXRlbSIsIkRJUkVDVE9SWV9OQU1FX0RSQUdfRU5UUllfVFlQRSIsIkRpcmVjdG9yeU5hbWVNYXJrZXJFbnRyeUl0ZW0iLCJnZXREaXJlY3RvcnlOYW1lTWFya2VyRW50cnlJdGVtIiwiZGlyZWN0b3J5TmFtZU1hcmtlckVudHJ5SXRlbSIsInJldHJpZXZlTWFya2VyRW50cnlJdGVtIiwicmVtb3ZlIiwicmVzZXREcm9wRWxlbWVudCIsIkZpbGVOYW1lRHJhZ0VudHJ5SXRlbSIsImdldEZpbGVOYW1lRHJhZ0VudHJ5SXRlbSIsIkRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtIiwiZ2V0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0iLCJpc0ZpbGVOYW1lRHJhZ0VudHJ5SXRlbVByZXNlbnQiLCJmaWxlTmFtZURyYWdFbnRyeUl0ZW1QcmVzZW50IiwiaXNEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbVByZXNlbnQiLCJkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbVByZXNlbnQiLCJmb3JFYWNoRW50cnlJdGVtQnlUeXBlcyIsImNhbGxiYWNrIiwidHlwZXMiLCJlbnRyeUl0ZW1UeXBlIiwiZ2V0VHlwZSIsInR5cGVzSW5jbHVkZXNFbnRyeUl0ZW1UeXBlIiwiaW5jbHVkZXMiLCJmb3JFYWNoRHJhZ0VudHJ5SXRlbSIsImZvckVhY2hGaWxlTmFtZURyYWdFbnRyeUl0ZW0iLCJmb3JFYWNoRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0iLCJmaW5kIiwiZmluZEVudHJ5SXRlbUJ5VHlwZXMiLCJyZXN1bHQiLCJmaW5kRW50cnlJdGVtc0J5VHlwZXMiLCJmaW5kRW50cnlJdGVtQnlOYW1lQW5kVHlwZXMiLCJlbnRyeUl0ZW1OYW1lIiwiZ2V0TmFtZSIsImZpbmREcmFnRW50cnlJdGVtcyIsInB1c2giLCJyZXRyaWV2ZUZpbGVOYW1lRHJhZ0VudHJ5SXRlbXMiLCJmaWxlTmFtZURyYWdFbnRyeUl0ZW1zIiwiZHJhZ0VudHJ5SXRlbURpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtIiwiaXNEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSIsInJldHJpZXZlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1zIiwiZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1zIiwicmV0cmlldmVFZGl0YWJsZURyYWdFbnRyeUl0ZW0iLCJlZGl0YWJsZURyYWdFbnRyeUl0ZW0iLCJkcmFnRW50cnlJdGVtRWRpdGFibGUiLCJpc0VkaXRhYmxlIiwicmV0cmlldmVTZWxlY3RlZERyYWdFbnRyeUl0ZW0iLCJzZWxlY3RlZERyYWdFbnRyeUl0ZW0iLCJzZWxlY3RlZCIsImlzU2VsZWN0ZWQiLCJyZXRyaWV2ZUZpbGVOYW1lRHJhZ0VudHJ5SXRlbSIsImZpbGVOYW1lRHJhZ0VudHJ5SXRlbVBhdGgiLCJnZXRQYXRoIiwicmV0cmlldmVEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSIsImRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtUGF0aCIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJkaWRNb3VudCIsIndpbGxVbm1vdW50IiwicGFyZW50Q29udGV4dCIsImV4cGFuZEVudHJpZXNMaXN0IiwiYmluZCIsImNvbGxhcHNlRW50cmllc0xpc3QiLCJpc0VudHJpZXNMaXN0Q29sbGFwc2VkIiwiRWxlbWVudCIsInRhZ05hbWUiLCJpZ25vcmVkUHJvcGVydGllcyIsImRlZmF1bHRQcm9wZXJ0aWVzIiwiY2xhc3NOYW1lIiwid2l0aFN0eWxlIiwiZW50cmllc0xpc3RQYWRkaW5nTGVmdCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBa3RCQTs7O2VBQUE7OztvRUFodEJzQjtvQkFFRTt5QkFDc0I7c0JBRVA7MEJBQ21DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFMUUsSUFBTSxBQUFFQSxTQUFXQyx5QkFBYyxDQUF6QkQsUUFDQUUsK0JBQTBFQyx3QkFBYSxDQUF2RkQsOEJBQThCRSwwQ0FBNENELHdCQUFhLENBQXpEQztBQUV0QyxTQUFTQztJQUNQLElBQU0sQUFBRUMsa0JBQW9CQyxXQUFwQkQ7SUFFUixPQUFPQTtBQUNUO0FBRUEsU0FBU0UsbUJBQW1CRixlQUFlO0lBQ3pDRyxPQUFPQyxNQUFNLENBQUNILFlBQVk7UUFDeEJELGlCQUFBQTtJQUNGO0FBQ0Y7QUFFQSxTQUFTSztJQUNQLElBQU1MLGtCQUFrQjtJQUV4QkUsbUJBQW1CRjtBQUNyQjtBQUVBRyxPQUFPQyxNQUFNLENBQUNILFlBQVk7SUFDeEJGLG9CQUFBQTtJQUNBRyxvQkFBQUE7SUFDQUcsc0JBQUFBO0FBQ0Y7QUFFQUE7QUFFQSxJQUFBLEFBQU1DLDRCQUFOO2NBQU1BO2FBQUFBO2dDQUFBQTtRQUFOLE9BQUEsa0JBQU1BOztrQkFBQUE7O1lBQ0pDLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxJQUE0QixtQkFBQSxJQUFJLENBQUNDLFVBQVUsNkJBQWYsaUJBQXBCQyxTQUFBQSxnREFBVTtnQkFFbEIsT0FBT0E7WUFDVDs7O1lBRUFDLEtBQUFBO21C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
510
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saXN0L2VudHJpZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB3aXRoU3R5bGUgZnJvbSBcImVhc3ktd2l0aC1zdHlsZVwiOyAgLy8vXG5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tIFwiZWFzeVwiO1xuaW1wb3J0IHsgcGF0aFV0aWxpdGllcywgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCB7IGVudHJpZXNMaXN0UGFkZGluZ0xlZnQgfSBmcm9tIFwiLi4vc3R5bGVzXCI7XG5pbXBvcnQgeyBGSUxFX05BTUVfRFJBR19FTlRSWV9UWVBFLCBESVJFQ1RPUllfTkFNRV9EUkFHX0VOVFJZX1RZUEUgfSBmcm9tIFwiLi4vZW50cnlUeXBlc1wiO1xuXG5jb25zdCB7IGZpbHRlciB9ID0gYXJyYXlVdGlsaXRpZXMsXG4gICAgICB7IHRvcG1vc3REaXJlY3RvcnlOYW1lRnJvbVBhdGgsIHBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aCB9ID0gcGF0aFV0aWxpdGllcztcblxuZnVuY3Rpb24gZ2V0TWFya2VyRW50cnlJdGVtKCkge1xuICBjb25zdCB7IG1hcmtlckVudHJ5SXRlbSB9ID0gZ2xvYmFsVGhpcztcblxuICByZXR1cm4gbWFya2VyRW50cnlJdGVtO1xufVxuXG5mdW5jdGlvbiBzZXRNYXJrZXJFbnRyeUl0ZW0obWFya2VyRW50cnlJdGVtKSB7XG4gIE9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge1xuICAgIG1hcmtlckVudHJ5SXRlbVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRNYXJrZXJFbnRyeUl0ZW0oKSB7XG4gIGNvbnN0IG1hcmtlckVudHJ5SXRlbSA9IG51bGw7XG5cbiAgc2V0TWFya2VyRW50cnlJdGVtKG1hcmtlckVudHJ5SXRlbSk7XG59XG5cbk9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge1xuICBnZXRNYXJrZXJFbnRyeUl0ZW0sXG4gIHNldE1hcmtlckVudHJ5SXRlbSxcbiAgcmVzZXRNYXJrZXJFbnRyeUl0ZW1cbn0pO1xuXG5yZXNldE1hcmtlckVudHJ5SXRlbSgpO1xuXG5jbGFzcyBFbnRyaWVzTGlzdCBleHRlbmRzIEVsZW1lbnQge1xuICBpc1RvcG1vc3QoKSB7XG4gICAgY29uc3QgeyB0b3Btb3N0ID0gZmFsc2UgfSA9IHRoaXMucHJvcGVydGllcztcblxuICAgIHJldHVybiB0b3Btb3N0O1xuICB9XG5cbiAgZ2V0RXhwbG9yZXIoKSB7XG5cdFx0Y29uc3QgeyBleHBsb3JlciB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuXG5cdFx0cmV0dXJuIGV4cGxvcmVyO1xuXHR9XG5cblx0Z2V0RW50cnlJdGVtcygpIHtcblx0XHRjb25zdCBjaGlsZEVudHJ5SXRlbUVsZW1lbnRzID0gdGhpcy5nZXRDaGlsZEVsZW1lbnRzKFwibGkuZW50cnlcIiksXG5cdFx0XHRcdFx0ZW50cnlJdGVtcyA9IGNoaWxkRW50cnlJdGVtRWxlbWVudHM7ICAvLy9cblxuXHRcdHJldHVybiBlbnRyeUl0ZW1zO1xuXHR9XG5cblx0Z2V0RW50cnlJdGVtc0xlbmd0aCgpIHtcbiAgICBjb25zdCBlbnRyeUl0ZW1zID0gdGhpcy5nZXRFbnRyeUl0ZW1zKCksXG4gICAgICAgICAgZW50cnlJdGVtc0xlbmd0aCA9IGVudHJ5SXRlbXMubGVuZ3RoO1xuXG4gICAgcmV0dXJuIGVudHJ5SXRlbXNMZW5ndGg7XG4gIH1cblxuICBpc0NvbGxhcHNlZCgpIHtcbiAgICBjb25zdCBjb2xsYXBzZWQgPSB0aGlzLmhhc0NsYXNzKFwiY29sbGFwc2VkXCIpO1xuXG4gICAgcmV0dXJuIGNvbGxhcHNlZDtcbiAgfVxuXG4gIGlzRW1wdHkoKSB7XG4gICAgY29uc3QgZW50cnlJdGVtcyA9IHRoaXMuZ2V0RW50cnlJdGVtcygpLFxuICAgICAgICAgIGVudHJ5SXRlbXNMZW5ndGggPSBlbnRyeUl0ZW1zLmxlbmd0aCxcbiAgICAgICAgICBlbXB0eSA9IChlbnRyeUl0ZW1zTGVuZ3RoID09PSAwKTtcblxuICAgIHJldHVybiBlbXB0eTtcbiAgfVxuXG4gIGFkZE1hcmtlcihtYXJrZXJFbnRyeUl0ZW1QYXRoLCBkcmFnRW50cnlJdGVtVHlwZSkge1xuICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lID0gdG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aChtYXJrZXJFbnRyeUl0ZW1QYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgbWFya2VyRW50cnlJdGVtTmFtZSA9IG1hcmtlckVudHJ5SXRlbVBhdGg7ICAvLy9cblxuICAgICAgdGhpcy5hZGRNYXJrZXJFbnRyeUl0ZW0obWFya2VyRW50cnlJdGVtTmFtZSwgZHJhZ0VudHJ5SXRlbVR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gPSB0aGlzLmZpbmREaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSh0b3Btb3N0RGlyZWN0b3J5TmFtZSksXG4gICAgICAgICAgICBtYXJrZXJFbnRyeUl0ZW1QYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lID0gcGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoKG1hcmtlckVudHJ5SXRlbVBhdGgpO1xuXG4gICAgICBtYXJrZXJFbnRyeUl0ZW1QYXRoID0gbWFya2VyRW50cnlJdGVtUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZTsgLy8vXG5cbiAgICAgIHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbS5hZGRNYXJrZXIobWFya2VyRW50cnlJdGVtUGF0aCwgZHJhZ0VudHJ5SXRlbVR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZU1hcmtlcigpIHtcbiAgICB0aGlzLnJlbW92ZU1hcmtlckVudHJ5SXRlbSgpO1xuICB9XG5cbiAgc2VsZWN0UGF0aChwYXRoKSB7XG4gICAgbGV0IGRyYWdFbnRyeUl0ZW0gPSBudWxsO1xuXG4gICAgY29uc3QgdG9wbW9zdERpcmVjdG9yeU5hbWUgPSB0b3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoKHBhdGgpO1xuXG4gICAgaWYgKHRvcG1vc3REaXJlY3RvcnlOYW1lID09PSBudWxsKSB7XG4gICAgICBjb25zdCBuYW1lID0gcGF0aDsgIC8vL1xuXG4gICAgICBkcmFnRW50cnlJdGVtID0gdGhpcy5maW5kRHJhZ0VudHJ5SXRlbShuYW1lKTtcblxuICAgICAgaWYgKGRyYWdFbnRyeUl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgZHJhZ0VudHJ5SXRlbS5zZWxlY3QoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuZmluZERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lKTtcblxuICAgICAgaWYgKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBmaWxlUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSA9IHBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aChwYXRoKTtcblxuICAgICAgICBwYXRoID0gZmlsZVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWU7IC8vL1xuXG4gICAgICAgIHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbS5leHBhbmQoKTtcblxuICAgICAgICBkcmFnRW50cnlJdGVtID0gdG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLnNlbGVjdFBhdGgocGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyYWdFbnRyeUl0ZW07XG4gIH1cblxuICBkZXNlbGVjdFBhdGgocGF0aCkge1xuICAgIGxldCBkcmFnRW50cnlJdGVtID0gbnVsbDtcblxuICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lID0gdG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aChwYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgbmFtZSA9IHBhdGg7ICAvLy9cblxuICAgICAgZHJhZ0VudHJ5SXRlbSA9IHRoaXMuZmluZERyYWdFbnRyeUl0ZW0obmFtZSk7XG5cbiAgICAgIGlmIChkcmFnRW50cnlJdGVtICE9PSBudWxsKSB7XG4gICAgICAgIGRyYWdFbnRyeUl0ZW0uZGVzZWxlY3QoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuZmluZERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lKTtcblxuICAgICAgaWYgKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBmaWxlUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSA9IHBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aChwYXRoKTtcblxuICAgICAgICBwYXRoID0gZmlsZVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWU7IC8vL1xuXG4gICAgICAgIGRyYWdFbnRyeUl0ZW0gPSB0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0uZGVzZWxlY3RQYXRoKHBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkcmFnRW50cnlJdGVtO1xuICB9XG5cbiAgYWRkRmlsZVBhdGgoZmlsZVBhdGgsIHJlYWRPbmx5ID0gZmFsc2UpIHtcblx0XHRsZXQgZmlsZU5hbWVEcmFnRW50cnlJdGVtO1xuXG4gICAgY29uc3QgdG9wbW9zdERpcmVjdG9yeU5hbWUgPSB0b3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoKGZpbGVQYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aDsgIC8vL1xuXG4gICAgICBmaWxlTmFtZURyYWdFbnRyeUl0ZW0gPSB0aGlzLmZpbmRGaWxlTmFtZURyYWdFbnRyeUl0ZW0oZmlsZU5hbWUpO1xuXG4gICAgICBpZiAoZmlsZU5hbWVEcmFnRW50cnlJdGVtID09PSBudWxsKSB7XG4gICAgICAgIGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuY3JlYXRlRmlsZU5hbWVEcmFnRW50cnlJdGVtKGZpbGVOYW1lLCByZWFkT25seSk7XG5cbiAgICAgICAgdGhpcy5hZGRFbnRyeUl0ZW0oZmlsZU5hbWVEcmFnRW50cnlJdGVtKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuZmluZERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lKTtcblxuICAgICAgaWYgKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjb2xsYXBzZWQgPSB0cnVlO1xuXG4gICAgICAgIHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuY3JlYXRlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0odG9wbW9zdERpcmVjdG9yeU5hbWUsIHJlYWRPbmx5LCBjb2xsYXBzZWQpO1xuXG4gICAgICAgIHRoaXMuYWRkRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lID0gcGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoKGZpbGVQYXRoKTtcblxuICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZTsgLy8vXG5cbiAgICAgIGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSA9IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbS5hZGRGaWxlUGF0aChmaWxlUGF0aCwgcmVhZE9ubHkpO1xuICAgIH1cblxuXHRcdHJldHVybiBmaWxlTmFtZURyYWdFbnRyeUl0ZW07XG5cdH1cblxuICByZW1vdmVGaWxlUGF0aChmaWxlUGF0aCwgcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgdG9wbW9zdERpcmVjdG9yeU5hbWUgPSB0b3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoKGZpbGVQYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aCwgIC8vL1xuICAgICAgICAgICAgZmlsZU5hbWVEcmFnRW50cnlJdGVtID0gdGhpcy5maW5kRmlsZU5hbWVEcmFnRW50cnlJdGVtKGZpbGVOYW1lKTtcblxuICAgICAgaWYgKGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5SXRlbShmaWxlTmFtZURyYWdFbnRyeUl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gPSB0aGlzLmZpbmREaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSh0b3Btb3N0RGlyZWN0b3J5TmFtZSk7XG5cbiAgICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWUgPSBwYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lRnJvbVBhdGgoZmlsZVBhdGgpO1xuXG4gICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWU7IC8vL1xuXG4gICAgICAgIHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbS5yZW1vdmVGaWxlUGF0aChmaWxlUGF0aCwgcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3Rvcmllcyk7XG5cbiAgICAgICAgaWYgKHJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXMpIHtcbiAgICAgICAgICBjb25zdCB0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1FbXB0eSA9IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbS5pc0VtcHR5KCk7XG5cbiAgICAgICAgICBpZiAodG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQWxsUGF0aHMoKSB7XG4gICAgdGhpcy5yZW1vdmVFbnRyeUl0ZW1zKCk7XG4gIH1cblxuICBkZXNlbGVjdEFsbFBhdGhzKCkge1xuICAgIGNvbnN0IGRyYWdFbnRyeUl0ZW1zID0gdGhpcy5yZXRyaWV2ZURyYWdFbnRyeUl0ZW1zKCk7XG5cbiAgICBkcmFnRW50cnlJdGVtcy5mb3JFYWNoKChkcmFnRW50cnlJdGVtKSA9PiB7XG4gICAgICBkcmFnRW50cnlJdGVtLmRlc2VsZWN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBhZGREaXJlY3RvcnlQYXRoKGRpcmVjdG9yeVBhdGgsIHJlYWRPbmx5ID0gZmFsc2UsIGNvbGxhcHNlZCA9IHRydWUpIHtcbiAgICBsZXQgZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW07XG5cbiAgICBjb25zdCB0b3Btb3N0RGlyZWN0b3J5TmFtZSA9IHRvcG1vc3REaXJlY3RvcnlOYW1lRnJvbVBhdGgoZGlyZWN0b3J5UGF0aCk7XG5cbiAgICBpZiAodG9wbW9zdERpcmVjdG9yeU5hbWUgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRpcmVjdG9yeU5hbWUgPSBkaXJlY3RvcnlQYXRoOyAgLy8vXG5cbiAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtID0gdGhpcy5maW5kRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oZGlyZWN0b3J5TmFtZSk7XG5cbiAgICAgIGlmIChkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9PT0gbnVsbCkge1xuICAgICAgICBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuY3JlYXRlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oZGlyZWN0b3J5TmFtZSwgcmVhZE9ubHksIGNvbGxhcHNlZCk7XG5cbiAgICAgICAgdGhpcy5hZGRFbnRyeUl0ZW0oZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sbGFwc2VkID9cbiAgICAgICAgICBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbS5jb2xsYXBzZSgpIDpcbiAgICAgICAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLmV4cGFuZCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtID0gdGhpcy5maW5kRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0odG9wbW9zdERpcmVjdG9yeU5hbWUpO1xuXG4gICAgICBpZiAodG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtID09PSBudWxsKSB7XG4gICAgICAgIHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuY3JlYXRlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0odG9wbW9zdERpcmVjdG9yeU5hbWUsIHJlYWRPbmx5LCBjb2xsYXBzZWQpO1xuXG4gICAgICAgIHRoaXMuYWRkRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpcmVjdG9yeVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWUgPSBwYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lRnJvbVBhdGgoZGlyZWN0b3J5UGF0aCk7XG5cbiAgICAgIGRpcmVjdG9yeVBhdGggPSBkaXJlY3RvcnlQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lOyAvLy9cblxuICAgICAgZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gPSB0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0uYWRkRGlyZWN0b3J5UGF0aChkaXJlY3RvcnlQYXRoLCByZWFkT25seSwgY29sbGFwc2VkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW07XG4gIH1cblxuICByZW1vdmVEaXJlY3RvcnlQYXRoKGRpcmVjdG9yeVBhdGgsIHJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lID0gdG9wbW9zdERpcmVjdG9yeU5hbWVGcm9tUGF0aChkaXJlY3RvcnlQYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgZGlyZWN0b3J5TmFtZSA9IGRpcmVjdG9yeVBhdGgsICAvLy9cbiAgICAgICAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtID0gdGhpcy5maW5kRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oZGlyZWN0b3J5TmFtZSk7XG5cbiAgICAgIGlmIChkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5SXRlbShkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuZmluZERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKHRvcG1vc3REaXJlY3RvcnlOYW1lKTtcblxuICAgICAgaWYgKHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnlQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lID0gcGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoKGRpcmVjdG9yeVBhdGgpO1xuXG4gICAgICAgIGRpcmVjdG9yeVBhdGggPSBkaXJlY3RvcnlQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lOyAvLy9cblxuICAgICAgICB0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0ucmVtb3ZlRGlyZWN0b3J5UGF0aChkaXJlY3RvcnlQYXRoLCByZW1vdmVFbXB0eVBhcmVudERpcmVjdG9yaWVzKTtcblxuICAgICAgICBpZiAocmVtb3ZlRW1wdHlQYXJlbnREaXJlY3Rvcmllcykge1xuICAgICAgICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbUVtcHR5ID0gdG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLmlzRW1wdHkoKTtcblxuICAgICAgICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1FbXB0eSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVFbnRyeUl0ZW0odG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRFbnRyeUl0ZW0oZW50cnlJdGVtKSB7XG4gICAgY29uc3QgbmV4dEVudHJ5SXRlbSA9IGVudHJ5SXRlbSwgIC8vL1xuICAgICAgICAgIHByZXZpb3VzRW50cnlJdGVtID0gdGhpcy5maW5kRW50cnlJdGVtKChlbnRyeUl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRFbnRyeUJlZm9yZUVudHJ5SXRlbSA9IG5leHRFbnRyeUl0ZW0uaXNCZWZvcmUoZW50cnlJdGVtKTtcblxuICAgICAgICAgICAgaWYgKG5leHRFbnRyeUJlZm9yZUVudHJ5SXRlbSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgIGlmIChwcmV2aW91c0VudHJ5SXRlbSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5tb3VudChlbnRyeUl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRyeUl0ZW0ubW91bnRCZWZvcmUocHJldmlvdXNFbnRyeUl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUVudHJ5SXRlbShlbnRyeUl0ZW0pIHtcbiAgICB0aGlzLnVubW91bnQoZW50cnlJdGVtKTtcbiAgfVxuXG4gIHJlbW92ZUVudHJ5SXRlbXMoKSB7XG4gICAgY29uc3QgZW50cnlJdGVtcyA9IHRoaXMuZ2V0RW50cnlJdGVtcygpO1xuXG4gICAgZW50cnlJdGVtcy5mb3JFYWNoKChlbnRyeUl0ZW0pID0+IHtcbiAgICAgIHRoaXMucmVtb3ZlRW50cnlJdGVtKGVudHJ5SXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRNYXJrZXJFbnRyeUl0ZW0obWFya2VyRW50cnlJdGVtTmFtZSwgZHJhZ0VudHJ5SXRlbVR5cGUpIHtcbiAgICBsZXQgbWFya2VyRW50cnlJdGVtO1xuXG4gICAgY29uc3QgbmFtZSA9IG1hcmtlckVudHJ5SXRlbU5hbWUsIC8vL1xuICAgICAgICAgIHR5cGUgPSBkcmFnRW50cnlJdGVtVHlwZTsgIC8vL1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEZJTEVfTkFNRV9EUkFHX0VOVFJZX1RZUEUgOiB7XG4gICAgICAgIGNvbnN0IGV4cGxvcmVyID0gdGhpcy5nZXRFeHBsb3JlcigpLFxuICAgICAgICAgICAgICBGaWxlTmFtZU1hcmtlckVudHJ5SXRlbSA9IGV4cGxvcmVyLmdldEZpbGVOYW1lTWFya2VyRW50cnlJdGVtKCksXG4gICAgICAgICAgICAgIGZpbGVOYW1lTWFya2VyRW50cnlJdGVtID1cblxuICAgICAgICAgICAgICAgIDxGaWxlTmFtZU1hcmtlckVudHJ5SXRlbSBuYW1lPXtuYW1lfSBleHBsb3Jlcj17ZXhwbG9yZXJ9IC8+XG5cbiAgICAgICAgICAgICAgO1xuXG4gICAgICAgIG1hcmtlckVudHJ5SXRlbSA9IGZpbGVOYW1lTWFya2VyRW50cnlJdGVtOyAgLy8vXG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRElSRUNUT1JZX05BTUVfRFJBR19FTlRSWV9UWVBFIDoge1xuICAgICAgICBjb25zdCBleHBsb3JlciA9IHRoaXMuZ2V0RXhwbG9yZXIoKSxcbiAgICAgICAgICAgICAgRGlyZWN0b3J5TmFtZU1hcmtlckVudHJ5SXRlbSA9IGV4cGxvcmVyLmdldERpcmVjdG9yeU5hbWVNYXJrZXJFbnRyeUl0ZW0oKSxcbiAgICAgICAgICAgICAgZGlyZWN0b3J5TmFtZU1hcmtlckVudHJ5SXRlbSA9XG5cbiAgICAgICAgICAgICAgICA8RGlyZWN0b3J5TmFtZU1hcmtlckVudHJ5SXRlbSBuYW1lPXtuYW1lfSBleHBsb3Jlcj17ZXhwbG9yZXJ9IC8+XG5cbiAgICAgICAgICAgICAgO1xuXG4gICAgICAgIG1hcmtlckVudHJ5SXRlbSA9IGRpcmVjdG9yeU5hbWVNYXJrZXJFbnRyeUl0ZW07IC8vL1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5SXRlbSA9IG1hcmtlckVudHJ5SXRlbTsgLy8vXG5cbiAgICB0aGlzLmFkZEVudHJ5SXRlbShlbnRyeUl0ZW0pO1xuXG4gICAgc2V0TWFya2VyRW50cnlJdGVtKG1hcmtlckVudHJ5SXRlbSk7XG4gIH1cblxuICByZW1vdmVNYXJrZXJFbnRyeUl0ZW0oKSB7XG4gICAgY29uc3QgbWFya2VyRW50cnlJdGVtID0gdGhpcy5yZXRyaWV2ZU1hcmtlckVudHJ5SXRlbSgpO1xuXG4gICAgbWFya2VyRW50cnlJdGVtLnJlbW92ZSgpO1xuXG4gICAgcmVzZXRNYXJrZXJFbnRyeUl0ZW0oKTtcblxuICAgIHJlc2V0RHJvcEVsZW1lbnQoKTtcbiAgfVxuXG4gIGNyZWF0ZUZpbGVOYW1lRHJhZ0VudHJ5SXRlbShmaWxlTmFtZSwgcmVhZE9ubHkpIHtcblx0XHRjb25zdCBuYW1lID0gZmlsZU5hbWUsXHQvLy9cblx0XHRcdFx0XHRleHBsb3JlciA9IHRoaXMuZ2V0RXhwbG9yZXIoKSxcblx0XHRcdFx0XHRGaWxlTmFtZURyYWdFbnRyeUl0ZW0gPSBleHBsb3Jlci5nZXRGaWxlTmFtZURyYWdFbnRyeUl0ZW0ocmVhZE9ubHkpLFxuXHRcdFx0XHRcdGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSA9XG5cblx0XHRcdFx0XHRcdDxGaWxlTmFtZURyYWdFbnRyeUl0ZW0gbmFtZT17bmFtZX0gcmVhZE9ubHk9e3JlYWRPbmx5fSBleHBsb3Jlcj17ZXhwbG9yZXJ9IC8+XG5cblx0XHRcdFx0XHQ7XG5cblx0XHRyZXR1cm4gZmlsZU5hbWVEcmFnRW50cnlJdGVtO1xuXHR9XG5cblx0Y3JlYXRlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oZGlyZWN0b3J5TmFtZSwgcmVhZE9ubHksIGNvbGxhcHNlZCkge1xuXHRcdGNvbnN0IG5hbWUgPSBkaXJlY3RvcnlOYW1lLFx0Ly8vXG4gICAgICAgICAgdG9wbW9zdCA9IHRoaXMuaXNUb3Btb3N0KCksXG5cdFx0XHRcdFx0ZXhwbG9yZXIgPSB0aGlzLmdldEV4cGxvcmVyKCksXG5cdFx0XHRcdFx0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gPSBleHBsb3Jlci5nZXREaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbShyZWFkT25seSwgdG9wbW9zdCksXG5cdFx0XHRcdFx0ZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gPVxuXG5cdFx0XHRcdFx0XHQ8RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gbmFtZT17bmFtZX0gZXhwbG9yZXI9e2V4cGxvcmVyfSByZWFkT25seT17cmVhZE9ubHl9IHRvcG1vc3Q9e3RvcG1vc3R9IGNvbGxhcHNlZD17Y29sbGFwc2VkfSAvPlxuXG5cdFx0XHRcdFx0O1xuXG5cdFx0cmV0dXJuIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtO1xuXHR9XG5cblx0aXNGaWxlTmFtZURyYWdFbnRyeUl0ZW1QcmVzZW50KGZpbGVOYW1lKSB7XG5cdFx0Y29uc3QgZmlsZU5hbWVEcmFnRW50cnlJdGVtID0gdGhpcy5maW5kRmlsZU5hbWVEcmFnRW50cnlJdGVtKGZpbGVOYW1lKSxcblx0XHRcdFx0XHRmaWxlTmFtZURyYWdFbnRyeUl0ZW1QcmVzZW50ID0gKGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCk7XG5cblx0XHRyZXR1cm4gZmlsZU5hbWVEcmFnRW50cnlJdGVtUHJlc2VudDtcblx0fVxuXG5cdGlzRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1QcmVzZW50KGRpcmVjdG9yeU5hbWUpIHtcblx0XHRjb25zdCBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IHRoaXMuZmluZERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKGRpcmVjdG9yeU5hbWUpLFxuXHRcdFx0XHRcdGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtUHJlc2VudCA9IChkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSAhPT0gbnVsbCk7XG5cblx0XHRyZXR1cm4gZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1QcmVzZW50O1xuXHR9XG5cbiAgZm9yRWFjaEVudHJ5SXRlbUJ5VHlwZXMoY2FsbGJhY2ssIC4uLnR5cGVzKSB7XG4gICAgY29uc3QgZW50cnlJdGVtcyA9IHRoaXMuZ2V0RW50cnlJdGVtcygpO1xuXG4gICAgZW50cnlJdGVtcy5mb3JFYWNoKChlbnRyeUl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5SXRlbVR5cGUgPSBlbnRyeUl0ZW0uZ2V0VHlwZSgpLFxuICAgICAgICAgIHR5cGVzSW5jbHVkZXNFbnRyeUl0ZW1UeXBlID0gdHlwZXMuaW5jbHVkZXMoZW50cnlJdGVtVHlwZSk7XG5cbiAgICAgIGlmICh0eXBlc0luY2x1ZGVzRW50cnlJdGVtVHlwZSkge1xuICAgICAgICBjYWxsYmFjayhlbnRyeUl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yRWFjaERyYWdFbnRyeUl0ZW0oY2FsbGJhY2spIHsgdGhpcy5mb3JFYWNoRW50cnlJdGVtQnlUeXBlcyhjYWxsYmFjaywgRklMRV9OQU1FX0RSQUdfRU5UUllfVFlQRSwgRElSRUNUT1JZX05BTUVfRFJBR19FTlRSWV9UWVBFKTsgfVxuXG4gIGZvckVhY2hGaWxlTmFtZURyYWdFbnRyeUl0ZW0oY2FsbGJhY2spIHsgdGhpcy5mb3JFYWNoRW50cnlJdGVtQnlUeXBlcyhjYWxsYmFjaywgRklMRV9OQU1FX0RSQUdfRU5UUllfVFlQRSk7IH1cblxuICBmb3JFYWNoRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oY2FsbGJhY2spIHsgdGhpcy5mb3JFYWNoRW50cnlJdGVtQnlUeXBlcyhjYWxsYmFjaywgRElSRUNUT1JZX05BTUVfRFJBR19FTlRSWV9UWVBFKTsgfVxuXG4gIGZpbmRFbnRyeUl0ZW0oY2FsbGJhY2spIHtcbiAgICBjb25zdCBlbnRyeUl0ZW1zID0gdGhpcy5nZXRFbnRyeUl0ZW1zKCksXG4gICAgICAgICAgZW50cnlJdGVtID0gZW50cnlJdGVtcy5maW5kKGNhbGxiYWNrKSB8fCBudWxsOyAvLy9cblxuICAgIHJldHVybiBlbnRyeUl0ZW07XG4gIH1cblxuICBmaW5kRW50cnlJdGVtQnlUeXBlcyhjYWxsYmFjaywgLi4udHlwZXMpIHtcbiAgICBjb25zdCBlbnRyeUl0ZW1zID0gdGhpcy5nZXRFbnRyeUl0ZW1zKCksXG4gICAgICAgICAgZW50cnlJdGVtID0gZW50cnlJdGVtcy5maW5kKChlbnRyeUl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5SXRlbVR5cGUgPSBlbnRyeUl0ZW0uZ2V0VHlwZSgpLFxuICAgICAgICAgICAgICAgIHR5cGVzSW5jbHVkZXNFbnRyeUl0ZW1UeXBlID0gdHlwZXMuaW5jbHVkZXMoZW50cnlJdGVtVHlwZSk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlc0luY2x1ZGVzRW50cnlJdGVtVHlwZSkge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjayhlbnRyeUl0ZW0pO1xuXG4gICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7IC8vLztcblxuICAgIHJldHVybiBlbnRyeUl0ZW07XG4gIH1cblxuICBmaW5kRW50cnlJdGVtc0J5VHlwZXMoLi4udHlwZXMpIHtcbiAgICBjb25zdCBlbnRyeUl0ZW1zID0gdGhpcy5nZXRFbnRyeUl0ZW1zKCk7XG5cbiAgICBmaWx0ZXIoZW50cnlJdGVtcywgKGVudHJ5SXRlbSkgPT4ge1xuICAgICAgY29uc3QgZW50cnlJdGVtVHlwZSA9IGVudHJ5SXRlbS5nZXRUeXBlKCksXG4gICAgICAgICAgICB0eXBlc0luY2x1ZGVzRW50cnlJdGVtVHlwZSA9IHR5cGVzLmluY2x1ZGVzKGVudHJ5SXRlbVR5cGUpO1xuXG4gICAgICBpZiAodHlwZXNJbmNsdWRlc0VudHJ5SXRlbVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW50cnlJdGVtcztcbiAgfVxuXG4gIGZpbmRFbnRyeUl0ZW1CeU5hbWVBbmRUeXBlcyhuYW1lLCAuLi50eXBlcykge1xuICAgIGNvbnN0IGVudHJ5SXRlbSA9IHRoaXMuZmluZEVudHJ5SXRlbUJ5VHlwZXMoKGVudHJ5SXRlbSkgPT4ge1xuICAgICAgY29uc3QgZW50cnlJdGVtTmFtZSA9IGVudHJ5SXRlbS5nZXROYW1lKCk7XG5cbiAgICAgIGlmIChlbnRyeUl0ZW1OYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0sIC4uLnR5cGVzKSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGVudHJ5SXRlbTtcbiAgfVxuXG4gIGZpbmREcmFnRW50cnlJdGVtKG5hbWUpIHtcbiAgICBjb25zdCBlbnRyeUl0ZW0gPSB0aGlzLmZpbmRFbnRyeUl0ZW1CeU5hbWVBbmRUeXBlcyhuYW1lLCBGSUxFX05BTUVfRFJBR19FTlRSWV9UWVBFLCBESVJFQ1RPUllfTkFNRV9EUkFHX0VOVFJZX1RZUEUpLFxuICAgICAgICAgIGRyYWdFbnRyeUl0ZW0gPSBlbnRyeUl0ZW07ICAvLy9cblxuICAgIHJldHVybiBkcmFnRW50cnlJdGVtO1xuICB9XG5cbiAgZmluZERyYWdFbnRyeUl0ZW1zKCkge1xuICAgIGNvbnN0IGVudHJ5SXRlbXMgPSB0aGlzLmZpbmRFbnRyeUl0ZW1zQnlUeXBlcyhGSUxFX05BTUVfRFJBR19FTlRSWV9UWVBFLCBESVJFQ1RPUllfTkFNRV9EUkFHX0VOVFJZX1RZUEUpLFxuICAgICAgICAgIGRyYWdFbnRyeUl0ZW1zID0gZW50cnlJdGVtczsgIC8vL1xuXG4gICAgcmV0dXJuIGRyYWdFbnRyeUl0ZW1zO1xuICB9XG5cbiAgZmluZEZpbGVOYW1lRHJhZ0VudHJ5SXRlbShmaWxlTmFtZSkge1xuICAgIGNvbnN0IG5hbWUgPSBmaWxlTmFtZSwgIC8vL1xuICAgICAgICAgIGVudHJ5SXRlbSA9IHRoaXMuZmluZEVudHJ5SXRlbUJ5TmFtZUFuZFR5cGVzKG5hbWUsIEZJTEVfTkFNRV9EUkFHX0VOVFJZX1RZUEUpLFxuICAgICAgICAgIGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSA9IGVudHJ5SXRlbTsgIC8vL1xuXG4gICAgcmV0dXJuIGZpbGVOYW1lRHJhZ0VudHJ5SXRlbTtcbiAgfVxuXG4gIGZpbmREaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbShkaXJlY3RvcnlOYW1lKSB7XG4gICAgY29uc3QgZW50cnlJdGVtID0gdGhpcy5maW5kRW50cnlJdGVtQnlOYW1lQW5kVHlwZXMoZGlyZWN0b3J5TmFtZSwgRElSRUNUT1JZX05BTUVfRFJBR19FTlRSWV9UWVBFKSxcbiAgICAgICAgICBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IGVudHJ5SXRlbTsgLy8vXG5cbiAgICByZXR1cm4gZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW07XG4gIH1cblxuICByZXRyaWV2ZURyYWdFbnRyeUl0ZW1zKGRyYWdFbnRyeUl0ZW1zID0gW10pIHtcbiAgICB0aGlzLmZvckVhY2hEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSgoZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGRyYWdFbnRyeUl0ZW0gPSBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbTsgLy8vXG5cbiAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLnJldHJpZXZlRHJhZ0VudHJ5SXRlbXMoZHJhZ0VudHJ5SXRlbXMpO1xuXG4gICAgICBkcmFnRW50cnlJdGVtcy5wdXNoKGRyYWdFbnRyeUl0ZW0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JFYWNoRmlsZU5hbWVEcmFnRW50cnlJdGVtKChmaWxlTmFtZURyYWdFbnRyeUl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGRyYWdFbnRyeUl0ZW0gPSBmaWxlTmFtZURyYWdFbnRyeUl0ZW07ICAvLy9cblxuICAgICAgZHJhZ0VudHJ5SXRlbXMucHVzaChkcmFnRW50cnlJdGVtKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkcmFnRW50cnlJdGVtcztcbiAgfVxuXG4gIHJldHJpZXZlRmlsZU5hbWVEcmFnRW50cnlJdGVtcyhmaWxlTmFtZURyYWdFbnRyeUl0ZW1zID0gW10pIHtcbiAgICB0aGlzLmZvckVhY2hEcmFnRW50cnlJdGVtKChkcmFnRW50cnlJdGVtKSA9PiB7XG4gICAgICBjb25zdCBkcmFnRW50cnlJdGVtRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0gPSBkcmFnRW50cnlJdGVtLmlzRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oKTtcblxuICAgICAgaWYgKGRyYWdFbnRyeUl0ZW1EaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSkge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IGRyYWdFbnRyeUl0ZW07IC8vL1xuXG4gICAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLnJldHJpZXZlRmlsZU5hbWVEcmFnRW50cnlJdGVtcyhmaWxlTmFtZURyYWdFbnRyeUl0ZW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSA9IGRyYWdFbnRyeUl0ZW07ICAvLy9cblxuICAgICAgICBmaWxlTmFtZURyYWdFbnRyeUl0ZW1zLnB1c2goZmlsZU5hbWVEcmFnRW50cnlJdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmaWxlTmFtZURyYWdFbnRyeUl0ZW1zO1xuICB9XG5cbiAgcmV0cmlldmVEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbXMoZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1zID0gW10pIHtcbiAgICB0aGlzLmZvckVhY2hEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSgoZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0pID0+IHtcbiAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLnJldHJpZXZlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1zKGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtcyk7XG5cbiAgICAgIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtcy5wdXNoKGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbXM7XG4gIH1cblxuICByZXRyaWV2ZU1hcmtlckVudHJ5SXRlbSgpIHtcbiAgICBjb25zdCBtYXJrZXJFbnRyeUl0ZW0gPSBnZXRNYXJrZXJFbnRyeUl0ZW0oKTtcblxuICAgIHJldHVybiBtYXJrZXJFbnRyeUl0ZW07XG4gIH1cblxuICByZXRyaWV2ZUVkaXRhYmxlRHJhZ0VudHJ5SXRlbSgpIHtcbiAgICBjb25zdCBkcmFnRW50cnlJdGVtcyA9IHRoaXMucmV0cmlldmVEcmFnRW50cnlJdGVtcygpLFxuICAgICAgICAgIGVkaXRhYmxlRHJhZ0VudHJ5SXRlbSA9IGRyYWdFbnRyeUl0ZW1zLmZpbmQoKGRyYWdFbnRyeUl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRyYWdFbnRyeUl0ZW1FZGl0YWJsZSA9IGRyYWdFbnRyeUl0ZW0uaXNFZGl0YWJsZSgpO1xuXG4gICAgICAgICAgICBpZiAoZHJhZ0VudHJ5SXRlbUVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gZWRpdGFibGVEcmFnRW50cnlJdGVtO1xuICB9XG5cbiAgcmV0cmlldmVTZWxlY3RlZERyYWdFbnRyeUl0ZW0oKSB7XG4gICAgY29uc3QgZHJhZ0VudHJ5SXRlbXMgPSB0aGlzLnJldHJpZXZlRHJhZ0VudHJ5SXRlbXMoKSxcbiAgICAgICAgICBzZWxlY3RlZERyYWdFbnRyeUl0ZW0gPSBkcmFnRW50cnlJdGVtcy5maW5kKChkcmFnRW50cnlJdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGRyYWdFbnRyeUl0ZW0uaXNTZWxlY3RlZCgpO1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBzZWxlY3RlZERyYWdFbnRyeUl0ZW07XG4gIH1cblxuICByZXRyaWV2ZUZpbGVOYW1lRHJhZ0VudHJ5SXRlbShmaWxlUGF0aCkge1xuICAgIGNvbnN0IGZpbGVOYW1lRHJhZ0VudHJ5SXRlbXMgPSB0aGlzLnJldHJpZXZlRmlsZU5hbWVEcmFnRW50cnlJdGVtcygpLFxuICAgICAgICAgIGZpbGVOYW1lRHJhZ0VudHJ5SXRlbSA9IGZpbGVOYW1lRHJhZ0VudHJ5SXRlbXMuZmluZCgoZmlsZU5hbWVEcmFnRW50cnlJdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZURyYWdFbnRyeUl0ZW1QYXRoID0gZmlsZU5hbWVEcmFnRW50cnlJdGVtLmdldFBhdGgoKTtcblxuICAgICAgICAgICAgaWYgKGZpbGVOYW1lRHJhZ0VudHJ5SXRlbVBhdGggPT09IGZpbGVQYXRoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7IC8vL1xuXG4gICAgcmV0dXJuIGZpbGVOYW1lRHJhZ0VudHJ5SXRlbTtcbiAgfVxuXG4gIHJldHJpZXZlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0oZGlyZWN0b3J5UGF0aCkge1xuICAgIGNvbnN0IGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtcyA9IHRoaXMucmV0cmlldmVEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbXMoKSxcbiAgICAgICAgICBkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSA9IGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtcy5maW5kKChkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1QYXRoID0gZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0uZ2V0UGF0aCgpO1xuXG4gICAgICAgICAgICBpZiAoZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1QYXRoID09PSBkaXJlY3RvcnlQYXRoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7IC8vL1xuXG4gICAgcmV0dXJuIGRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtO1xuICB9XG5cbiAgY29sbGFwc2UoKSB7XG5cdCAgdGhpcy5hZGRDbGFzcyhcImNvbGxhcHNlZFwiKTtcbiAgfVxuXG5cdGV4cGFuZCgpIHtcblx0ICB0aGlzLnJlbW92ZUNsYXNzKFwiY29sbGFwc2VkXCIpO1xuICB9XG5cbiAgZGlkTW91bnQoKSB7XG4gICAgY29uc3QgdG9wbW9zdCA9IHRoaXMuaXNUb3Btb3N0KCk7XG5cbiAgICBpZiAodG9wbW9zdCkge1xuICAgICAgdGhpcy5hZGRDbGFzcyhcInRvcG1vc3RcIik7XG4gICAgfVxuICB9XG5cbiAgd2lsbFVubW91bnQoKSB7XG4gICAgLy8vXG4gIH1cblxuICBwYXJlbnRDb250ZXh0KCkge1xuXHRcdGNvbnN0IGV4cGFuZEVudHJpZXNMaXN0ID0gdGhpcy5leHBhbmQuYmluZCh0aGlzKSwgIC8vL1xuICAgICAgICAgIGNvbGxhcHNlRW50cmllc0xpc3QgPSB0aGlzLmNvbGxhcHNlLmJpbmQodGhpcyksICAvLy9cbiAgICAgICAgICBpc0VudHJpZXNMaXN0Q29sbGFwc2VkID0gdGhpcy5pc0NvbGxhcHNlZC5iaW5kKHRoaXMpLCAvLy9cbiAgICAgICAgICBpc0VtcHR5ID0gdGhpcy5pc0VtcHR5LmJpbmQodGhpcyksXG4gICAgICAgICAgYWRkTWFya2VyID0gdGhpcy5hZGRNYXJrZXIuYmluZCh0aGlzKSxcbiAgICAgICAgICBzZWxlY3RQYXRoID0gdGhpcy5zZWxlY3RQYXRoLmJpbmQodGhpcyksXG4gICAgICAgICAgYWRkRmlsZVBhdGggPSB0aGlzLmFkZEZpbGVQYXRoLmJpbmQodGhpcyksXG4gICAgICAgICAgZGVzZWxlY3RQYXRoID0gdGhpcy5kZXNlbGVjdFBhdGguYmluZCh0aGlzKSxcbiAgICAgICAgICByZW1vdmVNYXJrZXIgPSB0aGlzLnJlbW92ZU1hcmtlci5iaW5kKHRoaXMpLFxuICAgICAgICAgIGFkZEVudHJ5SXRlbSA9IHRoaXMuYWRkRW50cnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgICAgcmVtb3ZlRmlsZVBhdGggPSB0aGlzLnJlbW92ZUZpbGVQYXRoLmJpbmQodGhpcyksXG4gICAgICAgICAgcmVtb3ZlQWxsUGF0aHMgPSB0aGlzLnJlbW92ZUFsbFBhdGhzLmJpbmQodGhpcyksXG4gICAgICAgICAgcmVtb3ZlRW50cnlJdGVtID0gdGhpcy5yZW1vdmVFbnRyeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgICBkZXNlbGVjdEFsbFBhdGhzID0gdGhpcy5kZXNlbGVjdEFsbFBhdGhzLmJpbmQodGhpcyksXG4gICAgICAgICAgYWRkRGlyZWN0b3J5UGF0aCA9IHRoaXMuYWRkRGlyZWN0b3J5UGF0aC5iaW5kKHRoaXMpLFxuICAgICAgICAgIHJlbW92ZURpcmVjdG9yeVBhdGggPSB0aGlzLnJlbW92ZURpcmVjdG9yeVBhdGguYmluZCh0aGlzKSxcbiAgICAgICAgICBmb3JFYWNoRHJhZ0VudHJ5SXRlbSA9IHRoaXMuZm9yRWFjaERyYWdFbnRyeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgICByZXRyaWV2ZURyYWdFbnRyeUl0ZW1zID0gdGhpcy5yZXRyaWV2ZURyYWdFbnRyeUl0ZW1zLmJpbmQodGhpcyksXG4gICAgICAgICAgcmV0cmlldmVNYXJrZXJFbnRyeUl0ZW0gPSB0aGlzLnJldHJpZXZlTWFya2VyRW50cnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgICAgcmV0cmlldmVTZWxlY3RlZERyYWdFbnRyeUl0ZW0gPSB0aGlzLnJldHJpZXZlU2VsZWN0ZWREcmFnRW50cnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgICAgcmV0cmlldmVFZGl0YWJsZURyYWdFbnRyeUl0ZW0gPSB0aGlzLnJldHJpZXZlRWRpdGFibGVEcmFnRW50cnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgICAgcmV0cmlldmVGaWxlTmFtZURyYWdFbnRyeUl0ZW0gPSB0aGlzLnJldHJpZXZlRmlsZU5hbWVEcmFnRW50cnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgICAgcmV0cmlldmVGaWxlTmFtZURyYWdFbnRyeUl0ZW1zID0gdGhpcy5yZXRyaWV2ZUZpbGVOYW1lRHJhZ0VudHJ5SXRlbXMuYmluZCh0aGlzKSxcbiAgICAgICAgICByZXRyaWV2ZURpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtID0gdGhpcy5yZXRyaWV2ZURpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgICAgcmV0cmlldmVEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbXMgPSB0aGlzLnJldHJpZXZlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1zLmJpbmQodGhpcyk7XG5cblx0XHRyZXR1cm4gKHtcbiAgICAgIGV4cGFuZEVudHJpZXNMaXN0LFxuICAgICAgY29sbGFwc2VFbnRyaWVzTGlzdCxcbiAgICAgIGlzRW50cmllc0xpc3RDb2xsYXBzZWQsXG4gICAgICBpc0VtcHR5LFxuICAgICAgYWRkTWFya2VyLFxuICAgICAgc2VsZWN0UGF0aCxcblx0XHRcdGFkZEZpbGVQYXRoLFxuICAgICAgZGVzZWxlY3RQYXRoLFxuICAgICAgcmVtb3ZlTWFya2VyLFxuICAgICAgYWRkRW50cnlJdGVtLFxuICAgICAgcmVtb3ZlRmlsZVBhdGgsXG4gICAgICByZW1vdmVBbGxQYXRocyxcbiAgICAgIHJlbW92ZUVudHJ5SXRlbSxcbiAgICAgIGRlc2VsZWN0QWxsUGF0aHMsXG4gICAgICBhZGREaXJlY3RvcnlQYXRoLFxuICAgICAgcmVtb3ZlRGlyZWN0b3J5UGF0aCxcbiAgICAgIGZvckVhY2hEcmFnRW50cnlJdGVtLFxuICAgICAgcmV0cmlldmVEcmFnRW50cnlJdGVtcyxcbiAgICAgIHJldHJpZXZlTWFya2VyRW50cnlJdGVtLFxuICAgICAgcmV0cmlldmVTZWxlY3RlZERyYWdFbnRyeUl0ZW0sXG4gICAgICByZXRyaWV2ZUVkaXRhYmxlRHJhZ0VudHJ5SXRlbSxcbiAgICAgIHJldHJpZXZlRmlsZU5hbWVEcmFnRW50cnlJdGVtLFxuICAgICAgcmV0cmlldmVGaWxlTmFtZURyYWdFbnRyeUl0ZW1zLFxuICAgICAgcmV0cmlldmVEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSxcbiAgICAgIHJldHJpZXZlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1zXG5cdFx0fSk7XG5cdH1cblxuXHRzdGF0aWMgdGFnTmFtZSA9IFwidWxcIjtcblxuICBzdGF0aWMgaWdub3JlZFByb3BlcnRpZXMgPSBbXG4gICAgXCJ0b3Btb3N0XCIsXG4gICAgXCJleHBsb3JlclwiXG4gIF07XG5cbiAgc3RhdGljIGRlZmF1bHRQcm9wZXJ0aWVzID0ge1xuICAgIGNsYXNzTmFtZTogXCJlbnRyaWVzXCJcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlKEVudHJpZXNMaXN0KWBcblxuICBsaXN0LXN0eWxlOiBub25lO1xuICBwYWRkaW5nLWxlZnQ6ICR7ZW50cmllc0xpc3RQYWRkaW5nTGVmdH07XG4gIFxuICAudG9wbW9zdCB7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICB9XG4gIFxuICAuY29sbGFwc2VkIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4gICAgICBcbmA7XG4iXSwibmFtZXMiOlsiZmlsdGVyIiwiYXJyYXlVdGlsaXRpZXMiLCJ0b3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoIiwicGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZUZyb21QYXRoIiwicGF0aFV0aWxpdGllcyIsImdldE1hcmtlckVudHJ5SXRlbSIsIm1hcmtlckVudHJ5SXRlbSIsImdsb2JhbFRoaXMiLCJzZXRNYXJrZXJFbnRyeUl0ZW0iLCJPYmplY3QiLCJhc3NpZ24iLCJyZXNldE1hcmtlckVudHJ5SXRlbSIsIkVudHJpZXNMaXN0IiwiRWxlbWVudCIsImlzVG9wbW9zdCIsInRvcG1vc3QiLCJwcm9wZXJ0aWVzIiwiZ2V0RXhwbG9yZXIiLCJleHBsb3JlciIsImdldEVudHJ5SXRlbXMiLCJjaGlsZEVudHJ5SXRlbUVsZW1lbnRzIiwiZ2V0Q2hpbGRFbGVtZW50cyIsImVudHJ5SXRlbXMiLCJnZXRFbnRyeUl0ZW1zTGVuZ3RoIiwiZW50cnlJdGVtc0xlbmd0aCIsImxlbmd0aCIsImlzQ29sbGFwc2VkIiwiY29sbGFwc2VkIiwiaGFzQ2xhc3MiLCJpc0VtcHR5IiwiZW1wdHkiLCJhZGRNYXJrZXIiLCJtYXJrZXJFbnRyeUl0ZW1QYXRoIiwiZHJhZ0VudHJ5SXRlbVR5cGUiLCJ0b3Btb3N0RGlyZWN0b3J5TmFtZSIsIm1hcmtlckVudHJ5SXRlbU5hbWUiLCJhZGRNYXJrZXJFbnRyeUl0ZW0iLCJ0b3Btb3N0RGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0iLCJmaW5kRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0iLCJtYXJrZXJFbnRyeUl0ZW1QYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lIiwicmVtb3ZlTWFya2VyIiwicmVtb3ZlTWFya2VyRW50cnlJdGVtIiwic2VsZWN0UGF0aCIsInBhdGgiLCJkcmFnRW50cnlJdGVtIiwibmFtZSIsImZpbmREcmFnRW50cnlJdGVtIiwic2VsZWN0IiwiZmlsZVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWUiLCJleHBhbmQiLCJkZXNlbGVjdFBhdGgiLCJkZXNlbGVjdCIsImFkZEZpbGVQYXRoIiwiZmlsZVBhdGgiLCJyZWFkT25seSIsImZpbGVOYW1lRHJhZ0VudHJ5SXRlbSIsImZpbGVOYW1lIiwiZmluZEZpbGVOYW1lRHJhZ0VudHJ5SXRlbSIsImNyZWF0ZUZpbGVOYW1lRHJhZ0VudHJ5SXRlbSIsImFkZEVudHJ5SXRlbSIsImNyZWF0ZURpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtIiwicmVtb3ZlRmlsZVBhdGgiLCJyZW1vdmVFbXB0eVBhcmVudERpcmVjdG9yaWVzIiwicmVtb3ZlRW50cnlJdGVtIiwidG9wbW9zdERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtRW1wdHkiLCJyZW1vdmVBbGxQYXRocyIsInJlbW92ZUVudHJ5SXRlbXMiLCJkZXNlbGVjdEFsbFBhdGhzIiwiZHJhZ0VudHJ5SXRlbXMiLCJyZXRyaWV2ZURyYWdFbnRyeUl0ZW1zIiwiZm9yRWFjaCIsImFkZERpcmVjdG9yeVBhdGgiLCJkaXJlY3RvcnlQYXRoIiwiZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0iLCJkaXJlY3RvcnlOYW1lIiwiY29sbGFwc2UiLCJkaXJlY3RvcnlQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lIiwicmVtb3ZlRGlyZWN0b3J5UGF0aCIsImVudHJ5SXRlbSIsIm5leHRFbnRyeUl0ZW0iLCJwcmV2aW91c0VudHJ5SXRlbSIsImZpbmRFbnRyeUl0ZW0iLCJuZXh0RW50cnlCZWZvcmVFbnRyeUl0ZW0iLCJpc0JlZm9yZSIsIm1vdW50IiwibW91bnRCZWZvcmUiLCJ1bm1vdW50IiwidHlwZSIsIkZJTEVfTkFNRV9EUkFHX0VOVFJZX1RZUEUiLCJGaWxlTmFtZU1hcmtlckVudHJ5SXRlbSIsImdldEZpbGVOYW1lTWFya2VyRW50cnlJdGVtIiwiZmlsZU5hbWVNYXJrZXJFbnRyeUl0ZW0iLCJESVJFQ1RPUllfTkFNRV9EUkFHX0VOVFJZX1RZUEUiLCJEaXJlY3RvcnlOYW1lTWFya2VyRW50cnlJdGVtIiwiZ2V0RGlyZWN0b3J5TmFtZU1hcmtlckVudHJ5SXRlbSIsImRpcmVjdG9yeU5hbWVNYXJrZXJFbnRyeUl0ZW0iLCJyZXRyaWV2ZU1hcmtlckVudHJ5SXRlbSIsInJlbW92ZSIsInJlc2V0RHJvcEVsZW1lbnQiLCJGaWxlTmFtZURyYWdFbnRyeUl0ZW0iLCJnZXRGaWxlTmFtZURyYWdFbnRyeUl0ZW0iLCJEaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSIsImdldERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtIiwiaXNGaWxlTmFtZURyYWdFbnRyeUl0ZW1QcmVzZW50IiwiZmlsZU5hbWVEcmFnRW50cnlJdGVtUHJlc2VudCIsImlzRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1QcmVzZW50IiwiZGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW1QcmVzZW50IiwiZm9yRWFjaEVudHJ5SXRlbUJ5VHlwZXMiLCJjYWxsYmFjayIsInR5cGVzIiwiZW50cnlJdGVtVHlwZSIsImdldFR5cGUiLCJ0eXBlc0luY2x1ZGVzRW50cnlJdGVtVHlwZSIsImluY2x1ZGVzIiwiZm9yRWFjaERyYWdFbnRyeUl0ZW0iLCJmb3JFYWNoRmlsZU5hbWVEcmFnRW50cnlJdGVtIiwiZm9yRWFjaERpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtIiwiZmluZCIsImZpbmRFbnRyeUl0ZW1CeVR5cGVzIiwicmVzdWx0IiwiZmluZEVudHJ5SXRlbXNCeVR5cGVzIiwiZmluZEVudHJ5SXRlbUJ5TmFtZUFuZFR5cGVzIiwiZW50cnlJdGVtTmFtZSIsImdldE5hbWUiLCJmaW5kRHJhZ0VudHJ5SXRlbXMiLCJwdXNoIiwicmV0cmlldmVGaWxlTmFtZURyYWdFbnRyeUl0ZW1zIiwiZmlsZU5hbWVEcmFnRW50cnlJdGVtcyIsImRyYWdFbnRyeUl0ZW1EaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbSIsImlzRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0iLCJyZXRyaWV2ZURpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtcyIsImRpcmVjdG9yeU5hbWVEcmFnRW50cnlJdGVtcyIsInJldHJpZXZlRWRpdGFibGVEcmFnRW50cnlJdGVtIiwiZWRpdGFibGVEcmFnRW50cnlJdGVtIiwiZHJhZ0VudHJ5SXRlbUVkaXRhYmxlIiwiaXNFZGl0YWJsZSIsInJldHJpZXZlU2VsZWN0ZWREcmFnRW50cnlJdGVtIiwic2VsZWN0ZWREcmFnRW50cnlJdGVtIiwic2VsZWN0ZWQiLCJpc1NlbGVjdGVkIiwicmV0cmlldmVGaWxlTmFtZURyYWdFbnRyeUl0ZW0iLCJmaWxlTmFtZURyYWdFbnRyeUl0ZW1QYXRoIiwiZ2V0UGF0aCIsInJldHJpZXZlRGlyZWN0b3J5TmFtZURyYWdFbnRyeUl0ZW0iLCJkaXJlY3RvcnlOYW1lRHJhZ0VudHJ5SXRlbVBhdGgiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwiZGlkTW91bnQiLCJ3aWxsVW5tb3VudCIsInBhcmVudENvbnRleHQiLCJleHBhbmRFbnRyaWVzTGlzdCIsImJpbmQiLCJjb2xsYXBzZUVudHJpZXNMaXN0IiwiaXNFbnRyaWVzTGlzdENvbGxhcHNlZCIsInRhZ05hbWUiLCJpZ25vcmVkUHJvcGVydGllcyIsImRlZmF1bHRQcm9wZXJ0aWVzIiwiY2xhc3NOYW1lIiwid2l0aFN0eWxlIiwiZW50cmllc0xpc3RQYWRkaW5nTGVmdCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBa3RCQTs7O2VBQUE7OztzRUFodEJzQjtzQkFFRTsyQkFDc0I7d0JBRVA7NEJBQ21DOzs7Ozs7QUFFMUUsTUFBTSxFQUFFQSxNQUFNLEVBQUUsR0FBR0MseUJBQWMsRUFDM0IsRUFBRUMsNEJBQTRCLEVBQUVDLHVDQUF1QyxFQUFFLEdBQUdDLHdCQUFhO0FBRS9GLFNBQVNDO0lBQ1AsTUFBTSxFQUFFQyxlQUFlLEVBQUUsR0FBR0M7SUFFNUIsT0FBT0Q7QUFDVDtBQUVBLFNBQVNFLG1CQUFtQkYsZUFBZTtJQUN6Q0csT0FBT0MsTUFBTSxDQUFDSCxZQUFZO1FBQ3hCRDtJQUNGO0FBQ0Y7QUFFQSxTQUFTSztJQUNQLE1BQU1MLGtCQUFrQjtJQUV4QkUsbUJBQW1CRjtBQUNyQjtBQUVBRyxPQUFPQyxNQUFNLENBQUNILFlBQVk7SUFDeEJGO0lBQ0FHO0lBQ0FHO0FBQ0Y7QUFFQUE7QUFFQSxNQUFNQyxvQkFBb0JDLGFBQU87SUFDL0JDLFlBQVk7UUFDVixNQUFNLEVBQUVDLFVBQVUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDQyxVQUFVO1FBRTNDLE9BQU9EO0lBQ1Q7SUFFQUUsY0FBYztRQUNkLE1BQU0sRUFBRUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDRixVQUFVO1FBRXBDLE9BQU9FO0lBQ1I7SUFFQUMsZ0JBQWdCO1FBQ2YsTUFBTUMseUJBQXlCLElBQUksQ0FBQ0MsZ0JBQWdCLENBQUMsYUFDbERDLGFBQWFGLHdCQUF5QixHQUFHO1FBRTVDLE9BQU9FO0lBQ1I7SUFFQUMsc0JBQXNCO1FBQ25CLE1BQU1ELGFBQWEsSUFBSSxDQUFDSCxhQUFhLElBQy9CSyxtQkFBbUJGLFdBQVdHLE1BQU07UUFFMUMsT0FBT0Q7SUFDVDtJQUVBRSxjQUFjO1FBQ1osTUFBTUMsWUFBWSxJQUFJLENBQUNDLFFBQVEsQ0FBQztRQUVoQyxPQUFPRDtJQUNUO0lBRUFFLFVBQVU7UUFDUixNQUFNUCxhQUFhLElBQUksQ0FBQ0gsYUFBYSxJQUMvQkssbUJBQW1CRixXQUFXRyxNQUFNLEVBQ3BDSyxRQUFTTixxQkFBcUI7UUFFcEMsT0FBT007SUFDVDtJQUVBQyxVQUFVQyxtQkFBbUIsRUFBRUMsaUJBQWlCLEVBQUU7UUFDaEQsTUFBTUMsdUJBQXVCaEMsNkJBQTZCOEI7UUFFMUQsSUFBSUUseUJBQXlCLE1BQU07WUFDakMsTUFBTUMsc0JBQXNCSCxxQkFBc0IsR0FBRztZQUVyRCxJQUFJLENBQUNJLGtCQUFrQixDQUFDRCxxQkFBcUJGO1FBQy9DLE9BQU87WUFDTCxNQUFNSSxvQ0FBb0MsSUFBSSxDQUFDQyw4QkFBOEIsQ0FBQ0osdUJBQ3hFSyxpREFBaURwQyx3Q0FBd0M2QjtZQUUvRkEsc0JBQXNCTyxnREFBZ0QsR0FBRztZQUV6RUYsa0NBQWtDTixTQUFTLENBQUNDLHFCQUFxQkM7UUFDbkU7SUFDRjtJQUVBTyxlQUFlO1FBQ2IsSUFBSSxDQUFDQyxxQkFBcUI7SUFDNUI7SUFFQUMsV0FBV0MsSUFBSSxFQUFFO1FBQ2YsSUFBSUMsZ0JBQWdCO1FBRXBCLE1BQU1WLHVCQUF1QmhDLDZCQUE2QnlDO1FBRTFELElBQUlULHlCQUF5QixNQUFNO1lBQ2pDLE1BQU1XLE9BQU9GLE1BQU8sR0FBRztZQUV2QkMsZ0JBQWdCLElBQUksQ0FBQ0UsaUJBQWlCLENBQUNEO1lBRXZDLElBQUlELGtCQUFrQixNQUFNO2dCQUMxQkEsY0FBY0csTUFBTTtZQUN0QjtRQUNGLE9BQU87WUFDTCxJQUFJVixvQ0FBb0MsSUFBSSxDQUFDQyw4QkFBOEIsQ0FBQ0o7WUFFNUUsSUFBSUcsc0NBQXNDLE1BQU07Z0JBQzlDLE1BQU1XLHNDQUFzQzdDLHdDQUF3Q3dDO2dCQUVwRkEsT0FBT0sscUNBQXFDLEdBQUc7Z0JBRS9DWCxrQ0FBa0NZLE1BQU07Z0JBRXhDTCxnQkFBZ0JQLGtDQUFrQ0ssVUFBVSxDQUFDQztZQUMvRDtRQUNGO1FBRUEsT0FBT0M7SUFDVDtJQUVBTSxhQUFhUCxJQUFJLEVBQUU7UUFDakIsSUFBSUMsZ0JBQWdCO1FBRXBCLE1BQU1WLHVCQUF1QmhDLDZCQUE2QnlDO1FBRTFELElBQUlULHlCQUF5QixNQUFNO1lBQ2pDLE1BQU1XLE9BQU9GLE1BQU8sR0FBRztZQUV2QkMsZ0JBQWdCLElBQUksQ0FBQ0UsaUJBQWlCLENBQUNEO1lBRXZDLElBQUlELGtCQUFrQixNQUFNO2dCQUMxQkEsY0FBY08sUUFBUTtZQUN4QjtRQUNGLE9BQU87WUFDTCxJQUFJZCxvQ0FBb0MsSUFBSSxDQUFDQyw4QkFBOEIsQ0FBQ0o7WUFFNUUsSUFBSUcsc0NBQXNDLE1BQU07Z0JBQzlDLE1BQU1XLHNDQUFzQzdDLHdDQUF3Q3dDO2dCQUVwRkEsT0FBT0sscUNBQXFDLEdBQUc7Z0JBRS9DSixnQkFBZ0JQLGtDQUFrQ2EsWUFBWSxDQUFDUDtZQUNqRTtRQUNGO1FBRUEsT0FBT0M7SUFDVDtJQUVBUSxZQUFZQyxRQUFRLEVBQUVDLFdBQVcsS0FBSyxFQUFFO1FBQ3hDLElBQUlDO1FBRUYsTUFBTXJCLHVCQUF1QmhDLDZCQUE2Qm1EO1FBRTFELElBQUluQix5QkFBeUIsTUFBTTtZQUNqQyxNQUFNc0IsV0FBV0gsVUFBVyxHQUFHO1lBRS9CRSx3QkFBd0IsSUFBSSxDQUFDRSx5QkFBeUIsQ0FBQ0Q7WUFFdkQsSUFBSUQsMEJBQTBCLE1BQU07Z0JBQ2xDQSx3QkFBd0IsSUFBSSxDQUFDRywyQkFBMkIsQ0FBQ0YsVUFBVUY7Z0JBRW5FLElBQUksQ0FBQ0ssWUFBWSxDQUFDSjtZQUNwQjtRQUNGLE9BQU87WUFDTCxJQUFJbEIsb0NBQW9DLElBQUksQ0FBQ0MsOEJBQThCLENBQUNKO1lBRTVFLElBQUlHLHNDQUFzQyxNQUFNO2dCQUM5QyxNQUFNVixZQUFZO2dCQUVsQlUsb0NBQW9DLElBQUksQ0FBQ3VCLGdDQUFnQyxDQUFDMUIsc0JBQXNCb0IsVUFBVTNCO2dCQUUxRyxJQUFJLENBQUNnQyxZQUFZLENBQUN0QjtZQUNwQjtZQUVBLE1BQU1XLHNDQUFzQzdDLHdDQUF3Q2tEO1lBRXBGQSxXQUFXTCxxQ0FBcUMsR0FBRztZQUVuRE8sd0JBQXdCbEIsa0NBQWtDZSxXQUFXLENBQUNDLFVBQVVDO1FBQ2xGO1FBRUYsT0FBT0M7SUFDUjtJQUVDTSxlQUFlUixRQUFRLEVBQUVTLCtCQUErQixLQUFLLEVBQUU7UUFDN0QsTUFBTTVCLHVCQUF1QmhDLDZCQUE2Qm1EO1FBRTFELElBQUluQix5QkFBeUIsTUFBTTtZQUNqQyxNQUFNc0IsV0FBV0gsVUFDWEUsd0JBQXdCLElBQUksQ0FBQ0UseUJBQXlCLENBQUNEO1lBRTdELElBQUlELDBCQUEwQixNQUFNO2dCQUNsQyxJQUFJLENBQUNRLGVBQWUsQ0FBQ1I7WUFDdkI7UUFDRixPQUFPO1lBQ0wsTUFBTWxCLG9DQUFvQyxJQUFJLENBQUNDLDhCQUE4QixDQUFDSjtZQUU5RSxJQUFJRyxzQ0FBc0MsTUFBTTtnQkFDOUMsTUFBTVcsc0NBQXNDN0Msd0NBQXdDa0Q7Z0JBRXBGQSxXQUFXTCxxQ0FBcUMsR0FBRztnQkFFbkRYLGtDQUFrQ3dCLGNBQWMsQ0FBQ1IsVUFBVVM7Z0JBRTNELElBQUlBLDhCQUE4QjtvQkFDaEMsTUFBTUUseUNBQXlDM0Isa0NBQWtDUixPQUFPO29CQUV4RixJQUFJbUMsd0NBQXdDO3dCQUMxQyxJQUFJLENBQUNELGVBQWUsQ0FBQzFCO29CQUN2QjtnQkFDRjtZQUNGO1FBQ0Y7SUFDRjtJQUVBNEIsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDQyxnQkFBZ0I7SUFDdkI7SUFFQUMsbUJBQW1CO1FBQ2pCLE1BQU1DLGlCQUFpQixJQUFJLENBQUNDLHNCQUFzQjtRQUVsREQsZUFBZUUsT0FBTyxDQUFDLENBQUMxQjtZQUN0QkEsY0FBY08sUUFBUTtRQUN4QjtJQUNGO0lBRUFvQixpQkFBaUJDLGFBQWEsRUFBRWxCLFdBQVcsS0FBSyxFQUFFM0IsWUFBWSxJQUFJLEVBQUU7UUFDbEUsSUFBSThDO1FBRUosTUFBTXZDLHVCQUF1QmhDLDZCQUE2QnNFO1FBRTFELElBQUl0Qyx5QkFBeUIsTUFBTTtZQUNqQyxNQUFNd0MsZ0JBQWdCRixlQUFnQixHQUFHO1lBRXpDQyw2QkFBNkIsSUFBSSxDQUFDbkMsOEJBQThCLENBQUNvQztZQUVqRSxJQUFJRCwrQkFBK0IsTUFBTTtnQkFDdkNBLDZCQUE2QixJQUFJLENBQUNiLGdDQUFnQyxDQUFDYyxlQUFlcEIsVUFBVTNCO2dCQUU1RixJQUFJLENBQUNnQyxZQUFZLENBQUNjO1lBQ3BCLE9BQU87Z0JBQ0w5QyxZQUNFOEMsMkJBQTJCRSxRQUFRLEtBQ2pDRiwyQkFBMkJ4QixNQUFNO1lBQ3ZDO1FBQ0YsT0FBTztZQUNMLElBQUlaLG9DQUFvQyxJQUFJLENBQUNDLDhCQUE4QixDQUFDSjtZQUU1RSxJQUFJRyxzQ0FBc0MsTUFBTTtnQkFDOUNBLG9DQUFvQyxJQUFJLENBQUN1QixnQ0FBZ0MsQ0FBQzFCLHNCQUFzQm9CLFVBQVUzQjtnQkFFMUcsSUFBSSxDQUFDZ0MsWUFBWSxDQUFDdEI7WUFDcEI7WUFFQSxNQUFNdUMsMkNBQTJDekUsd0NBQXdDcUU7WUFFekZBLGdCQUFnQkksMENBQTBDLEdBQUc7WUFFN0RILDZCQUE2QnBDLGtDQUFrQ2tDLGdCQUFnQixDQUFDQyxlQUFlbEIsVUFBVTNCO1FBQzNHO1FBRUEsT0FBTzhDO0lBQ1Q7SUFFQUksb0JBQW9CTCxhQUFhLEVBQUVWLCtCQUErQixLQUFLLEVBQUU7UUFDdkUsTUFBTTVCLHVCQUF1QmhDLDZCQUE2QnNFO1FBRTFELElBQUl0Qyx5QkFBeUIsTUFBTTtZQUNqQyxNQUFNd0MsZ0JBQWdCRixlQUNoQkMsNkJBQTZCLElBQUksQ0FBQ25DLDhCQUE4QixDQUFDb0M7WUFFdkUsSUFBSUQsK0JBQStCLE1BQU07Z0JBQ3ZDLElBQUksQ0FBQ1YsZUFBZSxDQUFDVTtZQUN2QjtRQUNGLE9BQU87WUFDTCxNQUFNcEMsb0NBQW9DLElBQUksQ0FBQ0MsOEJBQThCLENBQUNKO1lBRTlFLElBQUlHLHNDQUFzQyxNQUFNO2dCQUM5QyxNQUFNdUMsMkNBQTJDekUsd0NBQXdDcUU7Z0JBRXpGQSxnQkFBZ0JJLDBDQUEwQyxHQUFHO2dCQUU3RHZDLGtDQUFrQ3dDLG1CQUFtQixDQUFDTCxlQUFlVjtnQkFFckUsSUFBSUEsOEJBQThCO29CQUNoQyxNQUFNRSx5Q0FBeUMzQixrQ0FBa0NSLE9BQU87b0JBRXhGLElBQUltQyx3Q0FBd0M7d0JBQzFDLElBQUksQ0FBQ0QsZUFBZSxDQUFDMUI7b0JBQ3ZCO2dCQUNGO1lBQ0Y7UUFDRjtJQUNGO0lBRUFzQixhQUFhbUIsU0FBUyxFQUFFO1FBQ3RCLE1BQU1DLGdCQUFnQkQsV0FDaEJFLG9CQUFvQixJQUFJLENBQUNDLGFBQWEsQ0FBQyxDQUFDSDtZQUN0QyxNQUFNSSwyQkFBMkJILGNBQWNJLFFBQVEsQ0FBQ0w7WUFFeEQsSUFBSUksMEJBQTBCO2dCQUM1QixPQUFPO1lBQ1Q7UUFDRjtRQUVOLElBQUlGLHNCQUFzQixNQUFNO1lBQzlCLElBQUksQ0FBQ0ksS0FBSyxDQUFDTjtRQUNiLE9BQU87WUFDTEEsVUFBVU8sV0FBVyxDQUFDTDtRQUN4QjtJQUNGO0lBRUFqQixnQkFBZ0JlLFNBQVMsRUFBRTtRQUN6QixJQUFJLENBQUNRLE9BQU8sQ0FBQ1I7SUFDZjtJQUVBWixtQkFBbUI7UUFDakIsTUFBTTVDLGFBQWEsSUFBSSxDQUFDSCxhQUFhO1FBRXJDRyxXQUFXZ0QsT0FBTyxDQUFDLENBQUNRO1lBQ2xCLElBQUksQ0FBQ2YsZUFBZSxDQUFDZTtRQUN2QjtJQUNGO0lBRUExQyxtQkFBbUJELG1CQUFtQixFQUFFRixpQkFBaUIsRUFBRTtRQUN6RCxJQUFJM0I7UUFFSixNQUFNdUMsT0FBT1YscUJBQ1BvRCxPQUFPdEQsbUJBQW9CLEdBQUc7UUFFcEMsT0FBUXNEO1lBQ04sS0FBS0MscUNBQXlCO2dCQUFHO29CQUMvQixNQUFNdEUsV0FBVyxJQUFJLENBQUNELFdBQVcsSUFDM0J3RSwwQkFBMEJ2RSxTQUFTd0UsMEJBQTBCLElBQzdEQyx3Q0FFRSxvQkFBQ0Y7d0JBQXdCNUMsTUFBTUE7d0JBQU0zQixVQUFVQTs7b0JBSXZEWixrQkFBa0JxRix5QkFBMEIsR0FBRztvQkFFL0M7Z0JBQ0Y7WUFFQSxLQUFLQywwQ0FBOEI7Z0JBQUc7b0JBQ3BDLE1BQU0xRSxXQUFXLElBQUksQ0FBQ0QsV0FBVyxJQUMzQjRFLCtCQUErQjNFLFNBQVM0RSwrQkFBK0IsSUFDdkVDLDZDQUVFLG9CQUFDRjt3QkFBNkJoRCxNQUFNQTt3QkFBTTNCLFVBQVVBOztvQkFJNURaLGtCQUFrQnlGLDhCQUE4QixHQUFHO29CQUVuRDtnQkFDRjtRQUNGO1FBRUEsTUFBTWpCLFlBQVl4RSxpQkFBaUIsR0FBRztRQUV0QyxJQUFJLENBQUNxRCxZQUFZLENBQUNtQjtRQUVsQnRFLG1CQUFtQkY7SUFDckI7SUFFQW1DLHdCQUF3QjtRQUN0QixNQUFNbkMsa0JBQWtCLElBQUksQ0FBQzBGLHVCQUF1QjtRQUVwRDFGLGdCQUFnQjJGLE1BQU07UUFFdEJ0RjtRQUVBdUY7SUFDRjtJQUVBeEMsNEJBQTRCRixRQUFRLEVBQUVGLFFBQVEsRUFBRTtRQUNoRCxNQUFNVCxPQUFPVyxVQUNWdEMsV0FBVyxJQUFJLENBQUNELFdBQVcsSUFDM0JrRix3QkFBd0JqRixTQUFTa0Ysd0JBQXdCLENBQUM5QyxXQUMxREMsc0NBRUMsb0JBQUM0QztZQUFzQnRELE1BQU1BO1lBQU1TLFVBQVVBO1lBQVVwQyxVQUFVQTs7UUFJckUsT0FBT3FDO0lBQ1I7SUFFQUssaUNBQWlDYyxhQUFhLEVBQUVwQixRQUFRLEVBQUUzQixTQUFTLEVBQUU7UUFDcEUsTUFBTWtCLE9BQU82QixlQUNMM0QsVUFBVSxJQUFJLENBQUNELFNBQVMsSUFDN0JJLFdBQVcsSUFBSSxDQUFDRCxXQUFXLElBQzNCb0YsNkJBQTZCbkYsU0FBU29GLDZCQUE2QixDQUFDaEQsVUFBVXZDLFVBQzlFMEQsMkNBRUMsb0JBQUM0QjtZQUEyQnhELE1BQU1BO1lBQU0zQixVQUFVQTtZQUFVb0MsVUFBVUE7WUFBVXZDLFNBQVNBO1lBQVNZLFdBQVdBOztRQUlqSCxPQUFPOEM7SUFDUjtJQUVBOEIsK0JBQStCL0MsUUFBUSxFQUFFO1FBQ3hDLE1BQU1ELHdCQUF3QixJQUFJLENBQUNFLHlCQUF5QixDQUFDRCxXQUMxRGdELCtCQUFnQ2pELDBCQUEwQjtRQUU3RCxPQUFPaUQ7SUFDUjtJQUVBQyxvQ0FBb0MvQixhQUFhLEVBQUU7UUFDbEQsTUFBTUQsNkJBQTZCLElBQUksQ0FBQ25DLDhCQUE4QixDQUFDb0MsZ0JBQ3BFZ0Msb0NBQXFDakMsK0JBQStCO1FBRXZFLE9BQU9pQztJQUNSO0lBRUNDLHdCQUF3QkMsUUFBUSxFQUFFLEdBQUdDLEtBQUssRUFBRTtRQUMxQyxNQUFNdkYsYUFBYSxJQUFJLENBQUNILGFBQWE7UUFFckNHLFdBQVdnRCxPQUFPLENBQUMsQ0FBQ1E7WUFDbEIsTUFBTWdDLGdCQUFnQmhDLFVBQVVpQyxPQUFPLElBQ25DQyw2QkFBNkJILE1BQU1JLFFBQVEsQ0FBQ0g7WUFFaEQsSUFBSUUsNEJBQTRCO2dCQUM5QkosU0FBUzlCO1lBQ1g7UUFDRjtJQUNGO0lBRUFvQyxxQkFBcUJOLFFBQVEsRUFBRTtRQUFFLElBQUksQ0FBQ0QsdUJBQXVCLENBQUNDLFVBQVVwQixxQ0FBeUIsRUFBRUksMENBQThCO0lBQUc7SUFFcEl1Qiw2QkFBNkJQLFFBQVEsRUFBRTtRQUFFLElBQUksQ0FBQ0QsdUJBQXVCLENBQUNDLFVBQVVwQixxQ0FBeUI7SUFBRztJQUU1RzRCLGtDQUFrQ1IsUUFBUSxFQUFFO1FBQUUsSUFBSSxDQUFDRCx1QkFBdUIsQ0FBQ0MsVUFBVWhCLDBDQUE4QjtJQUFHO0lBRXRIWCxjQUFjMkIsUUFBUSxFQUFFO1FBQ3RCLE1BQU10RixhQUFhLElBQUksQ0FBQ0gsYUFBYSxJQUMvQjJELFlBQVl4RCxXQUFXK0YsSUFBSSxDQUFDVCxhQUFhLE1BQU0sR0FBRztRQUV4RCxPQUFPOUI7SUFDVDtJQUVBd0MscUJBQXFCVixRQUFRLEVBQUUsR0FBR0MsS0FBSyxFQUFFO1FBQ3ZDLE1BQU12RixhQUFhLElBQUksQ0FBQ0gsYUFBYSxJQUMvQjJELFlBQVl4RCxXQUFXK0YsSUFBSSxDQUFDLENBQUN2QztZQUMzQixNQUFNZ0MsZ0JBQWdCaEMsVUFBVWlDLE9BQU8sSUFDbkNDLDZCQUE2QkgsTUFBTUksUUFBUSxDQUFDSDtZQUVoRCxJQUFJRSw0QkFBNEI7Z0JBQzlCLE1BQU1PLFNBQVNYLFNBQVM5QjtnQkFFeEIsSUFBSXlDLFFBQVE7b0JBQ1YsT0FBTztnQkFDVDtZQUNGO1FBQ0YsTUFBTSxNQUFNLElBQUk7UUFFdEIsT0FBT3pDO0lBQ1Q7SUFFQTBDLHNCQUFzQixHQUFHWCxLQUFLLEVBQUU7UUFDOUIsTUFBTXZGLGFBQWEsSUFBSSxDQUFDSCxhQUFhO1FBRXJDbkIsT0FBT3NCLFlBQVksQ0FBQ3dEO1lBQ2xCLE1BQU1nQyxnQkFBZ0JoQyxVQUFVaUMsT0FBTyxJQUNqQ0MsNkJBQTZCSCxNQUFNSSxRQUFRLENBQUNIO1lBRWxELElBQUlFLDRCQUE0QjtnQkFDOUIsT0FBTztZQUNUO1FBQ0Y7UUFFQSxPQUFPMUY7SUFDVDtJQUVBbUcsNEJBQTRCNUUsSUFBSSxFQUFFLEdBQUdnRSxLQUFLLEVBQUU7UUFDMUMsTUFBTS9CLFlBQVksSUFBSSxDQUFDd0Msb0JBQW9CLENBQUMsQ0FBQ3hDO1lBQzNDLE1BQU00QyxnQkFBZ0I1QyxVQUFVNkMsT0FBTztZQUV2QyxJQUFJRCxrQkFBa0I3RSxNQUFNO2dCQUMxQixPQUFPO1lBQ1Q7UUFDRixNQUFNZ0UsVUFBVTtRQUVoQixPQUFPL0I7SUFDVDtJQUVBaEMsa0JBQWtCRCxJQUFJLEVBQUU7UUFDdEIsTUFBTWlDLFlBQVksSUFBSSxDQUFDMkMsMkJBQTJCLENBQUM1RSxNQUFNMkMscUNBQXlCLEVBQUVJLDBDQUE4QixHQUM1R2hELGdCQUFnQmtDLFdBQVksR0FBRztRQUVyQyxPQUFPbEM7SUFDVDtJQUVBZ0YscUJBQXFCO1FBQ25CLE1BQU10RyxhQUFhLElBQUksQ0FBQ2tHLHFCQUFxQixDQUFDaEMscUNBQXlCLEVBQUVJLDBDQUE4QixHQUNqR3hCLGlCQUFpQjlDLFlBQWEsR0FBRztRQUV2QyxPQUFPOEM7SUFDVDtJQUVBWCwwQkFBMEJELFFBQVEsRUFBRTtRQUNsQyxNQUFNWCxPQUFPVyxVQUNQc0IsWUFBWSxJQUFJLENBQUMyQywyQkFBMkIsQ0FBQzVFLE1BQU0yQyxxQ0FBeUIsR0FDNUVqQyx3QkFBd0J1QixXQUFZLEdBQUc7UUFFN0MsT0FBT3ZCO0lBQ1Q7SUFFQWpCLCtCQUErQm9DLGFBQWEsRUFBRTtRQUM1QyxNQUFNSSxZQUFZLElBQUksQ0FBQzJDLDJCQUEyQixDQUFDL0MsZUFBZWtCLDBDQUE4QixHQUMxRm5CLDZCQUE2QkssV0FBVyxHQUFHO1FBRWpELE9BQU9MO0lBQ1Q7SUFFQUosdUJBQXVCRCxpQkFBaUIsRUFBRSxFQUFFO1FBQzFDLElBQUksQ0FBQ2dELGlDQUFpQyxDQUFDLENBQUMzQztZQUN0QyxNQUFNN0IsZ0JBQWdCNkIsNEJBQTRCLEdBQUc7WUFFckRBLDJCQUEyQkosc0JBQXNCLENBQUNEO1lBRWxEQSxlQUFleUQsSUFBSSxDQUFDakY7UUFDdEI7UUFFQSxJQUFJLENBQUN1RSw0QkFBNEIsQ0FBQyxDQUFDNUQ7WUFDakMsTUFBTVgsZ0JBQWdCVyx1QkFBd0IsR0FBRztZQUVqRGEsZUFBZXlELElBQUksQ0FBQ2pGO1FBQ3RCO1FBRUEsT0FBT3dCO0lBQ1Q7SUFFQTBELCtCQUErQkMseUJBQXlCLEVBQUUsRUFBRTtRQUMxRCxJQUFJLENBQUNiLG9CQUFvQixDQUFDLENBQUN0RTtZQUN6QixNQUFNb0YsMENBQTBDcEYsY0FBY3FGLDRCQUE0QjtZQUUxRixJQUFJRCx5Q0FBeUM7Z0JBQzNDLE1BQU12RCw2QkFBNkI3QixlQUFlLEdBQUc7Z0JBRXJENkIsMkJBQTJCcUQsOEJBQThCLENBQUNDO1lBQzVELE9BQU87Z0JBQ0wsTUFBTXhFLHdCQUF3QlgsZUFBZ0IsR0FBRztnQkFFakRtRix1QkFBdUJGLElBQUksQ0FBQ3RFO1lBQzlCO1FBQ0Y7UUFFQSxPQUFPd0U7SUFDVDtJQUVBRyxvQ0FBb0NDLDhCQUE4QixFQUFFLEVBQUU7UUFDcEUsSUFBSSxDQUFDZixpQ0FBaUMsQ0FBQyxDQUFDM0M7WUFDdENBLDJCQUEyQnlELG1DQUFtQyxDQUFDQztZQUUvREEsNEJBQTRCTixJQUFJLENBQUNwRDtRQUNuQztRQUVBLE9BQU8wRDtJQUNUO0lBRUFuQywwQkFBMEI7UUFDeEIsTUFBTTFGLGtCQUFrQkQ7UUFFeEIsT0FBT0M7SUFDVDtJQUVBOEgsZ0NBQWdDO1FBQzlCLE1BQU1oRSxpQkFBaUIsSUFBSSxDQUFDQyxzQkFBc0IsSUFDNUNnRSx3QkFBd0JqRSxlQUFlaUQsSUFBSSxDQUFDLENBQUN6RTtZQUMzQyxNQUFNMEYsd0JBQXdCMUYsY0FBYzJGLFVBQVU7WUFFdEQsSUFBSUQsdUJBQXVCO2dCQUN6QixPQUFPO1lBQ1Q7UUFDRixNQUFNO1FBRVosT0FBT0Q7SUFDVDtJQUVBRyxnQ0FBZ0M7UUFDOUIsTUFBTXBFLGlCQUFpQixJQUFJLENBQUNDLHNCQUFzQixJQUM1Q29FLHdCQUF3QnJFLGVBQWVpRCxJQUFJLENBQUMsQ0FBQ3pFO1lBQzNDLE1BQU04RixXQUFXOUYsY0FBYytGLFVBQVU7WUFFekMsSUFBSUQsVUFBVTtnQkFDWixPQUFPO1lBQ1Q7UUFDRixNQUFNO1FBRVosT0FBT0Q7SUFDVDtJQUVBRyw4QkFBOEJ2RixRQUFRLEVBQUU7UUFDdEMsTUFBTTBFLHlCQUF5QixJQUFJLENBQUNELDhCQUE4QixJQUM1RHZFLHdCQUF3QndFLHVCQUF1QlYsSUFBSSxDQUFDLENBQUM5RDtZQUNuRCxNQUFNc0YsNEJBQTRCdEYsc0JBQXNCdUYsT0FBTztZQUUvRCxJQUFJRCw4QkFBOEJ4RixVQUFVO2dCQUMxQyxPQUFPO1lBQ1Q7UUFDRixNQUFNLE1BQU0sR0FBRztRQUVyQixPQUFPRTtJQUNUO0lBRUF3RixtQ0FBbUN2RSxhQUFhLEVBQUU7UUFDaEQsTUFBTTJELDhCQUE4QixJQUFJLENBQUNELG1DQUFtQyxJQUN0RXpELDZCQUE2QjBELDRCQUE0QmQsSUFBSSxDQUFDLENBQUM1QztZQUM3RCxNQUFNdUUsaUNBQWlDdkUsMkJBQTJCcUUsT0FBTztZQUV6RSxJQUFJRSxtQ0FBbUN4RSxlQUFlO2dCQUNwRCxPQUFPO1lBQ1Q7UUFDRixNQUFNLE1BQU0sR0FBRztRQUVyQixPQUFPQztJQUNUO0lBRUFFLFdBQVc7UUFDVixJQUFJLENBQUNzRSxRQUFRLENBQUM7SUFDZjtJQUVEaEcsU0FBUztRQUNQLElBQUksQ0FBQ2lHLFdBQVcsQ0FBQztJQUNsQjtJQUVBQyxXQUFXO1FBQ1QsTUFBTXBJLFVBQVUsSUFBSSxDQUFDRCxTQUFTO1FBRTlCLElBQUlDLFNBQVM7WUFDWCxJQUFJLENBQUNrSSxRQUFRLENBQUM7UUFDaEI7SUFDRjtJQUVBRyxjQUFjO0lBQ1osR0FBRztJQUNMO0lBRUFDLGdCQUFnQjtRQUNoQixNQUFNQyxvQkFBb0IsSUFBSSxDQUFDckcsTUFBTSxDQUFDc0csSUFBSSxDQUFDLElBQUksR0FDdkNDLHNCQUFzQixJQUFJLENBQUM3RSxRQUFRLENBQUM0RSxJQUFJLENBQUMsSUFBSSxHQUM3Q0UseUJBQXlCLElBQUksQ0FBQy9ILFdBQVcsQ0FBQzZILElBQUksQ0FBQyxJQUFJLEdBQ25EMUgsVUFBVSxJQUFJLENBQUNBLE9BQU8sQ0FBQzBILElBQUksQ0FBQyxJQUFJLEdBQ2hDeEgsWUFBWSxJQUFJLENBQUNBLFNBQVMsQ0FBQ3dILElBQUksQ0FBQyxJQUFJLEdBQ3BDN0csYUFBYSxJQUFJLENBQUNBLFVBQVUsQ0FBQzZHLElBQUksQ0FBQyxJQUFJLEdBQ3RDbkcsY0FBYyxJQUFJLENBQUNBLFdBQVcsQ0FBQ21HLElBQUksQ0FBQyxJQUFJLEdBQ3hDckcsZUFBZSxJQUFJLENBQUNBLFlBQVksQ0FBQ3FHLElBQUksQ0FBQyxJQUFJLEdBQzFDL0csZUFBZSxJQUFJLENBQUNBLFlBQVksQ0FBQytHLElBQUksQ0FBQyxJQUFJLEdBQzFDNUYsZUFBZSxJQUFJLENBQUNBLFlBQVksQ0FBQzRGLElBQUksQ0FBQyxJQUFJLEdBQzFDMUYsaUJBQWlCLElBQUksQ0FBQ0EsY0FBYyxDQUFDMEYsSUFBSSxDQUFDLElBQUksR0FDOUN0RixpQkFBaUIsSUFBSSxDQUFDQSxjQUFjLENBQUNzRixJQUFJLENBQUMsSUFBSSxHQUM5Q3hGLGtCQUFrQixJQUFJLENBQUNBLGVBQWUsQ0FBQ3dGLElBQUksQ0FBQyxJQUFJLEdBQ2hEcEYsbUJBQW1CLElBQUksQ0FBQ0EsZ0JBQWdCLENBQUNvRixJQUFJLENBQUMsSUFBSSxHQUNsRGhGLG1CQUFtQixJQUFJLENBQUNBLGdCQUFnQixDQUFDZ0YsSUFBSSxDQUFDLElBQUksR0FDbEQxRSxzQkFBc0IsSUFBSSxDQUFDQSxtQkFBbUIsQ0FBQzBFLElBQUksQ0FBQyxJQUFJLEdBQ3hEckMsdUJBQXVCLElBQUksQ0FBQ0Esb0JBQW9CLENBQUNxQyxJQUFJLENBQUMsSUFBSSxHQUMxRGxGLHlCQUF5QixJQUFJLENBQUNBLHNCQUFzQixDQUFDa0YsSUFBSSxDQUFDLElBQUksR0FDOUR2RCwwQkFBMEIsSUFBSSxDQUFDQSx1QkFBdUIsQ0FBQ3VELElBQUksQ0FBQyxJQUFJLEdBQ2hFZixnQ0FBZ0MsSUFBSSxDQUFDQSw2QkFBNkIsQ0FBQ2UsSUFBSSxDQUFDLElBQUksR0FDNUVuQixnQ0FBZ0MsSUFBSSxDQUFDQSw2QkFBNkIsQ0FBQ21CLElBQUksQ0FBQyxJQUFJLEdBQzVFWCxnQ0FBZ0MsSUFBSSxDQUFDQSw2QkFBNkIsQ0FBQ1csSUFBSSxDQUFDLElBQUksR0FDNUV6QixpQ0FBaUMsSUFBSSxDQUFDQSw4QkFBOEIsQ0FBQ3lCLElBQUksQ0FBQyxJQUFJLEdBQzlFUixxQ0FBcUMsSUFBSSxDQUFDQSxrQ0FBa0MsQ0FBQ1EsSUFBSSxDQUFDLElBQUksR0FDdEZyQixzQ0FBc0MsSUFBSSxDQUFDQSxtQ0FBbUMsQ0FBQ3FCLElBQUksQ0FBQyxJQUFJO1FBRWhHLE9BQVE7WUFDSkQ7WUFDQUU7WUFDQUM7WUFDQTVIO1lBQ0FFO1lBQ0FXO1lBQ0hVO1lBQ0dGO1lBQ0FWO1lBQ0FtQjtZQUNBRTtZQUNBSTtZQUNBRjtZQUNBSTtZQUNBSTtZQUNBTTtZQUNBcUM7WUFDQTdDO1lBQ0EyQjtZQUNBd0M7WUFDQUo7WUFDQVE7WUFDQWQ7WUFDQWlCO1lBQ0FiO1FBQ0o7SUFDRDtJQUVBLE9BQU93QixVQUFVLEtBQUs7SUFFckIsT0FBT0Msb0JBQW9CO1FBQ3pCO1FBQ0E7S0FDRCxDQUFDO0lBRUYsT0FBT0Msb0JBQW9CO1FBQ3pCQyxXQUFXO0lBQ2IsRUFBRTtBQUNKO01BRUEsV0FBZUMsSUFBQUEsc0JBQVMsRUFBQ2xKLFlBQVksQ0FBQzs7O2dCQUd0QixFQUFFbUosOEJBQXNCLENBQUM7Ozs7Ozs7Ozs7QUFVekMsQ0FBQyJ9