@kepler.gl/reducers 3.1.0-alpha.1 → 3.1.0-alpha.3

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 (49) hide show
  1. package/dist/combined-updaters.d.ts +79 -0
  2. package/dist/combined-updaters.js +358 -0
  3. package/dist/composer-helpers.d.ts +24 -0
  4. package/dist/composer-helpers.js +101 -0
  5. package/dist/composers.d.ts +18 -0
  6. package/dist/composers.js +23 -0
  7. package/dist/core.d.ts +64 -0
  8. package/dist/core.js +105 -0
  9. package/dist/data-utils.d.ts +12 -0
  10. package/dist/data-utils.js +57 -0
  11. package/dist/export-utils.d.ts +21 -0
  12. package/dist/export-utils.js +91 -0
  13. package/dist/index.d.ts +35 -0
  14. package/dist/index.js +342 -0
  15. package/dist/interaction-utils.d.ts +29 -0
  16. package/dist/interaction-utils.js +105 -0
  17. package/dist/layer-utils.d.ts +96 -0
  18. package/dist/layer-utils.js +310 -0
  19. package/dist/map-state-updaters.d.ts +93 -0
  20. package/dist/map-state-updaters.js +432 -0
  21. package/dist/map-state.d.ts +75 -0
  22. package/dist/map-state.js +35 -0
  23. package/dist/map-style-updaters.d.ts +179 -0
  24. package/dist/map-style-updaters.js +656 -0
  25. package/dist/map-style.d.ts +4 -0
  26. package/dist/map-style.js +34 -0
  27. package/dist/merger-handler.d.ts +10 -0
  28. package/dist/merger-handler.js +105 -0
  29. package/dist/middleware.d.ts +8 -0
  30. package/dist/middleware.js +27 -0
  31. package/dist/provider-state-updaters.d.ts +35 -0
  32. package/dist/provider-state-updaters.js +348 -0
  33. package/dist/provider-state.d.ts +4 -0
  34. package/dist/provider-state.js +35 -0
  35. package/dist/root.d.ts +24 -0
  36. package/dist/root.js +206 -0
  37. package/dist/ui-state-updaters.d.ts +362 -0
  38. package/dist/ui-state-updaters.js +762 -0
  39. package/dist/ui-state.d.ts +3 -0
  40. package/dist/ui-state.js +37 -0
  41. package/dist/vis-state-merger.d.ts +143 -0
  42. package/dist/vis-state-merger.js +812 -0
  43. package/dist/vis-state-selectors.d.ts +10 -0
  44. package/dist/vis-state-selectors.js +30 -0
  45. package/dist/vis-state-updaters.d.ts +546 -0
  46. package/dist/vis-state-updaters.js +3338 -0
  47. package/dist/vis-state.d.ts +155 -0
  48. package/dist/vis-state.js +36 -0
  49. package/package.json +23 -17
@@ -0,0 +1,762 @@
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.setMapControlVisibilityUpdater = exports.setLocaleUpdater = exports.setExportSelectedDatasetUpdater = exports.setExportMapHTMLModeUpdater = exports.setExportMapFormatUpdater = exports.setExportImageSettingUpdater = exports.setExportImageErrorUpdater = exports.setExportImageDataUriUpdater = exports.setExportFilteredUpdater = exports.setExportDataUpdater = exports.setExportDataTypeUpdater = exports.removeNotificationUpdater = exports.openDeleteModalUpdater = exports.loadFilesUpdater = exports.loadFilesSuccessUpdater = exports.loadFilesErrUpdater = exports.initUiStateUpdater = exports.hideExportDropdownUpdater = exports.cleanupExportImageUpdater = exports.addNotificationUpdater = exports.INITIAL_UI_STATE = exports.DEFAULT_NOTIFICATIONS = exports.DEFAULT_MODAL = exports.DEFAULT_MAP_CONTROLS = exports.DEFAULT_LOAD_FILES = 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: false, active: false}`
81
+ * @public
82
+ */
83
+ var DEFAULT_MAP_CONTROLS = exports.DEFAULT_MAP_CONTROLS = Object.keys(_constants.MAP_CONTROLS).reduce(function (_final, current) {
84
+ return _objectSpread(_objectSpread({}, _final), {}, (0, _defineProperty2["default"])({}, current, current === _constants.MAP_CONTROLS.mapLegend ? DEFAULT_MAP_LEGEND_CONTROL : DEFAULT_MAP_CONTROLS_FEATURES));
85
+ }, {});
86
+
87
+ /**
88
+ * Default image export config
89
+ * @memberof uiStateUpdaters
90
+ * @constant
91
+ * @property ratio Default: `'SCREEN'`,
92
+ * @property resolution Default: `'ONE_X'`,
93
+ * @property legend Default: `false`,
94
+ * @property mapH Default: 0,
95
+ * @property mapW Default: 0,
96
+ * @property imageSize Default: {zoomOffset: 0, scale: 1, imageW: 0, imageH: 0},
97
+ * @property imageDataUri Default: `''`,
98
+ * @property exporting Default: `false`
99
+ * @property error Default: `false`
100
+ * @property escapeXhtmlForWebpack Default: `true`
101
+ * @public
102
+ */
103
+ var DEFAULT_EXPORT_IMAGE = exports.DEFAULT_EXPORT_IMAGE = {
104
+ // user options
105
+ ratio: _constants.EXPORT_IMG_RATIOS.SCREEN,
106
+ resolution: _constants.RESOLUTIONS.ONE_X,
107
+ legend: false,
108
+ mapH: 0,
109
+ mapW: 0,
110
+ imageSize: {
111
+ zoomOffset: 0,
112
+ scale: 1,
113
+ imageW: 0,
114
+ imageH: 0
115
+ },
116
+ // when this is set to true, the mock map viewport will move to the center of data
117
+ center: false,
118
+ // exporting state
119
+ imageDataUri: '',
120
+ // exporting: used to attach plot-container to dom
121
+ exporting: false,
122
+ // processing: used as loading indicator when export image is being produced
123
+ processing: false,
124
+ error: false,
125
+ // whether to apply fix for uglify error in dom-to-image (should be true for webpack builds)
126
+ escapeXhtmlForWebpack: true
127
+ };
128
+ var DEFAULT_LOAD_FILES = exports.DEFAULT_LOAD_FILES = {
129
+ fileLoading: false
130
+ };
131
+
132
+ /**
133
+ * Default initial `exportData` settings
134
+ * @memberof uiStateUpdaters
135
+ * @constant
136
+ * @property selectedDataset Default: `''`,
137
+ * @property dataType Default: `'csv'`,
138
+ * @property filtered Default: `true`,
139
+ * @public
140
+ */
141
+ var DEFAULT_EXPORT_DATA = exports.DEFAULT_EXPORT_DATA = {
142
+ selectedDataset: '',
143
+ dataType: _constants.EXPORT_DATA_TYPE.CSV,
144
+ filtered: true
145
+ };
146
+
147
+ /**
148
+ * @constant
149
+ */
150
+ var DEFAULT_NOTIFICATIONS = exports.DEFAULT_NOTIFICATIONS = [];
151
+
152
+ /**
153
+ * @constant
154
+ * @property exportMapboxAccessToken - Default: null, this is used when we provide a default mapbox token for users to take advantage of
155
+ * @property userMapboxToken - Default: '', mapbox token provided by user through input field
156
+ * @property mode - Default: 'READ', read only or editable
157
+ * @public
158
+ */
159
+ var DEFAULT_EXPORT_HTML = exports.DEFAULT_EXPORT_HTML = {
160
+ exportMapboxAccessToken: null,
161
+ userMapboxToken: '',
162
+ mode: _constants.EXPORT_HTML_MAP_MODES.READ
163
+ };
164
+
165
+ /**
166
+ * @constant
167
+ * @property hasData - Default: 'true',
168
+ * @public
169
+ */
170
+ var DEFAULT_EXPORT_JSON = exports.DEFAULT_EXPORT_JSON = {
171
+ hasData: true
172
+ };
173
+
174
+ /**
175
+ * Export Map Config
176
+ * @constant
177
+ * @property HTML - Default: 'DEFAULT_EXPORT_HTML',
178
+ * @property JSON - Default: 'DEFAULT_EXPORT_JSON',
179
+ * @property format - Default: 'HTML',
180
+ * @public
181
+ */
182
+ 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);
183
+
184
+ /**
185
+ * Default initial `uiState`
186
+ * @memberof uiStateUpdaters
187
+ * @constant
188
+ * @property readOnly Default: `false`
189
+ * @property activeSidePanel Default: `'layer'`
190
+ * @property currentModal Default: `'addData'`
191
+ * @property datasetKeyToRemove Default: `null`
192
+ * @property visibleDropdown Default: `null`
193
+ * @property exportImage Default: [`DEFAULT_EXPORT_IMAGE`](#default_export_image)
194
+ * @property exportData Default: [`DEFAULT_EXPORT_DATA`](#default_export_data)
195
+ * @property exportMap Default: [`DEFAULT_EXPORT_MAP`](#default_export_map)
196
+ * @property mapControls Default: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
197
+ * @property notifications Default: `[]`
198
+ * @property notifications Default: `[]`
199
+ * @property loadFiles
200
+ * @property isSidePanelCloseButtonVisible Default: `true`
201
+ * @public
202
+ */
203
+ var INITIAL_UI_STATE = exports.INITIAL_UI_STATE = {
204
+ readOnly: false,
205
+ activeSidePanel: DEFAULT_ACTIVE_SIDE_PANEL,
206
+ currentModal: DEFAULT_MODAL,
207
+ datasetKeyToRemove: null,
208
+ visibleDropdown: null,
209
+ // export image modal ui
210
+ exportImage: DEFAULT_EXPORT_IMAGE,
211
+ // export data modal ui
212
+ exportData: DEFAULT_EXPORT_DATA,
213
+ // html export
214
+ exportMap: DEFAULT_EXPORT_MAP,
215
+ // map control panels
216
+ mapControls: DEFAULT_MAP_CONTROLS,
217
+ // ui notifications
218
+ notifications: DEFAULT_NOTIFICATIONS,
219
+ // load files
220
+ loadFiles: DEFAULT_LOAD_FILES,
221
+ // Locale of the UI
222
+ locale: _localization.LOCALE_CODES.en,
223
+ layerPanelListView: 'list',
224
+ filterPanelListView: 'list',
225
+ isSidePanelCloseButtonVisible: true
226
+ };
227
+
228
+ /* Updaters */
229
+ /**
230
+ * @memberof uiStateUpdaters
231
+ */
232
+ var initUiStateUpdater = exports.initUiStateUpdater = function initUiStateUpdater(state, action) {
233
+ return _objectSpread(_objectSpread({}, state), (action.payload || {}).initialUiState);
234
+ };
235
+
236
+ /**
237
+ * Toggle active side panel
238
+ * @memberof uiStateUpdaters
239
+ * @param state `uiState`
240
+ * @param action
241
+ * @param action.payload id of side panel to be shown, one of `layer`, `filter`, `interaction`, `map`. close side panel if `null`
242
+ * @returns nextState
243
+ * @public
244
+ */
245
+ var toggleSidePanelUpdater = exports.toggleSidePanelUpdater = function toggleSidePanelUpdater(state, _ref) {
246
+ var id = _ref.payload;
247
+ return id === state.activeSidePanel ? state : _objectSpread(_objectSpread({}, state), {}, {
248
+ activeSidePanel: id
249
+ });
250
+ };
251
+
252
+ /**
253
+ * Show and hide modal dialog
254
+ * @memberof uiStateUpdaters
255
+ * @param state `uiState`
256
+ * @param action
257
+ * @paramaction.payload id of modal to be shown, null to hide modals. One of:
258
+ * - [`DATA_TABLE_ID`](../constants/default-settings.md#data_table_id)
259
+ * - [`DELETE_DATA_ID`](../constants/default-settings.md#delete_data_id)
260
+ * - [`ADD_DATA_ID`](../constants/default-settings.md#add_data_id)
261
+ * - [`EXPORT_IMAGE_ID`](../constants/default-settings.md#export_image_id)
262
+ * - [`EXPORT_DATA_ID`](../constants/default-settings.md#export_data_id)
263
+ * - [`ADD_MAP_STYLE_ID`](../constants/default-settings.md#add_map_style_id)
264
+ * @returns nextState
265
+ * @public
266
+ */
267
+ var toggleModalUpdater = exports.toggleModalUpdater = function toggleModalUpdater(state, _ref2) {
268
+ var id = _ref2.payload;
269
+ return _objectSpread(_objectSpread({}, state), {}, {
270
+ currentModal: id
271
+ });
272
+ };
273
+
274
+ /**
275
+ * Hide and show side panel header dropdown, activated by clicking the share link on top of the side panel
276
+ * @memberof uiStateUpdaters
277
+ * @public
278
+ */
279
+ var showExportDropdownUpdater = exports.showExportDropdownUpdater = function showExportDropdownUpdater(state, _ref3) {
280
+ var id = _ref3.payload;
281
+ return _objectSpread(_objectSpread({}, state), {}, {
282
+ visibleDropdown: id
283
+ });
284
+ };
285
+
286
+ /**
287
+ * Hide side panel header dropdown, activated by clicking the share link on top of the side panel
288
+ * @memberof uiStateUpdaters
289
+ * @public
290
+ */
291
+ var hideExportDropdownUpdater = exports.hideExportDropdownUpdater = function hideExportDropdownUpdater(state) {
292
+ return _objectSpread(_objectSpread({}, state), {}, {
293
+ visibleDropdown: null
294
+ });
295
+ };
296
+
297
+ /**
298
+ * Toggle side panel close button on top left of the side panel
299
+ * @memberof uiStateUpdaters
300
+ * @public
301
+ */
302
+ var toggleSidePanelCloseButtonUpdater = exports.toggleSidePanelCloseButtonUpdater = function toggleSidePanelCloseButtonUpdater(state, _ref4) {
303
+ var show = _ref4.payload.show;
304
+ return _objectSpread(_objectSpread({}, state), {}, {
305
+ isSidePanelCloseButtonVisible: show
306
+ });
307
+ };
308
+
309
+ /**
310
+ * Toggle active map control panel
311
+ * @memberof uiStateUpdaters
312
+ * @param state `uiState`
313
+ * @param action action
314
+ * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
315
+ * @returns nextState
316
+ * @public
317
+ */
318
+ var toggleMapControlUpdater = exports.toggleMapControlUpdater = function toggleMapControlUpdater(state, _ref5) {
319
+ var _state$mapControls$pa;
320
+ var _ref5$payload = _ref5.payload,
321
+ panelId = _ref5$payload.panelId,
322
+ _ref5$payload$index = _ref5$payload.index,
323
+ index = _ref5$payload$index === void 0 ? 0 : _ref5$payload$index;
324
+ var updatedState = state;
325
+ // The effect panel and ai assistant panel can not be active at the same time
326
+ // so we need to deactivate the other panel when one is activated
327
+ var panelToDeactivate = panelId === _constants.MAP_CONTROLS.effect ? _constants.MAP_CONTROLS.aiAssistant : panelId === _constants.MAP_CONTROLS.aiAssistant ? _constants.MAP_CONTROLS.effect : null;
328
+
329
+ // If we need to deactivate a competing panel and it's currently active
330
+ if (panelToDeactivate && (_state$mapControls$pa = state.mapControls[panelToDeactivate]) !== null && _state$mapControls$pa !== void 0 && _state$mapControls$pa.active) {
331
+ updatedState = _objectSpread(_objectSpread({}, state), {}, {
332
+ mapControls: _objectSpread(_objectSpread({}, updatedState.mapControls), {}, (0, _defineProperty2["default"])({}, panelToDeactivate, _objectSpread(_objectSpread({}, updatedState.mapControls[panelToDeactivate]), {}, {
333
+ active: false
334
+ })))
335
+ });
336
+ }
337
+ return _objectSpread(_objectSpread({}, updatedState), {}, {
338
+ mapControls: _objectSpread(_objectSpread({}, updatedState.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, updatedState.mapControls[panelId]), {}, {
339
+ active: !updatedState.mapControls[panelId].active,
340
+ activeMapIndex: index
341
+ })))
342
+ });
343
+ };
344
+
345
+ /**
346
+ * Toggle map control visibility
347
+ * @memberof uiStateUpdaters
348
+ * @param state `uiState`
349
+ * @param action action
350
+ * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
351
+ * @returns nextState
352
+ * @public
353
+ */
354
+ var setMapControlVisibilityUpdater = exports.setMapControlVisibilityUpdater = function setMapControlVisibilityUpdater(state, _ref6) {
355
+ var _state$mapControls;
356
+ var _ref6$payload = _ref6.payload,
357
+ panelId = _ref6$payload.panelId,
358
+ show = _ref6$payload.show;
359
+ if (!((_state$mapControls = state.mapControls) !== null && _state$mapControls !== void 0 && _state$mapControls[panelId])) {
360
+ return state;
361
+ }
362
+ return _objectSpread(_objectSpread({}, state), {}, {
363
+ mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, state.mapControls[panelId]), {}, {
364
+ show: Boolean(show)
365
+ })))
366
+ });
367
+ };
368
+
369
+ /**
370
+ * Toggle active map control panel
371
+ * @memberof uiStateUpdaters
372
+ * @param state `uiState`
373
+ * @param action
374
+ * @param action.payload dataset id
375
+ * @returns nextState
376
+ * @public
377
+ */
378
+ var openDeleteModalUpdater = exports.openDeleteModalUpdater = function openDeleteModalUpdater(state, _ref7) {
379
+ var datasetKeyToRemove = _ref7.payload;
380
+ return _objectSpread(_objectSpread({}, state), {}, {
381
+ currentModal: _constants.DELETE_DATA_ID,
382
+ datasetKeyToRemove: datasetKeyToRemove
383
+ });
384
+ };
385
+
386
+ /**
387
+ * Set `exportImage.legend` to `true` or `false`
388
+ * @memberof uiStateUpdaters
389
+ * @param state `uiState`
390
+ * @returns nextState
391
+ * @public
392
+ */
393
+ var setExportImageSettingUpdater = exports.setExportImageSettingUpdater = function setExportImageSettingUpdater(state, _ref8) {
394
+ var newSetting = _ref8.payload;
395
+ var updated = _objectSpread(_objectSpread({}, state.exportImage), newSetting);
396
+ var imageSize = (0, _utils.calculateExportImageSize)(updated) || state.exportImage.imageSize;
397
+ return _objectSpread(_objectSpread({}, state), {}, {
398
+ exportImage: _objectSpread(_objectSpread({}, updated), {}, {
399
+ // @ts-expect-error
400
+ // TODO: calculateExportImageSize does not return imageSize.zoomOffset,
401
+ // do we need take this value from current state, or return defaul value = 0
402
+ imageSize: imageSize
403
+ })
404
+ });
405
+ };
406
+
407
+ /**
408
+ * Set `exportImage.setExportImageDataUri` to a image dataUri
409
+ * @memberof uiStateUpdaters
410
+ * @param state `uiState`
411
+ * @param action
412
+ * @param action.payload export image data uri
413
+ * @returns nextState
414
+ * @public
415
+ */
416
+ var setExportImageDataUriUpdater = exports.setExportImageDataUriUpdater = function setExportImageDataUriUpdater(state, _ref9) {
417
+ var dataUri = _ref9.payload;
418
+ return _objectSpread(_objectSpread({}, state), {}, {
419
+ exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
420
+ processing: false,
421
+ imageDataUri: dataUri
422
+ })
423
+ });
424
+ };
425
+
426
+ /**
427
+ * @memberof uiStateUpdaters
428
+ * @public
429
+ */
430
+ var setExportImageErrorUpdater = exports.setExportImageErrorUpdater = function setExportImageErrorUpdater(state, _ref10) {
431
+ var error = _ref10.payload;
432
+ return _objectSpread(_objectSpread({}, state), {}, {
433
+ exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
434
+ processing: false,
435
+ error: error
436
+ })
437
+ });
438
+ };
439
+
440
+ /**
441
+ * Delete cached export image
442
+ * @memberof uiStateUpdaters
443
+ * @public
444
+ */
445
+ var cleanupExportImageUpdater = exports.cleanupExportImageUpdater = function cleanupExportImageUpdater(state) {
446
+ return _objectSpread(_objectSpread({}, state), {}, {
447
+ exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
448
+ exporting: false,
449
+ imageDataUri: '',
450
+ error: false,
451
+ processing: false,
452
+ center: false
453
+ })
454
+ });
455
+ };
456
+
457
+ /**
458
+ * Start image exporting flow
459
+ * @memberof uiStateUpdaters
460
+ * @param state
461
+ * @param options
462
+ * @returns {UiState}
463
+ * @public
464
+ */
465
+ var startExportingImageUpdater = exports.startExportingImageUpdater = function startExportingImageUpdater(state, _ref11) {
466
+ var _ref11$payload = _ref11.payload,
467
+ options = _ref11$payload === void 0 ? {} : _ref11$payload;
468
+ var imageSettings = _objectSpread(_objectSpread({}, options), {}, {
469
+ exporting: true
470
+ });
471
+ return (0, _composerHelpers.compose_)([cleanupExportImageUpdater, (0, _composerHelpers.apply_)(setExportImageSettingUpdater, (0, _composerHelpers.payload_)(imageSettings))])(state);
472
+ };
473
+
474
+ /**
475
+ * Set selected dataset for export
476
+ * @memberof uiStateUpdaters
477
+ * @param state `uiState`
478
+ * @param action
479
+ * @param action.payload dataset id
480
+ * @returns nextState
481
+ * @public
482
+ */
483
+ var setExportSelectedDatasetUpdater = exports.setExportSelectedDatasetUpdater = function setExportSelectedDatasetUpdater(state, _ref12) {
484
+ var dataset = _ref12.payload;
485
+ return _objectSpread(_objectSpread({}, state), {}, {
486
+ exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
487
+ selectedDataset: dataset
488
+ })
489
+ });
490
+ };
491
+
492
+ /**
493
+ * Set data format for exporting data
494
+ * @memberof uiStateUpdaters
495
+ * @param state `uiState`
496
+ * @param action
497
+ * @param action.payload one of `'text/csv'`
498
+ * @returns nextState
499
+ * @public
500
+ */
501
+ var setExportDataTypeUpdater = exports.setExportDataTypeUpdater = function setExportDataTypeUpdater(state, _ref13) {
502
+ var dataType = _ref13.payload;
503
+ return _objectSpread(_objectSpread({}, state), {}, {
504
+ exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
505
+ dataType: dataType
506
+ })
507
+ });
508
+ };
509
+
510
+ /**
511
+ * Whether to export filtered data, `true` or `false`
512
+ * @memberof uiStateUpdaters
513
+ * @param state `uiState`
514
+ * @param action
515
+ * @param action.payload
516
+ * @returns nextState
517
+ * @public
518
+ */
519
+ var setExportFilteredUpdater = exports.setExportFilteredUpdater = function setExportFilteredUpdater(state, _ref14) {
520
+ var filtered = _ref14.payload;
521
+ return _objectSpread(_objectSpread({}, state), {}, {
522
+ exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
523
+ filtered: filtered
524
+ })
525
+ });
526
+ };
527
+
528
+ /**
529
+ * Whether to including data in map config, toggle between `true` or `false`
530
+ * @memberof uiStateUpdaters
531
+ * @param state `uiState`
532
+ * @returns nextState
533
+ * @public
534
+ */
535
+ var setExportDataUpdater = exports.setExportDataUpdater = function setExportDataUpdater(state) {
536
+ return _objectSpread(_objectSpread({}, state), {}, {
537
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.JSON, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.JSON]), {}, {
538
+ hasData: !state.exportMap[_constants.EXPORT_MAP_FORMATS.JSON].hasData
539
+ })))
540
+ });
541
+ };
542
+
543
+ /**
544
+ * whether to export a mapbox access to HTML single page
545
+ * @param state - `uiState`
546
+ * @param action
547
+ * @param action.payload
548
+ * @returns nextState
549
+ * @public
550
+ */
551
+ var setUserMapboxAccessTokenUpdater = exports.setUserMapboxAccessTokenUpdater = function setUserMapboxAccessTokenUpdater(state, _ref15) {
552
+ var userMapboxToken = _ref15.payload;
553
+ return _objectSpread(_objectSpread({}, state), {}, {
554
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.HTML]), {}, {
555
+ userMapboxToken: userMapboxToken
556
+ })))
557
+ });
558
+ };
559
+
560
+ /**
561
+ * Sets the export map format
562
+ * @param state - `uiState`
563
+ * @param action
564
+ * @param action.payload format to use to export the map into
565
+ * @return nextState
566
+ */
567
+ var setExportMapFormatUpdater = exports.setExportMapFormatUpdater = function setExportMapFormatUpdater(state, _ref16) {
568
+ var format = _ref16.payload;
569
+ return _objectSpread(_objectSpread({}, state), {}, {
570
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, {
571
+ // @ts-expect-error
572
+ format: format
573
+ })
574
+ });
575
+ };
576
+
577
+ /**
578
+ * Set the export html map mode
579
+ * @param state - `uiState`
580
+ * @param action
581
+ * @param action.payload to be set (available modes: EXPORT_HTML_MAP_MODES)
582
+ * @return nextState
583
+ */
584
+ var setExportMapHTMLModeUpdater = exports.setExportMapHTMLModeUpdater = function setExportMapHTMLModeUpdater(state, _ref17) {
585
+ var mode = _ref17.payload;
586
+ return _objectSpread(_objectSpread({}, state), {}, {
587
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.HTML]), {}, {
588
+ mode: mode
589
+ })))
590
+ });
591
+ };
592
+
593
+ /**
594
+ * Adds a new notification.
595
+ * Updates a notification in case of matching ids.
596
+ * @memberof uiStateUpdaters
597
+ * @param state `uiState`
598
+ * @param action
599
+ * @param action.payload Params of a notification
600
+ * @returns nextState
601
+ * @public
602
+ */
603
+ var addNotificationUpdater = exports.addNotificationUpdater = function addNotificationUpdater(state, _ref18) {
604
+ var payload = _ref18.payload;
605
+ var oldNotifications = state.notifications || [];
606
+ // @ts-expect-error
607
+ var payloadId = payload === null || payload === void 0 ? void 0 : payload.id;
608
+ var notificationToUpdate = payloadId ? oldNotifications.find(function (n) {
609
+ return n.id === payloadId;
610
+ }) : null;
611
+ var notifications;
612
+ if (notificationToUpdate) {
613
+ notifications = oldNotifications.map(function (n) {
614
+ return n.id === payloadId ? (0, _utils.createNotification)(_objectSpread(_objectSpread({}, payload), {}, {
615
+ count: n.count + 1
616
+ })) : n;
617
+ });
618
+ } else {
619
+ notifications = [].concat((0, _toConsumableArray2["default"])(oldNotifications), [(0, _utils.createNotification)(payload)]);
620
+ }
621
+ return _objectSpread(_objectSpread({}, state), {}, {
622
+ notifications: notifications
623
+ });
624
+ };
625
+
626
+ /**
627
+ * Remove a notification
628
+ * @memberof uiStateUpdaters
629
+ * @param state `uiState`
630
+ * @param action
631
+ * @param action.payload id of the notification to be removed
632
+ * @returns nextState
633
+ * @public
634
+ */
635
+ var removeNotificationUpdater = exports.removeNotificationUpdater = function removeNotificationUpdater(state, _ref19) {
636
+ var id = _ref19.payload;
637
+ return _objectSpread(_objectSpread({}, state), {}, {
638
+ notifications: state.notifications.filter(function (n) {
639
+ return n.id !== id;
640
+ })
641
+ });
642
+ };
643
+
644
+ /**
645
+ * Fired when file loading begin
646
+ * @memberof uiStateUpdaters
647
+ * @param state `uiState`
648
+ * @returns nextState
649
+ * @public
650
+ */
651
+ var loadFilesUpdater = exports.loadFilesUpdater = function loadFilesUpdater(state) {
652
+ return _objectSpread(_objectSpread({}, state), {}, {
653
+ loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
654
+ fileLoading: true
655
+ })
656
+ });
657
+ };
658
+
659
+ /**
660
+ * Handles loading file success and set fileLoading property to false
661
+ * @memberof uiStateUpdaters
662
+ * @param state `uiState`
663
+ * @returns nextState
664
+ */
665
+ var loadFilesSuccessUpdater = exports.loadFilesSuccessUpdater = function loadFilesSuccessUpdater(state) {
666
+ return _objectSpread(_objectSpread({}, state), {}, {
667
+ loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
668
+ fileLoading: false
669
+ })
670
+ });
671
+ };
672
+
673
+ /**
674
+ * Handles load file error and set fileLoading property to false
675
+ * @memberof uiStateUpdaters
676
+ * @param state
677
+ * @param action
678
+ * @param action.error
679
+ * @returns nextState
680
+ * @public
681
+ */
682
+ var loadFilesErrUpdater = exports.loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref20) {
683
+ var error = _ref20.error;
684
+ return addNotificationUpdater(_objectSpread(_objectSpread({}, state), {}, {
685
+ loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
686
+ fileLoading: false
687
+ })
688
+ }), {
689
+ payload: (0, _utils.errorNotification)({
690
+ message: (error || {}).message || 'Failed to upload files',
691
+ topic: _constants.DEFAULT_NOTIFICATION_TOPICS.global
692
+ })
693
+ });
694
+ };
695
+
696
+ /**
697
+ * Handles toggle map split and reset all map control index to 0
698
+ * @memberof uiStateUpdaters
699
+ * @param state
700
+ * @returns nextState
701
+ * @public
702
+ */
703
+ var toggleSplitMapUpdater = exports.toggleSplitMapUpdater = function toggleSplitMapUpdater(state) {
704
+ return _objectSpread(_objectSpread({}, state), {}, {
705
+ mapControls: Object.entries(state.mapControls).reduce(function (acc, entry) {
706
+ return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, entry[0], _objectSpread(_objectSpread({}, entry[1]), {}, {
707
+ activeMapIndex: 0
708
+ })));
709
+ }, {})
710
+ });
711
+ };
712
+
713
+ /**
714
+ * Toggle modal data
715
+ * @memberof uiStateUpdaters
716
+ * @param state
717
+ * @returns nextState
718
+ * @public
719
+ */
720
+ var showDatasetTableUpdater = exports.showDatasetTableUpdater = function showDatasetTableUpdater(state) {
721
+ return toggleModalUpdater(state, {
722
+ payload: _constants.DATA_TABLE_ID
723
+ });
724
+ };
725
+
726
+ /**
727
+ * Set the locale of the UI
728
+ * @memberof uiStateUpdaters
729
+ * @param state `uiState`
730
+ * @param action
731
+ * @param action.payload
732
+ * @param action.payload.locale locale
733
+ * @returns nextState
734
+ * @public
735
+ */
736
+ var setLocaleUpdater = exports.setLocaleUpdater = function setLocaleUpdater(state, _ref21) {
737
+ var locale = _ref21.payload.locale;
738
+ return _objectSpread(_objectSpread({}, state), {}, {
739
+ locale: locale
740
+ });
741
+ };
742
+
743
+ /**
744
+ * Toggle layer panel list view
745
+ * @memberof uiStateUpdaters
746
+ * @param state `uiState`
747
+ * @param action
748
+ * @param action.payload layer panel listView value. Can be 'list' or 'sortByDataset'
749
+ * @returns nextState
750
+ * @public
751
+ */
752
+ var togglePanelListViewUpdater = exports.togglePanelListViewUpdater = function togglePanelListViewUpdater(state, _ref22) {
753
+ var _ref22$payload = _ref22.payload,
754
+ panelId = _ref22$payload.panelId,
755
+ listView = _ref22$payload.listView;
756
+ var stateProp = panelId === 'layer' ? 'layerPanelListView' : panelId === 'filter' ? 'filterPanelListView' : null;
757
+ if (!stateProp || state[stateProp] === listView) {
758
+ return state;
759
+ }
760
+ return _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, stateProp, listView));
761
+ };
762
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9sb2NhbGl6YXRpb24iLCJfdXRpbHMiLCJfY29tcG9zZXJIZWxwZXJzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMIiwiZXhwb3J0cyIsIkRFRkFVTFRfTU9EQUwiLCJBRERfREFUQV9JRCIsInVpU3RhdGVVcGRhdGVycyIsIkRFRkFVTFRfTUFQX0NPTlRST0xTX0ZFQVRVUkVTIiwic2hvdyIsImFjdGl2ZSIsImRpc2FibGVDbG9zZSIsImFjdGl2ZU1hcEluZGV4IiwiREVGQVVMVF9NQVBfTEVHRU5EX0NPTlRST0wiLCJkaXNhYmxlRWRpdCIsIkRFRkFVTFRfTUFQX0NPTlRST0xTIiwiTUFQX0NPTlRST0xTIiwicmVkdWNlIiwiZmluYWwiLCJjdXJyZW50IiwibWFwTGVnZW5kIiwiREVGQVVMVF9FWFBPUlRfSU1BR0UiLCJyYXRpbyIsIkVYUE9SVF9JTUdfUkFUSU9TIiwiU0NSRUVOIiwicmVzb2x1dGlvbiIsIlJFU09MVVRJT05TIiwiT05FX1giLCJsZWdlbmQiLCJtYXBIIiwibWFwVyIsImltYWdlU2l6ZSIsInpvb21PZmZzZXQiLCJzY2FsZSIsImltYWdlVyIsImltYWdlSCIsImNlbnRlciIsImltYWdlRGF0YVVyaSIsImV4cG9ydGluZyIsInByb2Nlc3NpbmciLCJlcnJvciIsImVzY2FwZVhodG1sRm9yV2VicGFjayIsIkRFRkFVTFRfTE9BRF9GSUxFUyIsImZpbGVMb2FkaW5nIiwiREVGQVVMVF9FWFBPUlRfREFUQSIsInNlbGVjdGVkRGF0YXNldCIsImRhdGFUeXBlIiwiRVhQT1JUX0RBVEFfVFlQRSIsIkNTViIsImZpbHRlcmVkIiwiREVGQVVMVF9OT1RJRklDQVRJT05TIiwiREVGQVVMVF9FWFBPUlRfSFRNTCIsImV4cG9ydE1hcGJveEFjY2Vzc1Rva2VuIiwidXNlck1hcGJveFRva2VuIiwibW9kZSIsIkVYUE9SVF9IVE1MX01BUF9NT0RFUyIsIlJFQUQiLCJERUZBVUxUX0VYUE9SVF9KU09OIiwiaGFzRGF0YSIsIkRFRkFVTFRfRVhQT1JUX01BUCIsIkVYUE9SVF9NQVBfRk9STUFUUyIsIkhUTUwiLCJKU09OIiwiSU5JVElBTF9VSV9TVEFURSIsInJlYWRPbmx5IiwiYWN0aXZlU2lkZVBhbmVsIiwiY3VycmVudE1vZGFsIiwiZGF0YXNldEtleVRvUmVtb3ZlIiwidmlzaWJsZURyb3Bkb3duIiwiZXhwb3J0SW1hZ2UiLCJleHBvcnREYXRhIiwiZXhwb3J0TWFwIiwibWFwQ29udHJvbHMiLCJub3RpZmljYXRpb25zIiwibG9hZEZpbGVzIiwibG9jYWxlIiwiTE9DQUxFX0NPREVTIiwiZW4iLCJsYXllclBhbmVsTGlzdFZpZXciLCJmaWx0ZXJQYW5lbExpc3RWaWV3IiwiaXNTaWRlUGFuZWxDbG9zZUJ1dHRvblZpc2libGUiLCJpbml0VWlTdGF0ZVVwZGF0ZXIiLCJzdGF0ZSIsImFjdGlvbiIsInBheWxvYWQiLCJpbml0aWFsVWlTdGF0ZSIsInRvZ2dsZVNpZGVQYW5lbFVwZGF0ZXIiLCJfcmVmIiwiaWQiLCJ0b2dnbGVNb2RhbFVwZGF0ZXIiLCJfcmVmMiIsInNob3dFeHBvcnREcm9wZG93blVwZGF0ZXIiLCJfcmVmMyIsImhpZGVFeHBvcnREcm9wZG93blVwZGF0ZXIiLCJ0b2dnbGVTaWRlUGFuZWxDbG9zZUJ1dHRvblVwZGF0ZXIiLCJfcmVmNCIsInRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyIiwiX3JlZjUiLCJfc3RhdGUkbWFwQ29udHJvbHMkcGEiLCJfcmVmNSRwYXlsb2FkIiwicGFuZWxJZCIsIl9yZWY1JHBheWxvYWQkaW5kZXgiLCJpbmRleCIsInVwZGF0ZWRTdGF0ZSIsInBhbmVsVG9EZWFjdGl2YXRlIiwiZWZmZWN0IiwiYWlBc3Npc3RhbnQiLCJzZXRNYXBDb250cm9sVmlzaWJpbGl0eVVwZGF0ZXIiLCJfcmVmNiIsIl9zdGF0ZSRtYXBDb250cm9scyIsIl9yZWY2JHBheWxvYWQiLCJCb29sZWFuIiwib3BlbkRlbGV0ZU1vZGFsVXBkYXRlciIsIl9yZWY3IiwiREVMRVRFX0RBVEFfSUQiLCJzZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyIiwiX3JlZjgiLCJuZXdTZXR0aW5nIiwidXBkYXRlZCIsImNhbGN1bGF0ZUV4cG9ydEltYWdlU2l6ZSIsInNldEV4cG9ydEltYWdlRGF0YVVyaVVwZGF0ZXIiLCJfcmVmOSIsImRhdGFVcmkiLCJzZXRFeHBvcnRJbWFnZUVycm9yVXBkYXRlciIsIl9yZWYxMCIsImNsZWFudXBFeHBvcnRJbWFnZVVwZGF0ZXIiLCJzdGFydEV4cG9ydGluZ0ltYWdlVXBkYXRlciIsIl9yZWYxMSIsIl9yZWYxMSRwYXlsb2FkIiwib3B0aW9ucyIsImltYWdlU2V0dGluZ3MiLCJjb21wb3NlXyIsImFwcGx5XyIsInBheWxvYWRfIiwic2V0RXhwb3J0U2VsZWN0ZWREYXRhc2V0VXBkYXRlciIsIl9yZWYxMiIsImRhdGFzZXQiLCJzZXRFeHBvcnREYXRhVHlwZVVwZGF0ZXIiLCJfcmVmMTMiLCJzZXRFeHBvcnRGaWx0ZXJlZFVwZGF0ZXIiLCJfcmVmMTQiLCJzZXRFeHBvcnREYXRhVXBkYXRlciIsInNldFVzZXJNYXBib3hBY2Nlc3NUb2tlblVwZGF0ZXIiLCJfcmVmMTUiLCJzZXRFeHBvcnRNYXBGb3JtYXRVcGRhdGVyIiwiX3JlZjE2IiwiZm9ybWF0Iiwic2V0RXhwb3J0TWFwSFRNTE1vZGVVcGRhdGVyIiwiX3JlZjE3IiwiYWRkTm90aWZpY2F0aW9uVXBkYXRlciIsIl9yZWYxOCIsIm9sZE5vdGlmaWNhdGlvbnMiLCJwYXlsb2FkSWQiLCJub3RpZmljYXRpb25Ub1VwZGF0ZSIsImZpbmQiLCJuIiwibWFwIiwiY3JlYXRlTm90aWZpY2F0aW9uIiwiY291bnQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwicmVtb3ZlTm90aWZpY2F0aW9uVXBkYXRlciIsIl9yZWYxOSIsImxvYWRGaWxlc1VwZGF0ZXIiLCJsb2FkRmlsZXNTdWNjZXNzVXBkYXRlciIsImxvYWRGaWxlc0VyclVwZGF0ZXIiLCJfcmVmMjAiLCJlcnJvck5vdGlmaWNhdGlvbiIsIm1lc3NhZ2UiLCJ0b3BpYyIsIkRFRkFVTFRfTk9USUZJQ0FUSU9OX1RPUElDUyIsImdsb2JhbCIsInRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsImVudHJpZXMiLCJhY2MiLCJlbnRyeSIsInNob3dEYXRhc2V0VGFibGVVcGRhdGVyIiwiREFUQV9UQUJMRV9JRCIsInNldExvY2FsZVVwZGF0ZXIiLCJfcmVmMjEiLCJ0b2dnbGVQYW5lbExpc3RWaWV3VXBkYXRlciIsIl9yZWYyMiIsIl9yZWYyMiRwYXlsb2FkIiwibGlzdFZpZXciLCJzdGF0ZVByb3AiXSwic291cmNlcyI6WyIuLi9zcmMvdWktc3RhdGUtdXBkYXRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtcbiAgQUREX0RBVEFfSUQsXG4gIERBVEFfVEFCTEVfSUQsXG4gIERFRkFVTFRfTk9USUZJQ0FUSU9OX1RPUElDUyxcbiAgREVMRVRFX0RBVEFfSUQsXG4gIEVYUE9SVF9EQVRBX1RZUEUsXG4gIEVYUE9SVF9IVE1MX01BUF9NT0RFUyxcbiAgRVhQT1JUX0lNR19SQVRJT1MsXG4gIEVYUE9SVF9NQVBfRk9STUFUUyxcbiAgUkVTT0xVVElPTlMsXG4gIE1BUF9DT05UUk9MUyxcbiAgRXhwb3J0SW1hZ2Vcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtMT0NBTEVfQ09ERVN9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7Y3JlYXRlTm90aWZpY2F0aW9uLCBlcnJvck5vdGlmaWNhdGlvbiwgY2FsY3VsYXRlRXhwb3J0SW1hZ2VTaXplfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7cGF5bG9hZF8sIGFwcGx5XywgY29tcG9zZV99IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5cbmltcG9ydCB7XG4gIEFjdGlvblR5cGVzLFxuICBLZXBsZXJHbEluaXRQYXlsb2FkLFxuICBMb2FkRmlsZXNFcnJVcGRhdGVyQWN0aW9uLFxuICBVSVN0YXRlQWN0aW9uc1xufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtcbiAgRXhwb3J0RGF0YSxcbiAgRXhwb3J0SHRtbCxcbiAgRXhwb3J0SnNvbixcbiAgRXhwb3J0TWFwLFxuICBNYXBDb250cm9sSXRlbSxcbiAgTWFwQ29udHJvbHMsXG4gIFVpU3RhdGVcbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMID0gJ2xheWVyJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREFMID0gQUREX0RBVEFfSUQ7XG5cbi8qKlxuICogVXBkYXRlcnMgZm9yIGB1aVN0YXRlYCByZWR1Y2VyLiBDYW4gYmUgdXNlZCBpbiB5b3VyIHJvb3QgcmVkdWNlciB0byBkaXJlY3RseSBtb2RpZnkga2VwbGVyLmdsJ3Mgc3RhdGUuXG4gKiBSZWFkIG1vcmUgYWJvdXQgW1VzaW5nIHVwZGF0ZXJzXSguLi9hZHZhbmNlZC11c2FnZS91c2luZy11cGRhdGVycy5tZClcbiAqXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBrZXBsZXJHbFJlZHVjZXIsIHt1aVN0YXRlVXBkYXRlcnN9IGZyb20gJ2tlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiAvLyBSb290IFJlZHVjZXJcbiAqIGNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAqICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICogIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogY29uc3QgY29tcG9zZWRSZWR1Y2VyID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAqICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gKiAgICAvLyBjbGljayBidXR0b24gdG8gY2xvc2Ugc2lkZSBwYW5lbFxuICogICAgY2FzZSAnQ0xJQ0tfQlVUVE9OJzpcbiAqICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAuLi5zdGF0ZSxcbiAqICAgICAgICBrZXBsZXJHbDoge1xuICogICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wsXG4gKiAgICAgICAgICBmb286IHtcbiAqICAgICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLmZvbyxcbiAqICAgICAgICAgICAgIHVpU3RhdGU6IHVpU3RhdGVVcGRhdGVycy50b2dnbGVTaWRlUGFuZWxVcGRhdGVyKFxuICogICAgICAgICAgICAgICB1aVN0YXRlLCB7cGF5bG9hZDogbnVsbH1cbiAqICAgICAgICAgICAgIClcbiAqICAgICAgICAgIH1cbiAqICAgICAgICB9XG4gKiAgICAgIH07XG4gKiAgfVxuICogIHJldHVybiByZWR1Y2VycyhzdGF0ZSwgYWN0aW9uKTtcbiAqIH07XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgY29tcG9zZWRSZWR1Y2VyO1xuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8vIEB0cy1pZ25vcmVcbmNvbnN0IHVpU3RhdGVVcGRhdGVycyA9IG51bGw7XG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuXG5jb25zdCBERUZBVUxUX01BUF9DT05UUk9MU19GRUFUVVJFUzogTWFwQ29udHJvbEl0ZW0gPSB7XG4gIHNob3c6IHRydWUsXG4gIGFjdGl2ZTogZmFsc2UsXG4gIGRpc2FibGVDbG9zZTogZmFsc2UsXG4gIC8vIGRlZmluZXMgd2hpY2ggbWFwIGluZGV4IHVzZXJzIGFyZSBpbnRlcmFjdGluZyB3aXRoICh0aHJvdWdoIG1hcCBjb250cm9scylcbiAgYWN0aXZlTWFwSW5kZXg6IDBcbn07XG5cbmNvbnN0IERFRkFVTFRfTUFQX0xFR0VORF9DT05UUk9MID0ge1xuICAuLi5ERUZBVUxUX01BUF9DT05UUk9MU19GRUFUVVJFUyxcbiAgZGlzYWJsZUVkaXQ6IGZhbHNlXG59O1xuLyoqXG4gKiBBIGxpc3Qgb2YgbWFwIGNvbnRyb2wgdmlzaWJpbGl0eSBhbmQgd2hldGhlciBpcyBpdCBhY3RpdmUuXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSB2aXNpYmxlTGF5ZXJzIERlZmF1bHQ6IGB7c2hvdzogdHJ1ZSwgYWN0aXZlOiBmYWxzZX1gXG4gKiBAcHJvcGVydHkgbWFwTGVnZW5kIERlZmF1bHQ6IGB7c2hvdzogdHJ1ZSwgYWN0aXZlOiBmYWxzZX1gXG4gKiBAcHJvcGVydHkgdG9nZ2xlM2QgRGVmYXVsdDogYHtzaG93OiB0cnVlfWBcbiAqIEBwcm9wZXJ0eSBzcGxpdE1hcCBEZWZhdWx0OiBge3Nob3c6IHRydWV9YFxuICogQHByb3BlcnR5IG1hcERyYXcgRGVmYXVsdDogYHtzaG93OiB0cnVlLCBhY3RpdmU6IGZhbHNlfWBcbiAqIEBwcm9wZXJ0eSBtYXBMb2NhbGUgRGVmYXVsdDogYHtzaG93OiBmYWxzZSwgYWN0aXZlOiBmYWxzZX1gXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BUF9DT05UUk9MUzogTWFwQ29udHJvbHMgPSAoXG4gIE9iamVjdC5rZXlzKE1BUF9DT05UUk9MUykgYXMgQXJyYXk8a2V5b2YgdHlwZW9mIE1BUF9DT05UUk9MUz5cbikucmVkdWNlKFxuICAoZmluYWwsIGN1cnJlbnQpID0+ICh7XG4gICAgLi4uZmluYWwsXG4gICAgW2N1cnJlbnRdOlxuICAgICAgY3VycmVudCA9PT0gTUFQX0NPTlRST0xTLm1hcExlZ2VuZFxuICAgICAgICA/IERFRkFVTFRfTUFQX0xFR0VORF9DT05UUk9MXG4gICAgICAgIDogREVGQVVMVF9NQVBfQ09OVFJPTFNfRkVBVFVSRVNcbiAgfSksXG4gIHt9IGFzIE1hcENvbnRyb2xzXG4pO1xuXG4vKipcbiAqIERlZmF1bHQgaW1hZ2UgZXhwb3J0IGNvbmZpZ1xuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgcmF0aW8gRGVmYXVsdDogYCdTQ1JFRU4nYCxcbiAqIEBwcm9wZXJ0eSByZXNvbHV0aW9uIERlZmF1bHQ6IGAnT05FX1gnYCxcbiAqIEBwcm9wZXJ0eSBsZWdlbmQgRGVmYXVsdDogYGZhbHNlYCxcbiAqIEBwcm9wZXJ0eSBtYXBIIERlZmF1bHQ6IDAsXG4gKiBAcHJvcGVydHkgbWFwVyBEZWZhdWx0OiAwLFxuICogQHByb3BlcnR5IGltYWdlU2l6ZSBEZWZhdWx0OiB7em9vbU9mZnNldDogMCwgc2NhbGU6IDEsIGltYWdlVzogMCwgaW1hZ2VIOiAwfSxcbiAqIEBwcm9wZXJ0eSBpbWFnZURhdGFVcmkgRGVmYXVsdDogYCcnYCxcbiAqIEBwcm9wZXJ0eSBleHBvcnRpbmcgRGVmYXVsdDogYGZhbHNlYFxuICogQHByb3BlcnR5IGVycm9yIERlZmF1bHQ6IGBmYWxzZWBcbiAqIEBwcm9wZXJ0eSBlc2NhcGVYaHRtbEZvcldlYnBhY2sgRGVmYXVsdDogYHRydWVgXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9JTUFHRTogRXhwb3J0SW1hZ2UgPSB7XG4gIC8vIHVzZXIgb3B0aW9uc1xuICByYXRpbzogRVhQT1JUX0lNR19SQVRJT1MuU0NSRUVOLFxuICByZXNvbHV0aW9uOiBSRVNPTFVUSU9OUy5PTkVfWCxcbiAgbGVnZW5kOiBmYWxzZSxcbiAgbWFwSDogMCxcbiAgbWFwVzogMCxcbiAgaW1hZ2VTaXplOiB7XG4gICAgem9vbU9mZnNldDogMCxcbiAgICBzY2FsZTogMSxcbiAgICBpbWFnZVc6IDAsXG4gICAgaW1hZ2VIOiAwXG4gIH0sXG4gIC8vIHdoZW4gdGhpcyBpcyBzZXQgdG8gdHJ1ZSwgdGhlIG1vY2sgbWFwIHZpZXdwb3J0IHdpbGwgbW92ZSB0byB0aGUgY2VudGVyIG9mIGRhdGFcbiAgY2VudGVyOiBmYWxzZSxcbiAgLy8gZXhwb3J0aW5nIHN0YXRlXG4gIGltYWdlRGF0YVVyaTogJycsXG4gIC8vIGV4cG9ydGluZzogdXNlZCB0byBhdHRhY2ggcGxvdC1jb250YWluZXIgdG8gZG9tXG4gIGV4cG9ydGluZzogZmFsc2UsXG4gIC8vIHByb2Nlc3Npbmc6IHVzZWQgYXMgbG9hZGluZyBpbmRpY2F0b3Igd2hlbiBleHBvcnQgaW1hZ2UgaXMgYmVpbmcgcHJvZHVjZWRcbiAgcHJvY2Vzc2luZzogZmFsc2UsXG4gIGVycm9yOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byBhcHBseSBmaXggZm9yIHVnbGlmeSBlcnJvciBpbiBkb20tdG8taW1hZ2UgKHNob3VsZCBiZSB0cnVlIGZvciB3ZWJwYWNrIGJ1aWxkcylcbiAgZXNjYXBlWGh0bWxGb3JXZWJwYWNrOiB0cnVlXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9MT0FEX0ZJTEVTID0ge1xuICBmaWxlTG9hZGluZzogZmFsc2Vcbn07XG5cbi8qKlxuICogRGVmYXVsdCBpbml0aWFsIGBleHBvcnREYXRhYCBzZXR0aW5nc1xuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgc2VsZWN0ZWREYXRhc2V0IERlZmF1bHQ6IGAnJ2AsXG4gKiBAcHJvcGVydHkgZGF0YVR5cGUgRGVmYXVsdDogYCdjc3YnYCxcbiAqIEBwcm9wZXJ0eSBmaWx0ZXJlZCBEZWZhdWx0OiBgdHJ1ZWAsXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9EQVRBOiBFeHBvcnREYXRhID0ge1xuICBzZWxlY3RlZERhdGFzZXQ6ICcnLFxuICBkYXRhVHlwZTogRVhQT1JUX0RBVEFfVFlQRS5DU1YsXG4gIGZpbHRlcmVkOiB0cnVlXG59O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9OT1RJRklDQVRJT05TID0gW107XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgZXhwb3J0TWFwYm94QWNjZXNzVG9rZW4gLSBEZWZhdWx0OiBudWxsLCB0aGlzIGlzIHVzZWQgd2hlbiB3ZSBwcm92aWRlIGEgZGVmYXVsdCBtYXBib3ggdG9rZW4gZm9yIHVzZXJzIHRvIHRha2UgYWR2YW50YWdlIG9mXG4gKiBAcHJvcGVydHkgdXNlck1hcGJveFRva2VuIC0gRGVmYXVsdDogJycsIG1hcGJveCB0b2tlbiBwcm92aWRlZCBieSB1c2VyIHRocm91Z2ggaW5wdXQgZmllbGRcbiAqIEBwcm9wZXJ0eSBtb2RlIC0gRGVmYXVsdDogJ1JFQUQnLCByZWFkIG9ubHkgb3IgZWRpdGFibGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhQT1JUX0hUTUw6IEV4cG9ydEh0bWwgPSB7XG4gIGV4cG9ydE1hcGJveEFjY2Vzc1Rva2VuOiBudWxsLFxuICB1c2VyTWFwYm94VG9rZW46ICcnLFxuICBtb2RlOiBFWFBPUlRfSFRNTF9NQVBfTU9ERVMuUkVBRFxufTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBoYXNEYXRhIC0gRGVmYXVsdDogJ3RydWUnLFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfSlNPTjogRXhwb3J0SnNvbiA9IHtcbiAgaGFzRGF0YTogdHJ1ZVxufTtcblxuLyoqXG4gKiBFeHBvcnQgTWFwIENvbmZpZ1xuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgSFRNTCAtIERlZmF1bHQ6ICdERUZBVUxUX0VYUE9SVF9IVE1MJyxcbiAqIEBwcm9wZXJ0eSBKU09OIC0gRGVmYXVsdDogJ0RFRkFVTFRfRVhQT1JUX0pTT04nLFxuICogQHByb3BlcnR5IGZvcm1hdCAtIERlZmF1bHQ6ICdIVE1MJyxcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhQT1JUX01BUDogRXhwb3J0TWFwID0ge1xuICBbRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxdOiBERUZBVUxUX0VYUE9SVF9IVE1MLFxuICBbRVhQT1JUX01BUF9GT1JNQVRTLkpTT05dOiBERUZBVUxUX0VYUE9SVF9KU09OLFxuICBmb3JtYXQ6IEVYUE9SVF9NQVBfRk9STUFUUy5IVE1MXG59O1xuXG4vKipcbiAqIERlZmF1bHQgaW5pdGlhbCBgdWlTdGF0ZWBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHJlYWRPbmx5IERlZmF1bHQ6IGBmYWxzZWBcbiAqIEBwcm9wZXJ0eSBhY3RpdmVTaWRlUGFuZWwgRGVmYXVsdDogYCdsYXllcidgXG4gKiBAcHJvcGVydHkgY3VycmVudE1vZGFsIERlZmF1bHQ6IGAnYWRkRGF0YSdgXG4gKiBAcHJvcGVydHkgZGF0YXNldEtleVRvUmVtb3ZlIERlZmF1bHQ6IGBudWxsYFxuICogQHByb3BlcnR5IHZpc2libGVEcm9wZG93biBEZWZhdWx0OiBgbnVsbGBcbiAqIEBwcm9wZXJ0eSBleHBvcnRJbWFnZSBEZWZhdWx0OiBbYERFRkFVTFRfRVhQT1JUX0lNQUdFYF0oI2RlZmF1bHRfZXhwb3J0X2ltYWdlKVxuICogQHByb3BlcnR5IGV4cG9ydERhdGEgRGVmYXVsdDogW2BERUZBVUxUX0VYUE9SVF9EQVRBYF0oI2RlZmF1bHRfZXhwb3J0X2RhdGEpXG4gKiBAcHJvcGVydHkgZXhwb3J0TWFwIERlZmF1bHQ6IFtgREVGQVVMVF9FWFBPUlRfTUFQYF0oI2RlZmF1bHRfZXhwb3J0X21hcClcbiAqIEBwcm9wZXJ0eSBtYXBDb250cm9scyBEZWZhdWx0OiBbYERFRkFVTFRfTUFQX0NPTlRST0xTYF0oI2RlZmF1bHRfbWFwX2NvbnRyb2xzKVxuICogQHByb3BlcnR5IG5vdGlmaWNhdGlvbnMgRGVmYXVsdDogYFtdYFxuICogQHByb3BlcnR5IG5vdGlmaWNhdGlvbnMgRGVmYXVsdDogYFtdYFxuICogQHByb3BlcnR5IGxvYWRGaWxlc1xuICogQHByb3BlcnR5IGlzU2lkZVBhbmVsQ2xvc2VCdXR0b25WaXNpYmxlIERlZmF1bHQ6IGB0cnVlYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSU5JVElBTF9VSV9TVEFURTogVWlTdGF0ZSA9IHtcbiAgcmVhZE9ubHk6IGZhbHNlLFxuICBhY3RpdmVTaWRlUGFuZWw6IERFRkFVTFRfQUNUSVZFX1NJREVfUEFORUwsXG4gIGN1cnJlbnRNb2RhbDogREVGQVVMVF9NT0RBTCxcbiAgZGF0YXNldEtleVRvUmVtb3ZlOiBudWxsLFxuICB2aXNpYmxlRHJvcGRvd246IG51bGwsXG4gIC8vIGV4cG9ydCBpbWFnZSBtb2RhbCB1aVxuICBleHBvcnRJbWFnZTogREVGQVVMVF9FWFBPUlRfSU1BR0UsXG4gIC8vIGV4cG9ydCBkYXRhIG1vZGFsIHVpXG4gIGV4cG9ydERhdGE6IERFRkFVTFRfRVhQT1JUX0RBVEEsXG4gIC8vIGh0bWwgZXhwb3J0XG4gIGV4cG9ydE1hcDogREVGQVVMVF9FWFBPUlRfTUFQLFxuICAvLyBtYXAgY29udHJvbCBwYW5lbHNcbiAgbWFwQ29udHJvbHM6IERFRkFVTFRfTUFQX0NPTlRST0xTLFxuICAvLyB1aSBub3RpZmljYXRpb25zXG4gIG5vdGlmaWNhdGlvbnM6IERFRkFVTFRfTk9USUZJQ0FUSU9OUyxcbiAgLy8gbG9hZCBmaWxlc1xuICBsb2FkRmlsZXM6IERFRkFVTFRfTE9BRF9GSUxFUyxcbiAgLy8gTG9jYWxlIG9mIHRoZSBVSVxuICBsb2NhbGU6IExPQ0FMRV9DT0RFUy5lbixcbiAgbGF5ZXJQYW5lbExpc3RWaWV3OiAnbGlzdCcsXG4gIGZpbHRlclBhbmVsTGlzdFZpZXc6ICdsaXN0JyxcbiAgaXNTaWRlUGFuZWxDbG9zZUJ1dHRvblZpc2libGU6IHRydWVcbn07XG5cbi8qIFVwZGF0ZXJzICovXG4vKipcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGluaXRVaVN0YXRlVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIGFjdGlvbjoge1xuICAgIHR5cGU/OiAodHlwZW9mIEFjdGlvblR5cGVzKVsnSU5JVCddO1xuICAgIHBheWxvYWQ6IEtlcGxlckdsSW5pdFBheWxvYWQ7XG4gIH1cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIC4uLihhY3Rpb24ucGF5bG9hZCB8fCB7fSkuaW5pdGlhbFVpU3RhdGVcbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBhY3RpdmUgc2lkZSBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGlkIG9mIHNpZGUgcGFuZWwgdG8gYmUgc2hvd24sIG9uZSBvZiBgbGF5ZXJgLCBgZmlsdGVyYCwgYGludGVyYWN0aW9uYCwgYG1hcGAuIGNsb3NlIHNpZGUgcGFuZWwgaWYgYG51bGxgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNpZGVQYW5lbFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogaWR9OiBVSVN0YXRlQWN0aW9ucy5Ub2dnbGVTaWRlUGFuZWxVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgcmV0dXJuIGlkID09PSBzdGF0ZS5hY3RpdmVTaWRlUGFuZWxcbiAgICA/IHN0YXRlXG4gICAgOiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBhY3RpdmVTaWRlUGFuZWw6IGlkXG4gICAgICB9O1xufTtcblxuLyoqXG4gKiBTaG93IGFuZCBoaWRlIG1vZGFsIGRpYWxvZ1xuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtYWN0aW9uLnBheWxvYWQgaWQgb2YgbW9kYWwgdG8gYmUgc2hvd24sIG51bGwgdG8gaGlkZSBtb2RhbHMuIE9uZSBvZjpcbiAqICAtIFtgREFUQV9UQUJMRV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2RhdGFfdGFibGVfaWQpXG4gKiAgLSBbYERFTEVURV9EQVRBX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjZGVsZXRlX2RhdGFfaWQpXG4gKiAgLSBbYEFERF9EQVRBX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjYWRkX2RhdGFfaWQpXG4gKiAgLSBbYEVYUE9SVF9JTUFHRV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2V4cG9ydF9pbWFnZV9pZClcbiAqICAtIFtgRVhQT1JUX0RBVEFfSURgXSguLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5tZCNleHBvcnRfZGF0YV9pZClcbiAqICAtIFtgQUREX01BUF9TVFlMRV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2FkZF9tYXBfc3R5bGVfaWQpXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZU1vZGFsVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBpZH06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZU1vZGFsVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgY3VycmVudE1vZGFsOiBpZFxufSk7XG5cbi8qKlxuICogSGlkZSBhbmQgc2hvdyBzaWRlIHBhbmVsIGhlYWRlciBkcm9wZG93biwgYWN0aXZhdGVkIGJ5IGNsaWNraW5nIHRoZSBzaGFyZSBsaW5rIG9uIHRvcCBvZiB0aGUgc2lkZSBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2hvd0V4cG9ydERyb3Bkb3duVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBpZH06IFVJU3RhdGVBY3Rpb25zLlNob3dFeHBvcnREcm9wZG93blVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIHZpc2libGVEcm9wZG93bjogaWRcbn0pO1xuXG4vKipcbiAqIEhpZGUgc2lkZSBwYW5lbCBoZWFkZXIgZHJvcGRvd24sIGFjdGl2YXRlZCBieSBjbGlja2luZyB0aGUgc2hhcmUgbGluayBvbiB0b3Agb2YgdGhlIHNpZGUgcGFuZWxcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGhpZGVFeHBvcnREcm9wZG93blVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICB2aXNpYmxlRHJvcGRvd246IG51bGxcbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBzaWRlIHBhbmVsIGNsb3NlIGJ1dHRvbiBvbiB0b3AgbGVmdCBvZiB0aGUgc2lkZSBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlU2lkZVBhbmVsQ2xvc2VCdXR0b25VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHtzaG93fX06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZVNpZGVQYW5lbENsb3NlQnV0dG9uVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgaXNTaWRlUGFuZWxDbG9zZUJ1dHRvblZpc2libGU6IHNob3dcbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBhY3RpdmUgbWFwIGNvbnRyb2wgcGFuZWxcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgbWFwIGNvbnRyb2wgcGFuZWwgaWQsIG9uZSBvZiB0aGUga2V5cyBvZjogW2BERUZBVUxUX01BUF9DT05UUk9MU2BdKCNkZWZhdWx0X21hcF9jb250cm9scylcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge3BhbmVsSWQsIGluZGV4ID0gMH19OiBVSVN0YXRlQWN0aW9ucy5Ub2dnbGVNYXBDb250cm9sVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGxldCB1cGRhdGVkU3RhdGUgPSBzdGF0ZTtcbiAgLy8gVGhlIGVmZmVjdCBwYW5lbCBhbmQgYWkgYXNzaXN0YW50IHBhbmVsIGNhbiBub3QgYmUgYWN0aXZlIGF0IHRoZSBzYW1lIHRpbWVcbiAgLy8gc28gd2UgbmVlZCB0byBkZWFjdGl2YXRlIHRoZSBvdGhlciBwYW5lbCB3aGVuIG9uZSBpcyBhY3RpdmF0ZWRcbiAgY29uc3QgcGFuZWxUb0RlYWN0aXZhdGUgPVxuICAgIHBhbmVsSWQgPT09IE1BUF9DT05UUk9MUy5lZmZlY3QgPyBNQVBfQ09OVFJPTFMuYWlBc3Npc3RhbnQgOlxuICAgIHBhbmVsSWQgPT09IE1BUF9DT05UUk9MUy5haUFzc2lzdGFudCA/IE1BUF9DT05UUk9MUy5lZmZlY3QgOlxuICAgIG51bGw7XG5cbiAgLy8gSWYgd2UgbmVlZCB0byBkZWFjdGl2YXRlIGEgY29tcGV0aW5nIHBhbmVsIGFuZCBpdCdzIGN1cnJlbnRseSBhY3RpdmVcbiAgaWYgKHBhbmVsVG9EZWFjdGl2YXRlICYmIHN0YXRlLm1hcENvbnRyb2xzW3BhbmVsVG9EZWFjdGl2YXRlXT8uYWN0aXZlKSB7XG4gICAgdXBkYXRlZFN0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBtYXBDb250cm9sczoge1xuICAgICAgICAuLi51cGRhdGVkU3RhdGUubWFwQ29udHJvbHMsXG4gICAgICAgIFtwYW5lbFRvRGVhY3RpdmF0ZV06IHtcbiAgICAgICAgICAuLi51cGRhdGVkU3RhdGUubWFwQ29udHJvbHNbcGFuZWxUb0RlYWN0aXZhdGVdLFxuICAgICAgICAgIGFjdGl2ZTogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnVwZGF0ZWRTdGF0ZSxcbiAgICBtYXBDb250cm9sczoge1xuICAgICAgLi4udXBkYXRlZFN0YXRlLm1hcENvbnRyb2xzLFxuICAgICAgW3BhbmVsSWRdOiB7XG4gICAgICAgIC4uLnVwZGF0ZWRTdGF0ZS5tYXBDb250cm9sc1twYW5lbElkXSxcbiAgICAgICAgYWN0aXZlOiAhdXBkYXRlZFN0YXRlLm1hcENvbnRyb2xzW3BhbmVsSWRdLmFjdGl2ZSxcbiAgICAgICAgYWN0aXZlTWFwSW5kZXg6IGluZGV4XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBUb2dnbGUgbWFwIGNvbnRyb2wgdmlzaWJpbGl0eVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvbiBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBtYXAgY29udHJvbCBwYW5lbCBpZCwgb25lIG9mIHRoZSBrZXlzIG9mOiBbYERFRkFVTFRfTUFQX0NPTlRST0xTYF0oI2RlZmF1bHRfbWFwX2NvbnRyb2xzKVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRNYXBDb250cm9sVmlzaWJpbGl0eVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge3BhbmVsSWQsIHNob3d9fTogVUlTdGF0ZUFjdGlvbnMuc2V0TWFwQ29udHJvbFZpc2liaWxpdHlVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgaWYgKCFzdGF0ZS5tYXBDb250cm9scz8uW3BhbmVsSWRdKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBtYXBDb250cm9sczoge1xuICAgICAgLi4uc3RhdGUubWFwQ29udHJvbHMsXG4gICAgICBbcGFuZWxJZF06IHtcbiAgICAgICAgLi4uc3RhdGUubWFwQ29udHJvbHNbcGFuZWxJZF0sXG4gICAgICAgIHNob3c6IEJvb2xlYW4oc2hvdylcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIFRvZ2dsZSBhY3RpdmUgbWFwIGNvbnRyb2wgcGFuZWxcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBkYXRhc2V0IGlkXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG9wZW5EZWxldGVNb2RhbFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogZGF0YXNldEtleVRvUmVtb3ZlfTogVUlTdGF0ZUFjdGlvbnMuT3BlbkRlbGV0ZU1vZGFsVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgY3VycmVudE1vZGFsOiBERUxFVEVfREFUQV9JRCxcbiAgZGF0YXNldEtleVRvUmVtb3ZlXG59KTtcblxuLyoqXG4gKiBTZXQgYGV4cG9ydEltYWdlLmxlZ2VuZGAgdG8gYHRydWVgIG9yIGBmYWxzZWBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0SW1hZ2VTZXR0aW5nVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBuZXdTZXR0aW5nfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0SW1hZ2VTZXR0aW5nVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGNvbnN0IHVwZGF0ZWQgPSB7Li4uc3RhdGUuZXhwb3J0SW1hZ2UsIC4uLm5ld1NldHRpbmd9O1xuICBjb25zdCBpbWFnZVNpemUgPSBjYWxjdWxhdGVFeHBvcnRJbWFnZVNpemUodXBkYXRlZCkgfHwgc3RhdGUuZXhwb3J0SW1hZ2UuaW1hZ2VTaXplO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZXhwb3J0SW1hZ2U6IHtcbiAgICAgIC4uLnVwZGF0ZWQsXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAvLyBUT0RPOiBjYWxjdWxhdGVFeHBvcnRJbWFnZVNpemUgZG9lcyBub3QgcmV0dXJuIGltYWdlU2l6ZS56b29tT2Zmc2V0LFxuICAgICAgLy8gZG8gd2UgbmVlZCB0YWtlIHRoaXMgdmFsdWUgZnJvbSBjdXJyZW50IHN0YXRlLCBvciByZXR1cm4gZGVmYXVsIHZhbHVlID0gMFxuICAgICAgaW1hZ2VTaXplXG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBTZXQgYGV4cG9ydEltYWdlLnNldEV4cG9ydEltYWdlRGF0YVVyaWAgdG8gYSBpbWFnZSBkYXRhVXJpXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgZXhwb3J0IGltYWdlIGRhdGEgdXJpXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydEltYWdlRGF0YVVyaVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogZGF0YVVyaX06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydEltYWdlRGF0YVVyaVVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydEltYWdlOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0SW1hZ2UsXG4gICAgcHJvY2Vzc2luZzogZmFsc2UsXG4gICAgaW1hZ2VEYXRhVXJpOiBkYXRhVXJpXG4gIH1cbn0pO1xuXG4vKipcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydEltYWdlRXJyb3JVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGVycm9yfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0SW1hZ2VFcnJvclVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydEltYWdlOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0SW1hZ2UsXG4gICAgcHJvY2Vzc2luZzogZmFsc2UsXG4gICAgZXJyb3JcbiAgfVxufSk7XG5cbi8qKlxuICogRGVsZXRlIGNhY2hlZCBleHBvcnQgaW1hZ2VcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGNsZWFudXBFeHBvcnRJbWFnZVVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnRJbWFnZToge1xuICAgIC4uLnN0YXRlLmV4cG9ydEltYWdlLFxuICAgIGV4cG9ydGluZzogZmFsc2UsXG4gICAgaW1hZ2VEYXRhVXJpOiAnJyxcbiAgICBlcnJvcjogZmFsc2UsXG4gICAgcHJvY2Vzc2luZzogZmFsc2UsXG4gICAgY2VudGVyOiBmYWxzZVxuICB9XG59KTtcblxuLyoqXG4gKiBTdGFydCBpbWFnZSBleHBvcnRpbmcgZmxvd1xuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnMge1VpU3RhdGV9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzdGFydEV4cG9ydGluZ0ltYWdlVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBvcHRpb25zID0ge319OiB7cGF5bG9hZDogUGFydGlhbDxFeHBvcnRJbWFnZT59XG4pOiBVaVN0YXRlID0+IHtcbiAgY29uc3QgaW1hZ2VTZXR0aW5ncyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGV4cG9ydGluZzogdHJ1ZVxuICB9O1xuXG4gIHJldHVybiBjb21wb3NlXyhbXG4gICAgY2xlYW51cEV4cG9ydEltYWdlVXBkYXRlcixcbiAgICBhcHBseV8oc2V0RXhwb3J0SW1hZ2VTZXR0aW5nVXBkYXRlciwgcGF5bG9hZF8oaW1hZ2VTZXR0aW5ncykpXG4gIF0pKHN0YXRlKTtcbn07XG5cbi8qKlxuICogU2V0IHNlbGVjdGVkIGRhdGFzZXQgZm9yIGV4cG9ydFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGRhdGFzZXQgaWRcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0U2VsZWN0ZWREYXRhc2V0VXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBkYXRhc2V0fTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0U2VsZWN0ZWREYXRhc2V0VXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0RGF0YToge1xuICAgIC4uLnN0YXRlLmV4cG9ydERhdGEsXG4gICAgc2VsZWN0ZWREYXRhc2V0OiBkYXRhc2V0XG4gIH1cbn0pO1xuXG4vKipcbiAqIFNldCBkYXRhIGZvcm1hdCBmb3IgZXhwb3J0aW5nIGRhdGFcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBvbmUgb2YgYCd0ZXh0L2NzdidgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydERhdGFUeXBlVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBkYXRhVHlwZX06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydERhdGFUeXBlVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0RGF0YToge1xuICAgIC4uLnN0YXRlLmV4cG9ydERhdGEsXG4gICAgZGF0YVR5cGVcbiAgfVxufSk7XG5cbi8qKlxuICogV2hldGhlciB0byBleHBvcnQgZmlsdGVyZWQgZGF0YSwgYHRydWVgIG9yIGBmYWxzZWBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRGaWx0ZXJlZFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogZmlsdGVyZWR9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRGaWx0ZXJlZFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydERhdGE6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnREYXRhLFxuICAgIGZpbHRlcmVkXG4gIH1cbn0pO1xuXG4vKipcbiAqIFdoZXRoZXIgdG8gaW5jbHVkaW5nIGRhdGEgaW4gbWFwIGNvbmZpZywgdG9nZ2xlIGJldHdlZW4gYHRydWVgIG9yIGBmYWxzZWBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0RGF0YVVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnRNYXA6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnRNYXAsXG4gICAgW0VYUE9SVF9NQVBfRk9STUFUUy5KU09OXToge1xuICAgICAgLi4uc3RhdGUuZXhwb3J0TWFwW0VYUE9SVF9NQVBfRk9STUFUUy5KU09OXSxcbiAgICAgIGhhc0RhdGE6ICFzdGF0ZS5leHBvcnRNYXBbRVhQT1JUX01BUF9GT1JNQVRTLkpTT05dLmhhc0RhdGFcbiAgICB9XG4gIH1cbn0pO1xuXG4vKipcbiAqIHdoZXRoZXIgdG8gZXhwb3J0IGEgbWFwYm94IGFjY2VzcyB0byBIVE1MIHNpbmdsZSBwYWdlXG4gKiBAcGFyYW0gc3RhdGUgLSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRVc2VyTWFwYm94QWNjZXNzVG9rZW5VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHVzZXJNYXBib3hUb2tlbn06IFVJU3RhdGVBY3Rpb25zLlNldFVzZXJNYXBib3hBY2Nlc3NUb2tlblVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydE1hcDoge1xuICAgIC4uLnN0YXRlLmV4cG9ydE1hcCxcbiAgICBbRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxdOiB7XG4gICAgICAuLi5zdGF0ZS5leHBvcnRNYXBbRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxdLFxuICAgICAgdXNlck1hcGJveFRva2VuXG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBTZXRzIHRoZSBleHBvcnQgbWFwIGZvcm1hdFxuICogQHBhcmFtIHN0YXRlIC0gYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgZm9ybWF0IHRvIHVzZSB0byBleHBvcnQgdGhlIG1hcCBpbnRvXG4gKiBAcmV0dXJuIG5leHRTdGF0ZVxuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0TWFwRm9ybWF0VXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBmb3JtYXR9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRNYXBGb3JtYXRVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnRNYXA6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnRNYXAsXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGZvcm1hdFxuICB9XG59KTtcblxuLyoqXG4gKiBTZXQgdGhlIGV4cG9ydCBodG1sIG1hcCBtb2RlXG4gKiBAcGFyYW0gc3RhdGUgLSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCB0byBiZSBzZXQgKGF2YWlsYWJsZSBtb2RlczogRVhQT1JUX0hUTUxfTUFQX01PREVTKVxuICogQHJldHVybiBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydE1hcEhUTUxNb2RlVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBtb2RlfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0SFRNTE1hcE1vZGVVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnRNYXA6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnRNYXAsXG4gICAgW0VYUE9SVF9NQVBfRk9STUFUUy5IVE1MXToge1xuICAgICAgLi4uc3RhdGUuZXhwb3J0TWFwW0VYUE9SVF9NQVBfRk9STUFUUy5IVE1MXSxcbiAgICAgIG1vZGVcbiAgICB9XG4gIH1cbn0pO1xuXG4vKipcbiAqIEFkZHMgYSBuZXcgbm90aWZpY2F0aW9uLlxuICogVXBkYXRlcyBhIG5vdGlmaWNhdGlvbiBpbiBjYXNlIG9mIG1hdGNoaW5nIGlkcy5cbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBQYXJhbXMgb2YgYSBub3RpZmljYXRpb25cbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYWRkTm90aWZpY2F0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkfTogVUlTdGF0ZUFjdGlvbnMuQWRkTm90aWZpY2F0aW9uVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGNvbnN0IG9sZE5vdGlmaWNhdGlvbnMgPSBzdGF0ZS5ub3RpZmljYXRpb25zIHx8IFtdO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGNvbnN0IHBheWxvYWRJZCA9IHBheWxvYWQ/LmlkO1xuICBjb25zdCBub3RpZmljYXRpb25Ub1VwZGF0ZSA9IHBheWxvYWRJZCA/IG9sZE5vdGlmaWNhdGlvbnMuZmluZChuID0+IG4uaWQgPT09IHBheWxvYWRJZCkgOiBudWxsO1xuXG4gIGxldCBub3RpZmljYXRpb25zO1xuICBpZiAobm90aWZpY2F0aW9uVG9VcGRhdGUpIHtcbiAgICBub3RpZmljYXRpb25zID0gb2xkTm90aWZpY2F0aW9ucy5tYXAobiA9PlxuICAgICAgbi5pZCA9PT0gcGF5bG9hZElkID8gY3JlYXRlTm90aWZpY2F0aW9uKHsuLi5wYXlsb2FkLCBjb3VudDogbi5jb3VudCArIDF9KSA6IG5cbiAgICApO1xuICB9IGVsc2Uge1xuICAgIG5vdGlmaWNhdGlvbnMgPSBbLi4ub2xkTm90aWZpY2F0aW9ucywgY3JlYXRlTm90aWZpY2F0aW9uKHBheWxvYWQpXTtcbiAgfVxuXG4gIHJldHVybiB7Li4uc3RhdGUsIG5vdGlmaWNhdGlvbnN9O1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYSBub3RpZmljYXRpb25cbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBpZCBvZiB0aGUgbm90aWZpY2F0aW9uIHRvIGJlIHJlbW92ZWRcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlTm90aWZpY2F0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBpZH06IFVJU3RhdGVBY3Rpb25zLlJlbW92ZU5vdGlmaWNhdGlvblVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIG5vdGlmaWNhdGlvbnM6IHN0YXRlLm5vdGlmaWNhdGlvbnMuZmlsdGVyKG4gPT4gbi5pZCAhPT0gaWQpXG59KTtcblxuLyoqXG4gKiBGaXJlZCB3aGVuIGZpbGUgbG9hZGluZyBiZWdpblxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRmlsZXNVcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbG9hZEZpbGVzOiB7XG4gICAgLi4uc3RhdGUubG9hZEZpbGVzLFxuICAgIGZpbGVMb2FkaW5nOiB0cnVlXG4gIH1cbn0pO1xuXG4vKipcbiAqIEhhbmRsZXMgbG9hZGluZyBmaWxlIHN1Y2Nlc3MgYW5kIHNldCBmaWxlTG9hZGluZyBwcm9wZXJ0eSB0byBmYWxzZVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRmlsZXNTdWNjZXNzVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGxvYWRGaWxlczoge1xuICAgIC4uLnN0YXRlLmxvYWRGaWxlcyxcbiAgICBmaWxlTG9hZGluZzogZmFsc2VcbiAgfVxufSk7XG5cbi8qKlxuICogSGFuZGxlcyBsb2FkIGZpbGUgZXJyb3IgYW5kIHNldCBmaWxlTG9hZGluZyBwcm9wZXJ0eSB0byBmYWxzZVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLmVycm9yXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc0VyclVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUsIHtlcnJvcn06IExvYWRGaWxlc0VyclVwZGF0ZXJBY3Rpb24pOiBVaVN0YXRlID0+XG4gIGFkZE5vdGlmaWNhdGlvblVwZGF0ZXIoXG4gICAge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBsb2FkRmlsZXM6IHtcbiAgICAgICAgLi4uc3RhdGUubG9hZEZpbGVzLFxuICAgICAgICBmaWxlTG9hZGluZzogZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIHBheWxvYWQ6IGVycm9yTm90aWZpY2F0aW9uKHtcbiAgICAgICAgbWVzc2FnZTogKGVycm9yIHx8IHt9KS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gdXBsb2FkIGZpbGVzJyxcbiAgICAgICAgdG9waWM6IERFRkFVTFRfTk9USUZJQ0FUSU9OX1RPUElDUy5nbG9iYWxcbiAgICAgIH0pXG4gICAgfVxuICApO1xuXG4vKipcbiAqIEhhbmRsZXMgdG9nZ2xlIG1hcCBzcGxpdCBhbmQgcmVzZXQgYWxsIG1hcCBjb250cm9sIGluZGV4IHRvIDBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVTcGxpdE1hcFVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtYXBDb250cm9sczogT2JqZWN0LmVudHJpZXMoc3RhdGUubWFwQ29udHJvbHMpLnJlZHVjZShcbiAgICAoYWNjLCBlbnRyeSkgPT4gKHtcbiAgICAgIC4uLmFjYyxcbiAgICAgIFtlbnRyeVswXV06IHtcbiAgICAgICAgLi4uZW50cnlbMV0sXG4gICAgICAgIGFjdGl2ZU1hcEluZGV4OiAwXG4gICAgICB9XG4gICAgfSksXG4gICAge30gYXMgTWFwQ29udHJvbHNcbiAgKVxufSk7XG5cbi8qKlxuICogVG9nZ2xlIG1vZGFsIGRhdGFcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzaG93RGF0YXNldFRhYmxlVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT5cbiAgdG9nZ2xlTW9kYWxVcGRhdGVyKHN0YXRlLCB7cGF5bG9hZDogREFUQV9UQUJMRV9JRH0pO1xuXG4vKipcbiAqIFNldCB0aGUgbG9jYWxlIG9mIHRoZSBVSVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQubG9jYWxlIGxvY2FsZVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRMb2NhbGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHtsb2NhbGV9fTogVUlTdGF0ZUFjdGlvbnMuU2V0TG9jYWxlVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbG9jYWxlXG59KTtcblxuLyoqXG4gKiBUb2dnbGUgbGF5ZXIgcGFuZWwgbGlzdCB2aWV3XG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgbGF5ZXIgcGFuZWwgbGlzdFZpZXcgdmFsdWUuIENhbiBiZSAnbGlzdCcgb3IgJ3NvcnRCeURhdGFzZXQnXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVBhbmVsTGlzdFZpZXdVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHtwYW5lbElkLCBsaXN0Vmlld319OiBVSVN0YXRlQWN0aW9ucy5Ub2dnbGVQYW5lbExpc3RWaWV3QWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgY29uc3Qgc3RhdGVQcm9wID1cbiAgICBwYW5lbElkID09PSAnbGF5ZXInXG4gICAgICA/ICdsYXllclBhbmVsTGlzdFZpZXcnXG4gICAgICA6IHBhbmVsSWQgPT09ICdmaWx0ZXInXG4gICAgICA/ICdmaWx0ZXJQYW5lbExpc3RWaWV3J1xuICAgICAgOiBudWxsO1xuICBpZiAoIXN0YXRlUHJvcCB8fCBzdGF0ZVtzdGF0ZVByb3BdID09PSBsaXN0Vmlldykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIFtzdGF0ZVByb3BdOiBsaXN0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