UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

213 lines (166 loc) 19.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); 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 _styledComponents = _interopRequireDefault(require("styled-components")); var _d3Selection = require("d3-selection"); var _d3Brush = require("d3-brush"); var _templateObject; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var StyledG = _styledComponents["default"].g(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .selection {\n stroke: none;\n fill: ", ";\n opacity: 1;\n }\n"])), function (props) { return props.theme.rangeBrushBgd; }); var RangeBrush = exports["default"] = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(RangeBrush, _Component); var _super = _createSuper(RangeBrush); function RangeBrush() { var _this; (0, _classCallCheck2["default"])(this, RangeBrush); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "rootContainer", (0, _react.createRef)()); return _this; } (0, _createClass2["default"])(RangeBrush, [{ key: "componentDidMount", value: function componentDidMount() { var _this2 = this; // We want the React app to respond to brush state and vice-versa // but d3-brush fires the same events for both user-initiated brushing // and programmatic brushing (brush.move). We need these flags to // distinguish between the uses. // // We don't use state because that would trigger another `componentDidUpdate` this.brushing = false; this.moving = false; this.root = (0, _d3Selection.select)(this.rootContainer.current); this.brush = (0, _d3Brush.brushX)().on('start', function () { _this2.brushing = true; }).on('brush', function () { if (_this2.moving) { return; } _d3Selection.event.selection === null ? _this2._reset() : _this2._brush(_d3Selection.event.selection); }).on('end', function () { if (!_this2.moving && _d3Selection.event.selection === null) { _this2._reset(); } _this2.brushing = false; _this2.moving = false; }); this.root.call(this.brush); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var _this$props = this.props, _this$props$value = (0, _slicedToArray2["default"])(_this$props.value, 2), val0 = _this$props$value[0], val1 = _this$props$value[1], width = _this$props.width; var _prevProps$value = (0, _slicedToArray2["default"])(prevProps.value, 2), prevVal0 = _prevProps$value[0], prevVal1 = _prevProps$value[1]; if (prevProps.width !== width) { // width change should not trigger this._brush this.moving = true; this.root.call(this.brush); this._move(val0, val1); } if (!this.brushing && !this.moving) { if (prevVal0 !== val0 || prevVal1 !== val1) { this.moving = true; this._move(val0, val1); } } } }, { key: "_reset", value: function _reset() { var _this$props$range = (0, _slicedToArray2["default"])(this.props.range, 2), minValue = _this$props$range[0], maxValue = _this$props$range[1]; this._onBrush(minValue, maxValue); } }, { key: "_move", value: function _move(val0, val1) { var _this$props2 = this.props, _this$props2$domain = (0, _slicedToArray2["default"])(_this$props2.domain, 2), min = _this$props2$domain[0], max = _this$props2$domain[1], width = _this$props2.width; var scale = function scale(x) { return (x - min) * width / (max - min); }; this.brush.move(this.root, [scale(val0), scale(val1)]); } }, { key: "_brush", value: function _brush(_ref) { var _ref2 = (0, _slicedToArray2["default"])(_ref, 2), sel0 = _ref2[0], sel1 = _ref2[1]; var _this$props3 = this.props, _this$props3$domain = (0, _slicedToArray2["default"])(_this$props3.domain, 2), min = _this$props3$domain[0], max = _this$props3$domain[1], width = _this$props3.width; var invert = function invert(x) { return x * (max - min) / width + min; }; this._onBrush(invert(sel0), invert(sel1)); } }, { key: "_onBrush", value: function _onBrush(val0, val1) { var _this$props$value2 = (0, _slicedToArray2["default"])(this.props.value, 2), currentVal0 = _this$props$value2[0], currentVal1 = _this$props$value2[1]; if (currentVal0 === val0 && currentVal1 === val1) { return; } this.props.onBrush(val0, val1); } }, { key: "render", value: function render() { return (/*#__PURE__*/_react["default"].createElement(StyledG, { className: "kg-range-slider__brush" // innerRef={comp => { // this.rootContainer = comp; // }} , ref: this.rootContainer }) ); } }]); return RangeBrush; }(_react.Component); (0, _defineProperty2["default"])(RangeBrush, "propTypes", { domain: _propTypes["default"].arrayOf(_propTypes["default"].number).isRequired, onBrush: _propTypes["default"].func.isRequired, range: _propTypes["default"].arrayOf(_propTypes["default"].number).isRequired, value: _propTypes["default"].arrayOf(_propTypes["default"].number).isRequired, width: _propTypes["default"].number.isRequired }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9yYW5nZS1icnVzaC5qcyJdLCJuYW1lcyI6WyJTdHlsZWRHIiwic3R5bGVkIiwiZyIsInByb3BzIiwidGhlbWUiLCJyYW5nZUJydXNoQmdkIiwiUmFuZ2VCcnVzaCIsImJydXNoaW5nIiwibW92aW5nIiwicm9vdCIsInJvb3RDb250YWluZXIiLCJjdXJyZW50IiwiYnJ1c2giLCJvbiIsImV2ZW50Iiwic2VsZWN0aW9uIiwiX3Jlc2V0IiwiX2JydXNoIiwiY2FsbCIsInByZXZQcm9wcyIsInZhbHVlIiwidmFsMCIsInZhbDEiLCJ3aWR0aCIsInByZXZWYWwwIiwicHJldlZhbDEiLCJfbW92ZSIsInJhbmdlIiwibWluVmFsdWUiLCJtYXhWYWx1ZSIsIl9vbkJydXNoIiwiZG9tYWluIiwibWluIiwibWF4Iiwic2NhbGUiLCJ4IiwibW92ZSIsInNlbDAiLCJzZWwxIiwiaW52ZXJ0IiwiY3VycmVudFZhbDAiLCJjdXJyZW50VmFsMSIsIm9uQnJ1c2giLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJhcnJheU9mIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsImZ1bmMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxPQUFPLEdBQUdDLDZCQUFPQyxDQUFWLG1LQUdELFVBQUFDLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUMsYUFBaEI7QUFBQSxDQUhKLENBQWI7O0lBUXFCQyxVOzs7Ozs7Ozs7Ozs7Ozs7c0dBaUVILHVCOzs7Ozs7V0F4RGhCLDZCQUFvQjtBQUFBOztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxXQUFLQyxRQUFMLEdBQWdCLEtBQWhCO0FBQ0EsV0FBS0MsTUFBTCxHQUFjLEtBQWQ7QUFFQSxXQUFLQyxJQUFMLEdBQVkseUJBQU8sS0FBS0MsYUFBTCxDQUFtQkMsT0FBMUIsQ0FBWjtBQUNBLFdBQUtDLEtBQUwsR0FBYSx1QkFDVkMsRUFEVSxDQUNQLE9BRE8sRUFDRSxZQUFNO0FBQ2pCLFFBQUEsTUFBSSxDQUFDTixRQUFMLEdBQWdCLElBQWhCO0FBQ0QsT0FIVSxFQUlWTSxFQUpVLENBSVAsT0FKTyxFQUlFLFlBQU07QUFDakIsWUFBSSxNQUFJLENBQUNMLE1BQVQsRUFBaUI7QUFDZjtBQUNEOztBQUNETSwyQkFBTUMsU0FBTixLQUFvQixJQUFwQixHQUEyQixNQUFJLENBQUNDLE1BQUwsRUFBM0IsR0FBMkMsTUFBSSxDQUFDQyxNQUFMLENBQVlILG1CQUFNQyxTQUFsQixDQUEzQztBQUNELE9BVFUsRUFVVkYsRUFWVSxDQVVQLEtBVk8sRUFVQSxZQUFNO0FBQ2YsWUFBSSxDQUFDLE1BQUksQ0FBQ0wsTUFBTixJQUFnQk0sbUJBQU1DLFNBQU4sS0FBb0IsSUFBeEMsRUFBOEM7QUFDNUMsVUFBQSxNQUFJLENBQUNDLE1BQUw7QUFDRDs7QUFFRCxRQUFBLE1BQUksQ0FBQ1QsUUFBTCxHQUFnQixLQUFoQjtBQUNBLFFBQUEsTUFBSSxDQUFDQyxNQUFMLEdBQWMsS0FBZDtBQUNELE9BakJVLENBQWI7QUFtQkEsV0FBS0MsSUFBTCxDQUFVUyxJQUFWLENBQWUsS0FBS04sS0FBcEI7QUFDRDs7O1dBRUQsNEJBQW1CTyxTQUFuQixFQUE4QjtBQUM1Qix3QkFHSSxLQUFLaEIsS0FIVDtBQUFBLDBFQUNFaUIsS0FERjtBQUFBLFVBQ1VDLElBRFY7QUFBQSxVQUNnQkMsSUFEaEI7QUFBQSxVQUVFQyxLQUZGLGVBRUVBLEtBRkY7O0FBSUEsNkRBQTZCSixTQUFTLENBQUNDLEtBQXZDO0FBQUEsVUFBT0ksUUFBUDtBQUFBLFVBQWlCQyxRQUFqQjs7QUFFQSxVQUFJTixTQUFTLENBQUNJLEtBQVYsS0FBb0JBLEtBQXhCLEVBQStCO0FBQzdCO0FBQ0EsYUFBS2YsTUFBTCxHQUFjLElBQWQ7QUFDQSxhQUFLQyxJQUFMLENBQVVTLElBQVYsQ0FBZSxLQUFLTixLQUFwQjs7QUFDQSxhQUFLYyxLQUFMLENBQVdMLElBQVgsRUFBaUJDLElBQWpCO0FBQ0Q7O0FBRUQsVUFBSSxDQUFDLEtBQUtmLFFBQU4sSUFBa0IsQ0FBQyxLQUFLQyxNQUE1QixFQUFvQztBQUNsQyxZQUFJZ0IsUUFBUSxLQUFLSCxJQUFiLElBQXFCSSxRQUFRLEtBQUtILElBQXRDLEVBQTRDO0FBQzFDLGVBQUtkLE1BQUwsR0FBYyxJQUFkOztBQUNBLGVBQUtrQixLQUFMLENBQVdMLElBQVgsRUFBaUJDLElBQWpCO0FBQ0Q7QUFDRjtBQUNGOzs7V0FJRCxrQkFBUztBQUNQLDhEQUE2QixLQUFLbkIsS0FBTCxDQUFXd0IsS0FBeEM7QUFBQSxVQUFPQyxRQUFQO0FBQUEsVUFBaUJDLFFBQWpCOztBQUNBLFdBQUtDLFFBQUwsQ0FBY0YsUUFBZCxFQUF3QkMsUUFBeEI7QUFDRDs7O1dBRUQsZUFBTVIsSUFBTixFQUFZQyxJQUFaLEVBQWtCO0FBQ2hCLHlCQUdJLEtBQUtuQixLQUhUO0FBQUEsNkVBQ0U0QixNQURGO0FBQUEsVUFDV0MsR0FEWDtBQUFBLFVBQ2dCQyxHQURoQjtBQUFBLFVBRUVWLEtBRkYsZ0JBRUVBLEtBRkY7O0FBSUEsVUFBTVcsS0FBSyxHQUFHLFNBQVJBLEtBQVEsQ0FBQUMsQ0FBQztBQUFBLGVBQUssQ0FBQ0EsQ0FBQyxHQUFHSCxHQUFMLElBQVlULEtBQWIsSUFBdUJVLEdBQUcsR0FBR0QsR0FBN0IsQ0FBSjtBQUFBLE9BQWY7O0FBQ0EsV0FBS3BCLEtBQUwsQ0FBV3dCLElBQVgsQ0FBZ0IsS0FBSzNCLElBQXJCLEVBQTJCLENBQUN5QixLQUFLLENBQUNiLElBQUQsQ0FBTixFQUFjYSxLQUFLLENBQUNaLElBQUQsQ0FBbkIsQ0FBM0I7QUFDRDs7O1dBRUQsc0JBQXFCO0FBQUE7QUFBQSxVQUFiZSxJQUFhO0FBQUEsVUFBUEMsSUFBTzs7QUFDbkIseUJBR0ksS0FBS25DLEtBSFQ7QUFBQSw2RUFDRTRCLE1BREY7QUFBQSxVQUNXQyxHQURYO0FBQUEsVUFDZ0JDLEdBRGhCO0FBQUEsVUFFRVYsS0FGRixnQkFFRUEsS0FGRjs7QUFJQSxVQUFNZ0IsTUFBTSxHQUFHLFNBQVRBLE1BQVMsQ0FBQUosQ0FBQztBQUFBLGVBQUtBLENBQUMsSUFBSUYsR0FBRyxHQUFHRCxHQUFWLENBQUYsR0FBb0JULEtBQXBCLEdBQTRCUyxHQUFoQztBQUFBLE9BQWhCOztBQUNBLFdBQUtGLFFBQUwsQ0FBY1MsTUFBTSxDQUFDRixJQUFELENBQXBCLEVBQTRCRSxNQUFNLENBQUNELElBQUQsQ0FBbEM7QUFDRDs7O1dBRUQsa0JBQVNqQixJQUFULEVBQWVDLElBQWYsRUFBcUI7QUFDbkIsK0RBRUksS0FBS25CLEtBRlQsQ0FDRWlCLEtBREY7QUFBQSxVQUNVb0IsV0FEVjtBQUFBLFVBQ3VCQyxXQUR2Qjs7QUFJQSxVQUFJRCxXQUFXLEtBQUtuQixJQUFoQixJQUF3Qm9CLFdBQVcsS0FBS25CLElBQTVDLEVBQWtEO0FBQ2hEO0FBQ0Q7O0FBRUQsV0FBS25CLEtBQUwsQ0FBV3VDLE9BQVgsQ0FBbUJyQixJQUFuQixFQUF5QkMsSUFBekI7QUFDRDs7O1dBQ0Qsa0JBQVM7QUFDUCwyQkFDRSxnQ0FBQyxPQUFEO0FBQ0UsVUFBQSxTQUFTLEVBQUMsd0JBRFosQ0FFRTtBQUNBO0FBQ0E7QUFKRjtBQUtFLFVBQUEsR0FBRyxFQUFFLEtBQUtaO0FBTFo7QUFERjtBQVNEOzs7RUEvR3FDaUMsZ0I7O2lDQUFuQnJDLFUsZUFDQTtBQUNqQnlCLEVBQUFBLE1BQU0sRUFBRWEsc0JBQVVDLE9BQVYsQ0FBa0JELHNCQUFVRSxNQUE1QixFQUFvQ0MsVUFEM0I7QUFFakJMLEVBQUFBLE9BQU8sRUFBRUUsc0JBQVVJLElBQVYsQ0FBZUQsVUFGUDtBQUdqQnBCLEVBQUFBLEtBQUssRUFBRWlCLHNCQUFVQyxPQUFWLENBQWtCRCxzQkFBVUUsTUFBNUIsRUFBb0NDLFVBSDFCO0FBSWpCM0IsRUFBQUEsS0FBSyxFQUFFd0Isc0JBQVVDLE9BQVYsQ0FBa0JELHNCQUFVRSxNQUE1QixFQUFvQ0MsVUFKMUI7QUFLakJ4QixFQUFBQSxLQUFLLEVBQUVxQixzQkFBVUUsTUFBVixDQUFpQkM7QUFMUCxDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7ZXZlbnQsIHNlbGVjdH0gZnJvbSAnZDMtc2VsZWN0aW9uJztcbmltcG9ydCB7YnJ1c2hYfSBmcm9tICdkMy1icnVzaCc7XG5cbmNvbnN0IFN0eWxlZEcgPSBzdHlsZWQuZ2BcbiAgLnNlbGVjdGlvbiB7XG4gICAgc3Ryb2tlOiBub25lO1xuICAgIGZpbGw6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucmFuZ2VCcnVzaEJnZH07XG4gICAgb3BhY2l0eTogMTtcbiAgfVxuYDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFuZ2VCcnVzaCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgZG9tYWluOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKS5pc1JlcXVpcmVkLFxuICAgIG9uQnJ1c2g6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgcmFuZ2U6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLmlzUmVxdWlyZWQsXG4gICAgdmFsdWU6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLmlzUmVxdWlyZWQsXG4gICAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZFxuICB9O1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIFdlIHdhbnQgdGhlIFJlYWN0IGFwcCB0byByZXNwb25kIHRvIGJydXNoIHN0YXRlIGFuZCB2aWNlLXZlcnNhXG4gICAgLy8gYnV0IGQzLWJydXNoIGZpcmVzIHRoZSBzYW1lIGV2ZW50cyBmb3IgYm90aCB1c2VyLWluaXRpYXRlZCBicnVzaGluZ1xuICAgIC8vIGFuZCBwcm9ncmFtbWF0aWMgYnJ1c2hpbmcgKGJydXNoLm1vdmUpLiBXZSBuZWVkIHRoZXNlIGZsYWdzIHRvXG4gICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdXNlcy5cbiAgICAvL1xuICAgIC8vIFdlIGRvbid0IHVzZSBzdGF0ZSBiZWNhdXNlIHRoYXQgd291bGQgdHJpZ2dlciBhbm90aGVyIGBjb21wb25lbnREaWRVcGRhdGVgXG5cbiAgICB0aGlzLmJydXNoaW5nID0gZmFsc2U7XG4gICAgdGhpcy5tb3ZpbmcgPSBmYWxzZTtcblxuICAgIHRoaXMucm9vdCA9IHNlbGVjdCh0aGlzLnJvb3RDb250YWluZXIuY3VycmVudCk7XG4gICAgdGhpcy5icnVzaCA9IGJydXNoWCgpXG4gICAgICAub24oJ3N0YXJ0JywgKCkgPT4ge1xuICAgICAgICB0aGlzLmJydXNoaW5nID0gdHJ1ZTtcbiAgICAgIH0pXG4gICAgICAub24oJ2JydXNoJywgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tb3ZpbmcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQuc2VsZWN0aW9uID09PSBudWxsID8gdGhpcy5fcmVzZXQoKSA6IHRoaXMuX2JydXNoKGV2ZW50LnNlbGVjdGlvbik7XG4gICAgICB9KVxuICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tb3ZpbmcgJiYgZXZlbnQuc2VsZWN0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fcmVzZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYnJ1c2hpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb3ZpbmcgPSBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yb290LmNhbGwodGhpcy5icnVzaCk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgY29uc3Qge1xuICAgICAgdmFsdWU6IFt2YWwwLCB2YWwxXSxcbiAgICAgIHdpZHRoXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgW3ByZXZWYWwwLCBwcmV2VmFsMV0gPSBwcmV2UHJvcHMudmFsdWU7XG5cbiAgICBpZiAocHJldlByb3BzLndpZHRoICE9PSB3aWR0aCkge1xuICAgICAgLy8gd2lkdGggY2hhbmdlIHNob3VsZCBub3QgdHJpZ2dlciB0aGlzLl9icnVzaFxuICAgICAgdGhpcy5tb3ZpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5yb290LmNhbGwodGhpcy5icnVzaCk7XG4gICAgICB0aGlzLl9tb3ZlKHZhbDAsIHZhbDEpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5icnVzaGluZyAmJiAhdGhpcy5tb3ZpbmcpIHtcbiAgICAgIGlmIChwcmV2VmFsMCAhPT0gdmFsMCB8fCBwcmV2VmFsMSAhPT0gdmFsMSkge1xuICAgICAgICB0aGlzLm1vdmluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX21vdmUodmFsMCwgdmFsMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcm9vdENvbnRhaW5lciA9IGNyZWF0ZVJlZigpO1xuXG4gIF9yZXNldCgpIHtcbiAgICBjb25zdCBbbWluVmFsdWUsIG1heFZhbHVlXSA9IHRoaXMucHJvcHMucmFuZ2U7XG4gICAgdGhpcy5fb25CcnVzaChtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICB9XG5cbiAgX21vdmUodmFsMCwgdmFsMSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRvbWFpbjogW21pbiwgbWF4XSxcbiAgICAgIHdpZHRoXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgc2NhbGUgPSB4ID0+ICgoeCAtIG1pbikgKiB3aWR0aCkgLyAobWF4IC0gbWluKTtcbiAgICB0aGlzLmJydXNoLm1vdmUodGhpcy5yb290LCBbc2NhbGUodmFsMCksIHNjYWxlKHZhbDEpXSk7XG4gIH1cblxuICBfYnJ1c2goW3NlbDAsIHNlbDFdKSB7XG4gICAgY29uc3Qge1xuICAgICAgZG9tYWluOiBbbWluLCBtYXhdLFxuICAgICAgd2lkdGhcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBpbnZlcnQgPSB4ID0+ICh4ICogKG1heCAtIG1pbikpIC8gd2lkdGggKyBtaW47XG4gICAgdGhpcy5fb25CcnVzaChpbnZlcnQoc2VsMCksIGludmVydChzZWwxKSk7XG4gIH1cblxuICBfb25CcnVzaCh2YWwwLCB2YWwxKSB7XG4gICAgY29uc3Qge1xuICAgICAgdmFsdWU6IFtjdXJyZW50VmFsMCwgY3VycmVudFZhbDFdXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAoY3VycmVudFZhbDAgPT09IHZhbDAgJiYgY3VycmVudFZhbDEgPT09IHZhbDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByb3BzLm9uQnJ1c2godmFsMCwgdmFsMSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkR1xuICAgICAgICBjbGFzc05hbWU9XCJrZy1yYW5nZS1zbGlkZXJfX2JydXNoXCJcbiAgICAgICAgLy8gaW5uZXJSZWY9e2NvbXAgPT4ge1xuICAgICAgICAvLyAgIHRoaXMucm9vdENvbnRhaW5lciA9IGNvbXA7XG4gICAgICAgIC8vIH19XG4gICAgICAgIHJlZj17dGhpcy5yb290Q29udGFpbmVyfVxuICAgICAgLz5cbiAgICApO1xuICB9XG59XG4iXX0=