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

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