@kepler.gl/reducers 3.3.0-alpha.5 → 3.3.0-alpha.7

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 (74) 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} +1 -1
  8. package/dist/cjs/interaction-utils.js +105 -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 +934 -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/{vis-state-updaters.js → cjs/vis-state-updaters.js} +338 -47
  24. package/dist/cjs/vis-state.js +35 -0
  25. package/dist/combined-updaters.d.ts +1 -1
  26. package/dist/esm/combined-updaters.js +484 -0
  27. package/dist/esm/composer-helpers.js +85 -0
  28. package/dist/esm/composers.js +14 -0
  29. package/dist/esm/core.js +101 -0
  30. package/dist/esm/data-utils.js +47 -0
  31. package/dist/esm/export-utils.js +86 -0
  32. package/dist/esm/index.js +62 -0
  33. package/dist/esm/interaction-utils.js +96 -0
  34. package/dist/esm/layer-utils.js +602 -0
  35. package/dist/esm/map-state-updaters.js +650 -0
  36. package/dist/esm/map-state.js +29 -0
  37. package/dist/esm/map-style-updaters.js +652 -0
  38. package/dist/esm/map-style.js +27 -0
  39. package/dist/esm/merger-handler.js +96 -0
  40. package/dist/esm/middleware.js +19 -0
  41. package/dist/esm/provider-state-updaters.js +458 -0
  42. package/dist/esm/provider-state.js +28 -0
  43. package/dist/esm/root.js +201 -0
  44. package/dist/esm/ui-state-updaters.js +929 -0
  45. package/dist/esm/ui-state.js +30 -0
  46. package/dist/esm/vis-state-merger.js +1161 -0
  47. package/dist/esm/vis-state-selectors.js +24 -0
  48. package/dist/esm/vis-state-updaters.js +4320 -0
  49. package/dist/esm/vis-state.js +29 -0
  50. package/dist/ui-state-updaters.d.ts +15 -1
  51. package/dist/vis-state-updaters.d.ts +27 -0
  52. package/package.json +31 -22
  53. package/dist/combined-updaters.js +0 -491
  54. package/dist/composer-helpers.js +0 -101
  55. package/dist/composers.js +0 -22
  56. package/dist/core.js +0 -105
  57. package/dist/data-utils.js +0 -53
  58. package/dist/export-utils.js +0 -91
  59. package/dist/interaction-utils.js +0 -105
  60. package/dist/layer-utils.js +0 -635
  61. package/dist/map-state-updaters.js +0 -649
  62. package/dist/map-state.js +0 -35
  63. package/dist/map-style-updaters.js +0 -660
  64. package/dist/map-style.js +0 -33
  65. package/dist/merger-handler.js +0 -105
  66. package/dist/middleware.js +0 -27
  67. package/dist/provider-state-updaters.js +0 -465
  68. package/dist/provider-state.js +0 -34
  69. package/dist/root.js +0 -207
  70. package/dist/ui-state-updaters.js +0 -905
  71. package/dist/ui-state.js +0 -36
  72. package/dist/vis-state-merger.js +0 -1193
  73. package/dist/vis-state-selectors.js +0 -30
  74. package/dist/vis-state.js +0 -35
@@ -0,0 +1,602 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
4
+ 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; } } }; }
5
+ 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; } }
6
+ 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; }
7
+ 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; }
8
+ 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) { _defineProperty(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; }
9
+ // SPDX-License-Identifier: MIT
10
+ // Copyright contributors to the kepler.gl project
11
+
12
+ import Console from 'global/console';
13
+ import { GEOCODER_LAYER_ID, LIGHT_AND_SHADOW_EFFECT } from '@kepler.gl/constants';
14
+ import { OVERLAY_TYPE_CONST, getEditorLayer } from '@kepler.gl/layers';
15
+ import { isFunction, getMapLayersFromSplitMaps, DataRow, isPlainObject } from '@kepler.gl/utils';
16
+ import { arrayMove, generateHashId } from '@kepler.gl/common-utils';
17
+ import { ThreeDBuildingLayer } from '@kepler.gl/deckgl-layers';
18
+ /**
19
+ * Find default layers from fields
20
+ */
21
+ export function findDefaultLayer(dataset, layerClasses) {
22
+ if (!dataset) {
23
+ return [];
24
+ }
25
+ var layerProps = Object.keys(layerClasses).reduce(function (previous, lc) {
26
+ var result = typeof layerClasses[lc].findDefaultLayerProps === 'function' ? layerClasses[lc].findDefaultLayerProps(dataset, previous) : {
27
+ props: []
28
+ };
29
+ var props = Array.isArray(result) ? result : result.props || [];
30
+ var foundLayers = result.foundLayers || previous;
31
+ return foundLayers.concat(props.map(function (p) {
32
+ return _objectSpread(_objectSpread({}, p), {}, {
33
+ type: lc,
34
+ dataId: dataset.id
35
+ }, lc === 'arc' || lc === 'line' ? {
36
+ isVisible: false
37
+ } : {});
38
+ }));
39
+ }, []);
40
+
41
+ // go through all layerProps to create layer
42
+ return layerProps.map(function (props) {
43
+ var layer = new layerClasses[props.type](props);
44
+ return typeof layer.setInitialLayerConfig === 'function' && dataset.dataContainer ? layer.setInitialLayerConfig(dataset) : layer;
45
+ });
46
+ }
47
+
48
+ /**
49
+ * Applies `patch` to `config.visConfig` only for layers whose `dataId` is in `datasetIdsToPatch`.
50
+ * Layers for datasets that were already on the map are left unchanged — `addDataToMap`
51
+ * Keys whose patch value is `undefined` are skipped so existing visConfig is not cleared.
52
+ */
53
+ export function mergeLayerVisConfigForNewDatasets(state, patch, datasetIdsToPatch) {
54
+ if (!patch || !Object.keys(patch).length) {
55
+ return state;
56
+ }
57
+ var hasDefinedPatchValue = Object.keys(patch).some(function (key) {
58
+ return patch[key] !== undefined;
59
+ });
60
+ if (!hasDefinedPatchValue) {
61
+ return state;
62
+ }
63
+ var datasetIdSet = new Set(datasetIdsToPatch);
64
+ return _objectSpread(_objectSpread({}, state), {}, {
65
+ layers: state.layers.map(function (layer) {
66
+ if (!layer.config.dataId || !datasetIdSet.has(layer.config.dataId)) {
67
+ return layer;
68
+ }
69
+ var settings = layer.visConfigSettings;
70
+ if (!settings) {
71
+ return layer;
72
+ }
73
+ var allowedKeys = Object.keys(patch).filter(function (key) {
74
+ return Object.prototype.hasOwnProperty.call(settings, key) && patch[key] !== undefined;
75
+ });
76
+ if (!allowedKeys.length) {
77
+ return layer;
78
+ }
79
+ var partial = allowedKeys.reduce(function (acc, key) {
80
+ acc[key] = patch[key];
81
+ return acc;
82
+ }, {});
83
+ return layer.updateLayerVisConfig(partial);
84
+ })
85
+ });
86
+ }
87
+ /**
88
+ * Calculate layer data based on layer type, col Config,
89
+ * return updated layer if colorDomain, dataMap has changed.
90
+ * Also, returns updated layer in case the input layer was in invalid state.
91
+ * Adds an error message to the layer in case of an exception.
92
+ */
93
+ export function calculateLayerData(layer, state, oldLayerData) {
94
+ var layerData;
95
+ try {
96
+ // Make sure the layer updates data after an error
97
+ if (!layer.isValid) {
98
+ layer._oldDataUpdateTriggers = undefined;
99
+ }
100
+ if (!layer.type || !layer.hasAllColumns() || !layer.config.dataId) {
101
+ return {
102
+ layer: layer,
103
+ layerData: {}
104
+ };
105
+ }
106
+ layerData = layer.formatLayerData(state.datasets, oldLayerData);
107
+
108
+ // At this point the data for the layer is updated without errors
109
+ if (!layer.isValid) {
110
+ // Switch to visible after an error
111
+ layer = layer.updateLayerConfig({
112
+ isVisible: true
113
+ });
114
+ }
115
+ layer.isValid = true;
116
+ layer.errorMessage = null;
117
+ } catch (err) {
118
+ Console.error(err);
119
+ layer = layer.updateLayerConfig({
120
+ isVisible: false
121
+ });
122
+ layer.isValid = false;
123
+ layer.errorMessage = err instanceof Error && err.message ? err.message.substring(0, 100) : 'Unknown error';
124
+ layerData = {};
125
+ }
126
+ return {
127
+ layer: layer,
128
+ layerData: layerData
129
+ };
130
+ }
131
+
132
+ /**
133
+ * Calculate props passed to LayerHoverInfo
134
+ */
135
+ export function getLayerHoverProp(_ref) {
136
+ var animationConfig = _ref.animationConfig,
137
+ interactionConfig = _ref.interactionConfig,
138
+ hoverInfo = _ref.hoverInfo,
139
+ layers = _ref.layers,
140
+ layersToRender = _ref.layersToRender,
141
+ datasets = _ref.datasets;
142
+ if (interactionConfig.tooltip.enabled && hoverInfo && hoverInfo.picked) {
143
+ // if anything hovered
144
+ var object = hoverInfo.object,
145
+ overlay = hoverInfo.layer;
146
+
147
+ // deckgl layer to kepler-gl layer
148
+ var layer = layers[overlay.props.idx];
149
+
150
+ // NOTE: for binary format GeojsonLayer, deck will return object=null but hoverInfo.index >= 0
151
+ if ((object || hoverInfo.index >= 0) && layer && layer.getHoverData && layersToRender[layer.id]) {
152
+ // if layer is visible and have hovered data
153
+ var dataId = layer.config.dataId;
154
+ if (!dataId) {
155
+ return null;
156
+ }
157
+ var _datasets$dataId = datasets[dataId],
158
+ dataContainer = _datasets$dataId.dataContainer,
159
+ fields = _datasets$dataId.fields;
160
+ var data = layer.getHoverData(object || hoverInfo.index, dataContainer, fields, animationConfig, hoverInfo);
161
+ if (!data) {
162
+ return null;
163
+ }
164
+ var fieldsToShow = interactionConfig.tooltip.config.fieldsToShow[dataId];
165
+ return {
166
+ data: data,
167
+ fields: fields,
168
+ fieldsToShow: fieldsToShow,
169
+ layer: layer,
170
+ currentTime: animationConfig.currentTime
171
+ };
172
+ }
173
+ }
174
+ return null;
175
+ }
176
+ export function renderDeckGlLayer(props, layerCallbacks) {
177
+ var datasets = props.datasets,
178
+ layer = props.layer,
179
+ layerIndex = props.layerIndex,
180
+ data = props.data,
181
+ hoverInfo = props.hoverInfo,
182
+ clicked = props.clicked,
183
+ mapState = props.mapState,
184
+ interactionConfig = props.interactionConfig,
185
+ animationConfig = props.animationConfig,
186
+ mapLayers = props.mapLayers,
187
+ experimentalContext = props.experimentalContext;
188
+ var dataset = datasets[layer.config.dataId];
189
+ var _ref2 = dataset || {},
190
+ gpuFilter = _ref2.gpuFilter;
191
+ var objectHovered = clicked || hoverInfo;
192
+ var visible = !mapLayers || mapLayers && mapLayers[layer.id];
193
+ // Layer is Layer class
194
+ return layer.renderLayer({
195
+ data: data,
196
+ gpuFilter: gpuFilter,
197
+ idx: layerIndex,
198
+ interactionConfig: interactionConfig,
199
+ layerCallbacks: layerCallbacks,
200
+ mapState: mapState,
201
+ animationConfig: animationConfig,
202
+ objectHovered: objectHovered,
203
+ visible: visible,
204
+ dataset: dataset,
205
+ experimentalContext: experimentalContext
206
+ });
207
+ }
208
+ export function isLayerRenderable(layer, layerData) {
209
+ return layer.id !== GEOCODER_LAYER_ID && layer.shouldRenderLayer(layerData);
210
+ }
211
+ export function isLayerVisible(layer, mapLayers) {
212
+ return layer.config.isVisible && (
213
+ // if layer.id is not in mapLayers, don't render it
214
+ !mapLayers || mapLayers && mapLayers[layer.id]);
215
+ }
216
+
217
+ // Prepare a dict of layers rendered by the deck.gl
218
+ // Note, isVisible: false layer is passed to deck.gl here
219
+ // return {[id]: true \ false}
220
+ export function prepareLayersForDeck(layers, layerData) {
221
+ return layers.reduce(function (accu, layer, idx) {
222
+ return _objectSpread(_objectSpread({}, accu), {}, _defineProperty({}, layer.id, isLayerRenderable(layer, layerData[idx]) && layer.overlayType === OVERLAY_TYPE_CONST.deckgl));
223
+ }, {});
224
+ }
225
+
226
+ // Prepare a dict of rendered layers rendered in the map
227
+ // This includes only the visibile layers for single map view and split map view
228
+ // return {[id]: true \ false}
229
+ export function prepareLayersToRender(layers, layerData, mapLayers) {
230
+ return layers.reduce(function (accu, layer, idx) {
231
+ return _objectSpread(_objectSpread({}, accu), {}, _defineProperty({}, layer.id, isLayerRenderable(layer, layerData[idx]) && isLayerVisible(layer, mapLayers)));
232
+ }, {});
233
+ }
234
+ export function getCustomDeckLayers(deckGlProps) {
235
+ var bottomDeckLayers = Array.isArray(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers : isFunction(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers() : [];
236
+ var topDeckLayers = Array.isArray(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers : isFunction(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers() : [];
237
+ return [bottomDeckLayers, topDeckLayers];
238
+ }
239
+ export function bindLayerCallbacks() {
240
+ var layerCallbacks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
241
+ var idx = arguments.length > 1 ? arguments[1] : undefined;
242
+ return Object.keys(layerCallbacks).reduce(function (accu, key) {
243
+ return _objectSpread(_objectSpread({}, accu), {}, _defineProperty({}, key, function (val) {
244
+ return layerCallbacks[key](idx, val);
245
+ }));
246
+ }, {});
247
+ }
248
+ function computeDeckLayersFromLayerOrder(layerOrder, layers, layerData, currentLayersForDeck, renderProps, layerCallbacks) {
249
+ var datasets = renderProps.datasets,
250
+ hoverInfo = renderProps.hoverInfo,
251
+ clicked = renderProps.clicked,
252
+ mapState = renderProps.mapState,
253
+ interactionConfig = renderProps.interactionConfig,
254
+ animationConfig = renderProps.animationConfig,
255
+ mapLayers = renderProps.mapLayers,
256
+ hasShadowEffect = renderProps.hasShadowEffect;
257
+ return layerOrder.slice().reverse().reduce(function (overlays, element) {
258
+ if (isPlainObject(element)) {
259
+ var layerGroup = element;
260
+ if (!layerGroup.isVisible) {
261
+ return overlays;
262
+ }
263
+ return overlays.concat(computeDeckLayersFromLayerOrder(layerGroup.layerOrder, layers, layerData, currentLayersForDeck, renderProps, layerCallbacks));
264
+ }
265
+ var layerId = element;
266
+ if (!currentLayersForDeck[layerId]) {
267
+ return overlays;
268
+ }
269
+ var layerIndex = layers.findIndex(function (_ref3) {
270
+ var id = _ref3.id;
271
+ return id === layerId;
272
+ });
273
+ if (layerIndex === -1) {
274
+ return overlays;
275
+ }
276
+ var bindedLayerCallbacks = layerCallbacks ? bindLayerCallbacks(layerCallbacks, layerIndex) : {};
277
+ var layer = layers[layerIndex];
278
+ var data = layerData[layerIndex];
279
+ var layerOverlay = renderDeckGlLayer({
280
+ datasets: datasets,
281
+ layer: layer,
282
+ layerIndex: layerIndex,
283
+ data: data,
284
+ hoverInfo: hoverInfo,
285
+ clicked: clicked,
286
+ mapState: mapState,
287
+ interactionConfig: interactionConfig,
288
+ animationConfig: animationConfig,
289
+ mapLayers: mapLayers,
290
+ experimentalContext: {
291
+ hasShadowEffect: hasShadowEffect
292
+ }
293
+ }, bindedLayerCallbacks);
294
+ return overlays.concat(layerOverlay || []);
295
+ }, []);
296
+ }
297
+
298
+ // eslint-disable-next-line complexity
299
+ export function computeDeckLayers(_ref4, options, layerCallbacks, deckGlProps) {
300
+ var visState = _ref4.visState,
301
+ mapState = _ref4.mapState,
302
+ mapStyle = _ref4.mapStyle;
303
+ var datasets = visState.datasets,
304
+ effects = visState.effects,
305
+ layers = visState.layers,
306
+ layerOrder = visState.layerOrder,
307
+ layerData = visState.layerData,
308
+ hoverInfo = visState.hoverInfo,
309
+ clicked = visState.clicked,
310
+ interactionConfig = visState.interactionConfig,
311
+ animationConfig = visState.animationConfig,
312
+ splitMaps = visState.splitMaps;
313
+ var _ref5 = options || {},
314
+ mapIndex = _ref5.mapIndex,
315
+ mapboxApiAccessToken = _ref5.mapboxApiAccessToken,
316
+ mapboxApiUrl = _ref5.mapboxApiUrl,
317
+ primaryMap = _ref5.primaryMap,
318
+ layersForDeck = _ref5.layersForDeck,
319
+ editorInfo = _ref5.editorInfo;
320
+ var dataLayers = [];
321
+ var hasShadowEffect = effects.some(function (effect) {
322
+ return effect.type === LIGHT_AND_SHADOW_EFFECT.type;
323
+ });
324
+ if (layerData && layerData.length) {
325
+ var mapLayers = getMapLayersFromSplitMaps(splitMaps, mapIndex || 0);
326
+ var currentLayersForDeck = layersForDeck || prepareLayersForDeck(layers, layerData);
327
+ dataLayers = layerOrder.slice().reverse().reduce(function (overlays, element) {
328
+ if (isPlainObject(element)) {
329
+ var layerGroup = element;
330
+ if (!layerGroup.isVisible) {
331
+ return overlays;
332
+ }
333
+ return overlays.concat(computeDeckLayersFromLayerOrder(layerGroup.layerOrder, layers, layerData, currentLayersForDeck, {
334
+ datasets: datasets,
335
+ hoverInfo: hoverInfo,
336
+ clicked: clicked,
337
+ mapState: mapState,
338
+ interactionConfig: interactionConfig,
339
+ animationConfig: animationConfig,
340
+ mapLayers: mapLayers,
341
+ hasShadowEffect: hasShadowEffect
342
+ }, layerCallbacks));
343
+ }
344
+ var layerId = element;
345
+ if (!currentLayersForDeck[layerId]) {
346
+ return overlays;
347
+ }
348
+ var layerIndex = layers.findIndex(function (_ref6) {
349
+ var id = _ref6.id;
350
+ return id === layerId;
351
+ });
352
+ if (layerIndex === -1) {
353
+ return overlays;
354
+ }
355
+ var bindedLayerCallbacks = layerCallbacks ? bindLayerCallbacks(layerCallbacks, layerIndex) : {};
356
+ var layer = layers[layerIndex];
357
+ var data = layerData[layerIndex];
358
+ var layerOverlay = renderDeckGlLayer({
359
+ datasets: datasets,
360
+ layer: layer,
361
+ layerIndex: layerIndex,
362
+ data: data,
363
+ hoverInfo: hoverInfo,
364
+ clicked: clicked,
365
+ mapState: mapState,
366
+ interactionConfig: interactionConfig,
367
+ animationConfig: animationConfig,
368
+ mapLayers: mapLayers,
369
+ experimentalContext: {
370
+ hasShadowEffect: hasShadowEffect
371
+ }
372
+ }, bindedLayerCallbacks);
373
+ return overlays.concat(layerOverlay || []);
374
+ }, []);
375
+ }
376
+ if (!primaryMap) {
377
+ return dataLayers;
378
+ }
379
+ if (mapStyle !== null && mapStyle !== void 0 && mapStyle.visibleLayerGroups['3d building'] && primaryMap && mapboxApiAccessToken && mapboxApiUrl) {
380
+ dataLayers.push(new ThreeDBuildingLayer({
381
+ id: '_keplergl_3d-building',
382
+ mapboxApiAccessToken: mapboxApiAccessToken,
383
+ mapboxApiUrl: mapboxApiUrl,
384
+ threeDBuildingColor: mapStyle.threeDBuildingColor,
385
+ updateTriggers: {
386
+ getFillColor: mapStyle.threeDBuildingColor
387
+ }
388
+ }));
389
+ }
390
+ var _getCustomDeckLayers = getCustomDeckLayers(deckGlProps),
391
+ _getCustomDeckLayers2 = _slicedToArray(_getCustomDeckLayers, 2),
392
+ customBottomDeckLayers = _getCustomDeckLayers2[0],
393
+ customTopDeckLayers = _getCustomDeckLayers2[1];
394
+ var editorLayer = [];
395
+ if (editorInfo) {
396
+ editorLayer.push(getEditorLayer(_objectSpread(_objectSpread({}, editorInfo), {}, {
397
+ mapState: mapState
398
+ })));
399
+ }
400
+ return [].concat(_toConsumableArray(customBottomDeckLayers), _toConsumableArray(dataLayers), _toConsumableArray(customTopDeckLayers), editorLayer);
401
+ }
402
+ export function getLayerOrderFromLayers(layers) {
403
+ return layers.map(function (_ref7) {
404
+ var id = _ref7.id;
405
+ return id;
406
+ });
407
+ }
408
+
409
+ // --- Layer Group Utilities ---
410
+
411
+ export function getNewLayerGroup(props) {
412
+ var _props$id, _props$label, _props$isVisible, _props$layerOrder, _props$isIncludedInLe;
413
+ return {
414
+ id: (_props$id = props === null || props === void 0 ? void 0 : props.id) !== null && _props$id !== void 0 ? _props$id : generateHashId(6),
415
+ label: (_props$label = props === null || props === void 0 ? void 0 : props.label) !== null && _props$label !== void 0 ? _props$label : 'New group',
416
+ isVisible: (_props$isVisible = props === null || props === void 0 ? void 0 : props.isVisible) !== null && _props$isVisible !== void 0 ? _props$isVisible : true,
417
+ layerOrder: (_props$layerOrder = props === null || props === void 0 ? void 0 : props.layerOrder) !== null && _props$layerOrder !== void 0 ? _props$layerOrder : [],
418
+ isIncludedInLegend: (_props$isIncludedInLe = props === null || props === void 0 ? void 0 : props.isIncludedInLegend) !== null && _props$isIncludedInLe !== void 0 ? _props$isIncludedInLe : true
419
+ };
420
+ }
421
+ export function addLayerOrGroupToLayerOrder(layerOrder, element, atIndex) {
422
+ var idx = atIndex !== null && atIndex !== void 0 ? atIndex : 0;
423
+ var result = _toConsumableArray(layerOrder);
424
+ result.splice(idx, 0, element);
425
+ return result;
426
+ }
427
+ export function removeElementFromLayerOrder(layerOrder, element) {
428
+ if (!layerOrder) return [];
429
+ var elementId = typeof element === 'string' ? element : element.id;
430
+ var newLayerOrder = layerOrder.filter(function (entry) {
431
+ if (isPlainObject(entry)) {
432
+ return entry.id !== elementId;
433
+ }
434
+ return entry !== elementId;
435
+ });
436
+ newLayerOrder = newLayerOrder.map(function (entry) {
437
+ if (isPlainObject(entry)) {
438
+ var group = entry;
439
+ return _objectSpread(_objectSpread({}, group), {}, {
440
+ layerOrder: removeElementFromLayerOrder(group.layerOrder, elementId)
441
+ });
442
+ }
443
+ return entry;
444
+ });
445
+ return newLayerOrder;
446
+ }
447
+ export function getLayerGroupFromLayerOrder(layerOrder, layerGroupId) {
448
+ var group;
449
+ for (var i = 0; i < layerOrder.length && !group; i++) {
450
+ var entry = layerOrder[i];
451
+ if (isPlainObject(entry)) {
452
+ var grp = entry;
453
+ group = grp.id === layerGroupId ? grp : getLayerGroupFromLayerOrder(grp.layerOrder, layerGroupId);
454
+ }
455
+ }
456
+ return group;
457
+ }
458
+
459
+ /**
460
+ * Find the parent group that contains a given layer ID.
461
+ * Returns undefined if the layer is at the root level.
462
+ */
463
+ export function findParentGroupForLayer(layerOrder, layerId) {
464
+ var _iterator = _createForOfIteratorHelper(layerOrder),
465
+ _step;
466
+ try {
467
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
468
+ var entry = _step.value;
469
+ if (isPlainObject(entry)) {
470
+ var group = entry;
471
+ if (group.layerOrder.some(function (e) {
472
+ return typeof e === 'string' && e === layerId;
473
+ })) {
474
+ return group;
475
+ }
476
+ var nested = findParentGroupForLayer(group.layerOrder, layerId);
477
+ if (nested) return nested;
478
+ }
479
+ }
480
+ } catch (err) {
481
+ _iterator.e(err);
482
+ } finally {
483
+ _iterator.f();
484
+ }
485
+ return undefined;
486
+ }
487
+ export function getIndexFromLayerEntryId(layerOrder, layerEntryId) {
488
+ return layerOrder.findIndex(function (entry) {
489
+ return isPlainObject(entry) ? entry.id === layerEntryId : entry === layerEntryId;
490
+ });
491
+ }
492
+ export function isLayerPresentInLayerOrder(layerOrder, layerId) {
493
+ var found = false;
494
+ for (var i = 0; i < layerOrder.length && !found; i++) {
495
+ var entry = layerOrder[i];
496
+ if (isPlainObject(entry)) {
497
+ found = isLayerPresentInLayerOrder(entry.layerOrder, layerId);
498
+ } else {
499
+ found = layerId === entry;
500
+ }
501
+ }
502
+ return found;
503
+ }
504
+ export function replaceLayerEntryInLayerOrder(layerOrder, oldEntry, newEntry) {
505
+ var oldEntryId = typeof oldEntry === 'string' ? oldEntry : oldEntry.id;
506
+ return layerOrder.map(function (entry) {
507
+ if (typeof entry === 'string') {
508
+ return entry === oldEntryId ? newEntry : entry;
509
+ } else if (isPlainObject(entry)) {
510
+ var grp = entry;
511
+ if (grp.id === oldEntryId) {
512
+ return newEntry;
513
+ }
514
+ return _objectSpread(_objectSpread({}, grp), {}, {
515
+ layerOrder: replaceLayerEntryInLayerOrder(grp.layerOrder, oldEntry, newEntry)
516
+ });
517
+ }
518
+ return entry;
519
+ });
520
+ }
521
+ export function updateLayerGroupInLayerOrder(layerOrder, newLayerGroup) {
522
+ return layerOrder.map(function (entry) {
523
+ if (isPlainObject(entry)) {
524
+ var grp = entry;
525
+ if (grp.id === newLayerGroup.id) {
526
+ return newLayerGroup;
527
+ }
528
+ return _objectSpread(_objectSpread({}, grp), {}, {
529
+ layerOrder: updateLayerGroupInLayerOrder(grp.layerOrder, newLayerGroup)
530
+ });
531
+ }
532
+ return entry;
533
+ });
534
+ }
535
+ export function getFlatLayerOrder(layerOrder) {
536
+ return layerOrder.reduce(function (acc, orderEntry) {
537
+ if (isPlainObject(orderEntry)) {
538
+ return [].concat(_toConsumableArray(acc), _toConsumableArray(getFlatLayerOrder(orderEntry.layerOrder)));
539
+ }
540
+ return [].concat(_toConsumableArray(acc), [orderEntry]);
541
+ }, []);
542
+ }
543
+ export function buildLayerOrderHierarchy(layerOrder, layers) {
544
+ var validLayers = layers === null || layers === void 0 ? void 0 : layers.filter(Boolean);
545
+ return layerOrder.reduce(function (acc, element) {
546
+ if (isPlainObject(element)) {
547
+ return [].concat(_toConsumableArray(acc), [['layerGroup', element]]);
548
+ }
549
+ var layer = validLayers === null || validLayers === void 0 ? void 0 : validLayers.find(function (l) {
550
+ return l.id === element;
551
+ });
552
+ if (!layer || layer.config.hidden) {
553
+ return acc;
554
+ }
555
+ return [].concat(_toConsumableArray(acc), [['layer', layer]]);
556
+ }, []);
557
+ }
558
+ export function removeGhostLayerFromLayerOrder(layerOrder, layers) {
559
+ return layerOrder.reduce(function (acc, entry) {
560
+ if (typeof entry === 'string') {
561
+ if (layers.find(function (l) {
562
+ return l.id === entry;
563
+ })) {
564
+ acc.push(entry);
565
+ }
566
+ } else {
567
+ var grp = entry;
568
+ if (grp.layerOrder) {
569
+ acc.push(_objectSpread(_objectSpread({}, grp), {}, {
570
+ layerOrder: removeGhostLayerFromLayerOrder(grp.layerOrder, layers)
571
+ }));
572
+ }
573
+ }
574
+ return acc;
575
+ }, []);
576
+ }
577
+ export function reorderLayerOrder(layerOrder, originLayerId, destinationLayerId) {
578
+ var activeIndex = getIndexFromLayerEntryId(layerOrder, originLayerId);
579
+ var overIndex = getIndexFromLayerEntryId(layerOrder, destinationLayerId);
580
+ if (activeIndex === -1 || overIndex === -1) {
581
+ return layerOrder;
582
+ }
583
+ return arrayMove(layerOrder, activeIndex, overIndex);
584
+ }
585
+ export function addLayerToLayerOrder(layerOrder, layerId) {
586
+ return [layerId].concat(_toConsumableArray(layerOrder));
587
+ }
588
+ export function getLayerHoverPropValue(data, fieldIndex) {
589
+ if (!data) return undefined;
590
+ if (data instanceof DataRow) return data.valueAt(fieldIndex);
591
+ return data[fieldIndex];
592
+ }
593
+
594
+ /** Checks if any Deck layers are in the process of loading. */
595
+ export function areAnyDeckLayersLoading(layers) {
596
+ return layers.some(
597
+ // layer.isLoaded changes frequently in Deck (even on hover) so we check additional properties
598
+ function (layer) {
599
+ return layer.internalState && !layer.isLoaded;
600
+ });
601
+ }
602
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb25zb2xlIiwiR0VPQ09ERVJfTEFZRVJfSUQiLCJMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVCIsIk9WRVJMQVlfVFlQRV9DT05TVCIsImdldEVkaXRvckxheWVyIiwiaXNGdW5jdGlvbiIsImdldE1hcExheWVyc0Zyb21TcGxpdE1hcHMiLCJEYXRhUm93IiwiaXNQbGFpbk9iamVjdCIsImFycmF5TW92ZSIsImdlbmVyYXRlSGFzaElkIiwiVGhyZWVEQnVpbGRpbmdMYXllciIsImZpbmREZWZhdWx0TGF5ZXIiLCJkYXRhc2V0IiwibGF5ZXJDbGFzc2VzIiwibGF5ZXJQcm9wcyIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJwcmV2aW91cyIsImxjIiwicmVzdWx0IiwiZmluZERlZmF1bHRMYXllclByb3BzIiwicHJvcHMiLCJBcnJheSIsImlzQXJyYXkiLCJmb3VuZExheWVycyIsImNvbmNhdCIsIm1hcCIsInAiLCJfb2JqZWN0U3ByZWFkIiwidHlwZSIsImRhdGFJZCIsImlkIiwiaXNWaXNpYmxlIiwibGF5ZXIiLCJzZXRJbml0aWFsTGF5ZXJDb25maWciLCJkYXRhQ29udGFpbmVyIiwibWVyZ2VMYXllclZpc0NvbmZpZ0Zvck5ld0RhdGFzZXRzIiwic3RhdGUiLCJwYXRjaCIsImRhdGFzZXRJZHNUb1BhdGNoIiwibGVuZ3RoIiwiaGFzRGVmaW5lZFBhdGNoVmFsdWUiLCJzb21lIiwia2V5IiwidW5kZWZpbmVkIiwiZGF0YXNldElkU2V0IiwiU2V0IiwibGF5ZXJzIiwiY29uZmlnIiwiaGFzIiwic2V0dGluZ3MiLCJ2aXNDb25maWdTZXR0aW5ncyIsImFsbG93ZWRLZXlzIiwiZmlsdGVyIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicGFydGlhbCIsImFjYyIsInVwZGF0ZUxheWVyVmlzQ29uZmlnIiwiY2FsY3VsYXRlTGF5ZXJEYXRhIiwib2xkTGF5ZXJEYXRhIiwibGF5ZXJEYXRhIiwiaXNWYWxpZCIsIl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMiLCJoYXNBbGxDb2x1bW5zIiwiZm9ybWF0TGF5ZXJEYXRhIiwiZGF0YXNldHMiLCJ1cGRhdGVMYXllckNvbmZpZyIsImVycm9yTWVzc2FnZSIsImVyciIsImVycm9yIiwiRXJyb3IiLCJtZXNzYWdlIiwic3Vic3RyaW5nIiwiZ2V0TGF5ZXJIb3ZlclByb3AiLCJfcmVmIiwiYW5pbWF0aW9uQ29uZmlnIiwiaW50ZXJhY3Rpb25Db25maWciLCJob3ZlckluZm8iLCJsYXllcnNUb1JlbmRlciIsInRvb2x0aXAiLCJlbmFibGVkIiwicGlja2VkIiwib2JqZWN0Iiwib3ZlcmxheSIsImlkeCIsImluZGV4IiwiZ2V0SG92ZXJEYXRhIiwiX2RhdGFzZXRzJGRhdGFJZCIsImZpZWxkcyIsImRhdGEiLCJmaWVsZHNUb1Nob3ciLCJjdXJyZW50VGltZSIsInJlbmRlckRlY2tHbExheWVyIiwibGF5ZXJDYWxsYmFja3MiLCJsYXllckluZGV4IiwiY2xpY2tlZCIsIm1hcFN0YXRlIiwibWFwTGF5ZXJzIiwiZXhwZXJpbWVudGFsQ29udGV4dCIsIl9yZWYyIiwiZ3B1RmlsdGVyIiwib2JqZWN0SG92ZXJlZCIsInZpc2libGUiLCJyZW5kZXJMYXllciIsImlzTGF5ZXJSZW5kZXJhYmxlIiwic2hvdWxkUmVuZGVyTGF5ZXIiLCJpc0xheWVyVmlzaWJsZSIsInByZXBhcmVMYXllcnNGb3JEZWNrIiwiYWNjdSIsIl9kZWZpbmVQcm9wZXJ0eSIsIm92ZXJsYXlUeXBlIiwiZGVja2dsIiwicHJlcGFyZUxheWVyc1RvUmVuZGVyIiwiZ2V0Q3VzdG9tRGVja0xheWVycyIsImRlY2tHbFByb3BzIiwiYm90dG9tRGVja0xheWVycyIsInRvcERlY2tMYXllcnMiLCJ0b3BMYXllcnMiLCJiaW5kTGF5ZXJDYWxsYmFja3MiLCJhcmd1bWVudHMiLCJ2YWwiLCJjb21wdXRlRGVja0xheWVyc0Zyb21MYXllck9yZGVyIiwibGF5ZXJPcmRlciIsImN1cnJlbnRMYXllcnNGb3JEZWNrIiwicmVuZGVyUHJvcHMiLCJoYXNTaGFkb3dFZmZlY3QiLCJzbGljZSIsInJldmVyc2UiLCJvdmVybGF5cyIsImVsZW1lbnQiLCJsYXllckdyb3VwIiwibGF5ZXJJZCIsImZpbmRJbmRleCIsIl9yZWYzIiwiYmluZGVkTGF5ZXJDYWxsYmFja3MiLCJsYXllck92ZXJsYXkiLCJjb21wdXRlRGVja0xheWVycyIsIl9yZWY0Iiwib3B0aW9ucyIsInZpc1N0YXRlIiwibWFwU3R5bGUiLCJlZmZlY3RzIiwic3BsaXRNYXBzIiwiX3JlZjUiLCJtYXBJbmRleCIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwibWFwYm94QXBpVXJsIiwicHJpbWFyeU1hcCIsImxheWVyc0ZvckRlY2siLCJlZGl0b3JJbmZvIiwiZGF0YUxheWVycyIsImVmZmVjdCIsIl9yZWY2IiwidmlzaWJsZUxheWVyR3JvdXBzIiwicHVzaCIsInRocmVlREJ1aWxkaW5nQ29sb3IiLCJ1cGRhdGVUcmlnZ2VycyIsImdldEZpbGxDb2xvciIsIl9nZXRDdXN0b21EZWNrTGF5ZXJzIiwiX2dldEN1c3RvbURlY2tMYXllcnMyIiwiX3NsaWNlZFRvQXJyYXkiLCJjdXN0b21Cb3R0b21EZWNrTGF5ZXJzIiwiY3VzdG9tVG9wRGVja0xheWVycyIsImVkaXRvckxheWVyIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMiLCJfcmVmNyIsImdldE5ld0xheWVyR3JvdXAiLCJfcHJvcHMkaWQiLCJfcHJvcHMkbGFiZWwiLCJfcHJvcHMkaXNWaXNpYmxlIiwiX3Byb3BzJGxheWVyT3JkZXIiLCJfcHJvcHMkaXNJbmNsdWRlZEluTGUiLCJsYWJlbCIsImlzSW5jbHVkZWRJbkxlZ2VuZCIsImFkZExheWVyT3JHcm91cFRvTGF5ZXJPcmRlciIsImF0SW5kZXgiLCJzcGxpY2UiLCJyZW1vdmVFbGVtZW50RnJvbUxheWVyT3JkZXIiLCJlbGVtZW50SWQiLCJuZXdMYXllck9yZGVyIiwiZW50cnkiLCJncm91cCIsImdldExheWVyR3JvdXBGcm9tTGF5ZXJPcmRlciIsImxheWVyR3JvdXBJZCIsImkiLCJncnAiLCJmaW5kUGFyZW50R3JvdXBGb3JMYXllciIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImUiLCJuZXN0ZWQiLCJmIiwiZ2V0SW5kZXhGcm9tTGF5ZXJFbnRyeUlkIiwibGF5ZXJFbnRyeUlkIiwiaXNMYXllclByZXNlbnRJbkxheWVyT3JkZXIiLCJmb3VuZCIsInJlcGxhY2VMYXllckVudHJ5SW5MYXllck9yZGVyIiwib2xkRW50cnkiLCJuZXdFbnRyeSIsIm9sZEVudHJ5SWQiLCJ1cGRhdGVMYXllckdyb3VwSW5MYXllck9yZGVyIiwibmV3TGF5ZXJHcm91cCIsImdldEZsYXRMYXllck9yZGVyIiwib3JkZXJFbnRyeSIsImJ1aWxkTGF5ZXJPcmRlckhpZXJhcmNoeSIsInZhbGlkTGF5ZXJzIiwiQm9vbGVhbiIsImZpbmQiLCJsIiwiaGlkZGVuIiwicmVtb3ZlR2hvc3RMYXllckZyb21MYXllck9yZGVyIiwicmVvcmRlckxheWVyT3JkZXIiLCJvcmlnaW5MYXllcklkIiwiZGVzdGluYXRpb25MYXllcklkIiwiYWN0aXZlSW5kZXgiLCJvdmVySW5kZXgiLCJhZGRMYXllclRvTGF5ZXJPcmRlciIsImdldExheWVySG92ZXJQcm9wVmFsdWUiLCJmaWVsZEluZGV4IiwidmFsdWVBdCIsImFyZUFueURlY2tMYXllcnNMb2FkaW5nIiwiaW50ZXJuYWxTdGF0ZSIsImlzTG9hZGVkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xheWVyLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBDb25zb2xlIGZyb20gJ2dsb2JhbC9jb25zb2xlJztcblxuaW1wb3J0IHtHRU9DT0RFUl9MQVlFUl9JRCwgTElHSFRfQU5EX1NIQURPV19FRkZFQ1R9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7TGF5ZXIgYXMgRGVja0xheWVyfSBmcm9tICdAZGVjay5nbC9jb3JlJztcbnR5cGUgRGVja0xheWVyUHJvcHMgPSBhbnk7XG5pbXBvcnQge1xuICBGaWVsZCxcbiAgTGF5ZXJWaXNDb25maWcsXG4gIFRvb2x0aXBGaWVsZCxcbiAgQ29tcGFyZVR5cGUsXG4gIFNwbGl0TWFwTGF5ZXJzLFxuICBFZGl0b3IsXG4gIEZlYXR1cmUsXG4gIEZlYXR1cmVTZWxlY3Rpb25Db250ZXh0LFxuICBCaW5kZWRMYXllckNhbGxiYWNrcyxcbiAgTGF5ZXJDYWxsYmFja3MsXG4gIFZpZXdwb3J0LFxuICBMYXllck9yZGVyR3JvdXAsXG4gIExheWVyT3JkZXIsXG4gIExheWVyT3JkZXJFbnRyeSxcbiAgRmxhdExheWVyT3JkZXIsXG4gIExheWVyT3JkZXJIaWVyYXJjaHlcbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1xuICBGaW5kRGVmYXVsdExheWVyUHJvcHNSZXR1cm5WYWx1ZSxcbiAgRmluZERlZmF1bHRMYXllclByb3BzLFxuICBMYXllcixcbiAgTGF5ZXJDbGFzc2VzVHlwZSxcbiAgT1ZFUkxBWV9UWVBFX0NPTlNULFxuICBnZXRFZGl0b3JMYXllclxufSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5cbmltcG9ydCBLZXBsZXJUYWJsZSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7VmlzU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvc2NoZW1hcyc7XG5pbXBvcnQge2lzRnVuY3Rpb24sIGdldE1hcExheWVyc0Zyb21TcGxpdE1hcHMsIERhdGFSb3csIGlzUGxhaW5PYmplY3R9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHthcnJheU1vdmUsIGdlbmVyYXRlSGFzaElkfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5cbmltcG9ydCB7VGhyZWVEQnVpbGRpbmdMYXllcn0gZnJvbSAnQGtlcGxlci5nbC9kZWNrZ2wtbGF5ZXJzJztcblxuZXhwb3J0IHR5cGUgTGF5ZXJzVG9SZW5kZXIgPSB7XG4gIFtsYXllcklkOiBzdHJpbmddOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25MYXllckhvdmVyRGF0YSA9IHtcbiAgcG9pbnRzOiBhbnlbXTtcbiAgY29sb3JWYWx1ZT86IGFueTtcbiAgZWxldmF0aW9uVmFsdWU/OiBhbnk7XG4gIGFnZ3JlZ2F0ZWREYXRhPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICBtZWFzdXJlOiBzdHJpbmc7XG4gICAgICB2YWx1ZT86IGFueTtcbiAgICB9XG4gID47XG59O1xuXG5leHBvcnQgdHlwZSBMYXllckhvdmVyUHJvcCA9IHtcbiAgZGF0YTogRGF0YVJvdyB8IEFnZ3JlZ2F0aW9uTGF5ZXJIb3ZlckRhdGEgfCBhbnlbXSB8IG51bGw7XG4gIGZpZWxkczogRmllbGRbXTtcbiAgZmllbGRzVG9TaG93OiBUb29sdGlwRmllbGRbXTtcbiAgbGF5ZXI6IExheWVyO1xuICBwcmltYXJ5RGF0YT86IERhdGFSb3cgfCBBZ2dyZWdhdGlvbkxheWVySG92ZXJEYXRhIHwgYW55W10gfCBudWxsO1xuICBjb21wYXJlVHlwZT86IENvbXBhcmVUeXBlO1xuICBjdXJyZW50VGltZT86IFZpc1N0YXRlWydhbmltYXRpb25Db25maWcnXVsnY3VycmVudFRpbWUnXTtcbn07XG5cbi8qKlxuICogRmluZCBkZWZhdWx0IGxheWVycyBmcm9tIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZERlZmF1bHRMYXllcihkYXRhc2V0OiBLZXBsZXJUYWJsZSwgbGF5ZXJDbGFzc2VzOiBMYXllckNsYXNzZXNUeXBlKTogTGF5ZXJbXSB7XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGxheWVyUHJvcHMgPSAoT2JqZWN0LmtleXMobGF5ZXJDbGFzc2VzKSBhcyBBcnJheTxrZXlvZiBMYXllckNsYXNzZXNUeXBlPikucmVkdWNlKFxuICAgIChwcmV2aW91cywgbGMpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogRmluZERlZmF1bHRMYXllclByb3BzUmV0dXJuVmFsdWUgPVxuICAgICAgICB0eXBlb2YgbGF5ZXJDbGFzc2VzW2xjXS5maW5kRGVmYXVsdExheWVyUHJvcHMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGxheWVyQ2xhc3Nlc1tsY10uZmluZERlZmF1bHRMYXllclByb3BzKGRhdGFzZXQsIHByZXZpb3VzKVxuICAgICAgICAgIDoge3Byb3BzOiBbXX07XG5cbiAgICAgIGNvbnN0IHByb3BzID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogcmVzdWx0LnByb3BzIHx8IFtdO1xuICAgICAgY29uc3QgZm91bmRMYXllcnMgPSByZXN1bHQuZm91bmRMYXllcnMgfHwgcHJldmlvdXM7XG5cbiAgICAgIHJldHVybiBmb3VuZExheWVycy5jb25jYXQoXG4gICAgICAgIHByb3BzLm1hcChwID0+ICh7XG4gICAgICAgICAgLi4ucCxcbiAgICAgICAgICB0eXBlOiBsYyxcbiAgICAgICAgICBkYXRhSWQ6IGRhdGFzZXQuaWQsXG4gICAgICAgICAgLy8gc2V0IGFyYyBsYXllciBpbml0aWFsIHZpc2libGl0eSB0byBmYWxzZSwgYmVjYXVzZSBhcmNzIHRlbmQgdG8gYmUgdG9vIG11c3lcbiAgICAgICAgICAuLi4obGMgPT09ICdhcmMnIHx8IGxjID09PSAnbGluZScgPyB7aXNWaXNpYmxlOiBmYWxzZX0gOiB7fSlcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgIH0sXG4gICAgW10gYXMgKEZpbmREZWZhdWx0TGF5ZXJQcm9wcyAmIHt0eXBlOiBzdHJpbmd9KVtdXG4gICk7XG5cbiAgLy8gZ28gdGhyb3VnaCBhbGwgbGF5ZXJQcm9wcyB0byBjcmVhdGUgbGF5ZXJcbiAgcmV0dXJuIGxheWVyUHJvcHMubWFwKHByb3BzID0+IHtcbiAgICBjb25zdCBsYXllciA9IG5ldyBsYXllckNsYXNzZXNbcHJvcHMudHlwZV0ocHJvcHMpO1xuICAgIHJldHVybiB0eXBlb2YgbGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnID09PSAnZnVuY3Rpb24nICYmIGRhdGFzZXQuZGF0YUNvbnRhaW5lclxuICAgICAgPyBsYXllci5zZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldClcbiAgICAgIDogbGF5ZXI7XG4gIH0pO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgYHBhdGNoYCB0byBgY29uZmlnLnZpc0NvbmZpZ2Agb25seSBmb3IgbGF5ZXJzIHdob3NlIGBkYXRhSWRgIGlzIGluIGBkYXRhc2V0SWRzVG9QYXRjaGAuXG4gKiBMYXllcnMgZm9yIGRhdGFzZXRzIHRoYXQgd2VyZSBhbHJlYWR5IG9uIHRoZSBtYXAgYXJlIGxlZnQgdW5jaGFuZ2VkIOKAlCBgYWRkRGF0YVRvTWFwYFxuICogS2V5cyB3aG9zZSBwYXRjaCB2YWx1ZSBpcyBgdW5kZWZpbmVkYCBhcmUgc2tpcHBlZCBzbyBleGlzdGluZyB2aXNDb25maWcgaXMgbm90IGNsZWFyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxheWVyVmlzQ29uZmlnRm9yTmV3RGF0YXNldHMoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgcGF0Y2g6IFBhcnRpYWw8TGF5ZXJWaXNDb25maWc+IHwgdW5kZWZpbmVkLFxuICBkYXRhc2V0SWRzVG9QYXRjaDogc3RyaW5nW11cbik6IFZpc1N0YXRlIHtcbiAgaWYgKCFwYXRjaCB8fCAhT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGhhc0RlZmluZWRQYXRjaFZhbHVlID0gKE9iamVjdC5rZXlzKHBhdGNoKSBhcyBBcnJheTxrZXlvZiBMYXllclZpc0NvbmZpZz4pLnNvbWUoXG4gICAga2V5ID0+IHBhdGNoW2tleV0gIT09IHVuZGVmaW5lZFxuICApO1xuICBpZiAoIWhhc0RlZmluZWRQYXRjaFZhbHVlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgZGF0YXNldElkU2V0ID0gbmV3IFNldChkYXRhc2V0SWRzVG9QYXRjaCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IHN0YXRlLmxheWVycy5tYXAobGF5ZXIgPT4ge1xuICAgICAgaWYgKCFsYXllci5jb25maWcuZGF0YUlkIHx8ICFkYXRhc2V0SWRTZXQuaGFzKGxheWVyLmNvbmZpZy5kYXRhSWQpKSB7XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNldHRpbmdzID0gbGF5ZXIudmlzQ29uZmlnU2V0dGluZ3M7XG4gICAgICBpZiAoIXNldHRpbmdzKSB7XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFsbG93ZWRLZXlzID0gKE9iamVjdC5rZXlzKHBhdGNoKSBhcyBBcnJheTxrZXlvZiBMYXllclZpc0NvbmZpZz4pLmZpbHRlcihcbiAgICAgICAga2V5ID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywga2V5KSAmJiBwYXRjaFtrZXldICE9PSB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBpZiAoIWFsbG93ZWRLZXlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbGF5ZXI7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJ0aWFsID0gYWxsb3dlZEtleXMucmVkdWNlPFBhcnRpYWw8TGF5ZXJWaXNDb25maWc+PigoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgYWNjW2tleV0gPSBwYXRjaFtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pO1xuICAgICAgcmV0dXJuIGxheWVyLnVwZGF0ZUxheWVyVmlzQ29uZmlnKHBhcnRpYWwpO1xuICAgIH0pXG4gIH07XG59XG5cbnR5cGUgTWluVmlzU3RhdGVGb3JMYXllckRhdGEgPSB7XG4gIGRhdGFzZXRzOiBWaXNTdGF0ZVsnZGF0YXNldHMnXTtcbiAgYW5pbWF0aW9uQ29uZmlnOiBWaXNTdGF0ZVsnYW5pbWF0aW9uQ29uZmlnJ107XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBsYXllciBkYXRhIGJhc2VkIG9uIGxheWVyIHR5cGUsIGNvbCBDb25maWcsXG4gKiByZXR1cm4gdXBkYXRlZCBsYXllciBpZiBjb2xvckRvbWFpbiwgZGF0YU1hcCBoYXMgY2hhbmdlZC5cbiAqIEFsc28sIHJldHVybnMgdXBkYXRlZCBsYXllciBpbiBjYXNlIHRoZSBpbnB1dCBsYXllciB3YXMgaW4gaW52YWxpZCBzdGF0ZS5cbiAqIEFkZHMgYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgbGF5ZXIgaW4gY2FzZSBvZiBhbiBleGNlcHRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVMYXllckRhdGE8UyBleHRlbmRzIE1pblZpc1N0YXRlRm9yTGF5ZXJEYXRhPihcbiAgbGF5ZXI6IExheWVyLFxuICBzdGF0ZTogUyxcbiAgb2xkTGF5ZXJEYXRhPzogYW55XG4pOiB7XG4gIGxheWVyRGF0YTogYW55O1xuICBsYXllcjogTGF5ZXI7XG59IHtcbiAgbGV0IGxheWVyRGF0YTtcbiAgdHJ5IHtcbiAgICAvLyBNYWtlIHN1cmUgdGhlIGxheWVyIHVwZGF0ZXMgZGF0YSBhZnRlciBhbiBlcnJvclxuICAgIGlmICghbGF5ZXIuaXNWYWxpZCkge1xuICAgICAgbGF5ZXIuX29sZERhdGFVcGRhdGVUcmlnZ2VycyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoIWxheWVyLnR5cGUgfHwgIWxheWVyLmhhc0FsbENvbHVtbnMoKSB8fCAhbGF5ZXIuY29uZmlnLmRhdGFJZCkge1xuICAgICAgcmV0dXJuIHtsYXllciwgbGF5ZXJEYXRhOiB7fX07XG4gICAgfVxuXG4gICAgbGF5ZXJEYXRhID0gbGF5ZXIuZm9ybWF0TGF5ZXJEYXRhKHN0YXRlLmRhdGFzZXRzLCBvbGRMYXllckRhdGEpO1xuXG4gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgZGF0YSBmb3IgdGhlIGxheWVyIGlzIHVwZGF0ZWQgd2l0aG91dCBlcnJvcnNcbiAgICBpZiAoIWxheWVyLmlzVmFsaWQpIHtcbiAgICAgIC8vIFN3aXRjaCB0byB2aXNpYmxlIGFmdGVyIGFuIGVycm9yXG4gICAgICBsYXllciA9IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgaXNWaXNpYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgbGF5ZXIuaXNWYWxpZCA9IHRydWU7XG4gICAgbGF5ZXIuZXJyb3JNZXNzYWdlID0gbnVsbDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgQ29uc29sZS5lcnJvcihlcnIpO1xuICAgIGxheWVyID0gbGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgIH0pO1xuICAgIGxheWVyLmlzVmFsaWQgPSBmYWxzZTtcblxuICAgIGxheWVyLmVycm9yTWVzc2FnZSA9XG4gICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnIubWVzc2FnZSA/IGVyci5tZXNzYWdlLnN1YnN0cmluZygwLCAxMDApIDogJ1Vua25vd24gZXJyb3InO1xuXG4gICAgbGF5ZXJEYXRhID0ge307XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxheWVyLFxuICAgIGxheWVyRGF0YVxuICB9O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBwcm9wcyBwYXNzZWQgdG8gTGF5ZXJIb3ZlckluZm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheWVySG92ZXJQcm9wKHtcbiAgYW5pbWF0aW9uQ29uZmlnLFxuICBpbnRlcmFjdGlvbkNvbmZpZyxcbiAgaG92ZXJJbmZvLFxuICBsYXllcnMsXG4gIGxheWVyc1RvUmVuZGVyLFxuICBkYXRhc2V0c1xufToge1xuICBpbnRlcmFjdGlvbkNvbmZpZzogVmlzU3RhdGVbJ2ludGVyYWN0aW9uQ29uZmlnJ107XG4gIGFuaW1hdGlvbkNvbmZpZzogVmlzU3RhdGVbJ2FuaW1hdGlvbkNvbmZpZyddO1xuICBob3ZlckluZm86IFZpc1N0YXRlWydob3ZlckluZm8nXTtcbiAgbGF5ZXJzOiBWaXNTdGF0ZVsnbGF5ZXJzJ107XG4gIGxheWVyc1RvUmVuZGVyOiBMYXllcnNUb1JlbmRlcjtcbiAgZGF0YXNldHM6IFZpc1N0YXRlWydkYXRhc2V0cyddO1xufSk6IExheWVySG92ZXJQcm9wIHwgbnVsbCB7XG4gIGlmIChpbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwLmVuYWJsZWQgJiYgaG92ZXJJbmZvICYmIGhvdmVySW5mby5waWNrZWQpIHtcbiAgICAvLyBpZiBhbnl0aGluZyBob3ZlcmVkXG4gICAgY29uc3Qge29iamVjdCwgbGF5ZXI6IG92ZXJsYXl9ID0gaG92ZXJJbmZvO1xuXG4gICAgLy8gZGVja2dsIGxheWVyIHRvIGtlcGxlci1nbCBsYXllclxuICAgIGNvbnN0IGxheWVyID0gbGF5ZXJzW292ZXJsYXkucHJvcHMuaWR4XTtcblxuICAgIC8vIE5PVEU6IGZvciBiaW5hcnkgZm9ybWF0IEdlb2pzb25MYXllciwgZGVjayB3aWxsIHJldHVybiBvYmplY3Q9bnVsbCBidXQgaG92ZXJJbmZvLmluZGV4ID49IDBcbiAgICBpZiAoXG4gICAgICAob2JqZWN0IHx8IGhvdmVySW5mby5pbmRleCA+PSAwKSAmJlxuICAgICAgbGF5ZXIgJiZcbiAgICAgIGxheWVyLmdldEhvdmVyRGF0YSAmJlxuICAgICAgbGF5ZXJzVG9SZW5kZXJbbGF5ZXIuaWRdXG4gICAgKSB7XG4gICAgICAvLyBpZiBsYXllciBpcyB2aXNpYmxlIGFuZCBoYXZlIGhvdmVyZWQgZGF0YVxuICAgICAgY29uc3Qge1xuICAgICAgICBjb25maWc6IHtkYXRhSWR9XG4gICAgICB9ID0gbGF5ZXI7XG4gICAgICBpZiAoIWRhdGFJZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyLCBmaWVsZHN9ID0gZGF0YXNldHNbZGF0YUlkXTtcbiAgICAgIGNvbnN0IGRhdGE6IERhdGFSb3cgfCBudWxsID0gbGF5ZXIuZ2V0SG92ZXJEYXRhKFxuICAgICAgICBvYmplY3QgfHwgaG92ZXJJbmZvLmluZGV4LFxuICAgICAgICBkYXRhQ29udGFpbmVyLFxuICAgICAgICBmaWVsZHMsXG4gICAgICAgIGFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgaG92ZXJJbmZvXG4gICAgICApO1xuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgZmllbGRzVG9TaG93ID0gaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcC5jb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIGZpZWxkcyxcbiAgICAgICAgZmllbGRzVG9TaG93LFxuICAgICAgICBsYXllcixcbiAgICAgICAgY3VycmVudFRpbWU6IGFuaW1hdGlvbkNvbmZpZy5jdXJyZW50VGltZVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckRlY2tHbExheWVyKHByb3BzOiBhbnksIGxheWVyQ2FsbGJhY2tzOiB7W2tleTogc3RyaW5nXTogYW55fSkge1xuICBjb25zdCB7XG4gICAgZGF0YXNldHMsXG4gICAgbGF5ZXIsXG4gICAgbGF5ZXJJbmRleCxcbiAgICBkYXRhLFxuICAgIGhvdmVySW5mbyxcbiAgICBjbGlja2VkLFxuICAgIG1hcFN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgIGFuaW1hdGlvbkNvbmZpZyxcbiAgICBtYXBMYXllcnMsXG4gICAgZXhwZXJpbWVudGFsQ29udGV4dFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGRhdGFzZXQgPSBkYXRhc2V0c1tsYXllci5jb25maWcuZGF0YUlkXTtcbiAgY29uc3Qge2dwdUZpbHRlcn0gPSBkYXRhc2V0IHx8IHt9O1xuICBjb25zdCBvYmplY3RIb3ZlcmVkID0gY2xpY2tlZCB8fCBob3ZlckluZm87XG4gIGNvbnN0IHZpc2libGUgPSAhbWFwTGF5ZXJzIHx8IChtYXBMYXllcnMgJiYgbWFwTGF5ZXJzW2xheWVyLmlkXSk7XG4gIC8vIExheWVyIGlzIExheWVyIGNsYXNzXG4gIHJldHVybiBsYXllci5yZW5kZXJMYXllcih7XG4gICAgZGF0YSxcbiAgICBncHVGaWx0ZXIsXG4gICAgaWR4OiBsYXllckluZGV4LFxuICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgIGxheWVyQ2FsbGJhY2tzLFxuICAgIG1hcFN0YXRlLFxuICAgIGFuaW1hdGlvbkNvbmZpZyxcbiAgICBvYmplY3RIb3ZlcmVkLFxuICAgIHZpc2libGUsXG4gICAgZGF0YXNldCxcbiAgICBleHBlcmltZW50YWxDb250ZXh0XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMYXllclJlbmRlcmFibGUobGF5ZXI6IExheWVyLCBsYXllckRhdGEpIHtcbiAgcmV0dXJuIGxheWVyLmlkICE9PSBHRU9DT0RFUl9MQVlFUl9JRCAmJiBsYXllci5zaG91bGRSZW5kZXJMYXllcihsYXllckRhdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMYXllclZpc2libGUobGF5ZXIsIG1hcExheWVycykge1xuICByZXR1cm4gKFxuICAgIGxheWVyLmNvbmZpZy5pc1Zpc2libGUgJiZcbiAgICAvLyBpZiBsYXllci5pZCBpcyBub3QgaW4gbWFwTGF5ZXJzLCBkb24ndCByZW5kZXIgaXRcbiAgICAoIW1hcExheWVycyB8fCAobWFwTGF5ZXJzICYmIG1hcExheWVyc1tsYXllci5pZF0pKVxuICApO1xufVxuXG4vLyBQcmVwYXJlIGEgZGljdCBvZiBsYXllcnMgcmVuZGVyZWQgYnkgdGhlIGRlY2suZ2xcbi8vIE5vdGUsIGlzVmlzaWJsZTogZmFsc2UgbGF5ZXIgaXMgcGFzc2VkIHRvIGRlY2suZ2wgaGVyZVxuLy8gcmV0dXJuIHtbaWRdOiB0cnVlIFxcIGZhbHNlfVxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVMYXllcnNGb3JEZWNrKFxuICBsYXllcnM6IExheWVyW10sXG4gIGxheWVyRGF0YTogVmlzU3RhdGVbJ2xheWVyRGF0YSddXG4pOiB7XG4gIFtrZXk6IHN0cmluZ106IGJvb2xlYW47XG59IHtcbiAgcmV0dXJuIGxheWVycy5yZWR1Y2UoXG4gICAgKGFjY3UsIGxheWVyLCBpZHgpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgW2xheWVyLmlkXTpcbiAgICAgICAgaXNMYXllclJlbmRlcmFibGUobGF5ZXIsIGxheWVyRGF0YVtpZHhdKSAmJiBsYXllci5vdmVybGF5VHlwZSA9PT0gT1ZFUkxBWV9UWVBFX0NPTlNULmRlY2tnbFxuICAgIH0pLFxuICAgIHt9XG4gICk7XG59XG5cbi8vIFByZXBhcmUgYSBkaWN0IG9mIHJlbmRlcmVkIGxheWVycyByZW5kZXJlZCBpbiB0aGUgbWFwXG4vLyBUaGlzIGluY2x1ZGVzIG9ubHkgdGhlIHZpc2liaWxlIGxheWVycyBmb3Igc2luZ2xlIG1hcCB2aWV3IGFuZCBzcGxpdCBtYXAgdmlld1xuLy8gcmV0dXJuIHtbaWRdOiB0cnVlIFxcIGZhbHNlfVxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVMYXllcnNUb1JlbmRlcihcbiAgbGF5ZXJzOiBMYXllcltdLFxuICBsYXllckRhdGE6IFZpc1N0YXRlWydsYXllckRhdGEnXSxcbiAgbWFwTGF5ZXJzPzogU3BsaXRNYXBMYXllcnMgfCB1bmRlZmluZWQgfCBudWxsXG4pOiBMYXllcnNUb1JlbmRlciB7XG4gIHJldHVybiBsYXllcnMucmVkdWNlKFxuICAgIChhY2N1LCBsYXllciwgaWR4KSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIFtsYXllci5pZF06IGlzTGF5ZXJSZW5kZXJhYmxlKGxheWVyLCBsYXllckRhdGFbaWR4XSkgJiYgaXNMYXllclZpc2libGUobGF5ZXIsIG1hcExheWVycylcbiAgICB9KSxcbiAgICB7fVxuICApO1xufVxuXG50eXBlIEN1c3RvbURlY2tMYXllciA9IERlY2tMYXllcjxEZWNrTGF5ZXJQcm9wcz47XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXN0b21EZWNrTGF5ZXJzKGRlY2tHbFByb3BzPzogYW55KTogW0N1c3RvbURlY2tMYXllcltdLCBDdXN0b21EZWNrTGF5ZXJbXV0ge1xuICBjb25zdCBib3R0b21EZWNrTGF5ZXJzID0gQXJyYXkuaXNBcnJheShkZWNrR2xQcm9wcz8ubGF5ZXJzKVxuICAgID8gZGVja0dsUHJvcHM/LmxheWVyc1xuICAgIDogaXNGdW5jdGlvbihkZWNrR2xQcm9wcz8ubGF5ZXJzKVxuICAgID8gZGVja0dsUHJvcHM/LmxheWVycygpXG4gICAgOiBbXTtcbiAgY29uc3QgdG9wRGVja0xheWVycyA9IEFycmF5LmlzQXJyYXkoZGVja0dsUHJvcHM/LnRvcExheWVycylcbiAgICA/IGRlY2tHbFByb3BzPy50b3BMYXllcnNcbiAgICA6IGlzRnVuY3Rpb24oZGVja0dsUHJvcHM/LnRvcExheWVycylcbiAgICA/IGRlY2tHbFByb3BzPy50b3BMYXllcnMoKVxuICAgIDogW107XG5cbiAgcmV0dXJuIFtib3R0b21EZWNrTGF5ZXJzLCB0b3BEZWNrTGF5ZXJzXTtcbn1cblxuZXhwb3J0IHR5cGUgQ29tcHV0ZURlY2tMYXllcnNQcm9wcyA9IHtcbiAgbWFwSW5kZXg/OiBudW1iZXI7XG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICBtYXBib3hBcGlVcmw/OiBzdHJpbmc7XG4gIHByaW1hcnlNYXA/OiBib29sZWFuO1xuICBsYXllcnNGb3JEZWNrPzoge1trZXk6IHN0cmluZ106IGJvb2xlYW59O1xuICBlZGl0b3JJbmZvPzoge1xuICAgIGVkaXRvcjogRWRpdG9yO1xuICAgIGVkaXRvck1lbnVBY3RpdmU6IGJvb2xlYW47XG4gICAgb25TZXRGZWF0dXJlczogKGZlYXR1cmVzOiBGZWF0dXJlW10pID0+IGFueTtcbiAgICBzZXRTZWxlY3RlZEZlYXR1cmU6IChcbiAgICAgIGZlYXR1cmU6IEZlYXR1cmUgfCBudWxsLFxuICAgICAgc2VsZWN0aW9uQ29udGV4dD86IEZlYXR1cmVTZWxlY3Rpb25Db250ZXh0XG4gICAgKSA9PiBhbnk7XG4gICAgb25BcHBseVBvbHlnb25GaWx0ZXJBbGw/OiAoZmVhdHVyZTogRmVhdHVyZSkgPT4gYW55O1xuICAgIGZlYXR1cmVDb2xsZWN0aW9uOiB7XG4gICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICBmZWF0dXJlczogRmVhdHVyZVtdO1xuICAgIH07XG4gICAgc2VsZWN0ZWRGZWF0dXJlSW5kZXhlczogbnVtYmVyW107XG4gICAgdmlld3BvcnQ6IFZpZXdwb3J0O1xuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRMYXllckNhbGxiYWNrcyhcbiAgbGF5ZXJDYWxsYmFja3M6IExheWVyQ2FsbGJhY2tzID0ge30sXG4gIGlkeDogbnVtYmVyXG4pOiBCaW5kZWRMYXllckNhbGxiYWNrcyB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhsYXllckNhbGxiYWNrcykucmVkdWNlKFxuICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgW2tleV06IHZhbCA9PiBsYXllckNhbGxiYWNrc1trZXldKGlkeCwgdmFsKVxuICAgIH0pLFxuICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsICh2YWw6IHVua25vd24pID0+IHZvaWQ+XG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVEZWNrTGF5ZXJzRnJvbUxheWVyT3JkZXIoXG4gIGxheWVyT3JkZXI6IExheWVyT3JkZXIsXG4gIGxheWVyczogTGF5ZXJbXSxcbiAgbGF5ZXJEYXRhOiBhbnlbXSxcbiAgY3VycmVudExheWVyc0ZvckRlY2s6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSxcbiAgcmVuZGVyUHJvcHM6IHtcbiAgICBkYXRhc2V0czogYW55O1xuICAgIGhvdmVySW5mbzogYW55O1xuICAgIGNsaWNrZWQ6IGFueTtcbiAgICBtYXBTdGF0ZTogYW55O1xuICAgIGludGVyYWN0aW9uQ29uZmlnOiBhbnk7XG4gICAgYW5pbWF0aW9uQ29uZmlnOiBhbnk7XG4gICAgbWFwTGF5ZXJzOiBhbnk7XG4gICAgaGFzU2hhZG93RWZmZWN0OiBib29sZWFuO1xuICB9LFxuICBsYXllckNhbGxiYWNrcz86IGFueVxuKTogYW55W10ge1xuICBjb25zdCB7ZGF0YXNldHMsIGhvdmVySW5mbywgY2xpY2tlZCwgbWFwU3RhdGUsIGludGVyYWN0aW9uQ29uZmlnLCBhbmltYXRpb25Db25maWcsIG1hcExheWVycywgaGFzU2hhZG93RWZmZWN0fSA9IHJlbmRlclByb3BzO1xuICByZXR1cm4gbGF5ZXJPcmRlclxuICAgIC5zbGljZSgpXG4gICAgLnJldmVyc2UoKVxuICAgIC5yZWR1Y2UoKG92ZXJsYXlzLCBlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBsYXllckdyb3VwID0gZWxlbWVudCBhcyBMYXllck9yZGVyR3JvdXA7XG4gICAgICAgIGlmICghbGF5ZXJHcm91cC5pc1Zpc2libGUpIHtcbiAgICAgICAgICByZXR1cm4gb3ZlcmxheXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG92ZXJsYXlzLmNvbmNhdChcbiAgICAgICAgICBjb21wdXRlRGVja0xheWVyc0Zyb21MYXllck9yZGVyKFxuICAgICAgICAgICAgbGF5ZXJHcm91cC5sYXllck9yZGVyLFxuICAgICAgICAgICAgbGF5ZXJzLFxuICAgICAgICAgICAgbGF5ZXJEYXRhLFxuICAgICAgICAgICAgY3VycmVudExheWVyc0ZvckRlY2ssXG4gICAgICAgICAgICByZW5kZXJQcm9wcyxcbiAgICAgICAgICAgIGxheWVyQ2FsbGJhY2tzXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgbGF5ZXJJZCA9IGVsZW1lbnQgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFjdXJyZW50TGF5ZXJzRm9yRGVja1tsYXllcklkXSkge1xuICAgICAgICByZXR1cm4gb3ZlcmxheXM7XG4gICAgICB9XG4gICAgICBjb25zdCBsYXllckluZGV4ID0gbGF5ZXJzLmZpbmRJbmRleCgoe2lkfSkgPT4gaWQgPT09IGxheWVySWQpO1xuICAgICAgaWYgKGxheWVySW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBvdmVybGF5cztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJpbmRlZExheWVyQ2FsbGJhY2tzID0gbGF5ZXJDYWxsYmFja3NcbiAgICAgICAgPyBiaW5kTGF5ZXJDYWxsYmFja3MobGF5ZXJDYWxsYmFja3MsIGxheWVySW5kZXgpXG4gICAgICAgIDoge307XG4gICAgICBjb25zdCBsYXllciA9IGxheWVyc1tsYXllckluZGV4XTtcbiAgICAgIGNvbnN0IGRhdGEgPSBsYXllckRhdGFbbGF5ZXJJbmRleF07XG4gICAgICBjb25zdCBsYXllck92ZXJsYXkgPSByZW5kZXJEZWNrR2xMYXllcihcbiAgICAgICAge1xuICAgICAgICAgIGRhdGFzZXRzLFxuICAgICAgICAgIGxheWVyLFxuICAgICAgICAgIGxheWVySW5kZXgsXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBob3ZlckluZm8sXG4gICAgICAgICAgY2xpY2tlZCxcbiAgICAgICAgICBtYXBTdGF0ZSxcbiAgICAgICAgICBpbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgICAgICBhbmltYXRpb25Db25maWcsXG4gICAgICAgICAgbWFwTGF5ZXJzLFxuICAgICAgICAgIGV4cGVyaW1lbnRhbENvbnRleHQ6IHtcbiAgICAgICAgICAgIGhhc1NoYWRvd0VmZmVjdFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYmluZGVkTGF5ZXJDYWxsYmFja3NcbiAgICAgICk7XG4gICAgICByZXR1cm4gb3ZlcmxheXMuY29uY2F0KGxheWVyT3ZlcmxheSB8fCBbXSk7XG4gICAgfSwgW10gYXMgYW55W10pO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVEZWNrTGF5ZXJzKFxuICB7dmlzU3RhdGUsIG1hcFN0YXRlLCBtYXBTdHlsZX06IGFueSxcbiAgb3B0aW9ucz86IENvbXB1dGVEZWNrTGF5ZXJzUHJvcHMsXG4gIGxheWVyQ2FsbGJhY2tzPzogTGF5ZXJDYWxsYmFja3MsXG4gIGRlY2tHbFByb3BzPzogYW55XG4pOiBMYXllcltdIHtcbiAgY29uc3Qge1xuICAgIGRhdGFzZXRzLFxuICAgIGVmZmVjdHMsXG4gICAgbGF5ZXJzLFxuICAgIGxheWVyT3JkZXIsXG4gICAgbGF5ZXJEYXRhLFxuICAgIGhvdmVySW5mbyxcbiAgICBjbGlja2VkLFxuICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgIGFuaW1hdGlvbkNvbmZpZyxcbiAgICBzcGxpdE1hcHNcbiAgfSA9IHZpc1N0YXRlO1xuXG4gIGNvbnN0IHttYXBJbmRleCwgbWFwYm94QXBpQWNjZXNzVG9rZW4sIG1hcGJveEFwaVVybCwgcHJpbWFyeU1hcCwgbGF5ZXJzRm9yRGVjaywgZWRpdG9ySW5mb30gPVxuICAgIG9wdGlvbnMgfHwge307XG5cbiAgbGV0IGRhdGFMYXllcnM6IGFueVtdID0gW107XG5cbiAgY29uc3QgaGFzU2hhZG93RWZmZWN0ID0gZWZmZWN0cy5zb21lKGVmZmVjdCA9PiB7XG4gICAgcmV0dXJuIGVmZmVjdC50eXBlID09PSBMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVC50eXBlO1xuICB9KTtcblxuICBpZiAobGF5ZXJEYXRhICYmIGxheWVyRGF0YS5sZW5ndGgpIHtcbiAgICBjb25zdCBtYXBMYXllcnMgPSBnZXRNYXBMYXllcnNGcm9tU3BsaXRNYXBzKHNwbGl0TWFwcywgbWFwSW5kZXggfHwgMCk7XG5cbiAgICBjb25zdCBjdXJyZW50TGF5ZXJzRm9yRGVjayA9IGxheWVyc0ZvckRlY2sgfHwgcHJlcGFyZUxheWVyc0ZvckRlY2sobGF5ZXJzLCBsYXllckRhdGEpO1xuXG4gICAgZGF0YUxheWVycyA9IGxheWVyT3JkZXJcbiAgICAgIC5zbGljZSgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAucmVkdWNlKChvdmVybGF5cywgZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChlbGVtZW50KSkge1xuICAgICAgICAgIGNvbnN0IGxheWVyR3JvdXAgPSBlbGVtZW50IGFzIExheWVyT3JkZXJHcm91cDtcbiAgICAgICAgICBpZiAoIWxheWVyR3JvdXAuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3ZlcmxheXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdmVybGF5cy5jb25jYXQoXG4gICAgICAgICAgICBjb21wdXRlRGVja0xheWVyc0Zyb21MYXllck9yZGVyKFxuICAgICAgICAgICAgICBsYXllckdyb3VwLmxheWVyT3JkZXIsXG4gICAgICAgICAgICAgIGxheWVycyxcbiAgICAgICAgICAgICAgbGF5ZXJEYXRhLFxuICAgICAgICAgICAgICBjdXJyZW50TGF5ZXJzRm9yRGVjayxcbiAgICAgICAgICAgICAge2RhdGFzZXRzLCBob3ZlckluZm8sIGNsaWNrZWQsIG1hcFN0YXRlLCBpbnRlcmFjdGlvbkNvbmZpZywgYW5pbWF0aW9uQ29uZmlnLCBtYXBMYXllcnMsIGhhc1NoYWRvd0VmZmVjdH0sXG4gICAgICAgICAgICAgIGxheWVyQ2FsbGJhY2tzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXllcklkID0gZWxlbWVudCBhcyBzdHJpbmc7XG4gICAgICAgIGlmICghY3VycmVudExheWVyc0ZvckRlY2tbbGF5ZXJJZF0pIHtcbiAgICAgICAgICByZXR1cm4gb3ZlcmxheXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGF5ZXJJbmRleCA9IGxheWVycy5maW5kSW5kZXgoKHtpZH0pID0+IGlkID09PSBsYXllcklkKTtcbiAgICAgICAgaWYgKGxheWVySW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIG92ZXJsYXlzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJpbmRlZExheWVyQ2FsbGJhY2tzID0gbGF5ZXJDYWxsYmFja3NcbiAgICAgICAgICA/IGJpbmRMYXllckNhbGxiYWNrcyhsYXllckNhbGxiYWNrcywgbGF5ZXJJbmRleClcbiAgICAgICAgICA6IHt9O1xuICAgICAgICBjb25zdCBsYXllciA9IGxheWVyc1tsYXllckluZGV4XTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGxheWVyRGF0YVtsYXllckluZGV4XTtcbiAgICAgICAgY29uc3QgbGF5ZXJPdmVybGF5ID0gcmVuZGVyRGVja0dsTGF5ZXIoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgICBsYXllcixcbiAgICAgICAgICAgIGxheWVySW5kZXgsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgaG92ZXJJbmZvLFxuICAgICAgICAgICAgY2xpY2tlZCxcbiAgICAgICAgICAgIG1hcFN0YXRlLFxuICAgICAgICAgICAgaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAgICAgICBhbmltYXRpb25Db25maWcsXG4gICAgICAgICAgICBtYXBMYXllcnMsXG4gICAgICAgICAgICBleHBlcmltZW50YWxDb250ZXh0OiB7XG4gICAgICAgICAgICAgIGhhc1NoYWRvd0VmZmVjdFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYmluZGVkTGF5ZXJDYWxsYmFja3NcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG92ZXJsYXlzLmNvbmNhdChsYXllck92ZXJsYXkgfHwgW10pO1xuICAgICAgfSwgW10pO1xuICB9XG5cbiAgaWYgKCFwcmltYXJ5TWFwKSB7XG4gICAgcmV0dXJuIGRhdGFMYXllcnM7XG4gIH1cblxuICBpZiAoXG4gICAgbWFwU3R5bGU/LnZpc2libGVMYXllckdyb3Vwc1snM2QgYnVpbGRpbmcnXSAmJlxuICAgIHByaW1hcnlNYXAgJiZcbiAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbiAmJlxuICAgIG1hcGJveEFwaVVybFxuICApIHtcbiAgICBkYXRhTGF5ZXJzLnB1c2goXG4gICAgICBuZXcgVGhyZWVEQnVpbGRpbmdMYXllcih7XG4gICAgICAgIGlkOiAnX2tlcGxlcmdsXzNkLWJ1aWxkaW5nJyxcbiAgICAgICAgbWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gICAgICAgIG1hcGJveEFwaVVybCxcbiAgICAgICAgdGhyZWVEQnVpbGRpbmdDb2xvcjogbWFwU3R5bGUudGhyZWVEQnVpbGRpbmdDb2xvcixcbiAgICAgICAgdXBkYXRlVHJpZ2dlcnM6IHtcbiAgICAgICAgICBnZXRGaWxsQ29sb3I6IG1hcFN0eWxlLnRocmVlREJ1aWxkaW5nQ29sb3JcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgY29uc3QgW2N1c3RvbUJvdHRvbURlY2tMYXllcnMsIGN1c3RvbVRvcERlY2tMYXllcnNdID0gZ2V0Q3VzdG9tRGVja0xheWVycyhkZWNrR2xQcm9wcyk7XG5cbiAgY29uc3QgZWRpdG9yTGF5ZXI6IGFueVtdID0gW107XG4gIGlmIChlZGl0b3JJbmZvKSB7XG4gICAgZWRpdG9yTGF5ZXIucHVzaChcbiAgICAgIGdldEVkaXRvckxheWVyKHtcbiAgICAgICAgLi4uZWRpdG9ySW5mbyxcbiAgICAgICAgbWFwU3RhdGVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBbLi4uY3VzdG9tQm90dG9tRGVja0xheWVycywgLi4uZGF0YUxheWVycywgLi4uY3VzdG9tVG9wRGVja0xheWVycywgLi4uZWRpdG9yTGF5ZXJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF5ZXJPcmRlckZyb21MYXllcnM8VCBleHRlbmRzIHtpZDogc3RyaW5nfT4obGF5ZXJzOiBUW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBsYXllcnMubWFwKCh7aWR9KSA9PiBpZCk7XG59XG5cbi8vIC0tLSBMYXllciBHcm91cCBVdGlsaXRpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdMYXllckdyb3VwKHByb3BzPzogUGFydGlhbDxMYXllck9yZGVyR3JvdXA+KTogTGF5ZXJPcmRlckdyb3VwIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogcHJvcHM/LmlkID8/IGdlbmVyYXRlSGFzaElkKDYpLFxuICAgIGxhYmVsOiBwcm9wcz8ubGFiZWwgPz8gJ05ldyBncm91cCcsXG4gICAgaXNWaXNpYmxlOiBwcm9wcz8uaXNWaXNpYmxlID8/IHRydWUsXG4gICAgbGF5ZXJPcmRlcjogcHJvcHM/LmxheWVyT3JkZXIgPz8gW10sXG4gICAgaXNJbmNsdWRlZEluTGVnZW5kOiBwcm9wcz8uaXNJbmNsdWRlZEluTGVnZW5kID8/IHRydWVcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZExheWVyT3JHcm91cFRvTGF5ZXJPcmRlcihcbiAgbGF5ZXJPcmRlcjogTGF5ZXJPcmRlcixcbiAgZWxlbWVudDogTGF5ZXJPcmRlckVudHJ5LFxuICBhdEluZGV4PzogbnVtYmVyXG4pOiBMYXllck9yZGVyIHtcbiAgY29uc3QgaWR4ID0gYXRJbmRleCA/PyAwO1xuICBjb25zdCByZXN1bHQgPSBbLi4ubGF5ZXJPcmRlcl07XG4gIHJlc3VsdC5zcGxpY2UoaWR4LCAwLCBlbGVtZW50KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnRGcm9tTGF5ZXJPcmRlcihcbiAgbGF5ZXJPcmRlcjogTGF5ZXJPcmRlcixcbiAgZWxlbWVudDogTGF5ZXJPcmRlckVudHJ5XG4pOiBMYXllck9yZGVyIHtcbiAgaWYgKCFsYXllck9yZGVyKSByZXR1cm4gW107XG4gIGNvbnN0IGVsZW1lbnRJZCA9IHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJyA/IGVsZW1lbnQgOiBlbGVtZW50LmlkO1xuICBsZXQgbmV3TGF5ZXJPcmRlciA9IGxheWVyT3JkZXIuZmlsdGVyKGVudHJ5ID0+IHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgIHJldHVybiAoZW50cnkgYXMgTGF5ZXJPcmRlckdyb3VwKS5pZCAhPT0gZWxlbWVudElkO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnkgIT09IGVsZW1lbnRJZDtcbiAgfSk7XG5cbiAgbmV3TGF5ZXJPcmRlciA9IG5ld0xheWVyT3JkZXIubWFwKGVudHJ5ID0+IHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZW50cnkgYXMgTGF5ZXJPcmRlckdyb3VwO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgIGxheWVyT3JkZXI6IHJlbW92ZUVsZW1lbnRGcm9tTGF5ZXJPcmRlcihncm91cC5sYXllck9yZGVyLCBlbGVtZW50SWQpXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH0pO1xuXG4gIHJldHVybiBuZXdMYXllck9yZGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF5ZXJHcm91cEZyb21MYXllck9yZGVyKFxuICBsYXllck9yZGVyOiBMYXllck9yZGVyLFxuICBsYXllckdyb3VwSWQ6IHN0cmluZ1xuKTogTGF5ZXJPcmRlckdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGdyb3VwOiBMYXllck9yZGVyR3JvdXAgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJPcmRlci5sZW5ndGggJiYgIWdyb3VwOyBpKyspIHtcbiAgICBjb25zdCBlbnRyeSA9IGxheWVyT3JkZXJbaV07XG4gICAgaWYgKGlzUGxhaW5PYmplY3QoZW50cnkpKSB7XG4gICAgICBjb25zdCBncnAgPSBlbnRyeSBhcyBMYXllck9yZGVyR3JvdXA7XG4gICAgICBncm91cCA9XG4gICAgICAgIGdycC5pZCA9PT0gbGF5ZXJHcm91cElkID8gZ3JwIDogZ2V0TGF5ZXJHcm91cEZyb21MYXllck9yZGVyKGdycC5sYXllck9yZGVyLCBsYXllckdyb3VwSWQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ3JvdXA7XG59XG5cbi8qKlxuICogRmluZCB0aGUgcGFyZW50IGdyb3VwIHRoYXQgY29udGFpbnMgYSBnaXZlbiBsYXllciBJRC5cbiAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBsYXllciBpcyBhdCB0aGUgcm9vdCBsZXZlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQYXJlbnRHcm91cEZvckxheWVyKFxuICBsYXllck9yZGVyOiBMYXllck9yZGVyLFxuICBsYXllcklkOiBzdHJpbmdcbik6IExheWVyT3JkZXJHcm91cCB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgbGF5ZXJPcmRlcikge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KGVudHJ5KSkge1xuICAgICAgY29uc3QgZ3JvdXAgPSBlbnRyeSBhcyBMYXllck9yZGVyR3JvdXA7XG4gICAgICBpZiAoZ3JvdXAubGF5ZXJPcmRlci5zb21lKGUgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnICYmIGUgPT09IGxheWVySWQpKSB7XG4gICAgICAgIHJldHVybiBncm91cDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5lc3RlZCA9IGZpbmRQYXJlbnRHcm91cEZvckxheWVyKGdyb3VwLmxheWVyT3JkZXIsIGxheWVySWQpO1xuICAgICAgaWYgKG5lc3RlZCkgcmV0dXJuIG5lc3RlZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluZGV4RnJvbUxheWVyRW50cnlJZChsYXllck9yZGVyOiBMYXllck9yZGVyLCBsYXllckVudHJ5SWQ6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBsYXllck9yZGVyLmZpbmRJbmRleChlbnRyeSA9PlxuICAgIGlzUGxhaW5PYmplY3QoZW50cnkpID8gKGVudHJ5IGFzIExheWVyT3JkZXJHcm91cCkuaWQgPT09IGxheWVyRW50cnlJZCA6IGVudHJ5ID09PSBsYXllckVudHJ5SWRcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTGF5ZXJQcmVzZW50SW5MYXllck9yZGVyKGxheWVyT3JkZXI6IExheWVyT3JkZXIsIGxheWVySWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllck9yZGVyLmxlbmd0aCAmJiAhZm91bmQ7IGkrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gbGF5ZXJPcmRlcltpXTtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgIGZvdW5kID0gaXNMYXllclByZXNlbnRJbkxheWVyT3JkZXIoKGVudHJ5IGFzIExheWVyT3JkZXJHcm91cCkubGF5ZXJPcmRlciwgbGF5ZXJJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvdW5kID0gbGF5ZXJJZCA9PT0gZW50cnk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3VuZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VMYXllckVudHJ5SW5MYXllck9yZGVyKFxuICBsYXllck9yZGVyOiBMYXllck9yZGVyLFxuICBvbGRFbnRyeTogTGF5ZXJPcmRlckVudHJ5LFxuICBuZXdFbnRyeTogTGF5ZXJPcmRlckVudHJ5XG4pOiBMYXllck9yZGVyIHtcbiAgY29uc3Qgb2xkRW50cnlJZCA9IHR5cGVvZiBvbGRFbnRyeSA9PT0gJ3N0cmluZycgPyBvbGRFbnRyeSA6IG9sZEVudHJ5LmlkO1xuICByZXR1cm4gbGF5ZXJPcmRlci5tYXAoZW50cnkgPT4ge1xuICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZW50cnkgPT09IG9sZEVudHJ5SWQgPyBuZXdFbnRyeSA6IGVudHJ5O1xuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgIGNvbnN0IGdycCA9IGVudHJ5IGFzIExheWVyT3JkZXJHcm91cDtcbiAgICAgIGlmIChncnAuaWQgPT09IG9sZEVudHJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIG5ld0VudHJ5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZ3JwLFxuICAgICAgICBsYXllck9yZGVyOiByZXBsYWNlTGF5ZXJFbnRyeUluTGF5ZXJPcmRlcihncnAubGF5ZXJPcmRlciwgb2xkRW50cnksIG5ld0VudHJ5KVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxheWVyR3JvdXBJbkxheWVyT3JkZXIoXG4gIGxheWVyT3JkZXI6IExheWVyT3JkZXIsXG4gIG5ld0xheWVyR3JvdXA6IExheWVyT3JkZXJHcm91cFxuKTogTGF5ZXJPcmRlciB7XG4gIHJldHVybiBsYXllck9yZGVyLm1hcChlbnRyeSA9PiB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QoZW50cnkpKSB7XG4gICAgICBjb25zdCBncnAgPSBlbnRyeSBhcyBMYXllck9yZGVyR3JvdXA7XG4gICAgICBpZiAoZ3JwLmlkID09PSBuZXdMYXllckdyb3VwLmlkKSB7XG4gICAgICAgIHJldHVybiBuZXdMYXllckdyb3VwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZ3JwLFxuICAgICAgICBsYXllck9yZGVyOiB1cGRhdGVMYXllckdyb3VwSW5MYXllck9yZGVyKGdycC5sYXllck9yZGVyLCBuZXdMYXllckdyb3VwKVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZsYXRMYXllck9yZGVyKGxheWVyT3JkZXI6IExheWVyT3JkZXIpOiBGbGF0TGF5ZXJPcmRlciB7XG4gIHJldHVybiBsYXllck9yZGVyLnJlZHVjZSgoYWNjLCBvcmRlckVudHJ5KSA9PiB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3Qob3JkZXJFbnRyeSkpIHtcbiAgICAgIHJldHVybiBbLi4uYWNjLCAuLi5nZXRGbGF0TGF5ZXJPcmRlcigob3JkZXJFbnRyeSBhcyBMYXllck9yZGVyR3JvdXApLmxheWVyT3JkZXIpXTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5hY2MsIG9yZGVyRW50cnkgYXMgc3RyaW5nXTtcbiAgfSwgW10gYXMgRmxhdExheWVyT3JkZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMYXllck9yZGVySGllcmFyY2h5KFxuICBsYXllck9yZGVyOiBMYXllck9yZGVyLFxuICBsYXllcnM/OiBMYXllcltdIHwgcmVhZG9ubHkgTGF5ZXJbXVxuKTogTGF5ZXJPcmRlckhpZXJhcmNoeSB7XG4gIGNvbnN0IHZhbGlkTGF5ZXJzID0gbGF5ZXJzPy5maWx0ZXIoQm9vbGVhbik7XG4gIHJldHVybiBsYXllck9yZGVyLnJlZHVjZSgoYWNjLCBlbGVtZW50KSA9PiB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBbLi4uYWNjLCBbJ2xheWVyR3JvdXAnLCBlbGVtZW50IGFzIExheWVyT3JkZXJHcm91cF0gYXMgY29uc3RdO1xuICAgIH1cbiAgICBjb25zdCBsYXllciA9IHZhbGlkTGF5ZXJzPy5maW5kKGwgPT4gbC5pZCA9PT0gZWxlbWVudCk7XG4gICAgaWYgKCFsYXllciB8fCBsYXllci5jb25maWcuaGlkZGVuKSB7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmFjYywgWydsYXllcicsIGxheWVyXSBhcyBjb25zdF07XG4gIH0sIFtdIGFzIExheWVyT3JkZXJIaWVyYXJjaHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlR2hvc3RMYXllckZyb21MYXllck9yZGVyKFxuICBsYXllck9yZGVyOiBMYXllck9yZGVyLFxuICBsYXllcnM6IHtpZDogc3RyaW5nfVtdXG4pOiBMYXllck9yZGVyIHtcbiAgcmV0dXJuIGxheWVyT3JkZXIucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChsYXllcnMuZmluZChsID0+IGwuaWQgPT09IGVudHJ5KSkge1xuICAgICAgICBhY2MucHVzaChlbnRyeSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdycCA9IGVudHJ5IGFzIExheWVyT3JkZXJHcm91cDtcbiAgICAgIGlmIChncnAubGF5ZXJPcmRlcikge1xuICAgICAgICBhY2MucHVzaCh7XG4gICAgICAgICAgLi4uZ3JwLFxuICAgICAgICAgIGxheWVyT3JkZXI6IHJlbW92ZUdob3N0TGF5ZXJGcm9tTGF5ZXJPcmRlcihncnAubGF5ZXJPcmRlciwgbGF5ZXJzKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10gYXMgTGF5ZXJPcmRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW9yZGVyTGF5ZXJPcmRlcihcbiAgbGF5ZXJPcmRlcjogVmlzU3RhdGVbJ2xheWVyT3JkZXInXSxcbiAgb3JpZ2luTGF5ZXJJZDogc3RyaW5nLFxuICBkZXN0aW5hdGlvbkxheWVySWQ6IHN0cmluZ1xuKTogVmlzU3RhdGVbJ2xheWVyT3JkZXInXSB7XG4gIGNvbnN0IGFjdGl2ZUluZGV4ID0gZ2V0SW5kZXhGcm9tTGF5ZXJFbnRyeUlkKGxheWVyT3JkZXIsIG9yaWdpbkxheWVySWQpO1xuICBjb25zdCBvdmVySW5kZXggPSBnZXRJbmRleEZyb21MYXllckVudHJ5SWQobGF5ZXJPcmRlciwgZGVzdGluYXRpb25MYXllcklkKTtcblxuICBpZiAoYWN0aXZlSW5kZXggPT09IC0xIHx8IG92ZXJJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gbGF5ZXJPcmRlcjtcbiAgfVxuICByZXR1cm4gYXJyYXlNb3ZlKGxheWVyT3JkZXIsIGFjdGl2ZUluZGV4LCBvdmVySW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkTGF5ZXJUb0xheWVyT3JkZXIoXG4gIGxheWVyT3JkZXI6IFZpc1N0YXRlWydsYXllck9yZGVyJ10sXG4gIGxheWVySWQ6IHN0cmluZ1xuKTogTGF5ZXJPcmRlciB7XG4gIHJldHVybiBbbGF5ZXJJZCwgLi4ubGF5ZXJPcmRlcl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXllckhvdmVyUHJvcFZhbHVlKFxuICBkYXRhOiBEYXRhUm93IHwgQWdncmVnYXRpb25MYXllckhvdmVyRGF0YSB8IGFueVtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgZmllbGRJbmRleDogbnVtYmVyXG4pIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGFSb3cpIHJldHVybiBkYXRhLnZhbHVlQXQoZmllbGRJbmRleCk7XG4gIHJldHVybiBkYXRhW2ZpZWxkSW5kZXhdO1xufVxuXG4vKiogQ2hlY2tzIGlmIGFueSBEZWNrIGxheWVycyBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgbG9hZGluZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcmVBbnlEZWNrTGF5ZXJzTG9hZGluZyhsYXllcnM6IERlY2tMYXllcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBsYXllcnMuc29tZShcbiAgICAvLyBsYXllci5pc0xvYWRlZCBjaGFuZ2VzIGZyZXF1ZW50bHkgaW4gRGVjayAoZXZlbiBvbiBob3Zlcikgc28gd2UgY2hlY2sgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gICAgbGF5ZXIgPT4gbGF5ZXIuaW50ZXJuYWxTdGF0ZSAmJiAhbGF5ZXIuaXNMb2FkZWRcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBLE9BQU9BLE9BQU8sTUFBTSxnQkFBZ0I7QUFFcEMsU0FBUUMsaUJBQWlCLEVBQUVDLHVCQUF1QixRQUFPLHNCQUFzQjtBQXFCL0UsU0FLRUMsa0JBQWtCLEVBQ2xCQyxjQUFjLFFBQ1QsbUJBQW1CO0FBSTFCLFNBQVFDLFVBQVUsRUFBRUMseUJBQXlCLEVBQUVDLE9BQU8sRUFBRUMsYUFBYSxRQUFPLGtCQUFrQjtBQUM5RixTQUFRQyxTQUFTLEVBQUVDLGNBQWMsUUFBTyx5QkFBeUI7QUFFakUsU0FBUUMsbUJBQW1CLFFBQU8sMEJBQTBCO0FBNkI1RDtBQUNBO0FBQ0E7QUFD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QUFDa0csSUFBSSxDQUFDMkIsS0FBSyxDQUFDO01BQ2pCO0lBQ0YsQ0FBQyxNQUFNO01BQ0wsSUFBTUssR0FBRyxHQUFHTCxLQUF3QjtNQUNwQyxJQUFJSyxHQUFHLENBQUNoRSxVQUFVLEVBQUU7UUFDbEJsRSxHQUFHLENBQUNrRyxJQUFJLENBQUFoSSxhQUFBLENBQUFBLGFBQUEsS0FDSGdLLEdBQUc7VUFDTmhFLFVBQVUsRUFBRThGLDhCQUE4QixDQUFDOUIsR0FBRyxDQUFDaEUsVUFBVSxFQUFFN0UsTUFBTTtRQUFDLEVBQ25FLENBQUM7TUFDSjtJQUNGO0lBQ0EsT0FBT1csR0FBRztFQUNaLENBQUMsRUFBRSxFQUFnQixDQUFDO0FBQ3RCO0FBRUEsT0FBTyxTQUFTaUssaUJBQWlCQSxDQUMvQi9GLFVBQWtDLEVBQ2xDZ0csYUFBcUIsRUFDckJDLGtCQUEwQixFQUNGO0VBQ3hCLElBQU1DLFdBQVcsR0FBR3RCLHdCQUF3QixDQUFDNUUsVUFBVSxFQUFFZ0csYUFBYSxDQUFDO0VBQ3ZFLElBQU1HLFNBQVMsR0FBR3ZCLHdCQUF3QixDQUFDNUUsVUFBVSxFQUFFaUcsa0JBQWtCLENBQUM7RUFFMUUsSUFBSUMsV0FBVyxLQUFLLENBQUMsQ0FBQyxJQUFJQyxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUU7SUFDMUMsT0FBT25HLFVBQVU7RUFDbkI7RUFDQSxPQUFPckgsU0FBUyxDQUFDcUgsVUFBVSxFQUFFa0csV0FBVyxFQUFFQyxTQUFTLENBQUM7QUFDdEQ7QUFFQSxPQUFPLFNBQVNDLG9CQUFvQkEsQ0FDbENwRyxVQUFrQyxFQUNsQ1MsT0FBZSxFQUNIO0VBQ1osUUFBUUEsT0FBTyxFQUFBNUcsTUFBQSxDQUFBNkksa0JBQUEsQ0FBSzFDLFVBQVU7QUFDaEM7QUFFQSxPQUFPLFNBQVNxRyxzQkFBc0JBLENBQ3BDdEksSUFBb0UsRUFDcEV1SSxVQUFrQixFQUNsQjtFQUNBLElBQUksQ0FBQ3ZJLElBQUksRUFBRSxPQUFPL0MsU0FBUztFQUMzQixJQUFJK0MsSUFBSSxZQUFZdEYsT0FBTyxFQUFFLE9BQU9zRixJQUFJLENBQUN3SSxPQUFPLENBQUNELFVBQVUsQ0FBQztFQUM1RCxPQUFPdkksSUFBSSxDQUFDdUksVUFBVSxDQUFDO0FBQ3pCOztBQUVBO0FBQ0EsT0FBTyxTQUFTRSx1QkFBdUJBLENBQUNyTCxNQUFtQixFQUFXO0VBQ3BFLE9BQU9BLE1BQU0sQ0FBQ0wsSUFBSTtFQUNoQjtFQUNBLFVBQUFULEtBQUs7SUFBQSxPQUFJQSxLQUFLLENBQUNvTSxhQUFhLElBQUksQ0FBQ3BNLEtBQUssQ0FBQ3FNLFFBQVE7RUFBQSxDQUNqRCxDQUFDO0FBQ0giLCJpZ25vcmVMaXN0IjpbXX0=