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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/cjs/combined-updaters.js +491 -0
  2. package/dist/cjs/composer-helpers.js +101 -0
  3. package/dist/cjs/composers.js +22 -0
  4. package/dist/cjs/core.js +105 -0
  5. package/dist/cjs/data-utils.js +53 -0
  6. package/dist/cjs/export-utils.js +91 -0
  7. package/dist/{index.js → cjs/index.js} +1 -1
  8. package/dist/cjs/interaction-utils.js +105 -0
  9. package/dist/cjs/layer-utils.js +635 -0
  10. package/dist/cjs/map-state-updaters.js +658 -0
  11. package/dist/cjs/map-state.js +35 -0
  12. package/dist/cjs/map-style-updaters.js +660 -0
  13. package/dist/cjs/map-style.js +33 -0
  14. package/dist/cjs/merger-handler.js +105 -0
  15. package/dist/cjs/middleware.js +27 -0
  16. package/dist/cjs/provider-state-updaters.js +465 -0
  17. package/dist/cjs/provider-state.js +34 -0
  18. package/dist/cjs/root.js +207 -0
  19. package/dist/cjs/ui-state-updaters.js +934 -0
  20. package/dist/cjs/ui-state.js +36 -0
  21. package/dist/cjs/vis-state-merger.js +1193 -0
  22. package/dist/cjs/vis-state-selectors.js +30 -0
  23. package/dist/{vis-state-updaters.js → cjs/vis-state-updaters.js} +338 -47
  24. package/dist/cjs/vis-state.js +35 -0
  25. package/dist/combined-updaters.d.ts +1 -1
  26. package/dist/esm/combined-updaters.js +484 -0
  27. package/dist/esm/composer-helpers.js +85 -0
  28. package/dist/esm/composers.js +14 -0
  29. package/dist/esm/core.js +101 -0
  30. package/dist/esm/data-utils.js +47 -0
  31. package/dist/esm/export-utils.js +86 -0
  32. package/dist/esm/index.js +62 -0
  33. package/dist/esm/interaction-utils.js +96 -0
  34. package/dist/esm/layer-utils.js +602 -0
  35. package/dist/esm/map-state-updaters.js +650 -0
  36. package/dist/esm/map-state.js +29 -0
  37. package/dist/esm/map-style-updaters.js +652 -0
  38. package/dist/esm/map-style.js +27 -0
  39. package/dist/esm/merger-handler.js +96 -0
  40. package/dist/esm/middleware.js +19 -0
  41. package/dist/esm/provider-state-updaters.js +458 -0
  42. package/dist/esm/provider-state.js +28 -0
  43. package/dist/esm/root.js +201 -0
  44. package/dist/esm/ui-state-updaters.js +929 -0
  45. package/dist/esm/ui-state.js +30 -0
  46. package/dist/esm/vis-state-merger.js +1161 -0
  47. package/dist/esm/vis-state-selectors.js +24 -0
  48. package/dist/esm/vis-state-updaters.js +4320 -0
  49. package/dist/esm/vis-state.js +29 -0
  50. package/dist/ui-state-updaters.d.ts +15 -1
  51. package/dist/vis-state-updaters.d.ts +27 -0
  52. package/package.json +31 -22
  53. package/dist/combined-updaters.js +0 -491
  54. package/dist/composer-helpers.js +0 -101
  55. package/dist/composers.js +0 -22
  56. package/dist/core.js +0 -105
  57. package/dist/data-utils.js +0 -53
  58. package/dist/export-utils.js +0 -91
  59. package/dist/interaction-utils.js +0 -105
  60. package/dist/layer-utils.js +0 -635
  61. package/dist/map-state-updaters.js +0 -649
  62. package/dist/map-state.js +0 -35
  63. package/dist/map-style-updaters.js +0 -660
  64. package/dist/map-style.js +0 -33
  65. package/dist/merger-handler.js +0 -105
  66. package/dist/middleware.js +0 -27
  67. package/dist/provider-state-updaters.js +0 -465
  68. package/dist/provider-state.js +0 -34
  69. package/dist/root.js +0 -207
  70. package/dist/ui-state-updaters.js +0 -905
  71. package/dist/ui-state.js +0 -36
  72. package/dist/vis-state-merger.js +0 -1193
  73. package/dist/vis-state-selectors.js +0 -30
  74. package/dist/vis-state.js +0 -35
@@ -0,0 +1,484 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ 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; }
3
+ 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) { _defineProperty(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; }
4
+ // SPDX-License-Identifier: MIT
5
+ // Copyright contributors to the kepler.gl project
6
+
7
+ import { toggleModalUpdater, loadFilesSuccessUpdater as uiStateLoadFilesSuccessUpdater, toggleMapControlUpdater, toggleSplitMapUpdater as uiStateToggleSplitMapUpdater, receiveMapConfigUpdater as uiStateReceiveMapConfigUpdater } from './ui-state-updaters';
8
+ import { updateVisDataUpdater as visStateUpdateVisDataUpdater, setMapInfoUpdater, layerTypeChangeUpdater, toggleSplitMapUpdater as visStateToggleSplitMapUpdater, prepareStateForDatasetReplace } from './vis-state-updaters';
9
+ import { receiveMapConfigUpdater as stateMapConfigUpdater, toggleSplitMapUpdater as mapStateToggleSplitMapUpdater, setMapSplitModeUpdater as mapStateSetMapSplitModeUpdater, setMapViewModeUpdater } from './map-state-updaters';
10
+ import { mapStyleChangeUpdater, receiveMapConfigUpdater as styleMapConfigUpdater } from './map-style-updaters';
11
+ import { filesToDataPayload } from '@kepler.gl/processors';
12
+ import { payload_, apply_, with_, if_, compose_, merge_, pick_ } from './composer-helpers';
13
+ import { isPlainObject, computeSplitMapLayers } from '@kepler.gl/utils';
14
+ import { findMapBounds } from './data-utils';
15
+ import { BASE_MAP_COLOR_MODES, OVERLAY_BLENDINGS, NO_MAP_ID, MapSplitMode } from '@kepler.gl/constants';
16
+ import { getBasemapColorsForStyle, DEFAULT_BASEMAP_COLOR } from '@kepler.gl/deckgl-layers';
17
+ // compose action to apply result multiple reducers, with the output of one
18
+
19
+ /**
20
+ * Some actions will affect the entire kepler.lg instance state.
21
+ * The updaters for these actions is exported as `combinedUpdaters`. These updater take the entire instance state
22
+ * as the first argument. Read more about [Using updaters](../advanced-usage/using-updaters.md)
23
+ * @public
24
+ * @example
25
+ *
26
+ * import keplerGlReducer, {combinedUpdaters} from '@kepler.gl/reducers';
27
+ * // Root Reducer
28
+ * const reducers = combineReducers({
29
+ * keplerGl: keplerGlReducer,
30
+ * app: appReducer
31
+ * });
32
+ *
33
+ * const composedReducer = (state, action) => {
34
+ * switch (action.type) {
35
+ * // add data to map after receiving data from remote sources
36
+ * case 'LOAD_REMOTE_RESOURCE_SUCCESS':
37
+ * return {
38
+ * ...state,
39
+ * keplerGl: {
40
+ * ...state.keplerGl,
41
+ * // pass in kepler.gl instance state to combinedUpdaters
42
+ * map: combinedUpdaters.addDataToMapUpdater(
43
+ * state.keplerGl.map,
44
+ * {
45
+ * payload: {
46
+ * datasets: action.datasets,
47
+ * options: {readOnly: true},
48
+ * config: action.config
49
+ * }
50
+ * }
51
+ * )
52
+ * }
53
+ * };
54
+ * }
55
+ * return reducers(state, action);
56
+ * };
57
+ *
58
+ * export default composedReducer;
59
+ */
60
+
61
+ /* eslint-disable @typescript-eslint/no-unused-vars */
62
+ // @ts-ignore
63
+ var combinedUpdaters = null;
64
+ /* eslint-enable @typescript-eslint/no-unused-vars */
65
+
66
+ export var isValidConfig = function isValidConfig(config) {
67
+ return isPlainObject(config) && isPlainObject(config.config) && config.version;
68
+ };
69
+ export var defaultAddDataToMapOptions = {
70
+ centerMap: true,
71
+ keepExistingConfig: false,
72
+ autoCreateLayers: true,
73
+ autoCreateTooltips: true
74
+ };
75
+
76
+ /**
77
+ * Combine data and full configuration update in a single action
78
+ *
79
+ * @memberof combinedUpdaters
80
+ * @param {Object} state kepler.gl instance state, containing all subreducer state
81
+ * @param {Object} action
82
+ * @param {Object} action.payload `{datasets, options, config}`
83
+ * @param action.payload.datasets - ***required** datasets can be a dataset or an array of datasets
84
+ * Each dataset object needs to have `info` and `data` property.
85
+ * @param [action.payload.options] option object `{centerMap: true, padding: {left: 300}}`
86
+ * @param [action.payload.config] map config
87
+ * @param [action.payload.info] map info contains title and description
88
+ * @returns nextState
89
+ *
90
+ * @typedef {Object} Dataset
91
+ * @property info -info of a dataset
92
+ * @property info.id - id of this dataset. If config is defined, `id` should matches the `dataId` in config.
93
+ * @property info.label - A display name of this dataset
94
+ * @property data - ***required** The data object, in a tabular format with 2 properties `fields` and `rows`
95
+ * @property data.fields - ***required** Array of fields,
96
+ * @property data.fields.name - ***required** Name of the field,
97
+ * @property data.rows - ***required** Array of rows, in a tabular format with `fields` and `rows`
98
+ *
99
+ * @public
100
+ */
101
+ export var addDataToMapUpdater = function addDataToMapUpdater(state, _ref) {
102
+ var _datasets$, _datasets$2, _datasets$3;
103
+ var payload = _ref.payload;
104
+ var datasets = payload.datasets,
105
+ config = payload.config,
106
+ info = payload.info;
107
+ var options = _objectSpread(_objectSpread({}, defaultAddDataToMapOptions), payload.options);
108
+
109
+ // check if progressive loading dataset by batches, and update visState directly
110
+ var isProgressiveLoading = Array.isArray(datasets) && ((_datasets$ = datasets[0]) === null || _datasets$ === void 0 ? void 0 : _datasets$.info.format) === 'arrow' && ((_datasets$2 = datasets[0]) === null || _datasets$2 === void 0 ? void 0 : _datasets$2.info.id) && ((_datasets$3 = datasets[0]) === null || _datasets$3 === void 0 ? void 0 : _datasets$3.info.id) in state.visState.datasets;
111
+ if (isProgressiveLoading) {
112
+ return compose_([pick_('visState')(apply_(visStateUpdateVisDataUpdater, {
113
+ datasets: datasets,
114
+ options: options,
115
+ config: config
116
+ }))])(state);
117
+ }
118
+
119
+ // @ts-expect-error
120
+ var parsedConfig = config;
121
+ if (isValidConfig(config)) {
122
+ // if passed in saved config
123
+ // @ts-expect-error
124
+ parsedConfig = state.visState.schema.parseSavedConfig(config);
125
+ }
126
+ var oldLayers = state.visState.layers;
127
+ var filterNewlyAddedLayers = function filterNewlyAddedLayers(layers) {
128
+ return layers.filter(function (nl) {
129
+ return !oldLayers.find(function (ol) {
130
+ return ol === nl;
131
+ });
132
+ });
133
+ };
134
+
135
+ // Returns undefined if not found, to make typescript happy
136
+ var findMapBoundsIfCentered = function findMapBoundsIfCentered(layers) {
137
+ var bounds = options.centerMap && findMapBounds(layers);
138
+ return bounds ? bounds : undefined;
139
+ };
140
+ return compose_([pick_('visState')(
141
+ // this part can be async
142
+ apply_(visStateUpdateVisDataUpdater, {
143
+ datasets: datasets,
144
+ options: options,
145
+ config: parsedConfig
146
+ })), if_(Boolean(info), pick_('visState')(apply_(setMapInfoUpdater, {
147
+ info: info
148
+ }))),
149
+ // Note that fit bounds here won't be called in case datasets are created in Tasks.
150
+ // A separate Task to update bounds is created once the datasets are ready.
151
+ with_(function (_ref2) {
152
+ var visState = _ref2.visState;
153
+ return pick_('mapState')(apply_(stateMapConfigUpdater, payload_({
154
+ config: parsedConfig,
155
+ options: options,
156
+ bounds: findMapBoundsIfCentered(filterNewlyAddedLayers(visState.layers))
157
+ })));
158
+ }), pick_('mapStyle')(apply_(styleMapConfigUpdater, payload_({
159
+ config: parsedConfig,
160
+ options: options
161
+ }))), pick_('uiState')(apply_(uiStateReceiveMapConfigUpdater, payload_({
162
+ config: parsedConfig,
163
+ options: options
164
+ }))), pick_('uiState')(apply_(uiStateLoadFilesSuccessUpdater, payload_(null))), pick_('uiState')(apply_(toggleModalUpdater, payload_(null))), pick_('uiState')(merge_(Object.prototype.hasOwnProperty.call(options, 'readOnly') ? {
165
+ readOnly: options.readOnly
166
+ } : {}))])(state);
167
+ };
168
+ export var loadFilesSuccessUpdater = function loadFilesSuccessUpdater(state, action) {
169
+ // still more to load
170
+ var payloads = filesToDataPayload(action.result);
171
+ var nextState = compose_([pick_('visState')(merge_({
172
+ fileLoading: false,
173
+ fileLoadingProgress: {}
174
+ }))])(state);
175
+ // make multiple add data to map calls
176
+ var stateWithData = compose_(payloads.map(function (p) {
177
+ return apply_(addDataToMapUpdater, payload_(p));
178
+ }))(nextState);
179
+ return stateWithData;
180
+ };
181
+ export var addDataToMapComposed = addDataToMapUpdater;
182
+
183
+ /**
184
+ * Helper which updates map overlay blending mode in visState,
185
+ * but only if it's not currently in the `normal` mode.
186
+ */
187
+ var updateOverlayBlending = function updateOverlayBlending(overlayBlending) {
188
+ return function (visState) {
189
+ if (visState.overlayBlending !== OVERLAY_BLENDINGS.normal.value) {
190
+ return _objectSpread(_objectSpread({}, visState), {}, {
191
+ overlayBlending: overlayBlending
192
+ });
193
+ }
194
+ return visState;
195
+ };
196
+ };
197
+
198
+ /**
199
+ * Helper which updates `darkBaseMapEnabled` in all the layers in visState which
200
+ * have this config setting (or in one specific layer if the `layerId` param is provided).
201
+ */
202
+ var updateDarkBaseMapLayers = function updateDarkBaseMapLayers(darkBaseMapEnabled) {
203
+ var layerId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
204
+ return function (visState) {
205
+ return _objectSpread(_objectSpread({}, visState), {}, {
206
+ layers: visState.layers.map(function (layer) {
207
+ if (!layerId || layer.id === layerId) {
208
+ if (Object.prototype.hasOwnProperty.call(layer.visConfigSettings, 'darkBaseMapEnabled')) {
209
+ var visConfig = layer.config.visConfig;
210
+ return layer.updateLayerConfig({
211
+ visConfig: _objectSpread(_objectSpread({}, visConfig), {}, {
212
+ darkBaseMapEnabled: darkBaseMapEnabled
213
+ })
214
+ });
215
+ }
216
+ }
217
+ return layer;
218
+ })
219
+ });
220
+ };
221
+ };
222
+
223
+ /**
224
+ * Updater that changes the map style by calling mapStyleChangeUpdater on visState.
225
+ * In addition to that, it does the following:
226
+ *
227
+ * 1. Update map overlay blending mode in accordance with the colorMode of the
228
+ * base map, but only if it's not in the `normal` mode.
229
+ *
230
+ * 2. Update all the layers which have the `darkBaseMapEnabled` config setting
231
+ * adjusting it in accordance with the colorMode of the base map.
232
+ *
233
+ */
234
+ export var combinedMapStyleChangeUpdater = function combinedMapStyleChangeUpdater(state, action) {
235
+ var _mapState$globe;
236
+ var payload = action.payload;
237
+ var mapStyle = state.mapStyle;
238
+ var getColorMode = function getColorMode(key) {
239
+ var _mapStyle$mapStyles$k;
240
+ return (_mapStyle$mapStyles$k = mapStyle.mapStyles[key]) === null || _mapStyle$mapStyles$k === void 0 ? void 0 : _mapStyle$mapStyles$k.colorMode;
241
+ };
242
+ var prevColorMode = getColorMode(mapStyle.styleType);
243
+ var nextColorMode = getColorMode(payload.styleType);
244
+ var visState = state.visState,
245
+ mapState = state.mapState;
246
+ if (nextColorMode !== prevColorMode) {
247
+ switch (nextColorMode) {
248
+ case BASE_MAP_COLOR_MODES.DARK:
249
+ visState = compose_([updateOverlayBlending(OVERLAY_BLENDINGS.screen.value), updateDarkBaseMapLayers(true)])(visState);
250
+ break;
251
+ case BASE_MAP_COLOR_MODES.LIGHT:
252
+ visState = compose_([updateOverlayBlending(OVERLAY_BLENDINGS.darken.value), updateDarkBaseMapLayers(false)])(visState);
253
+ break;
254
+ default:
255
+ // do nothing
256
+ }
257
+ }
258
+
259
+ // Update globe config colors when style changes and globe is enabled
260
+ if ((_mapState$globe = mapState.globe) !== null && _mapState$globe !== void 0 && _mapState$globe.enabled) {
261
+ // Switching from "No Basemap" to a basemap - restore basemap sub-toggles
262
+ if (payload.styleType !== NO_MAP_ID && mapStyle.styleType === NO_MAP_ID) {
263
+ mapState = _objectSpread(_objectSpread({}, mapState), {}, {
264
+ globe: _objectSpread(_objectSpread({}, mapState.globe), {}, {
265
+ config: _objectSpread(_objectSpread({}, mapState.globe.config), {}, {
266
+ basemap: true,
267
+ labels: true,
268
+ adminLines: true,
269
+ water: true
270
+ })
271
+ })
272
+ });
273
+ }
274
+ mapState = syncGlobeConfigColorsToStyle(mapState, mapStyle, payload.styleType);
275
+ }
276
+ return _objectSpread(_objectSpread({}, state), {}, {
277
+ visState: visState,
278
+ mapState: mapState,
279
+ mapStyle: mapStyleChangeUpdater(mapStyle, {
280
+ payload: _objectSpread({}, payload)
281
+ })
282
+ });
283
+ };
284
+
285
+ /**
286
+ * Derive globe basemap colors (surface / water / admin lines) from a map style and
287
+ * return an updated mapState with those colors written into `globe.config`. Used both
288
+ * when the base map style changes and when entering globe mode, so the globe always
289
+ * reflects the currently selected basemap instead of the static DEFAULT_GLOBE_CONFIG.
290
+ */
291
+ export function syncGlobeConfigColorsToStyle(mapState, mapStyle, styleType) {
292
+ var _mapState$globe2;
293
+ if (!((_mapState$globe2 = mapState.globe) !== null && _mapState$globe2 !== void 0 && _mapState$globe2.enabled)) {
294
+ return mapState;
295
+ }
296
+ var nextStyleObj = mapStyle.mapStyles[styleType];
297
+ var nextGlobeConfig = _objectSpread({}, mapState.globe.config);
298
+ if (styleType === NO_MAP_ID) {
299
+ nextGlobeConfig.basemap = false;
300
+ nextGlobeConfig.labels = false;
301
+ nextGlobeConfig.adminLines = false;
302
+ nextGlobeConfig.water = false;
303
+ nextGlobeConfig.surfaceColor = DEFAULT_BASEMAP_COLOR.backgroundFillColor;
304
+ nextGlobeConfig.waterColor = DEFAULT_BASEMAP_COLOR.basemapWaterFillColor;
305
+ nextGlobeConfig.adminLinesColor = DEFAULT_BASEMAP_COLOR.basemapAdminLineColor;
306
+ } else {
307
+ var basemapColors = nextStyleObj ? getBasemapColorsForStyle(styleType, {
308
+ style: nextStyleObj.style,
309
+ layerGroups: nextStyleObj.layerGroups
310
+ }) :
311
+ // Style object not yet loaded - use known presets by style type
312
+ getBasemapColorsForStyle(styleType);
313
+ nextGlobeConfig.surfaceColor = basemapColors.backgroundFillColor;
314
+ nextGlobeConfig.waterColor = basemapColors.basemapWaterFillColor;
315
+ nextGlobeConfig.adminLinesColor = basemapColors.basemapAdminLineColor;
316
+ }
317
+ return _objectSpread(_objectSpread({}, mapState), {}, {
318
+ globe: _objectSpread(_objectSpread({}, mapState.globe), {}, {
319
+ config: nextGlobeConfig
320
+ })
321
+ });
322
+ }
323
+
324
+ /**
325
+ * Updater that switches the map view mode (2D / 3D / Globe). Runs the base map-state
326
+ * updater and, when entering globe mode, syncs the globe basemap colors to the
327
+ * currently selected map style so the globe doesn't show stale default colors.
328
+ */
329
+ export var combinedSetMapViewModeUpdater = function combinedSetMapViewModeUpdater(state, action) {
330
+ var _mapState$globe3;
331
+ var mapState = setMapViewModeUpdater(state.mapState, action);
332
+ if ((_mapState$globe3 = mapState.globe) !== null && _mapState$globe3 !== void 0 && _mapState$globe3.enabled) {
333
+ mapState = syncGlobeConfigColorsToStyle(mapState, state.mapStyle, state.mapStyle.styleType);
334
+ }
335
+ return _objectSpread(_objectSpread({}, state), {}, {
336
+ mapState: mapState
337
+ });
338
+ };
339
+
340
+ /**
341
+ * Updater that changes the layer type by calling `layerTypeChangeUpdater` on visState.
342
+ * In addition to that, if the new layer type has the `darkBaseMapEnabled` config
343
+ * setting, we adjust it in accordance with the colorMode of the base map.s
344
+ */
345
+ export var combinedLayerTypeChangeUpdater = function combinedLayerTypeChangeUpdater(state, action) {
346
+ var visState = state.visState;
347
+ var oldLayerIndex = visState.layers.findIndex(function (layer) {
348
+ return layer === action.oldLayer;
349
+ });
350
+ visState = layerTypeChangeUpdater(visState, action);
351
+ var newLayer = visState.layers[oldLayerIndex];
352
+ if (Object.prototype.hasOwnProperty.call(newLayer === null || newLayer === void 0 ? void 0 : newLayer.visConfigSettings, 'darkBaseMapEnabled')) {
353
+ var mapStyle = state.mapStyle;
354
+ var colorMode = mapStyle.mapStyles[mapStyle.styleType].colorMode;
355
+ var darkBaseMapEnabled = newLayer.config.visConfig.darkBaseMapEnabled;
356
+ switch (colorMode) {
357
+ case BASE_MAP_COLOR_MODES.DARK:
358
+ if (!darkBaseMapEnabled) {
359
+ visState = updateDarkBaseMapLayers(true, newLayer.id)(visState);
360
+ }
361
+ break;
362
+ case BASE_MAP_COLOR_MODES.LIGHT:
363
+ if (darkBaseMapEnabled) {
364
+ visState = updateDarkBaseMapLayers(false, newLayer.id)(visState);
365
+ }
366
+ break;
367
+ default:
368
+ // do nothing
369
+ }
370
+ }
371
+ return _objectSpread(_objectSpread({}, state), {}, {
372
+ visState: visState
373
+ });
374
+ };
375
+
376
+ /**
377
+ * Make mapLegend active when toggleSplitMap action is called
378
+ */
379
+ export var toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
380
+ var _newState$uiState$map;
381
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
382
+ visState: visStateToggleSplitMapUpdater(state.visState, action),
383
+ uiState: uiStateToggleSplitMapUpdater(state.uiState),
384
+ mapState: mapStateToggleSplitMapUpdater(state.mapState)
385
+ });
386
+ var isSplit = newState.visState.splitMaps.length !== 0;
387
+ var isLegendActive = (_newState$uiState$map = newState.uiState.mapControls) === null || _newState$uiState$map === void 0 || (_newState$uiState$map = _newState$uiState$map.mapLegend) === null || _newState$uiState$map === void 0 ? void 0 : _newState$uiState$map.active;
388
+ if (isSplit && !isLegendActive) {
389
+ newState.uiState = toggleMapControlUpdater(newState.uiState, {
390
+ payload: {
391
+ panelId: 'mapLegend',
392
+ index: action.payload
393
+ }
394
+ });
395
+ }
396
+ return newState;
397
+ };
398
+
399
+ /**
400
+ * Set map split mode updater - coordinates state changes across visState, mapState, and uiState
401
+ */
402
+ export var setMapSplitModeUpdater = function setMapSplitModeUpdater(state, action) {
403
+ var _newUiState$mapContro;
404
+ var mapSplitMode = action.payload.mapSplitMode;
405
+ var prevMode = state.mapState.mapSplitMode;
406
+ if (mapSplitMode === prevMode) {
407
+ return state;
408
+ }
409
+ var newMapState = mapStateSetMapSplitModeUpdater(state.mapState, action);
410
+ var newVisState = _objectSpread({}, state.visState);
411
+ switch (mapSplitMode) {
412
+ case MapSplitMode.SINGLE_MAP:
413
+ newVisState = _objectSpread(_objectSpread({}, newVisState), {}, {
414
+ splitMaps: []
415
+ });
416
+ break;
417
+ case MapSplitMode.DUAL_MAP:
418
+ case MapSplitMode.SWIPE_COMPARE:
419
+ if (prevMode === MapSplitMode.SINGLE_MAP) {
420
+ newVisState = _objectSpread(_objectSpread({}, newVisState), {}, {
421
+ splitMaps: computeSplitMapLayers(newVisState.layers, {
422
+ duplicate: mapSplitMode === MapSplitMode.SWIPE_COMPARE
423
+ })
424
+ });
425
+ }
426
+ break;
427
+ default:
428
+ break;
429
+ }
430
+ var newUiState = uiStateToggleSplitMapUpdater(state.uiState);
431
+ var isSplit = newVisState.splitMaps.length !== 0;
432
+ var isLegendActive = (_newUiState$mapContro = newUiState.mapControls) === null || _newUiState$mapContro === void 0 || (_newUiState$mapContro = _newUiState$mapContro.mapLegend) === null || _newUiState$mapContro === void 0 ? void 0 : _newUiState$mapContro.active;
433
+ if (isSplit && !isLegendActive) {
434
+ newUiState = toggleMapControlUpdater(newUiState, {
435
+ payload: {
436
+ panelId: 'mapLegend',
437
+ index: 0
438
+ }
439
+ });
440
+ }
441
+ return _objectSpread(_objectSpread({}, state), {}, {
442
+ mapState: newMapState,
443
+ visState: newVisState,
444
+ uiState: newUiState
445
+ });
446
+ };
447
+ var defaultReplaceDataToMapOptions = {
448
+ keepExistingConfig: true,
449
+ centerMap: true,
450
+ autoCreateLayers: false
451
+ };
452
+
453
+ /**
454
+ * Updater replace a dataset in state
455
+ */
456
+ export var replaceDataInMapUpdater = function replaceDataInMapUpdater(state, _ref3) {
457
+ var payload = _ref3.payload;
458
+ var datasetToReplaceId = payload.datasetToReplaceId,
459
+ datasetToUse = payload.datasetToUse,
460
+ _payload$options = payload.options,
461
+ options = _payload$options === void 0 ? {} : _payload$options;
462
+ var addDataToMapOptions = _objectSpread(_objectSpread({}, defaultReplaceDataToMapOptions), options);
463
+
464
+ // check if dataset is there
465
+ if (!state.visState.datasets[datasetToReplaceId]) {
466
+ return state;
467
+ }
468
+ // datasetToUse is ProtoDataset
469
+ var dataIdToUse = datasetToUse.info.id;
470
+ if (!dataIdToUse) {
471
+ return state;
472
+ }
473
+ // remove dataset and put dependencies in toBeMerged
474
+ var preparedState = _objectSpread(_objectSpread({}, state), {}, {
475
+ visState: prepareStateForDatasetReplace(state.visState, datasetToReplaceId, dataIdToUse)
476
+ });
477
+ var nextState = addDataToMapUpdater(preparedState, payload_({
478
+ datasets: datasetToUse,
479
+ // should zoom to new dataset
480
+ options: addDataToMapOptions
481
+ }));
482
+ return nextState;
483
+ };
484
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0b2dnbGVNb2RhbFVwZGF0ZXIiLCJsb2FkRmlsZXNTdWNjZXNzVXBkYXRlciIsInVpU3RhdGVMb2FkRmlsZXNTdWNjZXNzVXBkYXRlciIsInRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyIiwidG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwidWlTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsInJlY2VpdmVNYXBDb25maWdVcGRhdGVyIiwidWlTdGF0ZVJlY2VpdmVNYXBDb25maWdVcGRhdGVyIiwidXBkYXRlVmlzRGF0YVVwZGF0ZXIiLCJ2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyIiwic2V0TWFwSW5mb1VwZGF0ZXIiLCJsYXllclR5cGVDaGFuZ2VVcGRhdGVyIiwidmlzU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIiLCJwcmVwYXJlU3RhdGVGb3JEYXRhc2V0UmVwbGFjZSIsInN0YXRlTWFwQ29uZmlnVXBkYXRlciIsIm1hcFN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwic2V0TWFwU3BsaXRNb2RlVXBkYXRlciIsIm1hcFN0YXRlU2V0TWFwU3BsaXRNb2RlVXBkYXRlciIsInNldE1hcFZpZXdNb2RlVXBkYXRlciIsIm1hcFN0eWxlQ2hhbmdlVXBkYXRlciIsInN0eWxlTWFwQ29uZmlnVXBkYXRlciIsImZpbGVzVG9EYXRhUGF5bG9hZCIsInBheWxvYWRfIiwiYXBwbHlfIiwid2l0aF8iLCJpZl8iLCJjb21wb3NlXyIsIm1lcmdlXyIsInBpY2tfIiwiaXNQbGFpbk9iamVjdCIsImNvbXB1dGVTcGxpdE1hcExheWVycyIsImZpbmRNYXBCb3VuZHMiLCJCQVNFX01BUF9DT0xPUl9NT0RFUyIsIk9WRVJMQVlfQkxFTkRJTkdTIiwiTk9fTUFQX0lEIiwiTWFwU3BsaXRNb2RlIiwiZ2V0QmFzZW1hcENvbG9yc0ZvclN0eWxlIiwiREVGQVVMVF9CQVNFTUFQX0NPTE9SIiwiY29tYmluZWRVcGRhdGVycyIsImlzVmFsaWRDb25maWciLCJjb25maWciLCJ2ZXJzaW9uIiwiZGVmYXVsdEFkZERhdGFUb01hcE9wdGlvbnMiLCJjZW50ZXJNYXAiLCJrZWVwRXhpc3RpbmdDb25maWciLCJhdXRvQ3JlYXRlTGF5ZXJzIiwiYXV0b0NyZWF0ZVRvb2x0aXBzIiwiYWRkRGF0YVRvTWFwVXBkYXRlciIsInN0YXRlIiwiX3JlZiIsIl9kYXRhc2V0cyQiLCJfZGF0YXNldHMkMiIsIl9kYXRhc2V0cyQzIiwicGF5bG9hZCIsImRhdGFzZXRzIiwiaW5mbyIsIm9wdGlvbnMiLCJfb2JqZWN0U3ByZWFkIiwiaXNQcm9ncmVzc2l2ZUxvYWRpbmciLCJBcnJheSIsImlzQXJyYXkiLCJmb3JtYXQiLCJpZCIsInZpc1N0YXRlIiwicGFyc2VkQ29uZmlnIiwic2NoZW1hIiwicGFyc2VTYXZlZENvbmZpZyIsIm9sZExheWVycyIsImxheWVycyIsImZpbHRlck5ld2x5QWRkZWRMYXllcnMiLCJmaWx0ZXIiLCJubCIsImZpbmQiLCJvbCIsImZpbmRNYXBCb3VuZHNJZkNlbnRlcmVkIiwiYm91bmRzIiwidW5kZWZpbmVkIiwiQm9vbGVhbiIsIl9yZWYyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicmVhZE9ubHkiLCJhY3Rpb24iLCJwYXlsb2FkcyIsInJlc3VsdCIsIm5leHRTdGF0ZSIsImZpbGVMb2FkaW5nIiwiZmlsZUxvYWRpbmdQcm9ncmVzcyIsInN0YXRlV2l0aERhdGEiLCJtYXAiLCJwIiwiYWRkRGF0YVRvTWFwQ29tcG9zZWQiLCJ1cGRhdGVPdmVybGF5QmxlbmRpbmciLCJvdmVybGF5QmxlbmRpbmciLCJub3JtYWwiLCJ2YWx1ZSIsInVwZGF0ZURhcmtCYXNlTWFwTGF5ZXJzIiwiZGFya0Jhc2VNYXBFbmFibGVkIiwibGF5ZXJJZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImxheWVyIiwidmlzQ29uZmlnU2V0dGluZ3MiLCJ2aXNDb25maWciLCJ1cGRhdGVMYXllckNvbmZpZyIsImNvbWJpbmVkTWFwU3R5bGVDaGFuZ2VVcGRhdGVyIiwiX21hcFN0YXRlJGdsb2JlIiwibWFwU3R5bGUiLCJnZXRDb2xvck1vZGUiLCJrZXkiLCJfbWFwU3R5bGUkbWFwU3R5bGVzJGsiLCJtYXBTdHlsZXMiLCJjb2xvck1vZGUiLCJwcmV2Q29sb3JNb2RlIiwic3R5bGVUeXBlIiwibmV4dENvbG9yTW9kZSIsIm1hcFN0YXRlIiwiREFSSyIsInNjcmVlbiIsIkxJR0hUIiwiZGFya2VuIiwiZ2xvYmUiLCJlbmFibGVkIiwiYmFzZW1hcCIsImxhYmVscyIsImFkbWluTGluZXMiLCJ3YXRlciIsInN5bmNHbG9iZUNvbmZpZ0NvbG9yc1RvU3R5bGUiLCJfbWFwU3RhdGUkZ2xvYmUyIiwibmV4dFN0eWxlT2JqIiwibmV4dEdsb2JlQ29uZmlnIiwic3VyZmFjZUNvbG9yIiwiYmFja2dyb3VuZEZpbGxDb2xvciIsIndhdGVyQ29sb3IiLCJiYXNlbWFwV2F0ZXJGaWxsQ29sb3IiLCJhZG1pbkxpbmVzQ29sb3IiLCJiYXNlbWFwQWRtaW5MaW5lQ29sb3IiLCJiYXNlbWFwQ29sb3JzIiwic3R5bGUiLCJsYXllckdyb3VwcyIsImNvbWJpbmVkU2V0TWFwVmlld01vZGVVcGRhdGVyIiwiX21hcFN0YXRlJGdsb2JlMyIsImNvbWJpbmVkTGF5ZXJUeXBlQ2hhbmdlVXBkYXRlciIsIm9sZExheWVySW5kZXgiLCJmaW5kSW5kZXgiLCJvbGRMYXllciIsIm5ld0xheWVyIiwiX25ld1N0YXRlJHVpU3RhdGUkbWFwIiwibmV3U3RhdGUiLCJ1aVN0YXRlIiwiaXNTcGxpdCIsInNwbGl0TWFwcyIsImlzTGVnZW5kQWN0aXZlIiwibWFwQ29udHJvbHMiLCJtYXBMZWdlbmQiLCJhY3RpdmUiLCJwYW5lbElkIiwiaW5kZXgiLCJfbmV3VWlTdGF0ZSRtYXBDb250cm8iLCJtYXBTcGxpdE1vZGUiLCJwcmV2TW9kZSIsIm5ld01hcFN0YXRlIiwibmV3VmlzU3RhdGUiLCJTSU5HTEVfTUFQIiwiRFVBTF9NQVAiLCJTV0lQRV9DT01QQVJFIiwiZHVwbGljYXRlIiwibmV3VWlTdGF0ZSIsImRlZmF1bHRSZXBsYWNlRGF0YVRvTWFwT3B0aW9ucyIsInJlcGxhY2VEYXRhSW5NYXBVcGRhdGVyIiwiX3JlZjMiLCJkYXRhc2V0VG9SZXBsYWNlSWQiLCJkYXRhc2V0VG9Vc2UiLCJfcGF5bG9hZCRvcHRpb25zIiwiYWRkRGF0YVRvTWFwT3B0aW9ucyIsImRhdGFJZFRvVXNlIiwicHJlcGFyZWRTdGF0ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21iaW5lZC11cGRhdGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge1xuICB0b2dnbGVNb2RhbFVwZGF0ZXIsXG4gIGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyIGFzIHVpU3RhdGVMb2FkRmlsZXNTdWNjZXNzVXBkYXRlcixcbiAgdG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIsXG4gIHRvZ2dsZVNwbGl0TWFwVXBkYXRlciBhcyB1aVN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyLFxuICByZWNlaXZlTWFwQ29uZmlnVXBkYXRlciBhcyB1aVN0YXRlUmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXJcbn0gZnJvbSAnLi91aS1zdGF0ZS11cGRhdGVycyc7XG5pbXBvcnQge1xuICB1cGRhdGVWaXNEYXRhVXBkYXRlciBhcyB2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLFxuICBzZXRNYXBJbmZvVXBkYXRlcixcbiAgbGF5ZXJUeXBlQ2hhbmdlVXBkYXRlcixcbiAgdG9nZ2xlU3BsaXRNYXBVcGRhdGVyIGFzIHZpc1N0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyLFxuICBwcmVwYXJlU3RhdGVGb3JEYXRhc2V0UmVwbGFjZVxufSBmcm9tICcuL3Zpcy1zdGF0ZS11cGRhdGVycyc7XG5pbXBvcnQge1xuICByZWNlaXZlTWFwQ29uZmlnVXBkYXRlciBhcyBzdGF0ZU1hcENvbmZpZ1VwZGF0ZXIsXG4gIHRvZ2dsZVNwbGl0TWFwVXBkYXRlciBhcyBtYXBTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlcixcbiAgc2V0TWFwU3BsaXRNb2RlVXBkYXRlciBhcyBtYXBTdGF0ZVNldE1hcFNwbGl0TW9kZVVwZGF0ZXIsXG4gIHNldE1hcFZpZXdNb2RlVXBkYXRlclxufSBmcm9tICcuL21hcC1zdGF0ZS11cGRhdGVycyc7XG5pbXBvcnQge1xuICBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIsXG4gIHJlY2VpdmVNYXBDb25maWdVcGRhdGVyIGFzIHN0eWxlTWFwQ29uZmlnVXBkYXRlclxufSBmcm9tICcuL21hcC1zdHlsZS11cGRhdGVycyc7XG5pbXBvcnQge2ZpbGVzVG9EYXRhUGF5bG9hZH0gZnJvbSAnQGtlcGxlci5nbC9wcm9jZXNzb3JzJztcbmltcG9ydCB7cGF5bG9hZF8sIGFwcGx5Xywgd2l0aF8sIGlmXywgY29tcG9zZV8sIG1lcmdlXywgcGlja199IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5pbXBvcnQge01hcFN0YXRlLCBVaVN0YXRlLCBBZGREYXRhVG9NYXBQYXlsb2FkLCBQYXJzZWRDb25maWd9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtNYXBTdHlsZX0gZnJvbSAnLi9tYXAtc3R5bGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtQcm92aWRlclN0YXRlfSBmcm9tICcuL3Byb3ZpZGVyLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7XG4gIGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyQWN0aW9uLFxuICBNYXBTdHlsZUNoYW5nZVVwZGF0ZXJBY3Rpb24sXG4gIExheWVyVHlwZUNoYW5nZVVwZGF0ZXJBY3Rpb24sXG4gIFRvZ2dsZVNwbGl0TWFwVXBkYXRlckFjdGlvbixcbiAgUmVwbGFjZURhdGFJbk1hcFBheWxvYWQsXG4gIE1hcFN0YXRlQWN0aW9uc1xufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtWaXNTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcbmltcG9ydCB7TGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7aXNQbGFpbk9iamVjdCwgY29tcHV0ZVNwbGl0TWFwTGF5ZXJzfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7ZmluZE1hcEJvdW5kc30gZnJvbSAnLi9kYXRhLXV0aWxzJztcbmltcG9ydCB7QkFTRV9NQVBfQ09MT1JfTU9ERVMsIE9WRVJMQVlfQkxFTkRJTkdTLCBOT19NQVBfSUQsIE1hcFNwbGl0TW9kZX0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXRCYXNlbWFwQ29sb3JzRm9yU3R5bGUsIERFRkFVTFRfQkFTRU1BUF9DT0xPUn0gZnJvbSAnQGtlcGxlci5nbC9kZWNrZ2wtbGF5ZXJzJztcblxuZXhwb3J0IHR5cGUgS2VwbGVyR2xTdGF0ZSA9IHtcbiAgdmlzU3RhdGU6IFZpc1N0YXRlO1xuICBtYXBTdGF0ZTogTWFwU3RhdGU7XG4gIG1hcFN0eWxlOiBNYXBTdHlsZTtcbiAgdWlTdGF0ZTogVWlTdGF0ZTtcbiAgcHJvdmlkZXJTdGF0ZTogUHJvdmlkZXJTdGF0ZTtcbn07XG5cbi8vIGNvbXBvc2UgYWN0aW9uIHRvIGFwcGx5IHJlc3VsdCBtdWx0aXBsZSByZWR1Y2Vycywgd2l0aCB0aGUgb3V0cHV0IG9mIG9uZVxuXG4vKipcbiAqIFNvbWUgYWN0aW9ucyB3aWxsIGFmZmVjdCB0aGUgZW50aXJlIGtlcGxlci5sZyBpbnN0YW5jZSBzdGF0ZS5cbiAqIFRoZSB1cGRhdGVycyBmb3IgdGhlc2UgYWN0aW9ucyBpcyBleHBvcnRlZCBhcyBgY29tYmluZWRVcGRhdGVyc2AuIFRoZXNlIHVwZGF0ZXIgdGFrZSB0aGUgZW50aXJlIGluc3RhbmNlIHN0YXRlXG4gKiBhcyB0aGUgZmlyc3QgYXJndW1lbnQuIFJlYWQgbW9yZSBhYm91dCBbVXNpbmcgdXBkYXRlcnNdKC4uL2FkdmFuY2VkLXVzYWdlL3VzaW5nLXVwZGF0ZXJzLm1kKVxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7Y29tYmluZWRVcGRhdGVyc30gZnJvbSAnQGtlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiAvLyBSb290IFJlZHVjZXJcbiAqIGNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAqICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICogIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogY29uc3QgY29tcG9zZWRSZWR1Y2VyID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAqICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gKiAgICAvLyBhZGQgZGF0YSB0byBtYXAgYWZ0ZXIgcmVjZWl2aW5nIGRhdGEgZnJvbSByZW1vdGUgc291cmNlc1xuICogICAgY2FzZSAnTE9BRF9SRU1PVEVfUkVTT1VSQ0VfU1VDQ0VTUyc6XG4gKiAgICAgIHJldHVybiB7XG4gKiAgICAgICAgLi4uc3RhdGUsXG4gKiAgICAgICAga2VwbGVyR2w6IHtcbiAqICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLFxuICogICAgICAgICAgLy8gcGFzcyBpbiBrZXBsZXIuZ2wgaW5zdGFuY2Ugc3RhdGUgdG8gY29tYmluZWRVcGRhdGVyc1xuICogICAgICAgICAgbWFwOiAgY29tYmluZWRVcGRhdGVycy5hZGREYXRhVG9NYXBVcGRhdGVyKFxuICogICAgICAgICAgIHN0YXRlLmtlcGxlckdsLm1hcCxcbiAqICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gKiAgICAgICAgICAgICAgIGRhdGFzZXRzOiBhY3Rpb24uZGF0YXNldHMsXG4gKiAgICAgICAgICAgICAgIG9wdGlvbnM6IHtyZWFkT25seTogdHJ1ZX0sXG4gKiAgICAgICAgICAgICAgIGNvbmZpZzogYWN0aW9uLmNvbmZpZ1xuICogICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgfVxuICogICAgICAgICAgKVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCBjb21iaW5lZFVwZGF0ZXJzID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkQ29uZmlnID0gY29uZmlnID0+XG4gIGlzUGxhaW5PYmplY3QoY29uZmlnKSAmJiBpc1BsYWluT2JqZWN0KGNvbmZpZy5jb25maWcpICYmIGNvbmZpZy52ZXJzaW9uO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEFkZERhdGFUb01hcE9wdGlvbnMgPSB7XG4gIGNlbnRlck1hcDogdHJ1ZSxcbiAga2VlcEV4aXN0aW5nQ29uZmlnOiBmYWxzZSxcbiAgYXV0b0NyZWF0ZUxheWVyczogdHJ1ZSxcbiAgYXV0b0NyZWF0ZVRvb2x0aXBzOiB0cnVlXG59O1xuXG4vKipcbiAqIENvbWJpbmUgZGF0YSBhbmQgZnVsbCBjb25maWd1cmF0aW9uIHVwZGF0ZSBpbiBhIHNpbmdsZSBhY3Rpb25cbiAqXG4gKiBAbWVtYmVyb2YgY29tYmluZWRVcGRhdGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGtlcGxlci5nbCBpbnN0YW5jZSBzdGF0ZSwgY29udGFpbmluZyBhbGwgc3VicmVkdWNlciBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbi5wYXlsb2FkIGB7ZGF0YXNldHMsIG9wdGlvbnMsIGNvbmZpZ31gXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQuZGF0YXNldHMgLSAqKipyZXF1aXJlZCoqIGRhdGFzZXRzIGNhbiBiZSBhIGRhdGFzZXQgb3IgYW4gYXJyYXkgb2YgZGF0YXNldHNcbiAqIEVhY2ggZGF0YXNldCBvYmplY3QgbmVlZHMgdG8gaGF2ZSBgaW5mb2AgYW5kIGBkYXRhYCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBbYWN0aW9uLnBheWxvYWQub3B0aW9uc10gb3B0aW9uIG9iamVjdCBge2NlbnRlck1hcDogdHJ1ZSwgcGFkZGluZzoge2xlZnQ6IDMwMH19YFxuICogQHBhcmFtIFthY3Rpb24ucGF5bG9hZC5jb25maWddIG1hcCBjb25maWdcbiAqIEBwYXJhbSBbYWN0aW9uLnBheWxvYWQuaW5mb10gbWFwIGluZm8gY29udGFpbnMgdGl0bGUgYW5kIGRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEYXRhc2V0XG4gKiBAcHJvcGVydHkgaW5mbyAtaW5mbyBvZiBhIGRhdGFzZXRcbiAqIEBwcm9wZXJ0eSBpbmZvLmlkIC0gaWQgb2YgdGhpcyBkYXRhc2V0LiBJZiBjb25maWcgaXMgZGVmaW5lZCwgYGlkYCBzaG91bGQgbWF0Y2hlcyB0aGUgYGRhdGFJZGAgaW4gY29uZmlnLlxuICogQHByb3BlcnR5IGluZm8ubGFiZWwgLSBBIGRpc3BsYXkgbmFtZSBvZiB0aGlzIGRhdGFzZXRcbiAqIEBwcm9wZXJ0eSBkYXRhIC0gKioqcmVxdWlyZWQqKiBUaGUgZGF0YSBvYmplY3QsIGluIGEgdGFidWxhciBmb3JtYXQgd2l0aCAyIHByb3BlcnRpZXMgYGZpZWxkc2AgYW5kIGByb3dzYFxuICogQHByb3BlcnR5IGRhdGEuZmllbGRzIC0gKioqcmVxdWlyZWQqKiBBcnJheSBvZiBmaWVsZHMsXG4gKiBAcHJvcGVydHkgZGF0YS5maWVsZHMubmFtZSAtICoqKnJlcXVpcmVkKiogTmFtZSBvZiB0aGUgZmllbGQsXG4gKiBAcHJvcGVydHkgZGF0YS5yb3dzIC0gKioqcmVxdWlyZWQqKiBBcnJheSBvZiByb3dzLCBpbiBhIHRhYnVsYXIgZm9ybWF0IHdpdGggYGZpZWxkc2AgYW5kIGByb3dzYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZERhdGFUb01hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICB7cGF5bG9hZH06IHtwYXlsb2FkOiBBZGREYXRhVG9NYXBQYXlsb2FkfVxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGNvbnN0IHtkYXRhc2V0cywgY29uZmlnLCBpbmZvfSA9IHBheWxvYWQ7XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAuLi5kZWZhdWx0QWRkRGF0YVRvTWFwT3B0aW9ucyxcbiAgICAuLi5wYXlsb2FkLm9wdGlvbnNcbiAgfTtcblxuICAvLyBjaGVjayBpZiBwcm9ncmVzc2l2ZSBsb2FkaW5nIGRhdGFzZXQgYnkgYmF0Y2hlcywgYW5kIHVwZGF0ZSB2aXNTdGF0ZSBkaXJlY3RseVxuICBjb25zdCBpc1Byb2dyZXNzaXZlTG9hZGluZyA9XG4gICAgQXJyYXkuaXNBcnJheShkYXRhc2V0cykgJiZcbiAgICBkYXRhc2V0c1swXT8uaW5mby5mb3JtYXQgPT09ICdhcnJvdycgJiZcbiAgICBkYXRhc2V0c1swXT8uaW5mby5pZCAmJlxuICAgIGRhdGFzZXRzWzBdPy5pbmZvLmlkIGluIHN0YXRlLnZpc1N0YXRlLmRhdGFzZXRzO1xuICBpZiAoaXNQcm9ncmVzc2l2ZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gY29tcG9zZV88S2VwbGVyR2xTdGF0ZT4oW1xuICAgICAgcGlja18oJ3Zpc1N0YXRlJykoXG4gICAgICAgIGFwcGx5XzxWaXNTdGF0ZSwgYW55Pih2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLCB7XG4gICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBjb25maWdcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICBdKShzdGF0ZSk7XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGxldCBwYXJzZWRDb25maWc6IFBhcnNlZENvbmZpZyA9IGNvbmZpZztcblxuICBpZiAoaXNWYWxpZENvbmZpZyhjb25maWcpKSB7XG4gICAgLy8gaWYgcGFzc2VkIGluIHNhdmVkIGNvbmZpZ1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBwYXJzZWRDb25maWcgPSBzdGF0ZS52aXNTdGF0ZS5zY2hlbWEucGFyc2VTYXZlZENvbmZpZyhjb25maWcpO1xuICB9XG4gIGNvbnN0IG9sZExheWVycyA9IHN0YXRlLnZpc1N0YXRlLmxheWVycztcbiAgY29uc3QgZmlsdGVyTmV3bHlBZGRlZExheWVycyA9IChsYXllcnM6IExheWVyW10pID0+XG4gICAgbGF5ZXJzLmZpbHRlcihubCA9PiAhb2xkTGF5ZXJzLmZpbmQob2wgPT4gb2wgPT09IG5sKSk7XG5cbiAgLy8gUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IGZvdW5kLCB0byBtYWtlIHR5cGVzY3JpcHQgaGFwcHlcbiAgY29uc3QgZmluZE1hcEJvdW5kc0lmQ2VudGVyZWQgPSAobGF5ZXJzOiBMYXllcltdKSA9PiB7XG4gICAgY29uc3QgYm91bmRzID0gb3B0aW9ucy5jZW50ZXJNYXAgJiYgZmluZE1hcEJvdW5kcyhsYXllcnMpO1xuICAgIHJldHVybiBib3VuZHMgPyBib3VuZHMgOiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIGNvbXBvc2VfPEtlcGxlckdsU3RhdGU+KFtcbiAgICBwaWNrXygndmlzU3RhdGUnKShcbiAgICAgIC8vIHRoaXMgcGFydCBjYW4gYmUgYXN5bmNcbiAgICAgIGFwcGx5XzxWaXNTdGF0ZSwgYW55Pih2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLCB7XG4gICAgICAgIGRhdGFzZXRzLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBjb25maWc6IHBhcnNlZENvbmZpZ1xuICAgICAgfSlcbiAgICApLFxuXG4gICAgaWZfKEJvb2xlYW4oaW5mbyksIHBpY2tfKCd2aXNTdGF0ZScpKGFwcGx5XzxWaXNTdGF0ZSwgYW55PihzZXRNYXBJbmZvVXBkYXRlciwge2luZm99KSkpLFxuICAgIC8vIE5vdGUgdGhhdCBmaXQgYm91bmRzIGhlcmUgd29uJ3QgYmUgY2FsbGVkIGluIGNhc2UgZGF0YXNldHMgYXJlIGNyZWF0ZWQgaW4gVGFza3MuXG4gICAgLy8gQSBzZXBhcmF0ZSBUYXNrIHRvIHVwZGF0ZSBib3VuZHMgaXMgY3JlYXRlZCBvbmNlIHRoZSBkYXRhc2V0cyBhcmUgcmVhZHkuXG4gICAgd2l0aF8oKHt2aXNTdGF0ZX0pID0+XG4gICAgICBwaWNrXygnbWFwU3RhdGUnKShcbiAgICAgICAgYXBwbHlfKFxuICAgICAgICAgIHN0YXRlTWFwQ29uZmlnVXBkYXRlcixcbiAgICAgICAgICBwYXlsb2FkXyh7XG4gICAgICAgICAgICBjb25maWc6IHBhcnNlZENvbmZpZyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBib3VuZHM6IGZpbmRNYXBCb3VuZHNJZkNlbnRlcmVkKGZpbHRlck5ld2x5QWRkZWRMYXllcnModmlzU3RhdGUubGF5ZXJzKSlcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKSxcbiAgICBwaWNrXygnbWFwU3R5bGUnKShhcHBseV8oc3R5bGVNYXBDb25maWdVcGRhdGVyLCBwYXlsb2FkXyh7Y29uZmlnOiBwYXJzZWRDb25maWcsIG9wdGlvbnN9KSkpLFxuICAgIHBpY2tfKCd1aVN0YXRlJykoXG4gICAgICBhcHBseV8odWlTdGF0ZVJlY2VpdmVNYXBDb25maWdVcGRhdGVyLCBwYXlsb2FkXyh7Y29uZmlnOiBwYXJzZWRDb25maWcsIG9wdGlvbnN9KSlcbiAgICApLFxuICAgIHBpY2tfKCd1aVN0YXRlJykoYXBwbHlfKHVpU3RhdGVMb2FkRmlsZXNTdWNjZXNzVXBkYXRlciwgcGF5bG9hZF8obnVsbCkpKSxcblxuICAgIHBpY2tfKCd1aVN0YXRlJykoYXBwbHlfKHRvZ2dsZU1vZGFsVXBkYXRlciwgcGF5bG9hZF8obnVsbCkpKSxcbiAgICBwaWNrXygndWlTdGF0ZScpKFxuICAgICAgbWVyZ2VfKFxuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3JlYWRPbmx5JylcbiAgICAgICAgICA/IHtyZWFkT25seTogb3B0aW9ucy5yZWFkT25seX1cbiAgICAgICAgICA6IHt9XG4gICAgICApXG4gICAgKVxuICBdKShzdGF0ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzU3VjY2Vzc1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICBhY3Rpb246IGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgLy8gc3RpbGwgbW9yZSB0byBsb2FkXG4gIGNvbnN0IHBheWxvYWRzID0gZmlsZXNUb0RhdGFQYXlsb2FkKGFjdGlvbi5yZXN1bHQpO1xuICBjb25zdCBuZXh0U3RhdGUgPSBjb21wb3NlXyhbXG4gICAgcGlja18oJ3Zpc1N0YXRlJykoXG4gICAgICBtZXJnZV8oe1xuICAgICAgICBmaWxlTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGZpbGVMb2FkaW5nUHJvZ3Jlc3M6IHt9XG4gICAgICB9KVxuICAgIClcbiAgXSkoc3RhdGUpO1xuICAvLyBtYWtlIG11bHRpcGxlIGFkZCBkYXRhIHRvIG1hcCBjYWxsc1xuICBjb25zdCBzdGF0ZVdpdGhEYXRhID0gY29tcG9zZV8ocGF5bG9hZHMubWFwKHAgPT4gYXBwbHlfKGFkZERhdGFUb01hcFVwZGF0ZXIsIHBheWxvYWRfKHApKSkpKFxuICAgIG5leHRTdGF0ZVxuICApO1xuICByZXR1cm4gc3RhdGVXaXRoRGF0YSBhcyBLZXBsZXJHbFN0YXRlO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZERhdGFUb01hcENvbXBvc2VkID0gYWRkRGF0YVRvTWFwVXBkYXRlcjtcblxuLyoqXG4gKiBIZWxwZXIgd2hpY2ggdXBkYXRlcyBtYXAgb3ZlcmxheSBibGVuZGluZyBtb2RlIGluIHZpc1N0YXRlLFxuICogYnV0IG9ubHkgaWYgaXQncyBub3QgY3VycmVudGx5IGluIHRoZSBgbm9ybWFsYCBtb2RlLlxuICovXG5jb25zdCB1cGRhdGVPdmVybGF5QmxlbmRpbmcgPSBvdmVybGF5QmxlbmRpbmcgPT4gdmlzU3RhdGUgPT4ge1xuICBpZiAodmlzU3RhdGUub3ZlcmxheUJsZW5kaW5nICE9PSBPVkVSTEFZX0JMRU5ESU5HUy5ub3JtYWwudmFsdWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmlzU3RhdGUsXG4gICAgICBvdmVybGF5QmxlbmRpbmdcbiAgICB9O1xuICB9XG4gIHJldHVybiB2aXNTdGF0ZTtcbn07XG5cbi8qKlxuICogSGVscGVyIHdoaWNoIHVwZGF0ZXMgYGRhcmtCYXNlTWFwRW5hYmxlZGAgaW4gYWxsIHRoZSBsYXllcnMgaW4gdmlzU3RhdGUgd2hpY2hcbiAqIGhhdmUgdGhpcyBjb25maWcgc2V0dGluZyAob3IgaW4gb25lIHNwZWNpZmljIGxheWVyIGlmIHRoZSBgbGF5ZXJJZGAgcGFyYW0gaXMgcHJvdmlkZWQpLlxuICovXG5jb25zdCB1cGRhdGVEYXJrQmFzZU1hcExheWVycyA9XG4gIChkYXJrQmFzZU1hcEVuYWJsZWQ6IGJvb2xlYW4sIGxheWVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsKSA9PlxuICB2aXNTdGF0ZSA9PiAoe1xuICAgIC4uLnZpc1N0YXRlLFxuICAgIGxheWVyczogdmlzU3RhdGUubGF5ZXJzLm1hcChsYXllciA9PiB7XG4gICAgICBpZiAoIWxheWVySWQgfHwgbGF5ZXIuaWQgPT09IGxheWVySWQpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChsYXllci52aXNDb25maWdTZXR0aW5ncywgJ2RhcmtCYXNlTWFwRW5hYmxlZCcpKSB7XG4gICAgICAgICAgY29uc3Qge3Zpc0NvbmZpZ30gPSBsYXllci5jb25maWc7XG4gICAgICAgICAgcmV0dXJuIGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgICAgIHZpc0NvbmZpZzogey4uLnZpc0NvbmZpZywgZGFya0Jhc2VNYXBFbmFibGVkfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGF5ZXI7XG4gICAgfSlcbiAgfSk7XG5cbi8qKlxuICogVXBkYXRlciB0aGF0IGNoYW5nZXMgdGhlIG1hcCBzdHlsZSBieSBjYWxsaW5nIG1hcFN0eWxlQ2hhbmdlVXBkYXRlciBvbiB2aXNTdGF0ZS5cbiAqIEluIGFkZGl0aW9uIHRvIHRoYXQsIGl0IGRvZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgIDEuIFVwZGF0ZSBtYXAgb3ZlcmxheSBibGVuZGluZyBtb2RlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgY29sb3JNb2RlIG9mIHRoZVxuICogICAgICBiYXNlIG1hcCwgYnV0IG9ubHkgaWYgaXQncyBub3QgaW4gdGhlIGBub3JtYWxgIG1vZGUuXG4gKlxuICogICAyLiBVcGRhdGUgYWxsIHRoZSBsYXllcnMgd2hpY2ggaGF2ZSB0aGUgYGRhcmtCYXNlTWFwRW5hYmxlZGAgY29uZmlnIHNldHRpbmdcbiAqICAgICAgYWRqdXN0aW5nIGl0IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgY29sb3JNb2RlIG9mIHRoZSBiYXNlIG1hcC5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBjb21iaW5lZE1hcFN0eWxlQ2hhbmdlVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogTWFwU3R5bGVDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgY29uc3Qge3BheWxvYWR9ID0gYWN0aW9uO1xuICBjb25zdCB7bWFwU3R5bGV9ID0gc3RhdGU7XG4gIGNvbnN0IGdldENvbG9yTW9kZSA9IGtleSA9PiBtYXBTdHlsZS5tYXBTdHlsZXNba2V5XT8uY29sb3JNb2RlO1xuICBjb25zdCBwcmV2Q29sb3JNb2RlID0gZ2V0Q29sb3JNb2RlKG1hcFN0eWxlLnN0eWxlVHlwZSk7XG4gIGNvbnN0IG5leHRDb2xvck1vZGUgPSBnZXRDb2xvck1vZGUocGF5bG9hZC5zdHlsZVR5cGUpO1xuICBsZXQge3Zpc1N0YXRlLCBtYXBTdGF0ZX0gPSBzdGF0ZTtcbiAgaWYgKG5leHRDb2xvck1vZGUgIT09IHByZXZDb2xvck1vZGUpIHtcbiAgICBzd2l0Y2ggKG5leHRDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQkFTRV9NQVBfQ09MT1JfTU9ERVMuREFSSzpcbiAgICAgICAgdmlzU3RhdGUgPSBjb21wb3NlXyhbXG4gICAgICAgICAgdXBkYXRlT3ZlcmxheUJsZW5kaW5nKE9WRVJMQVlfQkxFTkRJTkdTLnNjcmVlbi52YWx1ZSksXG4gICAgICAgICAgdXBkYXRlRGFya0Jhc2VNYXBMYXllcnModHJ1ZSlcbiAgICAgICAgXSkodmlzU3RhdGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQkFTRV9NQVBfQ09MT1JfTU9ERVMuTElHSFQ6XG4gICAgICAgIHZpc1N0YXRlID0gY29tcG9zZV8oW1xuICAgICAgICAgIHVwZGF0ZU92ZXJsYXlCbGVuZGluZyhPVkVSTEFZX0JMRU5ESU5HUy5kYXJrZW4udmFsdWUpLFxuICAgICAgICAgIHVwZGF0ZURhcmtCYXNlTWFwTGF5ZXJzKGZhbHNlKVxuICAgICAgICBdKSh2aXNTdGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cblxuICAvLyBVcGRhdGUgZ2xvYmUgY29uZmlnIGNvbG9ycyB3aGVuIHN0eWxlIGNoYW5nZXMgYW5kIGdsb2JlIGlzIGVuYWJsZWRcbiAgaWYgKG1hcFN0YXRlLmdsb2JlPy5lbmFibGVkKSB7XG4gICAgLy8gU3dpdGNoaW5nIGZyb20gXCJObyBCYXNlbWFwXCIgdG8gYSBiYXNlbWFwIC0gcmVzdG9yZSBiYXNlbWFwIHN1Yi10b2dnbGVzXG4gICAgaWYgKHBheWxvYWQuc3R5bGVUeXBlICE9PSBOT19NQVBfSUQgJiYgbWFwU3R5bGUuc3R5bGVUeXBlID09PSBOT19NQVBfSUQpIHtcbiAgICAgIG1hcFN0YXRlID0ge1xuICAgICAgICAuLi5tYXBTdGF0ZSxcbiAgICAgICAgZ2xvYmU6IHtcbiAgICAgICAgICAuLi5tYXBTdGF0ZS5nbG9iZSxcbiAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgIC4uLm1hcFN0YXRlLmdsb2JlLmNvbmZpZyxcbiAgICAgICAgICAgIGJhc2VtYXA6IHRydWUsXG4gICAgICAgICAgICBsYWJlbHM6IHRydWUsXG4gICAgICAgICAgICBhZG1pbkxpbmVzOiB0cnVlLFxuICAgICAgICAgICAgd2F0ZXI6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIG1hcFN0YXRlID0gc3luY0dsb2JlQ29uZmlnQ29sb3JzVG9TdHlsZShtYXBTdGF0ZSwgbWFwU3R5bGUsIHBheWxvYWQuc3R5bGVUeXBlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgdmlzU3RhdGUsXG4gICAgbWFwU3RhdGUsXG4gICAgbWFwU3R5bGU6IG1hcFN0eWxlQ2hhbmdlVXBkYXRlcihtYXBTdHlsZSwge3BheWxvYWQ6IHsuLi5wYXlsb2FkfX0pXG4gIH07XG59O1xuXG4vKipcbiAqIERlcml2ZSBnbG9iZSBiYXNlbWFwIGNvbG9ycyAoc3VyZmFjZSAvIHdhdGVyIC8gYWRtaW4gbGluZXMpIGZyb20gYSBtYXAgc3R5bGUgYW5kXG4gKiByZXR1cm4gYW4gdXBkYXRlZCBtYXBTdGF0ZSB3aXRoIHRob3NlIGNvbG9ycyB3cml0dGVuIGludG8gYGdsb2JlLmNvbmZpZ2AuIFVzZWQgYm90aFxuICogd2hlbiB0aGUgYmFzZSBtYXAgc3R5bGUgY2hhbmdlcyBhbmQgd2hlbiBlbnRlcmluZyBnbG9iZSBtb2RlLCBzbyB0aGUgZ2xvYmUgYWx3YXlzXG4gKiByZWZsZWN0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJhc2VtYXAgaW5zdGVhZCBvZiB0aGUgc3RhdGljIERFRkFVTFRfR0xPQkVfQ09ORklHLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3luY0dsb2JlQ29uZmlnQ29sb3JzVG9TdHlsZShcbiAgbWFwU3RhdGU6IE1hcFN0YXRlLFxuICBtYXBTdHlsZTogTWFwU3R5bGUsXG4gIHN0eWxlVHlwZTogc3RyaW5nXG4pOiBNYXBTdGF0ZSB7XG4gIGlmICghbWFwU3RhdGUuZ2xvYmU/LmVuYWJsZWQpIHtcbiAgICByZXR1cm4gbWFwU3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXh0U3R5bGVPYmogPSBtYXBTdHlsZS5tYXBTdHlsZXNbc3R5bGVUeXBlXTtcbiAgY29uc3QgbmV4dEdsb2JlQ29uZmlnID0gey4uLm1hcFN0YXRlLmdsb2JlLmNvbmZpZ307XG5cbiAgaWYgKHN0eWxlVHlwZSA9PT0gTk9fTUFQX0lEKSB7XG4gICAgbmV4dEdsb2JlQ29uZmlnLmJhc2VtYXAgPSBmYWxzZTtcbiAgICBuZXh0R2xvYmVDb25maWcubGFiZWxzID0gZmFsc2U7XG4gICAgbmV4dEdsb2JlQ29uZmlnLmFkbWluTGluZXMgPSBmYWxzZTtcbiAgICBuZXh0R2xvYmVDb25maWcud2F0ZXIgPSBmYWxzZTtcbiAgICBuZXh0R2xvYmVDb25maWcuc3VyZmFjZUNvbG9yID0gREVGQVVMVF9CQVNFTUFQX0NPTE9SLmJhY2tncm91bmRGaWxsQ29sb3I7XG4gICAgbmV4dEdsb2JlQ29uZmlnLndhdGVyQ29sb3IgPSBERUZBVUxUX0JBU0VNQVBfQ09MT1IuYmFzZW1hcFdhdGVyRmlsbENvbG9yO1xuICAgIG5leHRHbG9iZUNvbmZpZy5hZG1pbkxpbmVzQ29sb3IgPSBERUZBVUxUX0JBU0VNQVBfQ09MT1IuYmFzZW1hcEFkbWluTGluZUNvbG9yO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJhc2VtYXBDb2xvcnMgPSBuZXh0U3R5bGVPYmpcbiAgICAgID8gZ2V0QmFzZW1hcENvbG9yc0ZvclN0eWxlKHN0eWxlVHlwZSwge1xuICAgICAgICAgIHN0eWxlOiBuZXh0U3R5bGVPYmouc3R5bGUsXG4gICAgICAgICAgbGF5ZXJHcm91cHM6IG5leHRTdHlsZU9iai5sYXllckdyb3Vwc1xuICAgICAgICB9KVxuICAgICAgOiAvLyBTdHlsZSBvYmplY3Qgbm90IHlldCBsb2FkZWQgLSB1c2Uga25vd24gcHJlc2V0cyBieSBzdHlsZSB0eXBlXG4gICAgICAgIGdldEJhc2VtYXBDb2xvcnNGb3JTdHlsZShzdHlsZVR5cGUpO1xuICAgIG5leHRHbG9iZUNvbmZpZy5zdXJmYWNlQ29sb3IgPSBiYXNlbWFwQ29sb3JzLmJhY2tncm91bmRGaWxsQ29sb3I7XG4gICAgbmV4dEdsb2JlQ29uZmlnLndhdGVyQ29sb3IgPSBiYXNlbWFwQ29sb3JzLmJhc2VtYXBXYXRlckZpbGxDb2xvcjtcbiAgICBuZXh0R2xvYmVDb25maWcuYWRtaW5MaW5lc0NvbG9yID0gYmFzZW1hcENvbG9ycy5iYXNlbWFwQWRtaW5MaW5lQ29sb3I7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLm1hcFN0YXRlLFxuICAgIGdsb2JlOiB7XG4gICAgICAuLi5tYXBTdGF0ZS5nbG9iZSxcbiAgICAgIGNvbmZpZzogbmV4dEdsb2JlQ29uZmlnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZXIgdGhhdCBzd2l0Y2hlcyB0aGUgbWFwIHZpZXcgbW9kZSAoMkQgLyAzRCAvIEdsb2JlKS4gUnVucyB0aGUgYmFzZSBtYXAtc3RhdGVcbiAqIHVwZGF0ZXIgYW5kLCB3aGVuIGVudGVyaW5nIGdsb2JlIG1vZGUsIHN5bmNzIHRoZSBnbG9iZSBiYXNlbWFwIGNvbG9ycyB0byB0aGVcbiAqIGN1cnJlbnRseSBzZWxlY3RlZCBtYXAgc3R5bGUgc28gdGhlIGdsb2JlIGRvZXNuJ3Qgc2hvdyBzdGFsZSBkZWZhdWx0IGNvbG9ycy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVkU2V0TWFwVmlld01vZGVVcGRhdGVyID0gKFxuICBzdGF0ZTogS2VwbGVyR2xTdGF0ZSxcbiAgYWN0aW9uOiBNYXBTdGF0ZUFjdGlvbnMuU2V0TWFwVmlld01vZGVVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgbGV0IG1hcFN0YXRlID0gc2V0TWFwVmlld01vZGVVcGRhdGVyKHN0YXRlLm1hcFN0YXRlLCBhY3Rpb24pO1xuXG4gIGlmIChtYXBTdGF0ZS5nbG9iZT8uZW5hYmxlZCkge1xuICAgIG1hcFN0YXRlID0gc3luY0dsb2JlQ29uZmlnQ29sb3JzVG9TdHlsZShtYXBTdGF0ZSwgc3RhdGUubWFwU3R5bGUsIHN0YXRlLm1hcFN0eWxlLnN0eWxlVHlwZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIG1hcFN0YXRlXG4gIH07XG59O1xuXG4vKipcbiAqIFVwZGF0ZXIgdGhhdCBjaGFuZ2VzIHRoZSBsYXllciB0eXBlIGJ5IGNhbGxpbmcgYGxheWVyVHlwZUNoYW5nZVVwZGF0ZXJgIG9uIHZpc1N0YXRlLlxuICogSW4gYWRkaXRpb24gdG8gdGhhdCwgaWYgdGhlIG5ldyBsYXllciB0eXBlIGhhcyB0aGUgYGRhcmtCYXNlTWFwRW5hYmxlZGAgY29uZmlnXG4gKiBzZXR0aW5nLCB3ZSBhZGp1c3QgaXQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBjb2xvck1vZGUgb2YgdGhlIGJhc2UgbWFwLnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVkTGF5ZXJUeXBlQ2hhbmdlVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogTGF5ZXJUeXBlQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGxldCB7dmlzU3RhdGV9ID0gc3RhdGU7XG4gIGNvbnN0IG9sZExheWVySW5kZXggPSB2aXNTdGF0ZS5sYXllcnMuZmluZEluZGV4KGxheWVyID0+IGxheWVyID09PSBhY3Rpb24ub2xkTGF5ZXIpO1xuICB2aXNTdGF0ZSA9IGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIodmlzU3RhdGUsIGFjdGlvbik7XG4gIGNvbnN0IG5ld0xheWVyID0gdmlzU3RhdGUubGF5ZXJzW29sZExheWVySW5kZXhdO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5ld0xheWVyPy52aXNDb25maWdTZXR0aW5ncywgJ2RhcmtCYXNlTWFwRW5hYmxlZCcpKSB7XG4gICAgY29uc3Qge21hcFN0eWxlfSA9IHN0YXRlO1xuICAgIGNvbnN0IHtjb2xvck1vZGV9ID0gbWFwU3R5bGUubWFwU3R5bGVzW21hcFN0eWxlLnN0eWxlVHlwZV07XG4gICAgY29uc3Qge2RhcmtCYXNlTWFwRW5hYmxlZH0gPSBuZXdMYXllci5jb25maWcudmlzQ29uZmlnO1xuICAgIHN3aXRjaCAoY29sb3JNb2RlKSB7XG4gICAgICBjYXNlIEJBU0VfTUFQX0NPTE9SX01PREVTLkRBUks6XG4gICAgICAgIGlmICghZGFya0Jhc2VNYXBFbmFibGVkKSB7XG4gICAgICAgICAgdmlzU3RhdGUgPSB1cGRhdGVEYXJrQmFzZU1hcExheWVycyh0cnVlLCBuZXdMYXllci5pZCkodmlzU3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBCQVNFX01BUF9DT0xPUl9NT0RFUy5MSUdIVDpcbiAgICAgICAgaWYgKGRhcmtCYXNlTWFwRW5hYmxlZCkge1xuICAgICAgICAgIHZpc1N0YXRlID0gdXBkYXRlRGFya0Jhc2VNYXBMYXllcnMoZmFsc2UsIG5ld0xheWVyLmlkKSh2aXNTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHZpc1N0YXRlXG4gIH07XG59O1xuXG4vKipcbiAqIE1ha2UgbWFwTGVnZW5kIGFjdGl2ZSB3aGVuIHRvZ2dsZVNwbGl0TWFwIGFjdGlvbiBpcyBjYWxsZWRcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNwbGl0TWFwVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogVG9nZ2xlU3BsaXRNYXBVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgdmlzU3RhdGU6IHZpc1N0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyKHN0YXRlLnZpc1N0YXRlLCBhY3Rpb24pLFxuICAgIHVpU3RhdGU6IHVpU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIoc3RhdGUudWlTdGF0ZSksXG4gICAgbWFwU3RhdGU6IG1hcFN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyKHN0YXRlLm1hcFN0YXRlKVxuICB9O1xuXG4gIGNvbnN0IGlzU3BsaXQgPSBuZXdTdGF0ZS52aXNTdGF0ZS5zcGxpdE1hcHMubGVuZ3RoICE9PSAwO1xuICBjb25zdCBpc0xlZ2VuZEFjdGl2ZSA9IG5ld1N0YXRlLnVpU3RhdGUubWFwQ29udHJvbHM/Lm1hcExlZ2VuZD8uYWN0aXZlO1xuICBpZiAoaXNTcGxpdCAmJiAhaXNMZWdlbmRBY3RpdmUpIHtcbiAgICBuZXdTdGF0ZS51aVN0YXRlID0gdG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIobmV3U3RhdGUudWlTdGF0ZSwge1xuICAgICAgcGF5bG9hZDoge3BhbmVsSWQ6ICdtYXBMZWdlbmQnLCBpbmRleDogYWN0aW9uLnBheWxvYWR9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3U3RhdGU7XG59O1xuXG4vKipcbiAqIFNldCBtYXAgc3BsaXQgbW9kZSB1cGRhdGVyIC0gY29vcmRpbmF0ZXMgc3RhdGUgY2hhbmdlcyBhY3Jvc3MgdmlzU3RhdGUsIG1hcFN0YXRlLCBhbmQgdWlTdGF0ZVxuICovXG5leHBvcnQgY29uc3Qgc2V0TWFwU3BsaXRNb2RlVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogTWFwU3RhdGVBY3Rpb25zLlNldE1hcFNwbGl0TW9kZVVwZGF0ZXJBY3Rpb25cbik6IEtlcGxlckdsU3RhdGUgPT4ge1xuICBjb25zdCB7bWFwU3BsaXRNb2RlfSA9IGFjdGlvbi5wYXlsb2FkO1xuICBjb25zdCBwcmV2TW9kZSA9IHN0YXRlLm1hcFN0YXRlLm1hcFNwbGl0TW9kZTtcblxuICBpZiAobWFwU3BsaXRNb2RlID09PSBwcmV2TW9kZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IG5ld01hcFN0YXRlID0gbWFwU3RhdGVTZXRNYXBTcGxpdE1vZGVVcGRhdGVyKHN0YXRlLm1hcFN0YXRlLCBhY3Rpb24pO1xuXG4gIGxldCBuZXdWaXNTdGF0ZSA9IHsuLi5zdGF0ZS52aXNTdGF0ZX07XG5cbiAgc3dpdGNoIChtYXBTcGxpdE1vZGUpIHtcbiAgICBjYXNlIE1hcFNwbGl0TW9kZS5TSU5HTEVfTUFQOlxuICAgICAgbmV3VmlzU3RhdGUgPSB7XG4gICAgICAgIC4uLm5ld1Zpc1N0YXRlLFxuICAgICAgICBzcGxpdE1hcHM6IFtdXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBNYXBTcGxpdE1vZGUuRFVBTF9NQVA6XG4gICAgY2FzZSBNYXBTcGxpdE1vZGUuU1dJUEVfQ09NUEFSRTpcbiAgICAgIGlmIChwcmV2TW9kZSA9PT0gTWFwU3BsaXRNb2RlLlNJTkdMRV9NQVApIHtcbiAgICAgICAgbmV3VmlzU3RhdGUgPSB7XG4gICAgICAgICAgLi4ubmV3VmlzU3RhdGUsXG4gICAgICAgICAgc3BsaXRNYXBzOiBjb21wdXRlU3BsaXRNYXBMYXllcnMobmV3VmlzU3RhdGUubGF5ZXJzLCB7XG4gICAgICAgICAgICBkdXBsaWNhdGU6IG1hcFNwbGl0TW9kZSA9PT0gTWFwU3BsaXRNb2RlLlNXSVBFX0NPTVBBUkVcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgbGV0IG5ld1VpU3RhdGUgPSB1aVN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyKHN0YXRlLnVpU3RhdGUpO1xuXG4gIGNvbnN0IGlzU3BsaXQgPSBuZXdWaXNTdGF0ZS5zcGxpdE1hcHMubGVuZ3RoICE9PSAwO1xuICBjb25zdCBpc0xlZ2VuZEFjdGl2ZSA9IG5ld1VpU3RhdGUubWFwQ29udHJvbHM/Lm1hcExlZ2VuZD8uYWN0aXZlO1xuICBpZiAoaXNTcGxpdCAmJiAhaXNMZWdlbmRBY3RpdmUpIHtcbiAgICBuZXdVaVN0YXRlID0gdG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIobmV3VWlTdGF0ZSwge1xuICAgICAgcGF5bG9hZDoge3BhbmVsSWQ6ICdtYXBMZWdlbmQnLCBpbmRleDogMH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbWFwU3RhdGU6IG5ld01hcFN0YXRlLFxuICAgIHZpc1N0YXRlOiBuZXdWaXNTdGF0ZSxcbiAgICB1aVN0YXRlOiBuZXdVaVN0YXRlXG4gIH07XG59O1xuXG5jb25zdCBkZWZhdWx0UmVwbGFjZURhdGFUb01hcE9wdGlvbnMgPSB7XG4gIGtlZXBFeGlzdGluZ0NvbmZpZzogdHJ1ZSxcbiAgY2VudGVyTWFwOiB0cnVlLFxuICBhdXRvQ3JlYXRlTGF5ZXJzOiBmYWxzZVxufTtcblxuLyoqXG4gKiBVcGRhdGVyIHJlcGxhY2UgYSBkYXRhc2V0IGluIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCByZXBsYWNlRGF0YUluTWFwVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIHtwYXlsb2FkfToge3BheWxvYWQ6IFJlcGxhY2VEYXRhSW5NYXBQYXlsb2FkfVxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGNvbnN0IHtkYXRhc2V0VG9SZXBsYWNlSWQsIGRhdGFzZXRUb1VzZSwgb3B0aW9ucyA9IHt9fSA9IHBheWxvYWQ7XG4gIGNvbnN0IGFkZERhdGFUb01hcE9wdGlvbnMgPSB7Li4uZGVmYXVsdFJlcGxhY2VEYXRhVG9NYXBPcHRpb25zLCAuLi5vcHRpb25zfTtcblxuICAvLyBjaGVjayBpZiBkYXRhc2V0IGlzIHRoZXJlXG4gIGlmICghc3RhdGUudmlzU3RhdGUuZGF0YXNldHNbZGF0YXNldFRvUmVwbGFjZUlkXSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyBkYXRhc2V0VG9Vc2UgaXMgUHJvdG9EYXRhc2V0XG4gIGNvbnN0IGRhdGFJZFRvVXNlID0gZGF0YXNldFRvVXNlLmluZm8uaWQ7XG4gIGlmICghZGF0YUlkVG9Vc2UpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgLy8gcmVtb3ZlIGRhdGFzZXQgYW5kIHB1dCBkZXBlbmRlbmNpZXMgaW4gdG9CZU1lcmdlZFxuICBjb25zdCBwcmVwYXJlZFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIHZpc1N0YXRlOiBwcmVwYXJlU3RhdGVGb3JEYXRhc2V0UmVwbGFjZShzdGF0ZS52aXNTdGF0ZSwgZGF0YXNldFRvUmVwbGFjZUlkLCBkYXRhSWRUb1VzZSlcbiAgfTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSBhZGREYXRhVG9NYXBVcGRhdGVyKFxuICAgIHByZXBhcmVkU3RhdGUsXG4gICAgcGF5bG9hZF8oe1xuICAgICAgZGF0YXNldHM6IGRhdGFzZXRUb1VzZSxcbiAgICAgIC8vIHNob3VsZCB6b29tIHRvIG5ldyBkYXRhc2V0XG4gICAgICBvcHRpb25zOiBhZGREYXRhVG9NYXBPcHRpb25zXG4gICAgfSlcbiAgKTtcblxuICByZXR1cm4gbmV4dFN0YXRlO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTs7QUFFQSxTQUNFQSxrQkFBa0IsRUFDbEJDLHVCQUF1QixJQUFJQyw4QkFBOEIsRUFDekRDLHVCQUF1QixFQUN2QkMscUJBQXFCLElBQUlDLDRCQUE0QixFQUNyREMsdUJBQXVCLElBQUlDLDhCQUE4QixRQUNwRCxxQkFBcUI7QUFDNUIsU0FDRUMsb0JBQW9CLElBQUlDLDRCQUE0QixFQUNwREMsaUJBQWlCLEVBQ2pCQyxzQkFBc0IsRUFDdEJQLHFCQUFxQixJQUFJUSw2QkFBNkIsRUFDdERDLDZCQUE2QixRQUN4QixzQkFBc0I7QUFDN0IsU0FDRVAsdUJBQXVCLElBQUlRLHFCQUFxQixFQUNoRFYscUJBQXFCLElBQUlXLDZCQUE2QixFQUN0REMsc0JBQXNCLElBQUlDLDhCQUE4QixFQUN4REMscUJBQXFCLFFBQ2hCLHNCQUFzQjtBQUM3QixTQUNFQyxxQkFBcUIsRUFDckJiLHVCQUF1QixJQUFJYyxxQkFBcUIsUUFDM0Msc0JBQXNCO0FBQzdCLFNBQVFDLGtCQUFrQixRQUFPLHVCQUF1QjtBQUN4RCxTQUFRQyxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsS0FBSyxFQUFFQyxHQUFHLEVBQUVDLFFBQVEsRUFBRUMsTUFBTSxFQUFFQyxLQUFLLFFBQU8sb0JBQW9CO0FBY3hGLFNBQVFDLGFBQWEsRUFBRUMscUJBQXFCLFFBQU8sa0JBQWtCO0FBQ3JFLFNBQVFDLGFBQWEsUUFBTyxjQUFjO0FBQzFDLFNBQVFDLG9CQUFvQixFQUFFQyxpQkFBaUIsRUFBRUMsU0FBUyxFQUFFQyxZQUFZLFFBQU8sc0JBQXNCO0FBQ3JHLFNBQVFDLHdCQUF3QixFQUFFQyxxQkFBcUIsUUFBTywwQkFBMEI7QUFVeEY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBTUMsZ0JBQWdCLEdBQUcsSUFBSTtBQUM3Qjs7QUFFQSxPQUFPLElBQU1DLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBR0MsTUFBTTtFQUFBLE9BQ2pDWCxhQUFhLENBQUNXLE1BQU0sQ0FBQyxJQUFJWCxhQUFhLENBQUNXLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDLElBQUlBLE1BQU0sQ0FBQ0MsT0FBTztBQUFBO0FBRXpFLE9BQU8sSUFBTUMsMEJBQTBCLEdBQUc7RUFDeENDLFNBQVMsRUFBRSxJQUFJO0VBQ2ZDLGtCQUFrQixFQUFFLEtBQUs7RUFDekJDLGdCQUFnQixFQUFFLElBQUk7RUFDdEJDLGtCQUFrQixFQUFFO0FBQ3RCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLElBQU1DLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBbUJBLENBQzlCQyxLQUFvQixFQUFBQyxJQUFBLEVBRUY7RUFBQSxJQUFBQyxVQUFBLEVBQUFDLFdBQUEsRUFBQUMsV0FBQTtFQUFBLElBRGpCQyxPQUFPLEdBQUFKLElBQUEsQ0FBUEksT0FBTztFQUVSLElBQU9DLFFBQVEsR0FBa0JELE9BQU8sQ0FBakNDLFFBQVE7SUFBRWQsTUFBTSxHQUFVYSxPQUFPLENBQXZCYixNQUFNO0lBQUVlLElBQUksR0FBSUYsT0FBTyxDQUFmRSxJQUFJO0VBRTdCLElBQU1DLE9BQU8sR0FBQUMsYUFBQSxDQUFBQSxhQUFBLEtBQ1JmLDBCQUEwQixHQUMxQlcsT0FBTyxDQUFDRyxPQUFPLENBQ25COztFQUVEO0VBQ0EsSUFBTUUsb0JBQW9CLEdBQ3hCQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ04sUUFBUSxDQUFDLElBQ3ZCLEVBQUFKLFVBQUEsR0FBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxjQUFBSixVQUFBLHVCQUFYQSxVQUFBLENBQWFLLElBQUksQ0FBQ00sTUFBTSxNQUFLLE9BQU8sTUFBQVYsV0FBQSxHQUNwQ0csUUFBUSxDQUFDLENBQUMsQ0FBQyxjQUFBSCxXQUFBLHVCQUFYQSxXQUFBLENBQWFJLElBQUksQ0FBQ08sRUFBRSxLQUNwQixFQUFBVixXQUFBLEdBQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsY0FBQUYsV0FBQSx1QkFBWEEsV0FBQSxDQUFhRyxJQUFJLENBQUNPLEVBQUUsS0FBSWQsS0FBSyxDQUFDZSxRQUFRLENBQUNULFFBQVE7RUFDakQsSUFBSUksb0JBQW9CLEVBQUU7SUFDeEIsT0FBT2hDLFFBQVEsQ0FBZ0IsQ0FDN0JFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FDZkwsTUFBTSxDQUFnQmQsNEJBQTRCLEVBQUU7TUFDbEQ2QyxRQUFRLEVBQVJBLFFBQVE7TUFDUkUsT0FBTyxFQUFQQSxPQUFPO01BQ1BoQixNQUFNLEVBQU5BO0lBQ0YsQ0FBQyxDQUNILENBQUMsQ0FDRixDQUFDLENBQUNRLEtBQUssQ0FBQztFQUNYOztFQUVBO0VBQ0EsSUFBSWdCLFlBQTBCLEdBQUd4QixNQUFNO0VBRXZDLElBQUlELGFBQWEsQ0FBQ0MsTUFBTSxDQUFDLEVBQUU7SUFDekI7SUFDQTtJQUNBd0IsWUFBWSxHQUFHaEIsS0FBSyxDQUFDZSxRQUFRLENBQUNFLE1BQU0sQ0FBQ0MsZ0JBQWdCLENBQUMxQixNQUFNLENBQUM7RUFDL0Q7RUFDQSxJQUFNMkIsU0FBUyxHQUFHbkIsS0FBSyxDQUFDZSxRQUFRLENBQUNLLE1BQU07RUFDdkMsSUFBTUMsc0JBQXNCLEdBQUcsU0FBekJBLHNCQUFzQkEsQ0FBSUQsTUFBZTtJQUFBLE9BQzdDQSxNQUFNLENBQUNFLE1BQU0sQ0FBQyxVQUFBQyxFQUFFO01BQUEsT0FBSSxDQUFDSixTQUFTLENBQUNLLElBQUksQ0FBQyxVQUFBQyxFQUFFO1FBQUEsT0FBSUEsRUFBRSxLQUFLRixFQUFFO01BQUEsRUFBQztJQUFBLEVBQUM7RUFBQTs7RUFFdkQ7RUFDQSxJQUFNRyx1QkFBdUIsR0FBRyxTQUExQkEsdUJBQXVCQSxDQUFJTixNQUFlLEVBQUs7SUFDbkQsSUFBTU8sTUFBTSxHQUFHbkIsT0FBTyxDQUFDYixTQUFTLElBQUlaLGFBQWEsQ0FBQ3FDLE1BQU0sQ0FBQztJQUN6RCxPQUFPTyxNQUFNLEdBQUdBLE1BQU0sR0FBR0MsU0FBUztFQUNwQyxDQUFDO0VBRUQsT0FBT2xELFFBQVEsQ0FBZ0IsQ0FDN0JFLEtBQUssQ0FBQyxVQUFVLENBQUM7RUFDZjtFQUNBTCxNQUFNLENBQWdCZCw0QkFBNEIsRUFBRTtJQUNsRDZDLFFBQVEsRUFBUkEsUUFBUTtJQUNSRSxPQUFPLEVBQVBBLE9BQU87SUFDUGhCLE1BQU0sRUFBRXdCO0VBQ1YsQ0FBQyxDQUNILENBQUMsRUFFRHZDLEdBQUcsQ0FBQ29ELE9BQU8sQ0FBQ3RCLElBQUksQ0FBQyxFQUFFM0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDTCxNQUFNLENBQWdCYixpQkFBaUIsRUFBRTtJQUFDNkMsSUFBSSxFQUFKQTtFQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDdkY7RUFDQTtFQUNBL0IsS0FBSyxDQUFDLFVBQUFzRCxLQUFBO0lBQUEsSUFBRWYsUUFBUSxHQUFBZSxLQUFBLENBQVJmLFFBQVE7SUFBQSxPQUNkbkMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUNmTCxNQUFNLENBQ0pULHFCQUFxQixFQUNyQlEsUUFBUSxDQUFDO01BQ1BrQixNQUFNLEVBQUV3QixZQUFZO01BQ3BCUixPQUFPLEVBQVBBLE9BQU87TUFDUG1CLE1BQU0sRUFBRUQsdUJBQXVCLENBQUNMLHNCQUFzQixDQUFDTixRQUFRLENBQUNLLE1BQU0sQ0FBQztJQUN6RSxDQUFDLENBQ0gsQ0FDRixDQUFDO0VBQUEsQ0FDSCxDQUFDLEVBQ0R4QyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUNMLE1BQU0sQ0FBQ0gscUJBQXFCLEVBQUVFLFFBQVEsQ0FBQztJQUFDa0IsTUFBTSxFQUFFd0IsWUFBWTtJQUFFUixPQUFPLEVBQVBBO0VBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUMzRjVCLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FDZEwsTUFBTSxDQUFDaEIsOEJBQThCLEVBQUVlLFFBQVEsQ0FBQztJQUFDa0IsTUFBTSxFQUFFd0IsWUFBWTtJQUFFUixPQUFPLEVBQVBBO0VBQU8sQ0FBQyxDQUFDLENBQ2xGLENBQUMsRUFDRDVCLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQ0wsTUFBTSxDQUFDckIsOEJBQThCLEVBQUVvQixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUV4RU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDTCxNQUFNLENBQUN2QixrQkFBa0IsRUFBRXNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQzVETSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQ2RELE1BQU0sQ0FDSm9ELE1BQU0sQ0FBQ0MsU0FBUyxDQUFDQyxjQUFjLENBQUNDLElBQUksQ0FBQzFCLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FDckQ7SUFBQzJCLFFBQVEsRUFBRTNCLE9BQU8sQ0FBQzJCO0VBQVEsQ0FBQyxHQUM1QixDQUFDLENBQ1AsQ0FDRixDQUFDLENBQ0YsQ0FBQyxDQUFDbkMsS0FBSyxDQUFDO0FBQ1gsQ0FBQztBQUVELE9BQU8sSUFBTS9DLHVCQUF1QixHQUFHLFNBQTFCQSx1QkFBdUJBLENBQ2xDK0MsS0FBb0IsRUFDcEJvQyxNQUFxQyxFQUNuQjtFQUNsQjtFQUNBLElBQU1DLFFBQVEsR0FBR2hFLGtCQUFrQixDQUFDK0QsTUFBTSxDQUFDRSxNQUFNLENBQUM7RUFDbEQsSUFBTUMsU0FBUyxHQUFHN0QsUUFBUSxDQUFDLENBQ3pCRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQ2ZELE1BQU0sQ0FBQztJQUNMNkQsV0FBVyxFQUFFLEtBQUs7SUFDbEJDLG1CQUFtQixFQUFFLENBQUM7RUFDeEIsQ0FBQyxDQUNILENBQUMsQ0FDRixDQUFDLENBQUN6QyxLQUFLLENBQUM7RUFDVDtFQUNBLElBQU0wQyxhQUFhLEdBQUdoRSxRQUFRLENBQUMyRCxRQUFRLENBQUNNLEdBQUcsQ0FBQyxVQUFBQyxDQUFDO0lBQUEsT0FBSXJFLE1BQU0sQ0FBQ3dCLG1CQUFtQixFQUFFekIsUUFBUSxDQUFDc0UsQ0FBQyxDQUFDLENBQUM7RUFBQSxFQUFDLENBQUMsQ0FDekZMLFNBQ0YsQ0FBQztFQUNELE9BQU9HLGFBQWE7QUFDdEIsQ0FBQztBQUVELE9BQU8sSUFBTUcsb0JBQW9CLEdBQUc5QyxtQkFBbUI7O0FBRXZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTStDLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBcUJBLENBQUdDLGVBQWU7RUFBQSxPQUFJLFVBQUFoQyxRQUFRLEVBQUk7SUFDM0QsSUFBSUEsUUFBUSxDQUFDZ0MsZUFBZSxLQUFLOUQsaUJBQWlCLENBQUMrRCxNQUFNLENBQUNDLEtBQUssRUFBRTtNQUMvRCxPQUFBeEMsYUFBQSxDQUFBQSxhQUFBLEtBQ0tNLFFBQVE7UUFDWGdDLGVBQWUsRUFBZkE7TUFBZTtJQUVuQjtJQUNBLE9BQU9oQyxRQUFRO0VBQ2pCLENBQUM7QUFBQTs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1tQyx1QkFBdUIsR0FDM0IsU0FESUEsdUJBQXVCQSxDQUMxQkMsa0JBQTJCO0VBQUEsSUFBRUMsT0FBc0IsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQXpCLFNBQUEsR0FBQXlCLFNBQUEsTUFBRyxJQUFJO0VBQUEsT0FDM0QsVUFBQXRDLFFBQVE7SUFBQSxPQUFBTixhQUFBLENBQUFBLGFBQUEsS0FDSE0sUUFBUTtNQUNYSyxNQUFNLEVBQUVMLFFBQVEsQ0FBQ0ssTUFBTSxDQUFDdUIsR0FBRyxDQUFDLFVBQUFZLEtBQUssRUFBSTtRQUNuQyxJQUFJLENBQUNILE9BQU8sSUFBSUcsS0FBSyxDQUFDekMsRUFBRSxLQUFLc0MsT0FBTyxFQUFFO1VBQ3BDLElBQUlyQixNQUFNLENBQUNDLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNxQixLQUFLLENBQUNDLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLEVBQUU7WUFDdkYsSUFBT0MsU0FBUyxHQUFJRixLQUFLLENBQUMvRCxNQUFNLENBQXpCaUUsU0FBUztZQUNoQixPQUFPRixLQUFLLENBQUNHLGlCQUFpQixDQUFDO2NBQzdCRCxTQUFTLEVBQUFoRCxhQUFBLENBQUFBLGFBQUEsS0FBTWdELFNBQVM7Z0JBQUVOLGtCQUFrQixFQUFsQkE7Y0FBa0I7WUFDOUMsQ0FBQyxDQUFDO1VBQ0o7UUFDRjtRQUNBLE9BQU9JLEtBQUs7TUFDZCxDQUFDO0lBQUM7RUFBQSxDQUNGO0FBQUE7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sSUFBTUksNkJBQTZCLEdBQUcsU0FBaENBLDZCQUE2QkEsQ0FDeEMzRCxLQUFvQixFQUNwQm9DLE1BQW1DLEVBQ2pCO0VBQUEsSUFBQXdCLGVBQUE7RUFDbEIsSUFBT3ZELE9BQU8sR0FBSStCLE1BQU0sQ0FBakIvQixPQUFPO0VBQ2QsSUFBT3dELFFBQVEsR0FBSTdELEtBQUssQ0FBakI2RCxRQUFRO0VBQ2YsSUFBTUMsWUFBWSxHQUFHLFNBQWZBLFlBQVlBLENBQUdDLEdBQUc7SUFBQSxJQUFBQyxxQkFBQTtJQUFBLFFBQUFBLHFCQUFBLEdBQUlILFFBQVEsQ0FBQ0ksU0FBUyxDQUFDRixHQUFHLENBQUMsY0FBQUMscUJBQUEsdUJBQXZCQSxxQkFBQSxDQUF5QkUsU0FBUztFQUFBO0VBQzlELElBQU1DLGFBQWEsR0FBR0wsWUFBWSxDQUFDRCxRQUFRLENBQUNPLFNBQVMsQ0FBQztFQUN0RCxJQUFNQyxhQUFhLEdBQUdQLFlBQVksQ0FBQ3pELE9BQU8sQ0FBQytELFNBQVMsQ0FBQztFQUNyRCxJQUFLckQsUUFBUSxHQUFjZixLQUFLLENBQTNCZSxRQUFRO0lBQUV1RCxRQUFRLEdBQUl0RSxLQUFLLENBQWpCc0UsUUFBUTtFQUN2QixJQUFJRCxhQUFhLEtBQUtGLGFBQWEsRUFBRTtJQUNuQyxRQUFRRSxhQUFhO01BQ25CLEtBQUtyRixvQkFBb0IsQ0FBQ3VGLElBQUk7UUFDNUJ4RCxRQUFRLEdBQUdyQyxRQUFRLENBQUMsQ0FDbEJvRSxxQkFBcUIsQ0FBQzdELGlCQUFpQixDQUFDdUYsTUFBTSxDQUFDdkIsS0FBSyxDQUFDLEVBQ3JEQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FDOUIsQ0FBQyxDQUFDbkMsUUFBUSxDQUFDO1FBQ1o7TUFDRixLQUFLL0Isb0JBQW9CLENBQUN5RixLQUFLO1FBQzdCMUQsUUFBUSxHQUFHckMsUUFBUSxDQUFDLENBQ2xCb0UscUJBQXFCLENBQUM3RCxpQkFBaUIsQ0FBQ3lGLE1BQU0sQ0FBQ3pCLEtBQUssQ0FBQyxFQUNyREMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQy9CLENBQUMsQ0FBQ25DLFFBQVEsQ0FBQztRQUNaO01BQ0Y7TUFDQTtJQUNGO0VBQ0Y7O0VBRUE7RUFDQSxLQUFBNkMsZUFBQSxHQUFJVSxRQUFRLENBQUNLLEtBQUssY0FBQWYsZUFBQSxlQUFkQSxlQUFBLENBQWdCZ0IsT0FBTyxFQUFFO0lBQzNCO0lBQ0EsSUFBSXZFLE9BQU8sQ0FBQytELFNBQVMsS0FBS2xGLFNBQVMsSUFBSTJFLFFBQVEsQ0FBQ08sU0FBUyxLQUFLbEYsU0FBUyxFQUFFO01BQ3ZFb0YsUUFBUSxHQUFBN0QsYUFBQSxDQUFBQSxhQUFBLEtBQ0g2RCxRQUFRO1FBQ1hLLEtBQUssRUFBQWxFLGFBQUEsQ0FBQUEsYUFBQSxLQUNBNkQsUUFBUSxDQUFDSyxLQUFLO1VBQ2pCbkYsTUFBTSxFQUFBaUIsYUFBQSxDQUFBQSxhQUFBLEtBQ0Q2RCxRQUFRLENBQUNLLEtBQUssQ0FBQ25GLE1BQU07WUFDeEJxRixPQUFPLEVBQUUsSUFBSTtZQUNiQyxNQUFNLEVBQUUsSUFBSTtZQUNaQyxVQUFVLEVBQUUsSUFBSTtZQUNoQkMsS0FBSyxFQUFFO1VBQUk7UUFDWjtNQUNGLEVBQ0Y7SUFDSDtJQUNBVixRQUFRLEdBQUdXLDRCQUE0QixDQUFDWCxRQUFRLEVBQUVULFFBQVEsRUFBRXhELE9BQU8sQ0FBQytELFNBQVMsQ0FBQztFQUNoRjtFQUVBLE9BQUEzRCxhQUFBLENBQUFBLGFBQUEsS0FDS1QsS0FBSztJQUNSZSxRQUFRLEVBQVJBLFFBQVE7SUFDUnVELFFBQVEsRUFBUkEsUUFBUTtJQUNSVCxRQUFRLEVBQUUxRixxQkFBcUIsQ0FBQzBGLFFBQVEsRUFBRTtNQUFDeEQsT0FBTyxFQUFBSSxhQUFBLEtBQU1KLE9BQU87SUFBQyxDQUFDO0VBQUM7QUFFdEUsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQVM0RSw0QkFBNEJBLENBQzFDWCxRQUFrQixFQUNsQlQsUUFBa0IsRUFDbEJPLFNBQWlCLEVBQ1A7RUFBQSxJQUFBYyxnQkFBQTtFQUNWLElBQUksR0FBQUEsZ0JBQUEsR0FBQ1osUUFBUSxDQUFDSyxLQUFLLGNBQUFPLGdCQUFBLGVBQWRBLGdCQUFBLENBQWdCTixPQUFPLEdBQUU7SUFDNUIsT0FBT04sUUFBUTtFQUNqQjtFQUVBLElBQU1hLFlBQVksR0FBR3RCLFFBQVEsQ0FBQ0ksU0FBUyxDQUFDRyxTQUFTLENBQUM7RUFDbEQsSUFBTWdCLGVBQWUsR0FBQTNFLGFBQUEsS0FBTzZELFFBQVEsQ0FBQ0ssS0FBSyxDQUFDbkYsTUFBTSxDQUFDO0VBRWxELElBQUk0RSxTQUFTLEtBQUtsRixTQUFTLEVBQUU7SUFDM0JrRyxlQUFlLENBQUNQLE9BQU8sR0FBRyxLQUFLO0lBQy9CTyxlQUFlLENBQUNOLE1BQU0sR0FBRyxLQUFLO0lBQzlCTSxlQUFlLENBQUNMLFVBQVUsR0FBRyxLQUFLO0lBQ2xDSyxlQUFlLENBQUNKLEtBQUssR0FBRyxLQUFLO0lBQzdCSSxlQUFlLENBQUNDLFlBQVksR0FBR2hHLHFCQUFxQixDQUFDaUcsbUJBQW1CO0lBQ3hFRixlQUFlLENBQUNHLFVBQVUsR0FBR2xHLHFCQUFxQixDQUFDbUcscUJBQXFCO0lBQ3hFSixlQUFlLENBQUNLLGVBQWUsR0FBR3BHLHFCQUFxQixDQUFDcUcscUJBQXFCO0VBQy9FLENBQUMsTUFBTTtJQUNMLElBQU1DLGFBQWEsR0FBR1IsWUFBWSxHQUM5Qi9GLHdCQUF3QixDQUFDZ0YsU0FBUyxFQUFFO01BQ2xDd0IsS0FBSyxFQUFFVCxZQUFZLENBQUNTLEtBQUs7TUFDekJDLFdBQVcsRUFBRVYsWUFBWSxDQUFDVTtJQUM1QixDQUFDLENBQUM7SUFDRjtJQUNBekcsd0JBQXdCLENBQUNnRixTQUFTLENBQUM7SUFDdkNnQixlQUFlLENBQUNDLFlBQVksR0FBR00sYUFBYSxDQUFDTCxtQkFBbUI7SUFDaEVGLGVBQWUsQ0FBQ0csVUFBVSxHQUFHSSxhQUFhLENBQUNILHFCQUFxQjtJQUNoRUosZUFBZSxDQUFDSyxlQUFlLEdBQUdFLGFBQWEsQ0FBQ0QscUJBQXFCO0VBQ3ZFO0VBRUEsT0FBQWpGLGFBQUEsQ0FBQUEsYUFBQSxLQUNLNkQsUUFBUTtJQUNYSyxLQUFLLEVBQUFsRSxhQUFBLENBQUFBLGFBQUEsS0FDQTZELFFBQVEsQ0FBQ0ssS0FBSztNQUNqQm5GLE1BQU0sRUFBRTRGO0lBQWU7RUFDeEI7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxJQUFNVSw2QkFBNkIsR0FBRyxTQUFoQ0EsNkJBQTZCQSxDQUN4QzlGLEtBQW9CLEVBQ3BCb0MsTUFBbUQsRUFDakM7RUFBQSxJQUFBMkQsZ0JBQUE7RUFDbEIsSUFBSXpCLFFBQVEsR0FBR3BHLHFCQUFxQixDQUFDOEIsS0FBSyxDQUFDc0UsUUFBUSxFQUFFbEMsTUFBTSxDQUFDO0VBRTVELEtBQUEyRCxnQkFBQSxHQUFJekIsUUFBUSxDQUFDSyxLQUFLLGNBQUFvQixnQkFBQSxlQUFkQSxnQkFBQSxDQUFnQm5CLE9BQU8sRUFBRTtJQUMzQk4sUUFBUSxHQUFHVyw0QkFBNEIsQ0FBQ1gsUUFBUSxFQUFFdEUsS0FBSyxDQUFDNkQsUUFBUSxFQUFFN0QsS0FBSyxDQUFDNkQsUUFBUSxDQUFDTyxTQUFTLENBQUM7RUFDN0Y7RUFFQSxPQUFBM0QsYUFBQSxDQUFBQSxhQUFBLEtBQ0tULEtBQUs7SUFDUnNFLFFBQVEsRUFBUkE7RUFBUTtBQUVaLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sSUFBTTBCLDhCQUE4QixHQUFHLFNBQWpDQSw4QkFBOEJBLENBQ3pDaEcsS0FBb0IsRUFDcEJvQyxNQUFvQyxFQUNsQjtFQUNsQixJQUFLckIsUUFBUSxHQUFJZixLQUFLLENBQWpCZSxRQUFRO0VBQ2IsSUFBTWtGLGFBQWEsR0FBR2xGLFFBQVEsQ0FBQ0ssTUFBTSxDQUFDOEUsU0FBUyxDQUFDLFVBQUEzQyxLQUFLO0lBQUEsT0FBSUEsS0FBSyxLQUFLbkIsTUFBTSxDQUFDK0QsUUFBUTtFQUFBLEVBQUM7RUFDbkZwRixRQUFRLEdBQUdwRCxzQkFBc0IsQ0FBQ29ELFFBQVEsRUFBRXFCLE1BQU0sQ0FBQztFQUNuRCxJQUFNZ0UsUUFBUSxHQUFHckYsUUFBUSxDQUFDSyxNQUFNLENBQUM2RSxhQUFhLENBQUM7RUFDL0MsSUFBSWxFLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDQyxjQUFjLENBQUNDLElBQUksQ0FBQ2tFLFFBQVEsYUFBUkEsUUFBUSx1QkFBUkEsUUFBUSxDQUFFNUMsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsRUFBRTtJQUMzRixJQUFPSyxRQUFRLEdBQUk3RCxLQUFLLENBQWpCNkQsUUFBUTtJQUNmLElBQU9LLFNBQVMsR0FBSUwsUUFBUSxDQUFDSSxTQUFTLENBQUNKLFFBQVEsQ0FBQ08sU0FBUyxDQUFDLENBQW5ERixTQUFTO0lBQ2hCLElBQU9mLGtCQUFrQixHQUFJaUQsUUFBUSxDQUFDNUcsTUFBTSxDQUFDaUUsU0FBUyxDQUEvQ04sa0JBQWtCO0lBQ3pCLFFBQVFlLFNBQVM7TUFDZixLQUFLbEYsb0JBQW9CLENBQUN1RixJQUFJO1FBQzVCLElBQUksQ0FBQ3BCLGtCQUFrQixFQUFFO1VBQ3ZCcEMsUUFBUSxHQUFHbUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFa0QsUUFBUSxDQUFDdEYsRUFBRSxDQUFDLENBQUNDLFFBQVEsQ0FBQztRQUNqRTtRQUNBO01BQ0YsS0FBSy9CLG9CQUFvQixDQUFDeUYsS0FBSztRQUM3QixJQUFJdEIsa0JBQWtCLEVBQUU7VUFDdEJwQyxRQUFRLEdBQUdtQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUVrRCxRQUFRLENBQUN0RixFQUFFLENBQUMsQ0FBQ0MsUUFBUSxDQUFDO1FBQ2xFO1FBQ0E7TUFDRjtNQUNBO0lBQ0Y7RUFDRjtFQUNBLE9BQUFOLGFBQUEsQ0FBQUEsYUFBQSxLQUNLVCxLQUFLO0lBQ1JlLFFBQVEsRUFBUkE7RUFBUTtBQUVaLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsT0FBTyxJQUFNM0QscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUFxQkEsQ0FDaEM0QyxLQUFvQixFQUNwQm9DLE1BQW1DLEVBQ2pCO0VBQUEsSUFBQWlFLHFCQUFBO0VBQ2xCLElBQU1DLFFBQVEsR0FBQTdGLGFBQUEsQ0FBQUEsYUFBQSxLQUNUVCxLQUFLO0lBQ1JlLFFBQVEsRUFBRW5ELDZCQUE2QixDQUFDb0MsS0FBSyxDQUFDZSxRQUFRLEVBQUVxQixNQUFNLENBQUM7SUFDL0RtRSxPQUFPLEVBQUVsSiw0QkFBNEIsQ0FBQzJDLEtBQUssQ0FBQ3VHLE9BQU8sQ0FBQztJQUNwRGpDLFFBQVEsRUFBRXZHLDZCQUE2QixDQUFDaUMsS0FBSyxDQUFDc0UsUUFBUTtFQUFDLEVBQ3hEO0VBRUQsSUFBTWtDLE9BQU8sR0FBR0YsUUFBUSxDQUFDdkYsUUFBUSxDQUFDMEYsU0FBUyxDQUFDbkQsTUFBTSxLQUFLLENBQUM7RUFDeEQsSUFBTW9ELGNBQWMsSUFBQUwscUJBQUEsR0FBR0MsUUFBUSxDQUFDQyxPQUFPLENBQUNJLFdBQVcsY0FBQU4scUJBQUEsZ0JBQUFBLHFCQUFBLEdBQTVCQSxxQkFBQSxDQUE4Qk8sU0FBUyxjQUFBUCxxQkFBQSx1QkFBdkNBLHFCQUFBLENBQXlDUSxNQUFNO0VBQ3RFLElBQUlMLE9BQU8sSUFBSSxDQUFDRSxjQUFjLEVBQUU7SUFDOUJKLFFBQVEsQ0FBQ0MsT0FBTyxHQUFHcEosdUJBQXVCLENBQUNtSixRQUFRLENBQUNDLE9BQU8sRUFBRTtNQUMzRGxHLE9BQU8sRUFBRTtRQUFDeUcsT0FBTyxFQUFFLFdBQVc7UUFBRUMsS0FBSyxFQUFFM0UsTUFBTSxDQUFDL0I7TUFBTztJQUN2RCxDQUFDLENBQUM7RUFDSjtFQUVBLE9BQU9pRyxRQUFRO0FBQ2pCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsT0FBTyxJQUFNdEksc0JBQXNCLEdBQUcsU0FBekJBLHNCQUFzQkEsQ0FDakNnQyxLQUFvQixFQUNwQm9DLE1BQW9ELEVBQ2xDO0VBQUEsSUFBQTRFLHFCQUFBO0VBQ2xCLElBQU9DLFlBQVksR0FBSTdFLE1BQU0sQ0FBQy9CLE9BQU8sQ0FBOUI0RyxZQUFZO0VBQ25CLElBQU1DLFFBQVEsR0FBR2xILEtBQUssQ0FBQ3NFLFFBQVEsQ0FBQzJDLFlBQVk7RUFFNUMsSUFBSUEsWUFBWSxLQUFLQyxRQUFRLEVBQUU7SUFDN0IsT0FBT2xILEtBQUs7RUFDZDtFQUVBLElBQU1tSCxXQUFXLEdBQUdsSiw4QkFBOEIsQ0FBQytCLEtBQUssQ0FBQ3NFLFFBQVEsRUFBRWxDLE1BQU0sQ0FBQztFQUUxRSxJQUFJZ0YsV0FBVyxHQUFBM0csYUFBQSxLQUFPVCxLQUFLLENBQUNlLFFBQVEsQ0FBQztFQUVyQyxRQUFRa0csWUFBWTtJQUNsQixLQUFLOUgsWUFBWSxDQUFDa0ksVUFBVTtNQUMxQkQsV0FBVyxHQUFBM0csYUFBQSxDQUFBQSxhQUFBLEtBQ04yRyxXQUFXO1FBQ2RYLFNBQVMsRUFBRTtNQUFFLEVBQ2Q7TUFDRDtJQUNGLEtBQUt0SCxZQUFZLENBQUNtSSxRQUFRO0lBQzFCLEtBQUtuSSxZQUFZLENBQUNvSSxhQUFhO01BQzdCLElBQUlMLFFBQVEsS0FBSy9ILFlBQVksQ0FBQ2tJLFVBQVUsRUFBRTtRQUN4Q0QsV0FBVyxHQUFBM0csYUFBQSxDQUFBQSxhQUFBLEtBQ04yRyxXQUFXO1VBQ2RYLFNBQVMsRUFBRTNILHFCQUFxQixDQUFDc0ksV0FBVyxDQUFDaEcsTUFBTSxFQUFFO1lBQ25Eb0csU0FBUyxFQUFFUCxZQUFZLEtBQUs5SCxZQUFZLENBQUNvSTtVQUMzQyxDQUFDO1FBQUMsRUFDSDtNQUNIO01BQ0E7SUFDRjtNQUNFO0VBQ0o7RUFFQSxJQUFJRSxVQUFVLEdBQUdwSyw0QkFBNEIsQ0FBQzJDLEtBQUssQ0FBQ3VHLE9BQU8sQ0FBQztFQUU1RCxJQUFNQyxPQUFPLEdBQUdZLFdBQVcsQ0FBQ1gsU0FBUyxDQUFDbkQsTUFBTSxLQUFLLENBQUM7RUFDbEQsSUFBTW9ELGNBQWMsSUFBQU0scUJBQUEsR0FBR1MsVUFBVSxDQUFDZCxXQUFXLGNBQUFLLHFCQUFBLGdCQUFBQSxxQkFBQSxHQUF0QkEscUJBQUEsQ0FBd0JKLFNBQVMsY0FBQUkscUJBQUEsdUJBQWpDQSxxQkFBQSxDQUFtQ0gsTUFBTTtFQUNoRSxJQUFJTCxPQUFPLElBQUksQ0FBQ0UsY0FBYyxFQUFFO0lBQzlCZSxVQUFVLEdBQUd0Syx1QkFBdUIsQ0FBQ3NLLFVBQVUsRUFBRTtNQUMvQ3BILE9BQU8sRUFBRTtRQUFDeUcsT0FBTyxFQUFFLFdBQVc7UUFBRUMsS0FBSyxFQUFFO01BQUM7SUFDMUMsQ0FBQyxDQUFDO0VBQ0o7RUFFQSxPQUFBdEcsYUFBQSxDQUFBQSxhQUFBLEtBQ0tULEtBQUs7SUFDUnNFLFFBQVEsRUFBRTZDLFdBQVc7SUFDckJwRyxRQUFRLEVBQUVxRyxXQUFXO0lBQ3JCYixPQUFPLEVBQUVrQjtFQUFVO0FBRXZCLENBQUM7QUFFRCxJQUFNQyw4QkFBOEIsR0FBRztFQUNyQzlILGtCQUFrQixFQUFFLElBQUk7RUFDeEJELFNBQVMsRUFBRSxJQUFJO0VBQ2ZFLGdCQUFnQixFQUFFO0FBQ3BCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsT0FBTyxJQUFNOEgsdUJBQXVCLEdBQUcsU0FBMUJBLHVCQUF1QkEsQ0FDbEMzSCxLQUFvQixFQUFBNEgsS0FBQSxFQUVGO0VBQUEsSUFEakJ2SCxPQUFPLEdBQUF1SCxLQUFBLENBQVB2SCxPQUFPO0VBRVIsSUFBT3dILGtCQUFrQixHQUFnQ3hILE9BQU8sQ0FBekR3SCxrQkFBa0I7SUFBRUMsWUFBWSxHQUFrQnpILE9BQU8sQ0FBckN5SCxZQUFZO0lBQUFDLGdCQUFBLEdBQWtCMUgsT0FBTyxDQUF2QkcsT0FBTztJQUFQQSxPQUFPLEdBQUF1SCxnQkFBQSxjQUFHLENBQUMsQ0FBQyxHQUFBQSxnQkFBQTtFQUNyRCxJQUFNQyxtQkFBbUIsR0FBQXZILGFBQUEsQ0FBQUEsYUFBQSxLQUFPaUgsOEJBQThCLEdBQUtsSCxPQUFPLENBQUM7O0VBRTNFO0VBQ0EsSUFBSSxDQUFDUixLQUFLLENBQUNlLFFBQVEsQ0FBQ1QsUUFBUSxDQUFDdUgsa0JBQWtCLENBQUMsRUFBRTtJQUNoRCxPQUFPN0gsS0FBSztFQUNkO0VBQ0E7RUFDQSxJQUFNaUksV0FBVyxHQUFHSCxZQUFZLENBQUN2SCxJQUFJLENBQUNPLEVBQUU7RUFDeEMsSUFBSSxDQUFDbUgsV0FBVyxFQUFFO0lBQ2hCLE9BQU9qSSxLQUFLO0VBQ2Q7RUFDQTtFQUNBLElBQU1rSSxhQUFhLEdBQUF6SCxhQUFBLENBQUFBLGFBQUEsS0FDZFQsS0FBSztJQUNSZSxRQUFRLEVBQUVsRCw2QkFBNkIsQ0FBQ21DLEtBQUssQ0FBQ2UsUUFBUSxFQUFFOEcsa0JBQWtCLEVBQUVJLFdBQVc7RUFBQyxFQUN6RjtFQUVELElBQU0xRixTQUFTLEdBQUd4QyxtQkFBbUIsQ0FDbkNtSSxhQUFhLEVBQ2I1SixRQUFRLENBQUM7SUFDUGdDLFFBQVEsRUFBRXdILFlBQVk7SUFDdEI7SUFDQXRILE9BQU8sRUFBRXdIO0VBQ1gsQ0FBQyxDQUNILENBQUM7RUFFRCxPQUFPekYsU0FBUztBQUNsQixDQUFDIiwiaWdub3JlTGlzdCI6W119