kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
266 lines (265 loc) • 42 kB
JavaScript
"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 _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
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 _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireWildcard(require("styled-components"));
var _d3Selection = require("d3-selection");
var _d3Brush = require("d3-brush");
var _utils = require("@kepler.gl/utils");
var _templateObject; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
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 _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 StyledG = _styledComponents["default"].g(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .selection {\n stroke: none;\n fill: ", ";\n fill-opacity: ", ";\n }\n .handle {\n fill: ", ";\n fill-opacity: 0.3;\n }\n"])), function (props) {
return props.isRanged ? props.theme.rangeBrushBgd : props.theme.BLUE2;
}, function (props) {
return props.isRanged ? 0.3 : 1;
}, function (props) {
return props.theme.BLUE2;
});
function moveRight(startSel, selection) {
var _startSel = (0, _slicedToArray2["default"])(startSel, 1),
startSel0 = _startSel[0];
var _selection = (0, _slicedToArray2["default"])(selection, 1),
sel0 = _selection[0];
return Boolean(startSel0 === sel0);
}
// style brush resize handle
// https://github.com/crossfilter/crossfilter/blob/gh-pages/index.html#L466
var getHandlePath = function getHandlePath(props) {
return function brushResizePath(d) {
var e = Number(d.type === 'e');
var x = e ? 1 : -1;
var h = 39;
var w = 4.5;
var y = (props.height - h) / 2;
return "M".concat(0.5 * x, ",").concat(y, "c").concat(2.5 * x, ",0,").concat(w * x, ",2,").concat(w * x, ",").concat(w, "v").concat(h - w * 2, "c0,2.5,").concat(-2 * x, ",").concat(w, ",").concat(-w * x, ",").concat(w, "V").concat(y, "z");
};
};
function RangeBrushFactory() {
var RangeBrush = /*#__PURE__*/function (_Component) {
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 = _callSuper(this, RangeBrush, [].concat(args));
(0, _defineProperty2["default"])(_this, "rootContainer", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2["default"])(_this, "brushing", false);
(0, _defineProperty2["default"])(_this, "moving", false);
(0, _defineProperty2["default"])(_this, "root", _this.rootContainer.current ? (0, _d3Selection.select)(_this.rootContainer.current) : undefined);
(0, _defineProperty2["default"])(_this, "brush", void 0);
(0, _defineProperty2["default"])(_this, "_startSel", void 0);
(0, _defineProperty2["default"])(_this, "_lastSel", void 0);
(0, _defineProperty2["default"])(_this, "handle", void 0);
(0, _defineProperty2["default"])(_this, "_brushed", function (evt) {
var _this2;
// Ignore brush events which don't have an underlying sourceEvent
if (!evt.sourceEvent) return;
var _evt$selection = (0, _slicedToArray2["default"])(evt.selection, 2),
sel0 = _evt$selection[0],
sel1 = _evt$selection[1];
var right = moveRight(_this._startSel, evt.selection);
var _this$props = _this.props,
_this$props$range = (0, _slicedToArray2["default"])(_this$props.range, 2),
min = _this$props$range[0],
max = _this$props$range[1],
_this$props$step = _this$props.step,
step = _this$props$step === void 0 ? 0 : _this$props$step,
width = _this$props.width,
marks = _this$props.marks,
isRanged = _this$props.isRanged;
var invert = function invert(x) {
return x * (max - min) / width + min;
};
var d0 = invert(sel0);
var d1 = invert(sel1);
// this makes sure if points are right at the beginning of the domains are displayed correctly
// the problem here is bisectLeftx
d0 = d0 === min ? d0 : (0, _utils.normalizeSliderValue)(d0, min, step, marks);
d1 = (0, _utils.normalizeSliderValue)(d1, min, step, marks);
if (isRanged) _this._move(d0, d1);else (_this2 = _this)._move.apply(_this2, (0, _toConsumableArray2["default"])(right ? [d1, d1] : [d0, d0]));
if (isRanged) _this._onBrush(d0, d1);else _this._onBrush(right ? d1 : d0);
});
return _this;
}
(0, _inherits2["default"])(RangeBrush, _Component);
return (0, _createClass2["default"])(RangeBrush, [{
key: "componentDidMount",
value: function componentDidMount() {
var _this3 = this,
_this$root,
_this$root2;
// 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`
var _this$props2 = this.props,
theme = _this$props2.theme,
isRanged = _this$props2.isRanged,
onMouseoverHandle = _this$props2.onMouseoverHandle,
onMouseoutHandle = _this$props2.onMouseoutHandle;
this.root = this.rootContainer.current ? (0, _d3Selection.select)(this.rootContainer.current) : undefined;
this.brush = (0, _d3Brush.brushX)().handleSize(3).on('start', function (event) {
if (typeof _this3.props.onBrushStart === 'function') _this3.props.onBrushStart();
_this3._startSel = event.selection;
}).on('brush', function (event) {
if (_this3.moving) {
return;
}
if (event.selection) {
_this3._lastSel = event.selection;
_this3.brushing = true;
_this3._brushed(event);
}
}).on('end', function (event) {
if (!event.selection) {
if (_this3.brushing) {
// handle null selection
_this3._click(_this3._lastSel);
} else if (_this3._startSel) {
// handle click
_this3._click(_this3._startSel);
}
}
if (typeof _this3.props.onBrushEnd === 'function') _this3.props.onBrushEnd();
_this3.brushing = false;
_this3.moving = false;
});
(_this$root = this.root) === null || _this$root === void 0 || _this$root.call(this.brush);
var brushResizePath = getHandlePath(this.props);
this.handle = (_this$root2 = this.root) === null || _this$root2 === void 0 ? void 0 : _this$root2.selectAll('.handle--custom').data([{
type: 'w'
}, {
type: 'e'
}]).enter().append('path').attr('class', 'handle--custom').attr('display', isRanged ? null : 'none').attr('fill', theme ? theme.sliderHandleColor : '#D3D8E0').attr('cursor', 'ew-resize').attr('d', brushResizePath).on('mouseover', function () {
if (onMouseoverHandle) onMouseoverHandle();
}).on('mouseout', function () {
if (onMouseoutHandle) onMouseoutHandle();
});
var _this$props$value = (0, _slicedToArray2["default"])(this.props.value, 2),
val0 = _this$props$value[0],
val1 = _this$props$value[1];
this.moving = true;
this._move(val0, val1);
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
var _this$props3 = this.props,
_this$props3$value = (0, _slicedToArray2["default"])(_this$props3.value, 2),
val0 = _this$props3$value[0],
val1 = _this$props3$value[1],
width = _this$props3.width;
var _prevProps$value = (0, _slicedToArray2["default"])(prevProps.value, 2),
prevVal0 = _prevProps$value[0],
prevVal1 = _prevProps$value[1];
if (prevProps.width !== width || prevProps.range[0] !== this.props.range[0] || prevProps.range[1] !== this.props.range[1]) {
var _this$root3;
// dimension change should not trigger this._brushed
this.moving = true;
if (this.brush) (_this$root3 = this.root) === null || _this$root3 === void 0 || _this$root3.call(this.brush);
this._move(val0, val1);
}
if (!this.brushing && !this.moving) {
if (prevVal0 !== val0 || prevVal1 !== val1) {
this.moving = true;
this._move(val0, val1);
}
}
if (!this.props.isRanged && this.handle) {
this.handle.attr('display', 'none');
}
}
}, {
key: "_click",
value: function _click(selection) {
// fake brush
this.brushing = true;
this._brushed({
sourceEvent: {},
selection: selection
});
}
}, {
key: "_move",
value: function _move() {
var val0 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var val1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var _this$props4 = this.props,
_this$props4$range = (0, _slicedToArray2["default"])(_this$props4.range, 2),
min = _this$props4$range[0],
max = _this$props4$range[1],
width = _this$props4.width,
isRanged = _this$props4.isRanged;
if (width && max - min && this.brush && this.handle) {
var scale = function scale(x) {
return (x - min) * width / (max - min);
};
if (!isRanged) {
// only draw a 1 pixel line
if (this.root) this.brush.move(this.root, [scale(val0), scale(val0) + 1]);
} else {
if (this.root) this.brush.move(this.root, [scale(val0), scale(val1)]);
this.handle.attr('display', null).attr('transform', function (d, i) {
return "translate(".concat([i === 0 ? scale(val0) : scale(val1), 0], ")");
});
}
}
}
}, {
key: "_onBrush",
value: function _onBrush() {
var val0 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var val1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var _this$props5 = this.props,
isRanged = _this$props5.isRanged,
_this$props5$value = (0, _slicedToArray2["default"])(_this$props5.value, 2),
currentVal0 = _this$props5$value[0],
currentVal1 = _this$props5$value[1];
if (currentVal0 === val0 && currentVal1 === val1) {
return;
}
if (isRanged) {
this.props.onBrush(val0, val1);
} else {
this.props.onBrush(val0, val0);
}
}
}, {
key: "render",
value: function render() {
var isRanged = this.props.isRanged;
return /*#__PURE__*/_react["default"].createElement(StyledG, {
className: "kg-range-slider__brush",
isRanged: isRanged,
ref: this.rootContainer
});
}
}]);
}(_react.Component);
(0, _defineProperty2["default"])(RangeBrush, "defaultProps", {
isRanged: true
});
return (0, _styledComponents.withTheme)(RangeBrush);
}
var _default = exports["default"] = RangeBrushFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9kM1NlbGVjdGlvbiIsIl9kM0JydXNoIiwiX3V0aWxzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NhbGxTdXBlciIsIm8iLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJTdHlsZWRHIiwic3R5bGVkIiwiZyIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJpc1JhbmdlZCIsInRoZW1lIiwicmFuZ2VCcnVzaEJnZCIsIkJMVUUyIiwibW92ZVJpZ2h0Iiwic3RhcnRTZWwiLCJzZWxlY3Rpb24iLCJfc3RhcnRTZWwiLCJfc2xpY2VkVG9BcnJheTIiLCJzdGFydFNlbDAiLCJfc2VsZWN0aW9uIiwic2VsMCIsImdldEhhbmRsZVBhdGgiLCJicnVzaFJlc2l6ZVBhdGgiLCJkIiwiTnVtYmVyIiwidHlwZSIsIngiLCJoIiwidyIsInkiLCJoZWlnaHQiLCJjb25jYXQiLCJSYW5nZUJydXNoRmFjdG9yeSIsIlJhbmdlQnJ1c2giLCJfQ29tcG9uZW50IiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2xlbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJfZGVmaW5lUHJvcGVydHkyIiwiY3JlYXRlUmVmIiwicm9vdENvbnRhaW5lciIsImN1cnJlbnQiLCJzZWxlY3QiLCJ1bmRlZmluZWQiLCJldnQiLCJfdGhpczIiLCJzb3VyY2VFdmVudCIsIl9ldnQkc2VsZWN0aW9uIiwic2VsMSIsInJpZ2h0IiwiX3RoaXMkcHJvcHMiLCJfdGhpcyRwcm9wcyRyYW5nZSIsInJhbmdlIiwibWluIiwibWF4IiwiX3RoaXMkcHJvcHMkc3RlcCIsInN0ZXAiLCJ3aWR0aCIsIm1hcmtzIiwiaW52ZXJ0IiwiZDAiLCJkMSIsIm5vcm1hbGl6ZVNsaWRlclZhbHVlIiwiX21vdmUiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiX29uQnJ1c2giLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwiY29tcG9uZW50RGlkTW91bnQiLCJfdGhpczMiLCJfdGhpcyRyb290IiwiX3RoaXMkcm9vdDIiLCJfdGhpcyRwcm9wczIiLCJvbk1vdXNlb3ZlckhhbmRsZSIsIm9uTW91c2VvdXRIYW5kbGUiLCJyb290IiwiYnJ1c2giLCJicnVzaFgiLCJoYW5kbGVTaXplIiwib24iLCJldmVudCIsIm9uQnJ1c2hTdGFydCIsIm1vdmluZyIsIl9sYXN0U2VsIiwiYnJ1c2hpbmciLCJfYnJ1c2hlZCIsIl9jbGljayIsIm9uQnJ1c2hFbmQiLCJoYW5kbGUiLCJzZWxlY3RBbGwiLCJkYXRhIiwiZW50ZXIiLCJhcHBlbmQiLCJhdHRyIiwic2xpZGVySGFuZGxlQ29sb3IiLCJfdGhpcyRwcm9wcyR2YWx1ZSIsInZhbDAiLCJ2YWwxIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwiX3RoaXMkcHJvcHMzIiwiX3RoaXMkcHJvcHMzJHZhbHVlIiwiX3ByZXZQcm9wcyR2YWx1ZSIsInByZXZWYWwwIiwicHJldlZhbDEiLCJfdGhpcyRyb290MyIsIl90aGlzJHByb3BzNCIsIl90aGlzJHByb3BzNCRyYW5nZSIsInNjYWxlIiwibW92ZSIsIl90aGlzJHByb3BzNSIsIl90aGlzJHByb3BzNSR2YWx1ZSIsImN1cnJlbnRWYWwwIiwiY3VycmVudFZhbDEiLCJvbkJydXNoIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsInJlZiIsIkNvbXBvbmVudCIsIndpdGhUaGVtZSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tb24vcmFuZ2UtYnJ1c2gudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgY3JlYXRlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkLCB7d2l0aFRoZW1lfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge3NlbGVjdCwgU2VsZWN0aW9ufSBmcm9tICdkMy1zZWxlY3Rpb24nO1xuaW1wb3J0IHtCcnVzaEJlaGF2aW9yLCBicnVzaFh9IGZyb20gJ2QzLWJydXNoJztcbmltcG9ydCB7bm9ybWFsaXplU2xpZGVyVmFsdWV9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbnRlcmZhY2UgU3R5bGVkR1Byb3BzIHtcbiAgaXNSYW5nZWQ/OiBib29sZWFuO1xufVxuXG5jb25zdCBTdHlsZWRHID0gc3R5bGVkLmc8U3R5bGVkR1Byb3BzPmBcbiAgLnNlbGVjdGlvbiB7XG4gICAgc3Ryb2tlOiBub25lO1xuICAgIGZpbGw6ICR7cHJvcHMgPT4gKHByb3BzLmlzUmFuZ2VkID8gcHJvcHMudGhlbWUucmFuZ2VCcnVzaEJnZCA6IHByb3BzLnRoZW1lLkJMVUUyKX07XG4gICAgZmlsbC1vcGFjaXR5OiAke3Byb3BzID0+IChwcm9wcy5pc1JhbmdlZCA/IDAuMyA6IDEpfTtcbiAgfVxuICAuaGFuZGxlIHtcbiAgICBmaWxsOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLkJMVUUyfTtcbiAgICBmaWxsLW9wYWNpdHk6IDAuMztcbiAgfVxuYDtcblxuZnVuY3Rpb24gbW92ZVJpZ2h0KHN0YXJ0U2VsLCBzZWxlY3Rpb24pIHtcbiAgY29uc3QgW3N0YXJ0U2VsMF0gPSBzdGFydFNlbDtcbiAgY29uc3QgW3NlbDBdID0gc2VsZWN0aW9uO1xuXG4gIHJldHVybiBCb29sZWFuKHN0YXJ0U2VsMCA9PT0gc2VsMCk7XG59XG4vLyBzdHlsZSBicnVzaCByZXNpemUgaGFuZGxlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vY3Jvc3NmaWx0ZXIvY3Jvc3NmaWx0ZXIvYmxvYi9naC1wYWdlcy9pbmRleC5odG1sI0w0NjZcbmNvbnN0IGdldEhhbmRsZVBhdGggPSAocHJvcHM6IFJhbmdlQnJ1c2hQcm9wcykgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gYnJ1c2hSZXNpemVQYXRoKGQpIHtcbiAgICBjb25zdCBlID0gTnVtYmVyKGQudHlwZSA9PT0gJ2UnKTtcbiAgICBjb25zdCB4ID0gZSA/IDEgOiAtMTtcbiAgICBjb25zdCBoID0gMzk7XG4gICAgY29uc3QgdyA9IDQuNTtcbiAgICBjb25zdCB5ID0gKHByb3BzLmhlaWdodCAtIGgpIC8gMjtcbiAgICByZXR1cm4gYE0kezAuNSAqIHh9LCR7eX1jJHsyLjUgKiB4fSwwLCR7dyAqIHh9LDIsJHt3ICogeH0sJHt3fXYke2ggLSB3ICogMn1jMCwyLjUsJHtcbiAgICAgIC0yICogeFxuICAgIH0sJHt3fSwkey13ICogeH0sJHt3fVYke3l9emA7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBPbkJydXNoID0gKHZhbDA6IG51bWJlciwgdmFsMTogbnVtYmVyKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlQnJ1c2hQcm9wcyB7XG4gIGlzUmFuZ2VkPzogYm9vbGVhbjtcbiAgdGhlbWU/OiBhbnk7XG4gIHJhbmdlOiBudW1iZXJbXTtcbiAgdmFsdWU6IG51bWJlcltdO1xuICBvbkJydXNoU3RhcnQ6ICgpID0+IHZvaWQ7XG4gIG9uQnJ1c2hFbmQ6ICgpID0+IHZvaWQ7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBvbkJydXNoOiBPbkJydXNoO1xuICBzdGVwPzogbnVtYmVyO1xuICBtYXJrcz86IG51bWJlcltdO1xuICBvbk1vdXNlb3ZlckhhbmRsZTogKCkgPT4gdm9pZDtcbiAgb25Nb3VzZW91dEhhbmRsZTogKCkgPT4gdm9pZDtcbn1cblxuZnVuY3Rpb24gUmFuZ2VCcnVzaEZhY3RvcnkoKTogUmVhY3QuQ29tcG9uZW50VHlwZTxSYW5nZUJydXNoUHJvcHM+IHtcbiAgY2xhc3MgUmFuZ2VCcnVzaCBleHRlbmRzIENvbXBvbmVudDxSYW5nZUJydXNoUHJvcHM+IHtcbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgaXNSYW5nZWQ6IHRydWVcbiAgICB9O1xuXG4gICAgcm9vdENvbnRhaW5lciA9IGNyZWF0ZVJlZjxTVkdHRWxlbWVudD4oKTtcblxuICAgIGJydXNoaW5nID0gZmFsc2U7XG4gICAgbW92aW5nID0gZmFsc2U7XG5cbiAgICByb290ID0gdGhpcy5yb290Q29udGFpbmVyLmN1cnJlbnQgPyBzZWxlY3QodGhpcy5yb290Q29udGFpbmVyLmN1cnJlbnQpIDogdW5kZWZpbmVkO1xuICAgIGJydXNoOiBCcnVzaEJlaGF2aW9yPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgX3N0YXJ0U2VsOiBudW1iZXJbXSB8IHVuZGVmaW5lZDtcbiAgICBfbGFzdFNlbDogbnVtYmVyW10gfCB1bmRlZmluZWQ7XG5cbiAgICBoYW5kbGU6IFNlbGVjdGlvbjxTVkdQYXRoRWxlbWVudCwge3R5cGU6IHN0cmluZ30sIFNWR0dFbGVtZW50IHwgbnVsbCwgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIC8vIFdlIHdhbnQgdGhlIFJlYWN0IGFwcCB0byByZXNwb25kIHRvIGJydXNoIHN0YXRlIGFuZCB2aWNlLXZlcnNhXG4gICAgICAvLyBidXQgZDMtYnJ1c2ggZmlyZXMgdGhlIHNhbWUgZXZlbnRzIGZvciBib3RoIHVzZXItaW5pdGlhdGVkIGJydXNoaW5nXG4gICAgICAvLyBhbmQgcHJvZ3JhbW1hdGljIGJydXNoaW5nIChicnVzaC5tb3ZlKS4gV2UgbmVlZCB0aGVzZSBmbGFncyB0b1xuICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdXNlcy5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBkb24ndCB1c2Ugc3RhdGUgYmVjYXVzZSB0aGF0IHdvdWxkIHRyaWdnZXIgYW5vdGhlciBgY29tcG9uZW50RGlkVXBkYXRlYFxuICAgICAgY29uc3Qge3RoZW1lLCBpc1JhbmdlZCwgb25Nb3VzZW92ZXJIYW5kbGUsIG9uTW91c2VvdXRIYW5kbGV9ID0gdGhpcy5wcm9wcztcblxuICAgICAgdGhpcy5yb290ID0gdGhpcy5yb290Q29udGFpbmVyLmN1cnJlbnQgPyBzZWxlY3QodGhpcy5yb290Q29udGFpbmVyLmN1cnJlbnQpIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5icnVzaCA9IGJydXNoWCgpXG4gICAgICAgIC5oYW5kbGVTaXplKDMpXG4gICAgICAgIC5vbignc3RhcnQnLCBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLm9uQnJ1c2hTdGFydCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5wcm9wcy5vbkJydXNoU3RhcnQoKTtcbiAgICAgICAgICB0aGlzLl9zdGFydFNlbCA9IGV2ZW50LnNlbGVjdGlvbjtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdicnVzaCcsIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5tb3ZpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV2ZW50LnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlbCA9IGV2ZW50LnNlbGVjdGlvbjtcbiAgICAgICAgICAgIHRoaXMuYnJ1c2hpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fYnJ1c2hlZChldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2VuZCcsIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoIWV2ZW50LnNlbGVjdGlvbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuYnJ1c2hpbmcpIHtcbiAgICAgICAgICAgICAgLy8gaGFuZGxlIG51bGwgc2VsZWN0aW9uXG4gICAgICAgICAgICAgIHRoaXMuX2NsaWNrKHRoaXMuX2xhc3RTZWwpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zdGFydFNlbCkge1xuICAgICAgICAgICAgICAvLyBoYW5kbGUgY2xpY2tcbiAgICAgICAgICAgICAgdGhpcy5fY2xpY2sodGhpcy5fc3RhcnRTZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5vbkJydXNoRW5kID09PSAnZnVuY3Rpb24nKSB0aGlzLnByb3BzLm9uQnJ1c2hFbmQoKTtcblxuICAgICAgICAgIHRoaXMuYnJ1c2hpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm1vdmluZyA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5yb290Py5jYWxsKHRoaXMuYnJ1c2gpO1xuICAgICAgY29uc3QgYnJ1c2hSZXNpemVQYXRoID0gZ2V0SGFuZGxlUGF0aCh0aGlzLnByb3BzKTtcbiAgICAgIHRoaXMuaGFuZGxlID0gdGhpcy5yb290XG4gICAgICAgID8uc2VsZWN0QWxsKCcuaGFuZGxlLS1jdXN0b20nKVxuICAgICAgICAuZGF0YShbe3R5cGU6ICd3J30sIHt0eXBlOiAnZSd9XSlcbiAgICAgICAgLmVudGVyKClcbiAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdoYW5kbGUtLWN1c3RvbScpXG4gICAgICAgIC5hdHRyKCdkaXNwbGF5JywgaXNSYW5nZWQgPyBudWxsIDogJ25vbmUnKVxuICAgICAgICAuYXR0cignZmlsbCcsIHRoZW1lID8gdGhlbWUuc2xpZGVySGFuZGxlQ29sb3IgOiAnI0QzRDhFMCcpXG4gICAgICAgIC5hdHRyKCdjdXJzb3InLCAnZXctcmVzaXplJylcbiAgICAgICAgLmF0dHIoJ2QnLCBicnVzaFJlc2l6ZVBhdGgpXG4gICAgICAgIC5vbignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgICAgIGlmIChvbk1vdXNlb3ZlckhhbmRsZSkgb25Nb3VzZW92ZXJIYW5kbGUoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgICAgICBpZiAob25Nb3VzZW91dEhhbmRsZSkgb25Nb3VzZW91dEhhbmRsZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgY29uc3Qge1xuICAgICAgICB2YWx1ZTogW3ZhbDAsIHZhbDFdXG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIHRoaXMubW92aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuX21vdmUodmFsMCwgdmFsMSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgY29uc3Qge1xuICAgICAgICB2YWx1ZTogW3ZhbDAsIHZhbDFdLFxuICAgICAgICB3aWR0aFxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBbcHJldlZhbDAsIHByZXZWYWwxXSA9IHByZXZQcm9wcy52YWx1ZTtcblxuICAgICAgaWYgKHByZXZQcm9wcy53aWR0aCAhPT0gd2lkdGggfHwgcHJldlByb3BzLnJhbmdlWzBdICE9PSB0aGlzLnByb3BzLnJhbmdlWzBdIHx8IHByZXZQcm9wcy5yYW5nZVsxXSAhPT0gdGhpcy5wcm9wcy5yYW5nZVsxXSkge1xuICAgICAgICAvLyBkaW1lbnNpb24gY2hhbmdlIHNob3VsZCBub3QgdHJpZ2dlciB0aGlzLl9icnVzaGVkXG4gICAgICAgIHRoaXMubW92aW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuYnJ1c2gpIHRoaXMucm9vdD8uY2FsbCh0aGlzLmJydXNoKTtcbiAgICAgICAgdGhpcy5fbW92ZSh2YWwwLCB2YWwxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmJydXNoaW5nICYmICF0aGlzLm1vdmluZykge1xuICAgICAgICBpZiAocHJldlZhbDAgIT09IHZhbDAgfHwgcHJldlZhbDEgIT09IHZhbDEpIHtcbiAgICAgICAgICB0aGlzLm1vdmluZyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fbW92ZSh2YWwwLCB2YWwxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMucHJvcHMuaXNSYW5nZWQgJiYgdGhpcy5oYW5kbGUpIHtcbiAgICAgICAgdGhpcy5oYW5kbGUuYXR0cignZGlzcGxheScsICdub25lJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2NsaWNrKHNlbGVjdGlvbikge1xuICAgICAgLy8gZmFrZSBicnVzaFxuICAgICAgdGhpcy5icnVzaGluZyA9IHRydWU7XG4gICAgICB0aGlzLl9icnVzaGVkKHtzb3VyY2VFdmVudDoge30sIHNlbGVjdGlvbn0pO1xuICAgIH1cblxuICAgIF9tb3ZlKHZhbDAgPSAwLCB2YWwxID0gMCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICByYW5nZTogW21pbiwgbWF4XSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGlzUmFuZ2VkXG4gICAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgaWYgKHdpZHRoICYmIG1heCAtIG1pbiAmJiB0aGlzLmJydXNoICYmIHRoaXMuaGFuZGxlKSB7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gKHg6IG51bWJlcikgPT4gKCh4IC0gbWluKSAqIHdpZHRoKSAvIChtYXggLSBtaW4pO1xuICAgICAgICBpZiAoIWlzUmFuZ2VkKSB7XG4gICAgICAgICAgLy8gb25seSBkcmF3IGEgMSBwaXhlbCBsaW5lXG4gICAgICAgICAgaWYgKHRoaXMucm9vdCkgdGhpcy5icnVzaC5tb3ZlKHRoaXMucm9vdCwgW3NjYWxlKHZhbDApLCBzY2FsZSh2YWwwKSArIDFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5yb290KSB0aGlzLmJydXNoLm1vdmUodGhpcy5yb290LCBbc2NhbGUodmFsMCksIHNjYWxlKHZhbDEpXSk7XG5cbiAgICAgICAgICB0aGlzLmhhbmRsZVxuICAgICAgICAgICAgLmF0dHIoJ2Rpc3BsYXknLCBudWxsKVxuICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkLCBpKSA9PiBgdHJhbnNsYXRlKCR7W2kgPT09IDAgPyBzY2FsZSh2YWwwKSA6IHNjYWxlKHZhbDEpLCAwXX0pYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfYnJ1c2hlZCA9IChldnQ6IHtzb3VyY2VFdmVudDogYW55OyBzZWxlY3Rpb246IG51bWJlcltdfSkgPT4ge1xuICAgICAgLy8gSWdub3JlIGJydXNoIGV2ZW50cyB3aGljaCBkb24ndCBoYXZlIGFuIHVuZGVybHlpbmcgc291cmNlRXZlbnRcbiAgICAgIGlmICghZXZ0LnNvdXJjZUV2ZW50KSByZXR1cm47XG4gICAgICBjb25zdCBbc2VsMCwgc2VsMV0gPSBldnQuc2VsZWN0aW9uO1xuICAgICAgY29uc3QgcmlnaHQgPSBtb3ZlUmlnaHQodGhpcy5fc3RhcnRTZWwsIGV2dC5zZWxlY3Rpb24pO1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHJhbmdlOiBbbWluLCBtYXhdLFxuICAgICAgICBzdGVwID0gMCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIG1hcmtzLFxuICAgICAgICBpc1JhbmdlZFxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBpbnZlcnQgPSAoeDogbnVtYmVyKSA9PiAoeCAqIChtYXggLSBtaW4pKSAvIHdpZHRoICsgbWluO1xuICAgICAgbGV0IGQwID0gaW52ZXJ0KHNlbDApO1xuICAgICAgbGV0IGQxID0gaW52ZXJ0KHNlbDEpO1xuICAgICAgLy8gdGhpcyBtYWtlcyBzdXJlIGlmIHBvaW50cyBhcmUgcmlnaHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9tYWlucyBhcmUgZGlzcGxheWVkIGNvcnJlY3RseVxuICAgICAgLy8gdGhlIHByb2JsZW0gaGVyZSBpcyBiaXNlY3RMZWZ0eFxuICAgICAgZDAgPSBkMCA9PT0gbWluID8gZDAgOiBub3JtYWxpemVTbGlkZXJWYWx1ZShkMCwgbWluLCBzdGVwLCBtYXJrcyk7XG4gICAgICBkMSA9IG5vcm1hbGl6ZVNsaWRlclZhbHVlKGQxLCBtaW4sIHN0ZXAsIG1hcmtzKTtcblxuICAgICAgaWYgKGlzUmFuZ2VkKSB0aGlzLl9tb3ZlKGQwLCBkMSk7XG4gICAgICBlbHNlIHRoaXMuX21vdmUoLi4uKHJpZ2h0ID8gW2QxLCBkMV0gOiBbZDAsIGQwXSkpO1xuXG4gICAgICBpZiAoaXNSYW5nZWQpIHRoaXMuX29uQnJ1c2goZDAsIGQxKTtcbiAgICAgIGVsc2UgdGhpcy5fb25CcnVzaChyaWdodCA/IGQxIDogZDApO1xuICAgIH07XG5cbiAgICBfb25CcnVzaCh2YWwwID0gMCwgdmFsMSA9IDApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaXNSYW5nZWQsXG4gICAgICAgIHZhbHVlOiBbY3VycmVudFZhbDAsIGN1cnJlbnRWYWwxXVxuICAgICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGlmIChjdXJyZW50VmFsMCA9PT0gdmFsMCAmJiBjdXJyZW50VmFsMSA9PT0gdmFsMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1JhbmdlZCkge1xuICAgICAgICB0aGlzLnByb3BzLm9uQnJ1c2godmFsMCwgdmFsMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb3BzLm9uQnJ1c2godmFsMCwgdmFsMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2lzUmFuZ2VkfSA9IHRoaXMucHJvcHM7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3R5bGVkRyBjbGFzc05hbWU9XCJrZy1yYW5nZS1zbGlkZXJfX2JydXNoXCIgaXNSYW5nZWQ9e2lzUmFuZ2VkfSByZWY9e3RoaXMucm9vdENvbnRhaW5lcn0gLz5cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiB3aXRoVGhlbWUoUmFuZ2VCcnVzaCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJhbmdlQnJ1c2hGYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFGLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFKLE9BQUE7QUFBc0QsSUFBQUssZUFBQSxFQVB0RDtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFSLHdCQUFBUSxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxDQUFB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