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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/cjs/combined-updaters.js +491 -0
  2. package/dist/cjs/composer-helpers.js +101 -0
  3. package/dist/cjs/composers.js +22 -0
  4. package/dist/cjs/core.js +105 -0
  5. package/dist/cjs/data-utils.js +53 -0
  6. package/dist/cjs/export-utils.js +91 -0
  7. package/dist/{index.js → cjs/index.js} +1 -1
  8. package/dist/cjs/interaction-utils.js +105 -0
  9. package/dist/cjs/layer-utils.js +635 -0
  10. package/dist/cjs/map-state-updaters.js +658 -0
  11. package/dist/cjs/map-state.js +35 -0
  12. package/dist/cjs/map-style-updaters.js +660 -0
  13. package/dist/cjs/map-style.js +33 -0
  14. package/dist/cjs/merger-handler.js +105 -0
  15. package/dist/cjs/middleware.js +27 -0
  16. package/dist/cjs/provider-state-updaters.js +465 -0
  17. package/dist/cjs/provider-state.js +34 -0
  18. package/dist/cjs/root.js +207 -0
  19. package/dist/cjs/ui-state-updaters.js +934 -0
  20. package/dist/cjs/ui-state.js +36 -0
  21. package/dist/cjs/vis-state-merger.js +1193 -0
  22. package/dist/cjs/vis-state-selectors.js +30 -0
  23. package/dist/{vis-state-updaters.js → cjs/vis-state-updaters.js} +338 -47
  24. package/dist/cjs/vis-state.js +35 -0
  25. package/dist/combined-updaters.d.ts +1 -1
  26. package/dist/esm/combined-updaters.js +484 -0
  27. package/dist/esm/composer-helpers.js +85 -0
  28. package/dist/esm/composers.js +14 -0
  29. package/dist/esm/core.js +101 -0
  30. package/dist/esm/data-utils.js +47 -0
  31. package/dist/esm/export-utils.js +86 -0
  32. package/dist/esm/index.js +62 -0
  33. package/dist/esm/interaction-utils.js +96 -0
  34. package/dist/esm/layer-utils.js +602 -0
  35. package/dist/esm/map-state-updaters.js +650 -0
  36. package/dist/esm/map-state.js +29 -0
  37. package/dist/esm/map-style-updaters.js +652 -0
  38. package/dist/esm/map-style.js +27 -0
  39. package/dist/esm/merger-handler.js +96 -0
  40. package/dist/esm/middleware.js +19 -0
  41. package/dist/esm/provider-state-updaters.js +458 -0
  42. package/dist/esm/provider-state.js +28 -0
  43. package/dist/esm/root.js +201 -0
  44. package/dist/esm/ui-state-updaters.js +929 -0
  45. package/dist/esm/ui-state.js +30 -0
  46. package/dist/esm/vis-state-merger.js +1161 -0
  47. package/dist/esm/vis-state-selectors.js +24 -0
  48. package/dist/esm/vis-state-updaters.js +4320 -0
  49. package/dist/esm/vis-state.js +29 -0
  50. package/dist/ui-state-updaters.d.ts +15 -1
  51. package/dist/vis-state-updaters.d.ts +27 -0
  52. package/package.json +31 -22
  53. package/dist/combined-updaters.js +0 -491
  54. package/dist/composer-helpers.js +0 -101
  55. package/dist/composers.js +0 -22
  56. package/dist/core.js +0 -105
  57. package/dist/data-utils.js +0 -53
  58. package/dist/export-utils.js +0 -91
  59. package/dist/interaction-utils.js +0 -105
  60. package/dist/layer-utils.js +0 -635
  61. package/dist/map-state-updaters.js +0 -649
  62. package/dist/map-state.js +0 -35
  63. package/dist/map-style-updaters.js +0 -660
  64. package/dist/map-style.js +0 -33
  65. package/dist/merger-handler.js +0 -105
  66. package/dist/middleware.js +0 -27
  67. package/dist/provider-state-updaters.js +0 -465
  68. package/dist/provider-state.js +0 -34
  69. package/dist/root.js +0 -207
  70. package/dist/ui-state-updaters.js +0 -905
  71. package/dist/ui-state.js +0 -36
  72. package/dist/vis-state-merger.js +0 -1193
  73. package/dist/vis-state-selectors.js +0 -30
  74. package/dist/vis-state.js +0 -35
@@ -0,0 +1,934 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.toggleSplitMapUpdater = exports.toggleSidePanelUpdater = exports.toggleSidePanelCloseButtonUpdater = exports.togglePanelListViewUpdater = exports.toggleModalUpdater = exports.toggleMapControlUpdater = exports.startExportingImageUpdater = exports.showExportDropdownUpdater = exports.showDatasetTableUpdater = exports.setUserMapboxAccessTokenUpdater = exports.setThemeUpdater = exports.setMapControlVisibilityUpdater = exports.setMapControlSettingsUpdater = exports.setLocaleUpdater = exports.setExportVideoSettingUpdater = exports.setExportSelectedDatasetUpdater = exports.setExportMapHTMLModeUpdater = exports.setExportMapFormatUpdater = exports.setExportImageSettingUpdater = exports.setExportImageErrorUpdater = exports.setExportImageDataUriUpdater = exports.setExportFilteredUpdater = exports.setExportDataUpdater = exports.setExportDataTypeUpdater = exports.removeNotificationUpdater = exports.receiveMapConfigUpdater = exports.openDeleteModalUpdater = exports.loadFilesUpdater = exports.loadFilesSuccessUpdater = exports.loadFilesErrUpdater = exports.initUiStateUpdater = exports.hideExportDropdownUpdater = exports.cleanupExportImageUpdater = exports.addNotificationUpdater = exports.MUTUALLY_EXCLUSIVE_MAP_CONTROLS = exports.INITIAL_UI_STATE = exports.DEFAULT_NOTIFICATIONS = exports.DEFAULT_MODAL = exports.DEFAULT_MAP_CONTROLS = exports.DEFAULT_LOAD_FILES = exports.DEFAULT_EXPORT_VIDEO = exports.DEFAULT_EXPORT_MAP = exports.DEFAULT_EXPORT_JSON = exports.DEFAULT_EXPORT_IMAGE = exports.DEFAULT_EXPORT_HTML = exports.DEFAULT_EXPORT_DATA = exports.DEFAULT_ACTIVE_SIDE_PANEL = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _constants = require("@kepler.gl/constants");
11
+ var _localization = require("@kepler.gl/localization");
12
+ var _utils = require("@kepler.gl/utils");
13
+ var _composerHelpers = require("./composer-helpers");
14
+ 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; }
15
+ 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
16
+ // Copyright contributors to the kepler.gl project
17
+ var DEFAULT_ACTIVE_SIDE_PANEL = exports.DEFAULT_ACTIVE_SIDE_PANEL = 'layer';
18
+ var DEFAULT_MODAL = exports.DEFAULT_MODAL = _constants.ADD_DATA_ID;
19
+
20
+ /**
21
+ * Updaters for `uiState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
22
+ * Read more about [Using updaters](../advanced-usage/using-updaters.md)
23
+ *
24
+ * @public
25
+ * @example
26
+ *
27
+ * import keplerGlReducer, {uiStateUpdaters} from '@kepler.gl/reducers';
28
+ * // Root Reducer
29
+ * const reducers = combineReducers({
30
+ * keplerGl: keplerGlReducer,
31
+ * app: appReducer
32
+ * });
33
+ *
34
+ * const composedReducer = (state, action) => {
35
+ * switch (action.type) {
36
+ * // click button to close side panel
37
+ * case 'CLICK_BUTTON':
38
+ * return {
39
+ * ...state,
40
+ * keplerGl: {
41
+ * ...state.keplerGl,
42
+ * foo: {
43
+ * ...state.keplerGl.foo,
44
+ * uiState: uiStateUpdaters.toggleSidePanelUpdater(
45
+ * uiState, {payload: null}
46
+ * )
47
+ * }
48
+ * }
49
+ * };
50
+ * }
51
+ * return reducers(state, action);
52
+ * };
53
+ *
54
+ * export default composedReducer;
55
+ */
56
+ /* eslint-disable @typescript-eslint/no-unused-vars */
57
+ // @ts-ignore
58
+ var uiStateUpdaters = null;
59
+ /* eslint-enable @typescript-eslint/no-unused-vars */
60
+
61
+ var DEFAULT_MAP_CONTROLS_FEATURES = {
62
+ show: true,
63
+ active: false,
64
+ disableClose: false,
65
+ // defines which map index users are interacting with (through map controls)
66
+ activeMapIndex: 0
67
+ };
68
+ var DEFAULT_MAP_LEGEND_CONTROL = _objectSpread(_objectSpread({}, DEFAULT_MAP_CONTROLS_FEATURES), {}, {
69
+ disableEdit: false
70
+ });
71
+ /**
72
+ * A list of map control visibility and whether is it active.
73
+ * @memberof uiStateUpdaters
74
+ * @constant
75
+ * @property visibleLayers Default: `{show: true, active: false}`
76
+ * @property mapLegend Default: `{show: true, active: false}`
77
+ * @property toggle3d Default: `{show: true}`
78
+ * @property splitMap Default: `{show: true}`
79
+ * @property mapDraw Default: `{show: true, active: false}`
80
+ * @property mapLocale Default: `{show: true, active: false}`
81
+ * @property mapTheme Default: `{show: true, active: false}`
82
+ * @public
83
+ */
84
+ var DEFAULT_MAP_CONTROLS = exports.DEFAULT_MAP_CONTROLS = Object.keys(_constants.MAP_CONTROLS).reduce(function (_final, current) {
85
+ return _objectSpread(_objectSpread({}, _final), {}, (0, _defineProperty2["default"])({}, current, current === _constants.MAP_CONTROLS.mapLegend ? DEFAULT_MAP_LEGEND_CONTROL : DEFAULT_MAP_CONTROLS_FEATURES));
86
+ }, {});
87
+
88
+ /**
89
+ * Default image export config
90
+ * @memberof uiStateUpdaters
91
+ * @constant
92
+ * @property ratio Default: `'SCREEN'`,
93
+ * @property resolution Default: `'ONE_X'`,
94
+ * @property legend Default: `false`,
95
+ * @property mapH Default: 0,
96
+ * @property mapW Default: 0,
97
+ * @property imageSize Default: {zoomOffset: 0, scale: 1, imageW: 0, imageH: 0},
98
+ * @property imageDataUri Default: `''`,
99
+ * @property exporting Default: `false`
100
+ * @property error Default: `false`
101
+ * @property escapeXhtmlForWebpack Default: from application config (auto-detected: `true` for webpack)
102
+ * @public
103
+ */
104
+ var DEFAULT_EXPORT_IMAGE = exports.DEFAULT_EXPORT_IMAGE = {
105
+ // user options
106
+ ratio: _constants.EXPORT_IMG_RATIOS.SCREEN,
107
+ resolution: _constants.RESOLUTIONS.ONE_X,
108
+ legend: false,
109
+ mapH: 0,
110
+ mapW: 0,
111
+ imageSize: {
112
+ zoomOffset: 0,
113
+ scale: 1,
114
+ imageW: 0,
115
+ imageH: 0
116
+ },
117
+ // when this is set to true, the mock map viewport will move to the center of data
118
+ center: false,
119
+ // exporting state
120
+ imageDataUri: '',
121
+ // exporting: used to attach plot-container to dom
122
+ exporting: false,
123
+ // processing: used as loading indicator when export image is being produced
124
+ processing: false,
125
+ error: false,
126
+ // whether to apply fix for uglify error in dom-to-image (from application config, auto-detects build tool)
127
+ escapeXhtmlForWebpack: (0, _utils.getApplicationConfig)().escapeXhtmlForWebpack
128
+ };
129
+ var DEFAULT_LOAD_FILES = exports.DEFAULT_LOAD_FILES = {
130
+ fileLoading: false
131
+ };
132
+
133
+ /**
134
+ * Default initial `exportData` settings
135
+ * @memberof uiStateUpdaters
136
+ * @constant
137
+ * @property selectedDataset Default: `''`,
138
+ * @property dataType Default: `'csv'`,
139
+ * @property filtered Default: `true`,
140
+ * @public
141
+ */
142
+ var DEFAULT_EXPORT_DATA = exports.DEFAULT_EXPORT_DATA = {
143
+ selectedDataset: '',
144
+ dataType: _constants.EXPORT_DATA_TYPE.CSV,
145
+ filtered: true
146
+ };
147
+
148
+ /**
149
+ * @constant
150
+ */
151
+ var DEFAULT_NOTIFICATIONS = exports.DEFAULT_NOTIFICATIONS = [];
152
+
153
+ /**
154
+ * @constant
155
+ * @property exportMapboxAccessToken - Default: null, this is used when we provide a default mapbox token for users to take advantage of
156
+ * @property userMapboxToken - Default: '', mapbox token provided by user through input field
157
+ * @property mode - Default: 'READ', read only or editable
158
+ * @public
159
+ */
160
+ var DEFAULT_EXPORT_HTML = exports.DEFAULT_EXPORT_HTML = {
161
+ exportMapboxAccessToken: null,
162
+ userMapboxToken: '',
163
+ mode: _constants.EXPORT_HTML_MAP_MODES.READ
164
+ };
165
+
166
+ /**
167
+ * @constant
168
+ * @property hasData - Default: 'true',
169
+ * @public
170
+ */
171
+ var DEFAULT_EXPORT_JSON = exports.DEFAULT_EXPORT_JSON = {
172
+ hasData: true
173
+ };
174
+
175
+ /**
176
+ * Export Map Config
177
+ * @constant
178
+ * @property HTML - Default: 'DEFAULT_EXPORT_HTML',
179
+ * @property JSON - Default: 'DEFAULT_EXPORT_JSON',
180
+ * @property format - Default: 'HTML',
181
+ * @public
182
+ */
183
+ var DEFAULT_EXPORT_MAP = exports.DEFAULT_EXPORT_MAP = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, DEFAULT_EXPORT_HTML), _constants.EXPORT_MAP_FORMATS.JSON, DEFAULT_EXPORT_JSON), "format", _constants.EXPORT_MAP_FORMATS.HTML);
184
+
185
+ /**
186
+ * Default initial `exportVideo` settings
187
+ * @memberof uiStateUpdaters
188
+ * @constant
189
+ * @property mediaType Default: `'webm'`
190
+ * @property cameraPreset Default: `'None'`
191
+ * @property fileName Default: `'kepler.gl'`
192
+ * @property resolution Default: `'1280x720'`
193
+ * @property durationMs Default: `1000`
194
+ * @public
195
+ */
196
+ var DEFAULT_EXPORT_VIDEO = exports.DEFAULT_EXPORT_VIDEO = {
197
+ mediaType: 'webm',
198
+ // use webm as default as gif export tends to freeze on larger recordings
199
+ cameraPreset: 'None',
200
+ fileName: 'kepler.gl',
201
+ resolution: '1280x720',
202
+ durationMs: 1000,
203
+ swipeStartPct: 0,
204
+ swipeEndPct: 100,
205
+ swipeEasing: 'ease-in-out'
206
+ };
207
+
208
+ /**
209
+ * Default initial `uiState`
210
+ * @memberof uiStateUpdaters
211
+ * @constant
212
+ * @property readOnly Default: `false`
213
+ * @property activeSidePanel Default: `'layer'`
214
+ * @property currentModal Default: `'addData'`
215
+ * @property datasetKeyToRemove Default: `null`
216
+ * @property visibleDropdown Default: `null`
217
+ * @property exportImage Default: [`DEFAULT_EXPORT_IMAGE`](#default_export_image)
218
+ * @property exportData Default: [`DEFAULT_EXPORT_DATA`](#default_export_data)
219
+ * @property exportMap Default: [`DEFAULT_EXPORT_MAP`](#default_export_map)
220
+ * @property mapControls Default: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
221
+ * @property notifications Default: `[]`
222
+ * @property notifications Default: `[]`
223
+ * @property loadFiles
224
+ * @property locale Default: `'en'`
225
+ * @property theme Default: `'dark'`
226
+ * @property isSidePanelCloseButtonVisible Default: `true`
227
+ * @public
228
+ */
229
+ var INITIAL_UI_STATE = exports.INITIAL_UI_STATE = {
230
+ readOnly: false,
231
+ activeSidePanel: DEFAULT_ACTIVE_SIDE_PANEL,
232
+ currentModal: DEFAULT_MODAL,
233
+ datasetKeyToRemove: null,
234
+ visibleDropdown: null,
235
+ // export image modal ui
236
+ exportImage: DEFAULT_EXPORT_IMAGE,
237
+ // export data modal ui
238
+ exportData: DEFAULT_EXPORT_DATA,
239
+ // html export
240
+ exportMap: DEFAULT_EXPORT_MAP,
241
+ // export video modal ui
242
+ exportVideo: DEFAULT_EXPORT_VIDEO,
243
+ // map control panels
244
+ mapControls: DEFAULT_MAP_CONTROLS,
245
+ // ui notifications
246
+ notifications: DEFAULT_NOTIFICATIONS,
247
+ // load files
248
+ loadFiles: DEFAULT_LOAD_FILES,
249
+ // Locale of the UI
250
+ locale: _localization.LOCALE_CODES.en,
251
+ // Theme of the UI (used when enableThemeToggle is on)
252
+ theme: _constants.THEME.dark,
253
+ layerPanelListView: 'list',
254
+ filterPanelListView: 'list',
255
+ isSidePanelCloseButtonVisible: true
256
+ };
257
+
258
+ /* Updaters */
259
+ /**
260
+ * @memberof uiStateUpdaters
261
+ */
262
+ var initUiStateUpdater = exports.initUiStateUpdater = function initUiStateUpdater(state, action) {
263
+ return _objectSpread(_objectSpread({}, state), (action.payload || {}).initialUiState);
264
+ };
265
+
266
+ /**
267
+ * Toggle active side panel
268
+ * @memberof uiStateUpdaters
269
+ * @param state `uiState`
270
+ * @param action
271
+ * @param action.payload id of side panel to be shown, one of `layer`, `filter`, `interaction`, `map`. close side panel if `null`
272
+ * @returns nextState
273
+ * @public
274
+ */
275
+ var toggleSidePanelUpdater = exports.toggleSidePanelUpdater = function toggleSidePanelUpdater(state, _ref) {
276
+ var id = _ref.payload;
277
+ return id === state.activeSidePanel ? state : _objectSpread(_objectSpread({}, state), {}, {
278
+ activeSidePanel: id
279
+ });
280
+ };
281
+
282
+ /**
283
+ * Show and hide modal dialog
284
+ * @memberof uiStateUpdaters
285
+ * @param state `uiState`
286
+ * @param action
287
+ * @paramaction.payload id of modal to be shown, null to hide modals. One of:
288
+ * - [`DATA_TABLE_ID`](../constants/default-settings.md#data_table_id)
289
+ * - [`DELETE_DATA_ID`](../constants/default-settings.md#delete_data_id)
290
+ * - [`ADD_DATA_ID`](../constants/default-settings.md#add_data_id)
291
+ * - [`EXPORT_IMAGE_ID`](../constants/default-settings.md#export_image_id)
292
+ * - [`EXPORT_DATA_ID`](../constants/default-settings.md#export_data_id)
293
+ * - [`ADD_MAP_STYLE_ID`](../constants/default-settings.md#add_map_style_id)
294
+ * @returns nextState
295
+ * @public
296
+ */
297
+ var toggleModalUpdater = exports.toggleModalUpdater = function toggleModalUpdater(state, _ref2) {
298
+ var id = _ref2.payload;
299
+ return _objectSpread(_objectSpread({}, state), {}, {
300
+ currentModal: id
301
+ });
302
+ };
303
+
304
+ /**
305
+ * Hide and show side panel header dropdown, activated by clicking the share link on top of the side panel
306
+ * @memberof uiStateUpdaters
307
+ * @public
308
+ */
309
+ var showExportDropdownUpdater = exports.showExportDropdownUpdater = function showExportDropdownUpdater(state, _ref3) {
310
+ var id = _ref3.payload;
311
+ return _objectSpread(_objectSpread({}, state), {}, {
312
+ visibleDropdown: id
313
+ });
314
+ };
315
+
316
+ /**
317
+ * Hide side panel header dropdown, activated by clicking the share link on top of the side panel
318
+ * @memberof uiStateUpdaters
319
+ * @public
320
+ */
321
+ var hideExportDropdownUpdater = exports.hideExportDropdownUpdater = function hideExportDropdownUpdater(state) {
322
+ return _objectSpread(_objectSpread({}, state), {}, {
323
+ visibleDropdown: null
324
+ });
325
+ };
326
+
327
+ /**
328
+ * Toggle side panel close button on top left of the side panel
329
+ * @memberof uiStateUpdaters
330
+ * @public
331
+ */
332
+ var toggleSidePanelCloseButtonUpdater = exports.toggleSidePanelCloseButtonUpdater = function toggleSidePanelCloseButtonUpdater(state, _ref4) {
333
+ var show = _ref4.payload.show;
334
+ return _objectSpread(_objectSpread({}, state), {}, {
335
+ isSidePanelCloseButtonVisible: show
336
+ });
337
+ };
338
+
339
+ // Map control dropdowns/menus that overlap each other visually and therefore
340
+ // should be mutually exclusive: opening one closes all the others.
341
+ // (split/view-mode menu, top/3d/globe menu, polygon draw tool, language menu)
342
+ var MUTUALLY_EXCLUSIVE_MAP_CONTROLS = exports.MUTUALLY_EXCLUSIVE_MAP_CONTROLS = [_constants.MAP_CONTROLS.splitMap, _constants.MAP_CONTROLS.toggle3d, _constants.MAP_CONTROLS.mapDraw, _constants.MAP_CONTROLS.mapLocale];
343
+
344
+ /**
345
+ * Toggle active map control panel
346
+ * @memberof uiStateUpdaters
347
+ * @param state `uiState`
348
+ * @param action action
349
+ * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
350
+ * @returns nextState
351
+ * @public
352
+ */
353
+ var toggleMapControlUpdater = exports.toggleMapControlUpdater = function toggleMapControlUpdater(state, _ref5) {
354
+ var _state$mapControls$pa, _updatedState$mapCont;
355
+ var _ref5$payload = _ref5.payload,
356
+ panelId = _ref5$payload.panelId,
357
+ _ref5$payload$index = _ref5$payload.index,
358
+ index = _ref5$payload$index === void 0 ? 0 : _ref5$payload$index;
359
+ var updatedState = state;
360
+ // The effect panel and ai assistant panel can not be active at the same time
361
+ // so we need to deactivate the other panel when one is activated
362
+ var panelToDeactivate = panelId === _constants.MAP_CONTROLS.effect ? _constants.MAP_CONTROLS.aiAssistant : panelId === _constants.MAP_CONTROLS.aiAssistant ? _constants.MAP_CONTROLS.effect : null;
363
+
364
+ // If we need to deactivate a competing panel and it's currently active
365
+ if (panelToDeactivate && (_state$mapControls$pa = state.mapControls[panelToDeactivate]) !== null && _state$mapControls$pa !== void 0 && _state$mapControls$pa.active) {
366
+ updatedState = _objectSpread(_objectSpread({}, state), {}, {
367
+ mapControls: _objectSpread(_objectSpread({}, updatedState.mapControls), {}, (0, _defineProperty2["default"])({}, panelToDeactivate, _objectSpread(_objectSpread({}, updatedState.mapControls[panelToDeactivate]), {}, {
368
+ active: false
369
+ })))
370
+ });
371
+ }
372
+
373
+ // The overlapping map control menus should be mutually exclusive: when one of
374
+ // them is being opened, deactivate every other one that is currently active
375
+ // so their dropdowns never overlap on screen.
376
+ var isOpening = !((_updatedState$mapCont = updatedState.mapControls[panelId]) !== null && _updatedState$mapCont !== void 0 && _updatedState$mapCont.active);
377
+ if (isOpening && MUTUALLY_EXCLUSIVE_MAP_CONTROLS.includes(panelId)) {
378
+ var nextMapControls = _objectSpread({}, updatedState.mapControls);
379
+ var didDeactivate = false;
380
+ MUTUALLY_EXCLUSIVE_MAP_CONTROLS.forEach(function (controlId) {
381
+ var _nextMapControls$cont;
382
+ if (controlId !== panelId && (_nextMapControls$cont = nextMapControls[controlId]) !== null && _nextMapControls$cont !== void 0 && _nextMapControls$cont.active) {
383
+ nextMapControls[controlId] = _objectSpread(_objectSpread({}, nextMapControls[controlId]), {}, {
384
+ active: false
385
+ });
386
+ didDeactivate = true;
387
+ }
388
+ });
389
+ if (didDeactivate) {
390
+ updatedState = _objectSpread(_objectSpread({}, updatedState), {}, {
391
+ mapControls: nextMapControls
392
+ });
393
+ }
394
+ }
395
+ return _objectSpread(_objectSpread({}, updatedState), {}, {
396
+ mapControls: _objectSpread(_objectSpread({}, updatedState.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, updatedState.mapControls[panelId]), {}, {
397
+ active: !updatedState.mapControls[panelId].active,
398
+ activeMapIndex: index
399
+ })))
400
+ });
401
+ };
402
+
403
+ /**
404
+ * Toggle map control visibility
405
+ * @memberof uiStateUpdaters
406
+ * @param state `uiState`
407
+ * @param action action
408
+ * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
409
+ * @returns nextState
410
+ * @public
411
+ */
412
+ var setMapControlVisibilityUpdater = exports.setMapControlVisibilityUpdater = function setMapControlVisibilityUpdater(state, _ref6) {
413
+ var _state$mapControls;
414
+ var _ref6$payload = _ref6.payload,
415
+ panelId = _ref6$payload.panelId,
416
+ show = _ref6$payload.show;
417
+ if (!((_state$mapControls = state.mapControls) !== null && _state$mapControls !== void 0 && _state$mapControls[panelId])) {
418
+ return state;
419
+ }
420
+ return _objectSpread(_objectSpread({}, state), {}, {
421
+ mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, state.mapControls[panelId]), {}, {
422
+ show: Boolean(show)
423
+ })))
424
+ });
425
+ };
426
+
427
+ /**
428
+ * Toggle map control settings
429
+ * @memberof uiStateUpdaters
430
+ * @param state `uiState`
431
+ * @param action action
432
+ * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
433
+ * @returns nextState
434
+ * @public
435
+ */
436
+ var setMapControlSettingsUpdater = exports.setMapControlSettingsUpdater = function setMapControlSettingsUpdater(state, _ref7) {
437
+ var _state$mapControls2;
438
+ var _ref7$payload = _ref7.payload,
439
+ panelId = _ref7$payload.panelId,
440
+ settings = _ref7$payload.settings;
441
+ var mapControl = (_state$mapControls2 = state.mapControls) === null || _state$mapControls2 === void 0 ? void 0 : _state$mapControls2[panelId];
442
+ if (!mapControl) {
443
+ return state;
444
+ }
445
+ return _objectSpread(_objectSpread({}, state), {}, {
446
+ mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, mapControl), {}, {
447
+ settings: _objectSpread(_objectSpread({}, mapControl.settings), settings)
448
+ })))
449
+ });
450
+ };
451
+
452
+ /**
453
+ * Toggle active map control panel
454
+ * @memberof uiStateUpdaters
455
+ * @param state `uiState`
456
+ * @param action
457
+ * @param action.payload dataset id
458
+ * @returns nextState
459
+ * @public
460
+ */
461
+ var openDeleteModalUpdater = exports.openDeleteModalUpdater = function openDeleteModalUpdater(state, _ref8) {
462
+ var datasetKeyToRemove = _ref8.payload;
463
+ return _objectSpread(_objectSpread({}, state), {}, {
464
+ currentModal: _constants.DELETE_DATA_ID,
465
+ datasetKeyToRemove: datasetKeyToRemove
466
+ });
467
+ };
468
+
469
+ /**
470
+ * Set `exportImage.legend` to `true` or `false`
471
+ * @memberof uiStateUpdaters
472
+ * @param state `uiState`
473
+ * @returns nextState
474
+ * @public
475
+ */
476
+ var setExportImageSettingUpdater = exports.setExportImageSettingUpdater = function setExportImageSettingUpdater(state, _ref9) {
477
+ var newSetting = _ref9.payload;
478
+ var updated = _objectSpread(_objectSpread({}, state.exportImage), newSetting);
479
+ var imageSize = (0, _utils.calculateExportImageSize)(updated) || state.exportImage.imageSize;
480
+ return _objectSpread(_objectSpread({}, state), {}, {
481
+ exportImage: _objectSpread(_objectSpread({}, updated), {}, {
482
+ imageSize: imageSize
483
+ })
484
+ });
485
+ };
486
+
487
+ /**
488
+ * Set `exportImage.setExportImageDataUri` to a image dataUri
489
+ * @memberof uiStateUpdaters
490
+ * @param state `uiState`
491
+ * @param action
492
+ * @param action.payload export image data uri
493
+ * @returns nextState
494
+ * @public
495
+ */
496
+ var setExportImageDataUriUpdater = exports.setExportImageDataUriUpdater = function setExportImageDataUriUpdater(state, _ref0) {
497
+ var dataUri = _ref0.payload;
498
+ if (dataUri === state.exportImage.imageDataUri) {
499
+ return state;
500
+ }
501
+ return _objectSpread(_objectSpread({}, state), {}, {
502
+ exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
503
+ processing: false,
504
+ imageDataUri: dataUri
505
+ })
506
+ });
507
+ };
508
+
509
+ /**
510
+ * @memberof uiStateUpdaters
511
+ * @public
512
+ */
513
+ var setExportImageErrorUpdater = exports.setExportImageErrorUpdater = function setExportImageErrorUpdater(state, _ref1) {
514
+ var error = _ref1.payload;
515
+ return _objectSpread(_objectSpread({}, state), {}, {
516
+ exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
517
+ processing: false,
518
+ error: error
519
+ })
520
+ });
521
+ };
522
+
523
+ /**
524
+ * Delete cached export image
525
+ * @memberof uiStateUpdaters
526
+ * @public
527
+ */
528
+ var cleanupExportImageUpdater = exports.cleanupExportImageUpdater = function cleanupExportImageUpdater(state) {
529
+ return _objectSpread(_objectSpread({}, state), {}, {
530
+ exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
531
+ exporting: false,
532
+ imageDataUri: '',
533
+ error: false,
534
+ processing: false,
535
+ center: false
536
+ })
537
+ });
538
+ };
539
+
540
+ /**
541
+ * Set `exportVideo` settings: mediaType, cameraPreset, fileName, resolution, durationMs
542
+ * @memberof uiStateUpdaters
543
+ * @param state `uiState`
544
+ * @param action
545
+ * @param action.payload new video export settings
546
+ * @returns nextState
547
+ * @public
548
+ */
549
+ var setExportVideoSettingUpdater = exports.setExportVideoSettingUpdater = function setExportVideoSettingUpdater(state, _ref10) {
550
+ var newSetting = _ref10.payload;
551
+ return _objectSpread(_objectSpread({}, state), {}, {
552
+ exportVideo: _objectSpread(_objectSpread({}, state.exportVideo), newSetting)
553
+ });
554
+ };
555
+
556
+ /**
557
+ * Start image exporting flow
558
+ * @memberof uiStateUpdaters
559
+ * @param state
560
+ * @param options
561
+ * @returns {UiState}
562
+ * @public
563
+ */
564
+ var startExportingImageUpdater = exports.startExportingImageUpdater = function startExportingImageUpdater(state, _ref11) {
565
+ var _ref11$payload = _ref11.payload,
566
+ options = _ref11$payload === void 0 ? {} : _ref11$payload;
567
+ var imageSettings = _objectSpread(_objectSpread({}, options), {}, {
568
+ exporting: true
569
+ });
570
+ return (0, _composerHelpers.compose_)([cleanupExportImageUpdater, (0, _composerHelpers.apply_)(setExportImageSettingUpdater, (0, _composerHelpers.payload_)(imageSettings))])(state);
571
+ };
572
+
573
+ /**
574
+ * Set selected dataset for export
575
+ * @memberof uiStateUpdaters
576
+ * @param state `uiState`
577
+ * @param action
578
+ * @param action.payload dataset id
579
+ * @returns nextState
580
+ * @public
581
+ */
582
+ var setExportSelectedDatasetUpdater = exports.setExportSelectedDatasetUpdater = function setExportSelectedDatasetUpdater(state, _ref12) {
583
+ var dataset = _ref12.payload;
584
+ return _objectSpread(_objectSpread({}, state), {}, {
585
+ exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
586
+ selectedDataset: dataset
587
+ })
588
+ });
589
+ };
590
+
591
+ /**
592
+ * Set data format for exporting data
593
+ * @memberof uiStateUpdaters
594
+ * @param state `uiState`
595
+ * @param action
596
+ * @param action.payload one of `'text/csv'`
597
+ * @returns nextState
598
+ * @public
599
+ */
600
+ var setExportDataTypeUpdater = exports.setExportDataTypeUpdater = function setExportDataTypeUpdater(state, _ref13) {
601
+ var dataType = _ref13.payload;
602
+ return _objectSpread(_objectSpread({}, state), {}, {
603
+ exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
604
+ dataType: dataType
605
+ })
606
+ });
607
+ };
608
+
609
+ /**
610
+ * Whether to export filtered data, `true` or `false`
611
+ * @memberof uiStateUpdaters
612
+ * @param state `uiState`
613
+ * @param action
614
+ * @param action.payload
615
+ * @returns nextState
616
+ * @public
617
+ */
618
+ var setExportFilteredUpdater = exports.setExportFilteredUpdater = function setExportFilteredUpdater(state, _ref14) {
619
+ var filtered = _ref14.payload;
620
+ return _objectSpread(_objectSpread({}, state), {}, {
621
+ exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
622
+ filtered: filtered
623
+ })
624
+ });
625
+ };
626
+
627
+ /**
628
+ * Whether to including data in map config, toggle between `true` or `false`
629
+ * @memberof uiStateUpdaters
630
+ * @param state `uiState`
631
+ * @returns nextState
632
+ * @public
633
+ */
634
+ var setExportDataUpdater = exports.setExportDataUpdater = function setExportDataUpdater(state) {
635
+ return _objectSpread(_objectSpread({}, state), {}, {
636
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.JSON, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.JSON]), {}, {
637
+ hasData: !state.exportMap[_constants.EXPORT_MAP_FORMATS.JSON].hasData
638
+ })))
639
+ });
640
+ };
641
+
642
+ /**
643
+ * whether to export a mapbox access to HTML single page
644
+ * @param state - `uiState`
645
+ * @param action
646
+ * @param action.payload
647
+ * @returns nextState
648
+ * @public
649
+ */
650
+ var setUserMapboxAccessTokenUpdater = exports.setUserMapboxAccessTokenUpdater = function setUserMapboxAccessTokenUpdater(state, _ref15) {
651
+ var userMapboxToken = _ref15.payload;
652
+ return _objectSpread(_objectSpread({}, state), {}, {
653
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.HTML]), {}, {
654
+ userMapboxToken: userMapboxToken
655
+ })))
656
+ });
657
+ };
658
+
659
+ /**
660
+ * Sets the export map format
661
+ * @param state - `uiState`
662
+ * @param action
663
+ * @param action.payload format to use to export the map into
664
+ * @return nextState
665
+ */
666
+ var setExportMapFormatUpdater = exports.setExportMapFormatUpdater = function setExportMapFormatUpdater(state, _ref16) {
667
+ var format = _ref16.payload;
668
+ return _objectSpread(_objectSpread({}, state), {}, {
669
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, {
670
+ // @ts-expect-error
671
+ format: format
672
+ })
673
+ });
674
+ };
675
+
676
+ /**
677
+ * Set the export html map mode
678
+ * @param state - `uiState`
679
+ * @param action
680
+ * @param action.payload to be set (available modes: EXPORT_HTML_MAP_MODES)
681
+ * @return nextState
682
+ */
683
+ var setExportMapHTMLModeUpdater = exports.setExportMapHTMLModeUpdater = function setExportMapHTMLModeUpdater(state, _ref17) {
684
+ var mode = _ref17.payload;
685
+ return _objectSpread(_objectSpread({}, state), {}, {
686
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.HTML]), {}, {
687
+ mode: mode
688
+ })))
689
+ });
690
+ };
691
+
692
+ /**
693
+ * Adds a new notification.
694
+ * Updates a notification in case of matching ids.
695
+ * @memberof uiStateUpdaters
696
+ * @param state `uiState`
697
+ * @param action
698
+ * @param action.payload Params of a notification
699
+ * @returns nextState
700
+ * @public
701
+ */
702
+ var addNotificationUpdater = exports.addNotificationUpdater = function addNotificationUpdater(state, _ref18) {
703
+ var payload = _ref18.payload;
704
+ var oldNotifications = state.notifications || [];
705
+ // @ts-expect-error
706
+ var payloadId = payload === null || payload === void 0 ? void 0 : payload.id;
707
+ var notificationToUpdate = payloadId ? oldNotifications.find(function (n) {
708
+ return n.id === payloadId;
709
+ }) : null;
710
+ var notifications;
711
+ if (notificationToUpdate) {
712
+ notifications = oldNotifications.map(function (n) {
713
+ return n.id === payloadId ? (0, _utils.createNotification)(_objectSpread(_objectSpread({}, payload), {}, {
714
+ count: n.count + 1
715
+ })) : n;
716
+ });
717
+ } else {
718
+ notifications = [].concat((0, _toConsumableArray2["default"])(oldNotifications), [(0, _utils.createNotification)(payload)]);
719
+ }
720
+ return _objectSpread(_objectSpread({}, state), {}, {
721
+ notifications: notifications
722
+ });
723
+ };
724
+
725
+ /**
726
+ * Remove a notification
727
+ * @memberof uiStateUpdaters
728
+ * @param state `uiState`
729
+ * @param action
730
+ * @param action.payload id of the notification to be removed
731
+ * @returns nextState
732
+ * @public
733
+ */
734
+ var removeNotificationUpdater = exports.removeNotificationUpdater = function removeNotificationUpdater(state, _ref19) {
735
+ var id = _ref19.payload;
736
+ return _objectSpread(_objectSpread({}, state), {}, {
737
+ notifications: state.notifications.filter(function (n) {
738
+ return n.id !== id;
739
+ })
740
+ });
741
+ };
742
+
743
+ /**
744
+ * Fired when file loading begin
745
+ * @memberof uiStateUpdaters
746
+ * @param state `uiState`
747
+ * @returns nextState
748
+ * @public
749
+ */
750
+ var loadFilesUpdater = exports.loadFilesUpdater = function loadFilesUpdater(state) {
751
+ return _objectSpread(_objectSpread({}, state), {}, {
752
+ loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
753
+ fileLoading: true
754
+ })
755
+ });
756
+ };
757
+
758
+ /**
759
+ * Handles loading file success and set fileLoading property to false
760
+ * @memberof uiStateUpdaters
761
+ * @param state `uiState`
762
+ * @returns nextState
763
+ */
764
+ var loadFilesSuccessUpdater = exports.loadFilesSuccessUpdater = function loadFilesSuccessUpdater(state) {
765
+ return _objectSpread(_objectSpread({}, state), {}, {
766
+ loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
767
+ fileLoading: false
768
+ })
769
+ });
770
+ };
771
+
772
+ /**
773
+ * Handles load file error and set fileLoading property to false
774
+ * @memberof uiStateUpdaters
775
+ * @param state
776
+ * @param action
777
+ * @param action.error
778
+ * @returns nextState
779
+ * @public
780
+ */
781
+ var loadFilesErrUpdater = exports.loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref20) {
782
+ var error = _ref20.error;
783
+ return addNotificationUpdater(_objectSpread(_objectSpread({}, state), {}, {
784
+ loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
785
+ fileLoading: false
786
+ })
787
+ }), {
788
+ payload: (0, _utils.errorNotification)({
789
+ message: (error || {}).message || 'Failed to upload files',
790
+ topic: _constants.DEFAULT_NOTIFICATION_TOPICS.global
791
+ })
792
+ });
793
+ };
794
+
795
+ /**
796
+ * Handles toggle map split and reset all map control index to 0
797
+ * @memberof uiStateUpdaters
798
+ * @param state
799
+ * @returns nextState
800
+ * @public
801
+ */
802
+ var toggleSplitMapUpdater = exports.toggleSplitMapUpdater = function toggleSplitMapUpdater(state) {
803
+ return _objectSpread(_objectSpread({}, state), {}, {
804
+ mapControls: Object.entries(state.mapControls).reduce(function (acc, entry) {
805
+ return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, entry[0], _objectSpread(_objectSpread({}, entry[1]), {}, {
806
+ activeMapIndex: 0
807
+ })));
808
+ }, {})
809
+ });
810
+ };
811
+
812
+ /**
813
+ * Toggle modal data
814
+ * @memberof uiStateUpdaters
815
+ * @param state
816
+ * @returns nextState
817
+ * @public
818
+ */
819
+ var showDatasetTableUpdater = exports.showDatasetTableUpdater = function showDatasetTableUpdater(state) {
820
+ return toggleModalUpdater(state, {
821
+ payload: _constants.DATA_TABLE_ID
822
+ });
823
+ };
824
+
825
+ /**
826
+ * Set the locale of the UI
827
+ * @memberof uiStateUpdaters
828
+ * @param state `uiState`
829
+ * @param action
830
+ * @param action.payload
831
+ * @param action.payload.locale locale
832
+ * @returns nextState
833
+ * @public
834
+ */
835
+ var setLocaleUpdater = exports.setLocaleUpdater = function setLocaleUpdater(state, _ref21) {
836
+ var locale = _ref21.payload.locale;
837
+ return _objectSpread(_objectSpread({}, state), {}, {
838
+ locale: locale
839
+ });
840
+ };
841
+
842
+ /**
843
+ * Set the theme of the UI
844
+ * @memberof uiStateUpdaters
845
+ * @param state `uiState`
846
+ * @param action
847
+ * @param action.payload
848
+ * @param action.payload.theme theme
849
+ * @returns nextState
850
+ * @public
851
+ */
852
+ var setThemeUpdater = exports.setThemeUpdater = function setThemeUpdater(state, _ref22) {
853
+ var theme = _ref22.payload.theme;
854
+ return _objectSpread(_objectSpread({}, state), {}, {
855
+ theme: theme
856
+ });
857
+ };
858
+
859
+ /**
860
+ * Toggle layer panel list view
861
+ * @memberof uiStateUpdaters
862
+ * @param state `uiState`
863
+ * @param action
864
+ * @param action.payload layer panel listView value. Can be 'list' or 'sortByDataset'
865
+ * @returns nextState
866
+ * @public
867
+ */
868
+ var togglePanelListViewUpdater = exports.togglePanelListViewUpdater = function togglePanelListViewUpdater(state, _ref23) {
869
+ var _ref23$payload = _ref23.payload,
870
+ panelId = _ref23$payload.panelId,
871
+ listView = _ref23$payload.listView;
872
+ var stateProp = panelId === 'layer' ? 'layerPanelListView' : panelId === 'filter' ? 'filterPanelListView' : null;
873
+ if (!stateProp || state[stateProp] === listView) {
874
+ return state;
875
+ }
876
+ return _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, stateProp, listView));
877
+ };
878
+
879
+ /**
880
+ * Merge received ui state config when loading a saved map
881
+ * @memberof uiStateUpdaters
882
+ * @param state `uiState`
883
+ * @param action
884
+ * @param action.payload saved map config `{mapStyle, visState, mapState, uiState}`
885
+ * @returns nextState
886
+ * @public
887
+ */
888
+ var receiveMapConfigUpdater = exports.receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref24) {
889
+ var _uiState$mapControls, _uiState$mapControls2;
890
+ var config = _ref24.payload.config;
891
+ var _ref25 = config || {},
892
+ uiState = _ref25.uiState;
893
+ if (!uiState) {
894
+ return state;
895
+ }
896
+ var newState = state;
897
+ if ((_uiState$mapControls = uiState.mapControls) !== null && _uiState$mapControls !== void 0 && (_uiState$mapControls = _uiState$mapControls.mapLegend) !== null && _uiState$mapControls !== void 0 && _uiState$mapControls.active) {
898
+ var currentLegend = newState.mapControls.mapLegend;
899
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
900
+ mapControls: _objectSpread(_objectSpread({}, newState.mapControls), {}, {
901
+ mapLegend: _objectSpread(_objectSpread({
902
+ show: true
903
+ }, currentLegend), {}, {
904
+ active: true,
905
+ activeMapIndex: 0
906
+ })
907
+ })
908
+ });
909
+ }
910
+ if ((_uiState$mapControls2 = uiState.mapControls) !== null && _uiState$mapControls2 !== void 0 && (_uiState$mapControls2 = _uiState$mapControls2.mapLegend) !== null && _uiState$mapControls2 !== void 0 && _uiState$mapControls2.settings) {
911
+ newState = setMapControlSettingsUpdater(newState, {
912
+ payload: {
913
+ panelId: 'mapLegend',
914
+ settings: uiState.mapControls.mapLegend.settings
915
+ }
916
+ });
917
+ }
918
+ if (uiState.locale) {
919
+ newState = setLocaleUpdater(newState, {
920
+ payload: {
921
+ locale: uiState.locale
922
+ }
923
+ });
924
+ }
925
+ if (uiState.theme) {
926
+ newState = setThemeUpdater(newState, {
927
+ payload: {
928
+ theme: uiState.theme
929
+ }
930
+ });
931
+ }
932
+ return newState;
933
+ };
934
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9sb2NhbGl6YXRpb24iLCJfdXRpbHMiLCJfY29tcG9zZXJIZWxwZXJzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMIiwiZXhwb3J0cyIsIkRFRkFVTFRfTU9EQUwiLCJBRERfREFUQV9JRCIsInVpU3RhdGVVcGRhdGVycyIsIkRFRkFVTFRfTUFQX0NPTlRST0xTX0ZFQVRVUkVTIiwic2hvdyIsImFjdGl2ZSIsImRpc2FibGVDbG9zZSIsImFjdGl2ZU1hcEluZGV4IiwiREVGQVVMVF9NQVBfTEVHRU5EX0NPTlRST0wiLCJkaXNhYmxlRWRpdCIsIkRFRkFVTFRfTUFQX0NPTlRST0xTIiwiTUFQX0NPTlRST0xTIiwicmVkdWNlIiwiZmluYWwiLCJjdXJyZW50IiwibWFwTGVnZW5kIiwiREVGQVVMVF9FWFBPUlRfSU1BR0UiLCJyYXRpbyIsIkVYUE9SVF9JTUdfUkFUSU9TIiwiU0NSRUVOIiwicmVzb2x1dGlvbiIsIlJFU09MVVRJT05TIiwiT05FX1giLCJsZWdlbmQiLCJtYXBIIiwibWFwVyIsImltYWdlU2l6ZSIsInpvb21PZmZzZXQiLCJzY2FsZSIsImltYWdlVyIsImltYWdlSCIsImNlbnRlciIsImltYWdlRGF0YVVyaSIsImV4cG9ydGluZyIsInByb2Nlc3NpbmciLCJlcnJvciIsImVzY2FwZVhodG1sRm9yV2VicGFjayIsImdldEFwcGxpY2F0aW9uQ29uZmlnIiwiREVGQVVMVF9MT0FEX0ZJTEVTIiwiZmlsZUxvYWRpbmciLCJERUZBVUxUX0VYUE9SVF9EQVRBIiwic2VsZWN0ZWREYXRhc2V0IiwiZGF0YVR5cGUiLCJFWFBPUlRfREFUQV9UWVBFIiwiQ1NWIiwiZmlsdGVyZWQiLCJERUZBVUxUX05PVElGSUNBVElPTlMiLCJERUZBVUxUX0VYUE9SVF9IVE1MIiwiZXhwb3J0TWFwYm94QWNjZXNzVG9rZW4iLCJ1c2VyTWFwYm94VG9rZW4iLCJtb2RlIiwiRVhQT1JUX0hUTUxfTUFQX01PREVTIiwiUkVBRCIsIkRFRkFVTFRfRVhQT1JUX0pTT04iLCJoYXNEYXRhIiwiREVGQVVMVF9FWFBPUlRfTUFQIiwiRVhQT1JUX01BUF9GT1JNQVRTIiwiSFRNTCIsIkpTT04iLCJERUZBVUxUX0VYUE9SVF9WSURFTyIsIm1lZGlhVHlwZSIsImNhbWVyYVByZXNldCIsImZpbGVOYW1lIiwiZHVyYXRpb25NcyIsInN3aXBlU3RhcnRQY3QiLCJzd2lwZUVuZFBjdCIsInN3aXBlRWFzaW5nIiwiSU5JVElBTF9VSV9TVEFURSIsInJlYWRPbmx5IiwiYWN0aXZlU2lkZVBhbmVsIiwiY3VycmVudE1vZGFsIiwiZGF0YXNldEtleVRvUmVtb3ZlIiwidmlzaWJsZURyb3Bkb3duIiwiZXhwb3J0SW1hZ2UiLCJleHBvcnREYXRhIiwiZXhwb3J0TWFwIiwiZXhwb3J0VmlkZW8iLCJtYXBDb250cm9scyIsIm5vdGlmaWNhdGlvbnMiLCJsb2FkRmlsZXMiLCJsb2NhbGUiLCJMT0NBTEVfQ09ERVMiLCJlbiIsInRoZW1lIiwiVEhFTUUiLCJkYXJrIiwibGF5ZXJQYW5lbExpc3RWaWV3IiwiZmlsdGVyUGFuZWxMaXN0VmlldyIsImlzU2lkZVBhbmVsQ2xvc2VCdXR0b25WaXNpYmxlIiwiaW5pdFVpU3RhdGVVcGRhdGVyIiwic3RhdGUiLCJhY3Rpb24iLCJwYXlsb2FkIiwiaW5pdGlhbFVpU3RhdGUiLCJ0b2dnbGVTaWRlUGFuZWxVcGRhdGVyIiwiX3JlZiIsImlkIiwidG9nZ2xlTW9kYWxVcGRhdGVyIiwiX3JlZjIiLCJzaG93RXhwb3J0RHJvcGRvd25VcGRhdGVyIiwiX3JlZjMiLCJoaWRlRXhwb3J0RHJvcGRvd25VcGRhdGVyIiwidG9nZ2xlU2lkZVBhbmVsQ2xvc2VCdXR0b25VcGRhdGVyIiwiX3JlZjQiLCJNVVRVQUxMWV9FWENMVVNJVkVfTUFQX0NPTlRST0xTIiwic3BsaXRNYXAiLCJ0b2dnbGUzZCIsIm1hcERyYXciLCJtYXBMb2NhbGUiLCJ0b2dnbGVNYXBDb250cm9sVXBkYXRlciIsIl9yZWY1IiwiX3N0YXRlJG1hcENvbnRyb2xzJHBhIiwiX3VwZGF0ZWRTdGF0ZSRtYXBDb250IiwiX3JlZjUkcGF5bG9hZCIsInBhbmVsSWQiLCJfcmVmNSRwYXlsb2FkJGluZGV4IiwiaW5kZXgiLCJ1cGRhdGVkU3RhdGUiLCJwYW5lbFRvRGVhY3RpdmF0ZSIsImVmZmVjdCIsImFpQXNzaXN0YW50IiwiaXNPcGVuaW5nIiwiaW5jbHVkZXMiLCJuZXh0TWFwQ29udHJvbHMiLCJkaWREZWFjdGl2YXRlIiwiY29udHJvbElkIiwiX25leHRNYXBDb250cm9scyRjb250Iiwic2V0TWFwQ29udHJvbFZpc2liaWxpdHlVcGRhdGVyIiwiX3JlZjYiLCJfc3RhdGUkbWFwQ29udHJvbHMiLCJfcmVmNiRwYXlsb2FkIiwiQm9vbGVhbiIsInNldE1hcENvbnRyb2xTZXR0aW5nc1VwZGF0ZXIiLCJfcmVmNyIsIl9zdGF0ZSRtYXBDb250cm9sczIiLCJfcmVmNyRwYXlsb2FkIiwic2V0dGluZ3MiLCJtYXBDb250cm9sIiwib3BlbkRlbGV0ZU1vZGFsVXBkYXRlciIsIl9yZWY4IiwiREVMRVRFX0RBVEFfSUQiLCJzZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyIiwiX3JlZjkiLCJuZXdTZXR0aW5nIiwidXBkYXRlZCIsImNhbGN1bGF0ZUV4cG9ydEltYWdlU2l6ZSIsInNldEV4cG9ydEltYWdlRGF0YVVyaVVwZGF0ZXIiLCJfcmVmMCIsImRhdGFVcmkiLCJzZXRFeHBvcnRJbWFnZUVycm9yVXBkYXRlciIsIl9yZWYxIiwiY2xlYW51cEV4cG9ydEltYWdlVXBkYXRlciIsInNldEV4cG9ydFZpZGVvU2V0dGluZ1VwZGF0ZXIiLCJfcmVmMTAiLCJzdGFydEV4cG9ydGluZ0ltYWdlVXBkYXRlciIsIl9yZWYxMSIsIl9yZWYxMSRwYXlsb2FkIiwib3B0aW9ucyIsImltYWdlU2V0dGluZ3MiLCJjb21wb3NlXyIsImFwcGx5XyIsInBheWxvYWRfIiwic2V0RXhwb3J0U2VsZWN0ZWREYXRhc2V0VXBkYXRlciIsIl9yZWYxMiIsImRhdGFzZXQiLCJzZXRFeHBvcnREYXRhVHlwZVVwZGF0ZXIiLCJfcmVmMTMiLCJzZXRFeHBvcnRGaWx0ZXJlZFVwZGF0ZXIiLCJfcmVmMTQiLCJzZXRFeHBvcnREYXRhVXBkYXRlciIsInNldFVzZXJNYXBib3hBY2Nlc3NUb2tlblVwZGF0ZXIiLCJfcmVmMTUiLCJzZXRFeHBvcnRNYXBGb3JtYXRVcGRhdGVyIiwiX3JlZjE2IiwiZm9ybWF0Iiwic2V0RXhwb3J0TWFwSFRNTE1vZGVVcGRhdGVyIiwiX3JlZjE3IiwiYWRkTm90aWZpY2F0aW9uVXBkYXRlciIsIl9yZWYxOCIsIm9sZE5vdGlmaWNhdGlvbnMiLCJwYXlsb2FkSWQiLCJub3RpZmljYXRpb25Ub1VwZGF0ZSIsImZpbmQiLCJuIiwibWFwIiwiY3JlYXRlTm90aWZpY2F0aW9uIiwiY291bnQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwicmVtb3ZlTm90aWZpY2F0aW9uVXBkYXRlciIsIl9yZWYxOSIsImxvYWRGaWxlc1VwZGF0ZXIiLCJsb2FkRmlsZXNTdWNjZXNzVXBkYXRlciIsImxvYWRGaWxlc0VyclVwZGF0ZXIiLCJfcmVmMjAiLCJlcnJvck5vdGlmaWNhdGlvbiIsIm1lc3NhZ2UiLCJ0b3BpYyIsIkRFRkFVTFRfTk9USUZJQ0FUSU9OX1RPUElDUyIsImdsb2JhbCIsInRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsImVudHJpZXMiLCJhY2MiLCJlbnRyeSIsInNob3dEYXRhc2V0VGFibGVVcGRhdGVyIiwiREFUQV9UQUJMRV9JRCIsInNldExvY2FsZVVwZGF0ZXIiLCJfcmVmMjEiLCJzZXRUaGVtZVVwZGF0ZXIiLCJfcmVmMjIiLCJ0b2dnbGVQYW5lbExpc3RWaWV3VXBkYXRlciIsIl9yZWYyMyIsIl9yZWYyMyRwYXlsb2FkIiwibGlzdFZpZXciLCJzdGF0ZVByb3AiLCJyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsIl9yZWYyNCIsIl91aVN0YXRlJG1hcENvbnRyb2xzIiwiX3VpU3RhdGUkbWFwQ29udHJvbHMyIiwiY29uZmlnIiwiX3JlZjI1IiwidWlTdGF0ZSIsIm5ld1N0YXRlIiwiY3VycmVudExlZ2VuZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS1zdGF0ZS11cGRhdGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge1xuICBBRERfREFUQV9JRCxcbiAgREFUQV9UQUJMRV9JRCxcbiAgREVGQVVMVF9OT1RJRklDQVRJT05fVE9QSUNTLFxuICBERUxFVEVfREFUQV9JRCxcbiAgRVhQT1JUX0RBVEFfVFlQRSxcbiAgRVhQT1JUX0hUTUxfTUFQX01PREVTLFxuICBFWFBPUlRfSU1HX1JBVElPUyxcbiAgRVhQT1JUX01BUF9GT1JNQVRTLFxuICBSRVNPTFVUSU9OUyxcbiAgTUFQX0NPTlRST0xTLFxuICBUSEVNRVxufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge0xPQ0FMRV9DT0RFU30gZnJvbSAnQGtlcGxlci5nbC9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHtcbiAgY3JlYXRlTm90aWZpY2F0aW9uLFxuICBlcnJvck5vdGlmaWNhdGlvbixcbiAgY2FsY3VsYXRlRXhwb3J0SW1hZ2VTaXplLFxuICBnZXRBcHBsaWNhdGlvbkNvbmZpZ1xufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7cGF5bG9hZF8sIGFwcGx5XywgY29tcG9zZV99IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5cbmltcG9ydCB7XG4gIEFjdGlvblR5cGVzLFxuICBLZXBsZXJHbEluaXRQYXlsb2FkLFxuICBMb2FkRmlsZXNFcnJVcGRhdGVyQWN0aW9uLFxuICBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZCxcbiAgVUlTdGF0ZUFjdGlvbnNcbn0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB7XG4gIEV4cG9ydERhdGEsXG4gIEV4cG9ydEh0bWwsXG4gIEV4cG9ydEpzb24sXG4gIEV4cG9ydE1hcCxcbiAgRXhwb3J0SW1hZ2UsXG4gIEV4cG9ydFZpZGVvLFxuICBNYXBDb250cm9sSXRlbSxcbiAgTWFwQ29udHJvbHMsXG4gIFVpU3RhdGVcbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMID0gJ2xheWVyJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREFMID0gQUREX0RBVEFfSUQ7XG5cbi8qKlxuICogVXBkYXRlcnMgZm9yIGB1aVN0YXRlYCByZWR1Y2VyLiBDYW4gYmUgdXNlZCBpbiB5b3VyIHJvb3QgcmVkdWNlciB0byBkaXJlY3RseSBtb2RpZnkga2VwbGVyLmdsJ3Mgc3RhdGUuXG4gKiBSZWFkIG1vcmUgYWJvdXQgW1VzaW5nIHVwZGF0ZXJzXSguLi9hZHZhbmNlZC11c2FnZS91c2luZy11cGRhdGVycy5tZClcbiAqXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBrZXBsZXJHbFJlZHVjZXIsIHt1aVN0YXRlVXBkYXRlcnN9IGZyb20gJ0BrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuICogLy8gUm9vdCBSZWR1Y2VyXG4gKiBjb25zdCByZWR1Y2VycyA9IGNvbWJpbmVSZWR1Y2Vycyh7XG4gKiAga2VwbGVyR2w6IGtlcGxlckdsUmVkdWNlcixcbiAqICBhcHA6IGFwcFJlZHVjZXJcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGNvbXBvc2VkUmVkdWNlciA9IChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gKiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICogICAgLy8gY2xpY2sgYnV0dG9uIHRvIGNsb3NlIHNpZGUgcGFuZWxcbiAqICAgIGNhc2UgJ0NMSUNLX0JVVFRPTic6XG4gKiAgICAgIHJldHVybiB7XG4gKiAgICAgICAgLi4uc3RhdGUsXG4gKiAgICAgICAga2VwbGVyR2w6IHtcbiAqICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLFxuICogICAgICAgICAgZm9vOiB7XG4gKiAgICAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbC5mb28sXG4gKiAgICAgICAgICAgICB1aVN0YXRlOiB1aVN0YXRlVXBkYXRlcnMudG9nZ2xlU2lkZVBhbmVsVXBkYXRlcihcbiAqICAgICAgICAgICAgICAgdWlTdGF0ZSwge3BheWxvYWQ6IG51bGx9XG4gKiAgICAgICAgICAgICApXG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgfVxuICogICAgICB9O1xuICogIH1cbiAqICByZXR1cm4gcmVkdWNlcnMoc3RhdGUsIGFjdGlvbik7XG4gKiB9O1xuICpcbiAqIGV4cG9ydCBkZWZhdWx0IGNvbXBvc2VkUmVkdWNlcjtcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCB1aVN0YXRlVXBkYXRlcnMgPSBudWxsO1xuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cblxuY29uc3QgREVGQVVMVF9NQVBfQ09OVFJPTFNfRkVBVFVSRVM6IE1hcENvbnRyb2xJdGVtID0ge1xuICBzaG93OiB0cnVlLFxuICBhY3RpdmU6IGZhbHNlLFxuICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxuICAvLyBkZWZpbmVzIHdoaWNoIG1hcCBpbmRleCB1c2VycyBhcmUgaW50ZXJhY3Rpbmcgd2l0aCAodGhyb3VnaCBtYXAgY29udHJvbHMpXG4gIGFjdGl2ZU1hcEluZGV4OiAwXG59O1xuXG5jb25zdCBERUZBVUxUX01BUF9MRUdFTkRfQ09OVFJPTCA9IHtcbiAgLi4uREVGQVVMVF9NQVBfQ09OVFJPTFNfRkVBVFVSRVMsXG4gIGRpc2FibGVFZGl0OiBmYWxzZVxufTtcbi8qKlxuICogQSBsaXN0IG9mIG1hcCBjb250cm9sIHZpc2liaWxpdHkgYW5kIHdoZXRoZXIgaXMgaXQgYWN0aXZlLlxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgdmlzaWJsZUxheWVycyBEZWZhdWx0OiBge3Nob3c6IHRydWUsIGFjdGl2ZTogZmFsc2V9YFxuICogQHByb3BlcnR5IG1hcExlZ2VuZCBEZWZhdWx0OiBge3Nob3c6IHRydWUsIGFjdGl2ZTogZmFsc2V9YFxuICogQHByb3BlcnR5IHRvZ2dsZTNkIERlZmF1bHQ6IGB7c2hvdzogdHJ1ZX1gXG4gKiBAcHJvcGVydHkgc3BsaXRNYXAgRGVmYXVsdDogYHtzaG93OiB0cnVlfWBcbiAqIEBwcm9wZXJ0eSBtYXBEcmF3IERlZmF1bHQ6IGB7c2hvdzogdHJ1ZSwgYWN0aXZlOiBmYWxzZX1gXG4gKiBAcHJvcGVydHkgbWFwTG9jYWxlIERlZmF1bHQ6IGB7c2hvdzogdHJ1ZSwgYWN0aXZlOiBmYWxzZX1gXG4gKiBAcHJvcGVydHkgbWFwVGhlbWUgRGVmYXVsdDogYHtzaG93OiB0cnVlLCBhY3RpdmU6IGZhbHNlfWBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFQX0NPTlRST0xTOiBNYXBDb250cm9scyA9IChcbiAgT2JqZWN0LmtleXMoTUFQX0NPTlRST0xTKSBhcyBBcnJheTxrZXlvZiB0eXBlb2YgTUFQX0NPTlRST0xTPlxuKS5yZWR1Y2UoXG4gIChmaW5hbCwgY3VycmVudCkgPT4gKHtcbiAgICAuLi5maW5hbCxcbiAgICBbY3VycmVudF06XG4gICAgICBjdXJyZW50ID09PSBNQVBfQ09OVFJPTFMubWFwTGVnZW5kXG4gICAgICAgID8gREVGQVVMVF9NQVBfTEVHRU5EX0NPTlRST0xcbiAgICAgICAgOiBERUZBVUxUX01BUF9DT05UUk9MU19GRUFUVVJFU1xuICB9KSxcbiAge30gYXMgTWFwQ29udHJvbHNcbik7XG5cbi8qKlxuICogRGVmYXVsdCBpbWFnZSBleHBvcnQgY29uZmlnXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSByYXRpbyBEZWZhdWx0OiBgJ1NDUkVFTidgLFxuICogQHByb3BlcnR5IHJlc29sdXRpb24gRGVmYXVsdDogYCdPTkVfWCdgLFxuICogQHByb3BlcnR5IGxlZ2VuZCBEZWZhdWx0OiBgZmFsc2VgLFxuICogQHByb3BlcnR5IG1hcEggRGVmYXVsdDogMCxcbiAqIEBwcm9wZXJ0eSBtYXBXIERlZmF1bHQ6IDAsXG4gKiBAcHJvcGVydHkgaW1hZ2VTaXplIERlZmF1bHQ6IHt6b29tT2Zmc2V0OiAwLCBzY2FsZTogMSwgaW1hZ2VXOiAwLCBpbWFnZUg6IDB9LFxuICogQHByb3BlcnR5IGltYWdlRGF0YVVyaSBEZWZhdWx0OiBgJydgLFxuICogQHByb3BlcnR5IGV4cG9ydGluZyBEZWZhdWx0OiBgZmFsc2VgXG4gKiBAcHJvcGVydHkgZXJyb3IgRGVmYXVsdDogYGZhbHNlYFxuICogQHByb3BlcnR5IGVzY2FwZVhodG1sRm9yV2VicGFjayBEZWZhdWx0OiBmcm9tIGFwcGxpY2F0aW9uIGNvbmZpZyAoYXV0by1kZXRlY3RlZDogYHRydWVgIGZvciB3ZWJwYWNrKVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfSU1BR0U6IEV4cG9ydEltYWdlID0ge1xuICAvLyB1c2VyIG9wdGlvbnNcbiAgcmF0aW86IEVYUE9SVF9JTUdfUkFUSU9TLlNDUkVFTixcbiAgcmVzb2x1dGlvbjogUkVTT0xVVElPTlMuT05FX1gsXG4gIGxlZ2VuZDogZmFsc2UsXG4gIG1hcEg6IDAsXG4gIG1hcFc6IDAsXG4gIGltYWdlU2l6ZToge1xuICAgIHpvb21PZmZzZXQ6IDAsXG4gICAgc2NhbGU6IDEsXG4gICAgaW1hZ2VXOiAwLFxuICAgIGltYWdlSDogMFxuICB9LFxuICAvLyB3aGVuIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZSBtb2NrIG1hcCB2aWV3cG9ydCB3aWxsIG1vdmUgdG8gdGhlIGNlbnRlciBvZiBkYXRhXG4gIGNlbnRlcjogZmFsc2UsXG4gIC8vIGV4cG9ydGluZyBzdGF0ZVxuICBpbWFnZURhdGFVcmk6ICcnLFxuICAvLyBleHBvcnRpbmc6IHVzZWQgdG8gYXR0YWNoIHBsb3QtY29udGFpbmVyIHRvIGRvbVxuICBleHBvcnRpbmc6IGZhbHNlLFxuICAvLyBwcm9jZXNzaW5nOiB1c2VkIGFzIGxvYWRpbmcgaW5kaWNhdG9yIHdoZW4gZXhwb3J0IGltYWdlIGlzIGJlaW5nIHByb2R1Y2VkXG4gIHByb2Nlc3Npbmc6IGZhbHNlLFxuICBlcnJvcjogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gYXBwbHkgZml4IGZvciB1Z2xpZnkgZXJyb3IgaW4gZG9tLXRvLWltYWdlIChmcm9tIGFwcGxpY2F0aW9uIGNvbmZpZywgYXV0by1kZXRlY3RzIGJ1aWxkIHRvb2wpXG4gIGVzY2FwZVhodG1sRm9yV2VicGFjazogZ2V0QXBwbGljYXRpb25Db25maWcoKS5lc2NhcGVYaHRtbEZvcldlYnBhY2tcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xPQURfRklMRVMgPSB7XG4gIGZpbGVMb2FkaW5nOiBmYWxzZVxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYGV4cG9ydERhdGFgIHNldHRpbmdzXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBzZWxlY3RlZERhdGFzZXQgRGVmYXVsdDogYCcnYCxcbiAqIEBwcm9wZXJ0eSBkYXRhVHlwZSBEZWZhdWx0OiBgJ2NzdidgLFxuICogQHByb3BlcnR5IGZpbHRlcmVkIERlZmF1bHQ6IGB0cnVlYCxcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhQT1JUX0RBVEE6IEV4cG9ydERhdGEgPSB7XG4gIHNlbGVjdGVkRGF0YXNldDogJycsXG4gIGRhdGFUeXBlOiBFWFBPUlRfREFUQV9UWVBFLkNTVixcbiAgZmlsdGVyZWQ6IHRydWVcbn07XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PVElGSUNBVElPTlMgPSBbXTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBleHBvcnRNYXBib3hBY2Nlc3NUb2tlbiAtIERlZmF1bHQ6IG51bGwsIHRoaXMgaXMgdXNlZCB3aGVuIHdlIHByb3ZpZGUgYSBkZWZhdWx0IG1hcGJveCB0b2tlbiBmb3IgdXNlcnMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2ZcbiAqIEBwcm9wZXJ0eSB1c2VyTWFwYm94VG9rZW4gLSBEZWZhdWx0OiAnJywgbWFwYm94IHRva2VuIHByb3ZpZGVkIGJ5IHVzZXIgdGhyb3VnaCBpbnB1dCBmaWVsZFxuICogQHByb3BlcnR5IG1vZGUgLSBEZWZhdWx0OiAnUkVBRCcsIHJlYWQgb25seSBvciBlZGl0YWJsZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfSFRNTDogRXhwb3J0SHRtbCA9IHtcbiAgZXhwb3J0TWFwYm94QWNjZXNzVG9rZW46IG51bGwsXG4gIHVzZXJNYXBib3hUb2tlbjogJycsXG4gIG1vZGU6IEVYUE9SVF9IVE1MX01BUF9NT0RFUy5SRUFEXG59O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IGhhc0RhdGEgLSBEZWZhdWx0OiAndHJ1ZScsXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9KU09OOiBFeHBvcnRKc29uID0ge1xuICBoYXNEYXRhOiB0cnVlXG59O1xuXG4vKipcbiAqIEV4cG9ydCBNYXAgQ29uZmlnXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBIVE1MIC0gRGVmYXVsdDogJ0RFRkFVTFRfRVhQT1JUX0hUTUwnLFxuICogQHByb3BlcnR5IEpTT04gLSBEZWZhdWx0OiAnREVGQVVMVF9FWFBPUlRfSlNPTicsXG4gKiBAcHJvcGVydHkgZm9ybWF0IC0gRGVmYXVsdDogJ0hUTUwnLFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfTUFQOiBFeHBvcnRNYXAgPSB7XG4gIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTF06IERFRkFVTFRfRVhQT1JUX0hUTUwsXG4gIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSlNPTl06IERFRkFVTFRfRVhQT1JUX0pTT04sXG4gIGZvcm1hdDogRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxcbn07XG5cbi8qKlxuICogRGVmYXVsdCBpbml0aWFsIGBleHBvcnRWaWRlb2Agc2V0dGluZ3NcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IG1lZGlhVHlwZSBEZWZhdWx0OiBgJ3dlYm0nYFxuICogQHByb3BlcnR5IGNhbWVyYVByZXNldCBEZWZhdWx0OiBgJ05vbmUnYFxuICogQHByb3BlcnR5IGZpbGVOYW1lIERlZmF1bHQ6IGAna2VwbGVyLmdsJ2BcbiAqIEBwcm9wZXJ0eSByZXNvbHV0aW9uIERlZmF1bHQ6IGAnMTI4MHg3MjAnYFxuICogQHByb3BlcnR5IGR1cmF0aW9uTXMgRGVmYXVsdDogYDEwMDBgXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9WSURFTzogRXhwb3J0VmlkZW8gPSB7XG4gIG1lZGlhVHlwZTogJ3dlYm0nLCAvLyB1c2Ugd2VibSBhcyBkZWZhdWx0IGFzIGdpZiBleHBvcnQgdGVuZHMgdG8gZnJlZXplIG9uIGxhcmdlciByZWNvcmRpbmdzXG4gIGNhbWVyYVByZXNldDogJ05vbmUnLFxuICBmaWxlTmFtZTogJ2tlcGxlci5nbCcsXG4gIHJlc29sdXRpb246ICcxMjgweDcyMCcsXG4gIGR1cmF0aW9uTXM6IDEwMDAsXG4gIHN3aXBlU3RhcnRQY3Q6IDAsXG4gIHN3aXBlRW5kUGN0OiAxMDAsXG4gIHN3aXBlRWFzaW5nOiAnZWFzZS1pbi1vdXQnXG59O1xuXG4vKipcbiAqIERlZmF1bHQgaW5pdGlhbCBgdWlTdGF0ZWBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHJlYWRPbmx5IERlZmF1bHQ6IGBmYWxzZWBcbiAqIEBwcm9wZXJ0eSBhY3RpdmVTaWRlUGFuZWwgRGVmYXVsdDogYCdsYXllcidgXG4gKiBAcHJvcGVydHkgY3VycmVudE1vZGFsIERlZmF1bHQ6IGAnYWRkRGF0YSdgXG4gKiBAcHJvcGVydHkgZGF0YXNldEtleVRvUmVtb3ZlIERlZmF1bHQ6IGBudWxsYFxuICogQHByb3BlcnR5IHZpc2libGVEcm9wZG93biBEZWZhdWx0OiBgbnVsbGBcbiAqIEBwcm9wZXJ0eSBleHBvcnRJbWFnZSBEZWZhdWx0OiBbYERFRkFVTFRfRVhQT1JUX0lNQUdFYF0oI2RlZmF1bHRfZXhwb3J0X2ltYWdlKVxuICogQHByb3BlcnR5IGV4cG9ydERhdGEgRGVmYXVsdDogW2BERUZBVUxUX0VYUE9SVF9EQVRBYF0oI2RlZmF1bHRfZXhwb3J0X2RhdGEpXG4gKiBAcHJvcGVydHkgZXhwb3J0TWFwIERlZmF1bHQ6IFtgREVGQVVMVF9FWFBPUlRfTUFQYF0oI2RlZmF1bHRfZXhwb3J0X21hcClcbiAqIEBwcm9wZXJ0eSBtYXBDb250cm9scyBEZWZhdWx0OiBbYERFRkFVTFRfTUFQX0NPTlRST0xTYF0oI2RlZmF1bHRfbWFwX2NvbnRyb2xzKVxuICogQHByb3BlcnR5IG5vdGlmaWNhdGlvbnMgRGVmYXVsdDogYFtdYFxuICogQHByb3BlcnR5IG5vdGlmaWNhdGlvbnMgRGVmYXVsdDogYFtdYFxuICogQHByb3BlcnR5IGxvYWRGaWxlc1xuICogQHByb3BlcnR5IGxvY2FsZSBEZWZhdWx0OiBgJ2VuJ2BcbiAqIEBwcm9wZXJ0eSB0aGVtZSBEZWZhdWx0OiBgJ2RhcmsnYFxuICogQHByb3BlcnR5IGlzU2lkZVBhbmVsQ2xvc2VCdXR0b25WaXNpYmxlIERlZmF1bHQ6IGB0cnVlYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSU5JVElBTF9VSV9TVEFURTogVWlTdGF0ZSA9IHtcbiAgcmVhZE9ubHk6IGZhbHNlLFxuICBhY3RpdmVTaWRlUGFuZWw6IERFRkFVTFRfQUNUSVZFX1NJREVfUEFORUwsXG4gIGN1cnJlbnRNb2RhbDogREVGQVVMVF9NT0RBTCxcbiAgZGF0YXNldEtleVRvUmVtb3ZlOiBudWxsLFxuICB2aXNpYmxlRHJvcGRvd246IG51bGwsXG4gIC8vIGV4cG9ydCBpbWFnZSBtb2RhbCB1aVxuICBleHBvcnRJbWFnZTogREVGQVVMVF9FWFBPUlRfSU1BR0UsXG4gIC8vIGV4cG9ydCBkYXRhIG1vZGFsIHVpXG4gIGV4cG9ydERhdGE6IERFRkFVTFRfRVhQT1JUX0RBVEEsXG4gIC8vIGh0bWwgZXhwb3J0XG4gIGV4cG9ydE1hcDogREVGQVVMVF9FWFBPUlRfTUFQLFxuICAvLyBleHBvcnQgdmlkZW8gbW9kYWwgdWlcbiAgZXhwb3J0VmlkZW86IERFRkFVTFRfRVhQT1JUX1ZJREVPLFxuICAvLyBtYXAgY29udHJvbCBwYW5lbHNcbiAgbWFwQ29udHJvbHM6IERFRkFVTFRfTUFQX0NPTlRST0xTLFxuICAvLyB1aSBub3RpZmljYXRpb25zXG4gIG5vdGlmaWNhdGlvbnM6IERFRkFVTFRfTk9USUZJQ0FUSU9OUyxcbiAgLy8gbG9hZCBmaWxlc1xuICBsb2FkRmlsZXM6IERFRkFVTFRfTE9BRF9GSUxFUyxcbiAgLy8gTG9jYWxlIG9mIHRoZSBVSVxuICBsb2NhbGU6IExPQ0FMRV9DT0RFUy5lbixcbiAgLy8gVGhlbWUgb2YgdGhlIFVJICh1c2VkIHdoZW4gZW5hYmxlVGhlbWVUb2dnbGUgaXMgb24pXG4gIHRoZW1lOiBUSEVNRS5kYXJrLFxuICBsYXllclBhbmVsTGlzdFZpZXc6ICdsaXN0JyxcbiAgZmlsdGVyUGFuZWxMaXN0VmlldzogJ2xpc3QnLFxuICBpc1NpZGVQYW5lbENsb3NlQnV0dG9uVmlzaWJsZTogdHJ1ZVxufTtcblxuLyogVXBkYXRlcnMgKi9cbi8qKlxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3QgaW5pdFVpU3RhdGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAgYWN0aW9uOiB7XG4gICAgdHlwZT86ICh0eXBlb2YgQWN0aW9uVHlwZXMpWydJTklUJ107XG4gICAgcGF5bG9hZDogS2VwbGVyR2xJbml0UGF5bG9hZDtcbiAgfVxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgLi4uKGFjdGlvbi5wYXlsb2FkIHx8IHt9KS5pbml0aWFsVWlTdGF0ZVxufSk7XG5cbi8qKlxuICogVG9nZ2xlIGFjdGl2ZSBzaWRlIHBhbmVsXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgaWQgb2Ygc2lkZSBwYW5lbCB0byBiZSBzaG93biwgb25lIG9mIGBsYXllcmAsIGBmaWx0ZXJgLCBgaW50ZXJhY3Rpb25gLCBgbWFwYC4gY2xvc2Ugc2lkZSBwYW5lbCBpZiBgbnVsbGBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlU2lkZVBhbmVsVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBpZH06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZVNpZGVQYW5lbFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICByZXR1cm4gaWQgPT09IHN0YXRlLmFjdGl2ZVNpZGVQYW5lbFxuICAgID8gc3RhdGVcbiAgICA6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGFjdGl2ZVNpZGVQYW5lbDogaWRcbiAgICAgIH07XG59O1xuXG4vKipcbiAqIFNob3cgYW5kIGhpZGUgbW9kYWwgZGlhbG9nXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW1hY3Rpb24ucGF5bG9hZCBpZCBvZiBtb2RhbCB0byBiZSBzaG93biwgbnVsbCB0byBoaWRlIG1vZGFscy4gT25lIG9mOlxuICogIC0gW2BEQVRBX1RBQkxFX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjZGF0YV90YWJsZV9pZClcbiAqICAtIFtgREVMRVRFX0RBVEFfSURgXSguLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5tZCNkZWxldGVfZGF0YV9pZClcbiAqICAtIFtgQUREX0RBVEFfSURgXSguLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5tZCNhZGRfZGF0YV9pZClcbiAqICAtIFtgRVhQT1JUX0lNQUdFX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjZXhwb3J0X2ltYWdlX2lkKVxuICogIC0gW2BFWFBPUlRfREFUQV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2V4cG9ydF9kYXRhX2lkKVxuICogIC0gW2BBRERfTUFQX1NUWUxFX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjYWRkX21hcF9zdHlsZV9pZClcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTW9kYWxVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGlkfTogVUlTdGF0ZUFjdGlvbnMuVG9nZ2xlTW9kYWxVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBjdXJyZW50TW9kYWw6IGlkXG59KTtcblxuLyoqXG4gKiBIaWRlIGFuZCBzaG93IHNpZGUgcGFuZWwgaGVhZGVyIGRyb3Bkb3duLCBhY3RpdmF0ZWQgYnkgY2xpY2tpbmcgdGhlIHNoYXJlIGxpbmsgb24gdG9wIG9mIHRoZSBzaWRlIHBhbmVsXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzaG93RXhwb3J0RHJvcGRvd25VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGlkfTogVUlTdGF0ZUFjdGlvbnMuU2hvd0V4cG9ydERyb3Bkb3duVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgdmlzaWJsZURyb3Bkb3duOiBpZFxufSk7XG5cbi8qKlxuICogSGlkZSBzaWRlIHBhbmVsIGhlYWRlciBkcm9wZG93biwgYWN0aXZhdGVkIGJ5IGNsaWNraW5nIHRoZSBzaGFyZSBsaW5rIG9uIHRvcCBvZiB0aGUgc2lkZSBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgaGlkZUV4cG9ydERyb3Bkb3duVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIHZpc2libGVEcm9wZG93bjogbnVsbFxufSk7XG5cbi8qKlxuICogVG9nZ2xlIHNpZGUgcGFuZWwgY2xvc2UgYnV0dG9uIG9uIHRvcCBsZWZ0IG9mIHRoZSBzaWRlIHBhbmVsXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVTaWRlUGFuZWxDbG9zZUJ1dHRvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge3Nob3d9fTogVUlTdGF0ZUFjdGlvbnMuVG9nZ2xlU2lkZVBhbmVsQ2xvc2VCdXR0b25VcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBpc1NpZGVQYW5lbENsb3NlQnV0dG9uVmlzaWJsZTogc2hvd1xufSk7XG5cbi8vIE1hcCBjb250cm9sIGRyb3Bkb3ducy9tZW51cyB0aGF0IG92ZXJsYXAgZWFjaCBvdGhlciB2aXN1YWxseSBhbmQgdGhlcmVmb3JlXG4vLyBzaG91bGQgYmUgbXV0dWFsbHkgZXhjbHVzaXZlOiBvcGVuaW5nIG9uZSBjbG9zZXMgYWxsIHRoZSBvdGhlcnMuXG4vLyAoc3BsaXQvdmlldy1tb2RlIG1lbnUsIHRvcC8zZC9nbG9iZSBtZW51LCBwb2x5Z29uIGRyYXcgdG9vbCwgbGFuZ3VhZ2UgbWVudSlcbmV4cG9ydCBjb25zdCBNVVRVQUxMWV9FWENMVVNJVkVfTUFQX0NPTlRST0xTOiBzdHJpbmdbXSA9IFtcbiAgTUFQX0NPTlRST0xTLnNwbGl0TWFwLFxuICBNQVBfQ09OVFJPTFMudG9nZ2xlM2QsXG4gIE1BUF9DT05UUk9MUy5tYXBEcmF3LFxuICBNQVBfQ09OVFJPTFMubWFwTG9jYWxlXG5dO1xuXG4vKipcbiAqIFRvZ2dsZSBhY3RpdmUgbWFwIGNvbnRyb2wgcGFuZWxcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgbWFwIGNvbnRyb2wgcGFuZWwgaWQsIG9uZSBvZiB0aGUga2V5cyBvZjogW2BERUZBVUxUX01BUF9DT05UUk9MU2BdKCNkZWZhdWx0X21hcF9jb250cm9scylcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge3BhbmVsSWQsIGluZGV4ID0gMH19OiBVSVN0YXRlQWN0aW9ucy5Ub2dnbGVNYXBDb250cm9sVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGxldCB1cGRhdGVkU3RhdGUgPSBzdGF0ZTtcbiAgLy8gVGhlIGVmZmVjdCBwYW5lbCBhbmQgYWkgYXNzaXN0YW50IHBhbmVsIGNhbiBub3QgYmUgYWN0aXZlIGF0IHRoZSBzYW1lIHRpbWVcbiAgLy8gc28gd2UgbmVlZCB0byBkZWFjdGl2YXRlIHRoZSBvdGhlciBwYW5lbCB3aGVuIG9uZSBpcyBhY3RpdmF0ZWRcbiAgY29uc3QgcGFuZWxUb0RlYWN0aXZhdGUgPVxuICAgIHBhbmVsSWQgPT09IE1BUF9DT05UUk9MUy5lZmZlY3RcbiAgICAgID8gTUFQX0NPTlRST0xTLmFpQXNzaXN0YW50XG4gICAgICA6IHBhbmVsSWQgPT09IE1BUF9DT05UUk9MUy5haUFzc2lzdGFudFxuICAgICAgPyBNQVBfQ09OVFJPTFMuZWZmZWN0XG4gICAgICA6IG51bGw7XG5cbiAgLy8gSWYgd2UgbmVlZCB0byBkZWFjdGl2YXRlIGEgY29tcGV0aW5nIHBhbmVsIGFuZCBpdCdzIGN1cnJlbnRseSBhY3RpdmVcbiAgaWYgKHBhbmVsVG9EZWFjdGl2YXRlICYmIHN0YXRlLm1hcENvbnRyb2xzW3BhbmVsVG9EZWFjdGl2YXRlXT8uYWN0aXZlKSB7XG4gICAgdXBkYXRlZFN0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBtYXBDb250cm9sczoge1xuICAgICAgICAuLi51cGRhdGVkU3RhdGUubWFwQ29udHJvbHMsXG4gICAgICAgIFtwYW5lbFRvRGVhY3RpdmF0ZV06IHtcbiAgICAgICAgICAuLi51cGRhdGVkU3RhdGUubWFwQ29udHJvbHNbcGFuZWxUb0RlYWN0aXZhdGVdLFxuICAgICAgICAgIGFjdGl2ZTogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgb3ZlcmxhcHBpbmcgbWFwIGNvbnRyb2wgbWVudXMgc2hvdWxkIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZTogd2hlbiBvbmUgb2ZcbiAgLy8gdGhlbSBpcyBiZWluZyBvcGVuZWQsIGRlYWN0aXZhdGUgZXZlcnkgb3RoZXIgb25lIHRoYXQgaXMgY3VycmVudGx5IGFjdGl2ZVxuICAvLyBzbyB0aGVpciBkcm9wZG93bnMgbmV2ZXIgb3ZlcmxhcCBvbiBzY3JlZW4uXG4gIGNvbnN0IGlzT3BlbmluZyA9ICF1cGRhdGVkU3RhdGUubWFwQ29udHJvbHNbcGFuZWxJZF0/LmFjdGl2ZTtcbiAgaWYgKGlzT3BlbmluZyAmJiBNVVRVQUxMWV9FWENMVVNJVkVfTUFQX0NPTlRST0xTLmluY2x1ZGVzKHBhbmVsSWQpKSB7XG4gICAgY29uc3QgbmV4dE1hcENvbnRyb2xzID0gey4uLnVwZGF0ZWRTdGF0ZS5tYXBDb250cm9sc307XG4gICAgbGV0IGRpZERlYWN0aXZhdGUgPSBmYWxzZTtcbiAgICBNVVRVQUxMWV9FWENMVVNJVkVfTUFQX0NPTlRST0xTLmZvckVhY2goY29udHJvbElkID0+IHtcbiAgICAgIGlmIChjb250cm9sSWQgIT09IHBhbmVsSWQgJiYgbmV4dE1hcENvbnRyb2xzW2NvbnRyb2xJZF0/LmFjdGl2ZSkge1xuICAgICAgICBuZXh0TWFwQ29udHJvbHNbY29udHJvbElkXSA9IHsuLi5uZXh0TWFwQ29udHJvbHNbY29udHJvbElkXSwgYWN0aXZlOiBmYWxzZX07XG4gICAgICAgIGRpZERlYWN0aXZhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChkaWREZWFjdGl2YXRlKSB7XG4gICAgICB1cGRhdGVkU3RhdGUgPSB7Li4udXBkYXRlZFN0YXRlLCBtYXBDb250cm9sczogbmV4dE1hcENvbnRyb2xzfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnVwZGF0ZWRTdGF0ZSxcbiAgICBtYXBDb250cm9sczoge1xuICAgICAgLi4udXBkYXRlZFN0YXRlLm1hcENvbnRyb2xzLFxuICAgICAgW3BhbmVsSWRdOiB7XG4gICAgICAgIC4uLnVwZGF0ZWRTdGF0ZS5tYXBDb250cm9sc1twYW5lbElkXSxcbiAgICAgICAgYWN0aXZlOiAhdXBkYXRlZFN0YXRlLm1hcENvbnRyb2xzW3BhbmVsSWRdLmFjdGl2ZSxcbiAgICAgICAgYWN0aXZlTWFwSW5kZXg6IGluZGV4XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBUb2dnbGUgbWFwIGNvbnRyb2wgdmlzaWJpbGl0eVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvbiBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBtYXAgY29udHJvbCBwYW5lbCBpZCwgb25lIG9mIHRoZSBrZXlzIG9mOiBbYERFRkFVTFRfTUFQX0NPTlRST0xTYF0oI2RlZmF1bHRfbWFwX2NvbnRyb2xzKVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRNYXBDb250cm9sVmlzaWJpbGl0eVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge3BhbmVsSWQsIHNob3d9fTogVUlTdGF0ZUFjdGlvbnMuc2V0TWFwQ29udHJvbFZpc2liaWxpdHlVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgaWYgKCFzdGF0ZS5tYXBDb250cm9scz8uW3BhbmVsSWRdKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBtYXBDb250cm9sczoge1xuICAgICAgLi4uc3RhdGUubWFwQ29udHJvbHMsXG4gICAgICBbcGFuZWxJZF06IHtcbiAgICAgICAgLi4uc3RhdGUubWFwQ29udHJvbHNbcGFuZWxJZF0sXG4gICAgICAgIHNob3c6IEJvb2xlYW4oc2hvdylcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIFRvZ2dsZSBtYXAgY29udHJvbCBzZXR0aW5nc1xuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvbiBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBtYXAgY29udHJvbCBwYW5lbCBpZCwgb25lIG9mIHRoZSBrZXlzIG9mOiBbYERFRkFVTFRfTUFQX0NPTlRST0xTYF0oI2RlZmF1bHRfbWFwX2NvbnRyb2xzKVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRNYXBDb250cm9sU2V0dGluZ3NVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHtwYW5lbElkLCBzZXR0aW5nc319OiBVSVN0YXRlQWN0aW9ucy5zZXRNYXBDb250cm9sU2V0dGluZ3NVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgY29uc3QgbWFwQ29udHJvbCA9IHN0YXRlLm1hcENvbnRyb2xzPy5bcGFuZWxJZF07XG4gIGlmICghbWFwQ29udHJvbCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbWFwQ29udHJvbHM6IHtcbiAgICAgIC4uLnN0YXRlLm1hcENvbnRyb2xzLFxuICAgICAgW3BhbmVsSWRdOiB7Li4ubWFwQ29udHJvbCwgc2V0dGluZ3M6IHsuLi5tYXBDb250cm9sLnNldHRpbmdzLCAuLi5zZXR0aW5nc319XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBUb2dnbGUgYWN0aXZlIG1hcCBjb250cm9sIHBhbmVsXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgZGF0YXNldCBpZFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBvcGVuRGVsZXRlTW9kYWxVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGRhdGFzZXRLZXlUb1JlbW92ZX06IFVJU3RhdGVBY3Rpb25zLk9wZW5EZWxldGVNb2RhbFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGN1cnJlbnRNb2RhbDogREVMRVRFX0RBVEFfSUQsXG4gIGRhdGFzZXRLZXlUb1JlbW92ZVxufSk7XG5cbi8qKlxuICogU2V0IGBleHBvcnRJbWFnZS5sZWdlbmRgIHRvIGB0cnVlYCBvciBgZmFsc2VgXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydEltYWdlU2V0dGluZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogbmV3U2V0dGluZ306IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydEltYWdlU2V0dGluZ1VwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICBjb25zdCB1cGRhdGVkID0gey4uLnN0YXRlLmV4cG9ydEltYWdlLCAuLi5uZXdTZXR0aW5nfTtcbiAgY29uc3QgaW1hZ2VTaXplID0gY2FsY3VsYXRlRXhwb3J0SW1hZ2VTaXplKHVwZGF0ZWQpIHx8IHN0YXRlLmV4cG9ydEltYWdlLmltYWdlU2l6ZTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGV4cG9ydEltYWdlOiB7XG4gICAgICAuLi51cGRhdGVkLFxuICAgICAgaW1hZ2VTaXplXG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBTZXQgYGV4cG9ydEltYWdlLnNldEV4cG9ydEltYWdlRGF0YVVyaWAgdG8gYSBpbWFnZSBkYXRhVXJpXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgZXhwb3J0IGltYWdlIGRhdGEgdXJpXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydEltYWdlRGF0YVVyaVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogZGF0YVVyaX06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydEltYWdlRGF0YVVyaVVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICBpZiAoZGF0YVVyaSA9PT0gc3RhdGUuZXhwb3J0SW1hZ2UuaW1hZ2VEYXRhVXJpKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZXhwb3J0SW1hZ2U6IHtcbiAgICAgIC4uLnN0YXRlLmV4cG9ydEltYWdlLFxuICAgICAgcHJvY2Vzc2luZzogZmFsc2UsXG4gICAgICBpbWFnZURhdGFVcmk6IGRhdGFVcmlcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydEltYWdlRXJyb3JVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGVycm9yfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0SW1hZ2VFcnJvclVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydEltYWdlOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0SW1hZ2UsXG4gICAgcHJvY2Vzc2luZzogZmFsc2UsXG4gICAgZXJyb3JcbiAgfVxufSk7XG5cbi8qKlxuICogRGVsZXRlIGNhY2hlZCBleHBvcnQgaW1hZ2VcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGNsZWFudXBFeHBvcnRJbWFnZVVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnRJbWFnZToge1xuICAgIC4uLnN0YXRlLmV4cG9ydEltYWdlLFxuICAgIGV4cG9ydGluZzogZmFsc2UsXG4gICAgaW1hZ2VEYXRhVXJpOiAnJyxcbiAgICBlcnJvcjogZmFsc2UsXG4gICAgcHJvY2Vzc2luZzogZmFsc2UsXG4gICAgY2VudGVyOiBmYWxzZVxuICB9XG59KTtcblxuLyoqXG4gKiBTZXQgYGV4cG9ydFZpZGVvYCBzZXR0aW5nczogbWVkaWFUeXBlLCBjYW1lcmFQcmVzZXQsIGZpbGVOYW1lLCByZXNvbHV0aW9uLCBkdXJhdGlvbk1zXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgbmV3IHZpZGVvIGV4cG9ydCBzZXR0aW5nc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRWaWRlb1NldHRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IG5ld1NldHRpbmd9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRWaWRlb1NldHRpbmdVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnRWaWRlbzoge1xuICAgIC4uLnN0YXRlLmV4cG9ydFZpZGVvLFxuICAgIC4uLm5ld1NldHRpbmdcbiAgfVxufSk7XG5cbi8qKlxuICogU3RhcnQgaW1hZ2UgZXhwb3J0aW5nIGZsb3dcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtVaVN0YXRlfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc3RhcnRFeHBvcnRpbmdJbWFnZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogb3B0aW9ucyA9IHt9fToge3BheWxvYWQ6IFBhcnRpYWw8RXhwb3J0SW1hZ2U+fVxuKTogVWlTdGF0ZSA9PiB7XG4gIGNvbnN0IGltYWdlU2V0dGluZ3MgPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBleHBvcnRpbmc6IHRydWVcbiAgfTtcblxuICByZXR1cm4gY29tcG9zZV8oW1xuICAgIGNsZWFudXBFeHBvcnRJbWFnZVVwZGF0ZXIsXG4gICAgYXBwbHlfKHNldEV4cG9ydEltYWdlU2V0dGluZ1VwZGF0ZXIsIHBheWxvYWRfKGltYWdlU2V0dGluZ3MpKVxuICBdKShzdGF0ZSk7XG59O1xuXG4vKipcbiAqIFNldCBzZWxlY3RlZCBkYXRhc2V0IGZvciBleHBvcnRcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBkYXRhc2V0IGlkXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydFNlbGVjdGVkRGF0YXNldFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogZGF0YXNldH06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydFNlbGVjdGVkRGF0YXNldFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydERhdGE6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnREYXRhLFxuICAgIHNlbGVjdGVkRGF0YXNldDogZGF0YXNldFxuICB9XG59KTtcblxuLyoqXG4gKiBTZXQgZGF0YSBmb3JtYXQgZm9yIGV4cG9ydGluZyBkYXRhXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgb25lIG9mIGAndGV4dC9jc3YnYFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnREYXRhVHlwZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogZGF0YVR5cGV9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnREYXRhVHlwZVVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydERhdGE6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnREYXRhLFxuICAgIGRhdGFUeXBlXG4gIH1cbn0pO1xuXG4vKipcbiAqIFdoZXRoZXIgdG8gZXhwb3J0IGZpbHRlcmVkIGRhdGEsIGB0cnVlYCBvciBgZmFsc2VgXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWRcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0RmlsdGVyZWRVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGZpbHRlcmVkfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0RmlsdGVyZWRVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnREYXRhOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0RGF0YSxcbiAgICBmaWx0ZXJlZFxuICB9XG59KTtcblxuLyoqXG4gKiBXaGV0aGVyIHRvIGluY2x1ZGluZyBkYXRhIGluIG1hcCBjb25maWcsIHRvZ2dsZSBiZXR3ZWVuIGB0cnVlYCBvciBgZmFsc2VgXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydERhdGFVcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0TWFwOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0TWFwLFxuICAgIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSlNPTl06IHtcbiAgICAgIC4uLnN0YXRlLmV4cG9ydE1hcFtFWFBPUlRfTUFQX0ZPUk1BVFMuSlNPTl0sXG4gICAgICBoYXNEYXRhOiAhc3RhdGUuZXhwb3J0TWFwW0VYUE9SVF9NQVBfRk9STUFUUy5KU09OXS5oYXNEYXRhXG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiB3aGV0aGVyIHRvIGV4cG9ydCBhIG1hcGJveCBhY2Nlc3MgdG8gSFRNTCBzaW5nbGUgcGFnZVxuICogQHBhcmFtIHN0YXRlIC0gYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWRcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0VXNlck1hcGJveEFjY2Vzc1Rva2VuVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiB1c2VyTWFwYm94VG9rZW59OiBVSVN0YXRlQWN0aW9ucy5TZXRVc2VyTWFwYm94QWNjZXNzVG9rZW5VcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnRNYXA6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnRNYXAsXG4gICAgW0VYUE9SVF9NQVBfRk9STUFUUy5IVE1MXToge1xuICAgICAgLi4uc3RhdGUuZXhwb3J0TWFwW0VYUE9SVF9NQVBfRk9STUFUUy5IVE1MXSxcbiAgICAgIHVzZXJNYXBib3hUb2tlblxuICAgIH1cbiAgfVxufSk7XG5cbi8qKlxuICogU2V0cyB0aGUgZXhwb3J0IG1hcCBmb3JtYXRcbiAqIEBwYXJhbSBzdGF0ZSAtIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGZvcm1hdCB0byB1c2UgdG8gZXhwb3J0IHRoZSBtYXAgaW50b1xuICogQHJldHVybiBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydE1hcEZvcm1hdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogZm9ybWF0fTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0TWFwRm9ybWF0VXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0TWFwOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0TWFwLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBmb3JtYXRcbiAgfVxufSk7XG5cbi8qKlxuICogU2V0IHRoZSBleHBvcnQgaHRtbCBtYXAgbW9kZVxuICogQHBhcmFtIHN0YXRlIC0gYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgdG8gYmUgc2V0IChhdmFpbGFibGUgbW9kZXM6IEVYUE9SVF9IVE1MX01BUF9NT0RFUylcbiAqIEByZXR1cm4gbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRNYXBIVE1MTW9kZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogbW9kZX06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydEhUTUxNYXBNb2RlVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0TWFwOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0TWFwLFxuICAgIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTF06IHtcbiAgICAgIC4uLnN0YXRlLmV4cG9ydE1hcFtFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTF0sXG4gICAgICBtb2RlXG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBBZGRzIGEgbmV3IG5vdGlmaWNhdGlvbi5cbiAqIFVwZGF0ZXMgYSBub3RpZmljYXRpb24gaW4gY2FzZSBvZiBtYXRjaGluZyBpZHMuXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgUGFyYW1zIG9mIGEgbm90aWZpY2F0aW9uXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZE5vdGlmaWNhdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZH06IFVJU3RhdGVBY3Rpb25zLkFkZE5vdGlmaWNhdGlvblVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICBjb25zdCBvbGROb3RpZmljYXRpb25zID0gc3RhdGUubm90aWZpY2F0aW9ucyB8fCBbXTtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICBjb25zdCBwYXlsb2FkSWQgPSBwYXlsb2FkPy5pZDtcbiAgY29uc3Qgbm90aWZpY2F0aW9uVG9VcGRhdGUgPSBwYXlsb2FkSWQgPyBvbGROb3RpZmljYXRpb25zLmZpbmQobiA9PiBuLmlkID09PSBwYXlsb2FkSWQpIDogbnVsbDtcblxuICBsZXQgbm90aWZpY2F0aW9ucztcbiAgaWYgKG5vdGlmaWNhdGlvblRvVXBkYXRlKSB7XG4gICAgbm90aWZpY2F0aW9ucyA9IG9sZE5vdGlmaWNhdGlvbnMubWFwKG4gPT5cbiAgICAgIG4uaWQgPT09IHBheWxvYWRJZCA/IGNyZWF0ZU5vdGlmaWNhdGlvbih7Li4ucGF5bG9hZCwgY291bnQ6IG4uY291bnQgKyAxfSkgOiBuXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBub3RpZmljYXRpb25zID0gWy4uLm9sZE5vdGlmaWNhdGlvbnMsIGNyZWF0ZU5vdGlmaWNhdGlvbihwYXlsb2FkKV07XG4gIH1cblxuICByZXR1cm4gey4uLnN0YXRlLCBub3RpZmljYXRpb25zfTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGEgbm90aWZpY2F0aW9uXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgaWQgb2YgdGhlIG5vdGlmaWNhdGlvbiB0byBiZSByZW1vdmVkXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZU5vdGlmaWNhdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogaWR9OiBVSVN0YXRlQWN0aW9ucy5SZW1vdmVOb3RpZmljYXRpb25VcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBub3RpZmljYXRpb25zOiBzdGF0ZS5ub3RpZmljYXRpb25zLmZpbHRlcihuID0+IG4uaWQgIT09IGlkKVxufSk7XG5cbi8qKlxuICogRmlyZWQgd2hlbiBmaWxlIGxvYWRpbmcgYmVnaW5cbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGxvYWRGaWxlczoge1xuICAgIC4uLnN0YXRlLmxvYWRGaWxlcyxcbiAgICBmaWxlTG9hZGluZzogdHJ1ZVxuICB9XG59KTtcblxuLyoqXG4gKiBIYW5kbGVzIGxvYWRpbmcgZmlsZSBzdWNjZXNzIGFuZCBzZXQgZmlsZUxvYWRpbmcgcHJvcGVydHkgdG8gZmFsc2VcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICovXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzU3VjY2Vzc1VwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsb2FkRmlsZXM6IHtcbiAgICAuLi5zdGF0ZS5sb2FkRmlsZXMsXG4gICAgZmlsZUxvYWRpbmc6IGZhbHNlXG4gIH1cbn0pO1xuXG4vKipcbiAqIEhhbmRsZXMgbG9hZCBmaWxlIGVycm9yIGFuZCBzZXQgZmlsZUxvYWRpbmcgcHJvcGVydHkgdG8gZmFsc2VcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZVxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5lcnJvclxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRmlsZXNFcnJVcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlLCB7ZXJyb3J9OiBMb2FkRmlsZXNFcnJVcGRhdGVyQWN0aW9uKTogVWlTdGF0ZSA9PlxuICBhZGROb3RpZmljYXRpb25VcGRhdGVyKFxuICAgIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbG9hZEZpbGVzOiB7XG4gICAgICAgIC4uLnN0YXRlLmxvYWRGaWxlcyxcbiAgICAgICAgZmlsZUxvYWRpbmc6IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBwYXlsb2FkOiBlcnJvck5vdGlmaWNhdGlvbih7XG4gICAgICAgIG1lc3NhZ2U6IChlcnJvciB8fCB7fSkubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHVwbG9hZCBmaWxlcycsXG4gICAgICAgIHRvcGljOiBERUZBVUxUX05PVElGSUNBVElPTl9UT1BJQ1MuZ2xvYmFsXG4gICAgICB9KVxuICAgIH1cbiAgKTtcblxuLyoqXG4gKiBIYW5kbGVzIHRvZ2dsZSBtYXAgc3BsaXQgYW5kIHJlc2V0IGFsbCBtYXAgY29udHJvbCBpbmRleCB0byAwXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlU3BsaXRNYXBVcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbWFwQ29udHJvbHM6IE9iamVjdC5lbnRyaWVzKHN0YXRlLm1hcENvbnRyb2xzKS5yZWR1Y2UoXG4gICAgKGFjYywgZW50cnkpID0+ICh7XG4gICAgICAuLi5hY2MsXG4gICAgICBbZW50cnlbMF1dOiB7XG4gICAgICAgIC4uLmVudHJ5WzFdLFxuICAgICAgICBhY3RpdmVNYXBJbmRleDogMFxuICAgICAgfVxuICAgIH0pLFxuICAgIHt9IGFzIE1hcENvbnRyb2xzXG4gIClcbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBtb2RhbCBkYXRhXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2hvd0RhdGFzZXRUYWJsZVVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+XG4gIHRvZ2dsZU1vZGFsVXBkYXRlcihzdGF0ZSwge3BheWxvYWQ6IERBVEFfVEFCTEVfSUR9KTtcblxuLyoqXG4gKiBTZXQgdGhlIGxvY2FsZSBvZiB0aGUgVUlcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZFxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkLmxvY2FsZSBsb2NhbGVcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0TG9jYWxlVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiB7bG9jYWxlfX06IFVJU3RhdGVBY3Rpb25zLlNldExvY2FsZVVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGxvY2FsZVxufSk7XG5cbi8qKlxuICogU2V0IHRoZSB0aGVtZSBvZiB0aGUgVUlcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZFxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkLnRoZW1lIHRoZW1lXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFRoZW1lVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiB7dGhlbWV9fTogVUlTdGF0ZUFjdGlvbnMuU2V0VGhlbWVVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICB0aGVtZVxufSk7XG5cbi8qKlxuICogVG9nZ2xlIGxheWVyIHBhbmVsIGxpc3Qgdmlld1xuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGxheWVyIHBhbmVsIGxpc3RWaWV3IHZhbHVlLiBDYW4gYmUgJ2xpc3QnIG9yICdzb3J0QnlEYXRhc2V0J1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVQYW5lbExpc3RWaWV3VXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiB7cGFuZWxJZCwgbGlzdFZpZXd9fTogVUlTdGF0ZUFjdGlvbnMuVG9nZ2xlUGFuZWxMaXN0Vmlld0FjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGNvbnN0IHN0YXRlUHJvcCA9XG4gICAgcGFuZWxJZCA9PT0gJ2xheWVyJ1xuICAgICAgPyAnbGF5ZXJQYW5lbExpc3RWaWV3J1xuICAgICAgOiBwYW5lbElkID09PSAnZmlsdGVyJ1xuICAgICAgPyAnZmlsdGVyUGFuZWxMaXN0VmlldydcbiAgICAgIDogbnVsbDtcbiAgaWYgKCFzdGF0ZVByb3AgfHwgc3RhdGVbc3RhdGVQcm9wXSA9PT0gbGlzdFZpZXcpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBbc3RhdGVQcm9wXTogbGlzdFZpZXdcbiAgfTtcbn07XG5cbi8qKlxuICogTWVyZ2UgcmVjZWl2ZWQgdWkgc3RhdGUgY29uZmlnIHdoZW4gbG9hZGluZyBhIHNhdmVkIG1hcFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIHNhdmVkIG1hcCBjb25maWcgYHttYXBTdHlsZSwgdmlzU3RhdGUsIG1hcFN0YXRlLCB1aVN0YXRlfWBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7XG4gICAgcGF5bG9hZDoge2NvbmZpZ31cbiAgfToge1xuICAgIHR5cGU/OiAodHlwZW9mIEFjdGlvblR5cGVzKVsnUkVDRUlWRV9NQVBfQ09ORklHJ107XG4gICAgcGF5bG9hZDogUmVjZWl2ZU1hcENvbmZpZ1BheWxvYWQ7XG4gIH1cbik6IFVpU3RhdGUgPT4ge1xuICBjb25zdCB7dWlTdGF0ZX0gPSBjb25maWcgfHwge307XG4gIGlmICghdWlTdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuXG4gIGlmICh1aVN0YXRlLm1hcENvbnRyb2xzPy5tYXBMZWdlbmQ/LmFjdGl2ZSkge1xuICAgIGNvbnN0IGN1cnJlbnRMZWdlbmQgPSBuZXdTdGF0ZS5tYXBDb250cm9scy5tYXBMZWdlbmQ7XG4gICAgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgIG1hcENvbnRyb2xzOiB7XG4gICAgICAgIC4uLm5ld1N0YXRlLm1hcENvbnRyb2xzLFxuICAgICAgICBtYXBMZWdlbmQ6IHtcbiAgICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAgIC4uLmN1cnJlbnRMZWdlbmQsXG4gICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgIGFjdGl2ZU1hcEluZGV4OiAwXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgaWYgKHVpU3RhdGUubWFwQ29udHJvbHM/Lm1hcExlZ2VuZD8uc2V0dGluZ3MpIHtcbiAgICBuZXdTdGF0ZSA9IHNldE1hcENvbnRyb2xTZXR0aW5nc1VwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgIHBheWxvYWQ6IHtwYW5lbElkOiAnbWFwTGVnZW5kJywgc2V0dGluZ3M6IHVpU3RhdGUubWFwQ29udHJvbHMubWFwTGVnZW5kLnNldHRpbmdzfVxuICAgIH0gYXMgVUlTdGF0ZUFjdGlvbnMuc2V0TWFwQ29udHJvbFNldHRpbmdzVXBkYXRlckFjdGlvbik7XG4gIH1cblxuICBpZiAodWlTdGF0ZS5sb2NhbGUpIHtcbiAgICBuZXdTdGF0ZSA9IHNldExvY2FsZVVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgIHBheWxvYWQ6IHtsb2NhbGU6IHVpU3RhdGUubG9jYWxlfVxuICAgIH0gYXMgVUlTdGF0ZUFjdGlvbnMuU2V0TG9jYWxlVXBkYXRlckFjdGlvbik7XG4gIH1cblxuICBpZiAodWlTdGF0ZS50aGVtZSkge1xuICAgIG5ld1N0YXRlID0gc2V0VGhlbWVVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICBwYXlsb2FkOiB7dGhlbWU6IHVpU3RhdGUudGhlbWV9XG4gICAgfSBhcyBVSVN0YXRlQWN0aW9ucy5TZXRUaGVtZVVwZGF0ZXJBY3Rpb24pO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBR0EsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBYUEsSUFBQUMsYUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsTUFBQSxHQUFBRixPQUFBO0FBTUEsSUFBQUcsZ0JBQUEsR0FBQUgsT0FBQTtBQUE4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