matrix-react-sdk
Version:
SDK for matrix.org using React
156 lines (152 loc) • 27.1 kB
JavaScript
;
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 _matrix = require("matrix-js-sdk/src/matrix");
var _languageHandler = require("../../../languageHandler");
var _DialogButtons = _interopRequireDefault(require("../elements/DialogButtons"));
var _BaseDialog = _interopRequireDefault(require("./BaseDialog"));
var _ExternalLink = _interopRequireDefault(require("../elements/ExternalLink"));
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 TermsCheckbox extends _react.default.PureComponent {
constructor(...args) {
super(...args);
(0, _defineProperty2.default)(this, "onChange", ev => {
this.props.onChange(this.props.url, ev.currentTarget.checked);
});
}
render() {
return /*#__PURE__*/_react.default.createElement("input", {
type: "checkbox",
onChange: this.onChange,
checked: this.props.checked
});
}
}
class TermsDialog extends _react.default.PureComponent {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "onCancelClick", () => {
this.props.onFinished(false);
});
(0, _defineProperty2.default)(this, "onNextClick", () => {
this.props.onFinished(true, Object.keys(this.state.agreedUrls).filter(url => this.state.agreedUrls[url]));
});
(0, _defineProperty2.default)(this, "onTermsCheckboxChange", (url, checked) => {
this.setState({
agreedUrls: Object.assign({}, this.state.agreedUrls, {
[url]: checked
})
});
});
this.state = {
// url -> boolean
agreedUrls: {}
};
for (const url of props.agreedUrls) {
this.state.agreedUrls[url] = true;
}
}
nameForServiceType(serviceType, host) {
switch (serviceType) {
case _matrix.SERVICE_TYPES.IS:
return /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("common|identity_server"), /*#__PURE__*/_react.default.createElement("br", null), "(", host, ")");
case _matrix.SERVICE_TYPES.IM:
return /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("common|integration_manager"), /*#__PURE__*/_react.default.createElement("br", null), "(", host, ")");
}
}
summaryForServiceType(serviceType) {
switch (serviceType) {
case _matrix.SERVICE_TYPES.IS:
return /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("terms|summary_identity_server_1"), /*#__PURE__*/_react.default.createElement("br", null), (0, _languageHandler._t)("terms|summary_identity_server_2"));
case _matrix.SERVICE_TYPES.IM:
return /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("terms|integration_manager"));
}
}
render() {
const rows = [];
for (const policiesAndService of this.props.policiesAndServicePairs) {
const parsedBaseUrl = (0, _UrlUtils.parseUrl)(policiesAndService.service.baseUrl);
const policyValues = Object.values(policiesAndService.policies);
for (let i = 0; i < policyValues.length; ++i) {
const termDoc = policyValues[i];
const termsLang = (0, _languageHandler.pickBestLanguage)(Object.keys(termDoc).filter(k => k !== "version"));
let serviceName;
let summary;
if (i === 0) {
serviceName = this.nameForServiceType(policiesAndService.service.serviceType, parsedBaseUrl.host);
summary = this.summaryForServiceType(policiesAndService.service.serviceType);
}
rows.push( /*#__PURE__*/_react.default.createElement("tr", {
key: termDoc[termsLang].url
}, /*#__PURE__*/_react.default.createElement("td", {
className: "mx_TermsDialog_service"
}, serviceName), /*#__PURE__*/_react.default.createElement("td", {
className: "mx_TermsDialog_summary"
}, summary), /*#__PURE__*/_react.default.createElement("td", null, /*#__PURE__*/_react.default.createElement(_ExternalLink.default, {
rel: "noreferrer noopener",
target: "_blank",
href: termDoc[termsLang].url
}, termDoc[termsLang].name)), /*#__PURE__*/_react.default.createElement("td", null, /*#__PURE__*/_react.default.createElement(TermsCheckbox, {
url: termDoc[termsLang].url,
onChange: this.onTermsCheckboxChange,
checked: Boolean(this.state.agreedUrls[termDoc[termsLang].url])
}))));
}
}
// if all the documents for at least one service have been checked, we can enable
// the submit button
let enableSubmit = false;
for (const policiesAndService of this.props.policiesAndServicePairs) {
let docsAgreedForService = 0;
for (const terms of Object.values(policiesAndService.policies)) {
let docAgreed = false;
for (const lang of Object.keys(terms)) {
if (lang === "version") continue;
if (this.state.agreedUrls[terms[lang].url]) {
docAgreed = true;
break;
}
}
if (docAgreed) {
++docsAgreedForService;
}
}
if (docsAgreedForService === Object.keys(policiesAndService.policies).length) {
enableSubmit = true;
break;
}
}
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
fixedWidth: false,
onFinished: this.onCancelClick,
title: (0, _languageHandler._t)("terms|tos"),
contentId: "mx_Dialog_content",
hasCancel: false
}, /*#__PURE__*/_react.default.createElement("div", {
id: "mx_Dialog_content"
}, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("terms|intro")), /*#__PURE__*/_react.default.createElement("table", {
className: "mx_TermsDialog_termsTable"
}, /*#__PURE__*/_react.default.createElement("tbody", null, /*#__PURE__*/_react.default.createElement("tr", {
className: "mx_TermsDialog_termsTableHeader"
}, /*#__PURE__*/_react.default.createElement("th", null, (0, _languageHandler._t)("terms|column_service")), /*#__PURE__*/_react.default.createElement("th", null, (0, _languageHandler._t)("terms|column_summary")), /*#__PURE__*/_react.default.createElement("th", null, (0, _languageHandler._t)("terms|column_document")), /*#__PURE__*/_react.default.createElement("th", null, (0, _languageHandler._t)("action|accept"))), rows))), /*#__PURE__*/_react.default.createElement(_DialogButtons.default, {
primaryButton: (0, _languageHandler._t)("action|next"),
hasCancel: true,
onCancel: this.onCancelClick,
onPrimaryButtonClick: this.onNextClick,
primaryDisabled: !enableSubmit
}));
}
}
exports.default = TermsDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX0RpYWxvZ0J1dHRvbnMiLCJfQmFzZURpYWxvZyIsIl9FeHRlcm5hbExpbmsiLCJfVXJsVXRpbHMiLCJUZXJtc0NoZWNrYm94IiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJhcmdzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJldiIsInByb3BzIiwib25DaGFuZ2UiLCJ1cmwiLCJjdXJyZW50VGFyZ2V0IiwiY2hlY2tlZCIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJ0eXBlIiwiVGVybXNEaWFsb2ciLCJvbkZpbmlzaGVkIiwiT2JqZWN0Iiwia2V5cyIsInN0YXRlIiwiYWdyZWVkVXJscyIsImZpbHRlciIsInNldFN0YXRlIiwiYXNzaWduIiwibmFtZUZvclNlcnZpY2VUeXBlIiwic2VydmljZVR5cGUiLCJob3N0IiwiU0VSVklDRV9UWVBFUyIsIklTIiwiX3QiLCJJTSIsInN1bW1hcnlGb3JTZXJ2aWNlVHlwZSIsInJvd3MiLCJwb2xpY2llc0FuZFNlcnZpY2UiLCJwb2xpY2llc0FuZFNlcnZpY2VQYWlycyIsInBhcnNlZEJhc2VVcmwiLCJwYXJzZVVybCIsInNlcnZpY2UiLCJiYXNlVXJsIiwicG9saWN5VmFsdWVzIiwidmFsdWVzIiwicG9saWNpZXMiLCJpIiwibGVuZ3RoIiwidGVybURvYyIsInRlcm1zTGFuZyIsInBpY2tCZXN0TGFuZ3VhZ2UiLCJrIiwic2VydmljZU5hbWUiLCJzdW1tYXJ5IiwicHVzaCIsImtleSIsImNsYXNzTmFtZSIsInJlbCIsInRhcmdldCIsImhyZWYiLCJuYW1lIiwib25UZXJtc0NoZWNrYm94Q2hhbmdlIiwiQm9vbGVhbiIsImVuYWJsZVN1Ym1pdCIsImRvY3NBZ3JlZWRGb3JTZXJ2aWNlIiwidGVybXMiLCJkb2NBZ3JlZWQiLCJsYW5nIiwiZml4ZWRXaWR0aCIsIm9uQ2FuY2VsQ2xpY2siLCJ0aXRsZSIsImNvbnRlbnRJZCIsImhhc0NhbmNlbCIsImlkIiwicHJpbWFyeUJ1dHRvbiIsIm9uQ2FuY2VsIiwib25QcmltYXJ5QnV0dG9uQ2xpY2siLCJvbk5leHRDbGljayIsInByaW1hcnlEaXNhYmxlZCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL1Rlcm1zRGlhbG9nLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTRVJWSUNFX1RZUEVTIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgeyBfdCwgcGlja0Jlc3RMYW5ndWFnZSB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBEaWFsb2dCdXR0b25zIGZyb20gXCIuLi9lbGVtZW50cy9EaWFsb2dCdXR0b25zXCI7XG5pbXBvcnQgQmFzZURpYWxvZyBmcm9tIFwiLi9CYXNlRGlhbG9nXCI7XG5pbXBvcnQgeyBTZXJ2aWNlUG9saWN5UGFpciB9IGZyb20gXCIuLi8uLi8uLi9UZXJtc1wiO1xuaW1wb3J0IEV4dGVybmFsTGluayBmcm9tIFwiLi4vZWxlbWVudHMvRXh0ZXJuYWxMaW5rXCI7XG5pbXBvcnQgeyBwYXJzZVVybCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9VcmxVdGlsc1wiO1xuXG5pbnRlcmZhY2UgSVRlcm1zQ2hlY2tib3hQcm9wcyB7XG4gICAgb25DaGFuZ2U6ICh1cmw6IHN0cmluZywgY2hlY2tlZDogYm9vbGVhbikgPT4gdm9pZDtcbiAgICB1cmw6IHN0cmluZztcbiAgICBjaGVja2VkOiBib29sZWFuO1xufVxuXG5jbGFzcyBUZXJtc0NoZWNrYm94IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJVGVybXNDaGVja2JveFByb3BzPiB7XG4gICAgcHJpdmF0ZSBvbkNoYW5nZSA9IChldjogUmVhY3QuRm9ybUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy51cmwsIGV2LmN1cnJlbnRUYXJnZXQuY2hlY2tlZCk7XG4gICAgfTtcblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgcmV0dXJuIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZX0gY2hlY2tlZD17dGhpcy5wcm9wcy5jaGVja2VkfSAvPjtcbiAgICB9XG59XG5cbmludGVyZmFjZSBJVGVybXNEaWFsb2dQcm9wcyB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgW1NlcnZpY2UsIHBvbGljaWVzXSBwYWlycywgd2hlcmUgcG9saWNpZXMgaXMgdGhlIHJlc3BvbnNlIGZyb20gdGhlXG4gICAgICogL3Rlcm1zIGVuZHBvaW50IGZvciB0aGF0IHNlcnZpY2VcbiAgICAgKi9cbiAgICBwb2xpY2llc0FuZFNlcnZpY2VQYWlyczogU2VydmljZVBvbGljeVBhaXJbXTtcblxuICAgIC8qKlxuICAgICAqIHVybHMgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSBhZ3JlZWQgdG9cbiAgICAgKi9cbiAgICBhZ3JlZWRVcmxzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aXRoOlxuICAgICAqICAgICAqIHN1Y2Nlc3Mge2Jvb2x9IFRydWUgaWYgdGhlIHVzZXIgYWNjZXB0ZWQgYW55IGRvdW1lbnRzLCBmYWxzZSBpZiBjYW5jZWxsZWRcbiAgICAgKiAgICAgKiBhZ3JlZWRVcmxzIHtzdHJpbmdbXX0gTGlzdCBvZiBhZ3JlZWQgVVJMc1xuICAgICAqL1xuICAgIG9uRmluaXNoZWQ6IChzdWNjZXNzOiBib29sZWFuLCBhZ3JlZWRVcmxzPzogc3RyaW5nW10pID0+IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIGFncmVlZFVybHM6IGFueTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVybXNEaWFsb2cgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50PElUZXJtc0RpYWxvZ1Byb3BzLCBJU3RhdGU+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElUZXJtc0RpYWxvZ1Byb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIC8vIHVybCAtPiBib29sZWFuXG4gICAgICAgICAgICBhZ3JlZWRVcmxzOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCB1cmwgb2YgcHJvcHMuYWdyZWVkVXJscykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5hZ3JlZWRVcmxzW3VybF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNhbmNlbENsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQoZmFsc2UpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uTmV4dENsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQoXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdGF0ZS5hZ3JlZWRVcmxzKS5maWx0ZXIoKHVybCkgPT4gdGhpcy5zdGF0ZS5hZ3JlZWRVcmxzW3VybF0pLFxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG5hbWVGb3JTZXJ2aWNlVHlwZShzZXJ2aWNlVHlwZTogU0VSVklDRV9UWVBFUywgaG9zdDogc3RyaW5nKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBzd2l0Y2ggKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNFUlZJQ0VfVFlQRVMuSVM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImNvbW1vbnxpZGVudGl0eV9zZXJ2ZXJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4oe2hvc3R9KVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBTRVJWSUNFX1RZUEVTLklNOlxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJjb21tb258aW50ZWdyYXRpb25fbWFuYWdlclwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPih7aG9zdH0pXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN1bW1hcnlGb3JTZXJ2aWNlVHlwZShzZXJ2aWNlVHlwZTogU0VSVklDRV9UWVBFUyk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgc3dpdGNoIChzZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTRVJWSUNFX1RZUEVTLklTOlxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJ0ZXJtc3xzdW1tYXJ5X2lkZW50aXR5X3NlcnZlcl8xXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJ0ZXJtc3xzdW1tYXJ5X2lkZW50aXR5X3NlcnZlcl8yXCIpfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBTRVJWSUNFX1RZUEVTLklNOlxuICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2PntfdChcInRlcm1zfGludGVncmF0aW9uX21hbmFnZXJcIil9PC9kaXY+O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRlcm1zQ2hlY2tib3hDaGFuZ2UgPSAodXJsOiBzdHJpbmcsIGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBhZ3JlZWRVcmxzOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmFncmVlZFVybHMsIHsgW3VybF06IGNoZWNrZWQgfSksXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IHJvd3M6IEpTWC5FbGVtZW50W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwb2xpY2llc0FuZFNlcnZpY2Ugb2YgdGhpcy5wcm9wcy5wb2xpY2llc0FuZFNlcnZpY2VQYWlycykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQmFzZVVybCA9IHBhcnNlVXJsKHBvbGljaWVzQW5kU2VydmljZS5zZXJ2aWNlLmJhc2VVcmwpO1xuXG4gICAgICAgICAgICBjb25zdCBwb2xpY3lWYWx1ZXMgPSBPYmplY3QudmFsdWVzKHBvbGljaWVzQW5kU2VydmljZS5wb2xpY2llcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbGljeVZhbHVlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1Eb2MgPSBwb2xpY3lWYWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgdGVybXNMYW5nID0gcGlja0Jlc3RMYW5ndWFnZShPYmplY3Qua2V5cyh0ZXJtRG9jKS5maWx0ZXIoKGspID0+IGsgIT09IFwidmVyc2lvblwiKSk7XG4gICAgICAgICAgICAgICAgbGV0IHNlcnZpY2VOYW1lOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsZXQgc3VtbWFyeTogSlNYLkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSB0aGlzLm5hbWVGb3JTZXJ2aWNlVHlwZShwb2xpY2llc0FuZFNlcnZpY2Uuc2VydmljZS5zZXJ2aWNlVHlwZSwgcGFyc2VkQmFzZVVybC5ob3N0KTtcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeSA9IHRoaXMuc3VtbWFyeUZvclNlcnZpY2VUeXBlKHBvbGljaWVzQW5kU2VydmljZS5zZXJ2aWNlLnNlcnZpY2VUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByb3dzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIDx0ciBrZXk9e3Rlcm1Eb2NbdGVybXNMYW5nXS51cmx9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cIm14X1Rlcm1zRGlhbG9nX3NlcnZpY2VcIj57c2VydmljZU5hbWV9PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJteF9UZXJtc0RpYWxvZ19zdW1tYXJ5XCI+e3N1bW1hcnl9PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RXh0ZXJuYWxMaW5rIHJlbD1cIm5vcmVmZXJyZXIgbm9vcGVuZXJcIiB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPXt0ZXJtRG9jW3Rlcm1zTGFuZ10udXJsfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Rlcm1Eb2NbdGVybXNMYW5nXS5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRXh0ZXJuYWxMaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGVybXNDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw9e3Rlcm1Eb2NbdGVybXNMYW5nXS51cmx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uVGVybXNDaGVja2JveENoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Qm9vbGVhbih0aGlzLnN0YXRlLmFncmVlZFVybHNbdGVybURvY1t0ZXJtc0xhbmddLnVybF0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgYWxsIHRoZSBkb2N1bWVudHMgZm9yIGF0IGxlYXN0IG9uZSBzZXJ2aWNlIGhhdmUgYmVlbiBjaGVja2VkLCB3ZSBjYW4gZW5hYmxlXG4gICAgICAgIC8vIHRoZSBzdWJtaXQgYnV0dG9uXG4gICAgICAgIGxldCBlbmFibGVTdWJtaXQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBwb2xpY2llc0FuZFNlcnZpY2Ugb2YgdGhpcy5wcm9wcy5wb2xpY2llc0FuZFNlcnZpY2VQYWlycykge1xuICAgICAgICAgICAgbGV0IGRvY3NBZ3JlZWRGb3JTZXJ2aWNlID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGVybXMgb2YgT2JqZWN0LnZhbHVlcyhwb2xpY2llc0FuZFNlcnZpY2UucG9saWNpZXMpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRvY0FncmVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGFuZyBvZiBPYmplY3Qua2V5cyh0ZXJtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmcgPT09IFwidmVyc2lvblwiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuYWdyZWVkVXJsc1t0ZXJtc1tsYW5nXS51cmxdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2NBZ3JlZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRvY0FncmVlZCkge1xuICAgICAgICAgICAgICAgICAgICArK2RvY3NBZ3JlZWRGb3JTZXJ2aWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkb2NzQWdyZWVkRm9yU2VydmljZSA9PT0gT2JqZWN0LmtleXMocG9saWNpZXNBbmRTZXJ2aWNlLnBvbGljaWVzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVTdWJtaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxCYXNlRGlhbG9nXG4gICAgICAgICAgICAgICAgZml4ZWRXaWR0aD17ZmFsc2V9XG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17dGhpcy5vbkNhbmNlbENsaWNrfVxuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcInRlcm1zfHRvc1wiKX1cbiAgICAgICAgICAgICAgICBjb250ZW50SWQ9XCJteF9EaWFsb2dfY29udGVudFwiXG4gICAgICAgICAgICAgICAgaGFzQ2FuY2VsPXtmYWxzZX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwibXhfRGlhbG9nX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+e190KFwidGVybXN8aW50cm9cIil9PC9wPlxuXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzc05hbWU9XCJteF9UZXJtc0RpYWxvZ190ZXJtc1RhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzTmFtZT1cIm14X1Rlcm1zRGlhbG9nX3Rlcm1zVGFibGVIZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPntfdChcInRlcm1zfGNvbHVtbl9zZXJ2aWNlXCIpfTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57X3QoXCJ0ZXJtc3xjb2x1bW5fc3VtbWFyeVwiKX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e190KFwidGVybXN8Y29sdW1uX2RvY3VtZW50XCIpfTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57X3QoXCJhY3Rpb258YWNjZXB0XCIpfTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cm93c31cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8RGlhbG9nQnV0dG9uc1xuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QnV0dG9uPXtfdChcImFjdGlvbnxuZXh0XCIpfVxuICAgICAgICAgICAgICAgICAgICBoYXNDYW5jZWw9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsPXt0aGlzLm9uQ2FuY2VsQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIG9uUHJpbWFyeUJ1dHRvbkNsaWNrPXt0aGlzLm9uTmV4dENsaWNrfVxuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5RGlzYWJsZWQ9eyFlbmFibGVTdWJtaXR9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvQmFzZURpYWxvZz5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsZ0JBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLGNBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFLLGFBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLFNBQUEsR0FBQU4sT0FBQTtBQWhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFrQkEsTUFBTU8sYUFBYSxTQUFTQyxjQUFLLENBQUNDLGFBQWEsQ0FBc0I7RUFBQUMsWUFBQSxHQUFBQyxJQUFBO0lBQUEsU0FBQUEsSUFBQTtJQUFBLElBQUFDLGdCQUFBLENBQUFDLE9BQUEsb0JBQzdDQyxFQUFxQyxJQUFXO01BQ2hFLElBQUksQ0FBQ0MsS0FBSyxDQUFDQyxRQUFRLENBQUMsSUFBSSxDQUFDRCxLQUFLLENBQUNFLEdBQUcsRUFBRUgsRUFBRSxDQUFDSSxhQUFhLENBQUNDLE9BQU8sQ0FBQztJQUNqRSxDQUFDO0VBQUE7RUFFTUMsTUFBTUEsQ0FBQSxFQUFvQjtJQUM3QixvQkFBT3RCLE1BQUEsQ0FBQWUsT0FBQSxDQUFBUSxhQUFBO01BQU9DLElBQUksRUFBQyxVQUFVO01BQUNOLFFBQVEsRUFBRSxJQUFJLENBQUNBLFFBQVM7TUFB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