UNPKG

matrix-react-sdk

Version:
177 lines (174 loc) 30.1 kB
"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 _fileSaver = _interopRequireDefault(require("file-saver")); var _react = _interopRequireDefault(require("react")); var _logger = require("matrix-js-sdk/src/logger"); var _languageHandler = require("../../../../languageHandler"); var MegolmExportEncryption = _interopRequireWildcard(require("../../../../utils/MegolmExportEncryption")); var _BaseDialog = _interopRequireDefault(require("../../../../components/views/dialogs/BaseDialog")); var _PassphraseField = _interopRequireDefault(require("../../../../components/views/auth/PassphraseField")); var _PassphraseConfirmField = _interopRequireDefault(require("../../../../components/views/auth/PassphraseConfirmField")); 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 2022 The Matrix.org Foundation C.I.C. Copyright 2017 Vector Creations Ltd SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ var Phase = /*#__PURE__*/function (Phase) { Phase["Edit"] = "edit"; Phase["Exporting"] = "exporting"; return Phase; }(Phase || {}); class ExportE2eKeysDialog extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "fieldPassword", null); (0, _defineProperty2.default)(this, "fieldPasswordConfirm", null); (0, _defineProperty2.default)(this, "unmounted", false); (0, _defineProperty2.default)(this, "onPassphraseFormSubmit", async ev => { ev.preventDefault(); if (!(await this.verifyFieldsBeforeSubmit())) return; if (this.unmounted) return; const passphrase = this.state.passphrase1; this.startExport(passphrase); }); (0, _defineProperty2.default)(this, "onCancelClick", ev => { ev.preventDefault(); this.props.onFinished(false); return false; }); (0, _defineProperty2.default)(this, "onPassphraseChange", (ev, phrase) => { this.setState({ [phrase]: ev.target.value }); }); this.state = { phase: Phase.Edit, errStr: null, passphrase1: "", passphrase2: "" }; } componentWillUnmount() { this.unmounted = true; } async verifyFieldsBeforeSubmit() { const fieldsInDisplayOrder = [this.fieldPassword, this.fieldPasswordConfirm]; const invalidFields = []; for (const field of fieldsInDisplayOrder) { if (!field) continue; const valid = await field.validate({ allowEmpty: false }); if (!valid) { invalidFields.push(field); } } if (invalidFields.length === 0) { return true; } // Focus on the first invalid field, then re-validate, // which will result in the error tooltip being displayed for that field. invalidFields[0].focus(); invalidFields[0].validate({ allowEmpty: false, focused: true }); return false; } startExport(passphrase) { // extra Promise.resolve() to turn synchronous exceptions into // asynchronous ones. Promise.resolve().then(() => { return this.props.matrixClient.getCrypto().exportRoomKeysAsJson(); }).then(k => { return MegolmExportEncryption.encryptMegolmKeyFile(k, passphrase); }).then(f => { const blob = new Blob([f], { type: "text/plain;charset=us-ascii" }); _fileSaver.default.saveAs(blob, "element-keys.txt"); this.props.onFinished(true); }).catch(e => { _logger.logger.error("Error exporting e2e keys:", e); if (this.unmounted) { return; } const msg = e.friendlyText || (0, _languageHandler._t)("error|unknown"); this.setState({ errStr: msg, phase: Phase.Edit }); }); this.setState({ errStr: null, phase: Phase.Exporting }); } render() { const disableForm = this.state.phase === Phase.Exporting; return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, { className: "mx_exportE2eKeysDialog", onFinished: this.props.onFinished, title: (0, _languageHandler._t)("settings|key_export_import|export_title") }, /*#__PURE__*/_react.default.createElement("form", { onSubmit: this.onPassphraseFormSubmit }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_Dialog_content" }, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("settings|key_export_import|export_description_1")), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("settings|key_export_import|export_description_2")), /*#__PURE__*/_react.default.createElement("div", { className: "error" }, this.state.errStr), /*#__PURE__*/_react.default.createElement("div", { className: "mx_E2eKeysDialog_inputTable" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_E2eKeysDialog_inputRow" }, /*#__PURE__*/_react.default.createElement(_PassphraseField.default, { minScore: 3, label: (0, _languageHandler._td)("settings|key_export_import|enter_passphrase"), labelEnterPassword: (0, _languageHandler._td)("settings|key_export_import|enter_passphrase"), labelStrongPassword: (0, _languageHandler._td)("settings|key_export_import|phrase_strong_enough"), labelAllowedButUnsafe: (0, _languageHandler._td)("settings|key_export_import|phrase_strong_enough"), value: this.state.passphrase1, onChange: e => this.onPassphraseChange(e, "passphrase1"), autoFocus: true, size: 64, type: "password", disabled: disableForm, autoComplete: "new-password", fieldRef: field => this.fieldPassword = field })), /*#__PURE__*/_react.default.createElement("div", { className: "mx_E2eKeysDialog_inputRow" }, /*#__PURE__*/_react.default.createElement(_PassphraseConfirmField.default, { password: this.state.passphrase1, label: (0, _languageHandler._td)("settings|key_export_import|confirm_passphrase"), labelRequired: (0, _languageHandler._td)("settings|key_export_import|phrase_cannot_be_empty"), labelInvalid: (0, _languageHandler._td)("settings|key_export_import|phrase_must_match"), value: this.state.passphrase2, onChange: e => this.onPassphraseChange(e, "passphrase2"), size: 64, type: "password", disabled: disableForm, autoComplete: "new-password", fieldRef: field => this.fieldPasswordConfirm = field })))), /*#__PURE__*/_react.default.createElement("div", { className: "mx_Dialog_buttons" }, /*#__PURE__*/_react.default.createElement("input", { className: "mx_Dialog_primary", type: "submit", value: (0, _languageHandler._t)("action|export"), disabled: disableForm }), /*#__PURE__*/_react.default.createElement("button", { onClick: this.onCancelClick, disabled: disableForm }, (0, _languageHandler._t)("action|cancel"))))); } } exports.default = ExportE2eKeysDialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZmlsZVNhdmVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcmVhY3QiLCJfbG9nZ2VyIiwiX2xhbmd1YWdlSGFuZGxlciIsIk1lZ29sbUV4cG9ydEVuY3J5cHRpb24iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9CYXNlRGlhbG9nIiwiX1Bhc3NwaHJhc2VGaWVsZCIsIl9QYXNzcGhyYXNlQ29uZmlybUZpZWxkIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiUGhhc2UiLCJFeHBvcnRFMmVLZXlzRGlhbG9nIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsImV2IiwicHJldmVudERlZmF1bHQiLCJ2ZXJpZnlGaWVsZHNCZWZvcmVTdWJtaXQiLCJ1bm1vdW50ZWQiLCJwYXNzcGhyYXNlIiwic3RhdGUiLCJwYXNzcGhyYXNlMSIsInN0YXJ0RXhwb3J0Iiwib25GaW5pc2hlZCIsInBocmFzZSIsInNldFN0YXRlIiwidGFyZ2V0IiwidmFsdWUiLCJwaGFzZSIsIkVkaXQiLCJlcnJTdHIiLCJwYXNzcGhyYXNlMiIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiZmllbGRzSW5EaXNwbGF5T3JkZXIiLCJmaWVsZFBhc3N3b3JkIiwiZmllbGRQYXNzd29yZENvbmZpcm0iLCJpbnZhbGlkRmllbGRzIiwiZmllbGQiLCJ2YWxpZCIsInZhbGlkYXRlIiwiYWxsb3dFbXB0eSIsInB1c2giLCJsZW5ndGgiLCJmb2N1cyIsImZvY3VzZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJtYXRyaXhDbGllbnQiLCJnZXRDcnlwdG8iLCJleHBvcnRSb29tS2V5c0FzSnNvbiIsImsiLCJlbmNyeXB0TWVnb2xtS2V5RmlsZSIsImYiLCJibG9iIiwiQmxvYiIsInR5cGUiLCJGaWxlU2F2ZXIiLCJzYXZlQXMiLCJjYXRjaCIsImxvZ2dlciIsImVycm9yIiwibXNnIiwiZnJpZW5kbHlUZXh0IiwiX3QiLCJFeHBvcnRpbmciLCJyZW5kZXIiLCJkaXNhYmxlRm9ybSIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJ0aXRsZSIsIm9uU3VibWl0Iiwib25QYXNzcGhyYXNlRm9ybVN1Ym1pdCIsIm1pblNjb3JlIiwibGFiZWwiLCJfdGQiLCJsYWJlbEVudGVyUGFzc3dvcmQiLCJsYWJlbFN0cm9uZ1Bhc3N3b3JkIiwibGFiZWxBbGxvd2VkQnV0VW5zYWZlIiwib25DaGFuZ2UiLCJvblBhc3NwaHJhc2VDaGFuZ2UiLCJhdXRvRm9jdXMiLCJzaXplIiwiZGlzYWJsZWQiLCJhdXRvQ29tcGxldGUiLCJmaWVsZFJlZiIsInBhc3N3b3JkIiwibGFiZWxSZXF1aXJlZCIsImxhYmVsSW52YWxpZCIsIm9uQ2xpY2siLCJvbkNhbmNlbENsaWNrIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hc3luYy1jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3Mvc2VjdXJpdHkvRXhwb3J0RTJlS2V5c0RpYWxvZy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbkNvcHlyaWdodCAyMDE3IFZlY3RvciBDcmVhdGlvbnMgTHRkXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBGaWxlU2F2ZXIgZnJvbSBcImZpbGUtc2F2ZXJcIjtcbmltcG9ydCBSZWFjdCwgeyBDaGFuZ2VFdmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBfdCwgX3RkIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0ICogYXMgTWVnb2xtRXhwb3J0RW5jcnlwdGlvbiBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbHMvTWVnb2xtRXhwb3J0RW5jcnlwdGlvblwiO1xuaW1wb3J0IEJhc2VEaWFsb2cgZnJvbSBcIi4uLy4uLy4uLy4uL2NvbXBvbmVudHMvdmlld3MvZGlhbG9ncy9CYXNlRGlhbG9nXCI7XG5pbXBvcnQgeyBLZXlzU3RhcnRpbmdXaXRoIH0gZnJvbSBcIi4uLy4uLy4uLy4uL0B0eXBlcy9jb21tb25cIjtcbmltcG9ydCBQYXNzcGhyYXNlRmllbGQgZnJvbSBcIi4uLy4uLy4uLy4uL2NvbXBvbmVudHMvdmlld3MvYXV0aC9QYXNzcGhyYXNlRmllbGRcIjtcbmltcG9ydCBQYXNzcGhyYXNlQ29uZmlybUZpZWxkIGZyb20gXCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL3ZpZXdzL2F1dGgvUGFzc3BocmFzZUNvbmZpcm1GaWVsZFwiO1xuaW1wb3J0IEZpZWxkIGZyb20gXCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL0ZpZWxkXCI7XG5cbmVudW0gUGhhc2Uge1xuICAgIEVkaXQgPSBcImVkaXRcIixcbiAgICBFeHBvcnRpbmcgPSBcImV4cG9ydGluZ1wiLFxufVxuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICBtYXRyaXhDbGllbnQ6IE1hdHJpeENsaWVudDtcbiAgICBvbkZpbmlzaGVkKGRvRXhwb3J0PzogYm9vbGVhbik6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIHBoYXNlOiBQaGFzZTtcbiAgICBlcnJTdHI6IHN0cmluZyB8IG51bGw7XG4gICAgcGFzc3BocmFzZTE6IHN0cmluZztcbiAgICBwYXNzcGhyYXNlMjogc3RyaW5nO1xufVxuXG50eXBlIEFueVBhc3NwaHJhc2UgPSBLZXlzU3RhcnRpbmdXaXRoPElTdGF0ZSwgXCJwYXNzcGhyYXNlXCI+O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHBvcnRFMmVLZXlzRGlhbG9nIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgcHJpdmF0ZSBmaWVsZFBhc3N3b3JkOiBGaWVsZCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZmllbGRQYXNzd29yZENvbmZpcm06IEZpZWxkIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHVubW91bnRlZCA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBwaGFzZTogUGhhc2UuRWRpdCxcbiAgICAgICAgICAgIGVyclN0cjogbnVsbCxcbiAgICAgICAgICAgIHBhc3NwaHJhc2UxOiBcIlwiLFxuICAgICAgICAgICAgcGFzc3BocmFzZTI6IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVubW91bnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB2ZXJpZnlGaWVsZHNCZWZvcmVTdWJtaXQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkc0luRGlzcGxheU9yZGVyID0gW3RoaXMuZmllbGRQYXNzd29yZCwgdGhpcy5maWVsZFBhc3N3b3JkQ29uZmlybV07XG5cbiAgICAgICAgY29uc3QgaW52YWxpZEZpZWxkczogRmllbGRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzSW5EaXNwbGF5T3JkZXIpIHtcbiAgICAgICAgICAgIGlmICghZmllbGQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCB2YWxpZCA9IGF3YWl0IGZpZWxkLnZhbGlkYXRlKHsgYWxsb3dFbXB0eTogZmFsc2UgfSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICAgICAgaW52YWxpZEZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnZhbGlkRmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb2N1cyBvbiB0aGUgZmlyc3QgaW52YWxpZCBmaWVsZCwgdGhlbiByZS12YWxpZGF0ZSxcbiAgICAgICAgLy8gd2hpY2ggd2lsbCByZXN1bHQgaW4gdGhlIGVycm9yIHRvb2x0aXAgYmVpbmcgZGlzcGxheWVkIGZvciB0aGF0IGZpZWxkLlxuICAgICAgICBpbnZhbGlkRmllbGRzWzBdLmZvY3VzKCk7XG4gICAgICAgIGludmFsaWRGaWVsZHNbMF0udmFsaWRhdGUoeyBhbGxvd0VtcHR5OiBmYWxzZSwgZm9jdXNlZDogdHJ1ZSB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblBhc3NwaHJhc2VGb3JtU3VibWl0ID0gYXN5bmMgKGV2OiBSZWFjdC5Gb3JtRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLnZlcmlmeUZpZWxkc0JlZm9yZVN1Ym1pdCgpKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy51bm1vdW50ZWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwYXNzcGhyYXNlID0gdGhpcy5zdGF0ZS5wYXNzcGhyYXNlMTtcbiAgICAgICAgdGhpcy5zdGFydEV4cG9ydChwYXNzcGhyYXNlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzdGFydEV4cG9ydChwYXNzcGhyYXNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gZXh0cmEgUHJvbWlzZS5yZXNvbHZlKCkgdG8gdHVybiBzeW5jaHJvbm91cyBleGNlcHRpb25zIGludG9cbiAgICAgICAgLy8gYXN5bmNocm9ub3VzIG9uZXMuXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMubWF0cml4Q2xpZW50LmdldENyeXB0bygpIS5leHBvcnRSb29tS2V5c0FzSnNvbigpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1lZ29sbUV4cG9ydEVuY3J5cHRpb24uZW5jcnlwdE1lZ29sbUtleUZpbGUoaywgcGFzc3BocmFzZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKGYpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2ZdLCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dC9wbGFpbjtjaGFyc2V0PXVzLWFzY2lpXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgRmlsZVNhdmVyLnNhdmVBcyhibG9iLCBcImVsZW1lbnQta2V5cy50eHRcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKHRydWUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGV4cG9ydGluZyBlMmUga2V5czpcIiwgZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudW5tb3VudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gZS5mcmllbmRseVRleHQgfHwgX3QoXCJlcnJvcnx1bmtub3duXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICBlcnJTdHI6IG1zZyxcbiAgICAgICAgICAgICAgICAgICAgcGhhc2U6IFBoYXNlLkVkaXQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGVyclN0cjogbnVsbCxcbiAgICAgICAgICAgIHBoYXNlOiBQaGFzZS5FeHBvcnRpbmcsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DYW5jZWxDbGljayA9IChldjogUmVhY3QuTW91c2VFdmVudCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQoZmFsc2UpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25QYXNzcGhyYXNlQ2hhbmdlID0gKGV2OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PiwgcGhyYXNlOiBBbnlQYXNzcGhyYXNlKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgW3BocmFzZV06IGV2LnRhcmdldC52YWx1ZSxcbiAgICAgICAgfSBhcyBQaWNrPElTdGF0ZSwgQW55UGFzc3BocmFzZT4pO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IGRpc2FibGVGb3JtID0gdGhpcy5zdGF0ZS5waGFzZSA9PT0gUGhhc2UuRXhwb3J0aW5nO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QmFzZURpYWxvZ1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X2V4cG9ydEUyZUtleXNEaWFsb2dcIlxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMucHJvcHMub25GaW5pc2hlZH1cbiAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJzZXR0aW5nc3xrZXlfZXhwb3J0X2ltcG9ydHxleHBvcnRfdGl0bGVcIil9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMub25QYXNzcGhyYXNlRm9ybVN1Ym1pdH0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGlhbG9nX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPntfdChcInNldHRpbmdzfGtleV9leHBvcnRfaW1wb3J0fGV4cG9ydF9kZXNjcmlwdGlvbl8xXCIpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPntfdChcInNldHRpbmdzfGtleV9leHBvcnRfaW1wb3J0fGV4cG9ydF9kZXNjcmlwdGlvbl8yXCIpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZXJyb3JcIj57dGhpcy5zdGF0ZS5lcnJTdHJ9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0UyZUtleXNEaWFsb2dfaW5wdXRUYWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRTJlS2V5c0RpYWxvZ19pbnB1dFJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGFzc3BocmFzZUZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TY29yZT17M31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdGQoXCJzZXR0aW5nc3xrZXlfZXhwb3J0X2ltcG9ydHxlbnRlcl9wYXNzcGhyYXNlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxFbnRlclBhc3N3b3JkPXtfdGQoXCJzZXR0aW5nc3xrZXlfZXhwb3J0X2ltcG9ydHxlbnRlcl9wYXNzcGhyYXNlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxTdHJvbmdQYXNzd29yZD17X3RkKFwic2V0dGluZ3N8a2V5X2V4cG9ydF9pbXBvcnR8cGhyYXNlX3N0cm9uZ19lbm91Z2hcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEFsbG93ZWRCdXRVbnNhZmU9e190ZChcInNldHRpbmdzfGtleV9leHBvcnRfaW1wb3J0fHBocmFzZV9zdHJvbmdfZW5vdWdoXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUucGFzc3BocmFzZTF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGU6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QYXNzcGhyYXNlQ2hhbmdlKGUsIFwicGFzc3BocmFzZTFcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Gb2N1cz17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9ezY0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlRm9ybX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZT1cIm5ldy1wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFJlZj17KGZpZWxkKSA9PiAodGhpcy5maWVsZFBhc3N3b3JkID0gZmllbGQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRTJlS2V5c0RpYWxvZ19pbnB1dFJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGFzc3BocmFzZUNvbmZpcm1GaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ9e3RoaXMuc3RhdGUucGFzc3BocmFzZTF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3RkKFwic2V0dGluZ3N8a2V5X2V4cG9ydF9pbXBvcnR8Y29uZmlybV9wYXNzcGhyYXNlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxSZXF1aXJlZD17X3RkKFwic2V0dGluZ3N8a2V5X2V4cG9ydF9pbXBvcnR8cGhyYXNlX2Nhbm5vdF9iZV9lbXB0eVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsSW52YWxpZD17X3RkKFwic2V0dGluZ3N8a2V5X2V4cG9ydF9pbXBvcnR8cGhyYXNlX211c3RfbWF0Y2hcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5wYXNzcGhyYXNlMn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZTogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblBhc3NwaHJhc2VDaGFuZ2UoZSwgXCJwYXNzcGhyYXNlMlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT17NjR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVGb3JtfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlPVwibmV3LXBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmPXsoZmllbGQpID0+ICh0aGlzLmZpZWxkUGFzc3dvcmRDb25maXJtID0gZmllbGQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0RpYWxvZ19idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9EaWFsb2dfcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e190KFwiYWN0aW9ufGV4cG9ydFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZUZvcm19XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXt0aGlzLm9uQ2FuY2VsQ2xpY2t9IGRpc2FibGVkPXtkaXNhYmxlRm9ybX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFwiYWN0aW9ufGNhbmNlbFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8L0Jhc2VEaWFsb2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLGdCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxzQkFBQSxHQUFBQyx1QkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQU0sV0FBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQU8sZ0JBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLHVCQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFBOEYsU0FBQVMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQUwsd0JBQUFLLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEs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