kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
209 lines (208 loc) • 34.7 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 _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 _classnames = _interopRequireDefault(require("classnames"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _sliderHandle = _interopRequireDefault(require("./slider-handle"));
var _sliderBarHandle = _interopRequireDefault(require("./slider-bar-handle"));
var _utils = require("@kepler.gl/utils");
var _templateObject, _templateObject2; // 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 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; })(); }
function noop() {
return;
}
var StyledRangeSlider = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n background-color: ", ";\n ", ";\n ", ";\n"])), function (props) {
return props.theme.sliderBarBgd;
}, function (props) {
return "".concat(props.$vertical ? 'width' : 'height', ": ").concat(props.theme.sliderBarHeight, "px");
}, function (props) {
return "".concat(props.$vertical ? 'height' : 'width', ": 100%");
});
var SliderWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n flex-grow: 1;\n"])));
var Slider = exports["default"] = /*#__PURE__*/function (_Component) {
function Slider(props) {
var _this;
(0, _classCallCheck2["default"])(this, Slider);
_this = _callSuper(this, Slider, [props]);
(0, _defineProperty2["default"])(_this, "anchor", 0);
(0, _defineProperty2["default"])(_this, "ref", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2["default"])(_this, "track", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2["default"])(_this, "setAnchor", function (x) {
// used to calculate delta
_this.anchor = x;
});
(0, _defineProperty2["default"])(_this, "slide0Listener", function (x) {
var _this$props = _this.props,
value1 = _this$props.value1,
minValue = _this$props.minValue;
var val = _this.getValue(minValue, x);
_this.props.onSlider0Change((0, _utils.clamp)([minValue, value1], val));
});
(0, _defineProperty2["default"])(_this, "slide1Listener", function (x) {
var _this$props2 = _this.props,
minValue = _this$props2.minValue,
maxValue = _this$props2.maxValue,
value0 = _this$props2.value0;
var val = _this.getValue(minValue, x);
_this.props.onSlider1Change((0, _utils.clamp)([value0, maxValue], val));
});
(0, _defineProperty2["default"])(_this, "sliderBarListener", function (x) {
var _this$props3 = _this.props,
value0 = _this$props3.value0,
value1 = _this$props3.value1,
minValue = _this$props3.minValue,
maxValue = _this$props3.maxValue;
// for slider bar, we use distance delta
var anchor = _this.anchor;
var length = value1 - value0; // the length of the selected range shouldn't change when clamping
var val0 = (0, _utils.clamp)([minValue, maxValue - length], _this.getValue(value0, x - anchor));
var val1 = (0, _utils.clamp)([val0 + length, maxValue], _this.getValue(value1, x - anchor));
var deltaX = _this.getDeltaX(val0 - _this.props.value0);
_this.props.onSliderBarChange(val0, val1);
// update anchor
_this.anchor = _this.anchor + deltaX;
});
(0, _defineProperty2["default"])(_this, "calcHandleLeft0", function (w, l) {
return w === 0 ? "calc(".concat(l, "% - ").concat(_this.props.sliderHandleWidth / 2, "px)") : "calc(".concat(l, "% - ").concat(_this.props.sliderHandleWidth / 2, "px)");
});
(0, _defineProperty2["default"])(_this, "calcHandleLeft1", function (w, l) {
return _this.props.isRanged && w === 0 ? "".concat(l, "%") : "calc(".concat(l + w, "% - ").concat(_this.props.sliderHandleWidth / 2, "px)");
});
_this.props = props;
return _this;
}
(0, _inherits2["default"])(Slider, _Component);
return (0, _createClass2["default"])(Slider, [{
key: "getBaseDistance",
value: function getBaseDistance() {
if (!this.ref.current) {
return 0;
}
return this.props.vertical ? this.ref.current.offsetHeight : this.ref.current.offsetWidth;
}
}, {
key: "getDeltaVal",
value: function getDeltaVal(x) {
var percent = x / this.getBaseDistance();
var maxDelta = this.props.maxValue - this.props.minValue;
return percent * maxDelta;
}
}, {
key: "getDeltaX",
value: function getDeltaX(v) {
var percent = v / (this.props.maxValue - this.props.minValue);
var maxDelta = this.getBaseDistance();
return percent * maxDelta;
}
}, {
key: "getValue",
value: function getValue(baseV, offset) {
// offset is the distance between slider handle and track left
var rawValue = baseV + this.getDeltaVal(offset);
return this.normalizeValue(rawValue);
}
}, {
key: "normalizeValue",
value: function normalizeValue(val) {
var _this$props4 = this.props,
minValue = _this$props4.minValue,
step = _this$props4.step,
marks = _this$props4.marks;
return (0, _utils.normalizeSliderValue)(val, minValue, step, marks);
}
}, {
key: "render",
value: function render() {
var _this$props5 = this.props,
className = _this$props5.className,
classSet = _this$props5.classSet,
disabled = _this$props5.disabled,
isRanged = _this$props5.isRanged,
maxValue = _this$props5.maxValue,
minValue = _this$props5.minValue,
value1 = _this$props5.value1,
vertical = _this$props5.vertical,
sliderHandleWidth = _this$props5.sliderHandleWidth,
showTooltip = _this$props5.showTooltip,
style = _this$props5.style;
var value0 = !isRanged && minValue > 0 ? minValue : this.props.value0;
var currValDelta = value1 - value0;
var maxDelta = maxValue - minValue;
var width = currValDelta / maxDelta * 100;
var v0Left = (value0 - minValue) / maxDelta * 100;
return /*#__PURE__*/_react["default"].createElement(SliderWrapper, {
className: (0, _classnames["default"])('kg-slider', _objectSpread(_objectSpread({}, classSet), {}, {
disabled: disabled
}), className),
ref: this.ref,
$isRanged: isRanged,
$vertical: vertical,
style: style
}, /*#__PURE__*/_react["default"].createElement(StyledRangeSlider, {
className: "kg-range-slider",
$vertical: vertical,
ref: this.track
}, /*#__PURE__*/_react["default"].createElement(_sliderHandle["default"], {
left: this.calcHandleLeft0(width, v0Left),
valueListener: this.slide0Listener,
sliderHandleWidth: sliderHandleWidth,
display: isRanged,
vertical: vertical,
showTooltip: showTooltip,
track: this.track
}), /*#__PURE__*/_react["default"].createElement(_sliderHandle["default"], {
left: this.calcHandleLeft1(width, v0Left),
valueListener: this.slide1Listener,
sliderHandleWidth: sliderHandleWidth,
vertical: vertical,
value: value1,
showTooltip: showTooltip,
track: this.track
}), /*#__PURE__*/_react["default"].createElement(_sliderBarHandle["default"], {
width: width,
v0Left: v0Left,
enableBarDrag: this.props.enableBarDrag,
sliderBarListener: this.sliderBarListener,
vertical: vertical,
track: this.track,
setAnchor: this.setAnchor
})));
}
}]);
}(_react.Component);
(0, _defineProperty2["default"])(Slider, "defaultProps", {
title: '',
isRanged: true,
value0: 0,
value1: 100,
minValue: 0,
maxValue: 100,
step: 1,
sliderHandleWidth: 12,
enableBarDrag: false,
onSlider0Change: noop,
onSlider1Change: noop,
onSliderBarChange: noop,
disabled: false,
vertical: false,
showTooltip: false
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9zbGlkZXJIYW5kbGUiLCJfc2xpZGVyQmFySGFuZGxlIiwiX3V0aWxzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwibm9vcCIsIlN0eWxlZFJhbmdlU2xpZGVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsInRoZW1lIiwic2xpZGVyQmFyQmdkIiwiY29uY2F0IiwiJHZlcnRpY2FsIiwic2xpZGVyQmFySGVpZ2h0IiwiU2xpZGVyV3JhcHBlciIsIlNsaWRlciIsImV4cG9ydHMiLCJfQ29tcG9uZW50IiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiY3JlYXRlUmVmIiwieCIsImFuY2hvciIsIl90aGlzJHByb3BzIiwidmFsdWUxIiwibWluVmFsdWUiLCJ2YWwiLCJnZXRWYWx1ZSIsIm9uU2xpZGVyMENoYW5nZSIsImNsYW1wIiwiX3RoaXMkcHJvcHMyIiwibWF4VmFsdWUiLCJ2YWx1ZTAiLCJvblNsaWRlcjFDaGFuZ2UiLCJfdGhpcyRwcm9wczMiLCJ2YWwwIiwidmFsMSIsImRlbHRhWCIsImdldERlbHRhWCIsIm9uU2xpZGVyQmFyQ2hhbmdlIiwidyIsImwiLCJzbGlkZXJIYW5kbGVXaWR0aCIsImlzUmFuZ2VkIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImdldEJhc2VEaXN0YW5jZSIsInJlZiIsImN1cnJlbnQiLCJ2ZXJ0aWNhbCIsIm9mZnNldEhlaWdodCIsIm9mZnNldFdpZHRoIiwiZ2V0RGVsdGFWYWwiLCJwZXJjZW50IiwibWF4RGVsdGEiLCJ2IiwiYmFzZVYiLCJvZmZzZXQiLCJyYXdWYWx1ZSIsIm5vcm1hbGl6ZVZhbHVlIiwiX3RoaXMkcHJvcHM0Iiwic3RlcCIsIm1hcmtzIiwibm9ybWFsaXplU2xpZGVyVmFsdWUiLCJyZW5kZXIiLCJfdGhpcyRwcm9wczUiLCJjbGFzc05hbWUiLCJjbGFzc1NldCIsImRpc2FibGVkIiwic2hvd1Rvb2x0aXAiLCJzdHlsZSIsImN1cnJWYWxEZWx0YSIsIndpZHRoIiwidjBMZWZ0IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzbmFtZXMiLCIkaXNSYW5nZWQiLCJ0cmFjayIsImxlZnQiLCJjYWxjSGFuZGxlTGVmdDAiLCJ2YWx1ZUxpc3RlbmVyIiwic2xpZGUwTGlzdGVuZXIiLCJkaXNwbGF5IiwiY2FsY0hhbmRsZUxlZnQxIiwic2xpZGUxTGlzdGVuZXIiLCJlbmFibGVCYXJEcmFnIiwic2xpZGVyQmFyTGlzdGVuZXIiLCJzZXRBbmNob3IiLCJDb21wb25lbnQiLCJ0aXRsZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tb24vc2xpZGVyL3NsaWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWYsIFJlZk9iamVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IFNsaWRlckhhbmRsZSBmcm9tICcuL3NsaWRlci1oYW5kbGUnO1xuaW1wb3J0IFNsaWRlckJhckhhbmRsZSBmcm9tICcuL3NsaWRlci1iYXItaGFuZGxlJztcbmltcG9ydCB7bm9ybWFsaXplU2xpZGVyVmFsdWUsIGNsYW1wfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuZnVuY3Rpb24gbm9vcCgpIHtcbiAgcmV0dXJuO1xufVxuXG5pbnRlcmZhY2UgU3R5bGVkUmFuZ2VTbGlkZXJQcm9wcyB7XG4gICR2ZXJ0aWNhbD86IGJvb2xlYW47XG59XG5cbmNvbnN0IFN0eWxlZFJhbmdlU2xpZGVyID0gc3R5bGVkLmRpdjxTdHlsZWRSYW5nZVNsaWRlclByb3BzPmBcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNsaWRlckJhckJnZH07XG4gICR7cHJvcHMgPT4gYCR7cHJvcHMuJHZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnfTogJHtwcm9wcy50aGVtZS5zbGlkZXJCYXJIZWlnaHR9cHhgfTtcbiAgJHtwcm9wcyA9PiBgJHtwcm9wcy4kdmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCd9OiAxMDAlYH07XG5gO1xuXG5leHBvcnQgdHlwZSBTdHlsZVJhbmdlU2xpZGVyVHlwZSA9IHR5cGVvZiBTdHlsZWRSYW5nZVNsaWRlciAmIEhUTUxEaXZFbGVtZW50O1xuXG5pbnRlcmZhY2UgU2xpZGVyV3JhcHBlclByb3BzIHtcbiAgJGlzUmFuZ2VkPzogYm9vbGVhbjtcbiAgJHZlcnRpY2FsPzogYm9vbGVhbjtcbn1cblxuY29uc3QgU2xpZGVyV3JhcHBlciA9IHN0eWxlZC5kaXY8U2xpZGVyV3JhcHBlclByb3BzPmBcbiAgZmxleC1ncm93OiAxO1xuYDtcblxudHlwZSBTbGlkZXJQcm9wcyA9IHtcbiAgdGl0bGU6IHN0cmluZztcbiAgaXNSYW5nZWQ6IGJvb2xlYW47XG4gIHZhbHVlMDogbnVtYmVyO1xuICB2YWx1ZTE6IG51bWJlcjtcbiAgbWluVmFsdWU6IG51bWJlcjtcbiAgbWF4VmFsdWU6IG51bWJlcjtcbiAgc2xpZGVySGFuZGxlV2lkdGg6IG51bWJlcjtcbiAgb25TbGlkZXIwQ2hhbmdlOiAodmFsOiBudW1iZXIpID0+IGFueTtcbiAgb25TbGlkZXIxQ2hhbmdlOiAodmFsOiBudW1iZXIpID0+IGFueTtcbiAgb25TbGlkZXJCYXJDaGFuZ2U6ICh2YWwwOiBudW1iZXIsIHZhbDE6IG51bWJlcikgPT4gdm9pZDtcbiAgc3RlcDogbnVtYmVyO1xuICBlbmFibGVCYXJEcmFnOiBib29sZWFuO1xuICBzaG93VG9vbHRpcDogYm9vbGVhbjtcbiAgdmVydGljYWw6IGJvb2xlYW47XG4gIG1hcmtzPzogbnVtYmVyW10gfCBudWxsO1xuICBjbGFzc1NldD86IHtba2V5OiBzdHJpbmddOiBib29sZWFufTtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgc3R5bGU/OiBvYmplY3Q7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbGlkZXIgZXh0ZW5kcyBDb21wb25lbnQ8U2xpZGVyUHJvcHM+IHtcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICB0aXRsZTogJycsXG4gICAgaXNSYW5nZWQ6IHRydWUsXG4gICAgdmFsdWUwOiAwLFxuICAgIHZhbHVlMTogMTAwLFxuICAgIG1pblZhbHVlOiAwLFxuICAgIG1heFZhbHVlOiAxMDAsXG4gICAgc3RlcDogMSxcbiAgICBzbGlkZXJIYW5kbGVXaWR0aDogMTIsXG4gICAgZW5hYmxlQmFyRHJhZzogZmFsc2UsXG4gICAgb25TbGlkZXIwQ2hhbmdlOiBub29wLFxuICAgIG9uU2xpZGVyMUNoYW5nZTogbm9vcCxcbiAgICBvblNsaWRlckJhckNoYW5nZTogbm9vcCxcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgdmVydGljYWw6IGZhbHNlLFxuICAgIHNob3dUb29sdGlwOiBmYWxzZVxuICB9O1xuXG4gIHByaXZhdGUgYW5jaG9yID0gMDtcblxuICBwdWJsaWMgcmVmOiBSZWZPYmplY3Q8dHlwZW9mIFNsaWRlcldyYXBwZXIgJiBIVE1MRGl2RWxlbWVudD4gPSBjcmVhdGVSZWY8XG4gICAgdHlwZW9mIFNsaWRlcldyYXBwZXIgJiBIVE1MRGl2RWxlbWVudFxuICA+KCk7XG4gIHB1YmxpYyB0cmFjazogUmVmT2JqZWN0PFN0eWxlUmFuZ2VTbGlkZXJUeXBlPiA9IGNyZWF0ZVJlZjxTdHlsZVJhbmdlU2xpZGVyVHlwZT4oKTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcHM6IFNsaWRlclByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBbmNob3IgPSAoeDogbnVtYmVyKSA9PiB7XG4gICAgLy8gdXNlZCB0byBjYWxjdWxhdGUgZGVsdGFcbiAgICB0aGlzLmFuY2hvciA9IHg7XG4gIH07XG5cbiAgcHJpdmF0ZSBnZXRCYXNlRGlzdGFuY2UoKSB7XG4gICAgaWYgKCF0aGlzLnJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHJvcHMudmVydGljYWwgPyB0aGlzLnJlZi5jdXJyZW50Lm9mZnNldEhlaWdodCA6IHRoaXMucmVmLmN1cnJlbnQub2Zmc2V0V2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGdldERlbHRhVmFsKHg6IG51bWJlcikge1xuICAgIGNvbnN0IHBlcmNlbnQgPSB4IC8gdGhpcy5nZXRCYXNlRGlzdGFuY2UoKTtcbiAgICBjb25zdCBtYXhEZWx0YSA9IHRoaXMucHJvcHMubWF4VmFsdWUgLSB0aGlzLnByb3BzLm1pblZhbHVlO1xuICAgIHJldHVybiBwZXJjZW50ICogbWF4RGVsdGE7XG4gIH1cbiAgcHJpdmF0ZSBnZXREZWx0YVgodjogbnVtYmVyKSB7XG4gICAgY29uc3QgcGVyY2VudCA9IHYgLyAodGhpcy5wcm9wcy5tYXhWYWx1ZSAtIHRoaXMucHJvcHMubWluVmFsdWUpO1xuICAgIGNvbnN0IG1heERlbHRhID0gdGhpcy5nZXRCYXNlRGlzdGFuY2UoKTtcbiAgICByZXR1cm4gcGVyY2VudCAqIG1heERlbHRhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWYWx1ZShiYXNlVjogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcikge1xuICAgIC8vIG9mZnNldCBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBzbGlkZXIgaGFuZGxlIGFuZCB0cmFjayBsZWZ0XG4gICAgY29uc3QgcmF3VmFsdWUgPSBiYXNlViArIHRoaXMuZ2V0RGVsdGFWYWwob2Zmc2V0KTtcblxuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZVZhbHVlKHJhd1ZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplVmFsdWUodmFsOiBudW1iZXIpIHtcbiAgICBjb25zdCB7bWluVmFsdWUsIHN0ZXAsIG1hcmtzfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVNsaWRlclZhbHVlKHZhbCwgbWluVmFsdWUsIHN0ZXAsIG1hcmtzKTtcbiAgfVxuXG4gIHNsaWRlMExpc3RlbmVyID0gKHg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHt2YWx1ZTEsIG1pblZhbHVlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgdmFsID0gdGhpcy5nZXRWYWx1ZShtaW5WYWx1ZSwgeCk7XG4gICAgdGhpcy5wcm9wcy5vblNsaWRlcjBDaGFuZ2UoY2xhbXAoW21pblZhbHVlLCB2YWx1ZTFdLCB2YWwpKTtcbiAgfTtcblxuICBzbGlkZTFMaXN0ZW5lciA9ICh4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCB7bWluVmFsdWUsIG1heFZhbHVlLCB2YWx1ZTB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB2YWwgPSB0aGlzLmdldFZhbHVlKG1pblZhbHVlLCB4KTtcbiAgICB0aGlzLnByb3BzLm9uU2xpZGVyMUNoYW5nZShjbGFtcChbdmFsdWUwLCBtYXhWYWx1ZV0sIHZhbCkpO1xuICB9O1xuXG4gIHNsaWRlckJhckxpc3RlbmVyID0gKHg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHt2YWx1ZTAsIHZhbHVlMSwgbWluVmFsdWUsIG1heFZhbHVlfSA9IHRoaXMucHJvcHM7XG4gICAgLy8gZm9yIHNsaWRlciBiYXIsIHdlIHVzZSBkaXN0YW5jZSBkZWx0YVxuICAgIGNvbnN0IGFuY2hvciA9IHRoaXMuYW5jaG9yO1xuICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlMSAtIHZhbHVlMDsgLy8gdGhlIGxlbmd0aCBvZiB0aGUgc2VsZWN0ZWQgcmFuZ2Ugc2hvdWxkbid0IGNoYW5nZSB3aGVuIGNsYW1waW5nXG4gICAgY29uc3QgdmFsMCA9IGNsYW1wKFttaW5WYWx1ZSwgbWF4VmFsdWUgLSBsZW5ndGhdLCB0aGlzLmdldFZhbHVlKHZhbHVlMCwgeCAtIGFuY2hvcikpO1xuICAgIGNvbnN0IHZhbDEgPSBjbGFtcChbdmFsMCArIGxlbmd0aCwgbWF4VmFsdWVdLCB0aGlzLmdldFZhbHVlKHZhbHVlMSwgeCAtIGFuY2hvcikpO1xuXG4gICAgY29uc3QgZGVsdGFYID0gdGhpcy5nZXREZWx0YVgodmFsMCAtIHRoaXMucHJvcHMudmFsdWUwKTtcbiAgICB0aGlzLnByb3BzLm9uU2xpZGVyQmFyQ2hhbmdlKHZhbDAsIHZhbDEpO1xuICAgIC8vIHVwZGF0ZSBhbmNob3JcbiAgICB0aGlzLmFuY2hvciA9IHRoaXMuYW5jaG9yICsgZGVsdGFYO1xuICB9O1xuXG4gIGNhbGNIYW5kbGVMZWZ0MCA9ICh3OiBudW1iZXIsIGw6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiB3ID09PSAwXG4gICAgICA/IGBjYWxjKCR7bH0lIC0gJHt0aGlzLnByb3BzLnNsaWRlckhhbmRsZVdpZHRoIC8gMn1weClgXG4gICAgICA6IGBjYWxjKCR7bH0lIC0gJHt0aGlzLnByb3BzLnNsaWRlckhhbmRsZVdpZHRoIC8gMn1weClgO1xuICB9O1xuXG4gIGNhbGNIYW5kbGVMZWZ0MSA9ICh3OiBudW1iZXIsIGw6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmlzUmFuZ2VkICYmIHcgPT09IDBcbiAgICAgID8gYCR7bH0lYFxuICAgICAgOiBgY2FsYygke2wgKyB3fSUgLSAke3RoaXMucHJvcHMuc2xpZGVySGFuZGxlV2lkdGggLyAyfXB4KWA7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGNsYXNzU2V0LFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBpc1JhbmdlZCxcbiAgICAgIG1heFZhbHVlLFxuICAgICAgbWluVmFsdWUsXG4gICAgICB2YWx1ZTEsXG4gICAgICB2ZXJ0aWNhbCxcbiAgICAgIHNsaWRlckhhbmRsZVdpZHRoLFxuICAgICAgc2hvd1Rvb2x0aXAsXG4gICAgICBzdHlsZVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHZhbHVlMCA9ICFpc1JhbmdlZCAmJiBtaW5WYWx1ZSA+IDAgPyBtaW5WYWx1ZSA6IHRoaXMucHJvcHMudmFsdWUwO1xuICAgIGNvbnN0IGN1cnJWYWxEZWx0YSA9IHZhbHVlMSAtIHZhbHVlMDtcbiAgICBjb25zdCBtYXhEZWx0YSA9IG1heFZhbHVlIC0gbWluVmFsdWU7XG4gICAgY29uc3Qgd2lkdGggPSAoY3VyclZhbERlbHRhIC8gbWF4RGVsdGEpICogMTAwO1xuXG4gICAgY29uc3QgdjBMZWZ0ID0gKCh2YWx1ZTAgLSBtaW5WYWx1ZSkgLyBtYXhEZWx0YSkgKiAxMDA7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFNsaWRlcldyYXBwZXJcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKCdrZy1zbGlkZXInLCB7Li4uY2xhc3NTZXQsIGRpc2FibGVkfSwgY2xhc3NOYW1lKX1cbiAgICAgICAgcmVmPXt0aGlzLnJlZn1cbiAgICAgICAgJGlzUmFuZ2VkPXtpc1JhbmdlZH1cbiAgICAgICAgJHZlcnRpY2FsPXt2ZXJ0aWNhbH1cbiAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgPlxuICAgICAgICA8U3R5bGVkUmFuZ2VTbGlkZXIgY2xhc3NOYW1lPVwia2ctcmFuZ2Utc2xpZGVyXCIgJHZlcnRpY2FsPXt2ZXJ0aWNhbH0gcmVmPXt0aGlzLnRyYWNrfT5cbiAgICAgICAgICA8U2xpZGVySGFuZGxlXG4gICAgICAgICAgICBsZWZ0PXt0aGlzLmNhbGNIYW5kbGVMZWZ0MCh3aWR0aCwgdjBMZWZ0KX1cbiAgICAgICAgICAgIHZhbHVlTGlzdGVuZXI9e3RoaXMuc2xpZGUwTGlzdGVuZXJ9XG4gICAgICAgICAgICBzbGlkZXJIYW5kbGVXaWR0aD17c2xpZGVySGFuZGxlV2lkdGh9XG4gICAgICAgICAgICBkaXNwbGF5PXtpc1JhbmdlZH1cbiAgICAgICAgICAgIHZlcnRpY2FsPXt2ZXJ0aWNhbH1cbiAgICAgICAgICAgIHNob3dUb29sdGlwPXtzaG93VG9vbHRpcH1cbiAgICAgICAgICAgIHRyYWNrPXt0aGlzLnRyYWNrfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPFNsaWRlckhhbmRsZVxuICAgICAgICAgICAgbGVmdD17dGhpcy5jYWxjSGFuZGxlTGVmdDEod2lkdGgsIHYwTGVmdCl9XG4gICAgICAgICAgICB2YWx1ZUxpc3RlbmVyPXt0aGlzLnNsaWRlMUxpc3RlbmVyfVxuICAgICAgICAgICAgc2xpZGVySGFuZGxlV2lkdGg9e3NsaWRlckhhbmRsZVdpZHRofVxuICAgICAgICAgICAgdmVydGljYWw9e3ZlcnRpY2FsfVxuICAgICAgICAgICAgdmFsdWU9e3ZhbHVlMX1cbiAgICAgICAgICAgIHNob3dUb29sdGlwPXtzaG93VG9vbHRpcH1cbiAgICAgICAgICAgIHRyYWNrPXt0aGlzLnRyYWNrfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPFNsaWRlckJhckhhbmRsZVxuICAgICAgICAgICAgd2lkdGg9e3dpZHRofVxuICAgICAgICAgICAgdjBMZWZ0PXt2MExlZnR9XG4gICAgICAgICAgICBlbmFibGVCYXJEcmFnPXt0aGlzLnByb3BzLmVuYWJsZUJhckRyYWd9XG4gICAgICAgICAgICBzbGlkZXJCYXJMaXN0ZW5lcj17dGhpcy5zbGlkZXJCYXJMaXN0ZW5lcn1cbiAgICAgICAgICAgIHZlcnRpY2FsPXt2ZXJ0aWNhbH1cbiAgICAgICAgICAgIHRyYWNrPXt0aGlzLnRyYWNrfVxuICAgICAgICAgICAgc2V0QW5jaG9yPXt0aGlzLnNldEFuY2hvcn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1N0eWxlZFJhbmdlU2xpZGVyPlxuICAgICAgPC9TbGlkZXJXcmFwcGVyPlxuICAgICk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsaUJBQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFJLGFBQUEsR0FBQUYsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFLLGdCQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTSxNQUFBLEdBQUFOLE9BQUE7QUFBNkQsSUFBQU8sZUFBQSxFQUFBQyxnQkFBQSxFQVQ3RDtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEs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