kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
226 lines (194 loc) • 19.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.fitBoundsUpdater = exports.INITIAL_MAP_STATE = void 0;
exports.getMapDimForSplitMap = getMapDimForSplitMap;
exports.updateMapUpdater = exports.toggleSplitMapUpdater = exports.togglePerspectiveUpdater = exports.resetMapConfigUpdater = exports.receiveMapConfigUpdater = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _geoViewport = _interopRequireDefault(require("@mapbox/geo-viewport"));
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; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
/**
* Updaters for `mapState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
* Read more about [Using updaters](../advanced-usage/using-updaters.md)
* @public
* @example
*
* import keplerGlReducer, {mapStateUpdaters} from 'kepler.gl/reducers';
* // Root Reducer
* const reducers = combineReducers({
* keplerGl: keplerGlReducer,
* app: appReducer
* });
*
* const composedReducer = (state, action) => {
* switch (action.type) {
* // click button to close side panel
* case 'CLICK_BUTTON':
* return {
* ...state,
* keplerGl: {
* ...state.keplerGl,
* foo: {
* ...state.keplerGl.foo,
* mapState: mapStateUpdaters.fitBoundsUpdater(
* mapState, {payload: [127.34, 31.09, 127.56, 31.59]]}
* )
* }
* }
* };
* }
* return reducers(state, action);
* };
*
* export default composedReducer;
*/
/* eslint-disable no-unused-vars */
var mapStateUpdaters = null;
/* eslint-enable no-unused-vars */
/**
* Default initial `mapState`
* @memberof mapStateUpdaters
* @constant
* @property {number} pitch Default: `0`
* @property {number} bearing Default: `0`
* @property {number} latitude Default: `37.75043`
* @property {number} longitude Default: `-122.34679`
* @property {number} zoom Default: `9`
* @property {boolean} dragRotate Default: `false`
* @property {number} width Default: `800`
* @property {number} height Default: `800`
* @property {boolean} isSplit Default: `false`
* @public
*/
var INITIAL_MAP_STATE = exports.INITIAL_MAP_STATE = {
pitch: 0,
bearing: 0,
latitude: 37.75043,
longitude: -122.34679,
zoom: 9,
dragRotate: false,
width: 800,
height: 800,
isSplit: false
};
/* Updaters */
/**
* Update map viewport
* @memberof mapStateUpdaters
* @param {Object} state
* @param {Object} action
* @param {Object} action.payload - viewport
* @returns {Object} nextState
* @public
*/
var updateMapUpdater = exports.updateMapUpdater = function updateMapUpdater(state, action) {
return _objectSpread(_objectSpread({}, state), action.payload || {});
};
/**
* Fit map viewport to bounds
* @memberof mapStateUpdaters
* @param {Object} state
* @param {Object} action
* @param {number[]} action.payload - bounds as `[lngMin, latMin, lngMax, latMax]`
* @returns {Object} nextState
* @public
*/
var fitBoundsUpdater = exports.fitBoundsUpdater = function fitBoundsUpdater(state, action) {
var bounds = action.payload;
var _geoViewport$viewport = _geoViewport["default"].viewport(bounds, [state.width, state.height]),
center = _geoViewport$viewport.center,
zoom = _geoViewport$viewport.zoom;
return _objectSpread(_objectSpread({}, state), {}, {
latitude: center[1],
longitude: center[0],
zoom: zoom
});
};
/**
* Toggle between 3d and 2d map.
* @memberof mapStateUpdaters
* @param {Object} state
* @returns {Object} nextState
* @public
*/
var togglePerspectiveUpdater = exports.togglePerspectiveUpdater = function togglePerspectiveUpdater(state) {
return _objectSpread(_objectSpread(_objectSpread({}, state), {
pitch: state.dragRotate ? 0 : 50,
bearing: state.dragRotate ? 0 : 24
}), {}, {
dragRotate: !state.dragRotate
});
};
/**
* reset mapState to initial State
* @memberof mapStateUpdaters
* @param {Object} state `mapState`
* @returns {Object} nextState
* @public
*/
var resetMapConfigUpdater = exports.resetMapConfigUpdater = function resetMapConfigUpdater(state) {
return _objectSpread(_objectSpread(_objectSpread({}, INITIAL_MAP_STATE), state.initialState), {}, {
initialState: state.initialState
});
}; // consider case where you have a split map and user wants to reset
/**
* Update `mapState` to propagate a new config
* @memberof mapStateUpdaters
* @param {Object} state
* @param {Object} action
* @param {Object} action.payload - saved map config
* @returns {Object} nextState
* @public
*/
var receiveMapConfigUpdater = exports.receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref) {
var _ref$payload = _ref.payload,
_ref$payload$config = _ref$payload.config,
config = _ref$payload$config === void 0 ? {} : _ref$payload$config,
_ref$payload$options = _ref$payload.options,
options = _ref$payload$options === void 0 ? {} : _ref$payload$options,
_ref$payload$bounds = _ref$payload.bounds,
bounds = _ref$payload$bounds === void 0 ? null : _ref$payload$bounds;
var mapState = config.mapState; // merged received mapstate with previous state
var mergedState = _objectSpread(_objectSpread({}, state), mapState); // if center map
// center map will override mapState config
if (options.centerMap && bounds) {
mergedState = fitBoundsUpdater(mergedState, {
payload: bounds
});
}
return _objectSpread(_objectSpread({}, mergedState), getMapDimForSplitMap(mergedState.isSplit, state));
};
/**
* Toggle between one or split maps
* @memberof mapStateUpdaters
* @param {Object} state
* @returns {Object} nextState
* @public
*/
var toggleSplitMapUpdater = exports.toggleSplitMapUpdater = function toggleSplitMapUpdater(state) {
return _objectSpread(_objectSpread({}, state), {}, {
isSplit: !state.isSplit
}, getMapDimForSplitMap(!state.isSplit, state));
}; // Helpers
function getMapDimForSplitMap(isSplit, state) {
// cases:
// 1. state split: true - isSplit: true
// do nothing
// 2. state split: false - isSplit: false
// do nothing
if (state.isSplit === isSplit) {
return {};
}
var width = state.isSplit && !isSplit ? // 3. state split: true - isSplit: false
// double width
state.width * 2 : // 4. state split: false - isSplit: true
// split width
state.width / 2;
return {
width: width
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWR1Y2Vycy9tYXAtc3RhdGUtdXBkYXRlcnMuanMiXSwibmFtZXMiOlsibWFwU3RhdGVVcGRhdGVycyIsIklOSVRJQUxfTUFQX1NUQVRFIiwicGl0Y2giLCJiZWFyaW5nIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJ6b29tIiwiZHJhZ1JvdGF0ZSIsIndpZHRoIiwiaGVpZ2h0IiwiaXNTcGxpdCIsInVwZGF0ZU1hcFVwZGF0ZXIiLCJzdGF0ZSIsImFjdGlvbiIsInBheWxvYWQiLCJmaXRCb3VuZHNVcGRhdGVyIiwiYm91bmRzIiwiZ2VvVmlld3BvcnQiLCJ2aWV3cG9ydCIsImNlbnRlciIsInRvZ2dsZVBlcnNwZWN0aXZlVXBkYXRlciIsInJlc2V0TWFwQ29uZmlnVXBkYXRlciIsImluaXRpYWxTdGF0ZSIsInJlY2VpdmVNYXBDb25maWdVcGRhdGVyIiwiY29uZmlnIiwib3B0aW9ucyIsIm1hcFN0YXRlIiwibWVyZ2VkU3RhdGUiLCJjZW50ZXJNYXAiLCJnZXRNYXBEaW1Gb3JTcGxpdE1hcCIsInRvZ2dsZVNwbGl0TWFwVXBkYXRlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQW9CQTs7Ozs7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1DQTtBQUNBLElBQU1BLGdCQUFnQixHQUFHLElBQXpCO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlTyxJQUFNQyxpQkFBaUIsK0JBQUc7QUFDL0JDLEVBQUFBLEtBQUssRUFBRSxDQUR3QjtBQUUvQkMsRUFBQUEsT0FBTyxFQUFFLENBRnNCO0FBRy9CQyxFQUFBQSxRQUFRLEVBQUUsUUFIcUI7QUFJL0JDLEVBQUFBLFNBQVMsRUFBRSxDQUFDLFNBSm1CO0FBSy9CQyxFQUFBQSxJQUFJLEVBQUUsQ0FMeUI7QUFNL0JDLEVBQUFBLFVBQVUsRUFBRSxLQU5tQjtBQU8vQkMsRUFBQUEsS0FBSyxFQUFFLEdBUHdCO0FBUS9CQyxFQUFBQSxNQUFNLEVBQUUs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QWlCRSxLQUFqQixDQUhpQjtBQUFBLENBQW5DLEMsQ0FNUDs7O0FBQ08sU0FBU2lCLG9CQUFULENBQThCbkIsT0FBOUIsRUFBdUNFLEtBQXZDLEVBQThDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFJQSxLQUFLLENBQUNGLE9BQU4sS0FBa0JBLE9BQXRCLEVBQStCO0FBQzdCLFdBQU8sRUFBUDtBQUNEOztBQUVELE1BQU1GLEtBQUssR0FDVEksS0FBSyxDQUFDRixPQUFOLElBQWlCLENBQUNBLE9BQWxCLEdBQ0k7QUFDQTtBQUNBRSxFQUFBQSxLQUFLLENBQUNKLEtBQU4sR0FBYyxDQUhsQixHQUlJO0FBQ0E7QUFDQUksRUFBQUEsS0FBSyxDQUFDSixLQUFOLEdBQWMsQ0FQcEI7QUFTQSxTQUFPO0FBQ0xBLElBQUFBLEtBQUssRUFBTEE7QUFESyxHQUFQO0FBR0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgZ2VvVmlld3BvcnQgZnJvbSAnQG1hcGJveC9nZW8tdmlld3BvcnQnO1xuXG4vKipcbiAqIFVwZGF0ZXJzIGZvciBgbWFwU3RhdGVgIHJlZHVjZXIuIENhbiBiZSB1c2VkIGluIHlvdXIgcm9vdCByZWR1Y2VyIHRvIGRpcmVjdGx5IG1vZGlmeSBrZXBsZXIuZ2wncyBzdGF0ZS5cbiAqIFJlYWQgbW9yZSBhYm91dCBbVXNpbmcgdXBkYXRlcnNdKC4uL2FkdmFuY2VkLXVzYWdlL3VzaW5nLXVwZGF0ZXJzLm1kKVxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7bWFwU3RhdGVVcGRhdGVyc30gZnJvbSAna2VwbGVyLmdsL3JlZHVjZXJzJztcbiAqIC8vIFJvb3QgUmVkdWNlclxuICogY29uc3QgcmVkdWNlcnMgPSBjb21iaW5lUmVkdWNlcnMoe1xuICogIGtlcGxlckdsOiBrZXBsZXJHbFJlZHVjZXIsXG4gKiAgYXBwOiBhcHBSZWR1Y2VyXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBjb21wb3NlZFJlZHVjZXIgPSAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICogIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAqICAgIC8vIGNsaWNrIGJ1dHRvbiB0byBjbG9zZSBzaWRlIHBhbmVsXG4gKiAgICBjYXNlICdDTElDS19CVVRUT04nOlxuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC4uLnN0YXRlLFxuICogICAgICAgIGtlcGxlckdsOiB7XG4gKiAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbCxcbiAqICAgICAgICAgIGZvbzoge1xuICogICAgICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wuZm9vLFxuICogICAgICAgICAgICAgbWFwU3RhdGU6IG1hcFN0YXRlVXBkYXRlcnMuZml0Qm91bmRzVXBkYXRlcihcbiAqICAgICAgICAgICAgICAgbWFwU3RhdGUsIHtwYXlsb2FkOiBbMTI3LjM0LCAzMS4wOSwgMTI3LjU2LCAzMS41OV1dfVxuICogICAgICAgICAgICAgKVxuICogICAgICAgICAgfVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5jb25zdCBtYXBTdGF0ZVVwZGF0ZXJzID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYG1hcFN0YXRlYFxuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBpdGNoIERlZmF1bHQ6IGAwYFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJlYXJpbmcgRGVmYXVsdDogYDBgXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGF0aXR1ZGUgRGVmYXVsdDogYDM3Ljc1MDQzYFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvbmdpdHVkZSBEZWZhdWx0OiBgLTEyMi4zNDY3OWBcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB6b29tIERlZmF1bHQ6IGA5YFxuICogQHByb3BlcnR5IHtib29sZWFufSBkcmFnUm90YXRlIERlZmF1bHQ6IGBmYWxzZWBcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCBEZWZhdWx0OiBgODAwYFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodCBEZWZhdWx0OiBgODAwYFxuICogQHByb3BlcnR5IHtib29sZWFufSBpc1NwbGl0IERlZmF1bHQ6IGBmYWxzZWBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IElOSVRJQUxfTUFQX1NUQVRFID0ge1xuICBwaXRjaDogMCxcbiAgYmVhcmluZzogMCxcbiAgbGF0aXR1ZGU6IDM3Ljc1MDQzLFxuICBsb25naXR1ZGU6IC0xMjIuMzQ2NzksXG4gIHpvb206IDksXG4gIGRyYWdSb3RhdGU6IGZhbHNlLFxuICB3aWR0aDogODAwLFxuICBoZWlnaHQ6IDgwMCxcbiAgaXNTcGxpdDogZmFsc2Vcbn07XG5cbi8qIFVwZGF0ZXJzICovXG4vKipcbiAqIFVwZGF0ZSBtYXAgdmlld3BvcnRcbiAqIEBtZW1iZXJvZiBtYXBTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24ucGF5bG9hZCAtIHZpZXdwb3J0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZU1hcFVwZGF0ZXIgPSAoc3RhdGUsIGFjdGlvbikgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIC4uLihhY3Rpb24ucGF5bG9hZCB8fCB7fSlcbn0pO1xuXG4vKipcbiAqIEZpdCBtYXAgdmlld3BvcnQgdG8gYm91bmRzXG4gKiBAbWVtYmVyb2YgbWFwU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcGFyYW0ge251bWJlcltdfSBhY3Rpb24ucGF5bG9hZCAtIGJvdW5kcyBhcyBgW2xuZ01pbiwgbGF0TWluLCBsbmdNYXgsIGxhdE1heF1gXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGZpdEJvdW5kc1VwZGF0ZXIgPSAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICBjb25zdCBib3VuZHMgPSBhY3Rpb24ucGF5bG9hZDtcbiAgY29uc3Qge2NlbnRlciwgem9vbX0gPSBnZW9WaWV3cG9ydC52aWV3cG9ydChib3VuZHMsIFtcbiAgICBzdGF0ZS53aWR0aCxcbiAgICBzdGF0ZS5oZWlnaHRcbiAgXSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXRpdHVkZTogY2VudGVyWzFdLFxuICAgIGxvbmdpdHVkZTogY2VudGVyWzBdLFxuICAgIHpvb21cbiAgfTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIGJldHdlZW4gM2QgYW5kIDJkIG1hcC5cbiAqIEBtZW1iZXJvZiBtYXBTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlUGVyc3BlY3RpdmVVcGRhdGVyID0gc3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIC4uLntcbiAgICBwaXRjaDogc3RhdGUuZHJhZ1JvdGF0ZSA/IDAgOiA1MCxcbiAgICBiZWFyaW5nOiBzdGF0ZS5kcmFnUm90YXRlID8gMCA6IDI0XG4gIH0sXG4gIGRyYWdSb3RhdGU6ICFzdGF0ZS5kcmFnUm90YXRlXG59KTtcblxuLyoqXG4gKiByZXNldCBtYXBTdGF0ZSB0byBpbml0aWFsIFN0YXRlXG4gKiBAbWVtYmVyb2YgbWFwU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGBtYXBTdGF0ZWBcbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVzZXRNYXBDb25maWdVcGRhdGVyID0gc3RhdGUgPT4gKHtcbiAgLi4uSU5JVElBTF9NQVBfU1RBVEUsXG4gIC4uLnN0YXRlLmluaXRpYWxTdGF0ZSxcbiAgaW5pdGlhbFN0YXRlOiBzdGF0ZS5pbml0aWFsU3RhdGVcbn0pO1xuXG4vLyBjb25zaWRlciBjYXNlIHdoZXJlIHlvdSBoYXZlIGEgc3BsaXQgbWFwIGFuZCB1c2VyIHdhbnRzIHRvIHJlc2V0XG4vKipcbiAqIFVwZGF0ZSBgbWFwU3RhdGVgIHRvIHByb3BhZ2F0ZSBhIG5ldyBjb25maWdcbiAqIEBtZW1iZXJvZiBtYXBTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24ucGF5bG9hZCAtIHNhdmVkIG1hcCBjb25maWdcbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlLFxuICB7cGF5bG9hZDoge2NvbmZpZyA9IHt9LCBvcHRpb25zID0ge30sIGJvdW5kcyA9IG51bGx9fVxuKSA9PiB7XG4gIGNvbnN0IHttYXBTdGF0ZX0gPSBjb25maWc7XG5cbiAgLy8gbWVyZ2VkIHJlY2VpdmVkIG1hcHN0YXRlIHdpdGggcHJldmlvdXMgc3RhdGVcbiAgbGV0IG1lcmdlZFN0YXRlID0gey4uLnN0YXRlLCAuLi5tYXBTdGF0ZX07XG5cbiAgLy8gaWYgY2VudGVyIG1hcFxuICAvLyBjZW50ZXIgbWFwIHdpbGwgb3ZlcnJpZGUgbWFwU3RhdGUgY29uZmlnXG4gIGlmIChvcHRpb25zLmNlbnRlck1hcCAmJiBib3VuZHMpIHtcbiAgICBtZXJnZWRTdGF0ZSA9IGZpdEJvdW5kc1VwZGF0ZXIobWVyZ2VkU3RhdGUsIHtcbiAgICAgIHBheWxvYWQ6IGJvdW5kc1xuICAgIH0pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLm1lcmdlZFN0YXRlLFxuICAgIC8vIHVwZGF0ZSB3aWR0aCBpZiBgaXNTcGxpdGAgaGFzIGNoYW5nZWRcbiAgICAuLi5nZXRNYXBEaW1Gb3JTcGxpdE1hcChtZXJnZWRTdGF0ZS5pc1NwbGl0LCBzdGF0ZSlcbiAgfTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIGJldHdlZW4gb25lIG9yIHNwbGl0IG1hcHNcbiAqIEBtZW1iZXJvZiBtYXBTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlU3BsaXRNYXBVcGRhdGVyID0gc3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGlzU3BsaXQ6ICFzdGF0ZS5pc1NwbGl0LFxuICAuLi5nZXRNYXBEaW1Gb3JTcGxpdE1hcCghc3RhdGUuaXNTcGxpdCwgc3RhdGUpXG59KTtcblxuLy8gSGVscGVyc1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcERpbUZvclNwbGl0TWFwKGlzU3BsaXQsIHN0YXRlKSB7XG4gIC8vIGNhc2VzOlxuICAvLyAxLiBzdGF0ZSBzcGxpdDogdHJ1ZSAtIGlzU3BsaXQ6IHRydWVcbiAgLy8gZG8gbm90aGluZ1xuICAvLyAyLiBzdGF0ZSBzcGxpdDogZmFsc2UgLSBpc1NwbGl0OiBmYWxzZVxuICAvLyBkbyBub3RoaW5nXG4gIGlmIChzdGF0ZS5pc1NwbGl0ID09PSBpc1NwbGl0KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3Qgd2lkdGggPVxuICAgIHN0YXRlLmlzU3BsaXQgJiYgIWlzU3BsaXRcbiAgICAgID8gLy8gMy4gc3RhdGUgc3BsaXQ6IHRydWUgLSBpc1NwbGl0OiBmYWxzZVxuICAgICAgICAvLyBkb3VibGUgd2lkdGhcbiAgICAgICAgc3RhdGUud2lkdGggKiAyXG4gICAgICA6IC8vIDQuIHN0YXRlIHNwbGl0OiBmYWxzZSAtIGlzU3BsaXQ6IHRydWVcbiAgICAgICAgLy8gc3BsaXQgd2lkdGhcbiAgICAgICAgc3RhdGUud2lkdGggLyAyO1xuXG4gIHJldHVybiB7XG4gICAgd2lkdGhcbiAgfTtcbn1cbiJdfQ==