UNPKG

ngx-store

Version:

Angular decorators to automagically keep variables in HTML5 LocalStorage, SessionStorage, cookies; injectable services for managing and listening to data changes and a bit more.

145 lines 18.9 kB
import { Cache } from '../decorator/cache'; import { CONFIG_PREFIX, debug } from '../config/config'; import { Subject } from 'rxjs'; import { NgxStorageEvent } from './storage/storage-event'; export class WebStorageUtility { constructor(storage, prefix = '', previousPrefix) { this._prefix = ''; this._changes = new Subject(); this._storage = storage; this._prefix = prefix; // handle previousPrefix for backward-compatibility and safe config changes below if (prefix === previousPrefix) { return; } if (previousPrefix === null) { return; } if (previousPrefix === undefined) { return; } debug.log(this.getStorageName() + ' > Detected prefix change from ' + previousPrefix + ' to ' + prefix); this.forEach((value, key) => { // ignore config settings when previousPrefix = '' if (key.startsWith(previousPrefix) && !key.startsWith(CONFIG_PREFIX)) { const nameWithoutPrefix = this.trimPrefix(key); this.set(nameWithoutPrefix, this._storage.getItem(key)); if (previousPrefix !== '') { this._storage.removeItem(key); } } }); } get prefix() { return this._prefix; } get changes() { return this._changes.asObservable(); } get keys() { const keys = []; this.forEach((value, key) => keys.push(key)); return keys; } static getSettable(value) { return JSON.stringify(value); } static getGettable(value) { if (value === 'undefined') { return null; } try { return JSON.parse(value); } catch (e) { return value; } } getStorage() { return this._storage; } getStorageKey(key, prefix) { prefix = (typeof prefix === 'string') ? prefix : this.prefix; return `${prefix}${key}`; } getStorageName() { return this._storage.type || ((this._storage === localStorage) ? 'localStorage' : 'sessionStorage'); } get(key, config = {}) { const storageKey = this.getStorageKey(key, config.prefix); const value = this._storage.getItem(storageKey); // TODO return undefined if no key /*if (value === null && !(storageKey in this._storage)) { return undefined; }*/ return this.getGettable(value); } set(key, value, config = {}) { if (value === null || value === undefined) { this.remove(key); return null; } try { const storageKey = this.getStorageKey(key, config.prefix); const storable = this.getSettable(value); this.emitEvent(key, value); this._storage.setItem(storageKey, storable, config.expires); const cacheItem = Cache.get(key); if (cacheItem) { debug.log(`updating following CacheItem from ${this.constructor.name}:`, cacheItem); cacheItem.resetProxy(); cacheItem.propagateChange(value, this); } } catch (error) { console.warn(`[ngx-store] ${this.getStorageName()}: following error occurred while trying to save ${key} =`, value); console.error(error); } return value; } // TODO return true if item existed and false otherwise (?) remove(key, config = {}) { const storageKey = this.getStorageKey(key, config.prefix); this._storage.removeItem(storageKey); const cacheItem = Cache.get(key); if (cacheItem) { cacheItem.resetProxy(); } } clear() { this.emitEvent(null, null, null); this.forEach((value, key) => { if (key.startsWith(CONFIG_PREFIX)) { return; } this.remove(key, { prefix: '' }); }); } forEach(callbackFn) { if (typeof this._storage.forEach === 'function') { return this._storage.forEach((value, key) => { callbackFn(this.getGettable(value), key); }); } Object.keys(this._storage).forEach((key) => { callbackFn(this.getGettable(this._storage[key]), key); }); } getSettable(value) { return WebStorageUtility.getSettable(value); } getGettable(value) { return WebStorageUtility.getGettable(value); } trimPrefix(key) { return key.replace(this.prefix, ''); } emitEvent(key, newValue, oldValue) { const event = new NgxStorageEvent(this.getStorageName(), key, this._storage); event.oldValue = (oldValue !== undefined) ? oldValue : this.get(key); event.newValue = newValue; this._changes.next(event); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic3RvcmFnZS51dGlsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0b3JlL3NyYy9saWIvdXRpbGl0eS93ZWJzdG9yYWdlLnV0aWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJMUQsTUFBTSxPQUFPLGlCQUFpQjtJQUc1QixZQUFtQixPQUFtQixFQUFFLFNBQWlCLEVBQUUsRUFBRSxjQUF1QjtRQTRCMUUsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQU1yQixhQUFRLEdBQTZCLElBQUksT0FBTyxFQUFFLENBQUM7UUFqQzNELElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXRCLGlGQUFpRjtRQUNqRixJQUFJLE1BQU0sS0FBSyxjQUFjLEVBQUU7WUFDN0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO1lBQzNCLE9BQU87U0FDUjtRQUNELElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxPQUFPO1NBQ1I7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxpQ0FBaUMsR0FBRyxjQUFjLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDMUIsa0RBQWtEO1lBQ2xELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FB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QUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTSxVQUFVLENBQUMsR0FBVztRQUMzQixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRVMsU0FBUyxDQUFDLEdBQVcsRUFBRSxRQUFhLEVBQUUsUUFBYztRQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RSxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckUsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVjb3JhdG9yQ29uZmlnIH0gZnJvbSAnLi4vbmd4LXN0b3JlLnR5cGVzJztcbmltcG9ydCB7IFdlYlN0b3JhZ2UgfSBmcm9tICcuL3N0b3JhZ2UvY29va2llcy1zdG9yYWdlJztcbmltcG9ydCB7IENhY2hlIH0gZnJvbSAnLi4vZGVjb3JhdG9yL2NhY2hlJztcbmltcG9ydCB7IENPTkZJR19QUkVGSVgsIGRlYnVnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ3hTdG9yYWdlRXZlbnQgfSBmcm9tICcuL3N0b3JhZ2Uvc3RvcmFnZS1ldmVudCc7XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VOYW1lID0gJ2xvY2FsU3RvcmFnZScgfCAnc2Vzc2lvblN0b3JhZ2UnIHwgJ2Nvb2tpZXNTdG9yYWdlJyB8ICdzaGFyZWRTdG9yYWdlJztcblxuZXhwb3J0IGNsYXNzIFdlYlN0b3JhZ2VVdGlsaXR5IHtcbiAgcHJvdGVjdGVkIF9zdG9yYWdlOiBXZWJTdG9yYWdlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzdG9yYWdlOiBXZWJTdG9yYWdlLCBwcmVmaXg6IHN0cmluZyA9ICcnLCBwcmV2aW91c1ByZWZpeD86IHN0cmluZykge1xuICAgIHRoaXMuX3N0b3JhZ2UgPSBzdG9yYWdlO1xuICAgIHRoaXMuX3ByZWZpeCA9IHByZWZpeDtcblxuICAgIC8vIGhhbmRsZSBwcmV2aW91c1ByZWZpeCBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eSBhbmQgc2FmZSBjb25maWcgY2hhbmdlcyBiZWxvd1xuICAgIGlmIChwcmVmaXggPT09IHByZXZpb3VzUHJlZml4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwcmV2aW91c1ByZWZpeCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXNQcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1Zy5sb2codGhpcy5nZXRTdG9yYWdlTmFtZSgpICsgJyA+IERldGVjdGVkIHByZWZpeCBjaGFuZ2UgZnJvbSAnICsgcHJldmlvdXNQcmVmaXggKyAnIHRvICcgKyBwcmVmaXgpO1xuICAgIHRoaXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgLy8gaWdub3JlIGNvbmZpZyBzZXR0aW5ncyB3aGVuIHByZXZpb3VzUHJlZml4ID0gJydcbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChwcmV2aW91c1ByZWZpeCkgJiYgIWtleS5zdGFydHNXaXRoKENPTkZJR19QUkVGSVgpKSB7XG4gICAgICAgIGNvbnN0IG5hbWVXaXRob3V0UHJlZml4ID0gdGhpcy50cmltUHJlZml4KGtleSk7XG4gICAgICAgIHRoaXMuc2V0KG5hbWVXaXRob3V0UHJlZml4LCB0aGlzLl9zdG9yYWdlLmdldEl0ZW0oa2V5KSk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzUHJlZml4ICE9PSAnJykge1xuICAgICAgICAgIHRoaXMuX3N0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3ByZWZpeDogc3RyaW5nID0gJyc7XG5cbiAgcHVibGljIGdldCBwcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZml4O1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jaGFuZ2VzOiBTdWJqZWN0PE5neFN0b3JhZ2VFdmVudD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyBnZXQgY2hhbmdlcygpOiBPYnNlcnZhYmxlPE5neFN0b3JhZ2VFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VzLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBrZXlzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IGtleXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IGtleXMucHVzaChrZXkpKTtcbiAgICByZXR1cm4ga2V5cztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0U2V0dGFibGUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0R2V0dGFibGUodmFsdWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRTdG9yYWdlKCk6IFdlYlN0b3JhZ2Uge1xuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICB9XG5cbiAgcHVibGljIGdldFN0b3JhZ2VLZXkoa2V5OiBzdHJpbmcsIHByZWZpeD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcHJlZml4ID0gKHR5cGVvZiBwcmVmaXggPT09ICdzdHJpbmcnKSA/IHByZWZpeCA6IHRoaXMucHJlZml4O1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtrZXl9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdG9yYWdlTmFtZSgpOiBTdG9yYWdlTmFtZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UudHlwZSB8fCAoKHRoaXMuX3N0b3JhZ2UgPT09IGxvY2FsU3RvcmFnZSkgPyAnbG9jYWxTdG9yYWdlJyA6ICdzZXNzaW9uU3RvcmFnZScpO1xuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZywgY29uZmlnOiBEZWNvcmF0b3JDb25maWcgPSB7fSk6IGFueSB7XG4gICAgY29uc3Qgc3RvcmFnZUtleSA9IHRoaXMuZ2V0U3RvcmFnZUtleShrZXksIGNvbmZpZy5wcmVmaXgpO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fc3RvcmFnZS5nZXRJdGVtKHN0b3JhZ2VLZXkpO1xuICAgIC8vIFRPRE8gcmV0dXJuIHVuZGVmaW5lZCBpZiBubyBrZXlcbiAgICAvKmlmICh2YWx1ZSA9PT0gbnVsbCAmJiAhKHN0b3JhZ2VLZXkgaW4gdGhpcy5fc3RvcmFnZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSovXG4gICAgcmV0dXJuIHRoaXMuZ2V0R2V0dGFibGUodmFsdWUgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQ8VD4oa2V5OiBzdHJpbmcsIHZhbHVlOiBULCBjb25maWc6IERlY29yYXRvckNvbmZpZyA9IHt9KTogVCB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlbW92ZShrZXkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yYWdlS2V5ID0gdGhpcy5nZXRTdG9yYWdlS2V5KGtleSwgY29uZmlnLnByZWZpeCk7XG4gICAgICBjb25zdCBzdG9yYWJsZSA9IHRoaXMuZ2V0U2V0dGFibGUodmFsdWUpO1xuICAgICAgdGhpcy5lbWl0RXZlbnQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLl9zdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgc3RvcmFibGUsIGNvbmZpZy5leHBpcmVzKTtcbiAgICAgIGNvbnN0IGNhY2hlSXRlbSA9IENhY2hlLmdldChrZXkpO1xuICAgICAgaWYgKGNhY2hlSXRlbSkge1xuICAgICAgICBkZWJ1Zy5sb2coYHVwZGF0aW5nIGZvbGxvd2luZyBDYWNoZUl0ZW0gZnJvbSAke3RoaXMuY29uc3RydWN0b3IubmFtZX06YCwgY2FjaGVJdGVtKTtcbiAgICAgICAgY2FjaGVJdGVtLnJlc2V0UHJveHkoKTtcbiAgICAgICAgY2FjaGVJdGVtLnByb3BhZ2F0ZUNoYW5nZSh2YWx1ZSwgdGhpcyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW25neC1zdG9yZV0gJHt0aGlzLmdldFN0b3JhZ2VOYW1lKCl9OlxuICAgICAgICAgICAgIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gc2F2ZSAke2tleX0gPWAsIHZhbHVlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyBUT0RPIHJldHVybiB0cnVlIGlmIGl0ZW0gZXhpc3RlZCBhbmQgZmFsc2Ugb3RoZXJ3aXNlICg/KVxuICBwdWJsaWMgcmVtb3ZlKGtleTogc3RyaW5nLCBjb25maWc6IERlY29yYXRvckNvbmZpZyA9IHt9KTogdm9pZCB7XG4gICAgY29uc3Qgc3RvcmFnZUtleSA9IHRoaXMuZ2V0U3RvcmFnZUtleShrZXksIGNvbmZpZy5wcmVmaXgpO1xuICAgIHRoaXMuX3N0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KTtcbiAgICBjb25zdCBjYWNoZUl0ZW0gPSBDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVJdGVtKSB7XG4gICAgICBjYWNoZUl0ZW0ucmVzZXRQcm94eSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXRFdmVudChudWxsIGFzIGFueSwgbnVsbCwgbnVsbCk7XG4gICAgdGhpcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoQ09ORklHX1BSRUZJWCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmUoa2V5LCB7cHJlZml4OiAnJ30pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGZvckVhY2goY2FsbGJhY2tGbjogKHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSA9PiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3N0b3JhZ2UuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UuZm9yRWFjaCgodmFsdWU6IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2FsbGJhY2tGbih0aGlzLmdldEdldHRhYmxlKHZhbHVlKSwga2V5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyh0aGlzLl9zdG9yYWdlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNhbGxiYWNrRm4odGhpcy5nZXRHZXR0YWJsZSh0aGlzLl9zdG9yYWdlW2tleV0pLCBrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFNldHRhYmxlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBXZWJTdG9yYWdlVXRpbGl0eS5nZXRTZXR0YWJsZSh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0R2V0dGFibGUodmFsdWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIFdlYlN0b3JhZ2VVdGlsaXR5LmdldEdldHRhYmxlKHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmltUHJlZml4KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4ga2V5LnJlcGxhY2UodGhpcy5wcmVmaXgsICcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0RXZlbnQoa2V5OiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnksIG9sZFZhbHVlPzogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgTmd4U3RvcmFnZUV2ZW50KHRoaXMuZ2V0U3RvcmFnZU5hbWUoKSwga2V5LCB0aGlzLl9zdG9yYWdlKTtcbiAgICBldmVudC5vbGRWYWx1ZSA9IChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkKSA/IG9sZFZhbHVlIDogdGhpcy5nZXQoa2V5KTtcbiAgICBldmVudC5uZXdWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMuX2NoYW5nZXMubmV4dChldmVudCk7XG4gIH1cbn1cbiJdfQ==