UNPKG

ngx-suspense

Version:

This library is an experimetnal implementation of React Suspense for Angular.

145 lines 21.6 kB
import { __decorate, __param, __read } from "tslib"; import { Injectable, Inject, Optional } from "@angular/core"; import { BehaviorSubject, Observable, Subject, combineLatest, merge, of, timer, } from "rxjs"; import { concatMap, filter, tap, mapTo, skip, startWith, switchMap, takeUntil, shareReplay, } from "rxjs/operators"; import { LOADING_CONFIG_TOKEN, LOADING_DEFUALT_CONFIG, } from "./ngx-suspense.config"; var NgxSuspenseService = /** @class */ (function () { function NgxSuspenseService(userConfig) { if (userConfig === void 0) { userConfig = LOADING_DEFUALT_CONFIG; } this.userConfig = userConfig; this.loadingSubject = new BehaviorSubject(false); this.loading$ = this.loadingSubject.asObservable(); this.taskStartSubject = new Subject(); this.taskStart$ = this.taskStartSubject.asObservable(); this.taskEndSubject = new Subject(); this.taskEnd$ = this.taskEndSubject.asObservable(); } NgxSuspenseService.prototype.ngOnDestroy = function () { if (this.sub && typeof this.sub.unsubscribe === "function") { this.sub.unsubscribe(); } }; Object.defineProperty(NgxSuspenseService.prototype, "busyTimer", { set: function (_a) { var busyDelayMs = _a.busyDelayMs, busyMinDurationMs = _a.busyMinDurationMs; if (typeof busyDelayMs === "number") { this.userConfig.busyDelayMs = busyDelayMs; } if (typeof busyMinDurationMs === "number") { this.userConfig.busyMinDurationMs = busyMinDurationMs; } }, enumerable: true, configurable: true }); Object.defineProperty(NgxSuspenseService.prototype, "config", { get: function () { return this.userConfig; }, enumerable: true, configurable: true }); NgxSuspenseService.prototype.show = function () { this.loadingSubject.next(true); }; NgxSuspenseService.prototype.hide = function () { this.loadingSubject.next(false); }; NgxSuspenseService.prototype.controller = function () { var _this = this; this.busyMinDurationTimer = timer(this.config.busyMinDurationMs + this.config.busyDelayMs); this.busyDelayTimer = timer(this.config.busyDelayMs); var busyDelayTimerStart = this.taskStart$.pipe(switchMap(function () { return _this.busyDelayTimer; })); var busyDelayTimerEnd = busyDelayTimerStart.pipe(takeUntil(this.taskEnd$)); var emitOnTaskEnd = this.taskEnd$.pipe(mapTo(1)); var emitOnDelayTimerEnd = busyDelayTimerEnd.pipe(mapTo(-1)); var emitOnMinDurationEnd = this.busyMinDurationTimer.pipe(mapTo(-1)); // Start loading skeleton var raceBetweenTaskAndDelay = combineLatest([ emitOnTaskEnd.pipe(startWith(null)), emitOnDelayTimerEnd.pipe(startWith(null)), ]).pipe(skip(1)); var taskEndBeforeDelay = raceBetweenTaskAndDelay.pipe(filter(function (_a) { var _b = __read(_a, 2), taskEndFirst = _b[0], timerEndFirst = _b[1]; return taskEndFirst === 1 && timerEndFirst === null; })); var shouldNotShowSpinner = taskEndBeforeDelay.pipe(mapTo(false)); var taskEndAfterTimeout = raceBetweenTaskAndDelay.pipe(filter(function (_a) { var _b = __read(_a, 2), taskEndFirst = _b[0], timerEndFirst = _b[1]; return taskEndFirst === null && timerEndFirst === -1; })); var shouldShowSpinner = taskEndAfterTimeout.pipe(mapTo(true)); var showSpinner = shouldShowSpinner.pipe(tap(function () { _this.show(); })); // hide loading skeleton var raceBetweenTaskAndMinDuration = combineLatest([ emitOnTaskEnd.pipe(startWith(null)), emitOnMinDurationEnd.pipe(startWith(null)), ]).pipe(skip(1)); var hideSpinnerUntilMinDurationEnd = raceBetweenTaskAndMinDuration.pipe(filter(function (_a) { var _b = __read(_a, 2), taskEndFirst = _b[0], timerEndFirst = _b[1]; return taskEndFirst === 1 && timerEndFirst === null; })); var hideSpinnerAfterTimerAndTaskEnd = raceBetweenTaskAndMinDuration.pipe(filter(function (_a) { var _b = __read(_a, 2), taskEndFirst = _b[0], timerEndFirst = _b[1]; return taskEndFirst === 1 && timerEndFirst === -1; })); var hideSpinner = merge( // case 1: should not show spinner at all shouldNotShowSpinner, // case 2: task end, but wait until min duration timer ends combineLatest([hideSpinnerUntilMinDurationEnd, emitOnMinDurationEnd]), // case 3: task takes a long time, wait unitl its end hideSpinnerAfterTimerAndTaskEnd).pipe(tap(function () { _this.hide(); })); return showSpinner.pipe(takeUntil(hideSpinner)); }; NgxSuspenseService.prototype.showLoadingStatus = function () { var _this = this; if (this.sub && typeof this.sub.unsubscribe === "function") { this.sub.unsubscribe(); } this.sub = this.controller().subscribe(); return function (source) { return new Observable(function (subscriber) { var emitOnObsEnd = source.pipe(tap(function () { _this.taskEndSubject.next(); })); var sub = of(null) .pipe(tap(function () { _this.taskStartSubject.next(); }), concatMap(function () { return emitOnObsEnd; }), shareReplay(1)) .subscribe(subscriber); return function () { sub.unsubscribe(); }; }); }; }; NgxSuspenseService.prototype.showingFor = function (obs$) { var _this = this; if (this.sub && typeof this.sub.unsubscribe === "function") { this.sub.unsubscribe(); } this.sub = this.controller().subscribe(); var emitOnObsEnd = obs$.pipe(tap(function () { _this.taskEndSubject.next(); })); return of(null).pipe(tap(function () { _this.taskStartSubject.next(); }), concatMap(function () { return emitOnObsEnd; }), shareReplay(1)); }; NgxSuspenseService.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [LOADING_CONFIG_TOKEN,] }] } ]; }; NgxSuspenseService = __decorate([ Injectable(), __param(0, Optional()), __param(0, Inject(LOADING_CONFIG_TOKEN)) ], NgxSuspenseService); return NgxSuspenseService; }()); export { NgxSuspenseService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXN1c3BlbnNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3VzcGVuc2UvIiwic291cmNlcyI6WyJsaWIvbmd4LXN1c3BlbnNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixPQUFPLEVBRVAsYUFBYSxFQUNiLEtBQUssRUFDTCxFQUFFLEVBQ0YsS0FBSyxHQUVOLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLFNBQVMsRUFDVCxNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssRUFDTCxJQUFJLEVBQ0osU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsV0FBVyxHQUNaLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixzQkFBc0IsR0FFdkIsTUFBTSx1QkFBdUIsQ0FBQztBQUcvQjtJQWtCRSw0QkFHVSxVQUFtRDtRQUFuRCwyQkFBQSxFQUFBLG1DQUFtRDtRQUFuRCxlQUFVLEdBQVYsVUFBVSxDQUF5QztRQXBCckQsbUJBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUM3RCxhQUFRLEdBQXdCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFM0QscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNqQyxlQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xELG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMvQixhQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQWVuRCxDQUFDO0lBRUosd0NBQVcsR0FBWDtRQUNFLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxP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QUFXLEVBQUUsQ0FBQztnQkFDcEIsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsdUNBQVUsR0FBVixVQUFjLElBQW1CO1FBQWpDLGlCQWlCQztRQWhCQyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQUU7WUFDMUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN4QjtRQUNELElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3pDLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQzVCLEdBQUcsQ0FBQztZQUNGLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDbEIsR0FBRyxDQUFDO1lBQ0YsS0FBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxjQUFNLE9BQUEsWUFBWSxFQUFaLENBQVksQ0FBQyxFQUM3QixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQ2YsQ0FBQztJQUNKLENBQUM7O2dEQW5KRSxRQUFRLFlBQ1IsTUFBTSxTQUFDLG9CQUFvQjs7SUFwQm5CLGtCQUFrQjtRQUQ5QixVQUFVLEVBQUU7UUFvQlIsV0FBQSxRQUFRLEVBQUUsQ0FBQTtRQUNWLFdBQUEsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUE7T0FwQnBCLGtCQUFrQixDQXVLOUI7SUFBRCx5QkFBQztDQUFBLEFBdktELElBdUtDO1NBdktZLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwsIE9uRGVzdHJveSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFN1YnNjcmliZXIsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIG1lcmdlLFxuICBvZixcbiAgdGltZXIsXG4gIFN1YnNjcmlwdGlvbixcbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7XG4gIGNvbmNhdE1hcCxcbiAgZmlsdGVyLFxuICB0YXAsXG4gIG1hcFRvLFxuICBza2lwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZVVudGlsLFxuICBzaGFyZVJlcGxheSxcbn0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQge1xuICBMT0FESU5HX0NPTkZJR19UT0tFTixcbiAgTE9BRElOR19ERUZVQUxUX0NPTkZJRyxcbiAgSUxvYWRpbmdDb25maWcsXG59IGZyb20gXCIuL25neC1zdXNwZW5zZS5jb25maWdcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5neFN1c3BlbnNlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgbG9hZGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgbG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmxvYWRpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgdGFza1N0YXJ0U3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgdGFza1N0YXJ0JCA9IHRoaXMudGFza1N0YXJ0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHJpdmF0ZSB0YXNrRW5kU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgdGFza0VuZCQgPSB0aGlzLnRhc2tFbmRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8vIGFjY29yZGluZyB0byBGYWNlYm9vayBVSSB0ZWFtIHJlc2VhcmNoLCBpdCB3b3VsZCBiZSBhIGJldHRlclxuICAvLyB1c2VyIGV4cGVyaWVuY2UgdG8gc2hvdyBzcGlubmVyIGEgbGl0dGxlIGJpdCBsb25nZXIgdGhhblxuICAvLyB3aGVuIHVzZXIgaGFzIGEgaGlnaCBpbnRlcm5ldCBzcGVlZC5cbiAgLy8gQXZvaWQgZmxhc2hpbmcgc2NyZWVuXG4gIHByaXZhdGUgYnVzeU1pbkR1cmF0aW9uVGltZXI7XG4gIHByaXZhdGUgYnVzeURlbGF5VGltZXI7XG5cbiAgcHJpdmF0ZSBzdWI6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoTE9BRElOR19DT05GSUdfVE9LRU4pXG4gICAgcHJpdmF0ZSB1c2VyQ29uZmlnOiBJTG9hZGluZ0NvbmZpZyA9IExPQURJTkdfREVGVUFMVF9DT05GSUdcbiAgKSB7fVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnN1YiAmJiB0eXBlb2YgdGhpcy5zdWIudW5zdWJzY3JpYmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5zdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBzZXQgYnVzeVRpbWVyKHsgYnVzeURlbGF5TXMsIGJ1c3lNaW5EdXJhdGlvbk1zIH0pIHtcbiAgICBpZiAodHlwZW9mIGJ1c3lEZWxheU1zID09PSBcIm51bWJlclwiKSB7XG4gICAgICB0aGlzLnVzZXJDb25maWcuYnVzeURlbGF5TXMgPSBidXN5RGVsYXlNcztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJ1c3lNaW5EdXJhdGlvbk1zID09PSBcIm51bWJlclwiKSB7XG4gICAgICB0aGlzLnVzZXJDb25maWcuYnVzeU1pbkR1cmF0aW9uTXMgPSBidXN5TWluRHVyYXRpb25NcztcbiAgICB9XG4gIH1cblxuICBnZXQgY29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLnVzZXJDb25maWc7XG4gIH1cblxuICBzaG93KCkge1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udHJvbGxlcigpIHtcbiAgICB0aGlzLmJ1c3lNaW5EdXJhdGlvblRpbWVyID0gdGltZXIoXG4gICAgICB0aGlzLmNvbmZpZy5idXN5TWluRHVyYXRpb25NcyArIHRoaXMuY29uZmlnLmJ1c3lEZWxheU1zXG4gICAgKTtcbiAgICB0aGlzLmJ1c3lEZWxheVRpbWVyID0gdGltZXIodGhpcy5jb25maWcuYnVzeURlbGF5TXMpO1xuICAgIGNvbnN0IGJ1c3lEZWxheVRpbWVyU3RhcnQgPSB0aGlzLnRhc2tTdGFydCQucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmJ1c3lEZWxheVRpbWVyKVxuICAgICk7XG4gICAgY29uc3QgYnVzeURlbGF5VGltZXJFbmQgPSBidXN5RGVsYXlUaW1lclN0YXJ0LnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy50YXNrRW5kJClcbiAgICApO1xuICAgIGNvbnN0IGVtaXRPblRhc2tFbmQgPSB0aGlzLnRhc2tFbmQkLnBpcGUobWFwVG8oMSkpO1xuICAgIGNvbnN0IGVtaXRPbkRlbGF5VGltZXJFbmQgPSBidXN5RGVsYXlUaW1lckVuZC5waXBlKG1hcFRvKC0xKSk7XG4gICAgY29uc3QgZW1pdE9uTWluRHVyYXRpb25FbmQgPSB0aGlzLmJ1c3lNaW5EdXJhdGlvblRpbWVyLnBpcGUobWFwVG8oLTEpKTtcblxuICAgIC8vIFN0YXJ0IGxvYWRpbmcgc2tlbGV0b25cbiAgICBjb25zdCByYWNlQmV0d2VlblRhc2tBbmREZWxheSA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgZW1pdE9uVGFza0VuZC5waXBlKHN0YXJ0V2l0aChudWxsKSksXG4gICAgICBlbWl0T25EZWxheVRpbWVyRW5kLnBpcGUoc3RhcnRXaXRoKG51bGwpKSxcbiAgICBdKS5waXBlKHNraXAoMSkpO1xuICAgIGNvbnN0IHRhc2tFbmRCZWZvcmVEZWxheSA9IHJhY2VCZXR3ZWVuVGFza0FuZERlbGF5LnBpcGUoXG4gICAgICBmaWx0ZXIoKFt0YXNrRW5kRmlyc3QsIHRpbWVyRW5kRmlyc3RdKSA9PiB7XG4gICAgICAgIHJldHVybiB0YXNrRW5kRmlyc3QgPT09IDEgJiYgdGltZXJFbmRGaXJzdCA9PT0gbnVsbDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBzaG91bGROb3RTaG93U3Bpbm5lciA9IHRhc2tFbmRCZWZvcmVEZWxheS5waXBlKG1hcFRvKGZhbHNlKSk7XG4gICAgY29uc3QgdGFza0VuZEFmdGVyVGltZW91dCA9IHJhY2VCZXR3ZWVuVGFza0FuZERlbGF5LnBpcGUoXG4gICAgICBmaWx0ZXIoKFt0YXNrRW5kRmlyc3QsIHRpbWVyRW5kRmlyc3RdKSA9PiB7XG4gICAgICAgIHJldHVybiB0YXNrRW5kRmlyc3QgPT09IG51bGwgJiYgdGltZXJFbmRGaXJzdCA9PT0gLTE7XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgc2hvdWxkU2hvd1NwaW5uZXIgPSB0YXNrRW5kQWZ0ZXJUaW1lb3V0LnBpcGUobWFwVG8odHJ1ZSkpO1xuICAgIGNvbnN0IHNob3dTcGlubmVyID0gc2hvdWxkU2hvd1NwaW5uZXIucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gaGlkZSBsb2FkaW5nIHNrZWxldG9uXG4gICAgY29uc3QgcmFjZUJldHdlZW5UYXNrQW5kTWluRHVyYXRpb24gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIGVtaXRPblRhc2tFbmQucGlwZShzdGFydFdpdGgobnVsbCkpLFxuICAgICAgZW1pdE9uTWluRHVyYXRpb25FbmQucGlwZShzdGFydFdpdGgobnVsbCkpLFxuICAgIF0pLnBpcGUoc2tpcCgxKSk7XG4gICAgY29uc3QgaGlkZVNwaW5uZXJVbnRpbE1pbkR1cmF0aW9uRW5kID0gcmFjZUJldHdlZW5UYXNrQW5kTWluRHVyYXRpb24ucGlwZShcbiAgICAgIGZpbHRlcigoW3Rhc2tFbmRGaXJzdCwgdGltZXJFbmRGaXJzdF0pID0+IHtcbiAgICAgICAgcmV0dXJuIHRhc2tFbmRGaXJzdCA9PT0gMSAmJiB0aW1lckVuZEZpcnN0ID09PSBudWxsO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IGhpZGVTcGlubmVyQWZ0ZXJUaW1lckFuZFRhc2tFbmQgPSByYWNlQmV0d2VlblRhc2tBbmRNaW5EdXJhdGlvbi5waXBlKFxuICAgICAgZmlsdGVyKChbdGFza0VuZEZpcnN0LCB0aW1lckVuZEZpcnN0XSkgPT4ge1xuICAgICAgICByZXR1cm4gdGFza0VuZEZpcnN0ID09PSAxICYmIHRpbWVyRW5kRmlyc3QgPT09IC0xO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IGhpZGVTcGlubmVyID0gbWVyZ2UoXG4gICAgICAvLyBjYXNlIDE6IHNob3VsZCBub3Qgc2hvdyBzcGlubmVyIGF0IGFsbFxuICAgICAgc2hvdWxkTm90U2hvd1NwaW5uZXIsXG4gICAgICAvLyBjYXNlIDI6IHRhc2sgZW5kLCBidXQgd2FpdCB1bnRpbCBtaW4gZHVyYXRpb24gdGltZXIgZW5kc1xuICAgICAgY29tYmluZUxhdGVzdChbaGlkZVNwaW5uZXJVbnRpbE1pbkR1cmF0aW9uRW5kLCBlbWl0T25NaW5EdXJhdGlvbkVuZF0pLFxuICAgICAgLy8gY2FzZSAzOiB0YXNrIHRha2VzIGEgbG9uZyB0aW1lLCB3YWl0IHVuaXRsIGl0cyBlbmRcbiAgICAgIGhpZGVTcGlubmVyQWZ0ZXJUaW1lckFuZFRhc2tFbmRcbiAgICApLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gc2hvd1NwaW5uZXIucGlwZSh0YWtlVW50aWwoaGlkZVNwaW5uZXIpKTtcbiAgfVxuXG4gIHNob3dMb2FkaW5nU3RhdHVzKCkge1xuICAgIGlmICh0aGlzLnN1YiAmJiB0eXBlb2YgdGhpcy5zdWIudW5zdWJzY3JpYmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5zdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5zdWIgPSB0aGlzLmNvbnRyb2xsZXIoKS5zdWJzY3JpYmUoKTtcbiAgICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyOiBTdWJzY3JpYmVyPGFueT4pID0+IHtcbiAgICAgICAgY29uc3QgZW1pdE9uT2JzRW5kID0gc291cmNlLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudGFza0VuZFN1YmplY3QubmV4dCgpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN1YiA9IG9mKG51bGwpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnRhc2tTdGFydFN1YmplY3QubmV4dCgpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gZW1pdE9uT2JzRW5kKSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBzaG93aW5nRm9yPFQ+KG9icyQ6IE9ic2VydmFibGU8VD4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBpZiAodGhpcy5zdWIgJiYgdHlwZW9mIHRoaXMuc3ViLnVuc3Vic2NyaWJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuc3ViID0gdGhpcy5jb250cm9sbGVyKCkuc3Vic2NyaWJlKCk7XG4gICAgY29uc3QgZW1pdE9uT2JzRW5kID0gb2JzJC5waXBlKFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgdGhpcy50YXNrRW5kU3ViamVjdC5uZXh0KCk7XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIG9mKG51bGwpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLnRhc2tTdGFydFN1YmplY3QubmV4dCgpO1xuICAgICAgfSksXG4gICAgICBjb25jYXRNYXAoKCkgPT4gZW1pdE9uT2JzRW5kKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxufVxuIl19