@kepler.gl/reducers 3.1.0-alpha.1 → 3.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/combined-updaters.d.ts +79 -0
- package/dist/combined-updaters.js +358 -0
- package/dist/composer-helpers.d.ts +24 -0
- package/dist/composer-helpers.js +101 -0
- package/dist/composers.d.ts +18 -0
- package/dist/composers.js +23 -0
- package/dist/core.d.ts +64 -0
- package/dist/core.js +105 -0
- package/dist/data-utils.d.ts +12 -0
- package/dist/data-utils.js +57 -0
- package/dist/export-utils.d.ts +21 -0
- package/dist/export-utils.js +91 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +342 -0
- package/dist/interaction-utils.d.ts +29 -0
- package/dist/interaction-utils.js +105 -0
- package/dist/layer-utils.d.ts +96 -0
- package/dist/layer-utils.js +310 -0
- package/dist/map-state-updaters.d.ts +93 -0
- package/dist/map-state-updaters.js +432 -0
- package/dist/map-state.d.ts +75 -0
- package/dist/map-state.js +35 -0
- package/dist/map-style-updaters.d.ts +179 -0
- package/dist/map-style-updaters.js +656 -0
- package/dist/map-style.d.ts +4 -0
- package/dist/map-style.js +34 -0
- package/dist/merger-handler.d.ts +10 -0
- package/dist/merger-handler.js +105 -0
- package/dist/middleware.d.ts +8 -0
- package/dist/middleware.js +27 -0
- package/dist/provider-state-updaters.d.ts +35 -0
- package/dist/provider-state-updaters.js +348 -0
- package/dist/provider-state.d.ts +4 -0
- package/dist/provider-state.js +35 -0
- package/dist/root.d.ts +24 -0
- package/dist/root.js +206 -0
- package/dist/ui-state-updaters.d.ts +362 -0
- package/dist/ui-state-updaters.js +762 -0
- package/dist/ui-state.d.ts +3 -0
- package/dist/ui-state.js +37 -0
- package/dist/vis-state-merger.d.ts +143 -0
- package/dist/vis-state-merger.js +812 -0
- package/dist/vis-state-selectors.d.ts +10 -0
- package/dist/vis-state-selectors.js +30 -0
- package/dist/vis-state-updaters.d.ts +546 -0
- package/dist/vis-state-updaters.js +3338 -0
- package/dist/vis-state.d.ts +155 -0
- package/dist/vis-state.js +36 -0
- package/package.json +17 -17
|
@@ -0,0 +1,812 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.VIS_STATE_MERGERS = void 0;
|
|
8
|
+
exports.createLayerFromConfig = createLayerFromConfig;
|
|
9
|
+
exports.insertLayerAtRightOrder = insertLayerAtRightOrder;
|
|
10
|
+
exports.isSavedLayerConfigV1 = isSavedLayerConfigV1;
|
|
11
|
+
exports.mergeAnimationConfig = mergeAnimationConfig;
|
|
12
|
+
exports.mergeDatasetsByOrder = mergeDatasetsByOrder;
|
|
13
|
+
exports.mergeEditor = mergeEditor;
|
|
14
|
+
exports.mergeEffects = mergeEffects;
|
|
15
|
+
exports.mergeFilters = mergeFilters;
|
|
16
|
+
exports.mergeInteractionTooltipConfig = mergeInteractionTooltipConfig;
|
|
17
|
+
exports.mergeInteractions = mergeInteractions;
|
|
18
|
+
exports.mergeLayerBlending = mergeLayerBlending;
|
|
19
|
+
exports.mergeLayers = mergeLayers;
|
|
20
|
+
exports.mergeOverlayBlending = mergeOverlayBlending;
|
|
21
|
+
exports.mergeSplitMaps = mergeSplitMaps;
|
|
22
|
+
exports.parseLayerConfig = parseLayerConfig;
|
|
23
|
+
exports.replaceFilterDatasetIds = replaceFilterDatasetIds;
|
|
24
|
+
exports.serializeEffect = serializeEffect;
|
|
25
|
+
exports.serializeLayer = serializeLayer;
|
|
26
|
+
exports.serializeVisState = serializeVisState;
|
|
27
|
+
exports.validateColumn = validateColumn;
|
|
28
|
+
exports.validateLayerWithData = validateLayerWithData;
|
|
29
|
+
exports.validateLayersByDatasets = validateLayersByDatasets;
|
|
30
|
+
exports.validateSavedLayerColumns = validateSavedLayerColumns;
|
|
31
|
+
exports.validateSavedTextLabel = validateSavedTextLabel;
|
|
32
|
+
exports.validateSavedVisualChannels = validateSavedVisualChannels;
|
|
33
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
34
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
35
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
36
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
37
|
+
var _lodash = _interopRequireDefault(require("lodash.uniq"));
|
|
38
|
+
var _lodash2 = _interopRequireDefault(require("lodash.pick"));
|
|
39
|
+
var _lodash3 = _interopRequireDefault(require("lodash.flattendeep"));
|
|
40
|
+
var _deepmerge = _interopRequireDefault(require("deepmerge"));
|
|
41
|
+
var _utils = require("@kepler.gl/utils");
|
|
42
|
+
var _reducers = require("@kepler.gl/reducers");
|
|
43
|
+
var _effects = require("@kepler.gl/effects");
|
|
44
|
+
var _constants = require("@kepler.gl/constants");
|
|
45
|
+
var _schemas = require("@kepler.gl/schemas");
|
|
46
|
+
var _table = require("@kepler.gl/table");
|
|
47
|
+
var _excluded = ["enabled"];
|
|
48
|
+
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; } } }; }
|
|
49
|
+
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; } }
|
|
50
|
+
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; }
|
|
51
|
+
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; }
|
|
52
|
+
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
|
|
53
|
+
// Copyright contributors to the kepler.gl project
|
|
54
|
+
/**
|
|
55
|
+
* Merge loaded filters with current state, if no fields or data are loaded
|
|
56
|
+
* save it for later
|
|
57
|
+
*
|
|
58
|
+
*/
|
|
59
|
+
function mergeFilters(state, filtersToMerge, fromConfig) {
|
|
60
|
+
var preserveFilterOrder = fromConfig ? filtersToMerge === null || filtersToMerge === void 0 ? void 0 : filtersToMerge.map(function (l) {
|
|
61
|
+
return l.id;
|
|
62
|
+
}) : state.preserveFilterOrder;
|
|
63
|
+
if (!Array.isArray(filtersToMerge) || !filtersToMerge.length) {
|
|
64
|
+
return state;
|
|
65
|
+
}
|
|
66
|
+
var _validateFiltersUpdat = (0, _utils.validateFiltersUpdateDatasets)(state, filtersToMerge),
|
|
67
|
+
validated = _validateFiltersUpdat.validated,
|
|
68
|
+
failed = _validateFiltersUpdat.failed,
|
|
69
|
+
updatedDatasets = _validateFiltersUpdat.updatedDatasets;
|
|
70
|
+
var updatedFilters = insertItemBasedOnPreservedOrder(state.filters, validated, preserveFilterOrder);
|
|
71
|
+
|
|
72
|
+
// merge filter with existing
|
|
73
|
+
updatedFilters = (0, _table.resetFilterGpuMode)(updatedFilters);
|
|
74
|
+
updatedFilters = (0, _table.assignGpuChannels)(updatedFilters);
|
|
75
|
+
// filter data
|
|
76
|
+
var datasetsToFilter = (0, _lodash["default"])((0, _lodash3["default"])(validated.map(function (f) {
|
|
77
|
+
return f.dataId;
|
|
78
|
+
})));
|
|
79
|
+
var filtered = (0, _utils.applyFiltersToDatasets)(datasetsToFilter, updatedDatasets, updatedFilters, state.layers);
|
|
80
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
81
|
+
filters: updatedFilters,
|
|
82
|
+
datasets: filtered,
|
|
83
|
+
preserveFilterOrder: preserveFilterOrder,
|
|
84
|
+
filterToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.filterToBeMerged), (0, _toConsumableArray2["default"])(failed))
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// replace dataId in saved Filter
|
|
89
|
+
function replaceFilterDatasetIds(savedFilter, dataId, dataIdToUse) {
|
|
90
|
+
var replaced = [];
|
|
91
|
+
savedFilter.forEach(function (filter) {
|
|
92
|
+
if (filter.dataId.includes(dataId)) {
|
|
93
|
+
var newDataId = filter.dataId.map(function (d) {
|
|
94
|
+
return d === dataId ? dataIdToUse : d;
|
|
95
|
+
});
|
|
96
|
+
replaced.push(_objectSpread(_objectSpread({}, filter), {}, {
|
|
97
|
+
dataId: newDataId
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
return replaced.length ? replaced : null;
|
|
102
|
+
}
|
|
103
|
+
function isSavedLayerConfigV1(layerConfig) {
|
|
104
|
+
// exported layer configuration contains visualChannels property
|
|
105
|
+
return layerConfig === null || layerConfig === void 0 ? void 0 : layerConfig.visualChannels;
|
|
106
|
+
}
|
|
107
|
+
function parseLayerConfig(schema, layerConfig) {
|
|
108
|
+
var _schema$parseSavedCon;
|
|
109
|
+
// assume the layer config is current version
|
|
110
|
+
var savedConfig = {
|
|
111
|
+
version: _schemas.CURRENT_VERSION,
|
|
112
|
+
config: {
|
|
113
|
+
visState: {
|
|
114
|
+
layers: [layerConfig],
|
|
115
|
+
layerOrder: [layerConfig.id]
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
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];
|
|
120
|
+
}
|
|
121
|
+
function insertItemBasedOnPreservedOrder(currentItems, items) {
|
|
122
|
+
var preservedOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
123
|
+
var defaultStart = arguments.length > 3 ? arguments[3] : undefined;
|
|
124
|
+
var newItems = (0, _toConsumableArray2["default"])(currentItems);
|
|
125
|
+
var _iterator = _createForOfIteratorHelper(items),
|
|
126
|
+
_step;
|
|
127
|
+
try {
|
|
128
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
129
|
+
var item = _step.value;
|
|
130
|
+
var expectedIdx = preservedOrder.indexOf(item.id);
|
|
131
|
+
// insertAt the end by default
|
|
132
|
+
var insertAt = defaultStart ? 0 : newItems.length;
|
|
133
|
+
if (expectedIdx > 0) {
|
|
134
|
+
// look for layer to insert after
|
|
135
|
+
var i = expectedIdx + 1;
|
|
136
|
+
var preceedIdx = -1;
|
|
137
|
+
var _loop = function _loop() {
|
|
138
|
+
// keep looking for preceed layer that is already loaded
|
|
139
|
+
var preceedItemId = preservedOrder[i - 1];
|
|
140
|
+
preceedIdx = newItems.findIndex(function (d) {
|
|
141
|
+
return d.id === preceedItemId;
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
while (i-- > 0 && preceedIdx < 0) {
|
|
145
|
+
_loop();
|
|
146
|
+
}
|
|
147
|
+
if (preceedIdx > -1) {
|
|
148
|
+
// if found
|
|
149
|
+
insertAt = preceedIdx + 1;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
newItems = (0, _utils.arrayInsert)(newItems, insertAt, item);
|
|
153
|
+
}
|
|
154
|
+
} catch (err) {
|
|
155
|
+
_iterator.e(err);
|
|
156
|
+
} finally {
|
|
157
|
+
_iterator.f();
|
|
158
|
+
}
|
|
159
|
+
return newItems;
|
|
160
|
+
}
|
|
161
|
+
function createLayerFromConfig(state, layerConfig) {
|
|
162
|
+
// check if the layer config is parsed
|
|
163
|
+
var parsedLayerConfig = isSavedLayerConfigV1(layerConfig) ? parseLayerConfig(state.schema, layerConfig) : layerConfig;
|
|
164
|
+
if (!parsedLayerConfig) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
// first validate config against dataset
|
|
168
|
+
var _validateLayersByData = validateLayersByDatasets(state.datasets, state.layerClasses, [parsedLayerConfig], {
|
|
169
|
+
allowEmptyColumn: true
|
|
170
|
+
}),
|
|
171
|
+
validated = _validateLayersByData.validated,
|
|
172
|
+
failed = _validateLayersByData.failed;
|
|
173
|
+
if (failed !== null && failed !== void 0 && failed.length || !validated.length) {
|
|
174
|
+
// failed
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
var newLayer = validated[0];
|
|
178
|
+
newLayer.updateLayerDomain(state.datasets);
|
|
179
|
+
return newLayer;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Get loaded layer from state
|
|
184
|
+
*/
|
|
185
|
+
function serializeLayer(newLayer, schema) {
|
|
186
|
+
var _serializedVisState$l;
|
|
187
|
+
var serializedVisState = serializeVisState({
|
|
188
|
+
layers: [newLayer],
|
|
189
|
+
layerOrder: [newLayer.id]
|
|
190
|
+
}, schema);
|
|
191
|
+
return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$l = serializedVisState.layers) === null || _serializedVisState$l === void 0 ? void 0 : _serializedVisState$l[0];
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Get loaded effect from state
|
|
196
|
+
*/
|
|
197
|
+
function serializeEffect(newEffect, schema) {
|
|
198
|
+
var _serializedVisState$e;
|
|
199
|
+
var serializedVisState = serializeVisState({
|
|
200
|
+
effects: [newEffect],
|
|
201
|
+
effectOrder: [newEffect.id]
|
|
202
|
+
}, schema);
|
|
203
|
+
return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$e = serializedVisState.effects) === null || _serializedVisState$e === void 0 ? void 0 : _serializedVisState$e[0];
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Get vis state config
|
|
208
|
+
*/
|
|
209
|
+
function serializeVisState(visState, schema) {
|
|
210
|
+
var _schema$parseSavedCon2;
|
|
211
|
+
var savedState = schema.getConfigToSave({
|
|
212
|
+
visState: visState
|
|
213
|
+
});
|
|
214
|
+
return savedState ? (_schema$parseSavedCon2 = schema.parseSavedConfig(savedState)) === null || _schema$parseSavedCon2 === void 0 ? void 0 : _schema$parseSavedCon2.visState : undefined;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Merge layers from de-serialized state, if no fields or data are loaded
|
|
218
|
+
* save it for later
|
|
219
|
+
*
|
|
220
|
+
*/
|
|
221
|
+
function mergeLayers(state) {
|
|
222
|
+
var layersToMerge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
223
|
+
var fromConfig = arguments.length > 2 ? arguments[2] : undefined;
|
|
224
|
+
var preserveLayerOrder = fromConfig ? (0, _reducers.getLayerOrderFromLayers)(layersToMerge) : state.preserveLayerOrder;
|
|
225
|
+
if (!Array.isArray(layersToMerge) || !layersToMerge.length) {
|
|
226
|
+
return state;
|
|
227
|
+
}
|
|
228
|
+
// don't merge layer if dataset is being merged
|
|
229
|
+
var unmerged = [];
|
|
230
|
+
var toMerge = [];
|
|
231
|
+
layersToMerge.forEach(function (l) {
|
|
232
|
+
var _l$config;
|
|
233
|
+
if (l !== null && l !== void 0 && (_l$config = l.config) !== null && _l$config !== void 0 && _l$config.dataId && state.isMergingDatasets[l.config.dataId]) {
|
|
234
|
+
unmerged.push(l);
|
|
235
|
+
} else {
|
|
236
|
+
toMerge.push(l);
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
var _validateLayersByData2 = validateLayersByDatasets(state.datasets, state.layerClasses, toMerge),
|
|
240
|
+
mergedLayer = _validateLayersByData2.validated,
|
|
241
|
+
failed = _validateLayersByData2.failed;
|
|
242
|
+
unmerged.push.apply(unmerged, (0, _toConsumableArray2["default"])(failed));
|
|
243
|
+
// put new layers in front of current layers
|
|
244
|
+
var _insertLayerAtRightOr = insertLayerAtRightOrder(state.layers, mergedLayer, state.layerOrder, preserveLayerOrder),
|
|
245
|
+
newLayerOrder = _insertLayerAtRightOr.newLayerOrder,
|
|
246
|
+
newLayers = _insertLayerAtRightOr.newLayers;
|
|
247
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
248
|
+
layers: newLayers,
|
|
249
|
+
layerOrder: newLayerOrder,
|
|
250
|
+
preserveLayerOrder: preserveLayerOrder,
|
|
251
|
+
layerToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.layerToBeMerged), unmerged)
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
function insertLayerAtRightOrder(currentLayers, layersToInsert, currentOrder) {
|
|
255
|
+
var preservedOrder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
|
|
256
|
+
if (!(layersToInsert !== null && layersToInsert !== void 0 && layersToInsert.length)) {
|
|
257
|
+
return {
|
|
258
|
+
newLayers: currentLayers,
|
|
259
|
+
newLayerOrder: currentOrder
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
// perservedOrder ['a', 'b', 'c'];
|
|
263
|
+
// layerOrder ['a', 'b', 'c']
|
|
264
|
+
var currentLayerQueue = currentOrder.map(function (id) {
|
|
265
|
+
return (0, _utils.findById)(id)(currentLayers);
|
|
266
|
+
}).filter(function (layer) {
|
|
267
|
+
return Boolean(layer);
|
|
268
|
+
});
|
|
269
|
+
var newLayers = currentLayers.concat(layersToInsert);
|
|
270
|
+
var newLayerOrderQueue = insertItemBasedOnPreservedOrder(currentLayerQueue, layersToInsert, preservedOrder, true);
|
|
271
|
+
|
|
272
|
+
// reconstruct layerOrder after insert
|
|
273
|
+
var newLayerOrder = (0, _reducers.getLayerOrderFromLayers)(newLayerOrderQueue);
|
|
274
|
+
return {
|
|
275
|
+
newLayerOrder: newLayerOrder,
|
|
276
|
+
newLayers: newLayers
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Merge interactions with saved config
|
|
282
|
+
*
|
|
283
|
+
*/
|
|
284
|
+
function mergeInteractions(state, interactionToBeMerged) {
|
|
285
|
+
var merged = {};
|
|
286
|
+
var unmerged = {};
|
|
287
|
+
if (interactionToBeMerged) {
|
|
288
|
+
Object.keys(interactionToBeMerged).forEach(function (key) {
|
|
289
|
+
if (!state.interactionConfig[key]) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
var currentConfig = key === 'tooltip' || key === 'brush' ? state.interactionConfig[key].config : null;
|
|
293
|
+
var _ref = interactionToBeMerged[key] || {},
|
|
294
|
+
enabled = _ref.enabled,
|
|
295
|
+
configSaved = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
|
|
296
|
+
var configToMerge = configSaved;
|
|
297
|
+
if (key === 'tooltip') {
|
|
298
|
+
var _mergeInteractionTool = mergeInteractionTooltipConfig(state, configSaved),
|
|
299
|
+
mergedTooltip = _mergeInteractionTool.mergedTooltip,
|
|
300
|
+
unmergedTooltip = _mergeInteractionTool.unmergedTooltip;
|
|
301
|
+
|
|
302
|
+
// merge new dataset tooltips with original dataset tooltips
|
|
303
|
+
configToMerge = {
|
|
304
|
+
fieldsToShow: _objectSpread(_objectSpread({}, currentConfig.fieldsToShow), mergedTooltip)
|
|
305
|
+
};
|
|
306
|
+
if (Object.keys(unmergedTooltip).length) {
|
|
307
|
+
// @ts-expect-error
|
|
308
|
+
unmerged.tooltip = {
|
|
309
|
+
fieldsToShow: unmergedTooltip,
|
|
310
|
+
enabled: Boolean(enabled)
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
merged[key] = _objectSpread(_objectSpread({}, state.interactionConfig[key]), {}, {
|
|
315
|
+
enabled: Boolean(enabled)
|
|
316
|
+
}, currentConfig ? {
|
|
317
|
+
config: (0, _lodash2["default"])(_objectSpread(_objectSpread({}, currentConfig), configToMerge), Object.keys(currentConfig))
|
|
318
|
+
} : {});
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
var nextState = _objectSpread(_objectSpread({}, state), {}, {
|
|
322
|
+
interactionConfig: _objectSpread(_objectSpread({}, state.interactionConfig), merged),
|
|
323
|
+
interactionToBeMerged: savedUnmergedInteraction(state, unmerged)
|
|
324
|
+
});
|
|
325
|
+
return nextState;
|
|
326
|
+
}
|
|
327
|
+
function savedUnmergedInteraction(state, unmerged) {
|
|
328
|
+
var _unmerged$tooltip, _unmerged$tooltip2, _state$interactionToB, _unmerged$tooltip3;
|
|
329
|
+
if (!(unmerged !== null && unmerged !== void 0 && (_unmerged$tooltip = unmerged.tooltip) !== null && _unmerged$tooltip !== void 0 && _unmerged$tooltip.fieldsToShow)) {
|
|
330
|
+
return state.interactionToBeMerged;
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
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' ? {
|
|
334
|
+
enabled: unmerged.tooltip.enabled
|
|
335
|
+
} : {}), {}, {
|
|
336
|
+
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)
|
|
337
|
+
})
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
function replaceInteractionDatasetIds(interactionConfig, dataId, dataIdToReplace) {
|
|
341
|
+
var _interactionConfig$to;
|
|
342
|
+
if (interactionConfig !== null && interactionConfig !== void 0 && (_interactionConfig$to = interactionConfig.tooltip) !== null && _interactionConfig$to !== void 0 && _interactionConfig$to.fieldsToShow[dataId]) {
|
|
343
|
+
var _interactionConfig$to2;
|
|
344
|
+
return _objectSpread(_objectSpread({}, interactionConfig), {}, {
|
|
345
|
+
tooltip: _objectSpread(_objectSpread({}, interactionConfig.tooltip), {}, {
|
|
346
|
+
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])
|
|
347
|
+
})
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Merge splitMaps config with current visStete.
|
|
354
|
+
* 1. if current map is split, but splitMap DOESNOT contain maps
|
|
355
|
+
* : don't merge anything
|
|
356
|
+
* 2. if current map is NOT split, but splitMaps contain maps
|
|
357
|
+
* : add to splitMaps, and add current layers to splitMaps
|
|
358
|
+
*/
|
|
359
|
+
function mergeSplitMaps(state) {
|
|
360
|
+
var splitMaps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
361
|
+
var merged = (0, _toConsumableArray2["default"])(state.splitMaps);
|
|
362
|
+
var unmerged = [];
|
|
363
|
+
splitMaps.forEach(function (sm, i) {
|
|
364
|
+
var entries = Object.entries(sm.layers);
|
|
365
|
+
if (entries.length > 0) {
|
|
366
|
+
entries.forEach(function (_ref2) {
|
|
367
|
+
var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
|
|
368
|
+
id = _ref3[0],
|
|
369
|
+
value = _ref3[1];
|
|
370
|
+
// check if layer exists
|
|
371
|
+
var pushTo = state.layers.find(function (l) {
|
|
372
|
+
return l.id === id;
|
|
373
|
+
}) ? merged : unmerged;
|
|
374
|
+
|
|
375
|
+
// create map panel if current map is not split
|
|
376
|
+
pushTo[i] = pushTo[i] || _objectSpread(_objectSpread({}, sm), {}, {
|
|
377
|
+
layers: pushTo === merged ? (0, _utils.getInitialMapLayersForSplitMap)(state.layers) : []
|
|
378
|
+
});
|
|
379
|
+
pushTo[i].layers = _objectSpread(_objectSpread({}, pushTo[i].layers), {}, (0, _defineProperty2["default"])({}, id, value));
|
|
380
|
+
});
|
|
381
|
+
} else {
|
|
382
|
+
// We are merging if there are no layers in both split map
|
|
383
|
+
merged.push(sm);
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
387
|
+
splitMaps: merged,
|
|
388
|
+
splitMapsToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.splitMapsToBeMerged), unmerged)
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Merge effects with saved config
|
|
394
|
+
*/
|
|
395
|
+
function mergeEffects(state, effects, fromConfig) {
|
|
396
|
+
var newEffects = [].concat((0, _toConsumableArray2["default"])(state.effects), (0, _toConsumableArray2["default"])((effects || []).map(function (effect) {
|
|
397
|
+
return fromConfig ? (0, _effects.createEffect)(_deepmerge["default"].all([effect, {
|
|
398
|
+
// collapse all panels when loading effects
|
|
399
|
+
isConfigActive: false
|
|
400
|
+
}])) : effect;
|
|
401
|
+
}).filter(function (effect) {
|
|
402
|
+
return Boolean(effect && effect.isValidToSave());
|
|
403
|
+
})));
|
|
404
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
405
|
+
effects: newEffects,
|
|
406
|
+
effectOrder: newEffects.map(function (effect) {
|
|
407
|
+
return effect.id;
|
|
408
|
+
})
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Merge interactionConfig.tooltip with saved config,
|
|
414
|
+
* validate fieldsToShow
|
|
415
|
+
*
|
|
416
|
+
* @param state
|
|
417
|
+
* @param tooltipConfig
|
|
418
|
+
* @return - {mergedTooltip: {}, unmergedTooltip: {}}
|
|
419
|
+
*/
|
|
420
|
+
function mergeInteractionTooltipConfig(state) {
|
|
421
|
+
var tooltipConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
422
|
+
var unmergedTooltip = {};
|
|
423
|
+
var mergedTooltip = {};
|
|
424
|
+
if (!tooltipConfig || !tooltipConfig.fieldsToShow || !Object.keys(tooltipConfig.fieldsToShow).length) {
|
|
425
|
+
return {
|
|
426
|
+
mergedTooltip: mergedTooltip,
|
|
427
|
+
unmergedTooltip: unmergedTooltip
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
var _loop2 = function _loop2() {
|
|
431
|
+
if (!state.datasets[dataId] || state.isMergingDatasets[dataId]) {
|
|
432
|
+
// is not yet loaded
|
|
433
|
+
unmergedTooltip[dataId] = tooltipConfig.fieldsToShow[dataId];
|
|
434
|
+
} else {
|
|
435
|
+
// if dataset is loaded
|
|
436
|
+
var allFields = state.datasets[dataId].fields.map(function (d) {
|
|
437
|
+
return d.name;
|
|
438
|
+
});
|
|
439
|
+
var foundFieldsToShow = tooltipConfig.fieldsToShow[dataId].filter(function (field) {
|
|
440
|
+
return allFields.includes(field.name);
|
|
441
|
+
});
|
|
442
|
+
mergedTooltip[dataId] = foundFieldsToShow;
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
for (var dataId in tooltipConfig.fieldsToShow) {
|
|
446
|
+
_loop2();
|
|
447
|
+
}
|
|
448
|
+
return {
|
|
449
|
+
mergedTooltip: mergedTooltip,
|
|
450
|
+
unmergedTooltip: unmergedTooltip
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Merge layerBlending with saved
|
|
455
|
+
*
|
|
456
|
+
*/
|
|
457
|
+
function mergeLayerBlending(state, layerBlending) {
|
|
458
|
+
if (layerBlending && _constants.LAYER_BLENDINGS[layerBlending]) {
|
|
459
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
460
|
+
layerBlending: layerBlending
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
return state;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* Merge overlayBlending with saved
|
|
468
|
+
*/
|
|
469
|
+
function mergeOverlayBlending(state, overlayBlending) {
|
|
470
|
+
if (overlayBlending && _constants.OVERLAY_BLENDINGS[overlayBlending]) {
|
|
471
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
472
|
+
overlayBlending: overlayBlending
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
return state;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Merge animation config
|
|
480
|
+
*/
|
|
481
|
+
function mergeAnimationConfig(state, animation) {
|
|
482
|
+
if (animation && animation.currentTime) {
|
|
483
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
484
|
+
animationConfig: _objectSpread(_objectSpread(_objectSpread({}, state.animationConfig), animation), {}, {
|
|
485
|
+
domain: null
|
|
486
|
+
})
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
return state;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Validate saved layer columns with new data,
|
|
494
|
+
* update fieldIdx based on new fields
|
|
495
|
+
*
|
|
496
|
+
* @param fields
|
|
497
|
+
* @param savedCols
|
|
498
|
+
* @param emptyCols
|
|
499
|
+
* @param options
|
|
500
|
+
* @return - validated columns or null
|
|
501
|
+
*/
|
|
502
|
+
|
|
503
|
+
function validateSavedLayerColumns(fields) {
|
|
504
|
+
var savedCols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
505
|
+
var emptyCols = arguments.length > 2 ? arguments[2] : undefined;
|
|
506
|
+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
507
|
+
// Prepare columns for the validator
|
|
508
|
+
var columns = {};
|
|
509
|
+
var _loop3 = function _loop3() {
|
|
510
|
+
var key = _Object$keys[_i];
|
|
511
|
+
columns[key] = _objectSpread({}, emptyCols[key]);
|
|
512
|
+
var saved = savedCols[key];
|
|
513
|
+
if (saved) {
|
|
514
|
+
var fieldIdx = fields.findIndex(function (_ref4) {
|
|
515
|
+
var name = _ref4.name;
|
|
516
|
+
return name === saved;
|
|
517
|
+
});
|
|
518
|
+
if (fieldIdx > -1) {
|
|
519
|
+
// update found columns
|
|
520
|
+
columns[key].fieldIdx = fieldIdx;
|
|
521
|
+
columns[key].value = saved;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
};
|
|
525
|
+
for (var _i = 0, _Object$keys = Object.keys(emptyCols); _i < _Object$keys.length; _i++) {
|
|
526
|
+
_loop3();
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// find actual column fieldIdx, in case it has changed
|
|
530
|
+
var allColFound = Object.keys(columns).every(function (key) {
|
|
531
|
+
return validateColumn(columns[key], columns, fields);
|
|
532
|
+
});
|
|
533
|
+
var rv = allColFound ? columns : null;
|
|
534
|
+
if (options.throwOnError) {
|
|
535
|
+
var requiredColumns = Object.keys(emptyCols).filter(function (k) {
|
|
536
|
+
return !emptyCols[k].optional;
|
|
537
|
+
});
|
|
538
|
+
var missingColumns = requiredColumns.filter(function (k) {
|
|
539
|
+
return !(columns !== null && columns !== void 0 && columns[k].value);
|
|
540
|
+
});
|
|
541
|
+
if (missingColumns.length) {
|
|
542
|
+
throw new Error("Layer has missing or invalid columns: ".concat(missingColumns.join(', ')));
|
|
543
|
+
}
|
|
544
|
+
var configColumns = Object.keys(savedCols);
|
|
545
|
+
var invalidColumns = configColumns.filter(function (k) {
|
|
546
|
+
var _columns$k;
|
|
547
|
+
return !(columns !== null && columns !== void 0 && (_columns$k = columns[k]) !== null && _columns$k !== void 0 && _columns$k.value);
|
|
548
|
+
});
|
|
549
|
+
if (invalidColumns.length) {
|
|
550
|
+
throw new Error("Layer has invalid columns: ".concat(invalidColumns.join(', ')));
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
return rv;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Validate layer column
|
|
558
|
+
*/
|
|
559
|
+
function validateColumn(column, columns, allFields) {
|
|
560
|
+
if (column.optional || column.value) {
|
|
561
|
+
return true;
|
|
562
|
+
}
|
|
563
|
+
if (column.validator) {
|
|
564
|
+
return column.validator(column, columns, allFields);
|
|
565
|
+
}
|
|
566
|
+
return false;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
/**
|
|
570
|
+
* Validate saved text label config with new data
|
|
571
|
+
* refer to vis-state-schema.js TextLabelSchemaV1
|
|
572
|
+
*
|
|
573
|
+
* @param {Array<Object>} fields
|
|
574
|
+
* @param {Object} savedTextLabel
|
|
575
|
+
* @param {Object} options
|
|
576
|
+
* @return {Object} - validated textlabel
|
|
577
|
+
*/
|
|
578
|
+
function validateSavedTextLabel(fields, _ref5, savedTextLabel) {
|
|
579
|
+
var _ref6 = (0, _slicedToArray2["default"])(_ref5, 1),
|
|
580
|
+
layerTextLabel = _ref6[0];
|
|
581
|
+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
582
|
+
var savedTextLabels = Array.isArray(savedTextLabel) ? savedTextLabel : [savedTextLabel];
|
|
583
|
+
|
|
584
|
+
// validate field
|
|
585
|
+
return savedTextLabels.map(function (textLabel) {
|
|
586
|
+
var field = textLabel.field ? fields.find(function (fd) {
|
|
587
|
+
return Object.keys(textLabel.field).every(function (key) {
|
|
588
|
+
return textLabel.field[key] === fd[key];
|
|
589
|
+
});
|
|
590
|
+
}) : null;
|
|
591
|
+
if (field === undefined && options.throwOnError) {
|
|
592
|
+
throw new Error("Layer has invalid text label field: ".concat(JSON.stringify(textLabel.field)));
|
|
593
|
+
}
|
|
594
|
+
return Object.keys(layerTextLabel).reduce(function (accu, key) {
|
|
595
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, key === 'field' ? field : textLabel[key] || layerTextLabel[key]));
|
|
596
|
+
}, {});
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
/**
|
|
601
|
+
* Validate saved visual channels config with new data,
|
|
602
|
+
* refer to vis-state-schema.js VisualChannelSchemaV1
|
|
603
|
+
*/
|
|
604
|
+
function validateSavedVisualChannels(fields, newLayer, savedLayer) {
|
|
605
|
+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
606
|
+
Object.values(newLayer.visualChannels).forEach(function (_ref7) {
|
|
607
|
+
var field = _ref7.field,
|
|
608
|
+
scale = _ref7.scale,
|
|
609
|
+
key = _ref7.key;
|
|
610
|
+
var foundField;
|
|
611
|
+
if (savedLayer.config) {
|
|
612
|
+
if (savedLayer.config[field]) {
|
|
613
|
+
foundField = fields.find(function (fd) {
|
|
614
|
+
return savedLayer.config && fd.name === savedLayer.config[field].name;
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
var foundChannel = _objectSpread(_objectSpread({}, foundField ? (0, _defineProperty2["default"])({}, field, foundField) : {}), savedLayer.config[scale] ? (0, _defineProperty2["default"])({}, scale, savedLayer.config[scale]) : {});
|
|
618
|
+
if (Object.keys(foundChannel).length) {
|
|
619
|
+
newLayer.updateLayerConfig(foundChannel);
|
|
620
|
+
}
|
|
621
|
+
newLayer.validateVisualChannel(key);
|
|
622
|
+
if (options.throwOnError) {
|
|
623
|
+
var _savedLayer$config, _newLayer$config$fiel;
|
|
624
|
+
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;
|
|
625
|
+
if (fieldName && fieldName !== ((_newLayer$config$fiel = newLayer.config[field]) === null || _newLayer$config$fiel === void 0 ? void 0 : _newLayer$config$fiel.name)) {
|
|
626
|
+
throw new Error("Layer has invalid visual channel field: ".concat(field));
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
return newLayer;
|
|
632
|
+
}
|
|
633
|
+
function validateLayersByDatasets(datasets, layerClasses) {
|
|
634
|
+
var layers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
635
|
+
var options = arguments.length > 3 ? arguments[3] : undefined;
|
|
636
|
+
var validated = [];
|
|
637
|
+
var failed = [];
|
|
638
|
+
layers.forEach(function (layer) {
|
|
639
|
+
var _layer$config;
|
|
640
|
+
var validateLayer = null;
|
|
641
|
+
if (layer !== null && layer !== void 0 && (_layer$config = layer.config) !== null && _layer$config !== void 0 && _layer$config.dataId) {
|
|
642
|
+
if (datasets[layer.config.dataId]) {
|
|
643
|
+
// datasets are already loaded
|
|
644
|
+
validateLayer = validateLayerWithData(datasets[layer.config.dataId], layer, layerClasses, options);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
if (validateLayer) {
|
|
648
|
+
validated.push(validateLayer);
|
|
649
|
+
} else {
|
|
650
|
+
// datasets not yet loaded
|
|
651
|
+
failed.push(layer);
|
|
652
|
+
}
|
|
653
|
+
});
|
|
654
|
+
return {
|
|
655
|
+
validated: validated,
|
|
656
|
+
failed: failed
|
|
657
|
+
};
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
/**
|
|
661
|
+
* Get required columns for validation based on column mode
|
|
662
|
+
*/
|
|
663
|
+
function _getColumnConfigForValidation(newLayer) {
|
|
664
|
+
// find column fieldIdx
|
|
665
|
+
var columnConfig = newLayer.getLayerColumns();
|
|
666
|
+
// if columnMode is defined, find column mode config
|
|
667
|
+
var colModeConfig = newLayer.config.columnMode ? (newLayer.supportedColumnModes || []).find(function (colMode) {
|
|
668
|
+
return colMode.key === newLayer.config.columnMode;
|
|
669
|
+
}) : null;
|
|
670
|
+
if (colModeConfig) {
|
|
671
|
+
// only validate columns in column mode
|
|
672
|
+
columnConfig = [].concat((0, _toConsumableArray2["default"])(colModeConfig.requiredColumns || []), (0, _toConsumableArray2["default"])(colModeConfig.optionalColumns || [])).reduce(function (accu, key) {
|
|
673
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, columnConfig[key]));
|
|
674
|
+
}, {});
|
|
675
|
+
}
|
|
676
|
+
return columnConfig;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/**
|
|
680
|
+
* Validate saved layer config with new data,
|
|
681
|
+
* update fieldIdx based on new fields
|
|
682
|
+
*/
|
|
683
|
+
// eslint-disable-next-line complexity
|
|
684
|
+
function validateLayerWithData(dataset, savedLayer, layerClasses) {
|
|
685
|
+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
686
|
+
var fields = dataset.fields,
|
|
687
|
+
dataId = dataset.id;
|
|
688
|
+
var type = savedLayer.type;
|
|
689
|
+
var throwOnError = options.throwOnError;
|
|
690
|
+
// layer doesnt have a valid type
|
|
691
|
+
if (!type || !Object.prototype.hasOwnProperty.call(layerClasses, type) || !savedLayer.config) {
|
|
692
|
+
if (throwOnError) {
|
|
693
|
+
throw new Error("Layer has invalid type \"".concat(type, "\" or config is missing"));
|
|
694
|
+
}
|
|
695
|
+
return null;
|
|
696
|
+
}
|
|
697
|
+
var newLayer = new layerClasses[type]({
|
|
698
|
+
id: savedLayer.id,
|
|
699
|
+
dataId: dataId,
|
|
700
|
+
label: savedLayer.config.label,
|
|
701
|
+
color: savedLayer.config.color,
|
|
702
|
+
isVisible: savedLayer.config.isVisible,
|
|
703
|
+
hidden: savedLayer.config.hidden,
|
|
704
|
+
columnMode: savedLayer.config.columnMode,
|
|
705
|
+
highlightColor: savedLayer.config.highlightColor
|
|
706
|
+
});
|
|
707
|
+
var columnConfig = _getColumnConfigForValidation(newLayer);
|
|
708
|
+
if (Object.keys(columnConfig)) {
|
|
709
|
+
var columns = validateSavedLayerColumns(fields, savedLayer.config.columns, columnConfig, options);
|
|
710
|
+
if (columns) {
|
|
711
|
+
newLayer.updateLayerConfig({
|
|
712
|
+
columns: _objectSpread(_objectSpread({}, newLayer.config.columns), columns)
|
|
713
|
+
});
|
|
714
|
+
} else if (!options.allowEmptyColumn) {
|
|
715
|
+
return null;
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
var textLabel = savedLayer.config.textLabel && newLayer.config.textLabel ? validateSavedTextLabel(fields, newLayer.config.textLabel, savedLayer.config.textLabel, options) : newLayer.config.textLabel;
|
|
719
|
+
|
|
720
|
+
// copy visConfig over to emptyLayer to make sure it has all the props
|
|
721
|
+
var copiedVisConfig = newLayer.copyLayerConfig(newLayer.config.visConfig, savedLayer.config.visConfig || {}, {
|
|
722
|
+
shallowCopy: ['colorRange', 'strokeColorRange']
|
|
723
|
+
});
|
|
724
|
+
|
|
725
|
+
// call layer methods to validate visConfig when switching dataset
|
|
726
|
+
var visConfig = newLayer.validateVisConfig ? newLayer.validateVisConfig(dataset, copiedVisConfig) : copiedVisConfig;
|
|
727
|
+
newLayer.updateLayerConfig({
|
|
728
|
+
visConfig: visConfig,
|
|
729
|
+
textLabel: textLabel
|
|
730
|
+
});
|
|
731
|
+
|
|
732
|
+
// visual channel field is saved to be {name, type}
|
|
733
|
+
// find visual channel field by matching both name and type
|
|
734
|
+
// refer to vis-state-schema.js VisualChannelSchemaV1
|
|
735
|
+
newLayer = validateSavedVisualChannels(fields, newLayer, savedLayer, options);
|
|
736
|
+
if (throwOnError) {
|
|
737
|
+
if (!newLayer.isValidToSave()) {
|
|
738
|
+
throw new Error("Layer is not valid to save: ".concat(newLayer.id));
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
return newLayer;
|
|
742
|
+
}
|
|
743
|
+
function mergeEditor(state, savedEditor) {
|
|
744
|
+
var _savedEditor$visible;
|
|
745
|
+
if (!savedEditor) {
|
|
746
|
+
return state;
|
|
747
|
+
}
|
|
748
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
749
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
750
|
+
features: [].concat((0, _toConsumableArray2["default"])(state.editor.features), (0, _toConsumableArray2["default"])(savedEditor.features || [])),
|
|
751
|
+
// if savedEditor.visible is undefined keep state.editor.visible
|
|
752
|
+
visible: (_savedEditor$visible = savedEditor.visible) !== null && _savedEditor$visible !== void 0 ? _savedEditor$visible : state.editor.visible
|
|
753
|
+
})
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
/**
|
|
758
|
+
* Validate saved layer config with new data,
|
|
759
|
+
* update fieldIdx based on new fields
|
|
760
|
+
*/
|
|
761
|
+
function mergeDatasetsByOrder(state, newDataEntries) {
|
|
762
|
+
var merged = _objectSpread(_objectSpread({}, state.datasets), newDataEntries);
|
|
763
|
+
if (Array.isArray(state.preserveDatasetOrder)) {
|
|
764
|
+
// preserveDatasetOrder might not include the new datasets
|
|
765
|
+
var newDatasetIds = Object.keys(merged).filter(function (id) {
|
|
766
|
+
var _state$preserveDatase;
|
|
767
|
+
return !((_state$preserveDatase = state.preserveDatasetOrder) !== null && _state$preserveDatase !== void 0 && _state$preserveDatase.includes(id));
|
|
768
|
+
});
|
|
769
|
+
return [].concat((0, _toConsumableArray2["default"])(state.preserveDatasetOrder), (0, _toConsumableArray2["default"])(newDatasetIds)).reduce(function (accu, dataId) {
|
|
770
|
+
return _objectSpread(_objectSpread({}, accu), merged[dataId] ? (0, _defineProperty2["default"])({}, dataId, merged[dataId]) : {});
|
|
771
|
+
}, {});
|
|
772
|
+
}
|
|
773
|
+
return merged;
|
|
774
|
+
}
|
|
775
|
+
var VIS_STATE_MERGERS = exports.VIS_STATE_MERGERS = [{
|
|
776
|
+
merge: mergeLayers,
|
|
777
|
+
prop: 'layers',
|
|
778
|
+
toMergeProp: 'layerToBeMerged',
|
|
779
|
+
preserveOrder: 'preserveLayerOrder'
|
|
780
|
+
}, {
|
|
781
|
+
merge: mergeFilters,
|
|
782
|
+
prop: 'filters',
|
|
783
|
+
toMergeProp: 'filterToBeMerged',
|
|
784
|
+
preserveOrder: 'preserveFilterOrder',
|
|
785
|
+
replaceParentDatasetIds: replaceFilterDatasetIds
|
|
786
|
+
}, {
|
|
787
|
+
merge: mergeEffects,
|
|
788
|
+
prop: 'effects'
|
|
789
|
+
}, {
|
|
790
|
+
merge: mergeInteractions,
|
|
791
|
+
prop: 'interactionConfig',
|
|
792
|
+
toMergeProp: 'interactionToBeMerged',
|
|
793
|
+
replaceParentDatasetIds: replaceInteractionDatasetIds,
|
|
794
|
+
saveUnmerged: savedUnmergedInteraction
|
|
795
|
+
}, {
|
|
796
|
+
merge: mergeLayerBlending,
|
|
797
|
+
prop: 'layerBlending'
|
|
798
|
+
}, {
|
|
799
|
+
merge: mergeOverlayBlending,
|
|
800
|
+
prop: 'overlayBlending'
|
|
801
|
+
}, {
|
|
802
|
+
merge: mergeSplitMaps,
|
|
803
|
+
prop: 'splitMaps',
|
|
804
|
+
toMergeProp: 'splitMapsToBeMerged'
|
|
805
|
+
}, {
|
|
806
|
+
merge: mergeAnimationConfig,
|
|
807
|
+
prop: 'animationConfig'
|
|
808
|
+
}, {
|
|
809
|
+
merge: mergeEditor,
|
|
810
|
+
prop: 'editor'
|
|
811
|
+
}];
|
|
812
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbG9kYXNoMiIsIl9sb2Rhc2gzIiwiX2RlZXBtZXJnZSIsIl91dGlscyIsIl9yZWR1Y2VycyIsIl9lZmZlY3RzIiwiX2NvbnN0YW50cyIsIl9zY2hlbWFzIiwiX3RhYmxlIiwiX2V4Y2x1ZGVkIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJvd25LZXlzIiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwibWVyZ2VGaWx0ZXJzIiwic3RhdGUiLCJmaWx0ZXJzVG9NZXJnZSIsImZyb21Db25maWciLCJwcmVzZXJ2ZUZpbHRlck9yZGVyIiwibWFwIiwibCIsImlkIiwiX3ZhbGlkYXRlRmlsdGVyc1VwZGF0IiwidmFsaWRhdGVGaWx0ZXJzVXBkYXRlRGF0YXNldHMiLCJ2YWxpZGF0ZWQiLCJmYWlsZWQiLCJ1cGRhdGVkRGF0YXNldHMiLCJ1cGRhdGVkRmlsdGVycyIsImluc2VydEl0ZW1CYXNlZE9uUHJlc2VydmVkT3JkZXIiLCJmaWx0ZXJzIiwicmVzZXRGaWx0ZXJHcHVNb2RlIiwiYXNzaWduR3B1Q2hhbm5lbHMiLCJkYXRhc2V0c1RvRmlsdGVyIiwidW5pcSIsImZsYXR0ZW5EZWVwIiwiZGF0YUlkIiwiZmlsdGVyZWQiLCJhcHBseUZpbHRlcnNUb0RhdGFzZXRzIiwibGF5ZXJzIiwiZGF0YXNldHMiLCJmaWx0ZXJUb0JlTWVyZ2VkIiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInJlcGxhY2VGaWx0ZXJEYXRhc2V0SWRzIiwic2F2ZWRGaWx0ZXIiLCJkYXRhSWRUb1VzZSIsInJlcGxhY2VkIiwiaW5jbHVkZXMiLCJuZXdEYXRhSWQiLCJkIiwiaXNTYXZlZExheWVyQ29uZmlnVjEiLCJsYXllckNvbmZpZyIsInZpc3VhbENoYW5uZWxzIiwicGFyc2VMYXllckNvbmZpZyIsInNjaGVtYSIsIl9zY2hlbWEkcGFyc2VTYXZlZENvbiIsInNhdmVkQ29uZmlnIiwidmVyc2lvbiIsIkNVUlJFTlRfVkVSU0lPTiIsImNvbmZpZyIsInZpc1N0YXRlIiwibGF5ZXJPcmRlciIsInBhcnNlU2F2ZWRDb25maWciLCJjdXJyZW50SXRlbXMiLCJpdGVtcyIsInByZXNlcnZlZE9yZGVyIiwidW5kZWZpbmVkIiwiZGVmYXVsdFN0YXJ0IiwibmV3SXRlbXMiLCJfaXRlcmF0b3IiLCJfc3RlcCIsIml0ZW0iLCJleHBlY3RlZElkeCIsImluZGV4T2YiLCJpbnNlcnRBdCIsImkiLCJwcmVjZWVkSWR4IiwiX2xvb3AiLCJwcmVjZWVkSXRlbUlkIiwiZmluZEluZGV4IiwiYXJyYXlJbnNlcnQiLCJlcnIiLCJjcmVhdGVMYXllckZyb21Db25maWciLCJwYXJzZWRMYXllckNvbmZpZyIsIl92YWxpZGF0ZUxheWVyc0J5RGF0YSIsInZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyIsImxheWVyQ2xhc3NlcyIsImFsbG93RW1wdHlDb2x1bW4iLCJuZXdMYXllciIsInVwZGF0ZUxheWVyRG9tYWluIiwic2VyaWFsaXplTGF5ZXIiLCJfc2VyaWFsaXplZFZpc1N0YXRlJGwiLCJzZXJpYWxpemVkVmlzU3RhdGUiLCJzZXJpYWxpemVWaXNTdGF0ZSIsInNlcmlhbGl6ZUVmZmVjdCIsIm5ld0VmZmVjdCIsIl9zZXJpYWxpemVkVmlzU3RhdGUkZSIsImVmZmVjdHMiLCJlZmZlY3RPcmRlciIsIl9zY2hlbWEkcGFyc2VTYXZlZENvbjIiLCJzYXZlZFN0YXRlIiwiZ2V0Q29uZmlnVG9TYXZlIiwibWVyZ2VMYXllcnMiLCJsYXllcnNUb01lcmdlIiwicHJlc2VydmVMYXllck9yZGVyIiwiZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMiLCJ1bm1lcmdlZCIsInRvTWVyZ2UiLCJfbCRjb25maWciLCJpc01lcmdpbmdEYXRhc2V0cyIsIl92YWxpZGF0ZUxheWVyc0J5RGF0YTIiLCJtZXJnZWRMYXllciIsIl9pbnNlcnRMYXllckF0UmlnaHRPciIsImluc2VydExheWVyQXRSaWdodE9yZGVyIiwibmV3TGF5ZXJPcmRlciIsIm5ld0xheWVycyIsImxheWVyVG9CZU1lcmdlZCIsImN1cnJlbnRMYXllcnMiLCJsYXllcnNUb0luc2VydCIsImN1cnJlbnRPcmRlciIsImN1cnJlbnRMYXllclF1ZXVlIiwiZmluZEJ5SWQiLCJsYXllciIsIkJvb2xlYW4iLCJuZXdMYXllck9yZGVyUXVldWUiLCJtZXJnZUludGVyYWN0aW9ucyIsImludGVyYWN0aW9uVG9CZU1lcmdlZCIsIm1lcmdlZCIsImtleSIsImludGVyYWN0aW9uQ29uZmlnIiwiY3VycmVudENvbmZpZyIsIl9yZWYiLCJlbmFibGVkIiwiY29uZmlnU2F2ZWQiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwiY29uZmlnVG9NZXJnZSIsIl9tZXJnZUludGVyYWN0aW9uVG9vbCIsIm1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnIiwibWVyZ2VkVG9vbHRpcCIsInVubWVyZ2VkVG9vbHRpcCIsImZpZWxkc1RvU2hvdyIsInRvb2x0aXAiLCJwaWNrIiwibmV4dFN0YXRlIiwic2F2ZWRVbm1lcmdlZEludGVyYWN0aW9uIiwiX3VubWVyZ2VkJHRvb2x0aXAiLCJfdW5tZXJnZWQkdG9vbHRpcDIiLCJfc3RhdGUkaW50ZXJhY3Rpb25Ub0IiLCJfdW5tZXJnZWQkdG9vbHRpcDMiLCJyZXBsYWNlSW50ZXJhY3Rpb25EYXRhc2V0SWRzIiwiZGF0YUlkVG9SZXBsYWNlIiwiX2ludGVyYWN0aW9uQ29uZmlnJHRvIiwiX2ludGVyYWN0aW9uQ29uZmlnJHRvMiIsIm1lcmdlU3BsaXRNYXBzIiwic3BsaXRNYXBzIiwic20iLCJlbnRyaWVzIiwiX3JlZjIiLCJfcmVmMyIsIl9zbGljZWRUb0FycmF5MiIsInB1c2hUbyIsImZpbmQiLCJnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAiLCJzcGxpdE1hcHNUb0JlTWVyZ2VkIiwibWVyZ2VFZmZlY3RzIiwibmV3RWZmZWN0cyIsImVmZmVjdCIsImNyZWF0ZUVmZmVjdCIsImRlZXBtZXJnZSIsImFsbCIsImlzQ29uZmlnQWN0aXZlIiwiaXNWYWxpZFRvU2F2ZSIsInRvb2x0aXBDb25maWciLCJfbG9vcDIiLCJhbGxGaWVsZHMiLCJmaWVsZHMiLCJmb3VuZEZpZWxkc1RvU2hvdyIsImZpZWxkIiwibWVyZ2VMYXllckJsZW5kaW5nIiwibGF5ZXJCbGVuZGluZyIsIkxBWUVSX0JMRU5ESU5HUyIsIm1lcmdlT3ZlcmxheUJsZW5kaW5nIiwib3ZlcmxheUJsZW5kaW5nIiwiT1ZFUkxBWV9CTEVORElOR1MiLCJtZXJnZUFuaW1hdGlvbkNvbmZpZyIsImFuaW1hdGlvbiIsImN1cnJlbnRUaW1lIiwiYW5pbWF0aW9uQ29uZmlnIiwiZG9tYWluIiwidmFsaWRhdGVTYXZlZExheWVyQ29sdW1ucyIsInNhdmVkQ29scyIsImVtcHR5Q29scyIsIm9wdGlvbnMiLCJjb2x1bW5zIiwiX2xvb3AzIiwiX09iamVjdCRrZXlzIiwiX2kiLCJzYXZlZCIsImZpZWxkSWR4IiwiX3JlZjQiLCJhbGxDb2xGb3VuZCIsImV2ZXJ5IiwidmFsaWRhdGVDb2x1bW4iLCJydiIsInRocm93T25FcnJvciIsInJlcXVpcmVkQ29sdW1ucyIsImsiLCJvcHRpb25hbCIsIm1pc3NpbmdDb2x1bW5zIiwiRXJyb3IiLCJqb2luIiwiY29uZmlnQ29sdW1ucyIsImludmFsaWRDb2x1bW5zIiwiX2NvbHVtbnMkayIsImNvbHVtbiIsInZhbGlkYXRvciIsInZhbGlkYXRlU2F2ZWRUZXh0TGFiZWwiLCJfcmVmNSIsInNhdmVkVGV4dExhYmVsIiwiX3JlZjYiLCJsYXllclRleHRMYWJlbCIsInNhdmVkVGV4dExhYmVscyIsInRleHRMYWJlbCIsImZkIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlZHVjZSIsImFjY3UiLCJ2YWxpZGF0ZVNhdmVkVmlzdWFsQ2hhbm5lbHMiLCJzYXZlZExheWVyIiwidmFsdWVzIiwiX3JlZjciLCJzY2FsZSIsImZvdW5kRmllbGQiLCJmb3VuZENoYW5uZWwiLCJ1cGRhdGVMYXllckNvbmZpZyIsInZhbGlkYXRlVmlzdWFsQ2hhbm5lbCIsIl9zYXZlZExheWVyJGNvbmZpZyIsIl9uZXdMYXllciRjb25maWckZmllbCIsImZpZWxkTmFtZSIsIl9sYXllciRjb25maWciLCJ2YWxpZGF0ZUxheWVyIiwidmFsaWRhdGVMYXllcldpdGhEYXRhIiwiX2dldENvbHVtbkNvbmZpZ0ZvclZhbGlkYXRpb24iLCJjb2x1bW5Db25maWciLCJnZXRMYXllckNvbHVtbnMiLCJjb2xNb2RlQ29uZmlnIiwiY29sdW1uTW9kZSIsInN1cHBvcnRlZENvbHVtbk1vZGVzIiwiY29sTW9kZSIsIm9wdGlvbmFsQ29sdW1ucyIsImRhdGFzZXQiLCJ0eXBlIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJsYWJlbCIsImNvbG9yIiwiaXNWaXNpYmxlIiwiaGlkZGVuIiwiaGlnaGxpZ2h0Q29sb3IiLCJjb3BpZWRWaXNDb25maWciLCJjb3B5TGF5ZXJDb25maWciLCJ2aXNDb25maWciLCJzaGFsbG93Q29weSIsInZhbGlkYXRlVmlzQ29uZmlnIiwibWVyZ2VFZGl0b3IiLCJzYXZlZEVkaXRvciIsIl9zYXZlZEVkaXRvciR2aXNpYmxlIiwiZWRpdG9yIiwiZmVhdHVyZXMiLCJ2aXNpYmxlIiwibWVyZ2VEYXRhc2V0c0J5T3JkZXIiLCJuZXdEYXRhRW50cmllcyIsInByZXNlcnZlRGF0YXNldE9yZGVyIiwibmV3RGF0YXNldElkcyIsIl9zdGF0ZSRwcmVzZXJ2ZURhdGFzZSIsIlZJU19TVEFURV9NRVJHRVJTIiwiZXhwb3J0cyIsIm1lcmdlIiwicHJvcCIsInRvTWVyZ2VQcm9wIiwicHJlc2VydmVPcmRlciIsInJlcGxhY2VQYXJlbnREYXRhc2V0SWRzIiwic2F2ZVVubWVyZ2VkIl0sInNvdXJjZXMiOlsiLi4vc3JjL3Zpcy1zdGF0ZS1tZXJnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoLnVuaXEnO1xuaW1wb3J0IHBpY2sgZnJvbSAnbG9kYXNoLnBpY2snO1xuaW1wb3J0IGZsYXR0ZW5EZWVwIGZyb20gJ2xvZGFzaC5mbGF0dGVuZGVlcCc7XG5pbXBvcnQgZGVlcG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQge1xuICBhcnJheUluc2VydCxcbiAgZ2V0SW5pdGlhbE1hcExheWVyc0ZvclNwbGl0TWFwLFxuICBhcHBseUZpbHRlcnNUb0RhdGFzZXRzLFxuICB2YWxpZGF0ZUZpbHRlcnNVcGRhdGVEYXRhc2V0cyxcbiAgZmluZEJ5SWRcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2dldExheWVyT3JkZXJGcm9tTGF5ZXJzfSBmcm9tICdAa2VwbGVyLmdsL3JlZHVjZXJzJztcblxuaW1wb3J0IHtMYXllciwgVmlzdWFsQ2hhbm5lbH0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtjcmVhdGVFZmZlY3R9IGZyb20gJ0BrZXBsZXIuZ2wvZWZmZWN0cyc7XG5pbXBvcnQge0xBWUVSX0JMRU5ESU5HUywgT1ZFUkxBWV9CTEVORElOR1N9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7Q1VSUkVOVF9WRVJTSU9OLCBWaXNTdGF0ZSwgVmlzU3RhdGVNZXJnZXJzLCBLZXBsZXJHTFNjaGVtYUNsYXNzfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge1xuICBQYXJzZWRMYXllcixcbiAgUGFyc2VkVmlzU3RhdGUsXG4gIFNhdmVkSW50ZXJhY3Rpb25Db25maWcsXG4gIFRvb2x0aXBJbmZvLFxuICBTYXZlZEVkaXRvcixcbiAgUGFyc2VkQ29uZmlnLFxuICBGaWx0ZXIsXG4gIEVmZmVjdCBhcyBFZmZlY3RUeXBlLFxuICBQYXJzZWRFZmZlY3QsXG4gIExheWVyQ29sdW1ucyxcbiAgTGF5ZXJDb2x1bW5cbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0tlcGxlclRhYmxlLCBEYXRhc2V0cywgYXNzaWduR3B1Q2hhbm5lbHMsIHJlc2V0RmlsdGVyR3B1TW9kZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5cbi8qKlxuICogTWVyZ2UgbG9hZGVkIGZpbHRlcnMgd2l0aCBjdXJyZW50IHN0YXRlLCBpZiBubyBmaWVsZHMgb3IgZGF0YSBhcmUgbG9hZGVkXG4gKiBzYXZlIGl0IGZvciBsYXRlclxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRmlsdGVyczxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgZmlsdGVyc1RvTWVyZ2U6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2ZpbHRlcnMnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBjb25zdCBwcmVzZXJ2ZUZpbHRlck9yZGVyID0gZnJvbUNvbmZpZ1xuICAgID8gZmlsdGVyc1RvTWVyZ2U/Lm1hcChsID0+IGwuaWQpXG4gICAgOiBzdGF0ZS5wcmVzZXJ2ZUZpbHRlck9yZGVyO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXJzVG9NZXJnZSkgfHwgIWZpbHRlcnNUb01lcmdlLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHt2YWxpZGF0ZWQsIGZhaWxlZCwgdXBkYXRlZERhdGFzZXRzfSA9IHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzKHN0YXRlLCBmaWx0ZXJzVG9NZXJnZSk7XG4gIGxldCB1cGRhdGVkRmlsdGVycyA9IGluc2VydEl0ZW1CYXNlZE9uUHJlc2VydmVkT3JkZXIoXG4gICAgc3RhdGUuZmlsdGVycyxcbiAgICB2YWxpZGF0ZWQsXG4gICAgcHJlc2VydmVGaWx0ZXJPcmRlclxuICApO1xuXG4gIC8vIG1lcmdlIGZpbHRlciB3aXRoIGV4aXN0aW5nXG4gIHVwZGF0ZWRGaWx0ZXJzID0gcmVzZXRGaWx0ZXJHcHVNb2RlKHVwZGF0ZWRGaWx0ZXJzKTtcbiAgdXBkYXRlZEZpbHRlcnMgPSBhc3NpZ25HcHVDaGFubmVscyh1cGRhdGVkRmlsdGVycyk7XG4gIC8vIGZpbHRlciBkYXRhXG4gIGNvbnN0IGRhdGFzZXRzVG9GaWx0ZXIgPSB1bmlxKGZsYXR0ZW5EZWVwKHZhbGlkYXRlZC5tYXAoZiA9PiBmLmRhdGFJZCkpKTtcblxuICBjb25zdCBmaWx0ZXJlZCA9IGFwcGx5RmlsdGVyc1RvRGF0YXNldHMoXG4gICAgZGF0YXNldHNUb0ZpbHRlcixcbiAgICB1cGRhdGVkRGF0YXNldHMsXG4gICAgdXBkYXRlZEZpbHRlcnMsXG4gICAgc3RhdGUubGF5ZXJzXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiB1cGRhdGVkRmlsdGVycyxcbiAgICBkYXRhc2V0czogZmlsdGVyZWQsXG4gICAgcHJlc2VydmVGaWx0ZXJPcmRlcixcbiAgICBmaWx0ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUuZmlsdGVyVG9CZU1lcmdlZCwgLi4uZmFpbGVkXVxuICB9O1xufVxuXG4vLyByZXBsYWNlIGRhdGFJZCBpbiBzYXZlZCBGaWx0ZXJcbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlRmlsdGVyRGF0YXNldElkcyhcbiAgc2F2ZWRGaWx0ZXI6IEZpbHRlcltdLFxuICBkYXRhSWQ6IHN0cmluZyxcbiAgZGF0YUlkVG9Vc2U6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHJlcGxhY2VkOiBGaWx0ZXJbXSA9IFtdO1xuICBzYXZlZEZpbHRlci5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgaWYgKGZpbHRlci5kYXRhSWQuaW5jbHVkZXMoZGF0YUlkKSkge1xuICAgICAgY29uc3QgbmV3RGF0YUlkID0gZmlsdGVyLmRhdGFJZC5tYXAoZCA9PiAoZCA9PT0gZGF0YUlkID8gZGF0YUlkVG9Vc2UgOiBkKSk7XG4gICAgICByZXBsYWNlZC5wdXNoKHtcbiAgICAgICAgLi4uZmlsdGVyLFxuICAgICAgICBkYXRhSWQ6IG5ld0RhdGFJZFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlcGxhY2VkLmxlbmd0aCA/IHJlcGxhY2VkIDogbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2F2ZWRMYXllckNvbmZpZ1YxKGxheWVyQ29uZmlnOiBhbnkpOiBib29sZWFuIHtcbiAgLy8gZXhwb3J0ZWQgbGF5ZXIgY29uZmlndXJhdGlvbiBjb250YWlucyB2aXN1YWxDaGFubmVscyBwcm9wZXJ0eVxuICByZXR1cm4gbGF5ZXJDb25maWc/LnZpc3VhbENoYW5uZWxzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMYXllckNvbmZpZyhcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzLFxuICBsYXllckNvbmZpZzogYW55XG4pOiBQYXJzZWRMYXllciB8IHVuZGVmaW5lZCB7XG4gIC8vIGFzc3VtZSB0aGUgbGF5ZXIgY29uZmlnIGlzIGN1cnJlbnQgdmVyc2lvblxuICBjb25zdCBzYXZlZENvbmZpZyA9IHtcbiAgICB2ZXJzaW9uOiBDVVJSRU5UX1ZFUlNJT04sXG4gICAgY29uZmlnOiB7XG4gICAgICB2aXNTdGF0ZToge2xheWVyczogW2xheWVyQ29uZmlnXSwgbGF5ZXJPcmRlcjogW2xheWVyQ29uZmlnLmlkXX1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHNjaGVtYS5wYXJzZVNhdmVkQ29uZmlnKHNhdmVkQ29uZmlnKT8udmlzU3RhdGU/LmxheWVycz8uWzBdO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRJdGVtQmFzZWRPblByZXNlcnZlZE9yZGVyKFxuICBjdXJyZW50SXRlbXM6IEZpbHRlcltdLFxuICBpdGVtczogRmlsdGVyW10sXG4gIHByZXNlcnZlZE9yZGVyOiBhbnlbXSA9IFtdLFxuICBkZWZhdWx0U3RhcnQ/OiBib29sZWFuXG4pIHtcbiAgbGV0IG5ld0l0ZW1zID0gWy4uLmN1cnJlbnRJdGVtc107XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgZXhwZWN0ZWRJZHggPSBwcmVzZXJ2ZWRPcmRlci5pbmRleE9mKGl0ZW0uaWQpO1xuICAgIC8vIGluc2VydEF0IHRoZSBlbmQgYnkgZGVmYXVsdFxuICAgIGxldCBpbnNlcnRBdCA9IGRlZmF1bHRTdGFydCA/IDAgOiBuZXdJdGVtcy5sZW5ndGg7XG4gICAgaWYgKGV4cGVjdGVkSWR4ID4gMCkge1xuICAgICAgLy8gbG9vayBmb3IgbGF5ZXIgdG8gaW5zZXJ0IGFmdGVyXG4gICAgICBsZXQgaSA9IGV4cGVjdGVkSWR4ICsgMTtcbiAgICAgIGxldCBwcmVjZWVkSWR4ID0gLTE7XG4gICAgICB3aGlsZSAoaS0tID4gMCAmJiBwcmVjZWVkSWR4IDwgMCkge1xuICAgICAgICAvLyBrZWVwIGxvb2tpbmcgZm9yIHByZWNlZWQgbGF5ZXIgdGhhdCBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBjb25zdCBwcmVjZWVkSXRlbUlkID0gcHJlc2VydmVkT3JkZXJbaSAtIDFdO1xuICAgICAgICBwcmVjZWVkSWR4ID0gbmV3SXRlbXMuZmluZEluZGV4KGQgPT4gZC5pZCA9PT0gcHJlY2VlZEl0ZW1JZCk7XG4gICAgICB9XG4gICAgICBpZiAocHJlY2VlZElkeCA+IC0xKSB7XG4gICAgICAgIC8vIGlmIGZvdW5kXG4gICAgICAgIGluc2VydEF0ID0gcHJlY2VlZElkeCArIDE7XG4gICAgICB9XG4gICAgfVxuICAgIG5ld0l0ZW1zID0gYXJyYXlJbnNlcnQobmV3SXRlbXMsIGluc2VydEF0LCBpdGVtKTtcbiAgfVxuICByZXR1cm4gbmV3SXRlbXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYXllckZyb21Db25maWcoc3RhdGU6IFZpc1N0YXRlLCBsYXllckNvbmZpZzogYW55KTogTGF5ZXIgfCBudWxsIHtcbiAgLy8gY2hlY2sgaWYgdGhlIGxheWVyIGNvbmZpZyBpcyBwYXJzZWRcbiAgY29uc3QgcGFyc2VkTGF5ZXJDb25maWcgPSBpc1NhdmVkTGF5ZXJDb25maWdWMShsYXllckNvbmZpZylcbiAgICA/IHBhcnNlTGF5ZXJDb25maWcoc3RhdGUuc2NoZW1hLCBsYXllckNvbmZpZylcbiAgICA6IGxheWVyQ29uZmlnO1xuXG4gIGlmICghcGFyc2VkTGF5ZXJDb25maWcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBmaXJzdCB2YWxpZGF0ZSBjb25maWcgYWdhaW5zdCBkYXRhc2V0XG4gIGNvbnN0IHt2YWxpZGF0ZWQsIGZhaWxlZH0gPSB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gICAgc3RhdGUuZGF0YXNldHMsXG4gICAgc3RhdGUubGF5ZXJDbGFzc2VzLFxuICAgIFtwYXJzZWRMYXllckNvbmZpZ10sXG4gICAge2FsbG93RW1wdHlDb2x1bW46IHRydWV9XG4gICk7XG5cbiAgaWYgKGZhaWxlZD8ubGVuZ3RoIHx8ICF2YWxpZGF0ZWQubGVuZ3RoKSB7XG4gICAgLy8gZmFpbGVkXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBuZXdMYXllciA9IHZhbGlkYXRlZFswXTtcbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJEb21haW4oc3RhdGUuZGF0YXNldHMpO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbi8qKlxuICogR2V0IGxvYWRlZCBsYXllciBmcm9tIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVMYXllcihcbiAgbmV3TGF5ZXI6IExheWVyLFxuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hQ2xhc3Ncbik6IFBhcnNlZExheWVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VyaWFsaXplZFZpc1N0YXRlID0gc2VyaWFsaXplVmlzU3RhdGUoXG4gICAge2xheWVyczogW25ld0xheWVyXSwgbGF5ZXJPcmRlcjogW25ld0xheWVyLmlkXX0sXG4gICAgc2NoZW1hXG4gICk7XG4gIHJldHVybiBzZXJpYWxpemVkVmlzU3RhdGU/LmxheWVycz8uWzBdO1xufVxuXG4vKipcbiAqIEdldCBsb2FkZWQgZWZmZWN0IGZyb20gc3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUVmZmVjdChcbiAgbmV3RWZmZWN0OiBFZmZlY3RUeXBlLFxuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hQ2xhc3Ncbik6IFBhcnNlZEVmZmVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRWaXNTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKFxuICAgIHtlZmZlY3RzOiBbbmV3RWZmZWN0XSwgZWZmZWN0T3JkZXI6IFtuZXdFZmZlY3QuaWRdfSxcbiAgICBzY2hlbWFcbiAgKTtcbiAgcmV0dXJuIHNlcmlhbGl6ZWRWaXNTdGF0ZT8uZWZmZWN0cz8uWzBdO1xufVxuXG4vKipcbiAqIEdldCB2aXMgc3RhdGUgY29uZmlnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVWaXNTdGF0ZShcbiAgdmlzU3RhdGU6IFBhcnRpYWw8VmlzU3RhdGU+LFxuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hQ2xhc3Ncbik6IFBhcnNlZFZpc1N0YXRlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2F2ZWRTdGF0ZSA9IHNjaGVtYS5nZXRDb25maWdUb1NhdmUoe1xuICAgIHZpc1N0YXRlXG4gIH0pO1xuICByZXR1cm4gc2F2ZWRTdGF0ZSA/IHNjaGVtYS5wYXJzZVNhdmVkQ29uZmlnKHNhdmVkU3RhdGUpPy52aXNTdGF0ZSA6IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogTWVyZ2UgbGF5ZXJzIGZyb20gZGUtc2VyaWFsaXplZCBzdGF0ZSwgaWYgbm8gZmllbGRzIG9yIGRhdGEgYXJlIGxvYWRlZFxuICogc2F2ZSBpdCBmb3IgbGF0ZXJcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxheWVyczxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgbGF5ZXJzVG9NZXJnZTogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBjb25zdCBwcmVzZXJ2ZUxheWVyT3JkZXIgPSBmcm9tQ29uZmlnXG4gICAgPyBnZXRMYXllck9yZGVyRnJvbUxheWVycyhsYXllcnNUb01lcmdlKVxuICAgIDogc3RhdGUucHJlc2VydmVMYXllck9yZGVyO1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGF5ZXJzVG9NZXJnZSkgfHwgIWxheWVyc1RvTWVyZ2UubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIC8vIGRvbid0IG1lcmdlIGxheWVyIGlmIGRhdGFzZXQgaXMgYmVpbmcgbWVyZ2VkXG4gIGNvbnN0IHVubWVyZ2VkOiBQYXJzZWRMYXllcltdID0gW107XG4gIGNvbnN0IHRvTWVyZ2U6IFBhcnNlZExheWVyW10gPSBbXTtcbiAgbGF5ZXJzVG9NZXJnZS5mb3JFYWNoKChsOiBQYXJzZWRMYXllcikgPT4ge1xuICAgIGlmIChsPy5jb25maWc/LmRhdGFJZCAmJiBzdGF0ZS5pc01lcmdpbmdEYXRhc2V0c1tsLmNvbmZpZy5kYXRhSWRdKSB7XG4gICAgICB1bm1lcmdlZC5wdXNoKGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b01lcmdlLnB1c2gobCk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCB7dmFsaWRhdGVkOiBtZXJnZWRMYXllciwgZmFpbGVkfSA9IHZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyhcbiAgICBzdGF0ZS5kYXRhc2V0cyxcbiAgICBzdGF0ZS5sYXllckNsYXNzZXMsXG4gICAgdG9NZXJnZVxuICApO1xuICB1bm1lcmdlZC5wdXNoKC4uLmZhaWxlZCk7XG4gIC8vIHB1dCBuZXcgbGF5ZXJzIGluIGZyb250IG9mIGN1cnJlbnQgbGF5ZXJzXG4gIGNvbnN0IHtuZXdMYXllck9yZGVyLCBuZXdMYXllcnN9ID0gaW5zZXJ0TGF5ZXJBdFJpZ2h0T3JkZXIoXG4gICAgc3RhdGUubGF5ZXJzLFxuICAgIG1lcmdlZExheWVyLFxuICAgIHN0YXRlLmxheWVyT3JkZXIsXG4gICAgcHJlc2VydmVMYXllck9yZGVyXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBsYXllck9yZGVyOiBuZXdMYXllck9yZGVyLFxuICAgIHByZXNlcnZlTGF5ZXJPcmRlcixcbiAgICBsYXllclRvQmVNZXJnZWQ6IFsuLi5zdGF0ZS5sYXllclRvQmVNZXJnZWQsIC4uLnVubWVyZ2VkXVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0TGF5ZXJBdFJpZ2h0T3JkZXIoXG4gIGN1cnJlbnRMYXllcnMsXG4gIGxheWVyc1RvSW5zZXJ0LFxuICBjdXJyZW50T3JkZXIsXG4gIHByZXNlcnZlZE9yZGVyOiBzdHJpbmdbXSA9IFtdXG4pIHtcbiAgaWYgKCFsYXllcnNUb0luc2VydD8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtuZXdMYXllcnM6IGN1cnJlbnRMYXllcnMsIG5ld0xheWVyT3JkZXI6IGN1cnJlbnRPcmRlcn07XG4gIH1cbiAgLy8gcGVyc2VydmVkT3JkZXIgWydhJywgJ2InLCAnYyddO1xuICAvLyBsYXllck9yZGVyIFsnYScsICdiJywgJ2MnXVxuICBjb25zdCBjdXJyZW50TGF5ZXJRdWV1ZSA9IGN1cnJlbnRPcmRlclxuICAgIC5tYXAoaWQgPT4gZmluZEJ5SWQoaWQpKGN1cnJlbnRMYXllcnMpKVxuICAgIC5maWx0ZXIobGF5ZXIgPT4gQm9vbGVhbihsYXllcikpO1xuICBjb25zdCBuZXdMYXllcnMgPSBjdXJyZW50TGF5ZXJzLmNvbmNhdChsYXllcnNUb0luc2VydCk7XG4gIGNvbnN0IG5ld0xheWVyT3JkZXJRdWV1ZSA9IGluc2VydEl0ZW1CYXNlZE9uUHJlc2VydmVkT3JkZXIoXG4gICAgY3VycmVudExheWVyUXVldWUsXG4gICAgbGF5ZXJzVG9JbnNlcnQsXG4gICAgcHJlc2VydmVkT3JkZXIsXG4gICAgdHJ1ZVxuICApO1xuXG4gIC8vIHJlY29uc3RydWN0IGxheWVyT3JkZXIgYWZ0ZXIgaW5zZXJ0XG4gIGNvbnN0IG5ld0xheWVyT3JkZXIgPSBnZXRMYXllck9yZGVyRnJvbUxheWVycyhuZXdMYXllck9yZGVyUXVldWUpO1xuXG4gIHJldHVybiB7XG4gICAgbmV3TGF5ZXJPcmRlcixcbiAgICBuZXdMYXllcnNcbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBpbnRlcmFjdGlvbnMgd2l0aCBzYXZlZCBjb25maWdcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUludGVyYWN0aW9uczxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+IHwgdW5kZWZpbmVkXG4pOiBTIHtcbiAgY29uc3QgbWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG4gIGNvbnN0IHVubWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG5cbiAgaWYgKGludGVyYWN0aW9uVG9CZU1lcmdlZCkge1xuICAgIChPYmplY3Qua2V5cyhpbnRlcmFjdGlvblRvQmVNZXJnZWQpIGFzIEFycmF5PGtleW9mIFNhdmVkSW50ZXJhY3Rpb25Db25maWc+KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50Q29uZmlnID1cbiAgICAgICAga2V5ID09PSAndG9vbHRpcCcgfHwga2V5ID09PSAnYnJ1c2gnID8gc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XS5jb25maWcgOiBudWxsO1xuXG4gICAgICBjb25zdCB7ZW5hYmxlZCwgLi4uY29uZmlnU2F2ZWR9ID0gaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkW2tleV0gfHwge307XG5cbiAgICAgIGxldCBjb25maWdUb01lcmdlID0gY29uZmlnU2F2ZWQ7XG5cbiAgICAgIGlmIChrZXkgPT09ICd0b29sdGlwJykge1xuICAgICAgICBjb25zdCB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfSA9IG1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbmZpZ1NhdmVkIGFzIFNhdmVkSW50ZXJhY3Rpb25Db25maWdbJ3Rvb2x0aXAnXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIG1lcmdlIG5ldyBkYXRhc2V0IHRvb2x0aXBzIHdpdGggb3JpZ2luYWwgZGF0YXNldCB0b29sdGlwc1xuICAgICAgICBjb25maWdUb01lcmdlID0ge1xuICAgICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgICAgLi4uKGN1cnJlbnRDb25maWcgYXMgVG9vbHRpcEluZm9bJ2NvbmZpZyddKS5maWVsZHNUb1Nob3csXG4gICAgICAgICAgICAuLi5tZXJnZWRUb29sdGlwXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh1bm1lcmdlZFRvb2x0aXApLmxlbmd0aCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICB1bm1lcmdlZC50b29sdGlwID0ge2ZpZWxkc1RvU2hvdzogdW5tZXJnZWRUb29sdGlwLCBlbmFibGVkOiBCb29sZWFuKGVuYWJsZWQpfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtZXJnZWRba2V5XSA9IHtcbiAgICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XSxcbiAgICAgICAgZW5hYmxlZDogQm9vbGVhbihlbmFibGVkKSxcbiAgICAgICAgLi4uKGN1cnJlbnRDb25maWdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY29uZmlnOiBwaWNrKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAuLi5jb25maWdUb01lcmdlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50Q29uZmlnKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBuZXh0U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgaW50ZXJhY3Rpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgLi4ubWVyZ2VkXG4gICAgfSxcbiAgICBpbnRlcmFjdGlvblRvQmVNZXJnZWQ6IHNhdmVkVW5tZXJnZWRJbnRlcmFjdGlvbihzdGF0ZSwgdW5tZXJnZWQpXG4gIH07XG4gIHJldHVybiBuZXh0U3RhdGU7XG59XG5cbmZ1bmN0aW9uIHNhdmVkVW5tZXJnZWRJbnRlcmFjdGlvbjxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgdW5tZXJnZWQ6IFBhcnRpYWw8U2F2ZWRJbnRlcmFjdGlvbkNvbmZpZz5cbikge1xuICBpZiAoIXVubWVyZ2VkPy50b29sdGlwPy5maWVsZHNUb1Nob3cpIHtcbiAgICByZXR1cm4gc3RhdGUuaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkO1xuICB9XG4gIHJldHVybiB7XG4gICAgdG9vbHRpcDoge1xuICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkLnRvb2x0aXAsXG4gICAgICAuLi4odHlwZW9mIHVubWVyZ2VkPy50b29sdGlwPy5lbmFibGVkID09PSAnYm9vbGVhbidcbiAgICAgICAgPyB7ZW5hYmxlZDogdW5tZXJnZWQudG9vbHRpcC5lbmFibGVkfVxuICAgICAgICA6IHt9KSxcbiAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvblRvQmVNZXJnZWQ/LnRvb2x0aXA/LmZpZWxkc1RvU2hvdyxcbiAgICAgICAgLi4udW5tZXJnZWQ/LnRvb2x0aXA/LmZpZWxkc1RvU2hvd1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUludGVyYWN0aW9uRGF0YXNldElkcyhpbnRlcmFjdGlvbkNvbmZpZywgZGF0YUlkOiBzdHJpbmcsIGRhdGFJZFRvUmVwbGFjZTogc3RyaW5nKSB7XG4gIGlmIChpbnRlcmFjdGlvbkNvbmZpZz8udG9vbHRpcD8uZmllbGRzVG9TaG93W2RhdGFJZF0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICB0b29sdGlwOiB7XG4gICAgICAgIC4uLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAsXG4gICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgIFtkYXRhSWRUb1JlcGxhY2VdOiBpbnRlcmFjdGlvbkNvbmZpZz8udG9vbHRpcD8uZmllbGRzVG9TaG93W2RhdGFJZF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIE1lcmdlIHNwbGl0TWFwcyBjb25maWcgd2l0aCBjdXJyZW50IHZpc1N0ZXRlLlxuICogMS4gaWYgY3VycmVudCBtYXAgaXMgc3BsaXQsIGJ1dCBzcGxpdE1hcCBET0VTTk9UIGNvbnRhaW4gbWFwc1xuICogICAgOiBkb24ndCBtZXJnZSBhbnl0aGluZ1xuICogMi4gaWYgY3VycmVudCBtYXAgaXMgTk9UIHNwbGl0LCBidXQgc3BsaXRNYXBzIGNvbnRhaW4gbWFwc1xuICogICAgOiBhZGQgdG8gc3BsaXRNYXBzLCBhbmQgYWRkIGN1cnJlbnQgbGF5ZXJzIHRvIHNwbGl0TWFwc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VTcGxpdE1hcHM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIHNwbGl0TWFwczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnc3BsaXRNYXBzJ10gPSBbXVxuKTogUyB7XG4gIGNvbnN0IG1lcmdlZCA9IFsuLi5zdGF0ZS5zcGxpdE1hcHNdO1xuICBjb25zdCB1bm1lcmdlZCA9IFtdO1xuICBzcGxpdE1hcHMuZm9yRWFjaCgoc20sIGkpID0+IHtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoc20ubGF5ZXJzKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBlbnRyaWVzLmZvckVhY2goKFtpZCwgdmFsdWVdKSA9PiB7XG4gICAgICAgIC8vIGNoZWNrIGlmIGxheWVyIGV4aXN0c1xuICAgICAgICBjb25zdCBwdXNoVG8gPSBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGlkKSA/IG1lcmdlZCA6IHVubWVyZ2VkO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBtYXAgcGFuZWwgaWYgY3VycmVudCBtYXAgaXMgbm90IHNwbGl0XG4gICAgICAgIHB1c2hUb1tpXSA9IHB1c2hUb1tpXSB8fCB7XG4gICAgICAgICAgLy8ga2VlcCBpZFxuICAgICAgICAgIC4uLnNtLFxuICAgICAgICAgIGxheWVyczogcHVzaFRvID09PSBtZXJnZWQgPyBnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAoc3RhdGUubGF5ZXJzKSA6IFtdXG4gICAgICAgIH07XG4gICAgICAgIHB1c2hUb1tpXS5sYXllcnMgPSB7XG4gICAgICAgICAgLi4ucHVzaFRvW2ldLmxheWVycyxcbiAgICAgICAgICBbaWRdOiB2YWx1ZVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIGFyZSBtZXJnaW5nIGlmIHRoZXJlIGFyZSBubyBsYXllcnMgaW4gYm90aCBzcGxpdCBtYXBcbiAgICAgIG1lcmdlZC5wdXNoKHNtKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgc3BsaXRNYXBzOiBtZXJnZWQsXG4gICAgc3BsaXRNYXBzVG9CZU1lcmdlZDogWy4uLnN0YXRlLnNwbGl0TWFwc1RvQmVNZXJnZWQsIC4uLnVubWVyZ2VkXVxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGVmZmVjdHMgd2l0aCBzYXZlZCBjb25maWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRWZmZWN0czxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgZWZmZWN0czogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnZWZmZWN0cyddLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogUyB7XG4gIGNvbnN0IG5ld0VmZmVjdHMgPSBbXG4gICAgLi4uc3RhdGUuZWZmZWN0cyxcbiAgICAuLi4oZWZmZWN0cyB8fCBbXSlcbiAgICAgIC5tYXAoZWZmZWN0ID0+IHtcbiAgICAgICAgcmV0dXJuIGZyb21Db25maWdcbiAgICAgICAgICA/IGNyZWF0ZUVmZmVjdChcbiAgICAgICAgICAgICAgZGVlcG1lcmdlLmFsbChbXG4gICAgICAgICAgICAgICAgZWZmZWN0LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC8vIGNvbGxhcHNlIGFsbCBwYW5lbHMgd2hlbiBsb2FkaW5nIGVmZmVjdHNcbiAgICAgICAgICAgICAgICAgIGlzQ29uZmlnQWN0aXZlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IChlZmZlY3QgYXMgRWZmZWN0VHlwZSk7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihlZmZlY3QgPT4ge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihlZmZlY3QgJiYgZWZmZWN0LmlzVmFsaWRUb1NhdmUoKSk7XG4gICAgICB9KVxuICBdO1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVmZmVjdHM6IG5ld0VmZmVjdHMsXG4gICAgZWZmZWN0T3JkZXI6IG5ld0VmZmVjdHMubWFwKGVmZmVjdCA9PiBlZmZlY3QuaWQpXG4gIH07XG59XG5cbi8qKlxuICogTWVyZ2UgaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcCB3aXRoIHNhdmVkIGNvbmZpZyxcbiAqIHZhbGlkYXRlIGZpZWxkc1RvU2hvd1xuICpcbiAqIEBwYXJhbSBzdGF0ZVxuICogQHBhcmFtIHRvb2x0aXBDb25maWdcbiAqIEByZXR1cm4gLSB7bWVyZ2VkVG9vbHRpcDoge30sIHVubWVyZ2VkVG9vbHRpcDoge319XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUludGVyYWN0aW9uVG9vbHRpcENvbmZpZyhcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB0b29sdGlwQ29uZmlnOiBQaWNrPFRvb2x0aXBJbmZvWydjb25maWcnXSwgJ2ZpZWxkc1RvU2hvdyc+IHwgbnVsbCA9IG51bGxcbikge1xuICBjb25zdCB1bm1lcmdlZFRvb2x0aXA6IFRvb2x0aXBJbmZvWydjb25maWcnXVsnZmllbGRzVG9TaG93J10gPSB7fTtcbiAgY29uc3QgbWVyZ2VkVG9vbHRpcDogVG9vbHRpcEluZm9bJ2NvbmZpZyddWydmaWVsZHNUb1Nob3cnXSA9IHt9O1xuXG4gIGlmIChcbiAgICAhdG9vbHRpcENvbmZpZyB8fFxuICAgICF0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdyB8fFxuICAgICFPYmplY3Qua2V5cyh0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdykubGVuZ3RoXG4gICkge1xuICAgIHJldHVybiB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfTtcbiAgfVxuXG4gIGZvciAoY29uc3QgZGF0YUlkIGluIHRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93KSB7XG4gICAgaWYgKCFzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdIHx8IHN0YXRlLmlzTWVyZ2luZ0RhdGFzZXRzW2RhdGFJZF0pIHtcbiAgICAgIC8vIGlzIG5vdCB5ZXQgbG9hZGVkXG4gICAgICB1bm1lcmdlZFRvb2x0aXBbZGF0YUlkXSA9IHRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIGRhdGFzZXQgaXMgbG9hZGVkXG4gICAgICBjb25zdCBhbGxGaWVsZHMgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLmZpZWxkcy5tYXAoZCA9PiBkLm5hbWUpO1xuICAgICAgY29uc3QgZm91bmRGaWVsZHNUb1Nob3cgPSB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdLmZpbHRlcihmaWVsZCA9PlxuICAgICAgICBhbGxGaWVsZHMuaW5jbHVkZXMoZmllbGQubmFtZSlcbiAgICAgICk7XG5cbiAgICAgIG1lcmdlZFRvb2x0aXBbZGF0YUlkXSA9IGZvdW5kRmllbGRzVG9TaG93O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfTtcbn1cbi8qKlxuICogTWVyZ2UgbGF5ZXJCbGVuZGluZyB3aXRoIHNhdmVkXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllckJsZW5kaW5nPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBsYXllckJsZW5kaW5nOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydsYXllckJsZW5kaW5nJ11cbik6IFMge1xuICBpZiAobGF5ZXJCbGVuZGluZyAmJiBMQVlFUl9CTEVORElOR1NbbGF5ZXJCbGVuZGluZ10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBsYXllckJsZW5kaW5nXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBNZXJnZSBvdmVybGF5QmxlbmRpbmcgd2l0aCBzYXZlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPdmVybGF5QmxlbmRpbmc8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIG92ZXJsYXlCbGVuZGluZzogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnb3ZlcmxheUJsZW5kaW5nJ11cbik6IFMge1xuICBpZiAob3ZlcmxheUJsZW5kaW5nICYmIE9WRVJMQVlfQkxFTkRJTkdTW292ZXJsYXlCbGVuZGluZ10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBvdmVybGF5QmxlbmRpbmdcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIE1lcmdlIGFuaW1hdGlvbiBjb25maWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQW5pbWF0aW9uQ29uZmlnPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBhbmltYXRpb246IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2FuaW1hdGlvbkNvbmZpZyddXG4pOiBTIHtcbiAgaWYgKGFuaW1hdGlvbiAmJiBhbmltYXRpb24uY3VycmVudFRpbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgICAuLi5hbmltYXRpb24sXG4gICAgICAgIGRvbWFpbjogbnVsbFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29sdW1ucyB3aXRoIG5ldyBkYXRhLFxuICogdXBkYXRlIGZpZWxkSWR4IGJhc2VkIG9uIG5ldyBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gZmllbGRzXG4gKiBAcGFyYW0gc2F2ZWRDb2xzXG4gKiBAcGFyYW0gZW1wdHlDb2xzXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybiAtIHZhbGlkYXRlZCBjb2x1bW5zIG9yIG51bGxcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZExheWVyQ29sdW1ucyhcbiAgZmllbGRzOiBLZXBsZXJUYWJsZVsnZmllbGRzJ10sXG4gIHNhdmVkQ29sczoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgfSA9IHt9LFxuICBlbXB0eUNvbHM6IExheWVyQ29sdW1ucyxcbiAgb3B0aW9uczoge3Rocm93T25FcnJvcj86IGJvb2xlYW59ID0ge31cbikge1xuICAvLyBQcmVwYXJlIGNvbHVtbnMgZm9yIHRoZSB2YWxpZGF0b3JcbiAgY29uc3QgY29sdW1uczogdHlwZW9mIGVtcHR5Q29scyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbXB0eUNvbHMpKSB7XG4gICAgY29sdW1uc1trZXldID0gey4uLmVtcHR5Q29sc1trZXldfTtcblxuICAgIGNvbnN0IHNhdmVkID0gc2F2ZWRDb2xzW2tleV07XG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICBjb25zdCBmaWVsZElkeCA9IGZpZWxkcy5maW5kSW5kZXgoKHtuYW1lfSkgPT4gbmFtZSA9PT0gc2F2ZWQpO1xuXG4gICAgICBpZiAoZmllbGRJZHggPiAtMSkge1xuICAgICAgICAvLyB1cGRhdGUgZm91bmQgY29sdW1uc1xuICAgICAgICBjb2x1bW5zW2tleV0uZmllbGRJZHggPSBmaWVsZElkeDtcbiAgICAgICAgY29sdW1uc1trZXldLnZhbHVlID0gc2F2ZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZmluZCBhY3R1YWwgY29sdW1uIGZpZWxkSWR4LCBpbiBjYXNlIGl0IGhhcyBjaGFuZ2VkXG4gIGNvbnN0IGFsbENvbEZvdW5kID0gT2JqZWN0LmtleXMoY29sdW1ucykuZXZlcnkoa2V5ID0+XG4gICAgdmFsaWRhdGVDb2x1bW4oY29sdW1uc1trZXldLCBjb2x1bW5zLCBmaWVsZHMpXG4gICk7XG5cbiAgY29uc3QgcnYgPSBhbGxDb2xGb3VuZCA/IGNvbHVtbnMgOiBudWxsO1xuICBpZiAob3B0aW9ucy50aHJvd09uRXJyb3IpIHtcbiAgICBjb25zdCByZXF1aXJlZENvbHVtbnMgPSBPYmplY3Qua2V5cyhlbXB0eUNvbHMpLmZpbHRlcihrID0+ICFlbXB0eUNvbHNba10ub3B0aW9uYWwpO1xuICAgIGNvbnN0IG1pc3NpbmdDb2x1bW5zID0gcmVxdWlyZWRDb2x1bW5zLmZpbHRlcihrID0+ICFjb2x1bW5zPy5ba10udmFsdWUpO1xuICAgIGlmIChtaXNzaW5nQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBjb2x1bW5zOiAke21pc3NpbmdDb2x1bW5zLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ0NvbHVtbnMgPSBPYmplY3Qua2V5cyhzYXZlZENvbHMpO1xuICAgIGNvbnN0IGludmFsaWRDb2x1bW5zID0gY29uZmlnQ29sdW1ucy5maWx0ZXIoayA9PiAhY29sdW1ucz8uW2tdPy52YWx1ZSk7XG4gICAgaWYgKGludmFsaWRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXllciBoYXMgaW52YWxpZCBjb2x1bW5zOiAke2ludmFsaWRDb2x1bW5zLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJ2O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGxheWVyIGNvbHVtblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDb2x1bW4oXG4gIGNvbHVtbjogTGF5ZXJDb2x1bW4gJiB7dmFsaWRhdG9yPzogdHlwZW9mIHZhbGlkYXRlQ29sdW1ufSxcbiAgY29sdW1uczogTGF5ZXJDb2x1bW5zLFxuICBhbGxGaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXVxuKTogYm9vbGVhbiB7XG4gIGlmIChjb2x1bW4ub3B0aW9uYWwgfHwgY29sdW1uLnZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGNvbHVtbi52YWxpZGF0b3IpIHtcbiAgICByZXR1cm4gY29sdW1uLnZhbGlkYXRvcihjb2x1bW4sIGNvbHVtbnMsIGFsbEZpZWxkcyk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIHRleHQgbGFiZWwgY29uZmlnIHdpdGggbmV3IGRhdGFcbiAqIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVGV4dExhYmVsU2NoZW1hVjFcbiAqXG4gKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGZpZWxkc1xuICogQHBhcmFtIHtPYmplY3R9IHNhdmVkVGV4dExhYmVsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7T2JqZWN0fSAtIHZhbGlkYXRlZCB0ZXh0bGFiZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2F2ZWRUZXh0TGFiZWwoXG4gIGZpZWxkcyxcbiAgW2xheWVyVGV4dExhYmVsXSxcbiAgc2F2ZWRUZXh0TGFiZWwsXG4gIG9wdGlvbnM6IHt0aHJvd09uRXJyb3I/OiBib29sZWFufSA9IHt9XG4pIHtcbiAgY29uc3Qgc2F2ZWRUZXh0TGFiZWxzID0gQXJyYXkuaXNBcnJheShzYXZlZFRleHRMYWJlbCkgPyBzYXZlZFRleHRMYWJlbCA6IFtzYXZlZFRleHRMYWJlbF07XG5cbiAgLy8gdmFsaWRhdGUgZmllbGRcbiAgcmV0dXJuIHNhdmVkVGV4dExhYmVscy5tYXAodGV4dExhYmVsID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRleHRMYWJlbC5maWVsZFxuICAgICAgPyBmaWVsZHMuZmluZChmZCA9PlxuICAgICAgICAgIE9iamVjdC5rZXlzKHRleHRMYWJlbC5maWVsZCkuZXZlcnkoa2V5ID0+IHRleHRMYWJlbC5maWVsZFtrZXldID09PSBmZFtrZXldKVxuICAgICAgICApXG4gICAgICA6IG51bGw7XG5cbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnRocm93T25FcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXllciBoYXMgaW52YWxpZCB0ZXh0IGxhYmVsIGZpZWxkOiAke0pTT04uc3RyaW5naWZ5KHRleHRMYWJlbC5maWVsZCl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxheWVyVGV4dExhYmVsKS5yZWR1Y2UoXG4gICAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XToga2V5ID09PSAnZmllbGQnID8gZmllbGQgOiB0ZXh0TGFiZWxba2V5XSB8fCBsYXllclRleHRMYWJlbFtrZXldXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgdmlzdWFsIGNoYW5uZWxzIGNvbmZpZyB3aXRoIG5ldyBkYXRhLFxuICogcmVmZXIgdG8gdmlzLXN0YXRlLXNjaGVtYS5qcyBWaXN1YWxDaGFubmVsU2NoZW1hVjFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2F2ZWRWaXN1YWxDaGFubmVscyhcbiAgZmllbGRzOiBLZXBsZXJUYWJsZVsnZmllbGRzJ10sXG4gIG5ld0xheWVyOiBMYXllcixcbiAgc2F2ZWRMYXllcjogUGFyc2VkTGF5ZXIsXG4gIG9wdGlvbnM6IHt0aHJvd09uRXJyb3I/OiBib29sZWFufSA9IHt9XG4pOiBudWxsIHwgTGF5ZXIge1xuICAoT2JqZWN0LnZhbHVlcyhuZXdMYXllci52aXN1YWxDaGFubmVscykgYXMgVmlzdWFsQ2hhbm5lbFtdKS5mb3JFYWNoKCh7ZmllbGQsIHNjYWxlLCBrZXl9KSA9PiB7XG4gICAgbGV0IGZvdW5kRmllbGQ7XG4gICAgaWYgKHNhdmVkTGF5ZXIuY29uZmlnKSB7XG4gICAgICBpZiAoc2F2ZWRMYXllci5jb25maWdbZmllbGRdKSB7XG4gICAgICAgIGZvdW5kRmllbGQgPSBmaWVsZHMuZmluZChcbiAgICAgICAgICBmZCA9PiBzYXZlZExheWVyLmNvbmZpZyAmJiBmZC5uYW1lID09PSBzYXZlZExheWVyLmNvbmZpZ1tmaWVsZF0ubmFtZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3VuZENoYW5uZWwgPSB7XG4gICAgICAgIC4uLihmb3VuZEZpZWxkID8ge1tmaWVsZF06IGZvdW5kRmllbGR9IDoge30pLFxuICAgICAgICAuLi4oc2F2ZWRMYXllci5jb25maWdbc2NhbGVdID8ge1tzY2FsZV06IHNhdmVkTGF5ZXIuY29uZmlnW3NjYWxlXX0gOiB7fSlcbiAgICAgIH07XG4gICAgICBpZiAoT2JqZWN0LmtleXMoZm91bmRDaGFubmVsKS5sZW5ndGgpIHtcbiAgICAgICAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoZm91bmRDaGFubmVsKTtcbiAgICAgIH1cblxuICAgICAgbmV3TGF5ZXIudmFsaWRhdGVWaXN1YWxDaGFubmVsKGtleSk7XG4gICAgICBpZiAob3B0aW9ucy50aHJvd09uRXJyb3IpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gc2F2ZWRMYXllci5jb25maWc/LltmaWVsZF0/Lm5hbWU7XG4gICAgICAgIGlmIChmaWVsZE5hbWUgJiYgZmllbGROYW1lICE9PSBuZXdMYXllci5jb25maWdbZmllbGRdPy5uYW1lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXllciBoYXMgaW52YWxpZCB2aXN1YWwgY2hhbm5lbCBmaWVsZDogJHtmaWVsZH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBuZXdMYXllcjtcbn1cblxudHlwZSBWYWxpZGF0ZUxheWVyT3B0aW9uID0ge1xuICBhbGxvd0VtcHR5Q29sdW1uPzogYm9vbGVhbjtcbiAgdGhyb3dPbkVycm9yPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyxcbiAgbGF5ZXJDbGFzc2VzOiBWaXNTdGF0ZVsnbGF5ZXJDbGFzc2VzJ10sXG4gIGxheWVyczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXSxcbiAgb3B0aW9ucz86IFZhbGlkYXRlTGF5ZXJPcHRpb25cbikge1xuICBjb25zdCB2YWxpZGF0ZWQ6IExheWVyW10gPSBbXTtcbiAgY29uc3QgZmFpbGVkOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydsYXllcnMnXSA9IFtdO1xuXG4gIGxheWVycy5mb3JFYWNoKGxheWVyID0+IHtcbiAgICBsZXQgdmFsaWRhdGVMYXllcjogTGF5ZXIgfCBudWxsID0gbnVsbDtcblxuICAgIGlmIChsYXllcj8uY29uZmlnPy5kYXRhSWQpIHtcbiAgICAgIGlmIChkYXRhc2V0c1tsYXllci5jb25maWcuZGF0YUlkXSkge1xuICAgICAgICAvLyBkYXRhc2V0cyBhcmUgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgdmFsaWRhdGVMYXllciA9IHZhbGlkYXRlTGF5ZXJXaXRoRGF0YShcbiAgICAgICAgICBkYXRhc2V0c1tsYXllci5jb25maWcuZGF0YUlkXSxcbiAgICAgICAgICBsYXllcixcbiAgICAgICAgICBsYXllckNsYXNzZXMsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZUxheWVyKSB7XG4gICAgICB2YWxpZGF0ZWQucHVzaCh2YWxpZGF0ZUxheWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZGF0YXNldHMgbm90IHlldCBsb2FkZWRcbiAgICAgIGZhaWxlZC5wdXNoKGxheWVyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7dmFsaWRhdGVkLCBmYWlsZWR9O1xufVxuXG4vKipcbiAqIEdldCByZXF1aXJlZCBjb2x1bW5zIGZvciB2YWxpZGF0aW9uIGJhc2VkIG9uIGNvbHVtbiBtb2RlXG4gKi9cbmZ1bmN0aW9uIF9nZXRDb2x1bW5Db25maWdGb3JWYWxpZGF0aW9uKG5ld0xheWVyKSB7XG4gIC8vIGZpbmQgY29sdW1uIGZpZWxkSWR4XG4gIGxldCBjb2x1bW5Db25maWcgPSBuZXdMYXllci5nZXRMYXllckNvbHVtbnMoKTtcbiAgLy8gaWYgY29sdW1uTW9kZSBpcyBkZWZpbmVkLCBmaW5kIGNvbHVtbiBtb2RlIGNvbmZpZ1xuICBjb25zdCBjb2xNb2RlQ29uZmlnID0gbmV3TGF5ZXIuY29uZmlnLmNvbHVtbk1vZGVcbiAgICA/IChuZXdMYXllci5zdXBwb3J0ZWRDb2x1bW5Nb2RlcyB8fCBbXSkuZmluZChcbiAgICAgICAgY29sTW9kZSA9PiBjb2xNb2RlLmtleSA9PT0gbmV3TGF5ZXIuY29uZmlnLmNvbHVtbk1vZGVcbiAgICAgIClcbiAgICA6IG51bGw7XG5cbiAgaWYgKGNvbE1vZGVDb25maWcpIHtcbiAgICAvLyBvbmx5IHZhbGlkYXRlIGNvbHVtbnMgaW4gY29sdW1uIG1vZGVcbiAgICBjb2x1bW5Db25maWcgPSBbXG4gICAgICAuLi4oY29sTW9kZUNvbmZpZy5yZXF1aXJlZENvbHVtbnMgfHwgW10pLFxuICAgICAgLi4uKGNvbE1vZGVDb25maWcub3B0aW9uYWxDb2x1bW5zIHx8IFtdKVxuICAgIF0ucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGNvbHVtbkNvbmZpZ1trZXldXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBjb2x1bW5Db25maWc7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTGF5ZXJXaXRoRGF0YShcbiAgZGF0YXNldDogS2VwbGVyVGFibGUsXG4gIHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLFxuICBsYXllckNsYXNzZXM6IFZpc1N0YXRlWydsYXllckNsYXNzZXMnXSxcbiAgb3B0aW9uczogVmFsaWRhdGVMYXllck9wdGlvbiA9IHt9XG4pOiBMYXllciB8IG51bGwge1xuICBjb25zdCB7ZmllbGRzLCBpZDogZGF0YUlkfSA9IGRhdGFzZXQ7XG4gIGNvbnN0IHt0eXBlfSA9IHNhdmVkTGF5ZXI7XG4gIGNvbnN0IHt0aHJvd09uRXJyb3J9ID0gb3B0aW9ucztcbiAgLy8gbGF5ZXIgZG9lc250IGhhdmUgYSB2YWxpZCB0eXBlXG4gIGlmICghdHlwZSB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGxheWVyQ2xhc3NlcywgdHlwZSkgfHwgIXNhdmVkTGF5ZXIuY29uZmlnKSB7XG4gICAgaWYgKHRocm93T25FcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXllciBoYXMgaW52YWxpZCB0eXBlIFwiJHt0eXBlfVwiIG9yIGNvbmZpZyBpcyBtaXNzaW5nYCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IG5ld0xheWVyID0gbmV3IGxheWVyQ2xhc3Nlc1t0eXBlXSh7XG4gICAgaWQ6IHNhdmVkTGF5ZXIuaWQsXG4gICAgZGF0YUlkLFxuICAgIGxhYmVsOiBzYXZlZExheWVyLmNvbmZpZy5sYWJlbCxcbiAgICBjb2xvcjogc2F2ZWRMYXllci5jb25maWcuY29sb3IsXG4gICAgaXNWaXNpYmxlOiBzYXZlZExheWVyLmNvbmZpZy5pc1Zpc2libGUsXG4gICAgaGlkZGVuOiBzYXZlZExheWVyLmNvbmZpZy5oaWRkZW4sXG4gICAgY29sdW1uTW9kZTogc2F2ZWRMYXllci5jb25maWcuY29sdW1uTW9kZSxcbiAgICBoaWdobGlnaHRDb2xvcjogc2F2ZWRMYXllci5jb25maWcuaGlnaGxpZ2h0Q29sb3JcbiAgfSk7XG5cbiAgY29uc3QgY29sdW1uQ29uZmlnID0gX2dldENvbHVtbkNvbmZpZ0ZvclZhbGlkYXRpb24obmV3TGF5ZXIpO1xuXG4gIGlmIChPYmplY3Qua2V5cyhjb2x1bW5Db25maWcpKSB7XG4gICAgY29uc3QgY29sdW1ucyA9IHZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMoXG4gICAgICBmaWVsZHMsXG4gICAgICBzYXZlZExheWVyLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgY29sdW1uQ29uZmlnLFxuICAgICAgb3B0aW9uc1xuICAgICk7XG4gICAgaWYgKGNvbHVtbnMpIHtcbiAgICAgIG5ld0xheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgY29sdW1uczoge1xuICAgICAgICAgIC4uLm5ld0xheWVyLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgICAgIC4uLmNvbHVtbnNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghb3B0aW9ucy5hbGxvd0VtcHR5Q29sdW1uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0ZXh0TGFiZWwgPVxuICAgIHNhdmVkTGF5ZXIuY29uZmlnLnRleHRMYWJlbCAmJiBuZXdMYXllci5jb25maWcudGV4dExhYmVsXG4gICAgICA/IHZhbGlkYXRlU2F2ZWRUZXh0TGFiZWwoXG4gICAgICAgICAgZmllbGRzLFxuICAgICAgICAgIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWwsXG4gICAgICAgICAgc2F2ZWRMYXllci5jb25maWcudGV4dExhYmVsLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKVxuICAgICAgOiBuZXdMYXllci5jb25maWcudGV4dExhYmVsO1xuXG4gIC8vIGNvcHkgdmlzQ29uZmlnIG92ZXIgdG8gZW1wdHlMYXllciB0byBtYWtlIHN1cmUgaXQgaGFzIGFsbCB0aGUgcHJvcHNcbiAgY29uc3QgY29waWVkVmlzQ29uZmlnID0gbmV3TGF5ZXIuY29weUxheWVyQ29uZmlnKFxuICAgIG5ld0xheWVyLmNvbmZpZy52aXNDb25maWcsXG4gICAgc2F2ZWRMYXllci5jb25maWcudmlzQ29uZmlnIHx8IHt9LFxuICAgIHtcbiAgICAgIHNoYWxsb3dDb3B5OiBbJ2NvbG9yUmFuZ2UnLCAnc3Ryb2tlQ29sb3JSYW5nZSddXG4gICAgfVxuICApO1xuXG4gIC8vIGNhbGwgbGF5ZXIgbWV0aG9kcyB0byB2YWxpZGF0ZSB2aXNDb25maWcgd2hlbiBzd2l0Y2hpbmcgZGF0YXNldFxuICBjb25zdCB2aXNDb25maWcgPSBuZXdMYXllci52YWxpZGF0ZVZpc0NvbmZpZ1xuICAgID8gbmV3TGF5ZXIudmFsaWRhdGVWaXNDb25maWcoZGF0YXNldCwgY29waWVkVmlzQ29uZmlnKVxuICAgIDogY29waWVkVmlzQ29uZmlnO1xuXG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICB2aXNDb25maWcsXG4gICAgdGV4dExhYmVsXG4gIH0pO1xuXG4gIC8vIHZpc3VhbCBjaGFubmVsIGZpZWxkIGlzIHNhdmVkIHRvIGJlIHtuYW1lLCB0eXBlfVxuICAvLyBmaW5kIHZpc3VhbCBjaGFubmVsIGZpZWxkIGJ5IG1hdGNoaW5nIGJvdGggbmFtZSBhbmQgdHlwZVxuICAvLyByZWZlciB0byB2aXMtc3RhdGUtc2NoZW1hLmpzIFZpc3VhbENoYW5uZWxTY2hlbWFWMVxuICBuZXdMYXllciA9IHZhbGlkYXRlU2F2ZWRWaXN1YWxDaGFubmVscyhmaWVsZHMsIG5ld0xheWVyLCBzYXZlZExheWVyLCBvcHRpb25zKTtcblxuICBpZiAodGhyb3dPbkVycm9yKSB7XG4gICAgaWYgKCFuZXdMYXllci5pc1ZhbGlkVG9TYXZlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaXMgbm90IHZhbGlkIHRvIHNhdmU6ICR7bmV3TGF5ZXIuaWR9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VFZGl0b3I8UyBleHRlbmRzIFZpc1N0YXRlPihzdGF0ZTogUywgc2F2ZWRFZGl0b3I6IFNhdmVkRWRpdG9yKSB7XG4gIGlmICghc2F2ZWRFZGl0b3IpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIGZlYXR1cmVzOiBbLi4uc3RhdGUuZWRpdG9yLmZlYXR1cmVzLCAuLi4oc2F2ZWRFZGl0b3IuZmVhdHVyZXMgfHwgW10pXSxcbiAgICAgIC8vIGlmIHNhdmVkRWRpdG9yLnZpc2libGUgaXMgdW5kZWZpbmVkIGtlZXAgc3RhdGUuZWRpdG9yLnZpc2libGVcbiAgICAgIHZpc2libGU6IHNhdmVkRWRpdG9yLnZpc2libGUgPz8gc3RhdGUuZWRpdG9yLnZpc2libGVcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEYXRhc2V0c0J5T3JkZXIoc3RhdGU6IFZpc1N0YXRlLCBuZXdEYXRhRW50cmllczogRGF0YXNldHMpOiBEYXRhc2V0cyB7XG4gIGNvbnN0IG1lcmdlZCA9IHtcbiAgICAuLi5zdGF0ZS5kYXRhc2V0cyxcbiAgICAuLi5uZXdEYXRhRW50cmllc1xuICB9O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXRlLnByZXNlcnZlRGF0YXNldE9yZGVyKSkge1xuICAgIC8vIHByZXNlcnZlRGF0YXNldE9yZGVyICBtaWdodCBub3QgaW5jbHVkZSB0aGUgIG5ldyBkYXRhc2V0c1xuICAgIGNvbnN0IG5ld0RhdGFzZXRJZHMgPSBPYmplY3Qua2V5cyhtZXJnZWQpLmZpbHRlcihcbiAgICAgIGlkID0+ICFzdGF0ZS5wcmVzZXJ2ZURhdGFzZXRPcmRlcj8uaW5jbHVkZXMoaWQpXG4gICAgKTtcbiAgICByZXR1cm4gWy4uLnN0YXRlLnByZXNlcnZlRGF0YXNldE9yZGVyLCAuLi5uZXdEYXRhc2V0SWRzXS5yZWR1Y2UoXG4gICAgICAoYWNjdSwgZGF0YUlkKSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICAuLi4obWVyZ2VkW2RhdGFJZF0gPyB7W2RhdGFJZF06IG1lcmdlZFtkYXRhSWRdfSA6IHt9KVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG5leHBvcnQgY29uc3QgVklTX1NUQVRFX01FUkdFUlM6IFZpc1N0YXRlTWVyZ2Vyczxhbnk+ID0gW1xuICB7XG4gICAgbWVyZ2U6IG1lcmdlTGF5ZXJzLFxuICAgIHByb3A6ICdsYXllcnMnLFxuICAgIHRvTWVyZ2VQcm9wOiAnbGF5ZXJUb0JlTWVyZ2VkJyxcbiAgICBwcmVzZXJ2ZU9yZGVyOiAncHJlc2VydmVMYXllck9yZGVyJ1xuICB9LFxuICB7XG4gICAgbWVyZ2U6IG1lcmdlRmlsdGVycyxcbiAgICBwcm9wOiAnZmlsdGVycycsXG4gICAgdG9NZXJnZVByb3A6ICdmaWx0ZXJUb0JlTWVyZ2VkJyxcbiAgICBwcmVzZXJ2ZU9yZGVyOiAncHJlc2VydmVGaWx0ZXJPcmRlcicsXG4gICAgcmVwbGFjZVBhcmVudERhdGFzZXRJZHM6IHJlcGxhY2VGaWx0ZXJEYXRhc2V0SWRzXG4gIH0sXG4gIHtcbiAgICBtZXJnZTogbWVyZ2VFZmZlY3RzLFxuICAgIHByb3A6ICdlZmZlY3RzJ1xuICB9LFxuICB7XG4gICAgbWVyZ2U6IG1lcmdlSW50ZXJhY3Rpb25zLFxuICAgIHByb3A6ICdpbnRlcmFjdGlvbkNvbmZpZycsXG4gICAgdG9NZXJnZVByb3A6ICdpbnRlcmFjdGlvblRvQmVNZXJnZWQnLFxuICAgIHJlcGxhY2VQYXJlbnREYXRhc2V0SWRzOiByZXBsYWNlSW50ZXJhY3Rpb25EYXRhc2V0SWRzLFxuICAgIHNhdmVVbm1lcmdlZDogc2F2ZWRVbm1lcmdlZEludGVyYWN0aW9uXG4gIH0sXG4gIHttZXJnZTogbWVyZ2VMYXllckJsZW5kaW5nLCBwcm9wOiAnbGF5ZXJCbGVuZGluZyd9LFxuICB7bWVyZ2U6IG1lcmdlT3ZlcmxheUJsZW5kaW5nLCBwcm9wOiAnb3ZlcmxheUJsZW5kaW5nJ30sXG4gIHttZXJnZTogbWVyZ2VTcGxpdE1hcHMsIHByb3A6ICdzcGxpdE1hcHMnLCB0b01lcmdlUHJvcDogJ3NwbGl0TWFwc1RvQmVNZXJnZWQnfSxcbiAge21lcmdlOiBtZXJnZUFuaW1hdGlvbkNvbmZpZywgcHJvcDogJ2FuaW1hdGlvbkNvbmZpZyd9LFxuICB7bWVyZ2U6IG1lcmdlRWRpdG9yLCBwcm9wOiAnZWRpdG9yJ31cbl07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFVBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQU9BLElBQUFLLFNBQUEsR0FBQUwsT0FBQTtBQUdBLElBQUFNLFFBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFVBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLFFBQUEsR0FBQVIsT0FBQTtBQWVBLElBQUFTLE1BQUEsR0FBQVQsT0FBQTtBQUE4RixJQUFBVSxTQUFBO0FBQUEsU0FBQUMsMkJBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLHlCQUFBQyxNQUFBLElBQUFILENBQUEsQ0FBQUcsTUFBQSxDQUFBQyxRQUFBLEtBQUFKLENBQUEscUJBQUFFLENBQUEsUUFBQUcsS0FBQSxDQUFBQyxPQUFBLENBQUFOLENBQUEsTUFBQUUsQ0FBQSxHQUFB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
|