UNPKG

@rx-signals/angular-provider

Version:
105 lines 14.6 kB
import { makeEnvironmentProviders, NgModule } from '@angular/core'; import { Store } from '@rx-signals/store'; import * as i0 from "@angular/core"; // The root store is a singleton that should live as long as the whole application // In case other lifecycles are required (e.g. restricted to the lifecycle of // a certain module), corresponding child-stores should be derived from the // root store const rootStore = new Store(); export class RxSignalsStoreModule { /** * Use withRootStore, if you want the root store (the store that shares the lifecycle of the whole application). * If your module is a lazy-loaded feature module, it will still receive the same root-store instance, if you use withRootStore. * This should be the standard case. * Pass as many setup functions as you like. * * @param {SetupWithStore[]} setups - 0 to n optional setup functions (that will be called with the store instance) * @returns {ModuleWithProviders<RxSignalsStoreModule>} the module providing the root-store */ static withRootStore(...setups) { let doSetup = true; return { ngModule: RxSignalsStoreModule, providers: [{ provide: Store, useFactory: () => { // It's necessary to use a factory instead of useValue, because otherwise the doSetup block would not run in ngZone if (doSetup) { doSetup = false; setups.forEach(setup => setup(rootStore)); } return rootStore; } }], }; } /** * Use withChildStore, if you need a child store that is derived from the root-store. * See store.createChildStore() for further documentation on child stores. * * @param {SetupWithStore[]} setups - 0 to n optional setup functions (that will be called with the child-store instance) * @returns {ModuleWithProviders<RxSignalsStoreModule>} the module providing the child-store */ static withChildStore(...setups) { let doSetup = true; const childStore = rootStore.createChildStore(); return { ngModule: RxSignalsStoreModule, providers: [{ provide: Store, useFactory: () => { if (doSetup) { doSetup = false; setups.forEach(setup => setup(childStore)); } return childStore; } }], }; } } RxSignalsStoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: RxSignalsStoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); RxSignalsStoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.5", ngImport: i0, type: RxSignalsStoreModule }); RxSignalsStoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: RxSignalsStoreModule, providers: [{ provide: Store, useValue: rootStore }] // default to rootStore, if none of the static providers is used }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: RxSignalsStoreModule, decorators: [{ type: NgModule, args: [{ providers: [{ provide: Store, useValue: rootStore }] // default to rootStore, if none of the static providers is used }] }] }); /** * Use provideStore, in bootstrapApplication to provide the rx-signals root-store (the store that shares the lifecycle of the whole application). * Pass as many setup functions as you like. * * @param {SetupWithStore[]} setups - 0 to n optional setup functions (that will be called with the store instance) */ export const provideStore = (...setups) => { let doSetup = true; return makeEnvironmentProviders([ { provide: Store, useFactory: () => { // It's necessary to use a factory instead of useValue, because otherwise the doSetup block would not run in ngZone if (doSetup) { doSetup = false; setups.forEach(setup => setup(rootStore)); } return rootStore; } } ]); }; /** * Use provideChildStore, in Route.providers to provide a rx-signals child-store to the route. * See store.createChildStore() for further documentation on child stores. * Pass as many setup functions as you like. * * @param {SetupWithStore[]} setups - 0 to n optional setup functions (that will be called with the child-store instance) */ export const provideChildStore = (...setups) => { let doSetup = true; const childStore = rootStore.createChildStore(); return makeEnvironmentProviders([ { provide: Store, useFactory: () => { // It's necessary to use a factory instead of useValue, because otherwise the doSetup block would not run in ngZone if (doSetup) { doSetup = false; setups.forEach(setup => setup(childStore)); } return childStore; } } ]); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtc2lnbmFscy1zdG9yZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yeC1zaWduYWxzL2FuZ3VsYXItcHJvdmlkZXIvc3JjL2xpYi9yeC1zaWduYWxzLXN0b3JlLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsd0JBQXdCLEVBRXhCLFFBQVEsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7O0FBTzFDLGtGQUFrRjtBQUNsRiw2RUFBNkU7QUFDN0UsMkVBQTJFO0FBQzNFLGFBQWE7QUFDYixNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBSzlCLE1BQU0sT0FBTyxvQkFBb0I7SUFFL0I7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBd0I7UUFDOUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU87WUFDTCxRQUFRLEVBQUUsb0JBQW9CO1lBQzlCLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFO3dCQUM3QyxtSEFBbUg7d0JBQ25ILElBQUksT0FBTyxFQUFFOzRCQUNYLE9BQU8sR0FBRyxLQUFLLENBQUM7NEJBQ2hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzt5QkFDM0M7d0JBQ0QsT0FBTyxTQUFTLENBQUM7b0JBQ25CLENBQUMsRUFBQyxDQUFDO1NBQ0osQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsTUFBd0I7UUFDL0MsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hELE9BQU87WUFDTCxRQUFRLEVBQUUsb0JBQW9CO1lBQzlCLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFO3dCQUM3QyxJQUFJLE9BQU8sRUFBRTs0QkFDWCxPQUFPLEdBQUcsS0FBSyxDQUFDOzRCQUNoQixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7eUJBQzVDO3dCQUNELE9BQU8sVUFBVSxDQUFDO29CQUNwQixDQUFDLEVBQUMsQ0FBQztTQUNKLENBQUM7SUFDSixDQUFDOztpSEE5Q1Usb0JBQW9CO2tIQUFwQixvQkFBb0I7a0hBQXBCLG9CQUFvQixhQUZwQixDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxnRUFBZ0U7OzJGQUUxRyxvQkFBb0I7a0JBSGhDLFFBQVE7bUJBQUM7b0JBQ1IsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLGdFQUFnRTtpQkFDdEg7O0FBa0REOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxNQUF3QixFQUF3QixFQUFFO0lBQ2hGLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztJQUNuQixPQUFPLHdCQUF3QixDQUFDO1FBQzlCLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFO2dCQUNqQyxtSEFBbUg7Z0JBQ25ILElBQUksT0FBTyxFQUFFO29CQUNYLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQ2hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztpQkFDM0M7Z0JBQ0QsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQyxFQUFDO0tBQ0gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxHQUFHLE1BQXdCLEVBQXdCLEVBQUU7SUFDckYsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ25CLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ2hELE9BQU8sd0JBQXdCLENBQUM7UUFDOUIsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUU7Z0JBQy9CLG1IQUFtSDtnQkFDbkgsSUFBSSxPQUFPLEVBQUU7b0JBQ1gsT0FBTyxHQUFHLEtBQUssQ0FBQztvQkFDaEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2lCQUM1QztnQkFDRCxPQUFPLFVBQVUsQ0FBQztZQUNwQixDQUFDLEVBQUM7S0FDTCxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEVudmlyb25tZW50UHJvdmlkZXJzLFxyXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcclxuICBNb2R1bGVXaXRoUHJvdmlkZXJzLFxyXG4gIE5nTW9kdWxlXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQHJ4LXNpZ25hbHMvc3RvcmUnO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBhcmd1bWVudCB0eXBlIGZvciBzdG9yZSBwcm92aWRlcnNcclxuICovXHJcbmV4cG9ydCB0eXBlIFNldHVwV2l0aFN0b3JlID0gKHN0b3JlOiBTdG9yZSkgPT4gdm9pZDtcclxuXHJcbi8vIFRoZSByb290IHN0b3JlIGlzIGEgc2luZ2xldG9uIHRoYXQgc2hvdWxkIGxpdmUgYXMgbG9uZyBhcyB0aGUgd2hvbGUgYXBwbGljYXRpb25cclxuLy8gSW4gY2FzZSBvdGhlciBsaWZlY3ljbGVzIGFyZSByZXF1aXJlZCAoZS5nLiByZXN0cmljdGVkIHRvIHRoZSBsaWZlY3ljbGUgb2ZcclxuLy8gYSBjZXJ0YWluIG1vZHVsZSksIGNvcnJlc3BvbmRpbmcgY2hpbGQtc3RvcmVzIHNob3VsZCBiZSBkZXJpdmVkIGZyb20gdGhlXHJcbi8vIHJvb3Qgc3RvcmVcclxuY29uc3Qgcm9vdFN0b3JlID0gbmV3IFN0b3JlKCk7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogU3RvcmUsIHVzZVZhbHVlOiByb290U3RvcmUgfV0gLy8gZGVmYXVsdCB0byByb290U3RvcmUsIGlmIG5vbmUgb2YgdGhlIHN0YXRpYyBwcm92aWRlcnMgaXMgdXNlZFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUnhTaWduYWxzU3RvcmVNb2R1bGUge1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFVzZSB3aXRoUm9vdFN0b3JlLCBpZiB5b3Ugd2FudCB0aGUgcm9vdCBzdG9yZSAodGhlIHN0b3JlIHRoYXQgc2hhcmVzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHdob2xlIGFwcGxpY2F0aW9uKS5cclxuICAgKiBJZiB5b3VyIG1vZHVsZSBpcyBhIGxhenktbG9hZGVkIGZlYXR1cmUgbW9kdWxlLCBpdCB3aWxsIHN0aWxsIHJlY2VpdmUgdGhlIHNhbWUgcm9vdC1zdG9yZSBpbnN0YW5jZSwgaWYgeW91IHVzZSB3aXRoUm9vdFN0b3JlLlxyXG4gICAqIFRoaXMgc2hvdWxkIGJlIHRoZSBzdGFuZGFyZCBjYXNlLlxyXG4gICAqIFBhc3MgYXMgbWFueSBzZXR1cCBmdW5jdGlvbnMgYXMgeW91IGxpa2UuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1NldHVwV2l0aFN0b3JlW119IHNldHVwcyAtIDAgdG8gbiBvcHRpb25hbCBzZXR1cCBmdW5jdGlvbnMgKHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgc3RvcmUgaW5zdGFuY2UpXHJcbiAgICogQHJldHVybnMge01vZHVsZVdpdGhQcm92aWRlcnM8UnhTaWduYWxzU3RvcmVNb2R1bGU+fSB0aGUgbW9kdWxlIHByb3ZpZGluZyB0aGUgcm9vdC1zdG9yZVxyXG4gICAqL1xyXG4gIHN0YXRpYyB3aXRoUm9vdFN0b3JlKC4uLnNldHVwczogU2V0dXBXaXRoU3RvcmVbXSk6IE1vZHVsZVdpdGhQcm92aWRlcnM8UnhTaWduYWxzU3RvcmVNb2R1bGU+IHtcclxuICAgIGxldCBkb1NldHVwID0gdHJ1ZTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5nTW9kdWxlOiBSeFNpZ25hbHNTdG9yZU1vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBTdG9yZSwgdXNlRmFjdG9yeTogKCkgPT4ge1xyXG4gICAgICAgIC8vIEl0J3MgbmVjZXNzYXJ5IHRvIHVzZSBhIGZhY3RvcnkgaW5zdGVhZCBvZiB1c2VWYWx1ZSwgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGRvU2V0dXAgYmxvY2sgd291bGQgbm90IHJ1biBpbiBuZ1pvbmVcclxuICAgICAgICBpZiAoZG9TZXR1cCkge1xyXG4gICAgICAgICAgZG9TZXR1cCA9IGZhbHNlO1xyXG4gICAgICAgICAgc2V0dXBzLmZvckVhY2goc2V0dXAgPT4gc2V0dXAocm9vdFN0b3JlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByb290U3RvcmU7XHJcbiAgICAgIH19XSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVc2Ugd2l0aENoaWxkU3RvcmUsIGlmIHlvdSBuZWVkIGEgY2hpbGQgc3RvcmUgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIHJvb3Qtc3RvcmUuXHJcbiAgICogU2VlIHN0b3JlLmNyZWF0ZUNoaWxkU3RvcmUoKSBmb3IgZnVydGhlciBkb2N1bWVudGF0aW9uIG9uIGNoaWxkIHN0b3Jlcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U2V0dXBXaXRoU3RvcmVbXX0gc2V0dXBzIC0gMCB0byBuIG9wdGlvbmFsIHNldHVwIGZ1bmN0aW9ucyAodGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBjaGlsZC1zdG9yZSBpbnN0YW5jZSlcclxuICAgKiBAcmV0dXJucyB7TW9kdWxlV2l0aFByb3ZpZGVyczxSeFNpZ25hbHNTdG9yZU1vZHVsZT59IHRoZSBtb2R1bGUgcHJvdmlkaW5nIHRoZSBjaGlsZC1zdG9yZVxyXG4gICAqL1xyXG4gIHN0YXRpYyB3aXRoQ2hpbGRTdG9yZSguLi5zZXR1cHM6IFNldHVwV2l0aFN0b3JlW10pOiBNb2R1bGVXaXRoUHJvdmlkZXJzPFJ4U2lnbmFsc1N0b3JlTW9kdWxlPiB7XHJcbiAgICBsZXQgZG9TZXR1cCA9IHRydWU7XHJcbiAgICBjb25zdCBjaGlsZFN0b3JlID0gcm9vdFN0b3JlLmNyZWF0ZUNoaWxkU3RvcmUoKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5nTW9kdWxlOiBSeFNpZ25hbHNTdG9yZU1vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBTdG9yZSwgdXNlRmFjdG9yeTogKCkgPT4ge1xyXG4gICAgICAgIGlmIChkb1NldHVwKSB7XHJcbiAgICAgICAgICBkb1NldHVwID0gZmFsc2U7XHJcbiAgICAgICAgICBzZXR1cHMuZm9yRWFjaChzZXR1cCA9PiBzZXR1cChjaGlsZFN0b3JlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGlsZFN0b3JlO1xyXG4gICAgICB9fV0sXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFVzZSBwcm92aWRlU3RvcmUsIGluIGJvb3RzdHJhcEFwcGxpY2F0aW9uIHRvIHByb3ZpZGUgdGhlIHJ4LXNpZ25hbHMgcm9vdC1zdG9yZSAodGhlIHN0b3JlIHRoYXQgc2hhcmVzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHdob2xlIGFwcGxpY2F0aW9uKS5cclxuICogUGFzcyBhcyBtYW55IHNldHVwIGZ1bmN0aW9ucyBhcyB5b3UgbGlrZS5cclxuICpcclxuICogQHBhcmFtIHtTZXR1cFdpdGhTdG9yZVtdfSBzZXR1cHMgLSAwIHRvIG4gb3B0aW9uYWwgc2V0dXAgZnVuY3Rpb25zICh0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHN0b3JlIGluc3RhbmNlKVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHByb3ZpZGVTdG9yZSA9ICguLi5zZXR1cHM6IFNldHVwV2l0aFN0b3JlW10pOiBFbnZpcm9ubWVudFByb3ZpZGVycyA9PiB7XHJcbiAgbGV0IGRvU2V0dXAgPSB0cnVlO1xyXG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xyXG4gICAgeyBwcm92aWRlOiBTdG9yZSwgdXNlRmFjdG9yeTogKCkgPT4ge1xyXG4gICAgICAvLyBJdCdzIG5lY2Vzc2FyeSB0byB1c2UgYSBmYWN0b3J5IGluc3RlYWQgb2YgdXNlVmFsdWUsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBkb1NldHVwIGJsb2NrIHdvdWxkIG5vdCBydW4gaW4gbmdab25lXHJcbiAgICAgIGlmIChkb1NldHVwKSB7XHJcbiAgICAgICAgZG9TZXR1cCA9IGZhbHNlO1xyXG4gICAgICAgIHNldHVwcy5mb3JFYWNoKHNldHVwID0+IHNldHVwKHJvb3RTdG9yZSkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByb290U3RvcmU7XHJcbiAgICB9fVxyXG4gIF0pO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFVzZSBwcm92aWRlQ2hpbGRTdG9yZSwgaW4gUm91dGUucHJvdmlkZXJzIHRvIHByb3ZpZGUgYSByeC1zaWduYWxzIGNoaWxkLXN0b3JlIHRvIHRoZSByb3V0ZS5cclxuICogU2VlIHN0b3JlLmNyZWF0ZUNoaWxkU3RvcmUoKSBmb3IgZnVydGhlciBkb2N1bWVudGF0aW9uIG9uIGNoaWxkIHN0b3Jlcy5cclxuICogUGFzcyBhcyBtYW55IHNldHVwIGZ1bmN0aW9ucyBhcyB5b3UgbGlrZS5cclxuICpcclxuICogQHBhcmFtIHtTZXR1cFdpdGhTdG9yZVtdfSBzZXR1cHMgLSAwIHRvIG4gb3B0aW9uYWwgc2V0dXAgZnVuY3Rpb25zICh0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGNoaWxkLXN0b3JlIGluc3RhbmNlKVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHByb3ZpZGVDaGlsZFN0b3JlID0gKC4uLnNldHVwczogU2V0dXBXaXRoU3RvcmVbXSk6IEVudmlyb25tZW50UHJvdmlkZXJzID0+IHtcclxuICBsZXQgZG9TZXR1cCA9IHRydWU7XHJcbiAgY29uc3QgY2hpbGRTdG9yZSA9IHJvb3RTdG9yZS5jcmVhdGVDaGlsZFN0b3JlKCk7XHJcbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXHJcbiAgICB7IHByb3ZpZGU6IFN0b3JlLCB1c2VGYWN0b3J5OiAoKSA9PiB7XHJcbiAgICAgICAgLy8gSXQncyBuZWNlc3NhcnkgdG8gdXNlIGEgZmFjdG9yeSBpbnN0ZWFkIG9mIHVzZVZhbHVlLCBiZWNhdXNlIG90aGVyd2lzZSB0aGUgZG9TZXR1cCBibG9jayB3b3VsZCBub3QgcnVuIGluIG5nWm9uZVxyXG4gICAgICAgIGlmIChkb1NldHVwKSB7XHJcbiAgICAgICAgICBkb1NldHVwID0gZmFsc2U7XHJcbiAgICAgICAgICBzZXR1cHMuZm9yRWFjaChzZXR1cCA9PiBzZXR1cChjaGlsZFN0b3JlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGlsZFN0b3JlO1xyXG4gICAgICB9fVxyXG4gIF0pO1xyXG59O1xyXG4iXX0=