UNPKG

matrix-react-sdk

Version:
223 lines (220 loc) 30.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reconcileNotificationSettings = reconcileNotificationSettings; var _matrix = require("matrix-js-sdk/src/matrix"); var _utils = require("matrix-js-sdk/src/utils"); var _notifications = require("../../notifications"); var _StandardActions = require("../../notifications/StandardActions"); var _RoomNotifs = require("../../RoomNotifs"); var _PushRuleMap = require("./PushRuleMap"); /* Copyright 2024 New Vector Ltd. Copyright 2023 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ function toStandardRules(model, supportsIntentionalMentions) { const standardRules = new Map(); standardRules.set(_matrix.RuleId.Master, { rule_id: _matrix.RuleId.Master, kind: _matrix.PushRuleKind.Override, enabled: model.globalMute }); standardRules.set(_matrix.RuleId.EncryptedMessage, { rule_id: _matrix.RuleId.EncryptedMessage, kind: _matrix.PushRuleKind.Underride, enabled: true, actions: _notifications.NotificationUtils.encodeActions({ notify: model.defaultLevels.room === _RoomNotifs.RoomNotifState.AllMessages, highlight: false }) }); standardRules.set(_matrix.RuleId.Message, { rule_id: _matrix.RuleId.Message, kind: _matrix.PushRuleKind.Underride, enabled: true, actions: _notifications.NotificationUtils.encodeActions({ notify: model.defaultLevels.room === _RoomNotifs.RoomNotifState.AllMessages, highlight: false }) }); standardRules.set(_matrix.RuleId.EncryptedDM, { rule_id: _matrix.RuleId.EncryptedDM, kind: _matrix.PushRuleKind.Underride, enabled: true, actions: _notifications.NotificationUtils.encodeActions({ notify: model.defaultLevels.dm === _RoomNotifs.RoomNotifState.AllMessages, highlight: false, sound: model.sound.people }) }); standardRules.set(_matrix.RuleId.DM, { rule_id: _matrix.RuleId.DM, kind: _matrix.PushRuleKind.Underride, enabled: true, actions: _notifications.NotificationUtils.encodeActions({ notify: model.defaultLevels.dm === _RoomNotifs.RoomNotifState.AllMessages, highlight: false, sound: model.sound.people }) }); standardRules.set(_matrix.RuleId.SuppressNotices, { rule_id: _matrix.RuleId.SuppressNotices, kind: _matrix.PushRuleKind.Override, enabled: !model.activity.bot_notices, actions: _StandardActions.StandardActions.ACTION_DONT_NOTIFY }); standardRules.set(_matrix.RuleId.InviteToSelf, { rule_id: _matrix.RuleId.InviteToSelf, kind: _matrix.PushRuleKind.Override, enabled: model.activity.invite, actions: _notifications.NotificationUtils.encodeActions({ notify: true, highlight: false, sound: model.sound.people }) }); standardRules.set(_matrix.RuleId.MemberEvent, { rule_id: _matrix.RuleId.MemberEvent, kind: _matrix.PushRuleKind.Override, enabled: true, actions: model.activity.status_event ? _StandardActions.StandardActions.ACTION_NOTIFY : _StandardActions.StandardActions.ACTION_DONT_NOTIFY }); const mentionActions = _notifications.NotificationUtils.encodeActions({ notify: true, sound: model.sound.mentions, highlight: true }); const userMentionActions = model.mentions.user ? mentionActions : _StandardActions.StandardActions.ACTION_DONT_NOTIFY; if (supportsIntentionalMentions) { standardRules.set(_matrix.RuleId.IsUserMention, { rule_id: _matrix.RuleId.IsUserMention, kind: _matrix.PushRuleKind.Override, enabled: true, actions: userMentionActions }); } standardRules.set(_matrix.RuleId.ContainsDisplayName, { rule_id: _matrix.RuleId.ContainsDisplayName, kind: _matrix.PushRuleKind.Override, enabled: true, actions: userMentionActions }); standardRules.set(_matrix.RuleId.ContainsUserName, { rule_id: _matrix.RuleId.ContainsUserName, kind: _matrix.PushRuleKind.ContentSpecific, enabled: true, actions: userMentionActions }); const roomMentionActions = model.mentions.room ? _StandardActions.StandardActions.ACTION_NOTIFY : _StandardActions.StandardActions.ACTION_DONT_NOTIFY; if (supportsIntentionalMentions) { standardRules.set(_matrix.RuleId.IsRoomMention, { rule_id: _matrix.RuleId.IsRoomMention, kind: _matrix.PushRuleKind.Override, enabled: true, actions: roomMentionActions }); } standardRules.set(_matrix.RuleId.AtRoomNotification, { rule_id: _matrix.RuleId.AtRoomNotification, kind: _matrix.PushRuleKind.Override, enabled: true, actions: roomMentionActions }); standardRules.set(_matrix.RuleId.Tombstone, { rule_id: _matrix.RuleId.Tombstone, kind: _matrix.PushRuleKind.Override, enabled: model.activity.status_event, actions: _StandardActions.StandardActions.ACTION_HIGHLIGHT }); standardRules.set(_matrix.RuleId.IncomingCall, { rule_id: _matrix.RuleId.IncomingCall, kind: _matrix.PushRuleKind.Underride, enabled: true, actions: _notifications.NotificationUtils.encodeActions({ notify: true, sound: model.sound.calls }) }); return standardRules; } function reconcileNotificationSettings(pushRules, model, supportsIntentionalMentions) { const changes = { updated: [], added: [], deleted: [] }; const oldRules = (0, _PushRuleMap.buildPushRuleMap)(pushRules); const newRules = toStandardRules(model, supportsIntentionalMentions); for (const rule of newRules.values()) { const original = oldRules.get(rule.rule_id); let changed = false; if (original === undefined) { changed = true; } else if (rule.enabled !== undefined && rule.enabled !== original.enabled) { changed = true; } else if (rule.actions !== undefined) { const originalActions = _notifications.NotificationUtils.decodeActions(original.actions); const actions = _notifications.NotificationUtils.decodeActions(rule.actions); if (originalActions === null || actions === null) { changed = true; } else if (!(0, _utils.deepCompare)(actions, originalActions)) { changed = true; } } if (changed) { changes.updated.push(rule); } } const mentionActions = _notifications.NotificationUtils.encodeActions({ notify: true, sound: model.sound.mentions, highlight: true }); const contentRules = pushRules.global.content?.filter(rule => !rule.rule_id.startsWith(".")) ?? []; const newKeywords = new Set(model.keywords); for (const rule of contentRules) { if (!newKeywords.has(rule.pattern)) { changes.deleted.push({ rule_id: rule.rule_id, kind: _matrix.PushRuleKind.ContentSpecific }); } else { let changed = false; if (rule.enabled !== model.mentions.keywords) { changed = true; } else if (rule.actions !== undefined) { const originalActions = _notifications.NotificationUtils.decodeActions(rule.actions); const actions = _notifications.NotificationUtils.decodeActions(mentionActions); if (originalActions === null || actions === null) { changed = true; } else if (!(0, _utils.deepCompare)(actions, originalActions)) { changed = true; } } if (changed) { changes.updated.push({ rule_id: rule.rule_id, kind: _matrix.PushRuleKind.ContentSpecific, enabled: model.mentions.keywords, actions: mentionActions }); } } newKeywords.delete(rule.pattern); } for (const keyword of newKeywords) { changes.added.push({ rule_id: keyword, kind: _matrix.PushRuleKind.ContentSpecific, default: false, enabled: model.mentions.keywords, pattern: keyword, actions: mentionActions }); } return changes; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl91dGlscyIsIl9ub3RpZmljYXRpb25zIiwiX1N0YW5kYXJkQWN0aW9ucyIsIl9Sb29tTm90aWZzIiwiX1B1c2hSdWxlTWFwIiwidG9TdGFuZGFyZFJ1bGVzIiwibW9kZWwiLCJzdXBwb3J0c0ludGVudGlvbmFsTWVudGlvbnMiLCJzdGFuZGFyZFJ1bGVzIiwiTWFwIiwic2V0IiwiUnVsZUlkIiwiTWFzdGVyIiwicnVsZV9pZCIsImtpbmQiLCJQdXNoUnVsZUtpbmQiLCJPdmVycmlkZSIsImVuYWJsZWQiLCJnbG9iYWxNdXRlIiwiRW5jcnlwdGVkTWVzc2FnZSIsIlVuZGVycmlkZSIsImFjdGlvbnMiLCJOb3RpZmljYXRpb25VdGlscyIsImVuY29kZUFjdGlvbnMiLCJub3RpZnkiLCJkZWZhdWx0TGV2ZWxzIiwicm9vbSIsIlJvb21Ob3RpZlN0YXRlIiwiQWxsTWVzc2FnZXMiLCJoaWdobGlnaHQiLCJNZXNzYWdlIiwiRW5jcnlwdGVkRE0iLCJkbSIsInNvdW5kIiwicGVvcGxlIiwiRE0iLCJTdXBwcmVzc05vdGljZXMiLCJhY3Rpdml0eSIsImJvdF9ub3RpY2VzIiwiU3RhbmRhcmRBY3Rpb25zIiwiQUNUSU9OX0RPTlRfTk9USUZZIiwiSW52aXRlVG9TZWxmIiwiaW52aXRlIiwiTWVtYmVyRXZlbnQiLCJzdGF0dXNfZXZlbnQiLCJBQ1RJT05fTk9USUZZIiwibWVudGlvbkFjdGlvbnMiLCJtZW50aW9ucyIsInVzZXJNZW50aW9uQWN0aW9ucyIsInVzZXIiLCJJc1VzZXJNZW50aW9uIiwiQ29udGFpbnNEaXNwbGF5TmFtZSIsIkNvbnRhaW5zVXNlck5hbWUiLCJDb250ZW50U3BlY2lmaWMiLCJyb29tTWVudGlvbkFjdGlvbnMiLCJJc1Jvb21NZW50aW9uIiwiQXRSb29tTm90aWZpY2F0aW9uIiwiVG9tYnN0b25lIiwiQUNUSU9OX0hJR0hMSUdIVCIsIkluY29taW5nQ2FsbCIsImNhbGxzIiwicmVjb25jaWxlTm90aWZpY2F0aW9uU2V0dGluZ3MiLCJwdXNoUnVsZXMiLCJjaGFuZ2VzIiwidXBkYXRlZCIsImFkZGVkIiwiZGVsZXRlZCIsIm9sZFJ1bGVzIiwiYnVpbGRQdXNoUnVsZU1hcCIsIm5ld1J1bGVzIiwicnVsZSIsInZhbHVlcyIsIm9yaWdpbmFsIiwiZ2V0IiwiY2hhbmdlZCIsInVuZGVmaW5lZCIsIm9yaWdpbmFsQWN0aW9ucyIsImRlY29kZUFjdGlvbnMiLCJkZWVwQ29tcGFyZSIsInB1c2giLCJjb250ZW50UnVsZXMiLCJnbG9iYWwiLCJjb250ZW50IiwiZmlsdGVyIiwic3RhcnRzV2l0aCIsIm5ld0tleXdvcmRzIiwiU2V0Iiwia2V5d29yZHMiLCJoYXMiLCJwYXR0ZXJuIiwiZGVsZXRlIiwia2V5d29yZCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kZWxzL25vdGlmaWNhdGlvbnNldHRpbmdzL3JlY29uY2lsZU5vdGlmaWNhdGlvblNldHRpbmdzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIzIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IElQdXNoUnVsZXMsIFB1c2hSdWxlS2luZCwgUnVsZUlkIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgZGVlcENvbXBhcmUgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvdXRpbHNcIjtcblxuaW1wb3J0IHsgTm90aWZpY2F0aW9uVXRpbHMgfSBmcm9tIFwiLi4vLi4vbm90aWZpY2F0aW9uc1wiO1xuaW1wb3J0IHsgU3RhbmRhcmRBY3Rpb25zIH0gZnJvbSBcIi4uLy4uL25vdGlmaWNhdGlvbnMvU3RhbmRhcmRBY3Rpb25zXCI7XG5pbXBvcnQgeyBSb29tTm90aWZTdGF0ZSB9IGZyb20gXCIuLi8uLi9Sb29tTm90aWZzXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXR0aW5ncyB9IGZyb20gXCIuL05vdGlmaWNhdGlvblNldHRpbmdzXCI7XG5pbXBvcnQgeyBQdXNoUnVsZURpZmYsIFB1c2hSdWxlVXBkYXRlIH0gZnJvbSBcIi4vUHVzaFJ1bGVEaWZmXCI7XG5pbXBvcnQgeyBidWlsZFB1c2hSdWxlTWFwIH0gZnJvbSBcIi4vUHVzaFJ1bGVNYXBcIjtcblxuZnVuY3Rpb24gdG9TdGFuZGFyZFJ1bGVzKFxuICAgIG1vZGVsOiBOb3RpZmljYXRpb25TZXR0aW5ncyxcbiAgICBzdXBwb3J0c0ludGVudGlvbmFsTWVudGlvbnM6IGJvb2xlYW4sXG4pOiBNYXA8UnVsZUlkIHwgc3RyaW5nLCBQdXNoUnVsZVVwZGF0ZT4ge1xuICAgIGNvbnN0IHN0YW5kYXJkUnVsZXMgPSBuZXcgTWFwPFJ1bGVJZCB8IHN0cmluZywgUHVzaFJ1bGVVcGRhdGU+KCk7XG5cbiAgICBzdGFuZGFyZFJ1bGVzLnNldChSdWxlSWQuTWFzdGVyLCB7XG4gICAgICAgIHJ1bGVfaWQ6IFJ1bGVJZC5NYXN0ZXIsXG4gICAgICAgIGtpbmQ6IFB1c2hSdWxlS2luZC5PdmVycmlkZSxcbiAgICAgICAgZW5hYmxlZDogbW9kZWwuZ2xvYmFsTXV0ZSxcbiAgICB9KTtcblxuICAgIHN0YW5kYXJkUnVsZXMuc2V0KFJ1bGVJZC5FbmNyeXB0ZWRNZXNzYWdlLCB7XG4gICAgICAgIHJ1bGVfaWQ6IFJ1bGVJZC5FbmNyeXB0ZWRNZXNzYWdlLFxuICAgICAgICBraW5kOiBQdXNoUnVsZUtpbmQuVW5kZXJyaWRlLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBhY3Rpb25zOiBOb3RpZmljYXRpb25VdGlscy5lbmNvZGVBY3Rpb25zKHtcbiAgICAgICAgICAgIG5vdGlmeTogbW9kZWwuZGVmYXVsdExldmVscy5yb29tID09PSBSb29tTm90aWZTdGF0ZS5BbGxNZXNzYWdlcyxcbiAgICAgICAgICAgIGhpZ2hsaWdodDogZmFsc2UsXG4gICAgICAgIH0pLFxuICAgIH0pO1xuICAgIHN0YW5kYXJkUnVsZXMuc2V0KFJ1bGVJZC5NZXNzYWdlLCB7XG4gICAgICAgIHJ1bGVfaWQ6IFJ1bGVJZC5NZXNzYWdlLFxuICAgICAgICBraW5kOiBQdXNoUnVsZUtpbmQuVW5kZXJyaWRlLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBhY3Rpb25zOiBOb3RpZmljYXRpb25VdGlscy5lbmNvZGVBY3Rpb25zKHtcbiAgICAgICAgICAgIG5vdGlmeTogbW9kZWwuZGVmYXVsdExldmVscy5yb29tID09PSBSb29tTm90aWZTdGF0ZS5BbGxNZXNzYWdlcyxcbiAgICAgICAgICAgIGhpZ2hsaWdodDogZmFsc2UsXG4gICAgICAgIH0pLFxuICAgIH0pO1xuICAgIHN0YW5kYXJkUnVsZXMuc2V0KFJ1bGVJZC5FbmNyeXB0ZWRETSwge1xuICAgICAgICBydWxlX2lkOiBSdWxlSWQuRW5jcnlwdGVkRE0sXG4gICAgICAgIGtpbmQ6IFB1c2hSdWxlS2luZC5VbmRlcnJpZGUsXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGFjdGlvbnM6IE5vdGlmaWNhdGlvblV0aWxzLmVuY29kZUFjdGlvbnMoe1xuICAgICAgICAgICAgbm90aWZ5OiBtb2RlbC5kZWZhdWx0TGV2ZWxzLmRtID09PSBSb29tTm90aWZTdGF0ZS5BbGxNZXNzYWdlcyxcbiAgICAgICAgICAgIGhpZ2hsaWdodDogZmFsc2UsXG4gICAgICAgICAgICBzb3VuZDogbW9kZWwuc291bmQucGVvcGxlLFxuICAgICAgICB9KSxcbiAgICB9KTtcbiAgICBzdGFuZGFyZFJ1bGVzLnNldChSdWxlSWQuRE0sIHtcbiAgICAgICAgcnVsZV9pZDogUnVsZUlkLkRNLFxuICAgICAgICBraW5kOiBQdXNoUnVsZUtpbmQuVW5kZXJyaWRlLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBhY3Rpb25zOiBOb3RpZmljYXRpb25VdGlscy5lbmNvZGVBY3Rpb25zKHtcbiAgICAgICAgICAgIG5vdGlmeTogbW9kZWwuZGVmYXVsdExldmVscy5kbSA9PT0gUm9vbU5vdGlmU3RhdGUuQWxsTWVzc2FnZXMsXG4gICAgICAgICAgICBoaWdobGlnaHQ6IGZhbHNlLFxuICAgICAgICAgICAgc291bmQ6IG1vZGVsLnNvdW5kLnBlb3BsZSxcbiAgICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBzdGFuZGFyZFJ1bGVzLnNldChSdWxlSWQuU3VwcHJlc3NOb3RpY2VzLCB7XG4gICAgICAgIHJ1bGVfaWQ6IFJ1bGVJZC5TdXBwcmVzc05vdGljZXMsXG4gICAgICAgIGtpbmQ6IFB1c2hSdWxlS2luZC5PdmVycmlkZSxcbiAgICAgICAgZW5hYmxlZDogIW1vZGVsLmFjdGl2aXR5LmJvdF9ub3RpY2VzLFxuICAgICAgICBhY3Rpb25zOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX0RPTlRfTk9USUZZLFxuICAgIH0pO1xuICAgIHN0YW5kYXJkUnVsZXMuc2V0KFJ1bGVJZC5JbnZpdGVUb1NlbGYsIHtcbiAgICAgICAgcnVsZV9pZDogUnVsZUlkLkludml0ZVRvU2VsZixcbiAgICAgICAga2luZDogUHVzaFJ1bGVLaW5kLk92ZXJyaWRlLFxuICAgICAgICBlbmFibGVkOiBtb2RlbC5hY3Rpdml0eS5pbnZpdGUsXG4gICAgICAgIGFjdGlvbnM6IE5vdGlmaWNhdGlvblV0aWxzLmVuY29kZUFjdGlvbnMoe1xuICAgICAgICAgICAgbm90aWZ5OiB0cnVlLFxuICAgICAgICAgICAgaGlnaGxpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgIHNvdW5kOiBtb2RlbC5zb3VuZC5wZW9wbGUsXG4gICAgICAgIH0pLFxuICAgIH0pO1xuICAgIHN0YW5kYXJkUnVsZXMuc2V0KFJ1bGVJZC5NZW1iZXJFdmVudCwge1xuICAgICAgICBydWxlX2lkOiBSdWxlSWQuTWVtYmVyRXZlbnQsXG4gICAgICAgIGtpbmQ6IFB1c2hSdWxlS2luZC5PdmVycmlkZSxcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgYWN0aW9uczogbW9kZWwuYWN0aXZpdHkuc3RhdHVzX2V2ZW50ID8gU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9OT1RJRlkgOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX0RPTlRfTk9USUZZLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbWVudGlvbkFjdGlvbnMgPSBOb3RpZmljYXRpb25VdGlscy5lbmNvZGVBY3Rpb25zKHtcbiAgICAgICAgbm90aWZ5OiB0cnVlLFxuICAgICAgICBzb3VuZDogbW9kZWwuc291bmQubWVudGlvbnMsXG4gICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyTWVudGlvbkFjdGlvbnMgPSBtb2RlbC5tZW50aW9ucy51c2VyID8gbWVudGlvbkFjdGlvbnMgOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX0RPTlRfTk9USUZZO1xuICAgIGlmIChzdXBwb3J0c0ludGVudGlvbmFsTWVudGlvbnMpIHtcbiAgICAgICAgc3RhbmRhcmRSdWxlcy5zZXQoUnVsZUlkLklzVXNlck1lbnRpb24sIHtcbiAgICAgICAgICAgIHJ1bGVfaWQ6IFJ1bGVJZC5Jc1VzZXJNZW50aW9uLFxuICAgICAgICAgICAga2luZDogUHVzaFJ1bGVLaW5kLk92ZXJyaWRlLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIGFjdGlvbnM6IHVzZXJNZW50aW9uQWN0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YW5kYXJkUnVsZXMuc2V0KFJ1bGVJZC5Db250YWluc0Rpc3BsYXlOYW1lLCB7XG4gICAgICAgIHJ1bGVfaWQ6IFJ1bGVJZC5Db250YWluc0Rpc3BsYXlOYW1lLFxuICAgICAgICBraW5kOiBQdXNoUnVsZUtpbmQuT3ZlcnJpZGUsXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGFjdGlvbnM6IHVzZXJNZW50aW9uQWN0aW9ucyxcbiAgICB9KTtcbiAgICBzdGFuZGFyZFJ1bGVzLnNldChSdWxlSWQuQ29udGFpbnNVc2VyTmFtZSwge1xuICAgICAgICBydWxlX2lkOiBSdWxlSWQuQ29udGFpbnNVc2VyTmFtZSxcbiAgICAgICAga2luZDogUHVzaFJ1bGVLaW5kLkNvbnRlbnRTcGVjaWZpYyxcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgYWN0aW9uczogdXNlck1lbnRpb25BY3Rpb25zLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgcm9vbU1lbnRpb25BY3Rpb25zID0gbW9kZWwubWVudGlvbnMucm9vbSA/IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZIDogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ET05UX05PVElGWTtcbiAgICBpZiAoc3VwcG9ydHNJbnRlbnRpb25hbE1lbnRpb25zKSB7XG4gICAgICAgIHN0YW5kYXJkUnVsZXMuc2V0KFJ1bGVJZC5Jc1Jvb21NZW50aW9uLCB7XG4gICAgICAgICAgICBydWxlX2lkOiBSdWxlSWQuSXNSb29tTWVudGlvbixcbiAgICAgICAgICAgIGtpbmQ6IFB1c2hSdWxlS2luZC5PdmVycmlkZSxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBhY3Rpb25zOiByb29tTWVudGlvbkFjdGlvbnMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGFuZGFyZFJ1bGVzLnNldChSdWxlSWQuQXRSb29tTm90aWZpY2F0aW9uLCB7XG4gICAgICAgIHJ1bGVfaWQ6IFJ1bGVJZC5BdFJvb21Ob3RpZmljYXRpb24sXG4gICAgICAgIGtpbmQ6IFB1c2hSdWxlS2luZC5PdmVycmlkZSxcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgYWN0aW9uczogcm9vbU1lbnRpb25BY3Rpb25zLFxuICAgIH0pO1xuXG4gICAgc3RhbmRhcmRSdWxlcy5zZXQoUnVsZUlkLlRvbWJzdG9uZSwge1xuICAgICAgICBydWxlX2lkOiBSdWxlSWQuVG9tYnN0b25lLFxuICAgICAgICBraW5kOiBQdXNoUnVsZUtpbmQuT3ZlcnJpZGUsXG4gICAgICAgIGVuYWJsZWQ6IG1vZGVsLmFjdGl2aXR5LnN0YXR1c19ldmVudCxcbiAgICAgICAgYWN0aW9uczogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ISUdITElHSFQsXG4gICAgfSk7XG5cbiAgICBzdGFuZGFyZFJ1bGVzLnNldChSdWxlSWQuSW5jb21pbmdDYWxsLCB7XG4gICAgICAgIHJ1bGVfaWQ6IFJ1bGVJZC5JbmNvbWluZ0NhbGwsXG4gICAgICAgIGtpbmQ6IFB1c2hSdWxlS2luZC5VbmRlcnJpZGUsXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGFjdGlvbnM6IE5vdGlmaWNhdGlvblV0aWxzLmVuY29kZUFjdGlvbnMoe1xuICAgICAgICAgICAgbm90aWZ5OiB0cnVlLFxuICAgICAgICAgICAgc291bmQ6IG1vZGVsLnNvdW5kLmNhbGxzLFxuICAgICAgICB9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdGFuZGFyZFJ1bGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjb25jaWxlTm90aWZpY2F0aW9uU2V0dGluZ3MoXG4gICAgcHVzaFJ1bGVzOiBJUHVzaFJ1bGVzLFxuICAgIG1vZGVsOiBOb3RpZmljYXRpb25TZXR0aW5ncyxcbiAgICBzdXBwb3J0c0ludGVudGlvbmFsTWVudGlvbnM6IGJvb2xlYW4sXG4pOiBQdXNoUnVsZURpZmYge1xuICAgIGNvbnN0IGNoYW5nZXM6IFB1c2hSdWxlRGlmZiA9IHtcbiAgICAgICAgdXBkYXRlZDogW10sXG4gICAgICAgIGFkZGVkOiBbXSxcbiAgICAgICAgZGVsZXRlZDogW10sXG4gICAgfTtcblxuICAgIGNvbnN0IG9sZFJ1bGVzID0gYnVpbGRQdXNoUnVsZU1hcChwdXNoUnVsZXMpO1xuICAgIGNvbnN0IG5ld1J1bGVzID0gdG9TdGFuZGFyZFJ1bGVzKG1vZGVsLCBzdXBwb3J0c0ludGVudGlvbmFsTWVudGlvbnMpO1xuXG4gICAgZm9yIChjb25zdCBydWxlIG9mIG5ld1J1bGVzLnZhbHVlcygpKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsID0gb2xkUnVsZXMuZ2V0KHJ1bGUucnVsZV9pZCk7XG4gICAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGlmIChvcmlnaW5hbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlLmVuYWJsZWQgIT09IHVuZGVmaW5lZCAmJiBydWxlLmVuYWJsZWQgIT09IG9yaWdpbmFsLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHJ1bGUuYWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEFjdGlvbnMgPSBOb3RpZmljYXRpb25VdGlscy5kZWNvZGVBY3Rpb25zKG9yaWdpbmFsLmFjdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IE5vdGlmaWNhdGlvblV0aWxzLmRlY29kZUFjdGlvbnMocnVsZS5hY3Rpb25zKTtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbEFjdGlvbnMgPT09IG51bGwgfHwgYWN0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghZGVlcENvbXBhcmUoYWN0aW9ucywgb3JpZ2luYWxBY3Rpb25zKSkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICBjaGFuZ2VzLnVwZGF0ZWQucHVzaChydWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1lbnRpb25BY3Rpb25zID0gTm90aWZpY2F0aW9uVXRpbHMuZW5jb2RlQWN0aW9ucyh7XG4gICAgICAgIG5vdGlmeTogdHJ1ZSxcbiAgICAgICAgc291bmQ6IG1vZGVsLnNvdW5kLm1lbnRpb25zLFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgY29udGVudFJ1bGVzID0gcHVzaFJ1bGVzLmdsb2JhbC5jb250ZW50Py5maWx0ZXIoKHJ1bGUpID0+ICFydWxlLnJ1bGVfaWQuc3RhcnRzV2l0aChcIi5cIikpID8/IFtdO1xuICAgIGNvbnN0IG5ld0tleXdvcmRzID0gbmV3IFNldChtb2RlbC5rZXl3b3Jkcyk7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIGNvbnRlbnRSdWxlcykge1xuICAgICAgICBpZiAoIW5ld0tleXdvcmRzLmhhcyhydWxlLnBhdHRlcm4hKSkge1xuICAgICAgICAgICAgY2hhbmdlcy5kZWxldGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIHJ1bGVfaWQ6IHJ1bGUucnVsZV9pZCxcbiAgICAgICAgICAgICAgICBraW5kOiBQdXNoUnVsZUtpbmQuQ29udGVudFNwZWNpZmljLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHJ1bGUuZW5hYmxlZCAhPT0gbW9kZWwubWVudGlvbnMua2V5d29yZHMpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVsZS5hY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEFjdGlvbnMgPSBOb3RpZmljYXRpb25VdGlscy5kZWNvZGVBY3Rpb25zKHJ1bGUuYWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IE5vdGlmaWNhdGlvblV0aWxzLmRlY29kZUFjdGlvbnMobWVudGlvbkFjdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEFjdGlvbnMgPT09IG51bGwgfHwgYWN0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFkZWVwQ29tcGFyZShhY3Rpb25zLCBvcmlnaW5hbEFjdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlcy51cGRhdGVkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBydWxlX2lkOiBydWxlLnJ1bGVfaWQsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6IFB1c2hSdWxlS2luZC5Db250ZW50U3BlY2lmaWMsXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IG1vZGVsLm1lbnRpb25zLmtleXdvcmRzLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBtZW50aW9uQWN0aW9ucyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdLZXl3b3Jkcy5kZWxldGUocnVsZS5wYXR0ZXJuISk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5d29yZCBvZiBuZXdLZXl3b3Jkcykge1xuICAgICAgICBjaGFuZ2VzLmFkZGVkLnB1c2goe1xuICAgICAgICAgICAgcnVsZV9pZDoga2V5d29yZCxcbiAgICAgICAgICAgIGtpbmQ6IFB1c2hSdWxlS2luZC5Db250ZW50U3BlY2lmaWMsXG4gICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgIGVuYWJsZWQ6IG1vZGVsLm1lbnRpb25zLmtleXdvcmRzLFxuICAgICAgICAgICAgcGF0dGVybjoga2V5d29yZCxcbiAgICAgICAgICAgIGFjdGlvbnM6IG1lbnRpb25BY3Rpb25zLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hh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