matrix-react-sdk
Version:
SDK for matrix.org using React
205 lines (202 loc) • 31 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _cryptoApi = require("matrix-js-sdk/src/crypto-api");
var _logger = require("matrix-js-sdk/src/logger");
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _languageHandler = require("../../../languageHandler");
var _Media = require("../../../customisations/Media");
var _VerificationComplete = _interopRequireDefault(require("../verification/VerificationComplete"));
var _VerificationCancelled = _interopRequireDefault(require("../verification/VerificationCancelled"));
var _BaseAvatar = _interopRequireDefault(require("../avatars/BaseAvatar"));
var _Spinner = _interopRequireDefault(require("../elements/Spinner"));
var _VerificationShowSas = _interopRequireDefault(require("../verification/VerificationShowSas"));
var _BaseDialog = _interopRequireDefault(require("./BaseDialog"));
var _DialogButtons = _interopRequireDefault(require("../elements/DialogButtons"));
/*
Copyright 2019-2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const PHASE_START = 0;
const PHASE_SHOW_SAS = 1;
const PHASE_WAIT_FOR_PARTNER_TO_CONFIRM = 2;
const PHASE_VERIFIED = 3;
const PHASE_CANCELLED = 4;
class IncomingSasDialog extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "showSasEvent", void 0);
(0, _defineProperty2.default)(this, "onFinished", () => {
this.props.onFinished(this.state.phase === PHASE_VERIFIED);
});
(0, _defineProperty2.default)(this, "onCancelClick", () => {
this.props.onFinished(this.state.phase === PHASE_VERIFIED);
});
(0, _defineProperty2.default)(this, "onContinueClick", () => {
this.setState({
phase: PHASE_WAIT_FOR_PARTNER_TO_CONFIRM
});
this.props.verifier.verify().then(() => {
this.setState({
phase: PHASE_VERIFIED
});
}).catch(e => {
_logger.logger.log("Verification failed", e);
});
});
(0, _defineProperty2.default)(this, "onVerifierShowSas", e => {
this.showSasEvent = e;
this.setState({
phase: PHASE_SHOW_SAS,
sas: e.sas
});
});
(0, _defineProperty2.default)(this, "onVerifierCancel", () => {
this.setState({
phase: PHASE_CANCELLED
});
});
(0, _defineProperty2.default)(this, "onSasMatchesClick", () => {
this.showSasEvent?.confirm();
this.setState({
phase: PHASE_WAIT_FOR_PARTNER_TO_CONFIRM
});
});
(0, _defineProperty2.default)(this, "onVerifiedDoneClick", () => {
this.props.onFinished(true);
});
let phase = PHASE_START;
if (this.props.verifier.hasBeenCancelled) {
_logger.logger.log("Verifier was cancelled in the background.");
phase = PHASE_CANCELLED;
}
this.showSasEvent = null;
this.state = {
phase: phase,
sasVerified: false,
opponentProfile: null,
opponentProfileError: null,
sas: null
};
this.props.verifier.on(_cryptoApi.VerifierEvent.ShowSas, this.onVerifierShowSas);
this.props.verifier.on(_cryptoApi.VerifierEvent.Cancel, this.onVerifierCancel);
this.fetchOpponentProfile();
}
componentWillUnmount() {
if (this.state.phase !== PHASE_CANCELLED && this.state.phase !== PHASE_VERIFIED) {
this.props.verifier.cancel(new Error("User cancel"));
}
this.props.verifier.removeListener(_cryptoApi.VerifierEvent.ShowSas, this.onVerifierShowSas);
}
async fetchOpponentProfile() {
try {
const prof = await _MatrixClientPeg.MatrixClientPeg.safeGet().getProfileInfo(this.props.verifier.userId);
this.setState({
opponentProfile: prof
});
} catch (e) {
this.setState({
opponentProfileError: e
});
}
}
renderPhaseStart() {
const isSelf = this.props.verifier.userId === _MatrixClientPeg.MatrixClientPeg.safeGet().getUserId();
let profile;
const oppProfile = this.state.opponentProfile;
if (oppProfile) {
const url = oppProfile.avatar_url ? (0, _Media.mediaFromMxc)(oppProfile.avatar_url).getSquareThumbnailHttp(48) : null;
profile = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_IncomingSasDialog_opponentProfile"
}, /*#__PURE__*/_react.default.createElement(_BaseAvatar.default, {
name: oppProfile.displayname,
idName: this.props.verifier.userId,
url: url,
size: "48px"
}), /*#__PURE__*/_react.default.createElement("h2", null, oppProfile.displayname));
} else if (this.state.opponentProfileError) {
profile = /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_BaseAvatar.default, {
name: this.props.verifier.userId.slice(1),
idName: this.props.verifier.userId,
size: "48px"
}), /*#__PURE__*/_react.default.createElement("h2", null, this.props.verifier.userId));
} else {
profile = /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
}
const userDetailText = [/*#__PURE__*/_react.default.createElement("p", {
key: "p1"
}, (0, _languageHandler._t)("encryption|verification|incoming_sas_user_dialog_text_1")), /*#__PURE__*/_react.default.createElement("p", {
key: "p2"
}, (0, _languageHandler._t)(
// NB. Below wording adjusted to singular 'session' until we have
// cross-signing
"encryption|verification|incoming_sas_user_dialog_text_2"))];
const selfDetailText = [/*#__PURE__*/_react.default.createElement("p", {
key: "p1"
}, (0, _languageHandler._t)("encryption|verification|incoming_sas_device_dialog_text_1")), /*#__PURE__*/_react.default.createElement("p", {
key: "p2"
}, (0, _languageHandler._t)("encryption|verification|incoming_sas_device_dialog_text_2"))];
return /*#__PURE__*/_react.default.createElement("div", null, profile, isSelf ? selfDetailText : userDetailText, /*#__PURE__*/_react.default.createElement(_DialogButtons.default, {
primaryButton: (0, _languageHandler._t)("action|continue"),
hasCancel: true,
onPrimaryButtonClick: this.onContinueClick,
onCancel: this.onCancelClick
}));
}
renderPhaseShowSas() {
if (!this.showSasEvent) return null;
return /*#__PURE__*/_react.default.createElement(_VerificationShowSas.default, {
sas: this.showSasEvent.sas,
onCancel: this.onCancelClick,
onDone: this.onSasMatchesClick,
isSelf: this.props.verifier.userId === _MatrixClientPeg.MatrixClientPeg.safeGet().getUserId(),
inDialog: true
});
}
renderPhaseWaitForPartnerToConfirm() {
return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Spinner.default, null), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("encryption|verification|incoming_sas_dialog_waiting")));
}
renderPhaseVerified() {
return /*#__PURE__*/_react.default.createElement(_VerificationComplete.default, {
onDone: this.onVerifiedDoneClick
});
}
renderPhaseCancelled() {
return /*#__PURE__*/_react.default.createElement(_VerificationCancelled.default, {
onDone: this.onCancelClick
});
}
render() {
let body;
switch (this.state.phase) {
case PHASE_START:
body = this.renderPhaseStart();
break;
case PHASE_SHOW_SAS:
body = this.renderPhaseShowSas();
break;
case PHASE_WAIT_FOR_PARTNER_TO_CONFIRM:
body = this.renderPhaseWaitForPartnerToConfirm();
break;
case PHASE_VERIFIED:
body = this.renderPhaseVerified();
break;
case PHASE_CANCELLED:
body = this.renderPhaseCancelled();
break;
}
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
title: (0, _languageHandler._t)("encryption|verification|incoming_sas_dialog_title"),
onFinished: this.onFinished,
fixedWidth: false
}, body);
}
}
exports.default = IncomingSasDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jcnlwdG9BcGkiLCJfbG9nZ2VyIiwiX01hdHJpeENsaWVudFBlZyIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfTWVkaWEiLCJfVmVyaWZpY2F0aW9uQ29tcGxldGUiLCJfVmVyaWZpY2F0aW9uQ2FuY2VsbGVkIiwiX0Jhc2VBdmF0YXIiLCJfU3Bpbm5lciIsIl9WZXJpZmljYXRpb25TaG93U2FzIiwiX0Jhc2VEaWFsb2ciLCJfRGlhbG9nQnV0dG9ucyIsIlBIQVNFX1NUQVJUIiwiUEhBU0VfU0hPV19TQVMiLCJQSEFTRV9XQUlUX0ZPUl9QQVJUTkVSX1RPX0NPTkZJUk0iLCJQSEFTRV9WRVJJRklFRCIsIlBIQVNFX0NBTkNFTExFRCIsIkluY29taW5nU2FzRGlhbG9nIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJvbkZpbmlzaGVkIiwic3RhdGUiLCJwaGFzZSIsInNldFN0YXRlIiwidmVyaWZpZXIiLCJ2ZXJpZnkiLCJ0aGVuIiwiY2F0Y2giLCJlIiwibG9nZ2VyIiwibG9nIiwic2hvd1Nhc0V2ZW50Iiwic2FzIiwiY29uZmlybSIsImhhc0JlZW5DYW5jZWxsZWQiLCJzYXNWZXJpZmllZCIsIm9wcG9uZW50UHJvZmlsZSIsIm9wcG9uZW50UHJvZmlsZUVycm9yIiwib24iLCJWZXJpZmllckV2ZW50IiwiU2hvd1NhcyIsIm9uVmVyaWZpZXJTaG93U2FzIiwiQ2FuY2VsIiwib25WZXJpZmllckNhbmNlbCIsImZldGNoT3Bwb25lbnRQcm9maWxlIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJjYW5jZWwiLCJFcnJvciIsInJlbW92ZUxpc3RlbmVyIiwicHJvZiIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJnZXRQcm9maWxlSW5mbyIsInVzZXJJZCIsInJlbmRlclBoYXNlU3RhcnQiLCJpc1NlbGYiLCJnZXRVc2VySWQiLCJwcm9maWxlIiwib3BwUHJvZmlsZSIsInVybCIsImF2YXRhcl91cmwiLCJtZWRpYUZyb21NeGMiLCJnZXRTcXVhcmVUaHVtYm5haWxIdHRwIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsIm5hbWUiLCJkaXNwbGF5bmFtZSIsImlkTmFtZSIsInNpemUiLCJzbGljZSIsInVzZXJEZXRhaWxUZXh0Iiwia2V5IiwiX3QiLCJzZWxmRGV0YWlsVGV4dCIsInByaW1hcnlCdXR0b24iLCJoYXNDYW5jZWwiLCJvblByaW1hcnlCdXR0b25DbGljayIsIm9uQ29udGludWVDbGljayIsIm9uQ2FuY2VsIiwib25DYW5jZWxDbGljayIsInJlbmRlclBoYXNlU2hvd1NhcyIsIm9uRG9uZSIsIm9uU2FzTWF0Y2hlc0NsaWNrIiwiaW5EaWFsb2ciLCJyZW5kZXJQaGFzZVdhaXRGb3JQYXJ0bmVyVG9Db25maXJtIiwicmVuZGVyUGhhc2VWZXJpZmllZCIsIm9uVmVyaWZpZWREb25lQ2xpY2siLCJyZW5kZXJQaGFzZUNhbmNlbGxlZCIsInJlbmRlciIsImJvZHkiLCJ0aXRsZSIsImZpeGVkV2lkdGgiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvZGlhbG9ncy9JbmNvbWluZ1Nhc0RpYWxvZy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE5LTIwMjQgTmV3IFZlY3RvciBMdGQuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEdlbmVyYXRlZFNhcywgU2hvd1Nhc0NhbGxiYWNrcywgVmVyaWZpZXIsIFZlcmlmaWVyRXZlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvY3J5cHRvLWFwaVwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IG1lZGlhRnJvbU14YyB9IGZyb20gXCIuLi8uLi8uLi9jdXN0b21pc2F0aW9ucy9NZWRpYVwiO1xuaW1wb3J0IFZlcmlmaWNhdGlvbkNvbXBsZXRlIGZyb20gXCIuLi92ZXJpZmljYXRpb24vVmVyaWZpY2F0aW9uQ29tcGxldGVcIjtcbmltcG9ydCBWZXJpZmljYXRpb25DYW5jZWxsZWQgZnJvbSBcIi4uL3ZlcmlmaWNhdGlvbi9WZXJpZmljYXRpb25DYW5jZWxsZWRcIjtcbmltcG9ydCBCYXNlQXZhdGFyIGZyb20gXCIuLi9hdmF0YXJzL0Jhc2VBdmF0YXJcIjtcbmltcG9ydCBTcGlubmVyIGZyb20gXCIuLi9lbGVtZW50cy9TcGlubmVyXCI7XG5pbXBvcnQgVmVyaWZpY2F0aW9uU2hvd1NhcyBmcm9tIFwiLi4vdmVyaWZpY2F0aW9uL1ZlcmlmaWNhdGlvblNob3dTYXNcIjtcbmltcG9ydCBCYXNlRGlhbG9nIGZyb20gXCIuL0Jhc2VEaWFsb2dcIjtcbmltcG9ydCBEaWFsb2dCdXR0b25zIGZyb20gXCIuLi9lbGVtZW50cy9EaWFsb2dCdXR0b25zXCI7XG5cbmNvbnN0IFBIQVNFX1NUQVJUID0gMDtcbmNvbnN0IFBIQVNFX1NIT1dfU0FTID0gMTtcbmNvbnN0IFBIQVNFX1dBSVRfRk9SX1BBUlRORVJfVE9fQ09ORklSTSA9IDI7XG5jb25zdCBQSEFTRV9WRVJJRklFRCA9IDM7XG5jb25zdCBQSEFTRV9DQU5DRUxMRUQgPSA0O1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICB2ZXJpZmllcjogVmVyaWZpZXI7XG4gICAgb25GaW5pc2hlZCh2ZXJpZmllZD86IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBwaGFzZTogbnVtYmVyO1xuICAgIHNhc1ZlcmlmaWVkOiBib29sZWFuO1xuICAgIG9wcG9uZW50UHJvZmlsZToge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXG4gICAgICAgIGF2YXRhcl91cmw/OiBzdHJpbmc7XG4gICAgICAgIGRpc3BsYXluYW1lPzogc3RyaW5nO1xuICAgIH0gfCBudWxsO1xuICAgIG9wcG9uZW50UHJvZmlsZUVycm9yOiBFcnJvciB8IG51bGw7XG4gICAgc2FzOiBHZW5lcmF0ZWRTYXMgfCBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmNvbWluZ1Nhc0RpYWxvZyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgc2hvd1Nhc0V2ZW50OiBTaG93U2FzQ2FsbGJhY2tzIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICBsZXQgcGhhc2UgPSBQSEFTRV9TVEFSVDtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMudmVyaWZpZXIuaGFzQmVlbkNhbmNlbGxlZCkge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIlZlcmlmaWVyIHdhcyBjYW5jZWxsZWQgaW4gdGhlIGJhY2tncm91bmQuXCIpO1xuICAgICAgICAgICAgcGhhc2UgPSBQSEFTRV9DQU5DRUxMRUQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dTYXNFdmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBwaGFzZTogcGhhc2UsXG4gICAgICAgICAgICBzYXNWZXJpZmllZDogZmFsc2UsXG4gICAgICAgICAgICBvcHBvbmVudFByb2ZpbGU6IG51bGwsXG4gICAgICAgICAgICBvcHBvbmVudFByb2ZpbGVFcnJvcjogbnVsbCxcbiAgICAgICAgICAgIHNhczogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcm9wcy52ZXJpZmllci5vbihWZXJpZmllckV2ZW50LlNob3dTYXMsIHRoaXMub25WZXJpZmllclNob3dTYXMpO1xuICAgICAgICB0aGlzLnByb3BzLnZlcmlmaWVyLm9uKFZlcmlmaWVyRXZlbnQuQ2FuY2VsLCB0aGlzLm9uVmVyaWZpZXJDYW5jZWwpO1xuICAgICAgICB0aGlzLmZldGNoT3Bwb25lbnRQcm9maWxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5waGFzZSAhPT0gUEhBU0VfQ0FOQ0VMTEVEICYmIHRoaXMuc3RhdGUucGhhc2UgIT09IFBIQVNFX1ZFUklGSUVEKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnZlcmlmaWVyLmNhbmNlbChuZXcgRXJyb3IoXCJVc2VyIGNhbmNlbFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9wcy52ZXJpZmllci5yZW1vdmVMaXN0ZW5lcihWZXJpZmllckV2ZW50LlNob3dTYXMsIHRoaXMub25WZXJpZmllclNob3dTYXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZmV0Y2hPcHBvbmVudFByb2ZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwcm9mID0gYXdhaXQgTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRQcm9maWxlSW5mbyh0aGlzLnByb3BzLnZlcmlmaWVyLnVzZXJJZCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBvcHBvbmVudFByb2ZpbGU6IHByb2YsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgb3Bwb25lbnRQcm9maWxlRXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25GaW5pc2hlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKHRoaXMuc3RhdGUucGhhc2UgPT09IFBIQVNFX1ZFUklGSUVEKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkNhbmNlbENsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQodGhpcy5zdGF0ZS5waGFzZSA9PT0gUEhBU0VfVkVSSUZJRUQpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uQ29udGludWVDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHBoYXNlOiBQSEFTRV9XQUlUX0ZPUl9QQVJUTkVSX1RPX0NPTkZJUk0gfSk7XG4gICAgICAgIHRoaXMucHJvcHMudmVyaWZpZXJcbiAgICAgICAgICAgIC52ZXJpZnkoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBwaGFzZTogUEhBU0VfVkVSSUZJRUQgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIlZlcmlmaWNhdGlvbiBmYWlsZWRcIiwgZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblZlcmlmaWVyU2hvd1NhcyA9IChlOiBTaG93U2FzQ2FsbGJhY2tzKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2hvd1Nhc0V2ZW50ID0gZTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBwaGFzZTogUEhBU0VfU0hPV19TQVMsXG4gICAgICAgICAgICBzYXM6IGUuc2FzLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblZlcmlmaWVyQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHBoYXNlOiBQSEFTRV9DQU5DRUxMRUQsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uU2FzTWF0Y2hlc0NsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNob3dTYXNFdmVudD8uY29uZmlybSgpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHBoYXNlOiBQSEFTRV9XQUlUX0ZPUl9QQVJUTkVSX1RPX0NPTkZJUk0sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uVmVyaWZpZWREb25lQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25GaW5pc2hlZCh0cnVlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZW5kZXJQaGFzZVN0YXJ0KCk6IFJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IGlzU2VsZiA9IHRoaXMucHJvcHMudmVyaWZpZXIudXNlcklkID09PSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLmdldFVzZXJJZCgpO1xuXG4gICAgICAgIGxldCBwcm9maWxlO1xuICAgICAgICBjb25zdCBvcHBQcm9maWxlID0gdGhpcy5zdGF0ZS5vcHBvbmVudFByb2ZpbGU7XG4gICAgICAgIGlmIChvcHBQcm9maWxlKSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBvcHBQcm9maWxlLmF2YXRhcl91cmwgPyBtZWRpYUZyb21NeGMob3BwUHJvZmlsZS5hdmF0YXJfdXJsKS5nZXRTcXVhcmVUaHVtYm5haWxIdHRwKDQ4KSA6IG51bGw7XG4gICAgICAgICAgICBwcm9maWxlID0gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfSW5jb21pbmdTYXNEaWFsb2dfb3Bwb25lbnRQcm9maWxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxCYXNlQXZhdGFyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPXtvcHBQcm9maWxlLmRpc3BsYXluYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWROYW1lPXt0aGlzLnByb3BzLnZlcmlmaWVyLnVzZXJJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVybD17dXJsfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cIjQ4cHhcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8aDI+e29wcFByb2ZpbGUuZGlzcGxheW5hbWV9PC9oMj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5vcHBvbmVudFByb2ZpbGVFcnJvcikge1xuICAgICAgICAgICAgcHJvZmlsZSA9IChcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8QmFzZUF2YXRhclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT17dGhpcy5wcm9wcy52ZXJpZmllci51c2VySWQuc2xpY2UoMSl9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZE5hbWU9e3RoaXMucHJvcHMudmVyaWZpZXIudXNlcklkfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cIjQ4cHhcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8aDI+e3RoaXMucHJvcHMudmVyaWZpZXIudXNlcklkfTwvaDI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvZmlsZSA9IDxTcGlubmVyIC8+O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXNlckRldGFpbFRleHQgPSBbXG4gICAgICAgICAgICA8cCBrZXk9XCJwMVwiPntfdChcImVuY3J5cHRpb258dmVyaWZpY2F0aW9ufGluY29taW5nX3Nhc191c2VyX2RpYWxvZ190ZXh0XzFcIil9PC9wPixcbiAgICAgICAgICAgIDxwIGtleT1cInAyXCI+XG4gICAgICAgICAgICAgICAge190KFxuICAgICAgICAgICAgICAgICAgICAvLyBOQi4gQmVsb3cgd29yZGluZyBhZGp1c3RlZCB0byBzaW5ndWxhciAnc2Vzc2lvbicgdW50aWwgd2UgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAvLyBjcm9zcy1zaWduaW5nXG4gICAgICAgICAgICAgICAgICAgIFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258aW5jb21pbmdfc2FzX3VzZXJfZGlhbG9nX3RleHRfMlwiLFxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L3A+LFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHNlbGZEZXRhaWxUZXh0ID0gW1xuICAgICAgICAgICAgPHAga2V5PVwicDFcIj57X3QoXCJlbmNyeXB0aW9ufHZlcmlmaWNhdGlvbnxpbmNvbWluZ19zYXNfZGV2aWNlX2RpYWxvZ190ZXh0XzFcIil9PC9wPixcbiAgICAgICAgICAgIDxwIGtleT1cInAyXCI+e190KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258aW5jb21pbmdfc2FzX2RldmljZV9kaWFsb2dfdGV4dF8yXCIpfTwvcD4sXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAge3Byb2ZpbGV9XG4gICAgICAgICAgICAgICAge2lzU2VsZiA/IHNlbGZEZXRhaWxUZXh0IDogdXNlckRldGFpbFRleHR9XG4gICAgICAgICAgICAgICAgPERpYWxvZ0J1dHRvbnNcbiAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJ1dHRvbj17X3QoXCJhY3Rpb258Y29udGludWVcIil9XG4gICAgICAgICAgICAgICAgICAgIGhhc0NhbmNlbD17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgb25QcmltYXJ5QnV0dG9uQ2xpY2s9e3RoaXMub25Db250aW51ZUNsaWNrfVxuICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbD17dGhpcy5vbkNhbmNlbENsaWNrfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclBoYXNlU2hvd1NhcygpOiBSZWFjdE5vZGUge1xuICAgICAgICBpZiAoIXRoaXMuc2hvd1Nhc0V2ZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxWZXJpZmljYXRpb25TaG93U2FzXG4gICAgICAgICAgICAgICAgc2FzPXt0aGlzLnNob3dTYXNFdmVudC5zYXN9XG4gICAgICAgICAgICAgICAgb25DYW5jZWw9e3RoaXMub25DYW5jZWxDbGlja31cbiAgICAgICAgICAgICAgICBvbkRvbmU9e3RoaXMub25TYXNNYXRjaGVzQ2xpY2t9XG4gICAgICAgICAgICAgICAgaXNTZWxmPXt0aGlzLnByb3BzLnZlcmlmaWVyLnVzZXJJZCA9PT0gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRVc2VySWQoKX1cbiAgICAgICAgICAgICAgICBpbkRpYWxvZz17dHJ1ZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJQaGFzZVdhaXRGb3JQYXJ0bmVyVG9Db25maXJtKCk6IFJlYWN0Tm9kZSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxTcGlubmVyIC8+XG4gICAgICAgICAgICAgICAgPHA+e190KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258aW5jb21pbmdfc2FzX2RpYWxvZ193YWl0aW5nXCIpfTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyUGhhc2VWZXJpZmllZCgpOiBSZWFjdE5vZGUge1xuICAgICAgICByZXR1cm4gPFZlcmlmaWNhdGlvbkNvbXBsZXRlIG9uRG9uZT17dGhpcy5vblZlcmlmaWVkRG9uZUNsaWNrfSAvPjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclBoYXNlQ2FuY2VsbGVkKCk6IFJlYWN0Tm9kZSB7XG4gICAgICAgIHJldHVybiA8VmVyaWZpY2F0aW9uQ2FuY2VsbGVkIG9uRG9uZT17dGhpcy5vbkNhbmNlbENsaWNrfSAvPjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0Tm9kZSB7XG4gICAgICAgIGxldCBib2R5O1xuICAgICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUucGhhc2UpIHtcbiAgICAgICAgICAgIGNhc2UgUEhBU0VfU1RBUlQ6XG4gICAgICAgICAgICAgICAgYm9keSA9IHRoaXMucmVuZGVyUGhhc2VTdGFydCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSEFTRV9TSE9XX1NBUzpcbiAgICAgICAgICAgICAgICBib2R5ID0gdGhpcy5yZW5kZXJQaGFzZVNob3dTYXMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhBU0VfV0FJVF9GT1JfUEFSVE5FUl9UT19DT05GSVJNOlxuICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLnJlbmRlclBoYXNlV2FpdEZvclBhcnRuZXJUb0NvbmZpcm0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhBU0VfVkVSSUZJRUQ6XG4gICAgICAgICAgICAgICAgYm9keSA9IHRoaXMucmVuZGVyUGhhc2VWZXJpZmllZCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSEFTRV9DQU5DRUxMRUQ6XG4gICAgICAgICAgICAgICAgYm9keSA9IHRoaXMucmVuZGVyUGhhc2VDYW5jZWxsZWQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QmFzZURpYWxvZ1xuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcImVuY3J5cHRpb258dmVyaWZpY2F0aW9ufGluY29taW5nX3Nhc19kaWFsb2dfdGl0bGVcIil9XG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17dGhpcy5vbkZpbmlzaGVkfVxuICAgICAgICAgICAgICAgIGZpeGVkV2lkdGg9e2ZhbHNlfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtib2R5fVxuICAgICAgICAgICAgPC9CYXNlRGlhbG9nPlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFPQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksZ0JBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLHFCQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxzQkFBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsV0FBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVMsUUFBQSxHQUFBVixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVUsb0JBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLFdBQUEsR0FBQVosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFZLGNBQUEsR0FBQWIsc0JBQUEsQ0FBQUMsT0FBQTtBQXBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBaUJBLE1BQU1hLFdBQVcsR0FBRyxDQUFDO0FBQ3JCLE1BQU1DLGNBQWMsR0FBRyxDQUFDO0FBQ3hCLE1BQU1D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