react-lightning-design-components
Version:
Salesforce Lightning Design System components built with React 16
451 lines (400 loc) • 40.7 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PicklistItem = undefined;
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _uuid = require('uuid');
var _uuid2 = _interopRequireDefault(_uuid);
var _FormElement = require('./FormElement');
var _FormElement2 = _interopRequireDefault(_FormElement);
var _Icon = require('./Icon');
var _Icon2 = _interopRequireDefault(_Icon);
var _DropdownMenu = require('./DropdownMenu');
var _DropdownMenu2 = _interopRequireDefault(_DropdownMenu);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Picklist = function (_Component) {
(0, _inherits3.default)(Picklist, _Component);
function Picklist(props) {
(0, _classCallCheck3.default)(this, Picklist);
var _this = (0, _possibleConstructorReturn3.default)(this, (Picklist.__proto__ || (0, _getPrototypeOf2.default)(Picklist)).call(this, props));
_this.state = {
id: 'form-element-' + (0, _uuid2.default)(),
opened: props.defaultOpened,
value: props.defaultValue
};
_this.picklistButtonRef = _this.picklistButtonRef.bind(_this);
_this.dropdownRef = _this.dropdownRef.bind(_this);
return _this;
}
(0, _createClass3.default)(Picklist, [{
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps, prevState) {
if (this.props.onValueChange && prevState.value !== this.state.value) {
this.props.onValueChange(this.state.value, prevState.value);
}
if (this.props.focusOnOpen && prevState.opened === false && this.state.opened === true) {
this.focusToTargetItemEl();
}
}
}, {
key: 'onClick',
value: function onClick(e) {
var onDropDownClick = this.props.onDropDownClick;
this.setState(function (state) {
return { opened: !state.opened };
});
if (onDropDownClick) onDropDownClick(e);
}
}, {
key: 'onPicklistItemClick',
value: function onPicklistItemClick(item, e) {
var _this2 = this;
this.setState({ value: item.value });
if (this.props.onChange) {
this.props.onChange(e, item.value);
}
if (this.props.onSelect) {
this.props.onSelect(item);
}
setTimeout(function () {
_this2.setState({ opened: false });
if (_this2.props.onComplete) {
_this2.props.onComplete();
}
var picklistButtonEl = _reactDom2.default.findDOMNode(_this2.picklistButton);
if (picklistButtonEl) {
picklistButtonEl.focus();
}
}, 200);
e.preventDefault();
e.stopPropagation();
}
}, {
key: 'onPicklistClose',
value: function onPicklistClose() {
var picklistButtonEl = _reactDom2.default.findDOMNode(this.picklistButton);
picklistButtonEl.focus();
this.setState({ opened: false });
}
}, {
key: 'onBlur',
value: function onBlur() {
var _this3 = this;
setTimeout(function () {
if (!_this3.isFocusedInComponent()) {
_this3.setState({ opened: false });
if (_this3.props.onBlur) {
_this3.props.onBlur();
}
if (_this3.props.onComplete) {
_this3.props.onComplete();
}
}
}, 10);
}
}, {
key: 'onKeydown',
value: function onKeydown(e) {
if (e.keyCode === 40) {
// down
e.preventDefault();
e.stopPropagation();
if (!this.state.opened) {
this.setState({ opened: true });
} else {
this.focusToTargetItemEl();
}
} else if (e.keyCode === 27) {
// ESC
e.preventDefault();
e.stopPropagation();
this.setState({ opened: false });
if (this.props.onComplete) {
this.props.onComplete();
}
}
if (this.props.onKeyDown) {
this.props.onKeyDown(e);
}
}
}, {
key: 'onDropdownScroll',
value: function onDropdownScroll(page) {
if (this.props.onScroll) {
this.props.onScroll(page);
}
}
}, {
key: 'getSelectedValue',
value: function getSelectedValue() {
var _props = this.props,
defaultValue = _props.defaultValue,
value = _props.value;
return typeof value !== 'undefined' ? value : typeof this.state.value !== 'undefined' ? this.state.value : defaultValue;
}
}, {
key: 'getSelectedItemLabel',
value: function getSelectedItemLabel() {
var selectedValue = this.getSelectedValue();
var selected = null;
_react2.default.Children.forEach(this.props.children, function (item) {
if (item.props.value === selectedValue) {
selected = item.props.label || item.props.children;
}
});
return selected || this.props.selectedText;
}
}, {
key: 'isFocusedInComponent',
value: function isFocusedInComponent() {
var rootEl = _reactDom2.default.findDOMNode(this);
var targetEl = document.activeElement;
while (targetEl && targetEl !== rootEl) {
targetEl = targetEl.parentNode;
}
return !!targetEl;
}
}, {
key: 'focusToTargetItemEl',
value: function focusToTargetItemEl() {
var dropdownEl = _reactDom2.default.findDOMNode(this.dropdown);
if (!dropdownEl) return;
var firstItemEl = dropdownEl.querySelector('.slds-is-selected > .react-slds-menuitem[tabIndex]') || dropdownEl.querySelector('.react-slds-menuitem[tabIndex]');
if (firstItemEl) {
firstItemEl.focus();
}
}
}, {
key: 'picklistButtonRef',
value: function picklistButtonRef(ref) {
this.picklistButton = ref;
}
}, {
key: 'dropdownRef',
value: function dropdownRef(ref) {
this.dropdown = ref;
}
}, {
key: 'renderPicklist',
value: function renderPicklist(props) {
var className = props.className,
id = props.id,
htmlAttributes = props.htmlAttributes,
buttonClassName = props.buttonClassName,
pprops = (0, _objectWithoutProperties3.default)(props, ['className', 'id', 'htmlAttributes', 'buttonClassName']);
delete pprops.initialValue;
delete pprops.onUpdate;
delete pprops.valid;
delete pprops.invalid;
delete pprops.dirty;
delete pprops.pristine;
delete pprops.active;
delete pprops.touched;
delete pprops.visited;
delete pprops.maxHeight;
delete pprops.onValueChange;
delete pprops.defaultOpened;
delete pprops.menuSize;
delete pprops.selectedText;
delete pprops.onBlur;
delete pprops.hasMore;
delete pprops.onScroll;
delete pprops.resetPageLoader;
delete pprops.pageStart;
delete pprops.useNone;
delete pprops.noneText;
delete pprops.align;
delete pprops.focusOnOpen;
delete pprops.onDropDownClick;
var picklistClassNames = (0, _classnames2.default)(className, 'slds-picklist');
return _react2.default.createElement(
'div',
{ className: picklistClassNames, 'aria-expanded': this.state.opened },
_react2.default.createElement(
'button',
(0, _extends3.default)({
id: id,
ref: this.picklistButtonRef,
className: (0, _classnames2.default)('slds-picklist__label slds-button slds-button--neutral', buttonClassName),
type: 'button',
'aria-haspopup': true,
onClick: this.onClick.bind(this),
onBlur: this.onBlur.bind(this),
onKeyDown: this.onKeydown.bind(this)
}, pprops),
_react2.default.createElement(
'span',
(0, _extends3.default)({ className: 'slds-truncate' }, htmlAttributes),
this.getSelectedItemLabel() || _react2.default.createElement(
'span',
null,
'\xA0'
)
),
_react2.default.createElement(_Icon2.default, { icon: 'down' })
)
);
}
}, {
key: 'renderNoneMenuItem',
value: function renderNoneMenuItem() {
var _props2 = this.props,
required = _props2.required,
noneText = _props2.noneText;
return _react2.default.createElement(PicklistItem, {
disabled: required,
value: null,
onBlur: this.onBlur.bind(this),
selected: this.getSelectedValue() === null,
label: noneText
});
}
}, {
key: 'renderDropdown',
value: function renderDropdown() {
var _props3 = this.props,
menuSize = _props3.menuSize,
children = _props3.children,
maxHeight = _props3.maxHeight,
hasMore = _props3.hasMore,
pageStart = _props3.pageStart,
resetPageLoader = _props3.resetPageLoader,
useNone = _props3.useNone,
align = _props3.align;
return this.state.opened ? _react2.default.createElement(
_DropdownMenu2.default,
{
ref: this.dropdownRef,
maxHeight: maxHeight,
size: menuSize,
onMenuItemClick: this.onPicklistItemClick.bind(this),
onMenuClose: this.onPicklistClose.bind(this),
hasMore: hasMore,
pageStart: pageStart,
resetPageLoader: resetPageLoader,
onScroll: this.onDropdownScroll.bind(this),
align: align,
onBlur: this.onBlur.bind(this)
},
useNone && this.renderNoneMenuItem(),
_react2.default.Children.map(children, this.renderPicklistItem.bind(this))
) : _react2.default.createElement('div', { ref: this.dropdownRef });
}
}, {
key: 'renderPicklistItem',
value: function renderPicklistItem(item) {
var selected = item.props.value === this.getSelectedValue();
var onBlur = this.onBlur.bind(this);
return _react2.default.cloneElement(item, { selected: selected, onBlur: onBlur });
}
}, {
key: 'render',
value: function render() {
var id = this.props.id || this.state.id;
var _props4 = this.props,
label = _props4.label,
required = _props4.required,
error = _props4.error,
totalCols = _props4.totalCols,
cols = _props4.cols,
tooltip = _props4.tooltip,
props = (0, _objectWithoutProperties3.default)(_props4, ['label', 'required', 'error', 'totalCols', 'cols', 'tooltip']);
var dropdown = this.renderDropdown();
var formElemProps = { id: id, label: label, required: required, error: error, totalCols: totalCols, cols: cols, dropdown: dropdown, tooltip: tooltip };
return _react2.default.createElement(
_FormElement2.default,
formElemProps,
this.renderPicklist((0, _extends3.default)({}, props, { id: id }))
);
}
}]);
return Picklist;
}(_react.Component);
exports.default = Picklist;
Picklist.defaultProps = {
maxHeight: 10,
focusOnOpen: true
};
Picklist.propTypes = {
id: _propTypes2.default.string,
className: _propTypes2.default.string,
label: _propTypes2.default.string,
required: _propTypes2.default.bool,
error: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.string, _propTypes2.default.shape({
message: _propTypes2.default.string
})]),
totalCols: _propTypes2.default.number,
cols: _propTypes2.default.number,
name: _propTypes2.default.string,
value: _propTypes2.default.any,
defaultValue: _propTypes2.default.any,
selectedText: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.node]),
defaultOpened: _propTypes2.default.bool,
onChange: _propTypes2.default.func,
onDropDownClick: _propTypes2.default.func,
onValueChange: _propTypes2.default.func,
onSelect: _propTypes2.default.func,
onComplete: _propTypes2.default.func,
onKeyDown: _propTypes2.default.func,
onBlur: _propTypes2.default.func,
menuSize: _propTypes2.default.string,
children: _propTypes2.default.node,
maxHeight: _propTypes2.default.oneOf([5, 7, 10]),
htmlAttributes: _propTypes2.default.object,
hasMore: _propTypes2.default.bool,
pageStart: _propTypes2.default.number,
resetPageLoader: _propTypes2.default.bool,
onScroll: _propTypes2.default.func,
useNone: _propTypes2.default.bool,
noneText: _propTypes2.default.string,
align: _propTypes2.default.oneOf(['left', 'center', 'right']),
focusOnOpen: _propTypes2.default.bool,
buttonClassName: _propTypes2.default.string,
tooltip: _propTypes2.default.element
};
Picklist.isFormElement = true;
var PicklistItem = function PicklistItem(_ref) {
var label = _ref.label,
selected = _ref.selected,
children = _ref.children,
props = (0, _objectWithoutProperties3.default)(_ref, ['label', 'selected', 'children']);
return _react2.default.createElement(
_DropdownMenu.DropdownMenuItem,
(0, _extends3.default)({
icon: selected ? 'check' : 'none',
role: 'menuitemradio',
selected: selected
}, props),
label || children
);
};
exports.PicklistItem = PicklistItem;
PicklistItem.propTypes = {
label: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),
selected: _propTypes2.default.bool,
value: _propTypes2.default.any,
children: _propTypes2.default.node
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL1BpY2tsaXN0LmpzIl0sIm5hbWVzIjpbIlBpY2tsaXN0IiwicHJvcHMiLCJzdGF0ZSIsImlkIiwib3BlbmVkIiwiZGVmYXVsdE9wZW5lZCIsInZhbHVlIiwiZGVmYXVsdFZhbHVlIiwicGlja2xpc3RCdXR0b25SZWYiLCJiaW5kIiwiZHJvcGRvd25SZWYiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJvblZhbHVlQ2hhbmdlIiwiZm9jdXNPbk9wZW4iLCJmb2N1c1RvVGFyZ2V0SXRlbUVsIiwiZSIsIm9uRHJvcERvd25DbGljayIsInNldFN0YXRlIiwiaXRlbSIsIm9uQ2hhbmdlIiwib25TZWxlY3QiLCJzZXRUaW1lb3V0Iiwib25Db21wbGV0ZSIsInBpY2tsaXN0QnV0dG9uRWwiLCJmaW5kRE9NTm9kZSIsInBpY2tsaXN0QnV0dG9uIiwiZm9jdXMiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImlzRm9jdXNlZEluQ29tcG9uZW50Iiwib25CbHVyIiwia2V5Q29kZSIsIm9uS2V5RG93biIsInBhZ2UiLCJvblNjcm9sbCIsInNlbGVjdGVkVmFsdWUiLCJnZXRTZWxlY3RlZFZhbHVlIiwic2VsZWN0ZWQiLCJDaGlsZHJlbiIsImZvckVhY2giLCJjaGlsZHJlbiIsImxhYmVsIiwic2VsZWN0ZWRUZXh0Iiwicm9vdEVsIiwidGFyZ2V0RWwiLCJkb2N1bWVudCIsImFjdGl2ZUVsZW1lbnQiLCJwYXJlbnROb2RlIiwiZHJvcGRvd25FbCIsImRyb3Bkb3duIiwiZmlyc3RJdGVtRWwiLCJxdWVyeVNlbGVjdG9yIiwicmVmIiwiY2xhc3NOYW1lIiwiaHRtbEF0dHJpYnV0ZXMiLCJidXR0b25DbGFzc05hbWUiLCJwcHJvcHMiLCJpbml0aWFsVmFsdWUiLCJvblVwZGF0ZSIsInZhbGlkIiwiaW52YWxpZCIsImRpcnR5IiwicHJpc3RpbmUiLCJhY3RpdmUiLCJ0b3VjaGVkIiwidmlzaXRlZCIsIm1heEhlaWdodCIsIm1lbnVTaXplIiwiaGFzTW9yZSIsInJlc2V0UGFnZUxvYWRlciIsInBhZ2VTdGFydCIsInVzZU5vbmUiLCJub25lVGV4dCIsImFsaWduIiwicGlja2xpc3RDbGFzc05hbWVzIiwib25DbGljayIsIm9uS2V5ZG93biIsImdldFNlbGVjdGVkSXRlbUxhYmVsIiwicmVxdWlyZWQiLCJvblBpY2tsaXN0SXRlbUNsaWNrIiwib25QaWNrbGlzdENsb3NlIiwib25Ecm9wZG93blNjcm9sbCIsInJlbmRlck5vbmVNZW51SXRlbSIsIm1hcCIsInJlbmRlclBpY2tsaXN0SXRlbSIsImNsb25lRWxlbWVudCIsImVycm9yIiwidG90YWxDb2xzIiwiY29scyIsInRvb2x0aXAiLCJyZW5kZXJEcm9wZG93biIsImZvcm1FbGVtUHJvcHMiLCJyZW5kZXJQaWNrbGlzdCIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsInN0cmluZyIsImJvb2wiLCJvbmVPZlR5cGUiLCJzaGFwZSIsIm1lc3NhZ2UiLCJudW1iZXIiLCJuYW1lIiwiYW55Iiwibm9kZSIsImZ1bmMiLCJvbmVPZiIsIm9iamVjdCIsImVsZW1lbnQiLCJpc0Zvcm1FbGVtZW50IiwiUGlja2xpc3RJdGVtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztJQUVxQkEsUTs7O0FBQ25CLG9CQUFZQyxLQUFaLEVBQW1CO0FBQUE7O0FBQUEsMElBQ1hBLEtBRFc7O0FBRWpCLFVBQUtDLEtBQUwsR0FBYTtBQUNYQyw0QkFBb0IscUJBRFQ7QUFFWEMsY0FBUUgsTUFBTUksYUFGSDtBQUdYQyxhQUFPTCxNQUFNTTtBQUhGLEtBQWI7QUFLQSxVQUFLQyxpQkFBTCxHQUF5QixNQUFLQSxpQkFBTCxDQUF1QkMsSUFBdkIsT0FBekI7QUFDQSxVQUFLQyxXQUFMLEdBQW1CLE1BQUtBLFdBQUwsQ0FBaUJELElBQWpCLE9BQW5C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L0QsWUFBVSxvQkFBVTJELElBRkc7QUFHdkIzRixTQUFPLG9CQUFVaUcsR0FITTtBQUl2QjlELFlBQVUsb0JBQVUrRDtBQUpHLENBQXpCIiwiZmlsZSI6IlBpY2tsaXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHV1aWQgZnJvbSAndXVpZCc7XG5pbXBvcnQgRm9ybUVsZW1lbnQgZnJvbSAnLi9Gb3JtRWxlbWVudCc7XG5pbXBvcnQgSWNvbiBmcm9tICcuL0ljb24nO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBEcm9wZG93bk1lbnUsIERyb3Bkb3duTWVudUl0ZW0gfSBmcm9tICcuL0Ryb3Bkb3duTWVudSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBpY2tsaXN0IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlkOiBgZm9ybS1lbGVtZW50LSR7dXVpZCgpfWAsXG4gICAgICBvcGVuZWQ6IHByb3BzLmRlZmF1bHRPcGVuZWQsXG4gICAgICB2YWx1ZTogcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgIH07XG4gICAgdGhpcy5waWNrbGlzdEJ1dHRvblJlZiA9IHRoaXMucGlja2xpc3RCdXR0b25SZWYuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyb3Bkb3duUmVmID0gdGhpcy5kcm9wZG93blJlZi5iaW5kKHRoaXMpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub25WYWx1ZUNoYW5nZSAmJiBwcmV2U3RhdGUudmFsdWUgIT09IHRoaXMuc3RhdGUudmFsdWUpIHtcbiAgICAgIHRoaXMucHJvcHMub25WYWx1ZUNoYW5nZSh0aGlzLnN0YXRlLnZhbHVlLCBwcmV2U3RhdGUudmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5mb2N1c09uT3BlbiAmJiBwcmV2U3RhdGUub3BlbmVkID09PSBmYWxzZSAmJiB0aGlzLnN0YXRlLm9wZW5lZCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5mb2N1c1RvVGFyZ2V0SXRlbUVsKCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGljayhlKSB7XG4gICAgY29uc3QgeyBvbkRyb3BEb3duQ2xpY2sgfSA9IHRoaXMucHJvcHM7XG4gICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUgPT4gKHsgb3BlbmVkOiAhc3RhdGUub3BlbmVkIH0pKSk7XG4gICAgaWYgKG9uRHJvcERvd25DbGljaykgb25Ecm9wRG93bkNsaWNrKGUpO1xuICB9XG5cbiAgb25QaWNrbGlzdEl0ZW1DbGljayhpdGVtLCBlKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiBpdGVtLnZhbHVlIH0pO1xuICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGUsIGl0ZW0udmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5vblNlbGVjdCkge1xuICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdChpdGVtKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbmVkOiBmYWxzZSB9KTtcbiAgICAgIGlmICh0aGlzLnByb3BzLm9uQ29tcGxldGUpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwaWNrbGlzdEJ1dHRvbkVsID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcy5waWNrbGlzdEJ1dHRvbik7XG4gICAgICBpZiAocGlja2xpc3RCdXR0b25FbCkge1xuICAgICAgICBwaWNrbGlzdEJ1dHRvbkVsLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSwgMjAwKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIG9uUGlja2xpc3RDbG9zZSgpIHtcbiAgICBjb25zdCBwaWNrbGlzdEJ1dHRvbkVsID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcy5waWNrbGlzdEJ1dHRvbik7XG4gICAgcGlja2xpc3RCdXR0b25FbC5mb2N1cygpO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuZWQ6IGZhbHNlIH0pO1xuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzRm9jdXNlZEluQ29tcG9uZW50KCkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogZmFsc2UgfSk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQmx1cikge1xuICAgICAgICAgIHRoaXMucHJvcHMub25CbHVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25Db21wbGV0ZSkge1xuICAgICAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgb25LZXlkb3duKGUpIHtcbiAgICBpZiAoZS5rZXlDb2RlID09PSA0MCkge1xuICAgICAgLy8gZG93blxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICghdGhpcy5zdGF0ZS5vcGVuZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogdHJ1ZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9jdXNUb1RhcmdldEl0ZW1FbCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSAyNykge1xuICAgICAgLy8gRVNDXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogZmFsc2UgfSk7XG4gICAgICBpZiAodGhpcy5wcm9wcy5vbkNvbXBsZXRlKSB7XG4gICAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5vbktleURvd24pIHtcbiAgICAgIHRoaXMucHJvcHMub25LZXlEb3duKGUpO1xuICAgIH1cbiAgfVxuXG4gIG9uRHJvcGRvd25TY3JvbGwocGFnZSkge1xuICAgIGlmICh0aGlzLnByb3BzLm9uU2Nyb2xsKSB7XG4gICAgICB0aGlzLnByb3BzLm9uU2Nyb2xsKHBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGdldFNlbGVjdGVkVmFsdWUoKSB7XG4gICAgY29uc3QgeyBkZWZhdWx0VmFsdWUsIHZhbHVlIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnXG4gICAgICA/IHZhbHVlXG4gICAgICA6IHR5cGVvZiB0aGlzLnN0YXRlLnZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHRoaXMuc3RhdGUudmFsdWUgOiBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBnZXRTZWxlY3RlZEl0ZW1MYWJlbCgpIHtcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gdGhpcy5nZXRTZWxlY3RlZFZhbHVlKCk7XG4gICAgbGV0IHNlbGVjdGVkID0gbnVsbDtcbiAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKHRoaXMucHJvcHMuY2hpbGRyZW4sIGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0ucHJvcHMudmFsdWUgPT09IHNlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBpdGVtLnByb3BzLmxhYmVsIHx8IGl0ZW0ucHJvcHMuY2hpbGRyZW47XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkIHx8IHRoaXMucHJvcHMuc2VsZWN0ZWRUZXh0O1xuICB9XG5cbiAgaXNGb2N1c2VkSW5Db21wb25lbnQoKSB7XG4gICAgY29uc3Qgcm9vdEVsID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcyk7XG4gICAgbGV0IHRhcmdldEVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICB3aGlsZSAodGFyZ2V0RWwgJiYgdGFyZ2V0RWwgIT09IHJvb3RFbCkge1xuICAgICAgdGFyZ2V0RWwgPSB0YXJnZXRFbC5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gISF0YXJnZXRFbDtcbiAgfVxuXG4gIGZvY3VzVG9UYXJnZXRJdGVtRWwoKSB7XG4gICAgY29uc3QgZHJvcGRvd25FbCA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMuZHJvcGRvd24pO1xuICAgIGlmICghZHJvcGRvd25FbCkgcmV0dXJuO1xuICAgIGNvbnN0IGZpcnN0SXRlbUVsID1cbiAgICAgIGRyb3Bkb3duRWwucXVlcnlTZWxlY3RvcignLnNsZHMtaXMtc2VsZWN0ZWQgPiAucmVhY3Qtc2xkcy1tZW51aXRlbVt0YWJJbmRleF0nKSB8fFxuICAgICAgZHJvcGRvd25FbC5xdWVyeVNlbGVjdG9yKCcucmVhY3Qtc2xkcy1tZW51aXRlbVt0YWJJbmRleF0nKTtcbiAgICBpZiAoZmlyc3RJdGVtRWwpIHtcbiAgICAgIGZpcnN0SXRlbUVsLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgcGlja2xpc3RCdXR0b25SZWYocmVmKSB7XG4gICAgdGhpcy5waWNrbGlzdEJ1dHRvbiA9IHJlZjtcbiAgfVxuXG4gIGRyb3Bkb3duUmVmKHJlZikge1xuICAgIHRoaXMuZHJvcGRvd24gPSByZWY7XG4gIH1cblxuICByZW5kZXJQaWNrbGlzdChwcm9wcykge1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lLCBpZCwgaHRtbEF0dHJpYnV0ZXMsIGJ1dHRvbkNsYXNzTmFtZSwgLi4ucHByb3BzIH0gPSBwcm9wcztcbiAgICBkZWxldGUgcHByb3BzLmluaXRpYWxWYWx1ZTtcbiAgICBkZWxldGUgcHByb3BzLm9uVXBkYXRlO1xuICAgIGRlbGV0ZSBwcHJvcHMudmFsaWQ7XG4gICAgZGVsZXRlIHBwcm9wcy5pbnZhbGlkO1xuICAgIGRlbGV0ZSBwcHJvcHMuZGlydHk7XG4gICAgZGVsZXRlIHBwcm9wcy5wcmlzdGluZTtcbiAgICBkZWxldGUgcHByb3BzLmFjdGl2ZTtcbiAgICBkZWxldGUgcHByb3BzLnRvdWNoZWQ7XG4gICAgZGVsZXRlIHBwcm9wcy52aXNpdGVkO1xuICAgIGRlbGV0ZSBwcHJvcHMubWF4SGVpZ2h0O1xuICAgIGRlbGV0ZSBwcHJvcHMub25WYWx1ZUNoYW5nZTtcbiAgICBkZWxldGUgcHByb3BzLmRlZmF1bHRPcGVuZWQ7XG4gICAgZGVsZXRlIHBwcm9wcy5tZW51U2l6ZTtcbiAgICBkZWxldGUgcHByb3BzLnNlbGVjdGVkVGV4dDtcbiAgICBkZWxldGUgcHByb3BzLm9uQmx1cjtcbiAgICBkZWxldGUgcHByb3BzLmhhc01vcmU7XG4gICAgZGVsZXRlIHBwcm9wcy5vblNjcm9sbDtcbiAgICBkZWxldGUgcHByb3BzLnJlc2V0UGFnZUxvYWRlcjtcbiAgICBkZWxldGUgcHByb3BzLnBhZ2VTdGFydDtcbiAgICBkZWxldGUgcHByb3BzLnVzZU5vbmU7XG4gICAgZGVsZXRlIHBwcm9wcy5ub25lVGV4dDtcbiAgICBkZWxldGUgcHByb3BzLmFsaWduO1xuICAgIGRlbGV0ZSBwcHJvcHMuZm9jdXNPbk9wZW47XG4gICAgZGVsZXRlIHBwcm9wcy5vbkRyb3BEb3duQ2xpY2s7XG4gICAgY29uc3QgcGlja2xpc3RDbGFzc05hbWVzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsICdzbGRzLXBpY2tsaXN0Jyk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtwaWNrbGlzdENsYXNzTmFtZXN9IGFyaWEtZXhwYW5kZWQ9e3RoaXMuc3RhdGUub3BlbmVkfT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGlkPXtpZH1cbiAgICAgICAgICByZWY9e3RoaXMucGlja2xpc3RCdXR0b25SZWZ9XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKCdzbGRzLXBpY2tsaXN0X19sYWJlbCBzbGRzLWJ1dHRvbiBzbGRzLWJ1dHRvbi0tbmV1dHJhbCcsXG4gICAgICAgICAgICBidXR0b25DbGFzc05hbWUpfVxuICAgICAgICAgIHR5cGU9J2J1dHRvbidcbiAgICAgICAgICBhcmlhLWhhc3BvcHVwXG4gICAgICAgICAgb25DbGljaz17dGhpcy5vbkNsaWNrLmJpbmQodGhpcyl9XG4gICAgICAgICAgb25CbHVyPXt0aGlzLm9uQmx1ci5iaW5kKHRoaXMpfVxuICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5vbktleWRvd24uYmluZCh0aGlzKX1cbiAgICAgICAgICB7Li4ucHByb3BzfVxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdzbGRzLXRydW5jYXRlJyB7Li4uaHRtbEF0dHJpYnV0ZXN9PlxuICAgICAgICAgICAge3RoaXMuZ2V0U2VsZWN0ZWRJdGVtTGFiZWwoKSB8fCA8c3Bhbj4mbmJzcDs8L3NwYW4+fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8SWNvbiBpY29uPSdkb3duJyAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICByZW5kZXJOb25lTWVudUl0ZW0oKSB7XG4gICAgY29uc3QgeyByZXF1aXJlZCwgbm9uZVRleHQgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxQaWNrbGlzdEl0ZW1cbiAgICAgICAgZGlzYWJsZWQ9e3JlcXVpcmVkfVxuICAgICAgICB2YWx1ZT17bnVsbH1cbiAgICAgICAgb25CbHVyPXt0aGlzLm9uQmx1ci5iaW5kKHRoaXMpfVxuICAgICAgICBzZWxlY3RlZD17dGhpcy5nZXRTZWxlY3RlZFZhbHVlKCkgPT09IG51bGx9XG4gICAgICAgIGxhYmVsPXtub25lVGV4dH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlckRyb3Bkb3duKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lbnVTaXplLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBtYXhIZWlnaHQsXG4gICAgICBoYXNNb3JlLFxuICAgICAgcGFnZVN0YXJ0LFxuICAgICAgcmVzZXRQYWdlTG9hZGVyLFxuICAgICAgdXNlTm9uZSxcbiAgICAgIGFsaWduLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiB0aGlzLnN0YXRlLm9wZW5lZCA/IChcbiAgICAgIDxEcm9wZG93bk1lbnVcbiAgICAgICAgcmVmPXt0aGlzLmRyb3Bkb3duUmVmfVxuICAgICAgICBtYXhIZWlnaHQ9e21heEhlaWdodH1cbiAgICAgICAgc2l6ZT17bWVudVNpemV9XG4gICAgICAgIG9uTWVudUl0ZW1DbGljaz17dGhpcy5vblBpY2tsaXN0SXRlbUNsaWNrLmJpbmQodGhpcyl9XG4gICAgICAgIG9uTWVudUNsb3NlPXt0aGlzLm9uUGlja2xpc3RDbG9zZS5iaW5kKHRoaXMpfVxuICAgICAgICBoYXNNb3JlPXtoYXNNb3JlfVxuICAgICAgICBwYWdlU3RhcnQ9e3BhZ2VTdGFydH1cbiAgICAgICAgcmVzZXRQYWdlTG9hZGVyPXtyZXNldFBhZ2VMb2FkZXJ9XG4gICAgICAgIG9uU2Nyb2xsPXt0aGlzLm9uRHJvcGRvd25TY3JvbGwuYmluZCh0aGlzKX1cbiAgICAgICAgYWxpZ249e2FsaWdufVxuICAgICAgICBvbkJsdXI9e3RoaXMub25CbHVyLmJpbmQodGhpcyl9XG4gICAgICA+XG4gICAgICAgIHt1c2VOb25lICYmIHRoaXMucmVuZGVyTm9uZU1lbnVJdGVtKCl9XG4gICAgICAgIHtSZWFjdC5DaGlsZHJlbi5tYXAoY2hpbGRyZW4sIHRoaXMucmVuZGVyUGlja2xpc3RJdGVtLmJpbmQodGhpcykpfVxuICAgICAgPC9Ecm9wZG93bk1lbnU+XG4gICAgKSA6IChcbiAgICAgIDxkaXYgcmVmPXt0aGlzLmRyb3Bkb3duUmVmfSAvPlxuICAgICk7XG4gIH1cblxuICByZW5kZXJQaWNrbGlzdEl0ZW0oaXRlbSkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gaXRlbS5wcm9wcy52YWx1ZSA9PT0gdGhpcy5nZXRTZWxlY3RlZFZhbHVlKCk7XG4gICAgY29uc3Qgb25CbHVyID0gdGhpcy5vbkJsdXIuYmluZCh0aGlzKTtcbiAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGl0ZW0sIHsgc2VsZWN0ZWQsIG9uQmx1ciB9KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBpZCA9IHRoaXMucHJvcHMuaWQgfHwgdGhpcy5zdGF0ZS5pZDtcbiAgICBjb25zdCB7IGxhYmVsLCByZXF1aXJlZCwgZXJyb3IsIHRvdGFsQ29scywgY29scywgdG9vbHRpcCwgLi4ucHJvcHMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZHJvcGRvd24gPSB0aGlzLnJlbmRlckRyb3Bkb3duKCk7XG4gICAgY29uc3QgZm9ybUVsZW1Qcm9wcyA9IHsgaWQsIGxhYmVsLCByZXF1aXJlZCwgZXJyb3IsIHRvdGFsQ29scywgY29scywgZHJvcGRvd24sIHRvb2x0aXAgfTtcbiAgICByZXR1cm4gPEZvcm1FbGVtZW50IHsuLi5mb3JtRWxlbVByb3BzfT57dGhpcy5yZW5kZXJQaWNrbGlzdCh7IC4uLnByb3BzLCBpZCB9KX08L0Zvcm1FbGVtZW50PjtcbiAgfVxufVxuUGlja2xpc3QuZGVmYXVsdFByb3BzID0ge1xuICBtYXhIZWlnaHQ6IDEwLFxuICBmb2N1c09uT3BlbjogdHJ1ZSxcbn07XG5cblBpY2tsaXN0LnByb3BUeXBlcyA9IHtcbiAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHJlcXVpcmVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgZXJyb3I6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFByb3BUeXBlcy5ib29sLFxuICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIG1lc3NhZ2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgfSksXG4gIF0pLFxuICB0b3RhbENvbHM6IFByb3BUeXBlcy5udW1iZXIsXG4gIGNvbHM6IFByb3BUeXBlcy5udW1iZXIsXG4gIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55LFxuICBkZWZhdWx0VmFsdWU6IFByb3BUeXBlcy5hbnksXG4gIHNlbGVjdGVkVGV4dDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm5vZGVdKSxcbiAgZGVmYXVsdE9wZW5lZDogUHJvcFR5cGVzLmJvb2wsXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Ecm9wRG93bkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25WYWx1ZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uU2VsZWN0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Db21wbGV0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uS2V5RG93bjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gIG1lbnVTaXplOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gIG1heEhlaWdodDogUHJvcFR5cGVzLm9uZU9mKFs1LCA3LCAxMF0pLFxuICBodG1sQXR0cmlidXRlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgaGFzTW9yZTogUHJvcFR5cGVzLmJvb2wsXG4gIHBhZ2VTdGFydDogUHJvcFR5cGVzLm51bWJlcixcbiAgcmVzZXRQYWdlTG9hZGVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgb25TY3JvbGw6IFByb3BUeXBlcy5mdW5jLFxuICB1c2VOb25lOiBQcm9wVHlwZXMuYm9vbCxcbiAgbm9uZVRleHQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGFsaWduOiBQcm9wVHlwZXMub25lT2YoWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCddKSxcbiAgZm9jdXNPbk9wZW46IFByb3BUeXBlcy5ib29sLFxuICBidXR0b25DbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHRvb2x0aXA6IFByb3BUeXBlcy5lbGVtZW50LFxufTtcblxuUGlja2xpc3QuaXNGb3JtRWxlbWVudCA9IHRydWU7XG5cbmV4cG9ydCBjb25zdCBQaWNrbGlzdEl0ZW0gPSAoeyBsYWJlbCwgc2VsZWN0ZWQsIGNoaWxkcmVuLCAuLi5wcm9wcyB9KSA9PiAoXG4gIDxEcm9wZG93bk1lbnVJdGVtXG4gICAgaWNvbj17c2VsZWN0ZWQgPyAnY2hlY2snIDogJ25vbmUnfVxuICAgIHJvbGU9J21lbnVpdGVtcmFkaW8nXG4gICAgc2VsZWN0ZWQ9e3NlbGVjdGVkfVxuICAgIHsuLi5wcm9wc31cbiAgPlxuICAgIHtsYWJlbCB8fCBjaGlsZHJlbn1cbiAgPC9Ecm9wZG93bk1lbnVJdGVtPlxuKTtcblxuUGlja2xpc3RJdGVtLnByb3BUeXBlcyA9IHtcbiAgbGFiZWw6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgc2VsZWN0ZWQ6IFByb3BUeXBlcy5ib29sLFxuICB2YWx1ZTogUHJvcFR5cGVzLmFueSxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxufTtcbiJdfQ==