botframework-webchat-component
Version:
React component of botframework-webchat
137 lines (133 loc) • 29.1 kB
JavaScript
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _botframeworkWebchatApi = require("botframework-webchat-api");
var _classnames = _interopRequireDefault(require("classnames"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireWildcard(require("react"));
var _detectBrowser = require("../Utils/detectBrowser");
var _FocusTrap = _interopRequireDefault(require("./FocusTrap"));
var _ScreenReaderText = _interopRequireDefault(require("../ScreenReaderText"));
var _Speak = _interopRequireDefault(require("../Activity/Speak"));
var _useActiveDescendantId = _interopRequireDefault(require("../providers/TranscriptFocus/useActiveDescendantId"));
var _useActivityAccessibleName = _interopRequireDefault(require("./useActivityAccessibleName"));
var _useFocusByActivityKey = _interopRequireDefault(require("../providers/TranscriptFocus/useFocusByActivityKey"));
var _useGetDescendantIdByActivityKey = _interopRequireDefault(require("../providers/TranscriptFocus/useGetDescendantIdByActivityKey"));
var _useRefFrom = require("use-ref-from");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var useActivityKeysByRead = _botframeworkWebchatApi.hooks.useActivityKeysByRead,
useGetHasAcknowledgedByActivityKey = _botframeworkWebchatApi.hooks.useGetHasAcknowledgedByActivityKey,
useGetKeyByActivity = _botframeworkWebchatApi.hooks.useGetKeyByActivity;
var ActivityRow = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
var _activity$channelData;
var activity = _ref.activity,
children = _ref.children;
var _useActiveDescendantI = (0, _useActiveDescendantId.default)(),
_useActiveDescendantI2 = _slicedToArray(_useActiveDescendantI, 1),
activeDescendantId = _useActiveDescendantI2[0];
var _useActivityKeysByRea = useActivityKeysByRead(),
_useActivityKeysByRea2 = _slicedToArray(_useActivityKeysByRea, 1),
readActivityKeys = _useActivityKeysByRea2[0];
var bodyRef = (0, _react.useRef)();
var focusByActivityKey = (0, _useFocusByActivityKey.default)();
var getKeyByActivity = useGetKeyByActivity();
// TODO: [P2] #2858 We should use core/definitions/speakingActivity for this predicate instead
var shouldSpeak = (_activity$channelData = activity.channelData) === null || _activity$channelData === void 0 ? void 0 : _activity$channelData.speak;
var _useActivityAccessibl = (0, _useActivityAccessibleName.default)(activity, bodyRef),
_useActivityAccessibl2 = _slicedToArray(_useActivityAccessibl, 1),
accessibleName = _useActivityAccessibl2[0];
var activityKey = getKeyByActivity(activity);
var acknowledged = useGetHasAcknowledgedByActivityKey()(activityKey);
var activityKeyRef = (0, _useRefFrom.useRefFrom)(activityKey);
var descendantId = (0, _useGetDescendantIdByActivityKey.default)()(activityKey);
var descendantLabelId = "webchat__basic-transcript__active-descendant-label--".concat(activityKey);
var isActiveDescendant = descendantId === activeDescendantId;
var read = readActivityKeys.includes(activityKey);
var focusSelf = (0, _react.useCallback)(function (withFocus) {
return focusByActivityKey(activityKeyRef.current, withFocus);
}, [activityKeyRef, focusByActivityKey]);
// When a child of the activity receives focus, notify the transcript to set the `aria-activedescendant` to this activity.
var handleDescendantFocus = (0, _react.useCallback)(function () {
return focusSelf(false);
}, [focusSelf]);
// When receive Escape key from descendant, focus back to the activity.
var handleLeaveFocusTrap = (0, _react.useCallback)(function () {
return focusSelf();
}, [focusSelf]);
// When the user press UP/DOWN arrow keys, we put a visual focus indicator around the focused activity.
// We should do the same for mouse, when the user click on the activity, we should also put a visual focus indicator around the activity.
// We are doing it in event capture phase to prevent descendants from stopping event propagation to us.
var handleMouseDownCapture = (0, _react.useCallback)(function () {
return focusSelf(false);
}, [focusSelf]);
var focusTrapChildren = (0, _react.useMemo)(function () {
return /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__basic-transcript__activity-body",
ref: bodyRef
}, children);
}, [bodyRef, children]);
return (
/*#__PURE__*/
// TODO: [P2] Add `aria-roledescription="message"` for better AX, need localization strings.
_react.default.createElement("article", {
className: (0, _classnames.default)('webchat__basic-transcript__activity', {
'webchat__basic-transcript__activity--acknowledged': acknowledged,
'webchat__basic-transcript__activity--read': read
})
// When NVDA is in browse mode, using up/down arrow key to "browse" will dispatch "click" and "mousedown" events for <article> element (inside <LiveRegionActivity>).
,
onMouseDownCapture: handleMouseDownCapture,
ref: ref
}, !_detectBrowser.android && /*#__PURE__*/_react.default.createElement("div", {
"aria-labelledby": descendantLabelId,
className: "webchat__basic-transcript__activity-active-descendant"
// "id" is required for "aria-labelledby"
// eslint-disable-next-line react/forbid-dom-props
,
id: descendantId,
role: "article"
}, /*#__PURE__*/_react.default.createElement(_ScreenReaderText.default, {
"aria-hidden": true,
id: descendantLabelId,
text: accessibleName
})), /*#__PURE__*/_react.default.createElement(_FocusTrap.default, {
onFocus: handleDescendantFocus,
onLeave: handleLeaveFocusTrap
}, focusTrapChildren), shouldSpeak && /*#__PURE__*/_react.default.createElement(_Speak.default, {
activity: activity
}), /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)('webchat__basic-transcript__activity-indicator', {
'webchat__basic-transcript__activity-indicator--focus': isActiveDescendant
})
}))
);
});
ActivityRow.defaultProps = {
children: undefined
};
ActivityRow.displayName = 'ActivityRow';
ActivityRow.propTypes = {
// PropTypes cannot fully capture TypeScript type.
// @ts-ignore
activity: _propTypes.default.shape({
channelData: _propTypes.default.shape({
speak: _propTypes.default.bool,
'webchat:fallback-text': _propTypes.default.string
})
}).isRequired,
children: _propTypes.default.any
};
var _default = /*#__PURE__*/(0, _react.memo)(ActivityRow);
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcHJvcFR5cGVzIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfZGV0ZWN0QnJvd3NlciIsIl9Gb2N1c1RyYXAiLCJfU2NyZWVuUmVhZGVyVGV4dCIsIl9TcGVhayIsIl91c2VBY3RpdmVEZXNjZW5kYW50SWQiLCJfdXNlQWN0aXZpdHlBY2Nlc3NpYmxlTmFtZSIsIl91c2VGb2N1c0J5QWN0aXZpdHlLZXkiLCJfdXNlR2V0RGVzY2VuZGFudElkQnlBY3Rpdml0eUtleSIsIl91c2VSZWZGcm9tIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJfc2xpY2VkVG9BcnJheSIsImFyciIsImkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVSZXN0IiwiVHlwZUVycm9yIiwibyIsIm1pbkxlbiIsIl9hcnJheUxpa2VUb0FycmF5IiwibiIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJBcnJheSIsImZyb20iLCJ0ZXN0IiwibGVuIiwibGVuZ3RoIiwiYXJyMiIsIl9pIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJfYXJyIiwiX24iLCJfZCIsIl9zIiwiX2UiLCJuZXh0IiwiZG9uZSIsInB1c2giLCJ2YWx1ZSIsImVyciIsImlzQXJyYXkiLCJ1c2VBY3Rpdml0eUtleXNCeVJlYWQiLCJob29rcyIsInVzZUdldEhhc0Fja25vd2xlZGdlZEJ5QWN0aXZpdHlLZXkiLCJ1c2VHZXRLZXlCeUFjdGl2aXR5IiwiQWN0aXZpdHlSb3ciLCJmb3J3YXJkUmVmIiwiX3JlZiIsInJlZiIsIl9hY3Rpdml0eSRjaGFubmVsRGF0YSIsImFjdGl2aXR5IiwiY2hpbGRyZW4iLCJfdXNlQWN0aXZlRGVzY2VuZGFudEkiLCJ1c2VBY3RpdmVEZXNjZW5kYW50SWQiLCJfdXNlQWN0aXZlRGVzY2VuZGFudEkyIiwiYWN0aXZlRGVzY2VuZGFudElkIiwiX3VzZUFjdGl2aXR5S2V5c0J5UmVhIiwiX3VzZUFjdGl2aXR5S2V5c0J5UmVhMiIsInJlYWRBY3Rpdml0eUtleXMiLCJib2R5UmVmIiwidXNlUmVmIiwiZm9jdXNCeUFjdGl2aXR5S2V5IiwidXNlRm9jdXNCeUFjdGl2aXR5S2V5IiwiZ2V0S2V5QnlBY3Rpdml0eSIsInNob3VsZFNwZWFrIiwiY2hhbm5lbERhdGEiLCJzcGVhayIsIl91c2VBY3Rpdml0eUFjY2Vzc2libCIsInVzZUFjdGl2aXR5QWNjZXNzaWJsZU5hbWUiLCJfdXNlQWN0aXZpdHlBY2Nlc3NpYmwyIiwiYWNjZXNzaWJsZU5hbWUiLCJhY3Rpdml0eUtleSIsImFja25vd2xlZGdlZCIsImFjdGl2aXR5S2V5UmVmIiwidXNlUmVmRnJvbSIsImRlc2NlbmRhbnRJZCIsInVzZUdldERlc2NlbmRhbnRJZEJ5QWN0aXZpdHlLZXkiLCJkZXNjZW5kYW50TGFiZWxJZCIsImNvbmNhdCIsImlzQWN0aXZlRGVzY2VuZGFudCIsInJlYWQiLCJpbmNsdWRlcyIsImZvY3VzU2VsZiIsInVzZUNhbGxiYWNrIiwid2l0aEZvY3VzIiwiY3VycmVudCIsImhhbmRsZURlc2NlbmRhbnRGb2N1cyIsImhhbmRsZUxlYXZlRm9jdXNUcmFwIiwiaGFuZGxlTW91c2VEb3duQ2FwdHVyZSIsImZvY3VzVHJhcENoaWxkcmVuIiwidXNlTWVtbyIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJjbGFzc05hbWVzIiwib25Nb3VzZURvd25DYXB0dXJlIiwiYW5kcm9pZCIsImlkIiwicm9sZSIsInRleHQiLCJvbkZvY3VzIiwib25MZWF2ZSIsImRlZmF1bHRQcm9wcyIsInVuZGVmaW5lZCIsImRpc3BsYXlOYW1lIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic2hhcGUiLCJib29sIiwic3RyaW5nIiwiaXNSZXF1aXJlZCIsImFueSIsIl9kZWZhdWx0IiwibWVtbyIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9UcmFuc2NyaXB0L0FjdGl2aXR5Um93LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBob29rcyB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWFwaSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgbWVtbywgdXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgYW5kcm9pZCB9IGZyb20gJy4uL1V0aWxzL2RldGVjdEJyb3dzZXInO1xuaW1wb3J0IEZvY3VzVHJhcCBmcm9tICcuL0ZvY3VzVHJhcCc7XG5pbXBvcnQgU2NyZWVuUmVhZGVyVGV4dCBmcm9tICcuLi9TY3JlZW5SZWFkZXJUZXh0JztcbmltcG9ydCBTcGVha0FjdGl2aXR5IGZyb20gJy4uL0FjdGl2aXR5L1NwZWFrJztcbmltcG9ydCB1c2VBY3RpdmVEZXNjZW5kYW50SWQgZnJvbSAnLi4vcHJvdmlkZXJzL1RyYW5zY3JpcHRGb2N1cy91c2VBY3RpdmVEZXNjZW5kYW50SWQnO1xuaW1wb3J0IHVzZUFjdGl2aXR5QWNjZXNzaWJsZU5hbWUgZnJvbSAnLi91c2VBY3Rpdml0eUFjY2Vzc2libGVOYW1lJztcbmltcG9ydCB1c2VGb2N1c0J5QWN0aXZpdHlLZXkgZnJvbSAnLi4vcHJvdmlkZXJzL1RyYW5zY3JpcHRGb2N1cy91c2VGb2N1c0J5QWN0aXZpdHlLZXknO1xuaW1wb3J0IHVzZUdldERlc2NlbmRhbnRJZEJ5QWN0aXZpdHlLZXkgZnJvbSAnLi4vcHJvdmlkZXJzL1RyYW5zY3JpcHRGb2N1cy91c2VHZXREZXNjZW5kYW50SWRCeUFjdGl2aXR5S2V5JztcblxuaW1wb3J0IHR5cGUgeyBNb3VzZUV2ZW50SGFuZGxlciwgUHJvcHNXaXRoQ2hpbGRyZW4gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IFdlYkNoYXRBY3Rpdml0eSB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWNvcmUnO1xuaW1wb3J0IHsgdXNlUmVmRnJvbSB9IGZyb20gJ3VzZS1yZWYtZnJvbSc7XG5cbmNvbnN0IHsgdXNlQWN0aXZpdHlLZXlzQnlSZWFkLCB1c2VHZXRIYXNBY2tub3dsZWRnZWRCeUFjdGl2aXR5S2V5LCB1c2VHZXRLZXlCeUFjdGl2aXR5IH0gPSBob29rcztcblxudHlwZSBBY3Rpdml0eVJvd1Byb3BzID0gUHJvcHNXaXRoQ2hpbGRyZW48eyBhY3Rpdml0eTogV2ViQ2hhdEFjdGl2aXR5IH0+O1xuXG5jb25zdCBBY3Rpdml0eVJvdyA9IGZvcndhcmRSZWY8SFRNTExJRWxlbWVudCwgQWN0aXZpdHlSb3dQcm9wcz4oKHsgYWN0aXZpdHksIGNoaWxkcmVuIH0sIHJlZikgPT4ge1xuICBjb25zdCBbYWN0aXZlRGVzY2VuZGFudElkXSA9IHVzZUFjdGl2ZURlc2NlbmRhbnRJZCgpO1xuICBjb25zdCBbcmVhZEFjdGl2aXR5S2V5c10gPSB1c2VBY3Rpdml0eUtleXNCeVJlYWQoKTtcbiAgY29uc3QgYm9keVJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcbiAgY29uc3QgZm9jdXNCeUFjdGl2aXR5S2V5ID0gdXNlRm9jdXNCeUFjdGl2aXR5S2V5KCk7XG4gIGNvbnN0IGdldEtleUJ5QWN0aXZpdHkgPSB1c2VHZXRLZXlCeUFjdGl2aXR5KCk7XG4gIC8vIFRPRE86IFtQMl0gIzI4NTggV2Ugc2hvdWxkIHVzZSBjb3JlL2RlZmluaXRpb25zL3NwZWFraW5nQWN0aXZpdHkgZm9yIHRoaXMgcHJlZGljYXRlIGluc3RlYWRcbiAgY29uc3Qgc2hvdWxkU3BlYWsgPSBhY3Rpdml0eS5jaGFubmVsRGF0YT8uc3BlYWs7XG5cbiAgY29uc3QgW2FjY2Vzc2libGVOYW1lXSA9IHVzZUFjdGl2aXR5QWNjZXNzaWJsZU5hbWUoYWN0aXZpdHksIGJvZHlSZWYpO1xuICBjb25zdCBhY3Rpdml0eUtleSA9IGdldEtleUJ5QWN0aXZpdHkoYWN0aXZpdHkpO1xuXG4gIGNvbnN0IGFja25vd2xlZGdlZCA9IHVzZUdldEhhc0Fja25vd2xlZGdlZEJ5QWN0aXZpdHlLZXkoKShhY3Rpdml0eUtleSk7XG4gIGNvbnN0IGFjdGl2aXR5S2V5UmVmID0gdXNlUmVmRnJvbTxzdHJpbmc+KGFjdGl2aXR5S2V5KTtcbiAgY29uc3QgZGVzY2VuZGFudElkID0gdXNlR2V0RGVzY2VuZGFudElkQnlBY3Rpdml0eUtleSgpKGFjdGl2aXR5S2V5KTtcbiAgY29uc3QgZGVzY2VuZGFudExhYmVsSWQgPSBgd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZlLWRlc2NlbmRhbnQtbGFiZWwtLSR7YWN0aXZpdHlLZXl9YDtcblxuICBjb25zdCBpc0FjdGl2ZURlc2NlbmRhbnQgPSBkZXNjZW5kYW50SWQgPT09IGFjdGl2ZURlc2NlbmRhbnRJZDtcbiAgY29uc3QgcmVhZCA9IHJlYWRBY3Rpdml0eUtleXMuaW5jbHVkZXMoYWN0aXZpdHlLZXkpO1xuXG4gIGNvbnN0IGZvY3VzU2VsZiA9IHVzZUNhbGxiYWNrPCh3aXRoRm9jdXM/OiBib29sZWFuKSA9PiB2b2lkPihcbiAgICAod2l0aEZvY3VzPzogYm9vbGVhbikgPT4gZm9jdXNCeUFjdGl2aXR5S2V5KGFjdGl2aXR5S2V5UmVmLmN1cnJlbnQsIHdpdGhGb2N1cyksXG4gICAgW2FjdGl2aXR5S2V5UmVmLCBmb2N1c0J5QWN0aXZpdHlLZXldXG4gICk7XG5cbiAgLy8gV2hlbiBhIGNoaWxkIG9mIHRoZSBhY3Rpdml0eSByZWNlaXZlcyBmb2N1cywgbm90aWZ5IHRoZSB0cmFuc2NyaXB0IHRvIHNldCB0aGUgYGFyaWEtYWN0aXZlZGVzY2VuZGFudGAgdG8gdGhpcyBhY3Rpdml0eS5cbiAgY29uc3QgaGFuZGxlRGVzY2VuZGFudEZvY3VzOiAoKSA9PiB2b2lkID0gdXNlQ2FsbGJhY2soKCkgPT4gZm9jdXNTZWxmKGZhbHNlKSwgW2ZvY3VzU2VsZl0pO1xuXG4gIC8vIFdoZW4gcmVjZWl2ZSBFc2NhcGUga2V5IGZyb20gZGVzY2VuZGFudCwgZm9jdXMgYmFjayB0byB0aGUgYWN0aXZpdHkuXG4gIGNvbnN0IGhhbmRsZUxlYXZlRm9jdXNUcmFwID0gdXNlQ2FsbGJhY2soKCkgPT4gZm9jdXNTZWxmKCksIFtmb2N1c1NlbGZdKTtcblxuICAvLyBXaGVuIHRoZSB1c2VyIHByZXNzIFVQL0RPV04gYXJyb3cga2V5cywgd2UgcHV0IGEgdmlzdWFsIGZvY3VzIGluZGljYXRvciBhcm91bmQgdGhlIGZvY3VzZWQgYWN0aXZpdHkuXG4gIC8vIFdlIHNob3VsZCBkbyB0aGUgc2FtZSBmb3IgbW91c2UsIHdoZW4gdGhlIHVzZXIgY2xpY2sgb24gdGhlIGFjdGl2aXR5LCB3ZSBzaG91bGQgYWxzbyBwdXQgYSB2aXN1YWwgZm9jdXMgaW5kaWNhdG9yIGFyb3VuZCB0aGUgYWN0aXZpdHkuXG4gIC8vIFdlIGFyZSBkb2luZyBpdCBpbiBldmVudCBjYXB0dXJlIHBoYXNlIHRvIHByZXZlbnQgZGVzY2VuZGFudHMgZnJvbSBzdG9wcGluZyBldmVudCBwcm9wYWdhdGlvbiB0byB1cy5cbiAgY29uc3QgaGFuZGxlTW91c2VEb3duQ2FwdHVyZTogTW91c2VFdmVudEhhbmRsZXIgPSB1c2VDYWxsYmFjaygoKSA9PiBmb2N1c1NlbGYoZmFsc2UpLCBbZm9jdXNTZWxmXSk7XG5cbiAgY29uc3QgZm9jdXNUcmFwQ2hpbGRyZW4gPSB1c2VNZW1vKFxuICAgICgpID0+IChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktYm9keVwiIHJlZj17Ym9keVJlZn0+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvZGl2PlxuICAgICksXG4gICAgW2JvZHlSZWYsIGNoaWxkcmVuXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgLy8gVE9ETzogW1AyXSBBZGQgYGFyaWEtcm9sZWRlc2NyaXB0aW9uPVwibWVzc2FnZVwiYCBmb3IgYmV0dGVyIEFYLCBuZWVkIGxvY2FsaXphdGlvbiBzdHJpbmdzLlxuICAgIDxhcnRpY2xlXG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5Jywge1xuICAgICAgICAnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktLWFja25vd2xlZGdlZCc6IGFja25vd2xlZGdlZCxcbiAgICAgICAgJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LS1yZWFkJzogcmVhZFxuICAgICAgfSl9XG4gICAgICAvLyBXaGVuIE5WREEgaXMgaW4gYnJvd3NlIG1vZGUsIHVzaW5nIHVwL2Rvd24gYXJyb3cga2V5IHRvIFwiYnJvd3NlXCIgd2lsbCBkaXNwYXRjaCBcImNsaWNrXCIgYW5kIFwibW91c2Vkb3duXCIgZXZlbnRzIGZvciA8YXJ0aWNsZT4gZWxlbWVudCAoaW5zaWRlIDxMaXZlUmVnaW9uQWN0aXZpdHk+KS5cbiAgICAgIG9uTW91c2VEb3duQ2FwdHVyZT17aGFuZGxlTW91c2VEb3duQ2FwdHVyZX1cbiAgICAgIHJlZj17cmVmfVxuICAgID5cbiAgICAgIHsvKiBUT0RPOiBbUDFdIEZpbGUgYSBjcmJ1ZyBmb3IgVGFsa0JhY2suIEl0IHNob3VsZCBub3QgYWJsZSB0byByZWFkIHRoZSBjb250ZW50IHR3aWNlIHdoZW4gc2Nhbm5pbmcuICovfVxuXG4gICAgICB7LyogVGhlIGZvbGxvd2luZyA8ZGl2PiBpcyBkZXNpZ25lZCBmb3IgYWN0aXZlIGRlc2NlbmRhbnQgb25seS5cbiAgICAgICAgICBXZSB3YW50IHRvIHByZXZlbnQgc2NyZWVuIHJlYWRlciBmcm9tIHNjYW5uaW5nIHRoZSBjb250ZW50IHRoYXQgaXMgYXV0aG9yZWQgb25seSBmb3IgYWN0aXZlIGRlc2NlbmRhbnQuXG4gICAgICAgICAgVGhlIHNwZWNpZmljIGNvbnRlbnQgc2hvdWxkIG9ubHkgcmVhZCB3aGVuIHVzZXIgcHJlc3MgVVAvRE9XTiBhcnJvdyBrZXlzIHRvIGNoYW5nZSBgYXJpYS1hY3RpdmVkZXNjZW5kYW50YC5cbiAgICAgICAgICBIb3dldmVyLCBBbmRyb2lkIFRhbGtCYWNrIDEyLjEgaXMgYnVnZ3kgd2hlbiB0aGUgdGhlcmUgaXMgYW4gZWxlbWVudCB3aXRoIElEIG9mIG9uZSBvZiB0aGUgYGFyaWEtYWN0aXZlZGVzY2VuZGFudGAgcG90ZW50aWFsIGNhbmRpZGF0ZXMsXG4gICAgICAgICAgVGFsa0JhY2sgd2lsbCBuYXJyYXRlIHRoZSBtZXNzYWdlIGNvbnRlbnQgdHdpY2UgKGkuZS4gY29udGVudCBvZiBgYm9keVJlZmApLCByZWdhcmRsZXNzIHdoZXRoZXIgdGhlIElEIGlzIGN1cnJlbnRseSBzZXQgYXMgYGFyaWEtYWN0aXZlZGVzY2VuZGFudGAgb3Igbm90LlxuICAgICAgICAgIEFzIEFuZHJvaWQgZG9lcyBub3Qgc3VwcG9ydCBhY3RpdmUgZGVzY2VuZGFudCwgd2UgYXJlIGhpZGluZyB0aGUgd2hvbGUgRE9NIGVsZW1lbnQgYWx0b2dldGhlci4gKi99XG5cbiAgICAgIHshYW5kcm9pZCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9e2Rlc2NlbmRhbnRMYWJlbElkfVxuICAgICAgICAgIGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LWFjdGl2ZS1kZXNjZW5kYW50XCJcbiAgICAgICAgICAvLyBcImlkXCIgaXMgcmVxdWlyZWQgZm9yIFwiYXJpYS1sYWJlbGxlZGJ5XCJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvZm9yYmlkLWRvbS1wcm9wc1xuICAgICAgICAgIGlkPXtkZXNjZW5kYW50SWR9XG4gICAgICAgICAgcm9sZT1cImFydGljbGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPFNjcmVlblJlYWRlclRleHQgYXJpYS1oaWRkZW49e3RydWV9IGlkPXtkZXNjZW5kYW50TGFiZWxJZH0gdGV4dD17YWNjZXNzaWJsZU5hbWV9IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIDxGb2N1c1RyYXAgb25Gb2N1cz17aGFuZGxlRGVzY2VuZGFudEZvY3VzfSBvbkxlYXZlPXtoYW5kbGVMZWF2ZUZvY3VzVHJhcH0+XG4gICAgICAgIHtmb2N1c1RyYXBDaGlsZHJlbn1cbiAgICAgIDwvRm9jdXNUcmFwPlxuICAgICAge3Nob3VsZFNwZWFrICYmIDxTcGVha0FjdGl2aXR5IGFjdGl2aXR5PXthY3Rpdml0eX0gLz59XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcygnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktaW5kaWNhdG9yJywge1xuICAgICAgICAgICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS1pbmRpY2F0b3ItLWZvY3VzJzogaXNBY3RpdmVEZXNjZW5kYW50XG4gICAgICAgIH0pfVxuICAgICAgLz5cbiAgICA8L2FydGljbGU+XG4gICk7XG59KTtcblxuQWN0aXZpdHlSb3cuZGVmYXVsdFByb3BzID0ge1xuICBjaGlsZHJlbjogdW5kZWZpbmVkXG59O1xuXG5BY3Rpdml0eVJvdy5kaXNwbGF5TmFtZSA9ICdBY3Rpdml0eVJvdyc7XG5cbkFjdGl2aXR5Um93LnByb3BUeXBlcyA9IHtcbiAgLy8gUHJvcFR5cGVzIGNhbm5vdCBmdWxseSBjYXB0dXJlIFR5cGVTY3JpcHQgdHlwZS5cbiAgLy8gQHRzLWlnbm9yZVxuICBhY3Rpdml0eTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBjaGFubmVsRGF0YTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIHNwZWFrOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICd3ZWJjaGF0OmZhbGxiYWNrLXRleHQnOiBQcm9wVHlwZXMuc3RyaW5nXG4gICAgfSlcbiAgfSkuaXNSZXF1aXJlZCxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5hbnlcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1lbW8oQWN0aXZpdHlSb3cpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsdUJBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFVBQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUwsT0FBQTtBQUVBLElBQUFNLGNBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFVBQUEsR0FBQUwsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFRLGlCQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUyxNQUFBLEdBQUFQLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBVSxzQkFBQSxHQUFBUixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVcsMEJBQUEsR0FBQVQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFZLHNCQUFBLEdBQUFWLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBYSxnQ0FBQSxHQUFBWCxzQkFBQSxDQUFBRixPQUFBO0FBSUEsSUFBQWMsV0FBQSxHQUFBZCxPQUFBO0FBQTBDLFNBQUFlLHlCQUFBQyxXQUFBLGVBQUFDLE9BQUEsa0NBQUFDLGlCQUFBLE9BQUFELE9BQUEsUUFBQUUsZ0JBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBWCx3QkFBQWUsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLGFBQUFFLE9BQUEsQ0FBQUYsR0FBQSx5QkFBQUEsR0FBQSw0QkFBQUcsT0FBQSxFQUFBSCxHQUFBLFVBQUFJLEtBQUEsR0FBQVQsd0JBQUEsQ0FBQUMsV0FBQSxPQUFBUSxLQUFBLElBQUFBLEtBQUEsQ0FBQUMsR0FBQSxDQUFBTCxHQUFBLFlBQUFJLEtBQUEsQ0FBQUUsR0FBQSxDQUFBTixHQUFBLFNBQUFPLE1BQUEsV0FBQUMscUJBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsR0FBQSxJQUFBWixHQUFBLFFBQUFZLEdBQUEsa0JBQUFILE1BQUEsQ0FBQUksU0FBQSxDQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWYsR0FBQSxFQUFBWSxHQUFBLFNBQUFJLElBQUEsR0FBQVIscUJBQUEsR0FBQUMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBWCxHQUFBLEVBQUFZLEdBQUEsY0FBQUksSUFBQSxLQUFBQSxJQUFBLENBQUFWLEdBQUEsSUFBQVUsSUFBQSxDQUFBQyxHQUFBLEtBQUFSLE1BQUEsQ0FBQUMsY0FBQSxDQUFBSCxNQUFBLEVBQUFLLEdBQUEsRUFBQUksSUFBQSxZQUFBVCxNQUFBLENBQUFLLEdBQUEsSUFBQVosR0FBQSxDQUFBWSxHQUFBLFNBQUFMLE1BQUEsQ0FBQUosT0FBQSxHQUFBSCxHQUFBLE1BQUFJLEtBQUEsSUFBQUEsS0FBQSxDQUFBYSxHQUFBLENBQUFqQixHQUFBLEVBQUFPLE1BQUEsWUFBQUEsTUFBQTtBQUFBLFNBQUF6Qix1QkFBQWtCLEdBQUEsV0FBQUEsR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsR0FBQUQsR0FBQSxLQUFBRyxPQUFBLEVBQUFILEdBQUE7QUFBQSxTQUFBa0IsZUFBQUMsR0FBQSxFQUFBQyxDQUFBLFdBQUFDLGVBQUEsQ0FBQUYsR0FBQSxLQUFBRyxxQkFBQSxDQUFBSCxHQUFBLEVBQUFDLENBQUEsS0FBQUcsMkJBQUEsQ0FBQUosR0FBQSxFQUFBQyxDQUFBLEtBQUFJLGdCQUFBO0FBQUEsU0FBQUEsaUJBQUEsY0FBQUMsU0FBQTtBQUFBLFNBQUFGLDRCQUFBRyxDQUFBLEVBQUFDLE1BQUEsU0FBQUQsQ0FBQSxxQkFBQUEsQ0FBQSxzQkFBQUUsaUJBQUEsQ0FBQUYsQ0FBQSxFQUFBQyxNQUFBLE9BQUFFLENBQUEsR0FBQXBCLE1BQUEsQ0FBQUksU0FBQSxDQUFBaUIsUUFBQSxDQUFBZixJQUFBLENBQUFXLENBQUEsRUFBQUssS0FBQSxhQUFBRixDQUFBLGlCQUFBSCxDQUFBLENBQUFNLFdBQUEsRUFBQUgsQ0FBQSxHQUFBSCxDQUFBLENBQUFNLFdBQUEsQ0FBQUMsSUFBQSxNQUFBSixDQUFBLGNBQUFBLENBQUEsbUJBQUFLLEtBQUEsQ0FBQUMsSUFBQSxDQUFBVCxDQUFBLE9BQUFHLENBQUEsK0RBQUFPLElBQUEsQ0FBQVAsQ0FBQSxVQUFBRCxpQkFBQSxDQUFBRixDQUFBLEVBQUFDLE1BQUE7QUFBQSxTQUFBQyxrQkFBQVQsR0FBQSxFQUFBa0IsR0FBQSxRQUFBQSxHQUFBLFlBQUFBLEdBQUEsR0FBQWxCLEdBQUEsQ0FBQW1CLE1BQUEsRUFBQUQsR0FBQSxHQUFBbEIsR0FBQSxDQUFBbUIsTUFBQSxXQUFBbEIsQ0FBQSxNQUFBbUIsSUFBQSxPQUFBTCxLQUFBLENBQUFHLEdBQUEsR0FBQWpCLENBQUEsR0FBQWlCLEdBQUEsRUFBQWpCLENBQUEsTUFBQW1CLElBQUEsQ0FBQW5CLENBQUEsSUFBQUQsR0FBQSxDQUFBQyxDQUFBLFlBQUFtQixJQUFBO0FBQUEsU0FBQWpCLHNCQUFBSCxHQUFBLEVBQUFDLENBQUEsUUFBQW9CLEVBQUEsR0FBQXJCLEdBQUEseUJBQUFzQixNQUFBLG9CQUFBdEIsR0FBQSxDQUFBc0IsTUFBQSxDQUFBQyxRQUFBLEtBQUF2QixHQUFBLG9CQUFBcUIsRUFBQSxzQkFBQUcsSUFBQSxXQUFBQyxFQUFBLGFBQUFDLEVBQUEsY0FBQUMsRUFBQSxFQUFBQyxFQUFBLGFBQUFQLEVBQUEsR0FBQUEsRUFBQSxDQUFBekIsSUFBQSxDQUFBSSxHQUFBLEtBQUF5QixFQUFBLElBQUFFLEVBQUEsR0FBQU4sRUFBQSxDQUFBUSxJQUFBLElBQUFDLElBQUEsR0FBQUwsRUFBQSxXQUFBRCxJQUFBLENBQUFPLElBQUEsQ0FBQUosRUFBQSxDQUFBSyxLQUFBLE9BQUEvQixDQUFBLElBQUF1QixJQUFBLENBQUFMLE1BQUEsS0FBQWxCLENBQUEsb0JBQUFnQyxHQUFBLElBQUFQLEVBQUEsU0FBQUUsRUFBQSxHQUFBSyxHQUFBLHlCQUFBUixFQUFBLElBQUFKLEVBQUEsb0JBQUFBLEVBQUEsOEJBQUFLLEVBQUEsUUFBQUUsRUFBQSxhQUFBSixJQUFBO0FBQUEsU0FBQXRCLGdCQUFBRixHQUFBLFFBQUFlLEtBQUEsQ0FBQW1CLE9BQUEsQ0FBQWxDLEdBQUEsVUFBQUEsR0FBQTtBQUUxQyxJQUFRbUMscUJBQXFCLEdBQThEQyw2QkFBSyxDQUF4RkQscUJBQXFCO0VBQUVFLGtDQUFrQyxHQUEwQkQsNkJBQUssQ0FBakVDLGtDQUFrQztFQUFFQyxtQkFBbUIsR0FBS0YsNkJBQUssQ0FBN0JFLG1CQUFtQjtBQUl0RixJQUFNQyxXQUFXLGdCQUFHLElBQUFDLGlCQUFVLEVBQWtDLFVBQUFDLElBQUEsRUFBeUJDLEdBQUcsRUFBSztFQUFBLElBQUFDLHFCQUFBO0VBQUEsSUFBOUJDLFFBQVEsR0FBQUgsSUFBQSxDQUFSRyxRQUFRO0lBQUVDLFFBQVEsR0FBQUosSUFBQSxDQUFSSSxRQUFRO0VBQ25GLElBQUFDLHFCQUFBLEdBQTZCLElBQUFDLDhCQUFxQixFQUFDLENBQUM7SUFBQUMsc0JBQUEsR0FBQWpELGNBQUEsQ0FBQStDLHFCQUFBO0lBQTdDRyxrQkFBa0IsR0FBQUQsc0JBQUE7RUFDekIsSUFBQUUscUJBQUEsR0FBMkJmLHFCQUFxQixDQUFDLENBQUM7SUFBQWdCLHNCQUFBLEdBQUFwRCxjQUFBLENBQUFtRCxxQkFBQTtJQUEzQ0UsZ0JBQWdCLEdBQUFELHNCQUFBO0VBQ3ZCLElBQU1FLE9BQU8sR0FBRyxJQUFBQyxhQUFNLEVBQWlCLENBQUM7RUFDeEMsSUFBTUMsa0JBQWtCLEdBQUcsSUFBQUMsOEJBQXFCLEVBQUMsQ0FBQztFQUNsRCxJQUFNQyxnQkFBZ0IsR0FBR25CLG1CQUFtQixDQUFDLENBQUM7RUFDOUM7RUFDQSxJQUFNb0IsV0FBVyxJQUFBZixxQkFBQSxHQUFHQyxRQUFRLENBQUNlLFdBQVcsY0FBQWhCLHFCQUFBLHVCQUFwQkEscUJBQUEsQ0FBc0JpQixLQUFLO0VBRS9DLElBQUFDLHFCQUFBLEdBQXlCLElBQUFDLGtDQUF5QixFQUFDbEIsUUFBUSxFQUFFUyxPQUFPLENBQUM7SUFBQVUsc0JBQUEsR0FBQWhFLGNBQUEsQ0FBQThELHFCQUFBO0lBQTlERyxjQUFjLEdBQUFELHNCQUFBO0VBQ3JCLElBQU1FLFdBQVcsR0FBR1IsZ0JBQWdCLENBQUNiLFFBQVEsQ0FBQztFQUU5QyxJQUFNc0IsWUFBWSxHQUFHN0Isa0NBQWtDLENBQUMsQ0FBQyxDQUFDNEIsV0FBVyxDQUFDO0VBQ3RFLElBQU1FLGNBQWMsR0FBRyxJQUFBQyxzQkFBVSxFQUFTSCxXQUFXLENBQUM7RUFDdEQsSUFBTUksWUFBWSxHQUFHLElBQUFDLHdDQUErQixFQUFDLENBQUMsQ0FBQ0wsV0FBVyxDQUFDO0VBQ25FLElBQU1NLGlCQUFpQiwwREFBQUMsTUFBQSxDQUEwRFAsV0FBVyxDQUFFO0VBRTlGLElBQU1RLGtCQUFrQixHQUFHSixZQUFZLEtBQUtwQixrQkFBa0I7RUFDOUQsSUFBTXlCLElBQUksR0FBR3RCLGdCQUFnQixDQUFDdUIsUUFBUSxDQUFDVixXQUFXLENBQUM7RUFFbkQsSUFBTVcsU0FBUyxHQUFHLElBQUFDLGtCQUFXLEVBQzNCLFVBQUNDLFNBQW1CO0lBQUEsT0FBS3ZCLGtCQUFrQixDQUFDWSxjQUFjLENBQUNZLE9BQU8sRUFBRUQsU0FBUyxDQUFDO0VBQUEsR0FDOUUsQ0FBQ1gsY0FBYyxFQUFFWixrQkFBa0IsQ0FDckMsQ0FBQzs7RUFFRDtFQUNBLElBQU15QixxQkFBaUMsR0FBRyxJQUFBSCxrQkFBVyxFQUFDO0lBQUEsT0FBTUQsU0FBUyxDQUFDLEtBQUssQ0FBQztFQUFBLEdBQUUsQ0FBQ0EsU0FBUyxDQUFDLENBQUM7O0VBRTFGO0VBQ0EsSUFBTUssb0JBQW9CLEdBQUcsSUFBQUosa0JBQVcsRUFBQztJQUFBLE9BQU1ELFNBQVMsQ0FBQyxDQUFDO0VBQUEsR0FBRSxDQUFDQSxTQUFTLENBQUMsQ0FBQzs7RUFFeEU7RUFDQTtFQUNBO0VBQ0EsSUFBTU0sc0JBQXlDLEdBQUcsSUFBQUwsa0JBQVcsRUFBQztJQUFBLE9BQU1ELFNBQVMsQ0FBQyxLQUFLLENBQUM7RUFBQSxHQUFFLENBQUNBLFNBQVMsQ0FBQyxDQUFDO0VBRWxHLElBQU1PLGlCQUFpQixHQUFHLElBQUFDLGNBQU8sRUFDL0I7SUFBQSxvQkFDRXZILE1BQUEsQ0FBQW1CLE9BQUEsQ0FBQXFHLGFBQUE7TUFBS0MsU0FBUyxFQUFDLDBDQUEwQztNQUFDNUMsR0FBRyxFQUFFVztJQUFRLEdBQ3BFUixRQUNFLENBQUM7RUFBQSxDQUNQLEVBQ0QsQ0FBQ1EsT0FBTyxFQUFFUixRQUFRLENBQ3BCLENBQUM7RUFFRDtJQUFBO0lBQ0U7SUFDQWhGLE1BQUEsQ0FBQW1CLE9BQUEsQ0FBQXFHLGFBQUE7TUFDRUMsU0FBUyxFQUFFLElBQUFDLG1CQUFVLEVBQUMscUNBQXFDLEVBQUU7UUFDM0QsbURBQW1ELEVBQUVyQixZQUFZO1FBQ2pFLDJDQUEyQyxFQUFFUTtNQUMvQyxDQUFDO01BQ0Q7TUFBQTtNQUNBYyxrQkFBa0IsRUFBRU4sc0JBQXVCO01BQzNDeEMsR0FBRyxFQUFFQTtJQUFJLEdBV1IsQ0FBQytDLHNCQUFPLGlCQUNQNUgsTUFBQSxDQUFBbUIsT0FBQSxDQUFBcUcsYUFBQTtNQUNFLG1CQUFpQmQsaUJBQWtCO01BQ25DZSxTQUFTLEVBQUM7TUFDVjtNQUNBO01BQUE7TUFDQUksRUFBRSxFQUFFckIsWUFBYTtNQUNqQnNCLElBQUksRUFBQztJQUFTLGdCQUVkOUgsTUFBQSxDQUFBbUIsT0FBQSxDQUFBcUcsYUFBQSxDQUFDcEgsaUJBQUEsQ0FBQWUsT0FBZ0I7TUFBQyxlQUFhLElBQUs7TUFBQzBHLEVBQUUsRUFBRW5CLGlCQUFrQjtNQUFDcUIsSUFBSSxFQUFFNUI7SUFBZSxDQUFFLENBQ2hGLENBQ04sZUFDRG5HLE1BQUEsQ0FBQW1CLE9BQUEsQ0FBQXFHLGFBQUEsQ0FBQ3JILFVBQUEsQ0FBQWdCLE9BQVM7TUFBQzZHLE9BQU8sRUFBRWIscUJBQXNCO01BQUNjLE9BQU8sRUFBRWI7SUFBcUIsR0FDdEVFLGlCQUNRLENBQUMsRUFDWHpCLFdBQVcsaUJBQUk3RixNQUFBLENBQUFtQixPQUFBLENBQUFxRyxhQUFBLENBQUNuSCxNQUFBLENBQUFjLE9BQWE7TUFBQzRELFFBQVEsRUFBRUE7SUFBUyxDQUFFLENBQUMsZUFDckQvRSxNQUFBLENBQUFtQixPQUFBLENBQUFxRyxhQUFBO01BQ0VDLFNBQVMsRUFBRSxJQUFBQyxtQkFBVSxFQUFDLCtDQUErQyxFQUFFO1FBQ3JFLHNEQUFzRCxFQUFFZDtNQUMxRCxDQUFDO0lBQUUsQ0FDSixDQUNNO0VBQUM7QUFFZCxDQUFDLENBQUM7QUFFRmxDLFdBQVcsQ0FBQ3dELFlBQVksR0FBRztFQUN6QmxELFFBQVEsRUFBRW1EO0FBQ1osQ0FBQztBQUVEekQsV0FBVyxDQUFDMEQsV0FBVyxHQUFHLGFBQWE7QUFFdkMxRCxXQUFXLENBQUMyRCxTQUFTLEdBQUc7RUFDdEI7RUFDQTtFQUNBdEQsUUFBUSxFQUFFdUQsa0JBQVMsQ0FBQ0MsS0FBSyxDQUFDO0lBQ3hCekMsV0FBVyxFQUFFd0Msa0JBQVMsQ0FBQ0MsS0FBSyxDQUFDO01BQzNCeEMsS0FBSyxFQUFFdUMsa0JBQVMsQ0FBQ0UsSUFBSTtNQUNyQix1QkFBdUIsRUFBRUYsa0JBQVMsQ0FBQ0c7SUFDckMsQ0FBQztFQUNILENBQUMsQ0FBQyxDQUFDQyxVQUFVO0VBQ2IxRCxRQUFRLEVBQUVzRCxrQkFBUyxDQUFDSztBQUN0QixDQUFDO0FBQUMsSUFBQUMsUUFBQSxnQkFFYSxJQUFBQyxXQUFJLEVBQUNuRSxXQUFXLENBQUM7QUFBQW9FLE9BQUEsQ0FBQTNILE9BQUEsR0FBQXlILFFBQUEifQ==
;