kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
288 lines (286 loc) • 41.5 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getChildPos = exports["default"] = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _debounce = _interopRequireDefault(require("lodash/debounce"));
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
var _exenv = require("exenv");
var _styledComponents = require("styled-components");
var _context = require("../context");
var _reactModal = _interopRequireDefault(require("react-modal"));
var _window = _interopRequireDefault(require("global/window"));
var _styles = require("@kepler.gl/styles");
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; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
var listeners = {};
var startListening = function startListening() {
return Object.keys(listeners).forEach(function (key) {
return listeners[key]();
});
};
var getPageOffset = function getPageOffset() {
return {
x: _window["default"].pageXOffset !== undefined ? _window["default"].pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft,
y: _window["default"].pageYOffset !== undefined ? _window["default"].pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop
};
};
var addEventListeners = function addEventListeners() {
if (document && document.body) document.body.addEventListener('mousewheel', (0, _debounce["default"])(startListening, 100, {
leading: true
}));
_window["default"].addEventListener('resize', (0, _debounce["default"])(startListening, 50, {
leading: true
}));
};
var getChildPos = exports.getChildPos = function getChildPos(_ref) {
var offsets = _ref.offsets,
rect = _ref.rect,
childRect = _ref.childRect,
pageOffset = _ref.pageOffset,
padding = _ref.padding;
var topOffset = offsets.topOffset,
leftOffset = offsets.leftOffset,
rightOffset = offsets.rightOffset;
var anchorLeft = leftOffset !== undefined;
var pos = _objectSpread({
top: pageOffset.y + rect.top + (topOffset || 0)
}, anchorLeft ? {
left: pageOffset.x + rect.left + (leftOffset || 0)
} : {
right: _window["default"].innerWidth - rect.right - pageOffset.x + (rightOffset || 0)
});
var leftOrRight = anchorLeft ? 'left' : 'right';
if (pos[leftOrRight] && pos[leftOrRight] < 0) {
pos[leftOrRight] = padding;
} else if (pos[leftOrRight] && pos[leftOrRight] + childRect.width > _window["default"].innerWidth) {
pos[leftOrRight] = _window["default"].innerWidth - childRect.width - padding;
}
if (pos.top < 0) {
pos.top = padding;
} else if (pos.top + childRect.height > _window["default"].innerHeight) {
pos.top = _window["default"].innerHeight - childRect.height - padding;
}
return pos;
};
if (_exenv.canUseDOM) {
if (document.body) {
addEventListeners();
} else {
document.addEventListener('DOMContentLoaded', addEventListeners);
}
}
var listenerIdCounter = 0;
function subscribe(fn) {
listenerIdCounter += 1;
var id = listenerIdCounter;
listeners[id] = fn;
return function () {
return delete listeners[id];
};
}
var defaultModalStyle = {
content: {
top: 0,
left: 0,
border: 0,
right: 'auto',
bottom: 'auto',
padding: '0px 0px 0px 0px'
},
overlay: {
right: 'auto',
bottom: 'auto',
width: '100vw',
height: '100vh',
backgroundColor: 'rgba(0, 0, 0, 0)'
}
};
var WINDOW_PAD = 40;
var noop = function noop() {
return;
};
var DefaultComponent = 'div';
var Portaled = /*#__PURE__*/function (_Component) {
function Portaled() {
var _this;
(0, _classCallCheck2["default"])(this, Portaled);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _callSuper(this, Portaled, [].concat(args));
(0, _defineProperty2["default"])(_this, "state", {
pos: null,
isVisible: false
});
(0, _defineProperty2["default"])(_this, "unsubscribe", undefined);
(0, _defineProperty2["default"])(_this, "_unmounted", false);
(0, _defineProperty2["default"])(_this, "element", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2["default"])(_this, "child", /*#__PURE__*/(0, _react.createRef)());
// eslint-disable-next-line complexity
(0, _defineProperty2["default"])(_this, "handleScroll", function () {
if (_this.child.current && _this.element.current) {
var rect = _this.element.current.getBoundingClientRect();
var childRect = _this.child.current.getBoundingClientRect();
var pageOffset = getPageOffset();
var _this$props = _this.props,
topOffset = _this$props.top,
_this$props$left = _this$props.left,
leftOffset = _this$props$left === void 0 ? 0 : _this$props$left,
rightOffset = _this$props.right;
var pos = getChildPos({
offsets: {
topOffset: topOffset,
leftOffset: leftOffset,
rightOffset: rightOffset
},
rect: rect,
childRect: childRect,
pageOffset: pageOffset,
padding: WINDOW_PAD
});
if (!(0, _isEqual["default"])(pos, _this.state.pos)) {
_this.setState({
pos: pos
});
}
}
});
return _this;
}
(0, _inherits2["default"])(Portaled, _Component);
return (0, _createClass2["default"])(Portaled, [{
key: "componentDidMount",
value: function componentDidMount() {
this._unmounted = false;
// relative
this.unsubscribe = subscribe(this.handleScroll);
this.handleScroll();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
var _this2 = this;
var didOpen = this.props.isOpened && !prevProps.isOpened;
var didClose = !this.props.isOpened && prevProps.isOpened;
if (didOpen || didClose) {
_window["default"].requestAnimationFrame(function () {
if (_this2._unmounted) return;
_this2.setState({
isVisible: Boolean(didOpen)
});
});
}
this.handleScroll();
}
// ColorPicker will throw a cross-origin error when it is closed
// when the app is within an iframe.
// This is a known issue of react-color component:
// see: https://github.com/casesandberg/react-color/issues/806
}, {
key: "componentDidCatch",
value: function componentDidCatch() {
// Do nothing here, since React will try to recreate this component
// tree from scratch using the error boundary, which is this component
// itself. This is a temporal fix for a crash.
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this._unmounted = true;
// @ts-ignore
this.unsubscribe();
}
}, {
key: "render",
value: function render() {
var _this3 = this;
var _this$props2 = this.props,
_this$props2$componen = _this$props2.component,
component = _this$props2$componen === void 0 ? DefaultComponent : _this$props2$componen,
overlayZIndex = _this$props2.overlayZIndex,
isOpened = _this$props2.isOpened,
onClose = _this$props2.onClose,
children = _this$props2.children,
modalProps = _this$props2.modalProps,
_this$props2$modalSty = _this$props2.modalStyle,
modalStyle = _this$props2$modalSty === void 0 ? {} : _this$props2$modalSty;
var _this$state = this.state,
isVisible = _this$state.isVisible,
pos = _this$state.pos;
var newModalStyle = _objectSpread(_objectSpread({}, defaultModalStyle), {}, {
content: _objectSpread({}, modalStyle.content || {}),
overlay: _objectSpread(_objectSpread(_objectSpread({}, defaultModalStyle.overlay), modalStyle.overlay || {}), {}, {
// needs to be on top of existing modal
zIndex: overlayZIndex || 9999
})
});
var Comp = component;
return /*#__PURE__*/_react["default"].createElement(_context.RootContext.Consumer, null, function (context) {
return /*#__PURE__*/_react["default"].createElement(Comp, {
ref: _this3.element
}, isOpened ? /*#__PURE__*/_react["default"].createElement(_reactModal["default"], (0, _extends2["default"])({
className: "modal-portal"
}, modalProps, {
ariaHideApp: false,
isOpen: true,
style: newModalStyle,
parentSelector: function parentSelector() {
// React modal issue: https://github.com/reactjs/react-modal/issues/769
// failed to execute removeChild on parent node when it is already unmounted
return context && context.current || document.body;
},
onRequestClose: onClose
}), /*#__PURE__*/_react["default"].createElement("div", {
className: "portaled-content",
key: "item",
style: _objectSpread({
position: 'fixed',
opacity: isVisible ? 1 : 0,
transition: _this3.props.theme.transitionFast,
marginTop: isVisible ? '0px' : '14px'
}, pos)
}, /*#__PURE__*/_react["default"].createElement("div", {
ref: _this3.child,
style: {
position: 'absolute',
zIndex: overlayZIndex ? overlayZIndex + 1 : 10000
}
}, children))) : null);
});
}
}], [{
key: "getDerivedStateFromError",
value:
// Make Portaled a component with Error Boundary, so React can recreate
// this component if the child 'ColorPicker' throws cross-origin error.
// see function componentDidCatch()
function getDerivedStateFromError() {
return {
hasError: true
};
}
}]);
}(_react.Component);
(0, _defineProperty2["default"])(Portaled, "defaultProps", {
component: DefaultComponent,
onClose: noop,
theme: _styles.theme
});
var _default = exports["default"] = (0, _styledComponents.withTheme)(Portaled);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfZGVib3VuY2UiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2lzRXF1YWwiLCJfZXhlbnYiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9jb250ZXh0IiwiX3JlYWN0TW9kYWwiLCJfd2luZG93IiwiX3N0eWxlcyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl9jYWxsU3VwZXIiLCJvIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJhcHBseSIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwibGlzdGVuZXJzIiwic3RhcnRMaXN0ZW5pbmciLCJrZXkiLCJnZXRQYWdlT2Zmc2V0IiwieCIsIldpbmRvdyIsInBhZ2VYT2Zmc2V0IiwidW5kZWZpbmVkIiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJib2R5IiwicGFyZW50Tm9kZSIsInNjcm9sbExlZnQiLCJ5IiwicGFnZVlPZmZzZXQiLCJzY3JvbGxUb3AiLCJhZGRFdmVudExpc3RlbmVycyIsImFkZEV2ZW50TGlzdGVuZXIiLCJkZWJvdW5jZSIsImxlYWRpbmciLCJnZXRDaGlsZFBvcyIsImV4cG9ydHMiLCJfcmVmIiwib2Zmc2V0cyIsInJlY3QiLCJjaGlsZFJlY3QiLCJwYWdlT2Zmc2V0IiwicGFkZGluZyIsInRvcE9mZnNldCIsImxlZnRPZmZzZXQiLCJyaWdodE9mZnNldCIsImFuY2hvckxlZnQiLCJwb3MiLCJ0b3AiLCJsZWZ0IiwicmlnaHQiLCJpbm5lcldpZHRoIiwibGVmdE9yUmlnaHQiLCJ3aWR0aCIsImhlaWdodCIsImlubmVySGVpZ2h0IiwiY2FuVXNlRE9NIiwibGlzdGVuZXJJZENvdW50ZXIiLCJzdWJzY3JpYmUiLCJmbiIsImlkIiwiZGVmYXVsdE1vZGFsU3R5bGUiLCJjb250ZW50IiwiYm9yZGVyIiwiYm90dG9tIiwib3ZlcmxheSIsImJhY2tncm91bmRDb2xvciIsIldJTkRPV19QQUQiLCJub29wIiwiRGVmYXVsdENvbXBvbmVudCIsIlBvcnRhbGVkIiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY29uY2F0IiwiaXNWaXNpYmxlIiwiY3JlYXRlUmVmIiwiY2hpbGQiLCJjdXJyZW50IiwiZWxlbWVudCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIl90aGlzJHByb3BzIiwicHJvcHMiLCJfdGhpcyRwcm9wcyRsZWZ0IiwiaXNFcXVhbCIsInN0YXRlIiwic2V0U3RhdGUiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsInZhbHVlIiwiY29tcG9uZW50RGlkTW91bnQiLCJfdW5tb3VudGVkIiwidW5zdWJzY3JpYmUiLCJoYW5kbGVTY3JvbGwiLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJfdGhpczIiLCJkaWRPcGVuIiwiaXNPcGVuZWQiLCJkaWRDbG9zZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNvbXBvbmVudERpZENhdGNoIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJyZW5kZXIiLCJfdGhpczMiLCJfdGhpcyRwcm9wczIiLCJfdGhpcyRwcm9wczIkY29tcG9uZW4iLCJjb21wb25lbnQiLCJvdmVybGF5WkluZGV4Iiwib25DbG9zZSIsImNoaWxkcmVuIiwibW9kYWxQcm9wcyIsIl90aGlzJHByb3BzMiRtb2RhbFN0eSIsIm1vZGFsU3R5bGUiLCJfdGhpcyRzdGF0ZSIsIm5ld01vZGFsU3R5bGUiLCJ6SW5kZXgiLCJDb21wIiwiY3JlYXRlRWxlbWVudCIsIlJvb3RDb250ZXh0IiwiQ29uc3VtZXIiLCJjb250ZXh0IiwicmVmIiwiX2V4dGVuZHMyIiwiY2xhc3NOYW1lIiwiYXJpYUhpZGVBcHAiLCJpc09wZW4iLCJzdHlsZSIsInBhcmVudFNlbGVjdG9yIiwib25SZXF1ZXN0Q2xvc2UiLCJwb3NpdGlvbiIsIm9wYWNpdHkiLCJ0cmFuc2l0aW9uIiwidGhlbWUiLCJ0cmFuc2l0aW9uRmFzdCIsIm1hcmdpblRvcCIsImdldERlcml2ZWRTdGF0ZUZyb21FcnJvciIsImhhc0Vycm9yIiwiQ29tcG9uZW50IiwiX2RlZmF1bHQiLCJ3aXRoVGhlbWUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbW9uL3BvcnRhbGVkLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIGNyZWF0ZVJlZiwgUHJvcHNXaXRoQ2hpbGRyZW59IGZyb20gJ3JlYWN0JztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuXG5pbXBvcnQge2NhblVzZURPTX0gZnJvbSAnZXhlbnYnO1xuaW1wb3J0IHt3aXRoVGhlbWV9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7Um9vdENvbnRleHR9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IE1vZGFsIGZyb20gJ3JlYWN0LW1vZGFsJztcbmltcG9ydCBXaW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQge3RoZW1lfSBmcm9tICdAa2VwbGVyLmdsL3N0eWxlcyc7XG5cbmNvbnN0IGxpc3RlbmVycyA9IHt9O1xuXG5jb25zdCBzdGFydExpc3RlbmluZyA9ICgpID0+IE9iamVjdC5rZXlzKGxpc3RlbmVycykuZm9yRWFjaChrZXkgPT4gbGlzdGVuZXJzW2tleV0oKSk7XG5cbmNvbnN0IGdldFBhZ2VPZmZzZXQgPSAoKSA9PiAoe1xuICB4OlxuICAgIFdpbmRvdy5wYWdlWE9mZnNldCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IFdpbmRvdy5wYWdlWE9mZnNldFxuICAgICAgOiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZSB8fCBkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LFxuICB5OlxuICAgIFdpbmRvdy5wYWdlWU9mZnNldCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IFdpbmRvdy5wYWdlWU9mZnNldFxuICAgICAgOiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZSB8fCBkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3Bcbn0pO1xuXG5jb25zdCBhZGRFdmVudExpc3RlbmVycyA9ICgpID0+IHtcbiAgaWYgKGRvY3VtZW50ICYmIGRvY3VtZW50LmJvZHkpXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJywgZGVib3VuY2Uoc3RhcnRMaXN0ZW5pbmcsIDEwMCwge2xlYWRpbmc6IHRydWV9KSk7XG4gIFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBkZWJvdW5jZShzdGFydExpc3RlbmluZywgNTAsIHtsZWFkaW5nOiB0cnVlfSkpO1xufTtcblxuaW50ZXJmYWNlIEdldENoaWxkUG9zUHJvcHMge1xuICBvZmZzZXRzOiBQYXJ0aWFsPHtcbiAgICB0b3BPZmZzZXQ6IG51bWJlcjtcbiAgICBsZWZ0T2Zmc2V0OiBudW1iZXI7XG4gICAgcmlnaHRPZmZzZXQ6IG51bWJlcjtcbiAgfT47XG4gIHJlY3Q6IERPTVJlY3Q7XG4gIGNoaWxkUmVjdDogRE9NUmVjdDtcbiAgcGFnZU9mZnNldDoge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH07XG4gIHBhZGRpbmc6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGdldENoaWxkUG9zID0gKHtvZmZzZXRzLCByZWN0LCBjaGlsZFJlY3QsIHBhZ2VPZmZzZXQsIHBhZGRpbmd9OiBHZXRDaGlsZFBvc1Byb3BzKSA9PiB7XG4gIGNvbnN0IHt0b3BPZmZzZXQsIGxlZnRPZmZzZXQsIHJpZ2h0T2Zmc2V0fSA9IG9mZnNldHM7XG5cbiAgY29uc3QgYW5jaG9yTGVmdCA9IGxlZnRPZmZzZXQgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgcG9zID0ge1xuICAgIHRvcDogcGFnZU9mZnNldC55ICsgcmVjdC50b3AgKyAodG9wT2Zmc2V0IHx8IDApLFxuICAgIC4uLihhbmNob3JMZWZ0XG4gICAgICA/IHtsZWZ0OiBwYWdlT2Zmc2V0LnggKyByZWN0LmxlZnQgKyAobGVmdE9mZnNldCB8fCAwKX1cbiAgICAgIDoge3JpZ2h0OiBXaW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QucmlnaHQgLSBwYWdlT2Zmc2V0LnggKyAocmlnaHRPZmZzZXQgfHwgMCl9KVxuICB9O1xuXG4gIGNvbnN0IGxlZnRPclJpZ2h0ID0gYW5jaG9yTGVmdCA/ICdsZWZ0JyA6ICdyaWdodCc7XG5cbiAgaWYgKHBvc1tsZWZ0T3JSaWdodF0gJiYgcG9zW2xlZnRPclJpZ2h0XSA8IDApIHtcbiAgICBwb3NbbGVmdE9yUmlnaHRdID0gcGFkZGluZztcbiAgfSBlbHNlIGlmIChwb3NbbGVmdE9yUmlnaHRdICYmIHBvc1tsZWZ0T3JSaWdodF0gKyBjaGlsZFJlY3Qud2lkdGggPiBXaW5kb3cuaW5uZXJXaWR0aCkge1xuICAgIHBvc1tsZWZ0T3JSaWdodF0gPSBXaW5kb3cuaW5uZXJXaWR0aCAtIGNoaWxkUmVjdC53aWR0aCAtIHBhZGRpbmc7XG4gIH1cblxuICBpZiAocG9zLnRvcCA8IDApIHtcbiAgICBwb3MudG9wID0gcGFkZGluZztcbiAgfSBlbHNlIGlmIChwb3MudG9wICsgY2hpbGRSZWN0LmhlaWdodCA+IFdpbmRvdy5pbm5lckhlaWdodCkge1xuICAgIHBvcy50b3AgPSBXaW5kb3cuaW5uZXJIZWlnaHQgLSBjaGlsZFJlY3QuaGVpZ2h0IC0gcGFkZGluZztcbiAgfVxuXG4gIHJldHVybiBwb3M7XG59O1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIGlmIChkb2N1bWVudC5ib2R5KSB7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfSBlbHNlIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgYWRkRXZlbnRMaXN0ZW5lcnMpO1xuICB9XG59XG5cbmxldCBsaXN0ZW5lcklkQ291bnRlciA9IDA7XG5mdW5jdGlvbiBzdWJzY3JpYmUoZm4pIHtcbiAgbGlzdGVuZXJJZENvdW50ZXIgKz0gMTtcbiAgY29uc3QgaWQgPSBsaXN0ZW5lcklkQ291bnRlcjtcbiAgbGlzdGVuZXJzW2lkXSA9IGZuO1xuICByZXR1cm4gKCkgPT4gZGVsZXRlIGxpc3RlbmVyc1tpZF07XG59XG5cbmNvbnN0IGRlZmF1bHRNb2RhbFN0eWxlID0ge1xuICBjb250ZW50OiB7XG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgYm9yZGVyOiAwLFxuICAgIHJpZ2h0OiAnYXV0bycsXG4gICAgYm90dG9tOiAnYXV0bycsXG4gICAgcGFkZGluZzogJzBweCAwcHggMHB4IDBweCdcbiAgfSxcbiAgb3ZlcmxheToge1xuICAgIHJpZ2h0OiAnYXV0bycsXG4gICAgYm90dG9tOiAnYXV0bycsXG4gICAgd2lkdGg6ICcxMDB2dycsXG4gICAgaGVpZ2h0OiAnMTAwdmgnLFxuICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMCknXG4gIH1cbn07XG5cbmNvbnN0IFdJTkRPV19QQUQgPSA0MDtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHtcbiAgcmV0dXJuO1xufTtcblxudHlwZSBQb3J0YWxlZFByb3BzID0gUHJvcHNXaXRoQ2hpbGRyZW48e1xuICByaWdodD86IG51bWJlcjtcbiAgbGVmdD86IG51bWJlcjtcbiAgdG9wPzogbnVtYmVyO1xuICBjb21wb25lbnQ/OiBSZWFjdC5FbGVtZW50VHlwZTxhbnk+O1xuICBvbkNsb3NlPzogKFxuICAgIGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50PEVsZW1lbnQsIGdsb2JhbFRoaXMuTW91c2VFdmVudD4gfCBSZWFjdC5LZXlib2FyZEV2ZW50PEVsZW1lbnQ+XG4gICkgPT4gdm9pZDtcbiAgdG9wT2Zmc2V0PzogbnVtYmVyO1xuICBsZWZ0T2Zmc2V0PzogbnVtYmVyO1xuICByaWdodE9mZnNldD86IG51bWJlcjtcbiAgb3ZlcmxheVpJbmRleD86IG51bWJlcjtcbiAgaXNPcGVuZWQ/OiBib29sZWFuO1xuICBtb2RhbFByb3BzPzogUGFydGlhbDxSZWFjdE1vZGFsLlByb3BzPjtcbiAgbW9kYWxTdHlsZT86IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRNb2RhbFN0eWxlPjtcbiAgdGhlbWU/OiBhbnk7XG59PjtcblxuaW50ZXJmYWNlIFBvcnRhbGVkU3RhdGUge1xuICBwb3M6XG4gICAgfCB7XG4gICAgICAgIGxlZnQ6IG51bWJlcjtcbiAgICAgICAgdG9wOiBudW1iZXI7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHJpZ2h0OiBudW1iZXI7XG4gICAgICAgIHRvcDogbnVtYmVyO1xuICAgICAgfVxuICAgIHwgbnVsbDtcbiAgaXNWaXNpYmxlOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0Q29tcG9uZW50ID0gJ2Rpdic7XG5cbmNsYXNzIFBvcnRhbGVkIGV4dGVuZHMgQ29tcG9uZW50PFBvcnRhbGVkUHJvcHMsIFBvcnRhbGVkU3RhdGU+IHtcbiAgLy8gTWFrZSBQb3J0YWxlZCBhIGNvbXBvbmVudCB3aXRoIEVycm9yIEJvdW5kYXJ5LCBzbyBSZWFjdCBjYW4gcmVjcmVhdGVcbiAgLy8gdGhpcyBjb21wb25lbnQgaWYgdGhlIGNoaWxkICdDb2xvclBpY2tlcicgdGhyb3dzIGNyb3NzLW9yaWdpbiBlcnJvci5cbiAgLy8gc2VlIGZ1bmN0aW9uIGNvbXBvbmVudERpZENhdGNoKClcbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpOiB7aGFzRXJyb3I6IGJvb2xlYW59IHtcbiAgICByZXR1cm4ge2hhc0Vycm9yOiB0cnVlfTtcbiAgfVxuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHM6IFBvcnRhbGVkUHJvcHMgPSB7XG4gICAgY29tcG9uZW50OiBEZWZhdWx0Q29tcG9uZW50LFxuICAgIG9uQ2xvc2U6IG5vb3AsXG4gICAgdGhlbWVcbiAgfTtcblxuICBzdGF0ZSA9IHtcbiAgICBwb3M6IG51bGwsXG4gICAgaXNWaXNpYmxlOiBmYWxzZVxuICB9O1xuXG4gIHVuc3Vic2NyaWJlOiAoKCkgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIF91bm1vdW50ZWQgPSBmYWxzZTtcblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLl91bm1vdW50ZWQgPSBmYWxzZTtcbiAgICAvLyByZWxhdGl2ZVxuICAgIHRoaXMudW5zdWJzY3JpYmUgPSBzdWJzY3JpYmUodGhpcy5oYW5kbGVTY3JvbGwpO1xuICAgIHRoaXMuaGFuZGxlU2Nyb2xsKCk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBQb3J0YWxlZFByb3BzKSB7XG4gICAgY29uc3QgZGlkT3BlbiA9IHRoaXMucHJvcHMuaXNPcGVuZWQgJiYgIXByZXZQcm9wcy5pc09wZW5lZDtcbiAgICBjb25zdCBkaWRDbG9zZSA9ICF0aGlzLnByb3BzLmlzT3BlbmVkICYmIHByZXZQcm9wcy5pc09wZW5lZDtcbiAgICBpZiAoZGlkT3BlbiB8fCBkaWRDbG9zZSkge1xuICAgICAgV2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl91bm1vdW50ZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNWaXNpYmxlOiBCb29sZWFuKGRpZE9wZW4pfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZVNjcm9sbCgpO1xuICB9XG5cbiAgLy8gQ29sb3JQaWNrZXIgd2lsbCB0aHJvdyBhIGNyb3NzLW9yaWdpbiBlcnJvciB3aGVuIGl0IGlzIGNsb3NlZFxuICAvLyB3aGVuIHRoZSBhcHAgaXMgd2l0aGluIGFuIGlmcmFtZS5cbiAgLy8gVGhpcyBpcyBhIGtub3duIGlzc3VlIG9mIHJlYWN0LWNvbG9yIGNvbXBvbmVudDpcbiAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vY2FzZXNhbmRiZXJnL3JlYWN0LWNvbG9yL2lzc3Vlcy84MDZcbiAgY29tcG9uZW50RGlkQ2F0Y2goKSB7XG4gICAgLy8gRG8gbm90aGluZyBoZXJlLCBzaW5jZSBSZWFjdCB3aWxsIHRyeSB0byByZWNyZWF0ZSB0aGlzIGNvbXBvbmVudFxuICAgIC8vIHRyZWUgZnJvbSBzY3JhdGNoIHVzaW5nIHRoZSBlcnJvciBib3VuZGFyeSwgd2hpY2ggaXMgdGhpcyBjb21wb25lbnRcbiAgICAvLyBpdHNlbGYuIFRoaXMgaXMgYSB0ZW1wb3JhbCBmaXggZm9yIGEgY3Jhc2guXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLl91bm1vdW50ZWQgPSB0cnVlO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBlbGVtZW50ID0gY3JlYXRlUmVmPEhUTUxEaXZFbGVtZW50PigpO1xuICBjaGlsZCA9IGNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBoYW5kbGVTY3JvbGwgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuY2hpbGQuY3VycmVudCAmJiB0aGlzLmVsZW1lbnQuY3VycmVudCkge1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudC5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgY2hpbGRSZWN0ID0gdGhpcy5jaGlsZC5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgcGFnZU9mZnNldCA9IGdldFBhZ2VPZmZzZXQoKTtcbiAgICAgIGNvbnN0IHt0b3A6IHRvcE9mZnNldCwgbGVmdDogbGVmdE9mZnNldCA9IDAsIHJpZ2h0OiByaWdodE9mZnNldH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICBjb25zdCBwb3MgPSBnZXRDaGlsZFBvcyh7XG4gICAgICAgIG9mZnNldHM6IHt0b3BPZmZzZXQsIGxlZnRPZmZzZXQsIHJpZ2h0T2Zmc2V0fSxcbiAgICAgICAgcmVjdCxcbiAgICAgICAgY2hpbGRSZWN0LFxuICAgICAgICBwYWdlT2Zmc2V0LFxuICAgICAgICBwYWRkaW5nOiBXSU5ET1dfUEFEXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFpc0VxdWFsKHBvcywgdGhpcy5zdGF0ZS5wb3MpKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3Bvc30pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IHtcbiAgICAgIC8vIHJlbGF0aXZlXG4gICAgICBjb21wb25lbnQgPSBEZWZhdWx0Q29tcG9uZW50LFxuICAgICAgb3ZlcmxheVpJbmRleCxcbiAgICAgIGlzT3BlbmVkLFxuICAgICAgb25DbG9zZSxcblxuICAgICAgLy8gTW9kYWxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgbW9kYWxQcm9wcyxcbiAgICAgIG1vZGFsU3R5bGUgPSB7fVxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3Qge2lzVmlzaWJsZSwgcG9zfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBjb25zdCBuZXdNb2RhbFN0eWxlID0ge1xuICAgICAgLi4uZGVmYXVsdE1vZGFsU3R5bGUsXG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIC4uLihtb2RhbFN0eWxlLmNvbnRlbnQgfHwge30pXG4gICAgICB9LFxuICAgICAgb3ZlcmxheToge1xuICAgICAgICAuLi5kZWZhdWx0TW9kYWxTdHlsZS5vdmVybGF5LFxuICAgICAgICAuLi4obW9kYWxTdHlsZS5vdmVybGF5IHx8IHt9KSxcbiAgICAgICAgLy8gbmVlZHMgdG8gYmUgb24gdG9wIG9mIGV4aXN0aW5nIG1vZGFsXG4gICAgICAgIHpJbmRleDogb3ZlcmxheVpJbmRleCB8fCA5OTk5XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IENvbXAgPSBjb21wb25lbnQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFJvb3RDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICB7Y29udGV4dCA9PiAoXG4gICAgICAgICAgPENvbXAgcmVmPXt0aGlzLmVsZW1lbnR9PlxuICAgICAgICAgICAge2lzT3BlbmVkID8gKFxuICAgICAgICAgICAgICA8TW9kYWxcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtb2RhbC1wb3J0YWxcIlxuICAgICAgICAgICAgICAgIHsuLi5tb2RhbFByb3BzfVxuICAgICAgICAgICAgICAgIGFyaWFIaWRlQXBwPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBpc09wZW5cbiAgICAgICAgICAgICAgICBzdHlsZT17bmV3TW9kYWxTdHlsZX1cbiAgICAgICAgICAgICAgICBwYXJlbnRTZWxlY3Rvcj17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gUmVhY3QgbW9kYWwgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JlYWN0LW1vZGFsL2lzc3Vlcy83NjlcbiAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCB0byBleGVjdXRlIHJlbW92ZUNoaWxkIG9uIHBhcmVudCBub2RlIHdoZW4gaXQgaXMgYWxyZWFkeSB1bm1vdW50ZWRcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoY29udGV4dCAmJiBjb250ZXh0LmN1cnJlbnQpIHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBvblJlcXVlc3RDbG9zZT17b25DbG9zZX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInBvcnRhbGVkLWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAga2V5PVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogaXNWaXNpYmxlID8gMSA6IDAsXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IHRoaXMucHJvcHMudGhlbWUudHJhbnNpdGlvbkZhc3QsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogaXNWaXNpYmxlID8gJzBweCcgOiAnMTRweCcsXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgLi4ucG9zXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgcmVmPXt0aGlzLmNoaWxkfVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgICAgICAgIHpJbmRleDogb3ZlcmxheVpJbmRleCA/IG92ZXJsYXlaSW5kZXggKyAxIDogMTAwMDBcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvTW9kYWw+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8L0NvbXA+XG4gICAgICAgICl9XG4gICAgICA8L1Jvb3RDb250ZXh0LkNvbnN1bWVyPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aFRoZW1lKFBvcnRhbGVkKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssaUJBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFFBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFdBQUEsR0FBQUwsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFRLE9BQUEsR0FBQU4sc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFTLE9BQUEsR0FBQVQsT0FBQTtBQUF3QyxTQUFBVSx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQVosd0JBQUFZLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLENBQUEsSUFBQWQsQ0FBQSxvQkFBQWMsQ0FBQSxPQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWhCLENBQUEsRUFBQWMsQ0FBQSxTQUFBRyxDQUFBLEdBQUFQLENBQUEsR0FBQUMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBYixDQUFBLEVBQUFjLENBQUEsVUFBQUcsQ0FBQSxLQUFBQSxDQUFBLENBQUFWLEdBQUEsSUFBQVUsQ0FBQSxDQUFBQyxHQUFBLElBQUFQLE1BQUEsQ0FBQUMsY0FBQSxDQUFBSixDQUFBLEVBQUFNLENBQUEsRUFBQUcsQ0FBQSxJQUFBVCxDQUFBLENBQUFNLENBQUEsSUFBQWQsQ0FBQSxDQUFBYyxDQUFBLFlBQUFOLENBQUEsY0FBQVIsQ0FBQSxFQUFBRyxDQUFBLElBQUFBLENBQUEsQ0FBQWUsR0FBQSxDQUFBbEIsQ0FBQSxFQUFBUSxDQUFBLEdBQUFBLENBQUE7QUFBQSxTQUFBVyxXQUFBaEIsQ0FBQSxFQUFBaUIsQ0FBQSxFQUFBcEIsQ0FBQSxXQUFBb0IsQ0FBQSxPQUFBQyxnQkFBQSxhQUFBRCxDQUFBLE9BQUFFLDJCQUFBLGFBQUFuQixDQUFBLEVBQUFvQix5QkFBQSxLQUFBQyxPQUFBLENBQUFDLFNBQUEsQ0FBQUwsQ0FBQSxFQUFBcEIsQ0FBQSxZQUFBcUIsZ0JBQUEsYUFBQWxCLENBQUEsRUFBQXVCLFdBQUEsSUFBQU4sQ0FBQSxDQUFBTyxLQUFBLENBQUF4QixDQUFBLEVBQUFILENBQUE7QUFBQSxTQUFBdUIsMEJBQUEsY0FBQXBCLENBQUEsSUFBQXlCLE9BQUEsQ0FBQUMsU0FBQSxDQUFBQyxPQUFBLENBQUFkLElBQUEsQ0FBQVEsT0FBQSxDQUFBQyxTQUFBLENBQUFHLE9BQUEsaUNBQUF6QixDQUFBLGFBQUFvQix5QkFBQSxZQUFBQSwwQkFBQSxhQUFBcEIsQ0FBQTtBQUFBLFNBQUE0QixRQUFBL0IsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQVEsTUFBQSxDQUFBcUIsSUFBQSxDQUFBaEMsQ0FBQSxPQUFBVyxNQUFBLENBQUFzQixxQkFBQSxRQUFBYixDQUFBLEdBQUFULE1BQUEsQ0FBQXNCLHFCQUFBLENBQUFqQyxDQUFBLEdBQUFFLENBQUEsS0FBQWtCLENBQUEsR0FBQUEsQ0FBQSxDQUFBYyxNQUFBLFdBQUFoQyxDQUFBLFdBQUFTLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQWIsQ0FBQSxFQUFBRSxDQUFBLEVBQUFpQyxVQUFBLE9BQUFoQyxDQUFBLENBQUFpQyxJQUFBLENBQUFULEtBQUEsQ0FBQXhCLENBQUEsRUFBQWlCLENBQUEsWUFBQWpCLENBQUE7QUFBQSxTQUFBa0MsY0FBQXJDLENBQUEsYUFBQUUsQ0FBQSxNQUFBQSxDQUFBLEdBQUFvQyxTQUFBLENBQUFDLE1BQUEsRUFBQXJDLENBQUEsVUFBQUMsQ0FBQSxXQUFBbUMsU0FBQSxDQUFBcEMsQ0FBQSxJQUFBb0MsU0FBQSxDQUFBcEMsQ0FBQSxRQUFBQSxDQUFBLE9BQUE2QixPQUFBLENBQUFwQixNQUFBLENBQUFSLENBQUEsT0FBQXFDLE9BQUEsV0FBQXRDLENBQUEsUUFBQXVDLGdCQUFBLGFBQUF6QyxDQUFBLEVBQUFFLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFBLFNBQUFTLE1BQUEsQ0FBQStCLHlCQUFBLEdBQUEvQixNQUFBLENBQUFnQyxnQkFBQSxDQUFBM0MsQ0FBQSxFQUFBVyxNQUFBLENBQUErQix5QkFBQSxDQUFBdkMsQ0FBQSxLQUFBNEIsT0FBQSxDQUFBcEIsTUFBQSxDQUFBUixDQUFBLEdBQUFxQyxPQUFBLFdBQUF0QyxDQUFBLElBQUFTLE1BQUEsQ0FBQUMsY0FBQSxDQUFBWixDQUFBLEVBQUFFLENBQUEsRUFBQVMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBVixDQUFBLEVBQUFELENBQUEsaUJBQUFGLENBQUEsSUFaeEM7QUFDQTtBQWFBLElBQU00QyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBRXBCLElBQU1DLGNBQWMsR0FBRyxTQUFqQkEsY0FBY0EsQ0FBQTtFQUFBLE9BQVNsQyxNQUFNLENBQUNxQixJQUFJLENBQUNZLFNBQVMsQ0FBQyxDQUFDSixPQUFPLENBQUMsVUFBQU0sR0FBRztJQUFBLE9BQUlGLFNBQVMsQ0FBQ0UsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUFBLEVBQUM7QUFBQTtBQUVwRixJQUFNQyxhQUFhLEdBQUcsU0FBaEJBLGFBQWFBLENBQUE7RUFBQSxPQUFVO0lBQzNCQyxDQUFDLEVBQ0NDLGtCQUFNLENBQUNDLFdBQVcsS0FBS0MsU0FBUyxHQUM1QkYsa0JBQU0sQ0FBQ0MsV0FBVyxHQUNsQixDQUFDRSxRQUFRLENBQUNDLGVBQWUsSUFBSUQsUUFBUSxDQUFDRSxJQUFJLENBQUNDLFVBQVUsSUFBSUgsUUFBUSxDQUFDRSxJQUFJLEVBQUVFLFVBQVU7SUFDeEZDLENBQUMsRUFDQ1Isa0JBQU0sQ0FBQ1MsV0FBVyxLQUFLUCxTQUFTLEdBQzVCRixrQkFBTSxDQUFDUyxXQUFXLEdBQ2xCLENBQUNOLFFBQVEsQ0FBQ0MsZUFBZSxJQUFJRCxRQUFRLENBQUNFLElBQUksQ0FBQ0MsVUFBVSxJQUFJSCxRQUFRLENBQUNFLElBQUksRUFBRUs7RUFDaEYsQ0FBQztBQUFBLENBQUM7QUFFRixJQUFNQyxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQWlCQSxDQUFBLEVBQVM7RUFDOUIsSUFBSVIsUUFBUSxJQUFJQSxRQUFRLENBQUNFLElBQUksRUFDM0JGLFFBQVEsQ0FBQ0UsSUFBSSxDQUFDTyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsSUFBQUMsb0JBQVEsRUFBQ2pCLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFBQ2tCLE9BQU8sRUFBRTtFQUFJLENBQUMsQ0FBQyxDQUFDO0VBQzlGZCxrQkFBTSxDQUFDWSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBQUMsb0JBQVEsRUFBQ2pCLGNBQWMsRUFBRSxFQUFFLEVBQUU7SUFBQ2tCLE9BQU8sRUFBRTtFQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLENBQUM7QUFpQk0sSUFBTUMsV0FBVyxHQUFBQyxPQUFBLENBQUFELFdBQUEsR0FBRyxTQUFkQSxXQUFXQSxDQUFBRSxJQUFBLEVBQTBFO0VBQUEsSUFBckVDLE9BQU8sR0FBQUQsSUFBQSxDQUFQQyxPQUFPO0lBQUVDLElBQUksR0FBQUYsSUFBQSxDQUFKRSxJQUFJO0lBQUVDLFNBQVMsR0FBQUgsSUFBQSxDQUFURyxTQUFTO0lBQUVDLFVBQVUsR0FBQUosSUFBQSxDQUFWSSxVQUFVO0lBQUVDLE9BQU8sR0FBQUwsSUFBQSxDQUFQSyxPQUFPO0VBQ3hFLElBQU9DLFNBQVMsR0FBNkJMLE9BQU8sQ0FBN0NLLFNBQVM7SUFBRUMsVUFBVSxHQUFpQk4sT0FBTyxDQUFsQ00sVUFBVTtJQUFFQyxXQUFXLEdBQUlQLE9BQU8sQ0FBdEJPLFdBQVc7RUFFekMsSUFBTUMsVUFBVSxHQUFHRixVQUFVLEtBQUt0QixTQUFTO0VBQzNDLElBQU15QixHQUFHLEdBQUF2QyxhQUFBO0lBQ1B3QyxHQUFHLEVBQUVQLFVBQVUsQ0FBQ2IsQ0FBQyxHQUFHVyxJQUFJLENBQUNTLEdBQUcsSUFBSUwsU0FBUyxJQUFJLENBQUM7RUFBQyxHQUMzQ0csVUFBVSxHQUNWO0lBQUNHLElBQUksRUFBRVIsVUFBVSxDQUFDdEIsQ0FBQyxHQUFHb0IsSUFBSSxDQUFDVSxJQUFJLElBQUlMLFVBQVUsSUFBSSxDQUFDO0VBQUMsQ0FBQyxHQUNwRDtJQUFDTSxLQUFLLEVBQUU5QixrQkFBTSxDQUFDK0IsVUFBVSxHQUFHWixJQUFJLENBQUNXLEtBQUssR0FBR1QsVUFBVSxDQUFDdEIsQ0FBQyxJQUFJMEIsV0FBVyxJQUFJLENBQUM7RUFBQyxDQUFDLENBQ2hGO0VBRUQsSUFBTU8sV0FBVyxHQUFHTixVQUFVLEdBQUcsTUFBTSxHQUFHLE9BQU87RUFFakQsSUFBSUMsR0FBRyxDQUFDSyxXQUFXLENBQUMsSUFBSUwsR0FBRyxDQUFDSyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDNUNMLEdBQUcsQ0FBQ0ssV0FBVyxDQUFDLEdBQUdWLE9BQU87RUFDNUIsQ0FBQyxNQUFNLElBQUlLLEdBQUcsQ0FBQ0ssV0FBVyxDQUFDLElBQUlMLEdBQUcsQ0FBQ0ssV0FBVyxDQUFDLEdBQUdaLFNBQVMsQ0FBQ2EsS0FBSyxHQUFHakMsa0JBQU0sQ0FBQytCLFVBQVUsRUFBRTtJQUNyRkosR0FBRyxDQUFDSyxXQUFXLENBQUMsR0FBR2hDLGtCQUFNLENBQUMrQixVQUFVLEdBQUdYLFNBQVMsQ0FBQ2EsS0FBSyxHQUFHWCxPQUFPO0VBQ2xFO0VBRUEsSUFBSUssR0FBRyxDQUFDQyxHQUFHLEdBQUcsQ0FBQyxFQUFFO0lBQ2ZELEdBQUcsQ0FBQ0MsR0FBRyxHQUFHTixPQUFPO0VBQ25CLENBQUMsTUFBTSxJQUFJSyxHQUFHLENBQUNDLEdBQUcsR0FBR1IsU0FBUyxDQUFDYyxNQUFNLEdBQUdsQyxrQkFBTSxDQUFDbUMsV0FBVyxFQUFFO0lBQzFEUixHQUFHLENBQUNDLEdBQUcsR0FBRzVCLGtCQUFNLENBQUNtQyxXQUFXLEdBQUdmLFNBQVMsQ0FBQ2MsTUFBTSxHQUFHWixPQUFPO0VBQzNEO0VBRUEsT0FBT0ssR0FBRztBQUNaLENBQUM7QUFFRCxJQUFJUyxnQkFBUyxFQUFFO0VBQ2IsSUFBSWpDLFFBQVEsQ0FBQ0UsSUFBSSxFQUFFO0lBQ2pCTSxpQkFBaUIsQ0FBQyxDQUFDO0VBQ3JCLENBQUMsTUFBTTtJQUNMUixRQUFRLENBQUNTLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFRCxpQkFBaUIsQ0FBQztFQUNsRTtBQUNGO0FBRUEsSUFBSTBCLGlCQUFpQixHQUFHLENBQUM7QUFDekIsU0FBU0MsU0FBU0EsQ0FBQ0MsRUFBRSxFQUFFO0VBQ3JCRixpQkFBaUIsSUFBSSxDQUFDO0VBQ3RCLElBQU1HLEVBQUUsR0FBR0gsaUJBQWlCO0VBQzVCMUMsU0FBUyxDQUFDNkMsRUFBRSxDQUFDLEdBQUdELEVBQUU7RUFDbEIsT0FBTztJQUFBLE9BQU0sT0FBTzVDLFNBQVMsQ0FBQzZDLEVBQUUsQ0FBQztFQUFBO0FBQ25DO0FBRUEsSUFBTUMsaUJBQWlCLEdBQUc7RUFDeEJDLE9BQU8sRUFBRTtJQUNQZCxHQUFHLEVBQUUsQ0FBQztJQUNOQyxJQUFJLEVBQUUsQ0FBQztJQUNQYyxNQUFNLEVBQUUsQ0FBQztJQUNUYixLQUFLLEVBQUUsTUFBTTtJQUNiYyxNQUFNLEVBQUUsTUFBTTtJQUNkdEIsT0FBTyxFQUFFO0VBQ1gsQ0FBQztFQUNEdUIsT0FBTyxFQUFFO0lBQ1BmLEtBQUssRUFBRSxNQUFNO0lBQ2JjLE1BQU0sRUFBRSxNQUFNO0lBQ2RYLEtBQUssRUFBRSxPQUFPO0lBQ2RDLE1BQU0sRUFBRSxPQUFPO0lBQ2ZZLGVBQWUsRUFBRTtFQUNuQjtBQUNGLENBQUM7QUFFRCxJQUFNQyxVQUFVLEdBQUcsRUFBRTtBQUVyQixJQUFNQyxJQUFJLEdBQUcsU0FBUEEsSUFBSUEsQ0FBQSxFQUFTO0VBQ2pCO0FBQ0YsQ0FBQztBQWtDRCxJQUFNQyxnQkFBZ0IsR0FBRyxLQUFLO0FBQUMsSUFFekJDLFFBQVEsMEJBQUFDLFVBQUE7RUFBQSxTQUFBRCxTQUFBO0lBQUEsSUFBQUUsS0FBQTtJQUFBLElBQUFDLGdCQUFBLG1CQUFBSCxRQUFBO0lBQUEsU0FBQUksSUFBQSxHQUFBakUsU0FBQSxDQUFBQyxNQUFBLEVBQUFpRSxJQUFBLE9BQUFDLEtBQUEsQ0FBQUYsSUFBQSxHQUFBRyxJQUFBLE1BQUFBLElBQUEsR0FBQUgsSUFBQSxFQUFBRyxJQUFBO01BQUFGLElBQUEsQ0FBQUUsSUFBQSxJQUFBcEUsU0FBQSxDQUFBb0UsSUFBQTtJQUFBO0lBQUFMLEtBQUEsR0FBQWxGLFVBQUEsT0FBQWdGLFFBQUEsS0FBQVEsTUFBQSxDQUFBSCxJQUFBO0lBQUEsSUFBQS9ELGdCQUFBLGFBQUE0RCxLQUFBLFdBY0o7TUFDTnpCLEdBQUcsRUFBRSxJQUFJO01BQ1RnQyxTQUFTLEVBQUU7SUFDYixDQUFDO0lBQUEsSUFBQW5FLGdCQUFBLGFBQUE0RCxLQUFBLGlCQUUwQ2xELFNBQVM7SUFBQSxJQUFBVixnQkFBQSxhQUFBNEQsS0FBQSxnQkFDdkMsS0FBSztJQUFBLElBQUE1RCxnQkFBQSxhQUFBNEQsS0FBQSwwQkFzQ1IsSUFBQVEsZ0JBQVMsRUFBaUIsQ0FBQztJQUFBLElBQUFwRSxnQkFBQSxhQUFBNEQsS0FBQSx3QkFDN0IsSUFBQVEsZ0JBQVMsRUFBaUIsQ0FBQztJQUVuQztJQUFBLElBQUFwRSxnQkFBQSxhQUFBNEQsS0FBQSxrQkFDZSxZQUFNO01BQ25CLElBQUlBLEtBQUEsQ0FBS1MsS0FBSyxDQUFDQyxPQUFPLElBQUlWLEtBQUEsQ0FBS1csT0FBTyxDQUFDRCxPQUFPLEVBQUU7UUFDOUMsSUFBTTNDLElBQUksR0FBR2lDLEtBQUEsQ0FBS1csT0FBTyxDQUFDRCxPQUFPLENBQUNFLHFCQUFxQixDQUFDLENBQUM7UUFDekQsSUFBTTVDLFNBQVMsR0FBR2dDLEtBQUEsQ0FBS1MsS0FBSyxDQUFDQyxPQUFPLENBQUNFLHFCQUFxQixDQUFDLENBQUM7UUFDNUQsSUFBTTNDLFVBQVUsR0FBR3ZCLGFBQWEsQ0FBQyxDQUFDO1FBQ2xDLElBQUFtRSxXQUFBLEdBQW1FYixLQUFBLENBQUtjLEtBQUs7VUFBakUzQyxTQUFTLEdBQUEwQyxXQUFBLENBQWRyQyxHQUFHO1VBQUF1QyxnQkFBQSxHQUFBRixXQUFBLENBQWFwQyxJQUFJO1VBQUVMLFVBQVUsR0FBQTJDLGdCQUFBLGNBQUcsQ0FBQyxHQUFBQSxnQkFBQTtVQUFTMUMsV0FBVyxHQUFBd0MsV0FBQSxDQUFsQm5DLEtBQUs7UUFFbEQsSUFBTUgsR0FBRyxHQUFHWixXQUFXLENBQUM7VUFDdEJHLE9BQU8sRUFBRTtZQUFDSyxTQUFTLEVBQVRBLFNBQVM7WUFBRUMsVUFBVSxFQUFWQSxVQUFVO1lBQUVDLFdBQVcsRUFBWEE7VUFBVyxDQUFDO1VBQzdDTixJQUFJLEVBQUpBLElBQUk7VUFDSkMsU0FBUyxFQUFUQSxTQUFTO1VBQ1RDLFVBQVUsRUFBVkEsVUFBVTtVQUNWQyxPQUFPLEVBQUV5QjtRQUNYLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFBcUIsbUJBQU8sRUFBQ3pDLEdBQUcsRUFBRXlCLEtBQUEsQ0FBS2lCLEtBQUssQ0FBQzFDLEdBQUcsQ0FBQyxFQUFFO1VBQ2pDeUIsS0FBQSxDQUFLa0IsUUFBUSxDQUFDO1lBQUMzQyxHQUFHLEVBQUhBO1VBQUcsQ0FBQyxDQUFDO1FBQ3RCO01BQ0Y7SUFDRixDQUFDO0lBQUEsT0FBQXlCLEtBQUE7RUFBQTtFQUFBLElBQUFtQixVQUFBLGFBQUFyQixRQUFBLEVBQUFDLFVBQUE7RUFBQSxXQUFBcUIsYUFBQSxhQUFBdEIsUUFBQTtJQUFBckQsR0FBQTtJQUFBNEUsS0FBQSxFQTNERCxTQUFBQyxpQkFBaUJBLENBQUEsRUFBRztNQUNsQixJQUFJLENBQUNDLFVBQVUsR0FBRyxLQUFLO01BQ3ZCO01BQ0EsSUFBSSxDQUFDQyxXQUFXLEdBQUd0QyxTQUFTLENBQUMsSUFBSSxDQUFDdUMsWUFBWSxDQUFDO01BQy9DLElBQUksQ0FBQ0EsWUFBWSxDQUFDLENBQUM7SUFDckI7RUFBQztJQUFBaEYsR0FBQTtJQUFBNEUsS0FBQSxFQUVELFNBQUFLLGtCQUFrQkEsQ0FBQ0MsU0FBd0IsRUFBRTtNQUFBLElBQUFDLE1BQUE7TUFDM0MsSUFBTUMsT0FBTyxHQUFHLElBQUksQ0FBQ2YsS0FBSyxDQUFDZ0IsUUFBUSxJQUFJLENBQUNILFNBQVMsQ0FBQ0csUUFBUTtNQUMxRCxJQUFNQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUNqQixLQUFLLENBQUNnQixRQUFRLElBQUlILFNBQVMsQ0FBQ0csUUFBUTtNQUMzRCxJQUFJRCxPQUFPLElBQUlFLFFBQVEsRUFBRTtRQUN2Qm5GLGtCQUFNLENBQUNvRixxQkFBcUIsQ0FBQyxZQUFNO1VBQ2pDLElBQUlKLE1BQUksQ0FBQ0wsVUFBVSxFQUFFO1VBQ3JCSyxNQUFJLENBQUNWLFFBQVEsQ0FBQztZQUFDWCxTQUFTLEVBQUVoRixPQUFPLENBQUNzRyxPQUFPO1VBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztNQUNKO01BRUEsSUFBSSxDQUFDSixZQUFZLENBQUMsQ0FBQztJQUNyQjs7SUFFQTtJQUNBO0lBQ0E7SUFDQTtFQUFBO0lBQUFoRixHQUFBO0lBQUE0RSxLQUFBLEVBQ0EsU0FBQVksaUJBQWlCQSxDQUFBLEVBQUc7TUFDbEI7TUFDQTtNQUNBO0lBQUE7RUFDRDtJQUFBeEYsR0FBQTtJQUFBNEUsS0FBQSxFQUVELFNBQUFhLG9CQUFvQkEsQ0FBQSxFQUFHO01BQ3JCLElBQUksQ0FBQ1gsVUFBVSxHQUFHLElBQUk7TUFDdEI7TUFDQSxJQUFJLENBQUNDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BCO0VBQUM7SUFBQS9FLEdBQUE7SUFBQTRFLEtBQUEsRUEyQkQsU0FBQWMsTUFBTUEsQ0FBQSxFQUFnQjtNQUFBLElBQUFDLE1BQUE7TUFDcEIsSUFBQUMsWUFBQSxHQVdJLElBQUksQ0FBQ3ZCLEtBQUs7UUFBQXdCLHFCQUFBLEdBQUFELFlBQUEsQ0FUWkUsU0FBUztRQUFUQSxTQUFTLEdBQUFELHFCQUFBLGNBQUd6QyxnQkFBZ0IsR0FBQXlDLHFCQUFBO1FBQzVCRSxhQUFhLEdBQUFILFlBQUEsQ0FBYkcsYUFBYTtRQUNiVixRQUFRLEdBQUFPLFlBQUEsQ0FBUlAsUUFBUTtRQUNSVyxPQUFPLEdBQUFKLFlBQUEsQ0FBUEksT0FBTztRQUdQQyxRQUFRLEdBQUFMLFlBQUEsQ0FBUkssUUFBUTtRQUNSQyxVQUFVLEdBQUFOLFlBQUEsQ0FBVk0sVUFBVTtRQUFBQyxxQkFBQSxHQUFBUCxZQUFBLENBQ1ZRLFVBQVU7UUFBVkEsVUFBVSxHQUFBRCxxQkFBQSxjQUFHLENBQUMsQ0FBQyxHQUFBQSxxQkFBQTtNQUdqQixJQUFBRSxXQUFBLEdBQXlCLElBQUksQ0FBQzdCLEtBQUs7UUFBNUJWLFNBQVMsR0FBQXVDLFdBQUEsQ0FBVHZDLFNBQVM7UUFBRWhDLEdBQUcsR0FBQXVFLFdBQUEsQ0FBSHZFLEdBQUc7TUFFckIsSUFBTXdFLGFBQWEsR0FBQS9HLGFBQUEsQ0FBQUEsYUFBQSxLQUNkcUQsaUJBQWlCO1FBQ3BCQyxPQUFPLEVBQUF0RCxhQUFBLEtBQ0Q2RyxVQUFVLENBQUN2RCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQzdCO1FBQ0RHLE9BQU8sRUFBQXpELGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLEtBQ0ZxRCxpQkFBaUIsQ0FBQ0ksT0FBTyxHQUN4Qm9ELFVBQVUsQ0FBQ3BELE9BQU8sSUFBSSxDQUFDLENBQUM7VUFDNUI7VUFDQXVELE1BQU0sRUFBRVIsYUFBYSxJQUFJO1FBQUk7TUFDOUIsRUFDRjtNQUVELElBQU1TLElBQUksR0FBR1YsU0FBUztNQUV0QixvQkFDRXpKLE1BQUEsWUFBQW9LLGFBQUEsQ0FBQzVKLFFBQUEsQ0FBQTZKLFdBQVcsQ0FBQ0MsUUFBUSxRQUNsQixVQUFBQyxPQUFPO1FBQUEsb0JBQ052SyxNQUFBLFlBQUFvSyxhQUFBLENBQUNELElBQUk7VUFBQ0ssR0FBRyxFQUFFbEIsTUFBSSxDQUFDekI7UUFBUSxHQUNyQm1CLFFBQVEsZ0JBQ1BoSixNQUFBLFlBQUFvSyxhQUFBLENBQUMzSixXQUFBLFdBQUssTUFBQWdLLFNBQUE7VUFDSkMsU0FBUyxFQUFDO1FBQWMsR0FDcEJiLFVBQVU7VUFDZGMsV0FBVyxFQUFFLEtBQU07VUFDbkJDLE1BQU07VUFDTkMsS0FBSyxFQUFFWixhQUFjO1VBQ3JCYSxjQUFjLEVBQUUsU0FBaEJBLGNBQWNBLENBQUEsRUFBUTtZQUNwQjtZQUNBO1lBQ0EsT0FBUVAsT0FBTyxJQUFJQSxPQUFPLENBQUMzQyxPQUFPLElBQUszRCxRQUFRLENBQUNFLElBQUk7VUFDdEQsQ0FBRTtVQUNGNEcsY0FBYyxFQUFFcEI7UUFBUSxpQkFFeEIzSixNQUFBLFlBQUFvSyxhQUFBO1VBQ0VNLFNBQVMsRUFBQyxrQkFBa0I7VUFDNUIvRyxHQUFHLEVBQUMsTUFBTTtVQUNWa0gsS0FBSyxFQUFBM0gsYUFBQTtZQUNIOEgsUUFBUSxFQUFFLE9BQU87WUFDakJDLE9BQU8sRUFBRXhELFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUMxQnlELFVBQVUsRUFBRTVCLE1BQUksQ0FBQ3RCLEtBQUssQ0FBQ21ELEtBQUssQ0FBQ0MsY0FBYztZQUMzQ0MsU0FBUyxFQUFFNUQsU0FBUyxHQUFHLEtBQUssR0FBRztVQUFNLEdBRWxDaEMsR0FBRztRQUNOLGdCQUVGekYsTUFBQSxZQUFBb0ssYUFBQTtVQUNFSSxHQUFHLEVBQUVsQixNQUFJLENBQUMzQixLQUFNO1VBQ2hCa0QsS0FBSyxFQUFFO1lBQ0xHLFFBQVEsRUFBRSxVQUFVO1lBQ3BCZCxNQUFNLEVBQUVSLGFBQWEsR0FBR0EsYUFBYSxHQUFHLENBQUMsR0FBRztVQUM5QztRQUFFLEdBRURFLFFBQ0UsQ0FDRixDQUNBLENBQUMsR0FDTixJQUNBLENBQUM7TUFBQSxDQUVXLENBQUM7SUFFM0I7RUFBQztJQUFBakcsR0FBQTtJQUFBNEUsS0FBQTtJQS9KRDtJQUNBO0lBQ0E7SUFDQSxTQUFPK0Msd0JBQXdCQSxDQUFBLEVBQXdCO01BQ3JELE9BQU87UUFBQ0MsUUFBUSxFQUFFO01BQUksQ0FBQztJQUN6QjtFQUFDO0FBQUEsRUFOb0JDLGdCQUFTO0FBQUEsSUFBQWxJLGdCQUFBLGFBQTFCMEQsUUFBUSxrQkFReUI7RUFDbkN5QyxTQUFTLEVBQUUxQyxnQkFBZ0I7RUFDM0I0QyxPQUFPLEVBQUU3QyxJQUFJO0VBQ2JxRSxLQUFLLEVBQUxBO0FBQ0YsQ0FBQztBQUFBLElBQUFNLFFBQUEsR0FBQTNHLE9BQUEsY0F1SlksSUFBQTRHLDJCQUFTLEVBQUMxRSxRQUFRLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
;