@kepler.gl/reducers 3.3.0-alpha.0 → 3.3.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) 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} +2 -3
  8. package/dist/cjs/interaction-utils.js +115 -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 +922 -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/cjs/vis-state-updaters.js +5100 -0
  24. package/dist/cjs/vis-state.js +35 -0
  25. package/dist/combined-updaters.d.ts +19 -2
  26. package/dist/composers.d.ts +2 -0
  27. package/dist/esm/combined-updaters.js +484 -0
  28. package/dist/esm/composer-helpers.js +85 -0
  29. package/dist/esm/composers.js +14 -0
  30. package/dist/esm/core.js +101 -0
  31. package/dist/esm/data-utils.js +47 -0
  32. package/dist/esm/export-utils.js +86 -0
  33. package/dist/esm/index.js +62 -0
  34. package/dist/esm/interaction-utils.js +106 -0
  35. package/dist/esm/layer-utils.js +602 -0
  36. package/dist/esm/map-state-updaters.js +650 -0
  37. package/dist/esm/map-state.js +29 -0
  38. package/dist/esm/map-style-updaters.js +652 -0
  39. package/dist/esm/map-style.js +27 -0
  40. package/dist/esm/merger-handler.js +96 -0
  41. package/dist/esm/middleware.js +19 -0
  42. package/dist/esm/provider-state-updaters.js +458 -0
  43. package/dist/esm/provider-state.js +28 -0
  44. package/dist/esm/root.js +201 -0
  45. package/dist/esm/ui-state-updaters.js +917 -0
  46. package/dist/esm/ui-state.js +30 -0
  47. package/dist/esm/vis-state-merger.js +1161 -0
  48. package/dist/esm/vis-state-selectors.js +24 -0
  49. package/dist/esm/vis-state-updaters.js +5006 -0
  50. package/dist/esm/vis-state.js +29 -0
  51. package/dist/interaction-utils.d.ts +1 -1
  52. package/dist/layer-utils.d.ts +30 -5
  53. package/dist/map-state-updaters.d.ts +27 -20
  54. package/dist/map-state.d.ts +2 -74
  55. package/dist/map-style-updaters.d.ts +1 -3
  56. package/dist/ui-state-updaters.d.ts +53 -3
  57. package/dist/vis-state-merger.d.ts +11 -0
  58. package/dist/vis-state-selectors.d.ts +42 -6
  59. package/dist/vis-state-updaters.d.ts +163 -2
  60. package/dist/vis-state.d.ts +24 -4
  61. package/package.json +43 -35
  62. package/dist/combined-updaters.js +0 -366
  63. package/dist/composer-helpers.js +0 -101
  64. package/dist/composers.js +0 -23
  65. package/dist/core.js +0 -105
  66. package/dist/data-utils.js +0 -53
  67. package/dist/export-utils.js +0 -91
  68. package/dist/interaction-utils.js +0 -105
  69. package/dist/layer-utils.js +0 -335
  70. package/dist/map-state-updaters.js +0 -436
  71. package/dist/map-state.js +0 -35
  72. package/dist/map-style-updaters.js +0 -661
  73. package/dist/map-style.js +0 -34
  74. package/dist/merger-handler.js +0 -105
  75. package/dist/middleware.js +0 -27
  76. package/dist/provider-state-updaters.js +0 -466
  77. package/dist/provider-state.js +0 -35
  78. package/dist/root.js +0 -207
  79. package/dist/ui-state-updaters.js +0 -803
  80. package/dist/ui-state.js +0 -37
  81. package/dist/vis-state-merger.js +0 -990
  82. package/dist/vis-state-selectors.js +0 -30
  83. package/dist/vis-state-updaters.js +0 -3611
  84. package/dist/vis-state.js +0 -36
@@ -1,803 +0,0 @@
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.setMapControlSettingsUpdater = 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: from application config (auto-detected: `true` for webpack)
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 (from application config, auto-detects build tool)
126
- escapeXhtmlForWebpack: (0, _utils.getApplicationConfig)().escapeXhtmlForWebpack
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, _state$mapControls$dr;
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
- // To to toggle the mapDraw and mapLocal dropdowns
330
- // We have to deactivate the other active dropdown
331
- var dropdownToDeactivate = panelId === _constants.MAP_CONTROLS.mapDraw ? _constants.MAP_CONTROLS.mapLocale : panelId === _constants.MAP_CONTROLS.mapLocale ? _constants.MAP_CONTROLS.mapDraw : null;
332
-
333
- // If we need to deactivate a competing panel and it's currently active
334
- if (panelToDeactivate && (_state$mapControls$pa = state.mapControls[panelToDeactivate]) !== null && _state$mapControls$pa !== void 0 && _state$mapControls$pa.active) {
335
- updatedState = _objectSpread(_objectSpread({}, state), {}, {
336
- mapControls: _objectSpread(_objectSpread({}, updatedState.mapControls), {}, (0, _defineProperty2["default"])({}, panelToDeactivate, _objectSpread(_objectSpread({}, updatedState.mapControls[panelToDeactivate]), {}, {
337
- active: false
338
- })))
339
- });
340
- }
341
-
342
- // If we need to deactivate a competing dropdown and it's currently active
343
- if (dropdownToDeactivate && (_state$mapControls$dr = state.mapControls[dropdownToDeactivate]) !== null && _state$mapControls$dr !== void 0 && _state$mapControls$dr.active) {
344
- updatedState = _objectSpread(_objectSpread({}, state), {}, {
345
- mapControls: _objectSpread(_objectSpread({}, updatedState.mapControls), {}, (0, _defineProperty2["default"])({}, dropdownToDeactivate, _objectSpread(_objectSpread({}, updatedState.mapControls[dropdownToDeactivate]), {}, {
346
- active: false
347
- })))
348
- });
349
- }
350
- return _objectSpread(_objectSpread({}, updatedState), {}, {
351
- mapControls: _objectSpread(_objectSpread({}, updatedState.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, updatedState.mapControls[panelId]), {}, {
352
- active: !updatedState.mapControls[panelId].active,
353
- activeMapIndex: index
354
- })))
355
- });
356
- };
357
-
358
- /**
359
- * Toggle map control visibility
360
- * @memberof uiStateUpdaters
361
- * @param state `uiState`
362
- * @param action action
363
- * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
364
- * @returns nextState
365
- * @public
366
- */
367
- var setMapControlVisibilityUpdater = exports.setMapControlVisibilityUpdater = function setMapControlVisibilityUpdater(state, _ref6) {
368
- var _state$mapControls;
369
- var _ref6$payload = _ref6.payload,
370
- panelId = _ref6$payload.panelId,
371
- show = _ref6$payload.show;
372
- if (!((_state$mapControls = state.mapControls) !== null && _state$mapControls !== void 0 && _state$mapControls[panelId])) {
373
- return state;
374
- }
375
- return _objectSpread(_objectSpread({}, state), {}, {
376
- mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, state.mapControls[panelId]), {}, {
377
- show: Boolean(show)
378
- })))
379
- });
380
- };
381
-
382
- /**
383
- * Toggle map control settings
384
- * @memberof uiStateUpdaters
385
- * @param state `uiState`
386
- * @param action action
387
- * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
388
- * @returns nextState
389
- * @public
390
- */
391
- var setMapControlSettingsUpdater = exports.setMapControlSettingsUpdater = function setMapControlSettingsUpdater(state, _ref7) {
392
- var _state$mapControls2;
393
- var _ref7$payload = _ref7.payload,
394
- panelId = _ref7$payload.panelId,
395
- settings = _ref7$payload.settings;
396
- var mapControl = (_state$mapControls2 = state.mapControls) === null || _state$mapControls2 === void 0 ? void 0 : _state$mapControls2[panelId];
397
- if (!mapControl) {
398
- return state;
399
- }
400
- return _objectSpread(_objectSpread({}, state), {}, {
401
- mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, mapControl), {}, {
402
- settings: _objectSpread(_objectSpread({}, mapControl.settings), settings)
403
- })))
404
- });
405
- };
406
-
407
- /**
408
- * Toggle active map control panel
409
- * @memberof uiStateUpdaters
410
- * @param state `uiState`
411
- * @param action
412
- * @param action.payload dataset id
413
- * @returns nextState
414
- * @public
415
- */
416
- var openDeleteModalUpdater = exports.openDeleteModalUpdater = function openDeleteModalUpdater(state, _ref8) {
417
- var datasetKeyToRemove = _ref8.payload;
418
- return _objectSpread(_objectSpread({}, state), {}, {
419
- currentModal: _constants.DELETE_DATA_ID,
420
- datasetKeyToRemove: datasetKeyToRemove
421
- });
422
- };
423
-
424
- /**
425
- * Set `exportImage.legend` to `true` or `false`
426
- * @memberof uiStateUpdaters
427
- * @param state `uiState`
428
- * @returns nextState
429
- * @public
430
- */
431
- var setExportImageSettingUpdater = exports.setExportImageSettingUpdater = function setExportImageSettingUpdater(state, _ref9) {
432
- var newSetting = _ref9.payload;
433
- var updated = _objectSpread(_objectSpread({}, state.exportImage), newSetting);
434
- var imageSize = (0, _utils.calculateExportImageSize)(updated) || state.exportImage.imageSize;
435
- return _objectSpread(_objectSpread({}, state), {}, {
436
- exportImage: _objectSpread(_objectSpread({}, updated), {}, {
437
- // @ts-expect-error
438
- // TODO: calculateExportImageSize does not return imageSize.zoomOffset,
439
- // do we need take this value from current state, or return defaul value = 0
440
- imageSize: imageSize
441
- })
442
- });
443
- };
444
-
445
- /**
446
- * Set `exportImage.setExportImageDataUri` to a image dataUri
447
- * @memberof uiStateUpdaters
448
- * @param state `uiState`
449
- * @param action
450
- * @param action.payload export image data uri
451
- * @returns nextState
452
- * @public
453
- */
454
- var setExportImageDataUriUpdater = exports.setExportImageDataUriUpdater = function setExportImageDataUriUpdater(state, _ref10) {
455
- var dataUri = _ref10.payload;
456
- if (dataUri === state.exportImage.imageDataUri) {
457
- return state;
458
- }
459
- return _objectSpread(_objectSpread({}, state), {}, {
460
- exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
461
- processing: false,
462
- imageDataUri: dataUri
463
- })
464
- });
465
- };
466
-
467
- /**
468
- * @memberof uiStateUpdaters
469
- * @public
470
- */
471
- var setExportImageErrorUpdater = exports.setExportImageErrorUpdater = function setExportImageErrorUpdater(state, _ref11) {
472
- var error = _ref11.payload;
473
- return _objectSpread(_objectSpread({}, state), {}, {
474
- exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
475
- processing: false,
476
- error: error
477
- })
478
- });
479
- };
480
-
481
- /**
482
- * Delete cached export image
483
- * @memberof uiStateUpdaters
484
- * @public
485
- */
486
- var cleanupExportImageUpdater = exports.cleanupExportImageUpdater = function cleanupExportImageUpdater(state) {
487
- return _objectSpread(_objectSpread({}, state), {}, {
488
- exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
489
- exporting: false,
490
- imageDataUri: '',
491
- error: false,
492
- processing: false,
493
- center: false
494
- })
495
- });
496
- };
497
-
498
- /**
499
- * Start image exporting flow
500
- * @memberof uiStateUpdaters
501
- * @param state
502
- * @param options
503
- * @returns {UiState}
504
- * @public
505
- */
506
- var startExportingImageUpdater = exports.startExportingImageUpdater = function startExportingImageUpdater(state, _ref12) {
507
- var _ref12$payload = _ref12.payload,
508
- options = _ref12$payload === void 0 ? {} : _ref12$payload;
509
- var imageSettings = _objectSpread(_objectSpread({}, options), {}, {
510
- exporting: true
511
- });
512
- return (0, _composerHelpers.compose_)([cleanupExportImageUpdater, (0, _composerHelpers.apply_)(setExportImageSettingUpdater, (0, _composerHelpers.payload_)(imageSettings))])(state);
513
- };
514
-
515
- /**
516
- * Set selected dataset for export
517
- * @memberof uiStateUpdaters
518
- * @param state `uiState`
519
- * @param action
520
- * @param action.payload dataset id
521
- * @returns nextState
522
- * @public
523
- */
524
- var setExportSelectedDatasetUpdater = exports.setExportSelectedDatasetUpdater = function setExportSelectedDatasetUpdater(state, _ref13) {
525
- var dataset = _ref13.payload;
526
- return _objectSpread(_objectSpread({}, state), {}, {
527
- exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
528
- selectedDataset: dataset
529
- })
530
- });
531
- };
532
-
533
- /**
534
- * Set data format for exporting data
535
- * @memberof uiStateUpdaters
536
- * @param state `uiState`
537
- * @param action
538
- * @param action.payload one of `'text/csv'`
539
- * @returns nextState
540
- * @public
541
- */
542
- var setExportDataTypeUpdater = exports.setExportDataTypeUpdater = function setExportDataTypeUpdater(state, _ref14) {
543
- var dataType = _ref14.payload;
544
- return _objectSpread(_objectSpread({}, state), {}, {
545
- exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
546
- dataType: dataType
547
- })
548
- });
549
- };
550
-
551
- /**
552
- * Whether to export filtered data, `true` or `false`
553
- * @memberof uiStateUpdaters
554
- * @param state `uiState`
555
- * @param action
556
- * @param action.payload
557
- * @returns nextState
558
- * @public
559
- */
560
- var setExportFilteredUpdater = exports.setExportFilteredUpdater = function setExportFilteredUpdater(state, _ref15) {
561
- var filtered = _ref15.payload;
562
- return _objectSpread(_objectSpread({}, state), {}, {
563
- exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
564
- filtered: filtered
565
- })
566
- });
567
- };
568
-
569
- /**
570
- * Whether to including data in map config, toggle between `true` or `false`
571
- * @memberof uiStateUpdaters
572
- * @param state `uiState`
573
- * @returns nextState
574
- * @public
575
- */
576
- var setExportDataUpdater = exports.setExportDataUpdater = function setExportDataUpdater(state) {
577
- return _objectSpread(_objectSpread({}, state), {}, {
578
- exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.JSON, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.JSON]), {}, {
579
- hasData: !state.exportMap[_constants.EXPORT_MAP_FORMATS.JSON].hasData
580
- })))
581
- });
582
- };
583
-
584
- /**
585
- * whether to export a mapbox access to HTML single page
586
- * @param state - `uiState`
587
- * @param action
588
- * @param action.payload
589
- * @returns nextState
590
- * @public
591
- */
592
- var setUserMapboxAccessTokenUpdater = exports.setUserMapboxAccessTokenUpdater = function setUserMapboxAccessTokenUpdater(state, _ref16) {
593
- var userMapboxToken = _ref16.payload;
594
- return _objectSpread(_objectSpread({}, state), {}, {
595
- exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.HTML]), {}, {
596
- userMapboxToken: userMapboxToken
597
- })))
598
- });
599
- };
600
-
601
- /**
602
- * Sets the export map format
603
- * @param state - `uiState`
604
- * @param action
605
- * @param action.payload format to use to export the map into
606
- * @return nextState
607
- */
608
- var setExportMapFormatUpdater = exports.setExportMapFormatUpdater = function setExportMapFormatUpdater(state, _ref17) {
609
- var format = _ref17.payload;
610
- return _objectSpread(_objectSpread({}, state), {}, {
611
- exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, {
612
- // @ts-expect-error
613
- format: format
614
- })
615
- });
616
- };
617
-
618
- /**
619
- * Set the export html map mode
620
- * @param state - `uiState`
621
- * @param action
622
- * @param action.payload to be set (available modes: EXPORT_HTML_MAP_MODES)
623
- * @return nextState
624
- */
625
- var setExportMapHTMLModeUpdater = exports.setExportMapHTMLModeUpdater = function setExportMapHTMLModeUpdater(state, _ref18) {
626
- var mode = _ref18.payload;
627
- return _objectSpread(_objectSpread({}, state), {}, {
628
- exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.HTML]), {}, {
629
- mode: mode
630
- })))
631
- });
632
- };
633
-
634
- /**
635
- * Adds a new notification.
636
- * Updates a notification in case of matching ids.
637
- * @memberof uiStateUpdaters
638
- * @param state `uiState`
639
- * @param action
640
- * @param action.payload Params of a notification
641
- * @returns nextState
642
- * @public
643
- */
644
- var addNotificationUpdater = exports.addNotificationUpdater = function addNotificationUpdater(state, _ref19) {
645
- var payload = _ref19.payload;
646
- var oldNotifications = state.notifications || [];
647
- // @ts-expect-error
648
- var payloadId = payload === null || payload === void 0 ? void 0 : payload.id;
649
- var notificationToUpdate = payloadId ? oldNotifications.find(function (n) {
650
- return n.id === payloadId;
651
- }) : null;
652
- var notifications;
653
- if (notificationToUpdate) {
654
- notifications = oldNotifications.map(function (n) {
655
- return n.id === payloadId ? (0, _utils.createNotification)(_objectSpread(_objectSpread({}, payload), {}, {
656
- count: n.count + 1
657
- })) : n;
658
- });
659
- } else {
660
- notifications = [].concat((0, _toConsumableArray2["default"])(oldNotifications), [(0, _utils.createNotification)(payload)]);
661
- }
662
- return _objectSpread(_objectSpread({}, state), {}, {
663
- notifications: notifications
664
- });
665
- };
666
-
667
- /**
668
- * Remove a notification
669
- * @memberof uiStateUpdaters
670
- * @param state `uiState`
671
- * @param action
672
- * @param action.payload id of the notification to be removed
673
- * @returns nextState
674
- * @public
675
- */
676
- var removeNotificationUpdater = exports.removeNotificationUpdater = function removeNotificationUpdater(state, _ref20) {
677
- var id = _ref20.payload;
678
- return _objectSpread(_objectSpread({}, state), {}, {
679
- notifications: state.notifications.filter(function (n) {
680
- return n.id !== id;
681
- })
682
- });
683
- };
684
-
685
- /**
686
- * Fired when file loading begin
687
- * @memberof uiStateUpdaters
688
- * @param state `uiState`
689
- * @returns nextState
690
- * @public
691
- */
692
- var loadFilesUpdater = exports.loadFilesUpdater = function loadFilesUpdater(state) {
693
- return _objectSpread(_objectSpread({}, state), {}, {
694
- loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
695
- fileLoading: true
696
- })
697
- });
698
- };
699
-
700
- /**
701
- * Handles loading file success and set fileLoading property to false
702
- * @memberof uiStateUpdaters
703
- * @param state `uiState`
704
- * @returns nextState
705
- */
706
- var loadFilesSuccessUpdater = exports.loadFilesSuccessUpdater = function loadFilesSuccessUpdater(state) {
707
- return _objectSpread(_objectSpread({}, state), {}, {
708
- loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
709
- fileLoading: false
710
- })
711
- });
712
- };
713
-
714
- /**
715
- * Handles load file error and set fileLoading property to false
716
- * @memberof uiStateUpdaters
717
- * @param state
718
- * @param action
719
- * @param action.error
720
- * @returns nextState
721
- * @public
722
- */
723
- var loadFilesErrUpdater = exports.loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref21) {
724
- var error = _ref21.error;
725
- return addNotificationUpdater(_objectSpread(_objectSpread({}, state), {}, {
726
- loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
727
- fileLoading: false
728
- })
729
- }), {
730
- payload: (0, _utils.errorNotification)({
731
- message: (error || {}).message || 'Failed to upload files',
732
- topic: _constants.DEFAULT_NOTIFICATION_TOPICS.global
733
- })
734
- });
735
- };
736
-
737
- /**
738
- * Handles toggle map split and reset all map control index to 0
739
- * @memberof uiStateUpdaters
740
- * @param state
741
- * @returns nextState
742
- * @public
743
- */
744
- var toggleSplitMapUpdater = exports.toggleSplitMapUpdater = function toggleSplitMapUpdater(state) {
745
- return _objectSpread(_objectSpread({}, state), {}, {
746
- mapControls: Object.entries(state.mapControls).reduce(function (acc, entry) {
747
- return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, entry[0], _objectSpread(_objectSpread({}, entry[1]), {}, {
748
- activeMapIndex: 0
749
- })));
750
- }, {})
751
- });
752
- };
753
-
754
- /**
755
- * Toggle modal data
756
- * @memberof uiStateUpdaters
757
- * @param state
758
- * @returns nextState
759
- * @public
760
- */
761
- var showDatasetTableUpdater = exports.showDatasetTableUpdater = function showDatasetTableUpdater(state) {
762
- return toggleModalUpdater(state, {
763
- payload: _constants.DATA_TABLE_ID
764
- });
765
- };
766
-
767
- /**
768
- * Set the locale of the UI
769
- * @memberof uiStateUpdaters
770
- * @param state `uiState`
771
- * @param action
772
- * @param action.payload
773
- * @param action.payload.locale locale
774
- * @returns nextState
775
- * @public
776
- */
777
- var setLocaleUpdater = exports.setLocaleUpdater = function setLocaleUpdater(state, _ref22) {
778
- var locale = _ref22.payload.locale;
779
- return _objectSpread(_objectSpread({}, state), {}, {
780
- locale: locale
781
- });
782
- };
783
-
784
- /**
785
- * Toggle layer panel list view
786
- * @memberof uiStateUpdaters
787
- * @param state `uiState`
788
- * @param action
789
- * @param action.payload layer panel listView value. Can be 'list' or 'sortByDataset'
790
- * @returns nextState
791
- * @public
792
- */
793
- var togglePanelListViewUpdater = exports.togglePanelListViewUpdater = function togglePanelListViewUpdater(state, _ref23) {
794
- var _ref23$payload = _ref23.payload,
795
- panelId = _ref23$payload.panelId,
796
- listView = _ref23$payload.listView;
797
- var stateProp = panelId === 'layer' ? 'layerPanelListView' : panelId === 'filter' ? 'filterPanelListView' : null;
798
- if (!stateProp || state[stateProp] === listView) {
799
- return state;
800
- }
801
- return _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, stateProp, listView));
802
- };
803
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9sb2NhbGl6YXRpb24iLCJfdXRpbHMiLCJfY29tcG9zZXJIZWxwZXJzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMIiwiZXhwb3J0cyIsIkRFRkFVTFRfTU9EQUwiLCJBRERfREFUQV9JRCIsInVpU3RhdGVVcGRhdGVycyIsIkRFRkFVTFRfTUFQX0NPTlRST0xTX0ZFQVRVUkVTIiwic2hvdyIsImFjdGl2ZSIsImRpc2FibGVDbG9zZSIsImFjdGl2ZU1hcEluZGV4IiwiREVGQVVMVF9NQVBfTEVHRU5EX0NPTlRST0wiLCJkaXNhYmxlRWRpdCIsIkRFRkFVTFRfTUFQX0NPTlRST0xTIiwiTUFQX0NPTlRST0xTIiwicmVkdWNlIiwiZmluYWwiLCJjdXJyZW50IiwibWFwTGVnZW5kIiwiREVGQVVMVF9FWFBPUlRfSU1BR0UiLCJyYXRpbyIsIkVYUE9SVF9JTUdfUkFUSU9TIiwiU0NSRUVOIiwicmVzb2x1dGlvbiIsIlJFU09MVVRJT05TIiwiT05FX1giLCJsZWdlbmQiLCJtYXBIIiwibWFwVyIsImltYWdlU2l6ZSIsInpvb21PZmZzZXQiLCJzY2FsZSIsImltYWdlVyIsImltYWdlSCIsImNlbnRlciIsImltYWdlRGF0YVVyaSIsImV4cG9ydGluZyIsInByb2Nlc3NpbmciLCJlcnJvciIsImVzY2FwZVhodG1sRm9yV2VicGFjayIsImdldEFwcGxpY2F0aW9uQ29uZmlnIiwiREVGQVVMVF9MT0FEX0ZJTEVTIiwiZmlsZUxvYWRpbmciLCJERUZBVUxUX0VYUE9SVF9EQVRBIiwic2VsZWN0ZWREYXRhc2V0IiwiZGF0YVR5cGUiLCJFWFBPUlRfREFUQV9UWVBFIiwiQ1NWIiwiZmlsdGVyZWQiLCJERUZBVUxUX05PVElGSUNBVElPTlMiLCJERUZBVUxUX0VYUE9SVF9IVE1MIiwiZXhwb3J0TWFwYm94QWNjZXNzVG9rZW4iLCJ1c2VyTWFwYm94VG9rZW4iLCJtb2RlIiwiRVhQT1JUX0hUTUxfTUFQX01PREVTIiwiUkVBRCIsIkRFRkFVTFRfRVhQT1JUX0pTT04iLCJoYXNEYXRhIiwiREVGQVVMVF9FWFBPUlRfTUFQIiwiRVhQT1JUX01BUF9GT1JNQVRTIiwiSFRNTCIsIkpTT04iLCJJTklUSUFMX1VJX1NUQVRFIiwicmVhZE9ubHkiLCJhY3RpdmVTaWRlUGFuZWwiLCJjdXJyZW50TW9kYWwiLCJkYXRhc2V0S2V5VG9SZW1vdmUiLCJ2aXNpYmxlRHJvcGRvd24iLCJleHBvcnRJbWFnZSIsImV4cG9ydERhdGEiLCJleHBvcnRNYXAiLCJtYXBDb250cm9scyIsIm5vdGlmaWNhdGlvbnMiLCJsb2FkRmlsZXMiLCJsb2NhbGUiLCJMT0NBTEVfQ09ERVMiLCJlbiIsImxheWVyUGFuZWxMaXN0VmlldyIsImZpbHRlclBhbmVsTGlzdFZpZXciLCJpc1NpZGVQYW5lbENsb3NlQnV0dG9uVmlzaWJsZSIsImluaXRVaVN0YXRlVXBkYXRlciIsInN0YXRlIiwiYWN0aW9uIiwicGF5bG9hZCIsImluaXRpYWxVaVN0YXRlIiwidG9nZ2xlU2lkZVBhbmVsVXBkYXRlciIsIl9yZWYiLCJpZCIsInRvZ2dsZU1vZGFsVXBkYXRlciIsIl9yZWYyIiwic2hvd0V4cG9ydERyb3Bkb3duVXBkYXRlciIsIl9yZWYzIiwiaGlkZUV4cG9ydERyb3Bkb3duVXBkYXRlciIsInRvZ2dsZVNpZGVQYW5lbENsb3NlQnV0dG9uVXBkYXRlciIsIl9yZWY0IiwidG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIiLCJfcmVmNSIsIl9zdGF0ZSRtYXBDb250cm9scyRwYSIsIl9zdGF0ZSRtYXBDb250cm9scyRkciIsIl9yZWY1JHBheWxvYWQiLCJwYW5lbElkIiwiX3JlZjUkcGF5bG9hZCRpbmRleCIsImluZGV4IiwidXBkYXRlZFN0YXRlIiwicGFuZWxUb0RlYWN0aXZhdGUiLCJlZmZlY3QiLCJhaUFzc2lzdGFudCIsImRyb3Bkb3duVG9EZWFjdGl2YXRlIiwibWFwRHJhdyIsIm1hcExvY2FsZSIsInNldE1hcENvbnRyb2xWaXNpYmlsaXR5VXBkYXRlciIsIl9yZWY2IiwiX3N0YXRlJG1hcENvbnRyb2xzIiwiX3JlZjYkcGF5bG9hZCIsIkJvb2xlYW4iLCJzZXRNYXBDb250cm9sU2V0dGluZ3NVcGRhdGVyIiwiX3JlZjciLCJfc3RhdGUkbWFwQ29udHJvbHMyIiwiX3JlZjckcGF5bG9hZCIsInNldHRpbmdzIiwibWFwQ29udHJvbCIsIm9wZW5EZWxldGVNb2RhbFVwZGF0ZXIiLCJfcmVmOCIsIkRFTEVURV9EQVRBX0lEIiwic2V0RXhwb3J0SW1hZ2VTZXR0aW5nVXBkYXRlciIsIl9yZWY5IiwibmV3U2V0dGluZyIsInVwZGF0ZWQiLCJjYWxjdWxhdGVFeHBvcnRJbWFnZVNpemUiLCJzZXRFeHBvcnRJbWFnZURhdGFVcmlVcGRhdGVyIiwiX3JlZjEwIiwiZGF0YVVyaSIsInNldEV4cG9ydEltYWdlRXJyb3JVcGRhdGVyIiwiX3JlZjExIiwiY2xlYW51cEV4cG9ydEltYWdlVXBkYXRlciIsInN0YXJ0RXhwb3J0aW5nSW1hZ2VVcGRhdGVyIiwiX3JlZjEyIiwiX3JlZjEyJHBheWxvYWQiLCJvcHRpb25zIiwiaW1hZ2VTZXR0aW5ncyIsImNvbXBvc2VfIiwiYXBwbHlfIiwicGF5bG9hZF8iLCJzZXRFeHBvcnRTZWxlY3RlZERhdGFzZXRVcGRhdGVyIiwiX3JlZjEzIiwiZGF0YXNldCIsInNldEV4cG9ydERhdGFUeXBlVXBkYXRlciIsIl9yZWYxNCIsInNldEV4cG9ydEZpbHRlcmVkVXBkYXRlciIsIl9yZWYxNSIsInNldEV4cG9ydERhdGFVcGRhdGVyIiwic2V0VXNlck1hcGJveEFjY2Vzc1Rva2VuVXBkYXRlciIsIl9yZWYxNiIsInNldEV4cG9ydE1hcEZvcm1hdFVwZGF0ZXIiLCJfcmVmMTciLCJmb3JtYXQiLCJzZXRFeHBvcnRNYXBIVE1MTW9kZVVwZGF0ZXIiLCJfcmVmMTgiLCJhZGROb3RpZmljYXRpb25VcGRhdGVyIiwiX3JlZjE5Iiwib2xkTm90aWZpY2F0aW9ucyIsInBheWxvYWRJZCIsIm5vdGlmaWNhdGlvblRvVXBkYXRlIiwiZmluZCIsIm4iLCJtYXAiLCJjcmVhdGVOb3RpZmljYXRpb24iLCJjb3VudCIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJyZW1vdmVOb3RpZmljYXRpb25VcGRhdGVyIiwiX3JlZjIwIiwibG9hZEZpbGVzVXBkYXRlciIsImxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyIiwibG9hZEZpbGVzRXJyVXBkYXRlciIsIl9yZWYyMSIsImVycm9yTm90aWZpY2F0aW9uIiwibWVzc2FnZSIsInRvcGljIiwiREVGQVVMVF9OT1RJRklDQVRJT05fVE9QSUNTIiwiZ2xvYmFsIiwidG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwiZW50cmllcyIsImFjYyIsImVudHJ5Iiwic2hvd0RhdGFzZXRUYWJsZVVwZGF0ZXIiLCJEQVRBX1RBQkxFX0lEIiwic2V0TG9jYWxlVXBkYXRlciIsIl9yZWYyMiIsInRvZ2dsZVBhbmVsTGlzdFZpZXdVcGRhdGVyIiwiX3JlZjIzIiwiX3JlZjIzJHBheWxvYWQiLCJsaXN0VmlldyIsInN0YXRlUHJvcCJdLCJzb3VyY2VzIjpbIi4uL3NyYy91aS1zdGF0ZS11cGRhdGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge1xuICBBRERfREFUQV9JRCxcbiAgREFUQV9UQUJMRV9JRCxcbiAgREVGQVVMVF9OT1RJRklDQVRJT05fVE9QSUNTLFxuICBERUxFVEVfREFUQV9JRCxcbiAgRVhQT1JUX0RBVEFfVFlQRSxcbiAgRVhQT1JUX0hUTUxfTUFQX01PREVTLFxuICBFWFBPUlRfSU1HX1JBVElPUyxcbiAgRVhQT1JUX01BUF9GT1JNQVRTLFxuICBSRVNPTFVUSU9OUyxcbiAgTUFQX0NPTlRST0xTXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7TE9DQUxFX0NPREVTfSBmcm9tICdAa2VwbGVyLmdsL2xvY2FsaXphdGlvbic7XG5pbXBvcnQge1xuICBjcmVhdGVOb3RpZmljYXRpb24sXG4gIGVycm9yTm90aWZpY2F0aW9uLFxuICBjYWxjdWxhdGVFeHBvcnRJbWFnZVNpemUsXG4gIGdldEFwcGxpY2F0aW9uQ29uZmlnXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtwYXlsb2FkXywgYXBwbHlfLCBjb21wb3NlX30gZnJvbSAnLi9jb21wb3Nlci1oZWxwZXJzJztcblxuaW1wb3J0IHtcbiAgQWN0aW9uVHlwZXMsXG4gIEtlcGxlckdsSW5pdFBheWxvYWQsXG4gIExvYWRGaWxlc0VyclVwZGF0ZXJBY3Rpb24sXG4gIFVJU3RhdGVBY3Rpb25zXG59IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge1xuICBFeHBvcnREYXRhLFxuICBFeHBvcnRIdG1sLFxuICBFeHBvcnRKc29uLFxuICBFeHBvcnRNYXAsXG4gIEV4cG9ydEltYWdlLFxuICBNYXBDb250cm9sSXRlbSxcbiAgTWFwQ29udHJvbHMsXG4gIFVpU3RhdGVcbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMID0gJ2xheWVyJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREFMID0gQUREX0RBVEFfSUQ7XG5cbi8qKlxuICogVXBkYXRlcnMgZm9yIGB1aVN0YXRlYCByZWR1Y2VyLiBDYW4gYmUgdXNlZCBpbiB5b3VyIHJvb3QgcmVkdWNlciB0byBkaXJlY3RseSBtb2RpZnkga2VwbGVyLmdsJ3Mgc3RhdGUuXG4gKiBSZWFkIG1vcmUgYWJvdXQgW1VzaW5nIHVwZGF0ZXJzXSguLi9hZHZhbmNlZC11c2FnZS91c2luZy11cGRhdGVycy5tZClcbiAqXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBrZXBsZXJHbFJlZHVjZXIsIHt1aVN0YXRlVXBkYXRlcnN9IGZyb20gJ0BrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuICogLy8gUm9vdCBSZWR1Y2VyXG4gKiBjb25zdCByZWR1Y2VycyA9IGNvbWJpbmVSZWR1Y2Vycyh7XG4gKiAga2VwbGVyR2w6IGtlcGxlckdsUmVkdWNlcixcbiAqICBhcHA6IGFwcFJlZHVjZXJcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGNvbXBvc2VkUmVkdWNlciA9IChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gKiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICogICAgLy8gY2xpY2sgYnV0dG9uIHRvIGNsb3NlIHNpZGUgcGFuZWxcbiAqICAgIGNhc2UgJ0NMSUNLX0JVVFRPTic6XG4gKiAgICAgIHJldHVybiB7XG4gKiAgICAgICAgLi4uc3RhdGUsXG4gKiAgICAgICAga2VwbGVyR2w6IHtcbiAqICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLFxuICogICAgICAgICAgZm9vOiB7XG4gKiAgICAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbC5mb28sXG4gKiAgICAgICAgICAgICB1aVN0YXRlOiB1aVN0YXRlVXBkYXRlcnMudG9nZ2xlU2lkZVBhbmVsVXBkYXRlcihcbiAqICAgICAgICAgICAgICAgdWlTdGF0ZSwge3BheWxvYWQ6IG51bGx9XG4gKiAgICAgICAgICAgICApXG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgfVxuICogICAgICB9O1xuICogIH1cbiAqICByZXR1cm4gcmVkdWNlcnMoc3RhdGUsIGFjdGlvbik7XG4gKiB9O1xuICpcbiAqIGV4cG9ydCBkZWZhdWx0IGNvbXBvc2VkUmVkdWNlcjtcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCB1aVN0YXRlVXBkYXRlcnMgPSBudWxsO1xuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cblxuY29uc3QgREVGQVVMVF9NQVBfQ09OVFJPTFNfRkVBVFVSRVM6IE1hcENvbnRyb2xJdGVtID0ge1xuICBzaG93OiB0cnVlLFxuICBhY3RpdmU6IGZhbHNlLFxuICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxuICAvLyBkZWZpbmVzIHdoaWNoIG1hcCBpbmRleCB1c2VycyBhcmUgaW50ZXJhY3Rpbmcgd2l0aCAodGhyb3VnaCBtYXAgY29udHJvbHMpXG4gIGFjdGl2ZU1hcEluZGV4OiAwXG59O1xuXG5jb25zdCBERUZBVUxUX01BUF9MRUdFTkRfQ09OVFJPTCA9IHtcbiAgLi4uREVGQVVMVF9NQVBfQ09OVFJPTFNfRkVBVFVSRVMsXG4gIGRpc2FibGVFZGl0OiBmYWxzZVxufTtcbi8qKlxuICogQSBsaXN0IG9mIG1hcCBjb250cm9sIHZpc2liaWxpdHkgYW5kIHdoZXRoZXIgaXMgaXQgYWN0aXZlLlxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgdmlzaWJsZUxheWVycyBEZWZhdWx0OiBge3Nob3c6IHRydWUsIGFjdGl2ZTogZmFsc2V9YFxuICogQHByb3BlcnR5IG1hcExlZ2VuZCBEZWZhdWx0OiBge3Nob3c6IHRydWUsIGFjdGl2ZTogZmFsc2V9YFxuICogQHByb3BlcnR5IHRvZ2dsZTNkIERlZmF1bHQ6IGB7c2hvdzogdHJ1ZX1gXG4gKiBAcHJvcGVydHkgc3BsaXRNYXAgRGVmYXVsdDogYHtzaG93OiB0cnVlfWBcbiAqIEBwcm9wZXJ0eSBtYXBEcmF3IERlZmF1bHQ6IGB7c2hvdzogdHJ1ZSwgYWN0aXZlOiBmYWxzZX1gXG4gKiBAcHJvcGVydHkgbWFwTG9jYWxlIERlZmF1bHQ6IGB7c2hvdzogZmFsc2UsIGFjdGl2ZTogZmFsc2V9YFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVBfQ09OVFJPTFM6IE1hcENvbnRyb2xzID0gKFxuICBPYmplY3Qua2V5cyhNQVBfQ09OVFJPTFMpIGFzIEFycmF5PGtleW9mIHR5cGVvZiBNQVBfQ09OVFJPTFM+XG4pLnJlZHVjZShcbiAgKGZpbmFsLCBjdXJyZW50KSA9PiAoe1xuICAgIC4uLmZpbmFsLFxuICAgIFtjdXJyZW50XTpcbiAgICAgIGN1cnJlbnQgPT09IE1BUF9DT05UUk9MUy5tYXBMZWdlbmRcbiAgICAgICAgPyBERUZBVUxUX01BUF9MRUdFTkRfQ09OVFJPTFxuICAgICAgICA6IERFRkFVTFRfTUFQX0NPTlRST0xTX0ZFQVRVUkVTXG4gIH0pLFxuICB7fSBhcyBNYXBDb250cm9sc1xuKTtcblxuLyoqXG4gKiBEZWZhdWx0IGltYWdlIGV4cG9ydCBjb25maWdcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHJhdGlvIERlZmF1bHQ6IGAnU0NSRUVOJ2AsXG4gKiBAcHJvcGVydHkgcmVzb2x1dGlvbiBEZWZhdWx0OiBgJ09ORV9YJ2AsXG4gKiBAcHJvcGVydHkgbGVnZW5kIERlZmF1bHQ6IGBmYWxzZWAsXG4gKiBAcHJvcGVydHkgbWFwSCBEZWZhdWx0OiAwLFxuICogQHByb3BlcnR5IG1hcFcgRGVmYXVsdDogMCxcbiAqIEBwcm9wZXJ0eSBpbWFnZVNpemUgRGVmYXVsdDoge3pvb21PZmZzZXQ6IDAsIHNjYWxlOiAxLCBpbWFnZVc6IDAsIGltYWdlSDogMH0sXG4gKiBAcHJvcGVydHkgaW1hZ2VEYXRhVXJpIERlZmF1bHQ6IGAnJ2AsXG4gKiBAcHJvcGVydHkgZXhwb3J0aW5nIERlZmF1bHQ6IGBmYWxzZWBcbiAqIEBwcm9wZXJ0eSBlcnJvciBEZWZhdWx0OiBgZmFsc2VgXG4gKiBAcHJvcGVydHkgZXNjYXBlWGh0bWxGb3JXZWJwYWNrIERlZmF1bHQ6IGZyb20gYXBwbGljYXRpb24gY29uZmlnIChhdXRvLWRldGVjdGVkOiBgdHJ1ZWAgZm9yIHdlYnBhY2spXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9JTUFHRTogRXhwb3J0SW1hZ2UgPSB7XG4gIC8vIHVzZXIgb3B0aW9uc1xuICByYXRpbzogRVhQT1JUX0lNR19SQVRJT1MuU0NSRUVOLFxuICByZXNvbHV0aW9uOiBSRVNPTFVUSU9OUy5PTkVfWCxcbiAgbGVnZW5kOiBmYWxzZSxcbiAgbWFwSDogMCxcbiAgbWFwVzogMCxcbiAgaW1hZ2VTaXplOiB7XG4gICAgem9vbU9mZnNldDogMCxcbiAgICBzY2FsZTogMSxcbiAgICBpbWFnZVc6IDAsXG4gICAgaW1hZ2VIOiAwXG4gIH0sXG4gIC8vIHdoZW4gdGhpcyBpcyBzZXQgdG8gdHJ1ZSwgdGhlIG1vY2sgbWFwIHZpZXdwb3J0IHdpbGwgbW92ZSB0byB0aGUgY2VudGVyIG9mIGRhdGFcbiAgY2VudGVyOiBmYWxzZSxcbiAgLy8gZXhwb3J0aW5nIHN0YXRlXG4gIGltYWdlRGF0YVVyaTogJycsXG4gIC8vIGV4cG9ydGluZzogdXNlZCB0byBhdHRhY2ggcGxvdC1jb250YWluZXIgdG8gZG9tXG4gIGV4cG9ydGluZzogZmFsc2UsXG4gIC8vIHByb2Nlc3Npbmc6IHVzZWQgYXMgbG9hZGluZyBpbmRpY2F0b3Igd2hlbiBleHBvcnQgaW1hZ2UgaXMgYmVpbmcgcHJvZHVjZWRcbiAgcHJvY2Vzc2luZzogZmFsc2UsXG4gIGVycm9yOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byBhcHBseSBmaXggZm9yIHVnbGlmeSBlcnJvciBpbiBkb20tdG8taW1hZ2UgKGZyb20gYXBwbGljYXRpb24gY29uZmlnLCBhdXRvLWRldGVjdHMgYnVpbGQgdG9vbClcbiAgZXNjYXBlWGh0bWxGb3JXZWJwYWNrOiBnZXRBcHBsaWNhdGlvbkNvbmZpZygpLmVzY2FwZVhodG1sRm9yV2VicGFja1xufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTE9BRF9GSUxFUyA9IHtcbiAgZmlsZUxvYWRpbmc6IGZhbHNlXG59O1xuXG4vKipcbiAqIERlZmF1bHQgaW5pdGlhbCBgZXhwb3J0RGF0YWAgc2V0dGluZ3NcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHNlbGVjdGVkRGF0YXNldCBEZWZhdWx0OiBgJydgLFxuICogQHByb3BlcnR5IGRhdGFUeXBlIERlZmF1bHQ6IGAnY3N2J2AsXG4gKiBAcHJvcGVydHkgZmlsdGVyZWQgRGVmYXVsdDogYHRydWVgLFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfREFUQTogRXhwb3J0RGF0YSA9IHtcbiAgc2VsZWN0ZWREYXRhc2V0OiAnJyxcbiAgZGF0YVR5cGU6IEVYUE9SVF9EQVRBX1RZUEUuQ1NWLFxuICBmaWx0ZXJlZDogdHJ1ZVxufTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9USUZJQ0FUSU9OUyA9IFtdO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IGV4cG9ydE1hcGJveEFjY2Vzc1Rva2VuIC0gRGVmYXVsdDogbnVsbCwgdGhpcyBpcyB1c2VkIHdoZW4gd2UgcHJvdmlkZSBhIGRlZmF1bHQgbWFwYm94IHRva2VuIGZvciB1c2VycyB0byB0YWtlIGFkdmFudGFnZSBvZlxuICogQHByb3BlcnR5IHVzZXJNYXBib3hUb2tlbiAtIERlZmF1bHQ6ICcnLCBtYXBib3ggdG9rZW4gcHJvdmlkZWQgYnkgdXNlciB0aHJvdWdoIGlucHV0IGZpZWxkXG4gKiBAcHJvcGVydHkgbW9kZSAtIERlZmF1bHQ6ICdSRUFEJywgcmVhZCBvbmx5IG9yIGVkaXRhYmxlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9IVE1MOiBFeHBvcnRIdG1sID0ge1xuICBleHBvcnRNYXBib3hBY2Nlc3NUb2tlbjogbnVsbCxcbiAgdXNlck1hcGJveFRva2VuOiAnJyxcbiAgbW9kZTogRVhQT1JUX0hUTUxfTUFQX01PREVTLlJFQURcbn07XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgaGFzRGF0YSAtIERlZmF1bHQ6ICd0cnVlJyxcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhQT1JUX0pTT046IEV4cG9ydEpzb24gPSB7XG4gIGhhc0RhdGE6IHRydWVcbn07XG5cbi8qKlxuICogRXhwb3J0IE1hcCBDb25maWdcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IEhUTUwgLSBEZWZhdWx0OiAnREVGQVVMVF9FWFBPUlRfSFRNTCcsXG4gKiBAcHJvcGVydHkgSlNPTiAtIERlZmF1bHQ6ICdERUZBVUxUX0VYUE9SVF9KU09OJyxcbiAqIEBwcm9wZXJ0eSBmb3JtYXQgLSBEZWZhdWx0OiAnSFRNTCcsXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9NQVA6IEV4cG9ydE1hcCA9IHtcbiAgW0VYUE9SVF9NQVBfRk9STUFUUy5IVE1MXTogREVGQVVMVF9FWFBPUlRfSFRNTCxcbiAgW0VYUE9SVF9NQVBfRk9STUFUUy5KU09OXTogREVGQVVMVF9FWFBPUlRfSlNPTixcbiAgZm9ybWF0OiBFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTFxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYHVpU3RhdGVgXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSByZWFkT25seSBEZWZhdWx0OiBgZmFsc2VgXG4gKiBAcHJvcGVydHkgYWN0aXZlU2lkZVBhbmVsIERlZmF1bHQ6IGAnbGF5ZXInYFxuICogQHByb3BlcnR5IGN1cnJlbnRNb2RhbCBEZWZhdWx0OiBgJ2FkZERhdGEnYFxuICogQHByb3BlcnR5IGRhdGFzZXRLZXlUb1JlbW92ZSBEZWZhdWx0OiBgbnVsbGBcbiAqIEBwcm9wZXJ0eSB2aXNpYmxlRHJvcGRvd24gRGVmYXVsdDogYG51bGxgXG4gKiBAcHJvcGVydHkgZXhwb3J0SW1hZ2UgRGVmYXVsdDogW2BERUZBVUxUX0VYUE9SVF9JTUFHRWBdKCNkZWZhdWx0X2V4cG9ydF9pbWFnZSlcbiAqIEBwcm9wZXJ0eSBleHBvcnREYXRhIERlZmF1bHQ6IFtgREVGQVVMVF9FWFBPUlRfREFUQWBdKCNkZWZhdWx0X2V4cG9ydF9kYXRhKVxuICogQHByb3BlcnR5IGV4cG9ydE1hcCBEZWZhdWx0OiBbYERFRkFVTFRfRVhQT1JUX01BUGBdKCNkZWZhdWx0X2V4cG9ydF9tYXApXG4gKiBAcHJvcGVydHkgbWFwQ29udHJvbHMgRGVmYXVsdDogW2BERUZBVUxUX01BUF9DT05UUk9MU2BdKCNkZWZhdWx0X21hcF9jb250cm9scylcbiAqIEBwcm9wZXJ0eSBub3RpZmljYXRpb25zIERlZmF1bHQ6IGBbXWBcbiAqIEBwcm9wZXJ0eSBub3RpZmljYXRpb25zIERlZmF1bHQ6IGBbXWBcbiAqIEBwcm9wZXJ0eSBsb2FkRmlsZXNcbiAqIEBwcm9wZXJ0eSBpc1NpZGVQYW5lbENsb3NlQnV0dG9uVmlzaWJsZSBEZWZhdWx0OiBgdHJ1ZWBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IElOSVRJQUxfVUlfU1RBVEU6IFVpU3RhdGUgPSB7XG4gIHJlYWRPbmx5OiBmYWxzZSxcbiAgYWN0aXZlU2lkZVBhbmVsOiBERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMLFxuICBjdXJyZW50TW9kYWw6IERFRkFVTFRfTU9EQUwsXG4gIGRhdGFzZXRLZXlUb1JlbW92ZTogbnVsbCxcbiAgdmlzaWJsZURyb3Bkb3duOiBudWxsLFxuICAvLyBleHBvcnQgaW1hZ2UgbW9kYWwgdWlcbiAgZXhwb3J0SW1hZ2U6IERFRkFVTFRfRVhQT1JUX0lNQUdFLFxuICAvLyBleHBvcnQgZGF0YSBtb2RhbCB1aVxuICBleHBvcnREYXRhOiBERUZBVUxUX0VYUE9SVF9EQVRBLFxuICAvLyBodG1sIGV4cG9ydFxuICBleHBvcnRNYXA6IERFRkFVTFRfRVhQT1JUX01BUCxcbiAgLy8gbWFwIGNvbnRyb2wgcGFuZWxzXG4gIG1hcENvbnRyb2xzOiBERUZBVUxUX01BUF9DT05UUk9MUyxcbiAgLy8gdWkgbm90aWZpY2F0aW9uc1xuICBub3RpZmljYXRpb25zOiBERUZBVUxUX05PVElGSUNBVElPTlMsXG4gIC8vIGxvYWQgZmlsZXNcbiAgbG9hZEZpbGVzOiBERUZBVUxUX0xPQURfRklMRVMsXG4gIC8vIExvY2FsZSBvZiB0aGUgVUlcbiAgbG9jYWxlOiBMT0NBTEVfQ09ERVMuZW4sXG4gIGxheWVyUGFuZWxMaXN0VmlldzogJ2xpc3QnLFxuICBmaWx0ZXJQYW5lbExpc3RWaWV3OiAnbGlzdCcsXG4gIGlzU2lkZVBhbmVsQ2xvc2VCdXR0b25WaXNpYmxlOiB0cnVlXG59O1xuXG4vKiBVcGRhdGVycyAqL1xuLyoqXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBpbml0VWlTdGF0ZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICBhY3Rpb246IHtcbiAgICB0eXBlPzogKHR5cGVvZiBBY3Rpb25UeXBlcylbJ0lOSVQnXTtcbiAgICBwYXlsb2FkOiBLZXBsZXJHbEluaXRQYXlsb2FkO1xuICB9XG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICAuLi4oYWN0aW9uLnBheWxvYWQgfHwge30pLmluaXRpYWxVaVN0YXRlXG59KTtcblxuLyoqXG4gKiBUb2dnbGUgYWN0aXZlIHNpZGUgcGFuZWxcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBpZCBvZiBzaWRlIHBhbmVsIHRvIGJlIHNob3duLCBvbmUgb2YgYGxheWVyYCwgYGZpbHRlcmAsIGBpbnRlcmFjdGlvbmAsIGBtYXBgLiBjbG9zZSBzaWRlIHBhbmVsIGlmIGBudWxsYFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVTaWRlUGFuZWxVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGlkfTogVUlTdGF0ZUFjdGlvbnMuVG9nZ2xlU2lkZVBhbmVsVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIHJldHVybiBpZCA9PT0gc3RhdGUuYWN0aXZlU2lkZVBhbmVsXG4gICAgPyBzdGF0ZVxuICAgIDoge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgYWN0aXZlU2lkZVBhbmVsOiBpZFxuICAgICAgfTtcbn07XG5cbi8qKlxuICogU2hvdyBhbmQgaGlkZSBtb2RhbCBkaWFsb2dcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbWFjdGlvbi5wYXlsb2FkIGlkIG9mIG1vZGFsIHRvIGJlIHNob3duLCBudWxsIHRvIGhpZGUgbW9kYWxzLiBPbmUgb2Y6XG4gKiAgLSBbYERBVEFfVEFCTEVfSURgXSguLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5tZCNkYXRhX3RhYmxlX2lkKVxuICogIC0gW2BERUxFVEVfREFUQV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2RlbGV0ZV9kYXRhX2lkKVxuICogIC0gW2BBRERfREFUQV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2FkZF9kYXRhX2lkKVxuICogIC0gW2BFWFBPUlRfSU1BR0VfSURgXSguLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5tZCNleHBvcnRfaW1hZ2VfaWQpXG4gKiAgLSBbYEVYUE9SVF9EQVRBX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjZXhwb3J0X2RhdGFfaWQpXG4gKiAgLSBbYEFERF9NQVBfU1RZTEVfSURgXSguLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5tZCNhZGRfbWFwX3N0eWxlX2lkKVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVNb2RhbFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogaWR9OiBVSVN0YXRlQWN0aW9ucy5Ub2dnbGVNb2RhbFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGN1cnJlbnRNb2RhbDogaWRcbn0pO1xuXG4vKipcbiAqIEhpZGUgYW5kIHNob3cgc2lkZSBwYW5lbCBoZWFkZXIgZHJvcGRvd24sIGFjdGl2YXRlZCBieSBjbGlja2luZyB0aGUgc2hhcmUgbGluayBvbiB0b3Agb2YgdGhlIHNpZGUgcGFuZWxcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNob3dFeHBvcnREcm9wZG93blVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogaWR9OiBVSVN0YXRlQWN0aW9ucy5TaG93RXhwb3J0RHJvcGRvd25VcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICB2aXNpYmxlRHJvcGRvd246IGlkXG59KTtcblxuLyoqXG4gKiBIaWRlIHNpZGUgcGFuZWwgaGVhZGVyIGRyb3Bkb3duLCBhY3RpdmF0ZWQgYnkgY2xpY2tpbmcgdGhlIHNoYXJlIGxpbmsgb24gdG9wIG9mIHRoZSBzaWRlIHBhbmVsXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBoaWRlRXhwb3J0RHJvcGRvd25VcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgdmlzaWJsZURyb3Bkb3duOiBudWxsXG59KTtcblxuLyoqXG4gKiBUb2dnbGUgc2lkZSBwYW5lbCBjbG9zZSBidXR0b24gb24gdG9wIGxlZnQgb2YgdGhlIHNpZGUgcGFuZWxcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNpZGVQYW5lbENsb3NlQnV0dG9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiB7c2hvd319OiBVSVN0YXRlQWN0aW9ucy5Ub2dnbGVTaWRlUGFuZWxDbG9zZUJ1dHRvblVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGlzU2lkZVBhbmVsQ2xvc2VCdXR0b25WaXNpYmxlOiBzaG93XG59KTtcblxuLyoqXG4gKiBUb2dnbGUgYWN0aXZlIG1hcCBjb250cm9sIHBhbmVsXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIG1hcCBjb250cm9sIHBhbmVsIGlkLCBvbmUgb2YgdGhlIGtleXMgb2Y6IFtgREVGQVVMVF9NQVBfQ09OVFJPTFNgXSgjZGVmYXVsdF9tYXBfY29udHJvbHMpXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHtwYW5lbElkLCBpbmRleCA9IDB9fTogVUlTdGF0ZUFjdGlvbnMuVG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICBsZXQgdXBkYXRlZFN0YXRlID0gc3RhdGU7XG4gIC8vIFRoZSBlZmZlY3QgcGFuZWwgYW5kIGFpIGFzc2lzdGFudCBwYW5lbCBjYW4gbm90IGJlIGFjdGl2ZSBhdCB0aGUgc2FtZSB0aW1lXG4gIC8vIHNvIHdlIG5lZWQgdG8gZGVhY3RpdmF0ZSB0aGUgb3RoZXIgcGFuZWwgd2hlbiBvbmUgaXMgYWN0aXZhdGVkXG4gIGNvbnN0IHBhbmVsVG9EZWFjdGl2YXRlID1cbiAgICBwYW5lbElkID09PSBNQVBfQ09OVFJPTFMuZWZmZWN0XG4gICAgICA/IE1BUF9DT05UUk9MUy5haUFzc2lzdGFudFxuICAgICAgOiBwYW5lbElkID09PSBNQVBfQ09OVFJPTFMuYWlBc3Npc3RhbnRcbiAgICAgID8gTUFQX0NPTlRST0xTLmVmZmVjdFxuICAgICAgOiBudWxsO1xuXG4gIC8vIFRvIHRvIHRvZ2dsZSB0aGUgbWFwRHJhdyBhbmQgbWFwTG9jYWwgZHJvcGRvd25zXG4gIC8vIFdlIGhhdmUgdG8gZGVhY3RpdmF0ZSB0aGUgb3RoZXIgYWN0aXZlIGRyb3Bkb3duXG4gIGNvbnN0IGRyb3Bkb3duVG9EZWFjdGl2YXRlID1cbiAgICBwYW5lbElkID09PSBNQVBfQ09OVFJPTFMubWFwRHJhd1xuICAgICAgPyBNQVBfQ09OVFJPTFMubWFwTG9jYWxlXG4gICAgICA6IHBhbmVsSWQgPT09IE1BUF9DT05UUk9MUy5tYXBMb2NhbGVcbiAgICAgID8gTUFQX0NPTlRST0xTLm1hcERyYXdcbiAgICAgIDogbnVsbDtcblxuICAvLyBJZiB3ZSBuZWVkIHRvIGRlYWN0aXZhdGUgYSBjb21wZXRpbmcgcGFuZWwgYW5kIGl0J3MgY3VycmVudGx5IGFjdGl2ZVxuICBpZiAocGFuZWxUb0RlYWN0aXZhdGUgJiYgc3RhdGUubWFwQ29udHJvbHNbcGFuZWxUb0RlYWN0aXZhdGVdPy5hY3RpdmUpIHtcbiAgICB1cGRhdGVkU3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIG1hcENvbnRyb2xzOiB7XG4gICAgICAgIC4uLnVwZGF0ZWRTdGF0ZS5tYXBDb250cm9scyxcbiAgICAgICAgW3BhbmVsVG9EZWFjdGl2YXRlXToge1xuICAgICAgICAgIC4uLnVwZGF0ZWRTdGF0ZS5tYXBDb250cm9sc1twYW5lbFRvRGVhY3RpdmF0ZV0sXG4gICAgICAgICAgYWN0aXZlOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIElmIHdlIG5lZWQgdG8gZGVhY3RpdmF0ZSBhIGNvbXBldGluZyBkcm9wZG93biBhbmQgaXQncyBjdXJyZW50bHkgYWN0aXZlXG4gIGlmIChkcm9wZG93blRvRGVhY3RpdmF0ZSAmJiBzdGF0ZS5tYXBDb250cm9sc1tkcm9wZG93blRvRGVhY3RpdmF0ZV0/LmFjdGl2ZSkge1xuICAgIHVwZGF0ZWRTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbWFwQ29udHJvbHM6IHtcbiAgICAgICAgLi4udXBkYXRlZFN0YXRlLm1hcENvbnRyb2xzLFxuICAgICAgICBbZHJvcGRvd25Ub0RlYWN0aXZhdGVdOiB7XG4gICAgICAgICAgLi4udXBkYXRlZFN0YXRlLm1hcENvbnRyb2xzW2Ryb3Bkb3duVG9EZWFjdGl2YXRlXSxcbiAgICAgICAgICBhY3RpdmU6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi51cGRhdGVkU3RhdGUsXG4gICAgbWFwQ29udHJvbHM6IHtcbiAgICAgIC4uLnVwZGF0ZWRTdGF0ZS5tYXBDb250cm9scyxcbiAgICAgIFtwYW5lbElkXToge1xuICAgICAgICAuLi51cGRhdGVkU3RhdGUubWFwQ29udHJvbHNbcGFuZWxJZF0sXG4gICAgICAgIGFjdGl2ZTogIXVwZGF0ZWRTdGF0ZS5tYXBDb250cm9sc1twYW5lbElkXS5hY3RpdmUsXG4gICAgICAgIGFjdGl2ZU1hcEluZGV4OiBpbmRleFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIG1hcCBjb250cm9sIHZpc2liaWxpdHlcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgbWFwIGNvbnRyb2wgcGFuZWwgaWQsIG9uZSBvZiB0aGUga2V5cyBvZjogW2BERUZBVUxUX01BUF9DT05UUk9MU2BdKCNkZWZhdWx0X21hcF9jb250cm9scylcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0TWFwQ29udHJvbFZpc2liaWxpdHlVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHtwYW5lbElkLCBzaG93fX06IFVJU3RhdGVBY3Rpb25zLnNldE1hcENvbnRyb2xWaXNpYmlsaXR5VXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGlmICghc3RhdGUubWFwQ29udHJvbHM/LltwYW5lbElkXSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbWFwQ29udHJvbHM6IHtcbiAgICAgIC4uLnN0YXRlLm1hcENvbnRyb2xzLFxuICAgICAgW3BhbmVsSWRdOiB7XG4gICAgICAgIC4uLnN0YXRlLm1hcENvbnRyb2xzW3BhbmVsSWRdLFxuICAgICAgICBzaG93OiBCb29sZWFuKHNob3cpXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBUb2dnbGUgbWFwIGNvbnRyb2wgc2V0dGluZ3NcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgbWFwIGNvbnRyb2wgcGFuZWwgaWQsIG9uZSBvZiB0aGUga2V5cyBvZjogW2BERUZBVUxUX01BUF9DT05UUk9MU2BdKCNkZWZhdWx0X21hcF9jb250cm9scylcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0TWFwQ29udHJvbFNldHRpbmdzVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiB7cGFuZWxJZCwgc2V0dGluZ3N9fTogVUlTdGF0ZUFjdGlvbnMuc2V0TWFwQ29udHJvbFNldHRpbmdzVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGNvbnN0IG1hcENvbnRyb2wgPSBzdGF0ZS5tYXBDb250cm9scz8uW3BhbmVsSWRdO1xuICBpZiAoIW1hcENvbnRyb2wpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIG1hcENvbnRyb2xzOiB7XG4gICAgICAuLi5zdGF0ZS5tYXBDb250cm9scyxcbiAgICAgIFtwYW5lbElkXTogey4uLm1hcENvbnRyb2wsIHNldHRpbmdzOiB7Li4ubWFwQ29udHJvbC5zZXR0aW5ncywgLi4uc2V0dGluZ3N9fVxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIGFjdGl2ZSBtYXAgY29udHJvbCBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGRhdGFzZXQgaWRcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgb3BlbkRlbGV0ZU1vZGFsVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBkYXRhc2V0S2V5VG9SZW1vdmV9OiBVSVN0YXRlQWN0aW9ucy5PcGVuRGVsZXRlTW9kYWxVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBjdXJyZW50TW9kYWw6IERFTEVURV9EQVRBX0lELFxuICBkYXRhc2V0S2V5VG9SZW1vdmVcbn0pO1xuXG4vKipcbiAqIFNldCBgZXhwb3J0SW1hZ2UubGVnZW5kYCB0byBgdHJ1ZWAgb3IgYGZhbHNlYFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IG5ld1NldHRpbmd9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgY29uc3QgdXBkYXRlZCA9IHsuLi5zdGF0ZS5leHBvcnRJbWFnZSwgLi4ubmV3U2V0dGluZ307XG4gIGNvbnN0IGltYWdlU2l6ZSA9IGNhbGN1bGF0ZUV4cG9ydEltYWdlU2l6ZSh1cGRhdGVkKSB8fCBzdGF0ZS5leHBvcnRJbWFnZS5pbWFnZVNpemU7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBleHBvcnRJbWFnZToge1xuICAgICAgLi4udXBkYXRlZCxcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgIC8vIFRPRE86IGNhbGN1bGF0ZUV4cG9ydEltYWdlU2l6ZSBkb2VzIG5vdCByZXR1cm4gaW1hZ2VTaXplLnpvb21PZmZzZXQsXG4gICAgICAvLyBkbyB3ZSBuZWVkIHRha2UgdGhpcyB2YWx1ZSBmcm9tIGN1cnJlbnQgc3RhdGUsIG9yIHJldHVybiBkZWZhdWwgdmFsdWUgPSAwXG4gICAgICBpbWFnZVNpemVcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIFNldCBgZXhwb3J0SW1hZ2Uuc2V0RXhwb3J0SW1hZ2VEYXRhVXJpYCB0byBhIGltYWdlIGRhdGFVcmlcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBleHBvcnQgaW1hZ2UgZGF0YSB1cmlcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0SW1hZ2VEYXRhVXJpVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBkYXRhVXJpfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0SW1hZ2VEYXRhVXJpVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGlmIChkYXRhVXJpID09PSBzdGF0ZS5leHBvcnRJbWFnZS5pbWFnZURhdGFVcmkpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBleHBvcnRJbWFnZToge1xuICAgICAgLi4uc3RhdGUuZXhwb3J0SW1hZ2UsXG4gICAgICBwcm9jZXNzaW5nOiBmYWxzZSxcbiAgICAgIGltYWdlRGF0YVVyaTogZGF0YVVyaVxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0SW1hZ2VFcnJvclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogZXJyb3J9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRJbWFnZUVycm9yVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0SW1hZ2U6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnRJbWFnZSxcbiAgICBwcm9jZXNzaW5nOiBmYWxzZSxcbiAgICBlcnJvclxuICB9XG59KTtcblxuLyoqXG4gKiBEZWxldGUgY2FjaGVkIGV4cG9ydCBpbWFnZVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgY2xlYW51cEV4cG9ydEltYWdlVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydEltYWdlOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0SW1hZ2UsXG4gICAgZXhwb3J0aW5nOiBmYWxzZSxcbiAgICBpbWFnZURhdGFVcmk6ICcnLFxuICAgIGVycm9yOiBmYWxzZSxcbiAgICBwcm9jZXNzaW5nOiBmYWxzZSxcbiAgICBjZW50ZXI6IGZhbHNlXG4gIH1cbn0pO1xuXG4vKipcbiAqIFN0YXJ0IGltYWdlIGV4cG9ydGluZyBmbG93XG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyB7VWlTdGF0ZX1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0YXJ0RXhwb3J0aW5nSW1hZ2VVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IG9wdGlvbnMgPSB7fX06IHtwYXlsb2FkOiBQYXJ0aWFsPEV4cG9ydEltYWdlPn1cbik6IFVpU3RhdGUgPT4ge1xuICBjb25zdCBpbWFnZVNldHRpbmdzID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZXhwb3J0aW5nOiB0cnVlXG4gIH07XG5cbiAgcmV0dXJuIGNvbXBvc2VfKFtcbiAgICBjbGVhbnVwRXhwb3J0SW1hZ2VVcGRhdGVyLFxuICAgIGFwcGx5XyhzZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyLCBwYXlsb2FkXyhpbWFnZVNldHRpbmdzKSlcbiAgXSkoc3RhdGUpO1xufTtcblxuLyoqXG4gKiBTZXQgc2VsZWN0ZWQgZGF0YXNldCBmb3IgZXhwb3J0XG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgZGF0YXNldCBpZFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRTZWxlY3RlZERhdGFzZXRVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGRhdGFzZXR9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRTZWxlY3RlZERhdGFzZXRVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnREYXRhOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0RGF0YSxcbiAgICBzZWxlY3RlZERhdGFzZXQ6IGRhdGFzZXRcbiAgfVxufSk7XG5cbi8qKlxuICogU2V0IGRhdGEgZm9ybWF0IGZvciBleHBvcnRpbmcgZGF0YVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIG9uZSBvZiBgJ3RleHQvY3N2J2BcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0RGF0YVR5cGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGRhdGFUeXBlfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0RGF0YVR5cGVVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnREYXRhOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0RGF0YSxcbiAgICBkYXRhVHlwZVxuICB9XG59KTtcblxuLyoqXG4gKiBXaGV0aGVyIHRvIGV4cG9ydCBmaWx0ZXJlZCBkYXRhLCBgdHJ1ZWAgb3IgYGZhbHNlYFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydEZpbHRlcmVkVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBmaWx0ZXJlZH06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydEZpbHRlcmVkVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0RGF0YToge1xuICAgIC4uLnN0YXRlLmV4cG9ydERhdGEsXG4gICAgZmlsdGVyZWRcbiAgfVxufSk7XG5cbi8qKlxuICogV2hldGhlciB0byBpbmNsdWRpbmcgZGF0YSBpbiBtYXAgY29uZmlnLCB0b2dnbGUgYmV0d2VlbiBgdHJ1ZWAgb3IgYGZhbHNlYFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnREYXRhVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydE1hcDoge1xuICAgIC4uLnN0YXRlLmV4cG9ydE1hcCxcbiAgICBbRVhQT1JUX01BUF9GT1JNQVRTLkpTT05dOiB7XG4gICAgICAuLi5zdGF0ZS5leHBvcnRNYXBbRVhQT1JUX01BUF9GT1JNQVRTLkpTT05dLFxuICAgICAgaGFzRGF0YTogIXN0YXRlLmV4cG9ydE1hcFtFWFBPUlRfTUFQX0ZPUk1BVFMuSlNPTl0uaGFzRGF0YVxuICAgIH1cbiAgfVxufSk7XG5cbi8qKlxuICogd2hldGhlciB0byBleHBvcnQgYSBtYXBib3ggYWNjZXNzIHRvIEhUTUwgc2luZ2xlIHBhZ2VcbiAqIEBwYXJhbSBzdGF0ZSAtIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFVzZXJNYXBib3hBY2Nlc3NUb2tlblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogdXNlck1hcGJveFRva2VufTogVUlTdGF0ZUFjdGlvbnMuU2V0VXNlck1hcGJveEFjY2Vzc1Rva2VuVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0TWFwOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0TWFwLFxuICAgIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTF06IHtcbiAgICAgIC4uLnN0YXRlLmV4cG9ydE1hcFtFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTF0sXG4gICAgICB1c2VyTWFwYm94VG9rZW5cbiAgICB9XG4gIH1cbn0pO1xuXG4vKipcbiAqIFNldHMgdGhlIGV4cG9ydCBtYXAgZm9ybWF0XG4gKiBAcGFyYW0gc3RhdGUgLSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBmb3JtYXQgdG8gdXNlIHRvIGV4cG9ydCB0aGUgbWFwIGludG9cbiAqIEByZXR1cm4gbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRNYXBGb3JtYXRVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGZvcm1hdH06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydE1hcEZvcm1hdFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydE1hcDoge1xuICAgIC4uLnN0YXRlLmV4cG9ydE1hcCxcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgZm9ybWF0XG4gIH1cbn0pO1xuXG4vKipcbiAqIFNldCB0aGUgZXhwb3J0IGh0bWwgbWFwIG1vZGVcbiAqIEBwYXJhbSBzdGF0ZSAtIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIHRvIGJlIHNldCAoYXZhaWxhYmxlIG1vZGVzOiBFWFBPUlRfSFRNTF9NQVBfTU9ERVMpXG4gKiBAcmV0dXJuIG5leHRTdGF0ZVxuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0TWFwSFRNTE1vZGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IG1vZGV9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRIVE1MTWFwTW9kZVVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydE1hcDoge1xuICAgIC4uLnN0YXRlLmV4cG9ydE1hcCxcbiAgICBbRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxdOiB7XG4gICAgICAuLi5zdGF0ZS5leHBvcnRNYXBbRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxdLFxuICAgICAgbW9kZVxuICAgIH1cbiAgfVxufSk7XG5cbi8qKlxuICogQWRkcyBhIG5ldyBub3RpZmljYXRpb24uXG4gKiBVcGRhdGVzIGEgbm90aWZpY2F0aW9uIGluIGNhc2Ugb2YgbWF0Y2hpbmcgaWRzLlxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIFBhcmFtcyBvZiBhIG5vdGlmaWNhdGlvblxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGROb3RpZmljYXRpb25VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWR9OiBVSVN0YXRlQWN0aW9ucy5BZGROb3RpZmljYXRpb25VcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgY29uc3Qgb2xkTm90aWZpY2F0aW9ucyA9IHN0YXRlLm5vdGlmaWNhdGlvbnMgfHwgW107XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgY29uc3QgcGF5bG9hZElkID0gcGF5bG9hZD8uaWQ7XG4gIGNvbnN0IG5vdGlmaWNhdGlvblRvVXBkYXRlID0gcGF5bG9hZElkID8gb2xkTm90aWZpY2F0aW9ucy5maW5kKG4gPT4gbi5pZCA9PT0gcGF5bG9hZElkKSA6IG51bGw7XG5cbiAgbGV0IG5vdGlmaWNhdGlvbnM7XG4gIGlmIChub3RpZmljYXRpb25Ub1VwZGF0ZSkge1xuICAgIG5vdGlmaWNhdGlvbnMgPSBvbGROb3RpZmljYXRpb25zLm1hcChuID0+XG4gICAgICBuLmlkID09PSBwYXlsb2FkSWQgPyBjcmVhdGVOb3RpZmljYXRpb24oey4uLnBheWxvYWQsIGNvdW50OiBuLmNvdW50ICsgMX0pIDogblxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgbm90aWZpY2F0aW9ucyA9IFsuLi5vbGROb3RpZmljYXRpb25zLCBjcmVhdGVOb3RpZmljYXRpb24ocGF5bG9hZCldO1xuICB9XG5cbiAgcmV0dXJuIHsuLi5zdGF0ZSwgbm90aWZpY2F0aW9uc307XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhIG5vdGlmaWNhdGlvblxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGlkIG9mIHRoZSBub3RpZmljYXRpb24gdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVOb3RpZmljYXRpb25VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGlkfTogVUlTdGF0ZUFjdGlvbnMuUmVtb3ZlTm90aWZpY2F0aW9uVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbm90aWZpY2F0aW9uczogc3RhdGUubm90aWZpY2F0aW9ucy5maWx0ZXIobiA9PiBuLmlkICE9PSBpZClcbn0pO1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gZmlsZSBsb2FkaW5nIGJlZ2luXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc1VwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsb2FkRmlsZXM6IHtcbiAgICAuLi5zdGF0ZS5sb2FkRmlsZXMsXG4gICAgZmlsZUxvYWRpbmc6IHRydWVcbiAgfVxufSk7XG5cbi8qKlxuICogSGFuZGxlcyBsb2FkaW5nIGZpbGUgc3VjY2VzcyBhbmQgc2V0IGZpbGVMb2FkaW5nIHByb3BlcnR5IHRvIGZhbHNlXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbG9hZEZpbGVzOiB7XG4gICAgLi4uc3RhdGUubG9hZEZpbGVzLFxuICAgIGZpbGVMb2FkaW5nOiBmYWxzZVxuICB9XG59KTtcblxuLyoqXG4gKiBIYW5kbGVzIGxvYWQgZmlsZSBlcnJvciBhbmQgc2V0IGZpbGVMb2FkaW5nIHByb3BlcnR5IHRvIGZhbHNlXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24uZXJyb3JcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzRXJyVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSwge2Vycm9yfTogTG9hZEZpbGVzRXJyVXBkYXRlckFjdGlvbik6IFVpU3RhdGUgPT5cbiAgYWRkTm90aWZpY2F0aW9uVXBkYXRlcihcbiAgICB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxvYWRGaWxlczoge1xuICAgICAgICAuLi5zdGF0ZS5sb2FkRmlsZXMsXG4gICAgICAgIGZpbGVMb2FkaW5nOiBmYWxzZVxuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgcGF5bG9hZDogZXJyb3JOb3RpZmljYXRpb24oe1xuICAgICAgICBtZXNzYWdlOiAoZXJyb3IgfHwge30pLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byB1cGxvYWQgZmlsZXMnLFxuICAgICAgICB0b3BpYzogREVGQVVMVF9OT1RJRklDQVRJT05fVE9QSUNTLmdsb2JhbFxuICAgICAgfSlcbiAgICB9XG4gICk7XG5cbi8qKlxuICogSGFuZGxlcyB0b2dnbGUgbWFwIHNwbGl0IGFuZCByZXNldCBhbGwgbWFwIGNvbnRyb2wgaW5kZXggdG8gMFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNwbGl0TWFwVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIG1hcENvbnRyb2xzOiBPYmplY3QuZW50cmllcyhzdGF0ZS5tYXBDb250cm9scykucmVkdWNlKFxuICAgIChhY2MsIGVudHJ5KSA9PiAoe1xuICAgICAgLi4uYWNjLFxuICAgICAgW2VudHJ5WzBdXToge1xuICAgICAgICAuLi5lbnRyeVsxXSxcbiAgICAgICAgYWN0aXZlTWFwSW5kZXg6IDBcbiAgICAgIH1cbiAgICB9KSxcbiAgICB7fSBhcyBNYXBDb250cm9sc1xuICApXG59KTtcblxuLyoqXG4gKiBUb2dnbGUgbW9kYWwgZGF0YVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNob3dEYXRhc2V0VGFibGVVcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlKTogVWlTdGF0ZSA9PlxuICB0b2dnbGVNb2RhbFVwZGF0ZXIoc3RhdGUsIHtwYXlsb2FkOiBEQVRBX1RBQkxFX0lEfSk7XG5cbi8qKlxuICogU2V0IHRoZSBsb2NhbGUgb2YgdGhlIFVJXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWRcbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZC5sb2NhbGUgbG9jYWxlXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldExvY2FsZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge2xvY2FsZX19OiBVSVN0YXRlQWN0aW9ucy5TZXRMb2NhbGVVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsb2NhbGVcbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBsYXllciBwYW5lbCBsaXN0IHZpZXdcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBsYXllciBwYW5lbCBsaXN0VmlldyB2YWx1ZS4gQ2FuIGJlICdsaXN0JyBvciAnc29ydEJ5RGF0YXNldCdcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlUGFuZWxMaXN0Vmlld1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge3BhbmVsSWQsIGxpc3RWaWV3fX06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZVBhbmVsTGlzdFZpZXdBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICBjb25zdCBzdGF0ZVByb3AgPVxuICAgIHBhbmVsSWQgPT09ICdsYXllcidcbiAgICAgID8gJ2xheWVyUGFuZWxMaXN0VmlldydcbiAgICAgIDogcGFuZWxJZCA9PT0gJ2ZpbHRlcidcbiAgICAgID8gJ2ZpbHRlclBhbmVsTGlzdFZpZXcnXG4gICAgICA6IG51bGw7XG4gIGlmICghc3RhdGVQcm9wIHx8IHN0YXRlW3N0YXRlUHJvcF0gPT09IGxpc3RWaWV3KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgW3N0YXRlUHJvcF06IGxpc3RWaWV3XG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFZQSxJQUFBQyxhQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFGLE9BQUE7QUFNQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQThELFNBQUFJLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFBYSxPQUFBLFdBQUFkLENBQUEsUUFBQWUsZ0JBQUEsYUFBQWhCLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQUUsTUFBQSxDQUFBYyx5QkFBQSxHQUFBZCxNQUFBLENBQUFlLGdCQUFBLENBQUFsQixDQUFBLEVBQUFHLE1BQUEsQ0FB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