material-ui-datetime-range-picker
Version:
React Datetime Range Picker Component that Implements Google's Material Design Via Material-UI.
301 lines (259 loc) • 29.5 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _transitions = require('../styles/transitions');
var _transitions2 = _interopRequireDefault(_transitions);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
function getStyles(props, context, state) {
var datePicker = context.muiTheme.datePicker;
var selectedYear = state.selectedYear;
var isLandscape = props.mode === 'landscape';
var styles = {
root: {
width: isLandscape ? 165 : '100%',
height: isLandscape ? 330 : 'auto',
float: isLandscape ? 'left' : 'none',
fontWeight: 700,
display: 'inline-block',
backgroundColor: datePicker.headerColor,
borderTopLeftRadius: 2,
borderTopRightRadius: isLandscape ? 0 : 2,
borderBottomLeftRadius: isLandscape ? 2 : 0,
color: datePicker.textColor,
padding: 20,
boxSizing: 'border-box'
},
monthDay: {
display: 'flex',
justifyContent: 'space-between',
fontSize: 20,
lineHeight: '22px',
height: props.mode === 'landscape' ? '100%' : 44,
marginTop: '6px',
opacity: selectedYear ? 0.7 : 1,
width: '100%',
fontWeight: '500'
},
trans: {
transition: _transitions2.default.easeOut(),
height: '50%'
},
endTitle: {
opacity: props.edit === 'end' ? 1 : 0.7,
textAlign: 'right',
cursor: 'pointer'
},
startTitle: {
opacity: props.edit === 'start' ? 1 : 0.7,
textAlign: 'left',
cursor: 'pointer'
},
endDateTitle: {
opacity: props.edit === 'end' && !props.displayTime ? 1 : 0.7,
textAlign: 'right',
cursor: 'pointer',
width: '100%'
},
startDateTitle: {
opacity: props.edit === 'start' && !props.displayTime ? 1 : 0.7,
textAlign: 'left',
cursor: 'pointer',
width: '100%'
},
endTimeTitle: {
opacity: props.edit === 'end' && props.displayTime ? 1 : 0.7,
textAlign: 'right',
cursor: 'pointer',
width: '100%'
},
startTimeTitle: {
opacity: props.edit === 'start' && props.displayTime ? 1 : 0.7,
textAlign: 'left',
cursor: 'pointer',
width: '100%'
},
month: {
display: 'flex',
justifyContent: 'space-between',
fontSize: 22,
lineHeight: '24px',
height: props.mode === 'landscape' ? '100%' : 26,
transition: _transitions2.default.easeOut(),
width: '100%',
fontWeight: '500'
},
year: {
margin: 0,
fontSize: 16,
fontWeight: '500',
lineHeight: '16px',
height: 16,
opacity: selectedYear ? 1 : 0.7,
transition: _transitions2.default.easeOut(),
marginBottom: 10
},
yearTitle: {
cursor: props.disableYearSelection || selectedYear ? 'default' : 'pointer'
}
};
return styles;
}
var DateRangeDisplay = function (_Component) {
_inherits(DateRangeDisplay, _Component);
function DateRangeDisplay() {
var _ref;
var _temp, _this, _ret;
_classCallCheck(this, DateRangeDisplay);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = DateRangeDisplay.__proto__ || Object.getPrototypeOf(DateRangeDisplay)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
selectedYear: false,
transitionDirection: 'up'
}, _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(DateRangeDisplay, [{
key: 'UNSAFE_componentWillMount',
value: function UNSAFE_componentWillMount() {
if (!this.props.monthDaySelected) {
this.setState({ selectedYear: true });
}
}
}, {
key: 'UNSAFE_componentWillReceiveProps',
value: function UNSAFE_componentWillReceiveProps(nextProps) {
if (nextProps.start.selectedDate !== this.props.start.selectedDate) {
var direction = nextProps.start.selectedDate > this.props.start.selectedDate ? 'up' : 'down';
this.setState({
transitionDirection: direction
});
}
if (nextProps.end.selectedDate !== this.props.end.selectedDate) {
var _direction = nextProps.end.selectedDate > this.props.end.selectedDate ? 'up' : 'down';
this.setState({
transitionDirection: _direction
});
}
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
DateTimeFormat = _props.DateTimeFormat,
disableYearSelection = _props.disableYearSelection,
displayTime = _props.displayTime,
locale = _props.locale,
mode = _props.mode,
monthDaySelected = _props.monthDaySelected,
onTouchTapMonthDay = _props.onTouchTapMonthDay,
onTouchTapYear = _props.onTouchTapYear,
onTouchTapMenu = _props.onTouchTapMenu,
end = _props.end,
edit = _props.edit,
start = _props.start,
style = _props.style,
other = _objectWithoutProperties(_props, ['DateTimeFormat', 'disableYearSelection', 'displayTime', 'locale', 'mode', 'monthDaySelected', 'onTouchTapMonthDay', 'onTouchTapYear', 'onTouchTapMenu', 'end', 'edit', 'start', 'style']);
var prepareStyles = this.context.muiTheme.prepareStyles;
var styles = getStyles(this.props, this.context, this.state);
var selectedStartDate = this.props.start.selectedDate;
var selectedEndDate = this.props.end.selectedDate;
var startDate = new DateTimeFormat(locale, {
month: 'short',
weekday: 'short',
day: '2-digit'
}).format(selectedStartDate);
var startTime = selectedStartDate.toLocaleString(locale, { hour: 'numeric', hour12: true });
var endDate = new DateTimeFormat(locale, {
month: 'short',
weekday: 'short',
day: '2-digit'
}).format(selectedEndDate);
var endTime = selectedEndDate.toLocaleString(locale, { hour: 'numeric', hour12: true });
return _react2.default.createElement(
'div',
_extends({}, other, { style: prepareStyles(styles.root, style) }),
_react2.default.createElement(
'div',
{ style: styles.month },
_react2.default.createElement(
'div',
{ style: styles.startTitle },
'Pick Up'
),
_react2.default.createElement(
'div',
{ style: styles.endTitle },
'Drop Off'
)
),
_react2.default.createElement(
'div',
{ style: styles.monthDay },
_react2.default.createElement(
'div',
{ key: 'start-' + startDate, style: { position: 'unset', width: '50%', top: 'unset', left: 'unset' } },
_react2.default.createElement(
'div',
{ onClick: onTouchTapMenu.bind(this, 'start', false), style: styles.startDateTitle },
startDate
),
_react2.default.createElement(
'div',
{ onClick: onTouchTapMenu.bind(this, 'start', true), style: styles.startTimeTitle },
startTime
)
),
_react2.default.createElement(
'div',
{ key: 'end-' + endDate, style: { position: 'unset', width: '50%', top: 'unset', left: 'unset' } },
_react2.default.createElement(
'div',
{ onClick: onTouchTapMenu.bind(this, 'end', false), style: styles.endDateTitle },
endDate
),
_react2.default.createElement(
'div',
{ onClick: onTouchTapMenu.bind(this, 'end', true), style: styles.endTimeTitle },
endTime
)
)
)
);
}
}]);
return DateRangeDisplay;
}(_react.Component);
DateRangeDisplay.propTypes = {
DateTimeFormat: _propTypes2.default.func.isRequired,
disableYearSelection: _propTypes2.default.bool,
displayTime: _propTypes2.default.bool,
edit: _propTypes2.default.string,
end: _propTypes2.default.object,
locale: _propTypes2.default.string.isRequired,
mode: _propTypes2.default.oneOf(['portrait', 'landscape']),
monthDaySelected: _propTypes2.default.bool,
onTouchTapMenu: _propTypes2.default.func,
onTouchTapMonthDay: _propTypes2.default.func,
onTouchTapYear: _propTypes2.default.func,
start: _propTypes2.default.object,
style: _propTypes2.default.object
};
DateRangeDisplay.defaultProps = {
monthDaySelected: true
};
DateRangeDisplay.contextTypes = {
muiTheme: _propTypes2.default.object.isRequired
};
exports.default = DateRangeDisplay;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9EYXRlUGlja2VyL0RhdGVSYW5nZURpc3BsYXkuanMiXSwibmFtZXMiOlsiZ2V0U3R5bGVzIiwicHJvcHMiLCJjb250ZXh0Iiwic3RhdGUiLCJkYXRlUGlja2VyIiwibXVpVGhlbWUiLCJzZWxlY3RlZFllYXIiLCJpc0xhbmRzY2FwZSIsIm1vZGUiLCJzdHlsZXMiLCJyb290Iiwid2lkdGgiLCJoZWlnaHQiLCJmbG9hdCIsImZvbnRXZWlnaHQiLCJkaXNwbGF5IiwiYmFja2dyb3VuZENvbG9yIiwiaGVhZGVyQ29sb3IiLCJib3JkZXJUb3BMZWZ0UmFkaXVzIiwiYm9yZGVyVG9wUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIiwiY29sb3IiLCJ0ZXh0Q29sb3IiLCJwYWRkaW5nIiwiYm94U2l6aW5nIiwibW9udGhEYXkiLCJqdXN0aWZ5Q29udGVudCIsImZvbnRTaXplIiwibGluZUhlaWdodCIsIm1hcmdpblRvcCIsIm9wYWNpdHkiLCJ0cmFucyIsInRyYW5zaXRpb24iLCJ0cmFuc2l0aW9ucyIsImVhc2VPdXQiLCJlbmRUaXRsZSIsImVkaXQiLCJ0ZXh0QWxpZ24iLCJjdXJzb3IiLCJzdGFydFRpdGxlIiwiZW5kRGF0ZVRpdGxlIiwiZGlzcGxheVRpbWUiLCJzdGFydERhdGVUaXRsZSIsImVuZFRpbWVUaXRsZSIsInN0YXJ0VGltZVRpdGxlIiwibW9udGgiLCJ5ZWFyIiwibWFyZ2luIiwibWFyZ2luQm90dG9tIiwieWVhclRpdGxlIiwiZGlzYWJsZVllYXJTZWxlY3Rpb24iLCJEYXRlUmFuZ2VEaXNwbGF5IiwidHJhbnNpdGlvbkRpcmVjdGlvbiIsIm1vbnRoRGF5U2VsZWN0ZWQiLCJzZXRTdGF0ZSIsIm5leHRQcm9wcyIsInN0YXJ0Iiwic2VsZWN0ZWREYXRlIiwiZGlyZWN0aW9uIiwiZW5kIiwiRGF0ZVRpbWVGb3JtYXQiLCJsb2NhbGUiLCJvblRvdWNoVGFwTW9udGhEYXkiLCJvblRvdWNoVGFwWWVhciIsIm9uVG91Y2hUYXBNZW51Iiwic3R5bGUiLCJvdGhlciIsInByZXBhcmVTdHlsZXMiLCJzZWxlY3RlZFN0YXJ0RGF0ZSIsInNlbGVjdGVkRW5kRGF0ZSIsInN0YXJ0RGF0ZSIsIndlZWtkYXkiLCJkYXkiLCJmb3JtYXQiLCJzdGFydFRpbWUiLCJ0b0xvY2FsZVN0cmluZyIsImhvdXIiLCJob3VyMTIiLCJlbmREYXRlIiwiZW5kVGltZSIsInBvc2l0aW9uIiwidG9wIiwibGVmdCIsImJpbmQiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJmdW5jIiwiaXNSZXF1aXJlZCIsImJvb2wiLCJzdHJpbmciLCJvYmplY3QiLCJvbmVPZiIsImRlZmF1bHRQcm9wcyIsImNvbnRleHRUeXBlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxTQUFTQSxTQUFULENBQW1CQyxLQUFuQixFQUEwQkMsT0FBMUIsRUFBbUNDLEtBQW5DLEVBQTBDO0FBQUEsTUFDakNDLFVBRGlDLEdBQ25CRixRQUFRRyxRQURXLENBQ2pDRCxVQURpQztBQUFBLE1BRWpDRSxZQUZpQyxHQUVqQkgsS0FGaUIsQ0FFakNHLFlBRmlDOztBQUd4QyxNQUFNQyxjQUFjTixNQUFNTyxJQUFOLEtBQWUsV0FBbkM7O0FBRUEsTUFBTUMsU0FBUztBQUNiQyxVQUFNO0FBQ0pDLGFBQU9KLGNBQWMsR0FBZCxHQUFvQixNQUR2QjtBQUVKSyxjQUFRTCxjQUFjLEdBQWQsR0FBb0IsTUFGeEI7QUFHSk0sYUFBT04sY0FBYyxNQUFkLEdBQXVCLE1BSDFCO0FBSUpPLGtCQUFZLEdBSlI7QUFLSkMsZUFBUyxjQUxMO0FBTUpDLHVCQUFpQlosV0FBV2EsV0FOeEI7QUFPSkMsMkJBQXFCLENBUGpCO0FBUUpDLDRCQUFzQlosY0FBYyxDQUFkLEdBQWtCLENBUnBDO0FBU0phLDhCQUF3QmIsY0FBYyxDQUFkLEdBQWtCLENBVHRDO0FBVUpjLGFBQU9qQixXQUFXa0IsU0FWZDtBQVdKQyxlQUFT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QyxZQUFwRTtBQUNHb0M7QUFESDtBQUpGO0FBVkY7QUFQRixPQURGO0FBNkJEOzs7O0VBekg0QkssZ0I7O0FBQXpCakMsZ0IsQ0FDR2tDLFMsR0FBWTtBQUNqQnpCLGtCQUFnQjBCLG9CQUFVQyxJQUFWLENBQWVDLFVBRGQ7QUFFakJ0Qyx3QkFBc0JvQyxvQkFBVUcsSUFGZjtBQUdqQmhELGVBQWE2QyxvQkFBVUcsSUFITjtBQUlqQnJELFFBQU1rRCxvQkFBVUksTUFKQztBQUtqQi9CLE9BQUsyQixvQkFBVUssTUFMRTtBQU1qQjlCLFVBQVF5QixvQkFBVUksTUFBVixDQUFpQkYsVUFOUjtBQU9qQmhGLFFBQU04RSxvQkFBVU0sS0FBVixDQUFnQixDQUFDLFVBQUQsRUFBYSxXQUFiLENBQWhCLENBUFc7QUFRakJ2QyxvQkFBa0JpQyxvQkFBVUcsSUFSWDtBQVNqQnpCLGtCQUFnQnNCLG9CQUFVQyxJQVRUO0FBVWpCekIsc0JBQW9Cd0Isb0JBQVVDLElBVmI7QUFXakJ4QixrQkFBZ0J1QixvQkFBVUMsSUFYVDtBQVlqQi9CLFNBQU84QixvQkFBVUssTUFaQTtBQWFqQjFCLFNBQU9xQixvQkFBVUs7QUFiQSxDO0FBRGZ4QyxnQixDQWlCRzBDLFksR0FBZTtBQUNwQnhDLG9CQUFrQjtBQURFLEM7QUFqQmxCRixnQixDQXFCRzJDLFksR0FBZTtBQUNwQnpGLFlBQVVpRixvQkFBVUssTUFBVixDQUFpQkg7QUFEUCxDO2tCQXVHVHJDLGdCIiwiZmlsZSI6IkRhdGVSYW5nZURpc3BsYXkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgdHJhbnNpdGlvbnMgZnJvbSAnLi4vc3R5bGVzL3RyYW5zaXRpb25zJztcblxuZnVuY3Rpb24gZ2V0U3R5bGVzKHByb3BzLCBjb250ZXh0LCBzdGF0ZSkge1xuICBjb25zdCB7ZGF0ZVBpY2tlcn0gPSBjb250ZXh0Lm11aVRoZW1lO1xuICBjb25zdCB7c2VsZWN0ZWRZZWFyfSA9IHN0YXRlO1xuICBjb25zdCBpc0xhbmRzY2FwZSA9IHByb3BzLm1vZGUgPT09ICdsYW5kc2NhcGUnO1xuXG4gIGNvbnN0IHN0eWxlcyA9IHtcbiAgICByb290OiB7XG4gICAgICB3aWR0aDogaXNMYW5kc2NhcGUgPyAxNjUgOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6IGlzTGFuZHNjYXBlID8gMzMwIDogJ2F1dG8nLFxuICAgICAgZmxvYXQ6IGlzTGFuZHNjYXBlID8gJ2xlZnQnIDogJ25vbmUnLFxuICAgICAgZm9udFdlaWdodDogNzAwLFxuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRhdGVQaWNrZXIuaGVhZGVyQ29sb3IsXG4gICAgICBib3JkZXJUb3BMZWZ0UmFkaXVzOiAyLFxuICAgICAgYm9yZGVyVG9wUmlnaHRSYWRpdXM6IGlzTGFuZHNjYXBlID8gMCA6IDIsXG4gICAgICBib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiBpc0xhbmRzY2FwZSA/IDIgOiAwLFxuICAgICAgY29sb3I6IGRhdGVQaWNrZXIudGV4dENvbG9yLFxuICAgICAgcGFkZGluZzogMjAsXG4gICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICB9LFxuICAgIG1vbnRoRGF5OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWJldHdlZW4nLFxuICAgICAgZm9udFNpemU6IDIwLFxuICAgICAgbGluZUhlaWdodDogJzIycHgnLFxuICAgICAgaGVpZ2h0OiBwcm9wcy5tb2RlID09PSAnbGFuZHNjYXBlJyA/ICcxMDAlJyA6IDQ0LFxuICAgICAgbWFyZ2luVG9wOiAnNnB4JyxcbiAgICAgIG9wYWNpdHk6IHNlbGVjdGVkWWVhciA/IDAuNyA6IDEsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgZm9udFdlaWdodDogJzUwMCcsXG4gICAgfSxcblxuICAgIHRyYW5zOiB7XG4gICAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9ucy5lYXNlT3V0KCksXG4gICAgICBoZWlnaHQ6ICc1MCUnLFxuICAgIH0sXG5cbiAgICBlbmRUaXRsZToge1xuICAgICAgb3BhY2l0eTogcHJvcHMuZWRpdCA9PT0gJ2VuZCcgPyAxIDogMC43LFxuICAgICAgdGV4dEFsaWduOiAncmlnaHQnLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgfSxcbiAgICBzdGFydFRpdGxlOiB7XG4gICAgICBvcGFjaXR5OiBwcm9wcy5lZGl0ID09PSAnc3RhcnQnID8gMSA6IDAuNyxcbiAgICAgIHRleHRBbGlnbjogJ2xlZnQnLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgfSxcblxuICAgIGVuZERhdGVUaXRsZToge1xuICAgICAgb3BhY2l0eTogcHJvcHMuZWRpdCA9PT0gJ2VuZCcgJiYgIXByb3BzLmRpc3BsYXlUaW1lID8gMSA6IDAuNyxcbiAgICAgIHRleHRBbGlnbjogJ3JpZ2h0JyxcbiAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICB9LFxuICAgIHN0YXJ0RGF0ZVRpdGxlOiB7XG4gICAgICBvcGFjaXR5OiBwcm9wcy5lZGl0ID09PSAnc3RhcnQnICYmICFwcm9wcy5kaXNwbGF5VGltZSA/IDEgOiAwLjcsXG4gICAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICB9LFxuXG4gICAgZW5kVGltZVRpdGxlOiB7XG4gICAgICBvcGFjaXR5OiBwcm9wcy5lZGl0ID09PSAnZW5kJyAmJiBwcm9wcy5kaXNwbGF5VGltZSA/IDEgOiAwLjcsXG4gICAgICB0ZXh0QWxpZ246ICdyaWdodCcsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgfSxcbiAgICBzdGFydFRpbWVUaXRsZToge1xuICAgICAgb3BhY2l0eTogcHJvcHMuZWRpdCA9PT0gJ3N0YXJ0JyAmJiBwcm9wcy5kaXNwbGF5VGltZSA/IDEgOiAwLjcsXG4gICAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICB9LFxuXG4gICAgbW9udGg6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgICBmb250U2l6ZTogMjIsXG4gICAgICBsaW5lSGVpZ2h0OiAnMjRweCcsXG4gICAgICBoZWlnaHQ6IHByb3BzLm1vZGUgPT09ICdsYW5kc2NhcGUnID8gJzEwMCUnIDogMjYsXG4gICAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9ucy5lYXNlT3V0KCksXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgZm9udFdlaWdodDogJzUwMCcsXG4gICAgfSxcblxuXG4gICAgeWVhcjoge1xuICAgICAgbWFyZ2luOiAwLFxuICAgICAgZm9udFNpemU6IDE2LFxuICAgICAgZm9udFdlaWdodDogJzUwMCcsXG4gICAgICBsaW5lSGVpZ2h0OiAnMTZweCcsXG4gICAgICBoZWlnaHQ6IDE2LFxuICAgICAgb3BhY2l0eTogc2VsZWN0ZWRZZWFyID8gMSA6IDAuNyxcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb25zLmVhc2VPdXQoKSxcbiAgICAgIG1hcmdpbkJvdHRvbTogMTAsXG4gICAgfSxcbiAgICB5ZWFyVGl0bGU6IHtcbiAgICAgIGN1cnNvcjogcHJvcHMuZGlzYWJsZVllYXJTZWxlY3Rpb24gfHwgc2VsZWN0ZWRZZWFyID8gJ2RlZmF1bHQnIDogJ3BvaW50ZXInLFxuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIHN0eWxlcztcbn1cblxuY2xhc3MgRGF0ZVJhbmdlRGlzcGxheSBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgRGF0ZVRpbWVGb3JtYXQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgZGlzYWJsZVllYXJTZWxlY3Rpb246IFByb3BUeXBlcy5ib29sLFxuICAgIGRpc3BsYXlUaW1lOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBlZGl0OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGVuZDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBsb2NhbGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICBtb2RlOiBQcm9wVHlwZXMub25lT2YoWydwb3J0cmFpdCcsICdsYW5kc2NhcGUnXSksXG4gICAgbW9udGhEYXlTZWxlY3RlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgb25Ub3VjaFRhcE1lbnU6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uVG91Y2hUYXBNb250aERheTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25Ub3VjaFRhcFllYXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIHN0YXJ0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgbW9udGhEYXlTZWxlY3RlZDogdHJ1ZSxcbiAgfTtcblxuICBzdGF0aWMgY29udGV4dFR5cGVzID0ge1xuICAgIG11aVRoZW1lOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIH07XG5cbiAgc3RhdGUgPSB7XG4gICAgc2VsZWN0ZWRZZWFyOiBmYWxzZSxcbiAgICB0cmFuc2l0aW9uRGlyZWN0aW9uOiAndXAnLFxuICB9O1xuXG4gIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgaWYgKCF0aGlzLnByb3BzLm1vbnRoRGF5U2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe3NlbGVjdGVkWWVhcjogdHJ1ZX0pO1xuICAgIH1cbiAgfVxuXG4gIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIGlmIChuZXh0UHJvcHMuc3RhcnQuc2VsZWN0ZWREYXRlICE9PSB0aGlzLnByb3BzLnN0YXJ0LnNlbGVjdGVkRGF0ZSkge1xuICAgICAgY29uc3QgZGlyZWN0aW9uID0gbmV4dFByb3BzLnN0YXJ0LnNlbGVjdGVkRGF0ZSA+IHRoaXMucHJvcHMuc3RhcnQuc2VsZWN0ZWREYXRlID8gJ3VwJyA6ICdkb3duJztcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB0cmFuc2l0aW9uRGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFByb3BzLmVuZC5zZWxlY3RlZERhdGUgIT09IHRoaXMucHJvcHMuZW5kLnNlbGVjdGVkRGF0ZSkge1xuICAgICAgY29uc3QgZGlyZWN0aW9uID0gbmV4dFByb3BzLmVuZC5zZWxlY3RlZERhdGUgPiB0aGlzLnByb3BzLmVuZC5zZWxlY3RlZERhdGUgPyAndXAnIDogJ2Rvd24nO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHRyYW5zaXRpb25EaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBEYXRlVGltZUZvcm1hdCxcbiAgICAgIGRpc2FibGVZZWFyU2VsZWN0aW9uLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBkaXNwbGF5VGltZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgbG9jYWxlLFxuICAgICAgbW9kZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgbW9udGhEYXlTZWxlY3RlZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgb25Ub3VjaFRhcE1vbnRoRGF5LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBvblRvdWNoVGFwWWVhciwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgb25Ub3VjaFRhcE1lbnUsXG4gICAgICBlbmQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIGVkaXQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHN0YXJ0LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBzdHlsZSxcbiAgICAgIC4uLm90aGVyXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCB7cHJlcGFyZVN0eWxlc30gPSB0aGlzLmNvbnRleHQubXVpVGhlbWU7XG4gICAgY29uc3Qgc3R5bGVzID0gZ2V0U3R5bGVzKHRoaXMucHJvcHMsIHRoaXMuY29udGV4dCwgdGhpcy5zdGF0ZSk7XG5cbiAgICBjb25zdCBzZWxlY3RlZFN0YXJ0RGF0ZSA9IHRoaXMucHJvcHMuc3RhcnQuc2VsZWN0ZWREYXRlO1xuICAgIGNvbnN0IHNlbGVjdGVkRW5kRGF0ZSA9IHRoaXMucHJvcHMuZW5kLnNlbGVjdGVkRGF0ZTtcblxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IG5ldyBEYXRlVGltZUZvcm1hdChsb2NhbGUsIHtcbiAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgd2Vla2RheTogJ3Nob3J0JyxcbiAgICAgIGRheTogJzItZGlnaXQnLFxuICAgIH0pLmZvcm1hdChzZWxlY3RlZFN0YXJ0RGF0ZSk7XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBzZWxlY3RlZFN0YXJ0RGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHtob3VyOiAnbnVtZXJpYycsIGhvdXIxMjogdHJ1ZX0pO1xuXG4gICAgY29uc3QgZW5kRGF0ZSA9IG5ldyBEYXRlVGltZUZvcm1hdChsb2NhbGUsIHtcbiAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgd2Vla2RheTogJ3Nob3J0JyxcbiAgICAgIGRheTogJzItZGlnaXQnLFxuICAgIH0pLmZvcm1hdChzZWxlY3RlZEVuZERhdGUpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IHNlbGVjdGVkRW5kRGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHtob3VyOiAnbnVtZXJpYycsIGhvdXIxMjogdHJ1ZX0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgey4uLm90aGVyfSBzdHlsZT17cHJlcGFyZVN0eWxlcyhzdHlsZXMucm9vdCwgc3R5bGUpfT5cblxuICAgICAgICA8ZGl2IHN0eWxlPXtzdHlsZXMubW9udGh9PlxuICAgICAgICAgIDxkaXYgc3R5bGU9e3N0eWxlcy5zdGFydFRpdGxlfT5QaWNrIFVwPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT17c3R5bGVzLmVuZFRpdGxlfT5Ecm9wIE9mZjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IHN0eWxlPXtzdHlsZXMubW9udGhEYXl9PlxuICAgICAgICAgIDxkaXYga2V5PXtgc3RhcnQtJHtzdGFydERhdGV9YH0gc3R5bGU9e3twb3NpdGlvbjogJ3Vuc2V0Jywgd2lkdGg6ICc1MCUnLCB0b3A6ICd1bnNldCcsIGxlZnQ6ICd1bnNldCd9fT5cbiAgICAgICAgICAgIDxkaXYgb25DbGljaz17b25Ub3VjaFRhcE1lbnUuYmluZCh0aGlzLCAnc3RhcnQnLCBmYWxzZSl9IHN0eWxlPXtzdHlsZXMuc3RhcnREYXRlVGl0bGV9PlxuICAgICAgICAgICAgICB7c3RhcnREYXRlfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IG9uQ2xpY2s9e29uVG91Y2hUYXBNZW51LmJpbmQodGhpcywgJ3N0YXJ0JywgdHJ1ZSl9IHN0eWxlPXtzdHlsZXMuc3RhcnRUaW1lVGl0bGV9PlxuICAgICAgICAgICAgICB7c3RhcnRUaW1lfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGtleT17YGVuZC0ke2VuZERhdGV9YH0gc3R5bGU9e3twb3NpdGlvbjogJ3Vuc2V0Jywgd2lkdGg6ICc1MCUnLCB0b3A6ICd1bnNldCcsIGxlZnQ6ICd1bnNldCd9fT5cbiAgICAgICAgICAgIDxkaXYgb25DbGljaz17b25Ub3VjaFRhcE1lbnUuYmluZCh0aGlzLCAnZW5kJywgZmFsc2UpfSBzdHlsZT17c3R5bGVzLmVuZERhdGVUaXRsZX0+XG4gICAgICAgICAgICAgIHtlbmREYXRlfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IG9uQ2xpY2s9e29uVG91Y2hUYXBNZW51LmJpbmQodGhpcywgJ2VuZCcsIHRydWUpfSBzdHlsZT17c3R5bGVzLmVuZFRpbWVUaXRsZX0+XG4gICAgICAgICAgICAgIHtlbmRUaW1lfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEYXRlUmFuZ2VEaXNwbGF5O1xuIl19