rt-tab-carousel
Version:
Angular tab carousel component
157 lines • 24.9 kB
JavaScript
import { Directive, Input, } from '@angular/core';
import { combineLatest, fromEvent, Observable, Subscription } from 'rxjs';
import { debounceTime, filter, first, startWith } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "../services/rt-carousel.service";
class RtCarouselContainerDirective {
el;
renderer;
service;
cd;
scrollStep = 1;
uuidCarousel;
activeClass;
antiBounce = 5;
subscription = new Subscription();
firstDebounce = 1500;
constructor(el, renderer, service, cd) {
this.el = el;
this.renderer = renderer;
this.service = service;
this.cd = cd;
}
_selectedTab;
set selectedTab(value) {
this._selectedTab = value;
this.service.amountTabs(this.uuidCarousel).pipe(debounceTime(this.firstDebounce), first()).subscribe({
next: () => {
this.firstDebounce = 0;
this.service.selectTab(this.uuidCarousel, value);
},
});
}
ngOnInit() {
this.renderer.setStyle(this.el.nativeElement, 'display', 'flex');
this.renderer.setStyle(this.el.nativeElement, 'overflow', 'auto');
this.renderer.setStyle(this.el.nativeElement, 'z-index', '10');
this.renderer.setStyle(this.el.nativeElement, 'padding', '0 2px');
this.renderer.setStyle(this.el.nativeElement, 'align-items', 'center');
this.renderer.setStyle(this.el.nativeElement, 'gap', '6px');
this.renderer.setStyle(this.el.nativeElement, 'scrollbar-width', 'none');
this.renderer.addClass(this.el.nativeElement, 'rt-tab-carousel-container');
this.subscription.add(this.service.amountTabs(this.uuidCarousel)
.pipe(debounceTime(10))
.subscribe({
next: () => this.cd.detectChanges(),
}));
}
ngAfterViewInit() {
if (this.activeClass) {
this.service.setActiveClassTab(this.uuidCarousel, this.activeClass);
}
this.service.setScrollStep(this.uuidCarousel, this.scrollStep);
const style = this.renderer.createElement('style');
this.renderer.appendChild(this.el.nativeElement, style);
style.innerHTML = `::-webkit-scrollbar { width: 0; height: 0 }`;
this.service.amountTabs(this.uuidCarousel).pipe(debounceTime(1000), first()).subscribe({
next: () => {
this.initIndexes();
},
});
const resize$ = fromEvent(window, 'resize').pipe(startWith(null));
const scroll$ = fromEvent(this.el.nativeElement, 'scroll').pipe(startWith(null));
const mutationObserver$ = this.createMutationObserverObservable(this.el.nativeElement).pipe(startWith(null));
this.subscription.add(combineLatest([resize$, scroll$, mutationObserver$]).subscribe({
next: () => {
const currentItems = document.querySelectorAll(`.rt-carousel-tab-${this.uuidCarousel}`);
const scrollLeft = this.el.nativeElement.scrollLeft;
for (let i = 0; i < currentItems.length; i++) {
const child = currentItems[i];
if (child.offsetLeft - scrollLeft - this.el.nativeElement.offsetLeft + this.antiBounce >= 0) {
this.service.setLastVisibleIndex(this.uuidCarousel, i);
break;
}
}
for (let i = currentItems.length - 1; i >= 0; i--) {
const child = currentItems[i];
if (this.el.nativeElement.offsetLeft + this.el.nativeElement.offsetWidth >=
child.offsetLeft + child.offsetWidth - this.el.nativeElement.scrollLeft - this.antiBounce) {
this.service.setLastVisibleIndexEnd(this.uuidCarousel, i);
break;
}
}
},
}));
this.cd.detectChanges();
}
initIndexes() {
this.service
.tabs(this.uuidCarousel)
.pipe(filter(items => items && !!items.length), first())
.subscribe({
next: tabs => {
const currentItems = document.querySelectorAll(`.rt-carousel-tab-${this.uuidCarousel}`);
const scrollLeft = this.el.nativeElement.scrollLeft;
const firstTab = tabs[0].nativeElement;
const offsetLeft = firstTab.offsetLeft;
if (offsetLeft >= scrollLeft) {
this.service.setLastVisibleIndex(this.uuidCarousel, 0);
}
for (let i = currentItems.length - 1; i >= 0; i--) {
const child = currentItems[i];
if (this.el.nativeElement.offsetLeft + this.el.nativeElement.offsetWidth >=
child.offsetLeft + child.offsetWidth - this.el.nativeElement.scrollLeft - this.antiBounce) {
this.service.setLastVisibleIndexEnd(this.uuidCarousel, i);
break;
}
}
},
});
}
ngOnDestroy() {
const tabs = document.querySelectorAll(`.rt-carousel-tab-${this.uuidCarousel}`);
tabs.forEach(tab => {
tab.removeEventListener('scroll', () => {
});
tab.removeEventListener('click', () => {
});
});
this.service.destroyCarousel(this.uuidCarousel);
this.subscription.unsubscribe();
}
createMutationObserverObservable(target) {
return new Observable(observer => {
const observerInstance = new MutationObserver(mutationsList => {
observer.next(mutationsList);
});
observerInstance.observe(target, {
childList: true,
subtree: true,
});
return () => {
observerInstance.disconnect();
};
});
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: RtCarouselContainerDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.RtCarouselService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.2", type: RtCarouselContainerDirective, selector: "[rtCarouselContainer]", inputs: { scrollStep: "scrollStep", uuidCarousel: "uuidCarousel", activeClass: "activeClass", antiBounce: "antiBounce", selectedTab: "selectedTab" }, ngImport: i0 });
}
export { RtCarouselContainerDirective };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: RtCarouselContainerDirective, decorators: [{
type: Directive,
args: [{
selector: '[rtCarouselContainer]',
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.RtCarouselService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { scrollStep: [{
type: Input
}], uuidCarousel: [{
type: Input,
args: [{ required: true }]
}], activeClass: [{
type: Input
}], antiBounce: [{
type: Input
}], selectedTab: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnQtY2Fyb3VzZWwtY29udGFpbmVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3J0LXRhYi1jYXJvdXNlbC9zcmMvbGliL2RpcmVjdGl2ZXMvcnQtY2Fyb3VzZWwtY29udGFpbmVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUVULEtBQUssR0FJUixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBR3RFLE1BR2EsNEJBQTRCO0lBU2pCO0lBQXdCO0lBQTZCO0lBQW9DO0lBUnBHLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDQyxZQUFZLENBQVU7SUFDdEMsV0FBVyxDQUFVO0lBQ3JCLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFFUCxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMzQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBRTdCLFlBQW9CLEVBQWMsRUFBVSxRQUFtQixFQUFVLE9BQTBCLEVBQVUsRUFBcUI7UUFBOUcsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFtQjtRQUFVLE9BQUUsR0FBRixFQUFFLENBQW1CO0lBQ2xJLENBQUM7SUFFTyxZQUFZLENBQVU7SUFFOUIsSUFBYSxXQUFXLENBQUMsS0FBYTtRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUUxQixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFlB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RyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTyxnQ0FBZ0MsQ0FBQyxNQUFtQjtRQUN4RCxPQUFPLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDMUQsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztZQUNILGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQzdCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLE9BQU8sRUFBRSxJQUFJO2FBQ2hCLENBQUMsQ0FBQztZQUNILE9BQU8sR0FBRyxFQUFFO2dCQUNSLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xDLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzt1R0E1SlEsNEJBQTRCOzJGQUE1Qiw0QkFBNEI7O1NBQTVCLDRCQUE0QjsyRkFBNUIsNEJBQTRCO2tCQUh4QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSx1QkFBdUI7aUJBQ3BDO3lMQUVZLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ21CLFlBQVk7c0JBQXBDLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDO2dCQUNkLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFVTyxXQUFXO3NCQUF2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgUmVuZGVyZXIyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgZmlyc3QsIHN0YXJ0V2l0aH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtSdENhcm91c2VsU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvcnQtY2Fyb3VzZWwuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3J0Q2Fyb3VzZWxDb250YWluZXJdJyxcbn0pXG5leHBvcnQgY2xhc3MgUnRDYXJvdXNlbENvbnRhaW5lckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKSBzY3JvbGxTdGVwID0gMTtcbiAgICBASW5wdXQoe3JlcXVpcmVkOiB0cnVlfSkgdXVpZENhcm91c2VsITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFjdGl2ZUNsYXNzPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFudGlCb3VuY2UgPSA1O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgcHJpdmF0ZSBmaXJzdERlYm91bmNlID0gMTUwMDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBzZXJ2aWNlOiBSdENhcm91c2VsU2VydmljZSwgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZWxlY3RlZFRhYj86IG51bWJlcjtcblxuICAgIEBJbnB1dCgpIHNldCBzZWxlY3RlZFRhYih2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFiID0gdmFsdWU7XG5cbiAgICAgICAgdGhpcy5zZXJ2aWNlLmFtb3VudFRhYnModGhpcy51dWlkQ2Fyb3VzZWwpLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZmlyc3REZWJvdW5jZSksIGZpcnN0KCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdERlYm91bmNlID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc2VsZWN0VGFiKHRoaXMudXVpZENhcm91c2VsLCB2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ2ZsZXgnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdvdmVyZmxvdycsICdhdXRvJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnei1pbmRleCcsICcxMCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3BhZGRpbmcnLCAnMCAycHgnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdhbGlnbi1pdGVtcycsICdjZW50ZXInKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdnYXAnLCAnNnB4Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsYmFyLXdpZHRoJywgJ25vbmUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdydC10YWItY2Fyb3VzZWwtY29udGFpbmVyJyk7XG5cblxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UuYW1vdW50VGFicyh0aGlzLnV1aWRDYXJvdXNlbClcbiAgICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTApKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB0aGlzLmNkLmRldGVjdENoYW5nZXMoKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc2V0QWN0aXZlQ2xhc3NUYWIodGhpcy51dWlkQ2Fyb3VzZWwsIHRoaXMuYWN0aXZlQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VydmljZS5zZXRTY3JvbGxTdGVwKHRoaXMudXVpZENhcm91c2VsLCB0aGlzLnNjcm9sbFN0ZXApO1xuICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHN0eWxlKTtcbiAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gYDo6LXdlYmtpdC1zY3JvbGxiYXIgeyB3aWR0aDogMDsgaGVpZ2h0OiAwIH1gO1xuXG5cbiAgICAgICAgdGhpcy5zZXJ2aWNlLmFtb3VudFRhYnModGhpcy51dWlkQ2Fyb3VzZWwpLnBpcGUoZGVib3VuY2VUaW1lKDEwMDApLCBmaXJzdCgpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEluZGV4ZXMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgY29uc3QgcmVzaXplJCA9IGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKS5waXBlKHN0YXJ0V2l0aChudWxsKSk7XG4gICAgICAgIGNvbnN0IHNjcm9sbCQgPSBmcm9tRXZlbnQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJykucGlwZShzdGFydFdpdGgobnVsbCkpO1xuXG5cbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciQgPSB0aGlzLmNyZWF0ZU11dGF0aW9uT2JzZXJ2ZXJPYnNlcnZhYmxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCkucGlwZShzdGFydFdpdGgobnVsbCkpO1xuXG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKGNvbWJpbmVMYXRlc3QoW3Jlc2l6ZSQsIHNjcm9sbCQsIG11dGF0aW9uT2JzZXJ2ZXIkXSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAucnQtY2Fyb3VzZWwtdGFiLSR7dGhpcy51dWlkQ2Fyb3VzZWx9YCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjdXJyZW50SXRlbXNbaV0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5vZmZzZXRMZWZ0IC0gc2Nyb2xsTGVmdCAtIHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0ICsgdGhpcy5hbnRpQm91bmNlID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5zZXRMYXN0VmlzaWJsZUluZGV4KHRoaXMudXVpZENhcm91c2VsLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGN1cnJlbnRJdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGN1cnJlbnRJdGVtc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQgKyB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPj1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm9mZnNldExlZnQgKyBjaGlsZC5vZmZzZXRXaWR0aCAtIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0IC0gdGhpcy5hbnRpQm91bmNlXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLnNldExhc3RWaXNpYmxlSW5kZXhFbmQodGhpcy51dWlkQ2Fyb3VzZWwsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KSk7XG5cblxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBpbml0SW5kZXhlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlXG4gICAgICAgICAgICAudGFicyh0aGlzLnV1aWRDYXJvdXNlbClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihpdGVtcyA9PiBpdGVtcyAmJiAhIWl0ZW1zLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IHRhYnMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAucnQtY2Fyb3VzZWwtdGFiLSR7dGhpcy51dWlkQ2Fyb3VzZWx9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RUYWIgPSB0YWJzWzBdLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldExlZnQgPSBmaXJzdFRhYi5vZmZzZXRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0TGVmdCA+PSBzY3JvbGxMZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc2V0TGFzdFZpc2libGVJbmRleCh0aGlzLnV1aWRDYXJvdXNlbCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gY3VycmVudEl0ZW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGN1cnJlbnRJdGVtc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCArIHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm9mZnNldExlZnQgKyBjaGlsZC5vZmZzZXRXaWR0aCAtIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0IC0gdGhpcy5hbnRpQm91bmNlXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc2V0TGFzdFZpc2libGVJbmRleEVuZCh0aGlzLnV1aWRDYXJvdXNlbCwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAucnQtY2Fyb3VzZWwtdGFiLSR7dGhpcy51dWlkQ2Fyb3VzZWx9YCk7XG4gICAgICAgIHRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgICAgICAgdGFiLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGFiLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VydmljZS5kZXN0cm95Q2Fyb3VzZWwodGhpcy51dWlkQ2Fyb3VzZWwpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlTXV0YXRpb25PYnNlcnZlck9ic2VydmFibGUodGFyZ2V0OiBIVE1MRWxlbWVudCk6IE9ic2VydmFibGU8TXV0YXRpb25SZWNvcmRbXT4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJJbnN0YW5jZSA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9uc0xpc3QgPT4ge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobXV0YXRpb25zTGlzdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVySW5zdGFuY2Uub2JzZXJ2ZSh0YXJnZXQsIHtcbiAgICAgICAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlckluc3RhbmNlLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==