@kepler.gl/reducers 3.1.0-alpha.0 → 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,3338 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.INITIAL_VIS_STATE = exports.DEFAULT_EDITOR = exports.DEFAULT_ANIMATION_CONFIG = void 0;
|
|
9
|
+
exports.addDefaultLayers = addDefaultLayers;
|
|
10
|
+
exports.addDefaultTooltips = addDefaultTooltips;
|
|
11
|
+
exports.applyCPUFilterUpdater = exports.addLayerUpdater = exports.addFilterUpdater = exports.addEffectUpdater = void 0;
|
|
12
|
+
exports.applyLayerConfigUpdater = applyLayerConfigUpdater;
|
|
13
|
+
exports.applyMergersUpdater = applyMergersUpdater;
|
|
14
|
+
exports.closeSpecificMapAtIndex = closeSpecificMapAtIndex;
|
|
15
|
+
exports.copyTableColumnUpdater = copyTableColumnUpdater;
|
|
16
|
+
exports.defaultInteractionConfig = exports.createOrUpdateFilterUpdater = exports.createNewDatasetSuccessUpdater = void 0;
|
|
17
|
+
exports.deleteFeatureUpdater = deleteFeatureUpdater;
|
|
18
|
+
exports.duplicateLayerUpdater = void 0;
|
|
19
|
+
exports.initialFileLoadingProgress = initialFileLoadingProgress;
|
|
20
|
+
exports.interactionConfigChangeUpdater = interactionConfigChangeUpdater;
|
|
21
|
+
exports.layerAnimationChangeUpdater = layerAnimationChangeUpdater;
|
|
22
|
+
exports.layerColorUIChangeUpdater = exports.layerClickUpdater = void 0;
|
|
23
|
+
exports.layerConfigChangeUpdater = layerConfigChangeUpdater;
|
|
24
|
+
exports.layerDataIdChangeUpdater = layerDataIdChangeUpdater;
|
|
25
|
+
exports.layerFilteredItemsChangeUpdater = layerFilteredItemsChangeUpdater;
|
|
26
|
+
exports.layerHoverUpdater = void 0;
|
|
27
|
+
exports.layerSetIsValidUpdater = layerSetIsValidUpdater;
|
|
28
|
+
exports.layerTextLabelChangeUpdater = layerTextLabelChangeUpdater;
|
|
29
|
+
exports.layerTypeChangeUpdater = layerTypeChangeUpdater;
|
|
30
|
+
exports.layerVisConfigChangeUpdater = layerVisConfigChangeUpdater;
|
|
31
|
+
exports.layerVisualChannelChangeUpdater = layerVisualChannelChangeUpdater;
|
|
32
|
+
exports.loadFileStepSuccessUpdater = loadFileStepSuccessUpdater;
|
|
33
|
+
exports.loadFilesUpdater = exports.loadFilesErrUpdater = void 0;
|
|
34
|
+
exports.loadNextFileUpdater = loadNextFileUpdater;
|
|
35
|
+
exports.makeLoadFileTask = makeLoadFileTask;
|
|
36
|
+
exports.nextFileBatchUpdater = exports.mouseMoveUpdater = exports.mapClickUpdater = void 0;
|
|
37
|
+
exports.parseProgress = parseProgress;
|
|
38
|
+
exports.pinTableColumnUpdater = pinTableColumnUpdater;
|
|
39
|
+
exports.prepareStateForDatasetReplace = prepareStateForDatasetReplace;
|
|
40
|
+
exports.processFileContentUpdater = processFileContentUpdater;
|
|
41
|
+
exports.receiveMapConfigUpdater = void 0;
|
|
42
|
+
exports.removeDatasetUpdater = removeDatasetUpdater;
|
|
43
|
+
exports.removeFilterUpdater = exports.removeEffectUpdater = void 0;
|
|
44
|
+
exports.removeLayerUpdater = removeLayerUpdater;
|
|
45
|
+
exports.renameDatasetUpdater = renameDatasetUpdater;
|
|
46
|
+
exports.reorderLayerUpdater = exports.reorderEffectUpdater = void 0;
|
|
47
|
+
exports.replaceDatasetDepsInState = replaceDatasetDepsInState;
|
|
48
|
+
exports.resetMapConfigUpdater = void 0;
|
|
49
|
+
exports.setColumnDisplayFormatUpdater = setColumnDisplayFormatUpdater;
|
|
50
|
+
exports.setEditorModeUpdater = void 0;
|
|
51
|
+
exports.setFeaturesUpdater = setFeaturesUpdater;
|
|
52
|
+
exports.setFilterAnimationTimeConfigUpdater = setFilterAnimationTimeConfigUpdater;
|
|
53
|
+
exports.setFilterAnimationTimeUpdater = setFilterAnimationTimeUpdater;
|
|
54
|
+
exports.setFilterAnimationWindowUpdater = setFilterAnimationWindowUpdater;
|
|
55
|
+
exports.setFilterPlotUpdater = void 0;
|
|
56
|
+
exports.setFilterUpdater = setFilterUpdater;
|
|
57
|
+
exports.setFilterViewUpdater = void 0;
|
|
58
|
+
exports.setInitialLayerConfig = setInitialLayerConfig;
|
|
59
|
+
exports.setLayerAnimationTimeConfigUpdater = setLayerAnimationTimeConfigUpdater;
|
|
60
|
+
exports.setMapInfoUpdater = exports.setLayerAnimationTimeUpdater = void 0;
|
|
61
|
+
exports.setPolygonFilterLayerUpdater = setPolygonFilterLayerUpdater;
|
|
62
|
+
exports.setSelectedFeatureUpdater = void 0;
|
|
63
|
+
exports.setTimeFilterTimelineModeUpdater = setTimeFilterTimelineModeUpdater;
|
|
64
|
+
exports.showDatasetTableUpdater = void 0;
|
|
65
|
+
exports.sortTableColumnUpdater = sortTableColumnUpdater;
|
|
66
|
+
exports.syncTimeFilterWithLayerTimelineUpdater = syncTimeFilterWithLayerTimelineUpdater;
|
|
67
|
+
exports.toggleEditorVisibilityUpdater = toggleEditorVisibilityUpdater;
|
|
68
|
+
exports.toggleSplitMapUpdater = exports.toggleLayerForMapUpdater = exports.toggleLayerAnimationUpdater = exports.toggleLayerAnimationControlUpdater = exports.toggleFilterFeatureUpdater = exports.toggleFilterAnimationUpdater = void 0;
|
|
69
|
+
exports.updateAllLayerDomainData = updateAllLayerDomainData;
|
|
70
|
+
exports.updateAnimationDomain = updateAnimationDomain;
|
|
71
|
+
exports.updateDatasetPropsUpdater = updateDatasetPropsUpdater;
|
|
72
|
+
exports.updateEffectUpdater = void 0;
|
|
73
|
+
exports.updateFileLoadingProgressUpdater = updateFileLoadingProgressUpdater;
|
|
74
|
+
exports.updateOverlayBlendingUpdater = exports.updateLayerBlendingUpdater = exports.updateLayerAnimationSpeedUpdater = exports.updateFilterAnimationSpeedUpdater = void 0;
|
|
75
|
+
exports.updateStateOnLayerVisibilityChange = updateStateOnLayerVisibilityChange;
|
|
76
|
+
exports.updateStateWithLayerAndData = updateStateWithLayerAndData;
|
|
77
|
+
exports.updateVisDataUpdater = exports.updateTableColorUpdater = void 0;
|
|
78
|
+
var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
|
|
79
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
80
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
81
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
82
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
83
|
+
var _bbox = _interopRequireDefault(require("@turf/bbox"));
|
|
84
|
+
var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
|
|
85
|
+
var _deepmerge = _interopRequireDefault(require("deepmerge"));
|
|
86
|
+
var _window = require("global/window");
|
|
87
|
+
var _lodash = _interopRequireDefault(require("lodash.clonedeep"));
|
|
88
|
+
var _lodash2 = _interopRequireDefault(require("lodash.get"));
|
|
89
|
+
var _lodash3 = _interopRequireDefault(require("lodash.isequal"));
|
|
90
|
+
var _lodash4 = _interopRequireDefault(require("lodash.pick"));
|
|
91
|
+
var _lodash5 = _interopRequireDefault(require("lodash.uniq"));
|
|
92
|
+
var _lodash6 = _interopRequireDefault(require("lodash.xor"));
|
|
93
|
+
var _tasks = _interopRequireWildcard(require("react-palm/tasks"));
|
|
94
|
+
var _tasks2 = require("@kepler.gl/tasks");
|
|
95
|
+
var _actions = require("@kepler.gl/actions");
|
|
96
|
+
var _utils = require("@kepler.gl/utils");
|
|
97
|
+
var _commonUtils = require("@kepler.gl/common-utils");
|
|
98
|
+
var _constants = require("@kepler.gl/constants");
|
|
99
|
+
var _layers = require("@kepler.gl/layers");
|
|
100
|
+
var _composerHelpers = require("./composer-helpers");
|
|
101
|
+
var _mergerHandler = require("./merger-handler");
|
|
102
|
+
var _visStateMerger = require("./vis-state-merger");
|
|
103
|
+
var _schemas = _interopRequireDefault(require("@kepler.gl/schemas"));
|
|
104
|
+
var _table = require("@kepler.gl/table");
|
|
105
|
+
var _interactionUtils = require("./interaction-utils");
|
|
106
|
+
var _layerUtils = require("./layer-utils");
|
|
107
|
+
var _effects = require("@kepler.gl/effects");
|
|
108
|
+
var _dataUtils = require("./data-utils");
|
|
109
|
+
var _excluded = ["dataId"],
|
|
110
|
+
_excluded2 = ["info"];
|
|
111
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
112
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
113
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
114
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
115
|
+
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; } } }; }
|
|
116
|
+
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; } }
|
|
117
|
+
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; }
|
|
118
|
+
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; }
|
|
119
|
+
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
|
|
120
|
+
// Copyright contributors to the kepler.gl project
|
|
121
|
+
// Tasks
|
|
122
|
+
// Actions
|
|
123
|
+
// Utils
|
|
124
|
+
// Mergers
|
|
125
|
+
// react-palm
|
|
126
|
+
// disable capture exception for react-palm call to withTask
|
|
127
|
+
(0, _tasks.disableStackCapturing)();
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Updaters for `visState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
|
|
131
|
+
* Read more about [Using updaters](../advanced-usage/using-updaters.md)
|
|
132
|
+
*
|
|
133
|
+
* @public
|
|
134
|
+
* @example
|
|
135
|
+
*
|
|
136
|
+
* import keplerGlReducer, {visStateUpdaters} from 'kepler.gl/reducers';
|
|
137
|
+
* // Root Reducer
|
|
138
|
+
* const reducers = combineReducers({
|
|
139
|
+
* keplerGl: keplerGlReducer,
|
|
140
|
+
* app: appReducer
|
|
141
|
+
* });
|
|
142
|
+
*
|
|
143
|
+
* const composedReducer = (state, action) => {
|
|
144
|
+
* switch (action.type) {
|
|
145
|
+
* case 'CLICK_BUTTON':
|
|
146
|
+
* return {
|
|
147
|
+
* ...state,
|
|
148
|
+
* keplerGl: {
|
|
149
|
+
* ...state.keplerGl,
|
|
150
|
+
* foo: {
|
|
151
|
+
* ...state.keplerGl.foo,
|
|
152
|
+
* visState: visStateUpdaters.enlargeFilterUpdater(
|
|
153
|
+
* state.keplerGl.foo.visState,
|
|
154
|
+
* {idx: 0}
|
|
155
|
+
* )
|
|
156
|
+
* }
|
|
157
|
+
* }
|
|
158
|
+
* };
|
|
159
|
+
* }
|
|
160
|
+
* return reducers(state, action);
|
|
161
|
+
* };
|
|
162
|
+
*
|
|
163
|
+
* export default composedReducer;
|
|
164
|
+
*/
|
|
165
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
166
|
+
// @ts-ignore
|
|
167
|
+
var visStateUpdaters = null;
|
|
168
|
+
/* eslint-enable @typescript-eslint/no-unused-vars */
|
|
169
|
+
|
|
170
|
+
var defaultInteractionConfig = exports.defaultInteractionConfig = {
|
|
171
|
+
tooltip: {
|
|
172
|
+
id: 'tooltip',
|
|
173
|
+
label: 'interactions.tooltip',
|
|
174
|
+
enabled: true,
|
|
175
|
+
config: {
|
|
176
|
+
fieldsToShow: {},
|
|
177
|
+
compareMode: false,
|
|
178
|
+
compareType: _constants.COMPARE_TYPES.ABSOLUTE
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
geocoder: {
|
|
182
|
+
id: 'geocoder',
|
|
183
|
+
label: 'interactions.geocoder',
|
|
184
|
+
enabled: false,
|
|
185
|
+
position: null
|
|
186
|
+
},
|
|
187
|
+
brush: {
|
|
188
|
+
id: 'brush',
|
|
189
|
+
label: 'interactions.brush',
|
|
190
|
+
enabled: false,
|
|
191
|
+
config: {
|
|
192
|
+
// size is in km
|
|
193
|
+
size: 0.5
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
coordinate: {
|
|
197
|
+
id: 'coordinate',
|
|
198
|
+
label: 'interactions.coordinate',
|
|
199
|
+
enabled: false,
|
|
200
|
+
position: null
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
var DEFAULT_ANIMATION_CONFIG = exports.DEFAULT_ANIMATION_CONFIG = {
|
|
204
|
+
domain: null,
|
|
205
|
+
currentTime: null,
|
|
206
|
+
speed: 1,
|
|
207
|
+
isAnimating: false,
|
|
208
|
+
timeSteps: null,
|
|
209
|
+
timeFormat: null,
|
|
210
|
+
timezone: null,
|
|
211
|
+
defaultTimeFormat: null,
|
|
212
|
+
hideControl: false,
|
|
213
|
+
duration: null
|
|
214
|
+
};
|
|
215
|
+
var DEFAULT_EDITOR = exports.DEFAULT_EDITOR = {
|
|
216
|
+
mode: _constants.EDITOR_MODES.DRAW_POLYGON,
|
|
217
|
+
features: [],
|
|
218
|
+
selectedFeature: null,
|
|
219
|
+
visible: true
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Default initial `visState`
|
|
224
|
+
* @memberof visStateUpdaters
|
|
225
|
+
* @constant
|
|
226
|
+
* @public
|
|
227
|
+
*/
|
|
228
|
+
var INITIAL_VIS_STATE = exports.INITIAL_VIS_STATE = {
|
|
229
|
+
// map info
|
|
230
|
+
mapInfo: {
|
|
231
|
+
title: '',
|
|
232
|
+
description: ''
|
|
233
|
+
},
|
|
234
|
+
// layers
|
|
235
|
+
layers: [],
|
|
236
|
+
layerData: [],
|
|
237
|
+
layerToBeMerged: [],
|
|
238
|
+
layerOrder: [],
|
|
239
|
+
// filters
|
|
240
|
+
filters: [],
|
|
241
|
+
filterToBeMerged: [],
|
|
242
|
+
// a collection of multiple dataset
|
|
243
|
+
datasets: {},
|
|
244
|
+
editingDataset: undefined,
|
|
245
|
+
// effects
|
|
246
|
+
effects: [],
|
|
247
|
+
effectOrder: [],
|
|
248
|
+
interactionConfig: defaultInteractionConfig,
|
|
249
|
+
interactionToBeMerged: {},
|
|
250
|
+
layerBlending: 'normal',
|
|
251
|
+
overlayBlending: 'normal',
|
|
252
|
+
hoverInfo: undefined,
|
|
253
|
+
clicked: undefined,
|
|
254
|
+
mousePos: {},
|
|
255
|
+
maxDefaultTooltips: _constants.MAX_DEFAULT_TOOLTIPS,
|
|
256
|
+
// this is used when user split maps
|
|
257
|
+
splitMaps: [
|
|
258
|
+
// this will contain a list of objects to
|
|
259
|
+
// describe the state of layer availability and visibility for each map
|
|
260
|
+
// [
|
|
261
|
+
// {
|
|
262
|
+
// layers: {layer_id: true | false}
|
|
263
|
+
// }
|
|
264
|
+
// ]
|
|
265
|
+
],
|
|
266
|
+
splitMapsToBeMerged: [],
|
|
267
|
+
isMergingDatasets: {},
|
|
268
|
+
// defaults layer classes
|
|
269
|
+
layerClasses: _layers.LayerClasses,
|
|
270
|
+
// default animation
|
|
271
|
+
// time in unix timestamp (milliseconds) (the number of seconds since the Unix Epoch)
|
|
272
|
+
animationConfig: DEFAULT_ANIMATION_CONFIG,
|
|
273
|
+
editor: DEFAULT_EDITOR,
|
|
274
|
+
fileLoading: false,
|
|
275
|
+
fileLoadingProgress: {},
|
|
276
|
+
loaders: [],
|
|
277
|
+
loadOptions: {},
|
|
278
|
+
// visStateMergers
|
|
279
|
+
mergers: _visStateMerger.VIS_STATE_MERGERS,
|
|
280
|
+
// kepler schemas
|
|
281
|
+
schema: _schemas["default"]
|
|
282
|
+
};
|
|
283
|
+
/**
|
|
284
|
+
* Update state with updated layer and layerData
|
|
285
|
+
*
|
|
286
|
+
*/
|
|
287
|
+
function updateStateWithLayerAndData(state, _ref) {
|
|
288
|
+
var layerData = _ref.layerData,
|
|
289
|
+
layer = _ref.layer,
|
|
290
|
+
idx = _ref.idx;
|
|
291
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
292
|
+
layers: state.layers.map(function (lyr, i) {
|
|
293
|
+
return i === idx ? layer : lyr;
|
|
294
|
+
}),
|
|
295
|
+
layerData: layerData ? state.layerData.map(function (d, i) {
|
|
296
|
+
return i === idx ? layerData : d;
|
|
297
|
+
}) : state.layerData
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
function updateStateOnLayerVisibilityChange(state, layer) {
|
|
301
|
+
var newState = state;
|
|
302
|
+
if (state.splitMaps.length) {
|
|
303
|
+
newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
304
|
+
splitMaps: layer.config.isVisible ? (0, _utils.addNewLayersToSplitMap)(state.splitMaps, layer) : (0, _utils.removeLayerFromSplitMaps)(state.splitMaps, layer)
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
if (layer.config.animation.enabled) {
|
|
308
|
+
newState = updateAnimationDomain(newState);
|
|
309
|
+
}
|
|
310
|
+
return newState;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Compares two objects (or arrays) and returns a new object with only the
|
|
315
|
+
* properties that have changed between the two objects.
|
|
316
|
+
*/
|
|
317
|
+
function pickChangedProps(prev, next) {
|
|
318
|
+
var changedProps = {};
|
|
319
|
+
var pickPropsOf = function pickPropsOf(obj) {
|
|
320
|
+
Object.keys(obj).forEach(function (key) {
|
|
321
|
+
if (!Object.prototype.hasOwnProperty.call(changedProps, key) && !(0, _lodash3["default"])(prev[key], next[key])) {
|
|
322
|
+
changedProps[key] = next[key];
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
};
|
|
326
|
+
pickPropsOf(prev);
|
|
327
|
+
pickPropsOf(next);
|
|
328
|
+
return changedProps;
|
|
329
|
+
}
|
|
330
|
+
var VISUAL_CHANNEL_PROP_TYPES = ['field', 'scale', 'domain', 'aggregation'];
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Apply layer config
|
|
334
|
+
* @memberof visStateUpdaters
|
|
335
|
+
* @returns nextState
|
|
336
|
+
*/
|
|
337
|
+
// eslint-disable-next-line complexity, max-statements
|
|
338
|
+
function applyLayerConfigUpdater(state, action) {
|
|
339
|
+
var _serializeLayer;
|
|
340
|
+
var oldLayerId = action.oldLayerId,
|
|
341
|
+
newLayerConfig = action.newLayerConfig,
|
|
342
|
+
layerIndex = action.layerIndex;
|
|
343
|
+
var newParsedLayer =
|
|
344
|
+
// will move visualChannels to the config prop
|
|
345
|
+
(0, _visStateMerger.parseLayerConfig)(state.schema, newLayerConfig);
|
|
346
|
+
var oldLayer = state.layers.find(function (l) {
|
|
347
|
+
return l.id === oldLayerId;
|
|
348
|
+
});
|
|
349
|
+
if (!oldLayer || !newParsedLayer) {
|
|
350
|
+
return state;
|
|
351
|
+
}
|
|
352
|
+
if (layerIndex !== null && layerIndex !== undefined && state.layers[layerIndex] !== oldLayer) {
|
|
353
|
+
// layerIndex is provided, but it doesn't match the oldLayer
|
|
354
|
+
return state;
|
|
355
|
+
}
|
|
356
|
+
var dataset = state.datasets[newParsedLayer.config.dataId];
|
|
357
|
+
if (!dataset) {
|
|
358
|
+
return state;
|
|
359
|
+
}
|
|
360
|
+
// Make sure the layer is valid and convert it to Layer
|
|
361
|
+
var newLayer = (0, _visStateMerger.validateLayerWithData)(dataset, newParsedLayer, state.layerClasses);
|
|
362
|
+
if (!newLayer) {
|
|
363
|
+
return state;
|
|
364
|
+
}
|
|
365
|
+
var nextState = state;
|
|
366
|
+
if (newLayer.type && newLayer.type !== oldLayer.type) {
|
|
367
|
+
var oldLayerIndex = state.layers.findIndex(function (l) {
|
|
368
|
+
return l.id === oldLayerId;
|
|
369
|
+
});
|
|
370
|
+
if (oldLayerIndex >= 0) {
|
|
371
|
+
nextState = layerTypeChangeUpdater(nextState, (0, _actions.layerTypeChange)(oldLayer, newLayer.type));
|
|
372
|
+
// layerTypeChangeUpdater changes the id of the layer, so we need to obtain the new id
|
|
373
|
+
// but first make sure that the layer was not removed
|
|
374
|
+
if (nextState.layers.length === state.layers.length) {
|
|
375
|
+
var newLayerId = nextState.layers[oldLayerIndex].id;
|
|
376
|
+
nextState = applyLayerConfigUpdater(nextState, (0, _actions.applyLayerConfig)(newLayerId, _objectSpread(_objectSpread({}, newLayerConfig), {}, {
|
|
377
|
+
id: newLayerId
|
|
378
|
+
})));
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return nextState;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// serializeLayer() might return null if the old layer is not valid,
|
|
385
|
+
// we should still apply the changes in that case
|
|
386
|
+
var serializedOldLayer = (_serializeLayer = (0, _visStateMerger.serializeLayer)(oldLayer, state.schema)) !== null && _serializeLayer !== void 0 ? _serializeLayer : {
|
|
387
|
+
config: {}
|
|
388
|
+
};
|
|
389
|
+
var serializedNewLayer = (0, _visStateMerger.serializeLayer)(newLayer, state.schema);
|
|
390
|
+
if (!serializedNewLayer) {
|
|
391
|
+
return state;
|
|
392
|
+
}
|
|
393
|
+
if (!(0, _lodash3["default"])(serializedOldLayer, serializedNewLayer)) {
|
|
394
|
+
var changed = pickChangedProps(serializedOldLayer.config, serializedNewLayer.config);
|
|
395
|
+
if ('visConfig' in changed) {
|
|
396
|
+
if (changed.visConfig) {
|
|
397
|
+
nextState = layerVisConfigChangeUpdater(nextState, (0, _actions.layerVisConfigChange)(oldLayer, changed.visConfig));
|
|
398
|
+
}
|
|
399
|
+
delete changed.visConfig;
|
|
400
|
+
}
|
|
401
|
+
Object.keys(oldLayer.visualChannels).forEach(function (channelName) {
|
|
402
|
+
var channel = oldLayer.visualChannels[channelName];
|
|
403
|
+
var channelPropNames = VISUAL_CHANNEL_PROP_TYPES.map(function (prop) {
|
|
404
|
+
return channel[prop];
|
|
405
|
+
});
|
|
406
|
+
if (channelPropNames.some(function (prop) {
|
|
407
|
+
return prop in changed;
|
|
408
|
+
})) {
|
|
409
|
+
nextState = layerVisualChannelChangeUpdater(nextState, (0, _actions.layerVisualChannelConfigChange)(oldLayer, (0, _lodash4["default"])(newLayer.config, channelPropNames), channelName));
|
|
410
|
+
var _iterator = _createForOfIteratorHelper(channelPropNames),
|
|
411
|
+
_step;
|
|
412
|
+
try {
|
|
413
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
414
|
+
var prop = _step.value;
|
|
415
|
+
delete changed[prop];
|
|
416
|
+
}
|
|
417
|
+
} catch (err) {
|
|
418
|
+
_iterator.e(err);
|
|
419
|
+
} finally {
|
|
420
|
+
_iterator.f();
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
if (Object.keys(changed).length > 0) {
|
|
425
|
+
nextState = layerConfigChangeUpdater(nextState, (0, _actions.layerConfigChange)(oldLayer, (0, _lodash4["default"])(newLayer.config, Object.keys(changed))));
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return nextState;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Update layer base config: dataId, label, column, isVisible
|
|
433
|
+
* @memberof visStateUpdaters
|
|
434
|
+
* @returns nextState
|
|
435
|
+
*/
|
|
436
|
+
// eslint-disable-next-line complexity
|
|
437
|
+
function layerConfigChangeUpdater(state, action) {
|
|
438
|
+
var oldLayer = action.oldLayer;
|
|
439
|
+
var idx = state.layers.findIndex(function (l) {
|
|
440
|
+
return l.id === oldLayer.id;
|
|
441
|
+
});
|
|
442
|
+
var props = Object.keys(action.newConfig);
|
|
443
|
+
if (typeof action.newConfig.dataId === 'string' && action.newConfig.dataId !== oldLayer.config.dataId) {
|
|
444
|
+
var _action$newConfig = action.newConfig,
|
|
445
|
+
dataId = _action$newConfig.dataId,
|
|
446
|
+
restConfig = (0, _objectWithoutProperties2["default"])(_action$newConfig, _excluded);
|
|
447
|
+
var stateWithDataId = layerDataIdChangeUpdater(state, {
|
|
448
|
+
oldLayer: oldLayer,
|
|
449
|
+
newConfig: {
|
|
450
|
+
dataId: dataId
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
var nextLayer = stateWithDataId.layers.find(function (l) {
|
|
454
|
+
return l.id === oldLayer.id;
|
|
455
|
+
});
|
|
456
|
+
return nextLayer && Object.keys(restConfig).length ? layerConfigChangeUpdater(stateWithDataId, {
|
|
457
|
+
oldLayer: nextLayer,
|
|
458
|
+
newConfig: restConfig
|
|
459
|
+
}) : stateWithDataId;
|
|
460
|
+
}
|
|
461
|
+
var newLayer = oldLayer.updateLayerConfig(action.newConfig);
|
|
462
|
+
var layerData;
|
|
463
|
+
if (newLayer.shouldCalculateLayerData(props)) {
|
|
464
|
+
var oldLayerData = state.layerData[idx];
|
|
465
|
+
var updateLayerDataResult = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData);
|
|
466
|
+
newLayer = updateLayerDataResult.layer;
|
|
467
|
+
layerData = updateLayerDataResult.layerData;
|
|
468
|
+
}
|
|
469
|
+
var newState = state;
|
|
470
|
+
if ('isVisible' in action.newConfig) {
|
|
471
|
+
newState = updateStateOnLayerVisibilityChange(state, newLayer);
|
|
472
|
+
var filterIndex = filterSyncedWithTimeline(state);
|
|
473
|
+
if ((0, _utils.isLayerAnimatable)(newLayer) && filterIndex !== -1) {
|
|
474
|
+
// if layer is going to be visible we sync with filter otherwise we need to check whether other animatable layers exists and are visible
|
|
475
|
+
newState = syncTimeFilterWithLayerTimelineUpdater(newState, {
|
|
476
|
+
idx: filterIndex,
|
|
477
|
+
enable: action.newConfig.isVisible ? action.newConfig.isVisible : (0, _utils.getAnimatableVisibleLayers)(state.layers).length > 0
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
if ('columns' in action.newConfig && newLayer.config.animation.enabled) {
|
|
482
|
+
// TODO: Shan, make the animation config function more robust
|
|
483
|
+
newState = updateAnimationDomain(newState);
|
|
484
|
+
}
|
|
485
|
+
return updateStateWithLayerAndData(newState, {
|
|
486
|
+
layer: newLayer,
|
|
487
|
+
layerData: layerData,
|
|
488
|
+
idx: idx
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
function layerAnimationChangeUpdater(state, action) {
|
|
492
|
+
var oldLayer = action.oldLayer,
|
|
493
|
+
prop = action.prop,
|
|
494
|
+
value = action.value;
|
|
495
|
+
var idx = state.layers.findIndex(function (l) {
|
|
496
|
+
return l.id === oldLayer.id;
|
|
497
|
+
});
|
|
498
|
+
var newLayer = oldLayer.updateLayerConfig({
|
|
499
|
+
animation: _objectSpread(_objectSpread({}, oldLayer.config.animation), {}, (0, _defineProperty2["default"])({}, prop, value))
|
|
500
|
+
});
|
|
501
|
+
var _calculateLayerData = (0, _layerUtils.calculateLayerData)(newLayer, state, state.layerData[idx]),
|
|
502
|
+
layerData = _calculateLayerData.layerData,
|
|
503
|
+
layer = _calculateLayerData.layer;
|
|
504
|
+
return updateStateWithLayerAndData(state, {
|
|
505
|
+
layerData: layerData,
|
|
506
|
+
layer: layer,
|
|
507
|
+
idx: idx
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
*
|
|
513
|
+
* @param state
|
|
514
|
+
* @returns index of the filter synced to timeline or -1
|
|
515
|
+
*/
|
|
516
|
+
function filterSyncedWithTimeline(state) {
|
|
517
|
+
return state.filters.findIndex(function (f) {
|
|
518
|
+
return f.syncedWithLayerTimeline;
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* Updates isValid flag of a layer.
|
|
524
|
+
* Updates isVisible based on the value of isValid.
|
|
525
|
+
* Triggers update of data for the layer in order to get errors again during next update iteration.
|
|
526
|
+
* @memberof visStateUpdaters
|
|
527
|
+
* @returns nextState
|
|
528
|
+
*/
|
|
529
|
+
function layerSetIsValidUpdater(state, action) {
|
|
530
|
+
var oldLayer = action.oldLayer,
|
|
531
|
+
isValid = action.isValid;
|
|
532
|
+
var idx = state.layers.findIndex(function (l) {
|
|
533
|
+
return l.id === oldLayer.id;
|
|
534
|
+
});
|
|
535
|
+
var layerToUpdate = state.layers[idx];
|
|
536
|
+
if (layerToUpdate) {
|
|
537
|
+
var newLayer;
|
|
538
|
+
var newData = null;
|
|
539
|
+
if (isValid) {
|
|
540
|
+
// Trigger data update in order to show errors again if present.
|
|
541
|
+
var _calculateLayerData2 = (0, _layerUtils.calculateLayerData)(layerToUpdate, state, undefined),
|
|
542
|
+
layer = _calculateLayerData2.layer,
|
|
543
|
+
layerData = _calculateLayerData2.layerData;
|
|
544
|
+
newLayer = layer;
|
|
545
|
+
newData = layerData;
|
|
546
|
+
} else {
|
|
547
|
+
newLayer = layerToUpdate.updateLayerConfig({
|
|
548
|
+
isVisible: false
|
|
549
|
+
});
|
|
550
|
+
newLayer.isValid = false;
|
|
551
|
+
}
|
|
552
|
+
return updateStateWithLayerAndData(state, {
|
|
553
|
+
idx: idx,
|
|
554
|
+
layer: newLayer,
|
|
555
|
+
layerData: newData
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
return state;
|
|
559
|
+
}
|
|
560
|
+
function addOrRemoveTextLabels(newFields, textLabel) {
|
|
561
|
+
var defaultTextLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _constants.DEFAULT_TEXT_LABEL;
|
|
562
|
+
var newTextLabel = textLabel.slice();
|
|
563
|
+
var currentFields = textLabel.map(function (tl) {
|
|
564
|
+
return tl.field && tl.field.name;
|
|
565
|
+
}).filter(function (d) {
|
|
566
|
+
return d;
|
|
567
|
+
});
|
|
568
|
+
var addFields = newFields.filter(function (f) {
|
|
569
|
+
return !currentFields.includes(f.name);
|
|
570
|
+
});
|
|
571
|
+
var deleteFields = currentFields.filter(function (f) {
|
|
572
|
+
return !newFields.find(function (fd) {
|
|
573
|
+
return fd.name === f;
|
|
574
|
+
});
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
// delete
|
|
578
|
+
newTextLabel = newTextLabel.filter(function (tl) {
|
|
579
|
+
return tl.field && !deleteFields.includes(tl.field.name);
|
|
580
|
+
});
|
|
581
|
+
newTextLabel = !newTextLabel.length ? [defaultTextLabel] : newTextLabel;
|
|
582
|
+
|
|
583
|
+
// add
|
|
584
|
+
newTextLabel = [].concat((0, _toConsumableArray2["default"])(newTextLabel.filter(function (tl) {
|
|
585
|
+
return tl.field;
|
|
586
|
+
})), (0, _toConsumableArray2["default"])(addFields.map(function (af) {
|
|
587
|
+
return _objectSpread(_objectSpread({}, defaultTextLabel), {}, {
|
|
588
|
+
field: af
|
|
589
|
+
});
|
|
590
|
+
})));
|
|
591
|
+
return newTextLabel;
|
|
592
|
+
}
|
|
593
|
+
function updateTextLabelPropAndValue(idx, prop, value, textLabel) {
|
|
594
|
+
if (!Object.prototype.hasOwnProperty.call(textLabel[idx], prop)) {
|
|
595
|
+
return textLabel;
|
|
596
|
+
}
|
|
597
|
+
var newTextLabel = textLabel.slice();
|
|
598
|
+
if (prop === 'field' && value === null && textLabel.length > 1) {
|
|
599
|
+
// remove label when field value is set to null
|
|
600
|
+
newTextLabel.splice(idx, 1);
|
|
601
|
+
} else if (prop) {
|
|
602
|
+
newTextLabel = textLabel.map(function (tl, i) {
|
|
603
|
+
return i === idx ? _objectSpread(_objectSpread({}, tl), {}, (0, _defineProperty2["default"])({}, prop, value)) : tl;
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
return newTextLabel;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/**
|
|
610
|
+
* Update layer base config: dataId, label, column, isVisible
|
|
611
|
+
* @memberof visStateUpdaters
|
|
612
|
+
* @returns nextState
|
|
613
|
+
*/
|
|
614
|
+
function layerTextLabelChangeUpdater(state, action) {
|
|
615
|
+
var _oldLayer$getDefaultL, _oldLayer$getDefaultL2;
|
|
616
|
+
var oldLayer = action.oldLayer,
|
|
617
|
+
idx = action.idx,
|
|
618
|
+
prop = action.prop,
|
|
619
|
+
value = action.value;
|
|
620
|
+
var textLabel = oldLayer.config.textLabel;
|
|
621
|
+
|
|
622
|
+
// when adding a new empty text label,
|
|
623
|
+
// rely on the layer's default config, or use the constant DEFAULT_TEXT_LABEL
|
|
624
|
+
var defaultTextLabel = (_oldLayer$getDefaultL = (_oldLayer$getDefaultL2 = oldLayer.getDefaultLayerConfig({
|
|
625
|
+
dataId: ''
|
|
626
|
+
})) === null || _oldLayer$getDefaultL2 === void 0 || (_oldLayer$getDefaultL2 = _oldLayer$getDefaultL2.textLabel) === null || _oldLayer$getDefaultL2 === void 0 ? void 0 : _oldLayer$getDefaultL2[0]) !== null && _oldLayer$getDefaultL !== void 0 ? _oldLayer$getDefaultL : _constants.DEFAULT_TEXT_LABEL;
|
|
627
|
+
var newTextLabel = textLabel.slice();
|
|
628
|
+
if (!textLabel[idx] && idx === textLabel.length) {
|
|
629
|
+
// if idx is set to length, add empty text label
|
|
630
|
+
newTextLabel = [].concat((0, _toConsumableArray2["default"])(textLabel), [defaultTextLabel]);
|
|
631
|
+
}
|
|
632
|
+
if (idx === 'all' && prop === 'fields') {
|
|
633
|
+
newTextLabel = addOrRemoveTextLabels(value, textLabel, defaultTextLabel);
|
|
634
|
+
} else {
|
|
635
|
+
newTextLabel = updateTextLabelPropAndValue(idx, prop, value, newTextLabel);
|
|
636
|
+
}
|
|
637
|
+
// update text label prop and value
|
|
638
|
+
return layerConfigChangeUpdater(state, {
|
|
639
|
+
oldLayer: oldLayer,
|
|
640
|
+
newConfig: {
|
|
641
|
+
textLabel: newTextLabel
|
|
642
|
+
}
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
function validateExistingLayerWithData(dataset, layerClasses, layer, schema) {
|
|
646
|
+
var loadedLayer = (0, _visStateMerger.serializeLayer)(layer, schema);
|
|
647
|
+
return loadedLayer ? (0, _visStateMerger.validateLayerWithData)(dataset, loadedLayer, layerClasses, {
|
|
648
|
+
allowEmptyColumn: true
|
|
649
|
+
}) : null;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
/**
|
|
653
|
+
* Update layer config dataId
|
|
654
|
+
* @memberof visStateUpdaters
|
|
655
|
+
* @returns nextState
|
|
656
|
+
*/
|
|
657
|
+
function layerDataIdChangeUpdater(state, action) {
|
|
658
|
+
var oldLayer = action.oldLayer,
|
|
659
|
+
newConfig = action.newConfig;
|
|
660
|
+
var dataId = newConfig.dataId;
|
|
661
|
+
if (!oldLayer || !state.datasets[dataId]) {
|
|
662
|
+
return state;
|
|
663
|
+
}
|
|
664
|
+
var idx = state.layers.findIndex(function (l) {
|
|
665
|
+
return l.id === oldLayer.id;
|
|
666
|
+
});
|
|
667
|
+
var newLayer = oldLayer.updateLayerConfig({
|
|
668
|
+
dataId: dataId
|
|
669
|
+
});
|
|
670
|
+
|
|
671
|
+
// this may happen when a layer is new (type: null and no columns) but it's not ready to be saved
|
|
672
|
+
if (newLayer.isValidToSave()) {
|
|
673
|
+
var validated = validateExistingLayerWithData(state.datasets[dataId], state.layerClasses, newLayer, state.schema);
|
|
674
|
+
// if cant validate it with data create a new one
|
|
675
|
+
if (!validated) {
|
|
676
|
+
var oldLayerType = oldLayer.type;
|
|
677
|
+
if (oldLayerType) {
|
|
678
|
+
newLayer = new state.layerClasses[oldLayerType]({
|
|
679
|
+
dataId: dataId,
|
|
680
|
+
id: oldLayer.id
|
|
681
|
+
});
|
|
682
|
+
}
|
|
683
|
+
} else {
|
|
684
|
+
newLayer = validated;
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
newLayer = newLayer.updateLayerConfig({
|
|
688
|
+
isVisible: oldLayer.config.isVisible,
|
|
689
|
+
isConfigActive: true
|
|
690
|
+
});
|
|
691
|
+
newLayer.updateLayerDomain(state.datasets);
|
|
692
|
+
var _calculateLayerData3 = (0, _layerUtils.calculateLayerData)(newLayer, state, undefined),
|
|
693
|
+
layerData = _calculateLayerData3.layerData,
|
|
694
|
+
layer = _calculateLayerData3.layer;
|
|
695
|
+
return updateStateWithLayerAndData(state, {
|
|
696
|
+
layerData: layerData,
|
|
697
|
+
layer: layer,
|
|
698
|
+
idx: idx
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
function setInitialLayerConfig(layer, datasets, layerClasses) {
|
|
702
|
+
var newLayer = layer;
|
|
703
|
+
if (!Object.keys(datasets).length) {
|
|
704
|
+
// no data is loaded
|
|
705
|
+
return layer;
|
|
706
|
+
}
|
|
707
|
+
if (!layer.config.dataId) {
|
|
708
|
+
// set layer dataId
|
|
709
|
+
newLayer = layer.updateLayerConfig({
|
|
710
|
+
dataId: Object.keys(datasets)[0]
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
var dataset = datasets[newLayer.config.dataId];
|
|
714
|
+
if (!dataset) {
|
|
715
|
+
return layer;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
// find defaut layer props
|
|
719
|
+
var result = typeof layerClasses[newLayer.type].findDefaultLayerProps === 'function' ? layerClasses[newLayer.type].findDefaultLayerProps(dataset, []) : {
|
|
720
|
+
props: []
|
|
721
|
+
};
|
|
722
|
+
|
|
723
|
+
// an array of possible props, use 1st one
|
|
724
|
+
var props = Array.isArray(result) ? result : result.props || [];
|
|
725
|
+
if (props.length) {
|
|
726
|
+
newLayer = new layerClasses[layer.type](_objectSpread(_objectSpread({}, props[0]), {}, {
|
|
727
|
+
label: newLayer.config.label,
|
|
728
|
+
dataId: newLayer.config.dataId,
|
|
729
|
+
isConfigActive: newLayer.config.isConfigActive
|
|
730
|
+
}));
|
|
731
|
+
}
|
|
732
|
+
return typeof newLayer.setInitialLayerConfig === 'function' ? newLayer.setInitialLayerConfig(dataset) : newLayer;
|
|
733
|
+
}
|
|
734
|
+
/**
|
|
735
|
+
* Update layer type. Previews layer config will be copied if applicable.
|
|
736
|
+
* @memberof visStateUpdaters
|
|
737
|
+
* @public
|
|
738
|
+
*/
|
|
739
|
+
function layerTypeChangeUpdater(state, action) {
|
|
740
|
+
var oldLayer = action.oldLayer,
|
|
741
|
+
newType = action.newType;
|
|
742
|
+
if (!oldLayer) {
|
|
743
|
+
return state;
|
|
744
|
+
}
|
|
745
|
+
var oldId = oldLayer.id;
|
|
746
|
+
var idx = state.layers.findIndex(function (l) {
|
|
747
|
+
return l.id === oldId;
|
|
748
|
+
});
|
|
749
|
+
if (!state.layerClasses[newType]) {
|
|
750
|
+
_window.console.error("".concat(newType, " is not a valid layer type"));
|
|
751
|
+
return state;
|
|
752
|
+
}
|
|
753
|
+
var newLayer = new state.layerClasses[newType]({
|
|
754
|
+
// keep old layer lable and isConfigActive
|
|
755
|
+
label: oldLayer.config.label,
|
|
756
|
+
isConfigActive: oldLayer.config.isConfigActive,
|
|
757
|
+
dataId: oldLayer.config.dataId
|
|
758
|
+
});
|
|
759
|
+
if (!oldLayer.type) {
|
|
760
|
+
// if setting layer type on an empty layer
|
|
761
|
+
newLayer = setInitialLayerConfig(newLayer, state.datasets, state.layerClasses);
|
|
762
|
+
} else {
|
|
763
|
+
// get a mint layer, with new id and type
|
|
764
|
+
// because deck.gl uses id to match between new and old layer.
|
|
765
|
+
// If type has changed but id is the same, it will break
|
|
766
|
+
newLayer.assignConfigToLayer(oldLayer.config, oldLayer.visConfigSettings);
|
|
767
|
+
newLayer.updateLayerDomain(state.datasets);
|
|
768
|
+
}
|
|
769
|
+
var clicked = state.clicked,
|
|
770
|
+
hoverInfo = state.hoverInfo;
|
|
771
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
772
|
+
clicked: oldLayer.isLayerHovered(clicked) ? undefined : clicked,
|
|
773
|
+
hoverInfo: oldLayer.isLayerHovered(hoverInfo) ? undefined : hoverInfo
|
|
774
|
+
});
|
|
775
|
+
var _calculateLayerData4 = (0, _layerUtils.calculateLayerData)(newLayer, newState),
|
|
776
|
+
layerData = _calculateLayerData4.layerData,
|
|
777
|
+
layer = _calculateLayerData4.layer;
|
|
778
|
+
newState = updateStateWithLayerAndData(newState, {
|
|
779
|
+
layerData: layerData,
|
|
780
|
+
layer: layer,
|
|
781
|
+
idx: idx
|
|
782
|
+
});
|
|
783
|
+
if (layer.config.animation.enabled || oldLayer.config.animation.enabled) {
|
|
784
|
+
newState = updateAnimationDomain(newState);
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
// update splitMap layer id
|
|
788
|
+
if (state.splitMaps.length) {
|
|
789
|
+
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
790
|
+
splitMaps: newState.splitMaps.map(function (settings) {
|
|
791
|
+
var _settings$layers = settings.layers,
|
|
792
|
+
oldLayerMap = _settings$layers[oldId],
|
|
793
|
+
otherLayers = (0, _objectWithoutProperties2["default"])(_settings$layers, [oldId].map(_toPropertyKey));
|
|
794
|
+
return oldId in settings.layers ? _objectSpread(_objectSpread({}, settings), {}, {
|
|
795
|
+
layers: _objectSpread(_objectSpread({}, otherLayers), {}, (0, _defineProperty2["default"])({}, layer.id, oldLayerMap))
|
|
796
|
+
}) : settings;
|
|
797
|
+
})
|
|
798
|
+
});
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
// update layerOrder with new id
|
|
802
|
+
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
803
|
+
layerOrder: newState.layerOrder.map(function (layerId) {
|
|
804
|
+
return layerId === oldLayer.id ? newLayer.id : layerId;
|
|
805
|
+
})
|
|
806
|
+
});
|
|
807
|
+
return newState;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/**
|
|
811
|
+
* Update layer visual channel
|
|
812
|
+
* @memberof visStateUpdaters
|
|
813
|
+
* @returns {Object} nextState
|
|
814
|
+
* @public
|
|
815
|
+
*/
|
|
816
|
+
function layerVisualChannelChangeUpdater(state, action) {
|
|
817
|
+
var oldLayer = action.oldLayer,
|
|
818
|
+
newConfig = action.newConfig,
|
|
819
|
+
newVisConfig = action.newVisConfig,
|
|
820
|
+
channel = action.channel;
|
|
821
|
+
if (!oldLayer.config.dataId) {
|
|
822
|
+
return state;
|
|
823
|
+
}
|
|
824
|
+
var dataset = state.datasets[oldLayer.config.dataId];
|
|
825
|
+
var idx = state.layers.findIndex(function (l) {
|
|
826
|
+
return l.id === oldLayer.id;
|
|
827
|
+
});
|
|
828
|
+
var newLayer = oldLayer.updateLayerConfig(newConfig);
|
|
829
|
+
if (newVisConfig) newLayer = newLayer.updateLayerVisConfig(newVisConfig);
|
|
830
|
+
newLayer.updateLayerVisualChannel(dataset, channel);
|
|
831
|
+
|
|
832
|
+
// calling update animation domain first to merge all layer animation domain
|
|
833
|
+
var updatedState = updateAnimationDomain(state);
|
|
834
|
+
var oldLayerData = updatedState.layerData[idx];
|
|
835
|
+
var _calculateLayerData5 = (0, _layerUtils.calculateLayerData)(newLayer, updatedState, oldLayerData),
|
|
836
|
+
layerData = _calculateLayerData5.layerData,
|
|
837
|
+
layer = _calculateLayerData5.layer;
|
|
838
|
+
return updateStateWithLayerAndData(updatedState, {
|
|
839
|
+
layerData: layerData,
|
|
840
|
+
layer: layer,
|
|
841
|
+
idx: idx
|
|
842
|
+
});
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
/**
|
|
846
|
+
* Update layer `visConfig`
|
|
847
|
+
* @memberof visStateUpdaters
|
|
848
|
+
* @public
|
|
849
|
+
*/
|
|
850
|
+
function layerVisConfigChangeUpdater(state, action) {
|
|
851
|
+
var oldLayer = action.oldLayer;
|
|
852
|
+
var idx = state.layers.findIndex(function (l) {
|
|
853
|
+
return l.id === oldLayer.id;
|
|
854
|
+
});
|
|
855
|
+
var props = Object.keys(action.newVisConfig);
|
|
856
|
+
var newVisConfig = _objectSpread(_objectSpread({}, oldLayer.config.visConfig), action.newVisConfig);
|
|
857
|
+
var newLayer = oldLayer.updateLayerConfig({
|
|
858
|
+
visConfig: newVisConfig
|
|
859
|
+
});
|
|
860
|
+
if (newLayer.shouldCalculateLayerData(props)) {
|
|
861
|
+
var oldLayerData = state.layerData[idx];
|
|
862
|
+
var _calculateLayerData6 = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData),
|
|
863
|
+
layerData = _calculateLayerData6.layerData,
|
|
864
|
+
layer = _calculateLayerData6.layer;
|
|
865
|
+
return updateStateWithLayerAndData(state, {
|
|
866
|
+
layerData: layerData,
|
|
867
|
+
layer: layer,
|
|
868
|
+
idx: idx
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
return updateStateWithLayerAndData(state, {
|
|
872
|
+
layer: newLayer,
|
|
873
|
+
idx: idx
|
|
874
|
+
});
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
/**
|
|
878
|
+
* Reset animation config current time to a specified value
|
|
879
|
+
* @memberof visStateUpdaters
|
|
880
|
+
* @public
|
|
881
|
+
*
|
|
882
|
+
*/
|
|
883
|
+
var setLayerAnimationTimeUpdater = exports.setLayerAnimationTimeUpdater = function setLayerAnimationTimeUpdater(state, _ref2) {
|
|
884
|
+
var value = _ref2.value;
|
|
885
|
+
var currentTime = Array.isArray(value) ? value[0] : value;
|
|
886
|
+
var nextState = _objectSpread(_objectSpread({}, state), {}, {
|
|
887
|
+
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
888
|
+
currentTime: currentTime
|
|
889
|
+
})
|
|
890
|
+
});
|
|
891
|
+
// update animation config for each layer
|
|
892
|
+
return state.layers.reduce(function (accu, l) {
|
|
893
|
+
if (l.config.animation.enabled && l.type !== 'trip') {
|
|
894
|
+
return layerAnimationChangeUpdater(accu, {
|
|
895
|
+
oldLayer: l,
|
|
896
|
+
prop: 'currentTime',
|
|
897
|
+
currentTime: currentTime
|
|
898
|
+
});
|
|
899
|
+
}
|
|
900
|
+
return accu;
|
|
901
|
+
}, nextState);
|
|
902
|
+
};
|
|
903
|
+
|
|
904
|
+
/**
|
|
905
|
+
* Update filter property
|
|
906
|
+
* @memberof visStateUpdaters
|
|
907
|
+
* @public
|
|
908
|
+
*/
|
|
909
|
+
function setFilterAnimationTimeUpdater(state, action) {
|
|
910
|
+
return setFilterUpdater(state, action);
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
/**
|
|
914
|
+
* Update filter animation window
|
|
915
|
+
* @memberof visStateUpdaters
|
|
916
|
+
* @public
|
|
917
|
+
*/
|
|
918
|
+
function setFilterAnimationWindowUpdater(state, _ref3) {
|
|
919
|
+
var id = _ref3.id,
|
|
920
|
+
animationWindow = _ref3.animationWindow;
|
|
921
|
+
var filter = state.filters.find(function (f) {
|
|
922
|
+
return f.id === id;
|
|
923
|
+
});
|
|
924
|
+
if (!filter) {
|
|
925
|
+
return state;
|
|
926
|
+
}
|
|
927
|
+
var newFilter = _objectSpread(_objectSpread({}, filter), {}, {
|
|
928
|
+
animationWindow: animationWindow
|
|
929
|
+
});
|
|
930
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
931
|
+
filters: (0, _composerHelpers.swap_)(newFilter)(state.filters)
|
|
932
|
+
});
|
|
933
|
+
var newSyncTimelineMode = getSyncAnimationMode(newFilter);
|
|
934
|
+
return setTimeFilterTimelineModeUpdater(newState, {
|
|
935
|
+
id: id,
|
|
936
|
+
mode: newSyncTimelineMode
|
|
937
|
+
});
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
/**
|
|
941
|
+
* Update filter property
|
|
942
|
+
* @memberof visStateUpdaters
|
|
943
|
+
* @public
|
|
944
|
+
*/
|
|
945
|
+
function setFilterUpdater(state, action) {
|
|
946
|
+
var idx = action.idx,
|
|
947
|
+
_action$valueIndex = action.valueIndex,
|
|
948
|
+
valueIndex = _action$valueIndex === void 0 ? 0 : _action$valueIndex;
|
|
949
|
+
var oldFilter = state.filters[idx];
|
|
950
|
+
if (!oldFilter) {
|
|
951
|
+
_window.console.error("filters.".concat(idx, " is undefined"));
|
|
952
|
+
return state;
|
|
953
|
+
}
|
|
954
|
+
if (Array.isArray(action.prop) && (!Array.isArray(action.value) || action.prop.length !== action.value.length)) {
|
|
955
|
+
_window.console.error('Expecting value to be an array of the same length, since prop is an array');
|
|
956
|
+
return state;
|
|
957
|
+
}
|
|
958
|
+
// convert prop and value to array
|
|
959
|
+
var props = (0, _commonUtils.toArray)(action.prop);
|
|
960
|
+
var values = Array.isArray(action.prop) ? (0, _commonUtils.toArray)(action.value) : [action.value];
|
|
961
|
+
var newFilter = oldFilter;
|
|
962
|
+
var newState = state;
|
|
963
|
+
var datasetIdsToFilter = [];
|
|
964
|
+
var _loop = function _loop() {
|
|
965
|
+
var prop = props[i];
|
|
966
|
+
var value = values[i];
|
|
967
|
+
// We currently do not support passing in name as an array into _updateFilterProp, so we call it multiple times with each name
|
|
968
|
+
// See the comment in there as to what should be addressed
|
|
969
|
+
var res;
|
|
970
|
+
if (prop === 'name' && Array.isArray(value)) {
|
|
971
|
+
// eslint-disable-next-line no-loop-func
|
|
972
|
+
res = value.reduce(function (accu, v) {
|
|
973
|
+
return _updateFilterProp(accu, newFilter, prop, v, valueIndex);
|
|
974
|
+
}, newState);
|
|
975
|
+
} else {
|
|
976
|
+
res = _updateFilterProp(newState, newFilter, prop, value, valueIndex);
|
|
977
|
+
}
|
|
978
|
+
newFilter = res.filter;
|
|
979
|
+
newState = res.state;
|
|
980
|
+
datasetIdsToFilter = datasetIdsToFilter.concat(res.datasetIdsToFilter);
|
|
981
|
+
};
|
|
982
|
+
for (var i = 0; i < props.length; i++) {
|
|
983
|
+
_loop();
|
|
984
|
+
}
|
|
985
|
+
var enlargedFilter = state.filters.find(function (f) {
|
|
986
|
+
return f.view === _constants.FILTER_VIEW_TYPES.enlarged;
|
|
987
|
+
});
|
|
988
|
+
if (enlargedFilter && enlargedFilter.id !== newFilter.id) {
|
|
989
|
+
// there should be only one enlarged filter
|
|
990
|
+
newFilter.view = _constants.FILTER_VIEW_TYPES.side;
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
// save new filters to newState
|
|
994
|
+
newState = (0, _utils.set)(['filters', idx], newFilter, newState);
|
|
995
|
+
|
|
996
|
+
// filter data
|
|
997
|
+
var filteredDatasets = (0, _utils.applyFiltersToDatasets)((0, _lodash5["default"])(datasetIdsToFilter), newState.datasets, newState.filters, newState.layers);
|
|
998
|
+
newState = (0, _utils.set)(['datasets'], filteredDatasets, newState);
|
|
999
|
+
|
|
1000
|
+
// need to update filterPlot after filter Dataset for plot to update on filtered result
|
|
1001
|
+
var filterWithPLot = (0, _utils.updateFilterPlot)(newState.datasets, newState.filters[idx]);
|
|
1002
|
+
newState = (0, _utils.set)(['filters', idx], filterWithPLot, newState);
|
|
1003
|
+
|
|
1004
|
+
// dataId is an array
|
|
1005
|
+
// pass only the dataset we need to update
|
|
1006
|
+
newState = updateAllLayerDomainData(newState, datasetIdsToFilter, newFilter);
|
|
1007
|
+
|
|
1008
|
+
// If time range filter value was updated, adjust animation config
|
|
1009
|
+
if (newFilter.type === _constants.FILTER_TYPES.timeRange && props.includes('value')) {
|
|
1010
|
+
newState = adjustAnimationConfigWithFilter(newState, action.idx);
|
|
1011
|
+
}
|
|
1012
|
+
return newState;
|
|
1013
|
+
}
|
|
1014
|
+
function _updateFilterDataIdAtValueIndex(filter, valueIndex, value, datasets) {
|
|
1015
|
+
var newFilter = filter;
|
|
1016
|
+
if (filter.dataId[valueIndex]) {
|
|
1017
|
+
// if dataId already exist
|
|
1018
|
+
newFilter = _removeFilterDataIdAtValueIndex(filter, valueIndex, datasets);
|
|
1019
|
+
}
|
|
1020
|
+
if (value) {
|
|
1021
|
+
var nextValue = newFilter.dataId.slice();
|
|
1022
|
+
nextValue[valueIndex] = value;
|
|
1023
|
+
newFilter = (0, _utils.set)(['dataId'], nextValue, newFilter);
|
|
1024
|
+
}
|
|
1025
|
+
return newFilter;
|
|
1026
|
+
}
|
|
1027
|
+
function _removeFilterDataIdAtValueIndex(filter, valueIndex, datasets) {
|
|
1028
|
+
var dataId = filter.dataId[valueIndex];
|
|
1029
|
+
if (filter.dataId.length === 1 && valueIndex === 0) {
|
|
1030
|
+
// if remove the only dataId, create an empty filter instead;
|
|
1031
|
+
return (0, _utils.getDefaultFilter)({
|
|
1032
|
+
id: filter.id
|
|
1033
|
+
});
|
|
1034
|
+
}
|
|
1035
|
+
if (dataId) {
|
|
1036
|
+
filter = (0, _utils.removeFilterPlot)(filter, dataId);
|
|
1037
|
+
}
|
|
1038
|
+
for (var _i = 0, _arr = ['dataId', 'name', 'fieldIdx', 'gpuChannel']; _i < _arr.length; _i++) {
|
|
1039
|
+
var prop = _arr[_i];
|
|
1040
|
+
if (Array.isArray(filter[prop])) {
|
|
1041
|
+
var nextVal = filter[prop].slice();
|
|
1042
|
+
nextVal.splice(valueIndex, 1);
|
|
1043
|
+
filter = (0, _utils.set)([prop], nextVal, filter);
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
// mergeFieldDomain for the remaining fields
|
|
1048
|
+
// @ts-expect-error figure out correct types to use with mergeFilterDomainStep
|
|
1049
|
+
var domainSteps = {};
|
|
1050
|
+
filter.dataId.forEach(function (filterDataId, idx) {
|
|
1051
|
+
var dataset = datasets[filterDataId];
|
|
1052
|
+
var filterProps = dataset.getColumnFilterProps(filter.name[idx]);
|
|
1053
|
+
// @ts-expect-error figure out correct types to use with mergeFilterDomainStep
|
|
1054
|
+
domainSteps = (0, _utils.mergeFilterDomainStep)(domainSteps, filterProps);
|
|
1055
|
+
});
|
|
1056
|
+
var nextFilter = _objectSpread(_objectSpread({}, filter), {}, {
|
|
1057
|
+
// value: nextValue,
|
|
1058
|
+
domain: domainSteps.domain,
|
|
1059
|
+
step: domainSteps.step
|
|
1060
|
+
});
|
|
1061
|
+
var nextValue = (0, _utils.adjustValueToFilterDomain)(nextFilter.value, nextFilter);
|
|
1062
|
+
return _objectSpread(_objectSpread({}, nextFilter), {}, {
|
|
1063
|
+
value: nextValue
|
|
1064
|
+
});
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
/***
|
|
1068
|
+
* Updates a single property of a filter
|
|
1069
|
+
*/
|
|
1070
|
+
function _updateFilterProp(state, filter, prop, value, valueIndex, datasetIds) {
|
|
1071
|
+
var datasetIdsToFilter = [];
|
|
1072
|
+
switch (prop) {
|
|
1073
|
+
// TODO: Next PR for UI if we update filterDataId, we need to consider two cases:
|
|
1074
|
+
// 1. dataId is empty: create a default filter
|
|
1075
|
+
// 2. Add a new dataset id
|
|
1076
|
+
case _utils.FILTER_UPDATER_PROPS.dataId:
|
|
1077
|
+
{
|
|
1078
|
+
var oldDataId = (0, _toConsumableArray2["default"])(filter.dataId);
|
|
1079
|
+
filter = _updateFilterDataIdAtValueIndex(filter, valueIndex, value, state.datasets);
|
|
1080
|
+
datasetIdsToFilter = (0, _lodash5["default"])([].concat((0, _toConsumableArray2["default"])(oldDataId), (0, _toConsumableArray2["default"])(filter.dataId)));
|
|
1081
|
+
break;
|
|
1082
|
+
}
|
|
1083
|
+
case _utils.FILTER_UPDATER_PROPS.name:
|
|
1084
|
+
{
|
|
1085
|
+
// we are supporting the current functionality
|
|
1086
|
+
// TODO: Next PR for UI filter name will only update filter name but it won't have side effects
|
|
1087
|
+
// we are gonna use pair of datasets and fieldIdx to update the filter
|
|
1088
|
+
var datasetId = filter.dataId[valueIndex];
|
|
1089
|
+
var _applyFilterFieldName = (0, _utils.applyFilterFieldName)(filter, state.datasets[datasetId], value, valueIndex, {
|
|
1090
|
+
mergeDomain: valueIndex > 0
|
|
1091
|
+
}),
|
|
1092
|
+
updatedFilter = _applyFilterFieldName.filter,
|
|
1093
|
+
newDataset = _applyFilterFieldName.dataset;
|
|
1094
|
+
if (updatedFilter) {
|
|
1095
|
+
filter = updatedFilter;
|
|
1096
|
+
if (filter.gpu) {
|
|
1097
|
+
filter = (0, _table.setFilterGpuMode)(filter, state.filters);
|
|
1098
|
+
filter = (0, _table.assignGpuChannel)(filter, state.filters);
|
|
1099
|
+
}
|
|
1100
|
+
state = (0, _utils.set)(['datasets', datasetId], newDataset, state);
|
|
1101
|
+
// remove filter Plot at datasetId, so it will be recalculated
|
|
1102
|
+
filter = (0, _utils.removeFilterPlot)(filter, datasetId);
|
|
1103
|
+
datasetIdsToFilter = updatedFilter.dataId;
|
|
1104
|
+
}
|
|
1105
|
+
// only filter the current dataset
|
|
1106
|
+
break;
|
|
1107
|
+
}
|
|
1108
|
+
case _utils.FILTER_UPDATER_PROPS.layerId:
|
|
1109
|
+
{
|
|
1110
|
+
// We need to update only datasetId/s if we have added/removed layers
|
|
1111
|
+
// - check for layerId changes (XOR works because of string values)
|
|
1112
|
+
// if no differences between layerIds, don't do any filtering
|
|
1113
|
+
// @ts-ignore
|
|
1114
|
+
var layerIdDifference = (0, _lodash6["default"])(value, filter.layerId);
|
|
1115
|
+
var layerDataIds = (0, _lodash5["default"])(layerIdDifference.map(function (lid) {
|
|
1116
|
+
return (0, _lodash2["default"])(state.layers.find(function (l) {
|
|
1117
|
+
return l.id === lid;
|
|
1118
|
+
}), ['config', 'dataId']);
|
|
1119
|
+
}).filter(function (d) {
|
|
1120
|
+
return d;
|
|
1121
|
+
}));
|
|
1122
|
+
|
|
1123
|
+
// only filter datasetsIds
|
|
1124
|
+
datasetIdsToFilter = layerDataIds;
|
|
1125
|
+
|
|
1126
|
+
// Update newFilter dataIds
|
|
1127
|
+
var newDataIds = (0, _lodash5["default"])(value === null || value === void 0 ? void 0 : value.map(function (lid) {
|
|
1128
|
+
return (0, _lodash2["default"])(state.layers.find(function (l) {
|
|
1129
|
+
return l.id === lid;
|
|
1130
|
+
}), ['config', 'dataId']);
|
|
1131
|
+
}).filter(function (d) {
|
|
1132
|
+
return d;
|
|
1133
|
+
}));
|
|
1134
|
+
filter = _objectSpread(_objectSpread({}, filter), {}, {
|
|
1135
|
+
layerId: value,
|
|
1136
|
+
dataId: newDataIds
|
|
1137
|
+
});
|
|
1138
|
+
break;
|
|
1139
|
+
}
|
|
1140
|
+
default:
|
|
1141
|
+
filter = (0, _utils.set)([prop], value, filter);
|
|
1142
|
+
datasetIdsToFilter = (0, _toConsumableArray2["default"])(filter.dataId);
|
|
1143
|
+
break;
|
|
1144
|
+
}
|
|
1145
|
+
return {
|
|
1146
|
+
filter: filter,
|
|
1147
|
+
datasetIds: datasetIds,
|
|
1148
|
+
datasetIdsToFilter: datasetIdsToFilter,
|
|
1149
|
+
state: state
|
|
1150
|
+
};
|
|
1151
|
+
}
|
|
1152
|
+
/* eslint-enable max-statements */
|
|
1153
|
+
|
|
1154
|
+
/**
|
|
1155
|
+
* Set the property of a filter plot
|
|
1156
|
+
* @memberof visStateUpdaters
|
|
1157
|
+
* @public
|
|
1158
|
+
*/
|
|
1159
|
+
var setFilterPlotUpdater = exports.setFilterPlotUpdater = function setFilterPlotUpdater(state, _ref4) {
|
|
1160
|
+
var idx = _ref4.idx,
|
|
1161
|
+
newProp = _ref4.newProp,
|
|
1162
|
+
_ref4$valueIndex = _ref4.valueIndex,
|
|
1163
|
+
valueIndex = _ref4$valueIndex === void 0 ? 0 : _ref4$valueIndex;
|
|
1164
|
+
if (!state.filters[idx]) {
|
|
1165
|
+
_window.console.error("filters[".concat(idx, "] is undefined"));
|
|
1166
|
+
return state;
|
|
1167
|
+
}
|
|
1168
|
+
var newFilter = state.filters[idx];
|
|
1169
|
+
for (var prop in newProp) {
|
|
1170
|
+
if (prop === 'plotType') {
|
|
1171
|
+
newFilter = (0, _composerHelpers.pick_)('plotType')((0, _composerHelpers.merge_)(newProp.plotType))(newFilter);
|
|
1172
|
+
} else if (prop === 'yAxis') {
|
|
1173
|
+
var chartType = newProp.yAxis ? _constants.PLOT_TYPES.lineChart : _constants.PLOT_TYPES.histogram;
|
|
1174
|
+
newFilter = (0, _composerHelpers.pick_)('plotType')((0, _composerHelpers.merge_)({
|
|
1175
|
+
type: chartType
|
|
1176
|
+
}))((0, _composerHelpers.merge_)(newProp)(newFilter));
|
|
1177
|
+
}
|
|
1178
|
+
}
|
|
1179
|
+
newFilter = (0, _utils.updateFilterPlot)(state.datasets, newFilter);
|
|
1180
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1181
|
+
filters: state.filters.map(function (f, i) {
|
|
1182
|
+
return i === idx ? newFilter : f;
|
|
1183
|
+
})
|
|
1184
|
+
});
|
|
1185
|
+
};
|
|
1186
|
+
|
|
1187
|
+
/**
|
|
1188
|
+
* Add a new filter
|
|
1189
|
+
* @memberof visStateUpdaters
|
|
1190
|
+
* @public
|
|
1191
|
+
*/
|
|
1192
|
+
var addFilterUpdater = exports.addFilterUpdater = function addFilterUpdater(state, action) {
|
|
1193
|
+
return !action.dataId ? state : _objectSpread(_objectSpread({}, state), {}, {
|
|
1194
|
+
filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [(0, _utils.getDefaultFilter)({
|
|
1195
|
+
dataId: action.dataId,
|
|
1196
|
+
id: action.id
|
|
1197
|
+
})])
|
|
1198
|
+
});
|
|
1199
|
+
};
|
|
1200
|
+
|
|
1201
|
+
/**
|
|
1202
|
+
* Create or update a filter
|
|
1203
|
+
* @memberof visStateUpdaters
|
|
1204
|
+
* @public
|
|
1205
|
+
*/
|
|
1206
|
+
var createOrUpdateFilterUpdater = exports.createOrUpdateFilterUpdater = function createOrUpdateFilterUpdater(state, action) {
|
|
1207
|
+
var id = action.id,
|
|
1208
|
+
dataId = action.dataId,
|
|
1209
|
+
field = action.field,
|
|
1210
|
+
value = action.value;
|
|
1211
|
+
var newState = state;
|
|
1212
|
+
var originalIndex = newState.filters.findIndex(function (f) {
|
|
1213
|
+
return f.id === id;
|
|
1214
|
+
});
|
|
1215
|
+
var filterIndex = originalIndex;
|
|
1216
|
+
if (!id && !dataId) {
|
|
1217
|
+
return newState;
|
|
1218
|
+
}
|
|
1219
|
+
if (originalIndex < 0 && dataId) {
|
|
1220
|
+
newState = addFilterUpdater(newState, {
|
|
1221
|
+
dataId: dataId
|
|
1222
|
+
});
|
|
1223
|
+
if (newState.filters.length !== state.filters.length + 1) {
|
|
1224
|
+
// No new filter was added
|
|
1225
|
+
return state;
|
|
1226
|
+
}
|
|
1227
|
+
// Here we are assuming that the filter was added at the end
|
|
1228
|
+
filterIndex = newState.filters.length - 1;
|
|
1229
|
+
newState.filters[filterIndex] = _objectSpread(_objectSpread({}, newState.filters[filterIndex]), id ? {
|
|
1230
|
+
id: id
|
|
1231
|
+
} : null);
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
// No need to update this if it's a newly created filter
|
|
1235
|
+
// First we make sure all the dataIds that fields refer to are updated
|
|
1236
|
+
if (originalIndex >= 0 && dataId) {
|
|
1237
|
+
// If the dataId is an array, we need to update each one individually as they need a correct valueIndex passed
|
|
1238
|
+
newState = (Array.isArray(dataId) ? dataId : [dataId]).reduce(function (accu, d, index) {
|
|
1239
|
+
return setFilterUpdater(accu, {
|
|
1240
|
+
idx: filterIndex,
|
|
1241
|
+
prop: 'dataId',
|
|
1242
|
+
value: d,
|
|
1243
|
+
valueIndex: index
|
|
1244
|
+
});
|
|
1245
|
+
}, newState);
|
|
1246
|
+
}
|
|
1247
|
+
// Then we update the fields
|
|
1248
|
+
if (field) {
|
|
1249
|
+
// If the field is an array, we need to update each field individually as they need a correct valueIndex passed
|
|
1250
|
+
newState = (Array.isArray(field) ? field : [field]).reduce(function (accu, f, index) {
|
|
1251
|
+
return setFilterUpdater(accu, {
|
|
1252
|
+
idx: filterIndex,
|
|
1253
|
+
prop: 'name',
|
|
1254
|
+
value: f,
|
|
1255
|
+
valueIndex: index
|
|
1256
|
+
});
|
|
1257
|
+
}, newState);
|
|
1258
|
+
}
|
|
1259
|
+
// Then we update the value separately
|
|
1260
|
+
if (value !== null && typeof value !== 'undefined') {
|
|
1261
|
+
newState = setFilterUpdater(newState, {
|
|
1262
|
+
idx: filterIndex,
|
|
1263
|
+
prop: 'value',
|
|
1264
|
+
value: value
|
|
1265
|
+
});
|
|
1266
|
+
}
|
|
1267
|
+
return newState;
|
|
1268
|
+
};
|
|
1269
|
+
|
|
1270
|
+
/**
|
|
1271
|
+
* Set layer color palette ui state
|
|
1272
|
+
* @memberof visStateUpdaters
|
|
1273
|
+
*/
|
|
1274
|
+
var layerColorUIChangeUpdater = exports.layerColorUIChangeUpdater = function layerColorUIChangeUpdater(state, _ref5) {
|
|
1275
|
+
var oldLayer = _ref5.oldLayer,
|
|
1276
|
+
prop = _ref5.prop,
|
|
1277
|
+
newConfig = _ref5.newConfig;
|
|
1278
|
+
var oldVixConfig = oldLayer.config.visConfig[prop];
|
|
1279
|
+
var newLayer = oldLayer.updateLayerColorUI(prop, newConfig);
|
|
1280
|
+
var newVisConfig = newLayer.config.visConfig[prop];
|
|
1281
|
+
if (oldVixConfig !== newVisConfig) {
|
|
1282
|
+
return layerVisConfigChangeUpdater(state, {
|
|
1283
|
+
oldLayer: oldLayer,
|
|
1284
|
+
newVisConfig: (0, _defineProperty2["default"])({}, prop, newVisConfig)
|
|
1285
|
+
});
|
|
1286
|
+
}
|
|
1287
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1288
|
+
layers: state.layers.map(function (l) {
|
|
1289
|
+
return l.id === oldLayer.id ? newLayer : l;
|
|
1290
|
+
})
|
|
1291
|
+
});
|
|
1292
|
+
};
|
|
1293
|
+
|
|
1294
|
+
/**
|
|
1295
|
+
* Start and end filter animation
|
|
1296
|
+
* @memberof visStateUpdaters
|
|
1297
|
+
* @public
|
|
1298
|
+
*/
|
|
1299
|
+
var toggleFilterAnimationUpdater = exports.toggleFilterAnimationUpdater = function toggleFilterAnimationUpdater(state, action) {
|
|
1300
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1301
|
+
filters: state.filters.map(function (f, i) {
|
|
1302
|
+
return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1303
|
+
isAnimating: !f.isAnimating
|
|
1304
|
+
}) : f;
|
|
1305
|
+
})
|
|
1306
|
+
});
|
|
1307
|
+
};
|
|
1308
|
+
|
|
1309
|
+
/**
|
|
1310
|
+
* @memberof visStateUpdaters
|
|
1311
|
+
* @public
|
|
1312
|
+
*/
|
|
1313
|
+
var toggleLayerAnimationUpdater = exports.toggleLayerAnimationUpdater = function toggleLayerAnimationUpdater(state, action) {
|
|
1314
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1315
|
+
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1316
|
+
isAnimating: !state.animationConfig.isAnimating
|
|
1317
|
+
})
|
|
1318
|
+
});
|
|
1319
|
+
};
|
|
1320
|
+
|
|
1321
|
+
/**
|
|
1322
|
+
* Hide and show layer animation control
|
|
1323
|
+
* @memberof visStateUpdaters
|
|
1324
|
+
* @public
|
|
1325
|
+
*/
|
|
1326
|
+
var toggleLayerAnimationControlUpdater = exports.toggleLayerAnimationControlUpdater = function toggleLayerAnimationControlUpdater(state) {
|
|
1327
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1328
|
+
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1329
|
+
hideControl: !state.animationConfig.hideControl
|
|
1330
|
+
})
|
|
1331
|
+
});
|
|
1332
|
+
};
|
|
1333
|
+
|
|
1334
|
+
/**
|
|
1335
|
+
* Change filter animation speed
|
|
1336
|
+
* @memberof visStateUpdaters
|
|
1337
|
+
* @public
|
|
1338
|
+
*/
|
|
1339
|
+
var updateFilterAnimationSpeedUpdater = exports.updateFilterAnimationSpeedUpdater = function updateFilterAnimationSpeedUpdater(state, action) {
|
|
1340
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1341
|
+
filters: state.filters.map(function (f, i) {
|
|
1342
|
+
return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1343
|
+
speed: action.speed
|
|
1344
|
+
}) : f;
|
|
1345
|
+
})
|
|
1346
|
+
});
|
|
1347
|
+
};
|
|
1348
|
+
|
|
1349
|
+
/**
|
|
1350
|
+
* Update animation speed with the vertical speed slider
|
|
1351
|
+
* @memberof visStateUpdaters
|
|
1352
|
+
* @public
|
|
1353
|
+
*
|
|
1354
|
+
*/
|
|
1355
|
+
var updateLayerAnimationSpeedUpdater = exports.updateLayerAnimationSpeedUpdater = function updateLayerAnimationSpeedUpdater(state, _ref6) {
|
|
1356
|
+
var speed = _ref6.speed;
|
|
1357
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1358
|
+
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1359
|
+
speed: speed
|
|
1360
|
+
})
|
|
1361
|
+
});
|
|
1362
|
+
};
|
|
1363
|
+
|
|
1364
|
+
/**
|
|
1365
|
+
* Show larger time filter at bottom for time playback (apply to time filter only)
|
|
1366
|
+
* @memberof visStateUpdaters
|
|
1367
|
+
* @public
|
|
1368
|
+
*/
|
|
1369
|
+
var setFilterViewUpdater = exports.setFilterViewUpdater = function setFilterViewUpdater(state, action) {
|
|
1370
|
+
var view = action.view,
|
|
1371
|
+
idx = action.idx;
|
|
1372
|
+
var shouldResetOtherFiltersView = view === _constants.FILTER_VIEW_TYPES.enlarged;
|
|
1373
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1374
|
+
filters: state.filters.map(function (f, i) {
|
|
1375
|
+
return i === idx ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1376
|
+
view: view
|
|
1377
|
+
}) : shouldResetOtherFiltersView ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1378
|
+
view: _constants.FILTER_VIEW_TYPES.side
|
|
1379
|
+
}) : f;
|
|
1380
|
+
})
|
|
1381
|
+
});
|
|
1382
|
+
};
|
|
1383
|
+
|
|
1384
|
+
/**
|
|
1385
|
+
* Toggles filter feature visibility
|
|
1386
|
+
* @memberof visStateUpdaters
|
|
1387
|
+
*/
|
|
1388
|
+
var toggleFilterFeatureUpdater = exports.toggleFilterFeatureUpdater = function toggleFilterFeatureUpdater(state, action) {
|
|
1389
|
+
var filter = state.filters[action.idx];
|
|
1390
|
+
var isVisible = (0, _lodash2["default"])(filter, ['value', 'properties', 'isVisible']);
|
|
1391
|
+
var newState = setFilterUpdater(state, {
|
|
1392
|
+
idx: action.idx,
|
|
1393
|
+
prop: 'enabled',
|
|
1394
|
+
value: !isVisible
|
|
1395
|
+
});
|
|
1396
|
+
newState = setFilterUpdater(newState, {
|
|
1397
|
+
idx: action.idx,
|
|
1398
|
+
prop: 'value',
|
|
1399
|
+
value: (0, _utils.featureToFilterValue)(filter.value, filter.id, {
|
|
1400
|
+
isVisible: !isVisible
|
|
1401
|
+
})
|
|
1402
|
+
});
|
|
1403
|
+
return newState;
|
|
1404
|
+
};
|
|
1405
|
+
|
|
1406
|
+
/**
|
|
1407
|
+
* Remove a filter
|
|
1408
|
+
* @memberof visStateUpdaters
|
|
1409
|
+
* @public
|
|
1410
|
+
*/
|
|
1411
|
+
var removeFilterUpdater = exports.removeFilterUpdater = function removeFilterUpdater(state, action) {
|
|
1412
|
+
var idx = action.idx;
|
|
1413
|
+
var _state$filters$idx = state.filters[idx],
|
|
1414
|
+
dataId = _state$filters$idx.dataId,
|
|
1415
|
+
id = _state$filters$idx.id;
|
|
1416
|
+
var newFilters = [].concat((0, _toConsumableArray2["default"])(state.filters.slice(0, idx)), (0, _toConsumableArray2["default"])(state.filters.slice(idx + 1, state.filters.length)));
|
|
1417
|
+
var filteredDatasets = (0, _utils.applyFiltersToDatasets)(dataId, state.datasets, newFilters, state.layers);
|
|
1418
|
+
var newEditor = (0, _utils.getFilterIdInFeature)(state.editor.selectedFeature) === id ? _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
1419
|
+
selectedFeature: null
|
|
1420
|
+
}) : state.editor;
|
|
1421
|
+
var newState = (0, _utils.set)(['filters'], newFilters, state);
|
|
1422
|
+
newState = (0, _utils.set)(['datasets'], filteredDatasets, newState);
|
|
1423
|
+
newState = (0, _utils.set)(['editor'], newEditor, newState);
|
|
1424
|
+
return updateAllLayerDomainData(newState, dataId, undefined);
|
|
1425
|
+
};
|
|
1426
|
+
|
|
1427
|
+
/**
|
|
1428
|
+
* Add a new layer
|
|
1429
|
+
* @memberof visStateUpdaters
|
|
1430
|
+
* @public
|
|
1431
|
+
*/
|
|
1432
|
+
var addLayerUpdater = exports.addLayerUpdater = function addLayerUpdater(state, action) {
|
|
1433
|
+
var newLayer;
|
|
1434
|
+
var newLayerData;
|
|
1435
|
+
if (action.config) {
|
|
1436
|
+
newLayer = (0, _visStateMerger.createLayerFromConfig)(state, action.config);
|
|
1437
|
+
if (!newLayer) {
|
|
1438
|
+
_window.console.warn('Failed to create layer from config, it usually means the config is not be in correct format', action.config);
|
|
1439
|
+
return state;
|
|
1440
|
+
}
|
|
1441
|
+
var result = (0, _layerUtils.calculateLayerData)(newLayer, state);
|
|
1442
|
+
newLayer = result.layer;
|
|
1443
|
+
newLayerData = result.layerData;
|
|
1444
|
+
} else {
|
|
1445
|
+
var _action$datasetId;
|
|
1446
|
+
// create an empty layer with a specific dataset or a default one
|
|
1447
|
+
var defaultDataset = (_action$datasetId = action.datasetId) !== null && _action$datasetId !== void 0 ? _action$datasetId : Object.keys(state.datasets)[0];
|
|
1448
|
+
newLayer = new _layers.Layer({
|
|
1449
|
+
isVisible: true,
|
|
1450
|
+
isConfigActive: true,
|
|
1451
|
+
dataId: defaultDataset
|
|
1452
|
+
});
|
|
1453
|
+
newLayerData = {};
|
|
1454
|
+
}
|
|
1455
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
1456
|
+
layers: [].concat((0, _toConsumableArray2["default"])(state.layers), [newLayer]),
|
|
1457
|
+
layerData: [].concat((0, _toConsumableArray2["default"])(state.layerData), [newLayerData]),
|
|
1458
|
+
// add new layer at the top
|
|
1459
|
+
layerOrder: [newLayer.id].concat((0, _toConsumableArray2["default"])(state.layerOrder)),
|
|
1460
|
+
splitMaps: (0, _utils.addNewLayersToSplitMap)(state.splitMaps, newLayer)
|
|
1461
|
+
});
|
|
1462
|
+
if (newLayer.config.animation.enabled) {
|
|
1463
|
+
newState = updateAnimationDomain(newState);
|
|
1464
|
+
}
|
|
1465
|
+
return newState;
|
|
1466
|
+
};
|
|
1467
|
+
|
|
1468
|
+
/**
|
|
1469
|
+
* remove layer
|
|
1470
|
+
* @memberof visStateUpdaters
|
|
1471
|
+
* @public
|
|
1472
|
+
*/
|
|
1473
|
+
function removeLayerUpdater(state, _ref7) {
|
|
1474
|
+
var id = _ref7.id;
|
|
1475
|
+
var idx = Number.isFinite(id) ?
|
|
1476
|
+
// support older API, remove layer by idx
|
|
1477
|
+
Number(id) : state.layers.findIndex(function (l) {
|
|
1478
|
+
return l.id === id;
|
|
1479
|
+
});
|
|
1480
|
+
if (idx < 0 || idx >= state.layers.length) {
|
|
1481
|
+
// invalid index
|
|
1482
|
+
_window.console.warn("can not remove layer with invalid id|idx ".concat(id));
|
|
1483
|
+
return state;
|
|
1484
|
+
}
|
|
1485
|
+
var layers = state.layers,
|
|
1486
|
+
layerData = state.layerData,
|
|
1487
|
+
layerOrder = state.layerOrder,
|
|
1488
|
+
clicked = state.clicked,
|
|
1489
|
+
hoverInfo = state.hoverInfo;
|
|
1490
|
+
var layerToRemove = layers[idx];
|
|
1491
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
1492
|
+
layers: (0, _composerHelpers.filterOutById)(layerToRemove.id)(layers),
|
|
1493
|
+
layerData: (0, _composerHelpers.removeElementAtIndex)(idx)(layerData),
|
|
1494
|
+
layerOrder: layerOrder.filter(function (layerId) {
|
|
1495
|
+
return layerId !== layerToRemove.id;
|
|
1496
|
+
}),
|
|
1497
|
+
clicked: layerToRemove.isLayerHovered(clicked) ? undefined : clicked,
|
|
1498
|
+
hoverInfo: layerToRemove.isLayerHovered(hoverInfo) ? undefined : hoverInfo,
|
|
1499
|
+
splitMaps: (0, _utils.removeLayerFromSplitMaps)(state.splitMaps, layerToRemove)
|
|
1500
|
+
// TODO: update filters, create helper to remove layer form filter (remove layerid and dataid) if mapped
|
|
1501
|
+
});
|
|
1502
|
+
return updateAnimationDomain(newState);
|
|
1503
|
+
}
|
|
1504
|
+
|
|
1505
|
+
/**
|
|
1506
|
+
* Reorder layer
|
|
1507
|
+
* @memberof visStateUpdaters
|
|
1508
|
+
* @public
|
|
1509
|
+
*/
|
|
1510
|
+
var reorderLayerUpdater = exports.reorderLayerUpdater = function reorderLayerUpdater(state, _ref8) {
|
|
1511
|
+
var order = _ref8.order;
|
|
1512
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1513
|
+
layerOrder: order
|
|
1514
|
+
});
|
|
1515
|
+
};
|
|
1516
|
+
|
|
1517
|
+
/**
|
|
1518
|
+
* duplicate layer
|
|
1519
|
+
* @memberof visStateUpdaters
|
|
1520
|
+
* @public
|
|
1521
|
+
*/
|
|
1522
|
+
var duplicateLayerUpdater = exports.duplicateLayerUpdater = function duplicateLayerUpdater(state, _ref9) {
|
|
1523
|
+
var id = _ref9.id;
|
|
1524
|
+
var idx = Number.isFinite(id) ?
|
|
1525
|
+
// support older API, remove layer by idx
|
|
1526
|
+
Number(id) : state.layers.findIndex(function (l) {
|
|
1527
|
+
return l.id === id;
|
|
1528
|
+
});
|
|
1529
|
+
if (idx < 0 || !state.layers[idx]) {
|
|
1530
|
+
_window.console.warn("layer ".concat(idx, " not found in layerOrder"));
|
|
1531
|
+
return state;
|
|
1532
|
+
}
|
|
1533
|
+
var layers = state.layers;
|
|
1534
|
+
var original = layers[idx];
|
|
1535
|
+
var originalLayerOrderIdx = state.layerOrder.findIndex(function (lid) {
|
|
1536
|
+
return lid === original.id;
|
|
1537
|
+
});
|
|
1538
|
+
var newLabel = "Copy of ".concat(original.config.label);
|
|
1539
|
+
var postfix = 0;
|
|
1540
|
+
// eslint-disable-next-line no-loop-func
|
|
1541
|
+
while (layers.find(function (l) {
|
|
1542
|
+
return l.config.label === newLabel;
|
|
1543
|
+
})) {
|
|
1544
|
+
newLabel = "Copy of ".concat(original.config.label, " ").concat(++postfix);
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
// collect layer config from original
|
|
1548
|
+
var loadedLayer = (0, _visStateMerger.serializeLayer)(original, state.schema);
|
|
1549
|
+
|
|
1550
|
+
// assign new id and label to copied layer
|
|
1551
|
+
if (!(loadedLayer !== null && loadedLayer !== void 0 && loadedLayer.config)) {
|
|
1552
|
+
return state;
|
|
1553
|
+
}
|
|
1554
|
+
loadedLayer.config.label = newLabel;
|
|
1555
|
+
loadedLayer.id = (0, _commonUtils.generateHashId)(_layers.LAYER_ID_LENGTH);
|
|
1556
|
+
|
|
1557
|
+
// add layer to state
|
|
1558
|
+
var nextState = addLayerUpdater(state, {
|
|
1559
|
+
config: loadedLayer
|
|
1560
|
+
});
|
|
1561
|
+
// retrieve newly created layer
|
|
1562
|
+
var newLayer = nextState.layers[nextState.layers.length - 1];
|
|
1563
|
+
// update layer order with newLyaer.id
|
|
1564
|
+
var newLayerOrder = (0, _utils.arrayInsert)(nextState.layerOrder.slice(1, nextState.layerOrder.length), originalLayerOrderIdx, newLayer.id);
|
|
1565
|
+
nextState = reorderLayerUpdater(nextState, {
|
|
1566
|
+
order: newLayerOrder
|
|
1567
|
+
});
|
|
1568
|
+
return updateAnimationDomain(nextState);
|
|
1569
|
+
};
|
|
1570
|
+
|
|
1571
|
+
/**
|
|
1572
|
+
* Add a new effect
|
|
1573
|
+
* @memberof visStateUpdaters
|
|
1574
|
+
* @public
|
|
1575
|
+
*/
|
|
1576
|
+
var addEffectUpdater = exports.addEffectUpdater = function addEffectUpdater(state, action) {
|
|
1577
|
+
var _action$config;
|
|
1578
|
+
if (((_action$config = action.config) === null || _action$config === void 0 ? void 0 : _action$config.type) === _constants.LIGHT_AND_SHADOW_EFFECT.type && state.effects.some(function (effect) {
|
|
1579
|
+
return effect.type === _constants.LIGHT_AND_SHADOW_EFFECT.type;
|
|
1580
|
+
})) {
|
|
1581
|
+
_window.console.warn("Can't add more than one ".concat(_constants.LIGHT_AND_SHADOW_EFFECT.name, " effect"));
|
|
1582
|
+
return state;
|
|
1583
|
+
}
|
|
1584
|
+
var newEffect = (0, _effects.createEffect)(action.config);
|
|
1585
|
+
|
|
1586
|
+
// collapse configurators for other effects
|
|
1587
|
+
state.effects.forEach(function (effect) {
|
|
1588
|
+
return effect.setProps({
|
|
1589
|
+
isConfigActive: false
|
|
1590
|
+
});
|
|
1591
|
+
});
|
|
1592
|
+
var effects = [].concat((0, _toConsumableArray2["default"])(state.effects), [newEffect]);
|
|
1593
|
+
var effectOrder = (0, _utils.fixEffectOrder)(effects, [newEffect.id].concat((0, _toConsumableArray2["default"])(state.effectOrder)));
|
|
1594
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1595
|
+
effects: effects,
|
|
1596
|
+
effectOrder: effectOrder
|
|
1597
|
+
});
|
|
1598
|
+
};
|
|
1599
|
+
|
|
1600
|
+
/**
|
|
1601
|
+
* remove effect
|
|
1602
|
+
* @memberof visStateUpdaters
|
|
1603
|
+
* @public
|
|
1604
|
+
*/
|
|
1605
|
+
var removeEffectUpdater = exports.removeEffectUpdater = function removeEffectUpdater(state, _ref10) {
|
|
1606
|
+
var id = _ref10.id;
|
|
1607
|
+
var idx = state.effects.findIndex(function (l) {
|
|
1608
|
+
return l.id === id;
|
|
1609
|
+
});
|
|
1610
|
+
if (idx < 0 || idx >= state.effects.length) {
|
|
1611
|
+
_window.console.warn("can not remove effect with invalid id ".concat(id));
|
|
1612
|
+
return state;
|
|
1613
|
+
}
|
|
1614
|
+
var effects = state.effects,
|
|
1615
|
+
effectOrder = state.effectOrder;
|
|
1616
|
+
var effectToRemove = effects[idx];
|
|
1617
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1618
|
+
// @ts-expect-error fixed in ts
|
|
1619
|
+
effects: (0, _composerHelpers.filterOutById)(effectToRemove.id)(effects),
|
|
1620
|
+
effectOrder: effectOrder.filter(function (effectId) {
|
|
1621
|
+
return effectId !== effectToRemove.id;
|
|
1622
|
+
})
|
|
1623
|
+
});
|
|
1624
|
+
};
|
|
1625
|
+
|
|
1626
|
+
/**
|
|
1627
|
+
* Reorder effect
|
|
1628
|
+
* @memberof visStateUpdaters
|
|
1629
|
+
* @public
|
|
1630
|
+
*/
|
|
1631
|
+
var reorderEffectUpdater = exports.reorderEffectUpdater = function reorderEffectUpdater(state, _ref11) {
|
|
1632
|
+
var order = _ref11.order;
|
|
1633
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1634
|
+
effectOrder: (0, _utils.fixEffectOrder)(state.effects, (0, _toConsumableArray2["default"])(order))
|
|
1635
|
+
});
|
|
1636
|
+
};
|
|
1637
|
+
|
|
1638
|
+
/**
|
|
1639
|
+
* Update effect
|
|
1640
|
+
* @memberof visStateUpdaters
|
|
1641
|
+
* @public
|
|
1642
|
+
*/
|
|
1643
|
+
var updateEffectUpdater = exports.updateEffectUpdater = function updateEffectUpdater(state, _ref12) {
|
|
1644
|
+
var id = _ref12.id,
|
|
1645
|
+
props = _ref12.props;
|
|
1646
|
+
var idx = state.effects.findIndex(function (l) {
|
|
1647
|
+
return l.id === id;
|
|
1648
|
+
});
|
|
1649
|
+
if (idx < 0 || idx >= state.effects.length) {
|
|
1650
|
+
_window.console.warn("can not update effect with invalid id ".concat(id));
|
|
1651
|
+
return state;
|
|
1652
|
+
}
|
|
1653
|
+
var effectOrder = state.effectOrder;
|
|
1654
|
+
if (props.id !== undefined && props.id !== id) {
|
|
1655
|
+
var idx2 = state.effects.findIndex(function (l) {
|
|
1656
|
+
return l.id === props.id;
|
|
1657
|
+
});
|
|
1658
|
+
if (idx2 >= 0) {
|
|
1659
|
+
_window.console.warn("can not update effect with existing effect id ".concat(id));
|
|
1660
|
+
return state;
|
|
1661
|
+
}
|
|
1662
|
+
effectOrder = effectOrder.map(function (effectOrderId) {
|
|
1663
|
+
return effectOrderId === id ? props.id : effectOrderId;
|
|
1664
|
+
});
|
|
1665
|
+
}
|
|
1666
|
+
var newEffects = (0, _toConsumableArray2["default"])(state.effects);
|
|
1667
|
+
newEffects[idx].setProps(props);
|
|
1668
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1669
|
+
effects: newEffects,
|
|
1670
|
+
effectOrder: effectOrder
|
|
1671
|
+
});
|
|
1672
|
+
};
|
|
1673
|
+
|
|
1674
|
+
/**
|
|
1675
|
+
* Remove a dataset and all layers, filters, tooltip configs that based on it
|
|
1676
|
+
* @memberof visStateUpdaters
|
|
1677
|
+
* @public
|
|
1678
|
+
*/
|
|
1679
|
+
function removeDatasetUpdater(state, action) {
|
|
1680
|
+
// extract dataset key
|
|
1681
|
+
var datasetKey = action.dataId;
|
|
1682
|
+
var datasets = state.datasets;
|
|
1683
|
+
|
|
1684
|
+
// check if dataset is present
|
|
1685
|
+
if (!datasets[datasetKey]) {
|
|
1686
|
+
return state;
|
|
1687
|
+
}
|
|
1688
|
+
var layers = state.layers,
|
|
1689
|
+
_state$datasets = state.datasets,
|
|
1690
|
+
dataset = _state$datasets[datasetKey],
|
|
1691
|
+
newDatasets = (0, _objectWithoutProperties2["default"])(_state$datasets, [datasetKey].map(_toPropertyKey));
|
|
1692
|
+
var layersToRemove = layers.filter(function (l) {
|
|
1693
|
+
return l.config.dataId === datasetKey;
|
|
1694
|
+
}).map(function (l) {
|
|
1695
|
+
return l.id;
|
|
1696
|
+
});
|
|
1697
|
+
|
|
1698
|
+
// remove layers and datasets
|
|
1699
|
+
var newState = layersToRemove.reduce(function (accu, id) {
|
|
1700
|
+
return removeLayerUpdater(accu, {
|
|
1701
|
+
id: id
|
|
1702
|
+
});
|
|
1703
|
+
}, _objectSpread(_objectSpread({}, state), {}, {
|
|
1704
|
+
datasets: newDatasets
|
|
1705
|
+
}));
|
|
1706
|
+
|
|
1707
|
+
// update filters
|
|
1708
|
+
var filters = [];
|
|
1709
|
+
var _iterator2 = _createForOfIteratorHelper(newState.filters),
|
|
1710
|
+
_step2;
|
|
1711
|
+
try {
|
|
1712
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
1713
|
+
var filter = _step2.value;
|
|
1714
|
+
var valueIndex = filter.dataId.indexOf(datasetKey);
|
|
1715
|
+
if (valueIndex >= 0 && filter.dataId.length > 1) {
|
|
1716
|
+
// only remove one synced dataset from the filter
|
|
1717
|
+
filters.push(_removeFilterDataIdAtValueIndex(filter, valueIndex, datasets));
|
|
1718
|
+
} else if (valueIndex < 0) {
|
|
1719
|
+
// leave the filter as is
|
|
1720
|
+
filters.push(filter);
|
|
1721
|
+
}
|
|
1722
|
+
}
|
|
1723
|
+
} catch (err) {
|
|
1724
|
+
_iterator2.e(err);
|
|
1725
|
+
} finally {
|
|
1726
|
+
_iterator2.f();
|
|
1727
|
+
}
|
|
1728
|
+
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
1729
|
+
filters: filters
|
|
1730
|
+
});
|
|
1731
|
+
return removeDatasetFromInteractionConfig(newState, {
|
|
1732
|
+
dataId: datasetKey
|
|
1733
|
+
});
|
|
1734
|
+
}
|
|
1735
|
+
function removeDatasetFromInteractionConfig(state, _ref13) {
|
|
1736
|
+
var dataId = _ref13.dataId;
|
|
1737
|
+
var interactionConfig = state.interactionConfig;
|
|
1738
|
+
var _interactionConfig = interactionConfig,
|
|
1739
|
+
tooltip = _interactionConfig.tooltip;
|
|
1740
|
+
if (tooltip) {
|
|
1741
|
+
var config = tooltip.config;
|
|
1742
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1743
|
+
var _config$fieldsToShow = config.fieldsToShow,
|
|
1744
|
+
fields = _config$fieldsToShow[dataId],
|
|
1745
|
+
fieldsToShow = (0, _objectWithoutProperties2["default"])(_config$fieldsToShow, [dataId].map(_toPropertyKey));
|
|
1746
|
+
interactionConfig = _objectSpread(_objectSpread({}, interactionConfig), {}, {
|
|
1747
|
+
tooltip: _objectSpread(_objectSpread({}, tooltip), {}, {
|
|
1748
|
+
config: _objectSpread(_objectSpread({}, config), {}, {
|
|
1749
|
+
fieldsToShow: fieldsToShow
|
|
1750
|
+
})
|
|
1751
|
+
})
|
|
1752
|
+
});
|
|
1753
|
+
}
|
|
1754
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1755
|
+
interactionConfig: interactionConfig
|
|
1756
|
+
});
|
|
1757
|
+
}
|
|
1758
|
+
/**
|
|
1759
|
+
* update layer blending mode
|
|
1760
|
+
* @memberof visStateUpdaters
|
|
1761
|
+
* @public
|
|
1762
|
+
*/
|
|
1763
|
+
var updateLayerBlendingUpdater = exports.updateLayerBlendingUpdater = function updateLayerBlendingUpdater(state, action) {
|
|
1764
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1765
|
+
layerBlending: action.mode
|
|
1766
|
+
});
|
|
1767
|
+
};
|
|
1768
|
+
|
|
1769
|
+
/**
|
|
1770
|
+
* update overlay blending mode
|
|
1771
|
+
* @memberof visStateUpdaters
|
|
1772
|
+
* @public
|
|
1773
|
+
*/
|
|
1774
|
+
var updateOverlayBlendingUpdater = exports.updateOverlayBlendingUpdater = function updateOverlayBlendingUpdater(state, action) {
|
|
1775
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1776
|
+
overlayBlending: action.mode
|
|
1777
|
+
});
|
|
1778
|
+
};
|
|
1779
|
+
|
|
1780
|
+
/**
|
|
1781
|
+
* Display dataset table in a modal
|
|
1782
|
+
* @memberof visStateUpdaters
|
|
1783
|
+
* @public
|
|
1784
|
+
*/
|
|
1785
|
+
var showDatasetTableUpdater = exports.showDatasetTableUpdater = function showDatasetTableUpdater(state, action) {
|
|
1786
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1787
|
+
editingDataset: action.dataId
|
|
1788
|
+
});
|
|
1789
|
+
};
|
|
1790
|
+
|
|
1791
|
+
/**
|
|
1792
|
+
* Add custom color for datasets and layers
|
|
1793
|
+
* @memberof visStateUpdaters
|
|
1794
|
+
* @public
|
|
1795
|
+
*/
|
|
1796
|
+
var updateTableColorUpdater = exports.updateTableColorUpdater = function updateTableColorUpdater(state, action) {
|
|
1797
|
+
return updateDatasetPropsUpdater(state, {
|
|
1798
|
+
dataId: action.dataId,
|
|
1799
|
+
props: {
|
|
1800
|
+
color: action.newColor
|
|
1801
|
+
}
|
|
1802
|
+
});
|
|
1803
|
+
};
|
|
1804
|
+
|
|
1805
|
+
/**
|
|
1806
|
+
* reset visState to initial State
|
|
1807
|
+
* @memberof visStateUpdaters
|
|
1808
|
+
* @public
|
|
1809
|
+
*/
|
|
1810
|
+
var resetMapConfigUpdater = exports.resetMapConfigUpdater = function resetMapConfigUpdater(state) {
|
|
1811
|
+
return _objectSpread(_objectSpread(_objectSpread({}, INITIAL_VIS_STATE), state.initialState), {}, {
|
|
1812
|
+
initialState: state.initialState
|
|
1813
|
+
});
|
|
1814
|
+
};
|
|
1815
|
+
|
|
1816
|
+
/**
|
|
1817
|
+
* Propagate `visState` reducer with a new configuration. Current config will be override.
|
|
1818
|
+
* @memberof visStateUpdaters
|
|
1819
|
+
* @public
|
|
1820
|
+
*/
|
|
1821
|
+
var receiveMapConfigUpdater = exports.receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref14) {
|
|
1822
|
+
var _ref14$payload = _ref14.payload,
|
|
1823
|
+
_ref14$payload$config = _ref14$payload.config,
|
|
1824
|
+
config = _ref14$payload$config === void 0 ? {} : _ref14$payload$config,
|
|
1825
|
+
_ref14$payload$option = _ref14$payload.options,
|
|
1826
|
+
options = _ref14$payload$option === void 0 ? {} : _ref14$payload$option;
|
|
1827
|
+
if (!config.visState) {
|
|
1828
|
+
return state;
|
|
1829
|
+
}
|
|
1830
|
+
var keepExistingConfig = options.keepExistingConfig;
|
|
1831
|
+
|
|
1832
|
+
// reset config if keepExistingConfig is falsy
|
|
1833
|
+
var mergedState = !keepExistingConfig ? resetMapConfigUpdater(state) : state;
|
|
1834
|
+
var _iterator3 = _createForOfIteratorHelper(state.mergers),
|
|
1835
|
+
_step3;
|
|
1836
|
+
try {
|
|
1837
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
1838
|
+
var merger = _step3.value;
|
|
1839
|
+
if ((0, _mergerHandler.isValidMerger)(merger) && (0, _mergerHandler.hasPropsToMerge)(config.visState, merger.prop)) {
|
|
1840
|
+
mergedState = merger.merge(mergedState, (0, _mergerHandler.getPropValueToMerger)(config.visState, merger.prop, merger.toMergeProp),
|
|
1841
|
+
// fromConfig
|
|
1842
|
+
true);
|
|
1843
|
+
}
|
|
1844
|
+
}
|
|
1845
|
+
} catch (err) {
|
|
1846
|
+
_iterator3.e(err);
|
|
1847
|
+
} finally {
|
|
1848
|
+
_iterator3.f();
|
|
1849
|
+
}
|
|
1850
|
+
return mergedState;
|
|
1851
|
+
};
|
|
1852
|
+
|
|
1853
|
+
/**
|
|
1854
|
+
* Trigger layer hover event with hovered object
|
|
1855
|
+
* @memberof visStateUpdaters
|
|
1856
|
+
* @public
|
|
1857
|
+
*/
|
|
1858
|
+
var layerHoverUpdater = exports.layerHoverUpdater = function layerHoverUpdater(state, action) {
|
|
1859
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1860
|
+
hoverInfo: _objectSpread(_objectSpread({}, action.info), Number.isFinite(action.mapIndex) ? {
|
|
1861
|
+
mapIndex: action.mapIndex
|
|
1862
|
+
} : {})
|
|
1863
|
+
});
|
|
1864
|
+
};
|
|
1865
|
+
|
|
1866
|
+
/* eslint-enable max-statements */
|
|
1867
|
+
|
|
1868
|
+
/**
|
|
1869
|
+
* Update `interactionConfig`
|
|
1870
|
+
* @memberof visStateUpdaters
|
|
1871
|
+
* @public
|
|
1872
|
+
*/
|
|
1873
|
+
function interactionConfigChangeUpdater(state, action) {
|
|
1874
|
+
var config = action.config;
|
|
1875
|
+
var interactionConfig = _objectSpread(_objectSpread({}, state.interactionConfig), (0, _defineProperty2["default"])({}, config.id, config));
|
|
1876
|
+
|
|
1877
|
+
// Don't enable tooltip and brush at the same time
|
|
1878
|
+
// but coordinates can be shown at all time
|
|
1879
|
+
var contradict = ['brush', 'tooltip'];
|
|
1880
|
+
if (contradict.includes(config.id) && config.enabled && !state.interactionConfig[config.id].enabled) {
|
|
1881
|
+
// only enable one interaction at a time
|
|
1882
|
+
contradict.forEach(function (k) {
|
|
1883
|
+
if (k !== config.id) {
|
|
1884
|
+
interactionConfig[k] = _objectSpread(_objectSpread({}, interactionConfig[k]), {}, {
|
|
1885
|
+
enabled: false
|
|
1886
|
+
});
|
|
1887
|
+
}
|
|
1888
|
+
});
|
|
1889
|
+
}
|
|
1890
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
1891
|
+
interactionConfig: interactionConfig
|
|
1892
|
+
});
|
|
1893
|
+
if (config.id === 'geocoder' && !config.enabled) {
|
|
1894
|
+
return removeDatasetUpdater(newState, {
|
|
1895
|
+
dataId: 'geocoder_dataset'
|
|
1896
|
+
});
|
|
1897
|
+
}
|
|
1898
|
+
return newState;
|
|
1899
|
+
}
|
|
1900
|
+
|
|
1901
|
+
/**
|
|
1902
|
+
* Trigger layer click event with clicked object
|
|
1903
|
+
* @memberof visStateUpdaters
|
|
1904
|
+
* @public
|
|
1905
|
+
*/
|
|
1906
|
+
var layerClickUpdater = exports.layerClickUpdater = function layerClickUpdater(state, action) {
|
|
1907
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1908
|
+
mousePos: state.interactionConfig.coordinate.enabled ? _objectSpread(_objectSpread({}, state.mousePos), {}, {
|
|
1909
|
+
pinned: state.mousePos.pinned ? null : (0, _lodash["default"])(state.mousePos)
|
|
1910
|
+
}) : state.mousePos,
|
|
1911
|
+
clicked: action.info && action.info.picked ? action.info : null
|
|
1912
|
+
});
|
|
1913
|
+
};
|
|
1914
|
+
|
|
1915
|
+
/**
|
|
1916
|
+
* Trigger map click event, unselect clicked object
|
|
1917
|
+
* @memberof visStateUpdaters
|
|
1918
|
+
* @public
|
|
1919
|
+
*/
|
|
1920
|
+
var mapClickUpdater = exports.mapClickUpdater = function mapClickUpdater(state, action) {
|
|
1921
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1922
|
+
clicked: null
|
|
1923
|
+
});
|
|
1924
|
+
};
|
|
1925
|
+
|
|
1926
|
+
/**
|
|
1927
|
+
* Trigger map move event
|
|
1928
|
+
* @memberof visStateUpdaters
|
|
1929
|
+
* @public
|
|
1930
|
+
*/
|
|
1931
|
+
var mouseMoveUpdater = exports.mouseMoveUpdater = function mouseMoveUpdater(state, _ref15) {
|
|
1932
|
+
var evt = _ref15.evt;
|
|
1933
|
+
if (Object.values(state.interactionConfig).some(function (config) {
|
|
1934
|
+
return config.enabled;
|
|
1935
|
+
})) {
|
|
1936
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1937
|
+
mousePos: _objectSpread(_objectSpread(_objectSpread({}, state.mousePos), Array.isArray(evt.point) ? {
|
|
1938
|
+
mousePosition: (0, _toConsumableArray2["default"])(evt.point)
|
|
1939
|
+
} : {}), Array.isArray(evt.lngLat) ? {
|
|
1940
|
+
coordinate: (0, _toConsumableArray2["default"])(evt.lngLat)
|
|
1941
|
+
} : {})
|
|
1942
|
+
});
|
|
1943
|
+
}
|
|
1944
|
+
return state;
|
|
1945
|
+
};
|
|
1946
|
+
/**
|
|
1947
|
+
* Toggle visibility of a layer for a split map
|
|
1948
|
+
* @memberof visStateUpdaters
|
|
1949
|
+
* @public
|
|
1950
|
+
*/
|
|
1951
|
+
var toggleSplitMapUpdater = exports.toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
|
|
1952
|
+
return state.splitMaps && state.splitMaps.length === 0 ? _objectSpread(_objectSpread({}, state), {}, {
|
|
1953
|
+
// maybe we should use an array to store state for a single map as well
|
|
1954
|
+
// if current maps length is equal to 0 it means that we are about to split the view
|
|
1955
|
+
splitMaps: (0, _utils.computeSplitMapLayers)(state.layers, {
|
|
1956
|
+
duplicate: false
|
|
1957
|
+
})
|
|
1958
|
+
}) : closeSpecificMapAtIndex(state, action);
|
|
1959
|
+
};
|
|
1960
|
+
|
|
1961
|
+
/**
|
|
1962
|
+
* Toggle visibility of a layer in a split map
|
|
1963
|
+
* @memberof visStateUpdaters
|
|
1964
|
+
* @public
|
|
1965
|
+
*/
|
|
1966
|
+
var toggleLayerForMapUpdater = exports.toggleLayerForMapUpdater = function toggleLayerForMapUpdater(state, _ref16) {
|
|
1967
|
+
var mapIndex = _ref16.mapIndex,
|
|
1968
|
+
layerId = _ref16.layerId;
|
|
1969
|
+
var splitMaps = state.splitMaps;
|
|
1970
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1971
|
+
splitMaps: splitMaps.map(function (sm, i) {
|
|
1972
|
+
return i === mapIndex ? _objectSpread(_objectSpread({}, splitMaps[i]), {}, {
|
|
1973
|
+
layers: _objectSpread(_objectSpread({}, splitMaps[i].layers), {}, (0, _defineProperty2["default"])({}, layerId, !splitMaps[i].layers[layerId]))
|
|
1974
|
+
}) : sm;
|
|
1975
|
+
})
|
|
1976
|
+
});
|
|
1977
|
+
};
|
|
1978
|
+
|
|
1979
|
+
/**
|
|
1980
|
+
* Add new dataset to `visState`, with option to load a map config along with the datasets
|
|
1981
|
+
* @memberof visStateUpdaters
|
|
1982
|
+
* @public
|
|
1983
|
+
*/
|
|
1984
|
+
// eslint-disable-next-line complexity
|
|
1985
|
+
var updateVisDataUpdater = exports.updateVisDataUpdater = function updateVisDataUpdater(state, action) {
|
|
1986
|
+
// datasets can be a single data entries or an array of multiple data entries
|
|
1987
|
+
var config = action.config,
|
|
1988
|
+
options = action.options;
|
|
1989
|
+
|
|
1990
|
+
// apply config if passed from action
|
|
1991
|
+
// TODO: we don't handle async mergers here yet
|
|
1992
|
+
var previousState = config ? receiveMapConfigUpdater(state, {
|
|
1993
|
+
payload: {
|
|
1994
|
+
config: config,
|
|
1995
|
+
options: options
|
|
1996
|
+
}
|
|
1997
|
+
}) : state;
|
|
1998
|
+
var datasets = (0, _commonUtils.toArray)(action.datasets);
|
|
1999
|
+
var allCreateDatasetsTasks = datasets.map(function (_ref17) {
|
|
2000
|
+
var _ref17$info = _ref17.info,
|
|
2001
|
+
info = _ref17$info === void 0 ? {} : _ref17$info,
|
|
2002
|
+
rest = (0, _objectWithoutProperties2["default"])(_ref17, _excluded2);
|
|
2003
|
+
return (0, _table.createNewDataEntry)(_objectSpread({
|
|
2004
|
+
info: info
|
|
2005
|
+
}, rest), state.datasets) || {};
|
|
2006
|
+
});
|
|
2007
|
+
// call all Tasks
|
|
2008
|
+
var tasks = _tasks["default"].allSettled(allCreateDatasetsTasks).map(function (results) {
|
|
2009
|
+
return (0, _actions.createNewDatasetSuccess)({
|
|
2010
|
+
results: results,
|
|
2011
|
+
addToMapOptions: options
|
|
2012
|
+
});
|
|
2013
|
+
});
|
|
2014
|
+
return (0, _tasks.withTask)(previousState, tasks);
|
|
2015
|
+
};
|
|
2016
|
+
var createNewDatasetSuccessUpdater = exports.createNewDatasetSuccessUpdater = function createNewDatasetSuccessUpdater(state, action) {
|
|
2017
|
+
// console.log('createNewDatasetSuccessUpdater', action.payload);
|
|
2018
|
+
var _action$payload = action.payload,
|
|
2019
|
+
results = _action$payload.results,
|
|
2020
|
+
addToMapOptions = _action$payload.addToMapOptions;
|
|
2021
|
+
var newDataEntries = results.reduce(function (accu, result) {
|
|
2022
|
+
if (result.status === 'fulfilled') {
|
|
2023
|
+
var dataset = result.value;
|
|
2024
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, dataset.id, dataset));
|
|
2025
|
+
} else {
|
|
2026
|
+
// handle create dataset error
|
|
2027
|
+
console.error(result.reason);
|
|
2028
|
+
return accu;
|
|
2029
|
+
}
|
|
2030
|
+
}, {});
|
|
2031
|
+
// save new dataset entry to state
|
|
2032
|
+
var mergedState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2033
|
+
datasets: (0, _visStateMerger.mergeDatasetsByOrder)(state, newDataEntries)
|
|
2034
|
+
});
|
|
2035
|
+
|
|
2036
|
+
// merge state with config to be merged
|
|
2037
|
+
var layerMergers = state.mergers.filter(function (m) {
|
|
2038
|
+
return m.waitForLayerData;
|
|
2039
|
+
});
|
|
2040
|
+
var datasetMergers = state.mergers.filter(function (m) {
|
|
2041
|
+
return !layerMergers.includes(m);
|
|
2042
|
+
});
|
|
2043
|
+
var newDataIds = Object.keys(newDataEntries);
|
|
2044
|
+
var postMergerPayload = {
|
|
2045
|
+
newDataIds: newDataIds,
|
|
2046
|
+
options: addToMapOptions,
|
|
2047
|
+
layerMergers: layerMergers
|
|
2048
|
+
};
|
|
2049
|
+
return applyMergersUpdater(mergedState, {
|
|
2050
|
+
mergers: datasetMergers,
|
|
2051
|
+
postMergerPayload: postMergerPayload
|
|
2052
|
+
});
|
|
2053
|
+
};
|
|
2054
|
+
|
|
2055
|
+
/**
|
|
2056
|
+
* Add new dataset to `visState`, with option to load a map config along with the datasets
|
|
2057
|
+
*/
|
|
2058
|
+
function applyMergersUpdater(state, action) {
|
|
2059
|
+
var mergers = action.mergers,
|
|
2060
|
+
postMergerPayload = action.postMergerPayload;
|
|
2061
|
+
|
|
2062
|
+
// merge state with config to be merged
|
|
2063
|
+
var mergeStateResult = (0, _mergerHandler.mergeStateFromMergers)(state, _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), state.initialState), mergers,
|
|
2064
|
+
// newDataIds,
|
|
2065
|
+
postMergerPayload);
|
|
2066
|
+
|
|
2067
|
+
// if all merged, kickup post merge process
|
|
2068
|
+
// if not wait
|
|
2069
|
+
return mergeStateResult.allMerged ? postMergeUpdater(mergeStateResult.mergedState, postMergerPayload) : mergeStateResult.mergedState;
|
|
2070
|
+
}
|
|
2071
|
+
|
|
2072
|
+
/**
|
|
2073
|
+
* Add new dataset to `visState`, with option to load a map config along with the datasets
|
|
2074
|
+
*/
|
|
2075
|
+
function postMergeUpdater(mergedState, postMergerPayload) {
|
|
2076
|
+
var newDataIds = postMergerPayload.newDataIds,
|
|
2077
|
+
options = postMergerPayload.options,
|
|
2078
|
+
layerMergers = postMergerPayload.layerMergers;
|
|
2079
|
+
var newFilters = mergedState.filters.filter(function (f) {
|
|
2080
|
+
return f.dataId.find(function (fDataId) {
|
|
2081
|
+
return newDataIds.includes(fDataId);
|
|
2082
|
+
});
|
|
2083
|
+
});
|
|
2084
|
+
var datasetFiltered = (0, _lodash5["default"])(newFilters.reduce(function (accu, f) {
|
|
2085
|
+
return [].concat((0, _toConsumableArray2["default"])(accu), (0, _toConsumableArray2["default"])(f.dataId));
|
|
2086
|
+
}, []));
|
|
2087
|
+
var dataEmpty = newDataIds.length < 1;
|
|
2088
|
+
var newLayers = !dataEmpty ? mergedState.layers.filter(function (l) {
|
|
2089
|
+
return l.config.dataId && newDataIds.includes(l.config.dataId);
|
|
2090
|
+
}) : [];
|
|
2091
|
+
var newDataEntries = newDataIds.reduce(function (accu, id) {
|
|
2092
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, id, mergedState.datasets[id]));
|
|
2093
|
+
}, {});
|
|
2094
|
+
if (!newLayers.length && (options || {}).autoCreateLayers !== false) {
|
|
2095
|
+
// no layer merged, find defaults
|
|
2096
|
+
var result = addDefaultLayers(mergedState, newDataEntries);
|
|
2097
|
+
mergedState = result.state;
|
|
2098
|
+
newLayers = result.newLayers;
|
|
2099
|
+
}
|
|
2100
|
+
if (mergedState.splitMaps.length) {
|
|
2101
|
+
// if map is split, add new layers to splitMaps
|
|
2102
|
+
newLayers = mergedState.layers.filter(function (l) {
|
|
2103
|
+
return l.config.dataId && newDataIds.includes(l.config.dataId);
|
|
2104
|
+
});
|
|
2105
|
+
mergedState = _objectSpread(_objectSpread({}, mergedState), {}, {
|
|
2106
|
+
splitMaps: (0, _utils.addNewLayersToSplitMap)(mergedState.splitMaps, newLayers)
|
|
2107
|
+
});
|
|
2108
|
+
}
|
|
2109
|
+
|
|
2110
|
+
// if no tooltips merged add default tooltips
|
|
2111
|
+
newDataIds.forEach(function (dataId) {
|
|
2112
|
+
var tooltipFields = mergedState.interactionConfig.tooltip.config.fieldsToShow[dataId];
|
|
2113
|
+
// loading dataset: autoCreateTooltips is false and we don't want to run addDefaultTooltips when tooltipFields is empty
|
|
2114
|
+
if ((options === null || options === void 0 ? void 0 : options.autoCreateTooltips) !== false && (!Array.isArray(tooltipFields) || !tooltipFields.length)) {
|
|
2115
|
+
// adding dataset: autoCreateTooltips is true
|
|
2116
|
+
mergedState = addDefaultTooltips(mergedState, newDataEntries[dataId]);
|
|
2117
|
+
}
|
|
2118
|
+
});
|
|
2119
|
+
var updatedDatasets = dataEmpty ? Object.keys(mergedState.datasets) : (0, _lodash5["default"])(Object.keys(newDataEntries).concat(datasetFiltered));
|
|
2120
|
+
var updatedState = updateAllLayerDomainData(mergedState, updatedDatasets, undefined);
|
|
2121
|
+
|
|
2122
|
+
// register layer animation domain,
|
|
2123
|
+
// need to be called after layer data is calculated
|
|
2124
|
+
updatedState = updateAnimationDomain(updatedState);
|
|
2125
|
+
|
|
2126
|
+
// try to process layerMergers after dataset+datasetMergers
|
|
2127
|
+
updatedState = layerMergers && layerMergers.length > 0 ? applyMergersUpdater(updatedState, {
|
|
2128
|
+
mergers: layerMergers,
|
|
2129
|
+
postMergerPayload: _objectSpread(_objectSpread({}, postMergerPayload), {}, {
|
|
2130
|
+
layerMergers: []
|
|
2131
|
+
})
|
|
2132
|
+
}) : updatedState;
|
|
2133
|
+
|
|
2134
|
+
// center the map once the dataset is created
|
|
2135
|
+
if (newLayers.length && (options || {}).centerMap) {
|
|
2136
|
+
var bounds = (0, _dataUtils.findMapBounds)(newLayers);
|
|
2137
|
+
if (bounds) {
|
|
2138
|
+
var fitBoundsTask = (0, _tasks2.ACTION_TASK)().map(function () {
|
|
2139
|
+
return (0, _actions.fitBounds)(bounds);
|
|
2140
|
+
});
|
|
2141
|
+
updatedState = (0, _tasks.withTask)(updatedState, fitBoundsTask);
|
|
2142
|
+
}
|
|
2143
|
+
}
|
|
2144
|
+
return updatedState;
|
|
2145
|
+
}
|
|
2146
|
+
|
|
2147
|
+
/**
|
|
2148
|
+
* Rename an existing dataset in `visState`
|
|
2149
|
+
* @memberof visStateUpdaters
|
|
2150
|
+
* @public
|
|
2151
|
+
*/
|
|
2152
|
+
function renameDatasetUpdater(state, action) {
|
|
2153
|
+
return updateDatasetPropsUpdater(state, {
|
|
2154
|
+
dataId: action.dataId,
|
|
2155
|
+
props: {
|
|
2156
|
+
label: action.label
|
|
2157
|
+
}
|
|
2158
|
+
});
|
|
2159
|
+
}
|
|
2160
|
+
var ALLOWED_UPDATE_DATASET_PROPS = ['label', 'color', 'metadata'];
|
|
2161
|
+
|
|
2162
|
+
/**
|
|
2163
|
+
* Validates properties before updating the dataset.
|
|
2164
|
+
* Makes sure each property is in the allowed list
|
|
2165
|
+
* Makes sure color value is RGB
|
|
2166
|
+
* Performs deep merge when updating metadata
|
|
2167
|
+
*/
|
|
2168
|
+
var validateDatasetUpdateProps = function validateDatasetUpdateProps(props, dataset) {
|
|
2169
|
+
var validatedProps = Object.entries(props).reduce(function (acc, entry) {
|
|
2170
|
+
var _entry = (0, _slicedToArray2["default"])(entry, 2),
|
|
2171
|
+
key = _entry[0],
|
|
2172
|
+
value = _entry[1];
|
|
2173
|
+
// is it allowed ?
|
|
2174
|
+
if (!ALLOWED_UPDATE_DATASET_PROPS.includes(key)) {
|
|
2175
|
+
return acc;
|
|
2176
|
+
}
|
|
2177
|
+
|
|
2178
|
+
// if we are adding a color but it is not RGB we don't accept the value
|
|
2179
|
+
// in the future as we add more props we should change this if into a switch
|
|
2180
|
+
if (key === 'color' && !(0, _utils.isRgbColor)(value)) {
|
|
2181
|
+
return acc;
|
|
2182
|
+
}
|
|
2183
|
+
|
|
2184
|
+
// do we need deep merge ?
|
|
2185
|
+
return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, key, (0, _utils.isPlainObject)(value) ? (0, _deepmerge["default"])(dataset[key] || {}, value) : value));
|
|
2186
|
+
}, {});
|
|
2187
|
+
return validatedProps;
|
|
2188
|
+
};
|
|
2189
|
+
|
|
2190
|
+
/**
|
|
2191
|
+
* Update Dataset props (label, color, meta). Do not use to update data or any related properties
|
|
2192
|
+
* @memberof visStateUpdaters
|
|
2193
|
+
* @public
|
|
2194
|
+
*/
|
|
2195
|
+
function updateDatasetPropsUpdater(state, action) {
|
|
2196
|
+
var dataId = action.dataId,
|
|
2197
|
+
props = action.props;
|
|
2198
|
+
var datasets = state.datasets;
|
|
2199
|
+
var existing = datasets[dataId];
|
|
2200
|
+
if (existing) {
|
|
2201
|
+
var validatedProps = validateDatasetUpdateProps(props, existing);
|
|
2202
|
+
// validate props: just color for now
|
|
2203
|
+
// we only allow label, color and meta to be updated
|
|
2204
|
+
// const newTable = copyTableAndUpdate(existing, validatedProps);
|
|
2205
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2206
|
+
datasets: _objectSpread(_objectSpread({}, datasets), {}, (0, _defineProperty2["default"])({}, dataId, (0, _table.copyTableAndUpdate)(existing, validatedProps)))
|
|
2207
|
+
});
|
|
2208
|
+
}
|
|
2209
|
+
return state;
|
|
2210
|
+
}
|
|
2211
|
+
|
|
2212
|
+
/**
|
|
2213
|
+
* When a user clicks on the specific map closing icon
|
|
2214
|
+
* the application will close the selected map
|
|
2215
|
+
* and will merge the remaining one with the global state
|
|
2216
|
+
* TODO: i think in the future this action should be called merge map layers with global settings
|
|
2217
|
+
* @param {Object} state `visState`
|
|
2218
|
+
* @param {Object} action action
|
|
2219
|
+
* @returns {Object} nextState
|
|
2220
|
+
*/
|
|
2221
|
+
function closeSpecificMapAtIndex(state, action) {
|
|
2222
|
+
var _state$splitMaps$inde;
|
|
2223
|
+
// retrieve layers meta data from the remaining map that we need to keep
|
|
2224
|
+
var indexToRetrieve = 1 - action.payload;
|
|
2225
|
+
var mapLayers = (_state$splitMaps$inde = state.splitMaps[indexToRetrieve]) === null || _state$splitMaps$inde === void 0 ? void 0 : _state$splitMaps$inde.layers;
|
|
2226
|
+
var layers = state.layers;
|
|
2227
|
+
|
|
2228
|
+
// update layer visibility
|
|
2229
|
+
var newLayers = layers.map(function (layer) {
|
|
2230
|
+
return mapLayers && !mapLayers[layer.id] && layer.config.isVisible ? layer.updateLayerConfig({
|
|
2231
|
+
// if layer.id is not in mapLayers, it should be inVisible
|
|
2232
|
+
isVisible: false
|
|
2233
|
+
}) : layer;
|
|
2234
|
+
});
|
|
2235
|
+
|
|
2236
|
+
// delete map
|
|
2237
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2238
|
+
layers: newLayers,
|
|
2239
|
+
splitMaps: []
|
|
2240
|
+
});
|
|
2241
|
+
}
|
|
2242
|
+
|
|
2243
|
+
/**
|
|
2244
|
+
* Trigger file loading dispatch `addDataToMap` if succeed, or `loadFilesErr` if failed
|
|
2245
|
+
* @memberof visStateUpdaters
|
|
2246
|
+
* @public
|
|
2247
|
+
*/
|
|
2248
|
+
var loadFilesUpdater = exports.loadFilesUpdater = function loadFilesUpdater(state, action) {
|
|
2249
|
+
var files = action.files,
|
|
2250
|
+
_action$onFinish = action.onFinish,
|
|
2251
|
+
onFinish = _action$onFinish === void 0 ? _actions.loadFilesSuccess : _action$onFinish;
|
|
2252
|
+
if (!files.length) {
|
|
2253
|
+
return state;
|
|
2254
|
+
}
|
|
2255
|
+
var fileLoadingProgress = Array.from(files).reduce(function (accu, f, i) {
|
|
2256
|
+
return (0, _composerHelpers.merge_)(initialFileLoadingProgress(f, i))(accu);
|
|
2257
|
+
}, {});
|
|
2258
|
+
var fileLoading = {
|
|
2259
|
+
fileCache: [],
|
|
2260
|
+
filesToLoad: files,
|
|
2261
|
+
onFinish: onFinish
|
|
2262
|
+
};
|
|
2263
|
+
var nextState = (0, _composerHelpers.merge_)({
|
|
2264
|
+
fileLoadingProgress: fileLoadingProgress,
|
|
2265
|
+
fileLoading: fileLoading
|
|
2266
|
+
})(state);
|
|
2267
|
+
return loadNextFileUpdater(nextState);
|
|
2268
|
+
};
|
|
2269
|
+
|
|
2270
|
+
/**
|
|
2271
|
+
* Sucessfully loaded one file, move on to the next one
|
|
2272
|
+
* @memberof visStateUpdaters
|
|
2273
|
+
* @public
|
|
2274
|
+
*/
|
|
2275
|
+
function loadFileStepSuccessUpdater(state, action) {
|
|
2276
|
+
if (!state.fileLoading) {
|
|
2277
|
+
return state;
|
|
2278
|
+
}
|
|
2279
|
+
var fileName = action.fileName,
|
|
2280
|
+
fileCache = action.fileCache;
|
|
2281
|
+
var _state$fileLoading = state.fileLoading,
|
|
2282
|
+
filesToLoad = _state$fileLoading.filesToLoad,
|
|
2283
|
+
onFinish = _state$fileLoading.onFinish;
|
|
2284
|
+
var stateWithProgress = updateFileLoadingProgressUpdater(state, {
|
|
2285
|
+
fileName: fileName,
|
|
2286
|
+
progress: {
|
|
2287
|
+
percent: 1,
|
|
2288
|
+
message: 'Done'
|
|
2289
|
+
}
|
|
2290
|
+
});
|
|
2291
|
+
|
|
2292
|
+
// save processed file to fileCache
|
|
2293
|
+
var stateWithCache = (0, _composerHelpers.pick_)('fileLoading')((0, _composerHelpers.merge_)({
|
|
2294
|
+
fileCache: fileCache
|
|
2295
|
+
}))(stateWithProgress);
|
|
2296
|
+
return (0, _tasks.withTask)(stateWithCache, (0, _tasks2.DELAY_TASK)(200).map(filesToLoad.length ? _actions.loadNextFile : function () {
|
|
2297
|
+
return onFinish(fileCache);
|
|
2298
|
+
}));
|
|
2299
|
+
}
|
|
2300
|
+
|
|
2301
|
+
// withTask<T>(state: T, task: any): T
|
|
2302
|
+
|
|
2303
|
+
/**
|
|
2304
|
+
*
|
|
2305
|
+
* @memberof visStateUpdaters
|
|
2306
|
+
* @public
|
|
2307
|
+
*/
|
|
2308
|
+
function loadNextFileUpdater(state) {
|
|
2309
|
+
if (!state.fileLoading) {
|
|
2310
|
+
return state;
|
|
2311
|
+
}
|
|
2312
|
+
var filesToLoad = state.fileLoading.filesToLoad;
|
|
2313
|
+
var _filesToLoad = (0, _toArray2["default"])(filesToLoad),
|
|
2314
|
+
file = _filesToLoad[0],
|
|
2315
|
+
remainingFilesToLoad = _filesToLoad.slice(1);
|
|
2316
|
+
|
|
2317
|
+
// save filesToLoad to state
|
|
2318
|
+
var nextState = (0, _composerHelpers.pick_)('fileLoading')((0, _composerHelpers.merge_)({
|
|
2319
|
+
filesToLoad: remainingFilesToLoad
|
|
2320
|
+
}))(state);
|
|
2321
|
+
var stateWithProgress = updateFileLoadingProgressUpdater(nextState, {
|
|
2322
|
+
fileName: file.name,
|
|
2323
|
+
progress: {
|
|
2324
|
+
percent: 0,
|
|
2325
|
+
message: 'loading...'
|
|
2326
|
+
}
|
|
2327
|
+
});
|
|
2328
|
+
var loaders = state.loaders,
|
|
2329
|
+
loadOptions = state.loadOptions;
|
|
2330
|
+
return (0, _tasks.withTask)(stateWithProgress, makeLoadFileTask(file, nextState.fileLoading && nextState.fileLoading.fileCache, loaders, loadOptions));
|
|
2331
|
+
}
|
|
2332
|
+
function makeLoadFileTask(file, fileCache) {
|
|
2333
|
+
var loaders = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
2334
|
+
var loadOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
2335
|
+
return (0, _tasks2.LOAD_FILE_TASK)({
|
|
2336
|
+
file: file,
|
|
2337
|
+
fileCache: fileCache,
|
|
2338
|
+
loaders: loaders,
|
|
2339
|
+
loadOptions: loadOptions
|
|
2340
|
+
}).bimap(
|
|
2341
|
+
// prettier ignore
|
|
2342
|
+
// success
|
|
2343
|
+
function (gen) {
|
|
2344
|
+
return (0, _actions.nextFileBatch)({
|
|
2345
|
+
gen: gen,
|
|
2346
|
+
fileName: file.name,
|
|
2347
|
+
onFinish: function onFinish(result) {
|
|
2348
|
+
return (0, _actions.processFileContent)({
|
|
2349
|
+
content: result,
|
|
2350
|
+
fileCache: fileCache
|
|
2351
|
+
});
|
|
2352
|
+
}
|
|
2353
|
+
});
|
|
2354
|
+
},
|
|
2355
|
+
// error
|
|
2356
|
+
function (err) {
|
|
2357
|
+
return (0, _actions.loadFilesErr)(file.name, err);
|
|
2358
|
+
});
|
|
2359
|
+
}
|
|
2360
|
+
|
|
2361
|
+
/**
|
|
2362
|
+
*
|
|
2363
|
+
* @memberof visStateUpdaters
|
|
2364
|
+
* @public
|
|
2365
|
+
*/
|
|
2366
|
+
function processFileContentUpdater(state, action) {
|
|
2367
|
+
var _action$payload2 = action.payload,
|
|
2368
|
+
content = _action$payload2.content,
|
|
2369
|
+
fileCache = _action$payload2.fileCache;
|
|
2370
|
+
var stateWithProgress = updateFileLoadingProgressUpdater(state, {
|
|
2371
|
+
fileName: content.fileName,
|
|
2372
|
+
progress: {
|
|
2373
|
+
percent: 1,
|
|
2374
|
+
message: 'processing...'
|
|
2375
|
+
}
|
|
2376
|
+
});
|
|
2377
|
+
return (0, _tasks.withTask)(stateWithProgress, (0, _tasks2.PROCESS_FILE_DATA)({
|
|
2378
|
+
content: content,
|
|
2379
|
+
fileCache: fileCache
|
|
2380
|
+
}).bimap(function (result) {
|
|
2381
|
+
return (0, _actions.loadFileStepSuccess)({
|
|
2382
|
+
fileName: content.fileName,
|
|
2383
|
+
fileCache: result
|
|
2384
|
+
});
|
|
2385
|
+
}, function (err) {
|
|
2386
|
+
return (0, _actions.loadFilesErr)(content.fileName, err);
|
|
2387
|
+
}));
|
|
2388
|
+
}
|
|
2389
|
+
|
|
2390
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2391
|
+
function parseProgress() {
|
|
2392
|
+
var prevProgress = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
2393
|
+
var progress = arguments.length > 1 ? arguments[1] : undefined;
|
|
2394
|
+
// This happens when receiving query metadata or other cases we don't
|
|
2395
|
+
// have an update for the user.
|
|
2396
|
+
if (!progress || !progress.percent) {
|
|
2397
|
+
return {};
|
|
2398
|
+
}
|
|
2399
|
+
return {
|
|
2400
|
+
percent: progress.percent
|
|
2401
|
+
};
|
|
2402
|
+
}
|
|
2403
|
+
|
|
2404
|
+
/**
|
|
2405
|
+
* gets called with payload = AsyncGenerator<???>
|
|
2406
|
+
* @memberof visStateUpdaters
|
|
2407
|
+
* @public
|
|
2408
|
+
*/
|
|
2409
|
+
var nextFileBatchUpdater = exports.nextFileBatchUpdater = function nextFileBatchUpdater(state, _ref18) {
|
|
2410
|
+
var _accumulated$data;
|
|
2411
|
+
var _ref18$payload = _ref18.payload,
|
|
2412
|
+
gen = _ref18$payload.gen,
|
|
2413
|
+
fileName = _ref18$payload.fileName,
|
|
2414
|
+
progress = _ref18$payload.progress,
|
|
2415
|
+
accumulated = _ref18$payload.accumulated,
|
|
2416
|
+
onFinish = _ref18$payload.onFinish;
|
|
2417
|
+
var stateWithProgress = updateFileLoadingProgressUpdater(state, {
|
|
2418
|
+
fileName: fileName,
|
|
2419
|
+
progress: parseProgress(state.fileLoadingProgress[fileName], progress)
|
|
2420
|
+
});
|
|
2421
|
+
return (0, _tasks.withTask)(stateWithProgress, [].concat((0, _toConsumableArray2["default"])(fileName.endsWith('arrow') && (accumulated === null || accumulated === void 0 || (_accumulated$data = accumulated.data) === null || _accumulated$data === void 0 ? void 0 : _accumulated$data.length) > 0 ? [(0, _tasks2.PROCESS_FILE_DATA)({
|
|
2422
|
+
content: accumulated,
|
|
2423
|
+
fileCache: []
|
|
2424
|
+
}).bimap(function (result) {
|
|
2425
|
+
return (0, _actions.loadFilesSuccess)(result);
|
|
2426
|
+
}, function (err) {
|
|
2427
|
+
return (0, _actions.loadFilesErr)(fileName, err);
|
|
2428
|
+
})] : []), [(0, _tasks2.UNWRAP_TASK)(gen.next()).bimap(function (_ref19) {
|
|
2429
|
+
var value = _ref19.value,
|
|
2430
|
+
done = _ref19.done;
|
|
2431
|
+
return done ? onFinish(accumulated) : (0, _actions.nextFileBatch)({
|
|
2432
|
+
gen: gen,
|
|
2433
|
+
fileName: fileName,
|
|
2434
|
+
progress: value.progress,
|
|
2435
|
+
accumulated: value,
|
|
2436
|
+
onFinish: onFinish
|
|
2437
|
+
});
|
|
2438
|
+
}, function (err) {
|
|
2439
|
+
return (0, _actions.loadFilesErr)(fileName, err);
|
|
2440
|
+
})]));
|
|
2441
|
+
};
|
|
2442
|
+
|
|
2443
|
+
/**
|
|
2444
|
+
* Trigger loading file error
|
|
2445
|
+
* @memberof visStateUpdaters
|
|
2446
|
+
* @public
|
|
2447
|
+
*/
|
|
2448
|
+
var loadFilesErrUpdater = exports.loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref20) {
|
|
2449
|
+
var error = _ref20.error,
|
|
2450
|
+
fileName = _ref20.fileName;
|
|
2451
|
+
// update ui with error message
|
|
2452
|
+
_window.console.warn(error);
|
|
2453
|
+
if (!state.fileLoading) {
|
|
2454
|
+
return state;
|
|
2455
|
+
}
|
|
2456
|
+
var _state$fileLoading2 = state.fileLoading,
|
|
2457
|
+
filesToLoad = _state$fileLoading2.filesToLoad,
|
|
2458
|
+
onFinish = _state$fileLoading2.onFinish,
|
|
2459
|
+
fileCache = _state$fileLoading2.fileCache;
|
|
2460
|
+
var nextState = updateFileLoadingProgressUpdater(state, {
|
|
2461
|
+
fileName: fileName,
|
|
2462
|
+
progress: {
|
|
2463
|
+
error: error
|
|
2464
|
+
}
|
|
2465
|
+
});
|
|
2466
|
+
|
|
2467
|
+
// kick off next file or finish
|
|
2468
|
+
return (0, _tasks.withTask)(nextState, (0, _tasks2.DELAY_TASK)(200).map(filesToLoad.length ? _actions.loadNextFile : function () {
|
|
2469
|
+
return onFinish(fileCache);
|
|
2470
|
+
}));
|
|
2471
|
+
};
|
|
2472
|
+
|
|
2473
|
+
/**
|
|
2474
|
+
* When select dataset for export, apply cpu filter to selected dataset
|
|
2475
|
+
* @memberof visStateUpdaters
|
|
2476
|
+
* @public
|
|
2477
|
+
*/
|
|
2478
|
+
var applyCPUFilterUpdater = exports.applyCPUFilterUpdater = function applyCPUFilterUpdater(state, _ref21) {
|
|
2479
|
+
var dataId = _ref21.dataId;
|
|
2480
|
+
// apply cpuFilter
|
|
2481
|
+
var dataIds = (0, _commonUtils.toArray)(dataId);
|
|
2482
|
+
return dataIds.reduce(function (accu, id) {
|
|
2483
|
+
return (0, _utils.filterDatasetCPU)(accu, id);
|
|
2484
|
+
}, state);
|
|
2485
|
+
};
|
|
2486
|
+
|
|
2487
|
+
/**
|
|
2488
|
+
* User input to update the info of the map
|
|
2489
|
+
* @memberof visStateUpdaters
|
|
2490
|
+
* @public
|
|
2491
|
+
*/
|
|
2492
|
+
var setMapInfoUpdater = exports.setMapInfoUpdater = function setMapInfoUpdater(state, action) {
|
|
2493
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2494
|
+
mapInfo: _objectSpread(_objectSpread({}, state.mapInfo), action.info)
|
|
2495
|
+
});
|
|
2496
|
+
};
|
|
2497
|
+
/**
|
|
2498
|
+
* Helper function to update All layer domain and layer data of state
|
|
2499
|
+
*/
|
|
2500
|
+
function addDefaultLayers(state, datasets) {
|
|
2501
|
+
var empty = [];
|
|
2502
|
+
var defaultLayers = Object.values(datasets).reduce(function (accu, dataset) {
|
|
2503
|
+
var foundLayers = (0, _layerUtils.findDefaultLayer)(dataset, state.layerClasses);
|
|
2504
|
+
return foundLayers && foundLayers.length ? accu.concat(foundLayers) : accu;
|
|
2505
|
+
}, empty);
|
|
2506
|
+
return {
|
|
2507
|
+
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
2508
|
+
layers: [].concat((0, _toConsumableArray2["default"])(state.layers), (0, _toConsumableArray2["default"])(defaultLayers)),
|
|
2509
|
+
layerOrder: [].concat((0, _toConsumableArray2["default"])((0, _layerUtils.getLayerOrderFromLayers)(defaultLayers)), (0, _toConsumableArray2["default"])(state.layerOrder))
|
|
2510
|
+
}),
|
|
2511
|
+
newLayers: defaultLayers
|
|
2512
|
+
};
|
|
2513
|
+
}
|
|
2514
|
+
|
|
2515
|
+
/**
|
|
2516
|
+
* helper function to find default tooltips
|
|
2517
|
+
* @param {Object} state
|
|
2518
|
+
* @param {Object} dataset
|
|
2519
|
+
* @returns {Object} nextState
|
|
2520
|
+
*/
|
|
2521
|
+
function addDefaultTooltips(state, dataset) {
|
|
2522
|
+
var tooltipFields = (0, _interactionUtils.findFieldsToShow)(_objectSpread(_objectSpread({}, dataset), {}, {
|
|
2523
|
+
maxDefaultTooltips: state.maxDefaultTooltips
|
|
2524
|
+
}));
|
|
2525
|
+
var merged = _objectSpread(_objectSpread({}, state.interactionConfig.tooltip.config.fieldsToShow), tooltipFields);
|
|
2526
|
+
return (0, _utils.set)(['interactionConfig', 'tooltip', 'config', 'fieldsToShow'], merged, state);
|
|
2527
|
+
}
|
|
2528
|
+
function initialFileLoadingProgress(file, index) {
|
|
2529
|
+
var fileName = file.name || "Untitled File ".concat(index);
|
|
2530
|
+
return (0, _defineProperty2["default"])({}, fileName, {
|
|
2531
|
+
// percent of current file
|
|
2532
|
+
percent: 0,
|
|
2533
|
+
message: '',
|
|
2534
|
+
fileName: fileName,
|
|
2535
|
+
error: null
|
|
2536
|
+
});
|
|
2537
|
+
}
|
|
2538
|
+
function updateFileLoadingProgressUpdater(state, _ref23) {
|
|
2539
|
+
var fileName = _ref23.fileName,
|
|
2540
|
+
progress = _ref23.progress;
|
|
2541
|
+
// @ts-expect-error
|
|
2542
|
+
return (0, _composerHelpers.pick_)('fileLoadingProgress')((0, _composerHelpers.pick_)(fileName)((0, _composerHelpers.merge_)(progress)))(state);
|
|
2543
|
+
}
|
|
2544
|
+
/**
|
|
2545
|
+
* Helper function to update layer domains for an array of datasets
|
|
2546
|
+
*/
|
|
2547
|
+
function updateAllLayerDomainData(state, dataId, updatedFilter) {
|
|
2548
|
+
var dataIds = typeof dataId === 'string' ? [dataId] : dataId;
|
|
2549
|
+
var newLayers = [];
|
|
2550
|
+
var newLayerData = [];
|
|
2551
|
+
state.layers.forEach(function (oldLayer, i) {
|
|
2552
|
+
if (oldLayer.config.dataId && dataIds.includes(oldLayer.config.dataId)) {
|
|
2553
|
+
// No need to recalculate layer domain if filter has fixed domain
|
|
2554
|
+
var newLayer = updatedFilter && updatedFilter.fixedDomain ? oldLayer : oldLayer.updateLayerDomain(state.datasets, updatedFilter);
|
|
2555
|
+
var _calculateLayerData7 = (0, _layerUtils.calculateLayerData)(newLayer, state, state.layerData[i]),
|
|
2556
|
+
layerData = _calculateLayerData7.layerData,
|
|
2557
|
+
layer = _calculateLayerData7.layer;
|
|
2558
|
+
newLayers.push(layer);
|
|
2559
|
+
newLayerData.push(layerData);
|
|
2560
|
+
} else {
|
|
2561
|
+
newLayers.push(oldLayer);
|
|
2562
|
+
newLayerData.push(state.layerData[i]);
|
|
2563
|
+
}
|
|
2564
|
+
});
|
|
2565
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2566
|
+
layers: newLayers,
|
|
2567
|
+
layerData: newLayerData
|
|
2568
|
+
});
|
|
2569
|
+
return newState;
|
|
2570
|
+
}
|
|
2571
|
+
function updateAnimationDomain(state) {
|
|
2572
|
+
var _state$filters;
|
|
2573
|
+
// merge all animatable layer domain and update global config
|
|
2574
|
+
var animatableLayers = (0, _utils.getAnimatableVisibleLayers)(state.layers);
|
|
2575
|
+
if (!animatableLayers.length) {
|
|
2576
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2577
|
+
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
2578
|
+
domain: null,
|
|
2579
|
+
isAnimating: false,
|
|
2580
|
+
timeSteps: null,
|
|
2581
|
+
defaultTimeFormat: null
|
|
2582
|
+
})
|
|
2583
|
+
});
|
|
2584
|
+
}
|
|
2585
|
+
var layerDomains = animatableLayers.map(function (l) {
|
|
2586
|
+
return l.config.animation.domain || [];
|
|
2587
|
+
});
|
|
2588
|
+
// @ts-ignore
|
|
2589
|
+
var mergedDomain = (0, _utils.mergeTimeDomains)(layerDomains);
|
|
2590
|
+
var defaultTimeFormat = (0, _utils.getTimeWidgetTitleFormatter)(mergedDomain);
|
|
2591
|
+
|
|
2592
|
+
// merge timeSteps
|
|
2593
|
+
var mergedTimeSteps = (0, _lodash5["default"])(animatableLayers.reduce(function (accu, layer) {
|
|
2594
|
+
accu.push.apply(accu, (0, _toConsumableArray2["default"])(layer.config.animation.timeSteps || []));
|
|
2595
|
+
return accu;
|
|
2596
|
+
}, [])).sort();
|
|
2597
|
+
mergedTimeSteps = mergedTimeSteps.length ? mergedTimeSteps : null;
|
|
2598
|
+
|
|
2599
|
+
// TODO: better handling of duration calculation
|
|
2600
|
+
var duration = mergedTimeSteps ? _constants.BASE_SPEED * (1000 / _constants.FPS) / mergedTimeSteps.length / (state.animationConfig.speed || 1) : null;
|
|
2601
|
+
var nextState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2602
|
+
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
2603
|
+
domain: mergedDomain,
|
|
2604
|
+
defaultTimeFormat: defaultTimeFormat,
|
|
2605
|
+
duration: duration,
|
|
2606
|
+
timeSteps: mergedTimeSteps
|
|
2607
|
+
})
|
|
2608
|
+
});
|
|
2609
|
+
|
|
2610
|
+
// reset currentTime based on new domain
|
|
2611
|
+
var syncedFilter = (_state$filters = state.filters) === null || _state$filters === void 0 ? void 0 : _state$filters.find(function (f) {
|
|
2612
|
+
return f.syncedWithLayerTimeline;
|
|
2613
|
+
});
|
|
2614
|
+
|
|
2615
|
+
// if synced filter exist wee need to merge animationConfig and filter domains
|
|
2616
|
+
// and validate the current time against the new merged domain
|
|
2617
|
+
var newAnimationDomain = syncedFilter ? (0, _utils.mergeTimeDomains)([mergedDomain, syncedFilter.domain]) : mergedDomain;
|
|
2618
|
+
var currentTime = (0, _utils.isInRange)(state.animationConfig.currentTime, newAnimationDomain) ? state.animationConfig.currentTime : newAnimationDomain[0];
|
|
2619
|
+
if (currentTime !== state.animationConfig.currentTime) {
|
|
2620
|
+
// if currentTime changed, need to call animationTimeUpdater to re call formatLayerData
|
|
2621
|
+
return setLayerAnimationTimeUpdater(nextState, {
|
|
2622
|
+
value: currentTime
|
|
2623
|
+
});
|
|
2624
|
+
}
|
|
2625
|
+
return nextState;
|
|
2626
|
+
}
|
|
2627
|
+
|
|
2628
|
+
/**
|
|
2629
|
+
* Update the status of the editor
|
|
2630
|
+
* @memberof visStateUpdaters
|
|
2631
|
+
*/
|
|
2632
|
+
var setEditorModeUpdater = exports.setEditorModeUpdater = function setEditorModeUpdater(state, _ref24) {
|
|
2633
|
+
var mode = _ref24.mode;
|
|
2634
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2635
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2636
|
+
mode: mode,
|
|
2637
|
+
selectedFeature: null
|
|
2638
|
+
})
|
|
2639
|
+
});
|
|
2640
|
+
};
|
|
2641
|
+
|
|
2642
|
+
// const featureToFilterValue = (feature) => ({...feature, id: feature.id});
|
|
2643
|
+
/**
|
|
2644
|
+
* Update editor features
|
|
2645
|
+
* @memberof visStateUpdaters
|
|
2646
|
+
*/
|
|
2647
|
+
function setFeaturesUpdater(state, _ref25) {
|
|
2648
|
+
var _ref25$features = _ref25.features,
|
|
2649
|
+
features = _ref25$features === void 0 ? [] : _ref25$features;
|
|
2650
|
+
var lastFeature = features.length && features[features.length - 1];
|
|
2651
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2652
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2653
|
+
// only save none filter features to editor
|
|
2654
|
+
features: features.filter(function (f) {
|
|
2655
|
+
return !(0, _utils.getFilterIdInFeature)(f);
|
|
2656
|
+
}),
|
|
2657
|
+
mode: lastFeature && lastFeature.properties.isClosed ? _constants.EDITOR_MODES.EDIT : state.editor.mode
|
|
2658
|
+
})
|
|
2659
|
+
});
|
|
2660
|
+
|
|
2661
|
+
// Retrieve existing feature
|
|
2662
|
+
var selectedFeature = state.editor.selectedFeature;
|
|
2663
|
+
|
|
2664
|
+
// If no feature is selected we can simply return since no operations
|
|
2665
|
+
if (!selectedFeature) {
|
|
2666
|
+
return newState;
|
|
2667
|
+
}
|
|
2668
|
+
|
|
2669
|
+
// TODO: check if the feature has changed
|
|
2670
|
+
var feature = features.find(function (f) {
|
|
2671
|
+
return f.id === selectedFeature.id;
|
|
2672
|
+
});
|
|
2673
|
+
|
|
2674
|
+
// if feature is part of a filter
|
|
2675
|
+
var filterId = feature && (0, _utils.getFilterIdInFeature)(feature);
|
|
2676
|
+
if (filterId && feature) {
|
|
2677
|
+
// add bbox for polygon filter to speed up filtering
|
|
2678
|
+
if (feature.properties) feature.properties.bbox = (0, _bbox["default"])(feature);
|
|
2679
|
+
var featureValue = (0, _utils.featureToFilterValue)(feature, filterId);
|
|
2680
|
+
var filterIdx = state.filters.findIndex(function (fil) {
|
|
2681
|
+
return fil.id === filterId;
|
|
2682
|
+
});
|
|
2683
|
+
// @ts-ignore
|
|
2684
|
+
return setFilterUpdater(newState, {
|
|
2685
|
+
idx: filterIdx,
|
|
2686
|
+
prop: 'value',
|
|
2687
|
+
value: featureValue
|
|
2688
|
+
});
|
|
2689
|
+
}
|
|
2690
|
+
return newState;
|
|
2691
|
+
}
|
|
2692
|
+
|
|
2693
|
+
/**
|
|
2694
|
+
* Set the current selected feature
|
|
2695
|
+
* @memberof uiStateUpdaters
|
|
2696
|
+
*/
|
|
2697
|
+
var setSelectedFeatureUpdater = exports.setSelectedFeatureUpdater = function setSelectedFeatureUpdater(state, _ref26) {
|
|
2698
|
+
var feature = _ref26.feature,
|
|
2699
|
+
selectionContext = _ref26.selectionContext;
|
|
2700
|
+
// add bbox for polygon filter to speed up filtering
|
|
2701
|
+
if (feature && feature.properties) feature.properties.bbox = (0, _bbox["default"])(feature);
|
|
2702
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2703
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2704
|
+
selectedFeature: feature,
|
|
2705
|
+
selectionContext: selectionContext
|
|
2706
|
+
})
|
|
2707
|
+
});
|
|
2708
|
+
};
|
|
2709
|
+
|
|
2710
|
+
/**
|
|
2711
|
+
* Delete existing feature from filters
|
|
2712
|
+
* @memberof visStateUpdaters
|
|
2713
|
+
*/
|
|
2714
|
+
function deleteFeatureUpdater(state, _ref27) {
|
|
2715
|
+
var feature = _ref27.feature;
|
|
2716
|
+
if (!feature) {
|
|
2717
|
+
return state;
|
|
2718
|
+
}
|
|
2719
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2720
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2721
|
+
selectedFeature: null
|
|
2722
|
+
})
|
|
2723
|
+
});
|
|
2724
|
+
if ((0, _utils.getFilterIdInFeature)(feature)) {
|
|
2725
|
+
var filterIdx = newState.filters.findIndex(function (f) {
|
|
2726
|
+
return f.id === (0, _utils.getFilterIdInFeature)(feature);
|
|
2727
|
+
});
|
|
2728
|
+
return filterIdx > -1 ? removeFilterUpdater(newState, {
|
|
2729
|
+
idx: filterIdx
|
|
2730
|
+
}) : newState;
|
|
2731
|
+
}
|
|
2732
|
+
|
|
2733
|
+
// modify editor object
|
|
2734
|
+
var newEditor = _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2735
|
+
features: state.editor.features.filter(function (f) {
|
|
2736
|
+
return f.id !== feature.id;
|
|
2737
|
+
}),
|
|
2738
|
+
selectedFeature: null
|
|
2739
|
+
});
|
|
2740
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2741
|
+
editor: newEditor
|
|
2742
|
+
});
|
|
2743
|
+
}
|
|
2744
|
+
|
|
2745
|
+
/**
|
|
2746
|
+
* Toggle feature as layer filter
|
|
2747
|
+
* @memberof visStateUpdaters
|
|
2748
|
+
*/
|
|
2749
|
+
function setPolygonFilterLayerUpdater(state, payload) {
|
|
2750
|
+
var layer = payload.layer,
|
|
2751
|
+
feature = payload.feature;
|
|
2752
|
+
var filterId = (0, _utils.getFilterIdInFeature)(feature);
|
|
2753
|
+
|
|
2754
|
+
// let newFilter = null;
|
|
2755
|
+
var filterIdx;
|
|
2756
|
+
var newLayerId = [layer.id];
|
|
2757
|
+
var newState = state;
|
|
2758
|
+
// If polygon filter already exists, we need to find out if the current layer is already included
|
|
2759
|
+
if (filterId) {
|
|
2760
|
+
filterIdx = state.filters.findIndex(function (f) {
|
|
2761
|
+
return f.id === filterId;
|
|
2762
|
+
});
|
|
2763
|
+
if (!state.filters[filterIdx]) {
|
|
2764
|
+
// what if filter doesn't exist?... not possible.
|
|
2765
|
+
// because features in the editor is passed in from filters and editors.
|
|
2766
|
+
// but we will move this feature back to editor just in case
|
|
2767
|
+
var noneFilterFeature = _objectSpread(_objectSpread({}, feature), {}, {
|
|
2768
|
+
properties: _objectSpread(_objectSpread({}, feature.properties), {}, {
|
|
2769
|
+
filterId: null
|
|
2770
|
+
})
|
|
2771
|
+
});
|
|
2772
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2773
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2774
|
+
features: [].concat((0, _toConsumableArray2["default"])(state.editor.features), [noneFilterFeature]),
|
|
2775
|
+
selectedFeature: noneFilterFeature
|
|
2776
|
+
})
|
|
2777
|
+
});
|
|
2778
|
+
}
|
|
2779
|
+
var filter = state.filters[filterIdx];
|
|
2780
|
+
var _filter$layerId = filter.layerId,
|
|
2781
|
+
layerId = _filter$layerId === void 0 ? [] : _filter$layerId;
|
|
2782
|
+
var isLayerIncluded = layerId.includes(layer.id);
|
|
2783
|
+
newLayerId = isLayerIncluded ?
|
|
2784
|
+
// if layer is included, remove it
|
|
2785
|
+
layerId.filter(function (l) {
|
|
2786
|
+
return l !== layer.id;
|
|
2787
|
+
}) : [].concat((0, _toConsumableArray2["default"])(layerId), [layer.id]);
|
|
2788
|
+
} else {
|
|
2789
|
+
// if we haven't create the polygon filter, create it
|
|
2790
|
+
var newFilter = (0, _utils.generatePolygonFilter)([], feature);
|
|
2791
|
+
filterIdx = state.filters.length;
|
|
2792
|
+
|
|
2793
|
+
// add feature, remove feature from eidtor
|
|
2794
|
+
newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2795
|
+
filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [newFilter]),
|
|
2796
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2797
|
+
features: state.editor.features.filter(function (f) {
|
|
2798
|
+
return f.id !== feature.id;
|
|
2799
|
+
}),
|
|
2800
|
+
selectedFeature: newFilter.value
|
|
2801
|
+
})
|
|
2802
|
+
});
|
|
2803
|
+
}
|
|
2804
|
+
return setFilterUpdater(newState, {
|
|
2805
|
+
idx: filterIdx,
|
|
2806
|
+
prop: 'layerId',
|
|
2807
|
+
value: newLayerId
|
|
2808
|
+
});
|
|
2809
|
+
}
|
|
2810
|
+
|
|
2811
|
+
/**
|
|
2812
|
+
* @memberof visStateUpdaters
|
|
2813
|
+
* @public
|
|
2814
|
+
*/
|
|
2815
|
+
function sortTableColumnUpdater(state, _ref28) {
|
|
2816
|
+
var dataId = _ref28.dataId,
|
|
2817
|
+
column = _ref28.column,
|
|
2818
|
+
mode = _ref28.mode;
|
|
2819
|
+
var dataset = state.datasets[dataId];
|
|
2820
|
+
if (!dataset) {
|
|
2821
|
+
return state;
|
|
2822
|
+
}
|
|
2823
|
+
var sortMode = mode;
|
|
2824
|
+
if (!sortMode) {
|
|
2825
|
+
var currentMode = (0, _lodash2["default"])(dataset, ['sortColumn', column]);
|
|
2826
|
+
// @ts-ignore - should be fixable in a TS file
|
|
2827
|
+
sortMode = currentMode ? Object.keys(_constants.SORT_ORDER).find(function (m) {
|
|
2828
|
+
return m !== currentMode;
|
|
2829
|
+
}) : _constants.SORT_ORDER.ASCENDING;
|
|
2830
|
+
}
|
|
2831
|
+
var sorted = (0, _table.sortDatasetByColumn)(dataset, column, sortMode);
|
|
2832
|
+
return (0, _utils.set)(['datasets', dataId], sorted, state);
|
|
2833
|
+
}
|
|
2834
|
+
|
|
2835
|
+
/**
|
|
2836
|
+
* @memberof visStateUpdaters
|
|
2837
|
+
* @public
|
|
2838
|
+
*/
|
|
2839
|
+
function pinTableColumnUpdater(state, _ref29) {
|
|
2840
|
+
var dataId = _ref29.dataId,
|
|
2841
|
+
column = _ref29.column;
|
|
2842
|
+
var dataset = state.datasets[dataId];
|
|
2843
|
+
if (!dataset) {
|
|
2844
|
+
return state;
|
|
2845
|
+
}
|
|
2846
|
+
var newDataset = (0, _table.pinTableColumns)(dataset, column);
|
|
2847
|
+
return (0, _utils.set)(['datasets', dataId], newDataset, state);
|
|
2848
|
+
}
|
|
2849
|
+
|
|
2850
|
+
/**
|
|
2851
|
+
* Copy column content as strings
|
|
2852
|
+
* @memberof visStateUpdaters
|
|
2853
|
+
* @public
|
|
2854
|
+
*/
|
|
2855
|
+
function copyTableColumnUpdater(state, _ref30) {
|
|
2856
|
+
var dataId = _ref30.dataId,
|
|
2857
|
+
column = _ref30.column;
|
|
2858
|
+
var dataset = state.datasets[dataId];
|
|
2859
|
+
if (!dataset) {
|
|
2860
|
+
return state;
|
|
2861
|
+
}
|
|
2862
|
+
var fieldIdx = dataset.fields.findIndex(function (f) {
|
|
2863
|
+
return f.name === column;
|
|
2864
|
+
});
|
|
2865
|
+
if (fieldIdx < 0) {
|
|
2866
|
+
return state;
|
|
2867
|
+
}
|
|
2868
|
+
var type = dataset.fields[fieldIdx].type;
|
|
2869
|
+
var text = dataset.dataContainer.map(function (row) {
|
|
2870
|
+
return (0, _utils.parseFieldValue)(row.valueAt(fieldIdx), type);
|
|
2871
|
+
}, true).join('\n');
|
|
2872
|
+
(0, _copyToClipboard["default"])(text);
|
|
2873
|
+
return state;
|
|
2874
|
+
}
|
|
2875
|
+
|
|
2876
|
+
/**
|
|
2877
|
+
* Set display format from columns from user selection
|
|
2878
|
+
* @memberof visStateUpdaters
|
|
2879
|
+
* @public
|
|
2880
|
+
*/
|
|
2881
|
+
function setColumnDisplayFormatUpdater(state, _ref31) {
|
|
2882
|
+
var dataId = _ref31.dataId,
|
|
2883
|
+
formats = _ref31.formats;
|
|
2884
|
+
var dataset = state.datasets[dataId];
|
|
2885
|
+
if (!dataset) {
|
|
2886
|
+
return state;
|
|
2887
|
+
}
|
|
2888
|
+
var newFields = dataset.fields;
|
|
2889
|
+
Object.keys(formats).forEach(function (column) {
|
|
2890
|
+
var fieldIdx = dataset.fields.findIndex(function (f) {
|
|
2891
|
+
return f.name === column;
|
|
2892
|
+
});
|
|
2893
|
+
if (fieldIdx >= 0) {
|
|
2894
|
+
var displayFormat = formats[column];
|
|
2895
|
+
var field = newFields[fieldIdx];
|
|
2896
|
+
newFields = (0, _composerHelpers.swap_)((0, _composerHelpers.merge_)({
|
|
2897
|
+
displayFormat: displayFormat
|
|
2898
|
+
})(field))(newFields);
|
|
2899
|
+
}
|
|
2900
|
+
});
|
|
2901
|
+
var newDataset = (0, _table.copyTableAndUpdate)(dataset, {
|
|
2902
|
+
fields: newFields
|
|
2903
|
+
});
|
|
2904
|
+
return (0, _composerHelpers.pick_)('datasets')((0, _composerHelpers.merge_)((0, _defineProperty2["default"])({}, dataId, newDataset)))(state);
|
|
2905
|
+
}
|
|
2906
|
+
|
|
2907
|
+
/**
|
|
2908
|
+
* Update editor
|
|
2909
|
+
*/
|
|
2910
|
+
function toggleEditorVisibilityUpdater(state,
|
|
2911
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2912
|
+
action) {
|
|
2913
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2914
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2915
|
+
visible: !state.editor.visible
|
|
2916
|
+
})
|
|
2917
|
+
});
|
|
2918
|
+
}
|
|
2919
|
+
function setFilterAnimationTimeConfigUpdater(state, _ref32) {
|
|
2920
|
+
var idx = _ref32.idx,
|
|
2921
|
+
config = _ref32.config;
|
|
2922
|
+
var oldFilter = state.filters[idx];
|
|
2923
|
+
if (!oldFilter) {
|
|
2924
|
+
_window.console.error("filters.".concat(idx, " is undefined"));
|
|
2925
|
+
return state;
|
|
2926
|
+
}
|
|
2927
|
+
if (oldFilter.type !== _constants.FILTER_TYPES.timeRange) {
|
|
2928
|
+
_window.console.error("setFilterAnimationTimeConfig can only be called to update a time filter. check filter.type === 'timeRange'");
|
|
2929
|
+
return state;
|
|
2930
|
+
}
|
|
2931
|
+
var updates = checkTimeConfigArgs(config);
|
|
2932
|
+
return (0, _composerHelpers.pick_)('filters')((0, _composerHelpers.swap_)((0, _composerHelpers.merge_)(updates)(oldFilter)))(state);
|
|
2933
|
+
}
|
|
2934
|
+
function checkTimeConfigArgs(config) {
|
|
2935
|
+
var allowed = ['timeFormat', 'timezone'];
|
|
2936
|
+
return Object.keys(config).reduce(function (accu, prop) {
|
|
2937
|
+
if (!allowed.includes(prop)) {
|
|
2938
|
+
_window.console.error("setLayerAnimationTimeConfig takes timeFormat and/or timezone as options, found ".concat(prop));
|
|
2939
|
+
return accu;
|
|
2940
|
+
}
|
|
2941
|
+
|
|
2942
|
+
// here we are NOT checking if timezone or timeFormat input is valid
|
|
2943
|
+
accu[prop] = config[prop];
|
|
2944
|
+
return accu;
|
|
2945
|
+
}, {});
|
|
2946
|
+
}
|
|
2947
|
+
|
|
2948
|
+
/**
|
|
2949
|
+
* Update editor
|
|
2950
|
+
*/
|
|
2951
|
+
function setLayerAnimationTimeConfigUpdater(state, _ref33) {
|
|
2952
|
+
var config = _ref33.config;
|
|
2953
|
+
if (!config) {
|
|
2954
|
+
return state;
|
|
2955
|
+
}
|
|
2956
|
+
var updates = checkTimeConfigArgs(config);
|
|
2957
|
+
return (0, _composerHelpers.pick_)('animationConfig')((0, _composerHelpers.merge_)(updates))(state);
|
|
2958
|
+
}
|
|
2959
|
+
|
|
2960
|
+
/**
|
|
2961
|
+
* Update editor
|
|
2962
|
+
*/
|
|
2963
|
+
function layerFilteredItemsChangeUpdater(state, action) {
|
|
2964
|
+
var _layer$filteredItemCo;
|
|
2965
|
+
var event = action.event,
|
|
2966
|
+
layer = action.layer;
|
|
2967
|
+
var deckglLayerId = event.id,
|
|
2968
|
+
count = event.count;
|
|
2969
|
+
if (!layer) {
|
|
2970
|
+
_window.console.warn("layerFilteredItems layer doesnt exists");
|
|
2971
|
+
return state;
|
|
2972
|
+
}
|
|
2973
|
+
if (((_layer$filteredItemCo = layer.filteredItemCount) === null || _layer$filteredItemCo === void 0 ? void 0 : _layer$filteredItemCo[deckglLayerId]) === count) {
|
|
2974
|
+
return state;
|
|
2975
|
+
}
|
|
2976
|
+
layer.filteredItemCount = _objectSpread(_objectSpread({}, layer.filteredItemCount), {}, (0, _defineProperty2["default"])({}, deckglLayerId, count));
|
|
2977
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2978
|
+
layers: (0, _composerHelpers.swap_)(layer)(state.layers)
|
|
2979
|
+
});
|
|
2980
|
+
}
|
|
2981
|
+
|
|
2982
|
+
// eslint-disable-next-line max-statements
|
|
2983
|
+
function syncTimeFilterWithLayerTimelineUpdater(state, action) {
|
|
2984
|
+
var _newState$animationCo, _newState$animationCo2;
|
|
2985
|
+
var filterIdx = action.idx,
|
|
2986
|
+
_action$enable = action.enable,
|
|
2987
|
+
enable = _action$enable === void 0 ? false : _action$enable;
|
|
2988
|
+
var filter = state.filters[filterIdx];
|
|
2989
|
+
var newState = state;
|
|
2990
|
+
var newFilter = filter;
|
|
2991
|
+
|
|
2992
|
+
// if we enable sync we are going to merge filter and animationConfig domains and store into filter.domain
|
|
2993
|
+
if (enable) {
|
|
2994
|
+
var animatableLayers = (0, _utils.getAnimatableVisibleLayers)(newState.layers);
|
|
2995
|
+
// if no animatableLayers are present we simply return
|
|
2996
|
+
if (!animatableLayers.length) {
|
|
2997
|
+
return newState;
|
|
2998
|
+
}
|
|
2999
|
+
var intervalBasedAnimationLayers = (0, _utils.getIntervalBasedAnimationLayers)(animatableLayers);
|
|
3000
|
+
var hasIntervalBasedAnimationLayer = Boolean(intervalBasedAnimationLayers.length);
|
|
3001
|
+
var newFilterDomain = (0, _utils.mergeTimeDomains)([filter.domain, newState.animationConfig.domain]);
|
|
3002
|
+
|
|
3003
|
+
// we only update animationWindow if we have interval based animation layers with defined intervals and the current filter animation window is not interval
|
|
3004
|
+
if (hasIntervalBasedAnimationLayer) {
|
|
3005
|
+
if (filter.animationWindow !== _constants.ANIMATION_WINDOW.interval) {
|
|
3006
|
+
newState = setFilterAnimationWindowUpdater(newState, {
|
|
3007
|
+
id: filter.id,
|
|
3008
|
+
animationWindow: _constants.ANIMATION_WINDOW.interval
|
|
3009
|
+
});
|
|
3010
|
+
}
|
|
3011
|
+
newFilter = newState.filters[filterIdx];
|
|
3012
|
+
|
|
3013
|
+
// adjust time filter interval
|
|
3014
|
+
newFilter = adjustTimeFilterInterval(newState, newFilter);
|
|
3015
|
+
|
|
3016
|
+
// replace filter in state with newFilter
|
|
3017
|
+
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
3018
|
+
filters: (0, _composerHelpers.swap_)(newFilter)(newState.filters)
|
|
3019
|
+
});
|
|
3020
|
+
}
|
|
3021
|
+
newFilter = newState.filters[filterIdx];
|
|
3022
|
+
|
|
3023
|
+
// adjust value based on new domain
|
|
3024
|
+
var _newFilterValue = (0, _utils.adjustValueToFilterDomain)(newFilter.animationWindow === _constants.ANIMATION_WINDOW.interval ? [newFilterDomain[0], newFilterDomain[0]] : newFilterDomain, _objectSpread(_objectSpread({}, newFilter), {}, {
|
|
3025
|
+
domain: newFilterDomain
|
|
3026
|
+
}));
|
|
3027
|
+
newState = setFilterUpdater(newState, {
|
|
3028
|
+
idx: filterIdx,
|
|
3029
|
+
prop: 'value',
|
|
3030
|
+
value: _newFilterValue
|
|
3031
|
+
});
|
|
3032
|
+
newFilter = _objectSpread(_objectSpread({}, newState.filters[filterIdx]), {}, {
|
|
3033
|
+
syncedWithLayerTimeline: true
|
|
3034
|
+
});
|
|
3035
|
+
|
|
3036
|
+
// replace filter in state with newFilter
|
|
3037
|
+
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
3038
|
+
filters: (0, _composerHelpers.swap_)(newFilter)(newState.filters)
|
|
3039
|
+
});
|
|
3040
|
+
newState = setTimeFilterTimelineModeUpdater(newState, {
|
|
3041
|
+
id: newFilter.id,
|
|
3042
|
+
mode: getSyncAnimationMode(newFilter)
|
|
3043
|
+
});
|
|
3044
|
+
newFilter = newState.filters[filterIdx];
|
|
3045
|
+
|
|
3046
|
+
// set the animation config value to match filter value
|
|
3047
|
+
return setLayerAnimationTimeUpdater(newState, {
|
|
3048
|
+
value: newFilter.value[newFilter.syncTimelineMode]
|
|
3049
|
+
});
|
|
3050
|
+
}
|
|
3051
|
+
|
|
3052
|
+
// set domain and step
|
|
3053
|
+
newFilter = _objectSpread(_objectSpread({}, filter), {}, {
|
|
3054
|
+
syncedWithLayerTimeline: false
|
|
3055
|
+
});
|
|
3056
|
+
|
|
3057
|
+
// replace filter in state with newFilter
|
|
3058
|
+
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
3059
|
+
filters: (0, _composerHelpers.swap_)(newFilter)(newState.filters)
|
|
3060
|
+
});
|
|
3061
|
+
|
|
3062
|
+
// reset sync timeline mode
|
|
3063
|
+
newState = setTimeFilterTimelineModeUpdater(newState, {
|
|
3064
|
+
id: newFilter.id,
|
|
3065
|
+
mode: _constants.SYNC_TIMELINE_MODES.end
|
|
3066
|
+
});
|
|
3067
|
+
newFilter = newState.filters[filterIdx];
|
|
3068
|
+
|
|
3069
|
+
// reset filter value
|
|
3070
|
+
var newFilterValue = (0, _utils.adjustValueToFilterDomain)(newFilter.domain, newFilter);
|
|
3071
|
+
newState = setFilterUpdater(newState, {
|
|
3072
|
+
idx: filterIdx,
|
|
3073
|
+
prop: 'value',
|
|
3074
|
+
value: newFilterValue
|
|
3075
|
+
});
|
|
3076
|
+
newState = setTimeFilterTimelineModeUpdater(newState, {
|
|
3077
|
+
id: newFilter.id,
|
|
3078
|
+
mode: getSyncAnimationMode(newFilter)
|
|
3079
|
+
});
|
|
3080
|
+
|
|
3081
|
+
// reset animation config current time to
|
|
3082
|
+
return setLayerAnimationTimeUpdater(newState, {
|
|
3083
|
+
value: (_newState$animationCo = (_newState$animationCo2 = newState.animationConfig.domain) === null || _newState$animationCo2 === void 0 ? void 0 : _newState$animationCo2[0]) !== null && _newState$animationCo !== void 0 ? _newState$animationCo : null
|
|
3084
|
+
});
|
|
3085
|
+
}
|
|
3086
|
+
function setTimeFilterTimelineModeUpdater(state, action) {
|
|
3087
|
+
var filterId = action.id,
|
|
3088
|
+
syncTimelineMode = action.mode;
|
|
3089
|
+
var filterIdx = state.filters.findIndex(function (f) {
|
|
3090
|
+
return f.id === filterId;
|
|
3091
|
+
});
|
|
3092
|
+
if (filterIdx === -1) {
|
|
3093
|
+
return state;
|
|
3094
|
+
}
|
|
3095
|
+
var filter = state.filters[filterIdx];
|
|
3096
|
+
if (!validateSyncAnimationMode(filter, syncTimelineMode)) {
|
|
3097
|
+
return state;
|
|
3098
|
+
}
|
|
3099
|
+
var newFilter = _objectSpread(_objectSpread({}, filter), {}, {
|
|
3100
|
+
syncTimelineMode: syncTimelineMode
|
|
3101
|
+
});
|
|
3102
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
3103
|
+
filters: (0, _composerHelpers.swap_)(newFilter)(state.filters)
|
|
3104
|
+
});
|
|
3105
|
+
return adjustAnimationConfigWithFilter(newState, filterIdx);
|
|
3106
|
+
}
|
|
3107
|
+
function adjustAnimationConfigWithFilter(state, filterIdx) {
|
|
3108
|
+
var filter = state.filters[filterIdx];
|
|
3109
|
+
if (filter.syncedWithLayerTimeline) {
|
|
3110
|
+
var timelineValue = getTimelineValueFromFilter(filter);
|
|
3111
|
+
var value = state.animationConfig.timeSteps ? (0, _utils.snapToMarks)(timelineValue, state.animationConfig.timeSteps) : timelineValue;
|
|
3112
|
+
return setLayerAnimationTimeUpdater(state, {
|
|
3113
|
+
value: value
|
|
3114
|
+
});
|
|
3115
|
+
}
|
|
3116
|
+
return state;
|
|
3117
|
+
}
|
|
3118
|
+
function getTimelineValueFromFilter(filter) {
|
|
3119
|
+
return filter.value[filter.syncTimelineMode];
|
|
3120
|
+
}
|
|
3121
|
+
function getSyncAnimationMode(filter) {
|
|
3122
|
+
if (filter.animationWindow === _constants.ANIMATION_WINDOW.free) {
|
|
3123
|
+
var _filter$syncTimelineM;
|
|
3124
|
+
return (_filter$syncTimelineM = filter.syncTimelineMode) !== null && _filter$syncTimelineM !== void 0 ? _filter$syncTimelineM : _constants.SYNC_TIMELINE_MODES.end;
|
|
3125
|
+
}
|
|
3126
|
+
return _constants.SYNC_TIMELINE_MODES.end;
|
|
3127
|
+
}
|
|
3128
|
+
function validateSyncAnimationMode(filter, newMode) {
|
|
3129
|
+
return !(filter.animationWindow !== _constants.ANIMATION_WINDOW.free && newMode === _constants.SYNC_TIMELINE_MODES.start);
|
|
3130
|
+
}
|
|
3131
|
+
function adjustTimeFilterInterval(state, filter) {
|
|
3132
|
+
var intervalBasedAnimationLayers = (0, _utils.getIntervalBasedAnimationLayers)(state.layers);
|
|
3133
|
+
var interval = null;
|
|
3134
|
+
if (intervalBasedAnimationLayers.length > 0) {
|
|
3135
|
+
// @ts-ignore
|
|
3136
|
+
var intervalIndex = intervalBasedAnimationLayers.reduce(function (currentIndex, l) {
|
|
3137
|
+
if (l.meta.targetTimeInterval) {
|
|
3138
|
+
var newIndex = _utils.TIME_INTERVALS_ORDERED.findIndex(function (i) {
|
|
3139
|
+
return i === l.meta.targetTimeInterval;
|
|
3140
|
+
});
|
|
3141
|
+
return newIndex > -1 && newIndex < currentIndex ? newIndex : currentIndex;
|
|
3142
|
+
}
|
|
3143
|
+
}, _utils.TIME_INTERVALS_ORDERED.length - 1);
|
|
3144
|
+
// @ts-ignore
|
|
3145
|
+
var hexTileInterval = _utils.TIME_INTERVALS_ORDERED[intervalIndex];
|
|
3146
|
+
interval = _utils.LayerToFilterTimeInterval[hexTileInterval];
|
|
3147
|
+
}
|
|
3148
|
+
if (!interval) {
|
|
3149
|
+
return filter;
|
|
3150
|
+
}
|
|
3151
|
+
|
|
3152
|
+
// adjust filter
|
|
3153
|
+
var timeFormat = (0, _utils.getDefaultTimeFormat)(interval);
|
|
3154
|
+
var updatedPlotType = _objectSpread(_objectSpread({}, filter.plotType), {}, {
|
|
3155
|
+
interval: interval,
|
|
3156
|
+
timeFormat: timeFormat
|
|
3157
|
+
});
|
|
3158
|
+
var newFilter = (0, _utils.updateTimeFilterPlotType)(filter, updatedPlotType, state.datasets);
|
|
3159
|
+
return (0, _utils.adjustValueToAnimationWindow)(state, newFilter);
|
|
3160
|
+
}
|
|
3161
|
+
|
|
3162
|
+
// Find dataId from a saved visState property:
|
|
3163
|
+
// layers, filters, interactions, layerBlending, overlayBlending, splitMaps, animationConfig, editor
|
|
3164
|
+
// replace it with another dataId
|
|
3165
|
+
function defaultReplaceParentDatasetIds(value, dataId, dataIdToReplace) {
|
|
3166
|
+
var _value$config, _value$config2;
|
|
3167
|
+
if (Array.isArray(value)) {
|
|
3168
|
+
// for layers, filters, call defaultReplaceParentDatasetIds on each item in array
|
|
3169
|
+
var replaced = value.map(function (v) {
|
|
3170
|
+
return defaultReplaceParentDatasetIds(v, dataId, dataIdToReplace);
|
|
3171
|
+
}).filter(function (d) {
|
|
3172
|
+
return d;
|
|
3173
|
+
});
|
|
3174
|
+
return replaced.length ? replaced : null;
|
|
3175
|
+
}
|
|
3176
|
+
if (typeof value.dataId === 'string' && value.dataId === dataId) {
|
|
3177
|
+
// others
|
|
3178
|
+
return _objectSpread(_objectSpread({}, value), {}, {
|
|
3179
|
+
dataId: dataIdToReplace
|
|
3180
|
+
});
|
|
3181
|
+
} else if (Array.isArray(value.dataId) && value.dataId.includes(dataId)) {
|
|
3182
|
+
// filter
|
|
3183
|
+
return _objectSpread(_objectSpread({}, value), {}, {
|
|
3184
|
+
dataId: value.dataId.map(function (d) {
|
|
3185
|
+
return d === dataId ? dataIdToReplace : d;
|
|
3186
|
+
})
|
|
3187
|
+
});
|
|
3188
|
+
} else if ((_value$config = value.config) !== null && _value$config !== void 0 && _value$config.dataId && ((_value$config2 = value.config) === null || _value$config2 === void 0 ? void 0 : _value$config2.dataId) === dataId) {
|
|
3189
|
+
// layer
|
|
3190
|
+
return _objectSpread(_objectSpread({}, value), {}, {
|
|
3191
|
+
config: _objectSpread(_objectSpread({}, value.config), {}, {
|
|
3192
|
+
dataId: dataIdToReplace
|
|
3193
|
+
})
|
|
3194
|
+
});
|
|
3195
|
+
} else if ((0, _utils.isObject)(value) && Object.prototype.hasOwnProperty.call(value, dataId)) {
|
|
3196
|
+
// for value saved as {[dataId]: {...}}
|
|
3197
|
+
return (0, _defineProperty2["default"])({}, dataIdToReplace, value[dataId]);
|
|
3198
|
+
}
|
|
3199
|
+
return null;
|
|
3200
|
+
}
|
|
3201
|
+
|
|
3202
|
+
// Find datasetIds derived a saved visState Property;
|
|
3203
|
+
function findChildDatasetIds(value) {
|
|
3204
|
+
var _value$newDataset;
|
|
3205
|
+
if (Array.isArray(value)) {
|
|
3206
|
+
// for layers, filters, call defaultReplaceParentDatasetIds on each item in array
|
|
3207
|
+
var childDataIds = value.map(findChildDatasetIds).filter(function (d) {
|
|
3208
|
+
return d;
|
|
3209
|
+
});
|
|
3210
|
+
return childDataIds.length ? childDataIds : null;
|
|
3211
|
+
}
|
|
3212
|
+
|
|
3213
|
+
// child data id usually stores in the derived dataset info
|
|
3214
|
+
return (value === null || value === void 0 || (_value$newDataset = value.newDataset) === null || _value$newDataset === void 0 ? void 0 : _value$newDataset.info.id) || null;
|
|
3215
|
+
}
|
|
3216
|
+
|
|
3217
|
+
// moved unmerged layers, filters, interactions
|
|
3218
|
+
function moveValueToBeMerged(state, propValues, _ref35) {
|
|
3219
|
+
var prop = _ref35.prop,
|
|
3220
|
+
toMergeProp = _ref35.toMergeProp,
|
|
3221
|
+
saveUnmerged = _ref35.saveUnmerged;
|
|
3222
|
+
// remove prop value from state
|
|
3223
|
+
// TODO: should we add remove updater to merger as well?
|
|
3224
|
+
if (!propValues) {
|
|
3225
|
+
return state;
|
|
3226
|
+
}
|
|
3227
|
+
var stateRemoved = prop === 'layers' ? propValues.reduce(function (accu, propValue) {
|
|
3228
|
+
return removeLayerUpdater(accu, {
|
|
3229
|
+
id: propValue.id
|
|
3230
|
+
});
|
|
3231
|
+
}, state) : Array.isArray(state[prop]) ? _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, prop, state[prop].filter(function (p) {
|
|
3232
|
+
return !propValues.find(function (propValue) {
|
|
3233
|
+
return p.id === propValue.id;
|
|
3234
|
+
});
|
|
3235
|
+
}))) :
|
|
3236
|
+
// if not array, we won't remove it, remove dataset should handle it
|
|
3237
|
+
state;
|
|
3238
|
+
|
|
3239
|
+
// move to stateToBeMerged
|
|
3240
|
+
var toBeMerged = (0, _defineProperty2["default"])({}, toMergeProp, saveUnmerged ?
|
|
3241
|
+
// call merge saveUnmerged method
|
|
3242
|
+
saveUnmerged(stateRemoved, propValues) :
|
|
3243
|
+
// if toMergeProp is araay, append to it
|
|
3244
|
+
Array.isArray(stateRemoved[toMergeProp]) ? [].concat((0, _toConsumableArray2["default"])(stateRemoved[toMergeProp]), (0, _toConsumableArray2["default"])(propValues)) :
|
|
3245
|
+
// save propValues to toMerge
|
|
3246
|
+
(0, _utils.isObject)(stateRemoved[toMergeProp]) ? _objectSpread(_objectSpread({}, stateRemoved[toMergeProp]), propValues) : stateRemoved[toMergeProp]);
|
|
3247
|
+
return _objectSpread(_objectSpread({}, stateRemoved), toBeMerged);
|
|
3248
|
+
}
|
|
3249
|
+
function replaceDatasetAndDeps(state, dataId, dataIdToUse) {
|
|
3250
|
+
return (0, _composerHelpers.compose_)([(0, _composerHelpers.apply_)(replaceDatasetDepsInState, {
|
|
3251
|
+
dataId: dataId,
|
|
3252
|
+
dataIdToUse: dataIdToUse
|
|
3253
|
+
}), (0, _composerHelpers.apply_)(removeDatasetUpdater, {
|
|
3254
|
+
dataId: dataId
|
|
3255
|
+
})])(state);
|
|
3256
|
+
}
|
|
3257
|
+
function prepareStateForDatasetReplace(state, dataId, dataIdToUse) {
|
|
3258
|
+
var _nextState$layerToBeM;
|
|
3259
|
+
var serializedState = (0, _visStateMerger.serializeVisState)(state, state.schema);
|
|
3260
|
+
var nextState = replaceDatasetAndDeps(state, dataId, dataIdToUse);
|
|
3261
|
+
// make a copy of layerOrder, because layer id will be removed from it by calling removeLayerUpdater
|
|
3262
|
+
var preserveLayerOrder = (0, _toConsumableArray2["default"])(state.layerOrder);
|
|
3263
|
+
|
|
3264
|
+
// preserve dataset order
|
|
3265
|
+
nextState.preserveDatasetOrder = Object.keys(state.datasets).map(function (d) {
|
|
3266
|
+
return d === dataId ? dataIdToUse : d;
|
|
3267
|
+
});
|
|
3268
|
+
|
|
3269
|
+
// preserveLayerOrder
|
|
3270
|
+
if ((_nextState$layerToBeM = nextState.layerToBeMerged) !== null && _nextState$layerToBeM !== void 0 && _nextState$layerToBeM.length) {
|
|
3271
|
+
var _serializedState$spli;
|
|
3272
|
+
// copy split maps to be merged, because it will be reset in remove layer
|
|
3273
|
+
nextState.splitMapsToBeMerged = (_serializedState$spli = serializedState === null || serializedState === void 0 ? void 0 : serializedState.splitMaps) !== null && _serializedState$spli !== void 0 ? _serializedState$spli : [];
|
|
3274
|
+
nextState.layerOrder = (0, _toConsumableArray2["default"])(preserveLayerOrder);
|
|
3275
|
+
}
|
|
3276
|
+
return nextState;
|
|
3277
|
+
}
|
|
3278
|
+
function replaceDatasetDepsInState(state, _ref36) {
|
|
3279
|
+
var dataId = _ref36.dataId,
|
|
3280
|
+
dataIdToUse = _ref36.dataIdToUse;
|
|
3281
|
+
var serializedState = (0, _visStateMerger.serializeVisState)(state, state.schema);
|
|
3282
|
+
var nextState = state.mergers.reduce(function (accuState, _ref37) {
|
|
3283
|
+
var prop = _ref37.prop,
|
|
3284
|
+
toMergeProp = _ref37.toMergeProp,
|
|
3285
|
+
replaceParentDatasetIds = _ref37.replaceParentDatasetIds,
|
|
3286
|
+
getChildDatasetIds = _ref37.getChildDatasetIds,
|
|
3287
|
+
saveUnmerged = _ref37.saveUnmerged,
|
|
3288
|
+
preserveOrder = _ref37.preserveOrder;
|
|
3289
|
+
// get dataset ids that are depends on this dataset
|
|
3290
|
+
var props = (0, _commonUtils.toArray)(prop);
|
|
3291
|
+
var toMergeProps = (0, _commonUtils.toArray)(toMergeProp);
|
|
3292
|
+
var savedProps = serializedState ? props.map(function (p) {
|
|
3293
|
+
return serializedState[p];
|
|
3294
|
+
}) : [];
|
|
3295
|
+
var replacedState = accuState;
|
|
3296
|
+
savedProps.forEach(function (propValue, i) {
|
|
3297
|
+
var _replacedState$merger;
|
|
3298
|
+
var mergerOptions = {
|
|
3299
|
+
prop: props[i],
|
|
3300
|
+
toMergeProp: toMergeProps[i],
|
|
3301
|
+
getChildDatasetIds: getChildDatasetIds,
|
|
3302
|
+
saveUnmerged: saveUnmerged
|
|
3303
|
+
};
|
|
3304
|
+
var replacedItem = (replaceParentDatasetIds === null || replaceParentDatasetIds === void 0 ? void 0 : replaceParentDatasetIds(propValue, dataId, dataIdToUse)) || defaultReplaceParentDatasetIds(propValue, dataId, dataIdToUse);
|
|
3305
|
+
replacedState = replacedItem ? replacePropValueInState(replacedState, replacedItem, mergerOptions) : replacedState;
|
|
3306
|
+
if (mergerOptions.toMergeProp !== undefined && (_replacedState$merger = replacedState[mergerOptions.toMergeProp]) !== null && _replacedState$merger !== void 0 && _replacedState$merger.length && preserveOrder) {
|
|
3307
|
+
replacedState[preserveOrder] = propValue.map(function (item) {
|
|
3308
|
+
return item.id;
|
|
3309
|
+
});
|
|
3310
|
+
}
|
|
3311
|
+
});
|
|
3312
|
+
return replacedState;
|
|
3313
|
+
}, state);
|
|
3314
|
+
return nextState;
|
|
3315
|
+
}
|
|
3316
|
+
function replacePropValueInState(state, replacedItem, _ref38) {
|
|
3317
|
+
var prop = _ref38.prop,
|
|
3318
|
+
toMergeProp = _ref38.toMergeProp,
|
|
3319
|
+
getChildDatasetIds = _ref38.getChildDatasetIds,
|
|
3320
|
+
saveUnmerged = _ref38.saveUnmerged;
|
|
3321
|
+
// prop is depends on the dataset to be replaced
|
|
3322
|
+
// remove prop from state, and move it to toBeMerged
|
|
3323
|
+
var nextState = moveValueToBeMerged(state, replacedItem, {
|
|
3324
|
+
prop: prop,
|
|
3325
|
+
toMergeProp: toMergeProp,
|
|
3326
|
+
saveUnmerged: saveUnmerged
|
|
3327
|
+
});
|
|
3328
|
+
var childDataIds = (getChildDatasetIds === null || getChildDatasetIds === void 0 ? void 0 : getChildDatasetIds(replacedItem)) || findChildDatasetIds(replacedItem);
|
|
3329
|
+
if (childDataIds) {
|
|
3330
|
+
nextState = (0, _commonUtils.toArray)(childDataIds).reduce(function (accu, childDataId) {
|
|
3331
|
+
// shouldn't need to change child dataset id,
|
|
3332
|
+
// but still need to move out of state and merge back in
|
|
3333
|
+
return replaceDatasetAndDeps(accu, childDataId, childDataId);
|
|
3334
|
+
}, nextState);
|
|
3335
|
+
}
|
|
3336
|
+
return nextState;
|
|
3337
|
+
}
|
|
3338
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYmJveCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NvcHlUb0NsaXBib2FyZCIsIl9kZWVwbWVyZ2UiLCJfd2luZG93IiwiX2xvZGFzaCIsIl9sb2Rhc2gyIiwiX2xvZGFzaDMiLCJfbG9kYXNoNCIsIl9sb2Rhc2g1IiwiX2xvZGFzaDYiLCJfdGFza3MiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl90YXNrczIiLCJfYWN0aW9ucyIsIl91dGlscyIsIl9jb21tb25VdGlscyIsIl9jb25zdGFudHMiLCJfbGF5ZXJzIiwiX2NvbXBvc2VySGVscGVycyIsIl9tZXJnZXJIYW5kbGVyIiwiX3Zpc1N0YXRlTWVyZ2VyIiwiX3NjaGVtYXMiLCJfdGFibGUiLCJfaW50ZXJhY3Rpb25VdGlscyIsIl9sYXllclV0aWxzIiwiX2VmZmVjdHMiLCJfZGF0YVV0aWxzIiwiX2V4Y2x1ZGVkIiwiX2V4Y2x1ZGVkMiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl90b1Byb3BlcnR5S2V5IiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsImRvbmUiLCJ2YWx1ZSIsImYiLCJvIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkaXNhYmxlU3RhY2tDYXB0dXJpbmciLCJ2aXNTdGF0ZVVwZGF0ZXJzIiwiZGVmYXVsdEludGVyYWN0aW9uQ29uZmlnIiwiZXhwb3J0cyIsInRvb2x0aXAiLCJpZCIsImxhYmVsIiwiZW5hYmxlZCIsImNvbmZpZyIsImZpZWxkc1RvU2hvdyIsImNvbXBhcmVNb2RlIiwiY29tcGFyZVR5cGUiLCJDT01QQVJFX1RZUEVTIiwiQUJTT0xVVEUiLCJnZW9jb2RlciIsInBvc2l0aW9uIiwiYnJ1c2giLCJzaXplIiwiY29vcmRpbmF0ZSIsIkRFRkFVTFRfQU5JTUFUSU9OX0NPTkZJRyIsImRvbWFpbiIsImN1cnJlbnRUaW1lIiwic3BlZWQiLCJpc0FuaW1hdGluZyIsInRpbWVTdGVwcyIsInRpbWVGb3JtYXQiLCJ0aW1lem9uZSIsImRlZmF1bHRUaW1lRm9ybWF0IiwiaGlkZUNvbnRyb2wiLCJkdXJhdGlvbiIsIkRFRkFVTFRfRURJVE9SIiwibW9kZSIsIkVESVRPUl9NT0RFUyIsIkRSQVdfUE9MWUdPTiIsImZlYXR1cmVzIiwic2VsZWN0ZWRGZWF0dXJlIiwidmlzaWJsZSIsIklOSVRJQUxfVklTX1NUQVRFIiwibWFwSW5mbyIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJsYXllcnMiLCJsYXllckRhdGEiLCJsYXllclRvQmVNZXJnZWQiLCJsYXllck9yZGVyIiwiZmlsdGVycyIsImZpbHRlclRvQmVNZXJnZWQiLCJkYXRhc2V0cyIsImVkaXRpbmdEYXRhc2V0IiwidW5kZWZpbmVkIiwiZWZmZWN0cyIsImVmZmVjdE9yZGVyIiwiaW50ZXJhY3Rpb25Db25maWciLCJpbnRlcmFjdGlvblRvQmVNZXJnZWQiLCJsYXllckJsZW5kaW5nIiwib3ZlcmxheUJsZW5kaW5nIiwiaG92ZXJJbmZvIiwiY2xpY2tlZCIsIm1vdXNlUG9zIiwibWF4RGVmYXVsdFRvb2x0aXBzIiwiTUFYX0RFRkFVTFRfVE9PTFRJUFMiLCJzcGxpdE1hcHMiLCJzcGxpdE1hcHNUb0JlTWVyZ2VkIiwiaXNNZXJnaW5nRGF0YXNldHMiLCJsYXllckNsYXNzZXMiLCJMYXllckNsYXNzZXMiLCJhbmltYXRpb25Db25maWciLCJlZGl0b3IiLCJmaWxlTG9hZGluZyIsImZpbGVMb2FkaW5nUHJvZ3Jlc3MiLCJsb2FkZXJzIiwibG9hZE9wdGlvbnMiLCJtZXJnZXJzIiwiVklTX1NUQVRFX01FUkdFUlMiLCJzY2hlbWEiLCJLZXBsZXJHTFNjaGVtYSIsInVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YSIsInN0YXRlIiwiX3JlZiIsImxheWVyIiwiaWR4IiwibWFwIiwibHlyIiwiZCIsInVwZGF0ZVN0YXRlT25MYXllclZpc2liaWxpdHlDaGFuZ2UiLCJuZXdTdGF0ZSIsImlzVmlzaWJsZSIsImFkZE5ld0xheWVyc1RvU3BsaXRNYXAiLCJyZW1vdmVMYXllckZyb21TcGxpdE1hcHMiLCJhbmltYXRpb24iLCJ1cGRhdGVBbmltYXRpb25Eb21haW4iLCJwaWNrQ2hhbmdlZFByb3BzIiwicHJldiIsImNoYW5nZWRQcm9wcyIsInBpY2tQcm9wc09mIiwib2JqIiwia2V5IiwicHJvdG90eXBlIiwiaXNFcXVhbCIsIlZJU1VBTF9DSEFOTkVMX1BST1BfVFlQRVMiLCJhcHBseUxheWVyQ29uZmlnVXBkYXRlciIsImFjdGlvbiIsIl9zZXJpYWxpemVMYXllciIsIm9sZExheWVySWQiLCJuZXdMYXllckNvbmZpZyIsImxheWVySW5kZXgiLCJuZXdQYXJzZWRMYXllciIsInBhcnNlTGF5ZXJDb25maWciLCJvbGRMYXllciIsImZpbmQiLCJsIiwiZGF0YXNldCIsImRhdGFJZCIsIm5ld0xheWVyIiwidmFsaWRhdGVMYXllcldpdGhEYXRhIiwibmV4dFN0YXRlIiwidHlwZSIsIm9sZExheWVySW5kZXgiLCJmaW5kSW5kZXgiLCJsYXllclR5cGVDaGFuZ2VVcGRhdGVyIiwibGF5ZXJUeXBlQ2hhbmdlIiwibmV3TGF5ZXJJZCIsImFwcGx5TGF5ZXJDb25maWciLCJzZXJpYWxpemVkT2xkTGF5ZXIiLCJzZXJpYWxpemVMYXllciIsInNlcmlhbGl6ZWROZXdMYXllciIsImNoYW5nZWQiLCJ2aXNDb25maWciLCJsYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXIiLCJsYXllclZpc0NvbmZpZ0NoYW5nZSIsInZpc3VhbENoYW5uZWxzIiwiY2hhbm5lbE5hbWUiLCJjaGFubmVsIiwiY2hhbm5lbFByb3BOYW1lcyIsInByb3AiLCJzb21lIiwibGF5ZXJWaXN1YWxDaGFubmVsQ2hhbmdlVXBkYXRlciIsImxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSIsInBpY2siLCJfaXRlcmF0b3IiLCJfc3RlcCIsImVyciIsImxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlciIsImxheWVyQ29uZmlnQ2hhbmdlIiwicHJvcHMiLCJuZXdDb25maWciLCJfYWN0aW9uJG5ld0NvbmZpZyIsInJlc3RDb25maWciLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwic3RhdGVXaXRoRGF0YUlkIiwibGF5ZXJEYXRhSWRDaGFuZ2VVcGRhdGVyIiwibmV4dExheWVyIiwidXBkYXRlTGF5ZXJDb25maWciLCJzaG91bGRDYWxjdWxhdGVMYXllckRhdGEiLCJvbGRMYXllckRhdGEiLCJ1cGRhdGVMYXllckRhdGFSZXN1bHQiLCJjYWxjdWxhdGVMYXllckRhdGEiLCJmaWx0ZXJJbmRleCIsImZpbHRlclN5bmNlZFdpdGhUaW1lbGluZSIsImlzTGF5ZXJBbmltYXRhYmxlIiwic3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZVVwZGF0ZXIiLCJlbmFibGUiLCJnZXRBbmltYXRhYmxlVmlzaWJsZUxheWVycyIsImxheWVyQW5pbWF0aW9uQ2hhbmdlVXBkYXRlciIsIl9jYWxjdWxhdGVMYXllckRhdGEiLCJzeW5jZWRXaXRoTGF5ZXJUaW1lbGluZSIsImxheWVyU2V0SXNWYWxpZFVwZGF0ZXIiLCJpc1ZhbGlkIiwibGF5ZXJUb1VwZGF0ZSIsIm5ld0RhdGEiLCJfY2FsY3VsYXRlTGF5ZXJEYXRhMiIsImFkZE9yUmVtb3ZlVGV4dExhYmVscyIsIm5ld0ZpZWxkcyIsInRleHRMYWJlbCIsImRlZmF1bHRUZXh0TGFiZWwiLCJERUZBVUxUX1RFWFRfTEFCRUwiLCJuZXdUZXh0TGFiZWwiLCJjdXJyZW50RmllbGRzIiwidGwiLCJmaWVsZCIsImFkZEZpZWxkcyIsImluY2x1ZGVzIiwiZGVsZXRlRmllbGRzIiwiZmQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiYWYiLCJ1cGRhdGVUZXh0TGFiZWxQcm9wQW5kVmFsdWUiLCJzcGxpY2UiLCJsYXllclRleHRMYWJlbENoYW5nZVVwZGF0ZXIiLCJfb2xkTGF5ZXIkZ2V0RGVmYXVsdEwiLCJfb2xkTGF5ZXIkZ2V0RGVmYXVsdEwyIiwiZ2V0RGVmYXVsdExheWVyQ29uZmlnIiwidmFsaWRhdGVFeGlzdGluZ0xheWVyV2l0aERhdGEiLCJsb2FkZWRMYXllciIsImFsbG93RW1wdHlDb2x1bW4iLCJpc1ZhbGlkVG9TYXZlIiwidmFsaWRhdGVkIiwib2xkTGF5ZXJUeXBlIiwiaXNDb25maWdBY3RpdmUiLCJ1cGRhdGVMYXllckRvbWFpbiIsIl9jYWxjdWxhdGVMYXllckRhdGEzIiwic2V0SW5pdGlhbExheWVyQ29uZmlnIiwicmVzdWx0IiwiZmluZERlZmF1bHRMYXllclByb3BzIiwibmV3VHlwZSIsIm9sZElkIiwiQ29uc29sZSIsImVycm9yIiwiYXNzaWduQ29uZmlnVG9MYXllciIsInZpc0NvbmZpZ1NldHRpbmdzIiwiaXNMYXllckhvdmVyZWQiLCJfY2FsY3VsYXRlTGF5ZXJEYXRhNCIsInNldHRpbmdzIiwiX3NldHRpbmdzJGxheWVycyIsIm9sZExheWVyTWFwIiwib3RoZXJMYXllcnMiLCJsYXllcklkIiwibmV3VmlzQ29uZmlnIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJ1cGRhdGVMYXllclZpc3VhbENoYW5uZWwiLCJ1cGRhdGVkU3RhdGUiLCJfY2FsY3VsYXRlTGF5ZXJEYXRhNSIsIl9jYWxjdWxhdGVMYXllckRhdGE2Iiwic2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlciIsIl9yZWYyIiwicmVkdWNlIiwiYWNjdSIsInNldEZpbHRlckFuaW1hdGlvblRpbWVVcGRhdGVyIiwic2V0RmlsdGVyVXBkYXRlciIsInNldEZpbHRlckFuaW1hdGlvbldpbmRvd1VwZGF0ZXIiLCJfcmVmMyIsImFuaW1hdGlvbldpbmRvdyIsIm5ld0ZpbHRlciIsInN3YXBfIiwibmV3U3luY1RpbWVsaW5lTW9kZSIsImdldFN5bmNBbmltYXRpb25Nb2RlIiwic2V0VGltZUZpbHRlclRpbWVsaW5lTW9kZVVwZGF0ZXIiLCJfYWN0aW9uJHZhbHVlSW5kZXgiLCJ2YWx1ZUluZGV4Iiwib2xkRmlsdGVyIiwidG9BcnJheSIsInZhbHVlcyIsImRhdGFzZXRJZHNUb0ZpbHRlciIsIl9sb29wIiwicmVzIiwidiIsIl91cGRhdGVGaWx0ZXJQcm9wIiwiZW5sYXJnZWRGaWx0ZXIiLCJ2aWV3IiwiRklMVEVSX1ZJRVdfVFlQRVMiLCJlbmxhcmdlZCIsInNpZGUiLCJmaWx0ZXJlZERhdGFzZXRzIiwiYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyIsInVuaXEiLCJmaWx0ZXJXaXRoUExvdCIsInVwZGF0ZUZpbHRlclBsb3QiLCJ1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEiLCJGSUxURVJfVFlQRVMiLCJ0aW1lUmFuZ2UiLCJhZGp1c3RBbmltYXRpb25Db25maWdXaXRoRmlsdGVyIiwiX3VwZGF0ZUZpbHRlckRhdGFJZEF0VmFsdWVJbmRleCIsIl9yZW1vdmVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgiLCJuZXh0VmFsdWUiLCJnZXREZWZhdWx0RmlsdGVyIiwicmVtb3ZlRmlsdGVyUGxvdCIsIl9pIiwiX2FyciIsIm5leHRWYWwiLCJkb21haW5TdGVwcyIsImZpbHRlckRhdGFJZCIsImZpbHRlclByb3BzIiwiZ2V0Q29sdW1uRmlsdGVyUHJvcHMiLCJtZXJnZUZpbHRlckRvbWFpblN0ZXAiLCJuZXh0RmlsdGVyIiwic3RlcCIsImFkanVzdFZhbHVlVG9GaWx0ZXJEb21haW4iLCJkYXRhc2V0SWRzIiwiRklMVEVSX1VQREFURVJfUFJPUFMiLCJvbGREYXRhSWQiLCJkYXRhc2V0SWQiLCJfYXBwbHlGaWx0ZXJGaWVsZE5hbWUiLCJhcHBseUZpbHRlckZpZWxkTmFtZSIsIm1lcmdlRG9tYWluIiwidXBkYXRlZEZpbHRlciIsIm5ld0RhdGFzZXQiLCJncHUiLCJzZXRGaWx0ZXJHcHVNb2RlIiwiYXNzaWduR3B1Q2hhbm5lbCIsImxheWVySWREaWZmZXJlbmNlIiwieG9yIiwibGF5ZXJEYXRhSWRzIiwibGlkIiwibmV3RGF0YUlkcyIsInNldEZpbHRlclBsb3RVcGRhdGVyIiwiX3JlZjQiLCJuZXdQcm9wIiwiX3JlZjQkdmFsdWVJbmRleCIsInBpY2tfIiwibWVyZ2VfIiwicGxvdFR5cGUiLCJjaGFydFR5cGUiLCJ5QXhpcyIsIlBMT1RfVFlQRVMiLCJsaW5lQ2hhcnQiLCJoaXN0b2dyYW0iLCJhZGRGaWx0ZXJVcGRhdGVyIiwiY3JlYXRlT3JVcGRhdGVGaWx0ZXJVcGRhdGVyIiwib3JpZ2luYWxJbmRleCIsImluZGV4IiwibGF5ZXJDb2xvclVJQ2hhbmdlVXBkYXRlciIsIl9yZWY1Iiwib2xkVml4Q29uZmlnIiwidXBkYXRlTGF5ZXJDb2xvclVJIiwidG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlciIsInRvZ2dsZUxheWVyQW5pbWF0aW9uVXBkYXRlciIsInRvZ2dsZUxheWVyQW5pbWF0aW9uQ29udHJvbFVwZGF0ZXIiLCJ1cGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIiLCJ1cGRhdGVMYXllckFuaW1hdGlvblNwZWVkVXBkYXRlciIsIl9yZWY2Iiwic2V0RmlsdGVyVmlld1VwZGF0ZXIiLCJzaG91bGRSZXNldE90aGVyRmlsdGVyc1ZpZXciLCJ0b2dnbGVGaWx0ZXJGZWF0dXJlVXBkYXRlciIsImZlYXR1cmVUb0ZpbHRlclZhbHVlIiwicmVtb3ZlRmlsdGVyVXBkYXRlciIsIl9zdGF0ZSRmaWx0ZXJzJGlkeCIsIm5ld0ZpbHRlcnMiLCJuZXdFZGl0b3IiLCJnZXRGaWx0ZXJJZEluRmVhdHVyZSIsImFkZExheWVyVXBkYXRlciIsIm5ld0xheWVyRGF0YSIsImNyZWF0ZUxheWVyRnJvbUNvbmZpZyIsIndhcm4iLCJfYWN0aW9uJGRhdGFzZXRJZCIsImRlZmF1bHREYXRhc2V0IiwiTGF5ZXIiLCJyZW1vdmVMYXllclVwZGF0ZXIiLCJfcmVmNyIsImlzRmluaXRlIiwibGF5ZXJUb1JlbW92ZSIsImZpbHRlck91dEJ5SWQiLCJyZW1vdmVFbGVtZW50QXRJbmRleCIsInJlb3JkZXJMYXllclVwZGF0ZXIiLCJfcmVmOCIsIm9yZGVyIiwiZHVwbGljYXRlTGF5ZXJVcGRhdGVyIiwiX3JlZjkiLCJvcmlnaW5hbCIsIm9yaWdpbmFsTGF5ZXJPcmRlcklkeCIsIm5ld0xhYmVsIiwicG9zdGZpeCIsImdlbmVyYXRlSGFzaElkIiwiTEFZRVJfSURfTEVOR1RIIiwibmV3TGF5ZXJPcmRlciIsImFycmF5SW5zZXJ0IiwiYWRkRWZmZWN0VXBkYXRlciIsIl9hY3Rpb24kY29uZmlnIiwiTElHSFRfQU5EX1NIQURPV19FRkZFQ1QiLCJlZmZlY3QiLCJuZXdFZmZlY3QiLCJjcmVhdGVFZmZlY3QiLCJzZXRQcm9wcyIsImZpeEVmZmVjdE9yZGVyIiwicmVtb3ZlRWZmZWN0VXBkYXRlciIsIl9yZWYxMCIsImVmZmVjdFRvUmVtb3ZlIiwiZWZmZWN0SWQiLCJyZW9yZGVyRWZmZWN0VXBkYXRlciIsIl9yZWYxMSIsInVwZGF0ZUVmZmVjdFVwZGF0ZXIiLCJfcmVmMTIiLCJpZHgyIiwiZWZmZWN0T3JkZXJJZCIsIm5ld0VmZmVjdHMiLCJyZW1vdmVEYXRhc2V0VXBkYXRlciIsImRhdGFzZXRLZXkiLCJfc3RhdGUkZGF0YXNldHMiLCJuZXdEYXRhc2V0cyIsImxheWVyc1RvUmVtb3ZlIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsImluZGV4T2YiLCJyZW1vdmVEYXRhc2V0RnJvbUludGVyYWN0aW9uQ29uZmlnIiwiX3JlZjEzIiwiX2ludGVyYWN0aW9uQ29uZmlnIiwiX2NvbmZpZyRmaWVsZHNUb1Nob3ciLCJmaWVsZHMiLCJ1cGRhdGVMYXllckJsZW5kaW5nVXBkYXRlciIsInVwZGF0ZU92ZXJsYXlCbGVuZGluZ1VwZGF0ZXIiLCJzaG93RGF0YXNldFRhYmxlVXBkYXRlciIsInVwZGF0ZVRhYmxlQ29sb3JVcGRhdGVyIiwidXBkYXRlRGF0YXNldFByb3BzVXBkYXRlciIsImNvbG9yIiwibmV3Q29sb3IiLCJyZXNldE1hcENvbmZpZ1VwZGF0ZXIiLCJpbml0aWFsU3RhdGUiLCJyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsIl9yZWYxNCIsIl9yZWYxNCRwYXlsb2FkIiwicGF5bG9hZCIsIl9yZWYxNCRwYXlsb2FkJGNvbmZpZyIsIl9yZWYxNCRwYXlsb2FkJG9wdGlvbiIsIm9wdGlvbnMiLCJ2aXNTdGF0ZSIsImtlZXBFeGlzdGluZ0NvbmZpZyIsIm1lcmdlZFN0YXRlIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsIm1lcmdlciIsImlzVmFsaWRNZXJnZXIiLCJoYXNQcm9wc1RvTWVyZ2UiLCJtZXJnZSIsImdldFByb3BWYWx1ZVRvTWVyZ2VyIiwidG9NZXJnZVByb3AiLCJsYXllckhvdmVyVXBkYXRlciIsImluZm8iLCJtYXBJbmRleCIsImludGVyYWN0aW9uQ29uZmlnQ2hhbmdlVXBkYXRlciIsImNvbnRyYWRpY3QiLCJrIiwibGF5ZXJDbGlja1VwZGF0ZXIiLCJwaW5uZWQiLCJjbG9uZURlZXAiLCJwaWNrZWQiLCJtYXBDbGlja1VwZGF0ZXIiLCJtb3VzZU1vdmVVcGRhdGVyIiwiX3JlZjE1IiwiZXZ0IiwicG9pbnQiLCJtb3VzZVBvc2l0aW9uIiwibG5nTGF0IiwidG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwiY29tcHV0ZVNwbGl0TWFwTGF5ZXJzIiwiZHVwbGljYXRlIiwiY2xvc2VTcGVjaWZpY01hcEF0SW5kZXgiLCJ0b2dnbGVMYXllckZvck1hcFVwZGF0ZXIiLCJfcmVmMTYiLCJzbSIsInVwZGF0ZVZpc0RhdGFVcGRhdGVyIiwicHJldmlvdXNTdGF0ZSIsImFsbENyZWF0ZURhdGFzZXRzVGFza3MiLCJfcmVmMTciLCJfcmVmMTckaW5mbyIsInJlc3QiLCJjcmVhdGVOZXdEYXRhRW50cnkiLCJ0YXNrcyIsIlRhc2siLCJhbGxTZXR0bGVkIiwicmVzdWx0cyIsImNyZWF0ZU5ld0RhdGFzZXRTdWNjZXNzIiwiYWRkVG9NYXBPcHRpb25zIiwid2l0aFRhc2siLCJjcmVhdGVOZXdEYXRhc2V0U3VjY2Vzc1VwZGF0ZXIiLCJfYWN0aW9uJHBheWxvYWQiLCJuZXdEYXRhRW50cmllcyIsInN0YXR1cyIsImNvbnNvbGUiLCJyZWFzb24iLCJtZXJnZURhdGFzZXRzQnlPcmRlciIsImxheWVyTWVyZ2VycyIsIm0iLCJ3YWl0Rm9yTGF5ZXJEYXRhIiwiZGF0YXNldE1lcmdlcnMiLCJwb3N0TWVyZ2VyUGF5bG9hZCIsImFwcGx5TWVyZ2Vyc1VwZGF0ZXIiLCJtZXJnZVN0YXRlUmVzdWx0IiwibWVyZ2VTdGF0ZUZyb21NZXJnZXJzIiwiYWxsTWVyZ2VkIiwicG9zdE1lcmdlVXBkYXRlciIsImZEYXRhSWQiLCJkYXRhc2V0RmlsdGVyZWQiLCJkYXRhRW1wdHkiLCJuZXdMYXllcnMiLCJhdXRvQ3JlYXRlTGF5ZXJzIiwiYWRkRGVmYXVsdExheWVycyIsInRvb2x0aXBGaWVsZHMiLCJhdXRvQ3JlYXRlVG9vbHRpcHMiLCJhZGREZWZhdWx0VG9vbHRpcHMiLCJ1cGRhdGVkRGF0YXNldHMiLCJjZW50ZXJNYXAiLCJib3VuZHMiLCJmaW5kTWFwQm91bmRzIiwiZml0Qm91bmRzVGFzayIsIkFDVElPTl9UQVNLIiwiZml0TWFwQm91bmRzIiwicmVuYW1lRGF0YXNldFVwZGF0ZXIiLCJBTExPV0VEX1VQREFURV9EQVRBU0VUX1BST1BTIiwidmFsaWRhdGVEYXRhc2V0VXBkYXRlUHJvcHMiLCJ2YWxpZGF0ZWRQcm9wcyIsImVudHJpZXMiLCJhY2MiLCJlbnRyeSIsIl9lbnRyeSIsIl9zbGljZWRUb0FycmF5MiIsImlzUmdiQ29sb3IiLCJpc1BsYWluT2JqZWN0IiwiZGVlcG1lcmdlIiwiZXhpc3RpbmciLCJjb3B5VGFibGVBbmRVcGRhdGUiLCJfc3RhdGUkc3BsaXRNYXBzJGluZGUiLCJpbmRleFRvUmV0cmlldmUiLCJtYXBMYXllcnMiLCJsb2FkRmlsZXNVcGRhdGVyIiwiZmlsZXMiLCJfYWN0aW9uJG9uRmluaXNoIiwib25GaW5pc2giLCJsb2FkRmlsZXNTdWNjZXNzIiwiaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MiLCJmaWxlQ2FjaGUiLCJmaWxlc1RvTG9hZCIsImxvYWROZXh0RmlsZVVwZGF0ZXIiLCJsb2FkRmlsZVN0ZXBTdWNjZXNzVXBkYXRlciIsImZpbGVOYW1lIiwiX3N0YXRlJGZpbGVMb2FkaW5nIiwic3RhdGVXaXRoUHJvZ3Jlc3MiLCJ1cGRhdGVGaWxlTG9hZGluZ1Byb2dyZXNzVXBkYXRlciIsInByb2dyZXNzIiwicGVyY2VudCIsIm1lc3NhZ2UiLCJzdGF0ZVdpdGhDYWNoZSIsIkRFTEFZX1RBU0siLCJsb2FkTmV4dEZpbGUiLCJfZmlsZXNUb0xvYWQiLCJfdG9BcnJheTIiLCJmaWxlIiwicmVtYWluaW5nRmlsZXNUb0xvYWQiLCJtYWtlTG9hZEZpbGVUYXNrIiwiTE9BRF9GSUxFX1RBU0siLCJiaW1hcCIsImdlbiIsIm5leHRGaWxlQmF0Y2giLCJwcm9jZXNzRmlsZUNvbnRlbnQiLCJjb250ZW50IiwibG9hZEZpbGVzRXJyIiwicHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlciIsIl9hY3Rpb24kcGF5bG9hZDIiLCJQUk9DRVNTX0ZJTEVfREFUQSIsImxvYWRGaWxlU3RlcFN1Y2Nlc3MiLCJwYXJzZVByb2dyZXNzIiwicHJldlByb2dyZXNzIiwibmV4dEZpbGVCYXRjaFVwZGF0ZXIiLCJfcmVmMTgiLCJfYWNjdW11bGF0ZWQkZGF0YSIsIl9yZWYxOCRwYXlsb2FkIiwiYWNjdW11bGF0ZWQiLCJlbmRzV2l0aCIsImRhdGEiLCJVTldSQVBfVEFTSyIsIl9yZWYxOSIsImxvYWRGaWxlc0VyclVwZGF0ZXIiLCJfcmVmMjAiLCJfc3RhdGUkZmlsZUxvYWRpbmcyIiwiYXBwbHlDUFVGaWx0ZXJVcGRhdGVyIiwiX3JlZjIxIiwiZGF0YUlkcyIsImZpbHRlckRhdGFzZXRDUFUiLCJzZXRNYXBJbmZvVXBkYXRlciIsImVtcHR5IiwiZGVmYXVsdExheWVycyIsImZvdW5kTGF5ZXJzIiwiZmluZERlZmF1bHRMYXllciIsImdldExheWVyT3JkZXJGcm9tTGF5ZXJzIiwiZmluZEZpZWxkc1RvU2hvdyIsIm1lcmdlZCIsIl9yZWYyMyIsImZpeGVkRG9tYWluIiwiX2NhbGN1bGF0ZUxheWVyRGF0YTciLCJfc3RhdGUkZmlsdGVycyIsImFuaW1hdGFibGVMYXllcnMiLCJsYXllckRvbWFpbnMiLCJtZXJnZWREb21haW4iLCJtZXJnZVRpbWVEb21haW5zIiwiZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyIiwibWVyZ2VkVGltZVN0ZXBzIiwic29ydCIsIkJBU0VfU1BFRUQiLCJGUFMiLCJzeW5jZWRGaWx0ZXIiLCJuZXdBbmltYXRpb25Eb21haW4iLCJpc0luUmFuZ2UiLCJzZXRFZGl0b3JNb2RlVXBkYXRlciIsIl9yZWYyNCIsInNldEZlYXR1cmVzVXBkYXRlciIsIl9yZWYyNSIsIl9yZWYyNSRmZWF0dXJlcyIsImxhc3RGZWF0dXJlIiwicHJvcGVydGllcyIsImlzQ2xvc2VkIiwiRURJVCIsImZlYXR1cmUiLCJmaWx0ZXJJZCIsImJib3giLCJmZWF0dXJlVmFsdWUiLCJmaWx0ZXJJZHgiLCJmaWwiLCJzZXRTZWxlY3RlZEZlYXR1cmVVcGRhdGVyIiwiX3JlZjI2Iiwic2VsZWN0aW9uQ29udGV4dCIsImRlbGV0ZUZlYXR1cmVVcGRhdGVyIiwiX3JlZjI3Iiwic2V0UG9seWdvbkZpbHRlckxheWVyVXBkYXRlciIsIm5vbmVGaWx0ZXJGZWF0dXJlIiwiX2ZpbHRlciRsYXllcklkIiwiaXNMYXllckluY2x1ZGVkIiwiZ2VuZXJhdGVQb2x5Z29uRmlsdGVyIiwic29ydFRhYmxlQ29sdW1uVXBkYXRlciIsIl9yZWYyOCIsImNvbHVtbiIsInNvcnRNb2RlIiwiY3VycmVudE1vZGUiLCJTT1JUX09SREVSIiwiQVNDRU5ESU5HIiwic29ydGVkIiwic29ydERhdGFzZXRCeUNvbHVtbiIsInBpblRhYmxlQ29sdW1uVXBkYXRlciIsIl9yZWYyOSIsInBpblRhYmxlQ29sdW1ucyIsImNvcHlUYWJsZUNvbHVtblVwZGF0ZXIiLCJfcmVmMzAiLCJmaWVsZElkeCIsInRleHQiLCJkYXRhQ29udGFpbmVyIiwicm93IiwicGFyc2VGaWVsZFZhbHVlIiwidmFsdWVBdCIsImpvaW4iLCJjb3B5Iiwic2V0Q29sdW1uRGlzcGxheUZvcm1hdFVwZGF0ZXIiLCJfcmVmMzEiLCJmb3JtYXRzIiwiZGlzcGxheUZvcm1hdCIsInRvZ2dsZUVkaXRvclZpc2liaWxpdHlVcGRhdGVyIiwic2V0RmlsdGVyQW5pbWF0aW9uVGltZUNvbmZpZ1VwZGF0ZXIiLCJfcmVmMzIiLCJ1cGRhdGVzIiwiY2hlY2tUaW1lQ29uZmlnQXJncyIsImFsbG93ZWQiLCJzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyIiwiX3JlZjMzIiwibGF5ZXJGaWx0ZXJlZEl0ZW1zQ2hhbmdlVXBkYXRlciIsIl9sYXllciRmaWx0ZXJlZEl0ZW1DbyIsImV2ZW50IiwiZGVja2dsTGF5ZXJJZCIsImNvdW50IiwiZmlsdGVyZWRJdGVtQ291bnQiLCJfbmV3U3RhdGUkYW5pbWF0aW9uQ28iLCJfbmV3U3RhdGUkYW5pbWF0aW9uQ28yIiwiX2FjdGlvbiRlbmFibGUiLCJpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzIiwiZ2V0SW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycyIsImhhc0ludGVydmFsQmFzZWRBbmltYXRpb25MYXllciIsIkJvb2xlYW4iLCJuZXdGaWx0ZXJEb21haW4iLCJBTklNQVRJT05fV0lORE9XIiwiaW50ZXJ2YWwiLCJhZGp1c3RUaW1lRmlsdGVySW50ZXJ2YWwiLCJuZXdGaWx0ZXJWYWx1ZSIsInN5bmNUaW1lbGluZU1vZGUiLCJTWU5DX1RJTUVMSU5FX01PREVTIiwiZW5kIiwidmFsaWRhdGVTeW5jQW5pbWF0aW9uTW9kZSIsInRpbWVsaW5lVmFsdWUiLCJnZXRUaW1lbGluZVZhbHVlRnJvbUZpbHRlciIsInNuYXBUb01hcmtzIiwiZnJlZSIsIl9maWx0ZXIkc3luY1RpbWVsaW5lTSIsIm5ld01vZGUiLCJzdGFydCIsImludGVydmFsSW5kZXgiLCJjdXJyZW50SW5kZXgiLCJtZXRhIiwidGFyZ2V0VGltZUludGVydmFsIiwibmV3SW5kZXgiLCJUSU1FX0lOVEVSVkFMU19PUkRFUkVEIiwiaGV4VGlsZUludGVydmFsIiwiTGF5ZXJUb0ZpbHRlclRpbWVJbnRlcnZhbCIsImdldERlZmF1bHRUaW1lRm9ybWF0IiwidXBkYXRlZFBsb3RUeXBlIiwidXBkYXRlVGltZUZpbHRlclBsb3RUeXBlIiwiYWRqdXN0VmFsdWVUb0FuaW1hdGlvbldpbmRvdyIsImRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyIsImRhdGFJZFRvUmVwbGFjZSIsIl92YWx1ZSRjb25maWciLCJfdmFsdWUkY29uZmlnMiIsInJlcGxhY2VkIiwiaXNPYmplY3QiLCJmaW5kQ2hpbGREYXRhc2V0SWRzIiwiX3ZhbHVlJG5ld0RhdGFzZXQiLCJjaGlsZERhdGFJZHMiLCJtb3ZlVmFsdWVUb0JlTWVyZ2VkIiwicHJvcFZhbHVlcyIsIl9yZWYzNSIsInNhdmVVbm1lcmdlZCIsInN0YXRlUmVtb3ZlZCIsInByb3BWYWx1ZSIsInAiLCJ0b0JlTWVyZ2VkIiwicmVwbGFjZURhdGFzZXRBbmREZXBzIiwiZGF0YUlkVG9Vc2UiLCJjb21wb3NlXyIsImFwcGx5XyIsInJlcGxhY2VEYXRhc2V0RGVwc0luU3RhdGUiLCJwcmVwYXJlU3RhdGVGb3JEYXRhc2V0UmVwbGFjZSIsIl9uZXh0U3RhdGUkbGF5ZXJUb0JlTSIsInNlcmlhbGl6ZWRTdGF0ZSIsInNlcmlhbGl6ZVZpc1N0YXRlIiwicHJlc2VydmVMYXllck9yZGVyIiwicHJlc2VydmVEYXRhc2V0T3JkZXIiLCJfc2VyaWFsaXplZFN0YXRlJHNwbGkiLCJfcmVmMzYiLCJhY2N1U3RhdGUiLCJfcmVmMzciLCJyZXBsYWNlUGFyZW50RGF0YXNldElkcyIsImdldENoaWxkRGF0YXNldElkcyIsInByZXNlcnZlT3JkZXIiLCJ0b01lcmdlUHJvcHMiLCJzYXZlZFByb3BzIiwicmVwbGFjZWRTdGF0ZSIsIl9yZXBsYWNlZFN0YXRlJG1lcmdlciIsIm1lcmdlck9wdGlvbnMiLCJyZXBsYWNlZEl0ZW0iLCJyZXBsYWNlUHJvcFZhbHVlSW5TdGF0ZSIsIml0ZW0iLCJfcmVmMzgiLCJjaGlsZERhdGFJZCJdLCJzb3VyY2VzIjpbIi4uL3NyYy92aXMtc3RhdGUtdXBkYXRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IGJib3ggZnJvbSAnQHR1cmYvYmJveCc7XG5pbXBvcnQgY29weSBmcm9tICdjb3B5LXRvLWNsaXBib2FyZCc7XG5pbXBvcnQgZGVlcG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQge2NvbnNvbGUgYXMgQ29uc29sZX0gZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2guZ2V0JztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC5pc2VxdWFsJztcbmltcG9ydCBwaWNrIGZyb20gJ2xvZGFzaC5waWNrJztcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC51bmlxJztcbmltcG9ydCB4b3IgZnJvbSAnbG9kYXNoLnhvcic7XG5pbXBvcnQgVGFzaywge2Rpc2FibGVTdGFja0NhcHR1cmluZywgd2l0aFRhc2t9IGZyb20gJ3JlYWN0LXBhbG0vdGFza3MnO1xuLy8gVGFza3NcbmltcG9ydCB7XG4gIERFTEFZX1RBU0ssXG4gIEFDVElPTl9UQVNLLFxuICBMT0FEX0ZJTEVfVEFTSyxcbiAgUFJPQ0VTU19GSUxFX0RBVEEsXG4gIFVOV1JBUF9UQVNLXG59IGZyb20gJ0BrZXBsZXIuZ2wvdGFza3MnO1xuLy8gQWN0aW9uc1xuaW1wb3J0IHtcbiAgQWN0aW9uVHlwZXMsXG4gIENyZWF0ZU5ld0RhdGFzZXRTdWNjZXNzUGF5bG9hZCxcbiAgTWFwU3RhdGVBY3Rpb25zLFxuICBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZCxcbiAgVmlzU3RhdGVBY3Rpb25zLFxuICBhcHBseUxheWVyQ29uZmlnLFxuICBjcmVhdGVOZXdEYXRhc2V0U3VjY2VzcyxcbiAgbGF5ZXJDb25maWdDaGFuZ2UsXG4gIGxheWVyVHlwZUNoYW5nZSxcbiAgbGF5ZXJWaXNDb25maWdDaGFuZ2UsXG4gIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSxcbiAgbG9hZEZpbGVTdGVwU3VjY2VzcyxcbiAgbG9hZEZpbGVzRXJyLFxuICBsb2FkRmlsZXNTdWNjZXNzLFxuICBsb2FkTmV4dEZpbGUsXG4gIG5leHRGaWxlQmF0Y2gsXG4gIHByb2Nlc3NGaWxlQ29udGVudCxcbiAgZml0Qm91bmRzIGFzIGZpdE1hcEJvdW5kc1xufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuXG4vLyBVdGlsc1xuaW1wb3J0IHtcbiAgRklMVEVSX1VQREFURVJfUFJPUFMsXG4gIGFkZE5ld0xheWVyc1RvU3BsaXRNYXAsXG4gIHNuYXBUb01hcmtzLFxuICBhcHBseUZpbHRlckZpZWxkTmFtZSxcbiAgYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyxcbiAgYXJyYXlJbnNlcnQsXG4gIGNvbXB1dGVTcGxpdE1hcExheWVycyxcbiAgYWRqdXN0VmFsdWVUb0ZpbHRlckRvbWFpbixcbiAgZmVhdHVyZVRvRmlsdGVyVmFsdWUsXG4gIGZpbHRlckRhdGFzZXRDUFUsXG4gIGdlbmVyYXRlUG9seWdvbkZpbHRlcixcbiAgZ2V0RGVmYXVsdEZpbHRlcixcbiAgZ2V0RmlsdGVySWRJbkZlYXR1cmUsXG4gIGdldFRpbWVXaWRnZXRUaXRsZUZvcm1hdHRlcixcbiAgaXNJblJhbmdlLFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNSZ2JDb2xvcixcbiAgcGFyc2VGaWVsZFZhbHVlLFxuICByZW1vdmVMYXllckZyb21TcGxpdE1hcHMsXG4gIHNldCxcbiAgbWVyZ2VGaWx0ZXJEb21haW5TdGVwLFxuICB1cGRhdGVGaWx0ZXJQbG90LFxuICByZW1vdmVGaWx0ZXJQbG90LFxuICBpc0xheWVyQW5pbWF0YWJsZVxufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7Z2VuZXJhdGVIYXNoSWQsIHRvQXJyYXl9IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcbi8vIE1lcmdlcnNcbmltcG9ydCB7XG4gIEFOSU1BVElPTl9XSU5ET1csXG4gIEJBU0VfU1BFRUQsXG4gIENPTVBBUkVfVFlQRVMsXG4gIERFRkFVTFRfVEVYVF9MQUJFTCxcbiAgRURJVE9SX01PREVTLFxuICBGSUxURVJfVFlQRVMsXG4gIEZJTFRFUl9WSUVXX1RZUEVTLFxuICBGUFMsXG4gIExJR0hUX0FORF9TSEFET1dfRUZGRUNULFxuICBNQVhfREVGQVVMVF9UT09MVElQUyxcbiAgUExPVF9UWVBFUyxcbiAgU09SVF9PUkRFUixcbiAgU1lOQ19USU1FTElORV9NT0RFU1xufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge0xBWUVSX0lEX0xFTkdUSCwgTGF5ZXIsIExheWVyQ2xhc3Nlc30gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtcbiAgYXBwbHlfLFxuICBjb21wb3NlXyxcbiAgZmlsdGVyT3V0QnlJZCxcbiAgbWVyZ2VfLFxuICBwaWNrXyxcbiAgcmVtb3ZlRWxlbWVudEF0SW5kZXgsXG4gIHN3YXBfXG59IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5pbXBvcnQge2lzVmFsaWRNZXJnZXIsIG1lcmdlU3RhdGVGcm9tTWVyZ2Vyc30gZnJvbSAnLi9tZXJnZXItaGFuZGxlcic7XG5pbXBvcnQge1xuICBWSVNfU1RBVEVfTUVSR0VSUyxcbiAgY3JlYXRlTGF5ZXJGcm9tQ29uZmlnLFxuICBwYXJzZUxheWVyQ29uZmlnLFxuICBzZXJpYWxpemVMYXllcixcbiAgc2VyaWFsaXplVmlzU3RhdGUsXG4gIHZhbGlkYXRlTGF5ZXJXaXRoRGF0YVxufSBmcm9tICcuL3Zpcy1zdGF0ZS1tZXJnZXInO1xuXG5pbXBvcnQgS2VwbGVyR0xTY2hlbWEsIHtNZXJnZXIsIFBvc3RNZXJnZXJQYXlsb2FkLCBWaXNTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcblxuaW1wb3J0IHtcbiAgRmlsdGVyLFxuICBJbnRlcmFjdGlvbkNvbmZpZyxcbiAgQW5pbWF0aW9uQ29uZmlnLFxuICBFZGl0b3IsXG4gIEZpZWxkLFxuICBUaW1lUmFuZ2VGaWx0ZXJcbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0xvYWRlcn0gZnJvbSAnQGxvYWRlcnMuZ2wvbG9hZGVyLXV0aWxzJztcblxuaW1wb3J0IHtcbiAgRGF0YXNldHMsXG4gIGFzc2lnbkdwdUNoYW5uZWwsXG4gIGNvcHlUYWJsZUFuZFVwZGF0ZSxcbiAgY3JlYXRlTmV3RGF0YUVudHJ5LFxuICBwaW5UYWJsZUNvbHVtbnMsXG4gIHNldEZpbHRlckdwdU1vZGUsXG4gIHNvcnREYXRhc2V0QnlDb2x1bW5cbn0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge2ZpbmRGaWVsZHNUb1Nob3d9IGZyb20gJy4vaW50ZXJhY3Rpb24tdXRpbHMnO1xuaW1wb3J0IHtjYWxjdWxhdGVMYXllckRhdGEsIGZpbmREZWZhdWx0TGF5ZXIsIGdldExheWVyT3JkZXJGcm9tTGF5ZXJzfSBmcm9tICcuL2xheWVyLXV0aWxzJztcbmltcG9ydCB7Z2V0UHJvcFZhbHVlVG9NZXJnZXIsIGhhc1Byb3BzVG9NZXJnZX0gZnJvbSAnLi9tZXJnZXItaGFuZGxlcic7XG5pbXBvcnQge21lcmdlRGF0YXNldHNCeU9yZGVyfSBmcm9tICcuL3Zpcy1zdGF0ZS1tZXJnZXInO1xuaW1wb3J0IHtcbiAgZml4RWZmZWN0T3JkZXIsXG4gIGdldEFuaW1hdGFibGVWaXNpYmxlTGF5ZXJzLFxuICBnZXRJbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzLFxuICBtZXJnZVRpbWVEb21haW5zLFxuICBhZGp1c3RWYWx1ZVRvQW5pbWF0aW9uV2luZG93LFxuICB1cGRhdGVUaW1lRmlsdGVyUGxvdFR5cGUsXG4gIGdldERlZmF1bHRUaW1lRm9ybWF0LFxuICBMYXllclRvRmlsdGVyVGltZUludGVydmFsLFxuICBUSU1FX0lOVEVSVkFMU19PUkRFUkVEXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtjcmVhdGVFZmZlY3R9IGZyb20gJ0BrZXBsZXIuZ2wvZWZmZWN0cyc7XG5pbXBvcnQge1BheWxvYWRBY3Rpb259IGZyb20gJ0ByZWR1eGpzL3Rvb2xraXQnO1xuXG5pbXBvcnQge2ZpbmRNYXBCb3VuZHN9IGZyb20gJy4vZGF0YS11dGlscyc7XG5cbi8vIHJlYWN0LXBhbG1cbi8vIGRpc2FibGUgY2FwdHVyZSBleGNlcHRpb24gZm9yIHJlYWN0LXBhbG0gY2FsbCB0byB3aXRoVGFza1xuZGlzYWJsZVN0YWNrQ2FwdHVyaW5nKCk7XG5cbi8qKlxuICogVXBkYXRlcnMgZm9yIGB2aXNTdGF0ZWAgcmVkdWNlci4gQ2FuIGJlIHVzZWQgaW4geW91ciByb290IHJlZHVjZXIgdG8gZGlyZWN0bHkgbW9kaWZ5IGtlcGxlci5nbCdzIHN0YXRlLlxuICogUmVhZCBtb3JlIGFib3V0IFtVc2luZyB1cGRhdGVyc10oLi4vYWR2YW5jZWQtdXNhZ2UvdXNpbmctdXBkYXRlcnMubWQpXG4gKlxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7dmlzU3RhdGVVcGRhdGVyc30gZnJvbSAna2VwbGVyLmdsL3JlZHVjZXJzJztcbiAqIC8vIFJvb3QgUmVkdWNlclxuICogY29uc3QgcmVkdWNlcnMgPSBjb21iaW5lUmVkdWNlcnMoe1xuICogIGtlcGxlckdsOiBrZXBsZXJHbFJlZHVjZXIsXG4gKiAgYXBwOiBhcHBSZWR1Y2VyXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBjb21wb3NlZFJlZHVjZXIgPSAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICogIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAqICAgIGNhc2UgJ0NMSUNLX0JVVFRPTic6XG4gKiAgICAgIHJldHVybiB7XG4gKiAgICAgICAgLi4uc3RhdGUsXG4gKiAgICAgICAga2VwbGVyR2w6IHtcbiAqICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLFxuICogICAgICAgICAgZm9vOiB7XG4gKiAgICAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbC5mb28sXG4gKiAgICAgICAgICAgICB2aXNTdGF0ZTogdmlzU3RhdGVVcGRhdGVycy5lbmxhcmdlRmlsdGVyVXBkYXRlcihcbiAqICAgICAgICAgICAgICAgc3RhdGUua2VwbGVyR2wuZm9vLnZpc1N0YXRlLFxuICogICAgICAgICAgICAgICB7aWR4OiAwfVxuICogICAgICAgICAgICAgKVxuICogICAgICAgICAgfVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLy8gQHRzLWlnbm9yZVxuY29uc3QgdmlzU3RhdGVVcGRhdGVycyA9IG51bGw7XG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEludGVyYWN0aW9uQ29uZmlnOiBJbnRlcmFjdGlvbkNvbmZpZyA9IHtcbiAgdG9vbHRpcDoge1xuICAgIGlkOiAndG9vbHRpcCcsXG4gICAgbGFiZWw6ICdpbnRlcmFjdGlvbnMudG9vbHRpcCcsXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBjb25maWc6IHtcbiAgICAgIGZpZWxkc1RvU2hvdzoge30sXG4gICAgICBjb21wYXJlTW9kZTogZmFsc2UsXG4gICAgICBjb21wYXJlVHlwZTogQ09NUEFSRV9UWVBFUy5BQlNPTFVURVxuICAgIH1cbiAgfSxcbiAgZ2VvY29kZXI6IHtcbiAgICBpZDogJ2dlb2NvZGVyJyxcbiAgICBsYWJlbDogJ2ludGVyYWN0aW9ucy5nZW9jb2RlcicsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgcG9zaXRpb246IG51bGxcbiAgfSxcbiAgYnJ1c2g6IHtcbiAgICBpZDogJ2JydXNoJyxcbiAgICBsYWJlbDogJ2ludGVyYWN0aW9ucy5icnVzaCcsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgY29uZmlnOiB7XG4gICAgICAvLyBzaXplIGlzIGluIGttXG4gICAgICBzaXplOiAwLjVcbiAgICB9XG4gIH0sXG4gIGNvb3JkaW5hdGU6IHtcbiAgICBpZDogJ2Nvb3JkaW5hdGUnLFxuICAgIGxhYmVsOiAnaW50ZXJhY3Rpb25zLmNvb3JkaW5hdGUnLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIHBvc2l0aW9uOiBudWxsXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FOSU1BVElPTl9DT05GSUc6IEFuaW1hdGlvbkNvbmZpZyA9IHtcbiAgZG9tYWluOiBudWxsLFxuICBjdXJyZW50VGltZTogbnVsbCxcbiAgc3BlZWQ6IDEsXG4gIGlzQW5pbWF0aW5nOiBmYWxzZSxcbiAgdGltZVN0ZXBzOiBudWxsLFxuICB0aW1lRm9ybWF0OiBudWxsLFxuICB0aW1lem9uZTogbnVsbCxcbiAgZGVmYXVsdFRpbWVGb3JtYXQ6IG51bGwsXG4gIGhpZGVDb250cm9sOiBmYWxzZSxcbiAgZHVyYXRpb246IG51bGxcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VESVRPUjogRWRpdG9yID0ge1xuICBtb2RlOiBFRElUT1JfTU9ERVMuRFJBV19QT0xZR09OLFxuICBmZWF0dXJlczogW10sXG4gIHNlbGVjdGVkRmVhdHVyZTogbnVsbCxcbiAgdmlzaWJsZTogdHJ1ZVxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYHZpc1N0YXRlYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSU5JVElBTF9WSVNfU1RBVEU6IFZpc1N0YXRlID0ge1xuICAvLyBtYXAgaW5mb1xuICBtYXBJbmZvOiB7XG4gICAgdGl0bGU6ICcnLFxuICAgIGRlc2NyaXB0aW9uOiAnJ1xuICB9LFxuICAvLyBsYXllcnNcbiAgbGF5ZXJzOiBbXSxcbiAgbGF5ZXJEYXRhOiBbXSxcbiAgbGF5ZXJUb0JlTWVyZ2VkOiBbXSxcbiAgbGF5ZXJPcmRlcjogW10sXG5cbiAgLy8gZmlsdGVyc1xuICBmaWx0ZXJzOiBbXSxcbiAgZmlsdGVyVG9CZU1lcmdlZDogW10sXG5cbiAgLy8gYSBjb2xsZWN0aW9uIG9mIG11bHRpcGxlIGRhdGFzZXRcbiAgZGF0YXNldHM6IHt9LFxuICBlZGl0aW5nRGF0YXNldDogdW5kZWZpbmVkLFxuXG4gIC8vIGVmZmVjdHNcbiAgZWZmZWN0czogW10sXG4gIGVmZmVjdE9yZGVyOiBbXSxcblxuICBpbnRlcmFjdGlvbkNvbmZpZzogZGVmYXVsdEludGVyYWN0aW9uQ29uZmlnLFxuICBpbnRlcmFjdGlvblRvQmVNZXJnZWQ6IHt9LFxuXG4gIGxheWVyQmxlbmRpbmc6ICdub3JtYWwnLFxuICBvdmVybGF5QmxlbmRpbmc6ICdub3JtYWwnLFxuICBob3ZlckluZm86IHVuZGVmaW5lZCxcbiAgY2xpY2tlZDogdW5kZWZpbmVkLFxuICBtb3VzZVBvczoge30sXG4gIG1heERlZmF1bHRUb29sdGlwczogTUFYX0RFRkFVTFRfVE9PTFRJUFMsXG5cbiAgLy8gdGhpcyBpcyB1c2VkIHdoZW4gdXNlciBzcGxpdCBtYXBzXG4gIHNwbGl0TWFwczogW1xuICAgIC8vIHRoaXMgd2lsbCBjb250YWluIGEgbGlzdCBvZiBvYmplY3RzIHRvXG4gICAgLy8gZGVzY3JpYmUgdGhlIHN0YXRlIG9mIGxheWVyIGF2YWlsYWJpbGl0eSBhbmQgdmlzaWJpbGl0eSBmb3IgZWFjaCBtYXBcbiAgICAvLyBbXG4gICAgLy8gICB7XG4gICAgLy8gICAgICBsYXllcnM6IHtsYXllcl9pZDogdHJ1ZSB8IGZhbHNlfVxuICAgIC8vICAgfVxuICAgIC8vIF1cbiAgXSxcbiAgc3BsaXRNYXBzVG9CZU1lcmdlZDogW10sXG4gIGlzTWVyZ2luZ0RhdGFzZXRzOiB7fSxcbiAgLy8gZGVmYXVsdHMgbGF5ZXIgY2xhc3Nlc1xuICBsYXllckNsYXNzZXM6IExheWVyQ2xhc3NlcyxcblxuICAvLyBkZWZhdWx0IGFuaW1hdGlvblxuICAvLyB0aW1lIGluIHVuaXggdGltZXN0YW1wIChtaWxsaXNlY29uZHMpICh0aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIFVuaXggRXBvY2gpXG4gIGFuaW1hdGlvbkNvbmZpZzogREVGQVVMVF9BTklNQVRJT05fQ09ORklHLFxuXG4gIGVkaXRvcjogREVGQVVMVF9FRElUT1IsXG5cbiAgZmlsZUxvYWRpbmc6IGZhbHNlLFxuICBmaWxlTG9hZGluZ1Byb2dyZXNzOiB7fSxcblxuICBsb2FkZXJzOiBbXSxcbiAgbG9hZE9wdGlvbnM6IHt9LFxuXG4gIC8vIHZpc1N0YXRlTWVyZ2Vyc1xuICBtZXJnZXJzOiBWSVNfU1RBVEVfTUVSR0VSUyxcblxuICAvLyBrZXBsZXIgc2NoZW1hc1xuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hXG59O1xuXG50eXBlIFVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YVR5cGUgPSB7XG4gIGxheWVyczogTGF5ZXJbXTtcbiAgbGF5ZXJEYXRhOiBhbnlbXTtcbn07XG5cbi8qKlxuICogVXBkYXRlIHN0YXRlIHdpdGggdXBkYXRlZCBsYXllciBhbmQgbGF5ZXJEYXRhXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhPFMgZXh0ZW5kcyBVcGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGFUeXBlPihcbiAgc3RhdGU6IFMsXG4gIHtsYXllckRhdGEsIGxheWVyLCBpZHh9OiB7bGF5ZXJEYXRhPzogYW55OyBsYXllcjogTGF5ZXI7IGlkeDogbnVtYmVyfVxuKTogUyB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBzdGF0ZS5sYXllcnMubWFwKChseXIsIGkpID0+IChpID09PSBpZHggPyBsYXllciA6IGx5cikpLFxuICAgIGxheWVyRGF0YTogbGF5ZXJEYXRhXG4gICAgICA/IHN0YXRlLmxheWVyRGF0YS5tYXAoKGQsIGkpID0+IChpID09PSBpZHggPyBsYXllckRhdGEgOiBkKSlcbiAgICAgIDogc3RhdGUubGF5ZXJEYXRhXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZU9uTGF5ZXJWaXNpYmlsaXR5Q2hhbmdlPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMsIGxheWVyOiBMYXllcik6IFMge1xuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgaWYgKHN0YXRlLnNwbGl0TWFwcy5sZW5ndGgpIHtcbiAgICBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc3BsaXRNYXBzOiBsYXllci5jb25maWcuaXNWaXNpYmxlXG4gICAgICAgID8gYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcChzdGF0ZS5zcGxpdE1hcHMsIGxheWVyKVxuICAgICAgICA6IHJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyhzdGF0ZS5zcGxpdE1hcHMsIGxheWVyKVxuICAgIH07XG4gIH1cblxuICBpZiAobGF5ZXIuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4obmV3U3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBvYmplY3RzIChvciBhcnJheXMpIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoIG9ubHkgdGhlXG4gKiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBjaGFuZ2VkIGJldHdlZW4gdGhlIHR3byBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBwaWNrQ2hhbmdlZFByb3BzPFQ+KHByZXY6IFQsIG5leHQ6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgY2hhbmdlZFByb3BzOiBQYXJ0aWFsPFQ+ID0ge307XG4gIGNvbnN0IHBpY2tQcm9wc09mID0gb2JqID0+IHtcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjaGFuZ2VkUHJvcHMsIGtleSkgJiZcbiAgICAgICAgIWlzRXF1YWwocHJldltrZXldLCBuZXh0W2tleV0pXG4gICAgICApIHtcbiAgICAgICAgY2hhbmdlZFByb3BzW2tleV0gPSBuZXh0W2tleV07XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIHBpY2tQcm9wc09mKHByZXYpO1xuICBwaWNrUHJvcHNPZihuZXh0KTtcbiAgcmV0dXJuIGNoYW5nZWRQcm9wcztcbn1cblxuY29uc3QgVklTVUFMX0NIQU5ORUxfUFJPUF9UWVBFUyA9IFsnZmllbGQnLCAnc2NhbGUnLCAnZG9tYWluJywgJ2FnZ3JlZ2F0aW9uJ107XG5cbi8qKlxuICogQXBwbHkgbGF5ZXIgY29uZmlnXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5LCBtYXgtc3RhdGVtZW50c1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TGF5ZXJDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkFwcGx5TGF5ZXJDb25maWdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllcklkLCBuZXdMYXllckNvbmZpZywgbGF5ZXJJbmRleH0gPSBhY3Rpb247XG4gIGNvbnN0IG5ld1BhcnNlZExheWVyID1cbiAgICAvLyB3aWxsIG1vdmUgdmlzdWFsQ2hhbm5lbHMgdG8gdGhlIGNvbmZpZyBwcm9wXG4gICAgcGFyc2VMYXllckNvbmZpZyhzdGF0ZS5zY2hlbWEsIG5ld0xheWVyQ29uZmlnKTtcbiAgY29uc3Qgb2xkTGF5ZXIgPSBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IG9sZExheWVySWQpO1xuICBpZiAoIW9sZExheWVyIHx8ICFuZXdQYXJzZWRMYXllcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBpZiAobGF5ZXJJbmRleCAhPT0gbnVsbCAmJiBsYXllckluZGV4ICE9PSB1bmRlZmluZWQgJiYgc3RhdGUubGF5ZXJzW2xheWVySW5kZXhdICE9PSBvbGRMYXllcikge1xuICAgIC8vIGxheWVySW5kZXggaXMgcHJvdmlkZWQsIGJ1dCBpdCBkb2Vzbid0IG1hdGNoIHRoZSBvbGRMYXllclxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbbmV3UGFyc2VkTGF5ZXIuY29uZmlnLmRhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyBNYWtlIHN1cmUgdGhlIGxheWVyIGlzIHZhbGlkIGFuZCBjb252ZXJ0IGl0IHRvIExheWVyXG4gIGNvbnN0IG5ld0xheWVyID0gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXQsIG5ld1BhcnNlZExheWVyLCBzdGF0ZS5sYXllckNsYXNzZXMpO1xuICBpZiAoIW5ld0xheWVyKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgbGV0IG5leHRTdGF0ZSA9IHN0YXRlO1xuXG4gIGlmIChuZXdMYXllci50eXBlICYmIG5ld0xheWVyLnR5cGUgIT09IG9sZExheWVyLnR5cGUpIHtcbiAgICBjb25zdCBvbGRMYXllckluZGV4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVySWQpO1xuICAgIGlmIChvbGRMYXllckluZGV4ID49IDApIHtcbiAgICAgIG5leHRTdGF0ZSA9IGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIobmV4dFN0YXRlLCBsYXllclR5cGVDaGFuZ2Uob2xkTGF5ZXIsIG5ld0xheWVyLnR5cGUpKTtcbiAgICAgIC8vIGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIgY2hhbmdlcyB0aGUgaWQgb2YgdGhlIGxheWVyLCBzbyB3ZSBuZWVkIHRvIG9idGFpbiB0aGUgbmV3IGlkXG4gICAgICAvLyBidXQgZmlyc3QgbWFrZSBzdXJlIHRoYXQgdGhlIGxheWVyIHdhcyBub3QgcmVtb3ZlZFxuICAgICAgaWYgKG5leHRTdGF0ZS5sYXllcnMubGVuZ3RoID09PSBzdGF0ZS5sYXllcnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5ld0xheWVySWQgPSBuZXh0U3RhdGUubGF5ZXJzW29sZExheWVySW5kZXhdLmlkO1xuICAgICAgICBuZXh0U3RhdGUgPSBhcHBseUxheWVyQ29uZmlnVXBkYXRlcihcbiAgICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgICAgYXBwbHlMYXllckNvbmZpZyhuZXdMYXllcklkLCB7Li4ubmV3TGF5ZXJDb25maWcsIGlkOiBuZXdMYXllcklkfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfVxuXG4gIC8vIHNlcmlhbGl6ZUxheWVyKCkgbWlnaHQgcmV0dXJuIG51bGwgaWYgdGhlIG9sZCBsYXllciBpcyBub3QgdmFsaWQsXG4gIC8vIHdlIHNob3VsZCBzdGlsbCBhcHBseSB0aGUgY2hhbmdlcyBpbiB0aGF0IGNhc2VcbiAgY29uc3Qgc2VyaWFsaXplZE9sZExheWVyID0gc2VyaWFsaXplTGF5ZXIob2xkTGF5ZXIsIHN0YXRlLnNjaGVtYSkgPz8ge2NvbmZpZzoge319O1xuICBjb25zdCBzZXJpYWxpemVkTmV3TGF5ZXIgPSBzZXJpYWxpemVMYXllcihuZXdMYXllciwgc3RhdGUuc2NoZW1hKTtcbiAgaWYgKCFzZXJpYWxpemVkTmV3TGF5ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKCFpc0VxdWFsKHNlcmlhbGl6ZWRPbGRMYXllciwgc2VyaWFsaXplZE5ld0xheWVyKSkge1xuICAgIGNvbnN0IGNoYW5nZWQgPSBwaWNrQ2hhbmdlZFByb3BzKHNlcmlhbGl6ZWRPbGRMYXllci5jb25maWcsIHNlcmlhbGl6ZWROZXdMYXllci5jb25maWcpO1xuXG4gICAgaWYgKCd2aXNDb25maWcnIGluIGNoYW5nZWQpIHtcbiAgICAgIGlmIChjaGFuZ2VkLnZpc0NvbmZpZykge1xuICAgICAgICBuZXh0U3RhdGUgPSBsYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gICAgICAgICAgbmV4dFN0YXRlLFxuICAgICAgICAgIGxheWVyVmlzQ29uZmlnQ2hhbmdlKG9sZExheWVyLCBjaGFuZ2VkLnZpc0NvbmZpZylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBjaGFuZ2VkLnZpc0NvbmZpZztcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhvbGRMYXllci52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsTmFtZSA9PiB7XG4gICAgICBjb25zdCBjaGFubmVsID0gb2xkTGF5ZXIudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbE5hbWVdO1xuICAgICAgY29uc3QgY2hhbm5lbFByb3BOYW1lcyA9IFZJU1VBTF9DSEFOTkVMX1BST1BfVFlQRVMubWFwKHByb3AgPT4gY2hhbm5lbFtwcm9wXSk7XG4gICAgICBpZiAoY2hhbm5lbFByb3BOYW1lcy5zb21lKHByb3AgPT4gcHJvcCBpbiBjaGFuZ2VkKSkge1xuICAgICAgICBuZXh0U3RhdGUgPSBsYXllclZpc3VhbENoYW5uZWxDaGFuZ2VVcGRhdGVyKFxuICAgICAgICAgIG5leHRTdGF0ZSxcbiAgICAgICAgICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UoXG4gICAgICAgICAgICBvbGRMYXllcixcbiAgICAgICAgICAgIHBpY2sobmV3TGF5ZXIuY29uZmlnLCBjaGFubmVsUHJvcE5hbWVzKSxcbiAgICAgICAgICAgIGNoYW5uZWxOYW1lXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgY2hhbm5lbFByb3BOYW1lcykge1xuICAgICAgICAgIGRlbGV0ZSBjaGFuZ2VkW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY2hhbmdlZCkubGVuZ3RoID4gMCkge1xuICAgICAgbmV4dFN0YXRlID0gbGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyKFxuICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgIGxheWVyQ29uZmlnQ2hhbmdlKG9sZExheWVyLCBwaWNrKG5ld0xheWVyLmNvbmZpZywgT2JqZWN0LmtleXMoY2hhbmdlZCkpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciBiYXNlIGNvbmZpZzogZGF0YUlkLCBsYWJlbCwgY29sdW1uLCBpc1Zpc2libGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiBsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllcn0gPSBhY3Rpb247XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBvbGRMYXllci5pZCk7XG4gIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoYWN0aW9uLm5ld0NvbmZpZyk7XG4gIGlmIChcbiAgICB0eXBlb2YgYWN0aW9uLm5ld0NvbmZpZy5kYXRhSWQgPT09ICdzdHJpbmcnICYmXG4gICAgYWN0aW9uLm5ld0NvbmZpZy5kYXRhSWQgIT09IG9sZExheWVyLmNvbmZpZy5kYXRhSWRcbiAgKSB7XG4gICAgY29uc3Qge2RhdGFJZCwgLi4ucmVzdENvbmZpZ30gPSBhY3Rpb24ubmV3Q29uZmlnO1xuICAgIGNvbnN0IHN0YXRlV2l0aERhdGFJZCA9IGxheWVyRGF0YUlkQ2hhbmdlVXBkYXRlcihzdGF0ZSwge1xuICAgICAgb2xkTGF5ZXIsXG4gICAgICBuZXdDb25maWc6IHtkYXRhSWR9XG4gICAgfSk7XG4gICAgY29uc3QgbmV4dExheWVyID0gc3RhdGVXaXRoRGF0YUlkLmxheWVycy5maW5kKGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICAgIHJldHVybiBuZXh0TGF5ZXIgJiYgT2JqZWN0LmtleXMocmVzdENvbmZpZykubGVuZ3RoXG4gICAgICA/IGxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlcihzdGF0ZVdpdGhEYXRhSWQsIHtvbGRMYXllcjogbmV4dExheWVyLCBuZXdDb25maWc6IHJlc3RDb25maWd9KVxuICAgICAgOiBzdGF0ZVdpdGhEYXRhSWQ7XG4gIH1cblxuICBsZXQgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbmZpZyhhY3Rpb24ubmV3Q29uZmlnKTtcblxuICBsZXQgbGF5ZXJEYXRhO1xuXG4gIGlmIChuZXdMYXllci5zaG91bGRDYWxjdWxhdGVMYXllckRhdGEocHJvcHMpKSB7XG4gICAgY29uc3Qgb2xkTGF5ZXJEYXRhID0gc3RhdGUubGF5ZXJEYXRhW2lkeF07XG5cbiAgICBjb25zdCB1cGRhdGVMYXllckRhdGFSZXN1bHQgPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlLCBvbGRMYXllckRhdGEpO1xuICAgIG5ld0xheWVyID0gdXBkYXRlTGF5ZXJEYXRhUmVzdWx0LmxheWVyO1xuICAgIGxheWVyRGF0YSA9IHVwZGF0ZUxheWVyRGF0YVJlc3VsdC5sYXllckRhdGE7XG4gIH1cblxuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgaWYgKCdpc1Zpc2libGUnIGluIGFjdGlvbi5uZXdDb25maWcpIHtcbiAgICBuZXdTdGF0ZSA9IHVwZGF0ZVN0YXRlT25MYXllclZpc2liaWxpdHlDaGFuZ2Uoc3RhdGUsIG5ld0xheWVyKTtcbiAgICBjb25zdCBmaWx0ZXJJbmRleCA9IGZpbHRlclN5bmNlZFdpdGhUaW1lbGluZShzdGF0ZSk7XG4gICAgaWYgKGlzTGF5ZXJBbmltYXRhYmxlKG5ld0xheWVyKSAmJiBmaWx0ZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgIC8vIGlmIGxheWVyIGlzIGdvaW5nIHRvIGJlIHZpc2libGUgd2Ugc3luYyB3aXRoIGZpbHRlciBvdGhlcndpc2Ugd2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIG90aGVyIGFuaW1hdGFibGUgbGF5ZXJzIGV4aXN0cyBhbmQgYXJlIHZpc2libGVcbiAgICAgIG5ld1N0YXRlID0gc3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZVVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgICAgaWR4OiBmaWx0ZXJJbmRleCxcbiAgICAgICAgZW5hYmxlOiBhY3Rpb24ubmV3Q29uZmlnLmlzVmlzaWJsZVxuICAgICAgICAgID8gYWN0aW9uLm5ld0NvbmZpZy5pc1Zpc2libGVcbiAgICAgICAgICA6IGdldEFuaW1hdGFibGVWaXNpYmxlTGF5ZXJzKHN0YXRlLmxheWVycykubGVuZ3RoID4gMFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCdjb2x1bW5zJyBpbiBhY3Rpb24ubmV3Q29uZmlnICYmIG5ld0xheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCkge1xuICAgIC8vIFRPRE86IFNoYW4sIG1ha2UgdGhlIGFuaW1hdGlvbiBjb25maWcgZnVuY3Rpb24gbW9yZSByb2J1c3RcbiAgICBuZXdTdGF0ZSA9IHVwZGF0ZUFuaW1hdGlvbkRvbWFpbihuZXdTdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKG5ld1N0YXRlLCB7XG4gICAgbGF5ZXI6IG5ld0xheWVyLFxuICAgIGxheWVyRGF0YSxcbiAgICBpZHhcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXllckFuaW1hdGlvbkNoYW5nZVVwZGF0ZXI8UyBleHRlbmRzIFZpc1N0YXRlPihzdGF0ZTogUywgYWN0aW9uKTogUyB7XG4gIGNvbnN0IHtvbGRMYXllciwgcHJvcCwgdmFsdWV9ID0gYWN0aW9uO1xuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuXG4gIGNvbnN0IG5ld0xheWVyID0gb2xkTGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIGFuaW1hdGlvbjoge1xuICAgICAgLi4ub2xkTGF5ZXIuY29uZmlnLmFuaW1hdGlvbixcbiAgICAgIFtwcm9wXTogdmFsdWVcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUsIHN0YXRlLmxheWVyRGF0YVtpZHhdKTtcblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBzdGF0ZVxuICogQHJldHVybnMgaW5kZXggb2YgdGhlIGZpbHRlciBzeW5jZWQgdG8gdGltZWxpbmUgb3IgLTFcbiAqL1xuZnVuY3Rpb24gZmlsdGVyU3luY2VkV2l0aFRpbWVsaW5lKHN0YXRlOiBWaXNTdGF0ZSk6IG51bWJlciB7XG4gIHJldHVybiBzdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmID0+IChmIGFzIFRpbWVSYW5nZUZpbHRlcikuc3luY2VkV2l0aExheWVyVGltZWxpbmUpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgaXNWYWxpZCBmbGFnIG9mIGEgbGF5ZXIuXG4gKiBVcGRhdGVzIGlzVmlzaWJsZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgaXNWYWxpZC5cbiAqIFRyaWdnZXJzIHVwZGF0ZSBvZiBkYXRhIGZvciB0aGUgbGF5ZXIgaW4gb3JkZXIgdG8gZ2V0IGVycm9ycyBhZ2FpbiBkdXJpbmcgbmV4dCB1cGRhdGUgaXRlcmF0aW9uLlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJTZXRJc1ZhbGlkVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclNldElzVmFsaWRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgaXNWYWxpZH0gPSBhY3Rpb247XG5cbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgY29uc3QgbGF5ZXJUb1VwZGF0ZSA9IHN0YXRlLmxheWVyc1tpZHhdO1xuICBpZiAobGF5ZXJUb1VwZGF0ZSkge1xuICAgIGxldCBuZXdMYXllcjtcbiAgICBsZXQgbmV3RGF0YSA9IG51bGw7XG5cbiAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgLy8gVHJpZ2dlciBkYXRhIHVwZGF0ZSBpbiBvcmRlciB0byBzaG93IGVycm9ycyBhZ2FpbiBpZiBwcmVzZW50LlxuICAgICAgY29uc3Qge2xheWVyLCBsYXllckRhdGF9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKGxheWVyVG9VcGRhdGUsIHN0YXRlLCB1bmRlZmluZWQpO1xuICAgICAgbmV3TGF5ZXIgPSBsYXllcjtcbiAgICAgIG5ld0RhdGEgPSBsYXllckRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheWVyID0gbGF5ZXJUb1VwZGF0ZS51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICAgIGlzVmlzaWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgbmV3TGF5ZXIuaXNWYWxpZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEoc3RhdGUsIHtpZHgsIGxheWVyOiBuZXdMYXllciwgbGF5ZXJEYXRhOiBuZXdEYXRhfSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbmZ1bmN0aW9uIGFkZE9yUmVtb3ZlVGV4dExhYmVscyhuZXdGaWVsZHMsIHRleHRMYWJlbCwgZGVmYXVsdFRleHRMYWJlbCA9IERFRkFVTFRfVEVYVF9MQUJFTCkge1xuICBsZXQgbmV3VGV4dExhYmVsID0gdGV4dExhYmVsLnNsaWNlKCk7XG5cbiAgY29uc3QgY3VycmVudEZpZWxkcyA9IHRleHRMYWJlbC5tYXAodGwgPT4gdGwuZmllbGQgJiYgdGwuZmllbGQubmFtZSkuZmlsdGVyKGQgPT4gZCk7XG5cbiAgY29uc3QgYWRkRmllbGRzID0gbmV3RmllbGRzLmZpbHRlcihmID0+ICFjdXJyZW50RmllbGRzLmluY2x1ZGVzKGYubmFtZSkpO1xuICBjb25zdCBkZWxldGVGaWVsZHMgPSBjdXJyZW50RmllbGRzLmZpbHRlcihmID0+ICFuZXdGaWVsZHMuZmluZChmZCA9PiBmZC5uYW1lID09PSBmKSk7XG5cbiAgLy8gZGVsZXRlXG4gIG5ld1RleHRMYWJlbCA9IG5ld1RleHRMYWJlbC5maWx0ZXIodGwgPT4gdGwuZmllbGQgJiYgIWRlbGV0ZUZpZWxkcy5pbmNsdWRlcyh0bC5maWVsZC5uYW1lKSk7XG4gIG5ld1RleHRMYWJlbCA9ICFuZXdUZXh0TGFiZWwubGVuZ3RoID8gW2RlZmF1bHRUZXh0TGFiZWxdIDogbmV3VGV4dExhYmVsO1xuXG4gIC8vIGFkZFxuICBuZXdUZXh0TGFiZWwgPSBbXG4gICAgLi4ubmV3VGV4dExhYmVsLmZpbHRlcih0bCA9PiB0bC5maWVsZCksXG4gICAgLi4uYWRkRmllbGRzLm1hcChhZiA9PiAoe1xuICAgICAgLi4uZGVmYXVsdFRleHRMYWJlbCxcbiAgICAgIGZpZWxkOiBhZlxuICAgIH0pKVxuICBdO1xuXG4gIHJldHVybiBuZXdUZXh0TGFiZWw7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVRleHRMYWJlbFByb3BBbmRWYWx1ZShpZHgsIHByb3AsIHZhbHVlLCB0ZXh0TGFiZWwpIHtcbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGV4dExhYmVsW2lkeF0sIHByb3ApKSB7XG4gICAgcmV0dXJuIHRleHRMYWJlbDtcbiAgfVxuXG4gIGxldCBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwuc2xpY2UoKTtcblxuICBpZiAocHJvcCA9PT0gJ2ZpZWxkJyAmJiB2YWx1ZSA9PT0gbnVsbCAmJiB0ZXh0TGFiZWwubGVuZ3RoID4gMSkge1xuICAgIC8vIHJlbW92ZSBsYWJlbCB3aGVuIGZpZWxkIHZhbHVlIGlzIHNldCB0byBudWxsXG4gICAgbmV3VGV4dExhYmVsLnNwbGljZShpZHgsIDEpO1xuICB9IGVsc2UgaWYgKHByb3ApIHtcbiAgICBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwubWFwKCh0bCwgaSkgPT4gKGkgPT09IGlkeCA/IHsuLi50bCwgW3Byb3BdOiB2YWx1ZX0gOiB0bCkpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1RleHRMYWJlbDtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgYmFzZSBjb25maWc6IGRhdGFJZCwgbGFiZWwsIGNvbHVtbiwgaXNWaXNpYmxlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclRleHRMYWJlbENoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJUZXh0TGFiZWxDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgaWR4LCBwcm9wLCB2YWx1ZX0gPSBhY3Rpb247XG4gIGNvbnN0IHt0ZXh0TGFiZWx9ID0gb2xkTGF5ZXIuY29uZmlnO1xuXG4gIC8vIHdoZW4gYWRkaW5nIGEgbmV3IGVtcHR5IHRleHQgbGFiZWwsXG4gIC8vIHJlbHkgb24gdGhlIGxheWVyJ3MgZGVmYXVsdCBjb25maWcsIG9yIHVzZSB0aGUgY29uc3RhbnQgREVGQVVMVF9URVhUX0xBQkVMXG4gIGNvbnN0IGRlZmF1bHRUZXh0TGFiZWwgPVxuICAgIG9sZExheWVyLmdldERlZmF1bHRMYXllckNvbmZpZyh7ZGF0YUlkOiAnJ30pPy50ZXh0TGFiZWw/LlswXSA/PyBERUZBVUxUX1RFWFRfTEFCRUw7XG5cbiAgbGV0IG5ld1RleHRMYWJlbCA9IHRleHRMYWJlbC5zbGljZSgpO1xuICBpZiAoIXRleHRMYWJlbFtpZHhdICYmIGlkeCA9PT0gdGV4dExhYmVsLmxlbmd0aCkge1xuICAgIC8vIGlmIGlkeCBpcyBzZXQgdG8gbGVuZ3RoLCBhZGQgZW1wdHkgdGV4dCBsYWJlbFxuICAgIG5ld1RleHRMYWJlbCA9IFsuLi50ZXh0TGFiZWwsIGRlZmF1bHRUZXh0TGFiZWxdO1xuICB9XG5cbiAgaWYgKGlkeCA9PT0gJ2FsbCcgJiYgcHJvcCA9PT0gJ2ZpZWxkcycpIHtcbiAgICBuZXdUZXh0TGFiZWwgPSBhZGRPclJlbW92ZVRleHRMYWJlbHModmFsdWUsIHRleHRMYWJlbCwgZGVmYXVsdFRleHRMYWJlbCk7XG4gIH0gZWxzZSB7XG4gICAgbmV3VGV4dExhYmVsID0gdXBkYXRlVGV4dExhYmVsUHJvcEFuZFZhbHVlKGlkeCwgcHJvcCwgdmFsdWUsIG5ld1RleHRMYWJlbCk7XG4gIH1cbiAgLy8gdXBkYXRlIHRleHQgbGFiZWwgcHJvcCBhbmQgdmFsdWVcbiAgcmV0dXJuIGxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlcihzdGF0ZSwge1xuICAgIG9sZExheWVyLFxuICAgIG5ld0NvbmZpZzoge3RleHRMYWJlbDogbmV3VGV4dExhYmVsfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeGlzdGluZ0xheWVyV2l0aERhdGEoZGF0YXNldCwgbGF5ZXJDbGFzc2VzLCBsYXllciwgc2NoZW1hKSB7XG4gIGNvbnN0IGxvYWRlZExheWVyID0gc2VyaWFsaXplTGF5ZXIobGF5ZXIsIHNjaGVtYSk7XG4gIHJldHVybiBsb2FkZWRMYXllclxuICAgID8gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXQsIGxvYWRlZExheWVyLCBsYXllckNsYXNzZXMsIHtcbiAgICAgICAgYWxsb3dFbXB0eUNvbHVtbjogdHJ1ZVxuICAgICAgfSlcbiAgICA6IG51bGw7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGNvbmZpZyBkYXRhSWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyRGF0YUlkQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IHtcbiAgICBvbGRMYXllcjogTGF5ZXI7XG4gICAgbmV3Q29uZmlnOiB7XG4gICAgICBkYXRhSWQ6IHN0cmluZztcbiAgICB9O1xuICB9XG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgbmV3Q29uZmlnfSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFJZH0gPSBuZXdDb25maWc7XG5cbiAgaWYgKCFvbGRMYXllciB8fCAhc3RhdGUuZGF0YXNldHNbZGF0YUlkXSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuXG4gIGxldCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtkYXRhSWR9KTtcblxuICAvLyB0aGlzIG1heSBoYXBwZW4gd2hlbiBhIGxheWVyIGlzIG5ldyAodHlwZTogbnVsbCBhbmQgbm8gY29sdW1ucykgYnV0IGl0J3Mgbm90IHJlYWR5IHRvIGJlIHNhdmVkXG4gIGlmIChuZXdMYXllci5pc1ZhbGlkVG9TYXZlKCkpIHtcbiAgICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZGF0ZUV4aXN0aW5nTGF5ZXJXaXRoRGF0YShcbiAgICAgIHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0sXG4gICAgICBzdGF0ZS5sYXllckNsYXNzZXMsXG4gICAgICBuZXdMYXllcixcbiAgICAgIHN0YXRlLnNjaGVtYVxuICAgICk7XG4gICAgLy8gaWYgY2FudCB2YWxpZGF0ZSBpdCB3aXRoIGRhdGEgY3JlYXRlIGEgbmV3IG9uZVxuICAgIGlmICghdmFsaWRhdGVkKSB7XG4gICAgICBjb25zdCBvbGRMYXllclR5cGUgPSBvbGRMYXllci50eXBlO1xuICAgICAgaWYgKG9sZExheWVyVHlwZSkge1xuICAgICAgICBuZXdMYXllciA9IG5ldyBzdGF0ZS5sYXllckNsYXNzZXNbb2xkTGF5ZXJUeXBlXSh7ZGF0YUlkLCBpZDogb2xkTGF5ZXIuaWR9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5ZXIgPSB2YWxpZGF0ZWQ7XG4gICAgfVxuICB9XG5cbiAgbmV3TGF5ZXIgPSBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgaXNWaXNpYmxlOiBvbGRMYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgIGlzQ29uZmlnQWN0aXZlOiB0cnVlXG4gIH0pO1xuXG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzKTtcbiAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgdW5kZWZpbmVkKTtcblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRJbml0aWFsTGF5ZXJDb25maWcobGF5ZXIsIGRhdGFzZXRzLCBsYXllckNsYXNzZXMpOiBMYXllciB7XG4gIGxldCBuZXdMYXllciA9IGxheWVyO1xuICBpZiAoIU9iamVjdC5rZXlzKGRhdGFzZXRzKS5sZW5ndGgpIHtcbiAgICAvLyBubyBkYXRhIGlzIGxvYWRlZFxuICAgIHJldHVybiBsYXllcjtcbiAgfVxuICBpZiAoIWxheWVyLmNvbmZpZy5kYXRhSWQpIHtcbiAgICAvLyBzZXQgbGF5ZXIgZGF0YUlkXG4gICAgbmV3TGF5ZXIgPSBsYXllci51cGRhdGVMYXllckNvbmZpZyh7ZGF0YUlkOiBPYmplY3Qua2V5cyhkYXRhc2V0cylbMF19KTtcbiAgfVxuICBjb25zdCBkYXRhc2V0ID0gZGF0YXNldHNbbmV3TGF5ZXIuY29uZmlnLmRhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBsYXllcjtcbiAgfVxuXG4gIC8vIGZpbmQgZGVmYXV0IGxheWVyIHByb3BzXG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgdHlwZW9mIGxheWVyQ2xhc3Nlc1tuZXdMYXllci50eXBlXS5maW5kRGVmYXVsdExheWVyUHJvcHMgPT09ICdmdW5jdGlvbidcbiAgICAgID8gbGF5ZXJDbGFzc2VzW25ld0xheWVyLnR5cGVdLmZpbmREZWZhdWx0TGF5ZXJQcm9wcyhkYXRhc2V0LCBbXSlcbiAgICAgIDoge3Byb3BzOiBbXX07XG5cbiAgLy8gYW4gYXJyYXkgb2YgcG9zc2libGUgcHJvcHMsIHVzZSAxc3Qgb25lXG4gIGNvbnN0IHByb3BzID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogcmVzdWx0LnByb3BzIHx8IFtdO1xuXG4gIGlmIChwcm9wcy5sZW5ndGgpIHtcbiAgICBuZXdMYXllciA9IG5ldyBsYXllckNsYXNzZXNbbGF5ZXIudHlwZV0oe1xuICAgICAgLi4ucHJvcHNbMF0sXG4gICAgICBsYWJlbDogbmV3TGF5ZXIuY29uZmlnLmxhYmVsLFxuICAgICAgZGF0YUlkOiBuZXdMYXllci5jb25maWcuZGF0YUlkLFxuICAgICAgaXNDb25maWdBY3RpdmU6IG5ld0xheWVyLmNvbmZpZy5pc0NvbmZpZ0FjdGl2ZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB0eXBlb2YgbmV3TGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnID09PSAnZnVuY3Rpb24nXG4gICAgPyBuZXdMYXllci5zZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldClcbiAgICA6IG5ld0xheWVyO1xufVxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgdHlwZS4gUHJldmlld3MgbGF5ZXIgY29uZmlnIHdpbGwgYmUgY29waWVkIGlmIGFwcGxpY2FibGUuXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJUeXBlQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclR5cGVDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgbmV3VHlwZX0gPSBhY3Rpb247XG4gIGlmICghb2xkTGF5ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qgb2xkSWQgPSBvbGRMYXllci5pZDtcbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZElkKTtcblxuICBpZiAoIXN0YXRlLmxheWVyQ2xhc3Nlc1tuZXdUeXBlXSkge1xuICAgIENvbnNvbGUuZXJyb3IoYCR7bmV3VHlwZX0gaXMgbm90IGEgdmFsaWQgbGF5ZXIgdHlwZWApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsZXQgbmV3TGF5ZXIgPSBuZXcgc3RhdGUubGF5ZXJDbGFzc2VzW25ld1R5cGVdKHtcbiAgICAvLyBrZWVwIG9sZCBsYXllciBsYWJsZSBhbmQgaXNDb25maWdBY3RpdmVcbiAgICBsYWJlbDogb2xkTGF5ZXIuY29uZmlnLmxhYmVsLFxuICAgIGlzQ29uZmlnQWN0aXZlOiBvbGRMYXllci5jb25maWcuaXNDb25maWdBY3RpdmUsXG4gICAgZGF0YUlkOiBvbGRMYXllci5jb25maWcuZGF0YUlkXG4gIH0pO1xuXG4gIGlmICghb2xkTGF5ZXIudHlwZSkge1xuICAgIC8vIGlmIHNldHRpbmcgbGF5ZXIgdHlwZSBvbiBhbiBlbXB0eSBsYXllclxuICAgIG5ld0xheWVyID0gc2V0SW5pdGlhbExheWVyQ29uZmlnKG5ld0xheWVyLCBzdGF0ZS5kYXRhc2V0cywgc3RhdGUubGF5ZXJDbGFzc2VzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBnZXQgYSBtaW50IGxheWVyLCB3aXRoIG5ldyBpZCBhbmQgdHlwZVxuICAgIC8vIGJlY2F1c2UgZGVjay5nbCB1c2VzIGlkIHRvIG1hdGNoIGJldHdlZW4gbmV3IGFuZCBvbGQgbGF5ZXIuXG4gICAgLy8gSWYgdHlwZSBoYXMgY2hhbmdlZCBidXQgaWQgaXMgdGhlIHNhbWUsIGl0IHdpbGwgYnJlYWtcbiAgICBuZXdMYXllci5hc3NpZ25Db25maWdUb0xheWVyKG9sZExheWVyLmNvbmZpZywgb2xkTGF5ZXIudmlzQ29uZmlnU2V0dGluZ3MpO1xuICAgIG5ld0xheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzKTtcbiAgfVxuXG4gIGNvbnN0IHtjbGlja2VkLCBob3ZlckluZm99ID0gc3RhdGU7XG5cbiAgbGV0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGNsaWNrZWQ6IG9sZExheWVyLmlzTGF5ZXJIb3ZlcmVkKGNsaWNrZWQpID8gdW5kZWZpbmVkIDogY2xpY2tlZCxcbiAgICBob3ZlckluZm86IG9sZExheWVyLmlzTGF5ZXJIb3ZlcmVkKGhvdmVySW5mbykgPyB1bmRlZmluZWQgOiBob3ZlckluZm9cbiAgfTtcblxuICBjb25zdCB7bGF5ZXJEYXRhLCBsYXllcn0gPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIG5ld1N0YXRlKTtcbiAgbmV3U3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEobmV3U3RhdGUsIHtsYXllckRhdGEsIGxheWVyLCBpZHh9KTtcblxuICBpZiAobGF5ZXIuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkIHx8IG9sZExheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCkge1xuICAgIG5ld1N0YXRlID0gdXBkYXRlQW5pbWF0aW9uRG9tYWluKG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8vIHVwZGF0ZSBzcGxpdE1hcCBsYXllciBpZFxuICBpZiAoc3RhdGUuc3BsaXRNYXBzLmxlbmd0aCkge1xuICAgIG5ld1N0YXRlID0ge1xuICAgICAgLi4ubmV3U3RhdGUsXG4gICAgICBzcGxpdE1hcHM6IG5ld1N0YXRlLnNwbGl0TWFwcy5tYXAoc2V0dGluZ3MgPT4ge1xuICAgICAgICBjb25zdCB7W29sZElkXTogb2xkTGF5ZXJNYXAsIC4uLm90aGVyTGF5ZXJzfSA9IHNldHRpbmdzLmxheWVycztcbiAgICAgICAgcmV0dXJuIG9sZElkIGluIHNldHRpbmdzLmxheWVyc1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi5zZXR0aW5ncyxcbiAgICAgICAgICAgICAgbGF5ZXJzOiB7XG4gICAgICAgICAgICAgICAgLi4ub3RoZXJMYXllcnMsXG4gICAgICAgICAgICAgICAgW2xheWVyLmlkXTogb2xkTGF5ZXJNYXBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogc2V0dGluZ3M7XG4gICAgICB9KVxuICAgIH07XG4gIH1cblxuICAvLyB1cGRhdGUgbGF5ZXJPcmRlciB3aXRoIG5ldyBpZFxuICBuZXdTdGF0ZSA9IHtcbiAgICAuLi5uZXdTdGF0ZSxcbiAgICBsYXllck9yZGVyOiBuZXdTdGF0ZS5sYXllck9yZGVyLm1hcChsYXllcklkID0+XG4gICAgICBsYXllcklkID09PSBvbGRMYXllci5pZCA/IG5ld0xheWVyLmlkIDogbGF5ZXJJZFxuICAgIClcbiAgfTtcblxuICByZXR1cm4gbmV3U3RhdGU7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIHZpc3VhbCBjaGFubmVsXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMge09iamVjdH0gbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclZpc3VhbENoYW5uZWxDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBuZXdDb25maWcsIG5ld1Zpc0NvbmZpZywgY2hhbm5lbH0gPSBhY3Rpb247XG4gIGlmICghb2xkTGF5ZXIuY29uZmlnLmRhdGFJZCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbb2xkTGF5ZXIuY29uZmlnLmRhdGFJZF07XG5cbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgbGV0IG5ld0xheWVyID0gb2xkTGF5ZXIudXBkYXRlTGF5ZXJDb25maWcobmV3Q29uZmlnKTtcbiAgaWYgKG5ld1Zpc0NvbmZpZykgbmV3TGF5ZXIgPSBuZXdMYXllci51cGRhdGVMYXllclZpc0NvbmZpZyhuZXdWaXNDb25maWcpO1xuXG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbChkYXRhc2V0LCBjaGFubmVsKTtcblxuICAvLyBjYWxsaW5nIHVwZGF0ZSBhbmltYXRpb24gZG9tYWluIGZpcnN0IHRvIG1lcmdlIGFsbCBsYXllciBhbmltYXRpb24gZG9tYWluXG4gIGNvbnN0IHVwZGF0ZWRTdGF0ZSA9IHVwZGF0ZUFuaW1hdGlvbkRvbWFpbihzdGF0ZSk7XG5cbiAgY29uc3Qgb2xkTGF5ZXJEYXRhID0gdXBkYXRlZFN0YXRlLmxheWVyRGF0YVtpZHhdO1xuICBjb25zdCB7bGF5ZXJEYXRhLCBsYXllcn0gPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHVwZGF0ZWRTdGF0ZSwgb2xkTGF5ZXJEYXRhKTtcblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHVwZGF0ZWRTdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciBgdmlzQ29uZmlnYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyfSA9IGFjdGlvbjtcbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgY29uc3QgcHJvcHMgPSBPYmplY3Qua2V5cyhhY3Rpb24ubmV3VmlzQ29uZmlnKTtcblxuICBjb25zdCBuZXdWaXNDb25maWcgPSB7XG4gICAgLi4ub2xkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZyxcbiAgICAuLi5hY3Rpb24ubmV3VmlzQ29uZmlnXG4gIH07XG5cbiAgY29uc3QgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbmZpZyh7dmlzQ29uZmlnOiBuZXdWaXNDb25maWd9KTtcblxuICBpZiAobmV3TGF5ZXIuc2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhKHByb3BzKSkge1xuICAgIGNvbnN0IG9sZExheWVyRGF0YSA9IHN0YXRlLmxheWVyRGF0YVtpZHhdO1xuICAgIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUsIG9sZExheWVyRGF0YSk7XG4gICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2xheWVyOiBuZXdMYXllciwgaWR4fSk7XG59XG5cbi8qKlxuICogUmVzZXQgYW5pbWF0aW9uIGNvbmZpZyBjdXJyZW50IHRpbWUgdG8gYSBzcGVjaWZpZWQgdmFsdWVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKlxuICovXG5leHBvcnQgY29uc3Qgc2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlciA9IDxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAge3ZhbHVlfTogVmlzU3RhdGVBY3Rpb25zLlNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXJBY3Rpb25cbik6IFMgPT4ge1xuICBjb25zdCBjdXJyZW50VGltZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMF0gOiB2YWx1ZTtcbiAgY29uc3QgbmV4dFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgY3VycmVudFRpbWVcbiAgICB9XG4gIH07XG4gIC8vIHVwZGF0ZSBhbmltYXRpb24gY29uZmlnIGZvciBlYWNoIGxheWVyXG4gIHJldHVybiBzdGF0ZS5sYXllcnMucmVkdWNlKChhY2N1LCBsKSA9PiB7XG4gICAgaWYgKGwuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkICYmIGwudHlwZSAhPT0gJ3RyaXAnKSB7XG4gICAgICByZXR1cm4gbGF5ZXJBbmltYXRpb25DaGFuZ2VVcGRhdGVyKGFjY3UsIHtvbGRMYXllcjogbCwgcHJvcDogJ2N1cnJlbnRUaW1lJywgY3VycmVudFRpbWV9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3U7XG4gIH0sIG5leHRTdGF0ZSk7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBmaWx0ZXIgcHJvcGVydHlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJBbmltYXRpb25UaW1lVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25UaW1lVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICByZXR1cm4gc2V0RmlsdGVyVXBkYXRlcihzdGF0ZSwgYWN0aW9uKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZmlsdGVyIGFuaW1hdGlvbiB3aW5kb3dcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICB7aWQsIGFuaW1hdGlvbldpbmRvd306IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyQWN0aW9uXG4pOiBTIHtcbiAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVycy5maW5kKGYgPT4gZi5pZCA9PT0gaWQpO1xuXG4gIGlmICghZmlsdGVyKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgbmV3RmlsdGVyID0ge1xuICAgIC4uLmZpbHRlcixcbiAgICBhbmltYXRpb25XaW5kb3dcbiAgfTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzd2FwXzxGaWx0ZXI+KG5ld0ZpbHRlcikoc3RhdGUuZmlsdGVycylcbiAgfTtcblxuICBjb25zdCBuZXdTeW5jVGltZWxpbmVNb2RlID0gZ2V0U3luY0FuaW1hdGlvbk1vZGUobmV3RmlsdGVyIGFzIFRpbWVSYW5nZUZpbHRlcik7XG5cbiAgcmV0dXJuIHNldFRpbWVGaWx0ZXJUaW1lbGluZU1vZGVVcGRhdGVyKG5ld1N0YXRlLCB7aWQsIG1vZGU6IG5ld1N5bmNUaW1lbGluZU1vZGV9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZmlsdGVyIHByb3BlcnR5XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmlsdGVyVXBkYXRlcjxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0RmlsdGVyVXBkYXRlckFjdGlvblxuKTogUyB7XG4gIGNvbnN0IHtpZHgsIHZhbHVlSW5kZXggPSAwfSA9IGFjdGlvbjtcbiAgY29uc3Qgb2xkRmlsdGVyID0gc3RhdGUuZmlsdGVyc1tpZHhdO1xuICBpZiAoIW9sZEZpbHRlcikge1xuICAgIENvbnNvbGUuZXJyb3IoYGZpbHRlcnMuJHtpZHh9IGlzIHVuZGVmaW5lZGApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShhY3Rpb24ucHJvcCkgJiZcbiAgICAoIUFycmF5LmlzQXJyYXkoYWN0aW9uLnZhbHVlKSB8fCBhY3Rpb24ucHJvcC5sZW5ndGggIT09IGFjdGlvbi52YWx1ZS5sZW5ndGgpXG4gICkge1xuICAgIENvbnNvbGUuZXJyb3IoJ0V4cGVjdGluZyB2YWx1ZSB0byBiZSBhbiBhcnJheSBvZiB0aGUgc2FtZSBsZW5ndGgsIHNpbmNlIHByb3AgaXMgYW4gYXJyYXknKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgLy8gY29udmVydCBwcm9wIGFuZCB2YWx1ZSB0byBhcnJheVxuICBjb25zdCBwcm9wcyA9IHRvQXJyYXkoYWN0aW9uLnByb3ApO1xuICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KGFjdGlvbi5wcm9wKSA/IHRvQXJyYXkoYWN0aW9uLnZhbHVlKSA6IFthY3Rpb24udmFsdWVdO1xuXG4gIGxldCBuZXdGaWx0ZXIgPSBvbGRGaWx0ZXI7XG4gIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuXG4gIGxldCBkYXRhc2V0SWRzVG9GaWx0ZXI6IHN0cmluZ1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwcm9wID0gcHJvcHNbaV07XG4gICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgLy8gV2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHBhc3NpbmcgaW4gbmFtZSBhcyBhbiBhcnJheSBpbnRvIF91cGRhdGVGaWx0ZXJQcm9wLCBzbyB3ZSBjYWxsIGl0IG11bHRpcGxlIHRpbWVzIHdpdGggZWFjaCBuYW1lXG4gICAgLy8gU2VlIHRoZSBjb21tZW50IGluIHRoZXJlIGFzIHRvIHdoYXQgc2hvdWxkIGJlIGFkZHJlc3NlZFxuICAgIGxldCByZXM7XG4gICAgaWYgKHByb3AgPT09ICduYW1lJyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuICAgICAgcmVzID0gdmFsdWUucmVkdWNlKChhY2N1LCB2KSA9PiB7XG4gICAgICAgIHJldHVybiBfdXBkYXRlRmlsdGVyUHJvcChhY2N1LCBuZXdGaWx0ZXIsIHByb3AsIHYsIHZhbHVlSW5kZXgpO1xuICAgICAgfSwgbmV3U3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSBfdXBkYXRlRmlsdGVyUHJvcChuZXdTdGF0ZSwgbmV3RmlsdGVyLCBwcm9wLCB2YWx1ZSwgdmFsdWVJbmRleCk7XG4gICAgfVxuICAgIG5ld0ZpbHRlciA9IHJlcy5maWx0ZXI7XG4gICAgbmV3U3RhdGUgPSByZXMuc3RhdGU7XG4gICAgZGF0YXNldElkc1RvRmlsdGVyID0gZGF0YXNldElkc1RvRmlsdGVyLmNvbmNhdChyZXMuZGF0YXNldElkc1RvRmlsdGVyKTtcbiAgfVxuXG4gIGNvbnN0IGVubGFyZ2VkRmlsdGVyID0gc3RhdGUuZmlsdGVycy5maW5kKGYgPT4gZi52aWV3ID09PSBGSUxURVJfVklFV19UWVBFUy5lbmxhcmdlZCk7XG5cbiAgaWYgKGVubGFyZ2VkRmlsdGVyICYmIGVubGFyZ2VkRmlsdGVyLmlkICE9PSBuZXdGaWx0ZXIuaWQpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgZW5sYXJnZWQgZmlsdGVyXG4gICAgbmV3RmlsdGVyLnZpZXcgPSBGSUxURVJfVklFV19UWVBFUy5zaWRlO1xuICB9XG5cbiAgLy8gc2F2ZSBuZXcgZmlsdGVycyB0byBuZXdTdGF0ZVxuICBuZXdTdGF0ZSA9IHNldChbJ2ZpbHRlcnMnLCBpZHhdLCBuZXdGaWx0ZXIsIG5ld1N0YXRlKTtcblxuICAvLyBmaWx0ZXIgZGF0YVxuICBjb25zdCBmaWx0ZXJlZERhdGFzZXRzID0gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyhcbiAgICB1bmlxKGRhdGFzZXRJZHNUb0ZpbHRlciksXG4gICAgbmV3U3RhdGUuZGF0YXNldHMsXG4gICAgbmV3U3RhdGUuZmlsdGVycyxcbiAgICBuZXdTdGF0ZS5sYXllcnNcbiAgKTtcblxuICBuZXdTdGF0ZSA9IHNldChbJ2RhdGFzZXRzJ10sIGZpbHRlcmVkRGF0YXNldHMsIG5ld1N0YXRlKTtcblxuICAvLyBuZWVkIHRvIHVwZGF0ZSBmaWx0ZXJQbG90IGFmdGVyIGZpbHRlciBEYXRhc2V0IGZvciBwbG90IHRvIHVwZGF0ZSBvbiBmaWx0ZXJlZCByZXN1bHRcbiAgY29uc3QgZmlsdGVyV2l0aFBMb3QgPSB1cGRhdGVGaWx0ZXJQbG90KG5ld1N0YXRlLmRhdGFzZXRzLCBuZXdTdGF0ZS5maWx0ZXJzW2lkeF0pO1xuXG4gIG5ld1N0YXRlID0gc2V0KFsnZmlsdGVycycsIGlkeF0sIGZpbHRlcldpdGhQTG90LCBuZXdTdGF0ZSk7XG5cbiAgLy8gZGF0YUlkIGlzIGFuIGFycmF5XG4gIC8vIHBhc3Mgb25seSB0aGUgZGF0YXNldCB3ZSBuZWVkIHRvIHVwZGF0ZVxuICBuZXdTdGF0ZSA9IHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShuZXdTdGF0ZSwgZGF0YXNldElkc1RvRmlsdGVyLCBuZXdGaWx0ZXIpO1xuXG4gIC8vIElmIHRpbWUgcmFuZ2UgZmlsdGVyIHZhbHVlIHdhcyB1cGRhdGVkLCBhZGp1c3QgYW5pbWF0aW9uIGNvbmZpZ1xuICBpZiAobmV3RmlsdGVyLnR5cGUgPT09IEZJTFRFUl9UWVBFUy50aW1lUmFuZ2UgJiYgcHJvcHMuaW5jbHVkZXMoJ3ZhbHVlJykpIHtcbiAgICBuZXdTdGF0ZSA9IGFkanVzdEFuaW1hdGlvbkNvbmZpZ1dpdGhGaWx0ZXIobmV3U3RhdGUsIGFjdGlvbi5pZHgpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlRmlsdGVyRGF0YUlkQXRWYWx1ZUluZGV4KGZpbHRlciwgdmFsdWVJbmRleCwgdmFsdWUsIGRhdGFzZXRzKSB7XG4gIGxldCBuZXdGaWx0ZXIgPSBmaWx0ZXI7XG4gIGlmIChmaWx0ZXIuZGF0YUlkW3ZhbHVlSW5kZXhdKSB7XG4gICAgLy8gaWYgZGF0YUlkIGFscmVhZHkgZXhpc3RcbiAgICBuZXdGaWx0ZXIgPSBfcmVtb3ZlRmlsdGVyRGF0YUlkQXRWYWx1ZUluZGV4KGZpbHRlciwgdmFsdWVJbmRleCwgZGF0YXNldHMpO1xuICB9XG4gIGlmICh2YWx1ZSkge1xuICAgIGNvbnN0IG5leHRWYWx1ZSA9IG5ld0ZpbHRlci5kYXRhSWQuc2xpY2UoKTtcbiAgICBuZXh0VmFsdWVbdmFsdWVJbmRleF0gPSB2YWx1ZTtcbiAgICBuZXdGaWx0ZXIgPSBzZXQoWydkYXRhSWQnXSwgbmV4dFZhbHVlLCBuZXdGaWx0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdGaWx0ZXI7XG59XG5cbmZ1bmN0aW9uIF9yZW1vdmVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgoZmlsdGVyLCB2YWx1ZUluZGV4LCBkYXRhc2V0cykge1xuICBjb25zdCBkYXRhSWQgPSBmaWx0ZXIuZGF0YUlkW3ZhbHVlSW5kZXhdO1xuXG4gIGlmIChmaWx0ZXIuZGF0YUlkLmxlbmd0aCA9PT0gMSAmJiB2YWx1ZUluZGV4ID09PSAwKSB7XG4gICAgLy8gaWYgcmVtb3ZlIHRoZSBvbmx5IGRhdGFJZCwgY3JlYXRlIGFuIGVtcHR5IGZpbHRlciBpbnN0ZWFkO1xuICAgIHJldHVybiBnZXREZWZhdWx0RmlsdGVyKHtpZDogZmlsdGVyLmlkfSk7XG4gIH1cblxuICBpZiAoZGF0YUlkKSB7XG4gICAgZmlsdGVyID0gcmVtb3ZlRmlsdGVyUGxvdChmaWx0ZXIsIGRhdGFJZCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3Agb2YgWydkYXRhSWQnLCAnbmFtZScsICdmaWVsZElkeCcsICdncHVDaGFubmVsJ10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJbcHJvcF0pKSB7XG4gICAgICBjb25zdCBuZXh0VmFsID0gZmlsdGVyW3Byb3BdLnNsaWNlKCk7XG4gICAgICBuZXh0VmFsLnNwbGljZSh2YWx1ZUluZGV4LCAxKTtcbiAgICAgIGZpbHRlciA9IHNldChbcHJvcF0sIG5leHRWYWwsIGZpbHRlcik7XG4gICAgfVxuICB9XG5cbiAgLy8gbWVyZ2VGaWVsZERvbWFpbiBmb3IgdGhlIHJlbWFpbmluZyBmaWVsZHNcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBmaWd1cmUgb3V0IGNvcnJlY3QgdHlwZXMgdG8gdXNlIHdpdGggbWVyZ2VGaWx0ZXJEb21haW5TdGVwXG4gIGxldCBkb21haW5TdGVwczogRmlsdGVyICYge3N0ZXA/OiBudW1iZXIgfCB1bmRlZmluZWR9ID0ge307XG4gIGZpbHRlci5kYXRhSWQuZm9yRWFjaCgoZmlsdGVyRGF0YUlkLCBpZHgpID0+IHtcbiAgICBjb25zdCBkYXRhc2V0ID0gZGF0YXNldHNbZmlsdGVyRGF0YUlkXTtcbiAgICBjb25zdCBmaWx0ZXJQcm9wcyA9IGRhdGFzZXQuZ2V0Q29sdW1uRmlsdGVyUHJvcHMoZmlsdGVyLm5hbWVbaWR4XSk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBmaWd1cmUgb3V0IGNvcnJlY3QgdHlwZXMgdG8gdXNlIHdpdGggbWVyZ2VGaWx0ZXJEb21haW5TdGVwXG4gICAgZG9tYWluU3RlcHMgPSBtZXJnZUZpbHRlckRvbWFpblN0ZXAoZG9tYWluU3RlcHMsIGZpbHRlclByb3BzKTtcbiAgfSk7XG5cbiAgY29uc3QgbmV4dEZpbHRlciA9IHtcbiAgICAuLi5maWx0ZXIsXG4gICAgLy8gdmFsdWU6IG5leHRWYWx1ZSxcbiAgICBkb21haW46IGRvbWFpblN0ZXBzLmRvbWFpbixcbiAgICBzdGVwOiBkb21haW5TdGVwcy5zdGVwXG4gIH07XG5cbiAgY29uc3QgbmV4dFZhbHVlID0gYWRqdXN0VmFsdWVUb0ZpbHRlckRvbWFpbihuZXh0RmlsdGVyLnZhbHVlLCBuZXh0RmlsdGVyKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5uZXh0RmlsdGVyLFxuICAgIHZhbHVlOiBuZXh0VmFsdWVcbiAgfTtcbn1cblxuLyoqKlxuICogVXBkYXRlcyBhIHNpbmdsZSBwcm9wZXJ0eSBvZiBhIGZpbHRlclxuICovXG5mdW5jdGlvbiBfdXBkYXRlRmlsdGVyUHJvcChzdGF0ZSwgZmlsdGVyLCBwcm9wLCB2YWx1ZSwgdmFsdWVJbmRleCwgZGF0YXNldElkcz8pIHtcbiAgbGV0IGRhdGFzZXRJZHNUb0ZpbHRlcjogc3RyaW5nW10gPSBbXTtcbiAgc3dpdGNoIChwcm9wKSB7XG4gICAgLy8gVE9ETzogTmV4dCBQUiBmb3IgVUkgaWYgd2UgdXBkYXRlIGZpbHRlckRhdGFJZCwgd2UgbmVlZCB0byBjb25zaWRlciB0d28gY2FzZXM6XG4gICAgLy8gMS4gZGF0YUlkIGlzIGVtcHR5OiBjcmVhdGUgYSBkZWZhdWx0IGZpbHRlclxuICAgIC8vIDIuIEFkZCBhIG5ldyBkYXRhc2V0IGlkXG4gICAgY2FzZSBGSUxURVJfVVBEQVRFUl9QUk9QUy5kYXRhSWQ6IHtcbiAgICAgIGNvbnN0IG9sZERhdGFJZCA9IFsuLi5maWx0ZXIuZGF0YUlkXTtcbiAgICAgIGZpbHRlciA9IF91cGRhdGVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgoZmlsdGVyLCB2YWx1ZUluZGV4LCB2YWx1ZSwgc3RhdGUuZGF0YXNldHMpO1xuICAgICAgZGF0YXNldElkc1RvRmlsdGVyID0gdW5pcShbLi4ub2xkRGF0YUlkLCAuLi5maWx0ZXIuZGF0YUlkXSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBGSUxURVJfVVBEQVRFUl9QUk9QUy5uYW1lOiB7XG4gICAgICAvLyB3ZSBhcmUgc3VwcG9ydGluZyB0aGUgY3VycmVudCBmdW5jdGlvbmFsaXR5XG4gICAgICAvLyBUT0RPOiBOZXh0IFBSIGZvciBVSSBmaWx0ZXIgbmFtZSB3aWxsIG9ubHkgdXBkYXRlIGZpbHRlciBuYW1lIGJ1dCBpdCB3b24ndCBoYXZlIHNpZGUgZWZmZWN0c1xuICAgICAgLy8gd2UgYXJlIGdvbm5hIHVzZSBwYWlyIG9mIGRhdGFzZXRzIGFuZCBmaWVsZElkeCB0byB1cGRhdGUgdGhlIGZpbHRlclxuICAgICAgY29uc3QgZGF0YXNldElkID0gZmlsdGVyLmRhdGFJZFt2YWx1ZUluZGV4XTtcbiAgICAgIGNvbnN0IHtmaWx0ZXI6IHVwZGF0ZWRGaWx0ZXIsIGRhdGFzZXQ6IG5ld0RhdGFzZXR9ID0gYXBwbHlGaWx0ZXJGaWVsZE5hbWUoXG4gICAgICAgIGZpbHRlcixcbiAgICAgICAgc3RhdGUuZGF0YXNldHNbZGF0YXNldElkXSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlSW5kZXgsXG4gICAgICAgIHttZXJnZURvbWFpbjogdmFsdWVJbmRleCA+IDB9XG4gICAgICApO1xuICAgICAgaWYgKHVwZGF0ZWRGaWx0ZXIpIHtcbiAgICAgICAgZmlsdGVyID0gdXBkYXRlZEZpbHRlcjtcbiAgICAgICAgaWYgKGZpbHRlci5ncHUpIHtcbiAgICAgICAgICBmaWx0ZXIgPSBzZXRGaWx0ZXJHcHVNb2RlKGZpbHRlciwgc3RhdGUuZmlsdGVycyk7XG4gICAgICAgICAgZmlsdGVyID0gYXNzaWduR3B1Q2hhbm5lbChmaWx0ZXIsIHN0YXRlLmZpbHRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlID0gc2V0KFsnZGF0YXNldHMnLCBkYXRhc2V0SWRdLCBuZXdEYXRhc2V0LCBzdGF0ZSk7XG4gICAgICAgIC8vIHJlbW92ZSBmaWx0ZXIgUGxvdCBhdCBkYXRhc2V0SWQsIHNvIGl0IHdpbGwgYmUgcmVjYWxjdWxhdGVkXG4gICAgICAgIGZpbHRlciA9IHJlbW92ZUZpbHRlclBsb3QoZmlsdGVyLCBkYXRhc2V0SWQpO1xuXG4gICAgICAgIGRhdGFzZXRJZHNUb0ZpbHRlciA9IHVwZGF0ZWRGaWx0ZXIuZGF0YUlkO1xuICAgICAgfVxuICAgICAgLy8gb25seSBmaWx0ZXIgdGhlIGN1cnJlbnQgZGF0YXNldFxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSBGSUxURVJfVVBEQVRFUl9QUk9QUy5sYXllcklkOiB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSBvbmx5IGRhdGFzZXRJZC9zIGlmIHdlIGhhdmUgYWRkZWQvcmVtb3ZlZCBsYXllcnNcbiAgICAgIC8vIC0gY2hlY2sgZm9yIGxheWVySWQgY2hhbmdlcyAoWE9SIHdvcmtzIGJlY2F1c2Ugb2Ygc3RyaW5nIHZhbHVlcylcbiAgICAgIC8vIGlmIG5vIGRpZmZlcmVuY2VzIGJldHdlZW4gbGF5ZXJJZHMsIGRvbid0IGRvIGFueSBmaWx0ZXJpbmdcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGNvbnN0IGxheWVySWREaWZmZXJlbmNlID0geG9yKHZhbHVlLCBmaWx0ZXIubGF5ZXJJZCk7XG5cbiAgICAgIGNvbnN0IGxheWVyRGF0YUlkcyA9IHVuaXE8c3RyaW5nPihcbiAgICAgICAgbGF5ZXJJZERpZmZlcmVuY2VcbiAgICAgICAgICAubWFwKGxpZCA9PlxuICAgICAgICAgICAgZ2V0KFxuICAgICAgICAgICAgICBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxpZCksXG4gICAgICAgICAgICAgIFsnY29uZmlnJywgJ2RhdGFJZCddXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkKSBhcyBzdHJpbmdbXVxuICAgICAgKTtcblxuICAgICAgLy8gb25seSBmaWx0ZXIgZGF0YXNldHNJZHNcbiAgICAgIGRhdGFzZXRJZHNUb0ZpbHRlciA9IGxheWVyRGF0YUlkcztcblxuICAgICAgLy8gVXBkYXRlIG5ld0ZpbHRlciBkYXRhSWRzXG4gICAgICBjb25zdCBuZXdEYXRhSWRzID0gdW5pcTxzdHJpbmc+KFxuICAgICAgICB2YWx1ZVxuICAgICAgICAgID8ubWFwKGxpZCA9PlxuICAgICAgICAgICAgZ2V0KFxuICAgICAgICAgICAgICBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxpZCksXG4gICAgICAgICAgICAgIFsnY29uZmlnJywgJ2RhdGFJZCddXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkKSBhcyBzdHJpbmdbXVxuICAgICAgKTtcblxuICAgICAgZmlsdGVyID0ge1xuICAgICAgICAuLi5maWx0ZXIsXG4gICAgICAgIGxheWVySWQ6IHZhbHVlLFxuICAgICAgICBkYXRhSWQ6IG5ld0RhdGFJZHNcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgZmlsdGVyID0gc2V0KFtwcm9wXSwgdmFsdWUsIGZpbHRlcik7XG4gICAgICBkYXRhc2V0SWRzVG9GaWx0ZXIgPSBbLi4uZmlsdGVyLmRhdGFJZF07XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiB7ZmlsdGVyLCBkYXRhc2V0SWRzLCBkYXRhc2V0SWRzVG9GaWx0ZXIsIHN0YXRlfTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMgKi9cblxuLyoqXG4gKiBTZXQgdGhlIHByb3BlcnR5IG9mIGEgZmlsdGVyIHBsb3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRGaWx0ZXJQbG90VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR4LCBuZXdQcm9wLCB2YWx1ZUluZGV4ID0gMH06IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJQbG90VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBpZiAoIXN0YXRlLmZpbHRlcnNbaWR4XSkge1xuICAgIENvbnNvbGUuZXJyb3IoYGZpbHRlcnNbJHtpZHh9XSBpcyB1bmRlZmluZWRgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgbGV0IG5ld0ZpbHRlciA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcblxuICBmb3IgKGNvbnN0IHByb3AgaW4gbmV3UHJvcCkge1xuICAgIGlmIChwcm9wID09PSAncGxvdFR5cGUnKSB7XG4gICAgICBuZXdGaWx0ZXIgPSBwaWNrXygncGxvdFR5cGUnKShtZXJnZV8obmV3UHJvcC5wbG90VHlwZSkpKG5ld0ZpbHRlcik7XG4gICAgfSBlbHNlIGlmIChwcm9wID09PSAneUF4aXMnKSB7XG4gICAgICBjb25zdCBjaGFydFR5cGUgPSBuZXdQcm9wLnlBeGlzID8gUExPVF9UWVBFUy5saW5lQ2hhcnQgOiBQTE9UX1RZUEVTLmhpc3RvZ3JhbTtcblxuICAgICAgbmV3RmlsdGVyID0gcGlja18oJ3Bsb3RUeXBlJykobWVyZ2VfKHt0eXBlOiBjaGFydFR5cGV9KSkobWVyZ2VfKG5ld1Byb3ApKG5ld0ZpbHRlcikpO1xuICAgIH1cbiAgfVxuXG4gIG5ld0ZpbHRlciA9IHVwZGF0ZUZpbHRlclBsb3Qoc3RhdGUuZGF0YXNldHMsIG5ld0ZpbHRlcik7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT4gKGkgPT09IGlkeCA/IG5ld0ZpbHRlciA6IGYpKVxuICB9O1xufTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYWRkRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRGaWx0ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PlxuICAhYWN0aW9uLmRhdGFJZFxuICAgID8gc3RhdGVcbiAgICA6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGZpbHRlcnM6IFsuLi5zdGF0ZS5maWx0ZXJzLCBnZXREZWZhdWx0RmlsdGVyKHtkYXRhSWQ6IGFjdGlvbi5kYXRhSWQsIGlkOiBhY3Rpb24uaWR9KV1cbiAgICAgIH07XG5cbi8qKlxuICogQ3JlYXRlIG9yIHVwZGF0ZSBhIGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZU9yVXBkYXRlRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5DcmVhdGVPclVwZGF0ZUZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge2lkLCBkYXRhSWQsIGZpZWxkLCB2YWx1ZX0gPSBhY3Rpb247XG5cbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIGNvbnN0IG9yaWdpbmFsSW5kZXggPSBuZXdTdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGlkKTtcbiAgbGV0IGZpbHRlckluZGV4ID0gb3JpZ2luYWxJbmRleDtcbiAgaWYgKCFpZCAmJiAhZGF0YUlkKSB7XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xuICB9XG4gIGlmIChvcmlnaW5hbEluZGV4IDwgMCAmJiBkYXRhSWQpIHtcbiAgICBuZXdTdGF0ZSA9IGFkZEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtkYXRhSWR9KTtcbiAgICBpZiAobmV3U3RhdGUuZmlsdGVycy5sZW5ndGggIT09IHN0YXRlLmZpbHRlcnMubGVuZ3RoICsgMSkge1xuICAgICAgLy8gTm8gbmV3IGZpbHRlciB3YXMgYWRkZWRcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gICAgLy8gSGVyZSB3ZSBhcmUgYXNzdW1pbmcgdGhhdCB0aGUgZmlsdGVyIHdhcyBhZGRlZCBhdCB0aGUgZW5kXG4gICAgZmlsdGVySW5kZXggPSBuZXdTdGF0ZS5maWx0ZXJzLmxlbmd0aCAtIDE7XG4gICAgbmV3U3RhdGUuZmlsdGVyc1tmaWx0ZXJJbmRleF0gPSB7XG4gICAgICAuLi5uZXdTdGF0ZS5maWx0ZXJzW2ZpbHRlckluZGV4XSxcbiAgICAgIC4uLihpZCA/IHtpZH0gOiBudWxsKVxuICAgIH07XG4gIH1cblxuICAvLyBObyBuZWVkIHRvIHVwZGF0ZSB0aGlzIGlmIGl0J3MgYSBuZXdseSBjcmVhdGVkIGZpbHRlclxuICAvLyBGaXJzdCB3ZSBtYWtlIHN1cmUgYWxsIHRoZSBkYXRhSWRzIHRoYXQgZmllbGRzIHJlZmVyIHRvIGFyZSB1cGRhdGVkXG4gIGlmIChvcmlnaW5hbEluZGV4ID49IDAgJiYgZGF0YUlkKSB7XG4gICAgLy8gSWYgdGhlIGRhdGFJZCBpcyBhbiBhcnJheSwgd2UgbmVlZCB0byB1cGRhdGUgZWFjaCBvbmUgaW5kaXZpZHVhbGx5IGFzIHRoZXkgbmVlZCBhIGNvcnJlY3QgdmFsdWVJbmRleCBwYXNzZWRcbiAgICBuZXdTdGF0ZSA9IChBcnJheS5pc0FycmF5KGRhdGFJZCkgPyBkYXRhSWQgOiBbZGF0YUlkXSkucmVkdWNlKChhY2N1LCBkLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIoYWNjdSwge1xuICAgICAgICBpZHg6IGZpbHRlckluZGV4LFxuICAgICAgICBwcm9wOiAnZGF0YUlkJyxcbiAgICAgICAgdmFsdWU6IGQsXG4gICAgICAgIHZhbHVlSW5kZXg6IGluZGV4XG4gICAgICB9KTtcbiAgICB9LCBuZXdTdGF0ZSk7XG4gIH1cbiAgLy8gVGhlbiB3ZSB1cGRhdGUgdGhlIGZpZWxkc1xuICBpZiAoZmllbGQpIHtcbiAgICAvLyBJZiB0aGUgZmllbGQgaXMgYW4gYXJyYXksIHdlIG5lZWQgdG8gdXBkYXRlIGVhY2ggZmllbGQgaW5kaXZpZHVhbGx5IGFzIHRoZXkgbmVlZCBhIGNvcnJlY3QgdmFsdWVJbmRleCBwYXNzZWRcbiAgICBuZXdTdGF0ZSA9IChBcnJheS5pc0FycmF5KGZpZWxkKSA/IGZpZWxkIDogW2ZpZWxkXSkucmVkdWNlKChhY2N1LCBmLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIoYWNjdSwge1xuICAgICAgICBpZHg6IGZpbHRlckluZGV4LFxuICAgICAgICBwcm9wOiAnbmFtZScsXG4gICAgICAgIHZhbHVlOiBmLFxuICAgICAgICB2YWx1ZUluZGV4OiBpbmRleFxuICAgICAgfSk7XG4gICAgfSwgbmV3U3RhdGUpO1xuICB9XG4gIC8vIFRoZW4gd2UgdXBkYXRlIHRoZSB2YWx1ZSBzZXBhcmF0ZWx5XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbmV3U3RhdGUgPSBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7aWR4OiBmaWx0ZXJJbmRleCwgcHJvcDogJ3ZhbHVlJywgdmFsdWV9KTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn07XG5cbi8qKlxuICogU2V0IGxheWVyIGNvbG9yIHBhbGV0dGUgdWkgc3RhdGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBsYXllckNvbG9yVUlDaGFuZ2VVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtvbGRMYXllciwgcHJvcCwgbmV3Q29uZmlnfTogVmlzU3RhdGVBY3Rpb25zLkxheWVyQ29sb3JVSUNoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qgb2xkVml4Q29uZmlnID0gb2xkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZ1twcm9wXTtcbiAgY29uc3QgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbG9yVUkocHJvcCwgbmV3Q29uZmlnKTtcbiAgY29uc3QgbmV3VmlzQ29uZmlnID0gbmV3TGF5ZXIuY29uZmlnLnZpc0NvbmZpZ1twcm9wXTtcbiAgaWYgKG9sZFZpeENvbmZpZyAhPT0gbmV3VmlzQ29uZmlnKSB7XG4gICAgcmV0dXJuIGxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlcihzdGF0ZSwge1xuICAgICAgb2xkTGF5ZXIsXG4gICAgICBuZXdWaXNDb25maWc6IHtcbiAgICAgICAgW3Byb3BdOiBuZXdWaXNDb25maWdcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogc3RhdGUubGF5ZXJzLm1hcChsID0+IChsLmlkID09PSBvbGRMYXllci5pZCA/IG5ld0xheWVyIDogbCkpXG4gIH07XG59O1xuXG4vKipcbiAqIFN0YXJ0IGFuZCBlbmQgZmlsdGVyIGFuaW1hdGlvblxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUZpbHRlckFuaW1hdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGZpbHRlcnM6IHN0YXRlLmZpbHRlcnMubWFwKChmLCBpKSA9PiAoaSA9PT0gYWN0aW9uLmlkeCA/IHsuLi5mLCBpc0FuaW1hdGluZzogIWYuaXNBbmltYXRpbmd9IDogZikpXG59KTtcblxuLyoqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTGF5ZXJBbmltYXRpb25VcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlTGF5ZXJBbmltYXRpb25VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgIGlzQW5pbWF0aW5nOiAhc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmlzQW5pbWF0aW5nXG4gIH1cbn0pO1xuXG4vKipcbiAqIEhpZGUgYW5kIHNob3cgbGF5ZXIgYW5pbWF0aW9uIGNvbnRyb2xcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMYXllckFuaW1hdGlvbkNvbnRyb2xVcGRhdGVyID0gKHN0YXRlOiBWaXNTdGF0ZSk6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBhbmltYXRpb25Db25maWc6IHtcbiAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgaGlkZUNvbnRyb2w6ICFzdGF0ZS5hbmltYXRpb25Db25maWcuaGlkZUNvbnRyb2xcbiAgfVxufSk7XG5cbi8qKlxuICogQ2hhbmdlIGZpbHRlciBhbmltYXRpb24gc3BlZWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlRmlsdGVyQW5pbWF0aW9uU3BlZWRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoKGYsIGkpID0+IChpID09PSBhY3Rpb24uaWR4ID8gey4uLmYsIHNwZWVkOiBhY3Rpb24uc3BlZWR9IDogZikpXG59KTtcblxuLyoqXG4gKiBVcGRhdGUgYW5pbWF0aW9uIHNwZWVkIHdpdGggdGhlIHZlcnRpY2FsIHNwZWVkIHNsaWRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVMYXllckFuaW1hdGlvblNwZWVkVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7c3BlZWR9OiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIHNwZWVkXG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBTaG93IGxhcmdlciB0aW1lIGZpbHRlciBhdCBib3R0b20gZm9yIHRpbWUgcGxheWJhY2sgKGFwcGx5IHRvIHRpbWUgZmlsdGVyIG9ubHkpXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RmlsdGVyVmlld1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0RmlsdGVyVmlld1VwZGF0ZXJBY3Rpb25cbikgPT4ge1xuICBjb25zdCB7dmlldywgaWR4fSA9IGFjdGlvbjtcbiAgY29uc3Qgc2hvdWxkUmVzZXRPdGhlckZpbHRlcnNWaWV3ID0gdmlldyA9PT0gRklMVEVSX1ZJRVdfVFlQRVMuZW5sYXJnZWQ7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoKGYsIGkpID0+XG4gICAgICBpID09PSBpZHhcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgdmlld1xuICAgICAgICAgIH1cbiAgICAgICAgOiBzaG91bGRSZXNldE90aGVyRmlsdGVyc1ZpZXdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgdmlldzogRklMVEVSX1ZJRVdfVFlQRVMuc2lkZVxuICAgICAgICAgIH1cbiAgICAgICAgOiBmXG4gICAgKVxuICB9O1xufTtcblxuLyoqXG4gKiBUb2dnbGVzIGZpbHRlciBmZWF0dXJlIHZpc2liaWxpdHlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVGaWx0ZXJGZWF0dXJlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVGaWx0ZXJGZWF0dXJlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2FjdGlvbi5pZHhdO1xuICBjb25zdCBpc1Zpc2libGUgPSBnZXQoZmlsdGVyLCBbJ3ZhbHVlJywgJ3Byb3BlcnRpZXMnLCAnaXNWaXNpYmxlJ10pO1xuXG4gIGxldCBuZXdTdGF0ZSA9IHNldEZpbHRlclVwZGF0ZXIoc3RhdGUsIHtcbiAgICBpZHg6IGFjdGlvbi5pZHgsXG4gICAgcHJvcDogJ2VuYWJsZWQnLFxuICAgIHZhbHVlOiAhaXNWaXNpYmxlXG4gIH0pO1xuXG4gIG5ld1N0YXRlID0gc2V0RmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIGlkeDogYWN0aW9uLmlkeCxcbiAgICBwcm9wOiAndmFsdWUnLFxuICAgIHZhbHVlOiBmZWF0dXJlVG9GaWx0ZXJWYWx1ZShmaWx0ZXIudmFsdWUsIGZpbHRlci5pZCwge1xuICAgICAgaXNWaXNpYmxlOiAhaXNWaXNpYmxlXG4gICAgfSlcbiAgfSk7XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYSBmaWx0ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVGaWx0ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbW92ZUZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge2lkeH0gPSBhY3Rpb247XG4gIGNvbnN0IHtkYXRhSWQsIGlkfSA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcblxuICBjb25zdCBuZXdGaWx0ZXJzID0gW1xuICAgIC4uLnN0YXRlLmZpbHRlcnMuc2xpY2UoMCwgaWR4KSxcbiAgICAuLi5zdGF0ZS5maWx0ZXJzLnNsaWNlKGlkeCArIDEsIHN0YXRlLmZpbHRlcnMubGVuZ3RoKVxuICBdO1xuXG4gIGNvbnN0IGZpbHRlcmVkRGF0YXNldHMgPSBhcHBseUZpbHRlcnNUb0RhdGFzZXRzKGRhdGFJZCwgc3RhdGUuZGF0YXNldHMsIG5ld0ZpbHRlcnMsIHN0YXRlLmxheWVycyk7XG4gIGNvbnN0IG5ld0VkaXRvciA9XG4gICAgZ2V0RmlsdGVySWRJbkZlYXR1cmUoc3RhdGUuZWRpdG9yLnNlbGVjdGVkRmVhdHVyZSkgPT09IGlkXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBudWxsXG4gICAgICAgIH1cbiAgICAgIDogc3RhdGUuZWRpdG9yO1xuXG4gIGxldCBuZXdTdGF0ZSA9IHNldChbJ2ZpbHRlcnMnXSwgbmV3RmlsdGVycywgc3RhdGUpO1xuICBuZXdTdGF0ZSA9IHNldChbJ2RhdGFzZXRzJ10sIGZpbHRlcmVkRGF0YXNldHMsIG5ld1N0YXRlKTtcbiAgbmV3U3RhdGUgPSBzZXQoWydlZGl0b3InXSwgbmV3RWRpdG9yLCBuZXdTdGF0ZSk7XG5cbiAgcmV0dXJuIHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShuZXdTdGF0ZSwgZGF0YUlkLCB1bmRlZmluZWQpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgbGF5ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRMYXllclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuQWRkTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGxldCBuZXdMYXllcjtcbiAgbGV0IG5ld0xheWVyRGF0YTtcbiAgaWYgKGFjdGlvbi5jb25maWcpIHtcbiAgICBuZXdMYXllciA9IGNyZWF0ZUxheWVyRnJvbUNvbmZpZyhzdGF0ZSwgYWN0aW9uLmNvbmZpZyk7XG4gICAgaWYgKCFuZXdMYXllcikge1xuICAgICAgQ29uc29sZS53YXJuKFxuICAgICAgICAnRmFpbGVkIHRvIGNyZWF0ZSBsYXllciBmcm9tIGNvbmZpZywgaXQgdXN1YWxseSBtZWFucyB0aGUgY29uZmlnIGlzIG5vdCBiZSBpbiBjb3JyZWN0IGZvcm1hdCcsXG4gICAgICAgIGFjdGlvbi5jb25maWdcbiAgICAgICk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSk7XG4gICAgbmV3TGF5ZXIgPSByZXN1bHQubGF5ZXI7XG4gICAgbmV3TGF5ZXJEYXRhID0gcmVzdWx0LmxheWVyRGF0YTtcbiAgfSBlbHNlIHtcbiAgICAvLyBjcmVhdGUgYW4gZW1wdHkgbGF5ZXIgd2l0aCBhIHNwZWNpZmljIGRhdGFzZXQgb3IgYSBkZWZhdWx0IG9uZVxuICAgIGNvbnN0IGRlZmF1bHREYXRhc2V0ID0gYWN0aW9uLmRhdGFzZXRJZCA/PyBPYmplY3Qua2V5cyhzdGF0ZS5kYXRhc2V0cylbMF07XG4gICAgbmV3TGF5ZXIgPSBuZXcgTGF5ZXIoe1xuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgaXNDb25maWdBY3RpdmU6IHRydWUsXG4gICAgICBkYXRhSWQ6IGRlZmF1bHREYXRhc2V0XG4gICAgfSk7XG4gICAgbmV3TGF5ZXJEYXRhID0ge307XG4gIH1cblxuICBsZXQgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBbLi4uc3RhdGUubGF5ZXJzLCBuZXdMYXllcl0sXG4gICAgbGF5ZXJEYXRhOiBbLi4uc3RhdGUubGF5ZXJEYXRhLCBuZXdMYXllckRhdGFdLFxuICAgIC8vIGFkZCBuZXcgbGF5ZXIgYXQgdGhlIHRvcFxuICAgIGxheWVyT3JkZXI6IFtuZXdMYXllci5pZCwgLi4uc3RhdGUubGF5ZXJPcmRlcl0sXG4gICAgc3BsaXRNYXBzOiBhZGROZXdMYXllcnNUb1NwbGl0TWFwKHN0YXRlLnNwbGl0TWFwcywgbmV3TGF5ZXIpXG4gIH07XG5cbiAgaWYgKG5ld0xheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCkge1xuICAgIG5ld1N0YXRlID0gdXBkYXRlQW5pbWF0aW9uRG9tYWluKG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn07XG5cbi8qKlxuICogcmVtb3ZlIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTGF5ZXJVcGRhdGVyPFQgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBULFxuICB7aWR9OiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBUIHtcbiAgY29uc3QgaWR4ID0gTnVtYmVyLmlzRmluaXRlKGlkKVxuICAgID8gLy8gc3VwcG9ydCBvbGRlciBBUEksIHJlbW92ZSBsYXllciBieSBpZHhcbiAgICAgIE51bWJlcihpZClcbiAgICA6IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBpZCk7XG4gIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzdGF0ZS5sYXllcnMubGVuZ3RoKSB7XG4gICAgLy8gaW52YWxpZCBpbmRleFxuICAgIENvbnNvbGUud2FybihgY2FuIG5vdCByZW1vdmUgbGF5ZXIgd2l0aCBpbnZhbGlkIGlkfGlkeCAke2lkfWApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHtsYXllcnMsIGxheWVyRGF0YSwgbGF5ZXJPcmRlciwgY2xpY2tlZCwgaG92ZXJJbmZvfSA9IHN0YXRlO1xuICBjb25zdCBsYXllclRvUmVtb3ZlID0gbGF5ZXJzW2lkeF07XG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogZmlsdGVyT3V0QnlJZChsYXllclRvUmVtb3ZlLmlkKShsYXllcnMpLFxuICAgIGxheWVyRGF0YTogcmVtb3ZlRWxlbWVudEF0SW5kZXgoaWR4KShsYXllckRhdGEpLFxuICAgIGxheWVyT3JkZXI6IGxheWVyT3JkZXIuZmlsdGVyKGxheWVySWQgPT4gbGF5ZXJJZCAhPT0gbGF5ZXJUb1JlbW92ZS5pZCksXG4gICAgY2xpY2tlZDogbGF5ZXJUb1JlbW92ZS5pc0xheWVySG92ZXJlZChjbGlja2VkKSA/IHVuZGVmaW5lZCA6IGNsaWNrZWQsXG4gICAgaG92ZXJJbmZvOiBsYXllclRvUmVtb3ZlLmlzTGF5ZXJIb3ZlcmVkKGhvdmVySW5mbykgPyB1bmRlZmluZWQgOiBob3ZlckluZm8sXG4gICAgc3BsaXRNYXBzOiByZW1vdmVMYXllckZyb21TcGxpdE1hcHMoc3RhdGUuc3BsaXRNYXBzLCBsYXllclRvUmVtb3ZlKVxuICAgIC8vIFRPRE86IHVwZGF0ZSBmaWx0ZXJzLCBjcmVhdGUgaGVscGVyIHRvIHJlbW92ZSBsYXllciBmb3JtIGZpbHRlciAocmVtb3ZlIGxheWVyaWQgYW5kIGRhdGFpZCkgaWYgbWFwcGVkXG4gIH07XG5cbiAgcmV0dXJuIHVwZGF0ZUFuaW1hdGlvbkRvbWFpbihuZXdTdGF0ZSk7XG59XG5cbi8qKlxuICogUmVvcmRlciBsYXllclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlb3JkZXJMYXllclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge29yZGVyfTogVmlzU3RhdGVBY3Rpb25zLlJlb3JkZXJMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsYXllck9yZGVyOiBvcmRlclxufSk7XG5cbi8qKlxuICogZHVwbGljYXRlIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZHVwbGljYXRlTGF5ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZH06IFZpc1N0YXRlQWN0aW9ucy5EdXBsaWNhdGVMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3QgaWR4ID0gTnVtYmVyLmlzRmluaXRlKGlkKVxuICAgID8gLy8gc3VwcG9ydCBvbGRlciBBUEksIHJlbW92ZSBsYXllciBieSBpZHhcbiAgICAgIE51bWJlcihpZClcbiAgICA6IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBpZCk7XG4gIGlmIChpZHggPCAwIHx8ICFzdGF0ZS5sYXllcnNbaWR4XSkge1xuICAgIENvbnNvbGUud2FybihgbGF5ZXIgJHtpZHh9IG5vdCBmb3VuZCBpbiBsYXllck9yZGVyYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge2xheWVyc30gPSBzdGF0ZTtcbiAgY29uc3Qgb3JpZ2luYWwgPSBsYXllcnNbaWR4XTtcblxuICBjb25zdCBvcmlnaW5hbExheWVyT3JkZXJJZHggPSBzdGF0ZS5sYXllck9yZGVyLmZpbmRJbmRleChsaWQgPT4gbGlkID09PSBvcmlnaW5hbC5pZCk7XG4gIGxldCBuZXdMYWJlbCA9IGBDb3B5IG9mICR7b3JpZ2luYWwuY29uZmlnLmxhYmVsfWA7XG4gIGxldCBwb3N0Zml4ID0gMDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuICB3aGlsZSAobGF5ZXJzLmZpbmQobCA9PiBsLmNvbmZpZy5sYWJlbCA9PT0gbmV3TGFiZWwpKSB7XG4gICAgbmV3TGFiZWwgPSBgQ29weSBvZiAke29yaWdpbmFsLmNvbmZpZy5sYWJlbH0gJHsrK3Bvc3RmaXh9YDtcbiAgfVxuXG4gIC8vIGNvbGxlY3QgbGF5ZXIgY29uZmlnIGZyb20gb3JpZ2luYWxcbiAgY29uc3QgbG9hZGVkTGF5ZXIgPSBzZXJpYWxpemVMYXllcihvcmlnaW5hbCwgc3RhdGUuc2NoZW1hKTtcblxuICAvLyBhc3NpZ24gbmV3IGlkIGFuZCBsYWJlbCB0byBjb3BpZWQgbGF5ZXJcbiAgaWYgKCFsb2FkZWRMYXllcj8uY29uZmlnKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxvYWRlZExheWVyLmNvbmZpZy5sYWJlbCA9IG5ld0xhYmVsO1xuICBsb2FkZWRMYXllci5pZCA9IGdlbmVyYXRlSGFzaElkKExBWUVSX0lEX0xFTkdUSCk7XG5cbiAgLy8gYWRkIGxheWVyIHRvIHN0YXRlXG4gIGxldCBuZXh0U3RhdGUgPSBhZGRMYXllclVwZGF0ZXIoc3RhdGUsIHtjb25maWc6IGxvYWRlZExheWVyfSk7XG4gIC8vIHJldHJpZXZlIG5ld2x5IGNyZWF0ZWQgbGF5ZXJcbiAgY29uc3QgbmV3TGF5ZXIgPSBuZXh0U3RhdGUubGF5ZXJzW25leHRTdGF0ZS5sYXllcnMubGVuZ3RoIC0gMV07XG4gIC8vIHVwZGF0ZSBsYXllciBvcmRlciB3aXRoIG5ld0x5YWVyLmlkXG4gIGNvbnN0IG5ld0xheWVyT3JkZXIgPSBhcnJheUluc2VydChcbiAgICBuZXh0U3RhdGUubGF5ZXJPcmRlci5zbGljZSgxLCBuZXh0U3RhdGUubGF5ZXJPcmRlci5sZW5ndGgpLFxuICAgIG9yaWdpbmFsTGF5ZXJPcmRlcklkeCxcbiAgICBuZXdMYXllci5pZFxuICApO1xuXG4gIG5leHRTdGF0ZSA9IHJlb3JkZXJMYXllclVwZGF0ZXIobmV4dFN0YXRlLCB7b3JkZXI6IG5ld0xheWVyT3JkZXJ9KTtcblxuICByZXR1cm4gdXBkYXRlQW5pbWF0aW9uRG9tYWluKG5leHRTdGF0ZSk7XG59O1xuXG4vKipcbiAqIEFkZCBhIG5ldyBlZmZlY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRFZmZlY3RVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkFkZEVmZmVjdFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgaWYgKFxuICAgIGFjdGlvbi5jb25maWc/LnR5cGUgPT09IExJR0hUX0FORF9TSEFET1dfRUZGRUNULnR5cGUgJiZcbiAgICBzdGF0ZS5lZmZlY3RzLnNvbWUoZWZmZWN0ID0+IGVmZmVjdC50eXBlID09PSBMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVC50eXBlKVxuICApIHtcbiAgICBDb25zb2xlLndhcm4oYENhbid0IGFkZCBtb3JlIHRoYW4gb25lICR7TElHSFRfQU5EX1NIQURPV19FRkZFQ1QubmFtZX0gZWZmZWN0YCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgbmV3RWZmZWN0ID0gY3JlYXRlRWZmZWN0KGFjdGlvbi5jb25maWcpO1xuXG4gIC8vIGNvbGxhcHNlIGNvbmZpZ3VyYXRvcnMgZm9yIG90aGVyIGVmZmVjdHNcbiAgc3RhdGUuZWZmZWN0cy5mb3JFYWNoKGVmZmVjdCA9PiBlZmZlY3Quc2V0UHJvcHMoe2lzQ29uZmlnQWN0aXZlOiBmYWxzZX0pKTtcblxuICBjb25zdCBlZmZlY3RzID0gWy4uLnN0YXRlLmVmZmVjdHMsIG5ld0VmZmVjdF07XG4gIGNvbnN0IGVmZmVjdE9yZGVyID0gZml4RWZmZWN0T3JkZXIoZWZmZWN0cywgW25ld0VmZmVjdC5pZCwgLi4uc3RhdGUuZWZmZWN0T3JkZXJdKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVmZmVjdHMsXG4gICAgZWZmZWN0T3JkZXJcbiAgfTtcbn07XG5cbi8qKlxuICogcmVtb3ZlIGVmZmVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUVmZmVjdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkfTogVmlzU3RhdGVBY3Rpb25zLlJlbW92ZUVmZmVjdFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3QgaWR4ID0gc3RhdGUuZWZmZWN0cy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBpZCk7XG4gIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzdGF0ZS5lZmZlY3RzLmxlbmd0aCkge1xuICAgIENvbnNvbGUud2FybihgY2FuIG5vdCByZW1vdmUgZWZmZWN0IHdpdGggaW52YWxpZCBpZCAke2lkfWApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHtlZmZlY3RzLCBlZmZlY3RPcmRlcn0gPSBzdGF0ZTtcbiAgY29uc3QgZWZmZWN0VG9SZW1vdmUgPSBlZmZlY3RzW2lkeF07XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBmaXhlZCBpbiB0c1xuICAgIGVmZmVjdHM6IGZpbHRlck91dEJ5SWQoZWZmZWN0VG9SZW1vdmUuaWQpKGVmZmVjdHMpLFxuICAgIGVmZmVjdE9yZGVyOiBlZmZlY3RPcmRlci5maWx0ZXIoZWZmZWN0SWQgPT4gZWZmZWN0SWQgIT09IGVmZmVjdFRvUmVtb3ZlLmlkKVxuICB9O1xufTtcblxuLyoqXG4gKiBSZW9yZGVyIGVmZmVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlb3JkZXJFZmZlY3RVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtvcmRlcn06IFZpc1N0YXRlQWN0aW9ucy5SZW9yZGVyRWZmZWN0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGVmZmVjdE9yZGVyOiBmaXhFZmZlY3RPcmRlcihzdGF0ZS5lZmZlY3RzLCBbLi4ub3JkZXJdKVxufSk7XG5cbi8qKlxuICogVXBkYXRlIGVmZmVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUVmZmVjdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkLCBwcm9wc306IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVFZmZlY3RVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmVmZmVjdHMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gaWQpO1xuICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc3RhdGUuZWZmZWN0cy5sZW5ndGgpIHtcbiAgICBDb25zb2xlLndhcm4oYGNhbiBub3QgdXBkYXRlIGVmZmVjdCB3aXRoIGludmFsaWQgaWQgJHtpZH1gKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBsZXQgZWZmZWN0T3JkZXIgPSBzdGF0ZS5lZmZlY3RPcmRlcjtcbiAgaWYgKHByb3BzLmlkICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuaWQgIT09IGlkKSB7XG4gICAgY29uc3QgaWR4MiA9IHN0YXRlLmVmZmVjdHMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gcHJvcHMuaWQpO1xuICAgIGlmIChpZHgyID49IDApIHtcbiAgICAgIENvbnNvbGUud2FybihgY2FuIG5vdCB1cGRhdGUgZWZmZWN0IHdpdGggZXhpc3RpbmcgZWZmZWN0IGlkICR7aWR9YCk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZWZmZWN0T3JkZXIgPSBlZmZlY3RPcmRlci5tYXAoZWZmZWN0T3JkZXJJZCA9PlxuICAgICAgZWZmZWN0T3JkZXJJZCA9PT0gaWQgPyAocHJvcHMuaWQgYXMgc3RyaW5nKSA6IGVmZmVjdE9yZGVySWRcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbmV3RWZmZWN0cyA9IFsuLi5zdGF0ZS5lZmZlY3RzXTtcbiAgbmV3RWZmZWN0c1tpZHhdLnNldFByb3BzKHByb3BzKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVmZmVjdHM6IG5ld0VmZmVjdHMsXG4gICAgZWZmZWN0T3JkZXJcbiAgfTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGEgZGF0YXNldCBhbmQgYWxsIGxheWVycywgZmlsdGVycywgdG9vbHRpcCBjb25maWdzIHRoYXQgYmFzZWQgb24gaXRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEYXRhc2V0VXBkYXRlcjxUIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogVCxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlRGF0YXNldFVwZGF0ZXJBY3Rpb25cbik6IFQge1xuICAvLyBleHRyYWN0IGRhdGFzZXQga2V5XG4gIGNvbnN0IHtkYXRhSWQ6IGRhdGFzZXRLZXl9ID0gYWN0aW9uO1xuICBjb25zdCB7ZGF0YXNldHN9ID0gc3RhdGU7XG5cbiAgLy8gY2hlY2sgaWYgZGF0YXNldCBpcyBwcmVzZW50XG4gIGlmICghZGF0YXNldHNbZGF0YXNldEtleV0pIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7XG4gICAgbGF5ZXJzLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkYXRhc2V0czoge1tkYXRhc2V0S2V5XTogZGF0YXNldCwgLi4ubmV3RGF0YXNldHN9XG4gIH0gPSBzdGF0ZTtcblxuICBjb25zdCBsYXllcnNUb1JlbW92ZSA9IGxheWVycy5maWx0ZXIobCA9PiBsLmNvbmZpZy5kYXRhSWQgPT09IGRhdGFzZXRLZXkpLm1hcChsID0+IGwuaWQpO1xuXG4gIC8vIHJlbW92ZSBsYXllcnMgYW5kIGRhdGFzZXRzXG4gIGxldCBuZXdTdGF0ZSA9IGxheWVyc1RvUmVtb3ZlLnJlZHVjZSgoYWNjdSwgaWQpID0+IHJlbW92ZUxheWVyVXBkYXRlcihhY2N1LCB7aWR9KSwge1xuICAgIC4uLnN0YXRlLFxuICAgIGRhdGFzZXRzOiBuZXdEYXRhc2V0c1xuICB9KTtcblxuICAvLyB1cGRhdGUgZmlsdGVyc1xuICBjb25zdCBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbHRlciBvZiBuZXdTdGF0ZS5maWx0ZXJzKSB7XG4gICAgY29uc3QgdmFsdWVJbmRleCA9IGZpbHRlci5kYXRhSWQuaW5kZXhPZihkYXRhc2V0S2V5KTtcbiAgICBpZiAodmFsdWVJbmRleCA+PSAwICYmIGZpbHRlci5kYXRhSWQubGVuZ3RoID4gMSkge1xuICAgICAgLy8gb25seSByZW1vdmUgb25lIHN5bmNlZCBkYXRhc2V0IGZyb20gdGhlIGZpbHRlclxuICAgICAgZmlsdGVycy5wdXNoKF9yZW1vdmVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgoZmlsdGVyLCB2YWx1ZUluZGV4LCBkYXRhc2V0cykpO1xuICAgIH0gZWxzZSBpZiAodmFsdWVJbmRleCA8IDApIHtcbiAgICAgIC8vIGxlYXZlIHRoZSBmaWx0ZXIgYXMgaXNcbiAgICAgIGZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIG5ld1N0YXRlID0gey4uLm5ld1N0YXRlLCBmaWx0ZXJzfTtcblxuICByZXR1cm4gcmVtb3ZlRGF0YXNldEZyb21JbnRlcmFjdGlvbkNvbmZpZyhuZXdTdGF0ZSwge2RhdGFJZDogZGF0YXNldEtleX0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVEYXRhc2V0RnJvbUludGVyYWN0aW9uQ29uZmlnKHN0YXRlLCB7ZGF0YUlkfSkge1xuICBsZXQge2ludGVyYWN0aW9uQ29uZmlnfSA9IHN0YXRlO1xuICBjb25zdCB7dG9vbHRpcH0gPSBpbnRlcmFjdGlvbkNvbmZpZztcbiAgaWYgKHRvb2x0aXApIHtcbiAgICBjb25zdCB7Y29uZmlnfSA9IHRvb2x0aXA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IHtbZGF0YUlkXTogZmllbGRzLCAuLi5maWVsZHNUb1Nob3d9ID0gY29uZmlnLmZpZWxkc1RvU2hvdztcbiAgICBpbnRlcmFjdGlvbkNvbmZpZyA9IHtcbiAgICAgIC4uLmludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgdG9vbHRpcDogey4uLnRvb2x0aXAsIGNvbmZpZzogey4uLmNvbmZpZywgZmllbGRzVG9TaG93fX1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsuLi5zdGF0ZSwgaW50ZXJhY3Rpb25Db25maWd9O1xufVxuLyoqXG4gKiB1cGRhdGUgbGF5ZXIgYmxlbmRpbmcgbW9kZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbGF5ZXJCbGVuZGluZzogYWN0aW9uLm1vZGVcbn0pO1xuXG4vKipcbiAqIHVwZGF0ZSBvdmVybGF5IGJsZW5kaW5nIG1vZGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVPdmVybGF5QmxlbmRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZU92ZXJsYXlCbGVuZGluZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBvdmVybGF5QmxlbmRpbmc6IGFjdGlvbi5tb2RlXG59KTtcblxuLyoqXG4gKiBEaXNwbGF5IGRhdGFzZXQgdGFibGUgaW4gYSBtb2RhbFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNob3dEYXRhc2V0VGFibGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNob3dEYXRhc2V0VGFibGVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdGluZ0RhdGFzZXQ6IGFjdGlvbi5kYXRhSWRcbiAgfTtcbn07XG5cbi8qKlxuICogQWRkIGN1c3RvbSBjb2xvciBmb3IgZGF0YXNldHMgYW5kIGxheWVyc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZVRhYmxlQ29sb3JVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZURhdGFzZXRDb2xvclVwZGF0ZXJcbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHVwZGF0ZURhdGFzZXRQcm9wc1VwZGF0ZXIoc3RhdGUsIHtkYXRhSWQ6IGFjdGlvbi5kYXRhSWQsIHByb3BzOiB7Y29sb3I6IGFjdGlvbi5uZXdDb2xvcn19KTtcbn07XG5cbi8qKlxuICogcmVzZXQgdmlzU3RhdGUgdG8gaW5pdGlhbCBTdGF0ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0TWFwQ29uZmlnVXBkYXRlciA9IChzdGF0ZTogVmlzU3RhdGUpOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgLi4uc3RhdGUuaW5pdGlhbFN0YXRlLFxuICBpbml0aWFsU3RhdGU6IHN0YXRlLmluaXRpYWxTdGF0ZVxufSk7XG5cbi8qKlxuICogUHJvcGFnYXRlIGB2aXNTdGF0ZWAgcmVkdWNlciB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24uIEN1cnJlbnQgY29uZmlnIHdpbGwgYmUgb3ZlcnJpZGUuXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtjb25maWcgPSB7fSwgb3B0aW9ucyA9IHt9fVxuICB9OiB7XG4gICAgdHlwZT86IHR5cGVvZiBBY3Rpb25UeXBlcy5SRUNFSVZFX01BUF9DT05GSUc7XG4gICAgcGF5bG9hZDogUmVjZWl2ZU1hcENvbmZpZ1BheWxvYWQ7XG4gIH1cbik6IFZpc1N0YXRlID0+IHtcbiAgaWYgKCFjb25maWcudmlzU3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7a2VlcEV4aXN0aW5nQ29uZmlnfSA9IG9wdGlvbnM7XG5cbiAgLy8gcmVzZXQgY29uZmlnIGlmIGtlZXBFeGlzdGluZ0NvbmZpZyBpcyBmYWxzeVxuICBsZXQgbWVyZ2VkU3RhdGUgPSAha2VlcEV4aXN0aW5nQ29uZmlnID8gcmVzZXRNYXBDb25maWdVcGRhdGVyKHN0YXRlKSA6IHN0YXRlO1xuICBmb3IgKGNvbnN0IG1lcmdlciBvZiBzdGF0ZS5tZXJnZXJzKSB7XG4gICAgaWYgKGlzVmFsaWRNZXJnZXIobWVyZ2VyKSAmJiBoYXNQcm9wc1RvTWVyZ2UoY29uZmlnLnZpc1N0YXRlLCBtZXJnZXIucHJvcCkpIHtcbiAgICAgIG1lcmdlZFN0YXRlID0gbWVyZ2VyLm1lcmdlKFxuICAgICAgICBtZXJnZWRTdGF0ZSxcbiAgICAgICAgZ2V0UHJvcFZhbHVlVG9NZXJnZXIoY29uZmlnLnZpc1N0YXRlLCBtZXJnZXIucHJvcCwgbWVyZ2VyLnRvTWVyZ2VQcm9wKSxcbiAgICAgICAgLy8gZnJvbUNvbmZpZ1xuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRTdGF0ZTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBsYXllciBob3ZlciBldmVudCB3aXRoIGhvdmVyZWQgb2JqZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbGF5ZXJIb3ZlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuT25MYXllckhvdmVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGhvdmVySW5mbzoge1xuICAgIC8vIGRlY2suZ2wgaW5mbyBpcyBtdXRhYmxlXG4gICAgLi4uYWN0aW9uLmluZm8sXG4gICAgLi4uKE51bWJlci5pc0Zpbml0ZShhY3Rpb24ubWFwSW5kZXgpID8ge21hcEluZGV4OiBhY3Rpb24ubWFwSW5kZXh9IDoge30pXG4gIH1cbn0pO1xuXG4vKiBlc2xpbnQtZW5hYmxlIG1heC1zdGF0ZW1lbnRzICovXG5cbi8qKlxuICogVXBkYXRlIGBpbnRlcmFjdGlvbkNvbmZpZ2BcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuSW50ZXJhY3Rpb25Db25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtjb25maWd9ID0gYWN0aW9uO1xuXG4gIGNvbnN0IGludGVyYWN0aW9uQ29uZmlnID0ge1xuICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnLFxuICAgIC4uLntbY29uZmlnLmlkXTogY29uZmlnfVxuICB9O1xuXG4gIC8vIERvbid0IGVuYWJsZSB0b29sdGlwIGFuZCBicnVzaCBhdCB0aGUgc2FtZSB0aW1lXG4gIC8vIGJ1dCBjb29yZGluYXRlcyBjYW4gYmUgc2hvd24gYXQgYWxsIHRpbWVcbiAgY29uc3QgY29udHJhZGljdCA9IFsnYnJ1c2gnLCAndG9vbHRpcCddO1xuXG4gIGlmIChcbiAgICBjb250cmFkaWN0LmluY2x1ZGVzKGNvbmZpZy5pZCkgJiZcbiAgICBjb25maWcuZW5hYmxlZCAmJlxuICAgICFzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1tjb25maWcuaWRdLmVuYWJsZWRcbiAgKSB7XG4gICAgLy8gb25seSBlbmFibGUgb25lIGludGVyYWN0aW9uIGF0IGEgdGltZVxuICAgIGNvbnRyYWRpY3QuZm9yRWFjaChrID0+IHtcbiAgICAgIGlmIChrICE9PSBjb25maWcuaWQpIHtcbiAgICAgICAgaW50ZXJhY3Rpb25Db25maWdba10gPSB7Li4uaW50ZXJhY3Rpb25Db25maWdba10sIGVuYWJsZWQ6IGZhbHNlfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pZCA9PT0gJ2dlb2NvZGVyJyAmJiAhY29uZmlnLmVuYWJsZWQpIHtcbiAgICByZXR1cm4gcmVtb3ZlRGF0YXNldFVwZGF0ZXIobmV3U3RhdGUsIHtkYXRhSWQ6ICdnZW9jb2Rlcl9kYXRhc2V0J30pO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgbGF5ZXIgY2xpY2sgZXZlbnQgd2l0aCBjbGlja2VkIG9iamVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyQ2xpY2tVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLk9uTGF5ZXJDbGlja1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtb3VzZVBvczogc3RhdGUuaW50ZXJhY3Rpb25Db25maWcuY29vcmRpbmF0ZS5lbmFibGVkXG4gICAgPyB7XG4gICAgICAgIC4uLnN0YXRlLm1vdXNlUG9zLFxuICAgICAgICBwaW5uZWQ6IHN0YXRlLm1vdXNlUG9zLnBpbm5lZCA/IG51bGwgOiBjbG9uZURlZXAoc3RhdGUubW91c2VQb3MpXG4gICAgICB9XG4gICAgOiBzdGF0ZS5tb3VzZVBvcyxcbiAgY2xpY2tlZDogYWN0aW9uLmluZm8gJiYgYWN0aW9uLmluZm8ucGlja2VkID8gYWN0aW9uLmluZm8gOiBudWxsXG59KTtcblxuLyoqXG4gKiBUcmlnZ2VyIG1hcCBjbGljayBldmVudCwgdW5zZWxlY3QgY2xpY2tlZCBvYmplY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBtYXBDbGlja1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Pbk1hcENsaWNrVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGNsaWNrZWQ6IG51bGxcbiAgfTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBtYXAgbW92ZSBldmVudFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG1vdXNlTW92ZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2V2dH06IFZpc1N0YXRlQWN0aW9ucy5Pbk1vdXNlTW92ZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgaWYgKE9iamVjdC52YWx1ZXMoc3RhdGUuaW50ZXJhY3Rpb25Db25maWcpLnNvbWUoY29uZmlnID0+IGNvbmZpZy5lbmFibGVkKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIG1vdXNlUG9zOiB7XG4gICAgICAgIC4uLnN0YXRlLm1vdXNlUG9zLFxuICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShldnQucG9pbnQpID8ge21vdXNlUG9zaXRpb246IFsuLi5ldnQucG9pbnRdfSA6IHt9KSxcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZ0LmxuZ0xhdCkgPyB7Y29vcmRpbmF0ZTogWy4uLmV2dC5sbmdMYXRdfSA6IHt9KVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuLyoqXG4gKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiBhIGxheWVyIGZvciBhIHNwbGl0IG1hcFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNwbGl0TWFwVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5Ub2dnbGVTcGxpdE1hcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+XG4gIHN0YXRlLnNwbGl0TWFwcyAmJiBzdGF0ZS5zcGxpdE1hcHMubGVuZ3RoID09PSAwXG4gICAgPyB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAvLyBtYXliZSB3ZSBzaG91bGQgdXNlIGFuIGFycmF5IHRvIHN0b3JlIHN0YXRlIGZvciBhIHNpbmdsZSBtYXAgYXMgd2VsbFxuICAgICAgICAvLyBpZiBjdXJyZW50IG1hcHMgbGVuZ3RoIGlzIGVxdWFsIHRvIDAgaXQgbWVhbnMgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gc3BsaXQgdGhlIHZpZXdcbiAgICAgICAgc3BsaXRNYXBzOiBjb21wdXRlU3BsaXRNYXBMYXllcnMoc3RhdGUubGF5ZXJzLCB7ZHVwbGljYXRlOiBmYWxzZX0pXG4gICAgICB9XG4gICAgOiBjbG9zZVNwZWNpZmljTWFwQXRJbmRleChzdGF0ZSwgYWN0aW9uKTtcblxuLyoqXG4gKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiBhIGxheWVyIGluIGEgc3BsaXQgbWFwXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTGF5ZXJGb3JNYXBVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHttYXBJbmRleCwgbGF5ZXJJZH06IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVMYXllckZvck1hcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge3NwbGl0TWFwc30gPSBzdGF0ZTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHNwbGl0TWFwczogc3BsaXRNYXBzLm1hcCgoc20sIGkpID0+XG4gICAgICBpID09PSBtYXBJbmRleFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNwbGl0TWFwc1tpXSxcbiAgICAgICAgICAgIGxheWVyczoge1xuICAgICAgICAgICAgICAuLi5zcGxpdE1hcHNbaV0ubGF5ZXJzLFxuICAgICAgICAgICAgICAvLyBpZiBsYXllcklkIG5vdCBpbiBsYXllcnMsIHNldCBpdCB0byB2aXNpYmxlXG4gICAgICAgICAgICAgIFtsYXllcklkXTogIXNwbGl0TWFwc1tpXS5sYXllcnNbbGF5ZXJJZF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogc21cbiAgICApXG4gIH07XG59O1xuXG4vKipcbiAqIEFkZCBuZXcgZGF0YXNldCB0byBgdmlzU3RhdGVgLCB3aXRoIG9wdGlvbiB0byBsb2FkIGEgbWFwIGNvbmZpZyBhbG9uZyB3aXRoIHRoZSBkYXRhc2V0c1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBjb25zdCB1cGRhdGVWaXNEYXRhVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVWaXNEYXRhVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBkYXRhc2V0cyBjYW4gYmUgYSBzaW5nbGUgZGF0YSBlbnRyaWVzIG9yIGFuIGFycmF5IG9mIG11bHRpcGxlIGRhdGEgZW50cmllc1xuICBjb25zdCB7Y29uZmlnLCBvcHRpb25zfSA9IGFjdGlvbjtcblxuICAvLyBhcHBseSBjb25maWcgaWYgcGFzc2VkIGZyb20gYWN0aW9uXG4gIC8vIFRPRE86IHdlIGRvbid0IGhhbmRsZSBhc3luYyBtZXJnZXJzIGhlcmUgeWV0XG4gIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBjb25maWdcbiAgICA/IHJlY2VpdmVNYXBDb25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIHBheWxvYWQ6IHtjb25maWcsIG9wdGlvbnN9XG4gICAgICB9KVxuICAgIDogc3RhdGU7XG5cbiAgY29uc3QgZGF0YXNldHMgPSB0b0FycmF5KGFjdGlvbi5kYXRhc2V0cyk7XG5cbiAgY29uc3QgYWxsQ3JlYXRlRGF0YXNldHNUYXNrcyA9IGRhdGFzZXRzLm1hcChcbiAgICAoe2luZm8gPSB7fSwgLi4ucmVzdH0pID0+IGNyZWF0ZU5ld0RhdGFFbnRyeSh7aW5mbywgLi4ucmVzdH0sIHN0YXRlLmRhdGFzZXRzKSB8fCB7fVxuICApO1xuICAvLyBjYWxsIGFsbCBUYXNrc1xuICBjb25zdCB0YXNrcyA9IFRhc2suYWxsU2V0dGxlZChhbGxDcmVhdGVEYXRhc2V0c1Rhc2tzKS5tYXAocmVzdWx0cyA9PlxuICAgIGNyZWF0ZU5ld0RhdGFzZXRTdWNjZXNzKHtyZXN1bHRzLCBhZGRUb01hcE9wdGlvbnM6IG9wdGlvbnN9KVxuICApO1xuXG4gIHJldHVybiB3aXRoVGFzayhwcmV2aW91c1N0YXRlLCB0YXNrcyk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTmV3RGF0YXNldFN1Y2Nlc3NVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxDcmVhdGVOZXdEYXRhc2V0U3VjY2Vzc1BheWxvYWQ+XG4pOiBWaXNTdGF0ZSA9PiB7XG4gIC8vIGNvbnNvbGUubG9nKCdjcmVhdGVOZXdEYXRhc2V0U3VjY2Vzc1VwZGF0ZXInLCBhY3Rpb24ucGF5bG9hZCk7XG4gIGNvbnN0IHtyZXN1bHRzLCBhZGRUb01hcE9wdGlvbnN9ID0gYWN0aW9uLnBheWxvYWQ7XG4gIGNvbnN0IG5ld0RhdGFFbnRyaWVzID0gcmVzdWx0cy5yZWR1Y2UoKGFjY3UsIHJlc3VsdCkgPT4ge1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgY29uc3QgZGF0YXNldCA9IHJlc3VsdC52YWx1ZTtcbiAgICAgIHJldHVybiB7Li4uYWNjdSwgW2RhdGFzZXQuaWRdOiBkYXRhc2V0fTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaGFuZGxlIGNyZWF0ZSBkYXRhc2V0IGVycm9yXG4gICAgICBjb25zb2xlLmVycm9yKHJlc3VsdC5yZWFzb24pO1xuICAgICAgcmV0dXJuIGFjY3U7XG4gICAgfVxuICB9LCB7fSBhcyBEYXRhc2V0cyk7XG4gIC8vIHNhdmUgbmV3IGRhdGFzZXQgZW50cnkgdG8gc3RhdGVcbiAgY29uc3QgbWVyZ2VkU3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgZGF0YXNldHM6IG1lcmdlRGF0YXNldHNCeU9yZGVyKHN0YXRlLCBuZXdEYXRhRW50cmllcylcbiAgfTtcblxuICAvLyBtZXJnZSBzdGF0ZSB3aXRoIGNvbmZpZyB0byBiZSBtZXJnZWRcbiAgY29uc3QgbGF5ZXJNZXJnZXJzID0gc3RhdGUubWVyZ2Vycy5maWx0ZXIobSA9PiBtLndhaXRGb3JMYXllckRhdGEpO1xuICBjb25zdCBkYXRhc2V0TWVyZ2VycyA9IHN0YXRlLm1lcmdlcnMuZmlsdGVyKG0gPT4gIWxheWVyTWVyZ2Vycy5pbmNsdWRlcyhtKSk7XG5cbiAgY29uc3QgbmV3RGF0YUlkcyA9IE9iamVjdC5rZXlzKG5ld0RhdGFFbnRyaWVzKTtcbiAgY29uc3QgcG9zdE1lcmdlclBheWxvYWQgPSB7XG4gICAgbmV3RGF0YUlkcyxcbiAgICBvcHRpb25zOiBhZGRUb01hcE9wdGlvbnMsXG4gICAgbGF5ZXJNZXJnZXJzXG4gIH07XG5cbiAgcmV0dXJuIGFwcGx5TWVyZ2Vyc1VwZGF0ZXIobWVyZ2VkU3RhdGUsIHttZXJnZXJzOiBkYXRhc2V0TWVyZ2VycywgcG9zdE1lcmdlclBheWxvYWR9KTtcbn07XG5cbi8qKlxuICogQWRkIG5ldyBkYXRhc2V0IHRvIGB2aXNTdGF0ZWAsIHdpdGggb3B0aW9uIHRvIGxvYWQgYSBtYXAgY29uZmlnIGFsb25nIHdpdGggdGhlIGRhdGFzZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1lcmdlcnNVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjoge1xuICAgIG1lcmdlcnM6IE1lcmdlcjxhbnk+W107XG4gICAgcG9zdE1lcmdlclBheWxvYWQ6IFBvc3RNZXJnZXJQYXlsb2FkO1xuICB9XG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHttZXJnZXJzLCBwb3N0TWVyZ2VyUGF5bG9hZH0gPSBhY3Rpb247XG5cbiAgLy8gbWVyZ2Ugc3RhdGUgd2l0aCBjb25maWcgdG8gYmUgbWVyZ2VkXG4gIGNvbnN0IG1lcmdlU3RhdGVSZXN1bHQgPSBtZXJnZVN0YXRlRnJvbU1lcmdlcnMoXG4gICAgc3RhdGUsXG4gICAge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICAuLi5zdGF0ZS5pbml0aWFsU3RhdGVcbiAgICB9LFxuICAgIG1lcmdlcnMsXG4gICAgLy8gbmV3RGF0YUlkcyxcbiAgICBwb3N0TWVyZ2VyUGF5bG9hZFxuICApO1xuXG4gIC8vIGlmIGFsbCBtZXJnZWQsIGtpY2t1cCBwb3N0IG1lcmdlIHByb2Nlc3NcbiAgLy8gaWYgbm90IHdhaXRcbiAgcmV0dXJuIG1lcmdlU3RhdGVSZXN1bHQuYWxsTWVyZ2VkXG4gICAgPyBwb3N0TWVyZ2VVcGRhdGVyKG1lcmdlU3RhdGVSZXN1bHQubWVyZ2VkU3RhdGUsIHBvc3RNZXJnZXJQYXlsb2FkKVxuICAgIDogbWVyZ2VTdGF0ZVJlc3VsdC5tZXJnZWRTdGF0ZTtcbn1cblxuLyoqXG4gKiBBZGQgbmV3IGRhdGFzZXQgdG8gYHZpc1N0YXRlYCwgd2l0aCBvcHRpb24gdG8gbG9hZCBhIG1hcCBjb25maWcgYWxvbmcgd2l0aCB0aGUgZGF0YXNldHNcbiAqL1xuZnVuY3Rpb24gcG9zdE1lcmdlVXBkYXRlcihtZXJnZWRTdGF0ZTogVmlzU3RhdGUsIHBvc3RNZXJnZXJQYXlsb2FkOiBQb3N0TWVyZ2VyUGF5bG9hZCk6IFZpc1N0YXRlIHtcbiAgY29uc3Qge25ld0RhdGFJZHMsIG9wdGlvbnMsIGxheWVyTWVyZ2Vyc30gPSBwb3N0TWVyZ2VyUGF5bG9hZDtcbiAgY29uc3QgbmV3RmlsdGVycyA9IG1lcmdlZFN0YXRlLmZpbHRlcnMuZmlsdGVyKGYgPT5cbiAgICBmLmRhdGFJZC5maW5kKGZEYXRhSWQgPT4gbmV3RGF0YUlkcy5pbmNsdWRlcyhmRGF0YUlkKSlcbiAgKTtcbiAgY29uc3QgZGF0YXNldEZpbHRlcmVkOiBzdHJpbmdbXSA9IHVuaXEoXG4gICAgbmV3RmlsdGVycy5yZWR1Y2UoKGFjY3UsIGYpID0+IFsuLi5hY2N1LCAuLi5mLmRhdGFJZF0sIFtdIGFzIHN0cmluZ1tdKVxuICApO1xuICBjb25zdCBkYXRhRW1wdHkgPSBuZXdEYXRhSWRzLmxlbmd0aCA8IDE7XG5cbiAgbGV0IG5ld0xheWVycyA9ICFkYXRhRW1wdHlcbiAgICA/IG1lcmdlZFN0YXRlLmxheWVycy5maWx0ZXIobCA9PiBsLmNvbmZpZy5kYXRhSWQgJiYgbmV3RGF0YUlkcy5pbmNsdWRlcyhsLmNvbmZpZy5kYXRhSWQpKVxuICAgIDogW107XG5cbiAgY29uc3QgbmV3RGF0YUVudHJpZXMgPSBuZXdEYXRhSWRzLnJlZHVjZShcbiAgICAoYWNjdSwgaWQpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgW2lkXTogbWVyZ2VkU3RhdGUuZGF0YXNldHNbaWRdXG4gICAgfSksXG4gICAge31cbiAgKTtcblxuICBpZiAoIW5ld0xheWVycy5sZW5ndGggJiYgKG9wdGlvbnMgfHwge30pLmF1dG9DcmVhdGVMYXllcnMgIT09IGZhbHNlKSB7XG4gICAgLy8gbm8gbGF5ZXIgbWVyZ2VkLCBmaW5kIGRlZmF1bHRzXG4gICAgY29uc3QgcmVzdWx0ID0gYWRkRGVmYXVsdExheWVycyhtZXJnZWRTdGF0ZSwgbmV3RGF0YUVudHJpZXMpO1xuICAgIG1lcmdlZFN0YXRlID0gcmVzdWx0LnN0YXRlO1xuICAgIG5ld0xheWVycyA9IHJlc3VsdC5uZXdMYXllcnM7XG4gIH1cblxuICBpZiAobWVyZ2VkU3RhdGUuc3BsaXRNYXBzLmxlbmd0aCkge1xuICAgIC8vIGlmIG1hcCBpcyBzcGxpdCwgYWRkIG5ldyBsYXllcnMgdG8gc3BsaXRNYXBzXG4gICAgbmV3TGF5ZXJzID0gbWVyZ2VkU3RhdGUubGF5ZXJzLmZpbHRlcihcbiAgICAgIGwgPT4gbC5jb25maWcuZGF0YUlkICYmIG5ld0RhdGFJZHMuaW5jbHVkZXMobC5jb25maWcuZGF0YUlkKVxuICAgICk7XG4gICAgbWVyZ2VkU3RhdGUgPSB7XG4gICAgICAuLi5tZXJnZWRTdGF0ZSxcbiAgICAgIHNwbGl0TWFwczogYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcChtZXJnZWRTdGF0ZS5zcGxpdE1hcHMsIG5ld0xheWVycylcbiAgICB9O1xuICB9XG5cbiAgLy8gaWYgbm8gdG9vbHRpcHMgbWVyZ2VkIGFkZCBkZWZhdWx0IHRvb2x0aXBzXG4gIG5ld0RhdGFJZHMuZm9yRWFjaChkYXRhSWQgPT4ge1xuICAgIGNvbnN0IHRvb2x0aXBGaWVsZHMgPSBtZXJnZWRTdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwLmNvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXTtcbiAgICAvLyBsb2FkaW5nIGRhdGFzZXQ6IGF1dG9DcmVhdGVUb29sdGlwcyBpcyBmYWxzZSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBydW4gYWRkRGVmYXVsdFRvb2x0aXBzIHdoZW4gdG9vbHRpcEZpZWxkcyBpcyBlbXB0eVxuICAgIGlmIChcbiAgICAgIG9wdGlvbnM/LmF1dG9DcmVhdGVUb29sdGlwcyAhPT0gZmFsc2UgJiZcbiAgICAgICghQXJyYXkuaXNBcnJheSh0b29sdGlwRmllbGRzKSB8fCAhdG9vbHRpcEZpZWxkcy5sZW5ndGgpXG4gICAgKSB7XG4gICAgICAvLyBhZGRpbmcgZGF0YXNldDogYXV0b0NyZWF0ZVRvb2x0aXBzIGlzIHRydWVcbiAgICAgIG1lcmdlZFN0YXRlID0gYWRkRGVmYXVsdFRvb2x0aXBzKG1lcmdlZFN0YXRlLCBuZXdEYXRhRW50cmllc1tkYXRhSWRdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHVwZGF0ZWREYXRhc2V0cyA9IGRhdGFFbXB0eVxuICAgID8gT2JqZWN0LmtleXMobWVyZ2VkU3RhdGUuZGF0YXNldHMpXG4gICAgOiB1bmlxKE9iamVjdC5rZXlzKG5ld0RhdGFFbnRyaWVzKS5jb25jYXQoZGF0YXNldEZpbHRlcmVkKSk7XG5cbiAgbGV0IHVwZGF0ZWRTdGF0ZSA9IHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShtZXJnZWRTdGF0ZSwgdXBkYXRlZERhdGFzZXRzLCB1bmRlZmluZWQpO1xuXG4gIC8vIHJlZ2lzdGVyIGxheWVyIGFuaW1hdGlvbiBkb21haW4sXG4gIC8vIG5lZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGxheWVyIGRhdGEgaXMgY2FsY3VsYXRlZFxuICB1cGRhdGVkU3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4odXBkYXRlZFN0YXRlKTtcblxuICAvLyB0cnkgdG8gcHJvY2VzcyBsYXllck1lcmdlcnMgYWZ0ZXIgZGF0YXNldCtkYXRhc2V0TWVyZ2Vyc1xuICB1cGRhdGVkU3RhdGUgPVxuICAgIGxheWVyTWVyZ2VycyAmJiBsYXllck1lcmdlcnMubGVuZ3RoID4gMFxuICAgICAgPyBhcHBseU1lcmdlcnNVcGRhdGVyKHVwZGF0ZWRTdGF0ZSwge1xuICAgICAgICAgIG1lcmdlcnM6IGxheWVyTWVyZ2VycyxcbiAgICAgICAgICBwb3N0TWVyZ2VyUGF5bG9hZDogey4uLnBvc3RNZXJnZXJQYXlsb2FkLCBsYXllck1lcmdlcnM6IFtdfVxuICAgICAgICB9KVxuICAgICAgOiB1cGRhdGVkU3RhdGU7XG5cbiAgLy8gY2VudGVyIHRoZSBtYXAgb25jZSB0aGUgZGF0YXNldCBpcyBjcmVhdGVkXG4gIGlmIChuZXdMYXllcnMubGVuZ3RoICYmIChvcHRpb25zIHx8IHt9KS5jZW50ZXJNYXApIHtcbiAgICBjb25zdCBib3VuZHMgPSBmaW5kTWFwQm91bmRzKG5ld0xheWVycyk7XG4gICAgaWYgKGJvdW5kcykge1xuICAgICAgY29uc3QgZml0Qm91bmRzVGFzayA9IEFDVElPTl9UQVNLKCkubWFwKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpdE1hcEJvdW5kcyhib3VuZHMpO1xuICAgICAgfSk7XG4gICAgICB1cGRhdGVkU3RhdGUgPSB3aXRoVGFzayh1cGRhdGVkU3RhdGUsIGZpdEJvdW5kc1Rhc2spO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cGRhdGVkU3RhdGU7XG59XG5cbi8qKlxuICogUmVuYW1lIGFuIGV4aXN0aW5nIGRhdGFzZXQgaW4gYHZpc1N0YXRlYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZURhdGFzZXRVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbmFtZURhdGFzZXRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB1cGRhdGVEYXRhc2V0UHJvcHNVcGRhdGVyKHN0YXRlLCB7ZGF0YUlkOiBhY3Rpb24uZGF0YUlkLCBwcm9wczoge2xhYmVsOiBhY3Rpb24ubGFiZWx9fSk7XG59XG5cbmNvbnN0IEFMTE9XRURfVVBEQVRFX0RBVEFTRVRfUFJPUFMgPSBbJ2xhYmVsJywgJ2NvbG9yJywgJ21ldGFkYXRhJ107XG5cbi8qKlxuICogVmFsaWRhdGVzIHByb3BlcnRpZXMgYmVmb3JlIHVwZGF0aW5nIHRoZSBkYXRhc2V0LlxuICogTWFrZXMgc3VyZSBlYWNoIHByb3BlcnR5IGlzIGluIHRoZSBhbGxvd2VkIGxpc3RcbiAqIE1ha2VzIHN1cmUgY29sb3IgdmFsdWUgaXMgUkdCXG4gKiBQZXJmb3JtcyBkZWVwIG1lcmdlIHdoZW4gdXBkYXRpbmcgbWV0YWRhdGFcbiAqL1xuY29uc3QgdmFsaWRhdGVEYXRhc2V0VXBkYXRlUHJvcHMgPSAocHJvcHMsIGRhdGFzZXQpID0+IHtcbiAgY29uc3QgdmFsaWRhdGVkUHJvcHMgPSBPYmplY3QuZW50cmllcyhwcm9wcykucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG4gICAgLy8gaXMgaXQgYWxsb3dlZCA/XG4gICAgaWYgKCFBTExPV0VEX1VQREFURV9EQVRBU0VUX1BST1BTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgYXJlIGFkZGluZyBhIGNvbG9yIGJ1dCBpdCBpcyBub3QgUkdCIHdlIGRvbid0IGFjY2VwdCB0aGUgdmFsdWVcbiAgICAvLyBpbiB0aGUgZnV0dXJlIGFzIHdlIGFkZCBtb3JlIHByb3BzIHdlIHNob3VsZCBjaGFuZ2UgdGhpcyBpZiBpbnRvIGEgc3dpdGNoXG4gICAgaWYgKGtleSA9PT0gJ2NvbG9yJyAmJiAhaXNSZ2JDb2xvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuXG4gICAgLy8gZG8gd2UgbmVlZCBkZWVwIG1lcmdlID9cbiAgICByZXR1cm4gey4uLmFjYywgW2tleV06IGlzUGxhaW5PYmplY3QodmFsdWUpID8gZGVlcG1lcmdlKGRhdGFzZXRba2V5XSB8fCB7fSwgdmFsdWUpIDogdmFsdWV9O1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIHZhbGlkYXRlZFByb3BzO1xufTtcblxuLyoqXG4gKiBVcGRhdGUgRGF0YXNldCBwcm9wcyAobGFiZWwsIGNvbG9yLCBtZXRhKS4gRG8gbm90IHVzZSB0byB1cGRhdGUgZGF0YSBvciBhbnkgcmVsYXRlZCBwcm9wZXJ0aWVzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRGF0YXNldFByb3BzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVEYXRhc2V0UHJvcHNVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtkYXRhSWQsIHByb3BzfSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFzZXRzfSA9IHN0YXRlO1xuICBjb25zdCBleGlzdGluZyA9IGRhdGFzZXRzW2RhdGFJZF07XG5cbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgY29uc3QgdmFsaWRhdGVkUHJvcHMgPSB2YWxpZGF0ZURhdGFzZXRVcGRhdGVQcm9wcyhwcm9wcywgZXhpc3RpbmcpO1xuICAgIC8vICB2YWxpZGF0ZSBwcm9wczoganVzdCBjb2xvciBmb3Igbm93XG4gICAgLy8gIHdlIG9ubHkgYWxsb3cgbGFiZWwsIGNvbG9yIGFuZCBtZXRhIHRvIGJlIHVwZGF0ZWRcbiAgICAvLyBjb25zdCBuZXdUYWJsZSA9IGNvcHlUYWJsZUFuZFVwZGF0ZShleGlzdGluZywgdmFsaWRhdGVkUHJvcHMpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRhdGFzZXRzOiB7XG4gICAgICAgIC4uLmRhdGFzZXRzLFxuICAgICAgICBbZGF0YUlkXTogY29weVRhYmxlQW5kVXBkYXRlKGV4aXN0aW5nLCB2YWxpZGF0ZWRQcm9wcylcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFdoZW4gYSB1c2VyIGNsaWNrcyBvbiB0aGUgc3BlY2lmaWMgbWFwIGNsb3NpbmcgaWNvblxuICogdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2xvc2UgdGhlIHNlbGVjdGVkIG1hcFxuICogYW5kIHdpbGwgbWVyZ2UgdGhlIHJlbWFpbmluZyBvbmUgd2l0aCB0aGUgZ2xvYmFsIHN0YXRlXG4gKiBUT0RPOiBpIHRoaW5rIGluIHRoZSBmdXR1cmUgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBtZXJnZSBtYXAgbGF5ZXJzIHdpdGggZ2xvYmFsIHNldHRpbmdzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgYHZpc1N0YXRlYFxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbiBhY3Rpb25cbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VTcGVjaWZpY01hcEF0SW5kZXg8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFjdGlvbjogTWFwU3RhdGVBY3Rpb25zLlRvZ2dsZVNwbGl0TWFwVXBkYXRlckFjdGlvblxuKTogUyB7XG4gIC8vIHJldHJpZXZlIGxheWVycyBtZXRhIGRhdGEgZnJvbSB0aGUgcmVtYWluaW5nIG1hcCB0aGF0IHdlIG5lZWQgdG8ga2VlcFxuICBjb25zdCBpbmRleFRvUmV0cmlldmUgPSAxIC0gYWN0aW9uLnBheWxvYWQ7XG4gIGNvbnN0IG1hcExheWVycyA9IHN0YXRlLnNwbGl0TWFwc1tpbmRleFRvUmV0cmlldmVdPy5sYXllcnM7XG4gIGNvbnN0IHtsYXllcnN9ID0gc3RhdGU7XG5cbiAgLy8gdXBkYXRlIGxheWVyIHZpc2liaWxpdHlcbiAgY29uc3QgbmV3TGF5ZXJzID0gbGF5ZXJzLm1hcChsYXllciA9PlxuICAgIG1hcExheWVycyAmJiAhbWFwTGF5ZXJzW2xheWVyLmlkXSAmJiBsYXllci5jb25maWcuaXNWaXNpYmxlXG4gICAgICA/IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgICAvLyBpZiBsYXllci5pZCBpcyBub3QgaW4gbWFwTGF5ZXJzLCBpdCBzaG91bGQgYmUgaW5WaXNpYmxlXG4gICAgICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgOiBsYXllclxuICApO1xuXG4gIC8vIGRlbGV0ZSBtYXBcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBzcGxpdE1hcHM6IFtdXG4gIH07XG59XG5cbi8qKlxuICogVHJpZ2dlciBmaWxlIGxvYWRpbmcgZGlzcGF0Y2ggYGFkZERhdGFUb01hcGAgaWYgc3VjY2VlZCwgb3IgYGxvYWRGaWxlc0VycmAgaWYgZmFpbGVkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZXNVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IHtmaWxlcywgb25GaW5pc2ggPSBsb2FkRmlsZXNTdWNjZXNzfSA9IGFjdGlvbjtcbiAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBmaWxlTG9hZGluZ1Byb2dyZXNzID0gQXJyYXkuZnJvbShmaWxlcykucmVkdWNlKFxuICAgIChhY2N1LCBmLCBpKSA9PiBtZXJnZV8oaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MoZiwgaSkpKGFjY3UpLFxuICAgIHt9XG4gICk7XG5cbiAgY29uc3QgZmlsZUxvYWRpbmcgPSB7XG4gICAgZmlsZUNhY2hlOiBbXSxcbiAgICBmaWxlc1RvTG9hZDogZmlsZXMsXG4gICAgb25GaW5pc2hcbiAgfTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSBtZXJnZV8oe2ZpbGVMb2FkaW5nUHJvZ3Jlc3MsIGZpbGVMb2FkaW5nfSkoc3RhdGUpO1xuXG4gIHJldHVybiBsb2FkTmV4dEZpbGVVcGRhdGVyKG5leHRTdGF0ZSk7XG59O1xuXG4vKipcbiAqIFN1Y2Vzc2Z1bGx5IGxvYWRlZCBvbmUgZmlsZSwgbW92ZSBvbiB0byB0aGUgbmV4dCBvbmVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZVN0ZXBTdWNjZXNzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZVN0ZXBTdWNjZXNzQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghc3RhdGUuZmlsZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qge2ZpbGVOYW1lLCBmaWxlQ2FjaGV9ID0gYWN0aW9uO1xuICBjb25zdCB7ZmlsZXNUb0xvYWQsIG9uRmluaXNofSA9IHN0YXRlLmZpbGVMb2FkaW5nO1xuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7XG4gICAgZmlsZU5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtwZXJjZW50OiAxLCBtZXNzYWdlOiAnRG9uZSd9XG4gIH0pO1xuXG4gIC8vIHNhdmUgcHJvY2Vzc2VkIGZpbGUgdG8gZmlsZUNhY2hlXG4gIGNvbnN0IHN0YXRlV2l0aENhY2hlID0gcGlja18oJ2ZpbGVMb2FkaW5nJykobWVyZ2VfKHtmaWxlQ2FjaGV9KSkoc3RhdGVXaXRoUHJvZ3Jlc3MpO1xuXG4gIHJldHVybiB3aXRoVGFzayhcbiAgICBzdGF0ZVdpdGhDYWNoZSxcbiAgICBERUxBWV9UQVNLKDIwMCkubWFwKGZpbGVzVG9Mb2FkLmxlbmd0aCA/IGxvYWROZXh0RmlsZSA6ICgpID0+IG9uRmluaXNoKGZpbGVDYWNoZSkpXG4gICk7XG59XG5cbi8vIHdpdGhUYXNrPFQ+KHN0YXRlOiBULCB0YXNrOiBhbnkpOiBUXG5cbi8qKlxuICpcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTmV4dEZpbGVVcGRhdGVyKHN0YXRlOiBWaXNTdGF0ZSk6IFZpc1N0YXRlIHtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZXNUb0xvYWR9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG4gIGNvbnN0IFtmaWxlLCAuLi5yZW1haW5pbmdGaWxlc1RvTG9hZF0gPSBmaWxlc1RvTG9hZDtcblxuICAvLyBzYXZlIGZpbGVzVG9Mb2FkIHRvIHN0YXRlXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHBpY2tfKCdmaWxlTG9hZGluZycpKG1lcmdlXyh7ZmlsZXNUb0xvYWQ6IHJlbWFpbmluZ0ZpbGVzVG9Mb2FkfSkpKHN0YXRlKTtcblxuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKG5leHRTdGF0ZSwge1xuICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtwZXJjZW50OiAwLCBtZXNzYWdlOiAnbG9hZGluZy4uLid9XG4gIH0pO1xuXG4gIGNvbnN0IHtsb2FkZXJzLCBsb2FkT3B0aW9uc30gPSBzdGF0ZTtcbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIG1ha2VMb2FkRmlsZVRhc2soXG4gICAgICBmaWxlLFxuICAgICAgbmV4dFN0YXRlLmZpbGVMb2FkaW5nICYmIG5leHRTdGF0ZS5maWxlTG9hZGluZy5maWxlQ2FjaGUsXG4gICAgICBsb2FkZXJzLFxuICAgICAgbG9hZE9wdGlvbnNcbiAgICApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTG9hZEZpbGVUYXNrKGZpbGUsIGZpbGVDYWNoZSwgbG9hZGVyczogTG9hZGVyW10gPSBbXSwgbG9hZE9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gTE9BRF9GSUxFX1RBU0soe2ZpbGUsIGZpbGVDYWNoZSwgbG9hZGVycywgbG9hZE9wdGlvbnN9KS5iaW1hcChcbiAgICAvLyBwcmV0dGllciBpZ25vcmVcbiAgICAvLyBzdWNjZXNzXG4gICAgZ2VuID0+XG4gICAgICBuZXh0RmlsZUJhdGNoKHtcbiAgICAgICAgZ2VuLFxuICAgICAgICBmaWxlTmFtZTogZmlsZS5uYW1lLFxuICAgICAgICBvbkZpbmlzaDogcmVzdWx0ID0+XG4gICAgICAgICAgcHJvY2Vzc0ZpbGVDb250ZW50KHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHJlc3VsdCxcbiAgICAgICAgICAgIGZpbGVDYWNoZVxuICAgICAgICAgIH0pXG4gICAgICB9KSxcblxuICAgIC8vIGVycm9yXG4gICAgZXJyID0+IGxvYWRGaWxlc0VycihmaWxlLm5hbWUsIGVycilcbiAgKTtcbn1cblxuLyoqXG4gKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NGaWxlQ29udGVudFVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7Y29udGVudCwgZmlsZUNhY2hlfSA9IGFjdGlvbi5wYXlsb2FkO1xuXG4gIGNvbnN0IHN0YXRlV2l0aFByb2dyZXNzID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZTogY29udGVudC5maWxlTmFtZSxcbiAgICBwcm9ncmVzczoge3BlcmNlbnQ6IDEsIG1lc3NhZ2U6ICdwcm9jZXNzaW5nLi4uJ31cbiAgfSk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIFBST0NFU1NfRklMRV9EQVRBKHtjb250ZW50LCBmaWxlQ2FjaGV9KS5iaW1hcChcbiAgICAgIHJlc3VsdCA9PiBsb2FkRmlsZVN0ZXBTdWNjZXNzKHtmaWxlTmFtZTogY29udGVudC5maWxlTmFtZSwgZmlsZUNhY2hlOiByZXN1bHR9KSxcbiAgICAgIGVyciA9PiBsb2FkRmlsZXNFcnIoY29udGVudC5maWxlTmFtZSwgZXJyKVxuICAgIClcbiAgKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHJvZ3Jlc3MocHJldlByb2dyZXNzID0ge30sIHByb2dyZXNzKSB7XG4gIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlY2VpdmluZyBxdWVyeSBtZXRhZGF0YSBvciBvdGhlciBjYXNlcyB3ZSBkb24ndFxuICAvLyBoYXZlIGFuIHVwZGF0ZSBmb3IgdGhlIHVzZXIuXG4gIGlmICghcHJvZ3Jlc3MgfHwgIXByb2dyZXNzLnBlcmNlbnQpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBlcmNlbnQ6IHByb2dyZXNzLnBlcmNlbnRcbiAgfTtcbn1cblxuLyoqXG4gKiBnZXRzIGNhbGxlZCB3aXRoIHBheWxvYWQgPSBBc3luY0dlbmVyYXRvcjw/Pz8+XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbmV4dEZpbGVCYXRjaFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtnZW4sIGZpbGVOYW1lLCBwcm9ncmVzcywgYWNjdW11bGF0ZWQsIG9uRmluaXNofVxuICB9OiBWaXNTdGF0ZUFjdGlvbnMuTmV4dEZpbGVCYXRjaFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qgc3RhdGVXaXRoUHJvZ3Jlc3MgPSB1cGRhdGVGaWxlTG9hZGluZ1Byb2dyZXNzVXBkYXRlcihzdGF0ZSwge1xuICAgIGZpbGVOYW1lLFxuICAgIHByb2dyZXNzOiBwYXJzZVByb2dyZXNzKHN0YXRlLmZpbGVMb2FkaW5nUHJvZ3Jlc3NbZmlsZU5hbWVdLCBwcm9ncmVzcylcbiAgfSk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKHN0YXRlV2l0aFByb2dyZXNzLCBbXG4gICAgLi4uKGZpbGVOYW1lLmVuZHNXaXRoKCdhcnJvdycpICYmIGFjY3VtdWxhdGVkPy5kYXRhPy5sZW5ndGggPiAwXG4gICAgICA/IFtcbiAgICAgICAgICBQUk9DRVNTX0ZJTEVfREFUQSh7Y29udGVudDogYWNjdW11bGF0ZWQsIGZpbGVDYWNoZTogW119KS5iaW1hcChcbiAgICAgICAgICAgIHJlc3VsdCA9PiBsb2FkRmlsZXNTdWNjZXNzKHJlc3VsdCksXG4gICAgICAgICAgICBlcnIgPT4gbG9hZEZpbGVzRXJyKGZpbGVOYW1lLCBlcnIpXG4gICAgICAgICAgKVxuICAgICAgICBdXG4gICAgICA6IFtdKSxcbiAgICBVTldSQVBfVEFTSyhnZW4ubmV4dCgpKS5iaW1hcChcbiAgICAgICh7dmFsdWUsIGRvbmV9KSA9PiB7XG4gICAgICAgIHJldHVybiBkb25lXG4gICAgICAgICAgPyBvbkZpbmlzaChhY2N1bXVsYXRlZClcbiAgICAgICAgICA6IG5leHRGaWxlQmF0Y2goe1xuICAgICAgICAgICAgICBnZW4sXG4gICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICBwcm9ncmVzczogdmFsdWUucHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIGFjY3VtdWxhdGVkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgb25GaW5pc2hcbiAgICAgICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGVyciA9PiBsb2FkRmlsZXNFcnIoZmlsZU5hbWUsIGVycilcbiAgICApXG4gIF0pO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VyIGxvYWRpbmcgZmlsZSBlcnJvclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc0VyclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2Vycm9yLCBmaWxlTmFtZX06IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZXNFcnJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIC8vIHVwZGF0ZSB1aSB3aXRoIGVycm9yIG1lc3NhZ2VcbiAgQ29uc29sZS53YXJuKGVycm9yKTtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZXNUb0xvYWQsIG9uRmluaXNoLCBmaWxlQ2FjaGV9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG5cbiAgY29uc3QgbmV4dFN0YXRlID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZSxcbiAgICBwcm9ncmVzczoge2Vycm9yfVxuICB9KTtcblxuICAvLyBraWNrIG9mZiBuZXh0IGZpbGUgb3IgZmluaXNoXG4gIHJldHVybiB3aXRoVGFzayhcbiAgICBuZXh0U3RhdGUsXG4gICAgREVMQVlfVEFTSygyMDApLm1hcChmaWxlc1RvTG9hZC5sZW5ndGggPyBsb2FkTmV4dEZpbGUgOiAoKSA9PiBvbkZpbmlzaChmaWxlQ2FjaGUpKVxuICApO1xufTtcblxuLyoqXG4gKiBXaGVuIHNlbGVjdCBkYXRhc2V0IGZvciBleHBvcnQsIGFwcGx5IGNwdSBmaWx0ZXIgdG8gc2VsZWN0ZWQgZGF0YXNldFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5Q1BVRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkfTogVmlzU3RhdGVBY3Rpb25zLkFwcGx5Q1BVRmlsdGVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBhcHBseSBjcHVGaWx0ZXJcbiAgY29uc3QgZGF0YUlkcyA9IHRvQXJyYXkoZGF0YUlkKTtcblxuICByZXR1cm4gZGF0YUlkcy5yZWR1Y2UoKGFjY3UsIGlkKSA9PiBmaWx0ZXJEYXRhc2V0Q1BVKGFjY3UsIGlkKSwgc3RhdGUpO1xufTtcblxuLyoqXG4gKiBVc2VyIGlucHV0IHRvIHVwZGF0ZSB0aGUgaW5mbyBvZiB0aGUgbWFwXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0TWFwSW5mb1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0TWFwSW5mb1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtYXBJbmZvOiB7XG4gICAgLi4uc3RhdGUubWFwSW5mbyxcbiAgICAuLi5hY3Rpb24uaW5mb1xuICB9XG59KTtcbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHVwZGF0ZSBBbGwgbGF5ZXIgZG9tYWluIGFuZCBsYXllciBkYXRhIG9mIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREZWZhdWx0TGF5ZXJzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGRhdGFzZXRzOiBEYXRhc2V0c1xuKToge3N0YXRlOiBWaXNTdGF0ZTsgbmV3TGF5ZXJzOiBMYXllcltdfSB7XG4gIGNvbnN0IGVtcHR5OiBMYXllcltdID0gW107XG4gIGNvbnN0IGRlZmF1bHRMYXllcnMgPSBPYmplY3QudmFsdWVzKGRhdGFzZXRzKS5yZWR1Y2UoKGFjY3U6IExheWVyW10sIGRhdGFzZXQpID0+IHtcbiAgICBjb25zdCBmb3VuZExheWVycyA9IGZpbmREZWZhdWx0TGF5ZXIoZGF0YXNldCwgc3RhdGUubGF5ZXJDbGFzc2VzKTtcbiAgICByZXR1cm4gZm91bmRMYXllcnMgJiYgZm91bmRMYXllcnMubGVuZ3RoID8gYWNjdS5jb25jYXQoZm91bmRMYXllcnMpIDogYWNjdTtcbiAgfSwgZW1wdHkpO1xuXG4gIHJldHVybiB7XG4gICAgc3RhdGU6IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJzOiBbLi4uc3RhdGUubGF5ZXJzLCAuLi5kZWZhdWx0TGF5ZXJzXSxcbiAgICAgIGxheWVyT3JkZXI6IFtcbiAgICAgICAgLy8gcHV0IG5ldyBsYXllcnMgb24gdG9wIG9mIG9sZCBvbmVzIGluIHJldmVyc2VcbiAgICAgICAgLi4uZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMoZGVmYXVsdExheWVycyksXG4gICAgICAgIC4uLnN0YXRlLmxheWVyT3JkZXJcbiAgICAgIF1cbiAgICB9LFxuICAgIG5ld0xheWVyczogZGVmYXVsdExheWVyc1xuICB9O1xufVxuXG4vKipcbiAqIGhlbHBlciBmdW5jdGlvbiB0byBmaW5kIGRlZmF1bHQgdG9vbHRpcHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFzZXRcbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVmYXVsdFRvb2x0aXBzKHN0YXRlLCBkYXRhc2V0KSB7XG4gIGNvbnN0IHRvb2x0aXBGaWVsZHMgPSBmaW5kRmllbGRzVG9TaG93KHtcbiAgICAuLi5kYXRhc2V0LFxuICAgIG1heERlZmF1bHRUb29sdGlwczogc3RhdGUubWF4RGVmYXVsdFRvb2x0aXBzXG4gIH0pO1xuICBjb25zdCBtZXJnZWQgPSB7XG4gICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcC5jb25maWcuZmllbGRzVG9TaG93LFxuICAgIC4uLnRvb2x0aXBGaWVsZHNcbiAgfTtcblxuICByZXR1cm4gc2V0KFsnaW50ZXJhY3Rpb25Db25maWcnLCAndG9vbHRpcCcsICdjb25maWcnLCAnZmllbGRzVG9TaG93J10sIG1lcmdlZCwgc3RhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MoZmlsZSwgaW5kZXgpIHtcbiAgY29uc3QgZmlsZU5hbWUgPSBmaWxlLm5hbWUgfHwgYFVudGl0bGVkIEZpbGUgJHtpbmRleH1gO1xuICByZXR1cm4ge1xuICAgIFtmaWxlTmFtZV06IHtcbiAgICAgIC8vIHBlcmNlbnQgb2YgY3VycmVudCBmaWxlXG4gICAgICBwZXJjZW50OiAwLFxuICAgICAgbWVzc2FnZTogJycsXG4gICAgICBmaWxlTmFtZSxcbiAgICAgIGVycm9yOiBudWxsXG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtmaWxlTmFtZSwgcHJvZ3Jlc3N9KSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgcmV0dXJuIHBpY2tfKCdmaWxlTG9hZGluZ1Byb2dyZXNzJykocGlja18oZmlsZU5hbWUpKG1lcmdlXyhwcm9ncmVzcykpKShzdGF0ZSk7XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgbGF5ZXIgZG9tYWlucyBmb3IgYW4gYXJyYXkgb2YgZGF0YXNldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YTxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgZGF0YUlkOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgdXBkYXRlZEZpbHRlcj86IEZpbHRlclxuKTogUyB7XG4gIGNvbnN0IGRhdGFJZHMgPSB0eXBlb2YgZGF0YUlkID09PSAnc3RyaW5nJyA/IFtkYXRhSWRdIDogZGF0YUlkO1xuICBjb25zdCBuZXdMYXllcnM6IExheWVyW10gPSBbXTtcbiAgY29uc3QgbmV3TGF5ZXJEYXRhOiBhbnlbXSA9IFtdO1xuXG4gIHN0YXRlLmxheWVycy5mb3JFYWNoKChvbGRMYXllciwgaSkgPT4ge1xuICAgIGlmIChvbGRMYXllci5jb25maWcuZGF0YUlkICYmIGRhdGFJZHMuaW5jbHVkZXMob2xkTGF5ZXIuY29uZmlnLmRhdGFJZCkpIHtcbiAgICAgIC8vIE5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgbGF5ZXIgZG9tYWluIGlmIGZpbHRlciBoYXMgZml4ZWQgZG9tYWluXG4gICAgICBjb25zdCBuZXdMYXllciA9XG4gICAgICAgIHVwZGF0ZWRGaWx0ZXIgJiYgdXBkYXRlZEZpbHRlci5maXhlZERvbWFpblxuICAgICAgICAgID8gb2xkTGF5ZXJcbiAgICAgICAgICA6IG9sZExheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzLCB1cGRhdGVkRmlsdGVyKTtcblxuICAgICAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgc3RhdGUubGF5ZXJEYXRhW2ldKTtcblxuICAgICAgbmV3TGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgbmV3TGF5ZXJEYXRhLnB1c2gobGF5ZXJEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5ZXJzLnB1c2gob2xkTGF5ZXIpO1xuICAgICAgbmV3TGF5ZXJEYXRhLnB1c2goc3RhdGUubGF5ZXJEYXRhW2ldKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogbmV3TGF5ZXJzLFxuICAgIGxheWVyRGF0YTogbmV3TGF5ZXJEYXRhXG4gIH07XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQW5pbWF0aW9uRG9tYWluPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMpOiBTIHtcbiAgLy8gbWVyZ2UgYWxsIGFuaW1hdGFibGUgbGF5ZXIgZG9tYWluIGFuZCB1cGRhdGUgZ2xvYmFsIGNvbmZpZ1xuICBjb25zdCBhbmltYXRhYmxlTGF5ZXJzID0gZ2V0QW5pbWF0YWJsZVZpc2libGVMYXllcnMoc3RhdGUubGF5ZXJzKTtcblxuICBpZiAoIWFuaW1hdGFibGVMYXllcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgZG9tYWluOiBudWxsLFxuICAgICAgICBpc0FuaW1hdGluZzogZmFsc2UsXG4gICAgICAgIHRpbWVTdGVwczogbnVsbCxcbiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6IG51bGxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbGF5ZXJEb21haW5zID0gYW5pbWF0YWJsZUxheWVycy5tYXAobCA9PiBsLmNvbmZpZy5hbmltYXRpb24uZG9tYWluIHx8IFtdKTtcbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCBtZXJnZWREb21haW4gPSBtZXJnZVRpbWVEb21haW5zKGxheWVyRG9tYWlucyk7XG4gIGNvbnN0IGRlZmF1bHRUaW1lRm9ybWF0ID0gZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyKG1lcmdlZERvbWFpbik7XG5cbiAgLy8gbWVyZ2UgdGltZVN0ZXBzXG4gIGxldCBtZXJnZWRUaW1lU3RlcHM6IG51bWJlcltdIHwgbnVsbCA9IHVuaXE8bnVtYmVyPihcbiAgICBhbmltYXRhYmxlTGF5ZXJzLnJlZHVjZSgoYWNjdSwgbGF5ZXIpID0+IHtcbiAgICAgIGFjY3UucHVzaCguLi4obGF5ZXIuY29uZmlnLmFuaW1hdGlvbi50aW1lU3RlcHMgfHwgW10pKTtcbiAgICAgIHJldHVybiBhY2N1O1xuICAgIH0sIFtdKVxuICApLnNvcnQoKTtcblxuICBtZXJnZWRUaW1lU3RlcHMgPSBtZXJnZWRUaW1lU3RlcHMubGVuZ3RoID8gbWVyZ2VkVGltZVN0ZXBzIDogbnVsbDtcblxuICAvLyBUT0RPOiBiZXR0ZXIgaGFuZGxpbmcgb2YgZHVyYXRpb24gY2FsY3VsYXRpb25cbiAgY29uc3QgZHVyYXRpb24gPSBtZXJnZWRUaW1lU3RlcHNcbiAgICA/IChCQVNFX1NQRUVEICogKDEwMDAgLyBGUFMpKSAvIG1lcmdlZFRpbWVTdGVwcy5sZW5ndGggLyAoc3RhdGUuYW5pbWF0aW9uQ29uZmlnLnNwZWVkIHx8IDEpXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIGRvbWFpbjogbWVyZ2VkRG9tYWluLFxuICAgICAgZGVmYXVsdFRpbWVGb3JtYXQsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIHRpbWVTdGVwczogbWVyZ2VkVGltZVN0ZXBzXG4gICAgfVxuICB9O1xuXG4gIC8vIHJlc2V0IGN1cnJlbnRUaW1lIGJhc2VkIG9uIG5ldyBkb21haW5cbiAgY29uc3Qgc3luY2VkRmlsdGVyID0gc3RhdGUuZmlsdGVycz8uZmluZChmID0+IChmIGFzIFRpbWVSYW5nZUZpbHRlcikuc3luY2VkV2l0aExheWVyVGltZWxpbmUpIGFzXG4gICAgfCBUaW1lUmFuZ2VGaWx0ZXJcbiAgICB8IHVuZGVmaW5lZDtcblxuICAvLyBpZiBzeW5jZWQgZmlsdGVyIGV4aXN0IHdlZSBuZWVkIHRvIG1lcmdlIGFuaW1hdGlvbkNvbmZpZyBhbmQgZmlsdGVyIGRvbWFpbnNcbiAgLy8gYW5kIHZhbGlkYXRlIHRoZSBjdXJyZW50IHRpbWUgYWdhaW5zdCB0aGUgbmV3IG1lcmdlZCBkb21haW5cbiAgY29uc3QgbmV3QW5pbWF0aW9uRG9tYWluID0gc3luY2VkRmlsdGVyXG4gICAgPyBtZXJnZVRpbWVEb21haW5zKFttZXJnZWREb21haW4sIHN5bmNlZEZpbHRlci5kb21haW5dKVxuICAgIDogbWVyZ2VkRG9tYWluO1xuICBjb25zdCBjdXJyZW50VGltZSA9IGlzSW5SYW5nZShzdGF0ZS5hbmltYXRpb25Db25maWcuY3VycmVudFRpbWUsIG5ld0FuaW1hdGlvbkRvbWFpbilcbiAgICA/IHN0YXRlLmFuaW1hdGlvbkNvbmZpZy5jdXJyZW50VGltZVxuICAgIDogbmV3QW5pbWF0aW9uRG9tYWluWzBdO1xuXG4gIGlmIChjdXJyZW50VGltZSAhPT0gc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lKSB7XG4gICAgLy8gaWYgY3VycmVudFRpbWUgY2hhbmdlZCwgbmVlZCB0byBjYWxsIGFuaW1hdGlvblRpbWVVcGRhdGVyIHRvIHJlIGNhbGwgZm9ybWF0TGF5ZXJEYXRhXG4gICAgcmV0dXJuIHNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXIobmV4dFN0YXRlLCB7dmFsdWU6IGN1cnJlbnRUaW1lfSk7XG4gIH1cblxuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIHRoZSBlZGl0b3JcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFZGl0b3JNb2RlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7bW9kZX06IFZpc1N0YXRlQWN0aW9ucy5TZXRFZGl0b3JNb2RlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGVkaXRvcjoge1xuICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICBtb2RlLFxuICAgIHNlbGVjdGVkRmVhdHVyZTogbnVsbFxuICB9XG59KTtcblxuLy8gY29uc3QgZmVhdHVyZVRvRmlsdGVyVmFsdWUgPSAoZmVhdHVyZSkgPT4gKHsuLi5mZWF0dXJlLCBpZDogZmVhdHVyZS5pZH0pO1xuLyoqXG4gKiBVcGRhdGUgZWRpdG9yIGZlYXR1cmVzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmVhdHVyZXNVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtmZWF0dXJlcyA9IFtdfTogVmlzU3RhdGVBY3Rpb25zLlNldEZlYXR1cmVzVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBsYXN0RmVhdHVyZSA9IGZlYXR1cmVzLmxlbmd0aCAmJiBmZWF0dXJlc1tmZWF0dXJlcy5sZW5ndGggLSAxXTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIC8vIG9ubHkgc2F2ZSBub25lIGZpbHRlciBmZWF0dXJlcyB0byBlZGl0b3JcbiAgICAgIGZlYXR1cmVzOiBmZWF0dXJlcy5maWx0ZXIoZiA9PiAhZ2V0RmlsdGVySWRJbkZlYXR1cmUoZikpLFxuICAgICAgbW9kZTogbGFzdEZlYXR1cmUgJiYgbGFzdEZlYXR1cmUucHJvcGVydGllcy5pc0Nsb3NlZCA/IEVESVRPUl9NT0RFUy5FRElUIDogc3RhdGUuZWRpdG9yLm1vZGVcbiAgICB9XG4gIH07XG5cbiAgLy8gUmV0cmlldmUgZXhpc3RpbmcgZmVhdHVyZVxuICBjb25zdCB7c2VsZWN0ZWRGZWF0dXJlfSA9IHN0YXRlLmVkaXRvcjtcblxuICAvLyBJZiBubyBmZWF0dXJlIGlzIHNlbGVjdGVkIHdlIGNhbiBzaW1wbHkgcmV0dXJuIHNpbmNlIG5vIG9wZXJhdGlvbnNcbiAgaWYgKCFzZWxlY3RlZEZlYXR1cmUpIHtcbiAgICByZXR1cm4gbmV3U3RhdGU7XG4gIH1cblxuICAvLyBUT0RPOiBjaGVjayBpZiB0aGUgZmVhdHVyZSBoYXMgY2hhbmdlZFxuICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXMuZmluZChmID0+IGYuaWQgPT09IHNlbGVjdGVkRmVhdHVyZS5pZCk7XG5cbiAgLy8gaWYgZmVhdHVyZSBpcyBwYXJ0IG9mIGEgZmlsdGVyXG4gIGNvbnN0IGZpbHRlcklkID0gZmVhdHVyZSAmJiBnZXRGaWx0ZXJJZEluRmVhdHVyZShmZWF0dXJlKTtcbiAgaWYgKGZpbHRlcklkICYmIGZlYXR1cmUpIHtcbiAgICAvLyBhZGQgYmJveCBmb3IgcG9seWdvbiBmaWx0ZXIgdG8gc3BlZWQgdXAgZmlsdGVyaW5nXG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcykgZmVhdHVyZS5wcm9wZXJ0aWVzLmJib3ggPSBiYm94KGZlYXR1cmUpO1xuICAgIGNvbnN0IGZlYXR1cmVWYWx1ZSA9IGZlYXR1cmVUb0ZpbHRlclZhbHVlKGZlYXR1cmUsIGZpbHRlcklkKTtcbiAgICBjb25zdCBmaWx0ZXJJZHggPSBzdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmaWwgPT4gZmlsLmlkID09PSBmaWx0ZXJJZCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICBpZHg6IGZpbHRlcklkeCxcbiAgICAgIHByb3A6ICd2YWx1ZScsXG4gICAgICB2YWx1ZTogZmVhdHVyZVZhbHVlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3U3RhdGU7XG59XG5cbi8qKlxuICogU2V0IHRoZSBjdXJyZW50IHNlbGVjdGVkIGZlYXR1cmVcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNlbGVjdGVkRmVhdHVyZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2ZlYXR1cmUsIHNlbGVjdGlvbkNvbnRleHR9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0U2VsZWN0ZWRGZWF0dXJlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBhZGQgYmJveCBmb3IgcG9seWdvbiBmaWx0ZXIgdG8gc3BlZWQgdXAgZmlsdGVyaW5nXG4gIGlmIChmZWF0dXJlICYmIGZlYXR1cmUucHJvcGVydGllcykgZmVhdHVyZS5wcm9wZXJ0aWVzLmJib3ggPSBiYm94KGZlYXR1cmUpO1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRvcjoge1xuICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBmZWF0dXJlLFxuICAgICAgc2VsZWN0aW9uQ29udGV4dFxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogRGVsZXRlIGV4aXN0aW5nIGZlYXR1cmUgZnJvbSBmaWx0ZXJzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlRmVhdHVyZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2ZlYXR1cmV9OiBWaXNTdGF0ZUFjdGlvbnMuRGVsZXRlRmVhdHVyZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgaWYgKCFmZWF0dXJlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiB7XG4gICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICBzZWxlY3RlZEZlYXR1cmU6IG51bGxcbiAgICB9XG4gIH07XG5cbiAgaWYgKGdldEZpbHRlcklkSW5GZWF0dXJlKGZlYXR1cmUpKSB7XG4gICAgY29uc3QgZmlsdGVySWR4ID0gbmV3U3RhdGUuZmlsdGVycy5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBnZXRGaWx0ZXJJZEluRmVhdHVyZShmZWF0dXJlKSk7XG5cbiAgICByZXR1cm4gZmlsdGVySWR4ID4gLTEgPyByZW1vdmVGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7aWR4OiBmaWx0ZXJJZHh9KSA6IG5ld1N0YXRlO1xuICB9XG5cbiAgLy8gbW9kaWZ5IGVkaXRvciBvYmplY3RcbiAgY29uc3QgbmV3RWRpdG9yID0ge1xuICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICBmZWF0dXJlczogc3RhdGUuZWRpdG9yLmZlYXR1cmVzLmZpbHRlcihmID0+IGYuaWQgIT09IGZlYXR1cmUuaWQpLFxuICAgIHNlbGVjdGVkRmVhdHVyZTogbnVsbFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiBuZXdFZGl0b3JcbiAgfTtcbn1cblxuLyoqXG4gKiBUb2dnbGUgZmVhdHVyZSBhcyBsYXllciBmaWx0ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQb2x5Z29uRmlsdGVyTGF5ZXJVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHBheWxvYWQ6IFZpc1N0YXRlQWN0aW9ucy5TZXRQb2x5Z29uRmlsdGVyTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtsYXllciwgZmVhdHVyZX0gPSBwYXlsb2FkO1xuICBjb25zdCBmaWx0ZXJJZCA9IGdldEZpbHRlcklkSW5GZWF0dXJlKGZlYXR1cmUpO1xuXG4gIC8vIGxldCBuZXdGaWx0ZXIgPSBudWxsO1xuICBsZXQgZmlsdGVySWR4O1xuICBsZXQgbmV3TGF5ZXJJZCA9IFtsYXllci5pZF07XG4gIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuICAvLyBJZiBwb2x5Z29uIGZpbHRlciBhbHJlYWR5IGV4aXN0cywgd2UgbmVlZCB0byBmaW5kIG91dCBpZiB0aGUgY3VycmVudCBsYXllciBpcyBhbHJlYWR5IGluY2x1ZGVkXG4gIGlmIChmaWx0ZXJJZCkge1xuICAgIGZpbHRlcklkeCA9IHN0YXRlLmZpbHRlcnMuZmluZEluZGV4KGYgPT4gZi5pZCA9PT0gZmlsdGVySWQpO1xuXG4gICAgaWYgKCFzdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF0pIHtcbiAgICAgIC8vIHdoYXQgaWYgZmlsdGVyIGRvZXNuJ3QgZXhpc3Q/Li4uIG5vdCBwb3NzaWJsZS5cbiAgICAgIC8vIGJlY2F1c2UgZmVhdHVyZXMgaW4gdGhlIGVkaXRvciBpcyBwYXNzZWQgaW4gZnJvbSBmaWx0ZXJzIGFuZCBlZGl0b3JzLlxuICAgICAgLy8gYnV0IHdlIHdpbGwgbW92ZSB0aGlzIGZlYXR1cmUgYmFjayB0byBlZGl0b3IganVzdCBpbiBjYXNlXG4gICAgICBjb25zdCBub25lRmlsdGVyRmVhdHVyZSA9IHtcbiAgICAgICAgLi4uZmVhdHVyZSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIC4uLmZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICBmaWx0ZXJJZDogbnVsbFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZWRpdG9yOiB7XG4gICAgICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgICAgIGZlYXR1cmVzOiBbLi4uc3RhdGUuZWRpdG9yLmZlYXR1cmVzLCBub25lRmlsdGVyRmVhdHVyZV0sXG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBub25lRmlsdGVyRmVhdHVyZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF07XG4gICAgY29uc3Qge2xheWVySWQgPSBbXX0gPSBmaWx0ZXI7XG4gICAgY29uc3QgaXNMYXllckluY2x1ZGVkID0gbGF5ZXJJZC5pbmNsdWRlcyhsYXllci5pZCk7XG5cbiAgICBuZXdMYXllcklkID0gaXNMYXllckluY2x1ZGVkXG4gICAgICA/IC8vIGlmIGxheWVyIGlzIGluY2x1ZGVkLCByZW1vdmUgaXRcbiAgICAgICAgbGF5ZXJJZC5maWx0ZXIobCA9PiBsICE9PSBsYXllci5pZClcbiAgICAgIDogWy4uLmxheWVySWQsIGxheWVyLmlkXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiB3ZSBoYXZlbid0IGNyZWF0ZSB0aGUgcG9seWdvbiBmaWx0ZXIsIGNyZWF0ZSBpdFxuICAgIGNvbnN0IG5ld0ZpbHRlciA9IGdlbmVyYXRlUG9seWdvbkZpbHRlcihbXSwgZmVhdHVyZSk7XG4gICAgZmlsdGVySWR4ID0gc3RhdGUuZmlsdGVycy5sZW5ndGg7XG5cbiAgICAvLyBhZGQgZmVhdHVyZSwgcmVtb3ZlIGZlYXR1cmUgZnJvbSBlaWR0b3JcbiAgICBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZmlsdGVyczogWy4uLnN0YXRlLmZpbHRlcnMsIG5ld0ZpbHRlcl0sXG4gICAgICBlZGl0b3I6IHtcbiAgICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgICBmZWF0dXJlczogc3RhdGUuZWRpdG9yLmZlYXR1cmVzLmZpbHRlcihmID0+IGYuaWQgIT09IGZlYXR1cmUuaWQpLFxuICAgICAgICBzZWxlY3RlZEZlYXR1cmU6IG5ld0ZpbHRlci52YWx1ZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc2V0RmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIGlkeDogZmlsdGVySWR4LFxuICAgIHByb3A6ICdsYXllcklkJyxcbiAgICB2YWx1ZTogbmV3TGF5ZXJJZFxuICB9KTtcbn1cblxuLyoqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydFRhYmxlQ29sdW1uVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkLCBjb2x1bW4sIG1vZGV9OiBWaXNTdGF0ZUFjdGlvbnMuU29ydFRhYmxlQ29sdW1uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXTtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxldCBzb3J0TW9kZSA9IG1vZGU7XG4gIGlmICghc29ydE1vZGUpIHtcbiAgICBjb25zdCBjdXJyZW50TW9kZSA9IGdldChkYXRhc2V0LCBbJ3NvcnRDb2x1bW4nLCBjb2x1bW5dKTtcbiAgICAvLyBAdHMtaWdub3JlIC0gc2hvdWxkIGJlIGZpeGFibGUgaW4gYSBUUyBmaWxlXG4gICAgc29ydE1vZGUgPSBjdXJyZW50TW9kZVxuICAgICAgPyBPYmplY3Qua2V5cyhTT1JUX09SREVSKS5maW5kKG0gPT4gbSAhPT0gY3VycmVudE1vZGUpXG4gICAgICA6IFNPUlRfT1JERVIuQVNDRU5ESU5HO1xuICB9XG5cbiAgY29uc3Qgc29ydGVkID0gc29ydERhdGFzZXRCeUNvbHVtbihkYXRhc2V0LCBjb2x1bW4sIHNvcnRNb2RlKTtcbiAgcmV0dXJuIHNldChbJ2RhdGFzZXRzJywgZGF0YUlkXSwgc29ydGVkLCBzdGF0ZSk7XG59XG5cbi8qKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpblRhYmxlQ29sdW1uVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkLCBjb2x1bW59OiBWaXNTdGF0ZUFjdGlvbnMuUGluVGFibGVDb2x1bW5VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3QgbmV3RGF0YXNldCA9IHBpblRhYmxlQ29sdW1ucyhkYXRhc2V0LCBjb2x1bW4pO1xuXG4gIHJldHVybiBzZXQoWydkYXRhc2V0cycsIGRhdGFJZF0sIG5ld0RhdGFzZXQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBDb3B5IGNvbHVtbiBjb250ZW50IGFzIHN0cmluZ3NcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5VGFibGVDb2x1bW5VcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtkYXRhSWQsIGNvbHVtbn06IFZpc1N0YXRlQWN0aW9ucy5Db3B5VGFibGVDb2x1bW5VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3QgZmllbGRJZHggPSBkYXRhc2V0LmZpZWxkcy5maW5kSW5kZXgoZiA9PiBmLm5hbWUgPT09IGNvbHVtbik7XG4gIGlmIChmaWVsZElkeCA8IDApIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qge3R5cGV9ID0gZGF0YXNldC5maWVsZHNbZmllbGRJZHhdO1xuICBjb25zdCB0ZXh0ID0gZGF0YXNldC5kYXRhQ29udGFpbmVyXG4gICAgLm1hcChyb3cgPT4gcGFyc2VGaWVsZFZhbHVlKHJvdy52YWx1ZUF0KGZpZWxkSWR4KSwgdHlwZSksIHRydWUpXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIGNvcHkodGV4dCk7XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFNldCBkaXNwbGF5IGZvcm1hdCBmcm9tIGNvbHVtbnMgZnJvbSB1c2VyIHNlbGVjdGlvblxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldENvbHVtbkRpc3BsYXlGb3JtYXRVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtkYXRhSWQsIGZvcm1hdHN9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0Q29sdW1uRGlzcGxheUZvcm1hdFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsZXQgbmV3RmllbGRzID0gZGF0YXNldC5maWVsZHM7XG4gIE9iamVjdC5rZXlzKGZvcm1hdHMpLmZvckVhY2goY29sdW1uID0+IHtcbiAgICBjb25zdCBmaWVsZElkeCA9IGRhdGFzZXQuZmllbGRzLmZpbmRJbmRleChmID0+IGYubmFtZSA9PT0gY29sdW1uKTtcbiAgICBpZiAoZmllbGRJZHggPj0gMCkge1xuICAgICAgY29uc3QgZGlzcGxheUZvcm1hdCA9IGZvcm1hdHNbY29sdW1uXTtcbiAgICAgIGNvbnN0IGZpZWxkID0gbmV3RmllbGRzW2ZpZWxkSWR4XTtcbiAgICAgIG5ld0ZpZWxkcyA9IHN3YXBfKG1lcmdlXyh7ZGlzcGxheUZvcm1hdH0pKGZpZWxkKSBhcyB7aWQ6IHN0cmluZ30pKFxuICAgICAgICBuZXdGaWVsZHMgYXMge2lkOiBzdHJpbmd9W11cbiAgICAgICkgYXMgRmllbGRbXTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG5ld0RhdGFzZXQgPSBjb3B5VGFibGVBbmRVcGRhdGUoZGF0YXNldCwge2ZpZWxkczogbmV3RmllbGRzIGFzIEZpZWxkW119KTtcbiAgcmV0dXJuIHBpY2tfKCdkYXRhc2V0cycpKG1lcmdlXyh7W2RhdGFJZF06IG5ld0RhdGFzZXR9KSkoc3RhdGUpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBlZGl0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUVkaXRvclZpc2liaWxpdHlVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlRWRpdG9yVmlzaWJpbGl0eVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIHZpc2libGU6ICFzdGF0ZS5lZGl0b3IudmlzaWJsZVxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZHgsIGNvbmZpZ306IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IG9sZEZpbHRlciA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcbiAgaWYgKCFvbGRGaWx0ZXIpIHtcbiAgICBDb25zb2xlLmVycm9yKGBmaWx0ZXJzLiR7aWR4fSBpcyB1bmRlZmluZWRgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKG9sZEZpbHRlci50eXBlICE9PSBGSUxURVJfVFlQRVMudGltZVJhbmdlKSB7XG4gICAgQ29uc29sZS5lcnJvcihcbiAgICAgIGBzZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnIGNhbiBvbmx5IGJlIGNhbGxlZCB0byB1cGRhdGUgYSB0aW1lIGZpbHRlci4gY2hlY2sgZmlsdGVyLnR5cGUgPT09ICd0aW1lUmFuZ2UnYFxuICAgICk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlcyA9IGNoZWNrVGltZUNvbmZpZ0FyZ3MoY29uZmlnKTtcblxuICByZXR1cm4gcGlja18oJ2ZpbHRlcnMnKShzd2FwXyhtZXJnZV8odXBkYXRlcykob2xkRmlsdGVyKSkpKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tUaW1lQ29uZmlnQXJncyhjb25maWcpIHtcbiAgY29uc3QgYWxsb3dlZCA9IFsndGltZUZvcm1hdCcsICd0aW1lem9uZSddO1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29uZmlnKS5yZWR1Y2UoKGFjY3UsIHByb3ApID0+IHtcbiAgICBpZiAoIWFsbG93ZWQuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWcgdGFrZXMgdGltZUZvcm1hdCBhbmQvb3IgdGltZXpvbmUgYXMgb3B0aW9ucywgZm91bmQgJHtwcm9wfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9XG5cbiAgICAvLyBoZXJlIHdlIGFyZSBOT1QgY2hlY2tpbmcgaWYgdGltZXpvbmUgb3IgdGltZUZvcm1hdCBpbnB1dCBpcyB2YWxpZFxuICAgIGFjY3VbcHJvcF0gPSBjb25maWdbcHJvcF07XG4gICAgcmV0dXJuIGFjY3U7XG4gIH0sIHt9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZWRpdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtjb25maWd9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IHVwZGF0ZXMgPSBjaGVja1RpbWVDb25maWdBcmdzKGNvbmZpZyk7XG4gIHJldHVybiBwaWNrXygnYW5pbWF0aW9uQ29uZmlnJykobWVyZ2VfKHVwZGF0ZXMpKShzdGF0ZSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGVkaXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJGaWx0ZXJlZEl0ZW1zQ2hhbmdlVXBkYXRlcjxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJGaWx0ZXJlZEl0ZW1zQ2hhbmdlQWN0aW9uXG4pOiBTIHtcbiAgY29uc3Qge2V2ZW50LCBsYXllcn0gPSBhY3Rpb247XG4gIGNvbnN0IHtpZDogZGVja2dsTGF5ZXJJZCwgY291bnR9ID0gZXZlbnQ7XG4gIGlmICghbGF5ZXIpIHtcbiAgICBDb25zb2xlLndhcm4oYGxheWVyRmlsdGVyZWRJdGVtcyBsYXllciBkb2VzbnQgZXhpc3RzYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGlmIChsYXllci5maWx0ZXJlZEl0ZW1Db3VudD8uW2RlY2tnbExheWVySWRdID09PSBjb3VudCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGxheWVyLmZpbHRlcmVkSXRlbUNvdW50ID0ge1xuICAgIC4uLmxheWVyLmZpbHRlcmVkSXRlbUNvdW50LFxuICAgIFtkZWNrZ2xMYXllcklkXTogY291bnRcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogc3dhcF8obGF5ZXIpKHN0YXRlLmxheWVycylcbiAgfTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG5leHBvcnQgZnVuY3Rpb24gc3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZVVwZGF0ZXI8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlN5bmNUaW1lRmlsdGVyV2l0aExheWVyVGltZWxpbmVBY3Rpb25cbik6IFMge1xuICBjb25zdCB7aWR4OiBmaWx0ZXJJZHgsIGVuYWJsZSA9IGZhbHNlfSA9IGFjdGlvbjtcblxuICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF0gYXMgVGltZVJhbmdlRmlsdGVyO1xuXG4gIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuICBsZXQgbmV3RmlsdGVyID0gZmlsdGVyO1xuXG4gIC8vIGlmIHdlIGVuYWJsZSBzeW5jIHdlIGFyZSBnb2luZyB0byBtZXJnZSBmaWx0ZXIgYW5kIGFuaW1hdGlvbkNvbmZpZyBkb21haW5zIGFuZCBzdG9yZSBpbnRvIGZpbHRlci5kb21haW5cbiAgaWYgKGVuYWJsZSkge1xuICAgIGNvbnN0IGFuaW1hdGFibGVMYXllcnMgPSBnZXRBbmltYXRhYmxlVmlzaWJsZUxheWVycyhuZXdTdGF0ZS5sYXllcnMpO1xuICAgIC8vIGlmIG5vIGFuaW1hdGFibGVMYXllcnMgYXJlIHByZXNlbnQgd2Ugc2ltcGx5IHJldHVyblxuICAgIGlmICghYW5pbWF0YWJsZUxheWVycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzID0gZ2V0SW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycyhhbmltYXRhYmxlTGF5ZXJzKTtcbiAgICBjb25zdCBoYXNJbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXIgPSBCb29sZWFuKGludGVydmFsQmFzZWRBbmltYXRpb25MYXllcnMubGVuZ3RoKTtcblxuICAgIGNvbnN0IG5ld0ZpbHRlckRvbWFpbiA9IG1lcmdlVGltZURvbWFpbnMoW2ZpbHRlci5kb21haW4sIG5ld1N0YXRlLmFuaW1hdGlvbkNvbmZpZy5kb21haW5dKTtcblxuICAgIC8vIHdlIG9ubHkgdXBkYXRlIGFuaW1hdGlvbldpbmRvdyBpZiB3ZSBoYXZlIGludGVydmFsIGJhc2VkIGFuaW1hdGlvbiBsYXllcnMgd2l0aCBkZWZpbmVkIGludGVydmFscyBhbmQgdGhlIGN1cnJlbnQgZmlsdGVyIGFuaW1hdGlvbiB3aW5kb3cgaXMgbm90IGludGVydmFsXG4gICAgaWYgKGhhc0ludGVydmFsQmFzZWRBbmltYXRpb25MYXllcikge1xuICAgICAgaWYgKGZpbHRlci5hbmltYXRpb25XaW5kb3cgIT09IEFOSU1BVElPTl9XSU5ET1cuaW50ZXJ2YWwpIHtcbiAgICAgICAgbmV3U3RhdGUgPSBzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICAgICAgaWQ6IGZpbHRlci5pZCxcbiAgICAgICAgICBhbmltYXRpb25XaW5kb3c6IEFOSU1BVElPTl9XSU5ET1cuaW50ZXJ2YWxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG5ld0ZpbHRlciA9IG5ld1N0YXRlLmZpbHRlcnNbZmlsdGVySWR4XSBhcyBUaW1lUmFuZ2VGaWx0ZXI7XG5cbiAgICAgIC8vIGFkanVzdCB0aW1lIGZpbHRlciBpbnRlcnZhbFxuICAgICAgbmV3RmlsdGVyID0gYWRqdXN0VGltZUZpbHRlckludGVydmFsKG5ld1N0YXRlLCBuZXdGaWx0ZXIpO1xuXG4gICAgICAvLyByZXBsYWNlIGZpbHRlciBpbiBzdGF0ZSB3aXRoIG5ld0ZpbHRlclxuICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgICBmaWx0ZXJzOiBzd2FwXzxGaWx0ZXI+KG5ld0ZpbHRlcikobmV3U3RhdGUuZmlsdGVycylcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbmV3RmlsdGVyID0gbmV3U3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdIGFzIFRpbWVSYW5nZUZpbHRlcjtcblxuICAgIC8vIGFkanVzdCB2YWx1ZSBiYXNlZCBvbiBuZXcgZG9tYWluXG4gICAgY29uc3QgbmV3RmlsdGVyVmFsdWUgPSBhZGp1c3RWYWx1ZVRvRmlsdGVyRG9tYWluKFxuICAgICAgbmV3RmlsdGVyLmFuaW1hdGlvbldpbmRvdyA9PT0gQU5JTUFUSU9OX1dJTkRPVy5pbnRlcnZhbFxuICAgICAgICA/IFtuZXdGaWx0ZXJEb21haW5bMF0sIG5ld0ZpbHRlckRvbWFpblswXV1cbiAgICAgICAgOiBuZXdGaWx0ZXJEb21haW4sXG4gICAgICB7Li4ubmV3RmlsdGVyLCBkb21haW46IG5ld0ZpbHRlckRvbWFpbn1cbiAgICApO1xuXG4gICAgbmV3U3RhdGUgPSBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICBpZHg6IGZpbHRlcklkeCxcbiAgICAgIHByb3A6ICd2YWx1ZScsXG4gICAgICB2YWx1ZTogbmV3RmlsdGVyVmFsdWVcbiAgICB9KTtcblxuICAgIG5ld0ZpbHRlciA9IHtcbiAgICAgIC4uLihuZXdTdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF0gYXMgVGltZVJhbmdlRmlsdGVyKSxcbiAgICAgIHN5bmNlZFdpdGhMYXllclRpbWVsaW5lOiB0cnVlXG4gICAgfTtcblxuICAgIC8vIHJlcGxhY2UgZmlsdGVyIGluIHN0YXRlIHdpdGggbmV3RmlsdGVyXG4gICAgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgIGZpbHRlcnM6IHN3YXBfPEZpbHRlcj4obmV3RmlsdGVyKShuZXdTdGF0ZS5maWx0ZXJzKVxuICAgIH07XG5cbiAgICBuZXdTdGF0ZSA9IHNldFRpbWVGaWx0ZXJUaW1lbGluZU1vZGVVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICBpZDogbmV3RmlsdGVyLmlkLFxuICAgICAgbW9kZTogZ2V0U3luY0FuaW1hdGlvbk1vZGUobmV3RmlsdGVyKVxuICAgIH0pO1xuXG4gICAgbmV3RmlsdGVyID0gbmV3U3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdIGFzIFRpbWVSYW5nZUZpbHRlcjtcblxuICAgIC8vIHNldCB0aGUgYW5pbWF0aW9uIGNvbmZpZyB2YWx1ZSB0byBtYXRjaCBmaWx0ZXIgdmFsdWVcbiAgICByZXR1cm4gc2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgICAgdmFsdWU6IG5ld0ZpbHRlci52YWx1ZVtuZXdGaWx0ZXIuc3luY1RpbWVsaW5lTW9kZV1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIHNldCBkb21haW4gYW5kIHN0ZXBcbiAgbmV3RmlsdGVyID0ge1xuICAgIC4uLmZpbHRlcixcbiAgICBzeW5jZWRXaXRoTGF5ZXJUaW1lbGluZTogZmFsc2VcbiAgfTtcblxuICAvLyByZXBsYWNlIGZpbHRlciBpbiBzdGF0ZSB3aXRoIG5ld0ZpbHRlclxuICBuZXdTdGF0ZSA9IHtcbiAgICAuLi5uZXdTdGF0ZSxcbiAgICBmaWx0ZXJzOiBzd2FwXzxGaWx0ZXI+KG5ld0ZpbHRlcikobmV3U3RhdGUuZmlsdGVycylcbiAgfTtcblxuICAvLyByZXNldCBzeW5jIHRpbWVsaW5lIG1vZGVcbiAgbmV3U3RhdGUgPSBzZXRUaW1lRmlsdGVyVGltZWxpbmVNb2RlVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIGlkOiBuZXdGaWx0ZXIuaWQsXG4gICAgbW9kZTogU1lOQ19USU1FTElORV9NT0RFUy5lbmRcbiAgfSk7XG5cbiAgbmV3RmlsdGVyID0gbmV3U3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdIGFzIFRpbWVSYW5nZUZpbHRlcjtcblxuICAvLyByZXNldCBmaWx0ZXIgdmFsdWVcbiAgY29uc3QgbmV3RmlsdGVyVmFsdWUgPSBhZGp1c3RWYWx1ZVRvRmlsdGVyRG9tYWluKG5ld0ZpbHRlci5kb21haW4sIG5ld0ZpbHRlcik7XG5cbiAgbmV3U3RhdGUgPSBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgaWR4OiBmaWx0ZXJJZHgsXG4gICAgcHJvcDogJ3ZhbHVlJyxcbiAgICB2YWx1ZTogbmV3RmlsdGVyVmFsdWVcbiAgfSk7XG5cbiAgbmV3U3RhdGUgPSBzZXRUaW1lRmlsdGVyVGltZWxpbmVNb2RlVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIGlkOiBuZXdGaWx0ZXIuaWQsXG4gICAgbW9kZTogZ2V0U3luY0FuaW1hdGlvbk1vZGUobmV3RmlsdGVyKVxuICB9KTtcblxuICAvLyByZXNldCBhbmltYXRpb24gY29uZmlnIGN1cnJlbnQgdGltZSB0b1xuICByZXR1cm4gc2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIHZhbHVlOiBuZXdTdGF0ZS5hbmltYXRpb25Db25maWcuZG9tYWluPy5bMF0gPz8gbnVsbFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFRpbWVGaWx0ZXJUaW1lbGluZU1vZGVVcGRhdGVyPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5zZXRUaW1lRmlsdGVyU3luY1RpbWVsaW5lTW9kZUFjdGlvblxuKSB7XG4gIGNvbnN0IHtpZDogZmlsdGVySWQsIG1vZGU6IHN5bmNUaW1lbGluZU1vZGV9ID0gYWN0aW9uO1xuXG4gIGNvbnN0IGZpbHRlcklkeCA9IHN0YXRlLmZpbHRlcnMuZmluZEluZGV4KGYgPT4gZi5pZCA9PT0gZmlsdGVySWQpO1xuICBpZiAoZmlsdGVySWR4ID09PSAtMSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlciA9IHN0YXRlLmZpbHRlcnNbZmlsdGVySWR4XSBhcyBUaW1lUmFuZ2VGaWx0ZXI7XG5cbiAgaWYgKCF2YWxpZGF0ZVN5bmNBbmltYXRpb25Nb2RlKGZpbHRlciwgc3luY1RpbWVsaW5lTW9kZSkpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXdGaWx0ZXIgPSB7XG4gICAgLi4uZmlsdGVyLFxuICAgIHN5bmNUaW1lbGluZU1vZGVcbiAgfTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzd2FwXzxGaWx0ZXI+KG5ld0ZpbHRlcikoc3RhdGUuZmlsdGVycylcbiAgfTtcblxuICByZXR1cm4gYWRqdXN0QW5pbWF0aW9uQ29uZmlnV2l0aEZpbHRlcihuZXdTdGF0ZSwgZmlsdGVySWR4KTtcbn1cblxuZnVuY3Rpb24gYWRqdXN0QW5pbWF0aW9uQ29uZmlnV2l0aEZpbHRlcjxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTLCBmaWx0ZXJJZHg6IG51bWJlcik6IFMge1xuICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF07XG4gIGlmICgoZmlsdGVyIGFzIFRpbWVSYW5nZUZpbHRlcikuc3luY2VkV2l0aExheWVyVGltZWxpbmUpIHtcbiAgICBjb25zdCB0aW1lbGluZVZhbHVlID0gZ2V0VGltZWxpbmVWYWx1ZUZyb21GaWx0ZXIoZmlsdGVyKTtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YXRlLmFuaW1hdGlvbkNvbmZpZy50aW1lU3RlcHNcbiAgICAgID8gc25hcFRvTWFya3ModGltZWxpbmVWYWx1ZSwgc3RhdGUuYW5pbWF0aW9uQ29uZmlnLnRpbWVTdGVwcylcbiAgICAgIDogdGltZWxpbmVWYWx1ZTtcbiAgICByZXR1cm4gc2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlcihzdGF0ZSwge3ZhbHVlfSk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5mdW5jdGlvbiBnZXRUaW1lbGluZVZhbHVlRnJvbUZpbHRlcihmaWx0ZXIpIHtcbiAgcmV0dXJuIGZpbHRlci52YWx1ZVtmaWx0ZXIuc3luY1RpbWVsaW5lTW9kZV07XG59XG5cbmZ1bmN0aW9uIGdldFN5bmNBbmltYXRpb25Nb2RlKGZpbHRlcjogVGltZVJhbmdlRmlsdGVyKSB7XG4gIGlmIChmaWx0ZXIuYW5pbWF0aW9uV2luZG93ID09PSBBTklNQVRJT05fV0lORE9XLmZyZWUpIHtcbiAgICByZXR1cm4gZmlsdGVyLnN5bmNUaW1lbGluZU1vZGUgPz8gU1lOQ19USU1FTElORV9NT0RFUy5lbmQ7XG4gIH1cblxuICByZXR1cm4gU1lOQ19USU1FTElORV9NT0RFUy5lbmQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3luY0FuaW1hdGlvbk1vZGUoZmlsdGVyOiBUaW1lUmFuZ2VGaWx0ZXIsIG5ld01vZGU6IG51bWJlcikge1xuICByZXR1cm4gIShcbiAgICBmaWx0ZXIuYW5pbWF0aW9uV2luZG93ICE9PSBBTklNQVRJT05fV0lORE9XLmZyZWUgJiYgbmV3TW9kZSA9PT0gU1lOQ19USU1FTElORV9NT0RFUy5zdGFydFxuICApO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RUaW1lRmlsdGVySW50ZXJ2YWwoc3RhdGUsIGZpbHRlcikge1xuICBjb25zdCBpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzID0gZ2V0SW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycyhzdGF0ZS5sYXllcnMpO1xuXG4gIGxldCBpbnRlcnZhbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGlmIChpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaW50ZXJ2YWxJbmRleCA9IGludGVydmFsQmFzZWRBbmltYXRpb25MYXllcnMucmVkdWNlKChjdXJyZW50SW5kZXgsIGwpID0+IHtcbiAgICAgIGlmIChsLm1ldGEudGFyZ2V0VGltZUludGVydmFsKSB7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gVElNRV9JTlRFUlZBTFNfT1JERVJFRC5maW5kSW5kZXgoaSA9PiBpID09PSBsLm1ldGEudGFyZ2V0VGltZUludGVydmFsKTtcbiAgICAgICAgcmV0dXJuIG5ld0luZGV4ID4gLTEgJiYgbmV3SW5kZXggPCBjdXJyZW50SW5kZXggPyBuZXdJbmRleCA6IGN1cnJlbnRJbmRleDtcbiAgICAgIH1cbiAgICB9LCBUSU1FX0lOVEVSVkFMU19PUkRFUkVELmxlbmd0aCAtIDEpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBoZXhUaWxlSW50ZXJ2YWwgPSBUSU1FX0lOVEVSVkFMU19PUkRFUkVEW2ludGVydmFsSW5kZXhdO1xuICAgIGludGVydmFsID0gTGF5ZXJUb0ZpbHRlclRpbWVJbnRlcnZhbFtoZXhUaWxlSW50ZXJ2YWxdO1xuICB9XG5cbiAgaWYgKCFpbnRlcnZhbCkge1xuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICAvLyBhZGp1c3QgZmlsdGVyXG4gIGNvbnN0IHRpbWVGb3JtYXQgPSBnZXREZWZhdWx0VGltZUZvcm1hdChpbnRlcnZhbCk7XG4gIGNvbnN0IHVwZGF0ZWRQbG90VHlwZSA9IHsuLi5maWx0ZXIucGxvdFR5cGUsIGludGVydmFsLCB0aW1lRm9ybWF0fTtcbiAgY29uc3QgbmV3RmlsdGVyID0gdXBkYXRlVGltZUZpbHRlclBsb3RUeXBlKGZpbHRlciwgdXBkYXRlZFBsb3RUeXBlLCBzdGF0ZS5kYXRhc2V0cyk7XG4gIHJldHVybiBhZGp1c3RWYWx1ZVRvQW5pbWF0aW9uV2luZG93KHN0YXRlLCBuZXdGaWx0ZXIpO1xufVxuXG4vLyBGaW5kIGRhdGFJZCBmcm9tIGEgc2F2ZWQgdmlzU3RhdGUgcHJvcGVydHk6XG4vLyBsYXllcnMsIGZpbHRlcnMsIGludGVyYWN0aW9ucywgbGF5ZXJCbGVuZGluZywgb3ZlcmxheUJsZW5kaW5nLCBzcGxpdE1hcHMsIGFuaW1hdGlvbkNvbmZpZywgZWRpdG9yXG4vLyByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBkYXRhSWRcbmZ1bmN0aW9uIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyh2YWx1ZTogYW55LCBkYXRhSWQ6IHN0cmluZywgZGF0YUlkVG9SZXBsYWNlOiBzdHJpbmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gZm9yIGxheWVycywgZmlsdGVycywgY2FsbCBkZWZhdWx0UmVwbGFjZVBhcmVudERhdGFzZXRJZHMgb24gZWFjaCBpdGVtIGluIGFycmF5XG4gICAgY29uc3QgcmVwbGFjZWQgPSB2YWx1ZVxuICAgICAgLm1hcCh2ID0+IGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyh2LCBkYXRhSWQsIGRhdGFJZFRvUmVwbGFjZSkpXG4gICAgICAuZmlsdGVyKGQgPT4gZCk7XG4gICAgcmV0dXJuIHJlcGxhY2VkLmxlbmd0aCA/IHJlcGxhY2VkIDogbnVsbDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlLmRhdGFJZCA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZGF0YUlkID09PSBkYXRhSWQpIHtcbiAgICAvLyBvdGhlcnNcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICBkYXRhSWQ6IGRhdGFJZFRvUmVwbGFjZVxuICAgIH07XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5kYXRhSWQpICYmIHZhbHVlLmRhdGFJZC5pbmNsdWRlcyhkYXRhSWQpKSB7XG4gICAgLy8gZmlsdGVyXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgZGF0YUlkOiB2YWx1ZS5kYXRhSWQubWFwKGQgPT4gKGQgPT09IGRhdGFJZCA/IGRhdGFJZFRvUmVwbGFjZSA6IGQpKVxuICAgIH07XG4gIH0gZWxzZSBpZiAodmFsdWUuY29uZmlnPy5kYXRhSWQgJiYgdmFsdWUuY29uZmlnPy5kYXRhSWQgPT09IGRhdGFJZCkge1xuICAgIC8vIGxheWVyXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC4uLnZhbHVlLmNvbmZpZyxcbiAgICAgICAgZGF0YUlkOiBkYXRhSWRUb1JlcGxhY2VcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGRhdGFJZCkpIHtcbiAgICAvLyBmb3IgdmFsdWUgc2F2ZWQgYXMge1tkYXRhSWRdOiB7Li4ufX1cbiAgICByZXR1cm4ge1tkYXRhSWRUb1JlcGxhY2VdOiB2YWx1ZVtkYXRhSWRdfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBGaW5kIGRhdGFzZXRJZHMgZGVyaXZlZCBhIHNhdmVkIHZpc1N0YXRlIFByb3BlcnR5O1xuZnVuY3Rpb24gZmluZENoaWxkRGF0YXNldElkcyh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBmb3IgbGF5ZXJzLCBmaWx0ZXJzLCBjYWxsIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyBvbiBlYWNoIGl0ZW0gaW4gYXJyYXlcbiAgICBjb25zdCBjaGlsZERhdGFJZHMgPSB2YWx1ZS5tYXAoZmluZENoaWxkRGF0YXNldElkcykuZmlsdGVyKGQgPT4gZCk7XG4gICAgcmV0dXJuIGNoaWxkRGF0YUlkcy5sZW5ndGggPyBjaGlsZERhdGFJZHMgOiBudWxsO1xuICB9XG5cbiAgLy8gY2hpbGQgZGF0YSBpZCB1c3VhbGx5IHN0b3JlcyBpbiB0aGUgZGVyaXZlZCBkYXRhc2V0IGluZm9cbiAgcmV0dXJuIHZhbHVlPy5uZXdEYXRhc2V0Py5pbmZvLmlkIHx8IG51bGw7XG59XG5cbi8vIG1vdmVkIHVubWVyZ2VkIGxheWVycywgZmlsdGVycywgaW50ZXJhY3Rpb25zXG5mdW5jdGlvbiBtb3ZlVmFsdWVUb0JlTWVyZ2VkKHN0YXRlLCBwcm9wVmFsdWVzLCB7cHJvcCwgdG9NZXJnZVByb3AsIHNhdmVVbm1lcmdlZH0pIHtcbiAgLy8gcmVtb3ZlIHByb3AgdmFsdWUgZnJvbSBzdGF0ZVxuICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHJlbW92ZSB1cGRhdGVyIHRvIG1lcmdlciBhcyB3ZWxsP1xuICBpZiAoIXByb3BWYWx1ZXMpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qgc3RhdGVSZW1vdmVkID1cbiAgICBwcm9wID09PSAnbGF5ZXJzJ1xuICAgICAgPyBwcm9wVmFsdWVzLnJlZHVjZSgoYWNjdSwgcHJvcFZhbHVlKSA9PiByZW1vdmVMYXllclVwZGF0ZXIoYWNjdSwge2lkOiBwcm9wVmFsdWUuaWR9KSwgc3RhdGUpXG4gICAgICA6IEFycmF5LmlzQXJyYXkoc3RhdGVbcHJvcF0pXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBbcHJvcF06IHN0YXRlW3Byb3BdLmZpbHRlcihwID0+ICFwcm9wVmFsdWVzLmZpbmQocHJvcFZhbHVlID0+IHAuaWQgPT09IHByb3BWYWx1ZS5pZCkpXG4gICAgICAgIH1cbiAgICAgIDogLy8gaWYgbm90IGFycmF5LCB3ZSB3b24ndCByZW1vdmUgaXQsIHJlbW92ZSBkYXRhc2V0IHNob3VsZCBoYW5kbGUgaXRcbiAgICAgICAgc3RhdGU7XG5cbiAgLy8gbW92ZSB0byBzdGF0ZVRvQmVNZXJnZWRcbiAgY29uc3QgdG9CZU1lcmdlZCA9IHtcbiAgICBbdG9NZXJnZVByb3BdOiBzYXZlVW5tZXJnZWRcbiAgICAgID8gLy8gY2FsbCBtZXJnZSBzYXZlVW5tZXJnZWQgbWV0aG9kXG4gICAgICAgIHNhdmVVbm1lcmdlZChzdGF0ZVJlbW92ZWQsIHByb3BWYWx1ZXMpXG4gICAgICA6IC8vIGlmIHRvTWVyZ2VQcm9wIGlzIGFyYWF5LCBhcHBlbmQgdG8gaXRcbiAgICAgIEFycmF5LmlzQXJyYXkoc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXSlcbiAgICAgID8gWy4uLnN0YXRlUmVtb3ZlZFt0b01lcmdlUHJvcF0sIC4uLnByb3BWYWx1ZXNdXG4gICAgICA6IC8vIHNhdmUgcHJvcFZhbHVlcyB0byB0b01lcmdlXG4gICAgICBpc09iamVjdChzdGF0ZVJlbW92ZWRbdG9NZXJnZVByb3BdKVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXSxcbiAgICAgICAgICAuLi5wcm9wVmFsdWVzXG4gICAgICAgIH1cbiAgICAgIDogc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGVSZW1vdmVkLFxuICAgIC4uLnRvQmVNZXJnZWRcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZURhdGFzZXRBbmREZXBzPFQgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBULFxuICBkYXRhSWQ6IHN0cmluZyxcbiAgZGF0YUlkVG9Vc2U6IHN0cmluZ1xuKTogVCB7XG4gIHJldHVybiBjb21wb3NlXzxUPihbXG4gICAgYXBwbHlfKHJlcGxhY2VEYXRhc2V0RGVwc0luU3RhdGUsIHtkYXRhSWQsIGRhdGFJZFRvVXNlfSksXG4gICAgYXBwbHlfKHJlbW92ZURhdGFzZXRVcGRhdGVyLCB7ZGF0YUlkfSlcbiAgXSkoc3RhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVN0YXRlRm9yRGF0YXNldFJlcGxhY2U8VCBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFQsXG4gIGRhdGFJZDogc3RyaW5nLFxuICBkYXRhSWRUb1VzZTogc3RyaW5nXG4pOiBUIHtcbiAgY29uc3Qgc2VyaWFsaXplZFN0YXRlID0gc2VyaWFsaXplVmlzU3RhdGUoc3RhdGUsIHN0YXRlLnNjaGVtYSk7XG4gIGNvbnN0IG5leHRTdGF0ZSA9IHJlcGxhY2VEYXRhc2V0QW5kRGVwcyhzdGF0ZSwgZGF0YUlkLCBkYXRhSWRUb1VzZSk7XG4gIC8vIG1ha2UgYSBjb3B5IG9mIGxheWVyT3JkZXIsIGJlY2F1c2UgbGF5ZXIgaWQgd2lsbCBiZSByZW1vdmVkIGZyb20gaXQgYnkgY2FsbGluZyByZW1vdmVMYXllclVwZGF0ZXJcbiAgY29uc3QgcHJlc2VydmVMYXllck9yZGVyID0gWy4uLnN0YXRlLmxheWVyT3JkZXJdO1xuXG4gIC8vIHByZXNlcnZlIGRhdGFzZXQgb3JkZXJcbiAgbmV4dFN0YXRlLnByZXNlcnZlRGF0YXNldE9yZGVyID0gT2JqZWN0LmtleXMoc3RhdGUuZGF0YXNldHMpLm1hcChkID0+XG4gICAgZCA9PT0gZGF0YUlkID8gZGF0YUlkVG9Vc2UgOiBkXG4gICk7XG5cbiAgLy8gcHJlc2VydmVMYXllck9yZGVyXG4gIGlmIChuZXh0U3RhdGUubGF5ZXJUb0JlTWVyZ2VkPy5sZW5ndGgpIHtcbiAgICAvLyBjb3B5IHNwbGl0IG1hcHMgdG8gYmUgbWVyZ2VkLCBiZWNhdXNlIGl0IHdpbGwgYmUgcmVzZXQgaW4gcmVtb3ZlIGxheWVyXG4gICAgbmV4dFN0YXRlLnNwbGl0TWFwc1RvQmVNZXJnZWQgPSBzZXJpYWxpemVkU3RhdGU/LnNwbGl0TWFwcyA/PyBbXTtcbiAgICBuZXh0U3RhdGUubGF5ZXJPcmRlciA9IFsuLi5wcmVzZXJ2ZUxheWVyT3JkZXJdO1xuICB9XG5cbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VEYXRhc2V0RGVwc0luU3RhdGU8VCBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFQsXG4gIHtkYXRhSWQsIGRhdGFJZFRvVXNlfToge2RhdGFJZDogc3RyaW5nOyBkYXRhSWRUb1VzZTogc3RyaW5nfVxuKTogVCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKHN0YXRlLCBzdGF0ZS5zY2hlbWEpO1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHN0YXRlLm1lcmdlcnMucmVkdWNlKFxuICAgIChcbiAgICAgIGFjY3VTdGF0ZSxcbiAgICAgIHtwcm9wLCB0b01lcmdlUHJvcCwgcmVwbGFjZVBhcmVudERhdGFzZXRJZHMsIGdldENoaWxkRGF0YXNldElkcywgc2F2ZVVubWVyZ2VkLCBwcmVzZXJ2ZU9yZGVyfVxuICAgICkgPT4ge1xuICAgICAgLy8gZ2V0IGRhdGFzZXQgaWRzIHRoYXQgYXJlIGRlcGVuZHMgb24gdGhpcyBkYXRhc2V0XG4gICAgICBjb25zdCBwcm9wcyA9IHRvQXJyYXkocHJvcCk7XG4gICAgICBjb25zdCB0b01lcmdlUHJvcHMgPSB0b0FycmF5KHRvTWVyZ2VQcm9wKTtcbiAgICAgIGNvbnN0IHNhdmVkUHJvcHMgPSBzZXJpYWxpemVkU3RhdGUgPyBwcm9wcy5tYXAocCA9PiBzZXJpYWxpemVkU3RhdGVbcF0pIDogW107XG5cbiAgICAgIGxldCByZXBsYWNlZFN0YXRlID0gYWNjdVN0YXRlO1xuICAgICAgc2F2ZWRQcm9wcy5mb3JFYWNoKChwcm9wVmFsdWUsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbWVyZ2VyT3B0aW9ucyA9IHtcbiAgICAgICAgICBwcm9wOiBwcm9wc1tpXSxcbiAgICAgICAgICB0b01lcmdlUHJvcDogdG9NZXJnZVByb3BzW2ldLFxuICAgICAgICAgIGdldENoaWxkRGF0YXNldElkcyxcbiAgICAgICAgICBzYXZlVW5tZXJnZWRcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXBsYWNlZEl0ZW0gPVxuICAgICAgICAgIHJlcGxhY2VQYXJlbnREYXRhc2V0SWRzPy4ocHJvcFZhbHVlLCBkYXRhSWQsIGRhdGFJZFRvVXNlKSB8fFxuICAgICAgICAgIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyhwcm9wVmFsdWUsIGRhdGFJZCwgZGF0YUlkVG9Vc2UpO1xuICAgICAgICByZXBsYWNlZFN0YXRlID0gcmVwbGFjZWRJdGVtXG4gICAgICAgICAgPyByZXBsYWNlUHJvcFZhbHVlSW5TdGF0ZShyZXBsYWNlZFN0YXRlLCByZXBsYWNlZEl0ZW0sIG1lcmdlck9wdGlvbnMpXG4gICAgICAgICAgOiByZXBsYWNlZFN0YXRlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBtZXJnZXJPcHRpb25zLnRvTWVyZ2VQcm9wICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICByZXBsYWNlZFN0YXRlW21lcmdlck9wdGlvbnMudG9NZXJnZVByb3BdPy5sZW5ndGggJiZcbiAgICAgICAgICBwcmVzZXJ2ZU9yZGVyXG4gICAgICAgICkge1xuICAgICAgICAgIHJlcGxhY2VkU3RhdGVbcHJlc2VydmVPcmRlcl0gPSBwcm9wVmFsdWUubWFwKGl0ZW0gPT4gaXRlbS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVwbGFjZWRTdGF0ZTtcbiAgICB9LFxuICAgIHN0YXRlXG4gICk7XG5cbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVByb3BWYWx1ZUluU3RhdGUoXG4gIHN0YXRlLFxuICByZXBsYWNlZEl0ZW0sXG4gIHtwcm9wLCB0b01lcmdlUHJvcCwgZ2V0Q2hpbGREYXRhc2V0SWRzLCBzYXZlVW5tZXJnZWR9XG4pIHtcbiAgLy8gcHJvcCBpcyBkZXBlbmRzIG9uIHRoZSBkYXRhc2V0IHRvIGJlIHJlcGxhY2VkXG4gIC8vIHJlbW92ZSBwcm9wIGZyb20gc3RhdGUsIGFuZCBtb3ZlIGl0IHRvIHRvQmVNZXJnZWRcbiAgbGV0IG5leHRTdGF0ZSA9IG1vdmVWYWx1ZVRvQmVNZXJnZWQoc3RhdGUsIHJlcGxhY2VkSXRlbSwge3Byb3AsIHRvTWVyZ2VQcm9wLCBzYXZlVW5tZXJnZWR9KTtcbiAgY29uc3QgY2hpbGREYXRhSWRzID0gZ2V0Q2hpbGREYXRhc2V0SWRzPy4ocmVwbGFjZWRJdGVtKSB8fCBmaW5kQ2hpbGREYXRhc2V0SWRzKHJlcGxhY2VkSXRlbSk7XG5cbiAgaWYgKGNoaWxkRGF0YUlkcykge1xuICAgIG5leHRTdGF0ZSA9IHRvQXJyYXkoY2hpbGREYXRhSWRzKS5yZWR1Y2UoKGFjY3UsIGNoaWxkRGF0YUlkKSA9PiB7XG4gICAgICAvLyBzaG91bGRuJ3QgbmVlZCB0byBjaGFuZ2UgY2hpbGQgZGF0YXNldCBpZCxcbiAgICAgIC8vIGJ1dCBzdGlsbCBuZWVkIHRvIG1vdmUgb3V0IG9mIHN0YXRlIGFuZCBtZXJnZSBiYWNrIGluXG4gICAgICByZXR1cm4gcmVwbGFjZURhdGFzZXRBbmREZXBzKGFjY3UsIGNoaWxkRGF0YUlkLCBjaGlsZERhdGFJZCk7XG4gICAgfSwgbmV4dFN0YXRlKTtcbiAgfVxuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsZ0JBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUws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
|