@kepler.gl/reducers 3.3.0-alpha.1 → 3.3.0-alpha.10

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 (84) hide show
  1. package/dist/cjs/combined-updaters.js +491 -0
  2. package/dist/cjs/composer-helpers.js +101 -0
  3. package/dist/cjs/composers.js +22 -0
  4. package/dist/cjs/core.js +105 -0
  5. package/dist/cjs/data-utils.js +53 -0
  6. package/dist/cjs/export-utils.js +91 -0
  7. package/dist/{index.js → cjs/index.js} +2 -3
  8. package/dist/cjs/interaction-utils.js +115 -0
  9. package/dist/cjs/layer-utils.js +635 -0
  10. package/dist/cjs/map-state-updaters.js +658 -0
  11. package/dist/cjs/map-state.js +35 -0
  12. package/dist/cjs/map-style-updaters.js +660 -0
  13. package/dist/cjs/map-style.js +33 -0
  14. package/dist/cjs/merger-handler.js +105 -0
  15. package/dist/cjs/middleware.js +27 -0
  16. package/dist/cjs/provider-state-updaters.js +465 -0
  17. package/dist/cjs/provider-state.js +34 -0
  18. package/dist/cjs/root.js +207 -0
  19. package/dist/cjs/ui-state-updaters.js +922 -0
  20. package/dist/cjs/ui-state.js +36 -0
  21. package/dist/cjs/vis-state-merger.js +1193 -0
  22. package/dist/cjs/vis-state-selectors.js +30 -0
  23. package/dist/cjs/vis-state-updaters.js +5100 -0
  24. package/dist/cjs/vis-state.js +35 -0
  25. package/dist/combined-updaters.d.ts +19 -2
  26. package/dist/composers.d.ts +2 -0
  27. package/dist/esm/combined-updaters.js +484 -0
  28. package/dist/esm/composer-helpers.js +85 -0
  29. package/dist/esm/composers.js +14 -0
  30. package/dist/esm/core.js +101 -0
  31. package/dist/esm/data-utils.js +47 -0
  32. package/dist/esm/export-utils.js +86 -0
  33. package/dist/esm/index.js +62 -0
  34. package/dist/esm/interaction-utils.js +106 -0
  35. package/dist/esm/layer-utils.js +602 -0
  36. package/dist/esm/map-state-updaters.js +650 -0
  37. package/dist/esm/map-state.js +29 -0
  38. package/dist/esm/map-style-updaters.js +652 -0
  39. package/dist/esm/map-style.js +27 -0
  40. package/dist/esm/merger-handler.js +96 -0
  41. package/dist/esm/middleware.js +19 -0
  42. package/dist/esm/provider-state-updaters.js +458 -0
  43. package/dist/esm/provider-state.js +28 -0
  44. package/dist/esm/root.js +201 -0
  45. package/dist/esm/ui-state-updaters.js +917 -0
  46. package/dist/esm/ui-state.js +30 -0
  47. package/dist/esm/vis-state-merger.js +1161 -0
  48. package/dist/esm/vis-state-selectors.js +24 -0
  49. package/dist/esm/vis-state-updaters.js +5006 -0
  50. package/dist/esm/vis-state.js +29 -0
  51. package/dist/interaction-utils.d.ts +1 -1
  52. package/dist/layer-utils.d.ts +23 -5
  53. package/dist/map-state-updaters.d.ts +26 -21
  54. package/dist/map-state.d.ts +2 -78
  55. package/dist/map-style-updaters.d.ts +1 -3
  56. package/dist/ui-state-updaters.d.ts +17 -2
  57. package/dist/vis-state-merger.d.ts +7 -0
  58. package/dist/vis-state-selectors.d.ts +42 -6
  59. package/dist/vis-state-updaters.d.ts +123 -1
  60. package/dist/vis-state.d.ts +8 -4
  61. package/package.json +37 -31
  62. package/dist/combined-updaters.js +0 -363
  63. package/dist/composer-helpers.js +0 -101
  64. package/dist/composers.js +0 -23
  65. package/dist/core.js +0 -105
  66. package/dist/data-utils.js +0 -53
  67. package/dist/export-utils.js +0 -91
  68. package/dist/interaction-utils.js +0 -105
  69. package/dist/layer-utils.js +0 -376
  70. package/dist/map-state-updaters.js +0 -438
  71. package/dist/map-state.js +0 -35
  72. package/dist/map-style-updaters.js +0 -661
  73. package/dist/map-style.js +0 -34
  74. package/dist/merger-handler.js +0 -105
  75. package/dist/middleware.js +0 -27
  76. package/dist/provider-state-updaters.js +0 -466
  77. package/dist/provider-state.js +0 -35
  78. package/dist/root.js +0 -207
  79. package/dist/ui-state-updaters.js +0 -887
  80. package/dist/ui-state.js +0 -37
  81. package/dist/vis-state-merger.js +0 -1032
  82. package/dist/vis-state-selectors.js +0 -30
  83. package/dist/vis-state-updaters.js +0 -3859
  84. package/dist/vis-state.js +0 -36
@@ -1,1032 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.VIS_STATE_MERGERS = void 0;
9
- exports.createLayerFromConfig = createLayerFromConfig;
10
- exports.insertLayerAtRightOrder = insertLayerAtRightOrder;
11
- exports.isSavedLayerConfigV1 = isSavedLayerConfigV1;
12
- exports.mergeAnimationConfig = mergeAnimationConfig;
13
- exports.mergeAnnotations = mergeAnnotations;
14
- exports.mergeDatasetsByOrder = mergeDatasetsByOrder;
15
- exports.mergeEditor = mergeEditor;
16
- exports.mergeEffects = mergeEffects;
17
- exports.mergeFilters = mergeFilters;
18
- exports.mergeInteractionTooltipConfig = mergeInteractionTooltipConfig;
19
- exports.mergeInteractions = mergeInteractions;
20
- exports.mergeLayerBlending = mergeLayerBlending;
21
- exports.mergeLayers = mergeLayers;
22
- exports.mergeOverlayBlending = mergeOverlayBlending;
23
- exports.mergeSplitMaps = mergeSplitMaps;
24
- exports.parseLayerConfig = parseLayerConfig;
25
- exports.replaceFilterDatasetIds = replaceFilterDatasetIds;
26
- exports.serializeEffect = serializeEffect;
27
- exports.serializeFilter = serializeFilter;
28
- exports.serializeLayer = serializeLayer;
29
- exports.serializeVisState = serializeVisState;
30
- exports.validateColumn = validateColumn;
31
- exports.validateLayerWithData = validateLayerWithData;
32
- exports.validateLayersByDatasets = validateLayersByDatasets;
33
- exports.validateSavedLayerColumns = validateSavedLayerColumns;
34
- exports.validateSavedTextLabel = validateSavedTextLabel;
35
- exports.validateSavedVisualChannels = validateSavedVisualChannels;
36
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
37
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
38
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
39
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
40
- var _uniq = _interopRequireDefault(require("lodash/uniq"));
41
- var _pick = _interopRequireDefault(require("lodash/pick"));
42
- var _flattenDeep = _interopRequireDefault(require("lodash/flattenDeep"));
43
- var _deepmerge = _interopRequireDefault(require("deepmerge"));
44
- var _utils = require("@kepler.gl/utils");
45
- var _effects = require("@kepler.gl/effects");
46
- var _commonUtils = require("@kepler.gl/common-utils");
47
- var _constants = require("@kepler.gl/constants");
48
- var _schemas = require("@kepler.gl/schemas");
49
- var _table = require("@kepler.gl/table");
50
- var _layerUtils = require("./layer-utils");
51
- var _excluded = ["enabled"];
52
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
53
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
54
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
55
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
56
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
57
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
58
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
59
- // Copyright contributors to the kepler.gl project
60
- /**
61
- * Merge loaded filters with current state, if no fields or data are loaded
62
- * save it for later
63
- *
64
- */
65
- function mergeFilters(state, filtersToMerge, fromConfig) {
66
- var preserveFilterOrder = fromConfig ? filtersToMerge === null || filtersToMerge === void 0 ? void 0 : filtersToMerge.map(function (l) {
67
- return l.id;
68
- }) : state.preserveFilterOrder;
69
- if (!Array.isArray(filtersToMerge) || !filtersToMerge.length) {
70
- return state;
71
- }
72
- var _validateFiltersUpdat = (0, _utils.validateFiltersUpdateDatasets)(state, filtersToMerge),
73
- validated = _validateFiltersUpdat.validated,
74
- failed = _validateFiltersUpdat.failed,
75
- updatedDatasets = _validateFiltersUpdat.updatedDatasets;
76
- var updatedFilters = insertItemBasedOnPreservedOrder(state.filters, validated, preserveFilterOrder);
77
-
78
- // merge filter with existing
79
- updatedFilters = (0, _table.resetFilterGpuMode)(updatedFilters);
80
- updatedFilters = (0, _table.assignGpuChannels)(updatedFilters);
81
- // filter data
82
- var datasetsToFilter = (0, _uniq["default"])((0, _flattenDeep["default"])(validated.map(function (f) {
83
- return f.dataId;
84
- })));
85
- var filtered = (0, _utils.applyFiltersToDatasets)(datasetsToFilter, updatedDatasets, updatedFilters, state.layers);
86
- return _objectSpread(_objectSpread({}, state), {}, {
87
- filters: updatedFilters,
88
- datasets: filtered,
89
- preserveFilterOrder: preserveFilterOrder,
90
- filterToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.filterToBeMerged), (0, _toConsumableArray2["default"])(failed))
91
- });
92
- }
93
-
94
- // replace dataId in saved Filter
95
- function replaceFilterDatasetIds(savedFilter, dataId, dataIdToUse) {
96
- var replaced = [];
97
- savedFilter.forEach(function (filter) {
98
- if (filter.dataId.includes(dataId)) {
99
- var _filter$plotType;
100
- var newDataId = filter.dataId.map(function (d) {
101
- return d === dataId ? dataIdToUse : d;
102
- });
103
- var plotType;
104
- // TODO: more generic approach to save plotType.colorsByDataId
105
- if ((_filter$plotType = filter.plotType) !== null && _filter$plotType !== void 0 && (_filter$plotType = _filter$plotType.colorsByDataId) !== null && _filter$plotType !== void 0 && _filter$plotType[dataId]) {
106
- var _filter$plotType2;
107
- // replace colorByDataId in filter.plotType
108
- var _ref = ((_filter$plotType2 = filter.plotType) === null || _filter$plotType2 === void 0 ? void 0 : _filter$plotType2.colorsByDataId) || {},
109
- color = _ref[dataId],
110
- rest = (0, _objectWithoutProperties2["default"])(_ref, [dataId].map(_toPropertyKey));
111
- plotType = _objectSpread(_objectSpread({}, filter.plotType), {}, {
112
- colorsByDataId: _objectSpread(_objectSpread({}, rest), {}, (0, _defineProperty2["default"])({}, dataIdToUse, color))
113
- });
114
- }
115
- replaced.push(_objectSpread(_objectSpread({}, filter), {}, {
116
- dataId: newDataId
117
- }, plotType ? {
118
- plotType: plotType
119
- } : {}));
120
- }
121
- });
122
- return replaced.length ? replaced : null;
123
- }
124
- function isSavedLayerConfigV1(layerConfig) {
125
- // exported layer configuration contains visualChannels property
126
- return layerConfig === null || layerConfig === void 0 ? void 0 : layerConfig.visualChannels;
127
- }
128
- function parseLayerConfig(schema, layerConfig) {
129
- var _schema$parseSavedCon;
130
- // assume the layer config is current version
131
- var savedConfig = {
132
- version: _schemas.CURRENT_VERSION,
133
- config: {
134
- visState: {
135
- layers: [layerConfig],
136
- layerOrder: [layerConfig.id]
137
- }
138
- }
139
- };
140
- return (_schema$parseSavedCon = schema.parseSavedConfig(savedConfig)) === null || _schema$parseSavedCon === void 0 || (_schema$parseSavedCon = _schema$parseSavedCon.visState) === null || _schema$parseSavedCon === void 0 || (_schema$parseSavedCon = _schema$parseSavedCon.layers) === null || _schema$parseSavedCon === void 0 ? void 0 : _schema$parseSavedCon[0];
141
- }
142
- function insertItemBasedOnPreservedOrder(currentItems, items) {
143
- var preservedOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
144
- var defaultStart = arguments.length > 3 ? arguments[3] : undefined;
145
- var newItems = (0, _toConsumableArray2["default"])(currentItems);
146
- var _iterator = _createForOfIteratorHelper(items),
147
- _step;
148
- try {
149
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
150
- var item = _step.value;
151
- var expectedIdx = preservedOrder.indexOf(item.id);
152
- // insertAt the end by default
153
- var insertAt = defaultStart ? 0 : newItems.length;
154
- if (expectedIdx > 0) {
155
- // look for layer to insert after
156
- var i = expectedIdx + 1;
157
- var preceedIdx = -1;
158
- var _loop = function _loop() {
159
- // keep looking for preceed layer that is already loaded
160
- var preceedItemId = preservedOrder[i - 1];
161
- preceedIdx = newItems.findIndex(function (d) {
162
- return d.id === preceedItemId;
163
- });
164
- };
165
- while (i-- > 0 && preceedIdx < 0) {
166
- _loop();
167
- }
168
- if (preceedIdx > -1) {
169
- // if found
170
- insertAt = preceedIdx + 1;
171
- }
172
- }
173
- newItems = (0, _utils.arrayInsert)(newItems, insertAt, item);
174
- }
175
- } catch (err) {
176
- _iterator.e(err);
177
- } finally {
178
- _iterator.f();
179
- }
180
- return newItems;
181
- }
182
- function createLayerFromConfig(state, layerConfig) {
183
- // check if the layer config is parsed
184
- var parsedLayerConfig = isSavedLayerConfigV1(layerConfig) ? parseLayerConfig(state.schema, layerConfig) : layerConfig;
185
- if (!parsedLayerConfig) {
186
- return null;
187
- }
188
- // first validate config against dataset
189
- var _validateLayersByData = validateLayersByDatasets(state.datasets, state.layerClasses, [parsedLayerConfig], {
190
- allowEmptyColumn: true
191
- }),
192
- validated = _validateLayersByData.validated,
193
- failed = _validateLayersByData.failed;
194
- if (failed !== null && failed !== void 0 && failed.length || !validated.length) {
195
- // failed
196
- return null;
197
- }
198
- var newLayer = validated[0];
199
- newLayer.updateLayerDomain(state.datasets);
200
- return newLayer;
201
- }
202
-
203
- /**
204
- * Get loaded filter from state
205
- */
206
- function serializeFilter(newFilter, schema) {
207
- var _serializedVisState$f;
208
- var serializedVisState = serializeVisState({
209
- filters: [newFilter]
210
- }, schema);
211
- return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$f = serializedVisState.filters) === null || _serializedVisState$f === void 0 ? void 0 : _serializedVisState$f[0];
212
- }
213
-
214
- /**
215
- * Get loaded layer from state
216
- */
217
- function serializeLayer(newLayer, schema) {
218
- var _serializedVisState$l;
219
- var serializedVisState = serializeVisState({
220
- layers: [newLayer],
221
- layerOrder: [newLayer.id]
222
- }, schema);
223
- return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$l = serializedVisState.layers) === null || _serializedVisState$l === void 0 ? void 0 : _serializedVisState$l[0];
224
- }
225
-
226
- /**
227
- * Get loaded effect from state
228
- */
229
- function serializeEffect(newEffect, schema) {
230
- var _serializedVisState$e;
231
- var serializedVisState = serializeVisState({
232
- effects: [newEffect],
233
- effectOrder: [newEffect.id]
234
- }, schema);
235
- return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$e = serializedVisState.effects) === null || _serializedVisState$e === void 0 ? void 0 : _serializedVisState$e[0];
236
- }
237
-
238
- /**
239
- * Get vis state config
240
- */
241
- function serializeVisState(visState, schema) {
242
- var _schema$parseSavedCon2;
243
- var savedState = schema.getConfigToSave({
244
- visState: visState
245
- });
246
- return savedState ? (_schema$parseSavedCon2 = schema.parseSavedConfig(savedState)) === null || _schema$parseSavedCon2 === void 0 ? void 0 : _schema$parseSavedCon2.visState : undefined;
247
- }
248
- /**
249
- * Merge layers from de-serialized state, if no fields or data are loaded
250
- * save it for later
251
- *
252
- */
253
- function mergeLayers(state) {
254
- var layersToMerge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
255
- var fromConfig = arguments.length > 2 ? arguments[2] : undefined;
256
- var preserveLayerOrder = fromConfig ? (0, _layerUtils.getLayerOrderFromLayers)(layersToMerge) : state.preserveLayerOrder;
257
- if (!Array.isArray(layersToMerge) || !layersToMerge.length) {
258
- return state;
259
- }
260
- // don't merge layer if dataset is being merged
261
- var unmerged = [];
262
- var toMerge = [];
263
- layersToMerge.forEach(function (l) {
264
- var _l$config;
265
- if (l !== null && l !== void 0 && (_l$config = l.config) !== null && _l$config !== void 0 && _l$config.dataId && state.isMergingDatasets[l.config.dataId]) {
266
- unmerged.push(l);
267
- } else {
268
- toMerge.push(l);
269
- }
270
- });
271
- var _validateLayersByData2 = validateLayersByDatasets(state.datasets, state.layerClasses, toMerge),
272
- mergedLayer = _validateLayersByData2.validated,
273
- failed = _validateLayersByData2.failed;
274
- unmerged.push.apply(unmerged, (0, _toConsumableArray2["default"])(failed));
275
- // put new layers in front of current layers
276
- var _insertLayerAtRightOr = insertLayerAtRightOrder(state.layers, mergedLayer, state.layerOrder, preserveLayerOrder),
277
- newLayerOrder = _insertLayerAtRightOr.newLayerOrder,
278
- newLayers = _insertLayerAtRightOr.newLayers;
279
- return _objectSpread(_objectSpread({}, state), {}, {
280
- layers: newLayers,
281
- layerOrder: newLayerOrder,
282
- preserveLayerOrder: preserveLayerOrder,
283
- layerToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.layerToBeMerged), unmerged)
284
- });
285
- }
286
- function insertLayerAtRightOrder(currentLayers, layersToInsert, currentOrder) {
287
- var preservedOrder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
288
- if (!(layersToInsert !== null && layersToInsert !== void 0 && layersToInsert.length)) {
289
- return {
290
- newLayers: currentLayers,
291
- newLayerOrder: currentOrder
292
- };
293
- }
294
- // perservedOrder ['a', 'b', 'c'];
295
- // layerOrder ['a', 'b', 'c']
296
- var currentLayerQueue = currentOrder.map(function (id) {
297
- return (0, _utils.findById)(id)(currentLayers);
298
- }).filter(function (layer) {
299
- return Boolean(layer);
300
- });
301
- var newLayers = currentLayers.concat(layersToInsert);
302
- var newLayerOrderQueue = insertItemBasedOnPreservedOrder(currentLayerQueue, layersToInsert, preservedOrder, true);
303
-
304
- // reconstruct layerOrder after insert
305
- var newLayerOrder = (0, _layerUtils.getLayerOrderFromLayers)(newLayerOrderQueue);
306
- return {
307
- newLayerOrder: newLayerOrder,
308
- newLayers: newLayers
309
- };
310
- }
311
-
312
- /**
313
- * Merge interactions with saved config
314
- *
315
- */
316
- function mergeInteractions(state, interactionToBeMerged) {
317
- var merged = {};
318
- var unmerged = {};
319
- if (interactionToBeMerged) {
320
- Object.keys(interactionToBeMerged).forEach(function (key) {
321
- if (!state.interactionConfig[key]) {
322
- return;
323
- }
324
- var currentConfig = key === 'tooltip' || key === 'brush' || key === 'geocoder' ? state.interactionConfig[key].config : null;
325
- var _ref2 = interactionToBeMerged[key] || {},
326
- enabled = _ref2.enabled,
327
- configSaved = (0, _objectWithoutProperties2["default"])(_ref2, _excluded);
328
- var configToMerge = configSaved;
329
- if (key === 'tooltip') {
330
- var _mergeInteractionTool = mergeInteractionTooltipConfig(state, configSaved),
331
- mergedTooltip = _mergeInteractionTool.mergedTooltip,
332
- unmergedTooltip = _mergeInteractionTool.unmergedTooltip;
333
-
334
- // merge new dataset tooltips with original dataset tooltips
335
- configToMerge = {
336
- fieldsToShow: _objectSpread(_objectSpread({}, currentConfig.fieldsToShow), mergedTooltip)
337
- };
338
- if (Object.keys(unmergedTooltip).length) {
339
- // @ts-expect-error
340
- unmerged.tooltip = {
341
- fieldsToShow: unmergedTooltip,
342
- enabled: Boolean(enabled)
343
- };
344
- }
345
- }
346
- merged[key] = _objectSpread(_objectSpread({}, state.interactionConfig[key]), {}, {
347
- enabled: Boolean(enabled)
348
- }, currentConfig ? {
349
- config: (0, _pick["default"])(_objectSpread(_objectSpread({}, currentConfig), configToMerge), Object.keys(currentConfig))
350
- } : {});
351
- });
352
- }
353
- var nextState = _objectSpread(_objectSpread({}, state), {}, {
354
- interactionConfig: _objectSpread(_objectSpread({}, state.interactionConfig), merged),
355
- interactionToBeMerged: savedUnmergedInteraction(state, unmerged)
356
- });
357
- return nextState;
358
- }
359
- function combineInteractionConfigs(configs) {
360
- var combined = _objectSpread({}, configs[0]);
361
- // handle each property key of an `InteractionConfig`, e.g. tooltip, geocoder, brush, coordinate
362
- // by combining values for each among all passed in configs
363
- var _loop2 = function _loop2(key) {
364
- var toBeCombinedProps = configs.map(function (c) {
365
- return c[key];
366
- });
367
-
368
- // all of these have an enabled boolean
369
- combined[key] = {
370
- // are any of the configs' enabled values true?
371
- enabled: toBeCombinedProps.some(function (p) {
372
- return p === null || p === void 0 ? void 0 : p.enabled;
373
- })
374
- };
375
- if (key === 'tooltip') {
376
- // are any of the configs' compareMode values true?
377
- combined[key].compareMode = toBeCombinedProps.some(function (p) {
378
- return p === null || p === void 0 ? void 0 : p.compareMode;
379
- });
380
-
381
- // return the compare type mode, it will be either absolute or relative
382
- combined[key].compareType = getValueWithHighestOccurrence(toBeCombinedProps.map(function (p) {
383
- return p.compareType;
384
- }));
385
-
386
- // combine fieldsToShow among all dataset ids
387
- combined[key].fieldsToShow = toBeCombinedProps.map(function (p) {
388
- return p.fieldsToShow;
389
- }).reduce(function (acc, nextFieldsToShow) {
390
- var _loop3 = function _loop3(nextDataIdKey) {
391
- var nextTooltipFields = nextFieldsToShow[nextDataIdKey];
392
- if (!acc[nextDataIdKey]) {
393
- // if the dataset id is not present in the accumulator
394
- // then add it with its tooltip fields
395
- acc[nextDataIdKey] = nextTooltipFields;
396
- } else {
397
- // otherwise the dataset id is already present in the accumulator
398
- // so only add the next tooltip fields for this dataset's array if they are not already present,
399
- // using the tooltipField.name property for uniqueness
400
- nextTooltipFields.forEach(function (nextTF) {
401
- if (!acc[nextDataIdKey].find(function (_ref3) {
402
- var name = _ref3.name;
403
- return nextTF.name === name;
404
- })) {
405
- acc[nextDataIdKey].push(nextTF);
406
- }
407
- });
408
- }
409
- };
410
- for (var nextDataIdKey in nextFieldsToShow) {
411
- _loop3(nextDataIdKey);
412
- }
413
- return acc;
414
- }, {});
415
- }
416
- if (key === 'brush') {
417
- var _aggregate;
418
- // keep the biggest brush size
419
- combined[key].size = (_aggregate = (0, _utils.aggregate)(toBeCombinedProps, _constants.AGGREGATION_TYPES.maximum, function (p) {
420
- return p.size;
421
- })) !== null && _aggregate !== void 0 ? _aggregate : null;
422
- }
423
- if (key === 'geocoder') {
424
- combined[key].limitSearch = toBeCombinedProps.some(function (p) {
425
- return p === null || p === void 0 ? void 0 : p.limitSearch;
426
- });
427
- }
428
- };
429
- for (var key in combined) {
430
- _loop2(key);
431
- }
432
- return combined;
433
- }
434
- function savedUnmergedInteraction(state, unmerged) {
435
- var _unmerged$tooltip, _unmerged$tooltip2, _state$interactionToB, _unmerged$tooltip3;
436
- if (!(unmerged !== null && unmerged !== void 0 && (_unmerged$tooltip = unmerged.tooltip) !== null && _unmerged$tooltip !== void 0 && _unmerged$tooltip.fieldsToShow)) {
437
- return state.interactionToBeMerged;
438
- }
439
- return {
440
- tooltip: _objectSpread(_objectSpread(_objectSpread({}, state.interactionToBeMerged.tooltip), typeof (unmerged === null || unmerged === void 0 || (_unmerged$tooltip2 = unmerged.tooltip) === null || _unmerged$tooltip2 === void 0 ? void 0 : _unmerged$tooltip2.enabled) === 'boolean' ? {
441
- enabled: unmerged.tooltip.enabled
442
- } : {}), {}, {
443
- fieldsToShow: _objectSpread(_objectSpread({}, (_state$interactionToB = state.interactionToBeMerged) === null || _state$interactionToB === void 0 || (_state$interactionToB = _state$interactionToB.tooltip) === null || _state$interactionToB === void 0 ? void 0 : _state$interactionToB.fieldsToShow), unmerged === null || unmerged === void 0 || (_unmerged$tooltip3 = unmerged.tooltip) === null || _unmerged$tooltip3 === void 0 ? void 0 : _unmerged$tooltip3.fieldsToShow)
444
- })
445
- };
446
- }
447
- function replaceInteractionDatasetIds(interactionConfig, dataId, dataIdToReplace) {
448
- var _interactionConfig$to;
449
- if (interactionConfig !== null && interactionConfig !== void 0 && (_interactionConfig$to = interactionConfig.tooltip) !== null && _interactionConfig$to !== void 0 && _interactionConfig$to.fieldsToShow[dataId]) {
450
- var _interactionConfig$to2;
451
- return _objectSpread(_objectSpread({}, interactionConfig), {}, {
452
- tooltip: _objectSpread(_objectSpread({}, interactionConfig.tooltip), {}, {
453
- fieldsToShow: (0, _defineProperty2["default"])({}, dataIdToReplace, interactionConfig === null || interactionConfig === void 0 || (_interactionConfig$to2 = interactionConfig.tooltip) === null || _interactionConfig$to2 === void 0 ? void 0 : _interactionConfig$to2.fieldsToShow[dataId])
454
- })
455
- });
456
- }
457
- return null;
458
- }
459
-
460
- /**
461
- * Merge splitMaps config with current visStete.
462
- * 1. if current map is split, but splitMap DOESNOT contain maps
463
- * : don't merge anything
464
- * 2. if current map is NOT split, but splitMaps contain maps
465
- * : add to splitMaps, and add current layers to splitMaps
466
- */
467
- function mergeSplitMaps(state) {
468
- var splitMaps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
469
- var merged = (0, _toConsumableArray2["default"])(state.splitMaps);
470
- var unmerged = [];
471
- splitMaps.forEach(function (sm, i) {
472
- var entries = Object.entries(sm.layers);
473
- if (entries.length > 0) {
474
- entries.forEach(function (_ref4) {
475
- var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
476
- id = _ref5[0],
477
- value = _ref5[1];
478
- // check if layer exists
479
- var pushTo = state.layers.find(function (l) {
480
- return l.id === id;
481
- }) ? merged : unmerged;
482
-
483
- // create map panel if current map is not split
484
- pushTo[i] = pushTo[i] || _objectSpread(_objectSpread({}, sm), {}, {
485
- layers: pushTo === merged ? (0, _utils.getInitialMapLayersForSplitMap)(state.layers) : []
486
- });
487
- pushTo[i].layers = _objectSpread(_objectSpread({}, pushTo[i].layers), {}, (0, _defineProperty2["default"])({}, id, value));
488
- });
489
- } else {
490
- // We are merging if there are no layers in both split map
491
- merged.push(sm);
492
- }
493
- });
494
- return _objectSpread(_objectSpread({}, state), {}, {
495
- splitMaps: merged,
496
- splitMapsToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.splitMapsToBeMerged), unmerged)
497
- });
498
- }
499
-
500
- /**
501
- * Merge effects with saved config
502
- */
503
- function mergeEffects(state, effects, fromConfig) {
504
- var newEffects = [].concat((0, _toConsumableArray2["default"])(state.effects), (0, _toConsumableArray2["default"])((effects || []).map(function (effect) {
505
- return fromConfig ? (0, _effects.createEffect)(_deepmerge["default"].all([effect, {
506
- // collapse all panels when loading effects
507
- isConfigActive: false
508
- }])) : effect;
509
- }).filter(function (effect) {
510
- return Boolean(effect && effect.isValidToSave());
511
- })));
512
- return _objectSpread(_objectSpread({}, state), {}, {
513
- effects: newEffects,
514
- effectOrder: newEffects.map(function (effect) {
515
- return effect.id;
516
- })
517
- });
518
- }
519
-
520
- /**
521
- * Merge annotations with saved config
522
- */
523
- function mergeAnnotations(state, annotations) {
524
- if (!annotations || !annotations.length) {
525
- return state;
526
- }
527
- var existingIds = new Set(state.annotations.map(function (a) {
528
- return a.id;
529
- }));
530
- var validAnnotations = annotations.filter(function (a) {
531
- return a && a.id && !existingIds.has(a.id) && (0, _constants.isAnnotationKind)(a.kind) && Array.isArray(a.anchorPoint) && a.anchorPoint.length === 2;
532
- }).map(function (a) {
533
- return _objectSpread({
534
- isVisible: true,
535
- autoSize: true,
536
- autoSizeY: true,
537
- label: '',
538
- lineColor: _constants.INITIAL_ANNOTATION_LINE_COLOR,
539
- lineWidth: _constants.INITIAL_ANNOTATION_LINE_WIDTH,
540
- textWidth: 0,
541
- textHeight: 0
542
- }, a);
543
- });
544
- if (!validAnnotations.length) {
545
- return state;
546
- }
547
- return _objectSpread(_objectSpread({}, state), {}, {
548
- annotations: [].concat((0, _toConsumableArray2["default"])(state.annotations), (0, _toConsumableArray2["default"])(validAnnotations))
549
- });
550
- }
551
-
552
- /**
553
- * Merge interactionConfig.tooltip with saved config,
554
- * validate fieldsToShow
555
- *
556
- * @param state
557
- * @param tooltipConfig
558
- * @return - {mergedTooltip: {}, unmergedTooltip: {}}
559
- */
560
- function mergeInteractionTooltipConfig(state) {
561
- var tooltipConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
562
- var unmergedTooltip = {};
563
- var mergedTooltip = {};
564
- if (!tooltipConfig || !tooltipConfig.fieldsToShow || !Object.keys(tooltipConfig.fieldsToShow).length) {
565
- return {
566
- mergedTooltip: mergedTooltip,
567
- unmergedTooltip: unmergedTooltip
568
- };
569
- }
570
- var _loop4 = function _loop4() {
571
- if (!state.datasets[dataId] || state.isMergingDatasets[dataId]) {
572
- // is not yet loaded
573
- unmergedTooltip[dataId] = tooltipConfig.fieldsToShow[dataId];
574
- } else {
575
- // if dataset is loaded
576
- var allFields = state.datasets[dataId].fields.map(function (d) {
577
- return d.name;
578
- });
579
- var foundFieldsToShow = tooltipConfig.fieldsToShow[dataId].filter(function (field) {
580
- return allFields.includes(field.name);
581
- });
582
- mergedTooltip[dataId] = foundFieldsToShow;
583
- }
584
- };
585
- for (var dataId in tooltipConfig.fieldsToShow) {
586
- _loop4();
587
- }
588
- return {
589
- mergedTooltip: mergedTooltip,
590
- unmergedTooltip: unmergedTooltip
591
- };
592
- }
593
- /**
594
- * Merge layerBlending with saved
595
- *
596
- */
597
- function mergeLayerBlending(state, layerBlending) {
598
- if (layerBlending && _constants.LAYER_BLENDINGS[layerBlending]) {
599
- return _objectSpread(_objectSpread({}, state), {}, {
600
- layerBlending: layerBlending
601
- });
602
- }
603
- return state;
604
- }
605
-
606
- /**
607
- * Combines multiple layer blending configs into a single string
608
- * by returning the one with the highest occurrence
609
- */
610
- function combineLayerBlendingConfigs(configs) {
611
- // return the mode of the layer blending type
612
- return getValueWithHighestOccurrence(configs);
613
- }
614
-
615
- /**
616
- * Merge overlayBlending with saved
617
- */
618
- function mergeOverlayBlending(state, overlayBlending) {
619
- if (overlayBlending && _constants.OVERLAY_BLENDINGS[overlayBlending]) {
620
- return _objectSpread(_objectSpread({}, state), {}, {
621
- overlayBlending: overlayBlending
622
- });
623
- }
624
- return state;
625
- }
626
-
627
- /**
628
- * Combines multiple overlay blending configs into a single string
629
- * by returning the one with the highest occurrence
630
- **/
631
- function combineOverlayBlendingConfigs(configs) {
632
- // return the mode of the overlay blending type
633
- return getValueWithHighestOccurrence(configs);
634
- }
635
-
636
- /**
637
- * Merge animation config
638
- */
639
- function mergeAnimationConfig(state, animation) {
640
- if (animation && animation.currentTime) {
641
- return _objectSpread(_objectSpread({}, state), {}, {
642
- animationConfig: _objectSpread(_objectSpread(_objectSpread({}, state.animationConfig), animation), {}, {
643
- domain: null
644
- })
645
- });
646
- }
647
- return state;
648
- }
649
- function combineAnimationConfigs(configs) {
650
- var _aggregate2, _aggregate3;
651
- // get the smallest values of currentTime and speed among all configs
652
- return {
653
- currentTime: (_aggregate2 = (0, _utils.aggregate)(configs, _constants.AGGREGATION_TYPES.minimum, function (c) {
654
- return c.currentTime;
655
- })) !== null && _aggregate2 !== void 0 ? _aggregate2 : null,
656
- speed: (_aggregate3 = (0, _utils.aggregate)(configs, _constants.AGGREGATION_TYPES.minimum, function (c) {
657
- return c.speed;
658
- })) !== null && _aggregate3 !== void 0 ? _aggregate3 : null
659
- };
660
- }
661
-
662
- /**
663
- * Validate saved layer columns with new data,
664
- * update fieldIdx based on new fields
665
- *
666
- * @param fields
667
- * @param savedCols
668
- * @param emptyCols
669
- * @param options
670
- * @return - validated columns or null
671
- */
672
-
673
- function validateSavedLayerColumns(fields) {
674
- var savedCols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
675
- var emptyCols = arguments.length > 2 ? arguments[2] : undefined;
676
- var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
677
- // Prepare columns for the validator
678
- var columns = {};
679
- var _loop5 = function _loop5() {
680
- var key = _Object$keys[_i];
681
- columns[key] = _objectSpread({}, emptyCols[key]);
682
- var saved = savedCols[key];
683
- if (saved) {
684
- var fieldIdx = fields.findIndex(function (_ref6) {
685
- var name = _ref6.name;
686
- return name === saved;
687
- });
688
- if (fieldIdx > -1) {
689
- // update found columns
690
- columns[key].fieldIdx = fieldIdx;
691
- columns[key].value = saved;
692
- }
693
- }
694
- };
695
- for (var _i = 0, _Object$keys = Object.keys(emptyCols); _i < _Object$keys.length; _i++) {
696
- _loop5();
697
- }
698
-
699
- // find actual column fieldIdx, in case it has changed
700
- var allColFound = Object.keys(columns).every(function (key) {
701
- return validateColumn(columns[key], columns, fields);
702
- });
703
- var rv = allColFound ? columns : null;
704
- if (options.throwOnError) {
705
- var requiredColumns = Object.keys(emptyCols).filter(function (k) {
706
- return !emptyCols[k].optional;
707
- });
708
- var missingColumns = requiredColumns.filter(function (k) {
709
- return !(columns !== null && columns !== void 0 && columns[k].value);
710
- });
711
- if (missingColumns.length) {
712
- throw new Error("Layer has missing or invalid columns: ".concat(missingColumns.join(', ')));
713
- }
714
- var configColumns = Object.keys(savedCols);
715
- var invalidColumns = configColumns.filter(function (k) {
716
- var _columns$k;
717
- return !(columns !== null && columns !== void 0 && (_columns$k = columns[k]) !== null && _columns$k !== void 0 && _columns$k.value);
718
- });
719
- if (invalidColumns.length) {
720
- throw new Error("Layer has invalid columns: ".concat(invalidColumns.join(', ')));
721
- }
722
- }
723
- return rv;
724
- }
725
-
726
- /**
727
- * Validate layer column
728
- */
729
- function validateColumn(column, columns, allFields) {
730
- if (column.optional || column.value) {
731
- return true;
732
- }
733
- if (column.validator) {
734
- return column.validator(column, columns, allFields);
735
- }
736
- return false;
737
- }
738
-
739
- /**
740
- * Validate saved text label config with new data
741
- * refer to vis-state-schema.js TextLabelSchemaV1
742
- *
743
- * @param {Array<Object>} fields
744
- * @param {Object} savedTextLabel
745
- * @param {Object} options
746
- * @return {Object} - validated textlabel
747
- */
748
- function validateSavedTextLabel(fields, _ref7, savedTextLabel) {
749
- var _ref8 = (0, _slicedToArray2["default"])(_ref7, 1),
750
- layerTextLabel = _ref8[0];
751
- var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
752
- var savedTextLabels = Array.isArray(savedTextLabel) ? savedTextLabel : [savedTextLabel];
753
-
754
- // validate field
755
- return savedTextLabels.map(function (textLabel) {
756
- var field = textLabel.field ? fields.find(function (fd) {
757
- return Object.keys(textLabel.field).every(function (key) {
758
- return textLabel.field[key] === fd[key];
759
- });
760
- }) : null;
761
- if (field === undefined && options.throwOnError) {
762
- throw new Error("Layer has invalid text label field: ".concat(JSON.stringify(textLabel.field)));
763
- }
764
- return Object.keys(layerTextLabel).reduce(function (accu, key) {
765
- return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, key === 'field' ? field : textLabel[key] || layerTextLabel[key]));
766
- }, {});
767
- });
768
- }
769
-
770
- /**
771
- * Validate saved visual channels config with new data,
772
- * refer to vis-state-schema.js VisualChannelSchemaV1
773
- */
774
- function validateSavedVisualChannels(fields, newLayer, savedLayer) {
775
- var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
776
- Object.values(newLayer.visualChannels).forEach(function (_ref9) {
777
- var field = _ref9.field,
778
- scale = _ref9.scale,
779
- key = _ref9.key;
780
- var foundField;
781
- if (savedLayer.config) {
782
- if (savedLayer.config[field]) {
783
- foundField = fields.find(function (fd) {
784
- return savedLayer.config && fd.name === savedLayer.config[field].name;
785
- });
786
- }
787
- var foundChannel = _objectSpread(_objectSpread({}, foundField ? (0, _defineProperty2["default"])({}, field, foundField) : {}), savedLayer.config[scale] ? (0, _defineProperty2["default"])({}, scale, savedLayer.config[scale]) : {});
788
- if (Object.keys(foundChannel).length) {
789
- newLayer.updateLayerConfig(foundChannel);
790
- }
791
- newLayer.validateVisualChannel(key);
792
- if (options.throwOnError) {
793
- var _savedLayer$config, _newLayer$config$fiel;
794
- var fieldName = (_savedLayer$config = savedLayer.config) === null || _savedLayer$config === void 0 || (_savedLayer$config = _savedLayer$config[field]) === null || _savedLayer$config === void 0 ? void 0 : _savedLayer$config.name;
795
- if (fieldName && fieldName !== ((_newLayer$config$fiel = newLayer.config[field]) === null || _newLayer$config$fiel === void 0 ? void 0 : _newLayer$config$fiel.name)) {
796
- throw new Error("Layer has invalid visual channel field: ".concat(field));
797
- }
798
- }
799
- }
800
- });
801
- return newLayer;
802
- }
803
- function validateLayersByDatasets(datasets, layerClasses) {
804
- var layers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
805
- var options = arguments.length > 3 ? arguments[3] : undefined;
806
- var validated = [];
807
- var failed = [];
808
- layers.forEach(function (layer) {
809
- var _layer$config;
810
- var validateLayer = null;
811
- if (layer !== null && layer !== void 0 && (_layer$config = layer.config) !== null && _layer$config !== void 0 && _layer$config.dataId) {
812
- if (datasets[layer.config.dataId]) {
813
- // datasets are already loaded
814
- validateLayer = validateLayerWithData(datasets[layer.config.dataId], layer, layerClasses, options);
815
- }
816
- }
817
- if (validateLayer) {
818
- validated.push(validateLayer);
819
- } else {
820
- // datasets not yet loaded
821
- failed.push(layer);
822
- }
823
- });
824
- return {
825
- validated: validated,
826
- failed: failed
827
- };
828
- }
829
-
830
- /**
831
- * Get required columns for validation based on column mode
832
- */
833
- function _getColumnConfigForValidation(newLayer) {
834
- // find column fieldIdx
835
- var columnConfig = newLayer.getLayerColumns();
836
- // if columnMode is defined, find column mode config
837
- var colModeConfig = newLayer.config.columnMode ? (newLayer.supportedColumnModes || []).find(function (colMode) {
838
- return colMode.key === newLayer.config.columnMode;
839
- }) : null;
840
- if (colModeConfig) {
841
- // only validate columns in column mode
842
- columnConfig = [].concat((0, _toConsumableArray2["default"])(colModeConfig.requiredColumns || []), (0, _toConsumableArray2["default"])(colModeConfig.optionalColumns || [])).reduce(function (accu, key) {
843
- return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, columnConfig[key]));
844
- }, {});
845
- }
846
- return columnConfig;
847
- }
848
-
849
- /**
850
- * Validate saved layer config with new data,
851
- * update fieldIdx based on new fields
852
- */
853
- // eslint-disable-next-line complexity
854
- function validateLayerWithData(dataset, savedLayer, layerClasses) {
855
- var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
856
- var fields = dataset.fields,
857
- dataId = dataset.id;
858
- var type = savedLayer.type;
859
- var throwOnError = options.throwOnError;
860
- // layer doesnt have a valid type
861
- if (!type || !Object.prototype.hasOwnProperty.call(layerClasses, type) || !savedLayer.config) {
862
- if (throwOnError) {
863
- throw new Error("Layer has invalid type \"".concat(type, "\" or config is missing"));
864
- }
865
- return null;
866
- }
867
- var newLayer = new layerClasses[type]({
868
- id: savedLayer.id,
869
- dataId: dataId,
870
- label: savedLayer.config.label,
871
- color: savedLayer.config.color,
872
- isVisible: savedLayer.config.isVisible,
873
- hidden: savedLayer.config.hidden,
874
- columnMode: savedLayer.config.columnMode,
875
- highlightColor: savedLayer.config.highlightColor
876
- });
877
- var columnConfig = _getColumnConfigForValidation(newLayer);
878
- if (Object.keys(columnConfig)) {
879
- var columns = validateSavedLayerColumns(fields, savedLayer.config.columns, columnConfig, options);
880
- if (columns) {
881
- newLayer.updateLayerConfig({
882
- columns: _objectSpread(_objectSpread({}, newLayer.config.columns), columns)
883
- });
884
- } else if (!options.allowEmptyColumn) {
885
- return null;
886
- }
887
- }
888
- var textLabel = savedLayer.config.textLabel && newLayer.config.textLabel ? validateSavedTextLabel(fields, newLayer.config.textLabel, savedLayer.config.textLabel, options) : newLayer.config.textLabel;
889
-
890
- // copy visConfig over to emptyLayer to make sure it has all the props
891
- var copiedVisConfig = newLayer.copyLayerConfig(newLayer.config.visConfig, savedLayer.config.visConfig || {}, {
892
- shallowCopy: ['colorRange', 'strokeColorRange']
893
- });
894
-
895
- // call layer methods to validate visConfig when switching dataset
896
- var visConfig = newLayer.validateVisConfig ? newLayer.validateVisConfig(dataset, copiedVisConfig) : copiedVisConfig;
897
- newLayer.updateLayerConfig({
898
- visConfig: visConfig,
899
- textLabel: textLabel
900
- });
901
-
902
- // visual channel field is saved to be {name, type}
903
- // find visual channel field by matching both name and type
904
- // refer to vis-state-schema.js VisualChannelSchemaV1
905
- newLayer = validateSavedVisualChannels(fields, newLayer, savedLayer, options);
906
- if (throwOnError) {
907
- if (!newLayer.isValidToSave()) {
908
- throw new Error("Layer is not valid to save: ".concat(newLayer.id));
909
- }
910
- }
911
- return newLayer;
912
- }
913
- function mergeEditor(state, savedEditor) {
914
- var _savedEditor$visible;
915
- if (!savedEditor) {
916
- return state;
917
- }
918
- return _objectSpread(_objectSpread({}, state), {}, {
919
- editor: _objectSpread(_objectSpread({}, state.editor), {}, {
920
- features: [].concat((0, _toConsumableArray2["default"])(state.editor.features), (0, _toConsumableArray2["default"])(savedEditor.features || [])),
921
- // if savedEditor.visible is undefined keep state.editor.visible
922
- visible: (_savedEditor$visible = savedEditor.visible) !== null && _savedEditor$visible !== void 0 ? _savedEditor$visible : state.editor.visible
923
- })
924
- });
925
- }
926
- function combineEditorConfigs(configs) {
927
- return configs.reduce(function (acc, nextConfig) {
928
- return _objectSpread(_objectSpread({}, acc), {}, {
929
- features: [].concat((0, _toConsumableArray2["default"])(acc.features), (0, _toConsumableArray2["default"])(nextConfig.features || []))
930
- });
931
- }, {
932
- // start with:
933
- // - empty array for features accumulation
934
- // - and are any of the configs' visible values true?
935
- features: [],
936
- visible: configs.some(function (c) {
937
- return c === null || c === void 0 ? void 0 : c.visible;
938
- })
939
- });
940
- }
941
-
942
- /**
943
- * Validate saved layer config with new data,
944
- * update fieldIdx based on new fields
945
- */
946
- function mergeDatasetsByOrder(state, newDataEntries) {
947
- var merged = _objectSpread(_objectSpread({}, state.datasets), newDataEntries);
948
- if (Array.isArray(state.preserveDatasetOrder)) {
949
- // preserveDatasetOrder might not include the new datasets
950
- var newDatasetIds = Object.keys(merged).filter(function (id) {
951
- var _state$preserveDatase;
952
- return !((_state$preserveDatase = state.preserveDatasetOrder) !== null && _state$preserveDatase !== void 0 && _state$preserveDatase.includes(id));
953
- });
954
- return [].concat((0, _toConsumableArray2["default"])(state.preserveDatasetOrder), (0, _toConsumableArray2["default"])(newDatasetIds)).reduce(function (accu, dataId) {
955
- return _objectSpread(_objectSpread({}, accu), merged[dataId] ? (0, _defineProperty2["default"])({}, dataId, merged[dataId]) : {});
956
- }, {});
957
- }
958
- return merged;
959
- }
960
-
961
- /**
962
- * Simliar purpose to aggregation utils `getMode` function,
963
- * but returns the mode in the same value type without coercing to a string.
964
- * It ignores `undefined` or `null` values, but returns `null` if no mode could be calculated.
965
- */
966
- function getValueWithHighestOccurrence(arr) {
967
- var _ref13;
968
- var tallys = new Map();
969
- arr.forEach(function (value) {
970
- if ((0, _commonUtils.notNullorUndefined)(value)) {
971
- if (!tallys.has(value)) {
972
- tallys.set(value, 1);
973
- } else {
974
- tallys.set(value, tallys.get(value) + 1);
975
- }
976
- }
977
- });
978
- // return the value with the highest total occurrence count
979
- if (tallys.size === 0) {
980
- return null;
981
- }
982
- return (_ref13 = (0, _toConsumableArray2["default"])(tallys.entries())) === null || _ref13 === void 0 ? void 0 : _ref13.reduce(function (acc, next) {
983
- return next[1] > acc[1] ? next : acc;
984
- })[0];
985
- }
986
- var VIS_STATE_MERGERS = exports.VIS_STATE_MERGERS = [{
987
- merge: mergeLayers,
988
- prop: 'layers',
989
- toMergeProp: 'layerToBeMerged',
990
- preserveOrder: 'preserveLayerOrder'
991
- }, {
992
- merge: mergeFilters,
993
- prop: 'filters',
994
- toMergeProp: 'filterToBeMerged',
995
- preserveOrder: 'preserveFilterOrder',
996
- replaceParentDatasetIds: replaceFilterDatasetIds
997
- }, {
998
- merge: mergeEffects,
999
- prop: 'effects'
1000
- }, {
1001
- merge: mergeAnnotations,
1002
- prop: 'annotations',
1003
- toMergeProp: 'annotationsToBeMerged'
1004
- }, {
1005
- merge: mergeInteractions,
1006
- prop: 'interactionConfig',
1007
- toMergeProp: 'interactionToBeMerged',
1008
- replaceParentDatasetIds: replaceInteractionDatasetIds,
1009
- saveUnmerged: savedUnmergedInteraction,
1010
- combineConfigs: combineInteractionConfigs
1011
- }, {
1012
- merge: mergeLayerBlending,
1013
- prop: 'layerBlending',
1014
- combineConfigs: combineLayerBlendingConfigs
1015
- }, {
1016
- merge: mergeOverlayBlending,
1017
- prop: 'overlayBlending',
1018
- combineConfigs: combineOverlayBlendingConfigs
1019
- }, {
1020
- merge: mergeSplitMaps,
1021
- prop: 'splitMaps',
1022
- toMergeProp: 'splitMapsToBeMerged'
1023
- }, {
1024
- merge: mergeAnimationConfig,
1025
- prop: 'animationConfig',
1026
- combineConfigs: combineAnimationConfigs
1027
- }, {
1028
- merge: mergeEditor,
1029
- prop: 'editor',
1030
- combineConfigs: combineEditorConfigs
1031
- }];
1032
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pcSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3BpY2siLCJfZmxhdHRlbkRlZXAiLCJfZGVlcG1lcmdlIiwiX3V0aWxzIiwiX2VmZmVjdHMiLCJfY29tbW9uVXRpbHMiLCJfY29uc3RhbnRzIiwiX3NjaGVtYXMiLCJfdGFibGUiLCJfbGF5ZXJVdGlscyIsIl9leGNsdWRlZCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsImUiLCJ0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiX3RvUHJvcGVydHlLZXkiLCJpIiwiX3RvUHJpbWl0aXZlIiwiX3R5cGVvZiIsInRvUHJpbWl0aXZlIiwiU3RyaW5nIiwiTnVtYmVyIiwib3duS2V5cyIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIm1lcmdlRmlsdGVycyIsInN0YXRlIiwiZmlsdGVyc1RvTWVyZ2UiLCJmcm9tQ29uZmlnIiwicHJlc2VydmVGaWx0ZXJPcmRlciIsIm1hcCIsImwiLCJpZCIsIl92YWxpZGF0ZUZpbHRlcnNVcGRhdCIsInZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzIiwidmFsaWRhdGVkIiwiZmFpbGVkIiwidXBkYXRlZERhdGFzZXRzIiwidXBkYXRlZEZpbHRlcnMiLCJpbnNlcnRJdGVtQmFzZWRPblByZXNlcnZlZE9yZGVyIiwiZmlsdGVycyIsInJlc2V0RmlsdGVyR3B1TW9kZSIsImFzc2lnbkdwdUNoYW5uZWxzIiwiZGF0YXNldHNUb0ZpbHRlciIsInVuaXEiLCJmbGF0dGVuRGVlcCIsImRhdGFJZCIsImZpbHRlcmVkIiwiYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyIsImxheWVycyIsImRhdGFzZXRzIiwiZmlsdGVyVG9CZU1lcmdlZCIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJyZXBsYWNlRmlsdGVyRGF0YXNldElkcyIsInNhdmVkRmlsdGVyIiwiZGF0YUlkVG9Vc2UiLCJyZXBsYWNlZCIsImluY2x1ZGVzIiwiX2ZpbHRlciRwbG90VHlwZSIsIm5ld0RhdGFJZCIsImQiLCJwbG90VHlwZSIsImNvbG9yc0J5RGF0YUlkIiwiX2ZpbHRlciRwbG90VHlwZTIiLCJfcmVmIiwiY29sb3IiLCJyZXN0IiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImlzU2F2ZWRMYXllckNvbmZpZ1YxIiwibGF5ZXJDb25maWciLCJ2aXN1YWxDaGFubmVscyIsInBhcnNlTGF5ZXJDb25maWciLCJzY2hlbWEiLCJfc2NoZW1hJHBhcnNlU2F2ZWRDb24iLCJzYXZlZENvbmZpZyIsInZlcnNpb24iLCJDVVJSRU5UX1ZFUlNJT04iLCJjb25maWciLCJ2aXNTdGF0ZSIsImxheWVyT3JkZXIiLCJwYXJzZVNhdmVkQ29uZmlnIiwiY3VycmVudEl0ZW1zIiwiaXRlbXMiLCJwcmVzZXJ2ZWRPcmRlciIsInVuZGVmaW5lZCIsImRlZmF1bHRTdGFydCIsIm5ld0l0ZW1zIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJpdGVtIiwiZXhwZWN0ZWRJZHgiLCJpbmRleE9mIiwiaW5zZXJ0QXQiLCJwcmVjZWVkSWR4IiwiX2xvb3AiLCJwcmVjZWVkSXRlbUlkIiwiZmluZEluZGV4IiwiYXJyYXlJbnNlcnQiLCJlcnIiLCJjcmVhdGVMYXllckZyb21Db25maWciLCJwYXJzZWRMYXllckNvbmZpZyIsIl92YWxpZGF0ZUxheWVyc0J5RGF0YSIsInZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyIsImxheWVyQ2xhc3NlcyIsImFsbG93RW1wdHlDb2x1bW4iLCJuZXdMYXllciIsInVwZGF0ZUxheWVyRG9tYWluIiwic2VyaWFsaXplRmlsdGVyIiwibmV3RmlsdGVyIiwiX3NlcmlhbGl6ZWRWaXNTdGF0ZSRmIiwic2VyaWFsaXplZFZpc1N0YXRlIiwic2VyaWFsaXplVmlzU3RhdGUiLCJzZXJpYWxpemVMYXllciIsIl9zZXJpYWxpemVkVmlzU3RhdGUkbCIsInNlcmlhbGl6ZUVmZmVjdCIsIm5ld0VmZmVjdCIsIl9zZXJpYWxpemVkVmlzU3RhdGUkZSIsImVmZmVjdHMiLCJlZmZlY3RPcmRlciIsIl9zY2hlbWEkcGFyc2VTYXZlZENvbjIiLCJzYXZlZFN0YXRlIiwiZ2V0Q29uZmlnVG9TYXZlIiwibWVyZ2VMYXllcnMiLCJsYXllcnNUb01lcmdlIiwicHJlc2VydmVMYXllck9yZGVyIiwiZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMiLCJ1bm1lcmdlZCIsInRvTWVyZ2UiLCJfbCRjb25maWciLCJpc01lcmdpbmdEYXRhc2V0cyIsIl92YWxpZGF0ZUxheWVyc0J5RGF0YTIiLCJtZXJnZWRMYXllciIsIl9pbnNlcnRMYXllckF0UmlnaHRPciIsImluc2VydExheWVyQXRSaWdodE9yZGVyIiwibmV3TGF5ZXJPcmRlciIsIm5ld0xheWVycyIsImxheWVyVG9CZU1lcmdlZCIsImN1cnJlbnRMYXllcnMiLCJsYXllcnNUb0luc2VydCIsImN1cnJlbnRPcmRlciIsImN1cnJlbnRMYXllclF1ZXVlIiwiZmluZEJ5SWQiLCJsYXllciIsIkJvb2xlYW4iLCJuZXdMYXllck9yZGVyUXVldWUiLCJtZXJnZUludGVyYWN0aW9ucyIsImludGVyYWN0aW9uVG9CZU1lcmdlZCIsIm1lcmdlZCIsImtleSIsImludGVyYWN0aW9uQ29uZmlnIiwiY3VycmVudENvbmZpZyIsIl9yZWYyIiwiZW5hYmxlZCIsImNvbmZpZ1NhdmVkIiwiY29uZmlnVG9NZXJnZSIsIl9tZXJnZUludGVyYWN0aW9uVG9vbCIsIm1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnIiwibWVyZ2VkVG9vbHRpcCIsInVubWVyZ2VkVG9vbHRpcCIsImZpZWxkc1RvU2hvdyIsInRvb2x0aXAiLCJwaWNrIiwibmV4dFN0YXRlIiwic2F2ZWRVbm1lcmdlZEludGVyYWN0aW9uIiwiY29tYmluZUludGVyYWN0aW9uQ29uZmlncyIsImNvbmZpZ3MiLCJjb21iaW5lZCIsIl9sb29wMiIsInRvQmVDb21iaW5lZFByb3BzIiwiYyIsInNvbWUiLCJwIiwiY29tcGFyZU1vZGUiLCJjb21wYXJlVHlwZSIsImdldFZhbHVlV2l0aEhpZ2hlc3RPY2N1cnJlbmNlIiwicmVkdWNlIiwiYWNjIiwibmV4dEZpZWxkc1RvU2hvdyIsIl9sb29wMyIsIm5leHREYXRhSWRLZXkiLCJuZXh0VG9vbHRpcEZpZWxkcyIsIm5leHRURiIsImZpbmQiLCJfcmVmMyIsIl9hZ2dyZWdhdGUiLCJzaXplIiwiYWdncmVnYXRlIiwiQUdHUkVHQVRJT05fVFlQRVMiLCJtYXhpbXVtIiwibGltaXRTZWFyY2giLCJfdW5tZXJnZWQkdG9vbHRpcCIsIl91bm1lcmdlZCR0b29sdGlwMiIsIl9zdGF0ZSRpbnRlcmFjdGlvblRvQiIsIl91bm1lcmdlZCR0b29sdGlwMyIsInJlcGxhY2VJbnRlcmFjdGlvbkRhdGFzZXRJZHMiLCJkYXRhSWRUb1JlcGxhY2UiLCJfaW50ZXJhY3Rpb25Db25maWckdG8iLCJfaW50ZXJhY3Rpb25Db25maWckdG8yIiwibWVyZ2VTcGxpdE1hcHMiLCJzcGxpdE1hcHMiLCJzbSIsImVudHJpZXMiLCJfcmVmNCIsIl9yZWY1IiwiX3NsaWNlZFRvQXJyYXkyIiwicHVzaFRvIiwiZ2V0SW5pdGlhbE1hcExheWVyc0ZvclNwbGl0TWFwIiwic3BsaXRNYXBzVG9CZU1lcmdlZCIsIm1lcmdlRWZmZWN0cyIsIm5ld0VmZmVjdHMiLCJlZmZlY3QiLCJjcmVhdGVFZmZlY3QiLCJkZWVwbWVyZ2UiLCJhbGwiLCJpc0NvbmZpZ0FjdGl2ZSIsImlzVmFsaWRUb1NhdmUiLCJtZXJnZUFubm90YXRpb25zIiwiYW5ub3RhdGlvbnMiLCJleGlzdGluZ0lkcyIsIlNldCIsInZhbGlkQW5ub3RhdGlvbnMiLCJoYXMiLCJpc0Fubm90YXRpb25LaW5kIiwia2luZCIsImFuY2hvclBvaW50IiwiaXNWaXNpYmxlIiwiYXV0b1NpemUiLCJhdXRvU2l6ZVkiLCJsYWJlbCIsImxpbmVDb2xvciIsIklOSVRJQUxfQU5OT1RBVElPTl9MSU5FX0NPTE9SIiwibGluZVdpZHRoIiwiSU5JVElBTF9BTk5PVEFUSU9OX0xJTkVfV0lEVEgiLCJ0ZXh0V2lkdGgiLCJ0ZXh0SGVpZ2h0IiwidG9vbHRpcENvbmZpZyIsIl9sb29wNCIsImFsbEZpZWxkcyIsImZpZWxkcyIsImZvdW5kRmllbGRzVG9TaG93IiwiZmllbGQiLCJtZXJnZUxheWVyQmxlbmRpbmciLCJsYXllckJsZW5kaW5nIiwiTEFZRVJfQkxFTkRJTkdTIiwiY29tYmluZUxheWVyQmxlbmRpbmdDb25maWdzIiwibWVyZ2VPdmVybGF5QmxlbmRpbmciLCJvdmVybGF5QmxlbmRpbmciLCJPVkVSTEFZX0JMRU5ESU5HUyIsImNvbWJpbmVPdmVybGF5QmxlbmRpbmdDb25maWdzIiwibWVyZ2VBbmltYXRpb25Db25maWciLCJhbmltYXRpb24iLCJjdXJyZW50VGltZSIsImFuaW1hdGlvbkNvbmZpZyIsImRvbWFpbiIsImNvbWJpbmVBbmltYXRpb25Db25maWdzIiwiX2FnZ3JlZ2F0ZTIiLCJfYWdncmVnYXRlMyIsIm1pbmltdW0iLCJzcGVlZCIsInZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMiLCJzYXZlZENvbHMiLCJlbXB0eUNvbHMiLCJvcHRpb25zIiwiY29sdW1ucyIsIl9sb29wNSIsIl9PYmplY3Qka2V5cyIsIl9pIiwic2F2ZWQiLCJmaWVsZElkeCIsIl9yZWY2IiwiYWxsQ29sRm91bmQiLCJldmVyeSIsInZhbGlkYXRlQ29sdW1uIiwicnYiLCJ0aHJvd09uRXJyb3IiLCJyZXF1aXJlZENvbHVtbnMiLCJrIiwib3B0aW9uYWwiLCJtaXNzaW5nQ29sdW1ucyIsIkVycm9yIiwiam9pbiIsImNvbmZpZ0NvbHVtbnMiLCJpbnZhbGlkQ29sdW1ucyIsIl9jb2x1bW5zJGsiLCJjb2x1bW4iLCJ2YWxpZGF0b3IiLCJ2YWxpZGF0ZVNhdmVkVGV4dExhYmVsIiwiX3JlZjciLCJzYXZlZFRleHRMYWJlbCIsIl9yZWY4IiwibGF5ZXJUZXh0TGFiZWwiLCJzYXZlZFRleHRMYWJlbHMiLCJ0ZXh0TGFiZWwiLCJmZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJhY2N1IiwidmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzIiwic2F2ZWRMYXllciIsInZhbHVlcyIsIl9yZWY5Iiwic2NhbGUiLCJmb3VuZEZpZWxkIiwiZm91bmRDaGFubmVsIiwidXBkYXRlTGF5ZXJDb25maWciLCJ2YWxpZGF0ZVZpc3VhbENoYW5uZWwiLCJfc2F2ZWRMYXllciRjb25maWciLCJfbmV3TGF5ZXIkY29uZmlnJGZpZWwiLCJmaWVsZE5hbWUiLCJfbGF5ZXIkY29uZmlnIiwidmFsaWRhdGVMYXllciIsInZhbGlkYXRlTGF5ZXJXaXRoRGF0YSIsIl9nZXRDb2x1bW5Db25maWdGb3JWYWxpZGF0aW9uIiwiY29sdW1uQ29uZmlnIiwiZ2V0TGF5ZXJDb2x1bW5zIiwiY29sTW9kZUNvbmZpZyIsImNvbHVtbk1vZGUiLCJzdXBwb3J0ZWRDb2x1bW5Nb2RlcyIsImNvbE1vZGUiLCJvcHRpb25hbENvbHVtbnMiLCJkYXRhc2V0IiwidHlwZSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiaGlkZGVuIiwiaGlnaGxpZ2h0Q29sb3IiLCJjb3BpZWRWaXNDb25maWciLCJjb3B5TGF5ZXJDb25maWciLCJ2aXNDb25maWciLCJzaGFsbG93Q29weSIsInZhbGlkYXRlVmlzQ29uZmlnIiwibWVyZ2VFZGl0b3IiLCJzYXZlZEVkaXRvciIsIl9zYXZlZEVkaXRvciR2aXNpYmxlIiwiZWRpdG9yIiwiZmVhdHVyZXMiLCJ2aXNpYmxlIiwiY29tYmluZUVkaXRvckNvbmZpZ3MiLCJuZXh0Q29uZmlnIiwibWVyZ2VEYXRhc2V0c0J5T3JkZXIiLCJuZXdEYXRhRW50cmllcyIsInByZXNlcnZlRGF0YXNldE9yZGVyIiwibmV3RGF0YXNldElkcyIsIl9zdGF0ZSRwcmVzZXJ2ZURhdGFzZSIsImFyciIsIl9yZWYxMyIsInRhbGx5cyIsIk1hcCIsIm5vdE51bGxvclVuZGVmaW5lZCIsInNldCIsImdldCIsIlZJU19TVEFURV9NRVJHRVJTIiwiZXhwb3J0cyIsIm1lcmdlIiwicHJvcCIsInRvTWVyZ2VQcm9wIiwicHJlc2VydmVPcmRlciIsInJlcGxhY2VQYXJlbnREYXRhc2V0SWRzIiwic2F2ZVVubWVyZ2VkIiwiY29tYmluZUNvbmZpZ3MiXSwic291cmNlcyI6WyIuLi9zcmMvdmlzLXN0YXRlLW1lcmdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gvdW5pcSc7XG5pbXBvcnQgcGljayBmcm9tICdsb2Rhc2gvcGljayc7XG5pbXBvcnQgZmxhdHRlbkRlZXAgZnJvbSAnbG9kYXNoL2ZsYXR0ZW5EZWVwJztcbmltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB7XG4gIGFycmF5SW5zZXJ0LFxuICBnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAsXG4gIGFwcGx5RmlsdGVyc1RvRGF0YXNldHMsXG4gIHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzLFxuICBmaW5kQnlJZCxcbiAgYWdncmVnYXRlXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQge0xheWVyfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge2NyZWF0ZUVmZmVjdH0gZnJvbSAnQGtlcGxlci5nbC9lZmZlY3RzJztcbmltcG9ydCB7bm90TnVsbG9yVW5kZWZpbmVkfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge1xuICBBR0dSRUdBVElPTl9UWVBFUyxcbiAgTEFZRVJfQkxFTkRJTkdTLFxuICBPVkVSTEFZX0JMRU5ESU5HUyxcbiAgaXNBbm5vdGF0aW9uS2luZCxcbiAgSU5JVElBTF9BTk5PVEFUSU9OX0xJTkVfQ09MT1IsXG4gIElOSVRJQUxfQU5OT1RBVElPTl9MSU5FX1dJRFRIXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7Q1VSUkVOVF9WRVJTSU9OLCBWaXNTdGF0ZSwgVmlzU3RhdGVNZXJnZXJzLCBLZXBsZXJHTFNjaGVtYUNsYXNzfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge1xuICBQYXJzZWRMYXllcixcbiAgUGFyc2VkVmlzU3RhdGUsXG4gIFNhdmVkSW50ZXJhY3Rpb25Db25maWcsXG4gIFRvb2x0aXBJbmZvLFxuICBTYXZlZEVkaXRvcixcbiAgUGFyc2VkQ29uZmlnLFxuICBGaWx0ZXIsXG4gIEVmZmVjdCBhcyBFZmZlY3RUeXBlLFxuICBQYXJzZWRFZmZlY3QsXG4gIExheWVyQ29sdW1ucyxcbiAgTGF5ZXJDb2x1bW4sXG4gIFBhcnNlZEZpbHRlcixcbiAgTmVzdGVkUGFydGlhbCxcbiAgU2F2ZWRBbmltYXRpb25Db25maWdcbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0tlcGxlclRhYmxlLCBEYXRhc2V0cywgYXNzaWduR3B1Q2hhbm5lbHMsIHJlc2V0RmlsdGVyR3B1TW9kZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5cbmltcG9ydCB7Z2V0TGF5ZXJPcmRlckZyb21MYXllcnN9IGZyb20gJy4vbGF5ZXItdXRpbHMnO1xuXG4vKipcbiAqIE1lcmdlIGxvYWRlZCBmaWx0ZXJzIHdpdGggY3VycmVudCBzdGF0ZSwgaWYgbm8gZmllbGRzIG9yIGRhdGEgYXJlIGxvYWRlZFxuICogc2F2ZSBpdCBmb3IgbGF0ZXJcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUZpbHRlcnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGZpbHRlcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydmaWx0ZXJzJ10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgcHJlc2VydmVGaWx0ZXJPcmRlciA9IGZyb21Db25maWdcbiAgICA/IGZpbHRlcnNUb01lcmdlPy5tYXAobCA9PiBsLmlkKVxuICAgIDogc3RhdGUucHJlc2VydmVGaWx0ZXJPcmRlcjtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyc1RvTWVyZ2UpIHx8ICFmaWx0ZXJzVG9NZXJnZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7dmFsaWRhdGVkLCBmYWlsZWQsIHVwZGF0ZWREYXRhc2V0c30gPSB2YWxpZGF0ZUZpbHRlcnNVcGRhdGVEYXRhc2V0cyhzdGF0ZSwgZmlsdGVyc1RvTWVyZ2UpO1xuICBsZXQgdXBkYXRlZEZpbHRlcnMgPSBpbnNlcnRJdGVtQmFzZWRPblByZXNlcnZlZE9yZGVyKFxuICAgIHN0YXRlLmZpbHRlcnMsXG4gICAgdmFsaWRhdGVkLFxuICAgIHByZXNlcnZlRmlsdGVyT3JkZXJcbiAgKTtcblxuICAvLyBtZXJnZSBmaWx0ZXIgd2l0aCBleGlzdGluZ1xuICB1cGRhdGVkRmlsdGVycyA9IHJlc2V0RmlsdGVyR3B1TW9kZSh1cGRhdGVkRmlsdGVycyk7XG4gIHVwZGF0ZWRGaWx0ZXJzID0gYXNzaWduR3B1Q2hhbm5lbHModXBkYXRlZEZpbHRlcnMpO1xuICAvLyBmaWx0ZXIgZGF0YVxuICBjb25zdCBkYXRhc2V0c1RvRmlsdGVyID0gdW5pcShmbGF0dGVuRGVlcCh2YWxpZGF0ZWQubWFwKGYgPT4gZi5kYXRhSWQpKSk7XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBhcHBseUZpbHRlcnNUb0RhdGFzZXRzKFxuICAgIGRhdGFzZXRzVG9GaWx0ZXIsXG4gICAgdXBkYXRlZERhdGFzZXRzLFxuICAgIHVwZGF0ZWRGaWx0ZXJzLFxuICAgIHN0YXRlLmxheWVyc1xuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogdXBkYXRlZEZpbHRlcnMsXG4gICAgZGF0YXNldHM6IGZpbHRlcmVkLFxuICAgIHByZXNlcnZlRmlsdGVyT3JkZXIsXG4gICAgZmlsdGVyVG9CZU1lcmdlZDogWy4uLnN0YXRlLmZpbHRlclRvQmVNZXJnZWQsIC4uLmZhaWxlZF1cbiAgfTtcbn1cblxuLy8gcmVwbGFjZSBkYXRhSWQgaW4gc2F2ZWQgRmlsdGVyXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUZpbHRlckRhdGFzZXRJZHMoXG4gIHNhdmVkRmlsdGVyOiBGaWx0ZXJbXSxcbiAgZGF0YUlkOiBzdHJpbmcsXG4gIGRhdGFJZFRvVXNlOiBzdHJpbmdcbikge1xuICBjb25zdCByZXBsYWNlZDogRmlsdGVyW10gPSBbXTtcbiAgc2F2ZWRGaWx0ZXIuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgIGlmIChmaWx0ZXIuZGF0YUlkLmluY2x1ZGVzKGRhdGFJZCkpIHtcbiAgICAgIGNvbnN0IG5ld0RhdGFJZCA9IGZpbHRlci5kYXRhSWQubWFwKGQgPT4gKGQgPT09IGRhdGFJZCA/IGRhdGFJZFRvVXNlIDogZCkpO1xuICAgICAgbGV0IHBsb3RUeXBlO1xuICAgICAgLy8gVE9ETzogbW9yZSBnZW5lcmljIGFwcHJvYWNoIHRvIHNhdmUgcGxvdFR5cGUuY29sb3JzQnlEYXRhSWRcbiAgICAgIGlmIChmaWx0ZXIucGxvdFR5cGU/LmNvbG9yc0J5RGF0YUlkPy5bZGF0YUlkXSkge1xuICAgICAgICAvLyByZXBsYWNlIGNvbG9yQnlEYXRhSWQgaW4gZmlsdGVyLnBsb3RUeXBlXG4gICAgICAgIGNvbnN0IHtbZGF0YUlkXTogY29sb3IsIC4uLnJlc3R9ID0gZmlsdGVyLnBsb3RUeXBlPy5jb2xvcnNCeURhdGFJZCB8fCB7fTtcbiAgICAgICAgcGxvdFR5cGUgPSB7XG4gICAgICAgICAgLi4uZmlsdGVyLnBsb3RUeXBlLFxuICAgICAgICAgIGNvbG9yc0J5RGF0YUlkOiB7XG4gICAgICAgICAgICAuLi5yZXN0LFxuICAgICAgICAgICAgW2RhdGFJZFRvVXNlXTogY29sb3JcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXBsYWNlZC5wdXNoKHtcbiAgICAgICAgLi4uZmlsdGVyLFxuICAgICAgICBkYXRhSWQ6IG5ld0RhdGFJZCxcbiAgICAgICAgLi4uKHBsb3RUeXBlID8ge3Bsb3RUeXBlfSA6IHt9KVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlcGxhY2VkLmxlbmd0aCA/IHJlcGxhY2VkIDogbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2F2ZWRMYXllckNvbmZpZ1YxKGxheWVyQ29uZmlnOiBhbnkpOiBib29sZWFuIHtcbiAgLy8gZXhwb3J0ZWQgbGF5ZXIgY29uZmlndXJhdGlvbiBjb250YWlucyB2aXN1YWxDaGFubmVscyBwcm9wZXJ0eVxuICByZXR1cm4gbGF5ZXJDb25maWc/LnZpc3VhbENoYW5uZWxzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMYXllckNvbmZpZyhcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzLFxuICBsYXllckNvbmZpZzogYW55XG4pOiBQYXJzZWRMYXllciB8IHVuZGVmaW5lZCB7XG4gIC8vIGFzc3VtZSB0aGUgbGF5ZXIgY29uZmlnIGlzIGN1cnJlbnQgdmVyc2lvblxuICBjb25zdCBzYXZlZENvbmZpZyA9IHtcbiAgICB2ZXJzaW9uOiBDVVJSRU5UX1ZFUlNJT04sXG4gICAgY29uZmlnOiB7XG4gICAgICB2aXNTdGF0ZToge2xheWVyczogW2xheWVyQ29uZmlnXSwgbGF5ZXJPcmRlcjogW2xheWVyQ29uZmlnLmlkXX1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHNjaGVtYS5wYXJzZVNhdmVkQ29uZmlnKHNhdmVkQ29uZmlnKT8udmlzU3RhdGU/LmxheWVycz8uWzBdO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRJdGVtQmFzZWRPblByZXNlcnZlZE9yZGVyKFxuICBjdXJyZW50SXRlbXM6IEZpbHRlcltdLFxuICBpdGVtczogRmlsdGVyW10sXG4gIHByZXNlcnZlZE9yZGVyOiBhbnlbXSA9IFtdLFxuICBkZWZhdWx0U3RhcnQ/OiBib29sZWFuXG4pIHtcbiAgbGV0IG5ld0l0ZW1zID0gWy4uLmN1cnJlbnRJdGVtc107XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgZXhwZWN0ZWRJZHggPSBwcmVzZXJ2ZWRPcmRlci5pbmRleE9mKGl0ZW0uaWQpO1xuICAgIC8vIGluc2VydEF0IHRoZSBlbmQgYnkgZGVmYXVsdFxuICAgIGxldCBpbnNlcnRBdCA9IGRlZmF1bHRTdGFydCA/IDAgOiBuZXdJdGVtcy5sZW5ndGg7XG4gICAgaWYgKGV4cGVjdGVkSWR4ID4gMCkge1xuICAgICAgLy8gbG9vayBmb3IgbGF5ZXIgdG8gaW5zZXJ0IGFmdGVyXG4gICAgICBsZXQgaSA9IGV4cGVjdGVkSWR4ICsgMTtcbiAgICAgIGxldCBwcmVjZWVkSWR4ID0gLTE7XG4gICAgICB3aGlsZSAoaS0tID4gMCAmJiBwcmVjZWVkSWR4IDwgMCkge1xuICAgICAgICAvLyBrZWVwIGxvb2tpbmcgZm9yIHByZWNlZWQgbGF5ZXIgdGhhdCBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBjb25zdCBwcmVjZWVkSXRlbUlkID0gcHJlc2VydmVkT3JkZXJbaSAtIDFdO1xuICAgICAgICBwcmVjZWVkSWR4ID0gbmV3SXRlbXMuZmluZEluZGV4KGQgPT4gZC5pZCA9PT0gcHJlY2VlZEl0ZW1JZCk7XG4gICAgICB9XG4gICAgICBpZiAocHJlY2VlZElkeCA+IC0xKSB7XG4gICAgICAgIC8vIGlmIGZvdW5kXG4gICAgICAgIGluc2VydEF0ID0gcHJlY2VlZElkeCArIDE7XG4gICAgICB9XG4gICAgfVxuICAgIG5ld0l0ZW1zID0gYXJyYXlJbnNlcnQobmV3SXRlbXMsIGluc2VydEF0LCBpdGVtKTtcbiAgfVxuICByZXR1cm4gbmV3SXRlbXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYXllckZyb21Db25maWcoc3RhdGU6IFZpc1N0YXRlLCBsYXllckNvbmZpZzogYW55KTogTGF5ZXIgfCBudWxsIHtcbiAgLy8gY2hlY2sgaWYgdGhlIGxheWVyIGNvbmZpZyBpcyBwYXJzZWRcbiAgY29uc3QgcGFyc2VkTGF5ZXJDb25maWcgPSBpc1NhdmVkTGF5ZXJDb25maWdWMShsYXllckNvbmZpZylcbiAgICA/IHBhcnNlTGF5ZXJDb25maWcoc3RhdGUuc2NoZW1hLCBsYXllckNvbmZpZylcbiAgICA6IGxheWVyQ29uZmlnO1xuXG4gIGlmICghcGFyc2VkTGF5ZXJDb25maWcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBmaXJzdCB2YWxpZGF0ZSBjb25maWcgYWdhaW5zdCBkYXRhc2V0XG4gIGNvbnN0IHt2YWxpZGF0ZWQsIGZhaWxlZH0gPSB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gICAgc3RhdGUuZGF0YXNldHMsXG4gICAgc3RhdGUubGF5ZXJDbGFzc2VzLFxuICAgIFtwYXJzZWRMYXllckNvbmZpZ10sXG4gICAge2FsbG93RW1wdHlDb2x1bW46IHRydWV9XG4gICk7XG5cbiAgaWYgKGZhaWxlZD8ubGVuZ3RoIHx8ICF2YWxpZGF0ZWQubGVuZ3RoKSB7XG4gICAgLy8gZmFpbGVkXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBuZXdMYXllciA9IHZhbGlkYXRlZFswXTtcbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJEb21haW4oc3RhdGUuZGF0YXNldHMpO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbi8qKlxuICogR2V0IGxvYWRlZCBmaWx0ZXIgZnJvbSBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplRmlsdGVyKFxuICBuZXdGaWx0ZXI6IEZpbHRlcixcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzXG4pOiBQYXJzZWRGaWx0ZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZXJpYWxpemVkVmlzU3RhdGUgPSBzZXJpYWxpemVWaXNTdGF0ZSh7ZmlsdGVyczogW25ld0ZpbHRlcl19LCBzY2hlbWEpO1xuICByZXR1cm4gc2VyaWFsaXplZFZpc1N0YXRlPy5maWx0ZXJzPy5bMF07XG59XG5cbi8qKlxuICogR2V0IGxvYWRlZCBsYXllciBmcm9tIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVMYXllcihcbiAgbmV3TGF5ZXI6IExheWVyLFxuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hQ2xhc3Ncbik6IFBhcnNlZExheWVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VyaWFsaXplZFZpc1N0YXRlID0gc2VyaWFsaXplVmlzU3RhdGUoXG4gICAge2xheWVyczogW25ld0xheWVyXSwgbGF5ZXJPcmRlcjogW25ld0xheWVyLmlkXX0sXG4gICAgc2NoZW1hXG4gICk7XG4gIHJldHVybiBzZXJpYWxpemVkVmlzU3RhdGU/LmxheWVycz8uWzBdO1xufVxuXG4vKipcbiAqIEdldCBsb2FkZWQgZWZmZWN0IGZyb20gc3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUVmZmVjdChcbiAgbmV3RWZmZWN0OiBFZmZlY3RUeXBlLFxuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hQ2xhc3Ncbik6IFBhcnNlZEVmZmVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRWaXNTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKFxuICAgIHtlZmZlY3RzOiBbbmV3RWZmZWN0XSwgZWZmZWN0T3JkZXI6IFtuZXdFZmZlY3QuaWRdfSxcbiAgICBzY2hlbWFcbiAgKTtcbiAgcmV0dXJuIHNlcmlhbGl6ZWRWaXNTdGF0ZT8uZWZmZWN0cz8uWzBdO1xufVxuXG4vKipcbiAqIEdldCB2aXMgc3RhdGUgY29uZmlnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVWaXNTdGF0ZShcbiAgdmlzU3RhdGU6IFBhcnRpYWw8VmlzU3RhdGU+LFxuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hQ2xhc3Ncbik6IFBhcnNlZFZpc1N0YXRlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2F2ZWRTdGF0ZSA9IHNjaGVtYS5nZXRDb25maWdUb1NhdmUoe1xuICAgIHZpc1N0YXRlXG4gIH0pO1xuICByZXR1cm4gc2F2ZWRTdGF0ZSA/IHNjaGVtYS5wYXJzZVNhdmVkQ29uZmlnKHNhdmVkU3RhdGUpPy52aXNTdGF0ZSA6IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogTWVyZ2UgbGF5ZXJzIGZyb20gZGUtc2VyaWFsaXplZCBzdGF0ZSwgaWYgbm8gZmllbGRzIG9yIGRhdGEgYXJlIGxvYWRlZFxuICogc2F2ZSBpdCBmb3IgbGF0ZXJcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxheWVyczxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgbGF5ZXJzVG9NZXJnZTogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBjb25zdCBwcmVzZXJ2ZUxheWVyT3JkZXIgPSBmcm9tQ29uZmlnXG4gICAgPyBnZXRMYXllck9yZGVyRnJvbUxheWVycyhsYXllcnNUb01lcmdlKVxuICAgIDogc3RhdGUucHJlc2VydmVMYXllck9yZGVyO1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGF5ZXJzVG9NZXJnZSkgfHwgIWxheWVyc1RvTWVyZ2UubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIC8vIGRvbid0IG1lcmdlIGxheWVyIGlmIGRhdGFzZXQgaXMgYmVpbmcgbWVyZ2VkXG4gIGNvbnN0IHVubWVyZ2VkOiBQYXJzZWRMYXllcltdID0gW107XG4gIGNvbnN0IHRvTWVyZ2U6IFBhcnNlZExheWVyW10gPSBbXTtcbiAgbGF5ZXJzVG9NZXJnZS5mb3JFYWNoKChsOiBQYXJzZWRMYXllcikgPT4ge1xuICAgIGlmIChsPy5jb25maWc/LmRhdGFJZCAmJiBzdGF0ZS5pc01lcmdpbmdEYXRhc2V0c1tsLmNvbmZpZy5kYXRhSWRdKSB7XG4gICAgICB1bm1lcmdlZC5wdXNoKGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b01lcmdlLnB1c2gobCk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCB7dmFsaWRhdGVkOiBtZXJnZWRMYXllciwgZmFpbGVkfSA9IHZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyhcbiAgICBzdGF0ZS5kYXRhc2V0cyxcbiAgICBzdGF0ZS5sYXllckNsYXNzZXMsXG4gICAgdG9NZXJnZVxuICApO1xuICB1bm1lcmdlZC5wdXNoKC4uLmZhaWxlZCk7XG4gIC8vIHB1dCBuZXcgbGF5ZXJzIGluIGZyb250IG9mIGN1cnJlbnQgbGF5ZXJzXG4gIGNvbnN0IHtuZXdMYXllck9yZGVyLCBuZXdMYXllcnN9ID0gaW5zZXJ0TGF5ZXJBdFJpZ2h0T3JkZXIoXG4gICAgc3RhdGUubGF5ZXJzLFxuICAgIG1lcmdlZExheWVyLFxuICAgIHN0YXRlLmxheWVyT3JkZXIsXG4gICAgcHJlc2VydmVMYXllck9yZGVyXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBsYXllck9yZGVyOiBuZXdMYXllck9yZGVyLFxuICAgIHByZXNlcnZlTGF5ZXJPcmRlcixcbiAgICBsYXllclRvQmVNZXJnZWQ6IFsuLi5zdGF0ZS5sYXllclRvQmVNZXJnZWQsIC4uLnVubWVyZ2VkXVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0TGF5ZXJBdFJpZ2h0T3JkZXIoXG4gIGN1cnJlbnRMYXllcnMsXG4gIGxheWVyc1RvSW5zZXJ0LFxuICBjdXJyZW50T3JkZXIsXG4gIHByZXNlcnZlZE9yZGVyOiBzdHJpbmdbXSA9IFtdXG4pIHtcbiAgaWYgKCFsYXllcnNUb0luc2VydD8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtuZXdMYXllcnM6IGN1cnJlbnRMYXllcnMsIG5ld0xheWVyT3JkZXI6IGN1cnJlbnRPcmRlcn07XG4gIH1cbiAgLy8gcGVyc2VydmVkT3JkZXIgWydhJywgJ2InLCAnYyddO1xuICAvLyBsYXllck9yZGVyIFsnYScsICdiJywgJ2MnXVxuICBjb25zdCBjdXJyZW50TGF5ZXJRdWV1ZSA9IGN1cnJlbnRPcmRlclxuICAgIC5tYXAoaWQgPT4gZmluZEJ5SWQoaWQpKGN1cnJlbnRMYXllcnMpKVxuICAgIC5maWx0ZXIobGF5ZXIgPT4gQm9vbGVhbihsYXllcikpO1xuICBjb25zdCBuZXdMYXllcnMgPSBjdXJyZW50TGF5ZXJzLmNvbmNhdChsYXllcnNUb0luc2VydCk7XG4gIGNvbnN0IG5ld0xheWVyT3JkZXJRdWV1ZSA9IGluc2VydEl0ZW1CYXNlZE9uUHJlc2VydmVkT3JkZXIoXG4gICAgY3VycmVudExheWVyUXVldWUsXG4gICAgbGF5ZXJzVG9JbnNlcnQsXG4gICAgcHJlc2VydmVkT3JkZXIsXG4gICAgdHJ1ZVxuICApO1xuXG4gIC8vIHJlY29uc3RydWN0IGxheWVyT3JkZXIgYWZ0ZXIgaW5zZXJ0XG4gIGNvbnN0IG5ld0xheWVyT3JkZXIgPSBnZXRMYXllck9yZGVyRnJvbUxheWVycyhuZXdMYXllck9yZGVyUXVldWUpO1xuXG4gIHJldHVybiB7XG4gICAgbmV3TGF5ZXJPcmRlcixcbiAgICBuZXdMYXllcnNcbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBpbnRlcmFjdGlvbnMgd2l0aCBzYXZlZCBjb25maWdcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUludGVyYWN0aW9uczxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+IHwgdW5kZWZpbmVkXG4pOiBTIHtcbiAgY29uc3QgbWVyZ2VkOiBOZXN0ZWRQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG4gIGNvbnN0IHVubWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG5cbiAgaWYgKGludGVyYWN0aW9uVG9CZU1lcmdlZCkge1xuICAgIChPYmplY3Qua2V5cyhpbnRlcmFjdGlvblRvQmVNZXJnZWQpIGFzIEFycmF5PGtleW9mIFNhdmVkSW50ZXJhY3Rpb25Db25maWc+KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50Q29uZmlnID1cbiAgICAgICAga2V5ID09PSAndG9vbHRpcCcgfHwga2V5ID09PSAnYnJ1c2gnIHx8IGtleSA9PT0gJ2dlb2NvZGVyJ1xuICAgICAgICAgID8gc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XS5jb25maWdcbiAgICAgICAgICA6IG51bGw7XG5cbiAgICAgIGNvbnN0IHtlbmFibGVkLCAuLi5jb25maWdTYXZlZH0gPSBpbnRlcmFjdGlvblRvQmVNZXJnZWRba2V5XSB8fCB7fTtcblxuICAgICAgbGV0IGNvbmZpZ1RvTWVyZ2UgPSBjb25maWdTYXZlZDtcblxuICAgICAgaWYgKGtleSA9PT0gJ3Rvb2x0aXAnKSB7XG4gICAgICAgIGNvbnN0IHttZXJnZWRUb29sdGlwLCB1bm1lcmdlZFRvb2x0aXB9ID0gbWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWcoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29uZmlnU2F2ZWQgYXMgU2F2ZWRJbnRlcmFjdGlvbkNvbmZpZ1sndG9vbHRpcCddXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gbWVyZ2UgbmV3IGRhdGFzZXQgdG9vbHRpcHMgd2l0aCBvcmlnaW5hbCBkYXRhc2V0IHRvb2x0aXBzXG4gICAgICAgIGNvbmZpZ1RvTWVyZ2UgPSB7XG4gICAgICAgICAgZmllbGRzVG9TaG93OiB7XG4gICAgICAgICAgICAuLi4oY3VycmVudENvbmZpZyBhcyBUb29sdGlwSW5mb1snY29uZmlnJ10pLmZpZWxkc1RvU2hvdyxcbiAgICAgICAgICAgIC4uLm1lcmdlZFRvb2x0aXBcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHVubWVyZ2VkVG9vbHRpcCkubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIHVubWVyZ2VkLnRvb2x0aXAgPSB7ZmllbGRzVG9TaG93OiB1bm1lcmdlZFRvb2x0aXAsIGVuYWJsZWQ6IEJvb2xlYW4oZW5hYmxlZCl9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1lcmdlZFtrZXldID0ge1xuICAgICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1trZXldLFxuICAgICAgICBlbmFibGVkOiBCb29sZWFuKGVuYWJsZWQpLFxuICAgICAgICAuLi4oY3VycmVudENvbmZpZ1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjb25maWc6IHBpY2soXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgLi4uY3VycmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgIC4uLmNvbmZpZ1RvTWVyZ2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAuLi5tZXJnZWRcbiAgICB9LFxuICAgIGludGVyYWN0aW9uVG9CZU1lcmdlZDogc2F2ZWRVbm1lcmdlZEludGVyYWN0aW9uKHN0YXRlLCB1bm1lcmdlZClcbiAgfTtcbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gY29tYmluZUludGVyYWN0aW9uQ29uZmlncyhjb25maWdzOiBTYXZlZEludGVyYWN0aW9uQ29uZmlnW10pOiBTYXZlZEludGVyYWN0aW9uQ29uZmlnIHtcbiAgY29uc3QgY29tYmluZWQgPSB7Li4uY29uZmlnc1swXX07XG4gIC8vIGhhbmRsZSBlYWNoIHByb3BlcnR5IGtleSBvZiBhbiBgSW50ZXJhY3Rpb25Db25maWdgLCBlLmcuIHRvb2x0aXAsIGdlb2NvZGVyLCBicnVzaCwgY29vcmRpbmF0ZVxuICAvLyBieSBjb21iaW5pbmcgdmFsdWVzIGZvciBlYWNoIGFtb25nIGFsbCBwYXNzZWQgaW4gY29uZmlnc1xuXG4gIGZvciAoY29uc3Qga2V5IGluIGNvbWJpbmVkKSB7XG4gICAgY29uc3QgdG9CZUNvbWJpbmVkUHJvcHMgPSBjb25maWdzLm1hcChjID0+IGNba2V5XSk7XG5cbiAgICAvLyBhbGwgb2YgdGhlc2UgaGF2ZSBhbiBlbmFibGVkIGJvb2xlYW5cbiAgICBjb21iaW5lZFtrZXldID0ge1xuICAgICAgLy8gYXJlIGFueSBvZiB0aGUgY29uZmlncycgZW5hYmxlZCB2YWx1ZXMgdHJ1ZT9cbiAgICAgIGVuYWJsZWQ6IHRvQmVDb21iaW5lZFByb3BzLnNvbWUocCA9PiBwPy5lbmFibGVkKVxuICAgIH07XG5cbiAgICBpZiAoa2V5ID09PSAndG9vbHRpcCcpIHtcbiAgICAgIC8vIGFyZSBhbnkgb2YgdGhlIGNvbmZpZ3MnIGNvbXBhcmVNb2RlIHZhbHVlcyB0cnVlP1xuICAgICAgY29tYmluZWRba2V5XS5jb21wYXJlTW9kZSA9IHRvQmVDb21iaW5lZFByb3BzLnNvbWUocCA9PiBwPy5jb21wYXJlTW9kZSk7XG5cbiAgICAgIC8vIHJldHVybiB0aGUgY29tcGFyZSB0eXBlIG1vZGUsIGl0IHdpbGwgYmUgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlXG4gICAgICBjb21iaW5lZFtrZXldLmNvbXBhcmVUeXBlID0gZ2V0VmFsdWVXaXRoSGlnaGVzdE9jY3VycmVuY2UoXG4gICAgICAgIHRvQmVDb21iaW5lZFByb3BzLm1hcChwID0+IHAuY29tcGFyZVR5cGUpXG4gICAgICApO1xuXG4gICAgICAvLyBjb21iaW5lIGZpZWxkc1RvU2hvdyBhbW9uZyBhbGwgZGF0YXNldCBpZHNcbiAgICAgIGNvbWJpbmVkW2tleV0uZmllbGRzVG9TaG93ID0gdG9CZUNvbWJpbmVkUHJvcHNcbiAgICAgICAgLm1hcChwID0+IHAuZmllbGRzVG9TaG93KVxuICAgICAgICAucmVkdWNlKChhY2MsIG5leHRGaWVsZHNUb1Nob3cpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5leHREYXRhSWRLZXkgaW4gbmV4dEZpZWxkc1RvU2hvdykge1xuICAgICAgICAgICAgY29uc3QgbmV4dFRvb2x0aXBGaWVsZHMgPSBuZXh0RmllbGRzVG9TaG93W25leHREYXRhSWRLZXldO1xuICAgICAgICAgICAgaWYgKCFhY2NbbmV4dERhdGFJZEtleV0pIHtcbiAgICAgICAgICAgICAgLy8gaWYgdGhlIGRhdGFzZXQgaWQgaXMgbm90IHByZXNlbnQgaW4gdGhlIGFjY3VtdWxhdG9yXG4gICAgICAgICAgICAgIC8vIHRoZW4gYWRkIGl0IHdpdGggaXRzIHRvb2x0aXAgZmllbGRzXG4gICAgICAgICAgICAgIGFjY1tuZXh0RGF0YUlkS2V5XSA9IG5leHRUb29sdGlwRmllbGRzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBkYXRhc2V0IGlkIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgYWNjdW11bGF0b3JcbiAgICAgICAgICAgICAgLy8gc28gb25seSBhZGQgdGhlIG5leHQgdG9vbHRpcCBmaWVsZHMgZm9yIHRoaXMgZGF0YXNldCdzIGFycmF5IGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHByZXNlbnQsXG4gICAgICAgICAgICAgIC8vIHVzaW5nIHRoZSB0b29sdGlwRmllbGQubmFtZSBwcm9wZXJ0eSBmb3IgdW5pcXVlbmVzc1xuICAgICAgICAgICAgICBuZXh0VG9vbHRpcEZpZWxkcy5mb3JFYWNoKG5leHRURiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhY2NbbmV4dERhdGFJZEtleV0uZmluZCgoe25hbWV9KSA9PiBuZXh0VEYubmFtZSA9PT0gbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgIGFjY1tuZXh0RGF0YUlkS2V5XS5wdXNoKG5leHRURik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdicnVzaCcpIHtcbiAgICAgIC8vIGtlZXAgdGhlIGJpZ2dlc3QgYnJ1c2ggc2l6ZVxuICAgICAgY29tYmluZWRba2V5XS5zaXplID1cbiAgICAgICAgYWdncmVnYXRlKHRvQmVDb21iaW5lZFByb3BzLCBBR0dSRUdBVElPTl9UWVBFUy5tYXhpbXVtLCBwID0+IHAuc2l6ZSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnZ2VvY29kZXInKSB7XG4gICAgICBjb21iaW5lZFtrZXldLmxpbWl0U2VhcmNoID0gdG9CZUNvbWJpbmVkUHJvcHMuc29tZShwID0+IHA/LmxpbWl0U2VhcmNoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29tYmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNhdmVkVW5tZXJnZWRJbnRlcmFjdGlvbjxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgdW5tZXJnZWQ6IFBhcnRpYWw8U2F2ZWRJbnRlcmFjdGlvbkNvbmZpZz5cbikge1xuICBpZiAoIXVubWVyZ2VkPy50b29sdGlwPy5maWVsZHNUb1Nob3cpIHtcbiAgICByZXR1cm4gc3RhdGUuaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkO1xuICB9XG4gIHJldHVybiB7XG4gICAgdG9vbHRpcDoge1xuICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkLnRvb2x0aXAsXG4gICAgICAuLi4odHlwZW9mIHVubWVyZ2VkPy50b29sdGlwPy5lbmFibGVkID09PSAnYm9vbGVhbidcbiAgICAgICAgPyB7ZW5hYmxlZDogdW5tZXJnZWQudG9vbHRpcC5lbmFibGVkfVxuICAgICAgICA6IHt9KSxcbiAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvblRvQmVNZXJnZWQ/LnRvb2x0aXA/LmZpZWxkc1RvU2hvdyxcbiAgICAgICAgLi4udW5tZXJnZWQ/LnRvb2x0aXA/LmZpZWxkc1RvU2hvd1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUludGVyYWN0aW9uRGF0YXNldElkcyhpbnRlcmFjdGlvbkNvbmZpZywgZGF0YUlkOiBzdHJpbmcsIGRhdGFJZFRvUmVwbGFjZTogc3RyaW5nKSB7XG4gIGlmIChpbnRlcmFjdGlvbkNvbmZpZz8udG9vbHRpcD8uZmllbGRzVG9TaG93W2RhdGFJZF0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICB0b29sdGlwOiB7XG4gICAgICAgIC4uLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAsXG4gICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgIFtkYXRhSWRUb1JlcGxhY2VdOiBpbnRlcmFjdGlvbkNvbmZpZz8udG9vbHRpcD8uZmllbGRzVG9TaG93W2RhdGFJZF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogTWVyZ2Ugc3BsaXRNYXBzIGNvbmZpZyB3aXRoIGN1cnJlbnQgdmlzU3RldGUuXG4gKiAxLiBpZiBjdXJyZW50IG1hcCBpcyBzcGxpdCwgYnV0IHNwbGl0TWFwIERPRVNOT1QgY29udGFpbiBtYXBzXG4gKiAgICA6IGRvbid0IG1lcmdlIGFueXRoaW5nXG4gKiAyLiBpZiBjdXJyZW50IG1hcCBpcyBOT1Qgc3BsaXQsIGJ1dCBzcGxpdE1hcHMgY29udGFpbiBtYXBzXG4gKiAgICA6IGFkZCB0byBzcGxpdE1hcHMsIGFuZCBhZGQgY3VycmVudCBsYXllcnMgdG8gc3BsaXRNYXBzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVNwbGl0TWFwczxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgc3BsaXRNYXBzOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydzcGxpdE1hcHMnXSA9IFtdXG4pOiBTIHtcbiAgY29uc3QgbWVyZ2VkID0gWy4uLnN0YXRlLnNwbGl0TWFwc107XG4gIGNvbnN0IHVubWVyZ2VkID0gW107XG4gIHNwbGl0TWFwcy5mb3JFYWNoKChzbSwgaSkgPT4ge1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhzbS5sYXllcnMpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGVudHJpZXMuZm9yRWFjaCgoW2lkLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgLy8gY2hlY2sgaWYgbGF5ZXIgZXhpc3RzXG4gICAgICAgIGNvbnN0IHB1c2hUbyA9IHN0YXRlLmxheWVycy5maW5kKGwgPT4gbC5pZCA9PT0gaWQpID8gbWVyZ2VkIDogdW5tZXJnZWQ7XG5cbiAgICAgICAgLy8gY3JlYXRlIG1hcCBwYW5lbCBpZiBjdXJyZW50IG1hcCBpcyBub3Qgc3BsaXRcbiAgICAgICAgcHVzaFRvW2ldID0gcHVzaFRvW2ldIHx8IHtcbiAgICAgICAgICAvLyBrZWVwIGlkXG4gICAgICAgICAgLi4uc20sXG4gICAgICAgICAgbGF5ZXJzOiBwdXNoVG8gPT09IG1lcmdlZCA/IGdldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcChzdGF0ZS5sYXllcnMpIDogW11cbiAgICAgICAgfTtcbiAgICAgICAgcHVzaFRvW2ldLmxheWVycyA9IHtcbiAgICAgICAgICAuLi5wdXNoVG9baV0ubGF5ZXJzLFxuICAgICAgICAgIFtpZF06IHZhbHVlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgYXJlIG1lcmdpbmcgaWYgdGhlcmUgYXJlIG5vIGxheWVycyBpbiBib3RoIHNwbGl0IG1hcFxuICAgICAgbWVyZ2VkLnB1c2goc20pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzcGxpdE1hcHM6IG1lcmdlZCxcbiAgICBzcGxpdE1hcHNUb0JlTWVyZ2VkOiBbLi4uc3RhdGUuc3BsaXRNYXBzVG9CZU1lcmdlZCwgLi4udW5tZXJnZWRdXG4gIH07XG59XG5cbi8qKlxuICogTWVyZ2UgZWZmZWN0cyB3aXRoIHNhdmVkIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VFZmZlY3RzPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBlZmZlY3RzOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydlZmZlY3RzJ10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgbmV3RWZmZWN0cyA9IFtcbiAgICAuLi5zdGF0ZS5lZmZlY3RzLFxuICAgIC4uLihlZmZlY3RzIHx8IFtdKVxuICAgICAgLm1hcChlZmZlY3QgPT4ge1xuICAgICAgICByZXR1cm4gZnJvbUNvbmZpZ1xuICAgICAgICAgID8gY3JlYXRlRWZmZWN0KFxuICAgICAgICAgICAgICBkZWVwbWVyZ2UuYWxsKFtcbiAgICAgICAgICAgICAgICBlZmZlY3QsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgLy8gY29sbGFwc2UgYWxsIHBhbmVscyB3aGVuIGxvYWRpbmcgZWZmZWN0c1xuICAgICAgICAgICAgICAgICAgaXNDb25maWdBY3RpdmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogKGVmZmVjdCBhcyBFZmZlY3RUeXBlKTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKGVmZmVjdCA9PiB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKGVmZmVjdCAmJiBlZmZlY3QuaXNWYWxpZFRvU2F2ZSgpKTtcbiAgICAgIH0pXG4gIF07XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWZmZWN0czogbmV3RWZmZWN0cyxcbiAgICBlZmZlY3RPcmRlcjogbmV3RWZmZWN0cy5tYXAoZWZmZWN0ID0+IGVmZmVjdC5pZClcbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBhbm5vdGF0aW9ucyB3aXRoIHNhdmVkIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VBbm5vdGF0aW9uczxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTLCBhbm5vdGF0aW9uczogYW55W10pOiBTIHtcbiAgaWYgKCFhbm5vdGF0aW9ucyB8fCAhYW5ub3RhdGlvbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChzdGF0ZS5hbm5vdGF0aW9ucy5tYXAoYSA9PiBhLmlkKSk7XG4gIGNvbnN0IHZhbGlkQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uc1xuICAgIC5maWx0ZXIoXG4gICAgICBhID0+XG4gICAgICAgIGEgJiZcbiAgICAgICAgYS5pZCAmJlxuICAgICAgICAhZXhpc3RpbmdJZHMuaGFzKGEuaWQpICYmXG4gICAgICAgIGlzQW5ub3RhdGlvbktpbmQoYS5raW5kKSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGEuYW5jaG9yUG9pbnQpICYmXG4gICAgICAgIGEuYW5jaG9yUG9pbnQubGVuZ3RoID09PSAyXG4gICAgKVxuICAgIC5tYXAoYSA9PiAoe1xuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgYXV0b1NpemU6IHRydWUsXG4gICAgICBhdXRvU2l6ZVk6IHRydWUsXG4gICAgICBsYWJlbDogJycsXG4gICAgICBsaW5lQ29sb3I6IElOSVRJQUxfQU5OT1RBVElPTl9MSU5FX0NPTE9SLFxuICAgICAgbGluZVdpZHRoOiBJTklUSUFMX0FOTk9UQVRJT05fTElORV9XSURUSCxcbiAgICAgIHRleHRXaWR0aDogMCxcbiAgICAgIHRleHRIZWlnaHQ6IDAsXG4gICAgICAuLi5hXG4gICAgfSkpO1xuICBpZiAoIXZhbGlkQW5ub3RhdGlvbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgYW5ub3RhdGlvbnM6IFsuLi5zdGF0ZS5hbm5vdGF0aW9ucywgLi4udmFsaWRBbm5vdGF0aW9uc11cbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBpbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwIHdpdGggc2F2ZWQgY29uZmlnLFxuICogdmFsaWRhdGUgZmllbGRzVG9TaG93XG4gKlxuICogQHBhcmFtIHN0YXRlXG4gKiBAcGFyYW0gdG9vbHRpcENvbmZpZ1xuICogQHJldHVybiAtIHttZXJnZWRUb29sdGlwOiB7fSwgdW5tZXJnZWRUb29sdGlwOiB7fX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHRvb2x0aXBDb25maWc6IFBpY2s8VG9vbHRpcEluZm9bJ2NvbmZpZyddLCAnZmllbGRzVG9TaG93Jz4gfCBudWxsID0gbnVsbFxuKSB7XG4gIGNvbnN0IHVubWVyZ2VkVG9vbHRpcDogVG9vbHRpcEluZm9bJ2NvbmZpZyddWydmaWVsZHNUb1Nob3cnXSA9IHt9O1xuICBjb25zdCBtZXJnZWRUb29sdGlwOiBUb29sdGlwSW5mb1snY29uZmlnJ11bJ2ZpZWxkc1RvU2hvdyddID0ge307XG5cbiAgaWYgKFxuICAgICF0b29sdGlwQ29uZmlnIHx8XG4gICAgIXRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93IHx8XG4gICAgIU9iamVjdC5rZXlzKHRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93KS5sZW5ndGhcbiAgKSB7XG4gICAgcmV0dXJuIHttZXJnZWRUb29sdGlwLCB1bm1lcmdlZFRvb2x0aXB9O1xuICB9XG5cbiAgZm9yIChjb25zdCBkYXRhSWQgaW4gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cpIHtcbiAgICBpZiAoIXN0YXRlLmRhdGFzZXRzW2RhdGFJZF0gfHwgc3RhdGUuaXNNZXJnaW5nRGF0YXNldHNbZGF0YUlkXSkge1xuICAgICAgLy8gaXMgbm90IHlldCBsb2FkZWRcbiAgICAgIHVubWVyZ2VkVG9vbHRpcFtkYXRhSWRdID0gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgZGF0YXNldCBpcyBsb2FkZWRcbiAgICAgIGNvbnN0IGFsbEZpZWxkcyA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uZmllbGRzLm1hcChkID0+IGQubmFtZSk7XG4gICAgICBjb25zdCBmb3VuZEZpZWxkc1RvU2hvdyA9IHRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF0uZmlsdGVyKGZpZWxkID0+XG4gICAgICAgIGFsbEZpZWxkcy5pbmNsdWRlcyhmaWVsZC5uYW1lKVxuICAgICAgKTtcblxuICAgICAgbWVyZ2VkVG9vbHRpcFtkYXRhSWRdID0gZm91bmRGaWVsZHNUb1Nob3c7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHttZXJnZWRUb29sdGlwLCB1bm1lcmdlZFRvb2x0aXB9O1xufVxuLyoqXG4gKiBNZXJnZSBsYXllckJsZW5kaW5nIHdpdGggc2F2ZWRcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxheWVyQmxlbmRpbmc8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGxheWVyQmxlbmRpbmc6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVyQmxlbmRpbmcnXVxuKTogUyB7XG4gIGlmIChsYXllckJsZW5kaW5nICYmIExBWUVSX0JMRU5ESU5HU1tsYXllckJsZW5kaW5nXSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxheWVyQmxlbmRpbmdcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIENvbWJpbmVzIG11bHRpcGxlIGxheWVyIGJsZW5kaW5nIGNvbmZpZ3MgaW50byBhIHNpbmdsZSBzdHJpbmdcbiAqIGJ5IHJldHVybmluZyB0aGUgb25lIHdpdGggdGhlIGhpZ2hlc3Qgb2NjdXJyZW5jZVxuICovXG5mdW5jdGlvbiBjb21iaW5lTGF5ZXJCbGVuZGluZ0NvbmZpZ3MoY29uZmlnczogc3RyaW5nW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgLy8gcmV0dXJuIHRoZSBtb2RlIG9mIHRoZSBsYXllciBibGVuZGluZyB0eXBlXG4gIHJldHVybiBnZXRWYWx1ZVdpdGhIaWdoZXN0T2NjdXJyZW5jZShjb25maWdzKTtcbn1cblxuLyoqXG4gKiBNZXJnZSBvdmVybGF5QmxlbmRpbmcgd2l0aCBzYXZlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPdmVybGF5QmxlbmRpbmc8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIG92ZXJsYXlCbGVuZGluZzogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnb3ZlcmxheUJsZW5kaW5nJ11cbik6IFMge1xuICBpZiAob3ZlcmxheUJsZW5kaW5nICYmIE9WRVJMQVlfQkxFTkRJTkdTW292ZXJsYXlCbGVuZGluZ10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBvdmVybGF5QmxlbmRpbmdcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIENvbWJpbmVzIG11bHRpcGxlIG92ZXJsYXkgYmxlbmRpbmcgY29uZmlncyBpbnRvIGEgc2luZ2xlIHN0cmluZ1xuICogYnkgcmV0dXJuaW5nIHRoZSBvbmUgd2l0aCB0aGUgaGlnaGVzdCBvY2N1cnJlbmNlXG4gKiovXG5mdW5jdGlvbiBjb21iaW5lT3ZlcmxheUJsZW5kaW5nQ29uZmlncyhjb25maWdzOiBzdHJpbmdbXSk6IHN0cmluZyB8IG51bGwge1xuICAvLyByZXR1cm4gdGhlIG1vZGUgb2YgdGhlIG92ZXJsYXkgYmxlbmRpbmcgdHlwZVxuICByZXR1cm4gZ2V0VmFsdWVXaXRoSGlnaGVzdE9jY3VycmVuY2UoY29uZmlncyk7XG59XG5cbi8qKlxuICogTWVyZ2UgYW5pbWF0aW9uIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VBbmltYXRpb25Db25maWc8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFuaW1hdGlvbjogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnYW5pbWF0aW9uQ29uZmlnJ11cbik6IFMge1xuICBpZiAoYW5pbWF0aW9uICYmIGFuaW1hdGlvbi5jdXJyZW50VGltZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgICAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgICAgIC4uLmFuaW1hdGlvbixcbiAgICAgICAgZG9tYWluOiBudWxsXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZnVuY3Rpb24gY29tYmluZUFuaW1hdGlvbkNvbmZpZ3MoY29uZmlnczogU2F2ZWRBbmltYXRpb25Db25maWdbXSk6IFNhdmVkQW5pbWF0aW9uQ29uZmlnIHtcbiAgLy8gZ2V0IHRoZSBzbWFsbGVzdCB2YWx1ZXMgb2YgY3VycmVudFRpbWUgYW5kIHNwZWVkIGFtb25nIGFsbCBjb25maWdzXG4gIHJldHVybiB7XG4gICAgY3VycmVudFRpbWU6IGFnZ3JlZ2F0ZShjb25maWdzLCBBR0dSRUdBVElPTl9UWVBFUy5taW5pbXVtLCBjID0+IGMuY3VycmVudFRpbWUpID8/IG51bGwsXG4gICAgc3BlZWQ6IGFnZ3JlZ2F0ZShjb25maWdzLCBBR0dSRUdBVElPTl9UWVBFUy5taW5pbXVtLCBjID0+IGMuc3BlZWQpID8/IG51bGxcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCBsYXllciBjb2x1bW5zIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICpcbiAqIEBwYXJhbSBmaWVsZHNcbiAqIEBwYXJhbSBzYXZlZENvbHNcbiAqIEBwYXJhbSBlbXB0eUNvbHNcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJuIC0gdmFsaWRhdGVkIGNvbHVtbnMgb3IgbnVsbFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zKFxuICBmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSxcbiAgc2F2ZWRDb2xzOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9ID0ge30sXG4gIGVtcHR5Q29sczogTGF5ZXJDb2x1bW5zLFxuICBvcHRpb25zOiB7dGhyb3dPbkVycm9yPzogYm9vbGVhbn0gPSB7fVxuKSB7XG4gIC8vIFByZXBhcmUgY29sdW1ucyBmb3IgdGhlIHZhbGlkYXRvclxuICBjb25zdCBjb2x1bW5zOiB0eXBlb2YgZW1wdHlDb2xzID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVtcHR5Q29scykpIHtcbiAgICBjb2x1bW5zW2tleV0gPSB7Li4uZW1wdHlDb2xzW2tleV19O1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBzYXZlZENvbHNba2V5XTtcbiAgICBpZiAoc2F2ZWQpIHtcbiAgICAgIGNvbnN0IGZpZWxkSWR4ID0gZmllbGRzLmZpbmRJbmRleCgoe25hbWV9KSA9PiBuYW1lID09PSBzYXZlZCk7XG5cbiAgICAgIGlmIChmaWVsZElkeCA+IC0xKSB7XG4gICAgICAgIC8vIHVwZGF0ZSBmb3VuZCBjb2x1bW5zXG4gICAgICAgIGNvbHVtbnNba2V5XS5maWVsZElkeCA9IGZpZWxkSWR4O1xuICAgICAgICBjb2x1bW5zW2tleV0udmFsdWUgPSBzYXZlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBmaW5kIGFjdHVhbCBjb2x1bW4gZmllbGRJZHgsIGluIGNhc2UgaXQgaGFzIGNoYW5nZWRcbiAgY29uc3QgYWxsQ29sRm91bmQgPSBPYmplY3Qua2V5cyhjb2x1bW5zKS5ldmVyeShrZXkgPT5cbiAgICB2YWxpZGF0ZUNvbHVtbihjb2x1bW5zW2tleV0sIGNvbHVtbnMsIGZpZWxkcylcbiAgKTtcblxuICBjb25zdCBydiA9IGFsbENvbEZvdW5kID8gY29sdW1ucyA6IG51bGw7XG4gIGlmIChvcHRpb25zLnRocm93T25FcnJvcikge1xuICAgIGNvbnN0IHJlcXVpcmVkQ29sdW1ucyA9IE9iamVjdC5rZXlzKGVtcHR5Q29scykuZmlsdGVyKGsgPT4gIWVtcHR5Q29sc1trXS5vcHRpb25hbCk7XG4gICAgY29uc3QgbWlzc2luZ0NvbHVtbnMgPSByZXF1aXJlZENvbHVtbnMuZmlsdGVyKGsgPT4gIWNvbHVtbnM/LltrXS52YWx1ZSk7XG4gICAgaWYgKG1pc3NpbmdDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXllciBoYXMgbWlzc2luZyBvciBpbnZhbGlkIGNvbHVtbnM6ICR7bWlzc2luZ0NvbHVtbnMuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnQ29sdW1ucyA9IE9iamVjdC5rZXlzKHNhdmVkQ29scyk7XG4gICAgY29uc3QgaW52YWxpZENvbHVtbnMgPSBjb25maWdDb2x1bW5zLmZpbHRlcihrID0+ICFjb2x1bW5zPy5ba10/LnZhbHVlKTtcbiAgICBpZiAoaW52YWxpZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGhhcyBpbnZhbGlkIGNvbHVtbnM6ICR7aW52YWxpZENvbHVtbnMuam9pbignLCAnKX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcnY7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgbGF5ZXIgY29sdW1uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbHVtbihcbiAgY29sdW1uOiBMYXllckNvbHVtbiAmIHt2YWxpZGF0b3I/OiB0eXBlb2YgdmFsaWRhdGVDb2x1bW59LFxuICBjb2x1bW5zOiBMYXllckNvbHVtbnMsXG4gIGFsbEZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddXG4pOiBib29sZWFuIHtcbiAgaWYgKGNvbHVtbi5vcHRpb25hbCB8fCBjb2x1bW4udmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoY29sdW1uLnZhbGlkYXRvcikge1xuICAgIHJldHVybiBjb2x1bW4udmFsaWRhdG9yKGNvbHVtbiwgY29sdW1ucywgYWxsRmllbGRzKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgdGV4dCBsYWJlbCBjb25maWcgd2l0aCBuZXcgZGF0YVxuICogcmVmZXIgdG8gdmlzLXN0YXRlLXNjaGVtYS5qcyBUZXh0TGFiZWxTY2hlbWFWMVxuICpcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gZmllbGRzXG4gKiBAcGFyYW0ge09iamVjdH0gc2F2ZWRUZXh0TGFiZWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gdmFsaWRhdGVkIHRleHRsYWJlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChcbiAgZmllbGRzLFxuICBbbGF5ZXJUZXh0TGFiZWxdLFxuICBzYXZlZFRleHRMYWJlbCxcbiAgb3B0aW9uczoge3Rocm93T25FcnJvcj86IGJvb2xlYW59ID0ge31cbikge1xuICBjb25zdCBzYXZlZFRleHRMYWJlbHMgPSBBcnJheS5pc0FycmF5KHNhdmVkVGV4dExhYmVsKSA/IHNhdmVkVGV4dExhYmVsIDogW3NhdmVkVGV4dExhYmVsXTtcblxuICAvLyB2YWxpZGF0ZSBmaWVsZFxuICByZXR1cm4gc2F2ZWRUZXh0TGFiZWxzLm1hcCh0ZXh0TGFiZWwgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGV4dExhYmVsLmZpZWxkXG4gICAgICA/IGZpZWxkcy5maW5kKGZkID0+XG4gICAgICAgICAgT2JqZWN0LmtleXModGV4dExhYmVsLmZpZWxkKS5ldmVyeShrZXkgPT4gdGV4dExhYmVsLmZpZWxkW2tleV0gPT09IGZkW2tleV0pXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcblxuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkICYmIG9wdGlvbnMudGhyb3dPbkVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGhhcyBpbnZhbGlkIHRleHQgbGFiZWwgZmllbGQ6ICR7SlNPTi5zdHJpbmdpZnkodGV4dExhYmVsLmZpZWxkKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMobGF5ZXJUZXh0TGFiZWwpLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiBrZXkgPT09ICdmaWVsZCcgPyBmaWVsZCA6IHRleHRMYWJlbFtrZXldIHx8IGxheWVyVGV4dExhYmVsW2tleV1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCB2aXN1YWwgY2hhbm5lbHMgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiByZWZlciB0byB2aXMtc3RhdGUtc2NoZW1hLmpzIFZpc3VhbENoYW5uZWxTY2hlbWFWMVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKFxuICBmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSxcbiAgbmV3TGF5ZXI6IExheWVyLFxuICBzYXZlZExheWVyOiBQYXJzZWRMYXllcixcbiAgb3B0aW9uczoge3Rocm93T25FcnJvcj86IGJvb2xlYW59ID0ge31cbik6IG51bGwgfCBMYXllciB7XG4gIE9iamVjdC52YWx1ZXMobmV3TGF5ZXIudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goKHtmaWVsZCwgc2NhbGUsIGtleX0pID0+IHtcbiAgICBsZXQgZm91bmRGaWVsZDtcbiAgICBpZiAoc2F2ZWRMYXllci5jb25maWcpIHtcbiAgICAgIGlmIChzYXZlZExheWVyLmNvbmZpZ1tmaWVsZF0pIHtcbiAgICAgICAgZm91bmRGaWVsZCA9IGZpZWxkcy5maW5kKFxuICAgICAgICAgIGZkID0+IHNhdmVkTGF5ZXIuY29uZmlnICYmIGZkLm5hbWUgPT09IHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXS5uYW1lXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvdW5kQ2hhbm5lbCA9IHtcbiAgICAgICAgLi4uKGZvdW5kRmllbGQgPyB7W2ZpZWxkXTogZm91bmRGaWVsZH0gOiB7fSksXG4gICAgICAgIC4uLihzYXZlZExheWVyLmNvbmZpZ1tzY2FsZV0gPyB7W3NjYWxlXTogc2F2ZWRMYXllci5jb25maWdbc2NhbGVdfSA6IHt9KVxuICAgICAgfTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhmb3VuZENoYW5uZWwpLmxlbmd0aCkge1xuICAgICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyhmb3VuZENoYW5uZWwpO1xuICAgICAgfVxuXG4gICAgICBuZXdMYXllci52YWxpZGF0ZVZpc3VhbENoYW5uZWwoa2V5KTtcbiAgICAgIGlmIChvcHRpb25zLnRocm93T25FcnJvcikge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBzYXZlZExheWVyLmNvbmZpZz8uW2ZpZWxkXT8ubmFtZTtcbiAgICAgICAgaWYgKGZpZWxkTmFtZSAmJiBmaWVsZE5hbWUgIT09IG5ld0xheWVyLmNvbmZpZ1tmaWVsZF0/Lm5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGhhcyBpbnZhbGlkIHZpc3VhbCBjaGFubmVsIGZpZWxkOiAke2ZpZWxkfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG50eXBlIFZhbGlkYXRlTGF5ZXJPcHRpb24gPSB7XG4gIGFsbG93RW1wdHlDb2x1bW4/OiBib29sZWFuO1xuICB0aHJvd09uRXJyb3I/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyhcbiAgZGF0YXNldHM6IERhdGFzZXRzLFxuICBsYXllckNsYXNzZXM6IFZpc1N0YXRlWydsYXllckNsYXNzZXMnXSxcbiAgbGF5ZXJzOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydsYXllcnMnXSA9IFtdLFxuICBvcHRpb25zPzogVmFsaWRhdGVMYXllck9wdGlvblxuKSB7XG4gIGNvbnN0IHZhbGlkYXRlZDogTGF5ZXJbXSA9IFtdO1xuICBjb25zdCBmYWlsZWQ6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW107XG5cbiAgbGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgIGxldCB2YWxpZGF0ZUxheWVyOiBMYXllciB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKGxheWVyPy5jb25maWc/LmRhdGFJZCkge1xuICAgICAgaWYgKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdKSB7XG4gICAgICAgIC8vIGRhdGFzZXRzIGFyZSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICB2YWxpZGF0ZUxheWVyID0gdmFsaWRhdGVMYXllcldpdGhEYXRhKFxuICAgICAgICAgIGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdLFxuICAgICAgICAgIGxheWVyLFxuICAgICAgICAgIGxheWVyQ2xhc3NlcyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlTGF5ZXIpIHtcbiAgICAgIHZhbGlkYXRlZC5wdXNoKHZhbGlkYXRlTGF5ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkYXRhc2V0cyBub3QgeWV0IGxvYWRlZFxuICAgICAgZmFpbGVkLnB1c2gobGF5ZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHt2YWxpZGF0ZWQsIGZhaWxlZH07XG59XG5cbi8qKlxuICogR2V0IHJlcXVpcmVkIGNvbHVtbnMgZm9yIHZhbGlkYXRpb24gYmFzZWQgb24gY29sdW1uIG1vZGVcbiAqL1xuZnVuY3Rpb24gX2dldENvbHVtbkNvbmZpZ0ZvclZhbGlkYXRpb24obmV3TGF5ZXIpIHtcbiAgLy8gZmluZCBjb2x1bW4gZmllbGRJZHhcbiAgbGV0IGNvbHVtbkNvbmZpZyA9IG5ld0xheWVyLmdldExheWVyQ29sdW1ucygpO1xuICAvLyBpZiBjb2x1bW5Nb2RlIGlzIGRlZmluZWQsIGZpbmQgY29sdW1uIG1vZGUgY29uZmlnXG4gIGNvbnN0IGNvbE1vZGVDb25maWcgPSBuZXdMYXllci5jb25maWcuY29sdW1uTW9kZVxuICAgID8gKG5ld0xheWVyLnN1cHBvcnRlZENvbHVtbk1vZGVzIHx8IFtdKS5maW5kKFxuICAgICAgICBjb2xNb2RlID0+IGNvbE1vZGUua2V5ID09PSBuZXdMYXllci5jb25maWcuY29sdW1uTW9kZVxuICAgICAgKVxuICAgIDogbnVsbDtcblxuICBpZiAoY29sTW9kZUNvbmZpZykge1xuICAgIC8vIG9ubHkgdmFsaWRhdGUgY29sdW1ucyBpbiBjb2x1bW4gbW9kZVxuICAgIGNvbHVtbkNvbmZpZyA9IFtcbiAgICAgIC4uLihjb2xNb2RlQ29uZmlnLnJlcXVpcmVkQ29sdW1ucyB8fCBbXSksXG4gICAgICAuLi4oY29sTW9kZUNvbmZpZy5vcHRpb25hbENvbHVtbnMgfHwgW10pXG4gICAgXS5yZWR1Y2UoXG4gICAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XTogY29sdW1uQ29uZmlnW2tleV1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGNvbHVtbkNvbmZpZztcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCBsYXllciBjb25maWcgd2l0aCBuZXcgZGF0YSxcbiAqIHVwZGF0ZSBmaWVsZElkeCBiYXNlZCBvbiBuZXcgZmllbGRzXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcldpdGhEYXRhKFxuICBkYXRhc2V0OiBLZXBsZXJUYWJsZSxcbiAgc2F2ZWRMYXllcjogUGFyc2VkTGF5ZXIsXG4gIGxheWVyQ2xhc3NlczogVmlzU3RhdGVbJ2xheWVyQ2xhc3NlcyddLFxuICBvcHRpb25zOiBWYWxpZGF0ZUxheWVyT3B0aW9uID0ge31cbik6IExheWVyIHwgbnVsbCB7XG4gIGNvbnN0IHtmaWVsZHMsIGlkOiBkYXRhSWR9ID0gZGF0YXNldDtcbiAgY29uc3Qge3R5cGV9ID0gc2F2ZWRMYXllcjtcbiAgY29uc3Qge3Rocm93T25FcnJvcn0gPSBvcHRpb25zO1xuICAvLyBsYXllciBkb2VzbnQgaGF2ZSBhIHZhbGlkIHR5cGVcbiAgaWYgKCF0eXBlIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobGF5ZXJDbGFzc2VzLCB0eXBlKSB8fCAhc2F2ZWRMYXllci5jb25maWcpIHtcbiAgICBpZiAodGhyb3dPbkVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGhhcyBpbnZhbGlkIHR5cGUgXCIke3R5cGV9XCIgb3IgY29uZmlnIGlzIG1pc3NpbmdgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgbmV3TGF5ZXIgPSBuZXcgbGF5ZXJDbGFzc2VzW3R5cGVdKHtcbiAgICBpZDogc2F2ZWRMYXllci5pZCxcbiAgICBkYXRhSWQsXG4gICAgbGFiZWw6IHNhdmVkTGF5ZXIuY29uZmlnLmxhYmVsLFxuICAgIGNvbG9yOiBzYXZlZExheWVyLmNvbmZpZy5jb2xvcixcbiAgICBpc1Zpc2libGU6IHNhdmVkTGF5ZXIuY29uZmlnLmlzVmlzaWJsZSxcbiAgICBoaWRkZW46IHNhdmVkTGF5ZXIuY29uZmlnLmhpZGRlbixcbiAgICBjb2x1bW5Nb2RlOiBzYXZlZExheWVyLmNvbmZpZy5jb2x1bW5Nb2RlLFxuICAgIGhpZ2hsaWdodENvbG9yOiBzYXZlZExheWVyLmNvbmZpZy5oaWdobGlnaHRDb2xvclxuICB9KTtcblxuICBjb25zdCBjb2x1bW5Db25maWcgPSBfZ2V0Q29sdW1uQ29uZmlnRm9yVmFsaWRhdGlvbihuZXdMYXllcik7XG5cbiAgaWYgKE9iamVjdC5rZXlzKGNvbHVtbkNvbmZpZykpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdmFsaWRhdGVTYXZlZExheWVyQ29sdW1ucyhcbiAgICAgIGZpZWxkcyxcbiAgICAgIHNhdmVkTGF5ZXIuY29uZmlnLmNvbHVtbnMsXG4gICAgICBjb2x1bW5Db25maWcsXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgICBpZiAoY29sdW1ucykge1xuICAgICAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgICBjb2x1bW5zOiB7XG4gICAgICAgICAgLi4ubmV3TGF5ZXIuY29uZmlnLmNvbHVtbnMsXG4gICAgICAgICAgLi4uY29sdW1uc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCFvcHRpb25zLmFsbG93RW1wdHlDb2x1bW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRleHRMYWJlbCA9XG4gICAgc2F2ZWRMYXllci5jb25maWcudGV4dExhYmVsICYmIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWxcbiAgICAgID8gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChcbiAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbCxcbiAgICAgICAgICBzYXZlZExheWVyLmNvbmZpZy50ZXh0TGFiZWwsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApXG4gICAgICA6IG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWw7XG5cbiAgLy8gY29weSB2aXNDb25maWcgb3ZlciB0byBlbXB0eUxheWVyIHRvIG1ha2Ugc3VyZSBpdCBoYXMgYWxsIHRoZSBwcm9wc1xuICBjb25zdCBjb3BpZWRWaXNDb25maWcgPSBuZXdMYXllci5jb3B5TGF5ZXJDb25maWcoXG4gICAgbmV3TGF5ZXIuY29uZmlnLnZpc0NvbmZpZyxcbiAgICBzYXZlZExheWVyLmNvbmZpZy52aXNDb25maWcgfHwge30sXG4gICAge1xuICAgICAgc2hhbGxvd0NvcHk6IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ11cbiAgICB9XG4gICk7XG5cbiAgLy8gY2FsbCBsYXllciBtZXRob2RzIHRvIHZhbGlkYXRlIHZpc0NvbmZpZyB3aGVuIHN3aXRjaGluZyBkYXRhc2V0XG4gIGNvbnN0IHZpc0NvbmZpZyA9IG5ld0xheWVyLnZhbGlkYXRlVmlzQ29uZmlnXG4gICAgPyBuZXdMYXllci52YWxpZGF0ZVZpc0NvbmZpZyhkYXRhc2V0LCBjb3BpZWRWaXNDb25maWcpXG4gICAgOiBjb3BpZWRWaXNDb25maWc7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIHZpc0NvbmZpZyxcbiAgICB0ZXh0TGFiZWxcbiAgfSk7XG5cbiAgLy8gdmlzdWFsIGNoYW5uZWwgZmllbGQgaXMgc2F2ZWQgdG8gYmUge25hbWUsIHR5cGV9XG4gIC8vIGZpbmQgdmlzdWFsIGNoYW5uZWwgZmllbGQgYnkgbWF0Y2hpbmcgYm90aCBuYW1lIGFuZCB0eXBlXG4gIC8vIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gIG5ld0xheWVyID0gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKGZpZWxkcywgbmV3TGF5ZXIsIHNhdmVkTGF5ZXIsIG9wdGlvbnMpO1xuXG4gIGlmICh0aHJvd09uRXJyb3IpIHtcbiAgICBpZiAoIW5ld0xheWVyLmlzVmFsaWRUb1NhdmUoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXllciBpcyBub3QgdmFsaWQgdG8gc2F2ZTogJHtuZXdMYXllci5pZH1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUVkaXRvcjxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTLCBzYXZlZEVkaXRvcjogU2F2ZWRFZGl0b3IpIHtcbiAgaWYgKCFzYXZlZEVkaXRvcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRvcjoge1xuICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgZmVhdHVyZXM6IFsuLi5zdGF0ZS5lZGl0b3IuZmVhdHVyZXMsIC4uLihzYXZlZEVkaXRvci5mZWF0dXJlcyB8fCBbXSldLFxuICAgICAgLy8gaWYgc2F2ZWRFZGl0b3IudmlzaWJsZSBpcyB1bmRlZmluZWQga2VlcCBzdGF0ZS5lZGl0b3IudmlzaWJsZVxuICAgICAgdmlzaWJsZTogc2F2ZWRFZGl0b3IudmlzaWJsZSA/PyBzdGF0ZS5lZGl0b3IudmlzaWJsZVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tYmluZUVkaXRvckNvbmZpZ3MoY29uZmlnczogU2F2ZWRFZGl0b3JbXSk6IFNhdmVkRWRpdG9yIHtcbiAgcmV0dXJuIGNvbmZpZ3MucmVkdWNlKFxuICAgIChhY2MsIG5leHRDb25maWcpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFjYyxcbiAgICAgICAgZmVhdHVyZXM6IFsuLi5hY2MuZmVhdHVyZXMsIC4uLihuZXh0Q29uZmlnLmZlYXR1cmVzIHx8IFtdKV1cbiAgICAgIH07XG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBzdGFydCB3aXRoOlxuICAgICAgLy8gLSBlbXB0eSBhcnJheSBmb3IgZmVhdHVyZXMgYWNjdW11bGF0aW9uXG4gICAgICAvLyAtIGFuZCBhcmUgYW55IG9mIHRoZSBjb25maWdzJyB2aXNpYmxlIHZhbHVlcyB0cnVlP1xuICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgdmlzaWJsZTogY29uZmlncy5zb21lKGMgPT4gYz8udmlzaWJsZSlcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEYXRhc2V0c0J5T3JkZXIoc3RhdGU6IFZpc1N0YXRlLCBuZXdEYXRhRW50cmllczogRGF0YXNldHMpOiBEYXRhc2V0cyB7XG4gIGNvbnN0IG1lcmdlZCA9IHtcbiAgICAuLi5zdGF0ZS5kYXRhc2V0cyxcbiAgICAuLi5uZXdEYXRhRW50cmllc1xuICB9O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXRlLnByZXNlcnZlRGF0YXNldE9yZGVyKSkge1xuICAgIC8vIHByZXNlcnZlRGF0YXNldE9yZGVyICBtaWdodCBub3QgaW5jbHVkZSB0aGUgIG5ldyBkYXRhc2V0c1xuICAgIGNvbnN0IG5ld0RhdGFzZXRJZHMgPSBPYmplY3Qua2V5cyhtZXJnZWQpLmZpbHRlcihcbiAgICAgIGlkID0+ICFzdGF0ZS5wcmVzZXJ2ZURhdGFzZXRPcmRlcj8uaW5jbHVkZXMoaWQpXG4gICAgKTtcbiAgICByZXR1cm4gWy4uLnN0YXRlLnByZXNlcnZlRGF0YXNldE9yZGVyLCAuLi5uZXdEYXRhc2V0SWRzXS5yZWR1Y2UoXG4gICAgICAoYWNjdSwgZGF0YUlkKSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICAuLi4obWVyZ2VkW2RhdGFJZF0gPyB7W2RhdGFJZF06IG1lcmdlZFtkYXRhSWRdfSA6IHt9KVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG4vKipcbiAqIFNpbWxpYXIgcHVycG9zZSB0byBhZ2dyZWdhdGlvbiB1dGlscyBgZ2V0TW9kZWAgZnVuY3Rpb24sXG4gKiBidXQgcmV0dXJucyB0aGUgbW9kZSBpbiB0aGUgc2FtZSB2YWx1ZSB0eXBlIHdpdGhvdXQgY29lcmNpbmcgdG8gYSBzdHJpbmcuXG4gKiBJdCBpZ25vcmVzIGB1bmRlZmluZWRgIG9yIGBudWxsYCB2YWx1ZXMsIGJ1dCByZXR1cm5zIGBudWxsYCBpZiBubyBtb2RlIGNvdWxkIGJlIGNhbGN1bGF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlV2l0aEhpZ2hlc3RPY2N1cnJlbmNlPFQ+KGFycjogVFtdKTogVCB8IG51bGwge1xuICBjb25zdCB0YWxseXMgPSBuZXcgTWFwKCk7XG4gIGFyci5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICBpZiAobm90TnVsbG9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgaWYgKCF0YWxseXMuaGFzKHZhbHVlKSkge1xuICAgICAgICB0YWxseXMuc2V0KHZhbHVlLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhbGx5cy5zZXQodmFsdWUsIHRhbGx5cy5nZXQodmFsdWUpICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgLy8gcmV0dXJuIHRoZSB2YWx1ZSB3aXRoIHRoZSBoaWdoZXN0IHRvdGFsIG9jY3VycmVuY2UgY291bnRcbiAgaWYgKHRhbGx5cy5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIFsuLi50YWxseXMuZW50cmllcygpXT8ucmVkdWNlKChhY2MsIG5leHQpID0+IChuZXh0WzFdID4gYWNjWzFdID8gbmV4dCA6IGFjYykpWzBdO1xufVxuXG5leHBvcnQgY29uc3QgVklTX1NUQVRFX01FUkdFUlM6IFZpc1N0YXRlTWVyZ2Vyczxhbnk+ID0gW1xuICB7XG4gICAgbWVyZ2U6IG1lcmdlTGF5ZXJzLFxuICAgIHByb3A6ICdsYXllcnMnLFxuICAgIHRvTWVyZ2VQcm9wOiAnbGF5ZXJUb0JlTWVyZ2VkJyxcbiAgICBwcmVzZXJ2ZU9yZGVyOiAncHJlc2VydmVMYXllck9yZGVyJ1xuICB9LFxuICB7XG4gICAgbWVyZ2U6IG1lcmdlRmlsdGVycyxcbiAgICBwcm9wOiAnZmlsdGVycycsXG4gICAgdG9NZXJnZVByb3A6ICdmaWx0ZXJUb0JlTWVyZ2VkJyxcbiAgICBwcmVzZXJ2ZU9yZGVyOiAncHJlc2VydmVGaWx0ZXJPcmRlcicsXG4gICAgcmVwbGFjZVBhcmVudERhdGFzZXRJZHM6IHJlcGxhY2VGaWx0ZXJEYXRhc2V0SWRzXG4gIH0sXG4gIHtcbiAgICBtZXJnZTogbWVyZ2VFZmZlY3RzLFxuICAgIHByb3A6ICdlZmZlY3RzJ1xuICB9LFxuICB7XG4gICAgbWVyZ2U6IG1lcmdlQW5ub3RhdGlvbnMsXG4gICAgcHJvcDogJ2Fubm90YXRpb25zJyxcbiAgICB0b01lcmdlUHJvcDogJ2Fubm90YXRpb25zVG9CZU1lcmdlZCdcbiAgfSxcbiAge1xuICAgIG1lcmdlOiBtZXJnZUludGVyYWN0aW9ucyxcbiAgICBwcm9wOiAnaW50ZXJhY3Rpb25Db25maWcnLFxuICAgIHRvTWVyZ2VQcm9wOiAnaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkJyxcbiAgICByZXBsYWNlUGFyZW50RGF0YXNldElkczogcmVwbGFjZUludGVyYWN0aW9uRGF0YXNldElkcyxcbiAgICBzYXZlVW5tZXJnZWQ6IHNhdmVkVW5tZXJnZWRJbnRlcmFjdGlvbixcbiAgICBjb21iaW5lQ29uZmlnczogY29tYmluZUludGVyYWN0aW9uQ29uZmlnc1xuICB9LFxuICB7bWVyZ2U6IG1lcmdlTGF5ZXJCbGVuZGluZywgcHJvcDogJ2xheWVyQmxlbmRpbmcnLCBjb21iaW5lQ29uZmlnczogY29tYmluZUxheWVyQmxlbmRpbmdDb25maWdzfSxcbiAge1xuICAgIG1lcmdlOiBtZXJnZU92ZXJsYXlCbGVuZGluZyxcbiAgICBwcm9wOiAnb3ZlcmxheUJsZW5kaW5nJyxcbiAgICBjb21iaW5lQ29uZmlnczogY29tYmluZU92ZXJsYXlCbGVuZGluZ0NvbmZpZ3NcbiAgfSxcbiAge21lcmdlOiBtZXJnZVNwbGl0TWFwcywgcHJvcDogJ3NwbGl0TWFwcycsIHRvTWVyZ2VQcm9wOiAnc3BsaXRNYXBzVG9CZU1lcmdlZCd9LFxuICB7bWVyZ2U6IG1lcmdlQW5pbWF0aW9uQ29uZmlnLCBwcm9wOiAnYW5pbWF0aW9uQ29uZmlnJywgY29tYmluZUNvbmZpZ3M6IGNvbWJpbmVBbmltYXRpb25Db25maWdzfSxcbiAge21lcmdlOiBtZXJnZUVkaXRvciwgcHJvcDogJ2VkaXRvcicsIGNvbWJpbmVDb25maWdzOiBjb21iaW5lRWRpdG9yQ29uZmlnc31cbl07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFlBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFVBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQVVBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFlBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFVBQUEsR0FBQVAsT0FBQTtBQVFBLElBQUFRLFFBQUEsR0FBQVIsT0FBQTtBQWtCQSxJQUFBUyxNQUFBLEdBQUFULE9BQUE7QUFFQSxJQUFBVSxXQUFBLEdBQUFWLE9BQUE7QUFBc0QsSUFBQVcsU0FBQTtBQUFBLFNBQUFDLDJCQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxDQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTixDQUFBLE1BQUFFLENBQUEsR0FBQUssMkJBQUEsQ0FBQVAsQ0FBQSxN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