kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
207 lines (165 loc) • 21.5 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
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 _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
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 _propTypes = _interopRequireDefault(require("prop-types"));
var _reselect = require("reselect");
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _reactMapGl = require("react-map-gl");
var _lodash = _interopRequireDefault(require("lodash.debounce"));
var _window = _interopRequireDefault(require("global/window"));
var _mapContainer = _interopRequireDefault(require("./map-container"));
var _exportImageUtils = require("../utils/export-image-utils");
var _mapboxGlStyleEditor = require("../utils/map-style-utils/mapbox-gl-style-editor");
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; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n .mapboxgl-ctrl-bottom-left,\n .mapboxgl-ctrl-bottom-right {\n display: none;\n }\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var propTypes = {
width: _propTypes["default"].number.isRequired,
height: _propTypes["default"].number.isRequired,
exportImageSetting: _propTypes["default"].object.isRequired,
mapFields: _propTypes["default"].object.isRequired
};
PlotContainerFactory.deps = [_mapContainer["default"]];
var StyledPlotContainer = _styledComponents["default"].div(_templateObject());
function PlotContainerFactory(MapContainer) {
var PlotContainer =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(PlotContainer, _Component);
function PlotContainer(_props) {
var _this;
(0, _classCallCheck2["default"])(this, PlotContainer);
_this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(PlotContainer).call(this, _props));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "mapStyleSelector", function (props) {
return props.mapFields.mapStyle;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "resolutionSelector", function (props) {
return props.exportImageSetting.resolution;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "scaledMapStyleSelector", (0, _reselect.createSelector)(_this.mapStyleSelector, _this.resolutionSelector, function (mapStyle, resolution) {
return {
bottomMapStyle: (0, _mapboxGlStyleEditor.scaleMapStyleByResolution)(mapStyle.bottomMapStyle, resolution),
topMapStyle: (0, _mapboxGlStyleEditor.scaleMapStyleByResolution)(mapStyle.topMapStyle, resolution)
};
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onMapRender", function (map) {
if (map.isStyleLoaded()) {
_this._retrieveNewScreenshot();
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_retrieveNewScreenshot", function () {
if (_this.plottingAreaRef) {
// setting windowDevicePixelRatio to 1
// so that large mapbox base map will load in full
var savedDevicePixelRatio = _window["default"].devicePixelRatio;
_window["default"].devicePixelRatio = 1;
_this.props.startExportingImage();
(0, _exportImageUtils.convertToPng)(_this.plottingAreaRef).then(function (dataUri) {
_this.props.setExportImageDataUri({
dataUri: dataUri
});
_window["default"].devicePixelRatio = savedDevicePixelRatio;
});
}
});
_this._onMapRender = (0, _lodash["default"])(_this._onMapRender, 500);
return _this;
}
(0, _createClass2["default"])(PlotContainer, [{
key: "componentWillMount",
value: function componentWillMount() {
this.props.startExportingImage();
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(newProps) {
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] !== newProps.exportImageSetting[item];
});
if (shouldRetrieveScreenshot) {
this._retrieveNewScreenshot();
}
}
}, {
key: "render",
value: function render() {
var _this3 = this;
var _this$props = this.props,
width = _this$props.width,
height = _this$props.height,
exportImageSetting = _this$props.exportImageSetting,
mapFields = _this$props.mapFields;
var ratio = exportImageSetting.ratio,
resolution = exportImageSetting.resolution,
legend = exportImageSetting.legend;
var exportImageSize = (0, _exportImageUtils.calculateExportImageSize)({
width: width,
height: height,
ratio: ratio,
resolution: resolution
});
var mapProps = _objectSpread({}, mapFields, {
mapStyle: this.scaledMapStyleSelector(this.props),
// override viewport based on export settings
mapState: _objectSpread({}, mapFields.mapState, {}, exportImageSize, {
zoom: mapFields.mapState.zoom + exportImageSize.zoomOffset
}),
mapControls: {
// override map legend visibility
mapLegend: {
show: legend,
active: true
}
},
MapComponent: _reactMapGl.StaticMap
});
return _react["default"].createElement(StyledPlotContainer, {
style: {
position: 'absolute',
top: -9999,
left: -9999
}
}, _react["default"].createElement("div", {
ref: function ref(element) {
_this3.plottingAreaRef = element;
},
style: {
width: exportImageSize.width,
height: exportImageSize.height
}
}, _react["default"].createElement(MapContainer, (0, _extends2["default"])({
index: 0,
onMapRender: this._onMapRender,
isExport: true
}, mapProps))));
}
}]);
return PlotContainer;
}(_react.Component);
PlotContainer.propsTypes = propTypes;
return PlotContainer;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3Bsb3QtY29udGFpbmVyLmpzIl0sIm5hbWVzIjpbInByb3BUeXBlcyIsIndpZHRoIiwiUHJvcFR5cGVzIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsImhlaWdodCIsImV4cG9ydEltYWdlU2V0dGluZyIsIm9iamVjdCIsIm1hcEZpZWxkcyIsIlBsb3RDb250YWluZXJGYWN0b3J5IiwiZGVwcyIsIk1hcENvbnRhaW5lckZhY3RvcnkiLCJTdHlsZWRQbG90Q29udGFpbmVyIiwic3R5bGVkIiwiZGl2IiwiTWFwQ29udGFpbmVyIiwiUGxvdENvbnRhaW5lciIsInByb3BzIiwibWFwU3R5bGUiLCJyZXNvbHV0aW9uIiwibWFwU3R5bGVTZWxlY3RvciIsInJlc29sdXRpb25TZWxlY3RvciIsImJvdHRvbU1hcFN0eWxlIiwidG9wTWFwU3R5bGUiLCJtYXAiLCJpc1N0eWxlTG9hZGVkIiwiX3JldHJpZXZlTmV3U2NyZWVuc2hvdCIsInBsb3R0aW5nQXJlYVJlZiIsInNhdmVkRGV2aWNlUGl4ZWxSYXRpbyIsIndpbmRvdyIsImRldmljZVBpeGVsUmF0aW8iLCJzdGFydEV4cG9ydGluZ0ltYWdlIiwidGhlbiIsImRhdGFVcmkiLCJzZXRFeHBvcnRJbWFnZURhdGFVcmkiLCJfb25NYXBSZW5kZXIiLCJuZXdQcm9wcyIsImNoZWNrcyIsInNob3VsZFJldHJpZXZlU2NyZWVuc2hvdCIsInNvbWUiLCJpdGVtIiwicmF0aW8iLCJsZWdlbmQiLCJleHBvcnRJbWFnZVNpemUiLCJtYXBQcm9wcyIsInNjYWxlZE1hcFN0eWxlU2VsZWN0b3IiLCJtYXBTdGF0ZSIsInpvb20iLCJ6b29tT2Zmc2V0IiwibWFwQ29udHJvbHMiLCJtYXBMZWdlbmQiLCJzaG93IiwiYWN0aXZlIiwiTWFwQ29tcG9uZW50IiwiU3RhdGljTWFwIiwicG9zaXRpb24iLCJ0b3AiLCJsZWZ0IiwiZWxlbWVudCIsIkNvbXBvbmVudCIsInByb3BzVHlwZXMiXSwibWFwcGluZ3Mi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QUNFLGdDQUFDLG1CQUFEO0FBQ0UsVUFBQSxLQUFLLEVBQUU7QUFBQ0MsWUFBQUEsUUFBUSxFQUFFLFVBQVg7QUFBdUJDLFlBQUFBLEdBQUcsRUFBRSxDQUFDLElBQTdCO0FBQW1DQyxZQUFBQSxJQUFJLEVBQUUsQ0FBQztBQUExQztBQURULFdBR0U7QUFDRSxVQUFBLEdBQUcsRUFBRSxhQUFBQyxPQUFPLEVBQUk7QUFDZCxZQUFBLE1BQUksQ0FBQy9CLGVBQUwsR0FBdUIrQixPQUF2QjtBQUNELFdBSEg7QUFJRSxVQUFBLEtBQUssRUFBRTtBQUNMekQsWUFBQUEsS0FBSyxFQUFFMEMsZUFBZSxDQUFDMUMsS0FEbEI7QUFFTEksWUFBQUEsTUFBTSxFQUFFc0MsZUFBZSxDQUFDdEM7QUFGbkI7QUFKVCxXQVNFLGdDQUFDLFlBQUQ7QUFDRSxVQUFBLEtBQUssRUFBRSxDQURUO0FBRUUsVUFBQSxXQUFXLEVBQUUsS0FBSzhCLFlBRnBCO0FBR0UsVUFBQSxRQUFRO0FBSFYsV0FJTVMsUUFKTixFQVRGLENBSEYsQ0FERjtBQXNCRDtBQS9Hc0Q7QUFBQTtBQUFBLElBQzdCZSxnQkFENkI7O0FBa0h6RDNDLEVBQUFBLGFBQWEsQ0FBQzRDLFVBQWQsR0FBMkI1RCxTQUEzQjtBQUNBLFNBQU9nQixhQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG4vLyBsaWJyYXJpZXNcbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y3JlYXRlU2VsZWN0b3J9IGZyb20gJ3Jlc2VsZWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtTdGF0aWNNYXB9IGZyb20gJ3JlYWN0LW1hcC1nbCc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoLmRlYm91bmNlJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5cbmltcG9ydCBNYXBDb250YWluZXJGYWN0b3J5IGZyb20gJy4vbWFwLWNvbnRhaW5lcic7XG5pbXBvcnQge2NhbGN1bGF0ZUV4cG9ydEltYWdlU2l6ZSwgY29udmVydFRvUG5nfSBmcm9tICd1dGlscy9leHBvcnQtaW1hZ2UtdXRpbHMnO1xuaW1wb3J0IHtzY2FsZU1hcFN0eWxlQnlSZXNvbHV0aW9ufSBmcm9tICd1dGlscy9tYXAtc3R5bGUtdXRpbHMvbWFwYm94LWdsLXN0eWxlLWVkaXRvcic7XG5jb25zdCBwcm9wVHlwZXMgPSB7XG4gIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGhlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBleHBvcnRJbWFnZVNldHRpbmc6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgbWFwRmllbGRzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cblBsb3RDb250YWluZXJGYWN0b3J5LmRlcHMgPSBbTWFwQ29udGFpbmVyRmFjdG9yeV07XG5cbmNvbnN0IFN0eWxlZFBsb3RDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICAubWFwYm94Z2wtY3RybC1ib3R0b20tbGVmdCxcbiAgLm1hcGJveGdsLWN0cmwtYm90dG9tLXJpZ2h0IHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5gO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQbG90Q29udGFpbmVyRmFjdG9yeShNYXBDb250YWluZXIpIHtcbiAgY2xhc3MgUGxvdENvbnRhaW5lciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgIHRoaXMuX29uTWFwUmVuZGVyID0gZGVib3VuY2UodGhpcy5fb25NYXBSZW5kZXIsIDUwMCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5zdGFydEV4cG9ydGluZ0ltYWdlKCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcykge1xuICAgICAgLy8gcmUtZmV0Y2ggdGhlIG5ldyBzY3JlZW5zaG90IG9ubHkgd2hlbiByYXRpbyBsZWdlbmQgb3IgcmVzb2x1dGlvbiBjaGFuZ2VzXG4gICAgICBjb25zdCBjaGVja3MgPSBbJ3JhdGlvJywgJ3Jlc29sdXRpb24nLCAnbGVnZW5kJ107XG4gICAgICBjb25zdCBzaG91bGRSZXRyaWV2ZVNjcmVlbnNob3QgPSBjaGVja3Muc29tZShcbiAgICAgICAgaXRlbSA9PlxuICAgICAgICAgIHRoaXMucHJvcHMuZXhwb3J0SW1hZ2VTZXR0aW5nW2l0ZW1dICE9PVxuICAgICAgICAgIG5ld1Byb3BzLmV4cG9ydEltYWdlU2V0dGluZ1tpdGVtXVxuICAgICAgKTtcbiAgICAgIGlmIChzaG91bGRSZXRyaWV2ZVNjcmVlbnNob3QpIHtcbiAgICAgICAgdGhpcy5fcmV0cmlldmVOZXdTY3JlZW5zaG90KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWFwU3R5bGVTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLm1hcEZpZWxkcy5tYXBTdHlsZTtcbiAgICByZXNvbHV0aW9uU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5leHBvcnRJbWFnZVNldHRpbmcucmVzb2x1dGlvbjtcbiAgICBzY2FsZWRNYXBTdHlsZVNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLm1hcFN0eWxlU2VsZWN0b3IsXG4gICAgICB0aGlzLnJlc29sdXRpb25TZWxlY3RvcixcbiAgICAgIChtYXBTdHlsZSwgcmVzb2x1dGlvbikgPT4gKHtcbiAgICAgICAgYm90dG9tTWFwU3R5bGU6IHNjYWxlTWFwU3R5bGVCeVJlc29sdXRpb24oXG4gICAgICAgICAgbWFwU3R5bGUuYm90dG9tTWFwU3R5bGUsXG4gICAgICAgICAgcmVzb2x1dGlvblxuICAgICAgICApLFxuICAgICAgICB0b3BNYXBTdHlsZTogc2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbihtYXBTdHlsZS50b3BNYXBTdHlsZSwgcmVzb2x1dGlvbilcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIF9vbk1hcFJlbmRlciA9IG1hcCA9PiB7XG4gICAgICBpZiAobWFwLmlzU3R5bGVMb2FkZWQoKSkge1xuICAgICAgICB0aGlzLl9yZXRyaWV2ZU5ld1NjcmVlbnNob3QoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3JldHJpZXZlTmV3U2NyZWVuc2hvdCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBsb3R0aW5nQXJlYVJlZikge1xuICAgICAgLy8gc2V0dGluZyB3aW5kb3dEZXZpY2VQaXhlbFJhdGlvIHRvIDFcbiAgICAgIC8vIHNvIHRoYXQgbGFyZ2UgbWFwYm94IGJhc2UgbWFwIHdpbGwgbG9hZCBpbiBmdWxsXG4gICAgICAgIGNvbnN0IHNhdmVkRGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA9IDE7XG5cbiAgICAgICAgdGhpcy5wcm9wcy5zdGFydEV4cG9ydGluZ0ltYWdlKCk7XG4gICAgICAgIGNvbnZlcnRUb1BuZyh0aGlzLnBsb3R0aW5nQXJlYVJlZikudGhlbihkYXRhVXJpID0+IHtcbiAgICAgICAgICB0aGlzLnByb3BzLnNldEV4cG9ydEltYWdlRGF0YVVyaSh7ZGF0YVVyaX0pO1xuICAgICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvID0gc2F2ZWREZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIGV4cG9ydEltYWdlU2V0dGluZywgbWFwRmllbGRzfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCB7cmF0aW8sIHJlc29sdXRpb24sIGxlZ2VuZH0gPSBleHBvcnRJbWFnZVNldHRpbmc7XG4gICAgICBjb25zdCBleHBvcnRJbWFnZVNpemUgPSBjYWxjdWxhdGVFeHBvcnRJbWFnZVNpemUoe1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICByYXRpbyxcbiAgICAgICAgcmVzb2x1dGlvblxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1hcFByb3BzID0ge1xuICAgICAgICAuLi5tYXBGaWVsZHMsXG4gICAgICAgIG1hcFN0eWxlOiB0aGlzLnNjYWxlZE1hcFN0eWxlU2VsZWN0b3IodGhpcy5wcm9wcyksXG5cbiAgICAgICAgLy8gb3ZlcnJpZGUgdmlld3BvcnQgYmFzZWQgb24gZXhwb3J0IHNldHRpbmdzXG4gICAgICAgIG1hcFN0YXRlOiB7XG4gICAgICAgICAgLi4ubWFwRmllbGRzLm1hcFN0YXRlLFxuICAgICAgICAgIC4uLmV4cG9ydEltYWdlU2l6ZSxcbiAgICAgICAgICB6b29tOiBtYXBGaWVsZHMubWFwU3RhdGUuem9vbSArIGV4cG9ydEltYWdlU2l6ZS56b29tT2Zmc2V0XG4gICAgICAgIH0sXG4gICAgICAgIG1hcENvbnRyb2xzOiB7XG4gICAgICAgICAgLy8gb3ZlcnJpZGUgbWFwIGxlZ2VuZCB2aXNpYmlsaXR5XG4gICAgICAgICAgbWFwTGVnZW5kOiB7XG4gICAgICAgICAgICBzaG93OiBsZWdlbmQsXG4gICAgICAgICAgICBhY3RpdmU6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIE1hcENvbXBvbmVudDogU3RhdGljTWFwXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3R5bGVkUGxvdENvbnRhaW5lclxuICAgICAgICAgIHN0eWxlPXt7cG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogLTk5OTksIGxlZnQ6IC05OTk5fX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHJlZj17ZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucGxvdHRpbmdBcmVhUmVmID0gZWxlbWVudDtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICB3aWR0aDogZXhwb3J0SW1hZ2VTaXplLndpZHRoLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGV4cG9ydEltYWdlU2l6ZS5oZWlnaHRcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPE1hcENvbnRhaW5lclxuICAgICAgICAgICAgICBpbmRleD17MH1cbiAgICAgICAgICAgICAgb25NYXBSZW5kZXI9e3RoaXMuX29uTWFwUmVuZGVyfVxuICAgICAgICAgICAgICBpc0V4cG9ydFxuICAgICAgICAgICAgICB7Li4ubWFwUHJvcHN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L1N0eWxlZFBsb3RDb250YWluZXI+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIFBsb3RDb250YWluZXIucHJvcHNUeXBlcyA9IHByb3BUeXBlcztcbiAgcmV0dXJuIFBsb3RDb250YWluZXI7XG59XG4iXX0=