kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
237 lines (234 loc) • 41.5 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = PlotContainerFactory;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _reselect = require("reselect");
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _reactMapGl = require("react-map-gl");
var _debounce = _interopRequireDefault(require("lodash/debounce"));
var _utils = require("@kepler.gl/utils");
var _reducers = require("@kepler.gl/reducers");
var _mapContainer = _interopRequireDefault(require("./map-container"));
var _mapsLayout = _interopRequireDefault(require("./maps-layout"));
var _mapViewStateContext = require("./map-view-state-context");
var _constants = require("@kepler.gl/constants");
var _templateObject, _templateObject2; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
// libraries
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
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; }
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
var CLASS_FILTER = ['maplibregl-control-container', 'mapboxgl-control-container', 'attrition-link', 'attrition-logo', 'map-control__panel-split-viewport-tools'];
var DOM_FILTER_FUNC = function DOM_FILTER_FUNC(node) {
return !CLASS_FILTER.includes(node.className);
};
var OUT_OF_SCREEN_POSITION = -9999;
PlotContainerFactory.deps = [_mapContainer["default"], _mapsLayout["default"]];
// Remove mapbox logo in exported map, because it contains non-ascii characters
// Remove split viewport UI controls from exported images when the legend is shown
var StyledPlotContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .maplibregl-ctrl-bottom-left,\n .maplibregl-ctrl-bottom-right,\n .maplibre-attribution-container,\n .mapboxgl-ctrl-bottom-left,\n .mapboxgl-ctrl-bottom-right,\n .mapbox-attribution-container,\n .map-control__panel-split-viewport-tools {\n display: none;\n }\n\n position: absolute;\n top: ", "px;\n left: ", "px;\n"])), OUT_OF_SCREEN_POSITION, OUT_OF_SCREEN_POSITION);
var StyledMapContainer = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n width: ", "px;\n height: ", "px;\n display: flex;\n"])), function (props) {
return props.width;
}, function (props) {
return props.height;
});
function PlotContainerFactory(MapContainer, MapsLayout) {
var PlotContainer = /*#__PURE__*/function (_Component) {
function PlotContainer(_props) {
var _this;
(0, _classCallCheck2["default"])(this, PlotContainer);
_this = _callSuper(this, PlotContainer, [_props]);
(0, _defineProperty2["default"])(_this, "plottingAreaRef", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2["default"])(_this, "mapStyleSelector", function (props) {
return props.mapFields.mapStyle;
});
(0, _defineProperty2["default"])(_this, "mapScaleSelector", function (props) {
var imageSize = props.exportImageSetting.imageSize;
var mapState = props.mapFields.mapState;
if (imageSize.scale) {
return imageSize.scale;
}
var scale = (0, _utils.getScaleFromImageSize)(imageSize.imageW, imageSize.imageH, mapState.width * (mapState.isSplit ? 2 : 1), mapState.height);
return scale > 0 ? scale : 1;
});
(0, _defineProperty2["default"])(_this, "scaledMapStyleSelector", (0, _reselect.createSelector)(_this.mapStyleSelector, _this.mapScaleSelector, function (mapStyle, scale) {
return _objectSpread(_objectSpread({}, mapStyle), {}, {
bottomMapStyle: (0, _utils.scaleMapStyleByResolution)(mapStyle.bottomMapStyle, scale),
topMapStyle: (0, _utils.scaleMapStyleByResolution)(mapStyle.topMapStyle, scale)
});
}));
(0, _defineProperty2["default"])(_this, "_onMapRender", function (map) {
if (map.isStyleLoaded()) {
_this._retrieveNewScreenshot();
}
});
(0, _defineProperty2["default"])(_this, "_retrieveNewScreenshot", function () {
if (_this.plottingAreaRef.current) {
var _this$props$exportIma = _this.props.exportImageSetting,
imageSize = _this$props$exportIma.imageSize,
escapeXhtmlForWebpack = _this$props$exportIma.escapeXhtmlForWebpack;
(0, _utils.convertToPng)(_this.plottingAreaRef.current, {
filter: DOM_FILTER_FUNC,
width: imageSize.imageW,
height: imageSize.imageH,
escapeXhtmlForWebpack: escapeXhtmlForWebpack
}).then(_this.props.setExportImageDataUri)["catch"](function (err) {
_this.props.setExportImageError(err);
if (_this.props.enableErrorNotification) {
_this.props.addNotification((0, _utils.exportImageError)({
err: err
}));
}
});
}
});
_this._onMapRender = (0, _debounce["default"])(_this._onMapRender, 500);
_this._retrieveNewScreenshot = (0, _debounce["default"])(_this._retrieveNewScreenshot, 500);
_this.state = {
plotEffects: _this.getEffectsForPlot()
};
return _this;
}
(0, _inherits2["default"])(PlotContainer, _Component);
return (0, _createClass2["default"])(PlotContainer, [{
key: "getEffectsForPlot",
value: function getEffectsForPlot() {
return this.props.mapFields.visState.effects.map(function (effect) {
return effect.clone();
});
}
}, {
key: "componentDidMount",
value: function componentDidMount() {
this.props.setExportImageSetting({
processing: true
});
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
var _this2 = this;
// re-fetch the new screenshot only when ratio legend or resolution changes
var checks = ['ratio', 'resolution', 'legend'];
var shouldRetrieveScreenshot = checks.some(function (item) {
return _this2.props.exportImageSetting[item] !== prevProps.exportImageSetting[item];
});
if (shouldRetrieveScreenshot) {
this.props.setExportImageSetting({
processing: true
});
this._retrieveNewScreenshot();
}
}
}, {
key: "render",
value: function render() {
var _this$props = this.props,
exportImageSetting = _this$props.exportImageSetting,
mapFields = _this$props.mapFields,
_this$props$splitMaps = _this$props.splitMaps,
splitMaps = _this$props$splitMaps === void 0 ? [] : _this$props$splitMaps;
var mapState = mapFields.mapState,
visState = mapFields.visState;
var layers = visState.layers,
layerData = visState.layerData;
var imageSize = exportImageSetting.imageSize,
legend = exportImageSetting.legend;
var isSplit = splitMaps && splitMaps.length > 1;
var size = {
width: (imageSize === null || imageSize === void 0 ? void 0 : imageSize.imageW) || 1,
height: (imageSize === null || imageSize === void 0 ? void 0 : imageSize.imageH) || 1
};
var width = size.width / (isSplit ? 2 : 1);
var height = size.height;
var scale = this.mapScaleSelector(this.props);
var newMapState = _objectSpread(_objectSpread({}, mapState), {}, {
width: width,
height: height,
zoom: mapState.zoom + (Math.log2(scale) || 0)
});
// center and all layer bounds
if (exportImageSetting.center) {
var renderedLayers = layers.filter(function (layer, idx) {
return layer.id !== _constants.GEOCODER_LAYER_ID && layer.shouldRenderLayer(layerData[idx]);
});
var bounds = (0, _reducers.findMapBounds)(renderedLayers);
var centerAndZoom = (0, _utils.getCenterAndZoomFromBounds)(bounds, {
width: width,
height: height
});
if (centerAndZoom) {
var zoom = Number.isFinite(centerAndZoom.zoom) ? centerAndZoom.zoom : mapState.zoom;
newMapState.longitude = centerAndZoom.center[0];
newMapState.latitude = centerAndZoom.center[1];
newMapState.zoom = zoom + Number(Math.log2(scale) || 0);
}
}
var mapProps = _objectSpread(_objectSpread({}, mapFields), {}, {
mapStyle: this.scaledMapStyleSelector(this.props),
// override viewport based on export settings
mapState: newMapState,
mapControls: {
// override map legend visibility
mapLegend: {
show: legend,
active: true
}
},
MapComponent: _reactMapGl.Map,
onMapRender: this._onMapRender,
isExport: true,
deckGlProps: _objectSpread(_objectSpread({}, mapFields.deckGlProps), {}, {
glOptions: {
preserveDrawingBuffer: true,
useDevicePixels: false
}
}),
visState: _objectSpread(_objectSpread({}, mapFields.visState), {}, {
// Make sure to use effects not associated with a different WebGL context
effects: this.state.plotEffects
})
});
var mapContainers = !isSplit ? /*#__PURE__*/_react["default"].createElement(MapContainer, (0, _extends2["default"])({
index: 0,
primary: true
}, mapProps)) : /*#__PURE__*/_react["default"].createElement(MapsLayout, {
className: "plot-container-maps",
mapState: newMapState
}, splitMaps.map(function (settings, index) {
return /*#__PURE__*/_react["default"].createElement(MapContainer, (0, _extends2["default"])({
key: index,
index: index,
primary: index === 1
}, mapProps));
}));
return /*#__PURE__*/_react["default"].createElement(StyledPlotContainer, {
className: "export-map-instance"
}, /*#__PURE__*/_react["default"].createElement(StyledMapContainer, {
ref: this.plottingAreaRef,
width: size.width,
height: size.height
}, /*#__PURE__*/_react["default"].createElement(_mapViewStateContext.MapViewStateContextProvider, {
mapState: newMapState
}, mapContainers)));
}
}]);
}(_react.Component);
return PlotContainer;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVzZWxlY3QiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3RNYXBHbCIsIl9kZWJvdW5jZSIsIl91dGlscyIsIl9yZWR1Y2VycyIsIl9tYXBDb250YWluZXIiLCJfbWFwc0xheW91dCIsIl9tYXBWaWV3U3RhdGVDb250ZXh0IiwiX2NvbnN0YW50cyIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIkNMQVNTX0ZJTFRFUiIsIkRPTV9GSUxURVJfRlVOQyIsIm5vZGUiLCJpbmNsdWRlcyIsImNsYXNzTmFtZSIsIk9VVF9PRl9TQ1JFRU5fUE9TSVRJT04iLCJQbG90Q29udGFpbmVyRmFjdG9yeSIsImRlcHMiLCJNYXBDb250YWluZXJGYWN0b3J5IiwiTWFwc0xheW91dEZhY3RvcnkiLCJTdHlsZWRQbG90Q29udGFpbmVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJTdHlsZWRNYXBDb250YWluZXIiLCJwcm9wcyIsIndpZHRoIiwiaGVpZ2h0IiwiTWFwQ29udGFpbmVyIiwiTWFwc0xheW91dCIsIlBsb3RDb250YWluZXIiLCJfQ29tcG9uZW50IiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiY3JlYXRlUmVmIiwibWFwRmllbGRzIiwibWFwU3R5bGUiLCJpbWFnZVNpemUiLCJleHBvcnRJbWFnZVNldHRpbmciLCJtYXBTdGF0ZSIsInNjYWxlIiwiZ2V0U2NhbGVGcm9tSW1hZ2VTaXplIiwiaW1hZ2VXIiwiaW1hZ2VIIiwiaXNTcGxpdCIsImNyZWF0ZVNlbGVjdG9yIiwibWFwU3R5bGVTZWxlY3RvciIsIm1hcFNjYWxlU2VsZWN0b3IiLCJib3R0b21NYXBTdHlsZSIsInNjYWxlTWFwU3R5bGVCeVJlc29sdXRpb24iLCJ0b3BNYXBTdHlsZSIsIm1hcCIsImlzU3R5bGVMb2FkZWQiLCJfcmV0cmlldmVOZXdTY3JlZW5zaG90IiwicGxvdHRpbmdBcmVhUmVmIiwiY3VycmVudCIsIl90aGlzJHByb3BzJGV4cG9ydEltYSIsImVzY2FwZVhodG1sRm9yV2VicGFjayIsImNvbnZlcnRUb1BuZyIsInRoZW4iLCJzZXRFeHBvcnRJbWFnZURhdGFVcmkiLCJlcnIiLCJzZXRFeHBvcnRJbWFnZUVycm9yIiwiZW5hYmxlRXJyb3JOb3RpZmljYXRpb24iLCJhZGROb3RpZmljYXRpb24iLCJleHBvcnRJbWFnZUVycm9yIiwiX29uTWFwUmVuZGVyIiwiZGVib3VuY2UiLCJzdGF0ZSIsInBsb3RFZmZlY3RzIiwiZ2V0RWZmZWN0c0ZvclBsb3QiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwidmlzU3RhdGUiLCJlZmZlY3RzIiwiZWZmZWN0IiwiY2xvbmUiLCJjb21wb25lbnREaWRNb3VudCIsInNldEV4cG9ydEltYWdlU2V0dGluZyIsInByb2Nlc3NpbmciLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJfdGhpczIiLCJjaGVja3MiLCJzaG91bGRSZXRyaWV2ZVNjcmVlbnNob3QiLCJzb21lIiwiaXRlbSIsInJlbmRlciIsIl90aGlzJHByb3BzIiwiX3RoaXMkcHJvcHMkc3BsaXRNYXBzIiwic3BsaXRNYXBzIiwibGF5ZXJzIiwibGF5ZXJEYXRhIiwibGVnZW5kIiwic2l6ZSIsIm5ld01hcFN0YXRlIiwiem9vbSIsIk1hdGgiLCJsb2cyIiwiY2VudGVyIiwicmVuZGVyZWRMYXllcnMiLCJsYXllciIsImlkeCIsImlkIiwiR0VPQ09ERVJfTEFZRVJfSUQiLCJzaG91bGRSZW5kZXJMYXllciIsImJvdW5kcyIsImZpbmRNYXBCb3VuZHMiLCJjZW50ZXJBbmRab29tIiwiZ2V0Q2VudGVyQW5kWm9vbUZyb21Cb3VuZHMiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImxvbmdpdHVkZSIsImxhdGl0dWRlIiwibWFwUHJvcHMiLCJzY2FsZWRNYXBTdHlsZVNlbGVjdG9yIiwibWFwQ29udHJvbHMiLCJtYXBMZWdlbmQiLCJzaG93IiwiYWN0aXZlIiwiTWFwQ29tcG9uZW50IiwiTWFwIiwib25NYXBSZW5kZXIiLCJpc0V4cG9ydCIsImRlY2tHbFByb3BzIiwiZ2xPcHRpb25zIiwicHJlc2VydmVEcmF3aW5nQnVmZmVyIiwidXNlRGV2aWNlUGl4ZWxzIiwibWFwQ29udGFpbmVycyIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJpbmRleCIsInByaW1hcnkiLCJzZXR0aW5ncyIsInJlZiIsIk1hcFZpZXdTdGF0ZUNvbnRleHRQcm92aWRlciIsIkNvbXBvbmVudCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9wbG90LWNvbnRhaW5lci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLy8gbGlicmFyaWVzXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIGNyZWF0ZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge01hcH0gZnJvbSAncmVhY3QtbWFwLWdsJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IHtcbiAgZXhwb3J0SW1hZ2VFcnJvcixcbiAgc2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbixcbiAgZ2V0Q2VudGVyQW5kWm9vbUZyb21Cb3VuZHMsXG4gIGNvbnZlcnRUb1BuZyxcbiAgZ2V0U2NhbGVGcm9tSW1hZ2VTaXplXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtmaW5kTWFwQm91bmRzfSBmcm9tICdAa2VwbGVyLmdsL3JlZHVjZXJzJztcbmltcG9ydCBNYXBDb250YWluZXJGYWN0b3J5IGZyb20gJy4vbWFwLWNvbnRhaW5lcic7XG5pbXBvcnQgTWFwc0xheW91dEZhY3RvcnkgZnJvbSAnLi9tYXBzLWxheW91dCc7XG5pbXBvcnQge01hcFZpZXdTdGF0ZUNvbnRleHRQcm92aWRlcn0gZnJvbSAnLi9tYXAtdmlldy1zdGF0ZS1jb250ZXh0JztcblxuaW1wb3J0IHtHRU9DT0RFUl9MQVlFUl9JRCwgRXhwb3J0SW1hZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7RWZmZWN0LCBTcGxpdE1hcH0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1xuICBBY3Rpb25IYW5kbGVyLFxuICBhZGROb3RpZmljYXRpb24sXG4gIHNldEV4cG9ydEltYWdlRGF0YVVyaSxcbiAgc2V0RXhwb3J0SW1hZ2VFcnJvcixcbiAgc2V0RXhwb3J0SW1hZ2VTZXR0aW5nXG59IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge21hcEZpZWxkc1NlbGVjdG9yfSBmcm9tICcuL2tlcGxlci1nbCc7XG5cbmNvbnN0IENMQVNTX0ZJTFRFUiA9IFtcbiAgJ21hcGxpYnJlZ2wtY29udHJvbC1jb250YWluZXInLFxuICAnbWFwYm94Z2wtY29udHJvbC1jb250YWluZXInLFxuICAnYXR0cml0aW9uLWxpbmsnLFxuICAnYXR0cml0aW9uLWxvZ28nLFxuICAnbWFwLWNvbnRyb2xfX3BhbmVsLXNwbGl0LXZpZXdwb3J0LXRvb2xzJ1xuXTtcbmNvbnN0IERPTV9GSUxURVJfRlVOQyA9IG5vZGUgPT4gIUNMQVNTX0ZJTFRFUi5pbmNsdWRlcyhub2RlLmNsYXNzTmFtZSk7XG5jb25zdCBPVVRfT0ZfU0NSRUVOX1BPU0lUSU9OID0gLTk5OTk7XG5cblBsb3RDb250YWluZXJGYWN0b3J5LmRlcHMgPSBbTWFwQ29udGFpbmVyRmFjdG9yeSwgTWFwc0xheW91dEZhY3RvcnldO1xuXG4vLyBSZW1vdmUgbWFwYm94IGxvZ28gaW4gZXhwb3J0ZWQgbWFwLCBiZWNhdXNlIGl0IGNvbnRhaW5zIG5vbi1hc2NpaSBjaGFyYWN0ZXJzXG4vLyBSZW1vdmUgc3BsaXQgdmlld3BvcnQgVUkgY29udHJvbHMgZnJvbSBleHBvcnRlZCBpbWFnZXMgd2hlbiB0aGUgbGVnZW5kIGlzIHNob3duXG5jb25zdCBTdHlsZWRQbG90Q29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgLm1hcGxpYnJlZ2wtY3RybC1ib3R0b20tbGVmdCxcbiAgLm1hcGxpYnJlZ2wtY3RybC1ib3R0b20tcmlnaHQsXG4gIC5tYXBsaWJyZS1hdHRyaWJ1dGlvbi1jb250YWluZXIsXG4gIC5tYXBib3hnbC1jdHJsLWJvdHRvbS1sZWZ0LFxuICAubWFwYm94Z2wtY3RybC1ib3R0b20tcmlnaHQsXG4gIC5tYXBib3gtYXR0cmlidXRpb24tY29udGFpbmVyLFxuICAubWFwLWNvbnRyb2xfX3BhbmVsLXNwbGl0LXZpZXdwb3J0LXRvb2xzIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6ICR7T1VUX09GX1NDUkVFTl9QT1NJVElPTn1weDtcbiAgbGVmdDogJHtPVVRfT0ZfU0NSRUVOX1BPU0lUSU9OfXB4O1xuYDtcblxuaW50ZXJmYWNlIFN0eWxlZE1hcENvbnRhaW5lclByb3BzIHtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbn1cblxuY29uc3QgU3R5bGVkTWFwQ29udGFpbmVyID0gc3R5bGVkLmRpdjxTdHlsZWRNYXBDb250YWluZXJQcm9wcz5gXG4gIHdpZHRoOiAke3Byb3BzID0+IHByb3BzLndpZHRofXB4O1xuICBoZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMuaGVpZ2h0fXB4O1xuICBkaXNwbGF5OiBmbGV4O1xuYDtcblxuaW50ZXJmYWNlIFBsb3RDb250YWluZXJQcm9wcyB7XG4gIHdpZHRoPzogbnVtYmVyO1xuICBoZWlnaHQ/OiBudW1iZXI7XG4gIGV4cG9ydEltYWdlU2V0dGluZzogRXhwb3J0SW1hZ2U7XG4gIGFkZE5vdGlmaWNhdGlvbjogQWN0aW9uSGFuZGxlcjx0eXBlb2YgYWRkTm90aWZpY2F0aW9uPjtcbiAgbWFwRmllbGRzOiBSZXR1cm5UeXBlPHR5cGVvZiBtYXBGaWVsZHNTZWxlY3Rvcj47XG4gIHNldEV4cG9ydEltYWdlU2V0dGluZzogdHlwZW9mIHNldEV4cG9ydEltYWdlU2V0dGluZztcbiAgc2V0RXhwb3J0SW1hZ2VEYXRhVXJpOiB0eXBlb2Ygc2V0RXhwb3J0SW1hZ2VEYXRhVXJpO1xuICBzZXRFeHBvcnRJbWFnZUVycm9yOiB0eXBlb2Ygc2V0RXhwb3J0SW1hZ2VFcnJvcjtcbiAgc3BsaXRNYXBzPzogU3BsaXRNYXBbXTtcbiAgZW5hYmxlRXJyb3JOb3RpZmljYXRpb24/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGxvdENvbnRhaW5lclN0YXRlIHtcbiAgcGxvdEVmZmVjdHM6IEVmZmVjdFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQbG90Q29udGFpbmVyRmFjdG9yeShcbiAgTWFwQ29udGFpbmVyOiBSZXR1cm5UeXBlPHR5cGVvZiBNYXBDb250YWluZXJGYWN0b3J5PixcbiAgTWFwc0xheW91dDogUmV0dXJuVHlwZTx0eXBlb2YgTWFwc0xheW91dEZhY3Rvcnk+XG4pOiBSZWFjdC5Db21wb25lbnRUeXBlPFBsb3RDb250YWluZXJQcm9wcz4ge1xuICBjbGFzcyBQbG90Q29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50PFBsb3RDb250YWluZXJQcm9wcywgUGxvdENvbnRhaW5lclN0YXRlPiB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgIHRoaXMuX29uTWFwUmVuZGVyID0gZGVib3VuY2UodGhpcy5fb25NYXBSZW5kZXIsIDUwMCk7XG4gICAgICB0aGlzLl9yZXRyaWV2ZU5ld1NjcmVlbnNob3QgPSBkZWJvdW5jZSh0aGlzLl9yZXRyaWV2ZU5ld1NjcmVlbnNob3QsIDUwMCk7XG5cbiAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgIHBsb3RFZmZlY3RzOiB0aGlzLmdldEVmZmVjdHNGb3JQbG90KClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFZmZlY3RzRm9yUGxvdCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLm1hcEZpZWxkcy52aXNTdGF0ZS5lZmZlY3RzLm1hcChlZmZlY3QgPT4gZWZmZWN0LmNsb25lKCkpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5zZXRFeHBvcnRJbWFnZVNldHRpbmcoe3Byb2Nlc3Npbmc6IHRydWV9KTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICAvLyByZS1mZXRjaCB0aGUgbmV3IHNjcmVlbnNob3Qgb25seSB3aGVuIHJhdGlvIGxlZ2VuZCBvciByZXNvbHV0aW9uIGNoYW5nZXNcbiAgICAgIGNvbnN0IGNoZWNrcyA9IFsncmF0aW8nLCAncmVzb2x1dGlvbicsICdsZWdlbmQnXTtcbiAgICAgIGNvbnN0IHNob3VsZFJldHJpZXZlU2NyZWVuc2hvdCA9IGNoZWNrcy5zb21lKFxuICAgICAgICBpdGVtID0+IHRoaXMucHJvcHMuZXhwb3J0SW1hZ2VTZXR0aW5nW2l0ZW1dICE9PSBwcmV2UHJvcHMuZXhwb3J0SW1hZ2VTZXR0aW5nW2l0ZW1dXG4gICAgICApO1xuICAgICAgaWYgKHNob3VsZFJldHJpZXZlU2NyZWVuc2hvdCkge1xuICAgICAgICB0aGlzLnByb3BzLnNldEV4cG9ydEltYWdlU2V0dGluZyh7cHJvY2Vzc2luZzogdHJ1ZX0pO1xuICAgICAgICB0aGlzLl9yZXRyaWV2ZU5ld1NjcmVlbnNob3QoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwbG90dGluZ0FyZWFSZWYgPSBjcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG5cbiAgICBtYXBTdHlsZVNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMubWFwRmllbGRzLm1hcFN0eWxlO1xuICAgIG1hcFNjYWxlU2VsZWN0b3IgPSBwcm9wcyA9PiB7XG4gICAgICBjb25zdCB7aW1hZ2VTaXplfSA9IHByb3BzLmV4cG9ydEltYWdlU2V0dGluZztcbiAgICAgIGNvbnN0IHttYXBTdGF0ZX0gPSBwcm9wcy5tYXBGaWVsZHM7XG4gICAgICBpZiAoaW1hZ2VTaXplLnNjYWxlKSB7XG4gICAgICAgIHJldHVybiBpbWFnZVNpemUuc2NhbGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjYWxlID0gZ2V0U2NhbGVGcm9tSW1hZ2VTaXplKFxuICAgICAgICBpbWFnZVNpemUuaW1hZ2VXLFxuICAgICAgICBpbWFnZVNpemUuaW1hZ2VILFxuICAgICAgICBtYXBTdGF0ZS53aWR0aCAqIChtYXBTdGF0ZS5pc1NwbGl0ID8gMiA6IDEpLFxuICAgICAgICBtYXBTdGF0ZS5oZWlnaHRcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBzY2FsZSA+IDAgPyBzY2FsZSA6IDE7XG4gICAgfTtcblxuICAgIHNjYWxlZE1hcFN0eWxlU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICAgIHRoaXMubWFwU3R5bGVTZWxlY3RvcixcbiAgICAgIHRoaXMubWFwU2NhbGVTZWxlY3RvcixcbiAgICAgIChtYXBTdHlsZSwgc2NhbGUpID0+ICh7XG4gICAgICAgIC4uLm1hcFN0eWxlLFxuICAgICAgICBib3R0b21NYXBTdHlsZTogc2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbihtYXBTdHlsZS5ib3R0b21NYXBTdHlsZSwgc2NhbGUpLFxuICAgICAgICB0b3BNYXBTdHlsZTogc2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbihtYXBTdHlsZS50b3BNYXBTdHlsZSwgc2NhbGUpXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBfb25NYXBSZW5kZXIgPSBtYXAgPT4ge1xuICAgICAgaWYgKG1hcC5pc1N0eWxlTG9hZGVkKCkpIHtcbiAgICAgICAgdGhpcy5fcmV0cmlldmVOZXdTY3JlZW5zaG90KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9yZXRyaWV2ZU5ld1NjcmVlbnNob3QgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wbG90dGluZ0FyZWFSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zdCB7aW1hZ2VTaXplLCBlc2NhcGVYaHRtbEZvcldlYnBhY2t9ID0gdGhpcy5wcm9wcy5leHBvcnRJbWFnZVNldHRpbmc7XG4gICAgICAgIGNvbnZlcnRUb1BuZyh0aGlzLnBsb3R0aW5nQXJlYVJlZi5jdXJyZW50LCB7XG4gICAgICAgICAgZmlsdGVyOiBET01fRklMVEVSX0ZVTkMsXG4gICAgICAgICAgd2lkdGg6IGltYWdlU2l6ZS5pbWFnZVcsXG4gICAgICAgICAgaGVpZ2h0OiBpbWFnZVNpemUuaW1hZ2VILFxuICAgICAgICAgIGVzY2FwZVhodG1sRm9yV2VicGFja1xuICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKHRoaXMucHJvcHMuc2V0RXhwb3J0SW1hZ2VEYXRhVXJpKVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRFeHBvcnRJbWFnZUVycm9yKGVycik7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5lbmFibGVFcnJvck5vdGlmaWNhdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLnByb3BzLmFkZE5vdGlmaWNhdGlvbihleHBvcnRJbWFnZUVycm9yKHtlcnJ9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtleHBvcnRJbWFnZVNldHRpbmcsIG1hcEZpZWxkcywgc3BsaXRNYXBzID0gW119ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHttYXBTdGF0ZSwgdmlzU3RhdGV9ID0gbWFwRmllbGRzO1xuICAgICAgY29uc3Qge2xheWVycywgbGF5ZXJEYXRhfSA9IHZpc1N0YXRlO1xuICAgICAgY29uc3Qge2ltYWdlU2l6ZSwgbGVnZW5kfSA9IGV4cG9ydEltYWdlU2V0dGluZztcblxuICAgICAgY29uc3QgaXNTcGxpdCA9IHNwbGl0TWFwcyAmJiBzcGxpdE1hcHMubGVuZ3RoID4gMTtcblxuICAgICAgY29uc3Qgc2l6ZSA9IHtcbiAgICAgICAgd2lkdGg6IGltYWdlU2l6ZT8uaW1hZ2VXIHx8IDEsXG4gICAgICAgIGhlaWdodDogaW1hZ2VTaXplPy5pbWFnZUggfHwgMVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHdpZHRoID0gc2l6ZS53aWR0aCAvIChpc1NwbGl0ID8gMiA6IDEpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XG4gICAgICBjb25zdCBzY2FsZSA9IHRoaXMubWFwU2NhbGVTZWxlY3Rvcih0aGlzLnByb3BzKTtcbiAgICAgIGNvbnN0IG5ld01hcFN0YXRlID0ge1xuICAgICAgICAuLi5tYXBTdGF0ZSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgem9vbTogbWFwU3RhdGUuem9vbSArIChNYXRoLmxvZzIoc2NhbGUpIHx8IDApXG4gICAgICB9O1xuXG4gICAgICAvLyBjZW50ZXIgYW5kIGFsbCBsYXllciBib3VuZHNcbiAgICAgIGlmIChleHBvcnRJbWFnZVNldHRpbmcuY2VudGVyKSB7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkTGF5ZXJzID0gbGF5ZXJzLmZpbHRlcihcbiAgICAgICAgICAobGF5ZXIsIGlkeCkgPT4gbGF5ZXIuaWQgIT09IEdFT0NPREVSX0xBWUVSX0lEICYmIGxheWVyLnNob3VsZFJlbmRlckxheWVyKGxheWVyRGF0YVtpZHhdKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBmaW5kTWFwQm91bmRzKHJlbmRlcmVkTGF5ZXJzKTtcbiAgICAgICAgY29uc3QgY2VudGVyQW5kWm9vbSA9IGdldENlbnRlckFuZFpvb21Gcm9tQm91bmRzKGJvdW5kcywge3dpZHRoLCBoZWlnaHR9KTtcbiAgICAgICAgaWYgKGNlbnRlckFuZFpvb20pIHtcbiAgICAgICAgICBjb25zdCB6b29tID0gTnVtYmVyLmlzRmluaXRlKGNlbnRlckFuZFpvb20uem9vbSkgPyBjZW50ZXJBbmRab29tLnpvb20gOiBtYXBTdGF0ZS56b29tO1xuXG4gICAgICAgICAgbmV3TWFwU3RhdGUubG9uZ2l0dWRlID0gY2VudGVyQW5kWm9vbS5jZW50ZXJbMF07XG4gICAgICAgICAgbmV3TWFwU3RhdGUubGF0aXR1ZGUgPSBjZW50ZXJBbmRab29tLmNlbnRlclsxXTtcbiAgICAgICAgICBuZXdNYXBTdGF0ZS56b29tID0gem9vbSArIE51bWJlcihNYXRoLmxvZzIoc2NhbGUpIHx8IDApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcFByb3BzID0ge1xuICAgICAgICAuLi5tYXBGaWVsZHMsXG4gICAgICAgIG1hcFN0eWxlOiB0aGlzLnNjYWxlZE1hcFN0eWxlU2VsZWN0b3IodGhpcy5wcm9wcyksXG5cbiAgICAgICAgLy8gb3ZlcnJpZGUgdmlld3BvcnQgYmFzZWQgb24gZXhwb3J0IHNldHRpbmdzXG4gICAgICAgIG1hcFN0YXRlOiBuZXdNYXBTdGF0ZSxcbiAgICAgICAgbWFwQ29udHJvbHM6IHtcbiAgICAgICAgICAvLyBvdmVycmlkZSBtYXAgbGVnZW5kIHZpc2liaWxpdHlcbiAgICAgICAgICBtYXBMZWdlbmQ6IHtcbiAgICAgICAgICAgIHNob3c6IGxlZ2VuZCxcbiAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgTWFwQ29tcG9uZW50OiBNYXAsXG4gICAgICAgIG9uTWFwUmVuZGVyOiB0aGlzLl9vbk1hcFJlbmRlcixcbiAgICAgICAgaXNFeHBvcnQ6IHRydWUsXG4gICAgICAgIGRlY2tHbFByb3BzOiB7XG4gICAgICAgICAgLi4ubWFwRmllbGRzLmRlY2tHbFByb3BzLFxuICAgICAgICAgIGdsT3B0aW9uczoge1xuICAgICAgICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlLFxuICAgICAgICAgICAgdXNlRGV2aWNlUGl4ZWxzOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlzU3RhdGU6IHtcbiAgICAgICAgICAuLi5tYXBGaWVsZHMudmlzU3RhdGUsXG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHVzZSBlZmZlY3RzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgV2ViR0wgY29udGV4dFxuICAgICAgICAgIGVmZmVjdHM6IHRoaXMuc3RhdGUucGxvdEVmZmVjdHNcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFwQ29udGFpbmVycyA9ICFpc1NwbGl0ID8gKFxuICAgICAgICA8TWFwQ29udGFpbmVyIGluZGV4PXswfSBwcmltYXJ5PXt0cnVlfSB7Li4ubWFwUHJvcHN9IC8+XG4gICAgICApIDogKFxuICAgICAgICA8TWFwc0xheW91dCBjbGFzc05hbWU9XCJwbG90LWNvbnRhaW5lci1tYXBzXCIgbWFwU3RhdGU9e25ld01hcFN0YXRlfT5cbiAgICAgICAgICB7c3BsaXRNYXBzLm1hcCgoc2V0dGluZ3MsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICA8TWFwQ29udGFpbmVyIGtleT17aW5kZXh9IGluZGV4PXtpbmRleH0gcHJpbWFyeT17aW5kZXggPT09IDF9IHsuLi5tYXBQcm9wc30gLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9NYXBzTGF5b3V0PlxuICAgICAgKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTdHlsZWRQbG90Q29udGFpbmVyIGNsYXNzTmFtZT1cImV4cG9ydC1tYXAtaW5zdGFuY2VcIj5cbiAgICAgICAgICA8U3R5bGVkTWFwQ29udGFpbmVyIHJlZj17dGhpcy5wbG90dGluZ0FyZWFSZWZ9IHdpZHRoPXtzaXplLndpZHRofSBoZWlnaHQ9e3NpemUuaGVpZ2h0fT5cbiAgICAgICAgICAgIDxNYXBWaWV3U3RhdGVDb250ZXh0UHJvdmlkZXIgbWFwU3RhdGU9e25ld01hcFN0YXRlfT5cbiAgICAgICAgICAgICAge21hcENvbnRhaW5lcnN9XG4gICAgICAgICAgICA8L01hcFZpZXdTdGF0ZUNvbnRleHRQcm92aWRlcj5cbiAgICAgICAgICA8L1N0eWxlZE1hcENvbnRhaW5lcj5cbiAgICAgICAgPC9TdHlsZWRQbG90Q29udGFpbmVyPlxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFBsb3RDb250YWluZXI7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksV0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssU0FBQSxHQUFBRixzQkFBQSxDQUFBSCxPQUFB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
;