UNPKG

focus-components-v3

Version:

Focus web components to build applications (based on Material Design)

288 lines (228 loc) 31 kB
'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 _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); var _i18next = require('i18next'); var _i18next2 = _interopRequireDefault(_i18next); var _inputText = require('../input-text'); var _inputText2 = _interopRequireDefault(_inputText); var _reactDatePicker = require('react-date-picker'); var _reactDatePicker2 = _interopRequireDefault(_reactDatePicker); var _isArray = require('lodash/isArray'); var _isArray2 = _interopRequireDefault(_isArray); var _uniqueId = require('lodash/uniqueId'); var _uniqueId2 = _interopRequireDefault(_uniqueId); var _closest = require('closest'); var _closest2 = _interopRequireDefault(_closest); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } 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) : _defaults(subClass, superClass); } // Dependencies var isISOString = function isISOString(value) { return (0, _moment2.default)(value, _moment2.default.ISO_8601).isValid(); }; var InputDate = function (_Component) { _inherits(InputDate, _Component); function InputDate(props) { _classCallCheck(this, InputDate); var _this = _possibleConstructorReturn(this, _Component.call(this, props)); _this._isInputFormatCorrect = function (value) { return _this._parseInputDate(value).isValid(); }; _this._parseInputDate = function (inputDate) { var format = _this.props.format; return (0, _moment2.default)(inputDate, format); }; _this._formatDate = function (isoDate) { var format = _this.props.format; if (isISOString(isoDate)) { if ((0, _isArray2.default)(format)) { format = format[0]; } return (0, _moment2.default)(isoDate, _moment2.default.ISO_8601).format(format); } else { return isoDate; } }; _this._onInputChange = function (inputDate, fromBlur) { if (_this._isInputFormatCorrect(inputDate)) { var dropDownDate = _this._parseInputDate(inputDate); _this.setState({ dropDownDate: dropDownDate, inputDate: inputDate }); } else { _this.setState({ inputDate: inputDate }); } if (fromBlur !== true) { _this.props.onChange(inputDate); } }; _this._onInputBlur = function () { var inputDate = _this.state.inputDate; _this._onInputChange(inputDate, true); }; _this._onDropDownChange = function (text, date) { if (date._isValid) { _this.setState({ displayPicker: false }, function () { _this.props.onChange(date.toISOString()); _this._onInputChange(_this._formatDate(date.toISOString()), true); // Add 12 hours to avoid skipping a day due to different locales }); } }; _this._onInputFocus = function () { _this.setState({ displayPicker: true }); }; _this._onDocumentClick = function (_ref) { var target = _ref.target; var targetClassAttr = target.getAttribute('class'); var isTriggeredFromPicker = targetClassAttr ? targetClassAttr.includes('dp-cell') : false; //this is the only way to check the target comes from picker cause at this stage, month and year div are unmounted by React. if (!isTriggeredFromPicker) { //if target was not triggered inside the date picker, we check it was not triggered by the input if ((0, _closest2.default)(target, '[data-id=\'' + _this._inputDateId + '\']', true) === undefined) { _this.setState({ displayPicker: false }, function () { return _this._onInputBlur(); }); } } }; _this._handleKeyDown = function (_ref2) { var key = _ref2.key; if (key === 'Tab' || key === 'Enter') { _this.setState({ displayPicker: false }, function () { return _this._onInputBlur(); }); } }; _this.getValue = function () { var inputDate = _this.state.inputDate; var rawValue = _this._isInputFormatCorrect(inputDate) ? _this._parseInputDate(inputDate).toISOString() : null; return _this.props.beforeValueGetter(rawValue); }; _this.validate = function () { var inputDate = _this.state.inputDate; var isRequired = _this.props.isRequired; if ('' === inputDate || !inputDate) { return { isValid: !isRequired, message: 'focus.components.field.required' }; } else { return { isValid: _this._isInputFormatCorrect(inputDate), message: _i18next2.default.t('focus.components.input.date.invalid', { date: inputDate }) }; } }; var rawInputValue = props.rawInputValue; var state = { dropDownDate: isISOString(rawInputValue) ? (0, _moment2.default)(rawInputValue, _moment2.default.ISO_8601) : (0, _moment2.default)(), inputDate: _this._formatDate(rawInputValue), displayPicker: false }; _this.state = state; _this._inputDateId = (0, _uniqueId2.default)('input-date-'); return _this; } InputDate.prototype.componentWillMount = function componentWillMount() { _moment2.default.locale(this.props.locale); document.addEventListener('click', this._onDocumentClick); }; InputDate.prototype.componentDidMount = function componentDidMount() { var _props = this.props, drops = _props.drops, showDropdowns = _props.showDropdowns; var startDate = this.state.inputDate; }; InputDate.prototype.componentWillReceiveProps = function componentWillReceiveProps(_ref3) { var rawInputValue = _ref3.rawInputValue; this.setState({ dropDownDate: isISOString(rawInputValue) ? (0, _moment2.default)(rawInputValue, _moment2.default.ISO_8601) : (0, _moment2.default)(), inputDate: this._formatDate(rawInputValue) }); }; InputDate.prototype.componentWillUnmount = function componentWillUnmount() { document.removeEventListener('click', this._onDocumentClick); }; InputDate.prototype.render = function render() { var _props2 = this.props, disabled = _props2.disabled, error = _props2.error, locale = _props2.locale, name = _props2.name, placeholder = _props2.placeholder, valid = _props2.valid; var _state = this.state, dropDownDate = _state.dropDownDate, inputDate = _state.inputDate, displayPicker = _state.displayPicker; var _onInputBlur = this._onInputBlur, _onInputChange = this._onInputChange, _onInputFocus = this._onInputFocus, _onDropDownChange = this._onDropDownChange, _onPickerCloserClick = this._onPickerCloserClick, _handleKeyDown = this._handleKeyDown; var inputProps = { disabled: disabled }; return _react2.default.createElement( 'div', { 'data-focus': 'input-date', 'data-id': this._inputDateId }, _react2.default.createElement(_inputText2.default, _extends({ error: error, name: name, onChange: _onInputChange, onKeyDown: _handleKeyDown, onFocus: _onInputFocus, placeholder: placeholder, ref: 'input', rawInputValue: inputDate, valid: valid }, inputProps)), displayPicker && _react2.default.createElement( 'div', { 'data-focus': 'picker-zone' }, _react2.default.createElement(_reactDatePicker2.default, { date: dropDownDate, hideFooter: true, locale: locale, onChange: _onDropDownChange, ref: 'picker' }) ) ); }; return InputDate; }(_react.Component); InputDate.displayName = 'InputDate'; InputDate.propTypes = { drops: _react.PropTypes.oneOf(['up', 'down']).isRequired, error: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.bool]), locale: _react.PropTypes.string.isRequired, name: _react.PropTypes.string.isRequired, onChange: _react.PropTypes.func.isRequired, beforeValueGetter: _react.PropTypes.func.isRequired, placeholder: _react.PropTypes.string, showDropdowns: _react.PropTypes.bool.isRequired, rawInputValue: function rawInputValue(props, propName, componentName) { var prop = props[propName]; if (prop && !isISOString(prop)) { throw new Error('The date ' + prop + ' provided to the component ' + componentName + ' is not an ISO date. Please provide a valid date string.'); } }, valid: _react.PropTypes.bool, validate: _react.PropTypes.func }; InputDate.defaultProps = { drops: 'down', error: 'focus.components.input.date.error.default', locale: 'en', format: 'MM/DD/YYYY', beforeValueGetter: function beforeValueGetter(value) { return value; }, /** * Default onChange prop, that will log an error. */ onChange: function onChange() { console.error('You did not give an onChange method to an input date, please check your code.'); }, showDropdowns: true, valid: true, validate: isISOString }; exports.default = InputDate; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZyLUZSLmpzIl0sIm5hbWVzIjpbImlzSVNPU3RyaW5nIiwidmFsdWUiLCJJU09fODYwMSIsImlzVmFsaWQiLCJJbnB1dERhdGUiLCJwcm9wcyIsIl9pc0lucHV0Rm9ybWF0Q29ycmVjdCIsIl9wYXJzZUlucHV0RGF0ZSIsImZvcm1hdCIsImlucHV0RGF0ZSIsIl9mb3JtYXREYXRlIiwiaXNvRGF0ZSIsIl9vbklucHV0Q2hhbmdlIiwiZnJvbUJsdXIiLCJkcm9wRG93bkRhdGUiLCJzZXRTdGF0ZSIsIm9uQ2hhbmdlIiwiX29uSW5wdXRCbHVyIiwic3RhdGUiLCJfb25Ecm9wRG93bkNoYW5nZSIsInRleHQiLCJkYXRlIiwiX2lzVmFsaWQiLCJkaXNwbGF5UGlja2VyIiwidG9JU09TdHJpbmciLCJfb25JbnB1dEZvY3VzIiwiX29uRG9jdW1lbnRDbGljayIsInRhcmdldCIsInRhcmdldENsYXNzQXR0ciIsImdldEF0dHJpYnV0ZSIsImlzVHJpZ2dlcmVkRnJvbVBpY2tlciIsImluY2x1ZGVzIiwiX2lucHV0RGF0ZUlkIiwidW5kZWZpbmVkIiwiX2hhbmRsZUtleURvd24iLCJrZXkiLCJnZXRWYWx1ZSIsInJhd1ZhbHVlIiwiYmVmb3JlVmFsdWVHZXR0ZXIiLCJ2YWxpZGF0ZSIsImlzUmVxdWlyZWQiLCJtZXNzYWdlIiwidCIsInJhd0lucHV0VmFsdWUiLCJjb21wb25lbnRXaWxsTW91bnQiLCJsb2NhbGUiLCJkb2N1bWVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJjb21wb25lbnREaWRNb3VudCIsImRyb3BzIiwic2hvd0Ryb3Bkb3ducyIsInN0YXJ0RGF0ZSIsImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJyZW5kZXIiLCJkaXNhYmxlZCIsImVycm9yIiwibmFtZSIsInBsYWNlaG9sZGVyIiwidmFsaWQiLCJfb25QaWNrZXJDbG9zZXJDbGljayIsImlucHV0UHJvcHMiLCJkaXNwbGF5TmFtZSIsInByb3BUeXBlcyIsIm9uZU9mIiwib25lT2ZUeXBlIiwic3RyaW5nIiwiYm9vbCIsImZ1bmMiLCJwcm9wTmFtZSIsImNvbXBvbmVudE5hbWUiLCJwcm9wIiwiRXJyb3IiLCJkZWZhdWx0UHJvcHMiLCJjb25zb2xlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7OytlQVRBOzs7QUFXQSxJQUFNQSxjQUFjLFNBQWRBLFdBQWM7QUFBQSxXQUFTLHNCQUFPQyxLQUFQLEVBQWMsaUJBQU9DLFFBQXJCLEVBQStCQyxPQUEvQixFQUFUO0FBQUEsQ0FBcEI7O0lBRU1DLFM7Y0FBQUEsUzs7QUFDRixhQURFQSxTQUNGLENBQVlDLEtBQVosRUFBbUI7QUFBQSw4QkFEakJELFNBQ2lCOztBQUFBLHFEQUNmLHNCQUFNQyxLQUFOLENBRGU7O0FBQUEsY0FrQ25CQyxxQkFsQ21CLEdBa0NLO0FBQUEsbUJBQVMsTUFBS0MsZUFBTCxDQUFxQk4sS0FBckIsRUFBNEJFLE9BQTVCLEVBQVQ7QUFBQSxTQWxDTDs7QUFBQSxjQW9DbkJJLGVBcENtQixHQW9DRCxxQkFBYTtBQUFBLGdCQUNwQkMsTUFEb0IsR0FDVixNQUFLSCxLQURLLENBQ3BCRyxNQURvQjs7QUFFM0IsbUJBQU8sc0JBQU9DLFNBQVAsRUFBa0JELE1BQWxCLENBQVA7QUFDSCxTQXZDa0I7O0FBQUEsY0F5Q25CRSxXQXpDbUIsR0F5Q0wsbUJBQVc7QUFBQSxnQkFDaEJGLE1BRGdCLEdBQ04sTUFBS0gsS0FEQyxDQUNoQkcsTUFEZ0I7O0FBRXJCLGdCQUFJUixZQUFZVyxPQUFaLENBQUosRUFBMEI7QUFDdEIsb0JBQUksdUJBQVFILE1BQVIsQ0FBSixFQUFxQjtBQUNqQkEsNkJBQVNBLE9BQU8sQ0FBUCxDQUFUO0FBQ0g7QUFDRCx1QkFBTyxzQkFBT0csT0FBUCxFQUFnQixpQkFBT1QsUUFBdkIsRUFBaUNN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dUJBQW1CLGlCQUFVK0IsSUFBVixDQUFlN0IsVUFUZjtBQVVuQm1CLGlCQUFhLGlCQUFVUSxNQVZKO0FBV25CakIsbUJBQWUsaUJBQVVrQixJQUFWLENBQWU1QixVQVhYO0FBWW5CRyxtQkFBZSx1QkFBQ3RDLEtBQUQsRUFBUWlFLFFBQVIsRUFBa0JDLGFBQWxCLEVBQW9DO0FBQy9DLFlBQU1DLE9BQU9uRSxNQUFNaUUsUUFBTixDQUFiO0FBQ0EsWUFBSUUsUUFBUSxDQUFDeEUsWUFBWXdFLElBQVosQ0FBYixFQUFnQztBQUM1QixrQkFBTSxJQUFJQyxLQUFKLGVBQXNCRCxJQUF0QixtQ0FBd0RELGFBQXhELDhEQUFOO0FBQ0g7QUFDSixLQWpCa0I7QUFrQm5CWCxXQUFPLGlCQUFVUSxJQWxCRTtBQW1CbkI3QixjQUFVLGlCQUFVOEI7QUFuQkQsQ0FBdkI7QUFxQkFqRSxVQUFVc0UsWUFBVixHQUEwQjtBQUN0QnpCLFdBQU8sTUFEZTtBQUV0QlEsV0FBTywyQ0FGZTtBQUd0QlosWUFBUSxJQUhjO0FBSXRCckMsWUFBUSxZQUpjO0FBS3RCOEIsdUJBQW1CO0FBQUEsZUFBU3JDLEtBQVQ7QUFBQSxLQUxHO0FBTXRCOzs7QUFHQWUsWUFUc0Isc0JBU1g7QUFDUDJELGdCQUFRbEIsS0FBUixDQUFjLCtFQUFkO0FBQ0gsS0FYcUI7O0FBWXRCUCxtQkFBZSxJQVpPO0FBYXRCVSxXQUFPLElBYmU7QUFjdEJyQixjQUFVdkM7QUFkWSxDQUExQjtrQkFnQmVJLFMiLCJmaWxlIjoiZnItRlIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBEZXBlbmRlbmNpZXNcclxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XHJcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IGkxOG5leHQgZnJvbSAnaTE4bmV4dCc7XHJcbmltcG9ydCBJbnB1dFRleHQgZnJvbSAnLi4vaW5wdXQtdGV4dCc7XHJcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gJ3JlYWN0LWRhdGUtcGlja2VyJztcclxuaW1wb3J0IGlzQXJyYXkgZnJvbSAnbG9kYXNoL2lzQXJyYXknO1xyXG5pbXBvcnQgdW5pcXVlSWQgZnJvbSAnbG9kYXNoL3VuaXF1ZUlkJztcclxuaW1wb3J0IGNsb3Nlc3QgZnJvbSAnY2xvc2VzdCc7XHJcblxyXG5jb25zdCBpc0lTT1N0cmluZyA9IHZhbHVlID0+IG1vbWVudCh2YWx1ZSwgbW9tZW50LklTT184NjAxKS5pc1ZhbGlkKCk7XHJcblxyXG5jbGFzcyBJbnB1dERhdGUgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qge3Jhd0lucHV0VmFsdWV9ID0gcHJvcHM7XHJcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRyb3BEb3duRGF0ZTogaXNJU09TdHJpbmcocmF3SW5wdXRWYWx1ZSkgPyBtb21lbnQocmF3SW5wdXRWYWx1ZSwgbW9tZW50LklTT184NjAxKSA6IG1vbWVudCgpLFxyXG4gICAgICAgICAgICBpbnB1dERhdGU6IHRoaXMuX2Zvcm1hdERhdGUocmF3SW5wdXRWYWx1ZSksXHJcbiAgICAgICAgICAgIGRpc3BsYXlQaWNrZXI6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XHJcbiAgICAgICAgdGhpcy5faW5wdXREYXRlSWQgPSB1bmlxdWVJZCgnaW5wdXQtZGF0ZS0nKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsTW91bnQoKSB7XHJcbiAgICAgICAgbW9tZW50LmxvY2FsZSh0aGlzLnByb3BzLmxvY2FsZSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICBjb25zdCB7ZHJvcHMsIHNob3dEcm9wZG93bnN9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCB7aW5wdXREYXRlOiBzdGFydERhdGV9ID0gdGhpcy5zdGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHtyYXdJbnB1dFZhbHVlfSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkcm9wRG93bkRhdGU6IGlzSVNPU3RyaW5nKHJhd0lucHV0VmFsdWUpID8gbW9tZW50KHJhd0lucHV0VmFsdWUsIG1vbWVudC5JU09fODYwMSkgOiBtb21lbnQoKSxcclxuICAgICAgICAgICAgaW5wdXREYXRlOiB0aGlzLl9mb3JtYXREYXRlKHJhd0lucHV0VmFsdWUpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgfVxyXG5cclxuICAgIF9pc0lucHV0Rm9ybWF0Q29ycmVjdCA9IHZhbHVlID0+IHRoaXMuX3BhcnNlSW5wdXREYXRlKHZhbHVlKS5pc1ZhbGlkKCk7XHJcblxyXG4gICAgX3BhcnNlSW5wdXREYXRlID0gaW5wdXREYXRlID0+IHtcclxuICAgICAgICBjb25zdCB7Zm9ybWF0fSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgcmV0dXJuIG1vbWVudChpbnB1dERhdGUsIGZvcm1hdCk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9mb3JtYXREYXRlID0gaXNvRGF0ZSA9PiB7XHJcbiAgICAgICAgbGV0IHtmb3JtYXR9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBpZiAoaXNJU09TdHJpbmcoaXNvRGF0ZSkpIHtcclxuICAgICAgICAgICAgaWYgKGlzQXJyYXkoZm9ybWF0KSkge1xyXG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0WzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoaXNvRGF0ZSwgbW9tZW50LklTT184NjAxKS5mb3JtYXQoZm9ybWF0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gaXNvRGF0ZTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9vbklucHV0Q2hhbmdlID0gKGlucHV0RGF0ZSwgZnJvbUJsdXIpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbnB1dEZvcm1hdENvcnJlY3QoaW5wdXREYXRlKSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wRG93bkRhdGUgPSB0aGlzLl9wYXJzZUlucHV0RGF0ZShpbnB1dERhdGUpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtkcm9wRG93bkRhdGUsIGlucHV0RGF0ZX0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2lucHV0RGF0ZX0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihmcm9tQmx1ciAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGlucHV0RGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfb25JbnB1dEJsdXIgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qge2lucHV0RGF0ZX0gPSB0aGlzLnN0YXRlO1xyXG4gICAgICAgIHRoaXMuX29uSW5wdXRDaGFuZ2UoaW5wdXREYXRlLCB0cnVlKTtcclxuICAgIH07XHJcblxyXG4gICAgX29uRHJvcERvd25DaGFuZ2UgPSAodGV4dCwgZGF0ZSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRlLl9pc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2Rpc3BsYXlQaWNrZXI6IGZhbHNlfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShkYXRlLnRvSVNPU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25JbnB1dENoYW5nZSh0aGlzLl9mb3JtYXREYXRlKGRhdGUudG9JU09TdHJpbmcoKSksIHRydWUpIC8vIEFkZCAxMiBob3VycyB0byBhdm9pZCBza2lwcGluZyBhIGRheSBkdWUgdG8gZGlmZmVyZW50IGxvY2FsZXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfb25JbnB1dEZvY3VzID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2Rpc3BsYXlQaWNrZXI6IHRydWV9KTtcclxuICAgIH07XHJcblxyXG4gICAgX29uRG9jdW1lbnRDbGljayA9ICh7dGFyZ2V0fSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldENsYXNzQXR0ciA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJyk7XHJcbiAgICAgICAgY29uc3QgaXNUcmlnZ2VyZWRGcm9tUGlja2VyID0gdGFyZ2V0Q2xhc3NBdHRyID8gdGFyZ2V0Q2xhc3NBdHRyLmluY2x1ZGVzKCdkcC1jZWxsJykgOiBmYWxzZTsgLy90aGlzIGlzIHRoZSBvbmx5IHdheSB0byBjaGVjayB0aGUgdGFyZ2V0IGNvbWVzIGZyb20gcGlja2VyIGNhdXNlIGF0IHRoaXMgc3RhZ2UsIG1vbnRoIGFuZCB5ZWFyIGRpdiBhcmUgdW5tb3VudGVkIGJ5IFJlYWN0LlxyXG4gICAgICAgIGlmKCFpc1RyaWdnZXJlZEZyb21QaWNrZXIpIHtcclxuICAgICAgICAgICAgLy9pZiB0YXJnZXQgd2FzIG5vdCB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBkYXRlIHBpY2tlciwgd2UgY2hlY2sgaXQgd2FzIG5vdCB0cmlnZ2VyZWQgYnkgdGhlIGlucHV0XHJcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KHRhcmdldCwgYFtkYXRhLWlkPScke3RoaXMuX2lucHV0RGF0ZUlkfSddYCwgdHJ1ZSkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZGlzcGxheVBpY2tlcjogZmFsc2V9LCAoKSA9PiB0aGlzLl9vbklucHV0Qmx1cigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgX2hhbmRsZUtleURvd24gPSAoe2tleX0pID0+IHtcclxuICAgICAgICBpZiAoa2V5ID09PSAnVGFiJyB8fCBrZXkgPT09ICdFbnRlcicpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZGlzcGxheVBpY2tlcjogZmFsc2V9LCAoKSA9PiB0aGlzLl9vbklucHV0Qmx1cigpKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGdldFZhbHVlID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHtpbnB1dERhdGV9ID0gdGhpcy5zdGF0ZTtcclxuICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHRoaXMuX2lzSW5wdXRGb3JtYXRDb3JyZWN0KGlucHV0RGF0ZSkgPyB0aGlzLl9wYXJzZUlucHV0RGF0ZShpbnB1dERhdGUpLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmJlZm9yZVZhbHVlR2V0dGVyKHJhd1ZhbHVlKTtcclxuICAgIH07XHJcblxyXG4gICAgdmFsaWRhdGUgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qge2lucHV0RGF0ZX0gPSB0aGlzLnN0YXRlO1xyXG4gICAgICAgIGNvbnN0IHtpc1JlcXVpcmVkfSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgaWYgKCcnID09PSBpbnB1dERhdGUgfHwgIWlucHV0RGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gKHtcclxuICAgICAgICAgICAgICAgIGlzVmFsaWQ6ICFpc1JlcXVpcmVkLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2ZvY3VzLmNvbXBvbmVudHMuZmllbGQucmVxdWlyZWQnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoe1xyXG4gICAgICAgICAgICAgICAgaXNWYWxpZDogdGhpcy5faXNJbnB1dEZvcm1hdENvcnJlY3QoaW5wdXREYXRlKSxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGkxOG5leHQudCgnZm9jdXMuY29tcG9uZW50cy5pbnB1dC5kYXRlLmludmFsaWQnLCB7ZGF0ZTogaW5wdXREYXRlfSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge2Rpc2FibGVkLCBlcnJvciwgbG9jYWxlLCBuYW1lLCBwbGFjZWhvbGRlciwgdmFsaWR9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCB7ZHJvcERvd25EYXRlLCBpbnB1dERhdGUsIGRpc3BsYXlQaWNrZXJ9ID0gdGhpcy5zdGF0ZTtcclxuICAgICAgICBjb25zdCB7X29uSW5wdXRCbHVyLCBfb25JbnB1dENoYW5nZSwgX29uSW5wdXRGb2N1cywgX29uRHJvcERvd25DaGFuZ2UsIF9vblBpY2tlckNsb3NlckNsaWNrLCBfaGFuZGxlS2V5RG93bn0gPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IGlucHV0UHJvcHMgPSB7IGRpc2FibGVkIH07XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGRpdiBkYXRhLWZvY3VzPSdpbnB1dC1kYXRlJyBkYXRhLWlkPXt0aGlzLl9pbnB1dERhdGVJZH0+XHJcbiAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGVycm9yPXtlcnJvcn0gbmFtZT17bmFtZX0gb25DaGFuZ2U9e19vbklucHV0Q2hhbmdlfSBvbktleURvd249e19oYW5kbGVLZXlEb3dufSBvbkZvY3VzPXtfb25JbnB1dEZvY3VzfSBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9IHJlZj0naW5wdXQnIHJhd0lucHV0VmFsdWU9e2lucHV0RGF0ZX0gdmFsaWQ9e3ZhbGlkfSB7Li4uaW5wdXRQcm9wc30gLz5cclxuICAgICAgICAgICAgICAgIHtkaXNwbGF5UGlja2VyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWZvY3VzPSdwaWNrZXItem9uZSc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxEYXRlUGlja2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPXtkcm9wRG93bkRhdGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlRm9vdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGU9e2xvY2FsZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtfb25Ecm9wRG93bkNoYW5nZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0ncGlja2VyJyAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG5JbnB1dERhdGUuZGlzcGxheU5hbWUgPSAnSW5wdXREYXRlJztcclxuSW5wdXREYXRlLnByb3BUeXBlcyA9ICB7XHJcbiAgICBkcm9wczogUHJvcFR5cGVzLm9uZU9mKFsndXAnLCAnZG93biddKS5pc1JlcXVpcmVkLFxyXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xyXG4gICAgICAgIFByb3BUeXBlcy5zdHJpbmcsXHJcbiAgICAgICAgUHJvcFR5cGVzLmJvb2xcclxuICAgIF0pLFxyXG4gICAgbG9jYWxlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXHJcbiAgICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXHJcbiAgICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcclxuICAgIGJlZm9yZVZhbHVlR2V0dGVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxyXG4gICAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsXHJcbiAgICBzaG93RHJvcGRvd25zOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxyXG4gICAgcmF3SW5wdXRWYWx1ZTogKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByb3AgPSBwcm9wc1twcm9wTmFtZV07XHJcbiAgICAgICAgaWYgKHByb3AgJiYgIWlzSVNPU3RyaW5nKHByb3ApKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGRhdGUgJHtwcm9wfSBwcm92aWRlZCB0byB0aGUgY29tcG9uZW50ICR7Y29tcG9uZW50TmFtZX0gaXMgbm90IGFuIElTTyBkYXRlLiBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIGRhdGUgc3RyaW5nLmApO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB2YWxpZDogUHJvcFR5cGVzLmJvb2wsXHJcbiAgICB2YWxpZGF0ZTogUHJvcFR5cGVzLmZ1bmNcclxufTtcclxuSW5wdXREYXRlLmRlZmF1bHRQcm9wcyA9ICB7XHJcbiAgICBkcm9wczogJ2Rvd24nLFxyXG4gICAgZXJyb3I6ICdmb2N1cy5jb21wb25lbnRzLmlucHV0LmRhdGUuZXJyb3IuZGVmYXVsdCcsXHJcbiAgICBsb2NhbGU6ICdlbicsXHJcbiAgICBmb3JtYXQ6ICdNTS9ERC9ZWVlZJyxcclxuICAgIGJlZm9yZVZhbHVlR2V0dGVyOiB2YWx1ZSA9PiB2YWx1ZSxcclxuICAgIC8qKlxyXG4gICAgKiBEZWZhdWx0IG9uQ2hhbmdlIHByb3AsIHRoYXQgd2lsbCBsb2cgYW4gZXJyb3IuXHJcbiAgICAqL1xyXG4gICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignWW91IGRpZCBub3QgZ2l2ZSBhbiBvbkNoYW5nZSBtZXRob2QgdG8gYW4gaW5wdXQgZGF0ZSwgcGxlYXNlIGNoZWNrIHlvdXIgY29kZS4nKTtcclxuICAgIH0sXHJcbiAgICBzaG93RHJvcGRvd25zOiB0cnVlLFxyXG4gICAgdmFsaWQ6IHRydWUsXHJcbiAgICB2YWxpZGF0ZTogaXNJU09TdHJpbmdcclxufTtcclxuZXhwb3J0IGRlZmF1bHQgSW5wdXREYXRlO1xyXG4iXX0=