UNPKG

ngx-translate-cache

Version:

ngx-translate extension to facilitate language cache.

112 lines 15 kB
import { Inject, Injectable, InjectionToken } from '@angular/core'; import * as i0 from "@angular/core"; export var CacheMechanism; (function (CacheMechanism) { CacheMechanism.LocalStorage = 'LocalStorage'; CacheMechanism.Cookie = 'Cookie'; })(CacheMechanism || (CacheMechanism = {})); export const CACHE_NAME = new InjectionToken('CACHE_NAME'); export const CACHE_MECHANISM = new InjectionToken('CACHE_MECHANISM'); export const COOKIE_EXPIRY = new InjectionToken('COOKIE_EXPIRY'); export const COOKIE_ATTRIBUTES = new InjectionToken('COOKIE_ATTRIBUTES'); const DEFAULT_CACHE_NAME = 'lang'; const DEFAULT_CACHE_MECHANISM = CacheMechanism.LocalStorage; const DEFAULT_COOKIE_EXPIRY = 720; export class TranslateCacheSettings { constructor(cacheName = DEFAULT_CACHE_NAME, cacheMechanism = DEFAULT_CACHE_MECHANISM, cookieExpiry = DEFAULT_COOKIE_EXPIRY, cookieAttributes) { this.cacheName = cacheName; this.cacheMechanism = cacheMechanism; this.cookieExpiry = cookieExpiry; this.cookieAttributes = cookieAttributes; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: TranslateCacheSettings, deps: [{ token: CACHE_NAME }, { token: CACHE_MECHANISM }, { token: COOKIE_EXPIRY }, { token: COOKIE_ATTRIBUTES }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: TranslateCacheSettings }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: TranslateCacheSettings, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: [CACHE_NAME] }] }, { type: undefined, decorators: [{ type: Inject, args: [CACHE_MECHANISM] }] }, { type: undefined, decorators: [{ type: Inject, args: [COOKIE_EXPIRY] }] }, { type: undefined, decorators: [{ type: Inject, args: [COOKIE_ATTRIBUTES] }] }] }); /* Not injectable */ export class TranslateCacheService { constructor(translateService, translateCacheSettings) { this.translateService = translateService; this.translateCacheSettings = translateCacheSettings; } init() { this.translateService.onLangChange .subscribe((event) => { if (this.translateCacheSettings.cacheMechanism === CacheMechanism.LocalStorage) { return this.cacheWithLocalStorage(event.lang); } if (this.translateCacheSettings.cacheMechanism === CacheMechanism.Cookie) { return this.cacheWithCookies(event.lang); } }); const currentLang = this.getCachedLanguage() || this.translateService.getBrowserLang(); if (currentLang) { this.translateService.use(currentLang); } } getCachedLanguage() { if (this.translateCacheSettings.cacheMechanism === CacheMechanism.LocalStorage) { return this.cacheWithLocalStorage(); } if (this.translateCacheSettings.cacheMechanism === CacheMechanism.Cookie) { return this.cacheWithCookies(); } } cacheWithLocalStorage(value) { if (typeof window === 'undefined' || typeof window.localStorage === 'undefined') { return; } try { if (value) { window.localStorage.setItem(this.translateCacheSettings.cacheName, value); return; } return window.localStorage.getItem(this.translateCacheSettings.cacheName); } catch (e) { return; } } cacheWithCookies(value) { if (typeof document === 'undefined' || typeof document.cookie === 'undefined') { return; } try { const name = encodeURIComponent(this.translateCacheSettings.cacheName); if (value) { let cookieString = `${name}=${encodeURIComponent(value)}`; if (this.translateCacheSettings.cookieExpiry >= 0) { const date = new Date(); date.setTime(date.getTime() + this.translateCacheSettings.cookieExpiry * 3600000); cookieString += `;expires=${date.toUTCString()}`; } if (this.translateCacheSettings.cookieAttributes) { cookieString += ';' + this.translateCacheSettings.cookieAttributes; } document.cookie = cookieString; return; } const regexp = new RegExp('(?:^' + name + '|;\\s*' + name + ')=(.*?)(?:;|$)', 'g'); const result = regexp.exec(document.cookie); return decodeURIComponent(result[1]); } catch (e) { return; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRyYW5zbGF0ZS1jYWNoZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRyYW5zbGF0ZS1jYWNoZS9zcmMvbGliL25neC10cmFuc2xhdGUtY2FjaGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQVksTUFBTSxlQUFlLENBQUM7O0FBSTdFLE1BQU0sS0FBVyxjQUFjLENBRzlCO0FBSEQsV0FBaUIsY0FBYztJQUNoQiwyQkFBWSxHQUF1QixjQUFjLENBQUM7SUFDbEQscUJBQU0sR0FBdUIsUUFBUSxDQUFDO0FBQ3JELENBQUMsRUFIZ0IsY0FBYyxLQUFkLGNBQWMsUUFHOUI7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxjQUFjLENBQVMsWUFBWSxDQUFDLENBQUM7QUFDbkUsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLElBQUksY0FBYyxDQUFTLGlCQUFpQixDQUFDLENBQUM7QUFDN0UsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLElBQUksY0FBYyxDQUFTLGVBQWUsQ0FBQyxDQUFDO0FBQ3pFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLElBQUksY0FBYyxDQUFTLG1CQUFtQixDQUFDLENBQUM7QUFVakYsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFDbEMsTUFBTSx1QkFBdUIsR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDO0FBQzVELE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0FBR2xDLE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsWUFBdUMsWUFBb0Isa0JBQWtCLEVBQ2pDLGlCQUF5Qix1QkFBdUIsRUFDbEQsZUFBdUIscUJBQXFCLEVBQ3hDLGdCQUF3QjtRQUgvQixjQUFTLEdBQVQsU0FBUyxDQUE2QjtRQUNqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBa0M7UUFDbEQsaUJBQVksR0FBWixZQUFZLENBQWdDO1FBQ3hDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBUTtJQUFHLENBQUM7OEdBSi9ELHNCQUFzQixrQkFDYixVQUFVLGFBQ1YsZUFBZSxhQUNmLGFBQWEsYUFDYixpQkFBaUI7a0hBSjFCLHNCQUFzQjs7MkZBQXRCLHNCQUFzQjtrQkFEbEMsVUFBVTs7MEJBRUksTUFBTTsyQkFBQyxVQUFVOzswQkFDakIsTUFBTTsyQkFBQyxlQUFlOzswQkFDdEIsTUFBTTsyQkFBQyxhQUFhOzswQkFDcEIsTUFBTTsyQkFBQyxpQkFBaUI7O0FBR3ZDLG9CQUFvQjtBQUNwQixNQUFNLE9BQU8scUJBQXFCO0lBQ2hDLFlBQW9CLGdCQUFrQyxFQUNsQyxzQkFBOEM7UUFEOUMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO0lBQUcsQ0FBQztJQUUvRCxJQUFJO1FBQ1QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVk7YUFDL0IsU0FBUyxDQUFDLENBQUMsS0FBNkIsRUFBRSxFQUFFO1lBQzNDLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsS0FBSyxjQUFjLENBQUMsWUFBWSxFQUFFO2dCQUM5RSxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0M7WUFFRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLEtBQUssY0FBYyxDQUFDLE1BQU0sRUFBRTtnQkFDeEUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFTCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdkYsSUFBSSxXQUFXLEVBQUU7WUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQUU7SUFDOUQsQ0FBQztJQUVNLGlCQUFpQjtRQUN0QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLEtBQUssY0FBYyxDQUFDLFlBQVksRUFBRTtZQUM5RSxPQUFPLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxLQUFLLGNBQWMsQ0FBQyxNQUFNLEVBQUU7WUFDeEUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxLQUFjO1FBQzFDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU8sTUFBTSxDQUFDLFlBQVksS0FBSyxXQUFXLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFNUYsSUFBSTtZQUNGLElBQUksS0FBSyxFQUFFO2dCQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQUMsT0FBTzthQUFFO1lBRWpHLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzNFO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFBRSxPQUFPO1NBQUU7SUFDekIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEtBQWM7UUFDckMsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXLElBQUksT0FBTyxRQUFRLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUUxRixJQUFJO1lBQ0YsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXZFLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksWUFBWSxHQUFHLEdBQUcsSUFBSSxJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBRTFELElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksSUFBSSxDQUFDLEVBQUU7b0JBQ2pELE1BQU0sSUFBSSxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7b0JBRTlCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLENBQUM7b0JBQ2xGLFlBQVksSUFBSSxZQUFZLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2lCQUNsRDtnQkFFRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDaEQsWUFBWSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUM7aUJBQ3BFO2dCQUVELFFBQVEsQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO2dCQUUvQixPQUFPO2FBQ1I7WUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLFFBQVEsR0FBRyxJQUFJLEdBQUcsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkYsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFNUMsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QztRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQUUsT0FBTztTQUFFO0lBQ3pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlLCBUcmFuc2xhdGlvbkNoYW5nZUV2ZW50IH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbmV4cG9ydCB0eXBlIENhY2hlTWVjaGFuaXNtVHlwZSA9ICdMb2NhbFN0b3JhZ2UnIHwgJ0Nvb2tpZSc7XG5leHBvcnQgbmFtZXNwYWNlIENhY2hlTWVjaGFuaXNtIHtcbiAgZXhwb3J0IGNvbnN0IExvY2FsU3RvcmFnZTogQ2FjaGVNZWNoYW5pc21UeXBlID0gJ0xvY2FsU3RvcmFnZSc7XG4gIGV4cG9ydCBjb25zdCBDb29raWU6IENhY2hlTWVjaGFuaXNtVHlwZSA9ICdDb29raWUnO1xufVxuXG5leHBvcnQgY29uc3QgQ0FDSEVfTkFNRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdDQUNIRV9OQU1FJyk7XG5leHBvcnQgY29uc3QgQ0FDSEVfTUVDSEFOSVNNID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ0NBQ0hFX01FQ0hBTklTTScpO1xuZXhwb3J0IGNvbnN0IENPT0tJRV9FWFBJUlkgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignQ09PS0lFX0VYUElSWScpO1xuZXhwb3J0IGNvbnN0IENPT0tJRV9BVFRSSUJVVEVTID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ0NPT0tJRV9BVFRSSUJVVEVTJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRlQ2FjaGVDb25maWcge1xuICBjYWNoZVNlcnZpY2U6IFByb3ZpZGVyO1xuICBjYWNoZU5hbWU/OiBzdHJpbmc7XG4gIGNhY2hlTWVjaGFuaXNtPzogQ2FjaGVNZWNoYW5pc21UeXBlO1xuICBjb29raWVFeHBpcnk/OiBudW1iZXI7XG4gIGNvb2tpZUF0dHJpYnV0ZXM/OiBzdHJpbmc7XG59XG5cbmNvbnN0IERFRkFVTFRfQ0FDSEVfTkFNRSA9ICdsYW5nJztcbmNvbnN0IERFRkFVTFRfQ0FDSEVfTUVDSEFOSVNNID0gQ2FjaGVNZWNoYW5pc20uTG9jYWxTdG9yYWdlO1xuY29uc3QgREVGQVVMVF9DT09LSUVfRVhQSVJZID0gNzIwO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRlQ2FjaGVTZXR0aW5ncyB7XG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoQ0FDSEVfTkFNRSkgcHVibGljIGNhY2hlTmFtZTogc3RyaW5nID0gREVGQVVMVF9DQUNIRV9OQU1FLFxuICAgICAgICAgICAgICBASW5qZWN0KENBQ0hFX01FQ0hBTklTTSkgcHVibGljIGNhY2hlTWVjaGFuaXNtOiBzdHJpbmcgPSBERUZBVUxUX0NBQ0hFX01FQ0hBTklTTSxcbiAgICAgICAgICAgICAgQEluamVjdChDT09LSUVfRVhQSVJZKSBwdWJsaWMgY29va2llRXhwaXJ5OiBudW1iZXIgPSBERUZBVUxUX0NPT0tJRV9FWFBJUlksXG4gICAgICAgICAgICAgIEBJbmplY3QoQ09PS0lFX0FUVFJJQlVURVMpIHB1YmxpYyBjb29raWVBdHRyaWJ1dGVzOiBzdHJpbmcpIHt9XG59XG5cbi8qIE5vdCBpbmplY3RhYmxlICovXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRlQ2FjaGVTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZUNhY2hlU2V0dGluZ3M6IFRyYW5zbGF0ZUNhY2hlU2V0dGluZ3MpIHt9XG5cbiAgcHVibGljIGluaXQoKTogdm9pZCB7XG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLm9uTGFuZ0NoYW5nZVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IFRyYW5zbGF0aW9uQ2hhbmdlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNsYXRlQ2FjaGVTZXR0aW5ncy5jYWNoZU1lY2hhbmlzbSA9PT0gQ2FjaGVNZWNoYW5pc20uTG9jYWxTdG9yYWdlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVXaXRoTG9jYWxTdG9yYWdlKGV2ZW50LmxhbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHJhbnNsYXRlQ2FjaGVTZXR0aW5ncy5jYWNoZU1lY2hhbmlzbSA9PT0gQ2FjaGVNZWNoYW5pc20uQ29va2llKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVXaXRoQ29va2llcyhldmVudC5sYW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50TGFuZyA9IHRoaXMuZ2V0Q2FjaGVkTGFuZ3VhZ2UoKSB8fCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0QnJvd3NlckxhbmcoKTtcblxuICAgIGlmIChjdXJyZW50TGFuZykgeyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudXNlKGN1cnJlbnRMYW5nKTsgfVxuICB9XG5cbiAgcHVibGljIGdldENhY2hlZExhbmd1YWdlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudHJhbnNsYXRlQ2FjaGVTZXR0aW5ncy5jYWNoZU1lY2hhbmlzbSA9PT0gQ2FjaGVNZWNoYW5pc20uTG9jYWxTdG9yYWdlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVdpdGhMb2NhbFN0b3JhZ2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2xhdGVDYWNoZVNldHRpbmdzLmNhY2hlTWVjaGFuaXNtID09PSBDYWNoZU1lY2hhbmlzbS5Db29raWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlV2l0aENvb2tpZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhY2hlV2l0aExvY2FsU3RvcmFnZSh2YWx1ZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlID09PSAndW5kZWZpbmVkJykgeyByZXR1cm47IH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAodmFsdWUpIHsgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMudHJhbnNsYXRlQ2FjaGVTZXR0aW5ncy5jYWNoZU5hbWUsIHZhbHVlKTsgcmV0dXJuOyB9XG5cbiAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy50cmFuc2xhdGVDYWNoZVNldHRpbmdzLmNhY2hlTmFtZSk7XG4gICAgfSBjYXRjaCAoZSkgeyByZXR1cm47IH1cbiAgfVxuXG4gIHByaXZhdGUgY2FjaGVXaXRoQ29va2llcyh2YWx1ZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRvY3VtZW50LmNvb2tpZSA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuOyB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLnRyYW5zbGF0ZUNhY2hlU2V0dGluZ3MuY2FjaGVOYW1lKTtcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGxldCBjb29raWVTdHJpbmcgPSBgJHtuYW1lfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YDtcblxuICAgICAgICBpZiAodGhpcy50cmFuc2xhdGVDYWNoZVNldHRpbmdzLmNvb2tpZUV4cGlyeSA+PSAwKSB7XG4gICAgICAgICAgY29uc3QgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyB0aGlzLnRyYW5zbGF0ZUNhY2hlU2V0dGluZ3MuY29va2llRXhwaXJ5ICogMzYwMDAwMCk7XG4gICAgICAgICAgY29va2llU3RyaW5nICs9IGA7ZXhwaXJlcz0ke2RhdGUudG9VVENTdHJpbmcoKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHJhbnNsYXRlQ2FjaGVTZXR0aW5ncy5jb29raWVBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgY29va2llU3RyaW5nICs9ICc7JyArIHRoaXMudHJhbnNsYXRlQ2FjaGVTZXR0aW5ncy5jb29raWVBdHRyaWJ1dGVzO1xuICAgICAgICB9XG5cbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llU3RyaW5nO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoJyg/Ol4nICsgbmFtZSArICd8O1xcXFxzKicgKyBuYW1lICsgJyk9KC4qPykoPzo7fCQpJywgJ2cnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlZ2V4cC5leGVjKGRvY3VtZW50LmNvb2tpZSk7XG5cbiAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0WzFdKTtcbiAgICB9IGNhdGNoIChlKSB7IHJldHVybjsgfVxuICB9XG59XG4iXX0=