kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
266 lines (265 loc) • 42.1 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9kM1NlbGVjdGlvbiIsIl9kM0JydXNoIiwiX3V0aWxzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NhbGxTdXBlciIsIm8iLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJTdHlsZWRHIiwic3R5bGVkIiwiZyIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCIkaXNSYW5nZWQiLCJ0aGVtZSIsInJhbmdlQnJ1c2hCZ2QiLCJCTFVFMiIsIm1vdmVSaWdodCIsInN0YXJ0U2VsIiwic2VsZWN0aW9uIiwiX3N0YXJ0U2VsIiwiX3NsaWNlZFRvQXJyYXkyIiwic3RhcnRTZWwwIiwiX3NlbGVjdGlvbiIsInNlbDAiLCJnZXRIYW5kbGVQYXRoIiwiYnJ1c2hSZXNpemVQYXRoIiwiZCIsIk51bWJlciIsInR5cGUiLCJ4IiwiaCIsInciLCJ5IiwiaGVpZ2h0IiwiY29uY2F0IiwiUmFuZ2VCcnVzaEZhY3RvcnkiLCJSYW5nZUJydXNoIiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiX2RlZmluZVByb3BlcnR5MiIsImNyZWF0ZVJlZiIsInJvb3RDb250YWluZXIiLCJjdXJyZW50Iiwic2VsZWN0IiwidW5kZWZpbmVkIiwiZXZ0IiwiX3RoaXMyIiwic291cmNlRXZlbnQiLCJfZXZ0JHNlbGVjdGlvbiIsInNlbDEiLCJyaWdodCIsIl90aGlzJHByb3BzIiwiX3RoaXMkcHJvcHMkcmFuZ2UiLCJyYW5nZSIsIm1pbiIsIm1heCIsIl90aGlzJHByb3BzJHN0ZXAiLCJzdGVwIiwid2lkdGgiLCJtYXJrcyIsImlzUmFuZ2VkIiwiaW52ZXJ0IiwiZDAiLCJkMSIsIm5vcm1hbGl6ZVNsaWRlclZhbHVlIiwiX21vdmUiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiX29uQnJ1c2giLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwiY29tcG9uZW50RGlkTW91bnQiLCJfdGhpczMiLCJfdGhpcyRyb290IiwiX3RoaXMkcm9vdDIiLCJfdGhpcyRwcm9wczIiLCJvbk1vdXNlb3ZlckhhbmRsZSIsIm9uTW91c2VvdXRIYW5kbGUiLCJyb290IiwiYnJ1c2giLCJicnVzaFgiLCJoYW5kbGVTaXplIiwib24iLCJldmVudCIsIm9uQnJ1c2hTdGFydCIsIm1vdmluZyIsIl9sYXN0U2VsIiwiYnJ1c2hpbmciLCJfYnJ1c2hlZCIsIl9jbGljayIsIm9uQnJ1c2hFbmQiLCJoYW5kbGUiLCJzZWxlY3RBbGwiLCJkYXRhIiwiZW50ZXIiLCJhcHBlbmQiLCJhdHRyIiwic2xpZGVySGFuZGxlQ29sb3IiLCJfdGhpcyRwcm9wcyR2YWx1ZSIsInZhbDAiLCJ2YWwxIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwiX3RoaXMkcHJvcHMzIiwiX3RoaXMkcHJvcHMzJHZhbHVlIiwiX3ByZXZQcm9wcyR2YWx1ZSIsInByZXZWYWwwIiwicHJldlZhbDEiLCJfdGhpcyRyb290MyIsIl90aGlzJHByb3BzNCIsIl90aGlzJHByb3BzNCRyYW5nZSIsInNjYWxlIiwibW92ZSIsIl90aGlzJHByb3BzNSIsIl90aGlzJHByb3BzNSR2YWx1ZSIsImN1cnJlbnRWYWwwIiwiY3VycmVudFZhbDEiLCJvbkJydXNoIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsInJlZiIsIkNvbXBvbmVudCIsIndpdGhUaGVtZSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tb24vcmFuZ2UtYnJ1c2gudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgY3JlYXRlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkLCB7d2l0aFRoZW1lfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge3NlbGVjdCwgU2VsZWN0aW9ufSBmcm9tICdkMy1zZWxlY3Rpb24nO1xuaW1wb3J0IHtCcnVzaEJlaGF2aW9yLCBicnVzaFh9IGZyb20gJ2QzLWJydXNoJztcbmltcG9ydCB7bm9ybWFsaXplU2xpZGVyVmFsdWV9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbnRlcmZhY2UgU3R5bGVkR1Byb3BzIHtcbiAgJGlzUmFuZ2VkPzogYm9vbGVhbjtcbn1cblxuY29uc3QgU3R5bGVkRyA9IHN0eWxlZC5nPFN0eWxlZEdQcm9wcz5gXG4gIC5zZWxlY3Rpb24ge1xuICAgIHN0cm9rZTogbm9uZTtcbiAgICBmaWxsOiAke3Byb3BzID0+IChwcm9wcy4kaXNSYW5nZWQgPyBwcm9wcy50aGVtZS5yYW5nZUJydXNoQmdkIDogcHJvcHMudGhlbWUuQkxVRTIpfTtcbiAgICBmaWxsLW9wYWNpdHk6ICR7cHJvcHMgPT4gKHByb3BzLiRpc1JhbmdlZCA/IDAuMyA6IDEpfTtcbiAgfVxuICAuaGFuZGxlIHtcbiAgICBmaWxsOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLkJMVUUyfTtcbiAgICBmaWxsLW9wYWNpdHk6IDAuMztcbiAgfVxuYDtcblxuZnVuY3Rpb24gbW92ZVJpZ2h0KHN0YXJ0U2VsLCBzZWxlY3Rpb24pIHtcbiAgY29uc3QgW3N0YXJ0U2VsMF0gPSBzdGFydFNlbDtcbiAgY29uc3QgW3NlbDBdID0gc2VsZWN0aW9uO1xuXG4gIHJldHVybiBCb29sZWFuKHN0YXJ0U2VsMCA9PT0gc2VsMCk7XG59XG4vLyBzdHlsZSBicnVzaCByZXNpemUgaGFuZGxlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vY3Jvc3NmaWx0ZXIvY3Jvc3NmaWx0ZXIvYmxvYi9naC1wYWdlcy9pbmRleC5odG1sI0w0NjZcbmNvbnN0IGdldEhhbmRsZVBhdGggPSAocHJvcHM6IFJhbmdlQnJ1c2hQcm9wcykgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gYnJ1c2hSZXNpemVQYXRoKGQpIHtcbiAgICBjb25zdCBlID0gTnVtYmVyKGQudHlwZSA9PT0gJ2UnKTtcbiAgICBjb25zdCB4ID0gZSA/IDEgOiAtMTtcbiAgICBjb25zdCBoID0gMzk7XG4gICAgY29uc3QgdyA9IDQuNTtcbiAgICBjb25zdCB5ID0gKHByb3BzLmhlaWdodCAtIGgpIC8gMjtcbiAgICByZXR1cm4gYE0kezAuNSAqIHh9LCR7eX1jJHsyLjUgKiB4fSwwLCR7dyAqIHh9LDIsJHt3ICogeH0sJHt3fXYke2ggLSB3ICogMn1jMCwyLjUsJHtcbiAgICAgIC0yICogeFxuICAgIH0sJHt3fSwkey13ICogeH0sJHt3fVYke3l9emA7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBPbkJydXNoID0gKHZhbDA6IG51bWJlciwgdmFsMTogbnVtYmVyKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlQnJ1c2hQcm9wcyB7XG4gIGlzUmFuZ2VkPzogYm9vbGVhbjtcbiAgdGhlbWU/OiBhbnk7XG4gIHJhbmdlOiBudW1iZXJbXTtcbiAgdmFsdWU6IG51bWJlcltdO1xuICBvbkJydXNoU3RhcnQ6ICgpID0+IHZvaWQ7XG4gIG9uQnJ1c2hFbmQ6ICgpID0+IHZvaWQ7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBvbkJydXNoOiBPbkJydXNoO1xuICBzdGVwPzogbnVtYmVyO1xuICBtYXJrcz86IG51bWJlcltdO1xuICBvbk1vdXNlb3ZlckhhbmRsZTogKCkgPT4gdm9pZDtcbiAgb25Nb3VzZW91dEhhbmRsZTogKCkgPT4gdm9pZDtcbn1cblxuZnVuY3Rpb24gUmFuZ2VCcnVzaEZhY3RvcnkoKTogUmVhY3QuQ29tcG9uZW50VHlwZTxSYW5nZUJydXNoUHJvcHM+IHtcbiAgY2xhc3MgUmFuZ2VCcnVzaCBleHRlbmRzIENvbXBvbmVudDxSYW5nZUJydXNoUHJvcHM+IHtcbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgaXNSYW5nZWQ6IHRydWVcbiAgICB9O1xuXG4gICAgcm9vdENvbnRhaW5lciA9IGNyZWF0ZVJlZjxTVkdHRWxlbWVudD4oKTtcblxuICAgIGJydXNoaW5nID0gZmFsc2U7XG4gICAgbW92aW5nID0gZmFsc2U7XG5cbiAgICByb290ID0gdGhpcy5yb290Q29udGFpbmVyLmN1cnJlbnQgPyBzZWxlY3QodGhpcy5yb290Q29udGFpbmVyLmN1cnJlbnQpIDogdW5kZWZpbmVkO1xuICAgIGJydXNoOiBCcnVzaEJlaGF2aW9yPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgX3N0YXJ0U2VsOiBudW1iZXJbXSB8IHVuZGVmaW5lZDtcbiAgICBfbGFzdFNlbDogbnVtYmVyW10gfCB1bmRlZmluZWQ7XG5cbiAgICBoYW5kbGU6IFNlbGVjdGlvbjxTVkdQYXRoRWxlbWVudCwge3R5cGU6IHN0cmluZ30sIFNWR0dFbGVtZW50IHwgbnVsbCwgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIC8vIFdlIHdhbnQgdGhlIFJlYWN0IGFwcCB0byByZXNwb25kIHRvIGJydXNoIHN0YXRlIGFuZCB2aWNlLXZlcnNhXG4gICAgICAvLyBidXQgZDMtYnJ1c2ggZmlyZXMgdGhlIHNhbWUgZXZlbnRzIGZvciBib3RoIHVzZXItaW5pdGlhdGVkIGJydXNoaW5nXG4gICAgICAvLyBhbmQgcHJvZ3JhbW1hdGljIGJydXNoaW5nIChicnVzaC5tb3ZlKS4gV2UgbmVlZCB0aGVzZSBmbGFncyB0b1xuICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdXNlcy5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBkb24ndCB1c2Ugc3RhdGUgYmVjYXVzZSB0aGF0IHdvdWxkIHRyaWdnZXIgYW5vdGhlciBgY29tcG9uZW50RGlkVXBkYXRlYFxuICAgICAgY29uc3Qge3RoZW1lLCBpc1JhbmdlZCwgb25Nb3VzZW92ZXJIYW5kbGUsIG9uTW91c2VvdXRIYW5kbGV9ID0gdGhpcy5wcm9wcztcblxuICAgICAgdGhpcy5yb290ID0gdGhpcy5yb290Q29udGFpbmVyLmN1cnJlbnQgPyBzZWxlY3QodGhpcy5yb290Q29udGFpbmVyLmN1cnJlbnQpIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5icnVzaCA9IGJydXNoWCgpXG4gICAgICAgIC5oYW5kbGVTaXplKDMpXG4gICAgICAgIC5vbignc3RhcnQnLCBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLm9uQnJ1c2hTdGFydCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5wcm9wcy5vbkJydXNoU3RhcnQoKTtcbiAgICAgICAgICB0aGlzLl9zdGFydFNlbCA9IGV2ZW50LnNlbGVjdGlvbjtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdicnVzaCcsIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5tb3ZpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV2ZW50LnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlbCA9IGV2ZW50LnNlbGVjdGlvbjtcbiAgICAgICAgICAgIHRoaXMuYnJ1c2hpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fYnJ1c2hlZChldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2VuZCcsIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoIWV2ZW50LnNlbGVjdGlvbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuYnJ1c2hpbmcpIHtcbiAgICAgICAgICAgICAgLy8gaGFuZGxlIG51bGwgc2VsZWN0aW9uXG4gICAgICAgICAgICAgIHRoaXMuX2NsaWNrKHRoaXMuX2xhc3RTZWwpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zdGFydFNlbCkge1xuICAgICAgICAgICAgICAvLyBoYW5kbGUgY2xpY2tcbiAgICAgICAgICAgICAgdGhpcy5fY2xpY2sodGhpcy5fc3RhcnRTZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5vbkJydXNoRW5kID09PSAnZnVuY3Rpb24nKSB0aGlzLnByb3BzLm9uQnJ1c2hFbmQoKTtcblxuICAgICAgICAgIHRoaXMuYnJ1c2hpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm1vdmluZyA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5yb290Py5jYWxsKHRoaXMuYnJ1c2gpO1xuICAgICAgY29uc3QgYnJ1c2hSZXNpemVQYXRoID0gZ2V0SGFuZGxlUGF0aCh0aGlzLnByb3BzKTtcbiAgICAgIHRoaXMuaGFuZGxlID0gdGhpcy5yb290XG4gICAgICAgID8uc2VsZWN0QWxsKCcuaGFuZGxlLS1jdXN0b20nKVxuICAgICAgICAuZGF0YShbe3R5cGU6ICd3J30sIHt0eXBlOiAnZSd9XSlcbiAgICAgICAgLmVudGVyKClcbiAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdoYW5kbGUtLWN1c3RvbScpXG4gICAgICAgIC5hdHRyKCdkaXNwbGF5JywgaXNSYW5nZWQgPyBudWxsIDogJ25vbmUnKVxuICAgICAgICAuYXR0cignZmlsbCcsIHRoZW1lID8gdGhlbWUuc2xpZGVySGFuZGxlQ29sb3IgOiAnI0QzRDhFMCcpXG4gICAgICAgIC5hdHRyKCdjdXJzb3InLCAnZXctcmVzaXplJylcbiAgICAgICAgLmF0dHIoJ2QnLCBicnVzaFJlc2l6ZVBhdGgpXG4gICAgICAgIC5vbignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgICAgIGlmIChvbk1vdXNlb3ZlckhhbmRsZSkgb25Nb3VzZW92ZXJIYW5kbGUoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgICAgICBpZiAob25Nb3VzZW91dEhhbmRsZSkgb25Nb3VzZW91dEhhbmRsZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgY29uc3Qge1xuICAgICAgICB2YWx1ZTogW3ZhbDAsIHZhbDFdXG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIHRoaXMubW92aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuX21vdmUodmFsMCwgdmFsMSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgY29uc3Qge1xuICAgICAgICB2YWx1ZTogW3ZhbDAsIHZhbDFdLFxuICAgICAgICB3aWR0aFxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBbcHJldlZhbDAsIHByZXZWYWwxXSA9IHByZXZQcm9wcy52YWx1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICBwcmV2UHJvcHMud2lkdGggIT09IHdpZHRoIHx8XG4gICAgICAgIHByZXZQcm9wcy5yYW5nZVswXSAhPT0gdGhpcy5wcm9wcy5yYW5nZVswXSB8fFxuICAgICAgICBwcmV2UHJvcHMucmFuZ2VbMV0gIT09IHRoaXMucHJvcHMucmFuZ2VbMV1cbiAgICAgICkge1xuICAgICAgICAvLyBkaW1lbnNpb24gY2hhbmdlIHNob3VsZCBub3QgdHJpZ2dlciB0aGlzLl9icnVzaGVkXG4gICAgICAgIHRoaXMubW92aW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuYnJ1c2gpIHRoaXMucm9vdD8uY2FsbCh0aGlzLmJydXNoKTtcbiAgICAgICAgdGhpcy5fbW92ZSh2YWwwLCB2YWwxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmJydXNoaW5nICYmICF0aGlzLm1vdmluZykge1xuICAgICAgICBpZiAocHJldlZhbDAgIT09IHZhbDAgfHwgcHJldlZhbDEgIT09IHZhbDEpIHtcbiAgICAgICAgICB0aGlzLm1vdmluZyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fbW92ZSh2YWwwLCB2YWwxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMucHJvcHMuaXNSYW5nZWQgJiYgdGhpcy5oYW5kbGUpIHtcbiAgICAgICAgdGhpcy5oYW5kbGUuYXR0cignZGlzcGxheScsICdub25lJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2NsaWNrKHNlbGVjdGlvbikge1xuICAgICAgLy8gZmFrZSBicnVzaFxuICAgICAgdGhpcy5icnVzaGluZyA9IHRydWU7XG4gICAgICB0aGlzLl9icnVzaGVkKHtzb3VyY2VFdmVudDoge30sIHNlbGVjdGlvbn0pO1xuICAgIH1cblxuICAgIF9tb3ZlKHZhbDAgPSAwLCB2YWwxID0gMCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICByYW5nZTogW21pbiwgbWF4XSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGlzUmFuZ2VkXG4gICAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgaWYgKHdpZHRoICYmIG1heCAtIG1pbiAmJiB0aGlzLmJydXNoICYmIHRoaXMuaGFuZGxlKSB7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gKHg6IG51bWJlcikgPT4gKCh4IC0gbWluKSAqIHdpZHRoKSAvIChtYXggLSBtaW4pO1xuICAgICAgICBpZiAoIWlzUmFuZ2VkKSB7XG4gICAgICAgICAgLy8gb25seSBkcmF3IGEgMSBwaXhlbCBsaW5lXG4gICAgICAgICAgaWYgKHRoaXMucm9vdCkgdGhpcy5icnVzaC5tb3ZlKHRoaXMucm9vdCwgW3NjYWxlKHZhbDApLCBzY2FsZSh2YWwwKSArIDFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5yb290KSB0aGlzLmJydXNoLm1vdmUodGhpcy5yb290LCBbc2NhbGUodmFsMCksIHNjYWxlKHZhbDEpXSk7XG5cbiAgICAgICAgICB0aGlzLmhhbmRsZVxuICAgICAgICAgICAgLmF0dHIoJ2Rpc3BsYXknLCBudWxsKVxuICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkLCBpKSA9PiBgdHJhbnNsYXRlKCR7W2kgPT09IDAgPyBzY2FsZSh2YWwwKSA6IHNjYWxlKHZhbDEpLCAwXX0pYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfYnJ1c2hlZCA9IChldnQ6IHtzb3VyY2VFdmVudDogYW55OyBzZWxlY3Rpb246IG51bWJlcltdfSkgPT4ge1xuICAgICAgLy8gSWdub3JlIGJydXNoIGV2ZW50cyB3aGljaCBkb24ndCBoYXZlIGFuIHVuZGVybHlpbmcgc291cmNlRXZlbnRcbiAgICAgIGlmICghZXZ0LnNvdXJjZUV2ZW50KSByZXR1cm47XG4gICAgICBjb25zdCBbc2VsMCwgc2VsMV0gPSBldnQuc2VsZWN0aW9uO1xuICAgICAgY29uc3QgcmlnaHQgPSBtb3ZlUmlnaHQodGhpcy5fc3RhcnRTZWwsIGV2dC5zZWxlY3Rpb24pO1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHJhbmdlOiBbbWluLCBtYXhdLFxuICAgICAgICBzdGVwID0gMCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIG1hcmtzLFxuICAgICAgICBpc1JhbmdlZFxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBpbnZlcnQgPSAoeDogbnVtYmVyKSA9PiAoeCAqIChtYXggLSBtaW4pKSAvIHdpZHRoICsgbWluO1xuICAgICAgbGV0IGQwID0gaW52ZXJ0KHNlbDApO1xuICAgICAgbGV0IGQxID0gaW52ZXJ0KHNlbDEpO1xuICAgICAgLy8gdGhpcyBtYWtlcyBzdXJlIGlmIHBvaW50cyBhcmUgcmlnaHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9tYWlucyBhcmUgZGlzcGxheWVkIGNvcnJlY3RseVxuICAgICAgLy8gdGhlIHByb2JsZW0gaGVyZSBpcyBiaXNlY3RMZWZ0eFxuICAgICAgZDAgPSBkMCA9PT0gbWluID8gZDAgOiBub3JtYWxpemVTbGlkZXJWYWx1ZShkMCwgbWluLCBzdGVwLCBtYXJrcyk7XG4gICAgICBkMSA9IG5vcm1hbGl6ZVNsaWRlclZhbHVlKGQxLCBtaW4sIHN0ZXAsIG1hcmtzKTtcblxuICAgICAgaWYgKGlzUmFuZ2VkKSB0aGlzLl9tb3ZlKGQwLCBkMSk7XG4gICAgICBlbHNlIHRoaXMuX21vdmUoLi4uKHJpZ2h0ID8gW2QxLCBkMV0gOiBbZDAsIGQwXSkpO1xuXG4gICAgICBpZiAoaXNSYW5nZWQpIHRoaXMuX29uQnJ1c2goZDAsIGQxKTtcbiAgICAgIGVsc2UgdGhpcy5fb25CcnVzaChyaWdodCA/IGQxIDogZDApO1xuICAgIH07XG5cbiAgICBfb25CcnVzaCh2YWwwID0gMCwgdmFsMSA9IDApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaXNSYW5nZWQsXG4gICAgICAgIHZhbHVlOiBbY3VycmVudFZhbDAsIGN1cnJlbnRWYWwxXVxuICAgICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGlmIChjdXJyZW50VmFsMCA9PT0gdmFsMCAmJiBjdXJyZW50VmFsMSA9PT0gdmFsMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1JhbmdlZCkge1xuICAgICAgICB0aGlzLnByb3BzLm9uQnJ1c2godmFsMCwgdmFsMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb3BzLm9uQnJ1c2godmFsMCwgdmFsMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2lzUmFuZ2VkfSA9IHRoaXMucHJvcHM7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3R5bGVkRyBjbGFzc05hbWU9XCJrZy1yYW5nZS1zbGlkZXJfX2JydXNoXCIgJGlzUmFuZ2VkPXtpc1JhbmdlZH0gcmVmPXt0aGlzLnJvb3RDb250YWluZXJ9IC8+XG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2l0aFRoZW1lKFJhbmdlQnJ1c2gpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBSYW5nZUJydXNoRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBRix1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsWUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBQXNELElBQUFLLGVBQUEsRUFQdEQ7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBUix3QkFBQVEsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFVBQUEsU0FBQUosQ0FBQSxlQUFBQSxDQUFBLGdCQUFBSyxPQUFBLENBQUFMLENBQUEsMEJBQUFBLENBQUEsc0JBQUFBLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFQLENBQUEsT0FBQVEsQ0FBQSxLQUFBQyxTQUFBLFVBQUFDLENBQUEsR0FB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