@elastic/react-search-ui
Version:
A React library for building search experiences
278 lines (240 loc) • 32.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.SearchBoxContainer = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
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 _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = require("react");
var _reactSearchUiViews = require("@elastic/react-search-ui-views");
var _2 = require("..");
var _types = require("../types");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { keys.push.apply(keys, Object.getOwnPropertySymbols(object)); } if (enumerableOnly) keys = keys.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var SearchBoxContainer =
/*#__PURE__*/
function (_Component) {
(0, _inherits2.default)(SearchBoxContainer, _Component);
function SearchBoxContainer() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2.default)(this, SearchBoxContainer);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(SearchBoxContainer)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "state", {
isFocused: false
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleFocus", function () {
_this.setState({
isFocused: true
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleBlur", function () {
_this.setState({
isFocused: false
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "completeSuggestion", function (searchTerm) {
var _this$props = _this.props,
shouldClearFilters = _this$props.shouldClearFilters,
setSearchTerm = _this$props.setSearchTerm;
setSearchTerm(searchTerm, {
shouldClearFilters: shouldClearFilters
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleSubmit", function (e) {
var _this$props2 = _this.props,
shouldClearFilters = _this$props2.shouldClearFilters,
searchTerm = _this$props2.searchTerm,
setSearchTerm = _this$props2.setSearchTerm;
e.preventDefault();
setSearchTerm(searchTerm, {
shouldClearFilters: shouldClearFilters
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleChange", function (value) {
var _this$props3 = _this.props,
autocompleteMinimumCharacters = _this$props3.autocompleteMinimumCharacters,
autocompleteResults = _this$props3.autocompleteResults,
autocompleteSuggestions = _this$props3.autocompleteSuggestions,
shouldClearFilters = _this$props3.shouldClearFilters,
searchAsYouType = _this$props3.searchAsYouType,
setSearchTerm = _this$props3.setSearchTerm,
debounceLength = _this$props3.debounceLength;
var options = _objectSpread({
autocompleteMinimumCharacters: autocompleteMinimumCharacters
}, (autocompleteResults || autocompleteSuggestions || searchAsYouType) && {
debounce: debounceLength || 200
}, {
shouldClearFilters: shouldClearFilters,
refresh: !!searchAsYouType,
autocompleteResults: !!autocompleteResults,
autocompleteSuggestions: !!autocompleteSuggestions
});
setSearchTerm(value, options);
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleNotifyAutocompleteSelected", function (selection) {
var _this$props4 = _this.props,
autocompleteResults = _this$props4.autocompleteResults,
trackAutocompleteClickThrough = _this$props4.trackAutocompleteClickThrough; // Because suggestions don't count as clickthroughs, only
// results
if (autocompleteResults && autocompleteResults.shouldTrackClickThrough !== false && !selection.suggestion) {
var _autocompleteResults$ = autocompleteResults.clickThroughTags,
clickThroughTags = _autocompleteResults$ === void 0 ? [] : _autocompleteResults$;
var id = selection.id.raw;
trackAutocompleteClickThrough(id, clickThroughTags);
}
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "defaultOnSelectAutocomplete", function (selection) {
var autocompleteResults = _this.props.autocompleteResults;
_this.handleNotifyAutocompleteSelected(selection);
if (!selection.suggestion) {
var url = selection[autocompleteResults.urlField] ? selection[autocompleteResults.urlField].raw : "";
if (url) {
var target = autocompleteResults.linkTarget || "_self";
window.open(url, target);
}
} else {
_this.completeSuggestion(selection.suggestion);
}
});
return _this;
}
(0, _createClass2.default)(SearchBoxContainer, [{
key: "render",
value: function render() {
var _this2 = this;
var isFocused = this.state.isFocused;
var _this$props5 = this.props,
autocompleteMinimumCharacters = _this$props5.autocompleteMinimumCharacters,
autocompleteResults = _this$props5.autocompleteResults,
autocompleteSuggestions = _this$props5.autocompleteSuggestions,
autocompletedResults = _this$props5.autocompletedResults,
autocompletedSuggestions = _this$props5.autocompletedSuggestions,
className = _this$props5.className,
autocompleteView = _this$props5.autocompleteView,
inputProps = _this$props5.inputProps,
inputView = _this$props5.inputView,
onSelectAutocomplete = _this$props5.onSelectAutocomplete,
onSubmit = _this$props5.onSubmit,
searchTerm = _this$props5.searchTerm,
view = _this$props5.view,
rest = (0, _objectWithoutProperties2.default)(_this$props5, ["autocompleteMinimumCharacters", "autocompleteResults", "autocompleteSuggestions", "autocompletedResults", "autocompletedSuggestions", "className", "autocompleteView", "inputProps", "inputView", "onSelectAutocomplete", "onSubmit", "searchTerm", "view"]);
var View = view || _reactSearchUiViews.SearchBox;
var useAutocomplete = (!!autocompleteResults || !!autocompleteSuggestions) && searchTerm.length >= autocompleteMinimumCharacters;
var autocompletedSuggestionsCount = Object.entries(autocompletedSuggestions // eslint-disable-next-line no-unused-vars
).reduce(function (acc, _ref) {
var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
_ = _ref2[0],
value = _ref2[1];
return acc + value.length;
}, 0);
var allAutocompletedItemsCount = autocompletedSuggestionsCount + autocompletedResults.length;
var handleOnSelectAutocomplete;
if (onSelectAutocomplete) {
handleOnSelectAutocomplete = function handleOnSelectAutocomplete(selection) {
onSelectAutocomplete(selection, {
notifyAutocompleteSelected: _this2.handleNotifyAutocompleteSelected,
completeSuggestion: _this2.completeSuggestion,
autocompleteResults: _this2.props.autocompleteResults
}, _this2.defaultOnSelectAutocomplete);
};
}
return View(_objectSpread({
allAutocompletedItemsCount: allAutocompletedItemsCount,
autocompleteView: autocompleteView,
autocompleteResults: autocompleteResults,
autocompleteSuggestions: autocompleteSuggestions,
autocompletedResults: autocompletedResults,
autocompletedSuggestions: autocompletedSuggestions,
className: className,
autocompletedSuggestionsCount: autocompletedSuggestionsCount,
completeSuggestion: this.completeSuggestion,
isFocused: isFocused,
notifyAutocompleteSelected: this.handleNotifyAutocompleteSelected,
onChange: function onChange(value) {
return _this2.handleChange(value);
},
onSelectAutocomplete: handleOnSelectAutocomplete || this.defaultOnSelectAutocomplete,
onSubmit: onSubmit ? function (e) {
e.preventDefault();
onSubmit(searchTerm);
} : this.handleSubmit,
useAutocomplete: useAutocomplete,
value: searchTerm,
inputProps: _objectSpread({
onFocus: this.handleFocus,
onBlur: this.handleBlur
}, inputProps),
inputView: inputView
}, rest));
}
}]);
return SearchBoxContainer;
}(_react.Component);
exports.SearchBoxContainer = SearchBoxContainer;
(0, _defineProperty2.default)(SearchBoxContainer, "propTypes", {
// Props
autocompleteMinimumCharacters: _propTypes.default.number,
autocompleteResults: _propTypes.default.oneOfType([_propTypes.default.bool, _propTypes.default.shape({
clickThroughTags: _propTypes.default.arrayOf(_propTypes.default.string),
linkTarget: _propTypes.default.string,
sectionTitle: _propTypes.default.string,
shouldTrackClickThrough: _propTypes.default.bool,
titleField: _propTypes.default.string.isRequired,
urlField: _propTypes.default.string.isRequired
})]),
autocompleteSuggestions: _propTypes.default.oneOfType([_propTypes.default.bool, _propTypes.default.exact({
sectionTitle: _propTypes.default.string
}), _propTypes.default.objectOf(_propTypes.default.exact({
sectionTitle: _propTypes.default.string
}))]),
autocompleteView: _propTypes.default.func,
className: _propTypes.default.string,
shouldClearFilters: _propTypes.default.bool,
debounceLength: _propTypes.default.number,
inputProps: _propTypes.default.object,
inputView: _propTypes.default.func,
onSelectAutocomplete: _propTypes.default.func,
onSubmit: _propTypes.default.func,
searchAsYouType: _propTypes.default.bool,
view: _propTypes.default.func,
// State
autocompletedResults: _propTypes.default.arrayOf(_types.Result).isRequired,
autocompletedSuggestions: _propTypes.default.objectOf(_propTypes.default.arrayOf(_types.Suggestion)).isRequired,
searchTerm: _propTypes.default.string.isRequired,
// Actions
setSearchTerm: _propTypes.default.func.isRequired,
trackAutocompleteClickThrough: _propTypes.default.func.isRequired
});
(0, _defineProperty2.default)(SearchBoxContainer, "defaultProps", {
autocompleteMinimumCharacters: 0,
shouldClearFilters: true
});
var _default = (0, _2.withSearch)(function (_ref3) {
var autocompletedResults = _ref3.autocompletedResults,
autocompletedSuggestions = _ref3.autocompletedSuggestions,
searchTerm = _ref3.searchTerm,
setSearchTerm = _ref3.setSearchTerm,
trackAutocompleteClickThrough = _ref3.trackAutocompleteClickThrough;
return {
autocompletedResults: autocompletedResults,
autocompletedSuggestions: autocompletedSuggestions,
searchTerm: searchTerm,
setSearchTerm: setSearchTerm,
trackAutocompleteClickThrough: trackAutocompleteClickThrough
};
})(SearchBoxContainer);
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250YWluZXJzL1NlYXJjaEJveC5qcyJdLCJuYW1lcyI6WyJTZWFyY2hCb3hDb250YWluZXIiLCJpc0ZvY3VzZWQiLCJzZXRTdGF0ZSIsInNlYXJjaFRlcm0iLCJwcm9wcyIsInNob3VsZENsZWFyRmlsdGVycyIsInNldFNlYXJjaFRlcm0iLCJlIiwicHJldmVudERlZmF1bHQiLCJ2YWx1ZSIsImF1dG9jb21wbGV0ZU1pbmltdW1DaGFyYWN0ZXJzIiwiYXV0b2NvbXBsZXRlUmVzdWx0cyIsImF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25zIiwic2VhcmNoQXNZb3VUeXBlIiwiZGVib3VuY2VMZW5ndGgiLCJvcHRpb25zIiwiZGVib3VuY2UiLCJyZWZyZXNoIiwic2VsZWN0aW9uIiwidHJhY2tBdXRvY29tcGxldGVDbGlja1Rocm91Z2giLCJzaG91bGRUcmFja0NsaWNrVGhyb3VnaCIsInN1Z2dlc3Rpb24iLCJjbGlja1Rocm91Z2hUYWdzIiwiaWQiLCJyYXciLCJoYW5kbGVOb3RpZnlBdXRvY29tcGxldGVTZWxlY3RlZCIsInVybCIsInVybEZpZWxkIiwidGFyZ2V0IiwibGlua1RhcmdldCIsIndpbmRvdyIsIm9wZW4iLCJjb21wbGV0ZVN1Z2dlc3Rpb24iLCJzdGF0ZSIsImF1dG9jb21wbGV0ZWRSZXN1bHRzIiwiYXV0b2NvbXBsZXRlZFN1Z2dlc3Rpb25zIiwiY2xhc3NOYW1lIiwiYXV0b2NvbXBsZXRlVmlldyIsImlucHV0UHJvcHMiLCJpbnB1dFZpZXciLCJvblNlbGVjdEF1dG9jb21wbGV0ZSIsIm9uU3VibWl0IiwidmlldyIsInJlc3QiLCJWaWV3IiwiU2VhcmNoQm94IiwidXNlQXV0b2NvbXBsZXRlIiwibGVuZ3RoIiwiYXV0b2NvbXBsZXRlZFN1Z2dlc3Rpb25zQ291bnQiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiXyIsImFsbEF1dG9jb21wbGV0ZWRJdGVtc0NvdW50IiwiaGFuZGxlT25TZWxlY3RBdXRvY29tcGxldGUiLCJub3RpZnlBdXRvY29tcGxldGVTZWxlY3RlZCIsImRlZmF1bHRPblNlbGVjdEF1dG9jb21wbGV0ZSIsIm9uQ2hhbmdlIiwiaGFuZGxlQ2hhbmdlIiwiaGFuZGxlU3VibWl0Iiwib25Gb2N1cyIsImhhbmRsZUZvY3VzIiwib25CbHVyIiwiaGFuZGxlQmx1ciIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsIm51bWJlciIsIm9uZU9mVHlwZSIsImJvb2wiLCJzaGFwZSIsImFycmF5T2YiLCJzdHJpbmciLCJzZWN0aW9uVGl0bGUiLCJ0aXRsZUZpZWxkIiwiaXNSZXF1aXJlZCIsImV4YWN0Iiwib2JqZWN0T2YiLCJmdW5jIiwib2JqZWN0IiwiUmVzdWx0IiwiU3VnZ2VzdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7OztJQUVhQSxrQjs7Ozs7Ozs7Ozs7Ozs7Ozs7d0ZBbURIO0FBQ05DLE1BQUFBLFNBQVMsRUFBRTtBQURMLEs7OEZBSU0sWUFBTTtBQUNsQixZQUFLQyxRQUFMLENBQWM7QUFDWkQsUUFBQUEsU0FBUyxFQUFFO0FBREMsT0FBZDtBQUdELEs7NkZBRVksWUFBTTtBQUNqQixZQUFLQyxRQUFMLENBQWM7QUFDWkQsUUFBQUEsU0FBUyxFQUFFO0FBREMsT0FBZDtBQUdELEs7cUdBRW9CLFVBQUFFLFVBQVUsRUFBSTtBQUFBLHdCQUNhLE1BQUtDLEtBRGxCO0FBQUEsVUFDekJDLGtCQUR5QixlQUN6QkEsa0JBRHlCO0FBQUEsVUFDTEMsYUFESyxlQUNMQSxhQURLO0FBRWpDQSxNQUFBQSxhQUFhLENBQUNILFVBQUQsRUFBYTtBQUN4QkUsUUFBQUEsa0JBQWtCLEVBQWxCQTtBQUR3QixPQUFiLENBQWI7QUFHRCxLOytGQUVjLFVBQUFFLENBQUMsRUFBSTtBQUFBLHlCQUN3QyxNQUFLSCxLQUQ3QztBQUFBLFVBQ1ZDLGtCQURVLGdCQUNWQSxrQkFEVTtBQUFBLFVBQ1VGLFVBRFYsZ0JBQ1VBLFVB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LDZCQUxGO0FBQUEsU0FNTztBQUNMZSxJQUFBQSxvQkFBb0IsRUFBcEJBLG9CQURLO0FBRUxDLElBQUFBLHdCQUF3QixFQUF4QkEsd0JBRks7QUFHTGhDLElBQUFBLFVBQVUsRUFBVkEsVUFISztBQUlMRyxJQUFBQSxhQUFhLEVBQWJBLGFBSks7QUFLTGEsSUFBQUEsNkJBQTZCLEVBQTdCQTtBQUxLLEdBTlA7QUFBQSxDQURhLEVBY2JuQixrQkFkYSxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTZWFyY2hCb3ggfSBmcm9tIFwiQGVsYXN0aWMvcmVhY3Qtc2VhcmNoLXVpLXZpZXdzXCI7XG5cbmltcG9ydCB7IHdpdGhTZWFyY2ggfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IFJlc3VsdCwgU3VnZ2VzdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgU2VhcmNoQm94Q29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAvLyBQcm9wc1xuICAgIGF1dG9jb21wbGV0ZU1pbmltdW1DaGFyYWN0ZXJzOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGF1dG9jb21wbGV0ZVJlc3VsdHM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgUHJvcFR5cGVzLmJvb2wsXG4gICAgICBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICBjbGlja1Rocm91Z2hUYWdzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSxcbiAgICAgICAgbGlua1RhcmdldDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgc2VjdGlvblRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICBzaG91bGRUcmFja0NsaWNrVGhyb3VnaDogUHJvcFR5cGVzLmJvb2wsXG4gICAgICAgIHRpdGxlRmllbGQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgICAgdXJsRmllbGQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxuICAgICAgfSlcbiAgICBdKSxcbiAgICBhdXRvY29tcGxldGVTdWdnZXN0aW9uczogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIFByb3BUeXBlcy5leGFjdCh7XG4gICAgICAgIHNlY3Rpb25UaXRsZTogUHJvcFR5cGVzLnN0cmluZ1xuICAgICAgfSksXG4gICAgICBQcm9wVHlwZXMub2JqZWN0T2YoXG4gICAgICAgIFByb3BUeXBlcy5leGFjdCh7XG4gICAgICAgICAgc2VjdGlvblRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgXSksXG4gICAgYXV0b2NvbXBsZXRlVmlldzogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHNob3VsZENsZWFyRmlsdGVyczogUHJvcFR5cGVzLmJvb2wsXG4gICAgZGVib3VuY2VMZW5ndGg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgaW5wdXRQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBpbnB1dFZpZXc6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uU2VsZWN0QXV0b2NvbXBsZXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvblN1Ym1pdDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgc2VhcmNoQXNZb3VUeXBlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICB2aWV3OiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvLyBTdGF0ZVxuICAgIGF1dG9jb21wbGV0ZWRSZXN1bHRzOiBQcm9wVHlwZXMuYXJyYXlPZihSZXN1bHQpLmlzUmVxdWlyZWQsXG4gICAgYXV0b2NvbXBsZXRlZFN1Z2dlc3Rpb25zOiBQcm9wVHlwZXMub2JqZWN0T2YoUHJvcFR5cGVzLmFycmF5T2YoU3VnZ2VzdGlvbikpXG4gICAgICAuaXNSZXF1aXJlZCxcbiAgICBzZWFyY2hUZXJtOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLy8gQWN0aW9uc1xuICAgIHNldFNlYXJjaFRlcm06IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgdHJhY2tBdXRvY29tcGxldGVDbGlja1Rocm91Z2g6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgfTtcblxuICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIGF1dG9jb21wbGV0ZU1pbmltdW1DaGFyYWN0ZXJzOiAwLFxuICAgIHNob3VsZENsZWFyRmlsdGVyczogdHJ1ZVxuICB9O1xuXG4gIHN0YXRlID0ge1xuICAgIGlzRm9jdXNlZDogZmFsc2VcbiAgfTtcblxuICBoYW5kbGVGb2N1cyA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzRm9jdXNlZDogdHJ1ZVxuICAgIH0pO1xuICB9O1xuXG4gIGhhbmRsZUJsdXIgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpc0ZvY3VzZWQ6IGZhbHNlXG4gICAgfSk7XG4gIH07XG5cbiAgY29tcGxldGVTdWdnZXN0aW9uID0gc2VhcmNoVGVybSA9PiB7XG4gICAgY29uc3QgeyBzaG91bGRDbGVhckZpbHRlcnMsIHNldFNlYXJjaFRlcm0gfSA9IHRoaXMucHJvcHM7XG4gICAgc2V0U2VhcmNoVGVybShzZWFyY2hUZXJtLCB7XG4gICAgICBzaG91bGRDbGVhckZpbHRlcnNcbiAgICB9KTtcbiAgfTtcblxuICBoYW5kbGVTdWJtaXQgPSBlID0+IHtcbiAgICBjb25zdCB7IHNob3VsZENsZWFyRmlsdGVycywgc2VhcmNoVGVybSwgc2V0U2VhcmNoVGVybSB9ID0gdGhpcy5wcm9wcztcblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBzZXRTZWFyY2hUZXJtKHNlYXJjaFRlcm0sIHtcbiAgICAgIHNob3VsZENsZWFyRmlsdGVyc1xuICAgIH0pO1xuICB9O1xuXG4gIGhhbmRsZUNoYW5nZSA9IHZhbHVlID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBhdXRvY29tcGxldGVNaW5pbXVtQ2hhcmFjdGVycyxcbiAgICAgIGF1dG9jb21wbGV0ZVJlc3VsdHMsXG4gICAgICBhdXRvY29tcGxldGVTdWdnZXN0aW9ucyxcbiAgICAgIHNob3VsZENsZWFyRmlsdGVycyxcbiAgICAgIHNlYXJjaEFzWW91VHlwZSxcbiAgICAgIHNldFNlYXJjaFRlcm0sXG4gICAgICBkZWJvdW5jZUxlbmd0aFxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGF1dG9jb21wbGV0ZU1pbmltdW1DaGFyYWN0ZXJzLFxuICAgICAgLi4uKChhdXRvY29tcGxldGVSZXN1bHRzIHx8XG4gICAgICAgIGF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25zIHx8XG4gICAgICAgIHNlYXJjaEFzWW91VHlwZSkgJiYge1xuICAgICAgICBkZWJvdW5jZTogZGVib3VuY2VMZW5ndGggfHwgMjAwXG4gICAgICB9KSxcbiAgICAgIHNob3VsZENsZWFyRmlsdGVycyxcbiAgICAgIHJlZnJlc2g6ICEhc2VhcmNoQXNZb3VUeXBlLFxuICAgICAgYXV0b2NvbXBsZXRlUmVzdWx0czogISFhdXRvY29tcGxldGVSZXN1bHRzLFxuICAgICAgYXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnM6ICEhYXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnNcbiAgICB9O1xuXG4gICAgc2V0U2VhcmNoVGVybSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH07XG5cbiAgaGFuZGxlTm90aWZ5QXV0b2NvbXBsZXRlU2VsZWN0ZWQgPSBzZWxlY3Rpb24gPT4ge1xuICAgIGNvbnN0IHsgYXV0b2NvbXBsZXRlUmVzdWx0cywgdHJhY2tBdXRvY29tcGxldGVDbGlja1Rocm91Z2ggfSA9IHRoaXMucHJvcHM7XG4gICAgLy8gQmVjYXVzZSBzdWdnZXN0aW9ucyBkb24ndCBjb3VudCBhcyBjbGlja3Rocm91Z2hzLCBvbmx5XG4gICAgLy8gcmVzdWx0c1xuICAgIGlmIChcbiAgICAgIGF1dG9jb21wbGV0ZVJlc3VsdHMgJiZcbiAgICAgIGF1dG9jb21wbGV0ZVJlc3VsdHMuc2hvdWxkVHJhY2tDbGlja1Rocm91Z2ggIT09IGZhbHNlICYmXG4gICAgICAhc2VsZWN0aW9uLnN1Z2dlc3Rpb25cbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2xpY2tUaHJvdWdoVGFncyA9IFtdIH0gPSBhdXRvY29tcGxldGVSZXN1bHRzO1xuICAgICAgY29uc3QgaWQgPSBzZWxlY3Rpb24uaWQucmF3O1xuICAgICAgdHJhY2tBdXRvY29tcGxldGVDbGlja1Rocm91Z2goaWQsIGNsaWNrVGhyb3VnaFRhZ3MpO1xuICAgIH1cbiAgfTtcblxuICBkZWZhdWx0T25TZWxlY3RBdXRvY29tcGxldGUgPSBzZWxlY3Rpb24gPT4ge1xuICAgIGNvbnN0IHsgYXV0b2NvbXBsZXRlUmVzdWx0cyB9ID0gdGhpcy5wcm9wcztcblxuICAgIHRoaXMuaGFuZGxlTm90aWZ5QXV0b2NvbXBsZXRlU2VsZWN0ZWQoc2VsZWN0aW9uKTtcbiAgICBpZiAoIXNlbGVjdGlvbi5zdWdnZXN0aW9uKSB7XG4gICAgICBjb25zdCB1cmwgPSBzZWxlY3Rpb25bYXV0b2NvbXBsZXRlUmVzdWx0cy51cmxGaWVsZF1cbiAgICAgICAgPyBzZWxlY3Rpb25bYXV0b2NvbXBsZXRlUmVzdWx0cy51cmxGaWVsZF0ucmF3XG4gICAgICAgIDogXCJcIjtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gYXV0b2NvbXBsZXRlUmVzdWx0cy5saW5rVGFyZ2V0IHx8IFwiX3NlbGZcIjtcbiAgICAgICAgd2luZG93Lm9wZW4odXJsLCB0YXJnZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbXBsZXRlU3VnZ2VzdGlvbihzZWxlY3Rpb24uc3VnZ2VzdGlvbik7XG4gICAgfVxuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGlzRm9jdXNlZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7XG4gICAgICBhdXRvY29tcGxldGVNaW5pbXVtQ2hhcmFjdGVycyxcbiAgICAgIGF1dG9jb21wbGV0ZVJlc3VsdHMsXG4gICAgICBhdXRvY29tcGxldGVTdWdnZXN0aW9ucyxcbiAgICAgIGF1dG9jb21wbGV0ZWRSZXN1bHRzLFxuICAgICAgYXV0b2NvbXBsZXRlZFN1Z2dlc3Rpb25zLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgYXV0b2NvbXBsZXRlVmlldyxcbiAgICAgIGlucHV0UHJvcHMsXG4gICAgICBpbnB1dFZpZXcsXG4gICAgICBvblNlbGVjdEF1dG9jb21wbGV0ZSxcbiAgICAgIG9uU3VibWl0LFxuICAgICAgc2VhcmNoVGVybSxcbiAgICAgIHZpZXcsXG4gICAgICAuLi5yZXN0XG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBWaWV3ID0gdmlldyB8fCBTZWFyY2hCb3g7XG4gICAgY29uc3QgdXNlQXV0b2NvbXBsZXRlID1cbiAgICAgICghIWF1dG9jb21wbGV0ZVJlc3VsdHMgfHwgISFhdXRvY29tcGxldGVTdWdnZXN0aW9ucykgJiZcbiAgICAgIHNlYXJjaFRlcm0ubGVuZ3RoID49IGF1dG9jb21wbGV0ZU1pbmltdW1DaGFyYWN0ZXJzO1xuICAgIGNvbnN0IGF1dG9jb21wbGV0ZWRTdWdnZXN0aW9uc0NvdW50ID0gT2JqZWN0LmVudHJpZXMoXG4gICAgICBhdXRvY29tcGxldGVkU3VnZ2VzdGlvbnNcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICkucmVkdWNlKChhY2MsIFtfLCB2YWx1ZV0pID0+IGFjYyArIHZhbHVlLmxlbmd0aCwgMCk7XG4gICAgY29uc3QgYWxsQXV0b2NvbXBsZXRlZEl0ZW1zQ291bnQgPVxuICAgICAgYXV0b2NvbXBsZXRlZFN1Z2dlc3Rpb25zQ291bnQgKyBhdXRvY29tcGxldGVkUmVzdWx0cy5sZW5ndGg7XG5cbiAgICBsZXQgaGFuZGxlT25TZWxlY3RBdXRvY29tcGxldGU7XG4gICAgaWYgKG9uU2VsZWN0QXV0b2NvbXBsZXRlKSB7XG4gICAgICBoYW5kbGVPblNlbGVjdEF1dG9jb21wbGV0ZSA9IHNlbGVjdGlvbiA9PiB7XG4gICAgICAgIG9uU2VsZWN0QXV0b2NvbXBsZXRlKFxuICAgICAgICAgIHNlbGVjdGlvbixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBub3RpZnlBdXRvY29tcGxldGVTZWxlY3RlZDogdGhpcy5oYW5kbGVOb3RpZnlBdXRvY29tcGxldGVTZWxlY3RlZCxcbiAgICAgICAgICAgIGNvbXBsZXRlU3VnZ2VzdGlvbjogdGhpcy5jb21wbGV0ZVN1Z2dlc3Rpb24sXG4gICAgICAgICAgICBhdXRvY29tcGxldGVSZXN1bHRzOiB0aGlzLnByb3BzLmF1dG9jb21wbGV0ZVJlc3VsdHNcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuZGVmYXVsdE9uU2VsZWN0QXV0b2NvbXBsZXRlXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBWaWV3KHtcbiAgICAgIGFsbEF1dG9jb21wbGV0ZWRJdGVtc0NvdW50OiBhbGxBdXRvY29tcGxldGVkSXRlbXNDb3VudCxcbiAgICAgIGF1dG9jb21wbGV0ZVZpZXcsXG4gICAgICBhdXRvY29tcGxldGVSZXN1bHRzOiBhdXRvY29tcGxldGVSZXN1bHRzLFxuICAgICAgYXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnM6IGF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25zLFxuICAgICAgYXV0b2NvbXBsZXRlZFJlc3VsdHM6IGF1dG9jb21wbGV0ZWRSZXN1bHRzLFxuICAgICAgYXV0b2NvbXBsZXRlZFN1Z2dlc3Rpb25zOiBhdXRvY29tcGxldGVkU3VnZ2VzdGlvbnMsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBhdXRvY29tcGxldGVkU3VnZ2VzdGlvbnNDb3VudDogYXV0b2NvbXBsZXRlZFN1Z2dlc3Rpb25zQ291bnQsXG4gICAgICBjb21wbGV0ZVN1Z2dlc3Rpb246IHRoaXMuY29tcGxldGVTdWdnZXN0aW9uLFxuICAgICAgaXNGb2N1c2VkOiBpc0ZvY3VzZWQsXG4gICAgICBub3RpZnlBdXRvY29tcGxldGVTZWxlY3RlZDogdGhpcy5oYW5kbGVOb3RpZnlBdXRvY29tcGxldGVTZWxlY3RlZCxcbiAgICAgIG9uQ2hhbmdlOiB2YWx1ZSA9PiB0aGlzLmhhbmRsZUNoYW5nZSh2YWx1ZSksXG4gICAgICBvblNlbGVjdEF1dG9jb21wbGV0ZTpcbiAgICAgICAgaGFuZGxlT25TZWxlY3RBdXRvY29tcGxldGUgfHwgdGhpcy5kZWZhdWx0T25TZWxlY3RBdXRvY29tcGxldGUsXG4gICAgICBvblN1Ym1pdDogb25TdWJtaXRcbiAgICAgICAgPyBlID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIG9uU3VibWl0KHNlYXJjaFRlcm0pO1xuICAgICAgICAgIH1cbiAgICAgICAgOiB0aGlzLmhhbmRsZVN1Ym1pdCxcbiAgICAgIHVzZUF1dG9jb21wbGV0ZTogdXNlQXV0b2NvbXBsZXRlLFxuICAgICAgdmFsdWU6IHNlYXJjaFRlcm0sXG4gICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgIG9uRm9jdXM6IHRoaXMuaGFuZGxlRm9jdXMsXG4gICAgICAgIG9uQmx1cjogdGhpcy5oYW5kbGVCbHVyLFxuICAgICAgICAuLi5pbnB1dFByb3BzXG4gICAgICB9LFxuICAgICAgaW5wdXRWaWV3LFxuICAgICAgLi4ucmVzdFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTZWFyY2goXG4gICh7XG4gICAgYXV0b2NvbXBsZXRlZFJlc3VsdHMsXG4gICAgYXV0b2NvbXBsZXRlZFN1Z2dlc3Rpb25zLFxuICAgIHNlYXJjaFRlcm0sXG4gICAgc2V0U2VhcmNoVGVybSxcbiAgICB0cmFja0F1dG9jb21wbGV0ZUNsaWNrVGhyb3VnaFxuICB9KSA9PiAoe1xuICAgIGF1dG9jb21wbGV0ZWRSZXN1bHRzLFxuICAgIGF1dG9jb21wbGV0ZWRTdWdnZXN0aW9ucyxcbiAgICBzZWFyY2hUZXJtLFxuICAgIHNldFNlYXJjaFRlcm0sXG4gICAgdHJhY2tBdXRvY29tcGxldGVDbGlja1Rocm91Z2hcbiAgfSlcbikoU2VhcmNoQm94Q29udGFpbmVyKTtcbiJdfQ==