ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
141 lines • 24.7 kB
JavaScript
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { Component, ChangeDetectionStrategy, ContentChildren, ElementRef, ContentChild, ChangeDetectorRef } from '@angular/core';
import { BehaviorSubject, combineLatest, ReplaySubject, Subject } from 'rxjs';
import { filter, map, pairwise, startWith, switchMap, takeUntil, withLatestFrom } from 'rxjs/operators';
import { NzResizeObserver } from 'ng-zorro-antd/cdk/resize-observer';
import { NzOverflowItemDirective } from './overflow-item.directive';
import { NzOverflowRestDirective } from './overflow-rest.directive';
import { NzOverflowSuffixDirective } from './overflow-suffix.directive';
export class NzOverflowContainerComponent {
constructor(nzResizeObserver, elementRef, cdr) {
this.nzResizeObserver = nzResizeObserver;
this.elementRef = elementRef;
this.cdr = cdr;
this.contentInit$ = new Subject();
this.overflowItems = undefined;
this.overflowSuffix = undefined;
this.overflowRest = undefined;
this.overflowItems$ = new ReplaySubject(1);
this.destroy$ = new Subject();
this.containerWidth$ = this.nzResizeObserver
.observe(this.elementRef.nativeElement)
.pipe(map(([item]) => item.target.clientWidth || 0));
this.restWidth$ = new BehaviorSubject(0);
this.suffixWidth$ = new BehaviorSubject(0);
this.suffixFixedStart$ = new BehaviorSubject(null);
this.displayCount$ = new BehaviorSubject(Number.MAX_SAFE_INTEGER);
this.restReady$ = new BehaviorSubject(false);
this.maxRestWith$ = this.restWidth$.pipe(pairwise(), map(([prevRestWidth, restWidth]) => Math.max(prevRestWidth, restWidth)));
this.omittedItems$ = combineLatest([this.overflowItems$, this.displayCount$]).pipe(withLatestFrom(this.contentInit$), map(([[overflowItems, displayCount]]) => overflowItems.toArray().slice(displayCount + 1)));
this.displayRest$ = combineLatest([this.restReady$, this.omittedItems$]).pipe(map(([restReady, omittedItems]) => restReady && !!omittedItems.length));
}
updateDisplayCount(count, notReady) {
this.displayCount$.next(count);
if (this.overflowItems && !notReady) {
this.restReady$.next(count < this.overflowItems.length - 1);
}
}
ngOnInit() {
const overflowItemsWidth$ = this.overflowItems$.pipe(switchMap(items => combineLatest(items.map(item => item.itemWidth$))));
this.overflowItems$.pipe(takeUntil(this.destroy$)).subscribe(overflowItems => {
if (!overflowItems.length) {
this.displayCount$.next(0);
this.suffixFixedStart$.next(null);
}
});
combineLatest([overflowItemsWidth$, this.containerWidth$, this.maxRestWith$, this.restWidth$, this.suffixWidth$])
.pipe(filter(([, containerWidth, maxRestWith]) => !!(containerWidth && maxRestWith)), takeUntil(this.destroy$))
.subscribe(([overflowItemsWidth, containerWidth, maxRestWith, restWidth, suffixWidth]) => {
let totalWidth = suffixWidth;
const len = overflowItemsWidth.length;
const lastIndex = len - 1;
for (let i = 0; i < len; i += 1) {
const currentItemWidth = overflowItemsWidth[i];
// Break since data not ready
if (currentItemWidth === undefined) {
this.updateDisplayCount(i - 1, true);
break;
}
else {
// Find best match
totalWidth += currentItemWidth;
if (
// Only one means `totalWidth` is the final width
(lastIndex === 0 && totalWidth <= containerWidth) ||
// Last two width will be the final width
(i === lastIndex - 1 &&
overflowItemsWidth[lastIndex] !== undefined &&
totalWidth + overflowItemsWidth[lastIndex] <= containerWidth)) {
// Additional check if match the end
this.updateDisplayCount(lastIndex);
this.suffixFixedStart$.next(null);
break;
}
else if (totalWidth + maxRestWith > containerWidth) {
// Can not hold all the content to show rest
this.updateDisplayCount(i - 1);
this.suffixFixedStart$.next(totalWidth - currentItemWidth - suffixWidth + restWidth);
break;
}
this.cdr.detectChanges();
}
}
if (this.overflowSuffix &&
overflowItemsWidth[0] !== undefined &&
overflowItemsWidth[0] + suffixWidth > containerWidth) {
this.suffixFixedStart$.next(null);
}
this.cdr.detectChanges();
});
combineLatest([this.suffixFixedStart$, this.displayCount$])
.pipe(takeUntil(this.destroy$))
.subscribe(([suffixFixedStart, displayCount]) => {
var _a;
(_a = this.overflowSuffix) === null || _a === void 0 ? void 0 : _a.setSuffixStyle(suffixFixedStart, displayCount);
});
combineLatest([this.displayCount$, this.overflowItems$])
.pipe(takeUntil(this.destroy$))
.subscribe(([displayCount, overflowItems]) => overflowItems.forEach((item, index) => item.setItemStyle(index <= displayCount, index)));
combineLatest([this.displayRest$, this.displayCount$])
.pipe(takeUntil(this.destroy$))
.subscribe(([displayRest, displayCount]) => {
var _a;
(_a = this.overflowRest) === null || _a === void 0 ? void 0 : _a.setRestStyle(displayRest, displayRest ? displayCount : Number.MAX_SAFE_INTEGER);
});
}
ngAfterContentInit() {
var _a, _b, _c;
(_a = this.overflowItems) === null || _a === void 0 ? void 0 : _a.changes.pipe(startWith(this.overflowItems)).subscribe(this.overflowItems$);
(_b = this.overflowSuffix) === null || _b === void 0 ? void 0 : _b.suffixWidth$.subscribe(this.suffixWidth$);
(_c = this.overflowRest) === null || _c === void 0 ? void 0 : _c.restWidth$.subscribe(this.restWidth$);
this.contentInit$.next();
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
}
NzOverflowContainerComponent.decorators = [
{ type: Component, args: [{
selector: 'nz-overflow-container',
template: ` <ng-content></ng-content>
<ng-content select="[appOverflowRest]"></ng-content>
<ng-content select="[appOverflowSuffix]"></ng-content>`,
providers: [NzResizeObserver],
changeDetection: ChangeDetectionStrategy.OnPush
},] }
];
NzOverflowContainerComponent.ctorParameters = () => [
{ type: NzResizeObserver },
{ type: ElementRef },
{ type: ChangeDetectorRef }
];
NzOverflowContainerComponent.propDecorators = {
overflowItems: [{ type: ContentChildren, args: [NzOverflowItemDirective,] }],
overflowSuffix: [{ type: ContentChild, args: [NzOverflowSuffixDirective,] }],
overflowRest: [{ type: ContentChild, args: [NzOverflowRestDirective,] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmZsb3ctY29udGFpbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvbXBvbmVudHMvY2RrL292ZXJmbG93L292ZXJmbG93LWNvbnRhaW5lci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsZUFBZSxFQUVmLFVBQVUsRUFJVixZQUFZLEVBQ1osaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBVXhFLE1BQU0sT0FBTyw0QkFBNEI7SUFvQ3ZDLFlBQ1UsZ0JBQWtDLEVBQ2xDLFVBQXNCLEVBQ3RCLEdBQXNCO1FBRnRCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXRDaEMsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRW5DLGtCQUFhLEdBQW1ELFNBQVMsQ0FBQztRQUUxRSxtQkFBYyxHQUEwQyxTQUFTLENBQUM7UUFDM0IsaUJBQVksR0FBd0Ms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Q0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0YsTUFBQSxJQUFJLENBQUMsY0FBYywwQ0FBRSxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvRCxNQUFBLElBQUksQ0FBQyxZQUFZLDBDQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7O1lBdklGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsdUJBQXVCO2dCQUNqQyxRQUFRLEVBQUU7OzJEQUUrQztnQkFDekQsU0FBUyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzdCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEOzs7WUFiUSxnQkFBZ0I7WUFWdkIsVUFBVTtZQUtWLGlCQUFpQjs7OzRCQXFCaEIsZUFBZSxTQUFDLHVCQUF1Qjs2QkFFdkMsWUFBWSxTQUFDLHlCQUF5QjsyQkFFdEMsWUFBWSxTQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgUXVlcnlMaXN0LFxuICBFbGVtZW50UmVmLFxuICBPbkluaXQsXG4gIEFmdGVyQ29udGVudEluaXQsXG4gIE9uRGVzdHJveSxcbiAgQ29udGVudENoaWxkLFxuICBDaGFuZ2VEZXRlY3RvclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHBhaXJ3aXNlLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB3aXRoTGF0ZXN0RnJvbSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTnpSZXNpemVPYnNlcnZlciB9IGZyb20gJ25nLXpvcnJvLWFudGQvY2RrL3Jlc2l6ZS1vYnNlcnZlcic7XG5cbmltcG9ydCB7IE56T3ZlcmZsb3dJdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi9vdmVyZmxvdy1pdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOek92ZXJmbG93UmVzdERpcmVjdGl2ZSB9IGZyb20gJy4vb3ZlcmZsb3ctcmVzdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTnpPdmVyZmxvd1N1ZmZpeERpcmVjdGl2ZSB9IGZyb20gJy4vb3ZlcmZsb3ctc3VmZml4LmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ256LW92ZXJmbG93LWNvbnRhaW5lcicsXG4gIHRlbXBsYXRlOiBgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwT3ZlcmZsb3dSZXN0XVwiPjwvbmctY29udGVudD5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwT3ZlcmZsb3dTdWZmaXhdXCI+PC9uZy1jb250ZW50PmAsXG4gIHByb3ZpZGVyczogW056UmVzaXplT2JzZXJ2ZXJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBOek92ZXJmbG93Q29udGFpbmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICBjb250ZW50SW5pdCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBAQ29udGVudENoaWxkcmVuKE56T3ZlcmZsb3dJdGVtRGlyZWN0aXZlKVxuICBvdmVyZmxvd0l0ZW1zOiBRdWVyeUxpc3Q8TnpPdmVyZmxvd0l0ZW1EaXJlY3RpdmU+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBAQ29udGVudENoaWxkKE56T3ZlcmZsb3dTdWZmaXhEaXJlY3RpdmUpXG4gIG92ZXJmbG93U3VmZml4OiBOek92ZXJmbG93U3VmZml4RGlyZWN0aXZlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBAQ29udGVudENoaWxkKE56T3ZlcmZsb3dSZXN0RGlyZWN0aXZlKSBvdmVyZmxvd1Jlc3Q6IE56T3ZlcmZsb3dSZXN0RGlyZWN0aXZlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBvdmVyZmxvd0l0ZW1zJCA9IG5ldyBSZXBsYXlTdWJqZWN0PFF1ZXJ5TGlzdDxOek92ZXJmbG93SXRlbURpcmVjdGl2ZT4+KDEpO1xuICBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIGNvbnRhaW5lcldpZHRoJCA9IHRoaXMubnpSZXNpemVPYnNlcnZlclxuICAgIC5vYnNlcnZlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KVxuICAgIC5waXBlKG1hcCgoW2l0ZW1dKSA9PiBpdGVtLnRhcmdldC5jbGllbnRXaWR0aCB8fCAwKSk7XG4gIHJlc3RXaWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHN1ZmZpeFdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgc3VmZml4Rml4ZWRTdGFydCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IG51bGw+KG51bGwpO1xuICBkaXNwbGF5Q291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTtcbiAgcmVzdFJlYWR5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBtYXhSZXN0V2l0aCQgPSB0aGlzLnJlc3RXaWR0aCQucGlwZShcbiAgICBwYWlyd2lzZSgpLFxuICAgIG1hcCgoW3ByZXZSZXN0V2lkdGgsIHJlc3RXaWR0aF0pID0+IE1hdGgubWF4KHByZXZSZXN0V2lkdGgsIHJlc3RXaWR0aCkpXG4gICk7XG4gIG9taXR0ZWRJdGVtcyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm92ZXJmbG93SXRlbXMkLCB0aGlzLmRpc3BsYXlDb3VudCRdKS5waXBlKFxuICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuY29udGVudEluaXQkKSxcbiAgICBtYXAoKFtbb3ZlcmZsb3dJdGVtcywgZGlzcGxheUNvdW50XV0pID0+IG92ZXJmbG93SXRlbXMudG9BcnJheSgpLnNsaWNlKGRpc3BsYXlDb3VudCArIDEpKVxuICApO1xuICBkaXNwbGF5UmVzdCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnJlc3RSZWFkeSQsIHRoaXMub21pdHRlZEl0ZW1zJF0pLnBpcGUoXG4gICAgbWFwKChbcmVzdFJlYWR5LCBvbWl0dGVkSXRlbXNdKSA9PiByZXN0UmVhZHkgJiYgISFvbWl0dGVkSXRlbXMubGVuZ3RoKVxuICApO1xuXG4gIHVwZGF0ZURpc3BsYXlDb3VudChjb3VudDogbnVtYmVyLCBub3RSZWFkeT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlDb3VudCQubmV4dChjb3VudCk7XG4gICAgaWYgKHRoaXMub3ZlcmZsb3dJdGVtcyAmJiAhbm90UmVhZHkpIHtcbiAgICAgIHRoaXMucmVzdFJlYWR5JC5uZXh0KGNvdW50IDwgdGhpcy5vdmVyZmxvd0l0ZW1zLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbnpSZXNpemVPYnNlcnZlcjogTnpSZXNpemVPYnNlcnZlcixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBvdmVyZmxvd0l0ZW1zV2lkdGgkID0gdGhpcy5vdmVyZmxvd0l0ZW1zJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGl0ZW1zID0+IGNvbWJpbmVMYXRlc3QoaXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5pdGVtV2lkdGgkKSkpXG4gICAgKSBhcyBPYnNlcnZhYmxlPG51bWJlcltdPjtcbiAgICB0aGlzLm92ZXJmbG93SXRlbXMkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUob3ZlcmZsb3dJdGVtcyA9PiB7XG4gICAgICBpZiAoIW92ZXJmbG93SXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUNvdW50JC5uZXh0KDApO1xuICAgICAgICB0aGlzLnN1ZmZpeEZpeGVkU3RhcnQkLm5leHQobnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29tYmluZUxhdGVzdChbb3ZlcmZsb3dJdGVtc1dpZHRoJCwgdGhpcy5jb250YWluZXJXaWR0aCQsIHRoaXMubWF4UmVzdFdpdGgkLCB0aGlzLnJlc3RXaWR0aCQsIHRoaXMuc3VmZml4V2lkdGgkXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKFssIGNvbnRhaW5lcldpZHRoLCBtYXhSZXN0V2l0aF0pID0+ICEhKGNvbnRhaW5lcldpZHRoICYmIG1heFJlc3RXaXRoKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW292ZXJmbG93SXRlbXNXaWR0aCwgY29udGFpbmVyV2lkdGgsIG1heFJlc3RXaXRoLCByZXN0V2lkdGgsIHN1ZmZpeFdpZHRoXSkgPT4ge1xuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IHN1ZmZpeFdpZHRoO1xuICAgICAgICBjb25zdCBsZW4gPSBvdmVyZmxvd0l0ZW1zV2lkdGgubGVuZ3RoO1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBsZW4gLSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudEl0ZW1XaWR0aCA9IG92ZXJmbG93SXRlbXNXaWR0aFtpXTtcbiAgICAgICAgICAvLyBCcmVhayBzaW5jZSBkYXRhIG5vdCByZWFkeVxuICAgICAgICAgIGlmIChjdXJyZW50SXRlbVdpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheUNvdW50KGkgLSAxLCB0cnVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaW5kIGJlc3QgbWF0Y2hcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gY3VycmVudEl0ZW1XaWR0aDtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAvLyBPbmx5IG9uZSBtZWFucyBgdG90YWxXaWR0aGAgaXMgdGhlIGZpbmFsIHdpZHRoXG4gICAgICAgICAgICAgIChsYXN0SW5kZXggPT09IDAgJiYgdG90YWxXaWR0aCA8PSBjb250YWluZXJXaWR0aCkgfHxcbiAgICAgICAgICAgICAgLy8gTGFzdCB0d28gd2lkdGggd2lsbCBiZSB0aGUgZmluYWwgd2lkdGhcbiAgICAgICAgICAgICAgKGkgPT09IGxhc3RJbmRleCAtIDEgJiZcbiAgICAgICAgICAgICAgICBvdmVyZmxvd0l0ZW1zV2lkdGhbbGFzdEluZGV4XSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgdG90YWxXaWR0aCArIG92ZXJmbG93SXRlbXNXaWR0aFtsYXN0SW5kZXhdISA8PSBjb250YWluZXJXaWR0aClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGNoZWNrIGlmIG1hdGNoIHRoZSBlbmRcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5Q291bnQobGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgdGhpcy5zdWZmaXhGaXhlZFN0YXJ0JC5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG90YWxXaWR0aCArIG1heFJlc3RXaXRoID4gY29udGFpbmVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgLy8gQ2FuIG5vdCBob2xkIGFsbCB0aGUgY29udGVudCB0byBzaG93IHJlc3RcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5Q291bnQoaSAtIDEpO1xuICAgICAgICAgICAgICB0aGlzLnN1ZmZpeEZpeGVkU3RhcnQkLm5leHQodG90YWxXaWR0aCAtIGN1cnJlbnRJdGVtV2lkdGggLSBzdWZmaXhXaWR0aCArIHJlc3RXaWR0aCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5vdmVyZmxvd1N1ZmZpeCAmJlxuICAgICAgICAgIG92ZXJmbG93SXRlbXNXaWR0aFswXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgb3ZlcmZsb3dJdGVtc1dpZHRoWzBdICsgc3VmZml4V2lkdGggPiBjb250YWluZXJXaWR0aFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnN1ZmZpeEZpeGVkU3RhcnQkLm5leHQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnN1ZmZpeEZpeGVkU3RhcnQkLCB0aGlzLmRpc3BsYXlDb3VudCRdKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoW3N1ZmZpeEZpeGVkU3RhcnQsIGRpc3BsYXlDb3VudF0pID0+IHtcbiAgICAgICAgdGhpcy5vdmVyZmxvd1N1ZmZpeD8uc2V0U3VmZml4U3R5bGUoc3VmZml4Rml4ZWRTdGFydCwgZGlzcGxheUNvdW50KTtcbiAgICAgIH0pO1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuZGlzcGxheUNvdW50JCwgdGhpcy5vdmVyZmxvd0l0ZW1zJF0pXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChbZGlzcGxheUNvdW50LCBvdmVyZmxvd0l0ZW1zXSkgPT5cbiAgICAgICAgb3ZlcmZsb3dJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gaXRlbS5zZXRJdGVtU3R5bGUoaW5kZXggPD0gZGlzcGxheUNvdW50LCBpbmRleCkpXG4gICAgICApO1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuZGlzcGxheVJlc3QkLCB0aGlzLmRpc3BsYXlDb3VudCRdKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoW2Rpc3BsYXlSZXN0LCBkaXNwbGF5Q291bnRdKSA9PiB7XG4gICAgICAgIHRoaXMub3ZlcmZsb3dSZXN0Py5zZXRSZXN0U3R5bGUoZGlzcGxheVJlc3QsIGRpc3BsYXlSZXN0ID8gZGlzcGxheUNvdW50IDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO1xuICAgICAgfSk7XG4gIH1cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3ZlcmZsb3dJdGVtcz8uY2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLm92ZXJmbG93SXRlbXMpKS5zdWJzY3JpYmUodGhpcy5vdmVyZmxvd0l0ZW1zJCk7XG4gICAgdGhpcy5vdmVyZmxvd1N1ZmZpeD8uc3VmZml4V2lkdGgkLnN1YnNjcmliZSh0aGlzLnN1ZmZpeFdpZHRoJCk7XG4gICAgdGhpcy5vdmVyZmxvd1Jlc3Q/LnJlc3RXaWR0aCQuc3Vic2NyaWJlKHRoaXMucmVzdFdpZHRoJCk7XG4gICAgdGhpcy5jb250ZW50SW5pdCQubmV4dCgpO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19