UNPKG

@mmuscat/angular-error-boundary

Version:
211 lines 21.2 kB
import { isObservable, Subject, Subscriber } from "rxjs"; import { Component, ContentChildren, Directive, ErrorHandler, EventEmitter, Input, Output, SkipSelf, } from "@angular/core"; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; class ValueSubscriber extends Subscriber { constructor(boundary, observer) { super(observer); this.boundary = boundary; boundary.subscription.add(this); } next() { super.complete(); this.unsubscribe(); } error(error) { super.error(error); this.unsubscribe(); } complete() { super.complete(); this.unsubscribe(); } unsubscribe() { this.boundary.subscription.remove(this); super.unsubscribe(); } } class CloakObserver { constructor(boundary) { this.boundary = boundary; } next(source) { const subscriber = new ValueSubscriber(this.boundary, this); subscriber.add(source.subscribe(subscriber)); } error(error) { this.boundary.handleError(error); } complete() { const { boundary } = this; if (boundary.refCount > 0) { boundary.refCount--; if (boundary.refCount === 0) { boundary.cloak(false); } } } } export class NgCloak { constructor(elementRef, errorHandler, changeDetectorRef) { this.elementRef = elementRef; this.errorHandler = errorHandler; this.changeDetectorRef = changeDetectorRef; this.cloaked = false; this.refCount = 0; this.observer = new CloakObserver(this); this.queue = new Subject(); this.subscription = this.subscribe(); this.cloakChange = new EventEmitter(); } get element() { return this.elementRef.nativeElement; } register(parent) { this.parent = parent; } handleError(value) { if (isObservable(value)) { this.refCount++; this.queue.next(value); this.cloak(true); } else { this.refCount = 0; this.subscription.unsubscribe(); this.subscription = this.subscribe(); this.cloak(false); this.errorHandler.handleError(value); } } cloak(cloaked) { this.cloaked = cloaked; if (cloaked) this.changeDetectorRef.detach(); else this.changeDetectorRef.reattach(); if (!this.parent) this.render(); } render() { this.changeDetectorRef.detectChanges(); } subscribe() { return this.queue.subscribe(this.observer); } ngAfterContentInit() { this.cloak(this.refCount > 0); } ngOnDestroy() { this.subscription.unsubscribe(); } } NgCloak.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NgCloak, deps: [{ token: i0.ElementRef }, { token: i0.ErrorHandler, skipSelf: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); NgCloak.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.0", type: NgCloak, selector: "ng-cloak", outputs: { cloakChange: "cloakChange" }, providers: [ { provide: ErrorHandler, useExisting: NgCloak, }, ], ngImport: i0, template: ` <ng-content select="fallback, [fallback]" *ngIf="cloaked; else content" ></ng-content> <ng-template #content> <ng-content></ng-content> </ng-template> `, isInline: true, directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NgCloak, decorators: [{ type: Component, args: [{ selector: "ng-cloak", template: ` <ng-content select="fallback, [fallback]" *ngIf="cloaked; else content" ></ng-content> <ng-template #content> <ng-content></ng-content> </ng-template> `, providers: [ { provide: ErrorHandler, useExisting: NgCloak, }, ], }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ErrorHandler, decorators: [{ type: SkipSelf }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { cloakChange: [{ type: Output }] } }); class CloakListObserver { constructor(list, child, children) { this.list = list; this.child = child; this.children = children; } next() { this.list.render(this.children); } } export class NgCloakList { constructor(elementRef, renderer) { this.elementRef = elementRef; this.renderer = renderer; this.revealOrder = "together"; } render(children) { const { elementRef: { nativeElement }, renderer, revealOrder, tail, } = this; let child; let previous = null; let renderChildren = children.slice(); if (revealOrder === "reverse") { renderChildren = renderChildren.reverse(); } while ((child = renderChildren.shift())) { if (tail === "hidden" && child.cloaked) break; if (revealOrder === "reverse") { renderer.insertBefore(nativeElement, child, previous); } else { renderer.appendChild(nativeElement, child.element); } previous = child; child.render(); if (tail === "collapsed" && child.cloaked) break; } while ((child = renderChildren.shift())) { renderer.removeChild(nativeElement, child.element); } } subscribe(children) { for (const child of children) { child.cloakChange.subscribe(new CloakListObserver(this, child, children)); } } ngAfterContentInit() { if (this.children) { this.subscribe(this.children.toArray()); } } } NgCloakList.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NgCloakList, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); NgCloakList.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.0", type: NgCloakList, selector: "cloak-list", inputs: { revealOrder: "revealOrder", tail: "tail" }, queries: [{ propertyName: "children", predicate: NgCloak, descendants: true }], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NgCloakList, decorators: [{ type: Directive, args: [{ selector: "cloak-list", }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { revealOrder: [{ type: Input }], tail: [{ type: Input }], children: [{ type: ContentChildren, args: [NgCloak, { descendants: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvYWsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9ib3VuZGFyeS9zcmMvY2xvYWsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBd0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUM5RSxPQUFPLEVBR0osU0FBUyxFQUNULGVBQWUsRUFDZixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUdOLFFBQVEsR0FDVixNQUFNLGVBQWUsQ0FBQTs7O0FBRXRCLE1BQU0sZUFBZ0IsU0FBUSxVQUFlO0lBcUIxQyxZQUFvQixRQUFpQixFQUFFLFFBQXVCO1FBQzNELEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQURFLGFBQVEsR0FBUixRQUFRLENBQVM7UUFFbEMsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQXZCRCxJQUFJO1FBQ0QsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQWM7UUFDakIsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNsQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDckIsQ0FBQztJQUVELFFBQVE7UUFDTCxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUE7UUFDaEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3JCLENBQUM7SUFFRCxXQUFXO1FBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3ZDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUN0QixDQUFDO0NBTUg7QUFFRCxNQUFNLGFBQWE7SUFpQmhCLFlBQW9CLFFBQWlCO1FBQWpCLGFB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V0FBVyxDQUFDLFNBQVMsQ0FDeEIsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUM5QyxDQUFBO1NBQ0g7SUFDSixDQUFDO0lBRUQsa0JBQWtCO1FBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1NBQ3pDO0lBQ0osQ0FBQzs7d0dBbkRTLFdBQVc7NEZBQVgsV0FBVyxpSUFPSixPQUFPOzJGQVBkLFdBQVc7a0JBSHZCLFNBQVM7bUJBQUM7b0JBQ1IsUUFBUSxFQUFFLFlBQVk7aUJBQ3hCO3lIQUdFLFdBQVc7c0JBRFYsS0FBSztnQkFJTixJQUFJO3NCQURILEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxlQUFlO3VCQUFDLE9BQU8sRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc09ic2VydmFibGUsIE9ic2VydmFibGUsIE9ic2VydmVyLCBTdWJqZWN0LCBTdWJzY3JpYmVyIH0gZnJvbSBcInJ4anNcIlxuaW1wb3J0IHtcbiAgIEFmdGVyQ29udGVudEluaXQsXG4gICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgIENvbXBvbmVudCxcbiAgIENvbnRlbnRDaGlsZHJlbixcbiAgIERpcmVjdGl2ZSxcbiAgIEVsZW1lbnRSZWYsXG4gICBFcnJvckhhbmRsZXIsXG4gICBFdmVudEVtaXR0ZXIsXG4gICBJbnB1dCxcbiAgIE9uRGVzdHJveSxcbiAgIE91dHB1dCxcbiAgIFF1ZXJ5TGlzdCxcbiAgIFJlbmRlcmVyMixcbiAgIFNraXBTZWxmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5cbmNsYXNzIFZhbHVlU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXI8YW55PiB7XG4gICBuZXh0KCkge1xuICAgICAgc3VwZXIuY29tcGxldGUoKVxuICAgICAgdGhpcy51bnN1YnNjcmliZSgpXG4gICB9XG5cbiAgIGVycm9yKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBzdXBlci5lcnJvcihlcnJvcilcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKVxuICAgfVxuXG4gICBjb21wbGV0ZSgpIHtcbiAgICAgIHN1cGVyLmNvbXBsZXRlKClcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKVxuICAgfVxuXG4gICB1bnN1YnNjcmliZSgpIHtcbiAgICAgIHRoaXMuYm91bmRhcnkuc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzKVxuICAgICAgc3VwZXIudW5zdWJzY3JpYmUoKVxuICAgfVxuXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJvdW5kYXJ5OiBOZ0Nsb2FrLCBvYnNlcnZlcjogQ2xvYWtPYnNlcnZlcikge1xuICAgICAgc3VwZXIob2JzZXJ2ZXIpXG4gICAgICBib3VuZGFyeS5zdWJzY3JpcHRpb24uYWRkKHRoaXMpXG4gICB9XG59XG5cbmNsYXNzIENsb2FrT2JzZXJ2ZXIgaW1wbGVtZW50cyBPYnNlcnZlcjxhbnk+IHtcbiAgIG5leHQoc291cmNlOiBPYnNlcnZhYmxlPGFueT4pIHtcbiAgICAgIGNvbnN0IHN1YnNjcmliZXIgPSBuZXcgVmFsdWVTdWJzY3JpYmVyKHRoaXMuYm91bmRhcnksIHRoaXMpXG4gICAgICBzdWJzY3JpYmVyLmFkZChzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpKVxuICAgfVxuICAgZXJyb3IoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMuYm91bmRhcnkuaGFuZGxlRXJyb3IoZXJyb3IpXG4gICB9XG4gICBjb21wbGV0ZSgpIHtcbiAgICAgIGNvbnN0IHsgYm91bmRhcnkgfSA9IHRoaXNcbiAgICAgIGlmIChib3VuZGFyeS5yZWZDb3VudCA+IDApIHtcbiAgICAgICAgIGJvdW5kYXJ5LnJlZkNvdW50LS1cbiAgICAgICAgIGlmIChib3VuZGFyeS5yZWZDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgYm91bmRhcnkuY2xvYWsoZmFsc2UpXG4gICAgICAgICB9XG4gICAgICB9XG4gICB9XG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJvdW5kYXJ5OiBOZ0Nsb2FrKSB7fVxufVxuXG5AQ29tcG9uZW50KHtcbiAgIHNlbGVjdG9yOiBcIm5nLWNsb2FrXCIsXG4gICB0ZW1wbGF0ZTogYFxuICAgICAgPG5nLWNvbnRlbnRcbiAgICAgICAgIHNlbGVjdD1cImZhbGxiYWNrLCBbZmFsbGJhY2tdXCJcbiAgICAgICAgICpuZ0lmPVwiY2xvYWtlZDsgZWxzZSBjb250ZW50XCJcbiAgICAgID48L25nLWNvbnRlbnQ+XG4gICAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnQ+XG4gICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgYCxcbiAgIHByb3ZpZGVyczogW1xuICAgICAge1xuICAgICAgICAgcHJvdmlkZTogRXJyb3JIYW5kbGVyLFxuICAgICAgICAgdXNlRXhpc3Rpbmc6IE5nQ2xvYWssXG4gICAgICB9LFxuICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTmdDbG9hayBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICBjbG9ha2VkXG4gICBvYnNlcnZlclxuICAgc3Vic2NyaXB0aW9uXG4gICBxdWV1ZVxuICAgcmVmQ291bnRcbiAgIHBhcmVudD86IE5nQ2xvYWtMaXN0XG5cbiAgIEBPdXRwdXQoKVxuICAgY2xvYWtDaGFuZ2VcblxuICAgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcbiAgIH1cblxuICAgcmVnaXN0ZXIocGFyZW50OiBOZ0Nsb2FrTGlzdCkge1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnRcbiAgIH1cblxuICAgaGFuZGxlRXJyb3IodmFsdWU6IHVua25vd24pIHtcbiAgICAgIGlmIChpc09ic2VydmFibGUodmFsdWUpKSB7XG4gICAgICAgICB0aGlzLnJlZkNvdW50KytcbiAgICAgICAgIHRoaXMucXVldWUubmV4dCh2YWx1ZSlcbiAgICAgICAgIHRoaXMuY2xvYWsodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICB0aGlzLnJlZkNvdW50ID0gMFxuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmliZSgpXG4gICAgICAgICB0aGlzLmNsb2FrKGZhbHNlKVxuICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IodmFsdWUpXG4gICAgICB9XG4gICB9XG5cbiAgIGNsb2FrKGNsb2FrZWQ6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuY2xvYWtlZCA9IGNsb2FrZWRcbiAgICAgIGlmIChjbG9ha2VkKSB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGFjaCgpXG4gICAgICBlbHNlIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYucmVhdHRhY2goKVxuICAgICAgaWYgKCF0aGlzLnBhcmVudCkgdGhpcy5yZW5kZXIoKVxuICAgfVxuXG4gICByZW5kZXIoKSB7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxuICAgfVxuXG4gICBzdWJzY3JpYmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWV1ZS5zdWJzY3JpYmUodGhpcy5vYnNlcnZlcilcbiAgIH1cblxuICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgdGhpcy5jbG9hayh0aGlzLnJlZkNvdW50ID4gMClcbiAgIH1cblxuICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICB9XG5cbiAgIGNvbnN0cnVjdG9yKFxuICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgQFNraXBTZWxmKCkgcHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlcixcbiAgICAgIHB1YmxpYyBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICApIHtcbiAgICAgIHRoaXMuY2xvYWtlZCA9IGZhbHNlXG4gICAgICB0aGlzLnJlZkNvdW50ID0gMFxuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBDbG9ha09ic2VydmVyKHRoaXMpXG4gICAgICB0aGlzLnF1ZXVlID0gbmV3IFN1YmplY3Q8T2JzZXJ2YWJsZTxhbnk+PigpXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaWJlKClcbiAgICAgIHRoaXMuY2xvYWtDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgIH1cbn1cblxuY2xhc3MgQ2xvYWtMaXN0T2JzZXJ2ZXIge1xuICAgbmV4dCgpIHtcbiAgICAgIHRoaXMubGlzdC5yZW5kZXIodGhpcy5jaGlsZHJlbilcbiAgIH1cbiAgIGNvbnN0cnVjdG9yKFxuICAgICAgcHJpdmF0ZSBsaXN0OiBOZ0Nsb2FrTGlzdCxcbiAgICAgIHByaXZhdGUgY2hpbGQ6IE5nQ2xvYWssXG4gICAgICBwcml2YXRlIGNoaWxkcmVuOiBOZ0Nsb2FrW10sXG4gICApIHt9XG59XG5cbkBEaXJlY3RpdmUoe1xuICAgc2VsZWN0b3I6IFwiY2xvYWstbGlzdFwiLFxufSlcbmV4cG9ydCBjbGFzcyBOZ0Nsb2FrTGlzdCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICAgQElucHV0KClcbiAgIHJldmVhbE9yZGVyOiBcInRvZ2V0aGVyXCIgfCBcImZvcndhcmRzXCIgfCBcInJldmVyc2VcIlxuXG4gICBASW5wdXQoKVxuICAgdGFpbD86IFwiY29sbGFwc2VkXCIgfCBcImhpZGRlblwiXG5cbiAgIEBDb250ZW50Q2hpbGRyZW4oTmdDbG9haywgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICAgY2hpbGRyZW4/OiBRdWVyeUxpc3Q8TmdDbG9haz5cblxuICAgcmVuZGVyKGNoaWxkcmVuOiBOZ0Nsb2FrW10pIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgIGVsZW1lbnRSZWY6IHsgbmF0aXZlRWxlbWVudCB9LFxuICAgICAgICAgcmVuZGVyZXIsXG4gICAgICAgICByZXZlYWxPcmRlcixcbiAgICAgICAgIHRhaWwsXG4gICAgICB9ID0gdGhpc1xuICAgICAgbGV0IGNoaWxkXG4gICAgICBsZXQgcHJldmlvdXMgPSBudWxsXG4gICAgICBsZXQgcmVuZGVyQ2hpbGRyZW46IE5nQ2xvYWtbXSA9IGNoaWxkcmVuLnNsaWNlKClcbiAgICAgIGlmIChyZXZlYWxPcmRlciA9PT0gXCJyZXZlcnNlXCIpIHtcbiAgICAgICAgIHJlbmRlckNoaWxkcmVuID0gcmVuZGVyQ2hpbGRyZW4ucmV2ZXJzZSgpXG4gICAgICB9XG4gICAgICB3aGlsZSAoKGNoaWxkID0gcmVuZGVyQ2hpbGRyZW4uc2hpZnQoKSkpIHtcbiAgICAgICAgIGlmICh0YWlsID09PSBcImhpZGRlblwiICYmIGNoaWxkLmNsb2FrZWQpIGJyZWFrXG4gICAgICAgICBpZiAocmV2ZWFsT3JkZXIgPT09IFwicmV2ZXJzZVwiKSB7XG4gICAgICAgICAgICByZW5kZXJlci5pbnNlcnRCZWZvcmUobmF0aXZlRWxlbWVudCwgY2hpbGQsIHByZXZpb3VzKVxuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLmFwcGVuZENoaWxkKG5hdGl2ZUVsZW1lbnQsIGNoaWxkLmVsZW1lbnQpXG4gICAgICAgICB9XG4gICAgICAgICBwcmV2aW91cyA9IGNoaWxkXG4gICAgICAgICBjaGlsZC5yZW5kZXIoKVxuICAgICAgICAgaWYgKHRhaWwgPT09IFwiY29sbGFwc2VkXCIgJiYgY2hpbGQuY2xvYWtlZCkgYnJlYWtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgoY2hpbGQgPSByZW5kZXJDaGlsZHJlbi5zaGlmdCgpKSkge1xuICAgICAgICAgcmVuZGVyZXIucmVtb3ZlQ2hpbGQobmF0aXZlRWxlbWVudCwgY2hpbGQuZWxlbWVudClcbiAgICAgIH1cbiAgIH1cblxuICAgc3Vic2NyaWJlKGNoaWxkcmVuOiBOZ0Nsb2FrW10pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgIGNoaWxkLmNsb2FrQ2hhbmdlLnN1YnNjcmliZShcbiAgICAgICAgICAgIG5ldyBDbG9ha0xpc3RPYnNlcnZlcih0aGlzLCBjaGlsZCwgY2hpbGRyZW4pLFxuICAgICAgICAgKVxuICAgICAgfVxuICAgfVxuXG4gICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICBpZiAodGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgdGhpcy5zdWJzY3JpYmUodGhpcy5jaGlsZHJlbi50b0FycmF5KCkpXG4gICAgICB9XG4gICB9XG5cbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gICAgICB0aGlzLnJldmVhbE9yZGVyID0gXCJ0b2dldGhlclwiXG4gICB9XG59XG4iXX0=