kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
194 lines (159 loc) • 21.6 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.setFeaturesUpdater = exports.setFeaturesComposed = exports.isValidConfig = exports.deleteFeatureUpdater = exports.deleteFeatureComposed = exports.defaultAddDataToMapOptions = exports.addDataToMapUpdater = exports.addDataToMapComposed = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _uiStateUpdaters = require("./ui-state-updaters");
var _visStateUpdaters = require("./vis-state-updaters");
var _mapStateUpdaters = require("./map-state-updaters");
var _mapStyleUpdaters = require("./map-style-updaters");
var _dataUtils = require("../utils/data-utils");
var _schemas = _interopRequireDefault(require("../schemas"));
var _utils = require("../utils/utils");
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; }
// compose action to apply result multiple reducers, with the output of one
/**
* Some actions will affect the entire kepler.lg instance state.
* The updaters for these actions is exported as `combinedUpdaters`. These updater take the entire instance state
* as the first argument. Read more about [Using updaters](../advanced-usage/using-updaters.md)
* @public
* @example
*
* import keplerGlReducer, {combinedUpdaters} from 'kepler.gl/reducers';
* // Root Reducer
* const reducers = combineReducers({
* keplerGl: keplerGlReducer,
* app: appReducer
* });
*
* const composedReducer = (state, action) => {
* switch (action.type) {
* // add data to map after receiving data from remote sources
* case 'LOAD_REMOTE_RESOURCE_SUCCESS':
* return {
* ...state,
* keplerGl: {
* ...state.keplerGl,
* // pass in kepler.gl instance state to combinedUpdaters
* map: combinedUpdaters.addDataToMapUpdater(
* state.keplerGl.map,
* {
* payload: {
* datasets: action.datasets,
* options: {readOnly: true},
* config: action.config
* }
* }
* )
* }
* };
* }
* return reducers(state, action);
* };
*
* export default composedReducer;
*/
/* eslint-disable no-unused-vars */
var combinedUpdaters = null;
/* eslint-enable no-unused-vars */
var isValidConfig = exports.isValidConfig = function isValidConfig(config) {
return (0, _utils.isPlainObject)(config) && (0, _utils.isPlainObject)(config.config) && config.version;
};
var defaultAddDataToMapOptions = exports.defaultAddDataToMapOptions = {
centerMap: true,
keepExistingConfig: false
};
/**
* Combine data and full configuration update in a single action
*
* @memberof combinedUpdaters
* @param {Object} state kepler.gl instance state, containing all subreducer state
* @param {Object} action
* @param {Object} action.payload `{datasets, options, config}`
* @param {Array<Object>|Object} action.payload.datasets - ***required** datasets can be a dataset or an array of datasets
* Each dataset object needs to have `info` and `data` property.
* @param {Object} action.payload.datasets.info -info of a dataset
* @param {string} action.payload.datasets.info.id - id of this dataset. If config is defined, `id` should matches the `dataId` in config.
* @param {string} action.payload.datasets.info.label - A display name of this dataset
* @param {Object} action.payload.datasets.data - ***required** The data object, in a tabular format with 2 properties `fields` and `rows`
* @param {Array<Object>} action.payload.datasets.data.fields - ***required** Array of fields,
* @param {string} action.payload.datasets.data.fields.name - ***required** Name of the field,
* @param {Array<Array>} action.payload.datasets.data.rows - ***required** Array of rows, in a tabular format with `fields` and `rows`
* @param {Object} action.payload.options option object `{centerMap: true}`
* @param {Object} action.payload.config map config
* @returns {Object} nextState
* @public
*/
var addDataToMapUpdater = exports.addDataToMapUpdater = function addDataToMapUpdater(state, _ref) {
var payload = _ref.payload;
var datasets = payload.datasets,
config = payload.config;
var options = _objectSpread(_objectSpread({}, defaultAddDataToMapOptions), payload.options);
var parsedConfig = config;
if (isValidConfig(config)) {
// if passed in saved config
parsedConfig = _schemas["default"].parseSavedConfig(config);
}
var oldLayers = state.visState.layers; // Update visState store
var mergedState = _objectSpread(_objectSpread({}, state), {}, {
visState: (0, _visStateUpdaters.updateVisDataUpdater)(state.visState, {
datasets: datasets,
options: options,
config: parsedConfig
})
});
var bounds;
if (options.centerMap) {
// find map bounds for new layers
var newLayers = mergedState.visState.layers.filter(function (nl) {
return !oldLayers.find(function (ol) {
return ol === nl;
});
}); // bounds = findMapBounds(newLayers);
bounds = null;
} // Update mapState store
mergedState = _objectSpread(_objectSpread({}, mergedState), {}, {
mapState: (0, _mapStateUpdaters.receiveMapConfigUpdater)(mergedState.mapState, {
payload: {
config: parsedConfig,
options: options,
bounds: bounds
}
})
}); // Update mapStyle store
mergedState = _objectSpread(_objectSpread({}, mergedState), {}, {
mapStyle: (0, _mapStyleUpdaters.receiveMapConfigUpdater)(mergedState.mapStyle, {
payload: {
config: parsedConfig,
options: options
}
})
}); // Update uiState
mergedState = _objectSpread(_objectSpread({}, mergedState), {}, {
uiState: _objectSpread(_objectSpread({}, (0, _uiStateUpdaters.toggleModalUpdater)((0, _uiStateUpdaters.loadFilesSuccessUpdater)(mergedState.uiState), {
payload: null
})), options.hasOwnProperty('readOnly') ? {
readOnly: options.readOnly
} : {})
});
return mergedState;
};
var addDataToMapComposed = exports.addDataToMapComposed = addDataToMapUpdater;
var setFeaturesUpdater = exports.setFeaturesUpdater = function setFeaturesUpdater(state, payload) {
return _objectSpread(_objectSpread({}, state), {}, {
visState: (0, _visStateUpdaters.setFeaturesUpdater)(state.visState, payload),
uiState: (0, _uiStateUpdaters.setFeaturesUpdater)(state.uiState, payload)
});
};
var setFeaturesComposed = exports.setFeaturesComposed = setFeaturesUpdater;
var deleteFeatureUpdater = exports.deleteFeatureUpdater = function deleteFeatureUpdater(state, payload) {
return _objectSpread(_objectSpread({}, state), {}, {
visState: (0, _visStateUpdaters.deleteFeatureUpdater)(state.visState, payload),
uiState: (0, _uiStateUpdaters.deleteFeatureUpdater)(state.uiState, payload)
});
};
var deleteFeatureComposed = exports.deleteFeatureComposed = deleteFeatureUpdater;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWR1Y2Vycy9jb21iaW5lZC11cGRhdGVycy5qcyJdLCJuYW1lcyI6WyJjb21iaW5lZFVwZGF0ZXJzIiwiaXNWYWxpZENvbmZpZyIsImNvbmZpZyIsInZlcnNpb24iLCJkZWZhdWx0QWRkRGF0YVRvTWFwT3B0aW9ucyIsImNlbnRlck1hcCIsImtlZXBFeGlzdGluZ0NvbmZpZyIsImFkZERhdGFUb01hcFVwZGF0ZXIiLCJzdGF0ZSIsInBheWxvYWQiLCJkYXRhc2V0cyIsIm9wdGlvbnMiLCJwYXJzZWRDb25maWciLCJLZXBsZXJHbFNjaGVtYSIsInBhcnNlU2F2ZWRDb25maWciLCJvbGRMYXllcnMiLCJ2aXNTdGF0ZSIsImxheWVycyIsIm1lcmdlZFN0YXRlIiwiYm91bmRzIiwibmV3TGF5ZXJzIiwiZmlsdGVyIiwibmwiLCJmaW5kIiwib2wiLCJtYXBTdGF0ZSIsIm1hcFN0eWxlIiwidWlTdGF0ZSIsImhhc093blByb3BlcnR5IiwicmVhZE9ubHkiLCJhZGREYXRhVG9NYXBDb21wb3NlZCIsInNldEZlYXR1cmVzVXBkYXRlciIsInNldEZlYXR1cmVzQ29tcG9zZWQiLCJkZWxldGVGZWF0dXJlVXBkYXRlciIsImRlbGV0ZUZlYXR1cmVDb21wb3NlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5Q0E7QUFDQSxJQUFNQSxnQkFBZ0IsR0FBRyxJQUF6QjtBQUNBOztBQUVPLElBQU1DLGFBQWEsMkJBQUcsU0FBaEJBLGFBQWdCLENBQUFDLE1BQU07QUFBQSxTQUNqQywwQkFBY0EsTUFBZCxLQUF5QiwwQkFBY0EsTUFBTSxDQUFDQSxNQUFyQixDQUF6QixJQUF5REEsTUFBTSxDQUFDQyxPQUQvQjtBQUFBLENBQTVCOztBQUVBLElBQU1DLDBCQUEwQix3Q0FBRztB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QVFDLE9BQVI7QUFBQSx5Q0FDN0JELEtBRDZCO0FBRWhDUSxJQUFBQSxRQUFRLEVBQUUsMENBQXdCUixLQUFLLENBQUNRLFFBQTlCLEVBQXdDUCxPQUF4QyxDQUZzQjtBQUdoQ2tCLElBQUFBLE9BQU8sRUFBRSx5Q0FBdUJuQixLQUFLLENBQUNtQixPQUE3QixFQUFzQ2xCLE9BQXRDO0FBSHVCO0FBQUEsQ0FBM0I7O0FBTUEsSUFBTXVCLG1CQUFtQixpQ0FBR0Qsa0JBQTVCOztBQUVBLElBQU1FLG9CQUFvQixrQ0FBRyxTQUF2QkEsb0JBQXVCLENBQUN6QixLQUFELEVBQVFDLE9BQVI7QUFBQSx5Q0FDL0JELEtBRCtCO0FBRWxDUSxJQUFBQSxRQUFRLEVBQUUsNENBQXdCUixLQUFLLENBQUNRLFFBQTlCLEVBQXdDUCxPQUF4QyxDQUZ3QjtBQUdsQ2tCLElBQUFBLE9BQU8sRUFBRSwyQ0FBdUJuQixLQUFLLENBQUNtQixPQUE3QixFQUFzQ2xCLE9BQXRDO0FBSHlCO0FBQUEsQ0FBN0I7O0FBTUEsSUFBTXlCLHFCQUFxQixtQ0FBR0Qsb0JBQTlCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHt0b2dnbGVNb2RhbFVwZGF0ZXIsIGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyfSBmcm9tICcuL3VpLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7XG4gIHVwZGF0ZVZpc0RhdGFVcGRhdGVyIGFzIHZpc1N0YXRlVXBkYXRlVmlzRGF0YVVwZGF0ZXIsXG4gIHNldEZlYXR1cmVzVXBkYXRlciBhcyB2aXNTdGF0ZUZlYXR1cmVzVXBkYXRlcixcbiAgZGVsZXRlRmVhdHVyZVVwZGF0ZXIgYXMgdmlzRGVsZXRlRmVhdHVyZVVwZGF0ZXJcbn0gZnJvbSAnLi92aXMtc3RhdGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciBhcyBzdGF0ZU1hcENvbmZpZ1VwZGF0ZXJ9IGZyb20gJy4vbWFwLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7cmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgYXMgc3R5bGVNYXBDb25maWdVcGRhdGVyfSBmcm9tICcuL21hcC1zdHlsZS11cGRhdGVycyc7XG5pbXBvcnQge1xuICBzZXRGZWF0dXJlc1VwZGF0ZXIgYXMgdWlTdGF0ZUZlYXR1cmVzVXBkYXRlcixcbiAgZGVsZXRlRmVhdHVyZVVwZGF0ZXIgYXMgdWlEZWxldGVGZWF0dXJlVXBkYXRlclxufSBmcm9tICcuL3VpLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7ZmluZE1hcEJvdW5kc30gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5pbXBvcnQgS2VwbGVyR2xTY2hlbWEgZnJvbSAnc2NoZW1hcyc7XG5pbXBvcnQge2lzUGxhaW5PYmplY3R9IGZyb20gJ3V0aWxzL3V0aWxzJztcblxuLy8gY29tcG9zZSBhY3Rpb24gdG8gYXBwbHkgcmVzdWx0IG11bHRpcGxlIHJlZHVjZXJzLCB3aXRoIHRoZSBvdXRwdXQgb2Ygb25lXG5cbi8qKlxuICogU29tZSBhY3Rpb25zIHdpbGwgYWZmZWN0IHRoZSBlbnRpcmUga2VwbGVyLmxnIGluc3RhbmNlIHN0YXRlLlxuICogVGhlIHVwZGF0ZXJzIGZvciB0aGVzZSBhY3Rpb25zIGlzIGV4cG9ydGVkIGFzIGBjb21iaW5lZFVwZGF0ZXJzYC4gVGhlc2UgdXBkYXRlciB0YWtlIHRoZSBlbnRpcmUgaW5zdGFuY2Ugc3RhdGVcbiAqIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4gUmVhZCBtb3JlIGFib3V0IFtVc2luZyB1cGRhdGVyc10oLi4vYWR2YW5jZWQtdXNhZ2UvdXNpbmctdXBkYXRlcnMubWQpXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBrZXBsZXJHbFJlZHVjZXIsIHtjb21iaW5lZFVwZGF0ZXJzfSBmcm9tICdrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuICogLy8gUm9vdCBSZWR1Y2VyXG4gKiBjb25zdCByZWR1Y2VycyA9IGNvbWJpbmVSZWR1Y2Vycyh7XG4gKiAga2VwbGVyR2w6IGtlcGxlckdsUmVkdWNlcixcbiAqICBhcHA6IGFwcFJlZHVjZXJcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGNvbXBvc2VkUmVkdWNlciA9IChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gKiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICogICAgLy8gYWRkIGRhdGEgdG8gbWFwIGFmdGVyIHJlY2VpdmluZyBkYXRhIGZyb20gcmVtb3RlIHNvdXJjZXNcbiAqICAgIGNhc2UgJ0xPQURfUkVNT1RFX1JFU09VUkNFX1NVQ0NFU1MnOlxuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC4uLnN0YXRlLFxuICogICAgICAgIGtlcGxlckdsOiB7XG4gKiAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbCxcbiAqICAgICAgICAgIC8vIHBhc3MgaW4ga2VwbGVyLmdsIGluc3RhbmNlIHN0YXRlIHRvIGNvbWJpbmVkVXBkYXRlcnNcbiAqICAgICAgICAgIG1hcDogIGNvbWJpbmVkVXBkYXRlcnMuYWRkRGF0YVRvTWFwVXBkYXRlcihcbiAqICAgICAgICAgICBzdGF0ZS5rZXBsZXJHbC5tYXAsXG4gKiAgICAgICAgICAge1xuICogICAgICAgICAgICAgcGF5bG9hZDoge1xuICogICAgICAgICAgICAgICBkYXRhc2V0czogYWN0aW9uLmRhdGFzZXRzLFxuICogICAgICAgICAgICAgICBvcHRpb25zOiB7cmVhZE9ubHk6IHRydWV9LFxuICogICAgICAgICAgICAgICBjb25maWc6IGFjdGlvbi5jb25maWdcbiAqICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgIH1cbiAqICAgICAgICAgIClcbiAqICAgICAgICB9XG4gKiAgICAgIH07XG4gKiAgfVxuICogIHJldHVybiByZWR1Y2VycyhzdGF0ZSwgYWN0aW9uKTtcbiAqIH07XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgY29tcG9zZWRSZWR1Y2VyO1xuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuY29uc3QgY29tYmluZWRVcGRhdGVycyA9IG51bGw7XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkQ29uZmlnID0gY29uZmlnID0+XG4gIGlzUGxhaW5PYmplY3QoY29uZmlnKSAmJiBpc1BsYWluT2JqZWN0KGNvbmZpZy5jb25maWcpICYmIGNvbmZpZy52ZXJzaW9uO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZGREYXRhVG9NYXBPcHRpb25zID0ge1xuICBjZW50ZXJNYXA6IHRydWUsXG4gIGtlZXBFeGlzdGluZ0NvbmZpZzogZmFsc2Vcbn07XG4vKipcbiAqIENvbWJpbmUgZGF0YSBhbmQgZnVsbCBjb25maWd1cmF0aW9uIHVwZGF0ZSBpbiBhIHNpbmdsZSBhY3Rpb25cbiAqXG4gKiBAbWVtYmVyb2YgY29tYmluZWRVcGRhdGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGtlcGxlci5nbCBpbnN0YW5jZSBzdGF0ZSwgY29udGFpbmluZyBhbGwgc3VicmVkdWNlciBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbi5wYXlsb2FkIGB7ZGF0YXNldHMsIG9wdGlvbnMsIGNvbmZpZ31gXG4gKiBAcGFyYW0ge0FycmF5PE9iamVjdD58T2JqZWN0fSBhY3Rpb24ucGF5bG9hZC5kYXRhc2V0cyAtICoqKnJlcXVpcmVkKiogZGF0YXNldHMgY2FuIGJlIGEgZGF0YXNldCBvciBhbiBhcnJheSBvZiBkYXRhc2V0c1xuICogRWFjaCBkYXRhc2V0IG9iamVjdCBuZWVkcyB0byBoYXZlIGBpbmZvYCBhbmQgYGRhdGFgIHByb3BlcnR5LlxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbi5wYXlsb2FkLmRhdGFzZXRzLmluZm8gLWluZm8gb2YgYSBkYXRhc2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uLnBheWxvYWQuZGF0YXNldHMuaW5mby5pZCAtIGlkIG9mIHRoaXMgZGF0YXNldC4gSWYgY29uZmlnIGlzIGRlZmluZWQsIGBpZGAgc2hvdWxkIG1hdGNoZXMgdGhlIGBkYXRhSWRgIGluIGNvbmZpZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24ucGF5bG9hZC5kYXRhc2V0cy5pbmZvLmxhYmVsIC0gQSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBkYXRhc2V0XG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uLnBheWxvYWQuZGF0YXNldHMuZGF0YSAtICoqKnJlcXVpcmVkKiogVGhlIGRhdGEgb2JqZWN0LCBpbiBhIHRhYnVsYXIgZm9ybWF0IHdpdGggMiBwcm9wZXJ0aWVzIGBmaWVsZHNgIGFuZCBgcm93c2BcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gYWN0aW9uLnBheWxvYWQuZGF0YXNldHMuZGF0YS5maWVsZHMgLSAqKipyZXF1aXJlZCoqIEFycmF5IG9mIGZpZWxkcyxcbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24ucGF5bG9hZC5kYXRhc2V0cy5kYXRhLmZpZWxkcy5uYW1lIC0gKioqcmVxdWlyZWQqKiBOYW1lIG9mIHRoZSBmaWVsZCxcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk+fSBhY3Rpb24ucGF5bG9hZC5kYXRhc2V0cy5kYXRhLnJvd3MgLSAqKipyZXF1aXJlZCoqIEFycmF5IG9mIHJvd3MsIGluIGEgdGFidWxhciBmb3JtYXQgd2l0aCBgZmllbGRzYCBhbmQgYHJvd3NgXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uLnBheWxvYWQub3B0aW9ucyBvcHRpb24gb2JqZWN0IGB7Y2VudGVyTWFwOiB0cnVlfWBcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24ucGF5bG9hZC5jb25maWcgbWFwIGNvbmZpZ1xuICogQHJldHVybnMge09iamVjdH0gbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGREYXRhVG9NYXBVcGRhdGVyID0gKHN0YXRlLCB7cGF5bG9hZH0pID0+IHtcbiAgY29uc3Qge2RhdGFzZXRzLCBjb25maWd9ID0gcGF5bG9hZDtcblxuICBjb25zdCBvcHRpb25zID0ge1xuICAgIC4uLmRlZmF1bHRBZGREYXRhVG9NYXBPcHRpb25zLFxuICAgIC4uLnBheWxvYWQub3B0aW9uc1xuICB9O1xuXG4gIGxldCBwYXJzZWRDb25maWcgPSBjb25maWc7XG5cbiAgaWYgKGlzVmFsaWRDb25maWcoY29uZmlnKSkge1xuICAgIC8vIGlmIHBhc3NlZCBpbiBzYXZlZCBjb25maWdcbiAgICBwYXJzZWRDb25maWcgPSBLZXBsZXJHbFNjaGVtYS5wYXJzZVNhdmVkQ29uZmlnKGNvbmZpZyk7XG4gIH1cbiAgY29uc3Qgb2xkTGF5ZXJzID0gc3RhdGUudmlzU3RhdGUubGF5ZXJzO1xuXG4gIC8vIFVwZGF0ZSB2aXNTdGF0ZSBzdG9yZVxuICBsZXQgbWVyZ2VkU3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgdmlzU3RhdGU6IHZpc1N0YXRlVXBkYXRlVmlzRGF0YVVwZGF0ZXIoc3RhdGUudmlzU3RhdGUsIHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGNvbmZpZzogcGFyc2VkQ29uZmlnXG4gICAgfSlcbiAgfTtcblxuICBsZXQgYm91bmRzO1xuICBpZiAob3B0aW9ucy5jZW50ZXJNYXApIHtcbiAgICAvLyBmaW5kIG1hcCBib3VuZHMgZm9yIG5ldyBsYXllcnNcbiAgICBjb25zdCBuZXdMYXllcnMgPSBtZXJnZWRTdGF0ZS52aXNTdGF0ZS5sYXllcnMuZmlsdGVyKFxuICAgICAgbmwgPT4gIW9sZExheWVycy5maW5kKG9sID0+IG9sID09PSBubClcbiAgICApO1xuICAgIC8vIGJvdW5kcyA9IGZpbmRNYXBCb3VuZHMobmV3TGF5ZXJzKTtcbiAgICBib3VuZHMgPSBudWxsO1xuICB9XG5cbiAgLy8gVXBkYXRlIG1hcFN0YXRlIHN0b3JlXG4gIG1lcmdlZFN0YXRlID0ge1xuICAgIC4uLm1lcmdlZFN0YXRlLFxuICAgIG1hcFN0YXRlOiBzdGF0ZU1hcENvbmZpZ1VwZGF0ZXIobWVyZ2VkU3RhdGUubWFwU3RhdGUsIHtcbiAgICAgIHBheWxvYWQ6IHtjb25maWc6IHBhcnNlZENvbmZpZywgb3B0aW9ucywgYm91bmRzfVxuICAgIH0pXG4gIH07XG5cbiAgLy8gVXBkYXRlIG1hcFN0eWxlIHN0b3JlXG4gIG1lcmdlZFN0YXRlID0ge1xuICAgIC4uLm1lcmdlZFN0YXRlLFxuICAgIG1hcFN0eWxlOiBzdHlsZU1hcENvbmZpZ1VwZGF0ZXIobWVyZ2VkU3RhdGUubWFwU3R5bGUsIHtcbiAgICAgIHBheWxvYWQ6IHtjb25maWc6IHBhcnNlZENvbmZpZywgb3B0aW9uc31cbiAgICB9KVxuICB9O1xuXG4gIC8vIFVwZGF0ZSB1aVN0YXRlXG4gIG1lcmdlZFN0YXRlID0ge1xuICAgIC4uLm1lcmdlZFN0YXRlLFxuICAgIHVpU3RhdGU6IHtcbiAgICAgIC4uLnRvZ2dsZU1vZGFsVXBkYXRlcihsb2FkRmlsZXNTdWNjZXNzVXBkYXRlcihtZXJnZWRTdGF0ZS51aVN0YXRlKSwge1xuICAgICAgICBwYXlsb2FkOiBudWxsXG4gICAgICB9KSxcbiAgICAgIC4uLihvcHRpb25zLmhhc093blByb3BlcnR5KCdyZWFkT25seScpXG4gICAgICAgID8ge3JlYWRPbmx5OiBvcHRpb25zLnJlYWRPbmx5fVxuICAgICAgICA6IHt9KVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbWVyZ2VkU3RhdGU7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkRGF0YVRvTWFwQ29tcG9zZWQgPSBhZGREYXRhVG9NYXBVcGRhdGVyO1xuXG5leHBvcnQgY29uc3Qgc2V0RmVhdHVyZXNVcGRhdGVyID0gKHN0YXRlLCBwYXlsb2FkKSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgdmlzU3RhdGU6IHZpc1N0YXRlRmVhdHVyZXNVcGRhdGVyKHN0YXRlLnZpc1N0YXRlLCBwYXlsb2FkKSxcbiAgdWlTdGF0ZTogdWlTdGF0ZUZlYXR1cmVzVXBkYXRlcihzdGF0ZS51aVN0YXRlLCBwYXlsb2FkKVxufSk7XG5cbmV4cG9ydCBjb25zdCBzZXRGZWF0dXJlc0NvbXBvc2VkID0gc2V0RmVhdHVyZXNVcGRhdGVyO1xuXG5leHBvcnQgY29uc3QgZGVsZXRlRmVhdHVyZVVwZGF0ZXIgPSAoc3RhdGUsIHBheWxvYWQpID0+ICh7XG4gIC4uLnN0YXRlLFxuICB2aXNTdGF0ZTogdmlzRGVsZXRlRmVhdHVyZVVwZGF0ZXIoc3RhdGUudmlzU3RhdGUsIHBheWxvYWQpLFxuICB1aVN0YXRlOiB1aURlbGV0ZUZlYXR1cmVVcGRhdGVyKHN0YXRlLnVpU3RhdGUsIHBheWxvYWQpXG59KTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUZlYXR1cmVDb21wb3NlZCA9IGRlbGV0ZUZlYXR1cmVVcGRhdGVyO1xuIl19