UNPKG

matrix-react-sdk

Version:
161 lines (155 loc) 22.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.AbortedIdentityActionError = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _matrix = require("matrix-js-sdk/src/matrix"); var _logger = require("matrix-js-sdk/src/logger"); var _MatrixClientPeg = require("./MatrixClientPeg"); var _Modal = _interopRequireDefault(require("./Modal")); var _languageHandler = require("./languageHandler"); var _Terms = require("./Terms"); var _IdentityServerUtils = require("./utils/IdentityServerUtils"); var _QuestionDialog = _interopRequireDefault(require("./components/views/dialogs/QuestionDialog")); var _UrlUtils = require("./utils/UrlUtils"); /* Copyright 2024 New Vector Ltd. Copyright 2019 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. */ class AbortedIdentityActionError extends Error {} exports.AbortedIdentityActionError = AbortedIdentityActionError; class IdentityAuthClient { /** * Creates a new identity auth client * @param {string} identityUrl The URL to contact the identity server with. * When provided, this class will operate solely within memory, refusing to * persist any information such as tokens. Default null (not provided). */ constructor(identityUrl) { (0, _defineProperty2.default)(this, "accessToken", null); (0, _defineProperty2.default)(this, "tempClient", void 0); (0, _defineProperty2.default)(this, "authEnabled", true); if (identityUrl) { // XXX: We shouldn't have to create a whole new MatrixClient just to // do identity server auth. The functions don't take an identity URL // though, and making all of them take one could lead to developer // confusion about what the idBaseUrl does on a client. Therefore, we // just make a new client and live with it. this.tempClient = (0, _matrix.createClient)({ baseUrl: "", // invalid by design idBaseUrl: identityUrl }); } } // This client must not be used for general operations as it may not have a baseUrl or be running (tempClient). get identityClient() { return this.tempClient ?? this.matrixClient; } get matrixClient() { return _MatrixClientPeg.MatrixClientPeg.safeGet(); } writeToken() { if (this.tempClient) return; // temporary client: ignore if (this.accessToken) { window.localStorage.setItem("mx_is_access_token", this.accessToken); } else { window.localStorage.removeItem("mx_is_access_token"); } } readToken() { if (this.tempClient) return null; // temporary client: ignore return window.localStorage.getItem("mx_is_access_token"); } // Returns a promise that resolves to the access_token string from the IS async getAccessToken({ check = true } = {}) { if (!this.authEnabled) { // The current IS doesn't support authentication return null; } let token = this.accessToken; if (!token) { token = this.readToken(); } if (!token) { token = await this.registerForToken(check); if (token) { this.accessToken = token; this.writeToken(); } return token; } if (check) { try { await this.checkToken(token); } catch (e) { if (e instanceof _Terms.TermsNotSignedError || e instanceof AbortedIdentityActionError) { // Retrying won't help this throw e; } // Retry in case token expired token = await this.registerForToken(); if (token) { this.accessToken = token; this.writeToken(); } } } return token; } async checkToken(token) { const identityServerUrl = this.identityClient.getIdentityServerUrl(); try { await this.identityClient.getIdentityAccount(token); } catch (e) { if (e instanceof _matrix.MatrixError && e.errcode === "M_TERMS_NOT_SIGNED") { _logger.logger.log("Identity server requires new terms to be agreed to"); await (0, _Terms.startTermsFlow)(this.matrixClient, [new _Terms.Service(_matrix.SERVICE_TYPES.IS, identityServerUrl, token)]); return; } throw e; } if (!this.tempClient && !(0, _IdentityServerUtils.doesAccountDataHaveIdentityServer)(this.matrixClient) && !(await (0, _IdentityServerUtils.doesIdentityServerHaveTerms)(this.matrixClient, identityServerUrl))) { const { finished } = _Modal.default.createDialog(_QuestionDialog.default, { title: (0, _languageHandler._t)("terms|identity_server_no_terms_title"), description: /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("terms|identity_server_no_terms_description_1", {}, { server: () => /*#__PURE__*/_react.default.createElement("strong", null, (0, _UrlUtils.abbreviateUrl)(identityServerUrl)) })), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("terms|identity_server_no_terms_description_2"))), button: (0, _languageHandler._t)("action|trust") }); const [confirmed] = await finished; if (confirmed) { (0, _IdentityServerUtils.setToDefaultIdentityServer)(this.matrixClient); } else { throw new AbortedIdentityActionError("User aborted identity server action without terms"); } } // We should ensure the token in `localStorage` is cleared // appropriately. We already clear storage on sign out, but we'll need // additional clearing when changing ISes in settings as part of future // privacy work. // See also https://github.com/vector-im/element-web/issues/10455. } async registerForToken(check = true) { const hsOpenIdToken = await _MatrixClientPeg.MatrixClientPeg.safeGet().getOpenIdToken(); // XXX: The spec is `token`, but we used `access_token` for a Sydent release. const { access_token: accessToken, token } = await this.identityClient.registerWithIdentityServer(hsOpenIdToken); const identityAccessToken = token ? token : accessToken; if (check) await this.checkToken(identityAccessToken); return identityAccessToken; } } exports.default = IdentityAuthClient; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfbG9nZ2VyIiwiX01hdHJpeENsaWVudFBlZyIsIl9Nb2RhbCIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfVGVybXMiLCJfSWRlbnRpdHlTZXJ2ZXJVdGlscyIsIl9RdWVzdGlvbkRpYWxvZyIsIl9VcmxVdGlscyIsIkFib3J0ZWRJZGVudGl0eUFjdGlvbkVycm9yIiwiRXJyb3IiLCJleHBvcnRzIiwiSWRlbnRpdHlBdXRoQ2xpZW50IiwiY29uc3RydWN0b3IiLCJpZGVudGl0eVVybCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwidGVtcENsaWVudCIsImNyZWF0ZUNsaWVudCIsImJhc2VVcmwiLCJpZEJhc2VVcmwiLCJpZGVudGl0eUNsaWVudCIsIm1hdHJpeENsaWVudCIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJ3cml0ZVRva2VuIiwiYWNjZXNzVG9rZW4iLCJ3aW5kb3ciLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsInJlYWRUb2tlbiIsImdldEl0ZW0iLCJnZXRBY2Nlc3NUb2tlbiIsImNoZWNrIiwiYXV0aEVuYWJsZWQiLCJ0b2tlbiIsInJlZ2lzdGVyRm9yVG9rZW4iLCJjaGVja1Rva2VuIiwiZSIsIlRlcm1zTm90U2lnbmVkRXJyb3IiLCJpZGVudGl0eVNlcnZlclVybCIsImdldElkZW50aXR5U2VydmVyVXJsIiwiZ2V0SWRlbnRpdHlBY2NvdW50IiwiTWF0cml4RXJyb3IiLCJlcnJjb2RlIiwibG9nZ2VyIiwibG9nIiwic3RhcnRUZXJtc0Zsb3ciLCJTZXJ2aWNlIiwiU0VSVklDRV9UWVBFUyIsIklTIiwiZG9lc0FjY291bnREYXRhSGF2ZUlkZW50aXR5U2VydmVyIiwiZG9lc0lkZW50aXR5U2VydmVySGF2ZVRlcm1zIiwiZmluaXNoZWQiLCJNb2RhbCIsImNyZWF0ZURpYWxvZyIsIlF1ZXN0aW9uRGlhbG9nIiwidGl0bGUiLCJfdCIsImRlc2NyaXB0aW9uIiwiY3JlYXRlRWxlbWVudCIsInNlcnZlciIsImFiYnJldmlhdGVVcmwiLCJidXR0b24iLCJjb25maXJtZWQiLCJzZXRUb0RlZmF1bHRJZGVudGl0eVNlcnZlciIsImhzT3BlbklkVG9rZW4iLCJnZXRPcGVuSWRUb2tlbiIsImFjY2Vzc190b2tlbiIsInJlZ2lzdGVyV2l0aElkZW50aXR5U2VydmVyIiwiaWRlbnRpdHlBY2Nlc3NUb2tlbiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9JZGVudGl0eUF1dGhDbGllbnQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFNFUlZJQ0VfVFlQRVMsIGNyZWF0ZUNsaWVudCwgTWF0cml4Q2xpZW50LCBNYXRyaXhFcnJvciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgTW9kYWwgZnJvbSBcIi4vTW9kYWxcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBTZXJ2aWNlLCBzdGFydFRlcm1zRmxvdywgVGVybXNOb3RTaWduZWRFcnJvciB9IGZyb20gXCIuL1Rlcm1zXCI7XG5pbXBvcnQge1xuICAgIGRvZXNBY2NvdW50RGF0YUhhdmVJZGVudGl0eVNlcnZlcixcbiAgICBkb2VzSWRlbnRpdHlTZXJ2ZXJIYXZlVGVybXMsXG4gICAgc2V0VG9EZWZhdWx0SWRlbnRpdHlTZXJ2ZXIsXG59IGZyb20gXCIuL3V0aWxzL0lkZW50aXR5U2VydmVyVXRpbHNcIjtcbmltcG9ydCBRdWVzdGlvbkRpYWxvZyBmcm9tIFwiLi9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvUXVlc3Rpb25EaWFsb2dcIjtcbmltcG9ydCB7IGFiYnJldmlhdGVVcmwgfSBmcm9tIFwiLi91dGlscy9VcmxVdGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgQWJvcnRlZElkZW50aXR5QWN0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJZGVudGl0eUF1dGhDbGllbnQge1xuICAgIHByaXZhdGUgYWNjZXNzVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgdGVtcENsaWVudD86IE1hdHJpeENsaWVudDtcbiAgICBwcml2YXRlIGF1dGhFbmFibGVkID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgYXV0aCBjbGllbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWRlbnRpdHlVcmwgVGhlIFVSTCB0byBjb250YWN0IHRoZSBpZGVudGl0eSBzZXJ2ZXIgd2l0aC5cbiAgICAgKiBXaGVuIHByb3ZpZGVkLCB0aGlzIGNsYXNzIHdpbGwgb3BlcmF0ZSBzb2xlbHkgd2l0aGluIG1lbW9yeSwgcmVmdXNpbmcgdG9cbiAgICAgKiBwZXJzaXN0IGFueSBpbmZvcm1hdGlvbiBzdWNoIGFzIHRva2Vucy4gRGVmYXVsdCBudWxsIChub3QgcHJvdmlkZWQpLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihpZGVudGl0eVVybD86IHN0cmluZykge1xuICAgICAgICBpZiAoaWRlbnRpdHlVcmwpIHtcbiAgICAgICAgICAgIC8vIFhYWDogV2Ugc2hvdWxkbid0IGhhdmUgdG8gY3JlYXRlIGEgd2hvbGUgbmV3IE1hdHJpeENsaWVudCBqdXN0IHRvXG4gICAgICAgICAgICAvLyBkbyBpZGVudGl0eSBzZXJ2ZXIgYXV0aC4gVGhlIGZ1bmN0aW9ucyBkb24ndCB0YWtlIGFuIGlkZW50aXR5IFVSTFxuICAgICAgICAgICAgLy8gdGhvdWdoLCBhbmQgbWFraW5nIGFsbCBvZiB0aGVtIHRha2Ugb25lIGNvdWxkIGxlYWQgdG8gZGV2ZWxvcGVyXG4gICAgICAgICAgICAvLyBjb25mdXNpb24gYWJvdXQgd2hhdCB0aGUgaWRCYXNlVXJsIGRvZXMgb24gYSBjbGllbnQuIFRoZXJlZm9yZSwgd2VcbiAgICAgICAgICAgIC8vIGp1c3QgbWFrZSBhIG5ldyBjbGllbnQgYW5kIGxpdmUgd2l0aCBpdC5cbiAgICAgICAgICAgIHRoaXMudGVtcENsaWVudCA9IGNyZWF0ZUNsaWVudCh7XG4gICAgICAgICAgICAgICAgYmFzZVVybDogXCJcIiwgLy8gaW52YWxpZCBieSBkZXNpZ25cbiAgICAgICAgICAgICAgICBpZEJhc2VVcmw6IGlkZW50aXR5VXJsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIGNsaWVudCBtdXN0IG5vdCBiZSB1c2VkIGZvciBnZW5lcmFsIG9wZXJhdGlvbnMgYXMgaXQgbWF5IG5vdCBoYXZlIGEgYmFzZVVybCBvciBiZSBydW5uaW5nICh0ZW1wQ2xpZW50KS5cbiAgICBwcml2YXRlIGdldCBpZGVudGl0eUNsaWVudCgpOiBNYXRyaXhDbGllbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50ZW1wQ2xpZW50ID8/IHRoaXMubWF0cml4Q2xpZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IG1hdHJpeENsaWVudCgpOiBNYXRyaXhDbGllbnQge1xuICAgICAgICByZXR1cm4gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlVG9rZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRlbXBDbGllbnQpIHJldHVybjsgLy8gdGVtcG9yYXJ5IGNsaWVudDogaWdub3JlXG4gICAgICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJteF9pc19hY2Nlc3NfdG9rZW5cIiwgdGhpcy5hY2Nlc3NUb2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJteF9pc19hY2Nlc3NfdG9rZW5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMudGVtcENsaWVudCkgcmV0dXJuIG51bGw7IC8vIHRlbXBvcmFyeSBjbGllbnQ6IGlnbm9yZVxuICAgICAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibXhfaXNfYWNjZXNzX3Rva2VuXCIpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGFjY2Vzc190b2tlbiBzdHJpbmcgZnJvbSB0aGUgSVNcbiAgICBwdWJsaWMgYXN5bmMgZ2V0QWNjZXNzVG9rZW4oeyBjaGVjayA9IHRydWUgfSA9IHt9KTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRoRW5hYmxlZCkge1xuICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgSVMgZG9lc24ndCBzdXBwb3J0IGF1dGhlbnRpY2F0aW9uXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0b2tlbjogc3RyaW5nIHwgbnVsbCA9IHRoaXMuYWNjZXNzVG9rZW47XG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRva2VuID0gdGhpcy5yZWFkVG9rZW4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5yZWdpc3RlckZvclRva2VuKGNoZWNrKTtcbiAgICAgICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlVG9rZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGVjaykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVG9rZW4odG9rZW4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVGVybXNOb3RTaWduZWRFcnJvciB8fCBlIGluc3RhbmNlb2YgQWJvcnRlZElkZW50aXR5QWN0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmV0cnlpbmcgd29uJ3QgaGVscCB0aGlzXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFJldHJ5IGluIGNhc2UgdG9rZW4gZXhwaXJlZFxuICAgICAgICAgICAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5yZWdpc3RlckZvclRva2VuKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVRva2VuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlkZW50aXR5U2VydmVyVXJsID0gdGhpcy5pZGVudGl0eUNsaWVudC5nZXRJZGVudGl0eVNlcnZlclVybCgpITtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5pZGVudGl0eUNsaWVudC5nZXRJZGVudGl0eUFjY291bnQodG9rZW4pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE1hdHJpeEVycm9yICYmIGUuZXJyY29kZSA9PT0gXCJNX1RFUk1TX05PVF9TSUdORURcIikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coXCJJZGVudGl0eSBzZXJ2ZXIgcmVxdWlyZXMgbmV3IHRlcm1zIHRvIGJlIGFncmVlZCB0b1wiKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBzdGFydFRlcm1zRmxvdyh0aGlzLm1hdHJpeENsaWVudCwgW25ldyBTZXJ2aWNlKFNFUlZJQ0VfVFlQRVMuSVMsIGlkZW50aXR5U2VydmVyVXJsLCB0b2tlbildKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMudGVtcENsaWVudCAmJlxuICAgICAgICAgICAgIWRvZXNBY2NvdW50RGF0YUhhdmVJZGVudGl0eVNlcnZlcih0aGlzLm1hdHJpeENsaWVudCkgJiZcbiAgICAgICAgICAgICEoYXdhaXQgZG9lc0lkZW50aXR5U2VydmVySGF2ZVRlcm1zKHRoaXMubWF0cml4Q2xpZW50LCBpZGVudGl0eVNlcnZlclVybCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgeyBmaW5pc2hlZCB9ID0gTW9kYWwuY3JlYXRlRGlhbG9nKFF1ZXN0aW9uRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IF90KFwidGVybXN8aWRlbnRpdHlfc2VydmVyX25vX3Rlcm1zX3RpdGxlXCIpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGVybXN8aWRlbnRpdHlfc2VydmVyX25vX3Rlcm1zX2Rlc2NyaXB0aW9uXzFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcjogKCkgPT4gPHN0cm9uZz57YWJicmV2aWF0ZVVybChpZGVudGl0eVNlcnZlclVybCl9PC9zdHJvbmc+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD57X3QoXCJ0ZXJtc3xpZGVudGl0eV9zZXJ2ZXJfbm9fdGVybXNfZGVzY3JpcHRpb25fMlwiKX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgYnV0dG9uOiBfdChcImFjdGlvbnx0cnVzdFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgW2NvbmZpcm1lZF0gPSBhd2FpdCBmaW5pc2hlZDtcbiAgICAgICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICBzZXRUb0RlZmF1bHRJZGVudGl0eVNlcnZlcih0aGlzLm1hdHJpeENsaWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydGVkSWRlbnRpdHlBY3Rpb25FcnJvcihcIlVzZXIgYWJvcnRlZCBpZGVudGl0eSBzZXJ2ZXIgYWN0aW9uIHdpdGhvdXQgdGVybXNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBzaG91bGQgZW5zdXJlIHRoZSB0b2tlbiBpbiBgbG9jYWxTdG9yYWdlYCBpcyBjbGVhcmVkXG4gICAgICAgIC8vIGFwcHJvcHJpYXRlbHkuIFdlIGFscmVhZHkgY2xlYXIgc3RvcmFnZSBvbiBzaWduIG91dCwgYnV0IHdlJ2xsIG5lZWRcbiAgICAgICAgLy8gYWRkaXRpb25hbCBjbGVhcmluZyB3aGVuIGNoYW5naW5nIElTZXMgaW4gc2V0dGluZ3MgYXMgcGFydCBvZiBmdXR1cmVcbiAgICAgICAgLy8gcHJpdmFjeSB3b3JrLlxuICAgICAgICAvLyBTZWUgYWxzbyBodHRwczovL2dpdGh1Yi5jb20vdmVjdG9yLWltL2VsZW1lbnQtd2ViL2lzc3Vlcy8xMDQ1NS5cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJGb3JUb2tlbihjaGVjayA9IHRydWUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBoc09wZW5JZFRva2VuID0gYXdhaXQgTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRPcGVuSWRUb2tlbigpO1xuICAgICAgICAvLyBYWFg6IFRoZSBzcGVjIGlzIGB0b2tlbmAsIGJ1dCB3ZSB1c2VkIGBhY2Nlc3NfdG9rZW5gIGZvciBhIFN5ZGVudCByZWxlYXNlLlxuICAgICAgICBjb25zdCB7IGFjY2Vzc190b2tlbjogYWNjZXNzVG9rZW4sIHRva2VuIH0gPVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pZGVudGl0eUNsaWVudC5yZWdpc3RlcldpdGhJZGVudGl0eVNlcnZlcihoc09wZW5JZFRva2VuKTtcbiAgICAgICAgY29uc3QgaWRlbnRpdHlBY2Nlc3NUb2tlbiA9IHRva2VuID8gdG9rZW4gOiBhY2Nlc3NUb2tlbjtcbiAgICAgICAgaWYgKGNoZWNrKSBhd2FpdCB0aGlzLmNoZWNrVG9rZW4oaWRlbnRpdHlBY2Nlc3NUb2tlbik7XG4gICAgICAgIHJldHVybiBpZGVudGl0eUFjY2Vzc1Rva2VuO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssZ0JBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLG9CQUFBLEdBQUFQLE9BQUE7QUFLQSxJQUFBUSxlQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUyxTQUFBLEdBQUFULE9BQUE7QUF0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBa0JPLE1BQU1VLDBCQUEwQixTQUFTQyxLQUFLLENBQUM7QUFBRUMsT0FBQSxDQUFBRiwwQkFBQSxHQUFBQSwwQkFBQTtBQUV6QyxNQUFNRyxrQkFBa0IsQ0FBQztFQUtwQztBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDV0MsV0FBV0EsQ0FBQ0MsV0FBb0IsRUFBRTtJQUFBLElBQUFDLGdCQUFBLENBQUFDLE9BQUEsdUJBVkosSUFBSTtJQUFBLElBQUFELGdCQUFBLENBQUFDLE9BQUE7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBLHVCQUVuQixJQUFJO0lBU3RCLElBQUlGLFdBQVcsRUFBRTtNQUNiO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQSxJQUFJLENBQUNHLFVBQVUsR0FBRyxJQUFBQyxvQkFBWSxFQUFDO1FBQzNCQyxPQUFPLEVBQUUsRUFBRTtRQUFFO1FBQ2JDLFNBQVMsRUFBRU47TUFDZixDQUFDLENBQUM7SUFDTjtFQUNKOztFQUVBO0VB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