botframework-webchat-component
Version:
React component of botframework-webchat
147 lines (137 loc) • 24.1 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _botframeworkWebchatApi = require("botframework-webchat-api");
var _react = require("react");
var _intersectionOf = _interopRequireDefault(require("../../../Utils/intersectionOf"));
var _removeInline = _interopRequireDefault(require("../../../Utils/removeInline"));
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 _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; }
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; }
var useGroupActivities = _botframeworkWebchatApi.hooks.useGroupActivities;
function validateAllEntriesTagged(entries, bins) {
return entries.every(function (entry) {
return bins.some(function (bin) {
return bin.includes(entry);
});
});
}
// Activity tree is a multidimensional array, while activities is a 1D array.
// - The first dimension of the array contains activities with same sender;
// - The second dimension of the array contains activities with same status.
// [
// [
// // Both messages are from bot and is sent as a batch, we will group them as an array.
// 'Bot: Hello!'
// 'Bot: What can I help today?'
// ],
// [
// 'User: What is the weather?'
// ],
// [
// 'Bot: Let me look it up... hold on.'
// ],
// [
// // This message is in a different group because it is more than a few seconds apart from the previous message.
// 'Bot: Here is the weather forecast.'
// ]
// ]
function useActivityTreeWithRenderer(entries) {
var groupActivities = useGroupActivities();
var entryMap = (0, _react.useMemo)(function () {
return new Map(entries.map(function (entry) {
return [entry.activity, entry];
}));
}, [entries]);
// We bin activities in 2 different ways:
// - `activitiesBySender` is a 2D array containing activities with same sender
// - `activitiesByStatus` is a 2D array containing activities with same status
// Both arrays should contains all activities.
var _useMemo = (0, _react.useMemo)(function () {
var visibleActivities = _toConsumableArray(entryMap.keys());
var groupActivitiesResult = groupActivities({
activities: visibleActivities
});
var activitiesBySender = (groupActivitiesResult === null || groupActivitiesResult === void 0 ? void 0 : groupActivitiesResult.sender) || [];
var activitiesByStatus = (groupActivitiesResult === null || groupActivitiesResult === void 0 ? void 0 : groupActivitiesResult.status) || [];
var _map = [activitiesBySender, activitiesByStatus].map(function (bins) {
return bins.map(function (bin) {
return bin.map(function (activity) {
return entryMap.get(activity);
});
});
}),
_map2 = _slicedToArray(_map, 2),
entriesBySender = _map2[0],
entriesByStatus = _map2[1];
if (!validateAllEntriesTagged(visibleActivities, activitiesBySender)) {
console.warn('botframework-webchat: Not every activities are grouped in the "sender" property. Please fix "groupActivitiesMiddleware" and group every activities.');
}
if (!validateAllEntriesTagged(visibleActivities, activitiesByStatus)) {
console.warn('botframework-webchat: Not every activities are grouped in the "status" property. Please fix "groupActivitiesMiddleware" and group every activities.');
}
return {
entriesBySender: entriesBySender,
entriesByStatus: entriesByStatus
};
}, [entryMap, groupActivities]),
entriesBySender = _useMemo.entriesBySender,
entriesByStatus = _useMemo.entriesByStatus;
// Create a tree of activities with 2 dimensions: sender, followed by status.
var activityTree = (0, _react.useMemo)(function () {
var entriesPendingGrouping = _toConsumableArray(entries);
var activityTree = [];
var _loop = function _loop() {
var found = void 0;
var entriesWithSameSender = entriesBySender.find(function (bin) {
return bin.includes(entriesPendingGrouping[0]);
});
var senderTree = [];
entriesWithSameSender === null || entriesWithSameSender === void 0 ? void 0 : entriesWithSameSender.forEach(function (entry) {
var entriesWithSameStatus = entriesByStatus.find(function (bin) {
return bin.includes(entry);
});
var entriesWithSameSenderAndStatus = (0, _intersectionOf.default)(entriesPendingGrouping, entriesWithSameSender, entriesWithSameStatus);
if (entriesWithSameSenderAndStatus.length) {
senderTree.push(Object.freeze(entriesWithSameSenderAndStatus));
_removeInline.default.apply(void 0, [entriesPendingGrouping].concat(_toConsumableArray(entriesWithSameSenderAndStatus)));
found = true;
}
});
// If the entry is not grouped by the middleware, just put the entry in its own bin.
found || senderTree.push(Object.freeze([entriesPendingGrouping.shift()]));
activityTree.push(Object.freeze(senderTree));
};
while (entriesPendingGrouping.length) {
_loop();
}
// Assertion: All entries must be assigned to the activityTree.
if (!entries.every(function (activity) {
return activityTree.some(function (activitiesWithSameSender) {
return activitiesWithSameSender.some(function (activitiesWithSameSenderAndStatus) {
return activitiesWithSameSenderAndStatus.includes(activity);
});
});
})) {
console.warn('botframework-webchat internal: Not all visible activities are grouped in the activityTree.', {
entries: entries,
activityTree: activityTree
});
}
return Object.freeze(activityTree);
}, [entriesBySender, entriesByStatus, entries]);
return activityTree;
}
var _default = useActivityTreeWithRenderer;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfcmVhY3QiLCJfaW50ZXJzZWN0aW9uT2YiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3JlbW92ZUlubGluZSIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiX3NsaWNlZFRvQXJyYXkiLCJhcnIiLCJpIiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlUmVzdCIsIlR5cGVFcnJvciIsIl9pIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJfYXJyIiwiX24iLCJfZCIsIl9zIiwiX2UiLCJjYWxsIiwibmV4dCIsImRvbmUiLCJwdXNoIiwidmFsdWUiLCJsZW5ndGgiLCJlcnIiLCJBcnJheSIsImlzQXJyYXkiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJfYXJyYXlXaXRob3V0SG9sZXMiLCJfaXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlU3ByZWFkIiwibyIsIm1pbkxlbiIsIl9hcnJheUxpa2VUb0FycmF5IiwibiIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIml0ZXIiLCJsZW4iLCJhcnIyIiwidXNlR3JvdXBBY3Rpdml0aWVzIiwiaG9va3MiLCJ2YWxpZGF0ZUFsbEVudHJpZXNUYWdnZWQiLCJlbnRyaWVzIiwiYmlucyIsImV2ZXJ5IiwiZW50cnkiLCJzb21lIiwiYmluIiwiaW5jbHVkZXMiLCJ1c2VBY3Rpdml0eVRyZWVXaXRoUmVuZGVyZXIiLCJncm91cEFjdGl2aXRpZXMiLCJlbnRyeU1hcCIsInVzZU1lbW8iLCJNYXAiLCJtYXAiLCJhY3Rpdml0eSIsIl91c2VNZW1vIiwidmlzaWJsZUFjdGl2aXRpZXMiLCJrZXlzIiwiZ3JvdXBBY3Rpdml0aWVzUmVzdWx0IiwiYWN0aXZpdGllcyIsImFjdGl2aXRpZXNCeVNlbmRlciIsInNlbmRlciIsImFjdGl2aXRpZXNCeVN0YXR1cyIsInN0YXR1cyIsIl9tYXAiLCJnZXQiLCJfbWFwMiIsImVudHJpZXNCeVNlbmRlciIsImVudHJpZXNCeVN0YXR1cyIsImNvbnNvbGUiLCJ3YXJuIiwiYWN0aXZpdHlUcmVlIiwiZW50cmllc1BlbmRpbmdHcm91cGluZyIsIl9sb29wIiwiZm91bmQiLCJlbnRyaWVzV2l0aFNhbWVTZW5kZXIiLCJmaW5kIiwic2VuZGVyVHJlZSIsImZvckVhY2giLCJlbnRyaWVzV2l0aFNhbWVTdGF0dXMiLCJlbnRyaWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMiLCJpbnRlcnNlY3Rpb25PZiIsImZyZWV6ZSIsInJlbW92ZUlubGluZSIsImFwcGx5IiwiY29uY2F0Iiwic2hpZnQiLCJhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIiLCJhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvQWN0aXZpdHlUcmVlL3ByaXZhdGUvdXNlQWN0aXZpdHlUcmVlV2l0aFJlbmRlcmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtYXBpJztcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB0eXBlIHsgV2ViQ2hhdEFjdGl2aXR5IH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtY29yZSc7XG5pbXBvcnQgaW50ZXJzZWN0aW9uT2YgZnJvbSAnLi4vLi4vLi4vVXRpbHMvaW50ZXJzZWN0aW9uT2YnO1xuaW1wb3J0IHJlbW92ZUlubGluZSBmcm9tICcuLi8uLi8uLi9VdGlscy9yZW1vdmVJbmxpbmUnO1xuaW1wb3J0IHR5cGUgeyBBY3Rpdml0eVdpdGhSZW5kZXJlciwgUmVhZG9ubHlBY3Rpdml0eVRyZWUgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgeyB1c2VHcm91cEFjdGl2aXRpZXMgfSA9IGhvb2tzO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZUFsbEVudHJpZXNUYWdnZWQ8VD4oZW50cmllczogcmVhZG9ubHkgVFtdLCBiaW5zOiByZWFkb25seSAocmVhZG9ubHkgVFtdKVtdKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbnRyaWVzLmV2ZXJ5KGVudHJ5ID0+IGJpbnMuc29tZShiaW4gPT4gYmluLmluY2x1ZGVzKGVudHJ5KSkpO1xufVxuXG4vLyBBY3Rpdml0eSB0cmVlIGlzIGEgbXVsdGlkaW1lbnNpb25hbCBhcnJheSwgd2hpbGUgYWN0aXZpdGllcyBpcyBhIDFEIGFycmF5LlxuLy8gLSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBjb250YWlucyBhY3Rpdml0aWVzIHdpdGggc2FtZSBzZW5kZXI7XG4vLyAtIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBjb250YWlucyBhY3Rpdml0aWVzIHdpdGggc2FtZSBzdGF0dXMuXG5cbi8vIFtcbi8vICAgW1xuLy8gICAgIC8vIEJvdGggbWVzc2FnZXMgYXJlIGZyb20gYm90IGFuZCBpcyBzZW50IGFzIGEgYmF0Y2gsIHdlIHdpbGwgZ3JvdXAgdGhlbSBhcyBhbiBhcnJheS5cbi8vICAgICAnQm90OiBIZWxsbyEnXG4vLyAgICAgJ0JvdDogV2hhdCBjYW4gSSBoZWxwIHRvZGF5Pydcbi8vICAgXSxcbi8vICAgW1xuLy8gICAgICdVc2VyOiBXaGF0IGlzIHRoZSB3ZWF0aGVyPydcbi8vICAgXSxcbi8vICAgW1xuLy8gICAgICdCb3Q6IExldCBtZSBsb29rIGl0IHVwLi4uIGhvbGQgb24uJ1xuLy8gICBdLFxuLy8gICBbXG4vLyAgICAgLy8gVGhpcyBtZXNzYWdlIGlzIGluIGEgZGlmZmVyZW50IGdyb3VwIGJlY2F1c2UgaXQgaXMgbW9yZSB0aGFuIGEgZmV3IHNlY29uZHMgYXBhcnQgZnJvbSB0aGUgcHJldmlvdXMgbWVzc2FnZS5cbi8vICAgICAnQm90OiBIZXJlIGlzIHRoZSB3ZWF0aGVyIGZvcmVjYXN0Lidcbi8vICAgXVxuLy8gXVxuXG5mdW5jdGlvbiB1c2VBY3Rpdml0eVRyZWVXaXRoUmVuZGVyZXIoZW50cmllczogcmVhZG9ubHkgQWN0aXZpdHlXaXRoUmVuZGVyZXJbXSk6IFJlYWRvbmx5QWN0aXZpdHlUcmVlIHtcbiAgY29uc3QgZ3JvdXBBY3Rpdml0aWVzID0gdXNlR3JvdXBBY3Rpdml0aWVzKCk7XG4gIGNvbnN0IGVudHJ5TWFwOiBNYXA8V2ViQ2hhdEFjdGl2aXR5LCBBY3Rpdml0eVdpdGhSZW5kZXJlcj4gPSB1c2VNZW1vKFxuICAgICgpID0+IG5ldyBNYXAoZW50cmllcy5tYXAoZW50cnkgPT4gW2VudHJ5LmFjdGl2aXR5LCBlbnRyeV0pKSxcbiAgICBbZW50cmllc11cbiAgKTtcblxuICAvLyBXZSBiaW4gYWN0aXZpdGllcyBpbiAyIGRpZmZlcmVudCB3YXlzOlxuICAvLyAtIGBhY3Rpdml0aWVzQnlTZW5kZXJgIGlzIGEgMkQgYXJyYXkgY29udGFpbmluZyBhY3Rpdml0aWVzIHdpdGggc2FtZSBzZW5kZXJcbiAgLy8gLSBgYWN0aXZpdGllc0J5U3RhdHVzYCBpcyBhIDJEIGFycmF5IGNvbnRhaW5pbmcgYWN0aXZpdGllcyB3aXRoIHNhbWUgc3RhdHVzXG4gIC8vIEJvdGggYXJyYXlzIHNob3VsZCBjb250YWlucyBhbGwgYWN0aXZpdGllcy5cblxuICBjb25zdCB7IGVudHJpZXNCeVNlbmRlciwgZW50cmllc0J5U3RhdHVzIH0gPSB1c2VNZW1vPHtcbiAgICBlbnRyaWVzQnlTZW5kZXI6IHJlYWRvbmx5IChyZWFkb25seSBBY3Rpdml0eVdpdGhSZW5kZXJlcltdKVtdO1xuICAgIGVudHJpZXNCeVN0YXR1czogcmVhZG9ubHkgKHJlYWRvbmx5IEFjdGl2aXR5V2l0aFJlbmRlcmVyW10pW107XG4gIH0+KCgpID0+IHtcbiAgICBjb25zdCB2aXNpYmxlQWN0aXZpdGllcyA9IFsuLi5lbnRyeU1hcC5rZXlzKCldO1xuXG4gICAgY29uc3QgZ3JvdXBBY3Rpdml0aWVzUmVzdWx0ID0gZ3JvdXBBY3Rpdml0aWVzKHsgYWN0aXZpdGllczogdmlzaWJsZUFjdGl2aXRpZXMgfSk7XG5cbiAgICBjb25zdCBhY3Rpdml0aWVzQnlTZW5kZXIgPSBncm91cEFjdGl2aXRpZXNSZXN1bHQ/LnNlbmRlciB8fCBbXTtcbiAgICBjb25zdCBhY3Rpdml0aWVzQnlTdGF0dXMgPSBncm91cEFjdGl2aXRpZXNSZXN1bHQ/LnN0YXR1cyB8fCBbXTtcblxuICAgIGNvbnN0IFtlbnRyaWVzQnlTZW5kZXIsIGVudHJpZXNCeVN0YXR1c10gPSBbYWN0aXZpdGllc0J5U2VuZGVyLCBhY3Rpdml0aWVzQnlTdGF0dXNdLm1hcChiaW5zID0+XG4gICAgICBiaW5zLm1hcChiaW4gPT4gYmluLm1hcChhY3Rpdml0eSA9PiBlbnRyeU1hcC5nZXQoYWN0aXZpdHkpKSlcbiAgICApO1xuXG4gICAgaWYgKCF2YWxpZGF0ZUFsbEVudHJpZXNUYWdnZWQodmlzaWJsZUFjdGl2aXRpZXMsIGFjdGl2aXRpZXNCeVNlbmRlcikpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ2JvdGZyYW1ld29yay13ZWJjaGF0OiBOb3QgZXZlcnkgYWN0aXZpdGllcyBhcmUgZ3JvdXBlZCBpbiB0aGUgXCJzZW5kZXJcIiBwcm9wZXJ0eS4gUGxlYXNlIGZpeCBcImdyb3VwQWN0aXZpdGllc01pZGRsZXdhcmVcIiBhbmQgZ3JvdXAgZXZlcnkgYWN0aXZpdGllcy4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdmFsaWRhdGVBbGxFbnRyaWVzVGFnZ2VkKHZpc2libGVBY3Rpdml0aWVzLCBhY3Rpdml0aWVzQnlTdGF0dXMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogTm90IGV2ZXJ5IGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIFwic3RhdHVzXCIgcHJvcGVydHkuIFBsZWFzZSBmaXggXCJncm91cEFjdGl2aXRpZXNNaWRkbGV3YXJlXCIgYW5kIGdyb3VwIGV2ZXJ5IGFjdGl2aXRpZXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZW50cmllc0J5U2VuZGVyLFxuICAgICAgZW50cmllc0J5U3RhdHVzXG4gICAgfTtcbiAgfSwgW2VudHJ5TWFwLCBncm91cEFjdGl2aXRpZXNdKTtcblxuICAvLyBDcmVhdGUgYSB0cmVlIG9mIGFjdGl2aXRpZXMgd2l0aCAyIGRpbWVuc2lvbnM6IHNlbmRlciwgZm9sbG93ZWQgYnkgc3RhdHVzLlxuXG4gIGNvbnN0IGFjdGl2aXR5VHJlZTogUmVhZG9ubHlBY3Rpdml0eVRyZWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBlbnRyaWVzUGVuZGluZ0dyb3VwaW5nID0gWy4uLmVudHJpZXNdO1xuICAgIGNvbnN0IGFjdGl2aXR5VHJlZTogKHJlYWRvbmx5IChyZWFkb25seSBBY3Rpdml0eVdpdGhSZW5kZXJlcltdKVtdKVtdID0gW107XG5cbiAgICB3aGlsZSAoZW50cmllc1BlbmRpbmdHcm91cGluZy5sZW5ndGgpIHtcbiAgICAgIGxldCBmb3VuZDogYm9vbGVhbjtcbiAgICAgIGNvbnN0IGVudHJpZXNXaXRoU2FtZVNlbmRlciA9IGVudHJpZXNCeVNlbmRlci5maW5kKGJpbiA9PiBiaW4uaW5jbHVkZXMoZW50cmllc1BlbmRpbmdHcm91cGluZ1swXSkpO1xuICAgICAgY29uc3Qgc2VuZGVyVHJlZTogKHJlYWRvbmx5IEFjdGl2aXR5V2l0aFJlbmRlcmVyW10pW10gPSBbXTtcblxuICAgICAgZW50cmllc1dpdGhTYW1lU2VuZGVyPy5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgY29uc3QgZW50cmllc1dpdGhTYW1lU3RhdHVzID0gZW50cmllc0J5U3RhdHVzLmZpbmQoYmluID0+IGJpbi5pbmNsdWRlcyhlbnRyeSkpO1xuXG4gICAgICAgIGNvbnN0IGVudHJpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cyA9IGludGVyc2VjdGlvbk9mPEFjdGl2aXR5V2l0aFJlbmRlcmVyPihcbiAgICAgICAgICBlbnRyaWVzUGVuZGluZ0dyb3VwaW5nLFxuICAgICAgICAgIGVudHJpZXNXaXRoU2FtZVNlbmRlcixcbiAgICAgICAgICBlbnRyaWVzV2l0aFNhbWVTdGF0dXNcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZW50cmllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzLmxlbmd0aCkge1xuICAgICAgICAgIHNlbmRlclRyZWUucHVzaChPYmplY3QuZnJlZXplKGVudHJpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cykpO1xuICAgICAgICAgIHJlbW92ZUlubGluZShlbnRyaWVzUGVuZGluZ0dyb3VwaW5nLCAuLi5lbnRyaWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMpO1xuXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgdGhlIGVudHJ5IGlzIG5vdCBncm91cGVkIGJ5IHRoZSBtaWRkbGV3YXJlLCBqdXN0IHB1dCB0aGUgZW50cnkgaW4gaXRzIG93biBiaW4uXG4gICAgICBmb3VuZCB8fCBzZW5kZXJUcmVlLnB1c2goT2JqZWN0LmZyZWV6ZShbZW50cmllc1BlbmRpbmdHcm91cGluZy5zaGlmdCgpXSkpO1xuXG4gICAgICBhY3Rpdml0eVRyZWUucHVzaChPYmplY3QuZnJlZXplKHNlbmRlclRyZWUpKTtcbiAgICB9XG5cbiAgICAvLyBBc3NlcnRpb246IEFsbCBlbnRyaWVzIG11c3QgYmUgYXNzaWduZWQgdG8gdGhlIGFjdGl2aXR5VHJlZS5cbiAgICBpZiAoXG4gICAgICAhZW50cmllcy5ldmVyeShhY3Rpdml0eSA9PlxuICAgICAgICBhY3Rpdml0eVRyZWUuc29tZShhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIgPT5cbiAgICAgICAgICBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIuc29tZShhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMgPT5cbiAgICAgICAgICAgIGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cy5pbmNsdWRlcyhhY3Rpdml0eSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2FybignYm90ZnJhbWV3b3JrLXdlYmNoYXQgaW50ZXJuYWw6IE5vdCBhbGwgdmlzaWJsZSBhY3Rpdml0aWVzIGFyZSBncm91cGVkIGluIHRoZSBhY3Rpdml0eVRyZWUuJywge1xuICAgICAgICBlbnRyaWVzLFxuICAgICAgICBhY3Rpdml0eVRyZWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGFjdGl2aXR5VHJlZSk7XG4gIH0sIFtlbnRyaWVzQnlTZW5kZXIsIGVudHJpZXNCeVN0YXR1cywgZW50cmllc10pO1xuXG4gIHJldHVybiBhY3Rpdml0eVRyZWU7XG59XG5cbmV4cG9ydCB0eXBlIHsgQWN0aXZpdHlXaXRoUmVuZGVyZXIgfTtcblxuZXhwb3J0IGRlZmF1bHQgdXNlQWN0aXZpdHlUcmVlV2l0aFJlbmRlcmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSx1QkFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBR0EsSUFBQUUsZUFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksYUFBQSxHQUFBRCxzQkFBQSxDQUFBSCxPQUFBO0FBQXVELFNBQUFHLHVCQUFBRSxHQUFBLFdBQUFBLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLEdBQUFELEdBQUEsS0FBQUUsT0FBQSxFQUFBRixHQUFBO0FBQUEsU0FBQUcsZUFBQUMsR0FBQSxFQUFBQyxDQUFBLFdBQUFDLGVBQUEsQ0FBQUYsR0FBQSxLQUFBRyxxQkFBQSxDQUFBSCxHQUFBLEVBQUFDLENBQUEsS0FBQUcsMkJBQUEsQ0FBQUosR0FBQSxFQUFBQyxDQUFBLEtBQUFJLGdCQUFBO0FBQUEsU0FBQUEsaUJB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
;