UNPKG

botframework-webchat-component

Version:
256 lines (254 loc) 46 kB
"use strict"; 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 _reactFilm = _interopRequireWildcard(require("react-film")); var _computeSuggestedActionText = _interopRequireDefault(require("../Utils/computeSuggestedActionText")); var _useFocusWithin3 = _interopRequireDefault(require("../hooks/internal/useFocusWithin")); var _useNonce3 = _interopRequireDefault(require("../hooks/internal/useNonce")); var _useStyleToEmotionObject = _interopRequireDefault(require("../hooks/internal/useStyleToEmotionObject")); var _useFocus = _interopRequireDefault(require("../hooks/useFocus")); var _useStyleSet7 = _interopRequireDefault(require("../hooks/useStyleSet")); var _RovingTabIndexComposer = _interopRequireDefault(require("../providers/RovingTabIndex/RovingTabIndexComposer")); var _SuggestedAction = _interopRequireDefault(require("./SuggestedAction")); 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; } /* eslint react/no-array-index-key: "off" */ // eslint-disable-next-line import/no-named-as-default var useDirection = _botframeworkWebchatApi.hooks.useDirection, useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer, useStyleOptions = _botframeworkWebchatApi.hooks.useStyleOptions, useSuggestedActions = _botframeworkWebchatApi.hooks.useSuggestedActions; var ROOT_STYLE = { '&.webchat__suggested-actions': { '&.webchat__suggested-actions--flow-layout .webchat__suggested-actions__flow-box': { display: 'flex', flexWrap: 'wrap' }, '&.webchat__suggested-actions--stack-layout .webchat__suggested-actions__stack': { display: 'flex', flexDirection: 'column' } } }; var SuggestedActionCarouselContainer = function SuggestedActionCarouselContainer(_ref) { var children = _ref.children, className = _ref.className, label = _ref.label; var _useStyleOptions = useStyleOptions(), _useStyleOptions2 = _slicedToArray(_useStyleOptions, 1), _useStyleOptions2$ = _useStyleOptions2[0], suggestedActionsCarouselFlipperBoxWidth = _useStyleOptions2$.suggestedActionsCarouselFlipperBoxWidth, suggestedActionsCarouselFlipperCursor = _useStyleOptions2$.suggestedActionsCarouselFlipperCursor, suggestedActionsCarouselFlipperSize = _useStyleOptions2$.suggestedActionsCarouselFlipperSize; var _useStyleSet = (0, _useStyleSet7.default)(), _useStyleSet2 = _slicedToArray(_useStyleSet, 1), suggestedActionsStyleSet = _useStyleSet2[0].suggestedActions; var _useDirection = useDirection(), _useDirection2 = _slicedToArray(_useDirection, 1), direction = _useDirection2[0]; var _useNonce = (0, _useNonce3.default)(), _useNonce2 = _slicedToArray(_useNonce, 1), nonce = _useNonce2[0]; var localize = useLocalizer(); var ref = (0, _react.useRef)(); var rootClassName = (0, _useStyleToEmotionObject.default)()(ROOT_STYLE) + ''; var filmStyleSet = (0, _react.useMemo)(function () { return (0, _reactFilm.createBasicStyleSet)({ autoHide: false, cursor: suggestedActionsCarouselFlipperCursor, flipperBoxWidth: suggestedActionsCarouselFlipperBoxWidth, flipperSize: suggestedActionsCarouselFlipperSize }); }, [suggestedActionsCarouselFlipperBoxWidth, suggestedActionsCarouselFlipperCursor, suggestedActionsCarouselFlipperSize]); var nextFlipperAriaLabel = localize('SUGGESTED_ACTIONS_FLIPPER_NEXT_ALT'); var previousFlipperAriaLabel = localize('SUGGESTED_ACTIONS_FLIPPER_PREVIOUS_ALT'); var _useFocusWithin = (0, _useFocusWithin3.default)(ref), _useFocusWithin2 = _slicedToArray(_useFocusWithin, 1), focusedWithin = _useFocusWithin2[0]; var leftFlipperAriaLabel = direction === 'rtl' ? nextFlipperAriaLabel : previousFlipperAriaLabel; var rightFlipperAriaLabel = direction === 'rtl' ? previousFlipperAriaLabel : nextFlipperAriaLabel; return ( /*#__PURE__*/ // TODO: The content of suggested actions should be the labelled by the activity. // That means, when the user focus into the suggested actions, it should read similar to "Bot said, what's your preference of today? Suggested actions has items: apple button, orange button, banana button." _react.default.createElement("div", { "aria-label": label, "aria-orientation": "horizontal", className: (0, _classnames.default)('webchat__suggested-actions', 'webchat__suggested-actions--carousel-layout', { 'webchat__suggested-actions--focus-within': focusedWithin, 'webchat__suggested-actions--rtl': direction === 'rtl' }, rootClassName, suggestedActionsStyleSet + '', (className || '') + ''), ref: ref, role: "toolbar" }, !!children && !!_react.default.Children.count(children) && /*#__PURE__*/_react.default.createElement(_reactFilm.default, { autoCenter: false, className: "webchat__suggested-actions__carousel", dir: direction, flipperBlurFocusOnClick: true, leftFlipperAriaLabel: leftFlipperAriaLabel, nonce: nonce, rightFlipperAriaLabel: rightFlipperAriaLabel, showDots: false, showScrollBar: false, styleSet: filmStyleSet }, children), /*#__PURE__*/_react.default.createElement("div", { className: "webchat__suggested-actions__focus-indicator" })) ); }; SuggestedActionCarouselContainer.defaultProps = { children: undefined, className: undefined }; SuggestedActionCarouselContainer.propTypes = { children: _propTypes.default.any, className: _propTypes.default.string, label: _propTypes.default.string.isRequired }; var SuggestedActionFlowContainer = function SuggestedActionFlowContainer(_ref2) { var children = _ref2.children, className = _ref2.className, label = _ref2.label; var _useStyleSet3 = (0, _useStyleSet7.default)(), _useStyleSet4 = _slicedToArray(_useStyleSet3, 1), suggestedActionsStyleSet = _useStyleSet4[0].suggestedActions; var rootClassName = (0, _useStyleToEmotionObject.default)()(ROOT_STYLE) + ''; return /*#__PURE__*/_react.default.createElement("div", { "aria-label": label, "aria-live": "polite", "aria-orientation": "horizontal", className: (0, _classnames.default)('webchat__suggested-actions', 'webchat__suggested-actions--flow-layout', rootClassName, suggestedActionsStyleSet + '', (className || '') + ''), role: "toolbar" }, !!children && !!_react.default.Children.count(children) && /*#__PURE__*/_react.default.createElement("div", { className: "webchat__suggested-actions__flow-box" }, _react.default.Children.map(children, function (child) { return /*#__PURE__*/_react.default.createElement("div", { className: "webchat__suggested-actions__flow-item-box" }, child); })), /*#__PURE__*/_react.default.createElement("div", { className: "webchat__suggested-actions__focus-indicator" })); }; SuggestedActionFlowContainer.defaultProps = { children: undefined, className: undefined }; SuggestedActionFlowContainer.propTypes = { children: _propTypes.default.any, className: _propTypes.default.string, label: _propTypes.default.string.isRequired }; var SuggestedActionStackedContainer = function SuggestedActionStackedContainer(_ref3) { var children = _ref3.children, className = _ref3.className, label = _ref3.label; var _useStyleSet5 = (0, _useStyleSet7.default)(), _useStyleSet6 = _slicedToArray(_useStyleSet5, 1), suggestedActionsStyleSet = _useStyleSet6[0].suggestedActions; var rootClassName = (0, _useStyleToEmotionObject.default)()(ROOT_STYLE) + ''; return /*#__PURE__*/_react.default.createElement("div", { "aria-label": label, "aria-live": "polite", "aria-orientation": "vertical", className: (0, _classnames.default)('webchat__suggested-actions', 'webchat__suggested-actions--stacked-layout', rootClassName, suggestedActionsStyleSet + '', (className || '') + ''), role: "toolbar" }, !!children && !!_react.default.Children.count(children) && /*#__PURE__*/_react.default.createElement("div", { className: "webchat__suggested-actions__stack" }, children), /*#__PURE__*/_react.default.createElement("div", { className: "webchat__suggested-actions__focus-indicator" })); }; SuggestedActionStackedContainer.defaultProps = { children: undefined, className: undefined }; SuggestedActionStackedContainer.propTypes = { children: _propTypes.default.any, className: _propTypes.default.string, label: _propTypes.default.string.isRequired }; var SuggestedActions = function SuggestedActions(_ref4) { var className = _ref4.className; var _useSuggestedActions = useSuggestedActions(), _useSuggestedActions2 = _slicedToArray(_useSuggestedActions, 1), suggestedActions = _useSuggestedActions2[0]; var _useStyleOptions3 = useStyleOptions(), _useStyleOptions4 = _slicedToArray(_useStyleOptions3, 1), _useStyleOptions4$ = _useStyleOptions4[0], suggestedActionLayout = _useStyleOptions4$.suggestedActionLayout, suggestedActionsStackedLayoutButtonTextWrap = _useStyleOptions4$.suggestedActionsStackedLayoutButtonTextWrap; var localize = useLocalizer(); var focus = (0, _useFocus.default)(); var handleEscapeKey = (0, _react.useCallback)(function () { focus('sendBox'); }, [focus]); var label = localize('SUGGESTED_ACTIONS_LABEL_ALT'); var children = suggestedActions.map(function (cardAction, index) { var _ref5 = cardAction, displayText = _ref5.displayText, image = _ref5.image, imageAltText = _ref5.imageAltText, text = _ref5.text, type = _ref5.type, value = _ref5.value; return /*#__PURE__*/_react.default.createElement("div", { className: "webchat__suggested-actions__item-box", key: index }, /*#__PURE__*/_react.default.createElement(_SuggestedAction.default, { buttonText: (0, _computeSuggestedActionText.default)(cardAction), className: "webchat__suggested-actions__button", displayText: displayText, image: image // Image alt text should use `imageAltText` field and fallback to `text` field. // https://github.com/microsoft/botframework-sdk/blob/main/specs/botframework-activity/botframework-activity.md#image-alt-text , imageAlt: image && (imageAltText || text), itemIndex: index, text: text, textClassName: suggestedActionLayout === 'stacked' && suggestedActionsStackedLayoutButtonTextWrap ? 'webchat__suggested-actions__button-text-stacked-text-wrap' : 'webchat__suggested-actions__button-text', type: type, value: value })); }); // If there are no suggested actions, we will render nothing. if (!children.length) { return null; } if (suggestedActionLayout === 'flow') { return /*#__PURE__*/_react.default.createElement(_RovingTabIndexComposer.default, { onEscapeKey: handleEscapeKey }, /*#__PURE__*/_react.default.createElement(SuggestedActionFlowContainer, { className: className, label: label }, children)); } else if (suggestedActionLayout === 'stacked') { return /*#__PURE__*/_react.default.createElement(_RovingTabIndexComposer.default, { onEscapeKey: handleEscapeKey, orientation: "vertical" }, /*#__PURE__*/_react.default.createElement(SuggestedActionStackedContainer, { className: className, label: label }, children)); } return /*#__PURE__*/_react.default.createElement(_RovingTabIndexComposer.default, { onEscapeKey: handleEscapeKey }, /*#__PURE__*/_react.default.createElement(SuggestedActionCarouselContainer, { className: className, label: label }, children)); }; var _default = SuggestedActions; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcHJvcFR5cGVzIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfcmVhY3RGaWxtIiwiX2NvbXB1dGVTdWdnZXN0ZWRBY3Rpb25UZXh0IiwiX3VzZUZvY3VzV2l0aGluMyIsIl91c2VOb25jZTMiLCJfdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QiLCJfdXNlRm9jdXMiLCJfdXNlU3R5bGVTZXQ3IiwiX1JvdmluZ1RhYkluZGV4Q29tcG9zZXIiLCJfU3VnZ2VzdGVkQWN0aW9uIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJfc2xpY2VkVG9BcnJheSIsImFyciIsImkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVSZXN0IiwiVHlwZUVycm9yIiwibyIsIm1pbkxlbiIsIl9hcnJheUxpa2VUb0FycmF5IiwibiIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJBcnJheSIsImZyb20iLCJ0ZXN0IiwibGVuIiwibGVuZ3RoIiwiYXJyMiIsIl9pIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJfYXJyIiwiX24iLCJfZCIsIl9zIiwiX2UiLCJuZXh0IiwiZG9uZSIsInB1c2giLCJ2YWx1ZSIsImVyciIsImlzQXJyYXkiLCJ1c2VEaXJlY3Rpb24iLCJob29rcyIsInVzZUxvY2FsaXplciIsInVzZVN0eWxlT3B0aW9ucyIsInVzZVN1Z2dlc3RlZEFjdGlvbnMiLCJST09UX1NUWUxFIiwiZGlzcGxheSIsImZsZXhXcmFwIiwiZmxleERpcmVjdGlvbiIsIlN1Z2dlc3RlZEFjdGlvbkNhcm91c2VsQ29udGFpbmVyIiwiX3JlZiIsImNoaWxkcmVuIiwiY2xhc3NOYW1lIiwibGFiZWwiLCJfdXNlU3R5bGVPcHRpb25zIiwiX3VzZVN0eWxlT3B0aW9uczIiLCJfdXNlU3R5bGVPcHRpb25zMiQiLCJzdWdnZXN0ZWRBY3Rpb25zQ2Fyb3VzZWxGbGlwcGVyQm94V2lkdGgiLCJzdWdnZXN0ZWRBY3Rpb25zQ2Fyb3VzZWxGbGlwcGVyQ3Vyc29yIiwic3VnZ2VzdGVkQWN0aW9uc0Nhcm91c2VsRmxpcHBlclNpemUiLCJfdXNlU3R5bGVTZXQiLCJ1c2VTdHlsZVNldCIsIl91c2VTdHlsZVNldDIiLCJzdWdnZXN0ZWRBY3Rpb25zU3R5bGVTZXQiLCJzdWdnZXN0ZWRBY3Rpb25zIiwiX3VzZURpcmVjdGlvbiIsIl91c2VEaXJlY3Rpb24yIiwiZGlyZWN0aW9uIiwiX3VzZU5vbmNlIiwidXNlTm9uY2UiLCJfdXNlTm9uY2UyIiwibm9uY2UiLCJsb2NhbGl6ZSIsInJlZiIsInVzZVJlZiIsInJvb3RDbGFzc05hbWUiLCJ1c2VTdHlsZVRvRW1vdGlvbk9iamVjdCIsImZpbG1TdHlsZVNldCIsInVzZU1lbW8iLCJjcmVhdGVCYXNpY1N0eWxlU2V0Rm9yUmVhY3RGaWxtIiwiYXV0b0hpZGUiLCJjdXJzb3IiLCJmbGlwcGVyQm94V2lkdGgiLCJmbGlwcGVyU2l6ZSIsIm5leHRGbGlwcGVyQXJpYUxhYmVsIiwicHJldmlvdXNGbGlwcGVyQXJpYUxhYmVsIiwiX3VzZUZvY3VzV2l0aGluIiwidXNlRm9jdXNXaXRoaW4iLCJfdXNlRm9jdXNXaXRoaW4yIiwiZm9jdXNlZFdpdGhpbiIsImxlZnRGbGlwcGVyQXJpYUxhYmVsIiwicmlnaHRGbGlwcGVyQXJpYUxhYmVsIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZXMiLCJyb2xlIiwiUmVhY3QiLCJDaGlsZHJlbiIsImNvdW50IiwiYXV0b0NlbnRlciIsImRpciIsImZsaXBwZXJCbHVyRm9jdXNPbkNsaWNrIiwic2hvd0RvdHMiLCJzaG93U2Nyb2xsQmFyIiwic3R5bGVTZXQiLCJkZWZhdWx0UHJvcHMiLCJ1bmRlZmluZWQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJhbnkiLCJzdHJpbmciLCJpc1JlcXVpcmVkIiwiU3VnZ2VzdGVkQWN0aW9uRmxvd0NvbnRhaW5lciIsIl9yZWYyIiwiX3VzZVN0eWxlU2V0MyIsIl91c2VTdHlsZVNldDQiLCJtYXAiLCJjaGlsZCIsIlN1Z2dlc3RlZEFjdGlvblN0YWNrZWRDb250YWluZXIiLCJfcmVmMyIsIl91c2VTdHlsZVNldDUiLCJfdXNlU3R5bGVTZXQ2IiwiU3VnZ2VzdGVkQWN0aW9ucyIsIl9yZWY0IiwiX3VzZVN1Z2dlc3RlZEFjdGlvbnMiLCJfdXNlU3VnZ2VzdGVkQWN0aW9uczIiLCJfdXNlU3R5bGVPcHRpb25zMyIsIl91c2VTdHlsZU9wdGlvbnM0IiwiX3VzZVN0eWxlT3B0aW9uczQkIiwic3VnZ2VzdGVkQWN0aW9uTGF5b3V0Iiwic3VnZ2VzdGVkQWN0aW9uc1N0YWNrZWRMYXlvdXRCdXR0b25UZXh0V3JhcCIsImZvY3VzIiwidXNlRm9jdXMiLCJoYW5kbGVFc2NhcGVLZXkiLCJ1c2VDYWxsYmFjayIsImNhcmRBY3Rpb24iLCJpbmRleCIsIl9yZWY1IiwiZGlzcGxheVRleHQiLCJpbWFnZSIsImltYWdlQWx0VGV4dCIsInRleHQiLCJ0eXBlIiwiYnV0dG9uVGV4dCIsImNvbXB1dGVTdWdnZXN0ZWRBY3Rpb25UZXh0IiwiaW1hZ2VBbHQiLCJpdGVtSW5kZXgiLCJ0ZXh0Q2xhc3NOYW1lIiwib25Fc2NhcGVLZXkiLCJvcmllbnRhdGlvbiIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VSb290IjoiY29tcG9uZW50Oi8vLyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1NlbmRCb3gvU3VnZ2VzdGVkQWN0aW9ucy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IHJlYWN0L25vLWFycmF5LWluZGV4LWtleTogXCJvZmZcIiAqL1xuXG5pbXBvcnQgeyBob29rcyB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWFwaSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0Jztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdFxuaW1wb3J0IEJhc2ljRmlsbSwgeyBjcmVhdGVCYXNpY1N0eWxlU2V0IGFzIGNyZWF0ZUJhc2ljU3R5bGVTZXRGb3JSZWFjdEZpbG0gfSBmcm9tICdyZWFjdC1maWxtJztcblxuaW1wb3J0IGNvbXB1dGVTdWdnZXN0ZWRBY3Rpb25UZXh0IGZyb20gJy4uL1V0aWxzL2NvbXB1dGVTdWdnZXN0ZWRBY3Rpb25UZXh0JztcbmltcG9ydCB1c2VGb2N1c1dpdGhpbiBmcm9tICcuLi9ob29rcy9pbnRlcm5hbC91c2VGb2N1c1dpdGhpbic7XG5pbXBvcnQgdXNlTm9uY2UgZnJvbSAnLi4vaG9va3MvaW50ZXJuYWwvdXNlTm9uY2UnO1xuaW1wb3J0IHVzZVN0eWxlVG9FbW90aW9uT2JqZWN0IGZyb20gJy4uL2hvb2tzL2ludGVybmFsL3VzZVN0eWxlVG9FbW90aW9uT2JqZWN0JztcbmltcG9ydCB1c2VGb2N1cyBmcm9tICcuLi9ob29rcy91c2VGb2N1cyc7XG5pbXBvcnQgdXNlU3R5bGVTZXQgZnJvbSAnLi4vaG9va3MvdXNlU3R5bGVTZXQnO1xuaW1wb3J0IFJvdmluZ1RhYkluZGV4Q29tcG9zZXIgZnJvbSAnLi4vcHJvdmlkZXJzL1JvdmluZ1RhYkluZGV4L1JvdmluZ1RhYkluZGV4Q29tcG9zZXInO1xuaW1wb3J0IFN1Z2dlc3RlZEFjdGlvbiBmcm9tICcuL1N1Z2dlc3RlZEFjdGlvbic7XG5cbmNvbnN0IHsgdXNlRGlyZWN0aW9uLCB1c2VMb2NhbGl6ZXIsIHVzZVN0eWxlT3B0aW9ucywgdXNlU3VnZ2VzdGVkQWN0aW9ucyB9ID0gaG9va3M7XG5cbmNvbnN0IFJPT1RfU1RZTEUgPSB7XG4gICcmLndlYmNoYXRfX3N1Z2dlc3RlZC1hY3Rpb25zJzoge1xuICAgICcmLndlYmNoYXRfX3N1Z2dlc3RlZC1hY3Rpb25zLS1mbG93LWxheW91dCAud2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnNfX2Zsb3ctYm94Jzoge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgZmxleFdyYXA6ICd3cmFwJ1xuICAgIH0sXG5cbiAgICAnJi53ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9ucy0tc3RhY2stbGF5b3V0IC53ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9uc19fc3RhY2snOiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJ1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgU3VnZ2VzdGVkQWN0aW9uQ2Fyb3VzZWxDb250YWluZXIgPSAoeyBjaGlsZHJlbiwgY2xhc3NOYW1lLCBsYWJlbCB9KSA9PiB7XG4gIGNvbnN0IFtcbiAgICB7XG4gICAgICBzdWdnZXN0ZWRBY3Rpb25zQ2Fyb3VzZWxGbGlwcGVyQm94V2lkdGgsXG4gICAgICBzdWdnZXN0ZWRBY3Rpb25zQ2Fyb3VzZWxGbGlwcGVyQ3Vyc29yLFxuICAgICAgc3VnZ2VzdGVkQWN0aW9uc0Nhcm91c2VsRmxpcHBlclNpemVcbiAgICB9XG4gIF0gPSB1c2VTdHlsZU9wdGlvbnMoKTtcbiAgY29uc3QgW3sgc3VnZ2VzdGVkQWN0aW9uczogc3VnZ2VzdGVkQWN0aW9uc1N0eWxlU2V0IH1dID0gdXNlU3R5bGVTZXQoKTtcbiAgY29uc3QgW2RpcmVjdGlvbl0gPSB1c2VEaXJlY3Rpb24oKTtcbiAgY29uc3QgW25vbmNlXSA9IHVzZU5vbmNlKCk7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKCk7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZigpO1xuICBjb25zdCByb290Q2xhc3NOYW1lID0gdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QoKShST09UX1NUWUxFKSArICcnO1xuXG4gIGNvbnN0IGZpbG1TdHlsZVNldCA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGNyZWF0ZUJhc2ljU3R5bGVTZXRGb3JSZWFjdEZpbG0oe1xuICAgICAgICBhdXRvSGlkZTogZmFsc2UsXG4gICAgICAgIGN1cnNvcjogc3VnZ2VzdGVkQWN0aW9uc0Nhcm91c2VsRmxpcHBlckN1cnNvcixcbiAgICAgICAgZmxpcHBlckJveFdpZHRoOiBzdWdnZXN0ZWRBY3Rpb25zQ2Fyb3VzZWxGbGlwcGVyQm94V2lkdGgsXG4gICAgICAgIGZsaXBwZXJTaXplOiBzdWdnZXN0ZWRBY3Rpb25zQ2Fyb3VzZWxGbGlwcGVyU2l6ZVxuICAgICAgfSksXG4gICAgW1xuICAgICAgc3VnZ2VzdGVkQWN0aW9uc0Nhcm91c2VsRmxpcHBlckJveFdpZHRoLFxuICAgICAgc3VnZ2VzdGVkQWN0aW9uc0Nhcm91c2VsRmxpcHBlckN1cnNvcixcbiAgICAgIHN1Z2dlc3RlZEFjdGlvbnNDYXJvdXNlbEZsaXBwZXJTaXplXG4gICAgXVxuICApO1xuICBjb25zdCBuZXh0RmxpcHBlckFyaWFMYWJlbCA9IGxvY2FsaXplKCdTVUdHRVNURURfQUNUSU9OU19GTElQUEVSX05FWFRfQUxUJyk7XG4gIGNvbnN0IHByZXZpb3VzRmxpcHBlckFyaWFMYWJlbCA9IGxvY2FsaXplKCdTVUdHRVNURURfQUNUSU9OU19GTElQUEVSX1BSRVZJT1VTX0FMVCcpO1xuXG4gIGNvbnN0IFtmb2N1c2VkV2l0aGluXSA9IHVzZUZvY3VzV2l0aGluKHJlZik7XG4gIGNvbnN0IGxlZnRGbGlwcGVyQXJpYUxhYmVsID0gZGlyZWN0aW9uID09PSAncnRsJyA/IG5leHRGbGlwcGVyQXJpYUxhYmVsIDogcHJldmlvdXNGbGlwcGVyQXJpYUxhYmVsO1xuICBjb25zdCByaWdodEZsaXBwZXJBcmlhTGFiZWwgPSBkaXJlY3Rpb24gPT09ICdydGwnID8gcHJldmlvdXNGbGlwcGVyQXJpYUxhYmVsIDogbmV4dEZsaXBwZXJBcmlhTGFiZWw7XG5cbiAgcmV0dXJuIChcbiAgICAvLyBUT0RPOiBUaGUgY29udGVudCBvZiBzdWdnZXN0ZWQgYWN0aW9ucyBzaG91bGQgYmUgdGhlIGxhYmVsbGVkIGJ5IHRoZSBhY3Rpdml0eS5cbiAgICAvLyAgICAgICBUaGF0IG1lYW5zLCB3aGVuIHRoZSB1c2VyIGZvY3VzIGludG8gdGhlIHN1Z2dlc3RlZCBhY3Rpb25zLCBpdCBzaG91bGQgcmVhZCBzaW1pbGFyIHRvIFwiQm90IHNhaWQsIHdoYXQncyB5b3VyIHByZWZlcmVuY2Ugb2YgdG9kYXk/IFN1Z2dlc3RlZCBhY3Rpb25zIGhhcyBpdGVtczogYXBwbGUgYnV0dG9uLCBvcmFuZ2UgYnV0dG9uLCBiYW5hbmEgYnV0dG9uLlwiXG4gICAgPGRpdlxuICAgICAgYXJpYS1sYWJlbD17bGFiZWx9XG4gICAgICBhcmlhLW9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXG4gICAgICAgICd3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9ucycsXG4gICAgICAgICd3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9ucy0tY2Fyb3VzZWwtbGF5b3V0JyxcbiAgICAgICAge1xuICAgICAgICAgICd3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9ucy0tZm9jdXMtd2l0aGluJzogZm9jdXNlZFdpdGhpbixcbiAgICAgICAgICAnd2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnMtLXJ0bCc6IGRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICAgICAgfSxcbiAgICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgICAgc3VnZ2VzdGVkQWN0aW9uc1N0eWxlU2V0ICsgJycsXG4gICAgICAgIChjbGFzc05hbWUgfHwgJycpICsgJydcbiAgICAgICl9XG4gICAgICByZWY9e3JlZn1cbiAgICAgIHJvbGU9XCJ0b29sYmFyXCJcbiAgICA+XG4gICAgICB7ISFjaGlsZHJlbiAmJiAhIVJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSAmJiAoXG4gICAgICAgIDxCYXNpY0ZpbG1cbiAgICAgICAgICBhdXRvQ2VudGVyPXtmYWxzZX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJ3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9uc19fY2Fyb3VzZWxcIlxuICAgICAgICAgIGRpcj17ZGlyZWN0aW9ufVxuICAgICAgICAgIGZsaXBwZXJCbHVyRm9jdXNPbkNsaWNrPXt0cnVlfVxuICAgICAgICAgIGxlZnRGbGlwcGVyQXJpYUxhYmVsPXtsZWZ0RmxpcHBlckFyaWFMYWJlbH1cbiAgICAgICAgICBub25jZT17bm9uY2V9XG4gICAgICAgICAgcmlnaHRGbGlwcGVyQXJpYUxhYmVsPXtyaWdodEZsaXBwZXJBcmlhTGFiZWx9XG4gICAgICAgICAgc2hvd0RvdHM9e2ZhbHNlfVxuICAgICAgICAgIHNob3dTY3JvbGxCYXI9e2ZhbHNlfVxuICAgICAgICAgIHN0eWxlU2V0PXtmaWxtU3R5bGVTZXR9XG4gICAgICAgID5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvQmFzaWNGaWxtPlxuICAgICAgKX1cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnNfX2ZvY3VzLWluZGljYXRvclwiIC8+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5TdWdnZXN0ZWRBY3Rpb25DYXJvdXNlbENvbnRhaW5lci5kZWZhdWx0UHJvcHMgPSB7XG4gIGNoaWxkcmVuOiB1bmRlZmluZWQsXG4gIGNsYXNzTmFtZTogdW5kZWZpbmVkXG59O1xuXG5TdWdnZXN0ZWRBY3Rpb25DYXJvdXNlbENvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMuYW55LFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcbn07XG5cbmNvbnN0IFN1Z2dlc3RlZEFjdGlvbkZsb3dDb250YWluZXIgPSAoeyBjaGlsZHJlbiwgY2xhc3NOYW1lLCBsYWJlbCB9KSA9PiB7XG4gIGNvbnN0IFt7IHN1Z2dlc3RlZEFjdGlvbnM6IHN1Z2dlc3RlZEFjdGlvbnNTdHlsZVNldCB9XSA9IHVzZVN0eWxlU2V0KCk7XG4gIGNvbnN0IHJvb3RDbGFzc05hbWUgPSB1c2VTdHlsZVRvRW1vdGlvbk9iamVjdCgpKFJPT1RfU1RZTEUpICsgJyc7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBhcmlhLWxhYmVsPXtsYWJlbH1cbiAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICBhcmlhLW9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXG4gICAgICAgICd3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9ucycsXG4gICAgICAgICd3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9ucy0tZmxvdy1sYXlvdXQnLFxuICAgICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgICBzdWdnZXN0ZWRBY3Rpb25zU3R5bGVTZXQgKyAnJyxcbiAgICAgICAgKGNsYXNzTmFtZSB8fCAnJykgKyAnJ1xuICAgICAgKX1cbiAgICAgIHJvbGU9XCJ0b29sYmFyXCJcbiAgICA+XG4gICAgICB7ISFjaGlsZHJlbiAmJiAhIVJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnNfX2Zsb3ctYm94XCI+XG4gICAgICAgICAge1JlYWN0LkNoaWxkcmVuLm1hcChjaGlsZHJlbiwgY2hpbGQgPT4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9uc19fZmxvdy1pdGVtLWJveFwiPntjaGlsZH08L2Rpdj5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9uc19fZm9jdXMtaW5kaWNhdG9yXCIgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cblN1Z2dlc3RlZEFjdGlvbkZsb3dDb250YWluZXIuZGVmYXVsdFByb3BzID0ge1xuICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICBjbGFzc05hbWU6IHVuZGVmaW5lZFxufTtcblxuU3VnZ2VzdGVkQWN0aW9uRmxvd0NvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMuYW55LFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcbn07XG5cbmNvbnN0IFN1Z2dlc3RlZEFjdGlvblN0YWNrZWRDb250YWluZXIgPSAoeyBjaGlsZHJlbiwgY2xhc3NOYW1lLCBsYWJlbCB9KSA9PiB7XG4gIGNvbnN0IFt7IHN1Z2dlc3RlZEFjdGlvbnM6IHN1Z2dlc3RlZEFjdGlvbnNTdHlsZVNldCB9XSA9IHVzZVN0eWxlU2V0KCk7XG4gIGNvbnN0IHJvb3RDbGFzc05hbWUgPSB1c2VTdHlsZVRvRW1vdGlvbk9iamVjdCgpKFJPT1RfU1RZTEUpICsgJyc7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBhcmlhLWxhYmVsPXtsYWJlbH1cbiAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICBhcmlhLW9yaWVudGF0aW9uPVwidmVydGljYWxcIlxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAnd2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnMnLFxuICAgICAgICAnd2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnMtLXN0YWNrZWQtbGF5b3V0JyxcbiAgICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgICAgc3VnZ2VzdGVkQWN0aW9uc1N0eWxlU2V0ICsgJycsXG4gICAgICAgIChjbGFzc05hbWUgfHwgJycpICsgJydcbiAgICAgICl9XG4gICAgICByb2xlPVwidG9vbGJhclwiXG4gICAgPlxuICAgICAgeyEhY2hpbGRyZW4gJiYgISFSZWFjdC5DaGlsZHJlbi5jb3VudChjaGlsZHJlbikgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX3N1Z2dlc3RlZC1hY3Rpb25zX19zdGFja1wiPntjaGlsZHJlbn08L2Rpdj5cbiAgICAgICl9XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX3N1Z2dlc3RlZC1hY3Rpb25zX19mb2N1cy1pbmRpY2F0b3JcIiAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuU3VnZ2VzdGVkQWN0aW9uU3RhY2tlZENvbnRhaW5lci5kZWZhdWx0UHJvcHMgPSB7XG4gIGNoaWxkcmVuOiB1bmRlZmluZWQsXG4gIGNsYXNzTmFtZTogdW5kZWZpbmVkXG59O1xuXG5TdWdnZXN0ZWRBY3Rpb25TdGFja2VkQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5hbnksXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufTtcblxudHlwZSBTdWdnZXN0ZWRBY3Rpb25zUHJvcHMgPSBSZWFkb25seTx7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbn0+O1xuXG5jb25zdCBTdWdnZXN0ZWRBY3Rpb25zID0gKHsgY2xhc3NOYW1lIH06IFN1Z2dlc3RlZEFjdGlvbnNQcm9wcykgPT4ge1xuICBjb25zdCBbc3VnZ2VzdGVkQWN0aW9uc10gPSB1c2VTdWdnZXN0ZWRBY3Rpb25zKCk7XG4gIGNvbnN0IFt7IHN1Z2dlc3RlZEFjdGlvbkxheW91dCwgc3VnZ2VzdGVkQWN0aW9uc1N0YWNrZWRMYXlvdXRCdXR0b25UZXh0V3JhcCB9XSA9IHVzZVN0eWxlT3B0aW9ucygpO1xuICBjb25zdCBsb2NhbGl6ZSA9IHVzZUxvY2FsaXplcigpO1xuICBjb25zdCBmb2N1cyA9IHVzZUZvY3VzKCk7XG5cbiAgY29uc3QgaGFuZGxlRXNjYXBlS2V5ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGZvY3VzKCdzZW5kQm94Jyk7XG4gIH0sIFtmb2N1c10pO1xuXG4gIGNvbnN0IGxhYmVsID0gbG9jYWxpemUoJ1NVR0dFU1RFRF9BQ1RJT05TX0xBQkVMX0FMVCcpO1xuXG4gIGNvbnN0IGNoaWxkcmVuID0gc3VnZ2VzdGVkQWN0aW9ucy5tYXAoKGNhcmRBY3Rpb24sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgeyBkaXNwbGF5VGV4dCwgaW1hZ2UsIGltYWdlQWx0VGV4dCwgdGV4dCwgdHlwZSwgdmFsdWUgfSA9IGNhcmRBY3Rpb24gYXMge1xuICAgICAgZGlzcGxheVRleHQ/OiBzdHJpbmc7XG4gICAgICBpbWFnZT86IHN0cmluZztcbiAgICAgIGltYWdlQWx0VGV4dD86IHN0cmluZztcbiAgICAgIHRleHQ/OiBzdHJpbmc7XG4gICAgICB0eXBlOlxuICAgICAgICB8ICdjYWxsJ1xuICAgICAgICB8ICdkb3dubG9hZEZpbGUnXG4gICAgICAgIHwgJ2ltQmFjaydcbiAgICAgICAgfCAnbWVzc2FnZUJhY2snXG4gICAgICAgIHwgJ29wZW5VcmwnXG4gICAgICAgIHwgJ3BsYXlBdWRpbydcbiAgICAgICAgfCAncGxheVZpZGVvJ1xuICAgICAgICB8ICdwb3N0QmFjaydcbiAgICAgICAgfCAnc2hvd0ltYWdlJ1xuICAgICAgICB8ICdzaWduaW4nO1xuICAgICAgdmFsdWU/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgc3RyaW5nO1xuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9uc19faXRlbS1ib3hcIiBrZXk9e2luZGV4fT5cbiAgICAgICAgPFN1Z2dlc3RlZEFjdGlvblxuICAgICAgICAgIGJ1dHRvblRleHQ9e2NvbXB1dGVTdWdnZXN0ZWRBY3Rpb25UZXh0KGNhcmRBY3Rpb24pfVxuICAgICAgICAgIGNsYXNzTmFtZT1cIndlYmNoYXRfX3N1Z2dlc3RlZC1hY3Rpb25zX19idXR0b25cIlxuICAgICAgICAgIGRpc3BsYXlUZXh0PXtkaXNwbGF5VGV4dH1cbiAgICAgICAgICBpbWFnZT17aW1hZ2V9XG4gICAgICAgICAgLy8gSW1hZ2UgYWx0IHRleHQgc2hvdWxkIHVzZSBgaW1hZ2VBbHRUZXh0YCBmaWVsZCBhbmQgZmFsbGJhY2sgdG8gYHRleHRgIGZpZWxkLlxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvYm90ZnJhbWV3b3JrLXNkay9ibG9iL21haW4vc3BlY3MvYm90ZnJhbWV3b3JrLWFjdGl2aXR5L2JvdGZyYW1ld29yay1hY3Rpdml0eS5tZCNpbWFnZS1hbHQtdGV4dFxuICAgICAgICAgIGltYWdlQWx0PXtpbWFnZSAmJiAoaW1hZ2VBbHRUZXh0IHx8IHRleHQpfVxuICAgICAgICAgIGl0ZW1JbmRleD17aW5kZXh9XG4gICAgICAgICAgdGV4dD17dGV4dH1cbiAgICAgICAgICB0ZXh0Q2xhc3NOYW1lPXtcbiAgICAgICAgICAgIHN1Z2dlc3RlZEFjdGlvbkxheW91dCA9PT0gJ3N0YWNrZWQnICYmIHN1Z2dlc3RlZEFjdGlvbnNTdGFja2VkTGF5b3V0QnV0dG9uVGV4dFdyYXBcbiAgICAgICAgICAgICAgPyAnd2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnNfX2J1dHRvbi10ZXh0LXN0YWNrZWQtdGV4dC13cmFwJ1xuICAgICAgICAgICAgICA6ICd3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9uc19fYnV0dG9uLXRleHQnXG4gICAgICAgICAgfVxuICAgICAgICAgIHR5cGU9e3R5cGV9XG4gICAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gSWYgdGhlcmUgYXJlIG5vIHN1Z2dlc3RlZCBhY3Rpb25zLCB3ZSB3aWxsIHJlbmRlciBub3RoaW5nLlxuICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHN1Z2dlc3RlZEFjdGlvbkxheW91dCA9PT0gJ2Zsb3cnKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxSb3ZpbmdUYWJJbmRleENvbXBvc2VyIG9uRXNjYXBlS2V5PXtoYW5kbGVFc2NhcGVLZXl9PlxuICAgICAgICA8U3VnZ2VzdGVkQWN0aW9uRmxvd0NvbnRhaW5lciBjbGFzc05hbWU9e2NsYXNzTmFtZX0gbGFiZWw9e2xhYmVsfT5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvU3VnZ2VzdGVkQWN0aW9uRmxvd0NvbnRhaW5lcj5cbiAgICAgIDwvUm92aW5nVGFiSW5kZXhDb21wb3Nlcj5cbiAgICApO1xuICB9IGVsc2UgaWYgKHN1Z2dlc3RlZEFjdGlvbkxheW91dCA9PT0gJ3N0YWNrZWQnKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxSb3ZpbmdUYWJJbmRleENvbXBvc2VyIG9uRXNjYXBlS2V5PXtoYW5kbGVFc2NhcGVLZXl9IG9yaWVudGF0aW9uPVwidmVydGljYWxcIj5cbiAgICAgICAgPFN1Z2dlc3RlZEFjdGlvblN0YWNrZWRDb250YWluZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9IGxhYmVsPXtsYWJlbH0+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L1N1Z2dlc3RlZEFjdGlvblN0YWNrZWRDb250YWluZXI+XG4gICAgICA8L1JvdmluZ1RhYkluZGV4Q29tcG9zZXI+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFJvdmluZ1RhYkluZGV4Q29tcG9zZXIgb25Fc2NhcGVLZXk9e2hhbmRsZUVzY2FwZUtleX0+XG4gICAgICA8U3VnZ2VzdGVkQWN0aW9uQ2Fyb3VzZWxDb250YWluZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9IGxhYmVsPXtsYWJlbH0+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvU3VnZ2VzdGVkQWN0aW9uQ2Fyb3VzZWxDb250YWluZXI+XG4gICAgPC9Sb3ZpbmdUYWJJbmRleENvbXBvc2VyPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU3VnZ2VzdGVkQWN0aW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBLElBQUFBLHVCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxVQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFDLHVCQUFBLENBQUFMLE9BQUE7QUFFQSxJQUFBTSxVQUFBLEdBQUFELHVCQUFBLENBQUFMLE9BQUE7QUFFQSxJQUFBTywyQkFBQSxHQUFBTCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVEsZ0JBQUEsR0FBQU4sc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFTLFVBQUEsR0FBQVAsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFVLHdCQUFBLEdBQUFSLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBVyxTQUFBLEdBQUFULHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBWSxhQUFBLEdBQUFWLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBYSx1QkFBQSxHQUFBWCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWMsZ0JBQUEsR0FBQVosc0JBQUEsQ0FBQUYsT0FBQTtBQUFnRCxTQUFBZSx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLFdBQUEsV0FBQUEsV0FBQSxHQUFBRyxnQkFBQSxHQUFBRCxpQkFBQSxLQUFBRixXQUFBO0FBQUEsU0FBQVgsd0JBQUFlLEdBQUEsRUFB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