botframework-webchat-component
Version:
React component of botframework-webchat
138 lines (129 loc) • 27.8 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 _botframeworkWebchatCore = require("botframework-webchat-core");
var _markdownIt = _interopRequireDefault(require("markdown-it"));
var _react = _interopRequireWildcard(require("react"));
var _betterLinks = _interopRequireDefault(require("./betterLinks"));
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 _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread 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 _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
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 ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /* eslint react/no-danger: "off" */
var allowedSchemes = ['data', 'http', 'https', 'ftp', 'mailto', 'sip', 'tel'];
var linkDefinitions = [];
var externalLinkAlt = '';
var defaultDecorateLink = function defaultDecorateLink(href, textContent, linkOptions) {
var _decoration$title;
var decoration = _objectSpread({
rel: 'noopener noreferrer',
target: '_blank',
wrapZeroWidthSpace: true
}, linkOptions);
var ariaLabelSegments = [textContent];
var classes = new Set();
var linkDefinition = linkDefinitions.find(function (_ref) {
var url = _ref.url;
return url === href;
});
var protocol = (0, _botframeworkWebchatCore.onErrorResumeNext)(function () {
return new URL(href).protocol;
});
if (linkDefinition) {
ariaLabelSegments.push(linkDefinition.title || (0, _botframeworkWebchatCore.onErrorResumeNext)(function () {
return new URL(linkDefinition.url).host;
}) || linkDefinition.url);
// linkDefinition.identifier is uppercase, while linkDefinition.label is as-is.
linkDefinition.label === textContent && classes.add('webchat__render-markdown__pure-identifier');
}
// For links that would be sanitized out, let's turn them into a button so we could handle them later.
if (!allowedSchemes.map(function (scheme) {
return "".concat(scheme, ":");
}).includes(protocol)) {
var _decoration$asButton;
(_decoration$asButton = decoration.asButton) !== null && _decoration$asButton !== void 0 ? _decoration$asButton : decoration.asButton = true;
classes.add('webchat__render-markdown__citation');
} else if (protocol === 'http:' || protocol === 'https:') {
decoration.iconClassName = [decoration.iconClassName, 'webchat__render-markdown__external-link-icon'].filter(function (className) {
return className;
}).join(' ');
ariaLabelSegments.push(externalLinkAlt);
}
// The first segment is textContent. Putting textContent is aria-label is useless.
if (ariaLabelSegments.length > 1) {
var _decoration$ariaLabel;
// If "aria-label" is already applied, do not overwrite it.
(_decoration$ariaLabel = decoration.ariaLabel) !== null && _decoration$ariaLabel !== void 0 ? _decoration$ariaLabel : decoration.ariaLabel = function (value) {
return value || ariaLabelSegments.join(' ');
};
}
if (typeof (linkOptions === null || linkOptions === void 0 ? void 0 : linkOptions.className) === 'string') {
classes.add(linkOptions.className);
}
// Resolve className
var classNamesString = Array.from(classes).join(' ');
if (linkOptions !== null && linkOptions !== void 0 && linkOptions.className && (linkOptions === null || linkOptions === void 0 ? void 0 : linkOptions.className) instanceof Function) {
decoration.className = linkOptions.className(classNamesString);
} else {
decoration.className = classNamesString;
}
// By default, Markdown-It will set "title" to the link title in link definition.
// However, "title" may be narrated by screen reader:
// - Edge
// - <a> will narrate "aria-label" but not "title"
// - <button> will narrate both "aria-label" and "title"
// - NVDA
// - <a> will narrate both "aria-label" and "title"
// - <button> will narrate both "aria-label" and "title"
// Title makes it very difficult to control narrations by the screen reader. Thus, we are disabling it in favor of "aria-label".
// This will not affect our accessibility compliance but UX. We could use a non-native tooltip or other forms of visual hint.
(_decoration$title = decoration.title) !== null && _decoration$title !== void 0 ? _decoration$title : decoration.title = false;
return decoration;
};
var useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer;
var markdownIt = new _markdownIt.default().use(_betterLinks.default);
function isPlural(props) {
return typeof props.stringIds !== 'string';
}
var LocalizedString = function LocalizedString(props) {
var className = props.className,
linkClassName = props.linkClassName,
_props$onDecorateLink = props.onDecorateLink,
onDecorateLink = _props$onDecorateLink === void 0 ? defaultDecorateLink : _props$onDecorateLink,
stringIds = props.stringIds,
values = props.values;
var localize = useLocalizer(isPlural(props) && {
plural: true
});
var env = (0, _react.useMemo)(function () {
return {
linkOptions: {
className: linkClassName
},
decorateLink: onDecorateLink
};
}, [linkClassName, onDecorateLink]);
var html = (0, _react.useMemo)(function () {
return {
__html: markdownIt.renderer.render(markdownIt.parseInline(localize.apply(void 0, [stringIds].concat(_toConsumableArray(values !== null && values !== void 0 ? values : []))), env), env)
};
}, [env, localize, stringIds, values]);
return /*#__PURE__*/_react.default.createElement("span", {
className: className,
dangerouslySetInnerHTML: html
});
};
var _default = /*#__PURE__*/(0, _react.memo)(LocalizedString);
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfYm90ZnJhbWV3b3JrV2ViY2hhdENvcmUiLCJfbWFya2Rvd25JdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9iZXR0ZXJMaW5rcyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiYXJyIiwiX2FycmF5V2l0aG91dEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIlR5cGVFcnJvciIsIm8iLCJtaW5MZW4iLCJfYXJyYXlMaWtlVG9BcnJheSIsIm4iLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiQXJyYXkiLCJmcm9tIiwidGVzdCIsIml0ZXIiLCJTeW1ib2wiLCJpdGVyYXRvciIsImlzQXJyYXkiLCJsZW4iLCJsZW5ndGgiLCJpIiwiYXJyMiIsIm93bktleXMiLCJvYmplY3QiLCJlbnVtZXJhYmxlT25seSIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzeW1ib2xzIiwiZmlsdGVyIiwic3ltIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJ0YXJnZXQiLCJhcmd1bWVudHMiLCJzb3VyY2UiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJ2YWx1ZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiYWxsb3dlZFNjaGVtZXMiLCJsaW5rRGVmaW5pdGlvbnMiLCJleHRlcm5hbExpbmtBbHQiLCJkZWZhdWx0RGVjb3JhdGVMaW5rIiwiaHJlZiIsInRleHRDb250ZW50IiwibGlua09wdGlvbnMiLCJfZGVjb3JhdGlvbiR0aXRsZSIsImRlY29yYXRpb24iLCJyZWwiLCJ3cmFwWmVyb1dpZHRoU3BhY2UiLCJhcmlhTGFiZWxTZWdtZW50cyIsImNsYXNzZXMiLCJTZXQiLCJsaW5rRGVmaW5pdGlvbiIsImZpbmQiLCJfcmVmIiwidXJsIiwicHJvdG9jb2wiLCJvbkVycm9yUmVzdW1lTmV4dCIsIlVSTCIsInRpdGxlIiwiaG9zdCIsImxhYmVsIiwiYWRkIiwibWFwIiwic2NoZW1lIiwiY29uY2F0IiwiaW5jbHVkZXMiLCJfZGVjb3JhdGlvbiRhc0J1dHRvbiIsImFzQnV0dG9uIiwiaWNvbkNsYXNzTmFtZSIsImNsYXNzTmFtZSIsImpvaW4iLCJfZGVjb3JhdGlvbiRhcmlhTGFiZWwiLCJhcmlhTGFiZWwiLCJjbGFzc05hbWVzU3RyaW5nIiwiRnVuY3Rpb24iLCJ1c2VMb2NhbGl6ZXIiLCJob29rcyIsIm1hcmtkb3duSXQiLCJNYXJrZG93bkl0IiwidXNlIiwiYmV0dGVyTGlua3MiLCJpc1BsdXJhbCIsInByb3BzIiwic3RyaW5nSWRzIiwiTG9jYWxpemVkU3RyaW5nIiwibGlua0NsYXNzTmFtZSIsIl9wcm9wcyRvbkRlY29yYXRlTGluayIsIm9uRGVjb3JhdGVMaW5rIiwidmFsdWVzIiwibG9jYWxpemUiLCJwbHVyYWwiLCJlbnYiLCJ1c2VNZW1vIiwiZGVjb3JhdGVMaW5rIiwiaHRtbCIsIl9faHRtbCIsInJlbmRlcmVyIiwicmVuZGVyIiwicGFyc2VJbmxpbmUiLCJjcmVhdGVFbGVtZW50IiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJfZGVmYXVsdCIsIm1lbW8iLCJleHBvcnRzIl0sInNvdXJjZVJvb3QiOiJjb21wb25lbnQ6Ly8vIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVXRpbHMvTG9jYWxpemVkU3RyaW5nLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgcmVhY3Qvbm8tZGFuZ2VyOiBcIm9mZlwiICovXG5cbmltcG9ydCB7IGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtYXBpJztcbmltcG9ydCB7IG9uRXJyb3JSZXN1bWVOZXh0IH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtY29yZSc7XG5pbXBvcnQgTWFya2Rvd25JdCBmcm9tICdtYXJrZG93bi1pdCc7XG5pbXBvcnQgUmVhY3QsIHsgbWVtbywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBiZXR0ZXJMaW5rcywgeyB0eXBlIEJldHRlckxpbmtFbnYsIHR5cGUgTGlua09wdGlvbnMgfSBmcm9tICcuL2JldHRlckxpbmtzJztcblxuY29uc3QgYWxsb3dlZFNjaGVtZXMgPSBbJ2RhdGEnLCAnaHR0cCcsICdodHRwcycsICdmdHAnLCAnbWFpbHRvJywgJ3NpcCcsICd0ZWwnXTtcblxuY29uc3QgbGlua0RlZmluaXRpb25zID0gW107XG5cbmNvbnN0IGV4dGVybmFsTGlua0FsdCA9ICcnO1xuXG5jb25zdCBkZWZhdWx0RGVjb3JhdGVMaW5rID0gKGhyZWY6IHN0cmluZywgdGV4dENvbnRlbnQ6IHN0cmluZywgbGlua09wdGlvbnM/OiBMaW5rT3B0aW9ucyk6IExpbmtPcHRpb25zIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZGVjb3JhdGlvbjogTGlua09wdGlvbnMgPSB7XG4gICAgcmVsOiAnbm9vcGVuZXIgbm9yZWZlcnJlcicsXG4gICAgdGFyZ2V0OiAnX2JsYW5rJyxcbiAgICB3cmFwWmVyb1dpZHRoU3BhY2U6IHRydWUsXG4gICAgLi4ubGlua09wdGlvbnNcbiAgfTtcblxuICBjb25zdCBhcmlhTGFiZWxTZWdtZW50czogc3RyaW5nW10gPSBbdGV4dENvbnRlbnRdO1xuICBjb25zdCBjbGFzc2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgY29uc3QgbGlua0RlZmluaXRpb24gPSBsaW5rRGVmaW5pdGlvbnMuZmluZCgoeyB1cmwgfSkgPT4gdXJsID09PSBocmVmKTtcbiAgY29uc3QgcHJvdG9jb2wgPSBvbkVycm9yUmVzdW1lTmV4dCgoKSA9PiBuZXcgVVJMKGhyZWYpLnByb3RvY29sKTtcblxuICBpZiAobGlua0RlZmluaXRpb24pIHtcbiAgICBhcmlhTGFiZWxTZWdtZW50cy5wdXNoKFxuICAgICAgbGlua0RlZmluaXRpb24udGl0bGUgfHwgb25FcnJvclJlc3VtZU5leHQoKCkgPT4gbmV3IFVSTChsaW5rRGVmaW5pdGlvbi51cmwpLmhvc3QpIHx8IGxpbmtEZWZpbml0aW9uLnVybFxuICAgICk7XG5cbiAgICAvLyBsaW5rRGVmaW5pdGlvbi5pZGVudGlmaWVyIGlzIHVwcGVyY2FzZSwgd2hpbGUgbGlua0RlZmluaXRpb24ubGFiZWwgaXMgYXMtaXMuXG4gICAgbGlua0RlZmluaXRpb24ubGFiZWwgPT09IHRleHRDb250ZW50ICYmIGNsYXNzZXMuYWRkKCd3ZWJjaGF0X19yZW5kZXItbWFya2Rvd25fX3B1cmUtaWRlbnRpZmllcicpO1xuICB9XG5cbiAgLy8gRm9yIGxpbmtzIHRoYXQgd291bGQgYmUgc2FuaXRpemVkIG91dCwgbGV0J3MgdHVybiB0aGVtIGludG8gYSBidXR0b24gc28gd2UgY291bGQgaGFuZGxlIHRoZW0gbGF0ZXIuXG4gIGlmICghYWxsb3dlZFNjaGVtZXMubWFwKHNjaGVtZSA9PiBgJHtzY2hlbWV9OmApLmluY2x1ZGVzKHByb3RvY29sKSkge1xuICAgIGRlY29yYXRpb24uYXNCdXR0b24gPz89IHRydWU7XG5cbiAgICBjbGFzc2VzLmFkZCgnd2ViY2hhdF9fcmVuZGVyLW1hcmtkb3duX19jaXRhdGlvbicpO1xuICB9IGVsc2UgaWYgKHByb3RvY29sID09PSAnaHR0cDonIHx8IHByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgIGRlY29yYXRpb24uaWNvbkNsYXNzTmFtZSA9IFtkZWNvcmF0aW9uLmljb25DbGFzc05hbWUsICd3ZWJjaGF0X19yZW5kZXItbWFya2Rvd25fX2V4dGVybmFsLWxpbmstaWNvbiddXG4gICAgICAuZmlsdGVyKChjbGFzc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gY2xhc3NOYW1lKVxuICAgICAgLmpvaW4oJyAnKTtcblxuICAgIGFyaWFMYWJlbFNlZ21lbnRzLnB1c2goZXh0ZXJuYWxMaW5rQWx0KTtcbiAgfVxuXG4gIC8vIFRoZSBmaXJzdCBzZWdtZW50IGlzIHRleHRDb250ZW50LiBQdXR0aW5nIHRleHRDb250ZW50IGlzIGFyaWEtbGFiZWwgaXMgdXNlbGVzcy5cbiAgaWYgKGFyaWFMYWJlbFNlZ21lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBJZiBcImFyaWEtbGFiZWxcIiBpcyBhbHJlYWR5IGFwcGxpZWQsIGRvIG5vdCBvdmVyd3JpdGUgaXQuXG4gICAgZGVjb3JhdGlvbi5hcmlhTGFiZWwgPz89ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZSB8fCBhcmlhTGFiZWxTZWdtZW50cy5qb2luKCcgJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGxpbmtPcHRpb25zPy5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY2xhc3Nlcy5hZGQobGlua09wdGlvbnMuY2xhc3NOYW1lKTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgY2xhc3NOYW1lXG4gIGNvbnN0IGNsYXNzTmFtZXNTdHJpbmcgPSBBcnJheS5mcm9tKGNsYXNzZXMpLmpvaW4oJyAnKTtcbiAgaWYgKGxpbmtPcHRpb25zPy5jbGFzc05hbWUgJiYgbGlua09wdGlvbnM/LmNsYXNzTmFtZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgZGVjb3JhdGlvbi5jbGFzc05hbWUgPSBsaW5rT3B0aW9ucy5jbGFzc05hbWUoY2xhc3NOYW1lc1N0cmluZyk7XG4gIH0gZWxzZSB7XG4gICAgZGVjb3JhdGlvbi5jbGFzc05hbWUgPSBjbGFzc05hbWVzU3RyaW5nO1xuICB9XG5cbiAgLy8gQnkgZGVmYXVsdCwgTWFya2Rvd24tSXQgd2lsbCBzZXQgXCJ0aXRsZVwiIHRvIHRoZSBsaW5rIHRpdGxlIGluIGxpbmsgZGVmaW5pdGlvbi5cblxuICAvLyBIb3dldmVyLCBcInRpdGxlXCIgbWF5IGJlIG5hcnJhdGVkIGJ5IHNjcmVlbiByZWFkZXI6XG4gIC8vIC0gRWRnZVxuICAvLyAgIC0gPGE+IHdpbGwgbmFycmF0ZSBcImFyaWEtbGFiZWxcIiBidXQgbm90IFwidGl0bGVcIlxuICAvLyAgIC0gPGJ1dHRvbj4gd2lsbCBuYXJyYXRlIGJvdGggXCJhcmlhLWxhYmVsXCIgYW5kIFwidGl0bGVcIlxuICAvLyAtIE5WREFcbiAgLy8gICAtIDxhPiB3aWxsIG5hcnJhdGUgYm90aCBcImFyaWEtbGFiZWxcIiBhbmQgXCJ0aXRsZVwiXG4gIC8vICAgLSA8YnV0dG9uPiB3aWxsIG5hcnJhdGUgYm90aCBcImFyaWEtbGFiZWxcIiBhbmQgXCJ0aXRsZVwiXG5cbiAgLy8gVGl0bGUgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHQgdG8gY29udHJvbCBuYXJyYXRpb25zIGJ5IHRoZSBzY3JlZW4gcmVhZGVyLiBUaHVzLCB3ZSBhcmUgZGlzYWJsaW5nIGl0IGluIGZhdm9yIG9mIFwiYXJpYS1sYWJlbFwiLlxuICAvLyBUaGlzIHdpbGwgbm90IGFmZmVjdCBvdXIgYWNjZXNzaWJpbGl0eSBjb21wbGlhbmNlIGJ1dCBVWC4gV2UgY291bGQgdXNlIGEgbm9uLW5hdGl2ZSB0b29sdGlwIG9yIG90aGVyIGZvcm1zIG9mIHZpc3VhbCBoaW50LlxuXG4gIGRlY29yYXRpb24udGl0bGUgPz89IGZhbHNlO1xuXG4gIHJldHVybiBkZWNvcmF0aW9uO1xufTtcblxuY29uc3QgeyB1c2VMb2NhbGl6ZXIgfSA9IGhvb2tzO1xuXG50eXBlIFBsdXJhbCA9IHtcbiAgemVybz86IHN0cmluZztcbiAgb25lPzogc3RyaW5nO1xuICB0d28/OiBzdHJpbmc7XG4gIGZldz86IHN0cmluZztcbiAgbWFueT86IHN0cmluZztcbiAgb3RoZXI6IHN0cmluZztcbn07XG5cbmNvbnN0IG1hcmtkb3duSXQgPSBuZXcgTWFya2Rvd25JdCgpLnVzZShiZXR0ZXJMaW5rcyk7XG5cbnR5cGUgUGx1cmFsUHJvcHMgPSBSZWFkb25seTx7XG4gIHN0cmluZ0lkczogUGx1cmFsO1xuICB2YWx1ZXM6IHJlYWRvbmx5IFtudW1iZXIsIC4uLihudW1iZXIgfCBzdHJpbmcpW11dIHwgdW5kZWZpbmVkO1xufT47XG5cbnR5cGUgU2luZ3VsYXJQcm9wcyA9IFJlYWRvbmx5PHtcbiAgc3RyaW5nSWRzOiBzdHJpbmc7XG4gIHZhbHVlcz86IHJlYWRvbmx5IChudW1iZXIgfCBzdHJpbmcpW10gfCB1bmRlZmluZWQ7XG59PjtcblxudHlwZSBQcm9wcyA9IFJlYWRvbmx5PHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsaW5rQ2xhc3NOYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBvbkRlY29yYXRlTGluaz86ICgoaHJlZjogc3RyaW5nLCB0ZXh0Q29udGVudDogc3RyaW5nKSA9PiBMaW5rT3B0aW9ucyB8IHVuZGVmaW5lZCkgfCB1bmRlZmluZWQ7XG59PiAmXG4gIChTaW5ndWxhclByb3BzIHwgUGx1cmFsUHJvcHMpO1xuXG5mdW5jdGlvbiBpc1BsdXJhbChwcm9wczogUHJvcHMpOiBwcm9wcyBpcyBQbHVyYWxQcm9wcyB7XG4gIHJldHVybiB0eXBlb2YgcHJvcHMuc3RyaW5nSWRzICE9PSAnc3RyaW5nJztcbn1cblxuY29uc3QgTG9jYWxpemVkU3RyaW5nID0gKHByb3BzOiBQcm9wcykgPT4ge1xuICBjb25zdCB7IGNsYXNzTmFtZSwgbGlua0NsYXNzTmFtZSwgb25EZWNvcmF0ZUxpbmsgPSBkZWZhdWx0RGVjb3JhdGVMaW5rLCBzdHJpbmdJZHMsIHZhbHVlcyB9ID0gcHJvcHM7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKGlzUGx1cmFsKHByb3BzKSAmJiB7IHBsdXJhbDogdHJ1ZSB9KTtcbiAgY29uc3QgZW52ID0gdXNlTWVtbzxCZXR0ZXJMaW5rRW52PihcbiAgICAoKSA9PiAoe1xuICAgICAgbGlua09wdGlvbnM6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBsaW5rQ2xhc3NOYW1lXG4gICAgICB9LFxuICAgICAgZGVjb3JhdGVMaW5rOiBvbkRlY29yYXRlTGlua1xuICAgIH0pLFxuICAgIFtsaW5rQ2xhc3NOYW1lLCBvbkRlY29yYXRlTGlua11cbiAgKTtcblxuICBjb25zdCBodG1sID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgX19odG1sOiBtYXJrZG93bkl0LnJlbmRlcmVyLnJlbmRlcihtYXJrZG93bkl0LnBhcnNlSW5saW5lKGxvY2FsaXplKHN0cmluZ0lkcywgLi4uKHZhbHVlcyA/PyBbXSkpLCBlbnYpLCBlbnYpXG4gICAgfSksXG4gICAgW2VudiwgbG9jYWxpemUsIHN0cmluZ0lkcywgdmFsdWVzXVxuICApO1xuXG4gIHJldHVybiA8c3BhbiBjbGFzc05hbWU9e2NsYXNzTmFtZX0gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e2h0bWx9IC8+O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbWVtbyhMb2NhbGl6ZWRTdHJpbmcpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUEsSUFBQUEsdUJBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLHdCQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFDLHVCQUFBLENBQUFMLE9BQUE7QUFDQSxJQUFBTSxZQUFBLEdBQUFILHNCQUFBLENBQUFILE9BQUE7QUFBa0YsU0FBQU8seUJBQUFDLFdBQUEsZUFBQUMsT0FBQSxrQ0FBQUMsaUJBQUEsT0FBQUQsT0FBQSxRQUFBRSxnQkFBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlB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
;