@kepler.gl/reducers 3.0.0-alpha.0 → 3.0.0-alpha.2

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 (42) hide show
  1. package/dist/combined-updaters.d.ts +30 -1
  2. package/dist/combined-updaters.js +235 -24
  3. package/dist/composer-helpers.d.ts +7 -4
  4. package/dist/composer-helpers.js +17 -28
  5. package/dist/composers.d.ts +6 -0
  6. package/dist/composers.js +2 -22
  7. package/dist/core.d.ts +1 -1
  8. package/dist/core.js +15 -25
  9. package/dist/data-utils.js +5 -23
  10. package/dist/export-utils.js +1 -21
  11. package/dist/index.d.ts +2 -3
  12. package/dist/index.js +36 -35
  13. package/dist/interaction-utils.d.ts +1 -5
  14. package/dist/interaction-utils.js +11 -31
  15. package/dist/layer-utils.d.ts +39 -10
  16. package/dist/layer-utils.js +112 -57
  17. package/dist/map-state-updaters.d.ts +33 -2
  18. package/dist/map-state-updaters.js +277 -38
  19. package/dist/map-state.d.ts +74 -2
  20. package/dist/map-state.js +2 -22
  21. package/dist/map-style-updaters.d.ts +30 -17
  22. package/dist/map-style-updaters.js +303 -104
  23. package/dist/map-style.js +2 -22
  24. package/dist/merger-handler.d.ts +10 -0
  25. package/dist/merger-handler.js +123 -0
  26. package/dist/middleware.js +6 -22
  27. package/dist/provider-state-updaters.d.ts +0 -7
  28. package/dist/provider-state-updaters.js +2 -92
  29. package/dist/provider-state.js +2 -22
  30. package/dist/root.d.ts +1 -8
  31. package/dist/root.js +24 -30
  32. package/dist/ui-state-updaters.d.ts +9 -2
  33. package/dist/ui-state-updaters.js +87 -82
  34. package/dist/ui-state.js +2 -22
  35. package/dist/vis-state-merger.d.ts +51 -13
  36. package/dist/vis-state-merger.js +411 -131
  37. package/dist/vis-state-selectors.js +8 -24
  38. package/dist/vis-state-updaters.d.ts +136 -10
  39. package/dist/vis-state-updaters.js +965 -283
  40. package/dist/vis-state.d.ts +210 -2
  41. package/dist/vis-state.js +2 -22
  42. package/package.json +23 -20
@@ -1,23 +1,3 @@
1
- // Copyright (c) 2022 Uber Technologies, Inc.
2
- //
3
- // Permission is hereby granted, free of charge, to any person obtaining a copy
4
- // of this software and associated documentation files (the "Software"), to deal
5
- // in the Software without restriction, including without limitation the rights
6
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- // copies of the Software, and to permit persons to whom the Software is
8
- // furnished to do so, subject to the following conditions:
9
- //
10
- // The above copyright notice and this permission notice shall be included in
11
- // all copies or substantial portions of the Software.
12
- //
13
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- // THE SOFTWARE.
20
-
21
1
  "use strict";
22
2
 
23
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
@@ -26,10 +6,25 @@ Object.defineProperty(exports, "__esModule", {
26
6
  value: true
27
7
  });
28
8
  exports.getMapDimForSplitMap = getMapDimForSplitMap;
29
- exports.toggleSplitMapUpdater = exports.receiveMapConfigUpdater = exports.resetMapConfigUpdater = exports.togglePerspectiveUpdater = exports.fitBoundsUpdater = exports.updateMapUpdater = exports.INITIAL_MAP_STATE = void 0;
9
+ exports.pickViewportPropsFromMapState = pickViewportPropsFromMapState;
10
+ exports.toggleSplitMapViewportUpdater = exports.toggleSplitMapUpdater = exports.receiveMapConfigUpdater = exports.resetMapConfigUpdater = exports.togglePerspectiveUpdater = exports.fitBoundsUpdater = exports.updateMapUpdater = exports.INITIAL_MAP_STATE = void 0;
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
30
13
 
31
14
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
32
15
 
16
+ var _geoViewport = _interopRequireDefault(require("@mapbox/geo-viewport"));
17
+
18
+ var _booleanWithin = _interopRequireDefault(require("@turf/boolean-within"));
19
+
20
+ var _bboxPolygon = _interopRequireDefault(require("@turf/bbox-polygon"));
21
+
22
+ var _webMercator = require("@math.gl/web-mercator");
23
+
24
+ var _deepmerge = _interopRequireDefault(require("deepmerge"));
25
+
26
+ var _lodash = _interopRequireDefault(require("lodash.pick"));
27
+
33
28
  var _utils = require("@kepler.gl/utils");
34
29
 
35
30
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
@@ -89,7 +84,13 @@ var mapStateUpdaters = null;
89
84
  * @property dragRotate Default: `false`
90
85
  * @property width Default: `800`
91
86
  * @property height Default: `800`
92
- * @property isSplit Default: `false`
87
+ * @property minZoom: `undefined`,
88
+ * @property maxZoom: `undefined`,
89
+ * @property maxBounds: `undefined`,
90
+ * @property isSplit: `false`,
91
+ * @property isViewportSynced: `true`,
92
+ * @property isZoomLocked: `false`,
93
+ * @property splitMapViewports: `[]`
93
94
  * @public
94
95
  */
95
96
 
@@ -102,7 +103,13 @@ var INITIAL_MAP_STATE = {
102
103
  dragRotate: false,
103
104
  width: 800,
104
105
  height: 800,
105
- isSplit: false
106
+ minZoom: undefined,
107
+ maxZoom: undefined,
108
+ maxBounds: undefined,
109
+ isSplit: false,
110
+ isViewportSynced: true,
111
+ isZoomLocked: false,
112
+ splitMapViewports: []
106
113
  };
107
114
  /* Updaters */
108
115
 
@@ -115,7 +122,50 @@ var INITIAL_MAP_STATE = {
115
122
  exports.INITIAL_MAP_STATE = INITIAL_MAP_STATE;
116
123
 
117
124
  var updateMapUpdater = function updateMapUpdater(state, action) {
118
- return _objectSpread(_objectSpread({}, state), action.payload || {});
125
+ var _action$payload = action.payload,
126
+ viewport = _action$payload.viewport,
127
+ _action$payload$mapIn = _action$payload.mapIndex,
128
+ mapIndex = _action$payload$mapIn === void 0 ? 0 : _action$payload$mapIn;
129
+
130
+ if (state.isViewportSynced) {
131
+ // The `updateViewport` function is typed as (Viewport, Viewport) -> Viewport but here the
132
+ // expected typing is (MapState, Viewport) -> MapState.
133
+ // this could be a potential bug as we treat Viewport and MapState as equal seemingly
134
+ // @ts-expect-error Type 'Viewport' is missing the following properties from type 'MapState': isSplit, isViewportSynced, isZoomLocked, splitMapViewports
135
+ return updateViewport(state, viewport);
136
+ }
137
+
138
+ var otherViewportMapIndex = -1;
139
+ var splitMapViewports = state.splitMapViewports.map(function (currentViewport, i) {
140
+ if (i === mapIndex) {
141
+ // update the matching viewport with the newViewport info in the action payload
142
+ return updateViewport(currentViewport, viewport);
143
+ }
144
+
145
+ otherViewportMapIndex = i; // make no changes to the other viewport (yet)
146
+
147
+ return currentViewport;
148
+ }); // make conditional updates to the other viewport not matching this payload's `mapIndex`
149
+
150
+ if (Number.isFinite(otherViewportMapIndex) && otherViewportMapIndex > -1) {
151
+ // width and height are a special case and are always updated
152
+ splitMapViewports[otherViewportMapIndex] = _objectSpread(_objectSpread({}, splitMapViewports[otherViewportMapIndex]), {}, {
153
+ width: splitMapViewports[mapIndex].width,
154
+ height: splitMapViewports[mapIndex].height
155
+ });
156
+
157
+ if (state.isZoomLocked) {
158
+ // update the other viewport with the new zoom from the split viewport that was updated with this payload's `mapIndex`
159
+ splitMapViewports[otherViewportMapIndex] = _objectSpread(_objectSpread({}, splitMapViewports[otherViewportMapIndex]), {}, {
160
+ zoom: splitMapViewports[mapIndex].zoom
161
+ });
162
+ }
163
+ }
164
+
165
+ return _objectSpread(_objectSpread(_objectSpread({}, state), splitMapViewports[mapIndex]), {}, {
166
+ // update the mapState with the new array of split viewports
167
+ splitMapViewports: splitMapViewports
168
+ });
119
169
  };
120
170
  /**
121
171
  * Fit map viewport to bounds
@@ -137,12 +187,26 @@ var fitBoundsUpdater = function fitBoundsUpdater(state, action) {
137
187
  return state;
138
188
  }
139
189
 
140
- return _objectSpread(_objectSpread({}, state), {}, {
190
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
141
191
  latitude: centerAndZoom.center[1],
142
192
  longitude: centerAndZoom.center[0]
143
193
  }, Number.isFinite(centerAndZoom.zoom) ? {
144
194
  zoom: centerAndZoom.zoom
145
- } : {});
195
+ } : {}); // if fitting to bounds while split and unsynced
196
+ // copy the new latitude, longitude, and zoom values to each split viewport
197
+
198
+
199
+ if (newState.splitMapViewports.length) {
200
+ newState.splitMapViewports = newState.splitMapViewports.map(function (currentViewport) {
201
+ return _objectSpread(_objectSpread({}, currentViewport), {}, {
202
+ latitude: newState.latitude,
203
+ longitude: newState.longitude,
204
+ zoom: newState.zoom
205
+ });
206
+ });
207
+ }
208
+
209
+ return newState;
146
210
  };
147
211
  /**
148
212
  * Toggle between 3d and 2d map.
@@ -154,12 +218,26 @@ var fitBoundsUpdater = function fitBoundsUpdater(state, action) {
154
218
  exports.fitBoundsUpdater = fitBoundsUpdater;
155
219
 
156
220
  var togglePerspectiveUpdater = function togglePerspectiveUpdater(state, action) {
157
- return _objectSpread(_objectSpread(_objectSpread({}, state), {
221
+ var newState = _objectSpread(_objectSpread(_objectSpread({}, state), {
158
222
  pitch: state.dragRotate ? 0 : 50,
159
223
  bearing: state.dragRotate ? 0 : 24
160
224
  }), {}, {
161
225
  dragRotate: !state.dragRotate
162
- });
226
+ }); // if toggling 3d and 2d while split and unsynced
227
+ // copy the new pitch, bearing, and dragRotate values to each split viewport
228
+
229
+
230
+ if (newState.splitMapViewports.length) {
231
+ newState.splitMapViewports = newState.splitMapViewports.map(function (currentViewport) {
232
+ return _objectSpread(_objectSpread({}, currentViewport), {}, {
233
+ pitch: newState.pitch,
234
+ bearing: newState.bearing,
235
+ dragRotate: newState.dragRotate
236
+ });
237
+ });
238
+ }
239
+
240
+ return newState;
163
241
  };
164
242
  /**
165
243
  * reset mapState to initial State
@@ -194,14 +272,22 @@ var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref) {
194
272
  _ref$payload$bounds = _ref$payload.bounds,
195
273
  bounds = _ref$payload$bounds === void 0 ? null : _ref$payload$bounds;
196
274
 
197
- var _ref2 = config || {},
198
- mapState = _ref2.mapState; // merged received mapstate with previous state
199
-
200
-
201
- var mergedState = _objectSpread(_objectSpread({}, state), mapState); // if center map
275
+ /**
276
+ * @type {Partial<MapState>}
277
+ */
278
+ var mapState = (config || {}).mapState || {}; // merged received mapState with previous state
279
+ // state also may include properties that are new to an existing, saved project's mapState
280
+
281
+ var mergedState = (0, _deepmerge["default"])(state, mapState, {
282
+ // note: deepmerge by default will merge arrays by concatenating them
283
+ // but we need to overwrite destination arrays with source arrays, if present
284
+ // https://github.com/TehShrike/deepmerge#arraymerge-example-overwrite-target-array
285
+ arrayMerge: function arrayMerge(_destinationArray, sourceArray) {
286
+ return sourceArray;
287
+ }
288
+ }); // if center map
202
289
  // center map will override mapState config
203
290
 
204
-
205
291
  if (options.centerMap && bounds) {
206
292
  mergedState = fitBoundsUpdater(mergedState, {
207
293
  payload: bounds
@@ -220,14 +306,79 @@ var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref) {
220
306
  exports.receiveMapConfigUpdater = receiveMapConfigUpdater;
221
307
 
222
308
  var toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
223
- return _objectSpread(_objectSpread({}, state), {}, {
309
+ return _objectSpread(_objectSpread(_objectSpread({}, state), getMapDimForSplitMap(!state.isSplit, state)), {}, {
224
310
  isSplit: !state.isSplit
225
- }, getMapDimForSplitMap(!state.isSplit, state));
226
- }; // Helpers
311
+ }, !state.isSplit === false ? {
312
+ // if toggling to no longer split (single mode) then reset a few properties
313
+ isViewportSynced: true,
314
+ isZoomLocked: false,
315
+ splitMapViewports: []
316
+ } : {});
317
+ };
318
+ /**
319
+ * Toggle between locked and unlocked split viewports
320
+ * @memberof mapStateUpdaters
321
+ * @public
322
+ */
227
323
 
228
324
 
229
325
  exports.toggleSplitMapUpdater = toggleSplitMapUpdater;
230
326
 
327
+ var toggleSplitMapViewportUpdater = function toggleSplitMapViewportUpdater(state, action) {
328
+ // new map state immediately gets the new, optional payload values for isViewportSynced and/or isZoomLocked
329
+ var newMapState = _objectSpread(_objectSpread({}, state), action.payload || {});
330
+
331
+ if (newMapState.isViewportSynced) {
332
+ // switching from unsynced to synced viewports
333
+ newMapState.splitMapViewports = [];
334
+ } else {
335
+ // switching from synced to unsynced viewports
336
+ // or already in unsynced mode and toggling locked zoom
337
+ if (state.isZoomLocked && !newMapState.isZoomLocked) {
338
+ // switching off locked zoom while unsynced
339
+ // don't copy the mapStates to left and right viewports because there will be zoom "jumping"
340
+ return newMapState;
341
+ }
342
+
343
+ if (!state.isZoomLocked && newMapState.isZoomLocked) {
344
+ // switching on locked zoom while unsynced
345
+ // only copy zoom viewport property from the most recently interacted-with viewport to the other
346
+ // TODO: do we want to check for a match a different way, such as a combo of `latitude` and `longitude`?
347
+ var lastUpdatedViewportIndex = newMapState.splitMapViewports.findIndex(function (v) {
348
+ return newMapState.zoom === v.zoom;
349
+ });
350
+ var splitMapViewports = newMapState.splitMapViewports.map(function (currentViewport, i) {
351
+ if (i === lastUpdatedViewportIndex) {
352
+ // no zoom to modify here
353
+ return currentViewport;
354
+ } // the other viewport gets the most recently interacted-with viewport's zoom
355
+ // WHY? the viewport the user was last interacting with will set zoom across the board for smooth UX
356
+
357
+
358
+ return _objectSpread(_objectSpread({}, currentViewport), {}, {
359
+ zoom: newMapState.splitMapViewports[lastUpdatedViewportIndex].zoom
360
+ });
361
+ });
362
+ newMapState.splitMapViewports = splitMapViewports;
363
+ return newMapState;
364
+ } // if current viewport is synced, and we are unsyncing it
365
+ // or already in unsynced mode and NOT toggling locked zoom
366
+ // make a fresh copy of the current viewport object, assign it to splitMapViewports[]
367
+ // pickViewportPropsFromMapState is called twice to avoid memory allocation conflicts
368
+
369
+
370
+ var leftViewport = pickViewportPropsFromMapState(newMapState);
371
+ var rightViewport = pickViewportPropsFromMapState(newMapState);
372
+ newMapState.splitMapViewports = [leftViewport, rightViewport];
373
+ } // return new state
374
+
375
+
376
+ return newMapState;
377
+ }; // Helpers
378
+
379
+
380
+ exports.toggleSplitMapViewportUpdater = toggleSplitMapViewportUpdater;
381
+
231
382
  function getMapDimForSplitMap(isSplit, state) {
232
383
  // cases:
233
384
  // 1. state split: true - isSplit: true
@@ -247,4 +398,92 @@ function getMapDimForSplitMap(isSplit, state) {
247
398
  width: width
248
399
  };
249
400
  }
250
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXAtc3RhdGUtdXBkYXRlcnMudHMiXSwibmFtZXMiOlsibWFwU3RhdGVVcGRhdGVycyIsIklOSVRJQUxfTUFQX1NUQVRFIiwicGl0Y2giLCJiZWFyaW5nIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJ6b29tIiwiZHJhZ1JvdGF0ZSIsIndpZHRoIiwiaGVpZ2h0IiwiaXNTcGxpdCIsInVwZGF0ZU1hcFVwZGF0ZXIiLCJzdGF0ZSIsImFjdGlvbiIsInBheWxvYWQiLCJmaXRCb3VuZHNVcGRhdGVyIiwiY2VudGVyQW5kWm9vbSIsImNlbnRlciIsIk51bWJlciIsImlzRmluaXRlIiwidG9nZ2xlUGVyc3BlY3RpdmVVcGRhdGVyIiwicmVzZXRNYXBDb25maWdVcGRhdGVyIiwiaW5pdGlhbFN0YXRlIiwicmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIiLCJjb25maWciLCJvcHRpb25zIiwiYm91bmRzIiwibWFwU3RhdGUiLCJtZXJnZWRTdGF0ZSIsImNlbnRlck1hcCIsImdldE1hcERpbUZvclNwbGl0TWFwIiwidG9nZ2xlU3BsaXRNYXBVcGRhdGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFvQkE7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBLElBQU1BLGdCQUFnQixHQUFHLElBQXpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNPLElBQU1DLGlCQUEyQixHQUFHO0FBQ3pDQyxFQUFBQSxLQUFLLEVBQUUsQ0FEa0M7QUFFekNDLEVB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QUFDQSxNQUFJRixPQUFPLENBQUNJLFNBQVIsSUFBcUJILE1BQXpCLEVBQWlDO0FBQy9CRSxJQUFBQSxXQUFXLEdBQUdiLGdCQUFnQixDQUFDYSxXQUFELEVBQWM7QUFDMUNkLE1BQUFBLE9BQU8sRUFBRVk7QUFEaUMsS0FBZCxDQUE5QjtBQUdEOztBQUVELHlDQUNLRSxXQURMLEdBR0tFLG9CQUFvQixDQUFDRixXQUFXLENBQUNsQixPQUFiLEVBQXNCRSxLQUF0QixDQUh6QjtBQUtELENBNUJNO0FBOEJQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTW1CLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBd0IsQ0FDbkNuQixLQURtQyxFQUVuQ0MsTUFGbUM7QUFBQSx5Q0FJaENELEtBSmdDO0FBS25DRixJQUFBQSxPQUFPLEVBQUUsQ0FBQ0UsS0FBSyxDQUFDRjtBQUxtQixLQU1oQ29CLG9CQUFvQixDQUFDLENBQUNsQixLQUFLLENBQUNGLE9BQVIsRUFBaUJFLEtBQWpCLENBTlk7QUFBQSxDQUE5QixDLENBU1A7Ozs7O0FBQ08sU0FBU2tCLG9CQUFULENBQThCcEIsT0FBOUIsRUFBdUNFLEtBQXZDLEVBQThDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFJQSxLQUFLLENBQUNGLE9BQU4sS0FBa0JBLE9BQXRCLEVBQStCO0FBQzdCLFdBQU8sRUFBUDtBQUNEOztBQUVELE1BQU1GLEtBQUssR0FDVEksS0FBSyxDQUFDRixPQUFOLElBQWlCLENBQUNBLE9BQWxCLEdBQ0k7QUFDQTtBQUNBRSxFQUFBQSxLQUFLLENBQUNKLEtBQU4sR0FBYyxDQUhsQixHQUlJO0FBQ0E7QUFDQUksRUFBQUEsS0FBSyxDQUFDSixLQUFOLEdBQWMsQ0FQcEI7QUFTQSxTQUFPO0FBQ0xBLElBQUFBLEtBQUssRUFBTEE7QUFESyxHQUFQO0FBR0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge2dldENlbnRlckFuZFpvb21Gcm9tQm91bmRzfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7TWFwU3RhdGVBY3Rpb25zLCBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZCwgQWN0aW9uVHlwZXN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge01hcFN0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuLyoqXG4gKiBVcGRhdGVycyBmb3IgYG1hcFN0YXRlYCByZWR1Y2VyLiBDYW4gYmUgdXNlZCBpbiB5b3VyIHJvb3QgcmVkdWNlciB0byBkaXJlY3RseSBtb2RpZnkga2VwbGVyLmdsJ3Mgc3RhdGUuXG4gKiBSZWFkIG1vcmUgYWJvdXQgW1VzaW5nIHVwZGF0ZXJzXSguLi9hZHZhbmNlZC11c2FnZS91c2luZy11cGRhdGVycy5tZClcbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IGtlcGxlckdsUmVkdWNlciwge21hcFN0YXRlVXBkYXRlcnN9IGZyb20gJ2tlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiAvLyBSb290IFJlZHVjZXJcbiAqIGNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAqICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICogIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogY29uc3QgY29tcG9zZWRSZWR1Y2VyID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAqICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gKiAgICAvLyBjbGljayBidXR0b24gdG8gY2xvc2Ugc2lkZSBwYW5lbFxuICogICAgY2FzZSAnQ0xJQ0tfQlVUVE9OJzpcbiAqICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAuLi5zdGF0ZSxcbiAqICAgICAgICBrZXBsZXJHbDoge1xuICogICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wsXG4gKiAgICAgICAgICBmb286IHtcbiAqICAgICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLmZvbyxcbiAqICAgICAgICAgICAgIG1hcFN0YXRlOiBtYXBTdGF0ZVVwZGF0ZXJzLmZpdEJvdW5kc1VwZGF0ZXIoXG4gKiAgICAgICAgICAgICAgIG1hcFN0YXRlLCB7cGF5bG9hZDogWzEyNy4zNCwgMzEuMDksIDEyNy41NiwgMzEuNTldXX1cbiAqICAgICAgICAgICAgIClcbiAqICAgICAgICAgIH1cbiAqICAgICAgICB9XG4gKiAgICAgIH07XG4gKiAgfVxuICogIHJldHVybiByZWR1Y2VycyhzdGF0ZSwgYWN0aW9uKTtcbiAqIH07XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgY29tcG9zZWRSZWR1Y2VyO1xuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuLy8gQHRzLWlnbm9yZVxuY29uc3QgbWFwU3RhdGVVcGRhdGVycyA9IG51bGw7XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG5cbi8qKlxuICogRGVmYXVsdCBpbml0aWFsIGBtYXBTdGF0ZWBcbiAqIEBtZW1iZXJvZiBtYXBTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBwaXRjaCBEZWZhdWx0OiBgMGBcbiAqIEBwcm9wZXJ0eSBiZWFyaW5nIERlZmF1bHQ6IGAwYFxuICogQHByb3BlcnR5IGxhdGl0dWRlIERlZmF1bHQ6IGAzNy43NTA0M2BcbiAqIEBwcm9wZXJ0eSBsb25naXR1ZGUgRGVmYXVsdDogYC0xMjIuMzQ2NzlgXG4gKiBAcHJvcGVydHkgem9vbSBEZWZhdWx0OiBgOWBcbiAqIEBwcm9wZXJ0eSBkcmFnUm90YXRlIERlZmF1bHQ6IGBmYWxzZWBcbiAqIEBwcm9wZXJ0eSB3aWR0aCBEZWZhdWx0OiBgODAwYFxuICogQHByb3BlcnR5IGhlaWdodCBEZWZhdWx0OiBgODAwYFxuICogQHByb3BlcnR5IGlzU3BsaXQgRGVmYXVsdDogYGZhbHNlYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSU5JVElBTF9NQVBfU1RBVEU6IE1hcFN0YXRlID0ge1xuICBwaXRjaDogMCxcbiAgYmVhcmluZzogMCxcbiAgbGF0aXR1ZGU6IDM3Ljc1MDQzLFxuICBsb25naXR1ZGU6IC0xMjIuMzQ2NzksXG4gIHpvb206IDksXG4gIGRyYWdSb3RhdGU6IGZhbHNlLFxuICB3aWR0aDogODAwLFxuICBoZWlnaHQ6IDgwMCxcbiAgaXNTcGxpdDogZmFsc2Vcbn07XG5cbi8qIFVwZGF0ZXJzICovXG4vKipcbiAqIFVwZGF0ZSBtYXAgdmlld3BvcnRcbiAqIEBtZW1iZXJvZiBtYXBTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVNYXBVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3RhdGUsXG4gIGFjdGlvbjogTWFwU3RhdGVBY3Rpb25zLlVwZGF0ZU1hcFVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICAuLi4oYWN0aW9uLnBheWxvYWQgfHwge30pXG59KTtcblxuLyoqXG4gKiBGaXQgbWFwIHZpZXdwb3J0IHRvIGJvdW5kc1xuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGZpdEJvdW5kc1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdGF0ZSxcbiAgYWN0aW9uOiBNYXBTdGF0ZUFjdGlvbnMuRml0Qm91bmRzVXBkYXRlckFjdGlvblxuKTogTWFwU3RhdGUgPT4ge1xuICBjb25zdCBjZW50ZXJBbmRab29tID0gZ2V0Q2VudGVyQW5kWm9vbUZyb21Cb3VuZHMoYWN0aW9uLnBheWxvYWQsIHtcbiAgICB3aWR0aDogc3RhdGUud2lkdGgsXG4gICAgaGVpZ2h0OiBzdGF0ZS5oZWlnaHRcbiAgfSk7XG4gIGlmICghY2VudGVyQW5kWm9vbSkge1xuICAgIC8vIGJvdW5kcyBpcyBpbnZhbGlkXG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXRpdHVkZTogY2VudGVyQW5kWm9vbS5jZW50ZXJbMV0sXG4gICAgbG9uZ2l0dWRlOiBjZW50ZXJBbmRab29tLmNlbnRlclswXSxcbiAgICAvLyBGb3IgbWFyZ2luYWwgb3IgaW52YWxpZCBib3VuZHMsIHpvb20gbWF5IGJlIE5hTi4gTWFrZSBzdXJlIHRvIHByb3ZpZGUgYSB2YWxpZCB2YWx1ZSBpbiBvcmRlclxuICAgIC8vIHRvIGF2b2lkIGNvcnJ1cHQgc3RhdGUgYW5kIHBvdGVudGlhbCBjcmFzaGVzIGFzIHpvb20gaXMgZXhwZWN0ZWQgdG8gYmUgYSBudW1iZXJcbiAgICAuLi4oTnVtYmVyLmlzRmluaXRlKGNlbnRlckFuZFpvb20uem9vbSkgPyB7em9vbTogY2VudGVyQW5kWm9vbS56b29tfSA6IHt9KVxuICB9O1xufTtcblxuLyoqXG4gKiBUb2dnbGUgYmV0d2VlbiAzZCBhbmQgMmQgbWFwLlxuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVBlcnNwZWN0aXZlVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5Ub2dnbGVQZXJzcGVjdGl2ZVVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICAuLi57XG4gICAgcGl0Y2g6IHN0YXRlLmRyYWdSb3RhdGUgPyAwIDogNTAsXG4gICAgYmVhcmluZzogc3RhdGUuZHJhZ1JvdGF0ZSA/IDAgOiAyNFxuICB9LFxuICBkcmFnUm90YXRlOiAhc3RhdGUuZHJhZ1JvdGF0ZVxufSk7XG5cbi8qKlxuICogcmVzZXQgbWFwU3RhdGUgdG8gaW5pdGlhbCBTdGF0ZVxuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0TWFwQ29uZmlnVXBkYXRlciA9IChzdGF0ZTogTWFwU3RhdGUpOiBNYXBTdGF0ZSA9PiAoe1xuICAuLi5JTklUSUFMX01BUF9TVEFURSxcbiAgLi4uc3RhdGUuaW5pdGlhbFN0YXRlLFxuICBpbml0aWFsU3RhdGU6IHN0YXRlLmluaXRpYWxTdGF0ZVxufSk7XG5cbi8vIGNvbnNpZGVyIGNhc2Ugd2hlcmUgeW91IGhhdmUgYSBzcGxpdCBtYXAgYW5kIHVzZXIgd2FudHMgdG8gcmVzZXRcbi8qKlxuICogVXBkYXRlIGBtYXBTdGF0ZWAgdG8gcHJvcGFnYXRlIGEgbmV3IGNvbmZpZ1xuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlY2VpdmVNYXBDb25maWdVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3RhdGUsXG4gIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcGF5bG9hZDoge2NvbmZpZyA9IHt9LCBvcHRpb25zID0ge30sIGJvdW5kcyA9IG51bGx9XG4gIH06IHtcbiAgICB0eXBlPzogdHlwZW9mIEFjdGlvblR5cGVzLlJFQ0VJVkVfTUFQX0NPTkZJRztcbiAgICBwYXlsb2FkOiBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZDtcbiAgfVxuKTogTWFwU3RhdGUgPT4ge1xuICBjb25zdCB7bWFwU3RhdGV9ID0gY29uZmlnIHx8IHt9O1xuXG4gIC8vIG1lcmdlZCByZWNlaXZlZCBtYXBzdGF0ZSB3aXRoIHByZXZpb3VzIHN0YXRlXG4gIGxldCBtZXJnZWRTdGF0ZSA9IHsuLi5zdGF0ZSwgLi4ubWFwU3RhdGV9O1xuXG4gIC8vIGlmIGNlbnRlciBtYXBcbiAgLy8gY2VudGVyIG1hcCB3aWxsIG92ZXJyaWRlIG1hcFN0YXRlIGNvbmZpZ1xuICBpZiAob3B0aW9ucy5jZW50ZXJNYXAgJiYgYm91bmRzKSB7XG4gICAgbWVyZ2VkU3RhdGUgPSBmaXRCb3VuZHNVcGRhdGVyKG1lcmdlZFN0YXRlLCB7XG4gICAgICBwYXlsb2FkOiBib3VuZHNcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ubWVyZ2VkU3RhdGUsXG4gICAgLy8gdXBkYXRlIHdpZHRoIGlmIGBpc1NwbGl0YCBoYXMgY2hhbmdlZFxuICAgIC4uLmdldE1hcERpbUZvclNwbGl0TWFwKG1lcmdlZFN0YXRlLmlzU3BsaXQsIHN0YXRlKVxuICB9O1xufTtcblxuLyoqXG4gKiBUb2dnbGUgYmV0d2VlbiBvbmUgb3Igc3BsaXQgbWFwc1xuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNwbGl0TWFwVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5Ub2dnbGVTcGxpdE1hcFVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBpc1NwbGl0OiAhc3RhdGUuaXNTcGxpdCxcbiAgLi4uZ2V0TWFwRGltRm9yU3BsaXRNYXAoIXN0YXRlLmlzU3BsaXQsIHN0YXRlKVxufSk7XG5cbi8vIEhlbHBlcnNcbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXBEaW1Gb3JTcGxpdE1hcChpc1NwbGl0LCBzdGF0ZSkge1xuICAvLyBjYXNlczpcbiAgLy8gMS4gc3RhdGUgc3BsaXQ6IHRydWUgLSBpc1NwbGl0OiB0cnVlXG4gIC8vIGRvIG5vdGhpbmdcbiAgLy8gMi4gc3RhdGUgc3BsaXQ6IGZhbHNlIC0gaXNTcGxpdDogZmFsc2VcbiAgLy8gZG8gbm90aGluZ1xuICBpZiAoc3RhdGUuaXNTcGxpdCA9PT0gaXNTcGxpdCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHdpZHRoID1cbiAgICBzdGF0ZS5pc1NwbGl0ICYmICFpc1NwbGl0XG4gICAgICA/IC8vIDMuIHN0YXRlIHNwbGl0OiB0cnVlIC0gaXNTcGxpdDogZmFsc2VcbiAgICAgICAgLy8gZG91YmxlIHdpZHRoXG4gICAgICAgIHN0YXRlLndpZHRoICogMlxuICAgICAgOiAvLyA0LiBzdGF0ZSBzcGxpdDogZmFsc2UgLSBpc1NwbGl0OiB0cnVlXG4gICAgICAgIC8vIHNwbGl0IHdpZHRoXG4gICAgICAgIHN0YXRlLndpZHRoIC8gMjtcblxuICByZXR1cm4ge1xuICAgIHdpZHRoXG4gIH07XG59XG4iXX0=
401
+
402
+ function updateViewportBasedOnBounds(state, newMapState) {
403
+ // Get the new viewport bounds
404
+ var viewportBounds = _geoViewport["default"].bounds([newMapState.longitude, newMapState.latitude], newMapState.zoom, [newMapState.width, newMapState.height], _utils.MAPBOX_TILE_SIZE); // Generate turf Polygon from bounds for comparison
405
+
406
+
407
+ var viewportBoundsPolygon = (0, _bboxPolygon["default"])(viewportBounds); // @ts-ignore
408
+
409
+ var newStateMaxBounds = newMapState.maxBounds; // @ts-ignore
410
+
411
+ var maxBoundsPolygon = (0, _bboxPolygon["default"])(newStateMaxBounds); // If maxBounds has changed reset the viewport to snap to bounds
412
+
413
+ var hasMaxBoundsChanged = !state.maxBounds || !state.maxBounds.every(function (val, idx) {
414
+ return val === newStateMaxBounds[idx];
415
+ });
416
+
417
+ if (hasMaxBoundsChanged) {
418
+ // Check if the newMapState viewport is within maxBounds
419
+ if (!(0, _booleanWithin["default"])(viewportBoundsPolygon, maxBoundsPolygon)) {
420
+ var _fitBounds = (0, _webMercator.fitBounds)({
421
+ width: newMapState.width,
422
+ height: newMapState.width,
423
+ bounds: [[newStateMaxBounds[0], newStateMaxBounds[1]], [newStateMaxBounds[2], newStateMaxBounds[3]]]
424
+ }),
425
+ latitude = _fitBounds.latitude,
426
+ longitude = _fitBounds.longitude,
427
+ zoom = _fitBounds.zoom;
428
+
429
+ newMapState = _objectSpread(_objectSpread({}, newMapState), {}, {
430
+ latitude: latitude,
431
+ longitude: longitude
432
+ }, Number.isFinite(zoom) ? {
433
+ zoom: zoom
434
+ } : {});
435
+ }
436
+
437
+ return newMapState;
438
+ } // Check if the newMapState viewport is within maxBounds
439
+
440
+
441
+ if (!(0, _booleanWithin["default"])(viewportBoundsPolygon, maxBoundsPolygon)) {
442
+ newMapState = _objectSpread(_objectSpread({}, newMapState), {}, {
443
+ longitude: state.longitude,
444
+ latitude: state.latitude,
445
+ zoom: state.zoom
446
+ });
447
+ }
448
+
449
+ return newMapState;
450
+ }
451
+
452
+ function pickViewportPropsFromMapState(state) {
453
+ return (0, _lodash["default"])(state, ['width', 'height', 'zoom', 'pitch', 'bearing', 'latitude', 'longitude', 'dragRotate', 'minZoom', 'maxZoom', 'maxBounds']);
454
+ }
455
+ /** Select items from object whose value is not undefined */
456
+
457
+
458
+ var definedProps = function definedProps(obj) {
459
+ return Object.entries(obj).reduce(function (accu, _ref2) {
460
+ var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
461
+ k = _ref3[0],
462
+ v = _ref3[1];
463
+
464
+ return _objectSpread(_objectSpread({}, accu), v !== undefined ? (0, _defineProperty2["default"])({}, k, v) : {});
465
+ }, {});
466
+ };
467
+
468
+ function updateViewport(originalViewport, viewportUpdates) {
469
+ var newViewport = _objectSpread(_objectSpread({}, originalViewport), definedProps(viewportUpdates) || {}); // Make sure zoom level doesn't go bellow minZoom if defined
470
+
471
+
472
+ if (newViewport.minZoom && newViewport.zoom && newViewport.zoom < newViewport.minZoom) {
473
+ newViewport.zoom = newViewport.minZoom;
474
+ } // Make sure zoom level doesn't go above maxZoom if defined
475
+
476
+
477
+ if (newViewport.maxZoom && newViewport.zoom && newViewport.zoom > newViewport.maxZoom) {
478
+ newViewport.zoom = newViewport.maxZoom;
479
+ } // Limit viewport update based on maxBounds
480
+
481
+
482
+ if (newViewport.maxBounds && (0, _utils.validateBounds)(newViewport.maxBounds)) {
483
+ // @ts-expect-error Type 'Viewport' is missing the following properties from type 'MapState': isSplit, isViewportSynced, isZoomLocked, splitMapViewports
484
+ newViewport = updateViewportBasedOnBounds(originalViewport, newViewport);
485
+ }
486
+
487
+ return newViewport;
488
+ }
489
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXAtc3RhdGUtdXBkYXRlcnMudHMiXSwibmFtZXMiOlsibWFwU3RhdGVVcGRhdGVycyIsIklOSVRJQUxfTUFQX1NUQVRFIiwicGl0Y2giLCJiZWFyaW5nIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJ6b29tIiwiZHJhZ1JvdGF0ZSIsIndpZHRoIiwiaGVpZ2h0IiwibWluWm9vbSIsInVuZGVmaW5lZCIsIm1heFpvb20iLCJtYXhCb3VuZHMiLCJpc1NwbGl0IiwiaXNWaWV3cG9ydFN5bmNlZCIsImlzWm9vbUxvY2tlZCIsInNwbGl0TWFwVmlld3BvcnRzIiwidXBkYXRlTWFwVXBkYXRlciIsInN0YXRlIiwiYWN0aW9uIiwicGF5bG9hZCIsInZpZXdwb3J0IiwibWFwSW5kZXgiLCJ1cGRhdGVWaWV3cG9ydCIsIm90aGVyVmlld3BvcnRNYXBJbmRleCIsIm1hcCIsImN1cnJlbnRWaWV3cG9ydCIsImkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImZpdEJvdW5kc1VwZGF0ZXIiLCJjZW50ZXJBbmRab29tIiwibmV3U3RhdGUiLCJjZW50ZXIiLCJsZW5ndGgiLCJ0b2dnbGVQZXJzcGVjdGl2ZVVwZGF0ZXIiLCJyZXNldE1hcENvbmZpZ1VwZGF0ZXIiLCJpbml0aWFsU3RhdGUiLCJyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsImNvbmZpZyIsIm9wdGlvbnMiLCJib3VuZHMiLCJtYXBTdGF0ZSIsIm1lcmdlZFN0YXRlIiwiYXJyYXlNZXJnZSIsIl9kZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjZW50ZXJNYXAiLCJnZXRNYXBEaW1Gb3JTcGxpdE1hcCIsInRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsInRvZ2dsZVNwbGl0TWFwVmlld3BvcnRVcGRhdGVyIiwibmV3TWFwU3RhdGUiLCJsYXN0VXBkYXRlZFZpZXdwb3J0SW5kZXgiLCJmaW5kSW5kZXgiLCJ2IiwibGVmdFZpZXdwb3J0IiwicGlja1ZpZXdwb3J0UHJvcHNGcm9tTWFwU3RhdGUiLCJyaWdodFZpZXdwb3J0IiwidXBkYXRlVmlld3BvcnRCYXNlZE9uQm91bmRzIiwidmlld3BvcnRCb3VuZHMiLCJnZW9WaWV3cG9ydCIsIk1BUEJPWF9USUxFX1NJWkUiLCJ2aWV3cG9ydEJvdW5kc1BvbHlnb24iLCJuZXdTdGF0ZU1heEJvdW5kcyIsIm1heEJvdW5kc1BvbHlnb24iLCJoYXNNYXhCb3VuZHNDaGFuZ2VkIiwiZXZlcnkiLCJ2YWwiLCJpZHgiLCJkZWZpbmVkUHJvcHMiLCJvYmoiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjdSIsImsiLCJvcmlnaW5hbFZpZXdwb3J0Iiwidmlld3BvcnRVcGRhdGVzIiwibmV3Vmlld3BvcnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQSxJQUFNQSxnQkFBZ0IsR0FBRyxJQUF6QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDTyxJQUFNQyxpQkFBMkIsR0FBRztBQUN6Q0MsRUFBQUEsS0FBSyxFQUFFLENBRGtDO0FBRXpDQyxFQUFBQSxPQUFPLEVBQUUsQ0FGZ0M7QUFHekNDLEVBQUFBLFFBQVEsRUFBRSxRQUgrQjtBQUl6Q0MsRUFBQUEsU0FBUyxFQUFFLENBQUMsU0FKNkI7QUFLekNDLEVBQUFBLElBQUksRUFBRSxDQUxtQztBQU16Q0MsRUFBQUEsVUFB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VyxDQUFDckUsT0FBWixJQUF1QnFFLFdBQVcsQ0FBQ3pFLElBQW5DLElBQTJDeUUsV0FBVyxDQUFDekUsSUFBWixHQUFtQnlFLFdBQVcsQ0FBQ3JFLE9BQTlFLEVBQXVGO0FBQ3JGcUUsSUFBQUEsV0FBVyxDQUFDekUsSUFBWixHQUFtQnlFLFdBQVcsQ0FBQ3JFLE9BQS9CO0FBQ0QsR0FUc0YsQ0FVdkY7OztBQUNBLE1BQUlxRSxXQUFXLENBQUNuRSxPQUFaLElBQXVCbUUsV0FBVyxDQUFDekUsSUFBbkMsSUFBMkN5RSxXQUFXLENBQUN6RSxJQUFaLEdBQW1CeUUsV0FBVyxDQUFDbkUsT0FBOUUsRUFBdUY7QUFDckZtRSxJQUFBQSxXQUFXLENBQUN6RSxJQUFaLEdBQW1CeUUsV0FBVyxDQUFDbkUsT0FBL0I7QUFDRCxHQWJzRixDQWN2Rjs7O0FBQ0EsTUFBSW1FLFdBQVcsQ0FBQ2xFLFNBQVosSUFBeUIsMkJBQWVrRSxXQUFXLENBQUNsRSxTQUEzQixDQUE3QixFQUFvRTtBQUNsRTtBQUNBa0UsSUFBQUEsV0FBVyxHQUFHcEIsMkJBQTJCLENBQUNrQixnQkFBRCxFQUFtQkUsV0FBbkIsQ0FBekM7QUFDRDs7QUFFRCxTQUFPQSxXQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgZ2VvVmlld3BvcnQgZnJvbSAnQG1hcGJveC9nZW8tdmlld3BvcnQnO1xuaW1wb3J0IGJvb2xlYW5XaXRoaW4gZnJvbSAnQHR1cmYvYm9vbGVhbi13aXRoaW4nO1xuaW1wb3J0IGJib3hQb2x5Z29uIGZyb20gJ0B0dXJmL2Jib3gtcG9seWdvbic7XG5pbXBvcnQge2ZpdEJvdW5kc30gZnJvbSAnQG1hdGguZ2wvd2ViLW1lcmNhdG9yJztcbmltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBwaWNrIGZyb20gJ2xvZGFzaC5waWNrJztcblxuaW1wb3J0IHtnZXRDZW50ZXJBbmRab29tRnJvbUJvdW5kcywgdmFsaWRhdGVCb3VuZHMsIE1BUEJPWF9USUxFX1NJWkV9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtNYXBTdGF0ZUFjdGlvbnMsIFJlY2VpdmVNYXBDb25maWdQYXlsb2FkLCBBY3Rpb25UeXBlc30gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB7TWFwU3RhdGUsIEJvdW5kcywgVmlld3BvcnR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG4vKipcbiAqIFVwZGF0ZXJzIGZvciBgbWFwU3RhdGVgIHJlZHVjZXIuIENhbiBiZSB1c2VkIGluIHlvdXIgcm9vdCByZWR1Y2VyIHRvIGRpcmVjdGx5IG1vZGlmeSBrZXBsZXIuZ2wncyBzdGF0ZS5cbiAqIFJlYWQgbW9yZSBhYm91dCBbVXNpbmcgdXBkYXRlcnNdKC4uL2FkdmFuY2VkLXVzYWdlL3VzaW5nLXVwZGF0ZXJzLm1kKVxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7bWFwU3RhdGVVcGRhdGVyc30gZnJvbSAna2VwbGVyLmdsL3JlZHVjZXJzJztcbiAqIC8vIFJvb3QgUmVkdWNlclxuICogY29uc3QgcmVkdWNlcnMgPSBjb21iaW5lUmVkdWNlcnMoe1xuICogIGtlcGxlckdsOiBrZXBsZXJHbFJlZHVjZXIsXG4gKiAgYXBwOiBhcHBSZWR1Y2VyXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBjb21wb3NlZFJlZHVjZXIgPSAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICogIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAqICAgIC8vIGNsaWNrIGJ1dHRvbiB0byBjbG9zZSBzaWRlIHBhbmVsXG4gKiAgICBjYXNlICdDTElDS19CVVRUT04nOlxuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC4uLnN0YXRlLFxuICogICAgICAgIGtlcGxlckdsOiB7XG4gKiAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbCxcbiAqICAgICAgICAgIGZvbzoge1xuICogICAgICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wuZm9vLFxuICogICAgICAgICAgICAgbWFwU3RhdGU6IG1hcFN0YXRlVXBkYXRlcnMuZml0Qm91bmRzVXBkYXRlcihcbiAqICAgICAgICAgICAgICAgbWFwU3RhdGUsIHtwYXlsb2FkOiBbMTI3LjM0LCAzMS4wOSwgMTI3LjU2LCAzMS41OV1dfVxuICogICAgICAgICAgICAgKVxuICogICAgICAgICAgfVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCBtYXBTdGF0ZVVwZGF0ZXJzID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYG1hcFN0YXRlYFxuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHBpdGNoIERlZmF1bHQ6IGAwYFxuICogQHByb3BlcnR5IGJlYXJpbmcgRGVmYXVsdDogYDBgXG4gKiBAcHJvcGVydHkgbGF0aXR1ZGUgRGVmYXVsdDogYDM3Ljc1MDQzYFxuICogQHByb3BlcnR5IGxvbmdpdHVkZSBEZWZhdWx0OiBgLTEyMi4zNDY3OWBcbiAqIEBwcm9wZXJ0eSB6b29tIERlZmF1bHQ6IGA5YFxuICogQHByb3BlcnR5IGRyYWdSb3RhdGUgRGVmYXVsdDogYGZhbHNlYFxuICogQHByb3BlcnR5IHdpZHRoIERlZmF1bHQ6IGA4MDBgXG4gKiBAcHJvcGVydHkgaGVpZ2h0IERlZmF1bHQ6IGA4MDBgXG4gKiBAcHJvcGVydHkgbWluWm9vbTogYHVuZGVmaW5lZGAsXG4gKiBAcHJvcGVydHkgbWF4Wm9vbTogYHVuZGVmaW5lZGAsXG4gKiBAcHJvcGVydHkgbWF4Qm91bmRzOiBgdW5kZWZpbmVkYCxcbiAqIEBwcm9wZXJ0eSBpc1NwbGl0OiBgZmFsc2VgLFxuICogQHByb3BlcnR5IGlzVmlld3BvcnRTeW5jZWQ6IGB0cnVlYCxcbiAqIEBwcm9wZXJ0eSBpc1pvb21Mb2NrZWQ6IGBmYWxzZWAsXG4gKiBAcHJvcGVydHkgc3BsaXRNYXBWaWV3cG9ydHM6IGBbXWBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IElOSVRJQUxfTUFQX1NUQVRFOiBNYXBTdGF0ZSA9IHtcbiAgcGl0Y2g6IDAsXG4gIGJlYXJpbmc6IDAsXG4gIGxhdGl0dWRlOiAzNy43NTA0MyxcbiAgbG9uZ2l0dWRlOiAtMTIyLjM0Njc5LFxuICB6b29tOiA5LFxuICBkcmFnUm90YXRlOiBmYWxzZSxcbiAgd2lkdGg6IDgwMCxcbiAgaGVpZ2h0OiA4MDAsXG4gIG1pblpvb206IHVuZGVmaW5lZCxcbiAgbWF4Wm9vbTogdW5kZWZpbmVkLFxuICBtYXhCb3VuZHM6IHVuZGVmaW5lZCxcbiAgaXNTcGxpdDogZmFsc2UsXG4gIGlzVmlld3BvcnRTeW5jZWQ6IHRydWUsXG4gIGlzWm9vbUxvY2tlZDogZmFsc2UsXG4gIHNwbGl0TWFwVmlld3BvcnRzOiBbXVxufTtcblxuLyogVXBkYXRlcnMgKi9cbi8qKlxuICogVXBkYXRlIG1hcCB2aWV3cG9ydFxuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZU1hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdGF0ZSxcbiAgYWN0aW9uOiBNYXBTdGF0ZUFjdGlvbnMuVXBkYXRlTWFwVXBkYXRlckFjdGlvblxuKTogTWFwU3RhdGUgPT4ge1xuICBjb25zdCB7dmlld3BvcnQsIG1hcEluZGV4ID0gMH0gPSBhY3Rpb24ucGF5bG9hZDtcblxuICBpZiAoc3RhdGUuaXNWaWV3cG9ydFN5bmNlZCkge1xuICAgIC8vIFRoZSBgdXBkYXRlVmlld3BvcnRgIGZ1bmN0aW9uIGlzIHR5cGVkIGFzIChWaWV3cG9ydCwgVmlld3BvcnQpIC0+IFZpZXdwb3J0IGJ1dCBoZXJlIHRoZVxuICAgIC8vIGV4cGVjdGVkIHR5cGluZyBpcyAoTWFwU3RhdGUsIFZpZXdwb3J0KSAtPiBNYXBTdGF0ZS5cbiAgICAvLyB0aGlzIGNvdWxkIGJlIGEgcG90ZW50aWFsIGJ1ZyBhcyB3ZSB0cmVhdCBWaWV3cG9ydCBhbmQgTWFwU3RhdGUgYXMgZXF1YWwgc2VlbWluZ2x5XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUeXBlICdWaWV3cG9ydCcgaXMgbWlzc2luZyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZnJvbSB0eXBlICdNYXBTdGF0ZSc6IGlzU3BsaXQsIGlzVmlld3BvcnRTeW5jZWQsIGlzWm9vbUxvY2tlZCwgc3BsaXRNYXBWaWV3cG9ydHNcbiAgICByZXR1cm4gdXBkYXRlVmlld3BvcnQoc3RhdGUsIHZpZXdwb3J0KTtcbiAgfVxuXG4gIGxldCBvdGhlclZpZXdwb3J0TWFwSW5kZXggPSAtMTtcbiAgY29uc3Qgc3BsaXRNYXBWaWV3cG9ydHMgPSBzdGF0ZS5zcGxpdE1hcFZpZXdwb3J0cy5tYXAoKGN1cnJlbnRWaWV3cG9ydCwgaSkgPT4ge1xuICAgIGlmIChpID09PSBtYXBJbmRleCkge1xuICAgICAgLy8gdXBkYXRlIHRoZSBtYXRjaGluZyB2aWV3cG9ydCB3aXRoIHRoZSBuZXdWaWV3cG9ydCBpbmZvIGluIHRoZSBhY3Rpb24gcGF5bG9hZFxuICAgICAgcmV0dXJuIHVwZGF0ZVZpZXdwb3J0KGN1cnJlbnRWaWV3cG9ydCwgdmlld3BvcnQpO1xuICAgIH1cblxuICAgIG90aGVyVmlld3BvcnRNYXBJbmRleCA9IGk7XG4gICAgLy8gbWFrZSBubyBjaGFuZ2VzIHRvIHRoZSBvdGhlciB2aWV3cG9ydCAoeWV0KVxuICAgIHJldHVybiBjdXJyZW50Vmlld3BvcnQ7XG4gIH0pO1xuXG4gIC8vIG1ha2UgY29uZGl0aW9uYWwgdXBkYXRlcyB0byB0aGUgb3RoZXIgdmlld3BvcnQgbm90IG1hdGNoaW5nIHRoaXMgcGF5bG9hZCdzIGBtYXBJbmRleGBcbiAgaWYgKE51bWJlci5pc0Zpbml0ZShvdGhlclZpZXdwb3J0TWFwSW5kZXgpICYmIG90aGVyVmlld3BvcnRNYXBJbmRleCA+IC0xKSB7XG4gICAgLy8gd2lkdGggYW5kIGhlaWdodCBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIGFyZSBhbHdheXMgdXBkYXRlZFxuICAgIHNwbGl0TWFwVmlld3BvcnRzW290aGVyVmlld3BvcnRNYXBJbmRleF0gPSB7XG4gICAgICAuLi5zcGxpdE1hcFZpZXdwb3J0c1tvdGhlclZpZXdwb3J0TWFwSW5kZXhdLFxuICAgICAgd2lkdGg6IHNwbGl0TWFwVmlld3BvcnRzW21hcEluZGV4XS53aWR0aCxcbiAgICAgIGhlaWdodDogc3BsaXRNYXBWaWV3cG9ydHNbbWFwSW5kZXhdLmhlaWdodFxuICAgIH07XG5cbiAgICBpZiAoc3RhdGUuaXNab29tTG9ja2VkKSB7XG4gICAgICAvLyB1cGRhdGUgdGhlIG90aGVyIHZpZXdwb3J0IHdpdGggdGhlIG5ldyB6b29tIGZyb20gdGhlIHNwbGl0IHZpZXdwb3J0IHRoYXQgd2FzIHVwZGF0ZWQgd2l0aCB0aGlzIHBheWxvYWQncyBgbWFwSW5kZXhgXG4gICAgICBzcGxpdE1hcFZpZXdwb3J0c1tvdGhlclZpZXdwb3J0TWFwSW5kZXhdID0ge1xuICAgICAgICAuLi5zcGxpdE1hcFZpZXdwb3J0c1tvdGhlclZpZXdwb3J0TWFwSW5kZXhdLFxuICAgICAgICB6b29tOiBzcGxpdE1hcFZpZXdwb3J0c1ttYXBJbmRleF0uem9vbVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8vIHVwZGF0ZSB0aGUgdG9wLWxldmVsIG1hcFN0YXRlIHZpZXdwb3J0IHdpdGggdGhlIG1vc3QgcmVjZW50bHkgaW50ZXJhY3RlZC13aXRoIHNwbGl0IHZpZXdwb3J0XG4gICAgLy8gV0hZPyB0aGlzIGF2b2lkcyB6b29tIGFuZCBib3VuZHMgXCJqdW1waW5nXCIgZHVlIHRvIGEgXCJzdGFsZVwiIHRvcC1sZXZlbCBtYXBTdGF0ZSB2aWV3cG9ydCB3aGVuOlxuICAgIC8vICAxLiB0b2dnbGluZyBvZmYgdGhlIHVuc3luY2VkIHZpZXdwb3J0cyBtb2RlIHRvIHN3aXRjaCB0byB0aGUgc3luY2VkIHZpZXdwb3J0cyBtb2RlXG4gICAgLy8gIDIuIHRvZ2dsaW5nIG9uIHRoZSB6b29tIGxvY2sgZHVyaW5nIGFuIHVuc3luY2VkIHZpZXdwb3J0cyBtb2RlXG4gICAgLi4uc3RhdGUsXG4gICAgLi4uc3BsaXRNYXBWaWV3cG9ydHNbbWFwSW5kZXhdLFxuICAgIC8vIHVwZGF0ZSB0aGUgbWFwU3RhdGUgd2l0aCB0aGUgbmV3IGFycmF5IG9mIHNwbGl0IHZpZXdwb3J0c1xuICAgIHNwbGl0TWFwVmlld3BvcnRzXG4gIH07XG59O1xuXG4vKipcbiAqIEZpdCBtYXAgdmlld3BvcnQgdG8gYm91bmRzXG4gKiBAbWVtYmVyb2YgbWFwU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZml0Qm91bmRzVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5GaXRCb3VuZHNVcGRhdGVyQWN0aW9uXG4pOiBNYXBTdGF0ZSA9PiB7XG4gIGNvbnN0IGNlbnRlckFuZFpvb20gPSBnZXRDZW50ZXJBbmRab29tRnJvbUJvdW5kcyhhY3Rpb24ucGF5bG9hZCwge1xuICAgIHdpZHRoOiBzdGF0ZS53aWR0aCxcbiAgICBoZWlnaHQ6IHN0YXRlLmhlaWdodFxuICB9KTtcbiAgaWYgKCFjZW50ZXJBbmRab29tKSB7XG4gICAgLy8gYm91bmRzIGlzIGludmFsaWRcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXRpdHVkZTogY2VudGVyQW5kWm9vbS5jZW50ZXJbMV0sXG4gICAgbG9uZ2l0dWRlOiBjZW50ZXJBbmRab29tLmNlbnRlclswXSxcbiAgICAvLyBGb3IgbWFyZ2luYWwgb3IgaW52YWxpZCBib3VuZHMsIHpvb20gbWF5IGJlIE5hTi4gTWFrZSBzdXJlIHRvIHByb3ZpZGUgYSB2YWxpZCB2YWx1ZSBpbiBvcmRlclxuICAgIC8vIHRvIGF2b2lkIGNvcnJ1cHQgc3RhdGUgYW5kIHBvdGVudGlhbCBjcmFzaGVzIGFzIHpvb20gaXMgZXhwZWN0ZWQgdG8gYmUgYSBudW1iZXJcbiAgICAuLi4oTnVtYmVyLmlzRmluaXRlKGNlbnRlckFuZFpvb20uem9vbSkgPyB7em9vbTogY2VudGVyQW5kWm9vbS56b29tfSA6IHt9KVxuICB9O1xuXG4gIC8vIGlmIGZpdHRpbmcgdG8gYm91bmRzIHdoaWxlIHNwbGl0IGFuZCB1bnN5bmNlZFxuICAvLyBjb3B5IHRoZSBuZXcgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgYW5kIHpvb20gdmFsdWVzIHRvIGVhY2ggc3BsaXQgdmlld3BvcnRcbiAgaWYgKG5ld1N0YXRlLnNwbGl0TWFwVmlld3BvcnRzLmxlbmd0aCkge1xuICAgIG5ld1N0YXRlLnNwbGl0TWFwVmlld3BvcnRzID0gbmV3U3RhdGUuc3BsaXRNYXBWaWV3cG9ydHMubWFwKGN1cnJlbnRWaWV3cG9ydCA9PiAoe1xuICAgICAgLi4uY3VycmVudFZpZXdwb3J0LFxuICAgICAgbGF0aXR1ZGU6IG5ld1N0YXRlLmxhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlOiBuZXdTdGF0ZS5sb25naXR1ZGUsXG4gICAgICB6b29tOiBuZXdTdGF0ZS56b29tXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufTtcblxuLyoqXG4gKiBUb2dnbGUgYmV0d2VlbiAzZCBhbmQgMmQgbWFwLlxuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVBlcnNwZWN0aXZlVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5Ub2dnbGVQZXJzcGVjdGl2ZVVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0YXRlID0+IHtcbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgLi4ue1xuICAgICAgcGl0Y2g6IHN0YXRlLmRyYWdSb3RhdGUgPyAwIDogNTAsXG4gICAgICBiZWFyaW5nOiBzdGF0ZS5kcmFnUm90YXRlID8gMCA6IDI0XG4gICAgfSxcbiAgICBkcmFnUm90YXRlOiAhc3RhdGUuZHJhZ1JvdGF0ZVxuICB9O1xuXG4gIC8vIGlmIHRvZ2dsaW5nIDNkIGFuZCAyZCB3aGlsZSBzcGxpdCBhbmQgdW5zeW5jZWRcbiAgLy8gY29weSB0aGUgbmV3IHBpdGNoLCBiZWFyaW5nLCBhbmQgZHJhZ1JvdGF0ZSB2YWx1ZXMgdG8gZWFjaCBzcGxpdCB2aWV3cG9ydFxuICBpZiAobmV3U3RhdGUuc3BsaXRNYXBWaWV3cG9ydHMubGVuZ3RoKSB7XG4gICAgbmV3U3RhdGUuc3BsaXRNYXBWaWV3cG9ydHMgPSBuZXdTdGF0ZS5zcGxpdE1hcFZpZXdwb3J0cy5tYXAoY3VycmVudFZpZXdwb3J0ID0+ICh7XG4gICAgICAuLi5jdXJyZW50Vmlld3BvcnQsXG4gICAgICBwaXRjaDogbmV3U3RhdGUucGl0Y2gsXG4gICAgICBiZWFyaW5nOiBuZXdTdGF0ZS5iZWFyaW5nLFxuICAgICAgZHJhZ1JvdGF0ZTogbmV3U3RhdGUuZHJhZ1JvdGF0ZVxuICAgIH0pKTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn07XG5cbi8qKlxuICogcmVzZXQgbWFwU3RhdGUgdG8gaW5pdGlhbCBTdGF0ZVxuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0TWFwQ29uZmlnVXBkYXRlciA9IChzdGF0ZTogTWFwU3RhdGUpOiBNYXBTdGF0ZSA9PiAoe1xuICAuLi5JTklUSUFMX01BUF9TVEFURSxcbiAgLi4uc3RhdGUuaW5pdGlhbFN0YXRlLFxuICBpbml0aWFsU3RhdGU6IHN0YXRlLmluaXRpYWxTdGF0ZVxufSk7XG5cbi8vIGNvbnNpZGVyIGNhc2Ugd2hlcmUgeW91IGhhdmUgYSBzcGxpdCBtYXAgYW5kIHVzZXIgd2FudHMgdG8gcmVzZXRcbi8qKlxuICogVXBkYXRlIGBtYXBTdGF0ZWAgdG8gcHJvcGFnYXRlIGEgbmV3IGNvbmZpZ1xuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlY2VpdmVNYXBDb25maWdVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3RhdGUsXG4gIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcGF5bG9hZDoge2NvbmZpZyA9IHt9LCBvcHRpb25zID0ge30sIGJvdW5kcyA9IG51bGx9XG4gIH06IHtcbiAgICB0eXBlPzogdHlwZW9mIEFjdGlvblR5cGVzLlJFQ0VJVkVfTUFQX0NPTkZJRztcbiAgICBwYXlsb2FkOiBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZDtcbiAgfVxuKTogTWFwU3RhdGUgPT4ge1xuICAvKipcbiAgICogQHR5cGUge1BhcnRpYWw8TWFwU3RhdGU+fVxuICAgKi9cbiAgY29uc3QgbWFwU3RhdGUgPSAoY29uZmlnIHx8IHt9KS5tYXBTdGF0ZSB8fCB7fTtcbiAgLy8gbWVyZ2VkIHJlY2VpdmVkIG1hcFN0YXRlIHdpdGggcHJldmlvdXMgc3RhdGVcbiAgLy8gc3RhdGUgYWxzbyBtYXkgaW5jbHVkZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5ldyB0byBhbiBleGlzdGluZywgc2F2ZWQgcHJvamVjdCdzIG1hcFN0YXRlXG5cbiAgbGV0IG1lcmdlZFN0YXRlID0gZGVlcG1lcmdlPE1hcFN0YXRlPihzdGF0ZSwgbWFwU3RhdGUsIHtcbiAgICAvLyBub3RlOiBkZWVwbWVyZ2UgYnkgZGVmYXVsdCB3aWxsIG1lcmdlIGFycmF5cyBieSBjb25jYXRlbmF0aW5nIHRoZW1cbiAgICAvLyBidXQgd2UgbmVlZCB0byBvdmVyd3JpdGUgZGVzdGluYXRpb24gYXJyYXlzIHdpdGggc291cmNlIGFycmF5cywgaWYgcHJlc2VudFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9UZWhTaHJpa2UvZGVlcG1lcmdlI2FycmF5bWVyZ2UtZXhhbXBsZS1vdmVyd3JpdGUtdGFyZ2V0LWFycmF5XG4gICAgYXJyYXlNZXJnZTogKF9kZXN0aW5hdGlvbkFycmF5LCBzb3VyY2VBcnJheSkgPT4gc291cmNlQXJyYXlcbiAgfSk7XG5cbiAgLy8gaWYgY2VudGVyIG1hcFxuICAvLyBjZW50ZXIgbWFwIHdpbGwgb3ZlcnJpZGUgbWFwU3RhdGUgY29uZmlnXG4gIGlmIChvcHRpb25zLmNlbnRlck1hcCAmJiBib3VuZHMpIHtcbiAgICBtZXJnZWRTdGF0ZSA9IGZpdEJvdW5kc1VwZGF0ZXIobWVyZ2VkU3RhdGUsIHtcbiAgICAgIHBheWxvYWQ6IGJvdW5kc1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5tZXJnZWRTdGF0ZSxcbiAgICAvLyB1cGRhdGUgd2lkdGggaWYgYGlzU3BsaXRgIGhhcyBjaGFuZ2VkXG4gICAgLi4uZ2V0TWFwRGltRm9yU3BsaXRNYXAobWVyZ2VkU3RhdGUuaXNTcGxpdCwgc3RhdGUpXG4gIH07XG59O1xuXG4vKipcbiAqIFRvZ2dsZSBiZXR3ZWVuIG9uZSBvciBzcGxpdCBtYXBzXG4gKiBAbWVtYmVyb2YgbWFwU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlU3BsaXRNYXBVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3RhdGUsXG4gIGFjdGlvbjogTWFwU3RhdGVBY3Rpb25zLlRvZ2dsZVNwbGl0TWFwVXBkYXRlckFjdGlvblxuKTogTWFwU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIC4uLmdldE1hcERpbUZvclNwbGl0TWFwKCFzdGF0ZS5pc1NwbGl0LCBzdGF0ZSksXG4gIGlzU3BsaXQ6ICFzdGF0ZS5pc1NwbGl0LFxuICAuLi4oIXN0YXRlLmlzU3BsaXQgPT09IGZhbHNlXG4gICAgPyB7XG4gICAgICAgIC8vIGlmIHRvZ2dsaW5nIHRvIG5vIGxvbmdlciBzcGxpdCAoc2luZ2xlIG1vZGUpIHRoZW4gcmVzZXQgYSBmZXcgcHJvcGVydGllc1xuICAgICAgICBpc1ZpZXdwb3J0U3luY2VkOiB0cnVlLFxuICAgICAgICBpc1pvb21Mb2NrZWQ6IGZhbHNlLFxuICAgICAgICBzcGxpdE1hcFZpZXdwb3J0czogW11cbiAgICAgIH1cbiAgICA6IHt9KVxufSk7XG5cbi8qKlxuICogVG9nZ2xlIGJldHdlZW4gbG9ja2VkIGFuZCB1bmxvY2tlZCBzcGxpdCB2aWV3cG9ydHNcbiAqIEBtZW1iZXJvZiBtYXBTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVTcGxpdE1hcFZpZXdwb3J0VXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5Ub2dnbGVTcGxpdE1hcFZpZXdwb3J0VXBkYXRlckFjdGlvblxuKSA9PiB7XG4gIC8vIG5ldyBtYXAgc3RhdGUgaW1tZWRpYXRlbHkgZ2V0cyB0aGUgbmV3LCBvcHRpb25hbCBwYXlsb2FkIHZhbHVlcyBmb3IgaXNWaWV3cG9ydFN5bmNlZCBhbmQvb3IgaXNab29tTG9ja2VkXG4gIGNvbnN0IG5ld01hcFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIC4uLihhY3Rpb24ucGF5bG9hZCB8fCB7fSlcbiAgfTtcblxuICBpZiAobmV3TWFwU3RhdGUuaXNWaWV3cG9ydFN5bmNlZCkge1xuICAgIC8vIHN3aXRjaGluZyBmcm9tIHVuc3luY2VkIHRvIHN5bmNlZCB2aWV3cG9ydHNcbiAgICBuZXdNYXBTdGF0ZS5zcGxpdE1hcFZpZXdwb3J0cyA9IFtdO1xuICB9IGVsc2Uge1xuICAgIC8vIHN3aXRjaGluZyBmcm9tIHN5bmNlZCB0byB1bnN5bmNlZCB2aWV3cG9ydHNcbiAgICAvLyBvciBhbHJlYWR5IGluIHVuc3luY2VkIG1vZGUgYW5kIHRvZ2dsaW5nIGxvY2tlZCB6b29tXG5cbiAgICBpZiAoc3RhdGUuaXNab29tTG9ja2VkICYmICFuZXdNYXBTdGF0ZS5pc1pvb21Mb2NrZWQpIHtcbiAgICAgIC8vIHN3aXRjaGluZyBvZmYgbG9ja2VkIHpvb20gd2hpbGUgdW5zeW5jZWRcbiAgICAgIC8vIGRvbid0IGNvcHkgdGhlIG1hcFN0YXRlcyB0byBsZWZ0IGFuZCByaWdodCB2aWV3cG9ydHMgYmVjYXVzZSB0aGVyZSB3aWxsIGJlIHpvb20gXCJqdW1waW5nXCJcbiAgICAgIHJldHVybiBuZXdNYXBTdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoIXN0YXRlLmlzWm9vbUxvY2tlZCAmJiBuZXdNYXBTdGF0ZS5pc1pvb21Mb2NrZWQpIHtcbiAgICAgIC8vIHN3aXRjaGluZyBvbiBsb2NrZWQgem9vbSB3aGlsZSB1bnN5bmNlZFxuICAgICAgLy8gb25seSBjb3B5IHpvb20gdmlld3BvcnQgcHJvcGVydHkgZnJvbSB0aGUgbW9zdCByZWNlbnRseSBpbnRlcmFjdGVkLXdpdGggdmlld3BvcnQgdG8gdGhlIG90aGVyXG4gICAgICAvLyBUT0RPOiBkbyB3ZSB3YW50IHRvIGNoZWNrIGZvciBhIG1hdGNoIGEgZGlmZmVyZW50IHdheSwgc3VjaCBhcyBhIGNvbWJvIG9mIGBsYXRpdHVkZWAgYW5kIGBsb25naXR1ZGVgP1xuICAgICAgY29uc3QgbGFzdFVwZGF0ZWRWaWV3cG9ydEluZGV4ID0gbmV3TWFwU3RhdGUuc3BsaXRNYXBWaWV3cG9ydHMuZmluZEluZGV4KFxuICAgICAgICB2ID0+IG5ld01hcFN0YXRlLnpvb20gPT09IHYuem9vbVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc3BsaXRNYXBWaWV3cG9ydHMgPSBuZXdNYXBTdGF0ZS5zcGxpdE1hcFZpZXdwb3J0cy5tYXAoKGN1cnJlbnRWaWV3cG9ydCwgaSkgPT4ge1xuICAgICAgICBpZiAoaSA9PT0gbGFzdFVwZGF0ZWRWaWV3cG9ydEluZGV4KSB7XG4gICAgICAgICAgLy8gbm8gem9vbSB0byBtb2RpZnkgaGVyZVxuICAgICAgICAgIHJldHVybiBjdXJyZW50Vmlld3BvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIG90aGVyIHZpZXdwb3J0IGdldHMgdGhlIG1vc3QgcmVjZW50bHkgaW50ZXJhY3RlZC13aXRoIHZpZXdwb3J0J3Mgem9vbVxuICAgICAgICAvLyBXSFk/IHRoZSB2aWV3cG9ydCB0aGUgdXNlciB3YXMgbGFzdCBpbnRlcmFjdGluZyB3aXRoIHdpbGwgc2V0IHpvb20gYWNyb3NzIHRoZSBib2FyZCBmb3Igc21vb3RoIFVYXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY3VycmVudFZpZXdwb3J0LFxuICAgICAgICAgIHpvb206IG5ld01hcFN0YXRlLnNwbGl0TWFwVmlld3BvcnRzW2xhc3RVcGRhdGVkVmlld3BvcnRJbmRleF0uem9vbVxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIG5ld01hcFN0YXRlLnNwbGl0TWFwVmlld3BvcnRzID0gc3BsaXRNYXBWaWV3cG9ydHM7XG5cbiAgICAgIHJldHVybiBuZXdNYXBTdGF0ZTtcbiAgICB9XG5cbiAgICAvLyBpZiBjdXJyZW50IHZpZXdwb3J0IGlzIHN5bmNlZCwgYW5kIHdlIGFyZSB1bnN5bmNpbmcgaXRcbiAgICAvLyBvciBhbHJlYWR5IGluIHVuc3luY2VkIG1vZGUgYW5kIE5PVCB0b2dnbGluZyBsb2NrZWQgem9vbVxuICAgIC8vIG1ha2UgYSBmcmVzaCBjb3B5IG9mIHRoZSBjdXJyZW50IHZpZXdwb3J0IG9iamVjdCwgYXNzaWduIGl0IHRvIHNwbGl0TWFwVmlld3BvcnRzW11cbiAgICAvLyBwaWNrVmlld3BvcnRQcm9wc0Zyb21NYXBTdGF0ZSBpcyBjYWxsZWQgdHdpY2UgdG8gYXZvaWQgbWVtb3J5IGFsbG9jYXRpb24gY29uZmxpY3RzXG4gICAgY29uc3QgbGVmdFZpZXdwb3J0ID0gcGlja1ZpZXdwb3J0UHJvcHNGcm9tTWFwU3RhdGUobmV3TWFwU3RhdGUpO1xuICAgIGNvbnN0IHJpZ2h0Vmlld3BvcnQgPSBwaWNrVmlld3BvcnRQcm9wc0Zyb21NYXBTdGF0ZShuZXdNYXBTdGF0ZSk7XG4gICAgbmV3TWFwU3RhdGUuc3BsaXRNYXBWaWV3cG9ydHMgPSBbbGVmdFZpZXdwb3J0LCByaWdodFZpZXdwb3J0XTtcbiAgfVxuXG4gIC8vIHJldHVybiBuZXcgc3RhdGVcbiAgcmV0dXJuIG5ld01hcFN0YXRlO1xufTtcblxuLy8gSGVscGVyc1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcERpbUZvclNwbGl0TWFwKGlzU3BsaXQsIHN0YXRlKSB7XG4gIC8vIGNhc2VzOlxuICAvLyAxLiBzdGF0ZSBzcGxpdDogdHJ1ZSAtIGlzU3BsaXQ6IHRydWVcbiAgLy8gZG8gbm90aGluZ1xuICAvLyAyLiBzdGF0ZSBzcGxpdDogZmFsc2UgLSBpc1NwbGl0OiBmYWxzZVxuICAvLyBkbyBub3RoaW5nXG4gIGlmIChzdGF0ZS5pc1NwbGl0ID09PSBpc1NwbGl0KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3Qgd2lkdGggPVxuICAgIHN0YXRlLmlzU3BsaXQgJiYgIWlzU3BsaXRcbiAgICAgID8gLy8gMy4gc3RhdGUgc3BsaXQ6IHRydWUgLSBpc1NwbGl0OiBmYWxzZVxuICAgICAgICAvLyBkb3VibGUgd2lkdGhcbiAgICAgICAgc3RhdGUud2lkdGggKiAyXG4gICAgICA6IC8vIDQuIHN0YXRlIHNwbGl0OiBmYWxzZSAtIGlzU3BsaXQ6IHRydWVcbiAgICAgICAgLy8gc3BsaXQgd2lkdGhcbiAgICAgICAgc3RhdGUud2lkdGggLyAyO1xuXG4gIHJldHVybiB7XG4gICAgd2lkdGhcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVmlld3BvcnRCYXNlZE9uQm91bmRzKHN0YXRlOiBNYXBTdGF0ZSwgbmV3TWFwU3RhdGU6IE1hcFN0YXRlKSB7XG4gIC8vIEdldCB0aGUgbmV3IHZpZXdwb3J0IGJvdW5kc1xuICBjb25zdCB2aWV3cG9ydEJvdW5kcyA9IGdlb1ZpZXdwb3J0LmJvdW5kcyhcbiAgICBbbmV3TWFwU3RhdGUubG9uZ2l0dWRlLCBuZXdNYXBTdGF0ZS5sYXRpdHVkZV0sXG4gICAgbmV3TWFwU3RhdGUuem9vbSxcbiAgICBbbmV3TWFwU3RhdGUud2lkdGgsIG5ld01hcFN0YXRlLmhlaWdodF0sXG4gICAgTUFQQk9YX1RJTEVfU0laRVxuICApO1xuICAvLyBHZW5lcmF0ZSB0dXJmIFBvbHlnb24gZnJvbSBib3VuZHMgZm9yIGNvbXBhcmlzb25cbiAgY29uc3Qgdmlld3BvcnRCb3VuZHNQb2x5Z29uID0gYmJveFBvbHlnb24odmlld3BvcnRCb3VuZHMpO1xuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IG5ld1N0YXRlTWF4Qm91bmRzOiBCb3VuZHMgPSBuZXdNYXBTdGF0ZS5tYXhCb3VuZHM7XG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgbWF4Qm91bmRzUG9seWdvbiA9IGJib3hQb2x5Z29uKG5ld1N0YXRlTWF4Qm91bmRzKTtcblxuICAvLyBJZiBtYXhCb3VuZHMgaGFzIGNoYW5nZWQgcmVzZXQgdGhlIHZpZXdwb3J0IHRvIHNuYXAgdG8gYm91bmRzXG4gIGNvbnN0IGhhc01heEJvdW5kc0NoYW5nZWQgPVxuICAgICFzdGF0ZS5tYXhCb3VuZHMgfHwgIXN0YXRlLm1heEJvdW5kcy5ldmVyeSgodmFsLCBpZHgpID0+IHZhbCA9PT0gbmV3U3RhdGVNYXhCb3VuZHNbaWR4XSk7XG4gIGlmIChoYXNNYXhCb3VuZHNDaGFuZ2VkKSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIG5ld01hcFN0YXRlIHZpZXdwb3J0IGlzIHdpdGhpbiBtYXhCb3VuZHNcbiAgICBpZiAoIWJvb2xlYW5XaXRoaW4odmlld3BvcnRCb3VuZHNQb2x5Z29uLCBtYXhCb3VuZHNQb2x5Z29uKSkge1xuICAgICAgY29uc3Qge2xhdGl0dWRlLCBsb25naXR1ZGUsIHpvb219ID0gZml0Qm91bmRzKHtcbiAgICAgICAgd2lkdGg6IG5ld01hcFN0YXRlLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IG5ld01hcFN0YXRlLndpZHRoLFxuICAgICAgICBib3VuZHM6IFtcbiAgICAgICAgICBbbmV3U3RhdGVNYXhCb3VuZHNbMF0sIG5ld1N0YXRlTWF4Qm91bmRzWzFdXSxcbiAgICAgICAgICBbbmV3U3RhdGVNYXhCb3VuZHNbMl0sIG5ld1N0YXRlTWF4Qm91bmRzWzNdXVxuICAgICAgICBdXG4gICAgICB9KTtcblxuICAgICAgbmV3TWFwU3RhdGUgPSB7XG4gICAgICAgIC4uLm5ld01hcFN0YXRlLFxuICAgICAgICBsYXRpdHVkZSxcbiAgICAgICAgbG9uZ2l0dWRlLFxuICAgICAgICAvLyBGb3IgbWFyZ2luYWwgb3IgaW52YWxpZCBib3VuZHMsIHpvb20gbWF5IGJlIE5hTi4gTWFrZSBzdXJlIHRvIHByb3ZpZGUgYSB2YWxpZCB2YWx1ZSBpbiBvcmRlclxuICAgICAgICAvLyB0byBhdm9pZCBjb3JydXB0IHN0YXRlIGFuZCBwb3RlbnRpYWwgY3Jhc2hlcyBhcyB6b29tIGlzIGV4cGVjdGVkIHRvIGJlIGEgbnVtYmVyXG4gICAgICAgIC4uLihOdW1iZXIuaXNGaW5pdGUoem9vbSkgPyB7em9vbX0gOiB7fSlcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBuZXdNYXBTdGF0ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoZSBuZXdNYXBTdGF0ZSB2aWV3cG9ydCBpcyB3aXRoaW4gbWF4Qm91bmRzXG4gIGlmICghYm9vbGVhbldpdGhpbih2aWV3cG9ydEJvdW5kc1BvbHlnb24sIG1heEJvdW5kc1BvbHlnb24pKSB7XG4gICAgbmV3TWFwU3RhdGUgPSB7XG4gICAgICAuLi5uZXdNYXBTdGF0ZSxcbiAgICAgIGxvbmdpdHVkZTogc3RhdGUubG9uZ2l0dWRlLFxuICAgICAgbGF0aXR1ZGU6IHN0YXRlLmxhdGl0dWRlLFxuICAgICAgem9vbTogc3RhdGUuem9vbVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gbmV3TWFwU3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVmlld3BvcnRQcm9wc0Zyb21NYXBTdGF0ZShzdGF0ZTogTWFwU3RhdGUpOiBWaWV3cG9ydCB7XG4gIHJldHVybiBwaWNrKHN0YXRlLCBbXG4gICAgJ3dpZHRoJyxcbiAgICAnaGVpZ2h0JyxcbiAgICAnem9vbScsXG4gICAgJ3BpdGNoJyxcbiAgICAnYmVhcmluZycsXG4gICAgJ2xhdGl0dWRlJyxcbiAgICAnbG9uZ2l0dWRlJyxcbiAgICAnZHJhZ1JvdGF0ZScsXG4gICAgJ21pblpvb20nLFxuICAgICdtYXhab29tJyxcbiAgICAnbWF4Qm91bmRzJ1xuICBdKTtcbn1cblxuLyoqIFNlbGVjdCBpdGVtcyBmcm9tIG9iamVjdCB3aG9zZSB2YWx1ZSBpcyBub3QgdW5kZWZpbmVkICovXG5jb25zdCBkZWZpbmVkUHJvcHMgPSBvYmogPT5cbiAgT2JqZWN0LmVudHJpZXMob2JqKS5yZWR1Y2UoXG4gICAgKGFjY3UsIFtrLCB2XSkgPT4gKHsuLi5hY2N1LCAuLi4odiAhPT0gdW5kZWZpbmVkID8ge1trXTogdn0gOiB7fSl9KSxcbiAgICB7fVxuICApO1xuXG5mdW5jdGlvbiB1cGRhdGVWaWV3cG9ydChvcmlnaW5hbFZpZXdwb3J0OiBWaWV3cG9ydCwgdmlld3BvcnRVcGRhdGVzOiBWaWV3cG9ydCk6IFZpZXdwb3J0IHtcbiAgbGV0IG5ld1ZpZXdwb3J0ID0ge1xuICAgIC4uLm9yaWdpbmFsVmlld3BvcnQsXG4gICAgLi4uKGRlZmluZWRQcm9wcyh2aWV3cG9ydFVwZGF0ZXMpIHx8IHt9KVxuICB9O1xuXG4gIC8vIE1ha2Ugc3VyZSB6b29tIGxldmVsIGRvZXNuJ3QgZ28gYmVsbG93IG1pblpvb20gaWYgZGVmaW5lZFxuICBpZiAobmV3Vmlld3BvcnQubWluWm9vbSAmJiBuZXdWaWV3cG9ydC56b29tICYmIG5ld1ZpZXdwb3J0Lnpvb20gPCBuZXdWaWV3cG9ydC5taW5ab29tKSB7XG4gICAgbmV3Vmlld3BvcnQuem9vbSA9IG5ld1ZpZXdwb3J0Lm1pblpvb207XG4gIH1cbiAgLy8gTWFrZSBzdXJlIHpvb20gbGV2ZWwgZG9lc24ndCBnbyBhYm92ZSBtYXhab29tIGlmIGRlZmluZWRcbiAgaWYgKG5ld1ZpZXdwb3J0Lm1heFpvb20gJiYgbmV3Vmlld3BvcnQuem9vbSAmJiBuZXdWaWV3cG9ydC56b29tID4gbmV3Vmlld3BvcnQubWF4Wm9vbSkge1xuICAgIG5ld1ZpZXdwb3J0Lnpvb20gPSBuZXdWaWV3cG9ydC5tYXhab29tO1xuICB9XG4gIC8vIExpbWl0IHZpZXdwb3J0IHVwZGF0ZSBiYXNlZCBvbiBtYXhCb3VuZHNcbiAgaWYgKG5ld1ZpZXdwb3J0Lm1heEJvdW5kcyAmJiB2YWxpZGF0ZUJvdW5kcyhuZXdWaWV3cG9ydC5tYXhCb3VuZHMpKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUeXBlICdWaWV3cG9ydCcgaXMgbWlzc2luZyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZnJvbSB0eXBlICdNYXBTdGF0ZSc6IGlzU3BsaXQsIGlzVmlld3BvcnRTeW5jZWQsIGlzWm9vbUxvY2tlZCwgc3BsaXRNYXBWaWV3cG9ydHNcbiAgICBuZXdWaWV3cG9ydCA9IHVwZGF0ZVZpZXdwb3J0QmFzZWRPbkJvdW5kcyhvcmlnaW5hbFZpZXdwb3J0LCBuZXdWaWV3cG9ydCk7XG4gIH1cblxuICByZXR1cm4gbmV3Vmlld3BvcnQ7XG59XG4iXX0=
@@ -1,3 +1,75 @@
1
- export declare const mapStateReducerFactory: (initialState?: {}) => import("redux-actions").ReduxCompatibleReducer<import("@kepler.gl/types").MapState, import("@kepler.gl/types").MapState>;
2
- declare const _default: import("redux-actions").ReduxCompatibleReducer<import("@kepler.gl/types").MapState, import("@kepler.gl/types").MapState>;
1
+ export declare const mapStateReducerFactory: (initialState?: {}) => import("redux-actions").ReduxCompatibleReducer<{
2
+ isViewportSynced: boolean;
3
+ isZoomLocked: boolean;
4
+ pitch: number;
5
+ bearing: number;
6
+ latitude: number;
7
+ longitude: number;
8
+ zoom: number;
9
+ dragRotate: boolean;
10
+ width: number;
11
+ height: number;
12
+ minZoom?: number | undefined;
13
+ maxZoom?: number | undefined;
14
+ maxBounds?: import("@kepler.gl/types").Bounds | undefined;
15
+ initialState?: any;
16
+ scale?: number | undefined;
17
+ isSplit: boolean;
18
+ splitMapViewports: import("@kepler.gl/types").Viewport[];
19
+ }, {
20
+ isViewportSynced: boolean;
21
+ isZoomLocked: boolean;
22
+ pitch: number;
23
+ bearing: number;
24
+ latitude: number;
25
+ longitude: number;
26
+ zoom: number;
27
+ dragRotate: boolean;
28
+ width: number;
29
+ height: number;
30
+ minZoom?: number | undefined;
31
+ maxZoom?: number | undefined;
32
+ maxBounds?: import("@kepler.gl/types").Bounds | undefined;
33
+ initialState?: any;
34
+ scale?: number | undefined;
35
+ isSplit: boolean;
36
+ splitMapViewports: import("@kepler.gl/types").Viewport[];
37
+ }>;
38
+ declare const _default: import("redux-actions").ReduxCompatibleReducer<{
39
+ isViewportSynced: boolean;
40
+ isZoomLocked: boolean;
41
+ pitch: number;
42
+ bearing: number;
43
+ latitude: number;
44
+ longitude: number;
45
+ zoom: number;
46
+ dragRotate: boolean;
47
+ width: number;
48
+ height: number;
49
+ minZoom?: number | undefined;
50
+ maxZoom?: number | undefined;
51
+ maxBounds?: import("@kepler.gl/types").Bounds | undefined;
52
+ initialState?: any;
53
+ scale?: number | undefined;
54
+ isSplit: boolean;
55
+ splitMapViewports: import("@kepler.gl/types").Viewport[];
56
+ }, {
57
+ isViewportSynced: boolean;
58
+ isZoomLocked: boolean;
59
+ pitch: number;
60
+ bearing: number;
61
+ latitude: number;
62
+ longitude: number;
63
+ zoom: number;
64
+ dragRotate: boolean;
65
+ width: number;
66
+ height: number;
67
+ minZoom?: number | undefined;
68
+ maxZoom?: number | undefined;
69
+ maxBounds?: import("@kepler.gl/types").Bounds | undefined;
70
+ initialState?: any;
71
+ scale?: number | undefined;
72
+ isSplit: boolean;
73
+ splitMapViewports: import("@kepler.gl/types").Viewport[];
74
+ }>;
3
75
  export default _default;
package/dist/map-state.js CHANGED
@@ -1,23 +1,3 @@
1
- // Copyright (c) 2022 Uber Technologies, Inc.
2
- //
3
- // Permission is hereby granted, free of charge, to any person obtaining a copy
4
- // of this software and associated documentation files (the "Software"), to deal
5
- // in the Software without restriction, including without limitation the rights
6
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- // copies of the Software, and to permit persons to whom the Software is
8
- // furnished to do so, subject to the following conditions:
9
- //
10
- // The above copyright notice and this permission notice shall be included in
11
- // all copies or substantial portions of the Software.
12
- //
13
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- // THE SOFTWARE.
20
-
21
1
  "use strict";
22
2
 
23
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
@@ -47,7 +27,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
47
27
  * Important: Do not rename `actionHandler` or the assignment pattern of property value.
48
28
  * It is used to generate documentation
49
29
  */
50
- var actionHandler = (_actionHandler = {}, (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.UPDATE_MAP, mapStateUpdaters.updateMapUpdater), (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.FIT_BOUNDS, mapStateUpdaters.fitBoundsUpdater), (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.TOGGLE_PERSPECTIVE, mapStateUpdaters.togglePerspectiveUpdater), (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.RECEIVE_MAP_CONFIG, mapStateUpdaters.receiveMapConfigUpdater), (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.RESET_MAP_CONFIG, mapStateUpdaters.resetMapConfigUpdater), (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.TOGGLE_SPLIT_MAP, mapStateUpdaters.toggleSplitMapUpdater), _actionHandler);
30
+ var actionHandler = (_actionHandler = {}, (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.UPDATE_MAP, mapStateUpdaters.updateMapUpdater), (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.FIT_BOUNDS, mapStateUpdaters.fitBoundsUpdater), (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.TOGGLE_PERSPECTIVE, mapStateUpdaters.togglePerspectiveUpdater), (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.RECEIVE_MAP_CONFIG, mapStateUpdaters.receiveMapConfigUpdater), (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.RESET_MAP_CONFIG, mapStateUpdaters.resetMapConfigUpdater), (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.TOGGLE_SPLIT_MAP, mapStateUpdaters.toggleSplitMapUpdater), (0, _defineProperty2["default"])(_actionHandler, _actions.ActionTypes.TOGGLE_SPLIT_MAP_VIEWPORT, mapStateUpdaters.toggleSplitMapViewportUpdater), _actionHandler);
51
31
  /* Reducer */
52
32
 
53
33
  var mapStateReducerFactory = function mapStateReducerFactory() {
@@ -64,4 +44,4 @@ exports.mapStateReducerFactory = mapStateReducerFactory;
64
44
  var _default = mapStateReducerFactory();
65
45
 
66
46
  exports["default"] = _default;
67
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXAtc3RhdGUudHMiXSwibmFtZXMiOlsiYWN0aW9uSGFuZGxlciIsIkFjdGlvblR5cGVzIiwiVVBEQVRFX01BUCIsIm1hcFN0YXRlVXBkYXRlcnMiLCJ1cGRhdGVNYXBVcGRhdGVyIiwiRklUX0JPVU5EUyIsImZpdEJvdW5kc1VwZGF0ZXIiLCJUT0dHTEVfUEVSU1BFQ1RJVkUiLCJ0b2dnbGVQZXJzcGVjdGl2ZVVwZGF0ZXIiLCJSRUNFSVZFX01BUF9DT05GSUciLCJyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsIlJFU0VUX01BUF9DT05GSUciLCJyZXNldE1hcENvbmZpZ1VwZGF0ZXIiLCJUT0dHTEVfU1BMSVRfTUFQIiwidG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwibWFwU3RhdGVSZWR1Y2VyRmFjdG9yeSIsImluaXRpYWxTdGF0ZSIsIklOSVRJQUxfTUFQX1NUQVRFIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOzs7Ozs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTUEsYUFBYSwwRUFDaEJDLHFCQUFZQyxVQURJLEVBQ1NDLGdCQUFnQixDQUFDQyxnQkFEMUIsb0RBRWhCSCxxQkFBWUksVUFGSSxFQUVTRixnQkFBZ0IsQ0FBQ0csZ0JBRjFCLG9EQUdoQkwscUJBQVlNLGtCQUhJLEVBR2lCSixnQkFBZ0IsQ0FBQ0ssd0JBSGxDLG9EQUloQlAscUJBQVlRLGtCQUpJLEVBSWlCTixnQkFBZ0IsQ0FBQ08sdUJBSmxDLG9EQUtoQlQscUJBQVlVLGdCQUxJLEVBS2VSLGdCQUFnQixDQUFDUyxxQkFMaEMsb0RBTWhCWCxxQkFBWVksZ0JBTkksRUFNZVYsZ0JBQWdCLENBQUNXLHFCQU5oQyxrQkFBbkI7QUFTQTs7QUFDTyxJQUFNQyxzQkFBc0IsR0FBRyxTQUF6QkEsc0JBQXlCO0FBQUEsTUFBQ0MsWUFBRCx1RUFBZ0IsRUFBaEI7QUFBQSxTQUNwQztBQUNBLHFDQUFjaEIsYUFBZCxnREFDS0csZ0JBQWdCLENBQUNjLGlCQUR0QixHQUVLRCxZQUZMO0FBR0VBLE1BQUFBLFlBQVksRUFBWkE7QUFIRjtBQUZvQztBQUFBLENBQS9COzs7O2VBUVFELHNCQUFzQixFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIyIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtoYW5kbGVBY3Rpb25zfSBmcm9tICdyZWR1eC1hY3Rpb25zJztcbmltcG9ydCB7QWN0aW9uVHlwZXN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyBtYXBTdGF0ZVVwZGF0ZXJzIGZyb20gJy4vbWFwLXN0YXRlLXVwZGF0ZXJzJztcblxuLyoqXG4gKiBJbXBvcnRhbnQ6IERvIG5vdCByZW5hbWUgYGFjdGlvbkhhbmRsZXJgIG9yIHRoZSBhc3NpZ25tZW50IHBhdHRlcm4gb2YgcHJvcGVydHkgdmFsdWUuXG4gKiBJdCBpcyB1c2VkIHRvIGdlbmVyYXRlIGRvY3VtZW50YXRpb25cbiAqL1xuY29uc3QgYWN0aW9uSGFuZGxlciA9IHtcbiAgW0FjdGlvblR5cGVzLlVQREFURV9NQVBdOiBtYXBTdGF0ZVVwZGF0ZXJzLnVwZGF0ZU1hcFVwZGF0ZXIsXG4gIFtBY3Rpb25UeXBlcy5GSVRfQk9VTkRTXTogbWFwU3RhdGVVcGRhdGVycy5maXRCb3VuZHNVcGRhdGVyLFxuICBbQWN0aW9uVHlwZXMuVE9HR0xFX1BFUlNQRUNUSVZFXTogbWFwU3RhdGVVcGRhdGVycy50b2dnbGVQZXJzcGVjdGl2ZVVwZGF0ZXIsXG4gIFtBY3Rpb25UeXBlcy5SRUNFSVZFX01BUF9DT05GSUddOiBtYXBTdGF0ZVVwZGF0ZXJzLnJlY2VpdmVNYXBDb25maWdVcGRhdGVyLFxuICBbQWN0aW9uVHlwZXMuUkVTRVRfTUFQX0NPTkZJR106IG1hcFN0YXRlVXBkYXRlcnMucmVzZXRNYXBDb25maWdVcGRhdGVyLFxuICBbQWN0aW9uVHlwZXMuVE9HR0xFX1NQTElUX01BUF06IG1hcFN0YXRlVXBkYXRlcnMudG9nZ2xlU3BsaXRNYXBVcGRhdGVyXG59O1xuXG4vKiBSZWR1Y2VyICovXG5leHBvcnQgY29uc3QgbWFwU3RhdGVSZWR1Y2VyRmFjdG9yeSA9IChpbml0aWFsU3RhdGUgPSB7fSkgPT5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICBoYW5kbGVBY3Rpb25zKGFjdGlvbkhhbmRsZXIsIHtcbiAgICAuLi5tYXBTdGF0ZVVwZGF0ZXJzLklOSVRJQUxfTUFQX1NUQVRFLFxuICAgIC4uLmluaXRpYWxTdGF0ZSxcbiAgICBpbml0aWFsU3RhdGVcbiAgfSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1hcFN0YXRlUmVkdWNlckZhY3RvcnkoKTtcbiJdfQ==
47
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXAtc3RhdGUudHMiXSwibmFtZXMiOlsiYWN0aW9uSGFuZGxlciIsIkFjdGlvblR5cGVzIiwiVVBEQVRFX01BUCIsIm1hcFN0YXRlVXBkYXRlcnMiLCJ1cGRhdGVNYXBVcGRhdGVyIiwiRklUX0JPVU5EUyIsImZpdEJvdW5kc1VwZGF0ZXIiLCJUT0dHTEVfUEVSU1BFQ1RJVkUiLCJ0b2dnbGVQZXJzcGVjdGl2ZVVwZGF0ZXIiLCJSRUNFSVZFX01BUF9DT05GSUciLCJyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsIlJFU0VUX01BUF9DT05GSUciLCJyZXNldE1hcENvbmZpZ1VwZGF0ZXIiLCJUT0dHTEVfU1BMSVRfTUFQIiwidG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwiVE9HR0xFX1NQTElUX01BUF9WSUVXUE9SVCIsInRvZ2dsZVNwbGl0TWFwVmlld3BvcnRVcGRhdGVyIiwibWFwU3RhdGVSZWR1Y2VyRmFjdG9yeSIsImluaXRpYWxTdGF0ZSIsIklOSVRJQUxfTUFQX1NUQVRFIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQSxhQUFhLDBFQUNoQkMscUJBQVlDLFVBREksRUFDU0MsZ0JBQWdCLENBQUNDLGdCQUQxQixvREFFaEJILHFCQUFZSSxVQUZJLEVBRVNGLGdCQUFnQixDQUFDRyxnQkFGMUIsb0RBR2hCTCxxQkFBWU0sa0JBSEksRUFHaUJKLGdCQUFnQixDQUFDSyx3QkFIbEMsb0RBSWhCUCxxQkFBWVEsa0JBSkksRUFJaUJOLGdCQUFnQixDQUFDTyx1QkFKbEMsb0RBS2hCVCxxQkFBWVUsZ0JBTEksRUFLZVIsZ0JBQWdCLENBQUNTLHFCQUxoQyxvREFNaEJYLHFCQUFZWSxnQkFOSSxFQU1lVixnQkFBZ0IsQ0FBQ1cscUJBTmhDLG9EQU9oQmIscUJBQVljLHlCQVBJLEVBT3dCWixnQkFBZ0IsQ0FBQ2EsNkJBUHpDLGtCQUFuQjtBQVVBOztBQUNPLElBQU1DLHNCQUFzQixHQUFHLFNBQXpCQSxzQkFBeUI7QUFBQSxNQUFDQyxZQUFELHVFQUFnQixFQUFoQjtBQUFBLFNBQ3BDO0FBQ0EscUNBQWNsQixhQUFkLGdEQUNLRyxnQkFBZ0IsQ0FBQ2dCLGlCQUR0QixHQUVLRCxZQUZMO0FBR0VBLE1BQUFBLFlBQVksRUFBWkE7QUFIRjtBQUZvQztBQUFBLENBQS9COzs7O2VBUVFELHNCQUFzQixFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtoYW5kbGVBY3Rpb25zfSBmcm9tICdyZWR1eC1hY3Rpb25zJztcbmltcG9ydCB7QWN0aW9uVHlwZXN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyBtYXBTdGF0ZVVwZGF0ZXJzIGZyb20gJy4vbWFwLXN0YXRlLXVwZGF0ZXJzJztcblxuLyoqXG4gKiBJbXBvcnRhbnQ6IERvIG5vdCByZW5hbWUgYGFjdGlvbkhhbmRsZXJgIG9yIHRoZSBhc3NpZ25tZW50IHBhdHRlcm4gb2YgcHJvcGVydHkgdmFsdWUuXG4gKiBJdCBpcyB1c2VkIHRvIGdlbmVyYXRlIGRvY3VtZW50YXRpb25cbiAqL1xuY29uc3QgYWN0aW9uSGFuZGxlciA9IHtcbiAgW0FjdGlvblR5cGVzLlVQREFURV9NQVBdOiBtYXBTdGF0ZVVwZGF0ZXJzLnVwZGF0ZU1hcFVwZGF0ZXIsXG4gIFtBY3Rpb25UeXBlcy5GSVRfQk9VTkRTXTogbWFwU3RhdGVVcGRhdGVycy5maXRCb3VuZHNVcGRhdGVyLFxuICBbQWN0aW9uVHlwZXMuVE9HR0xFX1BFUlNQRUNUSVZFXTogbWFwU3RhdGVVcGRhdGVycy50b2dnbGVQZXJzcGVjdGl2ZVVwZGF0ZXIsXG4gIFtBY3Rpb25UeXBlcy5SRUNFSVZFX01BUF9DT05GSUddOiBtYXBTdGF0ZVVwZGF0ZXJzLnJlY2VpdmVNYXBDb25maWdVcGRhdGVyLFxuICBbQWN0aW9uVHlwZXMuUkVTRVRfTUFQX0NPTkZJR106IG1hcFN0YXRlVXBkYXRlcnMucmVzZXRNYXBDb25maWdVcGRhdGVyLFxuICBbQWN0aW9uVHlwZXMuVE9HR0xFX1NQTElUX01BUF06IG1hcFN0YXRlVXBkYXRlcnMudG9nZ2xlU3BsaXRNYXBVcGRhdGVyLFxuICBbQWN0aW9uVHlwZXMuVE9HR0xFX1NQTElUX01BUF9WSUVXUE9SVF06IG1hcFN0YXRlVXBkYXRlcnMudG9nZ2xlU3BsaXRNYXBWaWV3cG9ydFVwZGF0ZXJcbn07XG5cbi8qIFJlZHVjZXIgKi9cbmV4cG9ydCBjb25zdCBtYXBTdGF0ZVJlZHVjZXJGYWN0b3J5ID0gKGluaXRpYWxTdGF0ZSA9IHt9KSA9PlxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGhhbmRsZUFjdGlvbnMoYWN0aW9uSGFuZGxlciwge1xuICAgIC4uLm1hcFN0YXRlVXBkYXRlcnMuSU5JVElBTF9NQVBfU1RBVEUsXG4gICAgLi4uaW5pdGlhbFN0YXRlLFxuICAgIGluaXRpYWxTdGF0ZVxuICB9KTtcblxuZXhwb3J0IGRlZmF1bHQgbWFwU3RhdGVSZWR1Y2VyRmFjdG9yeSgpO1xuIl19