matrix-react-sdk
Version:
SDK for matrix.org using React
151 lines (148 loc) • 28.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
var _cryptoApi = require("matrix-js-sdk/src/crypto-api");
var _logger = require("matrix-js-sdk/src/logger");
var _EncryptionInfo = _interopRequireDefault(require("./EncryptionInfo"));
var _VerificationPanel = _interopRequireDefault(require("./VerificationPanel"));
var _createRoom = require("../../../createRoom");
var _useEventEmitter = require("../../../hooks/useEventEmitter");
var _Modal = _interopRequireDefault(require("../../../Modal"));
var _languageHandler = require("../../../languageHandler");
var _RightPanelStorePhases = require("../../../stores/right-panel/RightPanelStorePhases");
var _RightPanelStore = _interopRequireDefault(require("../../../stores/right-panel/RightPanelStore"));
var _ErrorDialog = _interopRequireDefault(require("../dialogs/ErrorDialog"));
var _MatrixClientContext = require("../../../contexts/MatrixClientContext");
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 2019, 2020 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.
*/
// cancellation codes which constitute a key mismatch
const MISMATCHES = ["m.key_mismatch", "m.user_error", "m.mismatched_sas"];
const EncryptionPanel = props => {
const cli = (0, _MatrixClientContext.useMatrixClientContext)();
const {
verificationRequest,
verificationRequestPromise,
member,
onClose,
layout,
isRoomEncrypted
} = props;
const [request, setRequest] = (0, _react.useState)(verificationRequest);
// state to show a spinner immediately after clicking "start verification",
// before we have a request
const [isRequesting, setRequesting] = (0, _react.useState)(false);
const [phase, doSetPhase] = (0, _react.useState)(request?.phase);
const setPhase = phase => {
_logger.logger.debug(`EncryptionPanel: phase now ${phase === undefined ? phase : _cryptoApi.VerificationPhase[phase]}`);
doSetPhase(phase);
};
(0, _react.useEffect)(() => {
setRequest(verificationRequest);
if (verificationRequest) {
setRequesting(false);
setPhase(verificationRequest.phase);
}
}, [verificationRequest]);
(0, _react.useEffect)(() => {
async function awaitPromise() {
setRequesting(true);
const requestFromPromise = await verificationRequestPromise;
setRequesting(false);
setRequest(requestFromPromise);
setPhase(requestFromPromise?.phase);
}
if (verificationRequestPromise) {
awaitPromise();
}
}, [verificationRequestPromise]);
// Use a ref to track whether we are already showing the mismatch modal as state may not update fast enough
// if two change events are fired in quick succession like can happen with rust crypto.
const isShowingMismatchModal = (0, _react.useRef)(false);
const changeHandler = (0, _react.useCallback)(() => {
// handle transitions -> cancelled for mismatches which fire a modal instead of showing a card
if (!isShowingMismatchModal.current && request?.phase === _cryptoApi.VerificationPhase.Cancelled && MISMATCHES.includes(request.cancellationCode ?? "")) {
isShowingMismatchModal.current = true;
_Modal.default.createDialog(_ErrorDialog.default, {
headerImage: require("../../../../res/img/e2e/warning-deprecated.svg").default,
title: (0, _languageHandler._t)("encryption|messages_not_secure|title"),
description: /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("encryption|messages_not_secure|heading"), /*#__PURE__*/_react.default.createElement("ul", null, /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("encryption|messages_not_secure|cause_1")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("encryption|messages_not_secure|cause_2")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("encryption|messages_not_secure|cause_3")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("encryption|messages_not_secure|cause_4")))),
onFinished: onClose
});
return; // don't update phase here as we will be transitioning away from this view shortly
}
if (request) {
setPhase(request.phase);
}
}, [onClose, request]);
(0, _useEventEmitter.useTypedEventEmitter)(request, _cryptoApi.VerificationRequestEvent.Change, changeHandler);
const onStartVerification = (0, _react.useCallback)(async () => {
setRequesting(true);
let verificationRequest_;
try {
const roomId = await (0, _createRoom.ensureDMExists)(cli, member.userId);
if (!roomId) {
throw new Error("Unable to create Room for verification");
}
verificationRequest_ = await cli.getCrypto().requestVerificationDM(member.userId, roomId);
} catch (e) {
console.error("Error starting verification", e);
setRequesting(false);
_Modal.default.createDialog(_ErrorDialog.default, {
headerImage: require("../../../../res/img/e2e/warning.svg").default,
title: (0, _languageHandler._t)("encryption|verification|error_starting_title"),
description: (0, _languageHandler._t)("encryption|verification|error_starting_description")
});
return;
}
setRequest(verificationRequest_);
setPhase(verificationRequest_.phase);
// Notify the RightPanelStore about this
if (_RightPanelStore.default.instance.currentCard.phase != _RightPanelStorePhases.RightPanelPhases.EncryptionPanel) {
_RightPanelStore.default.instance.pushCard({
phase: _RightPanelStorePhases.RightPanelPhases.EncryptionPanel,
state: {
member,
verificationRequest: verificationRequest_
}
});
}
if (!_RightPanelStore.default.instance.isOpen) _RightPanelStore.default.instance.togglePanel(null);
}, [cli, member]);
const requested = !request && isRequesting || !!request && (phase === _cryptoApi.VerificationPhase.Requested || phase === _cryptoApi.VerificationPhase.Unsent || phase === undefined);
const isSelfVerification = request ? request.isSelfVerification : member.userId === cli.getUserId();
if (!request || requested) {
const initiatedByMe = !request && isRequesting || !!request && request.initiatedByMe;
return /*#__PURE__*/_react.default.createElement(_EncryptionInfo.default, {
isRoomEncrypted: isRoomEncrypted,
onStartVerification: onStartVerification,
member: member,
isSelfVerification: isSelfVerification,
waitingForOtherParty: requested && initiatedByMe,
waitingForNetwork: requested && !initiatedByMe,
inDialog: layout === "dialog"
});
} else {
return /*#__PURE__*/_react.default.createElement(_VerificationPanel.default, {
isRoomEncrypted: isRoomEncrypted,
layout: layout,
onClose: onClose,
member: member,
request: request,
key: request.transactionId,
inDialog: layout === "dialog",
phase: phase
});
}
};
var _default = exports.default = EncryptionPanel;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY3J5cHRvQXBpIiwiX2xvZ2dlciIsIl9FbmNyeXB0aW9uSW5mbyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfVmVyaWZpY2F0aW9uUGFuZWwiLCJfY3JlYXRlUm9vbSIsIl91c2VFdmVudEVtaXR0ZXIiLCJfTW9kYWwiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX1JpZ2h0UGFuZWxTdG9yZVBoYXNlcyIsIl9SaWdodFBhbmVsU3RvcmUiLCJfRXJyb3JEaWFsb2ciLCJfTWF0cml4Q2xpZW50Q29udGV4dCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIk1JU01BVENIRVMiLCJFbmNyeXB0aW9uUGFuZWwiLCJwcm9wcyIsImNsaSIsInVzZU1hdHJpeENsaWVudENvbnRleHQiLCJ2ZXJpZmljYXRpb25SZXF1ZXN0IiwidmVyaWZpY2F0aW9uUmVxdWVzdFByb21pc2UiLCJtZW1iZXIiLCJvbkNsb3NlIiwibGF5b3V0IiwiaXNSb29tRW5jcnlwdGVkIiwicmVxdWVzdCIsInNldFJlcXVlc3QiLCJ1c2VTdGF0ZSIsImlzUmVxdWVzdGluZyIsInNldFJlcXVlc3RpbmciLCJwaGFzZSIsImRvU2V0UGhhc2UiLCJzZXRQaGFzZSIsImxvZ2dlciIsImRlYnVnIiwidW5kZWZpbmVkIiwiVmVyaWZpY2F0aW9uUGhhc2UiLCJ1c2VFZmZlY3QiLCJhd2FpdFByb21pc2UiLCJyZXF1ZXN0RnJvbVByb21pc2UiLCJpc1Nob3dpbmdNaXNtYXRjaE1vZGFsIiwidXNlUmVmIiwiY2hhbmdlSGFuZGxlciIsInVzZUNhbGxiYWNrIiwiY3VycmVudCIsIkNhbmNlbGxlZCIsImluY2x1ZGVzIiwiY2FuY2VsbGF0aW9uQ29kZSIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwiRXJyb3JEaWFsb2ciLCJoZWFkZXJJbWFnZSIsInRpdGxlIiwiX3QiLCJkZXNjcmlwdGlvbiIsImNyZWF0ZUVsZW1lbnQiLCJvbkZpbmlzaGVkIiwidXNlVHlwZWRFdmVudEVtaXR0ZXIiLCJWZXJpZmljYXRpb25SZXF1ZXN0RXZlbnQiLCJDaGFuZ2UiLCJvblN0YXJ0VmVyaWZpY2F0aW9uIiwidmVyaWZpY2F0aW9uUmVxdWVzdF8iLCJyb29tSWQiLCJlbnN1cmVETUV4aXN0cyIsInVzZXJJZCIsIkVycm9yIiwiZ2V0Q3J5cHRvIiwicmVxdWVzdFZlcmlmaWNhdGlvbkRNIiwiY29uc29sZSIsImVycm9yIiwiUmlnaHRQYW5lbFN0b3JlIiwiaW5zdGFuY2UiLCJjdXJyZW50Q2FyZCIsIlJpZ2h0UGFuZWxQaGFzZXMiLCJwdXNoQ2FyZCIsInN0YXRlIiwiaXNPcGVuIiwidG9nZ2xlUGFuZWwiLCJyZXF1ZXN0ZWQiLCJSZXF1ZXN0ZWQiLCJVbnNlbnQiLCJpc1NlbGZWZXJpZmljYXRpb24iLCJnZXRVc2VySWQiLCJpbml0aWF0ZWRCeU1lIiwid2FpdGluZ0Zvck90aGVyUGFydHkiLCJ3YWl0aW5nRm9yTmV0d29yayIsImluRGlhbG9nIiwia2V5IiwidHJhbnNhY3Rpb25JZCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3JpZ2h0X3BhbmVsL0VuY3J5cHRpb25QYW5lbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTksIDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZlcmlmaWNhdGlvblBoYXNlLCBWZXJpZmljYXRpb25SZXF1ZXN0LCBWZXJpZmljYXRpb25SZXF1ZXN0RXZlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvY3J5cHRvLWFwaVwiO1xuaW1wb3J0IHsgUm9vbU1lbWJlciwgVXNlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IEVuY3J5cHRpb25JbmZvIGZyb20gXCIuL0VuY3J5cHRpb25JbmZvXCI7XG5pbXBvcnQgVmVyaWZpY2F0aW9uUGFuZWwgZnJvbSBcIi4vVmVyaWZpY2F0aW9uUGFuZWxcIjtcbmltcG9ydCB7IGVuc3VyZURNRXhpc3RzIH0gZnJvbSBcIi4uLy4uLy4uL2NyZWF0ZVJvb21cIjtcbmltcG9ydCB7IHVzZVR5cGVkRXZlbnRFbWl0dGVyIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZUV2ZW50RW1pdHRlclwiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBSaWdodFBhbmVsUGhhc2VzIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9yaWdodC1wYW5lbC9SaWdodFBhbmVsU3RvcmVQaGFzZXNcIjtcbmltcG9ydCBSaWdodFBhbmVsU3RvcmUgZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9yaWdodC1wYW5lbC9SaWdodFBhbmVsU3RvcmVcIjtcbmltcG9ydCBFcnJvckRpYWxvZyBmcm9tIFwiLi4vZGlhbG9ncy9FcnJvckRpYWxvZ1wiO1xuaW1wb3J0IHsgdXNlTWF0cml4Q2xpZW50Q29udGV4dCB9IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5cbi8vIGNhbmNlbGxhdGlvbiBjb2RlcyB3aGljaCBjb25zdGl0dXRlIGEga2V5IG1pc21hdGNoXG5jb25zdCBNSVNNQVRDSEVTID0gW1wibS5rZXlfbWlzbWF0Y2hcIiwgXCJtLnVzZXJfZXJyb3JcIiwgXCJtLm1pc21hdGNoZWRfc2FzXCJdO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICBtZW1iZXI6IFJvb21NZW1iZXIgfCBVc2VyO1xuICAgIG9uQ2xvc2U6ICgpID0+IHZvaWQ7XG4gICAgdmVyaWZpY2F0aW9uUmVxdWVzdD86IFZlcmlmaWNhdGlvblJlcXVlc3Q7XG4gICAgdmVyaWZpY2F0aW9uUmVxdWVzdFByb21pc2U/OiBQcm9taXNlPFZlcmlmaWNhdGlvblJlcXVlc3Q+O1xuICAgIGxheW91dDogc3RyaW5nO1xuICAgIGlzUm9vbUVuY3J5cHRlZDogYm9vbGVhbjtcbn1cblxuY29uc3QgRW5jcnlwdGlvblBhbmVsOiBSZWFjdC5GQzxJUHJvcHM+ID0gKHByb3BzOiBJUHJvcHMpID0+IHtcbiAgICBjb25zdCBjbGkgPSB1c2VNYXRyaXhDbGllbnRDb250ZXh0KCk7XG4gICAgY29uc3QgeyB2ZXJpZmljYXRpb25SZXF1ZXN0LCB2ZXJpZmljYXRpb25SZXF1ZXN0UHJvbWlzZSwgbWVtYmVyLCBvbkNsb3NlLCBsYXlvdXQsIGlzUm9vbUVuY3J5cHRlZCB9ID0gcHJvcHM7XG4gICAgY29uc3QgW3JlcXVlc3QsIHNldFJlcXVlc3RdID0gdXNlU3RhdGUodmVyaWZpY2F0aW9uUmVxdWVzdCk7XG4gICAgLy8gc3RhdGUgdG8gc2hvdyBhIHNwaW5uZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgY2xpY2tpbmcgXCJzdGFydCB2ZXJpZmljYXRpb25cIixcbiAgICAvLyBiZWZvcmUgd2UgaGF2ZSBhIHJlcXVlc3RcbiAgICBjb25zdCBbaXNSZXF1ZXN0aW5nLCBzZXRSZXF1ZXN0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbcGhhc2UsIGRvU2V0UGhhc2VdID0gdXNlU3RhdGUocmVxdWVzdD8ucGhhc2UpO1xuICAgIGNvbnN0IHNldFBoYXNlID0gKHBoYXNlOiBWZXJpZmljYXRpb25QaGFzZSB8IHVuZGVmaW5lZCk6IHZvaWQgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEVuY3J5cHRpb25QYW5lbDogcGhhc2Ugbm93ICR7cGhhc2UgPT09IHVuZGVmaW5lZCA/IHBoYXNlIDogVmVyaWZpY2F0aW9uUGhhc2VbcGhhc2VdfWApO1xuICAgICAgICBkb1NldFBoYXNlKHBoYXNlKTtcbiAgICB9O1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc2V0UmVxdWVzdCh2ZXJpZmljYXRpb25SZXF1ZXN0KTtcbiAgICAgICAgaWYgKHZlcmlmaWNhdGlvblJlcXVlc3QpIHtcbiAgICAgICAgICAgIHNldFJlcXVlc3RpbmcoZmFsc2UpO1xuICAgICAgICAgICAgc2V0UGhhc2UodmVyaWZpY2F0aW9uUmVxdWVzdC5waGFzZSk7XG4gICAgICAgIH1cbiAgICB9LCBbdmVyaWZpY2F0aW9uUmVxdWVzdF0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gYXdhaXRQcm9taXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgc2V0UmVxdWVzdGluZyh0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RGcm9tUHJvbWlzZSA9IGF3YWl0IHZlcmlmaWNhdGlvblJlcXVlc3RQcm9taXNlO1xuICAgICAgICAgICAgc2V0UmVxdWVzdGluZyhmYWxzZSk7XG4gICAgICAgICAgICBzZXRSZXF1ZXN0KHJlcXVlc3RGcm9tUHJvbWlzZSk7XG4gICAgICAgICAgICBzZXRQaGFzZShyZXF1ZXN0RnJvbVByb21pc2U/LnBoYXNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmVyaWZpY2F0aW9uUmVxdWVzdFByb21pc2UpIHtcbiAgICAgICAgICAgIGF3YWl0UHJvbWlzZSgpO1xuICAgICAgICB9XG4gICAgfSwgW3ZlcmlmaWNhdGlvblJlcXVlc3RQcm9taXNlXSk7XG4gICAgLy8gVXNlIGEgcmVmIHRvIHRyYWNrIHdoZXRoZXIgd2UgYXJlIGFscmVhZHkgc2hvd2luZyB0aGUgbWlzbWF0Y2ggbW9kYWwgYXMgc3RhdGUgbWF5IG5vdCB1cGRhdGUgZmFzdCBlbm91Z2hcbiAgICAvLyBpZiB0d28gY2hhbmdlIGV2ZW50cyBhcmUgZmlyZWQgaW4gcXVpY2sgc3VjY2Vzc2lvbiBsaWtlIGNhbiBoYXBwZW4gd2l0aCBydXN0IGNyeXB0by5cbiAgICBjb25zdCBpc1Nob3dpbmdNaXNtYXRjaE1vZGFsID0gdXNlUmVmKGZhbHNlKTtcbiAgICBjb25zdCBjaGFuZ2VIYW5kbGVyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICAvLyBoYW5kbGUgdHJhbnNpdGlvbnMgLT4gY2FuY2VsbGVkIGZvciBtaXNtYXRjaGVzIHdoaWNoIGZpcmUgYSBtb2RhbCBpbnN0ZWFkIG9mIHNob3dpbmcgYSBjYXJkXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFpc1Nob3dpbmdNaXNtYXRjaE1vZGFsLmN1cnJlbnQgJiZcbiAgICAgICAgICAgIHJlcXVlc3Q/LnBoYXNlID09PSBWZXJpZmljYXRpb25QaGFzZS5DYW5jZWxsZWQgJiZcbiAgICAgICAgICAgIE1JU01BVENIRVMuaW5jbHVkZXMocmVxdWVzdC5jYW5jZWxsYXRpb25Db2RlID8/IFwiXCIpXG4gICAgICAgICkge1xuICAgICAgICAgICAgaXNTaG93aW5nTWlzbWF0Y2hNb2RhbC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhFcnJvckRpYWxvZywge1xuICAgICAgICAgICAgICAgIGhlYWRlckltYWdlOiByZXF1aXJlKFwiLi4vLi4vLi4vLi4vcmVzL2ltZy9lMmUvd2FybmluZy1kZXByZWNhdGVkLnN2Z1wiKS5kZWZhdWx0LFxuICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcImVuY3J5cHRpb258bWVzc2FnZXNfbm90X3NlY3VyZXx0aXRsZVwiKSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAge190KFwiZW5jcnlwdGlvbnxtZXNzYWdlc19ub3Rfc2VjdXJlfGhlYWRpbmdcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcImVuY3J5cHRpb258bWVzc2FnZXNfbm90X3NlY3VyZXxjYXVzZV8xXCIpfTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcImVuY3J5cHRpb258bWVzc2FnZXNfbm90X3NlY3VyZXxjYXVzZV8yXCIpfTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcImVuY3J5cHRpb258bWVzc2FnZXNfbm90X3NlY3VyZXxjYXVzZV8zXCIpfTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcImVuY3J5cHRpb258bWVzc2FnZXNfbm90X3NlY3VyZXxjYXVzZV80XCIpfTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ6IG9uQ2xvc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgdXBkYXRlIHBoYXNlIGhlcmUgYXMgd2Ugd2lsbCBiZSB0cmFuc2l0aW9uaW5nIGF3YXkgZnJvbSB0aGlzIHZpZXcgc2hvcnRseVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIHNldFBoYXNlKHJlcXVlc3QucGhhc2UpO1xuICAgICAgICB9XG4gICAgfSwgW29uQ2xvc2UsIHJlcXVlc3RdKTtcblxuICAgIHVzZVR5cGVkRXZlbnRFbWl0dGVyKHJlcXVlc3QsIFZlcmlmaWNhdGlvblJlcXVlc3RFdmVudC5DaGFuZ2UsIGNoYW5nZUhhbmRsZXIpO1xuXG4gICAgY29uc3Qgb25TdGFydFZlcmlmaWNhdGlvbiA9IHVzZUNhbGxiYWNrKGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgc2V0UmVxdWVzdGluZyh0cnVlKTtcbiAgICAgICAgbGV0IHZlcmlmaWNhdGlvblJlcXVlc3RfOiBWZXJpZmljYXRpb25SZXF1ZXN0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgcm9vbUlkID0gYXdhaXQgZW5zdXJlRE1FeGlzdHMoY2xpLCBtZW1iZXIudXNlcklkKTtcbiAgICAgICAgICAgIGlmICghcm9vbUlkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGNyZWF0ZSBSb29tIGZvciB2ZXJpZmljYXRpb25cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2ZXJpZmljYXRpb25SZXF1ZXN0XyA9IGF3YWl0IGNsaS5nZXRDcnlwdG8oKSEucmVxdWVzdFZlcmlmaWNhdGlvbkRNKG1lbWJlci51c2VySWQsIHJvb21JZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzdGFydGluZyB2ZXJpZmljYXRpb25cIiwgZSk7XG4gICAgICAgICAgICBzZXRSZXF1ZXN0aW5nKGZhbHNlKTtcblxuICAgICAgICAgICAgTW9kYWwuY3JlYXRlRGlhbG9nKEVycm9yRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVySW1hZ2U6IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi9yZXMvaW1nL2UyZS93YXJuaW5nLnN2Z1wiKS5kZWZhdWx0LFxuICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcImVuY3J5cHRpb258dmVyaWZpY2F0aW9ufGVycm9yX3N0YXJ0aW5nX3RpdGxlXCIpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdChcImVuY3J5cHRpb258dmVyaWZpY2F0aW9ufGVycm9yX3N0YXJ0aW5nX2Rlc2NyaXB0aW9uXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmVxdWVzdCh2ZXJpZmljYXRpb25SZXF1ZXN0Xyk7XG4gICAgICAgIHNldFBoYXNlKHZlcmlmaWNhdGlvblJlcXVlc3RfLnBoYXNlKTtcbiAgICAgICAgLy8gTm90aWZ5IHRoZSBSaWdodFBhbmVsU3RvcmUgYWJvdXQgdGhpc1xuICAgICAgICBpZiAoUmlnaHRQYW5lbFN0b3JlLmluc3RhbmNlLmN1cnJlbnRDYXJkLnBoYXNlICE9IFJpZ2h0UGFuZWxQaGFzZXMuRW5jcnlwdGlvblBhbmVsKSB7XG4gICAgICAgICAgICBSaWdodFBhbmVsU3RvcmUuaW5zdGFuY2UucHVzaENhcmQoe1xuICAgICAgICAgICAgICAgIHBoYXNlOiBSaWdodFBhbmVsUGhhc2VzLkVuY3J5cHRpb25QYW5lbCxcbiAgICAgICAgICAgICAgICBzdGF0ZTogeyBtZW1iZXIsIHZlcmlmaWNhdGlvblJlcXVlc3Q6IHZlcmlmaWNhdGlvblJlcXVlc3RfIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVJpZ2h0UGFuZWxTdG9yZS5pbnN0YW5jZS5pc09wZW4pIFJpZ2h0UGFuZWxTdG9yZS5pbnN0YW5jZS50b2dnbGVQYW5lbChudWxsKTtcbiAgICB9LCBbY2xpLCBtZW1iZXJdKTtcblxuICAgIGNvbnN0IHJlcXVlc3RlZDogYm9vbGVhbiA9XG4gICAgICAgICghcmVxdWVzdCAmJiBpc1JlcXVlc3RpbmcpIHx8XG4gICAgICAgICghIXJlcXVlc3QgJiZcbiAgICAgICAgICAgIChwaGFzZSA9PT0gVmVyaWZpY2F0aW9uUGhhc2UuUmVxdWVzdGVkIHx8IHBoYXNlID09PSBWZXJpZmljYXRpb25QaGFzZS5VbnNlbnQgfHwgcGhhc2UgPT09IHVuZGVmaW5lZCkpO1xuICAgIGNvbnN0IGlzU2VsZlZlcmlmaWNhdGlvbiA9IHJlcXVlc3QgPyByZXF1ZXN0LmlzU2VsZlZlcmlmaWNhdGlvbiA6IG1lbWJlci51c2VySWQgPT09IGNsaS5nZXRVc2VySWQoKTtcblxuICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0ZWQpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhdGVkQnlNZSA9ICghcmVxdWVzdCAmJiBpc1JlcXVlc3RpbmcpIHx8ICghIXJlcXVlc3QgJiYgcmVxdWVzdC5pbml0aWF0ZWRCeU1lKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxFbmNyeXB0aW9uSW5mb1xuICAgICAgICAgICAgICAgIGlzUm9vbUVuY3J5cHRlZD17aXNSb29tRW5jcnlwdGVkfVxuICAgICAgICAgICAgICAgIG9uU3RhcnRWZXJpZmljYXRpb249e29uU3RhcnRWZXJpZmljYXRpb259XG4gICAgICAgICAgICAgICAgbWVtYmVyPXttZW1iZXJ9XG4gICAgICAgICAgICAgICAgaXNTZWxmVmVyaWZpY2F0aW9uPXtpc1NlbGZWZXJpZmljYXRpb259XG4gICAgICAgICAgICAgICAgd2FpdGluZ0Zvck90aGVyUGFydHk9e3JlcXVlc3RlZCAmJiBpbml0aWF0ZWRCeU1lfVxuICAgICAgICAgICAgICAgIHdhaXRpbmdGb3JOZXR3b3JrPXtyZXF1ZXN0ZWQgJiYgIWluaXRpYXRlZEJ5TWV9XG4gICAgICAgICAgICAgICAgaW5EaWFsb2c9e2xheW91dCA9PT0gXCJkaWFsb2dcIn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxWZXJpZmljYXRpb25QYW5lbFxuICAgICAgICAgICAgICAgIGlzUm9vbUVuY3J5cHRlZD17aXNSb29tRW5jcnlwdGVkfVxuICAgICAgICAgICAgICAgIGxheW91dD17bGF5b3V0fVxuICAgICAgICAgICAgICAgIG9uQ2xvc2U9e29uQ2xvc2V9XG4gICAgICAgICAgICAgICAgbWVtYmVyPXttZW1iZXJ9XG4gICAgICAgICAgICAgICAgcmVxdWVzdD17cmVxdWVzdH1cbiAgICAgICAgICAgICAgICBrZXk9e3JlcXVlc3QudHJhbnNhY3Rpb25JZH1cbiAgICAgICAgICAgICAgICBpbkRpYWxvZz17bGF5b3V0ID09PSBcImRpYWxvZ1wifVxuICAgICAgICAgICAgICAgIHBoYXNlPXtwaGFzZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgRW5jcnlwdGlvblBhbmVsO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBRUEsSUFBQUcsZUFBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssa0JBQUEsR0FBQUQsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFNLFdBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGdCQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxNQUFBLEdBQUFKLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBUyxnQkFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsc0JBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLGdCQUFBLEdBQUFQLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBWSxZQUFBLEdBQUFSLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBYSxvQkFBQSxHQUFBYixPQUFBO0FBQStFLFNBQUFjLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLENBQUEs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