matrix-react-sdk
Version:
SDK for matrix.org using React
125 lines (116 loc) • 17.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _SettingLevel = require("../SettingLevel");
var _AbstractLocalStorageSettingsHandler = _interopRequireDefault(require("./AbstractLocalStorageSettingsHandler"));
/*
Copyright 2024 New Vector Ltd.
Copyright 2019-2022 The Matrix.org Foundation C.I.C.
Copyright 2019 New Vector Ltd.
Copyright 2017 Travis Ralston
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
/**
* Gets and sets settings at the "device" level for the current device.
* This handler does not make use of the roomId parameter. This handler
* will special-case features to support legacy settings.
*/
class DeviceSettingsHandler extends _AbstractLocalStorageSettingsHandler.default {
/**
* Creates a new device settings handler
* @param {string[]} featureNames The names of known features.
* @param {WatchManager} watchers The watch manager to notify updates to
*/
constructor(featureNames, watchers) {
super();
this.featureNames = featureNames;
this.watchers = watchers;
}
getValue(settingName, roomId) {
if (this.featureNames.includes(settingName)) {
return this.readFeature(settingName);
}
// Special case notifications
if (settingName === "notificationsEnabled") {
return this.getBoolean("notifications_enabled");
} else if (settingName === "notificationBodyEnabled") {
return this.getBoolean("notifications_body_enabled");
} else if (settingName === "audioNotificationsEnabled") {
return this.getBoolean("audio_notifications_enabled");
}
const settings = this.getSettings() || {};
return settings[settingName];
}
setValue(settingName, roomId, newValue) {
if (this.featureNames.includes(settingName)) {
this.writeFeature(settingName, newValue);
return Promise.resolve();
}
// Special case notifications
if (settingName === "notificationsEnabled") {
this.setBoolean("notifications_enabled", newValue);
this.watchers.notifyUpdate(settingName, null, _SettingLevel.SettingLevel.DEVICE, newValue);
return Promise.resolve();
} else if (settingName === "notificationBodyEnabled") {
this.setBoolean("notifications_body_enabled", newValue);
this.watchers.notifyUpdate(settingName, null, _SettingLevel.SettingLevel.DEVICE, newValue);
return Promise.resolve();
} else if (settingName === "audioNotificationsEnabled") {
this.setBoolean("audio_notifications_enabled", newValue);
this.watchers.notifyUpdate(settingName, null, _SettingLevel.SettingLevel.DEVICE, newValue);
return Promise.resolve();
}
// Special case for old useIRCLayout setting
if (settingName === "layout") {
const settings = this.getSettings() || {};
delete settings["useIRCLayout"];
settings["layout"] = newValue;
this.setObject("mx_local_settings", settings);
this.watchers.notifyUpdate(settingName, null, _SettingLevel.SettingLevel.DEVICE, newValue);
return Promise.resolve();
}
const settings = this.getSettings() || {};
settings[settingName] = newValue;
this.setObject("mx_local_settings", settings);
this.watchers.notifyUpdate(settingName, null, _SettingLevel.SettingLevel.DEVICE, newValue);
return Promise.resolve();
}
canSetValue(settingName, roomId) {
return true; // It's their device, so they should be able to
}
watchSetting(settingName, roomId, cb) {
this.watchers.watchSetting(settingName, roomId, cb);
}
unwatchSetting(cb) {
this.watchers.unwatchSetting(cb);
}
getSettings() {
// TODO: [TS] Type return
return this.getObject("mx_local_settings");
}
// Note: features intentionally don't use the same key as settings to avoid conflicts
// and to be backwards compatible.
// public for access to migrations - not exposed from the SettingsHandler interface
readFeature(featureName) {
// Previously, we disabled all features for guests, but since different
// installations can have site-specific config files which might set up
// different behaviour that is relevant to guests, we removed that
// special behaviour. See
// https://github.com/vector-im/element-web/issues/24513 for the
// discussion.
// XXX: This turns they key names into `mx_labs_feature_feature_x` (double feature).
// This is because all feature names start with `feature_` as a matter of policy.
// Oh well.
return this.getBoolean("mx_labs_feature_" + featureName);
}
writeFeature(featureName, enabled) {
this.setBoolean("mx_labs_feature_" + featureName, enabled);
this.watchers.notifyUpdate(featureName, null, _SettingLevel.SettingLevel.DEVICE, enabled);
}
}
exports.default = DeviceSettingsHandler;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfU2V0dGluZ0xldmVsIiwicmVxdWlyZSIsIl9BYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJEZXZpY2VTZXR0aW5nc0hhbmRsZXIiLCJBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlciIsImNvbnN0cnVjdG9yIiwiZmVhdHVyZU5hbWVzIiwid2F0Y2hlcnMiLCJnZXRWYWx1ZSIsInNldHRpbmdOYW1lIiwicm9vbUlkIiwiaW5jbHVkZXMiLCJyZWFkRmVhdHVyZSIsImdldEJvb2xlYW4iLCJzZXR0aW5ncyIsImdldFNldHRpbmdzIiwic2V0VmFsdWUiLCJuZXdWYWx1ZSIsIndyaXRlRmVhdHVyZSIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0Qm9vbGVhbiIsIm5vdGlmeVVwZGF0ZSIsIlNldHRpbmdMZXZlbCIsIkRFVklDRSIsInNldE9iamVjdCIsImNhblNldFZhbHVlIiwid2F0Y2hTZXR0aW5nIiwiY2IiLCJ1bndhdGNoU2V0dGluZyIsImdldE9iamVjdCIsImZlYXR1cmVOYW1lIiwiZW5hYmxlZCIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NldHRpbmdzL2hhbmRsZXJzL0RldmljZVNldHRpbmdzSGFuZGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOS0yMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5Db3B5cmlnaHQgMjAxOSBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE3IFRyYXZpcyBSYWxzdG9uXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi9TZXR0aW5nTGV2ZWxcIjtcbmltcG9ydCB7IENhbGxiYWNrRm4sIFdhdGNoTWFuYWdlciB9IGZyb20gXCIuLi9XYXRjaE1hbmFnZXJcIjtcbmltcG9ydCBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlciBmcm9tIFwiLi9BYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlclwiO1xuXG4vKipcbiAqIEdldHMgYW5kIHNldHMgc2V0dGluZ3MgYXQgdGhlIFwiZGV2aWNlXCIgbGV2ZWwgZm9yIHRoZSBjdXJyZW50IGRldmljZS5cbiAqIFRoaXMgaGFuZGxlciBkb2VzIG5vdCBtYWtlIHVzZSBvZiB0aGUgcm9vbUlkIHBhcmFtZXRlci4gVGhpcyBoYW5kbGVyXG4gKiB3aWxsIHNwZWNpYWwtY2FzZSBmZWF0dXJlcyB0byBzdXBwb3J0IGxlZ2FjeSBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGV2aWNlU2V0dGluZ3NIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZGV2aWNlIHNldHRpbmdzIGhhbmRsZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBmZWF0dXJlTmFtZXMgVGhlIG5hbWVzIG9mIGtub3duIGZlYXR1cmVzLlxuICAgICAqIEBwYXJhbSB7V2F0Y2hNYW5hZ2VyfSB3YXRjaGVycyBUaGUgd2F0Y2ggbWFuYWdlciB0byBub3RpZnkgdXBkYXRlcyB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBmZWF0dXJlTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgd2F0Y2hlcnM6IFdhdGNoTWFuYWdlcixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VmFsdWUoc2V0dGluZ05hbWU6IHN0cmluZywgcm9vbUlkOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICBpZiAodGhpcy5mZWF0dXJlTmFtZXMuaW5jbHVkZXMoc2V0dGluZ05hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmVhdHVyZShzZXR0aW5nTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGVjaWFsIGNhc2Ugbm90aWZpY2F0aW9uc1xuICAgICAgICBpZiAoc2V0dGluZ05hbWUgPT09IFwibm90aWZpY2F0aW9uc0VuYWJsZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbihcIm5vdGlmaWNhdGlvbnNfZW5hYmxlZFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5nTmFtZSA9PT0gXCJub3RpZmljYXRpb25Cb2R5RW5hYmxlZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuKFwibm90aWZpY2F0aW9uc19ib2R5X2VuYWJsZWRcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ05hbWUgPT09IFwiYXVkaW9Ob3RpZmljYXRpb25zRW5hYmxlZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuKFwiYXVkaW9fbm90aWZpY2F0aW9uc19lbmFibGVkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCkgfHwge307XG4gICAgICAgIHJldHVybiBzZXR0aW5nc1tzZXR0aW5nTmFtZV07XG4gICAgfVxuXG4gICAgcHVibGljIHNldFZhbHVlKHNldHRpbmdOYW1lOiBzdHJpbmcsIHJvb21JZDogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmZlYXR1cmVOYW1lcy5pbmNsdWRlcyhzZXR0aW5nTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVGZWF0dXJlKHNldHRpbmdOYW1lLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGVjaWFsIGNhc2Ugbm90aWZpY2F0aW9uc1xuICAgICAgICBpZiAoc2V0dGluZ05hbWUgPT09IFwibm90aWZpY2F0aW9uc0VuYWJsZWRcIikge1xuICAgICAgICAgICAgdGhpcy5zZXRCb29sZWFuKFwibm90aWZpY2F0aW9uc19lbmFibGVkXCIsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMud2F0Y2hlcnMubm90aWZ5VXBkYXRlKHNldHRpbmdOYW1lLCBudWxsLCBTZXR0aW5nTGV2ZWwuREVWSUNFLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ05hbWUgPT09IFwibm90aWZpY2F0aW9uQm9keUVuYWJsZWRcIikge1xuICAgICAgICAgICAgdGhpcy5zZXRCb29sZWFuKFwibm90aWZpY2F0aW9uc19ib2R5X2VuYWJsZWRcIiwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy53YXRjaGVycy5ub3RpZnlVcGRhdGUoc2V0dGluZ05hbWUsIG51bGwsIFNldHRpbmdMZXZlbC5ERVZJQ0UsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5nTmFtZSA9PT0gXCJhdWRpb05vdGlmaWNhdGlvbnNFbmFibGVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Qm9vbGVhbihcImF1ZGlvX25vdGlmaWNhdGlvbnNfZW5hYmxlZFwiLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLndhdGNoZXJzLm5vdGlmeVVwZGF0ZShzZXR0aW5nTmFtZSwgbnVsbCwgU2V0dGluZ0xldmVsLkRFVklDRSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBvbGQgdXNlSVJDTGF5b3V0IHNldHRpbmdcbiAgICAgICAgaWYgKHNldHRpbmdOYW1lID09PSBcImxheW91dFwiKSB7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKSB8fCB7fTtcblxuICAgICAgICAgICAgZGVsZXRlIHNldHRpbmdzW1widXNlSVJDTGF5b3V0XCJdO1xuICAgICAgICAgICAgc2V0dGluZ3NbXCJsYXlvdXRcIl0gPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0T2JqZWN0KFwibXhfbG9jYWxfc2V0dGluZ3NcIiwgc2V0dGluZ3MpO1xuXG4gICAgICAgICAgICB0aGlzLndhdGNoZXJzLm5vdGlmeVVwZGF0ZShzZXR0aW5nTmFtZSwgbnVsbCwgU2V0dGluZ0xldmVsLkRFVklDRSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCkgfHwge307XG4gICAgICAgIHNldHRpbmdzW3NldHRpbmdOYW1lXSA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLnNldE9iamVjdChcIm14X2xvY2FsX3NldHRpbmdzXCIsIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy53YXRjaGVycy5ub3RpZnlVcGRhdGUoc2V0dGluZ05hbWUsIG51bGwsIFNldHRpbmdMZXZlbC5ERVZJQ0UsIG5ld1ZhbHVlKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhblNldFZhbHVlKHNldHRpbmdOYW1lOiBzdHJpbmcsIHJvb21JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBJdCdzIHRoZWlyIGRldmljZSwgc28gdGhleSBzaG91bGQgYmUgYWJsZSB0b1xuICAgIH1cblxuICAgIHB1YmxpYyB3YXRjaFNldHRpbmcoc2V0dGluZ05hbWU6IHN0cmluZywgcm9vbUlkOiBzdHJpbmcsIGNiOiBDYWxsYmFja0ZuKTogdm9pZCB7XG4gICAgICAgIHRoaXMud2F0Y2hlcnMud2F0Y2hTZXR0aW5nKHNldHRpbmdOYW1lLCByb29tSWQsIGNiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdW53YXRjaFNldHRpbmcoY2I6IENhbGxiYWNrRm4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy53YXRjaGVycy51bndhdGNoU2V0dGluZyhjYik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTZXR0aW5ncygpOiBhbnkge1xuICAgICAgICAvLyBUT0RPOiBbVFNdIFR5cGUgcmV0dXJuXG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChcIm14X2xvY2FsX3NldHRpbmdzXCIpO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IGZlYXR1cmVzIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHRoZSBzYW1lIGtleSBhcyBzZXR0aW5ncyB0byBhdm9pZCBjb25mbGljdHNcbiAgICAvLyBhbmQgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUuXG5cbiAgICAvLyBwdWJsaWMgZm9yIGFjY2VzcyB0byBtaWdyYXRpb25zIC0gbm90IGV4cG9zZWQgZnJvbSB0aGUgU2V0dGluZ3NIYW5kbGVyIGludGVyZmFjZVxuICAgIHB1YmxpYyByZWFkRmVhdHVyZShmZWF0dXJlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB8IG51bGwge1xuICAgICAgICAvLyBQcmV2aW91c2x5LCB3ZSBkaXNhYmxlZCBhbGwgZmVhdHVyZXMgZm9yIGd1ZXN0cywgYnV0IHNpbmNlIGRpZmZlcmVudFxuICAgICAgICAvLyBpbnN0YWxsYXRpb25zIGNhbiBoYXZlIHNpdGUtc3BlY2lmaWMgY29uZmlnIGZpbGVzIHdoaWNoIG1pZ2h0IHNldCB1cFxuICAgICAgICAvLyBkaWZmZXJlbnQgYmVoYXZpb3VyIHRoYXQgaXMgcmVsZXZhbnQgdG8gZ3Vlc3RzLCB3ZSByZW1vdmVkIHRoYXRcbiAgICAgICAgLy8gc3BlY2lhbCBiZWhhdmlvdXIuIFNlZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdmVjdG9yLWltL2VsZW1lbnQtd2ViL2lzc3Vlcy8yNDUxMyBmb3IgdGhlXG4gICAgICAgIC8vIGRpc2N1c3Npb24uXG5cbiAgICAgICAgLy8gWFhYOiBUaGlzIHR1cm5zIHRoZXkga2V5IG5hbWVzIGludG8gYG14X2xhYnNfZmVhdHVyZV9mZWF0dXJlX3hgIChkb3VibGUgZmVhdHVyZSkuXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSBhbGwgZmVhdHVyZSBuYW1lcyBzdGFydCB3aXRoIGBmZWF0dXJlX2AgYXMgYSBtYXR0ZXIgb2YgcG9saWN5LlxuICAgICAgICAvLyBPaCB3ZWxsLlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuKFwibXhfbGFic19mZWF0dXJlX1wiICsgZmVhdHVyZU5hbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVGZWF0dXJlKGZlYXR1cmVOYW1lOiBzdHJpbmcsIGVuYWJsZWQ6IGJvb2xlYW4gfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0Qm9vbGVhbihcIm14X2xhYnNfZmVhdHVyZV9cIiArIGZlYXR1cmVOYW1lLCBlbmFibGVkKTtcbiAgICAgICAgdGhpcy53YXRjaGVycy5ub3RpZnlVcGRhdGUoZmVhdHVyZU5hbWUsIG51bGwsIFNldHRpbmdMZXZlbC5ERVZJQ0UsIGVuYWJsZWQpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVVBLElBQUFBLGFBQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLG9DQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLE1BQU1HLHFCQUFxQixTQUFTQyw0Q0FBbUMsQ0FBQztFQUNuRjtB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V0FBVyxFQUFFLElBQUksRUFBRWMsMEJBQVksQ0FBQ0MsTUFBTSxFQUFFUCxRQUFRLENBQUM7TUFDNUUsT0FBT0UsT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQztJQUM1QjtJQUVBLE1BQU1OLFFBQVEsR0FBRyxJQUFJLENBQUNDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDRCxRQUFRLENBQUNMLFdBQVcsQ0FBQyxHQUFHUSxRQUFRO0lBQ2hDLElBQUksQ0FBQ1EsU0FBUyxDQUFDLG1CQUFtQixFQUFFWCxRQUFRLENBQUM7SUFDN0MsSUFBSSxDQUFDUCxRQUFRLENBQUNlLFlBQVksQ0FBQ2IsV0FBVyxFQUFFLElBQUksRUFBRWMsMEJBQVksQ0FBQ0MsTUFBTSxFQUFFUCxRQUFRLENBQUM7SUFFNUUsT0FBT0UsT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQztFQUM1QjtFQUVPTSxXQUFXQSxDQUFDakIsV0FBbUIsRUFBRUMsTUFBYyxFQUFXO0lBQzdELE9BQU8sSUFBSSxDQUFDLENBQUM7RUFDakI7RUFFT2lCLFlBQVlBLENBQUNsQixXQUFtQixFQUFFQyxNQUFjLEVBQUVrQixFQUFjLEVBQVE7SUFDM0UsSUFBSSxDQUFDckIsUUFBUSxDQUFDb0IsWUFBWSxDQUFDbEIsV0FBVyxFQUFFQyxNQUFNLEVBQUVrQixFQUFFLENBQUM7RUFDdkQ7RUFFT0MsY0FBY0EsQ0FBQ0QsRUFBYyxFQUFRO0lBQ3hDLElBQUksQ0FBQ3JCLFFBQVEsQ0FBQ3NCLGNBQWMsQ0FBQ0QsRUFBRSxDQUFDO0VBQ3BDO0VBRVFiLFdBQVdBLENBQUEsRUFBUTtJQUN2QjtJQUNBLE9BQU8sSUFBSSxDQUFDZSxTQUFTLENBQUMsbUJBQW1CLENBQUM7RUFDOUM7O0VBRUE7RUFDQTs7RUFFQTtFQUNPbEIsV0FBV0EsQ0FBQ21CLFdBQW1CLEVBQWtCO0lBQ3BEO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7SUFFQTtJQUNBO0lBQ0E7SUFDQSxPQUFPLElBQUksQ0FBQ2xCLFVBQVUsQ0FBQyxrQkFBa0IsR0FBR2tCLFdBQVcsQ0FBQztFQUM1RDtFQUVRYixZQUFZQSxDQUFDYSxXQUFtQixFQUFFQyxPQUF1QixFQUFRO0lBQ3JFLElBQUksQ0FBQ1gsVUFBVSxDQUFDLGtCQUFrQixHQUFHVSxXQUFXLEVBQUVDLE9BQU8sQ0FBQztJQUMxRCxJQUFJLENBQUN6QixRQUFRLENBQUNlLFlBQVksQ0FBQ1MsV0FBVyxFQUFFLElBQUksRUFBRVIsMEJBQVksQ0FBQ0MsTUFBTSxFQUFFUSxPQUFPLENBQUM7RUFDL0U7QUFDSjtBQUFDQyxPQUFBLENBQUFDLE9BQUEsR0FBQS9CLHFCQUFBIiwiaWdub3JlTGlzdCI6W119