UNPKG

matrix-react-sdk

Version:
159 lines (152 loc) 24.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildQuery = buildQuery; exports.getMentionAttributes = getMentionAttributes; exports.getMentionDisplayText = getMentionDisplayText; exports.getRoomFromCompletion = getRoomFromCompletion; var Avatar = _interopRequireWildcard(require("../../../../../Avatar")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /* 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. */ /** * Builds the query for the `<Autocomplete />` component from the rust suggestion. This * will change as we implement handling / commands. * * @param suggestion - represents if the rust model is tracking a potential mention * @returns an empty string if we can not generate a query, otherwise a query beginning * with @ for a user query, # for a room or space query */ function buildQuery(suggestion) { if (!suggestion || !suggestion.keyChar) { // if we have an empty key character, we do not build a query return ""; } return `${suggestion.keyChar}${suggestion.text}`; } /** * Find the room from the completion by looking it up using the client from the context * we are currently in * * @param completion - the completion from the autocomplete * @param client - the current client we are using * @returns a Room if one is found, null otherwise */ function getRoomFromCompletion(completion, client) { const roomId = completion.completionId; const aliasFromCompletion = completion.completion; let roomToReturn; // Not quite sure if the logic here makes sense - specifically calling .getRoom with an alias // that doesn't start with #, but keeping the logic the same as in PartCreator.roomPill for now if (roomId) { roomToReturn = client.getRoom(roomId); } else if (!aliasFromCompletion.startsWith("#")) { roomToReturn = client.getRoom(aliasFromCompletion); } else { roomToReturn = client.getRooms().find(r => { return r.getCanonicalAlias() === aliasFromCompletion || r.getAltAliases().includes(aliasFromCompletion); }); } return roomToReturn ?? null; } /** * Given an autocomplete suggestion, determine the text to display in the pill * * @param completion - the item selected from the autocomplete * @param client - the MatrixClient is required for us to look up the correct room mention text * @returns the text to display in the mention */ function getMentionDisplayText(completion, client) { if (completion.type === "user" || completion.type === "at-room") { return completion.completion; } else if (completion.type === "room") { // try and get the room and use it's name, if not available, fall back to // completion.completion return getRoomFromCompletion(completion, client)?.name || completion.completion; } return ""; } function getCSSProperties({ url, initialLetter, id = "" }) { const cssProperties = [`--avatar-background: url(${url})`, `--avatar-letter: '${initialLetter}'`]; const textColor = Avatar.getAvatarTextColor(id); if (textColor) { cssProperties.push(textColor); } return cssProperties.join("; "); } /** * For a given completion, the attributes will change depending on the completion type * * @param completion - the item selected from the autocomplete * @param client - the MatrixClient is required for us to look up the correct room mention text * @param room - the room the composer is currently in * @returns an object of attributes containing HTMLAnchor attributes or data-* attributes */ function getMentionAttributes(completion, client, room) { // To ensure that we always have something set in the --avatar-letter CSS variable // as otherwise alignment varies depending on whether the content is empty or not. // Use a zero width space so that it counts as content, but does not display anything. const defaultLetterContent = "\u200b"; const attributes = new Map(); if (completion.type === "user") { // logic as used in UserPillPart.setAvatar in parts.ts const mentionedMember = room.getMember(completion.completionId || ""); if (!mentionedMember) return attributes; const name = mentionedMember.name || mentionedMember.userId; const defaultAvatarUrl = Avatar.defaultAvatarUrlForString(mentionedMember.userId); const avatarUrl = Avatar.avatarUrlForMember(mentionedMember, 16, 16, "crop"); let initialLetter = defaultLetterContent; if (avatarUrl === defaultAvatarUrl) { initialLetter = Avatar.getInitialLetter(name) ?? defaultLetterContent; } attributes.set("data-mention-type", completion.type); attributes.set("style", getCSSProperties({ url: avatarUrl, initialLetter, id: mentionedMember.userId })); } else if (completion.type === "room") { // logic as used in RoomPillPart.setAvatar in parts.ts const mentionedRoom = getRoomFromCompletion(completion, client); const aliasFromCompletion = completion.completion; let initialLetter = defaultLetterContent; let avatarUrl = Avatar.avatarUrlForRoom(mentionedRoom ?? null, 16, 16, "crop"); if (!avatarUrl) { initialLetter = Avatar.getInitialLetter(mentionedRoom?.name || aliasFromCompletion) ?? defaultLetterContent; avatarUrl = Avatar.defaultAvatarUrlForString(mentionedRoom?.roomId ?? aliasFromCompletion); } attributes.set("data-mention-type", completion.type); attributes.set("style", getCSSProperties({ url: avatarUrl, initialLetter, id: mentionedRoom?.roomId ?? aliasFromCompletion })); } else if (completion.type === "at-room") { // logic as used in RoomPillPart.setAvatar in parts.ts, but now we know the current room // from the arguments passed let initialLetter = defaultLetterContent; let avatarUrl = Avatar.avatarUrlForRoom(room, 16, 16, "crop"); if (!avatarUrl) { initialLetter = Avatar.getInitialLetter(room.name) ?? defaultLetterContent; avatarUrl = Avatar.defaultAvatarUrlForString(room.roomId); } attributes.set("data-mention-type", completion.type); attributes.set("style", getCSSProperties({ url: avatarUrl, initialLetter, id: room.roomId })); } return attributes; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBdmF0YXIiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJidWlsZFF1ZXJ5Iiwic3VnZ2VzdGlvbiIsImtleUNoYXIiLCJ0ZXh0IiwiZ2V0Um9vbUZyb21Db21wbGV0aW9uIiwiY29tcGxldGlvbiIsImNsaWVudCIsInJvb21JZCIsImNvbXBsZXRpb25JZCIsImFsaWFzRnJvbUNvbXBsZXRpb24iLCJyb29tVG9SZXR1cm4iLCJnZXRSb29tIiwic3RhcnRzV2l0aCIsImdldFJvb21zIiwiZmluZCIsImdldENhbm9uaWNhbEFsaWFzIiwiZ2V0QWx0QWxpYXNlcyIsImluY2x1ZGVzIiwiZ2V0TWVudGlvbkRpc3BsYXlUZXh0IiwidHlwZSIsIm5hbWUiLCJnZXRDU1NQcm9wZXJ0aWVzIiwidXJsIiwiaW5pdGlhbExldHRlciIsImlkIiwiY3NzUHJvcGVydGllcyIsInRleHRDb2xvciIsImdldEF2YXRhclRleHRDb2xvciIsInB1c2giLCJqb2luIiwiZ2V0TWVudGlvbkF0dHJpYnV0ZXMiLCJyb29tIiwiZGVmYXVsdExldHRlckNvbnRlbnQiLCJhdHRyaWJ1dGVzIiwiTWFwIiwibWVudGlvbmVkTWVtYmVyIiwiZ2V0TWVtYmVyIiwidXNlcklkIiwiZGVmYXVsdEF2YXRhclVybCIsImRlZmF1bHRBdmF0YXJVcmxGb3JTdHJpbmciLCJhdmF0YXJVcmwiLCJhdmF0YXJVcmxGb3JNZW1iZXIiLCJnZXRJbml0aWFsTGV0dGVyIiwibWVudGlvbmVkUm9vbSIsImF2YXRhclVybEZvclJvb20iXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9yb29tcy93eXNpd3lnX2NvbXBvc2VyL3V0aWxzL2F1dG9jb21wbGV0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMyBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBBbGxvd2VkTWVudGlvbkF0dHJpYnV0ZXMsIE1hcHBlZFN1Z2dlc3Rpb24gfSBmcm9tIFwiQHZlY3Rvci1pbS9tYXRyaXgtd3lzaXd5Z1wiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50LCBSb29tIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgeyBJQ29tcGxldGlvbiB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hdXRvY29tcGxldGUvQXV0b2NvbXBsZXRlclwiO1xuaW1wb3J0ICogYXMgQXZhdGFyIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9BdmF0YXJcIjtcblxuLyoqXG4gKiBCdWlsZHMgdGhlIHF1ZXJ5IGZvciB0aGUgYDxBdXRvY29tcGxldGUgLz5gIGNvbXBvbmVudCBmcm9tIHRoZSBydXN0IHN1Z2dlc3Rpb24uIFRoaXNcbiAqIHdpbGwgY2hhbmdlIGFzIHdlIGltcGxlbWVudCBoYW5kbGluZyAvIGNvbW1hbmRzLlxuICpcbiAqIEBwYXJhbSBzdWdnZXN0aW9uICAtIHJlcHJlc2VudHMgaWYgdGhlIHJ1c3QgbW9kZWwgaXMgdHJhY2tpbmcgYSBwb3RlbnRpYWwgbWVudGlvblxuICogQHJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIHdlIGNhbiBub3QgZ2VuZXJhdGUgYSBxdWVyeSwgb3RoZXJ3aXNlIGEgcXVlcnkgYmVnaW5uaW5nXG4gKiB3aXRoIEAgZm9yIGEgdXNlciBxdWVyeSwgIyBmb3IgYSByb29tIG9yIHNwYWNlIHF1ZXJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFF1ZXJ5KHN1Z2dlc3Rpb246IE1hcHBlZFN1Z2dlc3Rpb24gfCBudWxsKTogc3RyaW5nIHtcbiAgICBpZiAoIXN1Z2dlc3Rpb24gfHwgIXN1Z2dlc3Rpb24ua2V5Q2hhcikge1xuICAgICAgICAvLyBpZiB3ZSBoYXZlIGFuIGVtcHR5IGtleSBjaGFyYWN0ZXIsIHdlIGRvIG5vdCBidWlsZCBhIHF1ZXJ5XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtzdWdnZXN0aW9uLmtleUNoYXJ9JHtzdWdnZXN0aW9uLnRleHR9YDtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSByb29tIGZyb20gdGhlIGNvbXBsZXRpb24gYnkgbG9va2luZyBpdCB1cCB1c2luZyB0aGUgY2xpZW50IGZyb20gdGhlIGNvbnRleHRcbiAqIHdlIGFyZSBjdXJyZW50bHkgaW5cbiAqXG4gKiBAcGFyYW0gY29tcGxldGlvbiAtIHRoZSBjb21wbGV0aW9uIGZyb20gdGhlIGF1dG9jb21wbGV0ZVxuICogQHBhcmFtIGNsaWVudCAtIHRoZSBjdXJyZW50IGNsaWVudCB3ZSBhcmUgdXNpbmdcbiAqIEByZXR1cm5zIGEgUm9vbSBpZiBvbmUgaXMgZm91bmQsIG51bGwgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb29tRnJvbUNvbXBsZXRpb24oY29tcGxldGlvbjogSUNvbXBsZXRpb24sIGNsaWVudDogTWF0cml4Q2xpZW50KTogUm9vbSB8IG51bGwge1xuICAgIGNvbnN0IHJvb21JZCA9IGNvbXBsZXRpb24uY29tcGxldGlvbklkO1xuICAgIGNvbnN0IGFsaWFzRnJvbUNvbXBsZXRpb24gPSBjb21wbGV0aW9uLmNvbXBsZXRpb247XG5cbiAgICBsZXQgcm9vbVRvUmV0dXJuOiBSb29tIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAgIC8vIE5vdCBxdWl0ZSBzdXJlIGlmIHRoZSBsb2dpYyBoZXJlIG1ha2VzIHNlbnNlIC0gc3BlY2lmaWNhbGx5IGNhbGxpbmcgLmdldFJvb20gd2l0aCBhbiBhbGlhc1xuICAgIC8vIHRoYXQgZG9lc24ndCBzdGFydCB3aXRoICMsIGJ1dCBrZWVwaW5nIHRoZSBsb2dpYyB0aGUgc2FtZSBhcyBpbiBQYXJ0Q3JlYXRvci5yb29tUGlsbCBmb3Igbm93XG4gICAgaWYgKHJvb21JZCkge1xuICAgICAgICByb29tVG9SZXR1cm4gPSBjbGllbnQuZ2V0Um9vbShyb29tSWQpO1xuICAgIH0gZWxzZSBpZiAoIWFsaWFzRnJvbUNvbXBsZXRpb24uc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgICAgcm9vbVRvUmV0dXJuID0gY2xpZW50LmdldFJvb20oYWxpYXNGcm9tQ29tcGxldGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcm9vbVRvUmV0dXJuID0gY2xpZW50LmdldFJvb21zKCkuZmluZCgocikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHIuZ2V0Q2Fub25pY2FsQWxpYXMoKSA9PT0gYWxpYXNGcm9tQ29tcGxldGlvbiB8fCByLmdldEFsdEFsaWFzZXMoKS5pbmNsdWRlcyhhbGlhc0Zyb21Db21wbGV0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvb21Ub1JldHVybiA/PyBudWxsO1xufVxuXG4vKipcbiAqIEdpdmVuIGFuIGF1dG9jb21wbGV0ZSBzdWdnZXN0aW9uLCBkZXRlcm1pbmUgdGhlIHRleHQgdG8gZGlzcGxheSBpbiB0aGUgcGlsbFxuICpcbiAqIEBwYXJhbSBjb21wbGV0aW9uIC0gdGhlIGl0ZW0gc2VsZWN0ZWQgZnJvbSB0aGUgYXV0b2NvbXBsZXRlXG4gKiBAcGFyYW0gY2xpZW50IC0gdGhlIE1hdHJpeENsaWVudCBpcyByZXF1aXJlZCBmb3IgdXMgdG8gbG9vayB1cCB0aGUgY29ycmVjdCByb29tIG1lbnRpb24gdGV4dFxuICogQHJldHVybnMgdGhlIHRleHQgdG8gZGlzcGxheSBpbiB0aGUgbWVudGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVudGlvbkRpc3BsYXlUZXh0KGNvbXBsZXRpb246IElDb21wbGV0aW9uLCBjbGllbnQ6IE1hdHJpeENsaWVudCk6IHN0cmluZyB7XG4gICAgaWYgKGNvbXBsZXRpb24udHlwZSA9PT0gXCJ1c2VyXCIgfHwgY29tcGxldGlvbi50eXBlID09PSBcImF0LXJvb21cIikge1xuICAgICAgICByZXR1cm4gY29tcGxldGlvbi5jb21wbGV0aW9uO1xuICAgIH0gZWxzZSBpZiAoY29tcGxldGlvbi50eXBlID09PSBcInJvb21cIikge1xuICAgICAgICAvLyB0cnkgYW5kIGdldCB0aGUgcm9vbSBhbmQgdXNlIGl0J3MgbmFtZSwgaWYgbm90IGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvXG4gICAgICAgIC8vIGNvbXBsZXRpb24uY29tcGxldGlvblxuICAgICAgICByZXR1cm4gZ2V0Um9vbUZyb21Db21wbGV0aW9uKGNvbXBsZXRpb24sIGNsaWVudCk/Lm5hbWUgfHwgY29tcGxldGlvbi5jb21wbGV0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbn1cblxuZnVuY3Rpb24gZ2V0Q1NTUHJvcGVydGllcyh7XG4gICAgdXJsLFxuICAgIGluaXRpYWxMZXR0ZXIsXG4gICAgaWQgPSBcIlwiLFxufToge1xuICAgIHVybDogc3RyaW5nO1xuICAgIGluaXRpYWxMZXR0ZXI/OiBzdHJpbmc7XG4gICAgaWQ6IHN0cmluZztcbn0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXMgPSBbYC0tYXZhdGFyLWJhY2tncm91bmQ6IHVybCgke3VybH0pYCwgYC0tYXZhdGFyLWxldHRlcjogJyR7aW5pdGlhbExldHRlcn0nYF07XG5cbiAgICBjb25zdCB0ZXh0Q29sb3IgPSBBdmF0YXIuZ2V0QXZhdGFyVGV4dENvbG9yKGlkKTtcbiAgICBpZiAodGV4dENvbG9yKSB7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCh0ZXh0Q29sb3IpO1xuICAgIH1cblxuICAgIHJldHVybiBjc3NQcm9wZXJ0aWVzLmpvaW4oXCI7IFwiKTtcbn1cblxuLyoqXG4gKiBGb3IgYSBnaXZlbiBjb21wbGV0aW9uLCB0aGUgYXR0cmlidXRlcyB3aWxsIGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIGNvbXBsZXRpb24gdHlwZVxuICpcbiAqIEBwYXJhbSBjb21wbGV0aW9uIC0gdGhlIGl0ZW0gc2VsZWN0ZWQgZnJvbSB0aGUgYXV0b2NvbXBsZXRlXG4gKiBAcGFyYW0gY2xpZW50IC0gdGhlIE1hdHJpeENsaWVudCBpcyByZXF1aXJlZCBmb3IgdXMgdG8gbG9vayB1cCB0aGUgY29ycmVjdCByb29tIG1lbnRpb24gdGV4dFxuICogQHBhcmFtIHJvb20gLSB0aGUgcm9vbSB0aGUgY29tcG9zZXIgaXMgY3VycmVudGx5IGluXG4gKiBAcmV0dXJucyBhbiBvYmplY3Qgb2YgYXR0cmlidXRlcyBjb250YWluaW5nIEhUTUxBbmNob3IgYXR0cmlidXRlcyBvciBkYXRhLSogYXR0cmlidXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVudGlvbkF0dHJpYnV0ZXMoXG4gICAgY29tcGxldGlvbjogSUNvbXBsZXRpb24sXG4gICAgY2xpZW50OiBNYXRyaXhDbGllbnQsXG4gICAgcm9vbTogUm9vbSxcbik6IEFsbG93ZWRNZW50aW9uQXR0cmlidXRlcyB7XG4gICAgLy8gVG8gZW5zdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgc29tZXRoaW5nIHNldCBpbiB0aGUgLS1hdmF0YXItbGV0dGVyIENTUyB2YXJpYWJsZVxuICAgIC8vIGFzIG90aGVyd2lzZSBhbGlnbm1lbnQgdmFyaWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjb250ZW50IGlzIGVtcHR5IG9yIG5vdC5cbiAgICAvLyBVc2UgYSB6ZXJvIHdpZHRoIHNwYWNlIHNvIHRoYXQgaXQgY291bnRzIGFzIGNvbnRlbnQsIGJ1dCBkb2VzIG5vdCBkaXNwbGF5IGFueXRoaW5nLlxuICAgIGNvbnN0IGRlZmF1bHRMZXR0ZXJDb250ZW50ID0gXCJcXHUyMDBiXCI7XG4gICAgY29uc3QgYXR0cmlidXRlczogQWxsb3dlZE1lbnRpb25BdHRyaWJ1dGVzID0gbmV3IE1hcCgpO1xuXG4gICAgaWYgKGNvbXBsZXRpb24udHlwZSA9PT0gXCJ1c2VyXCIpIHtcbiAgICAgICAgLy8gbG9naWMgYXMgdXNlZCBpbiBVc2VyUGlsbFBhcnQuc2V0QXZhdGFyIGluIHBhcnRzLnRzXG4gICAgICAgIGNvbnN0IG1lbnRpb25lZE1lbWJlciA9IHJvb20uZ2V0TWVtYmVyKGNvbXBsZXRpb24uY29tcGxldGlvbklkIHx8IFwiXCIpO1xuXG4gICAgICAgIGlmICghbWVudGlvbmVkTWVtYmVyKSByZXR1cm4gYXR0cmlidXRlcztcblxuICAgICAgICBjb25zdCBuYW1lID0gbWVudGlvbmVkTWVtYmVyLm5hbWUgfHwgbWVudGlvbmVkTWVtYmVyLnVzZXJJZDtcbiAgICAgICAgY29uc3QgZGVmYXVsdEF2YXRhclVybCA9IEF2YXRhci5kZWZhdWx0QXZhdGFyVXJsRm9yU3RyaW5nKG1lbnRpb25lZE1lbWJlci51c2VySWQpO1xuICAgICAgICBjb25zdCBhdmF0YXJVcmwgPSBBdmF0YXIuYXZhdGFyVXJsRm9yTWVtYmVyKG1lbnRpb25lZE1lbWJlciwgMTYsIDE2LCBcImNyb3BcIik7XG4gICAgICAgIGxldCBpbml0aWFsTGV0dGVyID0gZGVmYXVsdExldHRlckNvbnRlbnQ7XG4gICAgICAgIGlmIChhdmF0YXJVcmwgPT09IGRlZmF1bHRBdmF0YXJVcmwpIHtcbiAgICAgICAgICAgIGluaXRpYWxMZXR0ZXIgPSBBdmF0YXIuZ2V0SW5pdGlhbExldHRlcihuYW1lKSA/PyBkZWZhdWx0TGV0dGVyQ29udGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZXMuc2V0KFwiZGF0YS1tZW50aW9uLXR5cGVcIiwgY29tcGxldGlvbi50eXBlKTtcbiAgICAgICAgYXR0cmlidXRlcy5zZXQoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBnZXRDU1NQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICB1cmw6IGF2YXRhclVybCxcbiAgICAgICAgICAgICAgICBpbml0aWFsTGV0dGVyLFxuICAgICAgICAgICAgICAgIGlkOiBtZW50aW9uZWRNZW1iZXIudXNlcklkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjb21wbGV0aW9uLnR5cGUgPT09IFwicm9vbVwiKSB7XG4gICAgICAgIC8vIGxvZ2ljIGFzIHVzZWQgaW4gUm9vbVBpbGxQYXJ0LnNldEF2YXRhciBpbiBwYXJ0cy50c1xuICAgICAgICBjb25zdCBtZW50aW9uZWRSb29tID0gZ2V0Um9vbUZyb21Db21wbGV0aW9uKGNvbXBsZXRpb24sIGNsaWVudCk7XG4gICAgICAgIGNvbnN0IGFsaWFzRnJvbUNvbXBsZXRpb24gPSBjb21wbGV0aW9uLmNvbXBsZXRpb247XG5cbiAgICAgICAgbGV0IGluaXRpYWxMZXR0ZXIgPSBkZWZhdWx0TGV0dGVyQ29udGVudDtcbiAgICAgICAgbGV0IGF2YXRhclVybCA9IEF2YXRhci5hdmF0YXJVcmxGb3JSb29tKG1lbnRpb25lZFJvb20gPz8gbnVsbCwgMTYsIDE2LCBcImNyb3BcIik7XG4gICAgICAgIGlmICghYXZhdGFyVXJsKSB7XG4gICAgICAgICAgICBpbml0aWFsTGV0dGVyID0gQXZhdGFyLmdldEluaXRpYWxMZXR0ZXIobWVudGlvbmVkUm9vbT8ubmFtZSB8fCBhbGlhc0Zyb21Db21wbGV0aW9uKSA/PyBkZWZhdWx0TGV0dGVyQ29udGVudDtcbiAgICAgICAgICAgIGF2YXRhclVybCA9IEF2YXRhci5kZWZhdWx0QXZhdGFyVXJsRm9yU3RyaW5nKG1lbnRpb25lZFJvb20/LnJvb21JZCA/PyBhbGlhc0Zyb21Db21wbGV0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZXMuc2V0KFwiZGF0YS1tZW50aW9uLXR5cGVcIiwgY29tcGxldGlvbi50eXBlKTtcbiAgICAgICAgYXR0cmlidXRlcy5zZXQoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBnZXRDU1NQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICB1cmw6IGF2YXRhclVybCxcbiAgICAgICAgICAgICAgICBpbml0aWFsTGV0dGVyLFxuICAgICAgICAgICAgICAgIGlkOiBtZW50aW9uZWRSb29tPy5yb29tSWQgPz8gYWxpYXNGcm9tQ29tcGxldGlvbixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZiAoY29tcGxldGlvbi50eXBlID09PSBcImF0LXJvb21cIikge1xuICAgICAgICAvLyBsb2dpYyBhcyB1c2VkIGluIFJvb21QaWxsUGFydC5zZXRBdmF0YXIgaW4gcGFydHMudHMsIGJ1dCBub3cgd2Uga25vdyB0aGUgY3VycmVudCByb29tXG4gICAgICAgIC8vIGZyb20gdGhlIGFyZ3VtZW50cyBwYXNzZWRcbiAgICAgICAgbGV0IGluaXRpYWxMZXR0ZXIgPSBkZWZhdWx0TGV0dGVyQ29udGVudDtcbiAgICAgICAgbGV0IGF2YXRhclVybCA9IEF2YXRhci5hdmF0YXJVcmxGb3JSb29tKHJvb20sIDE2LCAxNiwgXCJjcm9wXCIpO1xuXG4gICAgICAgIGlmICghYXZhdGFyVXJsKSB7XG4gICAgICAgICAgICBpbml0aWFsTGV0dGVyID0gQXZhdGFyLmdldEluaXRpYWxMZXR0ZXIocm9vbS5uYW1lKSA/PyBkZWZhdWx0TGV0dGVyQ29udGVudDtcbiAgICAgICAgICAgIGF2YXRhclVybCA9IEF2YXRhci5kZWZhdWx0QXZhdGFyVXJsRm9yU3RyaW5nKHJvb20ucm9vbUlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZXMuc2V0KFwiZGF0YS1tZW50aW9uLXR5cGVcIiwgY29tcGxldGlvbi50eXBlKTtcbiAgICAgICAgYXR0cmlidXRlcy5zZXQoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBnZXRDU1NQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICB1cmw6IGF2YXRhclVybCxcbiAgICAgICAgICAgICAgICBpbml0aWFsTGV0dGVyLFxuICAgICAgICAgICAgICAgIGlkOiByb29tLnJvb21JZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFBZ0QsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQUgsd0JBQUFHLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxXQUFBSyxPQUFBLEVBQUFMLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFQLENBQUEsT0FBQVEsQ0FBQSxLQUFBQyxTQUFBLFVBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsQ0FBQSxJQUFBZCxDQUFBLG9CQUFBYyxDQUFBLE9BQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBaEIsQ0FBQSxFQUFBYyxDQUFBLFNBQUFHLENBQUEsR0FBQVAsQ0FBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFiLENBQUEsRUFBQWMsQ0FBQSxVQUFBRyxD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