UNPKG

apeman-react-range

Version:
273 lines (237 loc) 27.7 kB
/** * apeman react package for range input component. * @constructor ApRange */ "use strict"; const React = require('react'), ReactDOM = require('react-dom'), types = React.PropTypes, chopcal = require('chopcal'), rangecal = require('rangecal'), numcal = require('numcal'), classnames = require('classnames'), ApTouchable = require('apeman-react-touchable')['ApTouchable'], ApDraggable = require('apeman-react-draggable')['ApDraggable'], ApRangeLabel = require('./ap_range_label'); /** @lends ApRange */ const ApRange = React.createClass({ displayName: 'ApRange', //-------------------- // Specs //-------------------- propTypes: { from: types.number, to: types.number, min: types.number, max: types.number, step: types.number, onChange: types.func, barOnly: types.bool }, statics: {}, getInitialState: function () { let s = this, props = s.props; return { minX: 0, maxX: 1200, fromX: 0, toX: 1200, fromValue: props.from, toValue: props.to }; }, getDefaultProps: function () { return { from: 25, to: 75, min: 0, max: 100, step: 0.01, barOnly: false }; }, render: function () { let s = this, props = s.props, state = s.state; return React.createElement( 'div', { className: classnames('ap-range', props.className) }, React.createElement( 'div', { className: 'ap-range-inner' }, s._renderLabel(props.min), React.createElement( 'div', { className: 'ap-range-bar-wrap' }, React.createElement( ApTouchable, { onTap: s.rangeBarDidTap }, React.createElement( 'div', { className: 'ap-range-bar' }, React.createElement('div', { className: 'ap-range-bar-bg' }), React.createElement('div', { className: 'ap-range-bar-highlight', style: { left: state.fromX, width: state.toX - state.fromX } }) ) ), React.createElement( ApDraggable, { onMove: s.rangeFromHandleDidMove, shouldMove: s.shouldRangeFromHandleMove, x: state.fromX, minX: state.minX, maxX: state.maxX, className: 'ap-range-handle ap-range-handle-from', direction: 'HORIZONTAL' }, React.createElement('div', { className: 'ap-range-handle-icon' }) ), React.createElement( ApDraggable, { onMove: s.rangeToHandleDidMove, shouldMove: s.shouldRangeToHandleMove, x: state.toX, minX: state.minX, maxX: state.maxX, className: 'ap-range-handle ap-range-handle-to', direction: 'HORIZONTAL' }, React.createElement('div', { className: 'ap-range-handle-icon' }) ) ), s._renderLabel(props.max) ) ); }, //-------------------- // Lifecycle //-------------------- componentDidMount: function () { let s = this; window.addEventListener('resize', s.resizeRange); s.resizeRange(); s.resetRangeValues(); }, componentWillReceiveProps: function (nextProps) { let s = this; s.resetRangeValues(); }, componentWillUnmount: function () { let s = this; window.removeEventListener('resize', s.resizeRange); }, //------------------ // Helper //------------------ resizeRange: function (e) { let s = this; let state = s.state; let w = ReactDOM.findDOMNode(s).offsetWidth; let minX = 0, maxX = w; let fromRate = s._rateWithValue(state.fromValue), toRate = s._rateWithValue(state.toValue); s.setState({ minX: minX, maxX: maxX, fromX: rangecal.value(minX, maxX, fromRate), toX: rangecal.value(minX, maxX, toRate) }); }, rangeBarDidTap: function () {}, rangeFromHandleDidMove: function (e) { let s = this, fromValue = s._valueWithX(e.detail.x); s.setRangeValues(fromValue, s.state.toValue, true); }, rangeToHandleDidMove: function (e) { let s = this, toValue = s._valueWithX(e.detail.x); s.setRangeValues(s.state.fromValue, toValue, false); }, shouldRangeFromHandleMove: function () { let s = this; return true; }, shouldRangeToHandleMove: function () { let s = this; return true; }, resetRangeValues: function () { let s = this; setTimeout(function () { let state = s.state; s.setRangeValues(state.fromValue, state.toValue, true); }); }, setRangeValues: function (fromValue, toValue, forwarding) { let s = this; let state = s.state, props = s.props; let minX = state.minX, maxX = state.maxX; let step = props.step; if (toValue < fromValue) { if (forwarding) { toValue = fromValue; } else { fromValue = toValue; } } let fromRate = s._rateWithValue(fromValue), toRate = s._rateWithValue(toValue); s.setState({ fromValue: fromValue, toValue: toValue, fromX: rangecal.value(minX, maxX, fromRate), toX: rangecal.value(minX, maxX, toRate) }); fromValue = chopcal.round(fromValue, step); toValue = chopcal.round(toValue, step); let duplicate = s._fromValue === fromValue && s._toValue === toValue; if (duplicate) { return; } s._fromValue = fromValue; s._toValue = toValue; if (props.onChange) { props.onChange(fromValue, toValue, { element: s }); } }, //------------------ // Private //------------------ _rateWithValue: function (value) { let s = this; let min = s.props.min, max = s.props.max; value = rangecal.round(min, max, value); return chopcal.round(rangecal.rate(min, max, value), 0.01); }, _valueWithRate: function (rate) { let s = this; let min = s.props.min, max = s.props.max; let value = chopcal.round(rangecal.value(min, max, rate), 0.01); return rangecal.round(min, max, value); }, _valueWithX: function (x) { let s = this; let minX = s.state.minX, maxX = s.state.maxX; let rate = rangecal.rate(minX, maxX, x + 2); return s._valueWithRate(rate); }, _renderLabel: function (value) { let s = this, props = s.props; if (props.barOnly) { return null; } return React.createElement(ApRangeLabel, { value: value }); } }); module.exports = ApRange; //# sourceMappingURL=data:application/json;base64,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SUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUMsZUFBTyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2pDOztBQUVELGdCQUFZLEVBQUUsVUFBVSxLQUFLLEVBQUU7QUFDM0IsWUFBSSxDQUFDLEdBQUcsSUFBSTtZQUNSLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3BCLFlBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtBQUNmLG1CQUFPLElBQUksQ0FBQztTQUNmO0FBQ0QsZUFBUSxvQkFBQyxZQUFZLElBQUMsS0FBSyxFQUFFLEtBQUssQUFBQyxHQUFFLENBQUU7S0FDMUM7Q0FDSixDQUFDLENBQUM7O0FBRUgsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMiLCJmaWxlIjoiYXBfcmFuZ2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL29rdW5pc2hpdGFrYS9wcm9qZWN0cy9hcGVtYW4tcmVhY3QtbGFiby9hcGVtYW4tcmVhY3QtcmFuZ2UvbGliL2pzeCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXBlbWFuIHJlYWN0IHBhY2thZ2UgZm9yIHJhbmdlIGlucHV0IGNvbXBvbmVudC5cbiAqIEBjb25zdHJ1Y3RvciBBcFJhbmdlXG4gKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbmNvbnN0IFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKSxcbiAgICBSZWFjdERPTSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpLFxuICAgIHR5cGVzID0gUmVhY3QuUHJvcFR5cGVzLFxuICAgIGNob3BjYWwgPSByZXF1aXJlKCdjaG9wY2FsJyksXG4gICAgcmFuZ2VjYWwgPSByZXF1aXJlKCdyYW5nZWNhbCcpLFxuICAgIG51bWNhbCA9IHJlcXVpcmUoJ251bWNhbCcpLFxuICAgIGNsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyksXG4gICAgQXBUb3VjaGFibGUgPSByZXF1aXJlKCdhcGVtYW4tcmVhY3QtdG91Y2hhYmxlJylbJ0FwVG91Y2hhYmxlJ10sXG4gICAgQXBEcmFnZ2FibGUgPSByZXF1aXJlKCdhcGVtYW4tcmVhY3QtZHJhZ2dhYmxlJylbJ0FwRHJhZ2dhYmxlJ10sXG4gICAgQXBSYW5nZUxhYmVsID0gcmVxdWlyZSgnLi9hcF9yYW5nZV9sYWJlbCcpO1xuXG4vKiogQGxlbmRzIEFwUmFuZ2UgKi9cbmNvbnN0IEFwUmFuZ2UgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTcGVjc1xuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIHByb3BUeXBlczoge1xuICAgICAgICBmcm9tOiB0eXBlcy5udW1iZXIsXG4gICAgICAgIHRvOiB0eXBlcy5udW1iZXIsXG4gICAgICAgIG1pbjogdHlwZXMubnVtYmVyLFxuICAgICAgICBtYXg6IHR5cGVzLm51bWJlcixcbiAgICAgICAgc3RlcDogdHlwZXMubnVtYmVyLFxuICAgICAgICBvbkNoYW5nZTogdHlwZXMuZnVuYyxcbiAgICAgICAgYmFyT25seTogdHlwZXMuYm9vbFxuICAgIH0sXG5cbiAgICBzdGF0aWNzOiB7fSxcblxuICAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgcyA9IHRoaXMsXG4gICAgICAgICAgICBwcm9wcyA9IHMucHJvcHM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtaW5YOiAwLFxuICAgICAgICAgICAgbWF4WDogMTIwMCxcbiAgICAgICAgICAgIGZyb21YOiAwLFxuICAgICAgICAgICAgdG9YOiAxMjAwLFxuICAgICAgICAgICAgZnJvbVZhbHVlOiBwcm9wcy5mcm9tLFxuICAgICAgICAgICAgdG9WYWx1ZTogcHJvcHMudG9cbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgZ2V0RGVmYXVsdFByb3BzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmcm9tOiAyNSxcbiAgICAgICAgICAgIHRvOiA3NSxcbiAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMTAwLFxuICAgICAgICAgICAgc3RlcDogMC4wMSxcbiAgICAgICAgICAgIGJhck9ubHk6IGZhbHNlXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBzID0gdGhpcyxcbiAgICAgICAgICAgIHByb3BzID0gcy5wcm9wcyxcbiAgICAgICAgICAgIHN0YXRlID0gcy5zdGF0ZTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ2FwLXJhbmdlJywgcHJvcHMuY2xhc3NOYW1lKX0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcC1yYW5nZS1pbm5lclwiPlxuICAgICAgICAgICAgICAgICAgICB7cy5fcmVuZGVyTGFiZWwocHJvcHMubWluKX1cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcC1yYW5nZS1iYXItd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEFwVG91Y2hhYmxlIG9uVGFwPXtzLnJhbmdlQmFyRGlkVGFwfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFwLXJhbmdlLWJhclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFwLXJhbmdlLWJhci1iZ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFwLXJhbmdlLWJhci1oaWdobGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2xlZnQ6c3RhdGUuZnJvbVgsIHdpZHRoOihzdGF0ZS50b1ggLSBzdGF0ZS5mcm9tWCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9BcFRvdWNoYWJsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxBcERyYWdnYWJsZSBvbk1vdmU9e3MucmFuZ2VGcm9tSGFuZGxlRGlkTW92ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRNb3ZlPXtzLnNob3VsZFJhbmdlRnJvbUhhbmRsZU1vdmV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeD17c3RhdGUuZnJvbVh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluWD17c3RhdGUubWluWH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhYPXtzdGF0ZS5tYXhYfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFwLXJhbmdlLWhhbmRsZSBhcC1yYW5nZS1oYW5kbGUtZnJvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uPVwiSE9SSVpPTlRBTFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYXAtcmFuZ2UtaGFuZGxlLWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXBEcmFnZ2FibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QXBEcmFnZ2FibGUgb25Nb3ZlPXtzLnJhbmdlVG9IYW5kbGVEaWRNb3ZlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZE1vdmU9e3Muc2hvdWxkUmFuZ2VUb0hhbmRsZU1vdmV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeD17c3RhdGUudG9YfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblg9e3N0YXRlLm1pblh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WD17c3RhdGUubWF4WH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhcC1yYW5nZS1oYW5kbGUgYXAtcmFuZ2UtaGFuZGxlLXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb249XCJIT1JJWk9OVEFMXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcC1yYW5nZS1oYW5kbGUtaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9BcERyYWdnYWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIHtzLl9yZW5kZXJMYWJlbChwcm9wcy5tYXgpfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIClcbiAgICB9LFxuXG5cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gTGlmZWN5Y2xlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHMgPSB0aGlzO1xuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzLnJlc2l6ZVJhbmdlKTtcbiAgICAgICAgcy5yZXNpemVSYW5nZSgpO1xuICAgICAgICBzLnJlc2V0UmFuZ2VWYWx1ZXMoKTtcbiAgICB9LFxuXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogZnVuY3Rpb24gKG5leHRQcm9wcykge1xuICAgICAgICBsZXQgcyA9IHRoaXM7XG4gICAgICAgIHMucmVzZXRSYW5nZVZhbHVlcygpO1xuICAgIH0sXG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudDogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgcyA9IHRoaXM7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzLnJlc2l6ZVJhbmdlKTtcbiAgICB9LFxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBIZWxwZXJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgcmVzaXplUmFuZ2U6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGxldCBzID0gdGhpcztcbiAgICAgICAgbGV0IHN0YXRlID0gcy5zdGF0ZTtcbiAgICAgICAgbGV0IHcgPSBSZWFjdERPTS5maW5kRE9NTm9kZShzKS5vZmZzZXRXaWR0aDtcbiAgICAgICAgbGV0IG1pblggPSAwLFxuICAgICAgICAgICAgbWF4WCA9IHc7XG4gICAgICAgIGxldCBmcm9tUmF0ZSA9IHMuX3JhdGVXaXRoVmFsdWUoc3RhdGUuZnJvbVZhbHVlKSxcbiAgICAgICAgICAgIHRvUmF0ZSA9IHMuX3JhdGVXaXRoVmFsdWUoc3RhdGUudG9WYWx1ZSk7XG4gICAgICAgIHMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgbWluWDogbWluWCxcbiAgICAgICAgICAgIG1heFg6IG1heFgsXG4gICAgICAgICAgICBmcm9tWDogcmFuZ2VjYWwudmFsdWUobWluWCwgbWF4WCwgZnJvbVJhdGUpLFxuICAgICAgICAgICAgdG9YOiByYW5nZWNhbC52YWx1ZShtaW5YLCBtYXhYLCB0b1JhdGUpXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICByYW5nZUJhckRpZFRhcDogZnVuY3Rpb24gKCkge1xuXG4gICAgfSxcblxuICAgIHJhbmdlRnJvbUhhbmRsZURpZE1vdmU6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGxldCBzID0gdGhpcyxcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IHMuX3ZhbHVlV2l0aFgoZS5kZXRhaWwueCk7XG4gICAgICAgIHMuc2V0UmFuZ2VWYWx1ZXMoZnJvbVZhbHVlLCBzLnN0YXRlLnRvVmFsdWUsIHRydWUpO1xuICAgIH0sXG5cbiAgICByYW5nZVRvSGFuZGxlRGlkTW92ZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgbGV0IHMgPSB0aGlzLFxuICAgICAgICAgICAgdG9WYWx1ZSA9IHMuX3ZhbHVlV2l0aFgoZS5kZXRhaWwueCk7XG4gICAgICAgIHMuc2V0UmFuZ2VWYWx1ZXMocy5zdGF0ZS5mcm9tVmFsdWUsIHRvVmFsdWUsIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgc2hvdWxkUmFuZ2VGcm9tSGFuZGxlTW92ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBzaG91bGRSYW5nZVRvSGFuZGxlTW92ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICByZXNldFJhbmdlVmFsdWVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBzID0gdGhpcztcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBzLnN0YXRlO1xuICAgICAgICAgICAgcy5zZXRSYW5nZVZhbHVlcyhzdGF0ZS5mcm9tVmFsdWUsIHN0YXRlLnRvVmFsdWUsIHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgc2V0UmFuZ2VWYWx1ZXM6IGZ1bmN0aW9uIChmcm9tVmFsdWUsIHRvVmFsdWUsIGZvcndhcmRpbmcpIHtcbiAgICAgICAgbGV0IHMgPSB0aGlzO1xuICAgICAgICBsZXQgc3RhdGUgPSBzLnN0YXRlLFxuICAgICAgICAgICAgcHJvcHMgPSBzLnByb3BzO1xuICAgICAgICBsZXQgbWluWCA9IHN0YXRlLm1pblgsXG4gICAgICAgICAgICBtYXhYID0gc3RhdGUubWF4WDtcbiAgICAgICAgbGV0IHN0ZXAgPSBwcm9wcy5zdGVwO1xuICAgICAgICBpZiAodG9WYWx1ZSA8IGZyb21WYWx1ZSkge1xuICAgICAgICAgICAgaWYgKGZvcndhcmRpbmcpIHtcbiAgICAgICAgICAgICAgICB0b1ZhbHVlID0gZnJvbVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcm9tVmFsdWUgPSB0b1ZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZyb21SYXRlID0gcy5fcmF0ZVdpdGhWYWx1ZShmcm9tVmFsdWUpLFxuICAgICAgICAgICAgdG9SYXRlID0gcy5fcmF0ZVdpdGhWYWx1ZSh0b1ZhbHVlKTtcblxuICAgICAgICBzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGZyb21WYWx1ZTogZnJvbVZhbHVlLFxuICAgICAgICAgICAgdG9WYWx1ZTogdG9WYWx1ZSxcbiAgICAgICAgICAgIGZyb21YOiByYW5nZWNhbC52YWx1ZShtaW5YLCBtYXhYLCBmcm9tUmF0ZSksXG4gICAgICAgICAgICB0b1g6IHJhbmdlY2FsLnZhbHVlKG1pblgsIG1heFgsIHRvUmF0ZSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZnJvbVZhbHVlID0gY2hvcGNhbC5yb3VuZChmcm9tVmFsdWUsIHN0ZXApO1xuICAgICAgICB0b1ZhbHVlID0gY2hvcGNhbC5yb3VuZCh0b1ZhbHVlLCBzdGVwKTtcblxuICAgICAgICBsZXQgZHVwbGljYXRlID0gKHMuX2Zyb21WYWx1ZSA9PT0gZnJvbVZhbHVlKSAmJiAocy5fdG9WYWx1ZSA9PT0gdG9WYWx1ZSk7XG4gICAgICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHMuX2Zyb21WYWx1ZSA9IGZyb21WYWx1ZTtcbiAgICAgICAgcy5fdG9WYWx1ZSA9IHRvVmFsdWU7XG5cbiAgICAgICAgaWYgKHByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgICBwcm9wcy5vbkNoYW5nZShcbiAgICAgICAgICAgICAgICBmcm9tVmFsdWUsXG4gICAgICAgICAgICAgICAgdG9WYWx1ZSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJpdmF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBfcmF0ZVdpdGhWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGxldCBzID0gdGhpcztcbiAgICAgICAgbGV0IG1pbiA9IHMucHJvcHMubWluLFxuICAgICAgICAgICAgbWF4ID0gcy5wcm9wcy5tYXg7XG4gICAgICAgIHZhbHVlID0gcmFuZ2VjYWwucm91bmQobWluLCBtYXgsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGNob3BjYWwucm91bmQocmFuZ2VjYWwucmF0ZShtaW4sIG1heCwgdmFsdWUpLCAwLjAxKTtcbiAgICB9LFxuXG4gICAgX3ZhbHVlV2l0aFJhdGU6IGZ1bmN0aW9uIChyYXRlKSB7XG4gICAgICAgIGxldCBzID0gdGhpcztcbiAgICAgICAgbGV0IG1pbiA9IHMucHJvcHMubWluLFxuICAgICAgICAgICAgbWF4ID0gcy5wcm9wcy5tYXg7XG4gICAgICAgIGxldCB2YWx1ZSA9IGNob3BjYWwucm91bmQocmFuZ2VjYWwudmFsdWUobWluLCBtYXgsIHJhdGUpLCAwLjAxKTtcbiAgICAgICAgcmV0dXJuIHJhbmdlY2FsLnJvdW5kKG1pbiwgbWF4LCB2YWx1ZSk7XG4gICAgfSxcblxuICAgIF92YWx1ZVdpdGhYOiBmdW5jdGlvbiAoeCkge1xuICAgICAgICBsZXQgcyA9IHRoaXM7XG4gICAgICAgIGxldCBtaW5YID0gcy5zdGF0ZS5taW5YLFxuICAgICAgICAgICAgbWF4WCA9IHMuc3RhdGUubWF4WDtcbiAgICAgICAgbGV0IHJhdGUgPSByYW5nZWNhbC5yYXRlKG1pblgsIG1heFgsIHggKyAyKTtcbiAgICAgICAgcmV0dXJuIHMuX3ZhbHVlV2l0aFJhdGUocmF0ZSk7XG4gICAgfSxcblxuICAgIF9yZW5kZXJMYWJlbDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGxldCBzID0gdGhpcyxcbiAgICAgICAgICAgIHByb3BzID0gcy5wcm9wcztcbiAgICAgICAgaWYgKHByb3BzLmJhck9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoPEFwUmFuZ2VMYWJlbCB2YWx1ZT17dmFsdWV9Lz4pO1xuICAgIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFwUmFuZ2U7XG4iXX0=