kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
207 lines (198 loc) • 32.3 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
exports.provideInitialState = provideInitialState;
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _actions = require("@kepler.gl/actions");
var _reduxActions = require("redux-actions");
var _core = require("./core");
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; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
// Extend this type with additional actions to enforce strict typings
// INITIAL_STATE
var initialCoreState = {};
function provideInitialState(initialState, extraReducers) {
var coreReducer = (0, _core.coreReducerFactory)(initialState, extraReducers);
var handleRegisterEntry = function handleRegisterEntry(state, _ref) {
var _ref$payload = _ref.payload,
id = _ref$payload.id,
mint = _ref$payload.mint,
mapboxApiAccessToken = _ref$payload.mapboxApiAccessToken,
mapboxApiUrl = _ref$payload.mapboxApiUrl,
mapStylesReplaceDefault = _ref$payload.mapStylesReplaceDefault,
initialUiState = _ref$payload.initialUiState;
// by default, always create a mint state even if the same id already exist
// if state.id exist and mint=false, keep the existing state
var previousState = state[id] && mint === false ? state[id] : undefined;
return _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, id, coreReducer(previousState, (0, _actions.keplerGlInit)({
mapboxApiAccessToken: mapboxApiAccessToken,
mapboxApiUrl: mapboxApiUrl,
mapStylesReplaceDefault: mapStylesReplaceDefault,
initialUiState: initialUiState
}))));
};
var handleDeleteEntry = function handleDeleteEntry(state, _ref2) {
var id = _ref2.payload.id;
return Object.keys(state).reduce(function (accu, curr) {
return _objectSpread(_objectSpread({}, accu), curr === id ? {} : (0, _defineProperty2["default"])({}, curr, state[curr]));
}, {});
};
var handleRenameEntry = function handleRenameEntry(state, _ref4) {
var _ref4$payload = _ref4.payload,
oldId = _ref4$payload.oldId,
newId = _ref4$payload.newId;
return Object.keys(state).reduce(function (accu, curr) {
return _objectSpread(_objectSpread({}, accu), (0, _defineProperty2["default"])({}, curr === oldId ? newId : curr, state[curr]));
}, {});
};
return function () {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialCoreState;
var action = arguments.length > 1 ? arguments[1] : undefined;
// update child states
Object.keys(state).forEach(function (id) {
var updateItemState = coreReducer(state[id], (0, _actions._actionFor)(id, action));
state = (0, _actions._updateProperty)(state, id, updateItemState);
});
// perform additional state reducing (e.g. switch action.type etc...)
var handlers = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _actions.ActionTypes.REGISTER_ENTRY, handleRegisterEntry), _actions.ActionTypes.DELETE_ENTRY, handleDeleteEntry), _actions.ActionTypes.RENAME_ENTRY, handleRenameEntry);
return (0, _reduxActions.handleActions)(handlers, initialCoreState)(state, action);
};
}
var _keplerGlReducer = provideInitialState(initialCoreState);
function mergeInitialState() {
var saved = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var provided = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var extraInitialStateKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
var keys = ['mapState', 'mapStyle', 'visState', 'uiState'].concat((0, _toConsumableArray2["default"])(extraInitialStateKeys));
// shallow merge each reducer
var newState = keys.reduce(function (accu, key) {
return _objectSpread(_objectSpread({}, accu), saved[key] && provided[key] ? (0, _defineProperty2["default"])({}, key, _objectSpread(_objectSpread({}, saved[key]), provided[key])) : (0, _defineProperty2["default"])({}, key, saved[key] || provided[key] || {}));
}, {});
return newState;
}
function decorate(target) {
var savedInitialState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var targetInitialState = savedInitialState;
/**
* Returns a kepler.gl reducer that will also pass each action through additional reducers spiecified.
* The parameter should be either a reducer map or a reducer function.
* The state passed into the additional action handler is the instance state.
* It will include all the subreducers `visState`, `uiState`, `mapState` and `mapStyle`.
* `.plugin` is only meant to be called once when mounting the keplerGlReducer to the store.
* **Note** This is an advanced option to give you more freedom to modify the internal state of the kepler.gl instance.
* You should only use this to adding additional actions instead of replacing default actions.
*
* @mixin keplerGlReducer.plugin
* @memberof keplerGlReducer
* @param {Object|Function} customReducer - A reducer map or a reducer
* @param {Object} options - options to be applied to custom reducer logic
* @param {Object} options.override - objects that describe which action to override, e.g. {[ActionTypes.LAYER_TYPE_CHANGE]: true}
* @public
* @example
* const myKeplerGlReducer = keplerGlReducer
* .plugin({
* // 1. as reducer map
* HIDE_AND_SHOW_SIDE_PANEL: (state, action) => ({
* ...state,
* uiState: {
* ...state.uiState,
* readOnly: !state.uiState.readOnly
* }
* })
* })
* .plugin(handleActions({
* // 2. as reducer
* 'HIDE_MAP_CONTROLS': (state, action) => ({
* ...state,
* uiState: {
* ...state.uiState,
* mapControls: hiddenMapControl
* }
* })
* }, {}));
*/
target.plugin = function plugin(customReducer, options) {
var _this = this;
if ((0, _typeof2["default"])(customReducer) === 'object') {
// if only provided a reducerMap, wrap it in a reducer
customReducer = (0, _reduxActions.handleActions)(customReducer, {});
}
// use 'function' keyword to enable 'this'
// TODO: temporarily making action type to any, will fix that by creating a shared action interface
return decorate(function () {
var _options$override;
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var nextState = state;
if (action.type && !(options !== null && options !== void 0 && (_options$override = options.override) !== null && _options$override !== void 0 && _options$override[action.type])) {
nextState = _this(state, action);
}
// for each entry in the staten
Object.keys(nextState).forEach(function (id) {
// update child states
nextState = (0, _actions._updateProperty)(nextState, id, customReducer(nextState[id], (0, _actions._actionFor)(id, action)));
});
return nextState;
});
};
/**
* Return a reducer that initiated with custom initial state.
* The parameter should be an object mapping from `subreducer` name to custom subreducer state,
* which will be shallow **merged** with default initial state.
*
* Default subreducer state:
* - [`visState`](./vis-state.md#INITIAL_VIS_STATE)
* - [`mapState`](./map-state.md#INITIAL_MAP_STATE)
* - [`mapStyle`](./map-style.md#INITIAL_MAP_STYLE)
* - [`uiState`](./ui-state.md#INITIAL_UI_STATE)
* @mixin keplerGlReducer.initialState
* @memberof keplerGlReducer
* @param {Object} iniSt - custom state to be merged with default initial state
* @param {Object} extraReducers - optional custom reducers in addition to the default `visState`, `mapState`, `mapStyle`, and `uiState`
* @public
* @example
* const myKeplerGlReducer = keplerGlReducer
* .initialState({
* uiState: {readOnly: true}
* });
*/
target.initialState = function initialState(iniSt) {
var extraReducers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
// passing through extraInitialStateKeys and extraReducers allows external customization by adding additional subreducers and state beyond the default `visState`, `mapState`, `mapStyle`, and `uiState`
var extraInitialStateKeys = Object.keys(extraReducers);
var merged = mergeInitialState(targetInitialState, iniSt, extraInitialStateKeys);
var targetReducer = provideInitialState(merged, extraReducers);
return decorate(targetReducer, merged);
};
return target;
}
/**
* Kepler.gl reducer to be mounted to your store. You can mount `keplerGlReducer` at property `keplerGl`, if you choose
* to mount it at another address e.g. `foo` you will need to specify it when you mount `KeplerGl` component in your app with `getState: state => state.foo`
* @public
* @example
* import keplerGlReducer from '@kepler.gl/reducers';
* import {createStore, combineReducers, applyMiddleware, compose} from 'redux';
* import {taskMiddleware} from 'react-palm/tasks';
*
* const initialState = {};
* const reducers = combineReducers({
* // <-- mount kepler.gl reducer in your app
* keplerGl: keplerGlReducer,
*
* // Your other reducers here
* app: appReducer
* });
*
* // using createStore
* export default createStore(reducer, initialState, applyMiddleware(taskMiddleware));
*/
var keplerGlReducer = decorate(_keplerGlReducer);
var _default = exports["default"] = keplerGlReducer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWN0aW9ucyIsInJlcXVpcmUiLCJfcmVkdXhBY3Rpb25zIiwiX2NvcmUiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImluaXRpYWxDb3JlU3RhdGUiLCJwcm92aWRlSW5pdGlhbFN0YXRlIiwiaW5pdGlhbFN0YXRlIiwiZXh0cmFSZWR1Y2VycyIsImNvcmVSZWR1Y2VyIiwiY29yZVJlZHVjZXJGYWN0b3J5IiwiaGFuZGxlUmVnaXN0ZXJFbnRyeSIsInN0YXRlIiwiX3JlZiIsIl9yZWYkcGF5bG9hZCIsInBheWxvYWQiLCJpZCIsIm1pbnQiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsIm1hcGJveEFwaVVybCIsIm1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0IiwiaW5pdGlhbFVpU3RhdGUiLCJwcmV2aW91c1N0YXRlIiwidW5kZWZpbmVkIiwia2VwbGVyR2xJbml0IiwiaGFuZGxlRGVsZXRlRW50cnkiLCJfcmVmMiIsInJlZHVjZSIsImFjY3UiLCJjdXJyIiwiaGFuZGxlUmVuYW1lRW50cnkiLCJfcmVmNCIsIl9yZWY0JHBheWxvYWQiLCJvbGRJZCIsIm5ld0lkIiwiYWN0aW9uIiwidXBkYXRlSXRlbVN0YXRlIiwiX2FjdGlvbkZvciIsIl91cGRhdGVQcm9wZXJ0eSIsImhhbmRsZXJzIiwiQWN0aW9uVHlwZXMiLCJSRUdJU1RFUl9FTlRSWSIsIkRFTEVURV9FTlRSWSIsIlJFTkFNRV9FTlRSWSIsImhhbmRsZUFjdGlvbnMiLCJfa2VwbGVyR2xSZWR1Y2VyIiwibWVyZ2VJbml0aWFsU3RhdGUiLCJzYXZlZCIsInByb3ZpZGVkIiwiZXh0cmFJbml0aWFsU3RhdGVLZXlzIiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIm5ld1N0YXRlIiwia2V5IiwiZGVjb3JhdGUiLCJ0YXJnZXQiLCJzYXZlZEluaXRpYWxTdGF0ZSIsInRhcmdldEluaXRpYWxTdGF0ZSIsInBsdWdpbiIsImN1c3RvbVJlZHVjZXIiLCJvcHRpb25zIiwiX3RoaXMiLCJfdHlwZW9mMiIsIl9vcHRpb25zJG92ZXJyaWRlIiwibmV4dFN0YXRlIiwidHlwZSIsIm92ZXJyaWRlIiwiaW5pU3QiLCJtZXJnZWQiLCJ0YXJnZXRSZWR1Y2VyIiwia2VwbGVyR2xSZWR1Y2VyIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3Jvb3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtcbiAgQWN0aW9uVHlwZXMsXG4gIGtlcGxlckdsSW5pdCxcbiAgX2FjdGlvbkZvcixcbiAgX3VwZGF0ZVByb3BlcnR5LFxuICBSZWdpc3RlckVudHJ5VXBkYXRlckFjdGlvbixcbiAgUmVuYW1lRW50cnlVcGRhdGVyQWN0aW9uXG59IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge2hhbmRsZUFjdGlvbnN9IGZyb20gJ3JlZHV4LWFjdGlvbnMnO1xuXG5pbXBvcnQge2NvcmVSZWR1Y2VyRmFjdG9yeSwgS2VwbGVyR2xTdGF0ZX0gZnJvbSAnLi9jb3JlJztcblxudHlwZSBLZXBsZXJHbFN0YXRlTWFwID0ge1xuICBbaWQ6IHN0cmluZ106IFBhcnRpYWw8S2VwbGVyR2xTdGF0ZT47XG59O1xuXG50eXBlIENvbWJpbmVSZWdpc3RlclVwZGF0ZUFjdGlvbnMgPSBSZWdpc3RlckVudHJ5VXBkYXRlckFjdGlvblsncGF5bG9hZCddICZcbiAgUmVuYW1lRW50cnlVcGRhdGVyQWN0aW9uWydwYXlsb2FkJ107IC8vIEV4dGVuZCB0aGlzIHR5cGUgd2l0aCBhZGRpdGlvbmFsIGFjdGlvbnMgdG8gZW5mb3JjZSBzdHJpY3QgdHlwaW5nc1xuXG4vLyBJTklUSUFMX1NUQVRFXG5jb25zdCBpbml0aWFsQ29yZVN0YXRlID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlSW5pdGlhbFN0YXRlKGluaXRpYWxTdGF0ZSwgZXh0cmFSZWR1Y2Vycz8pIHtcbiAgY29uc3QgY29yZVJlZHVjZXIgPSBjb3JlUmVkdWNlckZhY3RvcnkoaW5pdGlhbFN0YXRlLCBleHRyYVJlZHVjZXJzKTtcblxuICBjb25zdCBoYW5kbGVSZWdpc3RlckVudHJ5ID0gKFxuICAgIHN0YXRlOiBLZXBsZXJHbFN0YXRlTWFwLFxuICAgIHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgaWQsXG4gICAgICAgIG1pbnQsXG4gICAgICAgIG1hcGJveEFwaUFjY2Vzc1Rva2VuLFxuICAgICAgICBtYXBib3hBcGlVcmwsXG4gICAgICAgIG1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0LFxuICAgICAgICBpbml0aWFsVWlTdGF0ZVxuICAgICAgfVxuICAgIH06IHtcbiAgICAgIHBheWxvYWQ6IFJlZ2lzdGVyRW50cnlVcGRhdGVyQWN0aW9uWydwYXlsb2FkJ107XG4gICAgfVxuICApOiBLZXBsZXJHbFN0YXRlTWFwID0+IHtcbiAgICAvLyBieSBkZWZhdWx0LCBhbHdheXMgY3JlYXRlIGEgbWludCBzdGF0ZSBldmVuIGlmIHRoZSBzYW1lIGlkIGFscmVhZHkgZXhpc3RcbiAgICAvLyBpZiBzdGF0ZS5pZCBleGlzdCBhbmQgbWludD1mYWxzZSwga2VlcCB0aGUgZXhpc3Rpbmcgc3RhdGVcbiAgICBjb25zdCBwcmV2aW91c1N0YXRlID0gc3RhdGVbaWRdICYmIG1pbnQgPT09IGZhbHNlID8gc3RhdGVbaWRdIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIHJlZ2lzdGVyIGVudHJ5IHRvIGtlcGxlci5nbCBwYXNzaW5nIGluIG1hcGJveCBjb25maWcgdG8gbWFwU3R5bGVcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgW2lkXTogY29yZVJlZHVjZXIoXG4gICAgICAgIHByZXZpb3VzU3RhdGUsXG4gICAgICAgIGtlcGxlckdsSW5pdCh7bWFwYm94QXBpQWNjZXNzVG9rZW4sIG1hcGJveEFwaVVybCwgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQsIGluaXRpYWxVaVN0YXRlfSlcbiAgICAgIClcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZUVudHJ5ID0gKFxuICAgIHN0YXRlOiBLZXBsZXJHbFN0YXRlTWFwLFxuICAgIHtwYXlsb2FkOiB7aWR9fToge3BheWxvYWQ6IHtpZDogc3RyaW5nfX1cbiAgKTogS2VwbGVyR2xTdGF0ZU1hcCA9PlxuICAgIE9iamVjdC5rZXlzKHN0YXRlKS5yZWR1Y2UoXG4gICAgICAoYWNjdSwgY3VycikgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgLi4uKGN1cnIgPT09IGlkID8ge30gOiB7W2N1cnJdOiBzdGF0ZVtjdXJyXX0pXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICBjb25zdCBoYW5kbGVSZW5hbWVFbnRyeSA9IChcbiAgICBzdGF0ZTogS2VwbGVyR2xTdGF0ZU1hcCxcbiAgICB7XG4gICAgICBwYXlsb2FkOiB7b2xkSWQsIG5ld0lkfVxuICAgIH06IHtcbiAgICAgIHBheWxvYWQ6IFJlbmFtZUVudHJ5VXBkYXRlckFjdGlvblsncGF5bG9hZCddO1xuICAgIH1cbiAgKTogS2VwbGVyR2xTdGF0ZU1hcCA9PlxuICAgIE9iamVjdC5rZXlzKHN0YXRlKS5yZWR1Y2UoXG4gICAgICAoYWNjdSwgY3VycikgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgLi4ue1tjdXJyID09PSBvbGRJZCA/IG5ld0lkIDogY3Vycl06IHN0YXRlW2N1cnJdfVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG5cbiAgcmV0dXJuIChzdGF0ZSA9IGluaXRpYWxDb3JlU3RhdGUsIGFjdGlvbikgPT4ge1xuICAgIC8vIHVwZGF0ZSBjaGlsZCBzdGF0ZXNcbiAgICBPYmplY3Qua2V5cyhzdGF0ZSkuZm9yRWFjaChpZCA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVJdGVtU3RhdGUgPSBjb3JlUmVkdWNlcihzdGF0ZVtpZF0sIF9hY3Rpb25Gb3IoaWQsIGFjdGlvbikpO1xuICAgICAgc3RhdGUgPSBfdXBkYXRlUHJvcGVydHkoc3RhdGUsIGlkLCB1cGRhdGVJdGVtU3RhdGUpO1xuICAgIH0pO1xuXG4gICAgLy8gcGVyZm9ybSBhZGRpdGlvbmFsIHN0YXRlIHJlZHVjaW5nIChlLmcuIHN3aXRjaCBhY3Rpb24udHlwZSBldGMuLi4pXG4gICAgY29uc3QgaGFuZGxlcnMgPSB7XG4gICAgICBbQWN0aW9uVHlwZXMuUkVHSVNURVJfRU5UUlldOiBoYW5kbGVSZWdpc3RlckVudHJ5LFxuICAgICAgW0FjdGlvblR5cGVzLkRFTEVURV9FTlRSWV06IGhhbmRsZURlbGV0ZUVudHJ5LFxuICAgICAgW0FjdGlvblR5cGVzLlJFTkFNRV9FTlRSWV06IGhhbmRsZVJlbmFtZUVudHJ5XG4gICAgfTtcblxuICAgIHJldHVybiBoYW5kbGVBY3Rpb25zPEtlcGxlckdsU3RhdGVNYXAsIENvbWJpbmVSZWdpc3RlclVwZGF0ZUFjdGlvbnM+KFxuICAgICAgaGFuZGxlcnMsXG4gICAgICBpbml0aWFsQ29yZVN0YXRlXG4gICAgKShzdGF0ZSwgYWN0aW9uKTtcbiAgfTtcbn1cblxuY29uc3QgX2tlcGxlckdsUmVkdWNlciA9IHByb3ZpZGVJbml0aWFsU3RhdGUoaW5pdGlhbENvcmVTdGF0ZSk7XG5cbmZ1bmN0aW9uIG1lcmdlSW5pdGlhbFN0YXRlKHNhdmVkID0ge30sIHByb3ZpZGVkID0ge30sIGV4dHJhSW5pdGlhbFN0YXRlS2V5czogc3RyaW5nW10gPSBbXSkge1xuICBjb25zdCBrZXlzID0gWydtYXBTdGF0ZScsICdtYXBTdHlsZScsICd2aXNTdGF0ZScsICd1aVN0YXRlJywgLi4uZXh0cmFJbml0aWFsU3RhdGVLZXlzXTtcblxuICAvLyBzaGFsbG93IG1lcmdlIGVhY2ggcmVkdWNlclxuICBjb25zdCBuZXdTdGF0ZSA9IGtleXMucmVkdWNlKFxuICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgLi4uKHNhdmVkW2tleV0gJiYgcHJvdmlkZWRba2V5XVxuICAgICAgICA/IHtba2V5XTogey4uLnNhdmVkW2tleV0sIC4uLnByb3ZpZGVkW2tleV19fVxuICAgICAgICA6IHtba2V5XTogc2F2ZWRba2V5XSB8fCBwcm92aWRlZFtrZXldIHx8IHt9fSlcbiAgICB9KSxcbiAgICB7fVxuICApO1xuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuZnVuY3Rpb24gZGVjb3JhdGUodGFyZ2V0LCBzYXZlZEluaXRpYWxTdGF0ZSA9IHt9KSB7XG4gIGNvbnN0IHRhcmdldEluaXRpYWxTdGF0ZSA9IHNhdmVkSW5pdGlhbFN0YXRlO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEga2VwbGVyLmdsIHJlZHVjZXIgdGhhdCB3aWxsIGFsc28gcGFzcyBlYWNoIGFjdGlvbiB0aHJvdWdoIGFkZGl0aW9uYWwgcmVkdWNlcnMgc3BpZWNpZmllZC5cbiAgICogVGhlIHBhcmFtZXRlciBzaG91bGQgYmUgZWl0aGVyIGEgcmVkdWNlciBtYXAgb3IgYSByZWR1Y2VyIGZ1bmN0aW9uLlxuICAgKiBUaGUgc3RhdGUgcGFzc2VkIGludG8gdGhlIGFkZGl0aW9uYWwgYWN0aW9uIGhhbmRsZXIgaXMgdGhlIGluc3RhbmNlIHN0YXRlLlxuICAgKiBJdCB3aWxsIGluY2x1ZGUgYWxsIHRoZSBzdWJyZWR1Y2VycyBgdmlzU3RhdGVgLCBgdWlTdGF0ZWAsIGBtYXBTdGF0ZWAgYW5kIGBtYXBTdHlsZWAuXG4gICAqIGAucGx1Z2luYCBpcyBvbmx5IG1lYW50IHRvIGJlIGNhbGxlZCBvbmNlIHdoZW4gbW91bnRpbmcgdGhlIGtlcGxlckdsUmVkdWNlciB0byB0aGUgc3RvcmUuXG4gICAqICoqTm90ZSoqIFRoaXMgaXMgYW4gYWR2YW5jZWQgb3B0aW9uIHRvIGdpdmUgeW91IG1vcmUgZnJlZWRvbSB0byBtb2RpZnkgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBrZXBsZXIuZ2wgaW5zdGFuY2UuXG4gICAqIFlvdSBzaG91bGQgb25seSB1c2UgdGhpcyB0byBhZGRpbmcgYWRkaXRpb25hbCBhY3Rpb25zIGluc3RlYWQgb2YgcmVwbGFjaW5nIGRlZmF1bHQgYWN0aW9ucy5cbiAgICpcbiAgICogQG1peGluIGtlcGxlckdsUmVkdWNlci5wbHVnaW5cbiAgICogQG1lbWJlcm9mIGtlcGxlckdsUmVkdWNlclxuICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY3VzdG9tUmVkdWNlciAtIEEgcmVkdWNlciBtYXAgb3IgYSByZWR1Y2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0byBiZSBhcHBsaWVkIHRvIGN1c3RvbSByZWR1Y2VyIGxvZ2ljXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLm92ZXJyaWRlIC0gb2JqZWN0cyB0aGF0IGRlc2NyaWJlIHdoaWNoIGFjdGlvbiB0byBvdmVycmlkZSwgZS5nLiB7W0FjdGlvblR5cGVzLkxBWUVSX1RZUEVfQ0hBTkdFXTogdHJ1ZX1cbiAgICogQHB1YmxpY1xuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBteUtlcGxlckdsUmVkdWNlciA9IGtlcGxlckdsUmVkdWNlclxuICAgKiAgLnBsdWdpbih7XG4gICAqICAgIC8vIDEuIGFzIHJlZHVjZXIgbWFwXG4gICAqICAgIEhJREVfQU5EX1NIT1dfU0lERV9QQU5FTDogKHN0YXRlLCBhY3Rpb24pID0+ICh7XG4gICAqICAgICAgLi4uc3RhdGUsXG4gICAqICAgICAgdWlTdGF0ZToge1xuICAgKiAgICAgICAgLi4uc3RhdGUudWlTdGF0ZSxcbiAgICogICAgICAgIHJlYWRPbmx5OiAhc3RhdGUudWlTdGF0ZS5yZWFkT25seVxuICAgKiAgICAgIH1cbiAgICogICAgfSlcbiAgICogIH0pXG4gICAqIC5wbHVnaW4oaGFuZGxlQWN0aW9ucyh7XG4gICAqICAgLy8gMi4gYXMgcmVkdWNlclxuICAgKiAgICdISURFX01BUF9DT05UUk9MUyc6IChzdGF0ZSwgYWN0aW9uKSA9PiAoe1xuICAgKiAgICAgLi4uc3RhdGUsXG4gICAqICAgICB1aVN0YXRlOiB7XG4gICAqICAgICAgIC4uLnN0YXRlLnVpU3RhdGUsXG4gICAqICAgICAgIG1hcENvbnRyb2xzOiBoaWRkZW5NYXBDb250cm9sXG4gICAqICAgICB9XG4gICAqICAgfSlcbiAgICogfSwge30pKTtcbiAgICovXG4gIHRhcmdldC5wbHVnaW4gPSBmdW5jdGlvbiBwbHVnaW4oY3VzdG9tUmVkdWNlciwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgY3VzdG9tUmVkdWNlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIGlmIG9ubHkgcHJvdmlkZWQgYSByZWR1Y2VyTWFwLCB3cmFwIGl0IGluIGEgcmVkdWNlclxuICAgICAgY3VzdG9tUmVkdWNlciA9IGhhbmRsZUFjdGlvbnMoY3VzdG9tUmVkdWNlciwge30pO1xuICAgIH1cblxuICAgIC8vIHVzZSAnZnVuY3Rpb24nIGtleXdvcmQgdG8gZW5hYmxlICd0aGlzJ1xuICAgIC8vIFRPRE86IHRlbXBvcmFyaWx5IG1ha2luZyBhY3Rpb24gdHlwZSB0byBhbnksIHdpbGwgZml4IHRoYXQgYnkgY3JlYXRpbmcgYSBzaGFyZWQgYWN0aW9uIGludGVyZmFjZVxuICAgIHJldHVybiBkZWNvcmF0ZSgoc3RhdGUgPSB7fSwgYWN0aW9uOiBhbnkgPSB7fSkgPT4ge1xuICAgICAgbGV0IG5leHRTdGF0ZSA9IHN0YXRlO1xuICAgICAgaWYgKGFjdGlvbi50eXBlICYmICFvcHRpb25zPy5vdmVycmlkZT8uW2FjdGlvbi50eXBlXSkge1xuICAgICAgICBuZXh0U3RhdGUgPSB0aGlzKHN0YXRlLCBhY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICAvLyBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgc3RhdGVuXG4gICAgICBPYmplY3Qua2V5cyhuZXh0U3RhdGUpLmZvckVhY2goaWQgPT4ge1xuICAgICAgICAvLyB1cGRhdGUgY2hpbGQgc3RhdGVzXG4gICAgICAgIG5leHRTdGF0ZSA9IF91cGRhdGVQcm9wZXJ0eShcbiAgICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY3VzdG9tUmVkdWNlcihuZXh0U3RhdGVbaWRdLCBfYWN0aW9uRm9yKGlkLCBhY3Rpb24pKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSByZWR1Y2VyIHRoYXQgaW5pdGlhdGVkIHdpdGggY3VzdG9tIGluaXRpYWwgc3RhdGUuXG4gICAqIFRoZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIGFuIG9iamVjdCBtYXBwaW5nIGZyb20gYHN1YnJlZHVjZXJgIG5hbWUgdG8gY3VzdG9tIHN1YnJlZHVjZXIgc3RhdGUsXG4gICAqIHdoaWNoIHdpbGwgYmUgc2hhbGxvdyAqKm1lcmdlZCoqIHdpdGggZGVmYXVsdCBpbml0aWFsIHN0YXRlLlxuICAgKlxuICAgKiBEZWZhdWx0IHN1YnJlZHVjZXIgc3RhdGU6XG4gICAqICAtIFtgdmlzU3RhdGVgXSguL3Zpcy1zdGF0ZS5tZCNJTklUSUFMX1ZJU19TVEFURSlcbiAgICogIC0gW2BtYXBTdGF0ZWBdKC4vbWFwLXN0YXRlLm1kI0lOSVRJQUxfTUFQX1NUQVRFKVxuICAgKiAgLSBbYG1hcFN0eWxlYF0oLi9tYXAtc3R5bGUubWQjSU5JVElBTF9NQVBfU1RZTEUpXG4gICAqICAtIFtgdWlTdGF0ZWBdKC4vdWktc3RhdGUubWQjSU5JVElBTF9VSV9TVEFURSlcbiAgICogQG1peGluIGtlcGxlckdsUmVkdWNlci5pbml0aWFsU3RhdGVcbiAgICogQG1lbWJlcm9mIGtlcGxlckdsUmVkdWNlclxuICAgKiBAcGFyYW0ge09iamVjdH0gaW5pU3QgLSBjdXN0b20gc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggZGVmYXVsdCBpbml0aWFsIHN0YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBleHRyYVJlZHVjZXJzIC0gb3B0aW9uYWwgY3VzdG9tIHJlZHVjZXJzIGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IGB2aXNTdGF0ZWAsIGBtYXBTdGF0ZWAsIGBtYXBTdHlsZWAsIGFuZCBgdWlTdGF0ZWBcbiAgICogQHB1YmxpY1xuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBteUtlcGxlckdsUmVkdWNlciA9IGtlcGxlckdsUmVkdWNlclxuICAgKiAgLmluaXRpYWxTdGF0ZSh7XG4gICAqICAgIHVpU3RhdGU6IHtyZWFkT25seTogdHJ1ZX1cbiAgICogIH0pO1xuICAgKi9cbiAgdGFyZ2V0LmluaXRpYWxTdGF0ZSA9IGZ1bmN0aW9uIGluaXRpYWxTdGF0ZShpbmlTdCwgZXh0cmFSZWR1Y2VycyA9IHt9KSB7XG4gICAgLy8gcGFzc2luZyB0aHJvdWdoIGV4dHJhSW5pdGlhbFN0YXRlS2V5cyBhbmQgZXh0cmFSZWR1Y2VycyBhbGxvd3MgZXh0ZXJuYWwgY3VzdG9taXphdGlvbiBieSBhZGRpbmcgYWRkaXRpb25hbCBzdWJyZWR1Y2VycyBhbmQgc3RhdGUgYmV5b25kIHRoZSBkZWZhdWx0IGB2aXNTdGF0ZWAsIGBtYXBTdGF0ZWAsIGBtYXBTdHlsZWAsIGFuZCBgdWlTdGF0ZWBcbiAgICBjb25zdCBleHRyYUluaXRpYWxTdGF0ZUtleXMgPSBPYmplY3Qua2V5cyhleHRyYVJlZHVjZXJzKTtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZUluaXRpYWxTdGF0ZSh0YXJnZXRJbml0aWFsU3RhdGUsIGluaVN0LCBleHRyYUluaXRpYWxTdGF0ZUtleXMpO1xuICAgIGNvbnN0IHRhcmdldFJlZHVjZXIgPSBwcm92aWRlSW5pdGlhbFN0YXRlKG1lcmdlZCwgZXh0cmFSZWR1Y2Vycyk7XG5cbiAgICByZXR1cm4gZGVjb3JhdGUodGFyZ2V0UmVkdWNlciwgbWVyZ2VkKTtcbiAgfTtcblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIEtlcGxlci5nbCByZWR1Y2VyIHRvIGJlIG1vdW50ZWQgdG8geW91ciBzdG9yZS4gWW91IGNhbiBtb3VudCBga2VwbGVyR2xSZWR1Y2VyYCBhdCBwcm9wZXJ0eSBga2VwbGVyR2xgLCBpZiB5b3UgY2hvb3NlXG4gKiB0byBtb3VudCBpdCBhdCBhbm90aGVyIGFkZHJlc3MgZS5nLiBgZm9vYCB5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgaXQgd2hlbiB5b3UgbW91bnQgYEtlcGxlckdsYCBjb21wb25lbnQgaW4geW91ciBhcHAgd2l0aCBgZ2V0U3RhdGU6IHN0YXRlID0+IHN0YXRlLmZvb2BcbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyIGZyb20gJ0BrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuICogaW1wb3J0IHtjcmVhdGVTdG9yZSwgY29tYmluZVJlZHVjZXJzLCBhcHBseU1pZGRsZXdhcmUsIGNvbXBvc2V9IGZyb20gJ3JlZHV4JztcbiAqIGltcG9ydCB7dGFza01pZGRsZXdhcmV9IGZyb20gJ3JlYWN0LXBhbG0vdGFza3MnO1xuICpcbiAqIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHt9O1xuICogY29uc3QgcmVkdWNlcnMgPSBjb21iaW5lUmVkdWNlcnMoe1xuICogICAvLyA8LS0gbW91bnQga2VwbGVyLmdsIHJlZHVjZXIgaW4geW91ciBhcHBcbiAqICAga2VwbGVyR2w6IGtlcGxlckdsUmVkdWNlcixcbiAqXG4gKiAgIC8vIFlvdXIgb3RoZXIgcmVkdWNlcnMgaGVyZVxuICogICBhcHA6IGFwcFJlZHVjZXJcbiAqIH0pO1xuICpcbiAqIC8vIHVzaW5nIGNyZWF0ZVN0b3JlXG4gKiBleHBvcnQgZGVmYXVsdCBjcmVhdGVTdG9yZShyZWR1Y2VyLCBpbml0aWFsU3RhdGUsIGFwcGx5TWlkZGxld2FyZSh0YXNrTWlkZGxld2FyZSkpO1xuICovXG5jb25zdCBrZXBsZXJHbFJlZHVjZXIgPSBkZWNvcmF0ZShfa2VwbGVyR2xSZWR1Y2VyKTtcbmV4cG9ydCBkZWZhdWx0IGtlcGxlckdsUmVkdWNlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxRQUFBLEdBQUFDLE9BQUE7QUFRQSxJQUFBQyxhQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxLQUFBLEdBQUFGLE9BQUE7QUFBeUQsU0FBQUcsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENBQUFjLHlCQUFBLEdBQUFkLE1BQUEsQ0FBQWUsZ0JBQUEsQ0FBQWxCLENBQUEsRUFBQUcsTUFBQSxDQUFBYyx5QkFBQSxDQUFBZixDQUFBLEtBQUFILE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFB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
;