UNPKG

ngx-remotedata

Version:

RemoteData: Slaying a UI Antipattern with Angular

258 lines 27.8 kB
import { Pipe } from '@angular/core'; import { isRemoteData, isNotAsked, isInProgress, isFailure, isSuccess } from './remote-data'; import { combineLatest } from 'rxjs'; import * as i0 from "@angular/core"; const assertIsRemoteData = (rd) => { if (!isRemoteData(rd)) { throw new Error(`Value "${rd}" is not a RemoteData<T> instance. Did you forget to use the async pipe? i.e: state$ | async | isInProgress`); } }; export class IsNotAskedPipe { transform(rd) { if (rd === null || rd === undefined) { return false; } assertIsRemoteData(rd); return isNotAsked(rd); } } IsNotAskedPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsNotAskedPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); IsNotAskedPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: IsNotAskedPipe, name: "isNotAsked" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsNotAskedPipe, decorators: [{ type: Pipe, args: [{ name: 'isNotAsked' }] }] }); export class IsInProgressPipe { transform(rd) { if (rd === null || rd === undefined) { return false; } assertIsRemoteData(rd); return isInProgress(rd); } } IsInProgressPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsInProgressPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); IsInProgressPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: IsInProgressPipe, name: "isInProgress" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsInProgressPipe, decorators: [{ type: Pipe, args: [{ name: 'isInProgress' }] }] }); export class AnyIsInProgressPipe { constructor(cd) { this.cd = cd; this._latestValue = false; this._subscription = null; this._rds$ = []; } transform(rds$) { if (rds$ === null || rds$ === undefined) { return false; } if (this._rds$ === rds$) { return this._latestValue; } else if (this._subscription) { this.dispose(); } this._rds$ = rds$; this._subscription = combineLatest(rds$).subscribe(rds => { this._latestValue = rds.some(isInProgress); this.cd.markForCheck(); }); return this._latestValue; } ngOnDestroy() { this.dispose(); } dispose() { if (this._subscription) { this._subscription.unsubscribe(); } this._rds$ = []; this._latestValue = false; } } AnyIsInProgressPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: AnyIsInProgressPipe, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe }); AnyIsInProgressPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: AnyIsInProgressPipe, name: "anyIsInProgress", pure: false }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: AnyIsInProgressPipe, decorators: [{ type: Pipe, args: [{ name: 'anyIsInProgress', pure: false }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; } }); export class AnyIsNotAskedPipe { constructor(cd) { this.cd = cd; this._latestValue = false; this._subscription = null; this._rds$ = []; } transform(rds$) { if (rds$ === null || rds$ === undefined) { return false; } if (this._rds$ === rds$) { return this._latestValue; } else if (this._subscription) { this.dispose(); } this._rds$ = rds$; this._subscription = combineLatest(rds$).subscribe(rds => { this._latestValue = rds.some(isNotAsked); this.cd.markForCheck(); }); return this._latestValue; } ngOnDestroy() { this.dispose(); } dispose() { if (this._subscription) { this._subscription.unsubscribe(); } this._rds$ = []; this._latestValue = false; } } AnyIsNotAskedPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: AnyIsNotAskedPipe, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe }); AnyIsNotAskedPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: AnyIsNotAskedPipe, name: "anyIsNotAsked", pure: false }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: AnyIsNotAskedPipe, decorators: [{ type: Pipe, args: [{ name: 'anyIsNotAsked', pure: false }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; } }); export class IsFailurePipe { transform(rd) { if (rd === null || rd === undefined) { return false; } assertIsRemoteData(rd); return isFailure(rd); } } IsFailurePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsFailurePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); IsFailurePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: IsFailurePipe, name: "isFailure" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsFailurePipe, decorators: [{ type: Pipe, args: [{ name: 'isFailure' }] }] }); export class IsSuccessPipe { transform(rd) { if (rd === null || rd === undefined) { return false; } assertIsRemoteData(rd); return isSuccess(rd); } } IsSuccessPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsSuccessPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); IsSuccessPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: IsSuccessPipe, name: "isSuccess" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsSuccessPipe, decorators: [{ type: Pipe, args: [{ name: 'isSuccess' }] }] }); export class HasValuePipe { transform(rd) { if (isSuccess(rd)) { return true; } else if ((isInProgress(rd) || isFailure(rd)) && rd.value !== null && rd.value !== undefined) { return true; } else if (rd === undefined || rd === null) { return false; } assertIsRemoteData(rd); return false; } } HasValuePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: HasValuePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); HasValuePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: HasValuePipe, name: "hasValue" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: HasValuePipe, decorators: [{ type: Pipe, args: [{ name: 'hasValue' }] }] }); export class GetSuccessPipe { transform(rd, defaultValue) { if (isSuccess(rd)) { return rd.value; } else if (rd === undefined || rd === null) { return defaultValue; } assertIsRemoteData(rd); return defaultValue; } } GetSuccessPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetSuccessPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); GetSuccessPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: GetSuccessPipe, name: "successValue" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetSuccessPipe, decorators: [{ type: Pipe, args: [{ name: 'successValue' }] }] }); export class GetInProgressPipe { transform(rd, defaultValue) { if (isInProgress(rd)) { return rd.value; } else if (rd === undefined || rd === null) { return defaultValue; } assertIsRemoteData(rd); return defaultValue; } } GetInProgressPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetInProgressPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); GetInProgressPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: GetInProgressPipe, name: "inProgressValue" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetInProgressPipe, decorators: [{ type: Pipe, args: [{ name: 'inProgressValue' }] }] }); export class GetRemoteDataValuePipe { transform(rd) { if (rd === undefined || rd === null) { return undefined; } assertIsRemoteData(rd); return isInProgress(rd) || isSuccess(rd) || isFailure(rd) ? rd.value : undefined; } } GetRemoteDataValuePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetRemoteDataValuePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); GetRemoteDataValuePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: GetRemoteDataValuePipe, name: "remoteDataValue" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetRemoteDataValuePipe, decorators: [{ type: Pipe, args: [{ name: 'remoteDataValue' }] }] }); export class GetFailureErrorPipe { transform(rd) { if (rd === undefined || rd === null) { return undefined; } assertIsRemoteData(rd); return isFailure(rd) ? rd.error : undefined; } } GetFailureErrorPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetFailureErrorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); GetFailureErrorPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: GetFailureErrorPipe, name: "failureError" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetFailureErrorPipe, decorators: [{ type: Pipe, args: [{ name: 'failureError' }] }] }); export class GetFailureValuePipe { transform(rd) { if (rd === undefined || rd === null) { return undefined; } assertIsRemoteData(rd); return isFailure(rd) ? rd.value : undefined; } } GetFailureValuePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetFailureValuePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); GetFailureValuePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: GetFailureValuePipe, name: "failureValue" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetFailureValuePipe, decorators: [{ type: Pipe, args: [{ name: 'failureValue' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVtb3RlZGF0YS9zcmMvbGliL3BpcGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxJQUFJLEVBSUwsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLFNBQVMsRUFDVCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLGFBQWEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7O0FBRS9ELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxFQUFXLEVBQUUsRUFBRTtJQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQ2IsVUFBVSxFQUFFLDZHQUE2RyxDQUMxSCxDQUFDO0tBQ0g7QUFDSCxDQUFDLENBQUM7QUFHRixNQUFNLE9BQU8sY0FBYztJQUN6QixTQUFTLENBQU8sRUFBdUM7UUFDckQsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7OzJHQVBVLGNBQWM7eUdBQWQsY0FBYzsyRkFBZCxjQUFjO2tCQUQxQixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRTs7QUFZNUIsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixTQUFTLENBQU8sRUFBdUM7UUFDckQsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8s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LFNBQVMsQ0FBQztJQUM5QyxDQUFDOztnSEFQVSxtQkFBbUI7OEdBQW5CLG1CQUFtQjsyRkFBbkIsbUJBQW1CO2tCQUQvQixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRTs7QUFZOUIsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixTQUFTLENBQU8sRUFBdUM7UUFDckQsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkMsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFDRCxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzlDLENBQUM7O2dIQVBVLG1CQUFtQjs4R0FBbkIsbUJBQW1COzJGQUFuQixtQkFBbUI7a0JBRC9CLElBQUk7bUJBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUGlwZSxcbiAgUGlwZVRyYW5zZm9ybSxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3RvclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFJlbW90ZURhdGEsXG4gIGlzUmVtb3RlRGF0YSxcbiAgaXNOb3RBc2tlZCxcbiAgaXNJblByb2dyZXNzLFxuICBpc0ZhaWx1cmUsXG4gIGlzU3VjY2Vzc1xufSBmcm9tICcuL3JlbW90ZS1kYXRhJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5jb25zdCBhc3NlcnRJc1JlbW90ZURhdGEgPSAocmQ6IHVua25vd24pID0+IHtcbiAgaWYgKCFpc1JlbW90ZURhdGEocmQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFZhbHVlIFwiJHtyZH1cIiBpcyBub3QgYSBSZW1vdGVEYXRhPFQ+IGluc3RhbmNlLiBEaWQgeW91IGZvcmdldCB0byB1c2UgdGhlIGFzeW5jIHBpcGU/IGkuZTogc3RhdGUkIHwgYXN5bmMgfCBpc0luUHJvZ3Jlc3NgXG4gICAgKTtcbiAgfVxufTtcblxuQFBpcGUoeyBuYW1lOiAnaXNOb3RBc2tlZCcgfSlcbmV4cG9ydCBjbGFzcyBJc05vdEFza2VkUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm08VCwgRT4ocmQ6IHVuZGVmaW5lZCB8IG51bGwgfCBSZW1vdGVEYXRhPFQsIEU+KTogYm9vbGVhbiB7XG4gICAgaWYgKHJkID09PSBudWxsIHx8IHJkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXNzZXJ0SXNSZW1vdGVEYXRhKHJkKTtcbiAgICByZXR1cm4gaXNOb3RBc2tlZChyZCk7XG4gIH1cbn1cblxuQFBpcGUoeyBuYW1lOiAnaXNJblByb2dyZXNzJyB9KVxuZXhwb3J0IGNsYXNzIElzSW5Qcm9ncmVzc1BpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtPFQsIEU+KHJkOiB1bmRlZmluZWQgfCBudWxsIHwgUmVtb3RlRGF0YTxULCBFPik6IGJvb2xlYW4ge1xuICAgIGlmIChyZCA9PT0gbnVsbCB8fCByZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGFzc2VydElzUmVtb3RlRGF0YShyZCk7XG4gICAgcmV0dXJuIGlzSW5Qcm9ncmVzcyhyZCk7XG4gIH1cbn1cblxuQFBpcGUoeyBuYW1lOiAnYW55SXNJblByb2dyZXNzJywgcHVyZTogZmFsc2UgfSlcbmV4cG9ydCBjbGFzcyBBbnlJc0luUHJvZ3Jlc3NQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfbGF0ZXN0VmFsdWUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmRzJDogT2JzZXJ2YWJsZTxSZW1vdGVEYXRhPGFueSwgYW55Pj5bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIHRyYW5zZm9ybTxULCBFPihcbiAgICByZHMkOiB1bmRlZmluZWQgfCBudWxsIHwgT2JzZXJ2YWJsZTxSZW1vdGVEYXRhPFQsIEU+PltdXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChyZHMkID09PSBudWxsIHx8IHJkcyQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmRzJCA9PT0gcmRzJCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xhdGVzdFZhbHVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fcmRzJCA9IHJkcyQ7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gY29tYmluZUxhdGVzdChyZHMkKS5zdWJzY3JpYmUocmRzID0+IHtcbiAgICAgIHRoaXMuX2xhdGVzdFZhbHVlID0gcmRzLnNvbWUoaXNJblByb2dyZXNzKTtcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX2xhdGVzdFZhbHVlO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlKCk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLl9yZHMkID0gW107XG4gICAgdGhpcy5fbGF0ZXN0VmFsdWUgPSBmYWxzZTtcbiAgfVxufVxuXG5AUGlwZSh7IG5hbWU6ICdhbnlJc05vdEFza2VkJywgcHVyZTogZmFsc2UgfSlcbmV4cG9ydCBjbGFzcyBBbnlJc05vdEFza2VkUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0sIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX2xhdGVzdFZhbHVlID0gZmFsc2U7XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3JkcyQ6IE9ic2VydmFibGU8UmVtb3RlRGF0YTxhbnksIGFueT4+W10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICB0cmFuc2Zvcm08VCwgRT4oXG4gICAgcmRzJDogdW5kZWZpbmVkIHwgbnVsbCB8IE9ic2VydmFibGU8UmVtb3RlRGF0YTxULCBFPj5bXVxuICApOiBib29sZWFuIHtcbiAgICBpZiAocmRzJCA9PT0gbnVsbCB8fCByZHMkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JkcyQgPT09IHJkcyQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sYXRlc3RWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuX3JkcyQgPSByZHMkO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IGNvbWJpbmVMYXRlc3QocmRzJCkuc3Vic2NyaWJlKHJkcyA9PiB7XG4gICAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IHJkcy5zb21lKGlzTm90QXNrZWQpO1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fbGF0ZXN0VmFsdWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuX3JkcyQgPSBbXTtcbiAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IGZhbHNlO1xuICB9XG59XG5cbkBQaXBlKHsgbmFtZTogJ2lzRmFpbHVyZScgfSlcbmV4cG9ydCBjbGFzcyBJc0ZhaWx1cmVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybTxULCBFPihyZDogdW5kZWZpbmVkIHwgbnVsbCB8IFJlbW90ZURhdGE8VCwgRT4pOiBib29sZWFuIHtcbiAgICBpZiAocmQgPT09IG51bGwgfHwgcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhc3NlcnRJc1JlbW90ZURhdGEocmQpO1xuICAgIHJldHVybiBpc0ZhaWx1cmUocmQpO1xuICB9XG59XG5cbkBQaXBlKHsgbmFtZTogJ2lzU3VjY2VzcycgfSlcbmV4cG9ydCBjbGFzcyBJc1N1Y2Nlc3NQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybTxULCBFPihyZDogdW5kZWZpbmVkIHwgbnVsbCB8IFJlbW90ZURhdGE8VCwgRT4pOiBib29sZWFuIHtcbiAgICBpZiAocmQgPT09IG51bGwgfHwgcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhc3NlcnRJc1JlbW90ZURhdGEocmQpO1xuICAgIHJldHVybiBpc1N1Y2Nlc3MocmQpO1xuICB9XG59XG5cbkBQaXBlKHsgbmFtZTogJ2hhc1ZhbHVlJyB9KVxuZXhwb3J0IGNsYXNzIEhhc1ZhbHVlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm08VCwgRT4ocmQ6IHVuZGVmaW5lZCB8IG51bGwgfCBSZW1vdGVEYXRhPFQsIEU+KTogYm9vbGVhbiB7XG4gICAgaWYgKGlzU3VjY2VzcyhyZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAoaXNJblByb2dyZXNzKHJkKSB8fCBpc0ZhaWx1cmUocmQpKSAmJlxuICAgICAgcmQudmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHJkLnZhbHVlICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmQgPT09IHVuZGVmaW5lZCB8fCByZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhc3NlcnRJc1JlbW90ZURhdGEocmQpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5AUGlwZSh7IG5hbWU6ICdzdWNjZXNzVmFsdWUnIH0pXG5leHBvcnQgY2xhc3MgR2V0U3VjY2Vzc1BpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtPFQsIEU+KFxuICAgIHJkOiB1bmRlZmluZWQgfCBudWxsIHwgUmVtb3RlRGF0YTxULCBFPixcbiAgICBkZWZhdWx0VmFsdWU/OiBUIHwgdW5kZWZpbmVkXG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIGlmIChpc1N1Y2Nlc3MocmQpKSB7XG4gICAgICByZXR1cm4gcmQudmFsdWU7XG4gICAgfSBlbHNlIGlmIChyZCA9PT0gdW5kZWZpbmVkIHx8IHJkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICBhc3NlcnRJc1JlbW90ZURhdGEocmQpO1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cbn1cblxuQFBpcGUoeyBuYW1lOiAnaW5Qcm9ncmVzc1ZhbHVlJyB9KVxuZXhwb3J0IGNsYXNzIEdldEluUHJvZ3Jlc3NQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybTxULCBFPihcbiAgICByZDogdW5kZWZpbmVkIHwgbnVsbCB8IFJlbW90ZURhdGE8VCwgRT4sXG4gICAgZGVmYXVsdFZhbHVlPzogVCB8IHVuZGVmaW5lZFxuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaXNJblByb2dyZXNzKHJkKSkge1xuICAgICAgcmV0dXJuIHJkLnZhbHVlO1xuICAgIH0gZWxzZSBpZiAocmQgPT09IHVuZGVmaW5lZCB8fCByZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgYXNzZXJ0SXNSZW1vdGVEYXRhKHJkKTtcbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICB9XG59XG5cbkBQaXBlKHsgbmFtZTogJ3JlbW90ZURhdGFWYWx1ZScgfSlcbmV4cG9ydCBjbGFzcyBHZXRSZW1vdGVEYXRhVmFsdWVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybTxULCBFPihyZDogdW5kZWZpbmVkIHwgbnVsbCB8IFJlbW90ZURhdGE8VCwgRT4pOiBUIHwgRSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHJkID09PSB1bmRlZmluZWQgfHwgcmQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFzc2VydElzUmVtb3RlRGF0YShyZCk7XG4gICAgcmV0dXJuIGlzSW5Qcm9ncmVzcyhyZCkgfHwgaXNTdWNjZXNzKHJkKSB8fCBpc0ZhaWx1cmUocmQpXG4gICAgICA/IHJkLnZhbHVlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5AUGlwZSh7IG5hbWU6ICdmYWlsdXJlRXJyb3InIH0pXG5leHBvcnQgY2xhc3MgR2V0RmFpbHVyZUVycm9yUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm08VCwgRT4ocmQ6IHVuZGVmaW5lZCB8IG51bGwgfCBSZW1vdGVEYXRhPFQsIEU+KTogRSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHJkID09PSB1bmRlZmluZWQgfHwgcmQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFzc2VydElzUmVtb3RlRGF0YShyZCk7XG4gICAgcmV0dXJuIGlzRmFpbHVyZShyZCkgPyByZC5lcnJvciA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5AUGlwZSh7IG5hbWU6ICdmYWlsdXJlVmFsdWUnIH0pXG5leHBvcnQgY2xhc3MgR2V0RmFpbHVyZVZhbHVlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm08VCwgRT4ocmQ6IHVuZGVmaW5lZCB8IG51bGwgfCBSZW1vdGVEYXRhPFQsIEU+KTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHJkID09PSB1bmRlZmluZWQgfHwgcmQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFzc2VydElzUmVtb3RlRGF0YShyZCk7XG4gICAgcmV0dXJuIGlzRmFpbHVyZShyZCkgPyByZC52YWx1ZSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19