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