kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
303 lines (301 loc) • 48.5 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.SaveExportDropdownFactory = exports.PanelHeaderDropdownFactory = exports.PanelAction = exports.CloudStorageDropdownFactory = void 0;
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 _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _classnames = _interopRequireDefault(require("classnames"));
var _reselect = require("reselect");
var _styledComponents2 = require("../common/styled-components");
var _logo = _interopRequireDefault(require("../common/logo"));
var _icons = require("../common/icons");
var _toolbar = _interopRequireDefault(require("../common/toolbar"));
var _toolbarItem = _interopRequireDefault(require("../common/toolbar-item"));
var _localization = require("@kepler.gl/localization");
var _useOnClickOutside = _interopRequireDefault(require("../hooks/use-on-click-outside"));
var _excluded = ["items"],
_excluded2 = ["items"],
_excluded3 = ["appName", "appWebsite", "version", "actionItems", "visibleDropdown", "showExportDropdown", "hideExportDropdown"];
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var StyledPanelHeader = _styledComponents["default"].div.attrs(function (props) {
return {
className: (0, _classnames["default"])('side-side-panel__header', props.className)
};
})(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n padding: 12px 16px 0 16px;\n"])), function (props) {
return props.theme.sidePanelHeaderBg;
});
var StyledPanelHeaderTop = _styledComponents["default"].div.attrs(function (props) {
return {
className: (0, _classnames["default"])('side-panel__header__top', props.className)
};
})(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n margin-bottom: 16px;\n width: 100%;\n"])));
var StyledPanelTopActions = _styledComponents["default"].div.attrs({
className: 'side-panel__top__actions'
})(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n"])));
var StyledPanelAction = _styledComponents["default"].div.attrs({
className: 'side-panel__panel-header__action'
})(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n align-items: center;\n border-radius: 2px;\n color: ", ";\n display: flex;\n height: 26px;\n justify-content: space-between;\n margin-left: 4px;\n padding: 5px;\n font-weight: bold;\n p {\n display: inline-block;\n margin-right: 6px;\n }\n a {\n height: 20px;\n }\n\n &:hover {\n cursor: pointer;\n color: ", ";\n\n a {\n color: ", ";\n }\n }\n"])), function (props) {
return props.active ? props.theme.textColorHl : props.theme.subtextColor;
}, function (props) {
return props.theme.textColorHl;
}, function (props) {
return props.theme.textColorHl;
});
var StyledToolbar = (0, _styledComponents["default"])(_toolbar["default"])(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n"])));
var PanelAction = exports.PanelAction = /*#__PURE__*/_react["default"].memo(function (_ref) {
var item = _ref.item,
showExportDropdown = _ref.showExportDropdown;
var onClick = (0, _react.useCallback)(function () {
if (item.dropdownComponent) {
showExportDropdown(item.id);
} else {
item.onClick && item.onClick();
}
}, [item, showExportDropdown]);
return /*#__PURE__*/_react["default"].createElement(StyledPanelAction, {
id: "".concat(item.id, "-action"),
"data-tip": true,
"data-for": "".concat(item.id, "-action"),
onClick: onClick
}, item.label ? /*#__PURE__*/_react["default"].createElement("p", null, item.label) : null, /*#__PURE__*/_react["default"].createElement("a", {
target: item.blank ? '_blank' : '',
href: item.href,
rel: "noreferrer"
}, /*#__PURE__*/_react["default"].createElement(item.iconComponent, (0, _extends2["default"])({
height: "20px"
}, item.iconComponentProps))), item.tooltip ? /*#__PURE__*/_react["default"].createElement(_styledComponents2.Tooltip, {
id: "".concat(item.id, "-action"),
place: "bottom",
delayShow: 500,
effect: "solid"
}, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: item.tooltip
})) : null);
});
PanelAction.displayName = 'PanelAction';
var PanelHeaderDropdownFactory = exports.PanelHeaderDropdownFactory = function PanelHeaderDropdownFactory() {
var PanelHeaderDropdown = function PanelHeaderDropdown(_ref2) {
var items = _ref2.items,
show = _ref2.show,
onClose = _ref2.onClose,
id = _ref2.id;
var ref = (0, _useOnClickOutside["default"])(onClose);
return /*#__PURE__*/_react["default"].createElement(StyledToolbar, {
show: show,
className: "".concat(id, "-dropdown")
}, show ? /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledPanelDropdown, {
type: "dark",
ref: ref,
className: "panel-header-dropdown__inner"
}, items.map(function (item) {
return /*#__PURE__*/_react["default"].createElement(_toolbarItem["default"], {
id: item.key,
key: item.key,
label: item.label,
icon: item.icon,
onClick: item.onClick,
onClose: onClose
});
})) : null);
};
return PanelHeaderDropdown;
};
var getDropdownItemsSelector = function getDropdownItemsSelector() {
return (0, _reselect.createSelector)(function (props) {
return props;
}, function (props) {
return (props.items || []).map(function (t) {
return _objectSpread(_objectSpread({}, t), {}, {
onClick: t.onClick && t.onClick(props) ? t.onClick(props) : null
});
}).filter(function (l) {
return l.onClick;
});
});
};
var SaveExportDropdownFactory = exports.SaveExportDropdownFactory = function SaveExportDropdownFactory(PanelHeaderDropdown) {
var dropdownItemsSelector = getDropdownItemsSelector();
var defaultItems = [{
label: 'toolbar.exportImage',
icon: _icons.Picture,
key: 'image',
onClick: function onClick(props) {
return props.onExportImage;
}
}, {
label: 'toolbar.exportData',
icon: _icons.DataTable,
key: 'data',
onClick: function onClick(props) {
return props.onExportData;
}
}, {
label: 'toolbar.exportMap',
icon: _icons.Map,
key: 'map',
onClick: function onClick(props) {
return props.onExportMap;
}
}, {
label: 'toolbar.saveMap',
icon: _icons.Save2,
key: 'save',
onClick: function onClick(props) {
return props.onSaveMap;
}
}, {
label: 'toolbar.shareMapURL',
icon: _icons.Share,
key: 'share',
onClick: function onClick(props) {
return props.onShareMap;
}
}];
var SaveExportDropdown = function SaveExportDropdown(_ref3) {
var _ref3$items = _ref3.items,
items = _ref3$items === void 0 ? defaultItems : _ref3$items,
restProps = (0, _objectWithoutProperties2["default"])(_ref3, _excluded);
var props = _objectSpread(_objectSpread({}, restProps), {}, {
items: items
});
return /*#__PURE__*/_react["default"].createElement(PanelHeaderDropdown, {
items: dropdownItemsSelector(props),
show: props.show,
onClose: props.onClose,
id: "save-export"
});
};
SaveExportDropdown.defaultItems = defaultItems;
return SaveExportDropdown;
};
SaveExportDropdownFactory.deps = [PanelHeaderDropdownFactory];
var CloudStorageDropdownFactory = exports.CloudStorageDropdownFactory = function CloudStorageDropdownFactory(PanelHeaderDropdown) {
var dropdownItemsSelector = getDropdownItemsSelector();
var defaultItems = [{
label: 'Save',
icon: _icons.Save2,
key: 'save',
onClick: function onClick(props) {
return props.onSaveToStorage;
}
}, {
label: 'Save As',
icon: _icons.Save2,
key: 'saveAs',
onClick: function onClick(props) {
return props.onSaveAsToStorage;
}
}];
var CloudStorageDropdown = function CloudStorageDropdown(_ref4) {
var _ref4$items = _ref4.items,
items = _ref4$items === void 0 ? defaultItems : _ref4$items,
restProps = (0, _objectWithoutProperties2["default"])(_ref4, _excluded2);
var props = _objectSpread(_objectSpread({}, restProps), {}, {
items: items
});
return /*#__PURE__*/_react["default"].createElement(PanelHeaderDropdown, {
items: dropdownItemsSelector(props),
show: props.show,
onClose: props.onClose,
id: "cloud-storage"
});
};
CloudStorageDropdown.defaultItems = defaultItems;
return CloudStorageDropdown;
};
CloudStorageDropdownFactory.deps = [PanelHeaderDropdownFactory];
PanelHeaderFactory.deps = [SaveExportDropdownFactory, CloudStorageDropdownFactory];
function PanelHeaderFactory(SaveExportDropdown, CloudStorageDropdown) {
var _PanelHeader;
return _PanelHeader = /*#__PURE__*/function (_Component) {
function PanelHeader() {
(0, _classCallCheck2["default"])(this, PanelHeader);
return _callSuper(this, PanelHeader, arguments);
}
(0, _inherits2["default"])(PanelHeader, _Component);
return (0, _createClass2["default"])(PanelHeader, [{
key: "render",
value: function render() {
var _this$props = this.props,
appName = _this$props.appName,
appWebsite = _this$props.appWebsite,
version = _this$props.version,
actionItems = _this$props.actionItems,
visibleDropdown = _this$props.visibleDropdown,
showExportDropdown = _this$props.showExportDropdown,
hideExportDropdown = _this$props.hideExportDropdown,
dropdownCallbacks = (0, _objectWithoutProperties2["default"])(_this$props, _excluded3);
var items = actionItems || [];
// don't render cloud storage icon if onSaveToStorage is not provided
if (typeof this.props.onSaveToStorage !== 'function') {
items = items.filter(function (ai) {
return ai.id !== 'storage';
});
}
return /*#__PURE__*/_react["default"].createElement(StyledPanelHeader, {
className: "side-panel__panel-header"
}, /*#__PURE__*/_react["default"].createElement(StyledPanelHeaderTop, {
className: "side-panel__panel-header__top"
}, this.props.logoComponent && /*#__PURE__*/_react["default"].createElement(this.props.logoComponent, {
appName: appName,
version: version,
appWebsite: appWebsite
}), /*#__PURE__*/_react["default"].createElement(StyledPanelTopActions, null, items.map(function (item) {
return /*#__PURE__*/_react["default"].createElement("div", {
className: "side-panel__panel-header__right",
key: item.id,
style: {
position: 'relative'
}
}, /*#__PURE__*/_react["default"].createElement(PanelAction, {
item: item,
showExportDropdown: showExportDropdown
}), item.dropdownComponent ? /*#__PURE__*/_react["default"].createElement(item.dropdownComponent, (0, _extends2["default"])({
onClose: hideExportDropdown,
show: visibleDropdown === item.id
}, dropdownCallbacks)) : null);
}))));
}
}]);
}(_react.Component), (0, _defineProperty2["default"])(_PanelHeader, "defaultProps", {
logoComponent: _logo["default"],
actionItems: [{
id: 'storage',
iconComponent: _icons.Db,
tooltip: 'tooltip.cloudStorage',
onClick: function onClick() {
return;
},
dropdownComponent: CloudStorageDropdown
}, {
id: 'save',
iconComponent: _icons.Save,
onClick: function onClick() {
return;
},
label: 'Share',
dropdownComponent: SaveExportDropdown
}]
}), _PanelHeader;
}
var _default = exports["default"] = PanelHeaderFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lcyIsIl9yZXNlbGVjdCIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9sb2dvIiwiX2ljb25zIiwiX3Rvb2xiYXIiLCJfdG9vbGJhckl0ZW0iLCJfbG9jYWxpemF0aW9uIiwiX3VzZU9uQ2xpY2tPdXRzaWRlIiwiX2V4Y2x1ZGVkIiwiX2V4Y2x1ZGVkMiIsIl9leGNsdWRlZDMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NhbGxTdXBlciIsIm8iLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJTdHlsZWRQYW5lbEhlYWRlciIsInN0eWxlZCIsImRpdiIsImF0dHJzIiwicHJvcHMiLCJjbGFzc05hbWUiLCJjbGFzc25hbWVzIiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJ0aGVtZSIsInNpZGVQYW5lbEhlYWRlckJnIiwiU3R5bGVkUGFuZWxIZWFkZXJUb3AiLCJTdHlsZWRQYW5lbFRvcEFjdGlvbnMiLCJTdHlsZWRQYW5lbEFjdGlvbiIsImFjdGl2ZSIsInRleHRDb2xvckhsIiwic3VidGV4dENvbG9yIiwiU3R5bGVkVG9vbGJhciIsIlRvb2xiYXIiLCJQYW5lbEFjdGlvbiIsImV4cG9ydHMiLCJSZWFjdCIsIm1lbW8iLCJfcmVmIiwiaXRlbSIsInNob3dFeHBvcnREcm9wZG93biIsIm9uQ2xpY2siLCJ1c2VDYWxsYmFjayIsImRyb3Bkb3duQ29tcG9uZW50IiwiaWQiLCJjcmVhdGVFbGVtZW50IiwiY29uY2F0IiwibGFiZWwiLCJ0YXJnZXQiLCJibGFuayIsImhyZWYiLCJyZWwiLCJpY29uQ29tcG9uZW50IiwiX2V4dGVuZHMyIiwiaGVpZ2h0IiwiaWNvbkNvbXBvbmVudFByb3BzIiwidG9vbHRpcCIsIlRvb2x0aXAiLCJwbGFjZSIsImRlbGF5U2hvdyIsImVmZmVjdCIsIkZvcm1hdHRlZE1lc3NhZ2UiLCJkaXNwbGF5TmFtZSIsIlBhbmVsSGVhZGVyRHJvcGRvd25GYWN0b3J5IiwiUGFuZWxIZWFkZXJEcm9wZG93biIsIl9yZWYyIiwiaXRlbXMiLCJzaG93Iiwib25DbG9zZSIsInJlZiIsInVzZU9uQ2xpY2tPdXRzaWRlIiwiU3R5bGVkUGFuZWxEcm9wZG93biIsInR5cGUiLCJtYXAiLCJrZXkiLCJpY29uIiwiZ2V0RHJvcGRvd25JdGVtc1NlbGVjdG9yIiwiY3JlYXRlU2VsZWN0b3IiLCJsIiwiU2F2ZUV4cG9ydERyb3Bkb3duRmFjdG9yeSIsImRyb3Bkb3duSXRlbXNTZWxlY3RvciIsImRlZmF1bHRJdGVtcyIsIlBpY3R1cmUiLCJvbkV4cG9ydEltYWdlIiwiRGF0YVRhYmxlIiwib25FeHBvcnREYXRhIiwiTWFwSWNvbiIsIm9uRXhwb3J0TWFwIiwiU2F2ZTIiLCJvblNhdmVNYXAiLCJTaGFyZSIsIm9uU2hhcmVNYXAiLCJTYXZlRXhwb3J0RHJvcGRvd24iLCJfcmVmMyIsIl9yZWYzJGl0ZW1zIiwicmVzdFByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImRlcHMiLCJDbG91ZFN0b3JhZ2VEcm9wZG93bkZhY3RvcnkiLCJvblNhdmVUb1N0b3JhZ2UiLCJvblNhdmVBc1RvU3RvcmFnZSIsIkNsb3VkU3RvcmFnZURyb3Bkb3duIiwiX3JlZjQiLCJfcmVmNCRpdGVtcyIsIlBhbmVsSGVhZGVyRmFjdG9yeSIsIl9QYW5lbEhlYWRlciIsIl9Db21wb25lbnQiLCJQYW5lbEhlYWRlciIsIl9jbGFzc0NhbGxDaGVjazIiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsInZhbHVlIiwicmVuZGVyIiwiX3RoaXMkcHJvcHMiLCJhcHBOYW1lIiwiYXBwV2Vic2l0ZSIsInZlcnNpb24iLCJhY3Rpb25JdGVtcyIsInZpc2libGVEcm9wZG93biIsImhpZGVFeHBvcnREcm9wZG93biIsImRyb3Bkb3duQ2FsbGJhY2tzIiwiYWkiLCJsb2dvQ29tcG9uZW50Iiwic3R5bGUiLCJwb3NpdGlvbiIsIkNvbXBvbmVudCIsIktlcGxlckdsTG9nbyIsIkRiIiwiU2F2ZSIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpZGUtcGFuZWwvcGFuZWwtaGVhZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIHVzZUNhbGxiYWNrfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuaW1wb3J0IHtTdHlsZWRQYW5lbERyb3Bkb3duLCBUb29sdGlwfSBmcm9tICcuLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IEtlcGxlckdsTG9nbyBmcm9tICcuLi9jb21tb24vbG9nbyc7XG5pbXBvcnQge1NhdmUsIERhdGFUYWJsZSwgU2F2ZTIsIFBpY3R1cmUsIERiLCBNYXAgYXMgTWFwSWNvbiwgU2hhcmV9IGZyb20gJy4uL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQgVG9vbGJhciwge1Rvb2xiYXJQcm9wc30gZnJvbSAnLi4vY29tbW9uL3Rvb2xiYXInO1xuaW1wb3J0IFRvb2xiYXJJdGVtLCB7VG9vbGJhckl0ZW1Qcm9wc30gZnJvbSAnLi4vY29tbW9uL3Rvb2xiYXItaXRlbSc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7VWlTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0Jhc2VQcm9wc30gZnJvbSAnLi4vY29tbW9uL2ljb25zJztcbmltcG9ydCB1c2VPbkNsaWNrT3V0c2lkZSBmcm9tICcuLi9ob29rcy91c2Utb24tY2xpY2stb3V0c2lkZSc7XG5cbnR5cGUgU3R5bGVkUGFuZWxBY3Rpb25Qcm9wcyA9IHtcbiAgYWN0aXZlPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgQWN0aW9uSXRlbSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGJsYW5rPzogYm9vbGVhbjtcbiAgaHJlZj86IHN0cmluZztcbiAgdG9vbHRpcD86IHN0cmluZztcbiAgaWNvbkNvbXBvbmVudDogUmVhY3QuQ29tcG9uZW50VHlwZTxQYXJ0aWFsPEJhc2VQcm9wcz4+O1xuICBpY29uQ29tcG9uZW50UHJvcHM/OiBCYXNlUHJvcHM7XG4gIGRyb3Bkb3duQ29tcG9uZW50PzogUmVhY3QuQ29tcG9uZW50VHlwZTxEcm9wZG93bkNvbXBvbmVudFByb3BzPjtcbiAgb25DbGljaz86ICgpID0+IHZvaWQ7XG59O1xuXG50eXBlIFBhbmVsQWN0aW9uUHJvcHMgPSB7XG4gIGl0ZW06IEFjdGlvbkl0ZW07XG4gIHNob3dFeHBvcnREcm9wZG93bjogKHN0cmluZykgPT4gdm9pZDtcbn07XG5cbnR5cGUgUGFuZWxIZWFkZXJEcm9wZG93blByb3BzID0ge1xuICBpdGVtczogVG9vbGJhckl0ZW1Qcm9wc1tdO1xuICBzaG93PzogYm9vbGVhbjtcbiAgb25DbG9zZTogKCkgPT4gdm9pZDtcbiAgaWQ6IHN0cmluZztcbn07XG5cbnR5cGUgTG9nb0NvbXBvbmVudFByb3BzID0ge1xuICBhcHBOYW1lOiBzdHJpbmc7XG4gIGFwcFdlYnNpdGU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xufTtcblxudHlwZSBEcm9wZG93bkNhbGxiYWNrcyA9IHtcbiAgbG9nb0NvbXBvbmVudD86IFJlYWN0LkZDPExvZ29Db21wb25lbnRQcm9wcz4gfCBSZWFjdC5Db21wb25lbnRUeXBlPExvZ29Db21wb25lbnRQcm9wcz47XG4gIG9uRXhwb3J0SW1hZ2U6ICgpID0+IHZvaWQ7XG4gIG9uRXhwb3J0RGF0YTogKCkgPT4gdm9pZDtcbiAgb25FeHBvcnRDb25maWc/OiAoKSA9PiB2b2lkO1xuICBvbkV4cG9ydE1hcDogKCkgPT4gdm9pZDtcbiAgb25TYXZlVG9TdG9yYWdlOiAoKCkgPT4gdm9pZCkgfCBudWxsO1xuICBvblNhdmVBc1RvU3RvcmFnZTogKCgpID0+IHZvaWQpIHwgbnVsbDtcbiAgb25TYXZlTWFwPzogKCkgPT4gdm9pZDtcbiAgb25TaGFyZU1hcDogKCgpID0+IHZvaWQpIHwgbnVsbDtcbn07XG5cbnR5cGUgSXRlbSA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgaWNvbjogUmVhY3QuQ29tcG9uZW50VHlwZTxQYXJ0aWFsPEJhc2VQcm9wcz4+O1xuICBrZXk6IHN0cmluZztcbiAgb25DbGljazogKHA6IERyb3Bkb3duQ29tcG9uZW50UHJvcHMpID0+ICgoKSA9PiB2b2lkKSB8IG51bGw7XG59O1xuXG50eXBlIERyb3Bkb3duQ29tcG9uZW50UHJvcHMgPSB7XG4gIHNob3c6IGJvb2xlYW47XG4gIG9uQ2xvc2U6ICgpID0+IHZvaWQ7XG4gIGl0ZW1zPzogSXRlbVtdO1xufSAmIERyb3Bkb3duQ2FsbGJhY2tzO1xuXG5leHBvcnQgdHlwZSBQYW5lbEhlYWRlclByb3BzID0ge1xuICBhcHBOYW1lOiBzdHJpbmc7XG4gIGFwcFdlYnNpdGU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICB2aXNpYmxlRHJvcGRvd246IFVpU3RhdGVbJ3Zpc2libGVEcm9wZG93biddO1xuICBhY3Rpb25JdGVtcz86IEFjdGlvbkl0ZW1bXTtcbiAgc2hvd0V4cG9ydERyb3Bkb3duOiAoaTogc3RyaW5nKSA9PiB2b2lkO1xuICBoaWRlRXhwb3J0RHJvcGRvd246ICgpID0+IHZvaWQ7XG59ICYgRHJvcGRvd25DYWxsYmFja3M7XG5cbmNvbnN0IFN0eWxlZFBhbmVsSGVhZGVyID0gc3R5bGVkLmRpdi5hdHRycyhwcm9wcyA9PiAoe1xuICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ3NpZGUtc2lkZS1wYW5lbF9faGVhZGVyJywgcHJvcHMuY2xhc3NOYW1lKVxufSkpYFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNpZGVQYW5lbEhlYWRlckJnfTtcbiAgcGFkZGluZzogMTJweCAxNnB4IDAgMTZweDtcbmA7XG5cbmNvbnN0IFN0eWxlZFBhbmVsSGVhZGVyVG9wID0gc3R5bGVkLmRpdi5hdHRycyhwcm9wcyA9PiAoe1xuICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ3NpZGUtcGFuZWxfX2hlYWRlcl9fdG9wJywgcHJvcHMuY2xhc3NOYW1lKVxufSkpYFxuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIHdpZHRoOiAxMDAlO1xuYDtcblxuY29uc3QgU3R5bGVkUGFuZWxUb3BBY3Rpb25zID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ3NpZGUtcGFuZWxfX3RvcF9fYWN0aW9ucydcbn0pYFxuICBkaXNwbGF5OiBmbGV4O1xuYDtcblxuY29uc3QgU3R5bGVkUGFuZWxBY3Rpb24gPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnc2lkZS1wYW5lbF9fcGFuZWwtaGVhZGVyX19hY3Rpb24nXG59KTxTdHlsZWRQYW5lbEFjdGlvblByb3BzPmBcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICBjb2xvcjogJHtwcm9wcyA9PiAocHJvcHMuYWN0aXZlID8gcHJvcHMudGhlbWUudGV4dENvbG9ySGwgOiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3IpfTtcbiAgZGlzcGxheTogZmxleDtcbiAgaGVpZ2h0OiAyNnB4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIG1hcmdpbi1sZWZ0OiA0cHg7XG4gIHBhZGRpbmc6IDVweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHAge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tcmlnaHQ6IDZweDtcbiAgfVxuICBhIHtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gIH1cblxuICAmOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuXG4gICAgYSB7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG4gICAgfVxuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRUb29sYmFyID0gc3R5bGVkKFRvb2xiYXIpPFRvb2xiYXJQcm9wcz5gXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbmA7XG5cbmNvbnN0IFBhbmVsQWN0aW9uOiBSZWFjdC5GQzxQYW5lbEFjdGlvblByb3BzPiA9IFJlYWN0Lm1lbW8oKHtpdGVtLCBzaG93RXhwb3J0RHJvcGRvd259KSA9PiB7XG4gIGNvbnN0IG9uQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGl0ZW0uZHJvcGRvd25Db21wb25lbnQpIHtcbiAgICAgIHNob3dFeHBvcnREcm9wZG93bihpdGVtLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbS5vbkNsaWNrICYmIGl0ZW0ub25DbGljaygpO1xuICAgIH1cbiAgfSwgW2l0ZW0sIHNob3dFeHBvcnREcm9wZG93bl0pO1xuXG4gIHJldHVybiAoXG4gICAgPFN0eWxlZFBhbmVsQWN0aW9uXG4gICAgICBpZD17YCR7aXRlbS5pZH0tYWN0aW9uYH1cbiAgICAgIGRhdGEtdGlwXG4gICAgICBkYXRhLWZvcj17YCR7aXRlbS5pZH0tYWN0aW9uYH1cbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgPlxuICAgICAge2l0ZW0ubGFiZWwgPyA8cD57aXRlbS5sYWJlbH08L3A+IDogbnVsbH1cbiAgICAgIDxhIHRhcmdldD17aXRlbS5ibGFuayA/ICdfYmxhbmsnIDogJyd9IGhyZWY9e2l0ZW0uaHJlZn0gcmVsPVwibm9yZWZlcnJlclwiPlxuICAgICAgICA8aXRlbS5pY29uQ29tcG9uZW50IGhlaWdodD1cIjIwcHhcIiB7Li4uaXRlbS5pY29uQ29tcG9uZW50UHJvcHN9IC8+XG4gICAgICA8L2E+XG4gICAgICB7aXRlbS50b29sdGlwID8gKFxuICAgICAgICA8VG9vbHRpcCBpZD17YCR7aXRlbS5pZH0tYWN0aW9uYH0gcGxhY2U9XCJib3R0b21cIiBkZWxheVNob3c9ezUwMH0gZWZmZWN0PVwic29saWRcIj5cbiAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17aXRlbS50b29sdGlwfSAvPlxuICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICApIDogbnVsbH1cbiAgICA8L1N0eWxlZFBhbmVsQWN0aW9uPlxuICApO1xufSk7XG5QYW5lbEFjdGlvbi5kaXNwbGF5TmFtZSA9ICdQYW5lbEFjdGlvbic7XG5leHBvcnQge1BhbmVsQWN0aW9ufTtcblxuZXhwb3J0IGNvbnN0IFBhbmVsSGVhZGVyRHJvcGRvd25GYWN0b3J5ID0gKCkgPT4ge1xuICBjb25zdCBQYW5lbEhlYWRlckRyb3Bkb3duOiBSZWFjdC5GQzxQYW5lbEhlYWRlckRyb3Bkb3duUHJvcHM+ID0gKHtpdGVtcywgc2hvdywgb25DbG9zZSwgaWR9KSA9PiB7XG4gICAgY29uc3QgcmVmID0gdXNlT25DbGlja091dHNpZGU8SFRNTERpdkVsZW1lbnQ+KG9uQ2xvc2UpO1xuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkVG9vbGJhciBzaG93PXtzaG93fSBjbGFzc05hbWU9e2Ake2lkfS1kcm9wZG93bmB9PlxuICAgICAgICB7c2hvdyA/IChcbiAgICAgICAgICA8U3R5bGVkUGFuZWxEcm9wZG93biB0eXBlPVwiZGFya1wiIHJlZj17cmVmfSBjbGFzc05hbWU9XCJwYW5lbC1oZWFkZXItZHJvcGRvd25fX2lubmVyXCI+XG4gICAgICAgICAgICB7aXRlbXMubWFwKGl0ZW0gPT4gKFxuICAgICAgICAgICAgICA8VG9vbGJhckl0ZW1cbiAgICAgICAgICAgICAgICBpZD17aXRlbS5rZXl9XG4gICAgICAgICAgICAgICAga2V5PXtpdGVtLmtleX1cbiAgICAgICAgICAgICAgICBsYWJlbD17aXRlbS5sYWJlbH1cbiAgICAgICAgICAgICAgICBpY29uPXtpdGVtLmljb259XG4gICAgICAgICAgICAgICAgb25DbGljaz17aXRlbS5vbkNsaWNrfVxuICAgICAgICAgICAgICAgIG9uQ2xvc2U9e29uQ2xvc2V9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L1N0eWxlZFBhbmVsRHJvcGRvd24+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9TdHlsZWRUb29sYmFyPlxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFBhbmVsSGVhZGVyRHJvcGRvd247XG59O1xuXG5jb25zdCBnZXREcm9wZG93bkl0ZW1zU2VsZWN0b3IgPSAoKSA9PlxuICBjcmVhdGVTZWxlY3RvcihcbiAgICAocHJvcHM6IERyb3Bkb3duQ29tcG9uZW50UHJvcHMpID0+IHByb3BzLFxuICAgIHByb3BzID0+XG4gICAgICAocHJvcHMuaXRlbXMgfHwgW10pXG4gICAgICAgIC5tYXAodCA9PiAoe1xuICAgICAgICAgIC4uLnQsXG4gICAgICAgICAgb25DbGljazogdC5vbkNsaWNrICYmIHQub25DbGljayhwcm9wcykgPyB0Lm9uQ2xpY2socHJvcHMpIDogbnVsbFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcihsID0+IGwub25DbGljaylcbiAgKTtcblxuZXhwb3J0IGNvbnN0IFNhdmVFeHBvcnREcm9wZG93bkZhY3RvcnkgPSAoXG4gIFBhbmVsSGVhZGVyRHJvcGRvd246IFJldHVyblR5cGU8dHlwZW9mIFBhbmVsSGVhZGVyRHJvcGRvd25GYWN0b3J5PlxuKSA9PiB7XG4gIGNvbnN0IGRyb3Bkb3duSXRlbXNTZWxlY3RvciA9IGdldERyb3Bkb3duSXRlbXNTZWxlY3RvcigpO1xuXG4gIGNvbnN0IGRlZmF1bHRJdGVtcyA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogJ3Rvb2xiYXIuZXhwb3J0SW1hZ2UnLFxuICAgICAgaWNvbjogUGljdHVyZSxcbiAgICAgIGtleTogJ2ltYWdlJyxcbiAgICAgIG9uQ2xpY2s6IHByb3BzID0+IHByb3BzLm9uRXhwb3J0SW1hZ2VcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAndG9vbGJhci5leHBvcnREYXRhJyxcbiAgICAgIGljb246IERhdGFUYWJsZSxcbiAgICAgIGtleTogJ2RhdGEnLFxuICAgICAgb25DbGljazogcHJvcHMgPT4gcHJvcHMub25FeHBvcnREYXRhXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ3Rvb2xiYXIuZXhwb3J0TWFwJyxcbiAgICAgIGljb246IE1hcEljb24sXG4gICAgICBrZXk6ICdtYXAnLFxuICAgICAgb25DbGljazogcHJvcHMgPT4gcHJvcHMub25FeHBvcnRNYXBcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAndG9vbGJhci5zYXZlTWFwJyxcbiAgICAgIGljb246IFNhdmUyLFxuICAgICAga2V5OiAnc2F2ZScsXG4gICAgICBvbkNsaWNrOiBwcm9wcyA9PiBwcm9wcy5vblNhdmVNYXBcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAndG9vbGJhci5zaGFyZU1hcFVSTCcsXG4gICAgICBpY29uOiBTaGFyZSxcbiAgICAgIGtleTogJ3NoYXJlJyxcbiAgICAgIG9uQ2xpY2s6IHByb3BzID0+IHByb3BzLm9uU2hhcmVNYXBcbiAgICB9XG4gIF07XG5cbiAgY29uc3QgU2F2ZUV4cG9ydERyb3Bkb3duOiBSZWFjdC5GQzxEcm9wZG93bkNvbXBvbmVudFByb3BzPiAmIHtcbiAgICBkZWZhdWx0SXRlbXM6IFRvb2xiYXJJdGVtUHJvcHNbXTtcbiAgfSA9ICh7aXRlbXMgPSBkZWZhdWx0SXRlbXMsIC4uLnJlc3RQcm9wc30pID0+IHtcbiAgICBjb25zdCBwcm9wcyA9IHsuLi5yZXN0UHJvcHMsIGl0ZW1zfTtcbiAgICByZXR1cm4gKFxuICAgICAgPFBhbmVsSGVhZGVyRHJvcGRvd25cbiAgICAgICAgaXRlbXM9e2Ryb3Bkb3duSXRlbXNTZWxlY3Rvcihwcm9wcyl9XG4gICAgICAgIHNob3c9e3Byb3BzLnNob3d9XG4gICAgICAgIG9uQ2xvc2U9e3Byb3BzLm9uQ2xvc2V9XG4gICAgICAgIGlkPVwic2F2ZS1leHBvcnRcIlxuICAgICAgLz5cbiAgICApO1xuICB9O1xuICBTYXZlRXhwb3J0RHJvcGRvd24uZGVmYXVsdEl0ZW1zID0gZGVmYXVsdEl0ZW1zO1xuICByZXR1cm4gU2F2ZUV4cG9ydERyb3Bkb3duO1xufTtcblNhdmVFeHBvcnREcm9wZG93bkZhY3RvcnkuZGVwcyA9IFtQYW5lbEhlYWRlckRyb3Bkb3duRmFjdG9yeV07XG5cbmV4cG9ydCBjb25zdCBDbG91ZFN0b3JhZ2VEcm9wZG93bkZhY3RvcnkgPSAoXG4gIFBhbmVsSGVhZGVyRHJvcGRvd246IFJldHVyblR5cGU8dHlwZW9mIFBhbmVsSGVhZGVyRHJvcGRvd25GYWN0b3J5PlxuKSA9PiB7XG4gIGNvbnN0IGRyb3Bkb3duSXRlbXNTZWxlY3RvciA9IGdldERyb3Bkb3duSXRlbXNTZWxlY3RvcigpO1xuICBjb25zdCBkZWZhdWx0SXRlbXMgPSBbXG4gICAge1xuICAgICAgbGFiZWw6ICdTYXZlJyxcbiAgICAgIGljb246IFNhdmUyLFxuICAgICAga2V5OiAnc2F2ZScsXG4gICAgICBvbkNsaWNrOiBwcm9wcyA9PiBwcm9wcy5vblNhdmVUb1N0b3JhZ2VcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnU2F2ZSBBcycsXG4gICAgICBpY29uOiBTYXZlMixcbiAgICAgIGtleTogJ3NhdmVBcycsXG4gICAgICBvbkNsaWNrOiBwcm9wcyA9PiBwcm9wcy5vblNhdmVBc1RvU3RvcmFnZVxuICAgIH1cbiAgXTtcbiAgY29uc3QgQ2xvdWRTdG9yYWdlRHJvcGRvd246IFJlYWN0LkZDPERyb3Bkb3duQ29tcG9uZW50UHJvcHM+ICYge1xuICAgIGRlZmF1bHRJdGVtczogRHJvcGRvd25Db21wb25lbnRQcm9wc1snaXRlbXMnXTtcbiAgfSA9ICh7aXRlbXMgPSBkZWZhdWx0SXRlbXMsIC4uLnJlc3RQcm9wc30pID0+IHtcbiAgICBjb25zdCBwcm9wcyA9IHsuLi5yZXN0UHJvcHMsIGl0ZW1zfTtcbiAgICByZXR1cm4gKFxuICAgICAgPFBhbmVsSGVhZGVyRHJvcGRvd25cbiAgICAgICAgaXRlbXM9e2Ryb3Bkb3duSXRlbXNTZWxlY3Rvcihwcm9wcyl9XG4gICAgICAgIHNob3c9e3Byb3BzLnNob3d9XG4gICAgICAgIG9uQ2xvc2U9e3Byb3BzLm9uQ2xvc2V9XG4gICAgICAgIGlkPVwiY2xvdWQtc3RvcmFnZVwiXG4gICAgICAvPlxuICAgICk7XG4gIH07XG4gIENsb3VkU3RvcmFnZURyb3Bkb3duLmRlZmF1bHRJdGVtcyA9IGRlZmF1bHRJdGVtcztcbiAgcmV0dXJuIENsb3VkU3RvcmFnZURyb3Bkb3duO1xufTtcbkNsb3VkU3RvcmFnZURyb3Bkb3duRmFjdG9yeS5kZXBzID0gW1BhbmVsSGVhZGVyRHJvcGRvd25GYWN0b3J5XTtcblxuUGFuZWxIZWFkZXJGYWN0b3J5LmRlcHMgPSBbU2F2ZUV4cG9ydERyb3Bkb3duRmFjdG9yeSwgQ2xvdWRTdG9yYWdlRHJvcGRvd25GYWN0b3J5XTtcblxuZnVuY3Rpb24gUGFuZWxIZWFkZXJGYWN0b3J5KFxuICBTYXZlRXhwb3J0RHJvcGRvd246IFJldHVyblR5cGU8dHlwZW9mIFNhdmVFeHBvcnREcm9wZG93bkZhY3Rvcnk+LFxuICBDbG91ZFN0b3JhZ2VEcm9wZG93bjogUmV0dXJuVHlwZTx0eXBlb2YgQ2xvdWRTdG9yYWdlRHJvcGRvd25GYWN0b3J5PlxuKTogUmVhY3QuQ29tcG9uZW50VHlwZTxQYW5lbEhlYWRlclByb3BzPiB7XG4gIHJldHVybiBjbGFzcyBQYW5lbEhlYWRlciBleHRlbmRzIENvbXBvbmVudDxQYW5lbEhlYWRlclByb3BzPiB7XG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIGxvZ29Db21wb25lbnQ6IEtlcGxlckdsTG9nbyxcbiAgICAgIGFjdGlvbkl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ3N0b3JhZ2UnLFxuICAgICAgICAgIGljb25Db21wb25lbnQ6IERiLFxuICAgICAgICAgIHRvb2x0aXA6ICd0b29sdGlwLmNsb3VkU3RvcmFnZScsXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZHJvcGRvd25Db21wb25lbnQ6IENsb3VkU3RvcmFnZURyb3Bkb3duXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ3NhdmUnLFxuICAgICAgICAgIGljb25Db21wb25lbnQ6IFNhdmUsXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbGFiZWw6ICdTaGFyZScsXG4gICAgICAgICAgZHJvcGRvd25Db21wb25lbnQ6IFNhdmVFeHBvcnREcm9wZG93blxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYXBwTmFtZSxcbiAgICAgICAgYXBwV2Vic2l0ZSxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgYWN0aW9uSXRlbXMsXG4gICAgICAgIHZpc2libGVEcm9wZG93bixcbiAgICAgICAgc2hvd0V4cG9ydERyb3Bkb3duLFxuICAgICAgICBoaWRlRXhwb3J0RHJvcGRvd24sXG4gICAgICAgIC4uLmRyb3Bkb3duQ2FsbGJhY2tzXG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGxldCBpdGVtcyA9IGFjdGlvbkl0ZW1zIHx8IFtdO1xuXG4gICAgICAvLyBkb24ndCByZW5kZXIgY2xvdWQgc3RvcmFnZSBpY29uIGlmIG9uU2F2ZVRvU3RvcmFnZSBpcyBub3QgcHJvdmlkZWRcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5vblNhdmVUb1N0b3JhZ2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoYWkgPT4gYWkuaWQgIT09ICdzdG9yYWdlJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTdHlsZWRQYW5lbEhlYWRlciBjbGFzc05hbWU9XCJzaWRlLXBhbmVsX19wYW5lbC1oZWFkZXJcIj5cbiAgICAgICAgICA8U3R5bGVkUGFuZWxIZWFkZXJUb3AgY2xhc3NOYW1lPVwic2lkZS1wYW5lbF9fcGFuZWwtaGVhZGVyX190b3BcIj5cbiAgICAgICAgICAgIHt0aGlzLnByb3BzLmxvZ29Db21wb25lbnQgJiYgKFxuICAgICAgICAgICAgICA8dGhpcy5wcm9wcy5sb2dvQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgYXBwTmFtZT17YXBwTmFtZX1cbiAgICAgICAgICAgICAgICB2ZXJzaW9uPXt2ZXJzaW9ufVxuICAgICAgICAgICAgICAgIGFwcFdlYnNpdGU9e2FwcFdlYnNpdGV9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPFN0eWxlZFBhbmVsVG9wQWN0aW9ucz5cbiAgICAgICAgICAgICAge2l0ZW1zLm1hcChpdGVtID0+IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJzaWRlLXBhbmVsX19wYW5lbC1oZWFkZXJfX3JpZ2h0XCJcbiAgICAgICAgICAgICAgICAgIGtleT17aXRlbS5pZH1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7cG9zaXRpb246ICdyZWxhdGl2ZSd9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxQYW5lbEFjdGlvbiBpdGVtPXtpdGVtfSBzaG93RXhwb3J0RHJvcGRvd249e3Nob3dFeHBvcnREcm9wZG93bn0gLz5cbiAgICAgICAgICAgICAgICAgIHtpdGVtLmRyb3Bkb3duQ29tcG9uZW50ID8gKFxuICAgICAgICAgICAgICAgICAgICA8aXRlbS5kcm9wZG93bkNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U9e2hpZGVFeHBvcnREcm9wZG93bn1cbiAgICAgICAgICAgICAgICAgICAgICBzaG93PXt2aXNpYmxlRHJvcGRvd24gPT09IGl0ZW0uaWR9XG4gICAgICAgICAgICAgICAgICAgICAgey4uLmRyb3Bkb3duQ2FsbGJhY2tzfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9TdHlsZWRQYW5lbFRvcEFjdGlvbnM+XG4gICAgICAgICAgPC9TdHlsZWRQYW5lbEhlYWRlclRvcD5cbiAgICAgICAgPC9TdHlsZWRQYW5lbEhlYWRlcj5cbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBQYW5lbEhlYWRlckZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFJLFNBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGtCQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxLQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxRQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUyxZQUFBLEdBQUFQLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBVSxhQUFBLEdBQUFWLE9BQUE7QUFHQSxJQUFBVyxrQkFBQSxHQUFBVCxzQkFBQSxDQUFBRixPQUFBO0FBQThELElBQUFZLFNBQUE7RUFBQUMsVUFBQTtFQUFBQyxVQUFBO0FBQUEsSUFBQUMsZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQWY5RDtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUF0Qix3QkFBQXNCLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLENBQUEsSUFBQWQsQ0FBQSxvQkFBQWMsQ0FBQSxPQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWhCLENBQUEsRUFBQWMsQ0FBQSxTQUFBRyxDQUFBLEdBQUFQLENBQUEsR0FBQUMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBYixDQUFBLEVBQUFjLENBQUEsVUFBQUcsQ0FBQSxLQUFBQSxDQUFBLENBQUFWLEdBQUEsSUFBQVUsQ0FBQSxDQUFBQyxHQUFBLElBQUFQLE1BQUEsQ0FBQUMsY0FBQSxDQUFBSixDQUFBLEVBQUFNLENBQUEsRUFBQUcsQ0FBQSxJQUFBVCxDQUFBLENBQUFNLENBQUEsSUFBQWQsQ0FBQSxDQUFBYyxDQUFBLFlBQUFOLENBQUEsY0FBQVIsQ0FBQSxFQUFBRyxDQUFBLElBQUFBLENBQUEsQ0FBQWUsR0FBQSxDQUFBbEIsQ0FBQSxFQUFBUSxDQUFBLEdBQUFBLENBQUE7QUFBQSxTQUFBVyxXQUFBaEIsQ0FBQSxFQUFBaUIsQ0FBQSxFQUFBcEIsQ0FBQSxXQUFBb0IsQ0FBQSxPQUFBQyxnQkFBQSxhQUFBRCxDQUFBLE9BQUFFLDJCQUFBLGFBQUFuQixDQUFBLEVBQUFvQix5QkFBQSxLQUFBQyxPQUFBLENBQUFDLFNBQUEsQ0FBQUwsQ0FBQSxFQUFBcEIsQ0FBQSxZQUFBcUIsZ0JBQUEsYUFBQWxCLENBQUEsRUFBQXVCLFdBQUEsSUFBQU4sQ0FBQSxDQUFBTyxLQUFBLENBQUF4QixDQUFBLEVBQUFILENBQUE7QUFBQSxTQUFBdUIsMEJBQUEsY0FBQXBCLENBQUEsSUFBQXlCLE9BQUEsQ0FBQUMsU0FBQSxDQUFBQyxPQUFBLENBQUFkLElBQUEsQ0FBQVEsT0FBQSxDQUFBQyxTQUFBLENBQUFHLE9BQUEsaUNBQUF6QixDQUFBLGFBQUFvQix5QkFBQSxZQUFBQSwwQkFBQSxhQUFBcEIsQ0FBQTtBQUFBLFNBQUE0QixRQUFBL0IsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQVEsTUFBQSxDQUFBcUIsSUFBQSxDQUFBaEMsQ0FBQSxPQUFBVyxNQUFBLENBQUFzQixxQkFBQSxRQUFBYixDQUFBLEdBQUFULE1BQUEsQ0FBQXNCLHFCQUFBLENBQUFqQyxDQUFBLEdBQUFFLENBQUEsS0FBQWtCLENBQUEsR0FBQUEsQ0FBQSxDQUFBYyxNQUFBLFdBQUFoQyxDQUFBLFdBQUFTLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQWIsQ0FBQSxFQUFBRSxDQUFBLEVBQUFpQyxVQUFBLE9BQUFoQyxDQUFBLENBQUFpQyxJQUFBLENBQUFULEtBQUEsQ0FBQXhCLENBQUEsRUFBQWlCLENBQUEsWUFBQWpCLENBQUE7QUFBQSxTQUFBa0MsY0FBQXJDLENBQUEsYUFBQUUsQ0FBQSxNQUFBQSxDQUFBLEdBQUFvQyxTQUFBLENBQUFDLE1BQUEsRUFBQXJDLENBQUEsVUFBQUMsQ0FBQSxXQUFBbUMsU0FBQSxDQUFBcEMsQ0FBQSxJQUFBb0MsU0FBQSxDQUFBcEMsQ0FBQSxRQUFBQSxDQUFBLE9BQUE2QixPQUFBLENBQUFwQixNQUFBLENBQUFSLENBQUEsT0FBQXFDLE9BQUEsV0FBQXRDLENBQUEsUUFBQXVDLGdCQUFBLGFBQUF6QyxDQUFBLEVBQUFFLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFBLFNBQUFTLE1BQUEsQ0FBQStCLHlCQUFBLEdBQUEvQixNQUFBLENBQUFnQyxnQkFBQSxDQUFBM0MsQ0FBQSxFQUFBVyxNQUFBLENBQUErQix5QkFBQSxDQUFBdkMsQ0FBQSxLQUFBNEIsT0FBQSxDQUFBcEIsTUFBQSxDQUFBUixDQUFBLEdBQUFxQyxPQUFBLFdBQUF0QyxDQUFBLElBQUFTLE1BQUEsQ0FBQUMsY0FBQSxDQUFBWixDQUFBLEVBQUFFLENBQUEsRUFBQVMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBVixDQUFBLEVBQUFELENBQUEsaUJBQUFGLENBQUE7QUFxRkEsSUFBTTRDLGlCQUFpQixHQUFHQyw0QkFBTSxDQUFDQyxHQUFHLENBQUNDLEtBQUssQ0FBQyxVQUFBQyxLQUFLO0VBQUEsT0FBSztJQUNuREMsU0FBUyxFQUFFLElBQUFDLHNCQUFVLEVBQUMseUJBQXlCLEVBQUVGLEtBQUssQ0FBQ0MsU0FBUztFQUNsRSxDQUFDO0FBQUEsQ0FBQyxDQUFDLENBQUF2RCxlQUFBLEtBQUFBLGVBQUEsT0FBQXlELHVCQUFBLGdGQUNtQixVQUFBSCxLQUFLO0VBQUEsT0FBSUEsS0FBSyxDQUFDSSxLQUFLLENBQUNDLGlCQUFpQjtBQUFBLEVBRTNEO0FBRUQsSUFBTUMsb0JBQW9CLEdBQUdULDRCQUFNLENBQUNDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLFVBQUFDLEtBQUs7RUFBQSxPQUFLO0lBQ3REQyxTQUFTLEVBQUUsSUFBQUMsc0JBQVUsRUFBQyx5QkFBeUIsRUFBRUYsS0FBSyxDQUFDQyxTQUFTO0VBQ2xFLENBQUM7QUFBQSxDQUFDLENBQUMsQ0FBQXRELGdCQUFBLEtBQUFBLGdCQUFBLE9BQUF3RCx1QkFBQSxtSEFLRjtBQUVELElBQU1JLHFCQUFxQixHQUFHViw0QkFBTSxDQUFDQyxHQUFHLENBQUNDLEtBQUssQ0FBQztFQUM3Q0UsU0FBUyxFQUFFO0FBQ2IsQ0FBQyxDQUFDLENBQUFyRCxnQkFBQSxLQUFBQSxnQkFBQSxPQUFBdUQsdUJBQUEsd0NBRUQ7QUFFRCxJQUFNSyxpQkFBaUIsR0FBR1gsNEJBQU0sQ0FBQ0MsR0FBRyxDQUFDQyxLQUFLLENBQUM7RUFDekNFLFNBQVMsRUFBRTtBQUNiLENBQUMsQ0FBQyxDQUFBcEQsZ0JBQUEsS0FBQUEsZ0JBQUEsT0FBQXNELHVCQUFBLHlaQUdTLFVBQUFILEtBQUs7RUFBQSxPQUFLQSxLQUFLLENBQUNTLE1BQU0sR0FBR1QsS0FBSyxDQUFDSSxLQUFLLENBQUNNLFdBQVcsR0FBR1YsS0FBSyxDQUFDSSxLQUFLLENBQUNPLFlBQVk7QUFBQSxDQUFDLEVBaUIxRSxVQUFBWCxLQUFLO0VBQUEsT0FBSUEsS0FBSyxDQUFDSSxLQUFLLENBQUNNLFdBQVc7QUFBQSxHQUc5QixVQUFBVixLQUFLO0VBQUEsT0FBSUEsS0FBSyxDQUFDSSxLQUFLLENBQUNNLFdBQVc7QUFBQSxFQUc5QztBQUVELElBQU1FLGFBQWEsR0FBRyxJQUFBZiw0QkFBTSxFQUFDZ0IsbUJBQU8sQ0FBQyxDQUFBL0QsZ0JBQUEsS0FBQUEsZ0JBQUEsT0FBQXFELHVCQUFBLDZDQUVwQztBQUVELElBQU1XLFdBQXVDLEdBQUFDLE9BQUEsQ0FBQUQsV0FBQSxnQkFBR0UsaUJBQUssQ0FBQ0MsSUFBSSxDQUFDLFVBQUFDLElBQUEsRUFBZ0M7RUFBQSxJQUE5QkMsSUFBSSxHQUFBRCxJQUFBLENBQUpDLElBQUk7SUFBRUMsa0JBQWtCLEdBQUFGLElBQUEsQ0FBbEJFLGtCQUFrQjtFQUNuRixJQUFNQyxPQUFPLEdBQUcsSUFBQUMsa0JBQVcsRUFBQyxZQUFNO0lBQ2hDLElBQUlILElBQUksQ0FBQ0ksaUJBQWlCLEVBQUU7TUFDMUJILGtCQUFrQixDQUFDRCxJQUFJLENBQUNLLEVBQUUsQ0FBQztJQUM3QixDQUFDLE1BQU07TUFDTEwsSUFBSSxDQUFDRSxPQUFPLElBQUlGLElBQUksQ0FBQ0UsT0FBTyxDQUFDLENBQUM7SUFDaEM7RUFDRixDQUFDLEVBQUUsQ0FBQ0YsSUFBSSxFQUFFQyxrQkFBa0IsQ0FBQyxDQUFDO0VBRTlCLG9CQUNFM0YsTUFBQSxZQUFBZ0csYUFBQSxDQUFDakIsaUJBQWlCO0lBQ2hCZ0IsRUFBRSxLQUFBRSxNQUFBLENBQUtQLElBQUksQ0FBQ0ssRUFBRSxZQUFVO0lBQ3hCLGdCQUFRO0lBQ1IsZUFBQUUsTUFBQSxDQUFhUCxJQUFJLENBQUNLLEVBQUUsWUFBVTtJQUM5QkgsT0FBTyxFQUFFQTtFQUFRLEdBRWhCRixJQUFJLENBQUNRLEtBQUssZ0JBQUdsRyxNQUFBLFlBQUFnRyxhQUFBLFlBQUlOLElBQUksQ0FBQ1EsS0FBUyxDQUFDLEdBQUcsSUFBSSxlQUN4Q2xHLE1BQUEsWUFBQWdHLGFBQUE7SUFBR0csTUFBTSxFQUFFVCxJQUFJLENBQUNVLEtBQUssR0FBRyxRQUFRLEdBQUcsRUFBRztJQUFDQyxJQUFJLEVBQUVYLElBQUksQ0FBQ1csSUFBSztJQUFDQyxHQUFHLEVBQUM7RUFBWSxnQkFDdEV0RyxNQUFBLFlBQUFnRyxhQUFBLENBQUNOLElBQUksQ0FBQ2EsYUFBYSxNQUFBQyxTQUFBO0lBQUNDLE1BQU0sRUFBQztFQUFNLEdBQUtmLElBQUksQ0FBQ2dCLGtCQUFrQixDQUFHLENBQy9ELENBQUMsRUFDSGhCLElBQUksQ0FBQ2lCLE9BQU8sZ0JBQ1gzRyxNQUFBLFlBQUFnRyxhQUFBLENBQUN6RixrQkFBQSxDQUFBcUcsT0FBTztJQUFDYixFQUFFLEtBQUFFLE1BQUEsQ0FBS1AsSUFBSSxDQUFDSyxFQUFFLFlBQVU7SUFBQ2MsS0FBSyxFQUFDLFFBQVE7SUFBQ0MsU0FBUyxFQUFFLEdBQUk7SUFBQ0MsTUFBTSxFQUFDO0VBQU8sZ0JBQzdFL0csTUFBQSxZQUFBZ0csYUFBQSxDQUFDcEYsYUFBQSxDQUFBb0csZ0JBQWdCO0lBQUNqQixFQUFFLEVBQUVMLElBQUksQ0FBQ2lCO0VBQVEsQ0FBRSxDQUM5QixDQUFDLEdBQ1IsSUFDYSxDQUFDO0FBRXhCLENBQUMsQ0FBQztBQUNGdEIsV0FBVyxDQUFDNEIsV0FBVyxHQUFHLGFBQWE7QUFHaEMsSUFBTUMsMEJBQTBCLEdBQUE1QixPQUFBLENBQUE0QiwwQkFBQSxHQUFHLFNBQTdCQSwwQkFBMEJBLENBQUEsRUFBUztFQUM5QyxJQUFNQyxtQkFBdUQsR0FBRyxTQUExREEsbUJBQXVEQSxDQUFBQyxLQUFBLEVBQW1DO0lBQUEsSUFBOUJDLEtBQUssR0FBQUQsS0FBQSxDQUFMQyxLQUFLO01BQUVDLElBQUksR0FBQUYsS0FBQSxDQUFKRSxJQUFJO01BQUVDLE9BQU8sR0FBQUgsS0FBQSxDQUFQRyxPQUFPO01BQUV4QixFQUFFLEdBQUFxQixLQUFBLENBQUZyQixFQUFFO0lBQ3hGLElBQU15QixHQUFHLEdBQUcsSUFBQUMsNkJBQWlCLEVBQWlCRixPQUFPLENBQUM7SUFDdEQsb0JBQ0V2SCxNQUFBLFlBQUFnRyxhQUFBLENBQUNiLGFBQWE7TUFBQ21DLElBQUksRUFBRUEsSUFBSztNQUFDOUMsU0FBUyxLQUFBeUIsTUFBQSxDQUFLRixFQUFFO0lBQVksR0FDcER1QixJQUFJLGdCQUNIdEgsTUFBQSxZQUFBZ0csYUFBQSxDQUFDekYsa0JBQUEsQ0FBQW1ILG1CQUFtQjtNQUFDQyxJQUFJLEVBQUMsTUFBTTtNQUFDSCxHQUFHLEVBQUVBLEdBQUk7TUFBQ2hELFNBQVMsRUFBQztJQUE4QixHQUNoRjZDLEtBQUssQ0FBQ08sR0FBRyxDQUFDLFVBQUFsQyxJQUFJO01BQUEsb0JBQ2IxRixNQUFBLFlBQUFnRyxhQUFBLENBQUNyRixZQUFBLFdBQVc7UUFDVm9GLEVBQUUsRUFBRUwsSUFBSSxDQUFDbUMsR0FBSTtRQUNiQSxHQUFHLEVBQUVuQyxJQUFJLENBQUNtQyxHQUFJO1FBQ2QzQixLQUFLLEVBQUVSLElBQUksQ0FBQ1EsS0FBTTtRQUNsQjRCLElBQUksRUFBRXBDLElBQUksQ0FBQ29DLElBQUs7UUFDaEJsQyxPQUFPLEVBQUVGLElBQUksQ0FBQ0UsT0FBUTtRQUN0QjJCLE9BQU8sRUFBRUE7TUFBUSxDQUNsQixDQUFDO0lBQUEsQ0FDSCxDQUNrQixDQUFDLEdBQ3BCLElBQ1MsQ0FBQztFQUVwQixDQUFDO0VBRUQsT0FBT0osbUJBQW1CO0FBQzVCLENBQUM7QUFFRCxJQUFNWSx3QkFBd0IsR0FBRyxTQUEzQkEsd0JBQXdCQSxDQUFBO0VBQUEsT0FDNUIsSUFBQUMsd0JBQWMsRUFDWixVQUFDekQsS0FBNkI7SUFBQSxPQUFLQSxLQUFLO0VBQUEsR0FDeEMsVUFBQUEsS0FBSztJQUFBLE9BQ0gsQ0FBQ0EsS0FBSyxDQUFDOEMsS0FBSyxJQUFJLEVBQUUsRUFDZk8sR0FBRyxDQUFDLFVBQUFsRyxDQUFDO01BQUEsT0FBQWtDLGFBQUEsQ0FBQUEsYUFBQSxLQUNEbEMsQ0FBQztRQUNKa0UsT0FBTyxFQUFFbEUsQ0FBQyxDQUFDa0UsT0FBTyxJQUFJbEUsQ0FBQyxDQUFDa0UsT0FBTyxDQUFDckIsS0FBSyxDQUFDLEdBQUc3QyxDQUFDLENBQUNrRSxPQUFPLENBQUNyQixLQUFLLENBQUMsR0FBRztNQUFJO0lBQUEsQ0FDaEUsQ0FBQyxDQUNGZCxNQUFNLENBQUMsVUFBQXdFLENBQUM7TUFBQSxPQUFJQSxDQUFDLENBQUNyQyxPQUFPO0lBQUEsRUFBQztFQUFBLENBQzdCLENBQUM7QUFBQTtBQUVJLElBQU1zQyx5QkFBeUIsR0FBQTVDLE9BQUEsQ0FBQTRDLHlCQUFBLEdBQUcsU0FBNUJBLHlCQUF5QkEsQ0FDcENmLG1CQUFrRSxFQUMvRDtFQUNILElBQU1nQixxQkFBcUIsR0FBR0osd0JBQXdCLENBQUMsQ0FBQztFQUV4RCxJQUFNSyxZQUFZLEdBQUcsQ0FDbkI7SUFDRWxDLEtBQUssRUFBRSxxQkFBcUI7SUFDNUI0QixJQUFJLEVBQUVPLGNBQU87SUFDYlIsR0FBRyxFQUFFLE9BQU87SUFDWmpDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFFckIsS0FBSztNQUFBLE9BQUlBLEtBQUssQ0FBQytELGFBQWE7SUFBQTtFQUN2QyxDQUFDLEVBQ0Q7SUFDRXBDLEtBQUssRUFBRSxvQkFBb0I7SUFDM0I0QixJQUFJLEVBQUVTLGdCQUFTO0lBQ2ZWLEdBQUcsRUFBRSxNQUFNO0lBQ1hqQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBRXJCLEtBQUs7TUFBQSxPQUFJQSxLQUFLLENBQUNpRSxZQUFZO0lBQUE7RUFDdEMsQ0FBQyxFQUNEO0lBQ0V0QyxLQUFLLEVBQUUsbUJBQW1CO0lBQzFCNEIsSUFBSSxFQUFFVyxVQUFPO0lBQ2JaLEdBQUcsRUFBRSxLQUFLO0lBQ1ZqQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBRXJCLEtBQUs7TUFBQSxPQUFJQSxLQUFLLENBQUNtRSxXQUFXO0lBQUE7RUFDckMsQ0FBQyxFQUNEO0lBQ0V4QyxLQUFLLEVBQUUsaUJBQWlCO0lBQ3hCNEIsSUFBSSxFQUFFYSxZQUFLO0lBQ1hkLEdBQUcsRUFBRSxNQUFNO0lBQ1hqQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBRXJCLEtBQUs7TUFBQSxPQUFJQSxLQUFLLENBQUNxRSxTQUFTO0lBQUE7RUFDbkMsQ0FBQyxFQUNEO0lBQ0UxQyxLQUFLLEVBQUUscUJBQXFCO0lBQzVCNEIsSUFBSSxFQUFFZSxZQUFLO0lBQ1hoQixHQUFHLEVBQUUsT0FBTztJQUNaakMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUVyQixLQUFLO01BQUEsT0FBSUEsS0FBSyxDQUFDdUUsVUFBVTtJQUFBO0VBQ3BDLENBQUMsQ0FDRjtFQUVELElBQU1DLGtCQUVMLEdBQUcsU0FGRUEsa0JBRUxBLENBQUFDLEtBQUEsRUFBNkM7SUFBQSxJQUFBQyxXQUFBLEdBQUFELEtBQUEsQ0FBeEMzQixLQUFLO01BQUxBLEtBQUssR0FBQTRCLFdBQUEsY0FBR2IsWUFBWSxHQUFBYSxXQUFBO01BQUtDLFNBQVMsT0FBQUMseUJBQUEsYUFBQUgsS0FBQSxFQUFBbEksU0FBQTtJQUN0QyxJQUFNeUQsS0FBSyxHQUFBWCxhQUFBLENBQUFBLGFBQUEsS0FBT3NGLFNBQVM7TUFBRTdCLEtBQUssRUFBTEE7SUFBSyxFQUFDO0lBQ25DLG9CQUNFckgsTUFBQSxZQUFBZ0csYUFBQSxDQUFDbUIsbUJBQW1CO01BQ2xCRSxLQUFLLEVBQUVjLHFCQUFxQixDQUFDNUQsS0FBSyxDQUFFO01BQ3BDK0MsSUFBSSxFQUFFL0MsS0FBSyxDQUFDK0MsSUFBSztNQUNqQkMsT0FBTyxFQUFFaEQsS0FBSyxDQUFDZ0QsT0FBUTtNQUN2QnhCLEVBQUUsRUFBQztJQUFhLENBQ2pCLENBQUM7RUFFTixDQUFDO0VBQ0RnRCxrQkFBa0IsQ0FBQ1gsWUFBWSxHQUFHQSxZQUFZO0VBQzlDLE9BQU9XLGtCQUFrQjtBQUMzQixDQUFDO0FBQ0RiLHlCQUF5QixDQUFDa0IsSUFBSSxHQUFHLENBQUNsQywwQkFBMEIsQ0FBQztBQUV0RCxJQUFNbUMsMkJBQTJCLEdBQUEvRCxPQUFBLENBQUErRCwyQkFBQSxHQUFHLFNBQTlCQSwyQkFBMkJBLENBQ3RDbEMsbUJBQWtFLEVBQy9EO0VBQ0gsSUFBTWdCLHFCQUFxQixHQUFHSix3QkFBd0IsQ0FBQyxDQUFDO0VBQ3hELElBQU1LLFlBQVksR0FBRyxDQUNuQjtJQUNFbEMsS0FBSyxFQUFFLE1BQU07SUFDYjRCLElBQUksRUFBRWEsWUFBSztJQUNYZCxHQUFHLEVBQUUsTUFBTTtJQUNYakMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUVyQixLQUFLO01BQUEsT0FBSUEsS0FBSyxDQUFDK0UsZUFBZTtJQUFBO0VBQ3pDLENBQUMsRUFDRDtJQUNFcEQsS0FBSyxFQUFFLFNBQVM7SUFDaEI0QixJQUFJLEVBQUVhLFlBQUs7SUFDWGQsR0FBRyxFQUFFLFFBQVE7SUFDYmpDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFFckIsS0FBSztNQUFBLE9BQUlBLEtBQUssQ0FBQ2dGLGlCQUFpQjtJQUFBO0VBQzNDLENBQUMsQ0FDRjtFQUNELElBQU1DLG9CQUVMLEdBQUcsU0FGRUEsb0JBRUxBLENBQUFDLEtBQUEsRUFBNkM7SUFBQSxJQUFBQyxXQUFBLEdBQUFELEtBQUEsQ0FBeENwQyxLQUFLO01BQUxBLEtBQUssR0FBQXFDLFdBQUEsY0FBR3RCLFlBQVksR0FBQXNCLFdBQUE7TUFBS1IsU0FBUyxPQUFBQyx5QkFBQSxhQUFBTSxLQUFBLEVBQUExSSxVQUFBO0lBQ3RDLElBQU13RCxLQUFLLEdBQUFYLGFBQUEsQ0FBQUEsYUFBQSxLQUFPc0YsU0FBUztNQUFFN0IsS0FBSyxFQUFMQTtJQUFLLEVBQUM7SUFDbkMsb0JBQ0VySCxNQUFBLFlBQUFnRyxhQUFBLENBQUNtQixtQkFBbUI7TUFDbEJFLEtBQUssRUFBRWMscUJBQXFCLENBQUM1RCxLQUFLLENBQUU7TUFDcEMrQyxJQUFJLEVBQUUvQyxLQUFLLENBQUMrQyxJQUFLO01BQ2pCQyxPQUFPLEVBQUVoRCxLQUFLLENBQUNnRCxPQUFRO01BQ3ZCeEIsRUFBRSxFQUFDO0lBQWUsQ0FDbkIsQ0FBQztFQUVOLENBQUM7RUFDRHlELG9CQUFvQixDQUFDcEIsWUFBWSxHQUFHQSxZQUFZO0VBQ2hELE9BQU9vQixvQkFBb0I7QUFDN0IsQ0FBQztBQUNESCwyQkFBMkIsQ0FBQ0QsSUFBSSxHQUFHLENBQUNsQywwQkFBMEIsQ0FBQztBQUUvRHlDLGtCQUFrQixDQUFDUCxJQUFJLEdBQUcsQ0FBQ2xCLHlCQUF5QixFQUFFbUIsMkJBQTJCLENBQUM7QUFFbEYsU0FBU00sa0JBQWtCQSxDQUN6Qlosa0JBQWdFLEVBQ2hFUyxvQkFBb0UsRUFDN0I7RUFBQSxJQUFBSSxZQUFBO0VBQ3ZDLE9BQUFBLFlBQUEsMEJBQUFDLFVBQUE7SUFBQSxTQUFBQyxZQUFBO01BQUEsSUFBQUMsZ0JBQUEsbUJBQUFELFdBQUE7TUFBQSxPQUFBcEgsVUFBQSxPQUFBb0gsV0FBQSxFQUFBakcsU0FBQTtJQUFBO0lBQUEsSUFBQW1HLFVBQUEsYUFBQUYsV0FBQSxFQUFBRCxVQUFBO0lBQUEsV0FBQUksYUFBQSxhQUFBSCxXQUFBO01BQUFqQyxHQUFBO01BQUFxQyxLQUFBLEVBeUJFLFNBQUFDLE1BQU1BLENBQUEsRUFBRztRQUNQLElBQUFDLFdBQUEsR0FTSSxJQUFJLENBQUM3RixLQUFLO1VBUlo4RixPQUFPLEdBQUFELFdBQUEsQ0FBUEMsT0FBTztVQUNQQyxVQUFVLEdBQUFGLFdBQUEsQ0FBVkUsVUFBVTtVQUNWQyxPQUFPLEdBQUFILFdBQUEsQ0FBUEcsT0FBTztVQUNQQyxXQUFXLEdBQUFKLFdBQUEsQ0FBWEksV0FBVztVQUNYQyxlQUFlLEdBQUFMLFdBQUEsQ0FBZkssZUFBZTtVQUNmOUUsa0JBQWtCLEdBQUF5RSxXQUFBLENBQWxCekUsa0JBQWtCO1VBQ2xCK0Usa0JBQWtCLEdBQUFOLFdBQUEsQ0FBbEJNLGtCQUFrQjtVQUNmQyxpQkFBaUIsT0FBQXhCLHlCQUFBLGFBQUFpQixXQUFBLEVBQUFwSixVQUFBO1FBRXRCLElBQUlxRyxLQUFLLEdBQUdtRCxXQUFXLElBQUksRUFBRTs7UUFFN0I7UUFDQSxJQUFJLE9BQU8sSUFBSSxDQUFDakcsS0FBSyxDQUFDK0UsZUFBZSxLQUFLLFVBQVUsRUFBRTtVQUNwRGpDLEtBQUssR0FBR0EsS0FBSyxDQUFDNUQsTUFBTSxDQUFDLFVBQUFtSCxFQUFFO1lBQUEsT0FBSUEsRUFBRSxDQUFDN0UsRUFBRSxLQUFLLFNBQVM7VUFBQSxFQUFDO1FBQ2pEO1FBRUEsb0JBQ0UvRixNQUFBLFlBQUFnRyxhQUFBLENBQUM3QixpQkFBaUI7VUFBQ0ssU0FBUyxFQUFDO1FBQTBCLGdCQUNyRHhFLE1BQUEsWUFBQWdHLGFBQUEsQ0FBQ25CLG9CQUFvQjtVQUFDTCxTQUFTLEVBQUM7UUFBK0IsR0FDNUQsSUFBSSxDQUFDRCxLQUFLLENBQUNzRyxhQUFhLGlCQUN2QjdLLE1BQUEsWUFBQWdHLGFBQUEsTUFBTXpCLEtBQUssQ0FBQ3NHLGFBQWE7VUFDdkJSLE9BQU8sRUFBRUEsT0FBUTtVQUNqQkUsT0FBTyxFQUFFQSxPQUFRO1VBQ2pCRCxVQUFVLEVBQUVBO1FBQVcsQ0FDeEIsQ0FDRixlQUNEdEssTUFBQSxZQUFBZ0csYUFBQSxDQUFDbEIscUJBQXFCLFFBQ25CdUMsS0FBSyxDQUFDTyxHQUFHLENBQUMsVUFBQWxDLElBQUk7VUFBQSxvQkFDYjFGLE1BQUEsWUFBQWdHLGFBQUE7WUFDRXhCLFNBQVMsRUFBQyxpQ0FBaUM7WUFDM0NxRCxHQUFHLEVBQUVuQyxJQUFJLENBQUNLLEVBQUc7WUFDYitFLEtBQUssRUFBRTtjQUFDQyxRQUFRLEVBQUU7WUFBVTtVQUFFLGdCQUU5Qi9LLE1BQUEsWUFBQWdHLGFBQUEsQ0FBQ1gsV0FBVztZQUFDSyxJQUFJLEVBQUVBLElBQUs7WUFBQ0Msa0JBQWtCLEVBQUVBO1VBQW1CLENBQUUsQ0FBQyxFQUNsRUQsSUFBSSxDQUFDSSxpQkFBaUIsZ0JBQ3JCOUYsTUFBQSxZQUFBZ0csYUFBQSxDQUFDTixJQUFJLENBQUNJLGlCQUFpQixNQUFBVSxTQUFBO1lBQ3JCZSxPQUFPLEVBQUVtRCxrQkFBbUI7WUFDNUJwRCxJQUFJLEVBQUVtRCxlQUFlLEtBQUsvRSxJQUFJLENBQUNLO1VBQUcsR0FDOUI0RSxpQkFBaUIsQ0FDdEIsQ0FBQyxHQUNBLElBQ0QsQ0FBQztRQUFBLENBQ1AsQ0FDb0IsQ0FDSCxDQUNMLENBQUM7TUFFeEI7SUFBQztFQUFBLEVBMUU4QkssZ0JBQVMsT0FBQWhILGdCQUFBLGFBQUE0RixZQUFBLGtCQUNsQjtJQUNwQmlCLGFBQWEsRUFBRUksZ0JBQVk7SUFDM0JULFdBQVcsRUFBRSxDQUNYO01BQ0V6RSxFQUFFLEVBQUUsU0FBUztNQUNiUSxhQUFhLEVBQUUyRSxTQUFFO01BQ2pCdkUsT0FBTyxFQUFFLHNCQUFzQjtNQUMvQmYsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUEsRUFBUTtRQUNiO01BQ0YsQ0FBQztNQUNERSxpQkFBaUIsRUFBRTBEO0lBQ3JCLENBQUMsRUFDRDtNQUNFekQsRUFBRSxFQUFFLE1BQU07TUFDVlEsYUFBYSxFQUFFNEUsV0FBSTtNQUNuQnZGLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBLEVBQVE7UUFDYjtNQUNGLENBQUM7TUFDRE0sS0FBSyxFQUFFLE9BQU87TUFDZEosaUJBQWlCLEVBQUVpRDtJQUNyQixDQUFDO0VBRUwsQ0FBQyxHQUFBYSxZQUFBO0FBcURMO0FBQUMsSUFBQXdCLFFBQUEsR0FBQTlGLE9BQUEsY0FFY3FFLGtCQUFrQiIsImlnbm9yZUxpc3QiOltdfQ==
;