matrix-react-sdk
Version:
SDK for matrix.org using React
102 lines (99 loc) • 13.8 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 _SettingsHandler = _interopRequireDefault(require("./SettingsHandler"));
var _AbstractLocalStorageSettingsHandler;
/*
Copyright 2024 New Vector Ltd.
Copyright 2019-2022 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.
*/
/**
* Abstract settings handler wrapping around localStorage making getValue calls cheaper
* by caching the values and listening for localStorage updates from other tabs.
*/
class AbstractLocalStorageSettingsHandler extends _SettingsHandler.default {
static clear() {
AbstractLocalStorageSettingsHandler.itemCache.clear();
AbstractLocalStorageSettingsHandler.objectCache.clear();
}
constructor() {
super();
if (!AbstractLocalStorageSettingsHandler.storageListenerBound) {
AbstractLocalStorageSettingsHandler.storageListenerBound = true;
// Listen for storage changes from other tabs to bust the cache
window.addEventListener("storage", AbstractLocalStorageSettingsHandler.onStorageEvent);
}
}
getItem(key) {
if (!AbstractLocalStorageSettingsHandler.itemCache.has(key)) {
const value = localStorage.getItem(key);
AbstractLocalStorageSettingsHandler.itemCache.set(key, value);
return value;
}
return AbstractLocalStorageSettingsHandler.itemCache.get(key);
}
getBoolean(key) {
const item = this.getItem(key);
if (item === "true") return true;
if (item === "false") return false;
// Fall back to the next config level
return null;
}
getObject(key) {
if (!AbstractLocalStorageSettingsHandler.objectCache.has(key)) {
try {
const value = JSON.parse(localStorage.getItem(key));
AbstractLocalStorageSettingsHandler.objectCache.set(key, value);
return value;
} catch (err) {
console.error("Failed to parse localStorage object", err);
return null;
}
}
return AbstractLocalStorageSettingsHandler.objectCache.get(key);
}
setItem(key, value) {
AbstractLocalStorageSettingsHandler.itemCache.set(key, value);
localStorage.setItem(key, value);
}
setBoolean(key, value) {
this.setItem(key, `${value}`);
}
setObject(key, value) {
AbstractLocalStorageSettingsHandler.objectCache.set(key, value);
localStorage.setItem(key, JSON.stringify(value));
}
// handles both items and objects
removeItem(key) {
localStorage.removeItem(key);
AbstractLocalStorageSettingsHandler.itemCache.delete(key);
AbstractLocalStorageSettingsHandler.objectCache.delete(key);
}
isSupported() {
return localStorage !== undefined && localStorage !== null;
}
reset() {
AbstractLocalStorageSettingsHandler.clear();
}
}
exports.default = AbstractLocalStorageSettingsHandler;
_AbstractLocalStorageSettingsHandler = AbstractLocalStorageSettingsHandler;
// Shared cache between all subclass instances
(0, _defineProperty2.default)(AbstractLocalStorageSettingsHandler, "itemCache", new Map());
(0, _defineProperty2.default)(AbstractLocalStorageSettingsHandler, "objectCache", new Map());
(0, _defineProperty2.default)(AbstractLocalStorageSettingsHandler, "storageListenerBound", false);
(0, _defineProperty2.default)(AbstractLocalStorageSettingsHandler, "onStorageEvent", e => {
if (e.key === null) {
_AbstractLocalStorageSettingsHandler.clear();
} else {
_AbstractLocalStorageSettingsHandler.itemCache.delete(e.key);
_AbstractLocalStorageSettingsHandler.objectCache.delete(e.key);
}
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfU2V0dGluZ3NIYW5kbGVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIiLCJBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlciIsIlNldHRpbmdzSGFuZGxlciIsImNsZWFyIiwiaXRlbUNhY2hlIiwib2JqZWN0Q2FjaGUiLCJjb25zdHJ1Y3RvciIsInN0b3JhZ2VMaXN0ZW5lckJvdW5kIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9uU3RvcmFnZUV2ZW50IiwiZ2V0SXRlbSIsImtleSIsImhhcyIsInZhbHVlIiwibG9jYWxTdG9yYWdlIiwic2V0IiwiZ2V0IiwiZ2V0Qm9vbGVhbiIsIml0ZW0iLCJnZXRPYmplY3QiLCJKU09OIiwicGFyc2UiLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJzZXRJdGVtIiwic2V0Qm9vbGVhbiIsInNldE9iamVjdCIsInN0cmluZ2lmeSIsInJlbW92ZUl0ZW0iLCJkZWxldGUiLCJpc1N1cHBvcnRlZCIsInVuZGVmaW5lZCIsInJlc2V0IiwiZXhwb3J0cyIsImRlZmF1bHQiLCJfZGVmaW5lUHJvcGVydHkyIiwiTWFwIiwiZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXR0aW5ncy9oYW5kbGVycy9BYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOS0yMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBTZXR0aW5nc0hhbmRsZXIgZnJvbSBcIi4vU2V0dGluZ3NIYW5kbGVyXCI7XG5cbi8qKlxuICogQWJzdHJhY3Qgc2V0dGluZ3MgaGFuZGxlciB3cmFwcGluZyBhcm91bmQgbG9jYWxTdG9yYWdlIG1ha2luZyBnZXRWYWx1ZSBjYWxscyBjaGVhcGVyXG4gKiBieSBjYWNoaW5nIHRoZSB2YWx1ZXMgYW5kIGxpc3RlbmluZyBmb3IgbG9jYWxTdG9yYWdlIHVwZGF0ZXMgZnJvbSBvdGhlciB0YWJzLlxuICovXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlciBleHRlbmRzIFNldHRpbmdzSGFuZGxlciB7XG4gICAgLy8gU2hhcmVkIGNhY2hlIGJldHdlZW4gYWxsIHN1YmNsYXNzIGluc3RhbmNlc1xuICAgIHByaXZhdGUgc3RhdGljIGl0ZW1DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigpO1xuICAgIHByaXZhdGUgc3RhdGljIG9iamVjdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG9iamVjdD4oKTtcbiAgICBwcml2YXRlIHN0YXRpYyBzdG9yYWdlTGlzdGVuZXJCb3VuZCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgb25TdG9yYWdlRXZlbnQgPSAoZTogU3RvcmFnZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIuY2xlYXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEFic3RyYWN0TG9jYWxTdG9yYWdlU2V0dGluZ3NIYW5kbGVyLml0ZW1DYWNoZS5kZWxldGUoZS5rZXkpO1xuICAgICAgICAgICAgQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIub2JqZWN0Q2FjaGUuZGVsZXRlKGUua2V5KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIuaXRlbUNhY2hlLmNsZWFyKCk7XG4gICAgICAgIEFic3RyYWN0TG9jYWxTdG9yYWdlU2V0dGluZ3NIYW5kbGVyLm9iamVjdENhY2hlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmICghQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIuc3RvcmFnZUxpc3RlbmVyQm91bmQpIHtcbiAgICAgICAgICAgIEFic3RyYWN0TG9jYWxTdG9yYWdlU2V0dGluZ3NIYW5kbGVyLnN0b3JhZ2VMaXN0ZW5lckJvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIExpc3RlbiBmb3Igc3RvcmFnZSBjaGFuZ2VzIGZyb20gb3RoZXIgdGFicyB0byBidXN0IHRoZSBjYWNoZVxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzdG9yYWdlXCIsIEFic3RyYWN0TG9jYWxTdG9yYWdlU2V0dGluZ3NIYW5kbGVyLm9uU3RvcmFnZUV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRJdGVtKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICghQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIuaXRlbUNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICAgICAgICBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlci5pdGVtQ2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEFic3RyYWN0TG9jYWxTdG9yYWdlU2V0dGluZ3NIYW5kbGVyLml0ZW1DYWNoZS5nZXQoa2V5KSE7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEJvb2xlYW4oa2V5OiBzdHJpbmcpOiBib29sZWFuIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0gPT09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGl0ZW0gPT09IFwiZmFsc2VcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIG5leHQgY29uZmlnIGxldmVsXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRPYmplY3Q8VCBleHRlbmRzIG9iamVjdD4oa2V5OiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgICAgIGlmICghQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIub2JqZWN0Q2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkhKTtcbiAgICAgICAgICAgICAgICBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlci5vYmplY3RDYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBwYXJzZSBsb2NhbFN0b3JhZ2Ugb2JqZWN0XCIsIGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIub2JqZWN0Q2FjaGUuZ2V0KGtleSkgYXMgVDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0SXRlbShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlci5pdGVtQ2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0Qm9vbGVhbihrZXk6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4gfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0SXRlbShrZXksIGAke3ZhbHVlfWApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZXRPYmplY3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiBvYmplY3QpOiB2b2lkIHtcbiAgICAgICAgQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIub2JqZWN0Q2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlcyBib3RoIGl0ZW1zIGFuZCBvYmplY3RzXG4gICAgcHJvdGVjdGVkIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIuaXRlbUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgICBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlci5vYmplY3RDYWNoZS5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UgIT09IHVuZGVmaW5lZCAmJiBsb2NhbFN0b3JhZ2UgIT09IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlci5jbGVhcigpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxnQkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQWdELElBQUFDLG9DQUFBO0FBUmhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDZSxNQUFlQyxtQ0FBbUMsU0FBU0Msd0JBQWUsQ0FBQztFQWV0RixPQUFlQyxLQUFLQSxDQUFBLEVBQVM7SUFDekJGLG1DQUFtQyxDQUFDRyxTQUFTLENBQUNELEtBQUssQ0FBQyxDQUFDO0lBQ3JERixtQ0FBbUMsQ0FBQ0ksV0FBVyxDQUFDRixLQUFLLENBQUMsQ0FBQztFQUMzRDtFQUVVRyxXQUFXQSxDQUFBLEVBQUc7SUFDcEIsS0FBSyxDQUFDLENBQUM7SUFFUCxJQUFJLENBQUNMLG1DQUFtQyxDQUFDTSxvQkFBb0IsRUFBRTtNQUMzRE4sbUNBQW1DLENBQUNNLG9CQUFvQixHQUFHLElBQUk7TUFDL0Q7TUFDQUMsTUFBTSxDQUFDQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUVSLG1DQUFtQyxDQUFDUyxjQUFjLENBQUM7SUFDMUY7RUFDSjtFQUVVQyxPQUFPQSxDQUFDQyxHQUFXLEVBQWlCO0lBQzFDLElBQUksQ0FBQ1gsbUNBQW1DLENBQUNHLFNBQVMsQ0FBQ1MsR0FBRyxDQUFDRCxHQUFHLENBQUMsRUFBRTtNQUN6RCxNQUFNRSxLQUFLLEdBQUdDLFlBQVksQ0FBQ0osT0FBTyxDQUFDQyxHQUFHLENBQUM7TUFDdkNYLG1DQUFtQyxDQUFDRyxTQUFTLENBQUNZLEdBQUcsQ0FBQ0osR0FBRyxFQUFFRSxLQUFLLENBQUM7TUFDN0QsT0FBT0EsS0FBSztJQUNoQjtJQUVBLE9BQU9iLG1DQUFtQyxDQUFDRyxTQUFTLENBQUNhLEdBQUcsQ0FBQ0wsR0FBRyxDQUFDO0VBQ2pFO0VBRVVNLFVBQVVBLENBQUNOLEdBQVcsRUFBa0I7SUFDOUMsTUFBTU8sSUFBSSxHQUFHLElBQUksQ0FBQ1IsT0FBTyxDQUFDQyxHQUFHLENBQUM7SUFDOUIsSUFBSU8sSUFBSSxLQUFLLE1BQU0sRUFBRSxPQUFPLElBQUk7SUFDaEMsSUFBSUEsSUFBSSxLQUFLLE9BQU8sRUFBRSxPQUFPLEtBQUs7SUFDbEM7SUFDQSxPQUFPLElBQUk7RUFDZjtFQUVVQyxTQUFTQSxDQUFtQlIsR0FBVyxFQUFZO0lBQ3pELElBQUksQ0FBQ1gsbUNBQW1DLENBQUNJLFdBQVcsQ0FBQ1EsR0FBRyxDQUFDRCxHQUFHLENBQUMsRUFBRTtNQUMzRCxJQUFJO1FBQ0EsTUFBTUUsS0FBSyxHQUFHTyxJQUFJLENBQUNDLEtBQUssQ0FBQ1AsWUFBWSxDQUFDSixPQUFPLENBQUNDLEdBQUcsQ0FBRSxDQUFDO1FBQ3BEWCxtQ0FBbUMsQ0FBQ0ksV0FBVyxDQUFDVyxHQUFHLENBQUNKLEdBQUcsRUFBRUUsS0FBSyxDQUFDO1FBQy9ELE9BQU9BLEtBQUs7TUFDaEIsQ0FBQyxDQUFDLE9BQU9TLEdBQUcsRUFBRTtRQUNWQyxPQUFPLENBQUNDLEtBQUssQ0FBQyxxQ0FBcUMsRUFBRUYsR0FBRyxDQUFDO1FBQ3pELE9BQU8sSUFBSTtNQUNmO0lBQ0o7SUFFQSxPQUFPdEIsbUNBQW1DLENBQUNJLFdBQVcsQ0FBQ1ksR0FBRyxDQUFDTCxHQUFHLENBQUM7RUFDbkU7RUFFVWMsT0FBT0EsQ0FBQ2QsR0FBVyxFQUFFRSxLQUFhLEVBQVE7SUFDaERiLG1DQUFtQyxDQUFDRyxTQUFTLENBQUNZLEdBQUcsQ0FBQ0osR0FBRyxFQUFFRSxLQUFLLENBQUM7SUFDN0RDLFlBQVksQ0FBQ1csT0FBTyxDQUFDZCxHQUFHLEVBQUVFLEtBQUssQ0FBQztFQUNwQztFQUVVYSxVQUFVQSxDQUFDZixHQUFXLEVBQUVFLEtBQXFCLEVBQVE7SUFDM0QsSUFBSSxDQUFDWSxPQUFPLENBQUNkLEdBQUcsRUFBRSxHQUFHRSxLQUFLLEVBQUUsQ0FBQztFQUNqQztFQUVVYyxTQUFTQSxDQUFDaEIsR0FBVyxFQUFFRSxLQUFhLEVBQVE7SUFDbERiLG1DQUFtQyxDQUFDSSxXQUFXLENBQUNXLEdBQUcsQ0FBQ0osR0FBRyxFQUFFRSxLQUFLLENBQUM7SUFDL0RDLFlBQVksQ0FBQ1csT0FBTyxDQUFDZCxHQUFHLEVBQUVTLElBQUksQ0FBQ1EsU0FBUyxDQUFDZixLQUFLLENBQUMsQ0FBQztFQUNwRDs7RUFFQTtFQUNVZ0IsVUFBVUEsQ0FBQ2xCLEdBQVcsRUFBUTtJQUNwQ0csWUFBWSxDQUFDZSxVQUFVLENBQUNsQixHQUFHLENBQUM7SUFDNUJYLG1DQUFtQyxDQUFDRyxTQUFTLENBQUMyQixNQUFNLENBQUNuQixHQUFHLENBQUM7SUFDekRYLG1DQUFtQyxDQUFDSSxXQUFXLENBQUMwQixNQUFNLENBQUNuQixHQUFHLENBQUM7RUFDL0Q7RUFFT29CLFdBQVdBLENBQUEsRUFBWTtJQUMxQixPQUFPakIsWUFBWSxLQUFLa0IsU0FBUyxJQUFJbEIsWUFBWSxLQUFLLElBQUk7RUFDOUQ7RUFFT21CLEtBQUtBLENBQUEsRUFBUztJQUNqQmpDLG1DQUFtQyxDQUFDRSxLQUFLLENBQUMsQ0FBQztFQUMvQztBQUNKO0FBQUNnQyxPQUFBLENBQUFDLE9BQUEsR0FBQW5DLG1DQUFBO0FBQUFELG9DQUFBLEdBM0Y2QkMsbUNBQW1DO0FBQzdEO0FBQUEsSUFBQW9DLGdCQUFBLENBQUFELE9BQUEsRUFEMEJuQyxtQ0FBbUMsZUFFbEMsSUFBSXFDLEdBQUcsQ0FBd0IsQ0FBQztBQUFBLElBQUFELGdCQUFBLENBQUFELE9BQUEsRUFGakNuQyxtQ0FBbUMsaUJBR2hDLElBQUlxQyxHQUFHLENBQWlCLENBQUM7QUFBQSxJQUFBRCxnQkFBQSxDQUFBRCxPQUFBLEVBSDVCbkMsbUNBQW1DLDBCQUl2QixLQUFLO0FBQUEsSUFBQW9DLGdCQUFBLENBQUFELE9BQUEsRUFKakJuQyxtQ0FBbUMsb0JBTTVCc0MsQ0FBZSxJQUFXO0VBQ3ZELElBQUlBLENBQUMsQ0FBQzNCLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDaEJYLG9DQUFtQyxDQUFDRSxLQUFLLENBQUMsQ0FBQztFQUMvQyxDQUFDLE1BQU07SUFDSEYsb0NBQW1DLENBQUNHLFNBQVMsQ0FBQzJCLE1BQU0sQ0FBQ1EsQ0FBQyxDQUFDM0IsR0FBRyxDQUFDO0lBQzNEWCxvQ0FBbUMsQ0FBQ0ksV0FBVyxDQUFDMEIsTUFBTSxDQUFDUSxDQUFDLENBQUMzQixHQUFHLENBQUM7RUFDakU7QUFDSixDQUFDIiwiaWdub3JlTGlzdCI6W119