rt-tab-carousel
Version:
Angular tab carousel component
181 lines • 33.3 kB
JavaScript
import { Injectable } from '@angular/core';
import { BehaviorSubject, combineLatest, interval } from 'rxjs';
import { distinctUntilChanged, first, map } from 'rxjs/operators';
import * as i0 from "@angular/core";
class RtCarouselService {
_isLastTabVisible$;
_isFirstTabVisible$;
_scrollStep$ = new BehaviorSubject({});
_items = new BehaviorSubject({});
_currentSliderShift$ = new BehaviorSubject({});
_lastVisibleIndexEnd$ = new BehaviorSubject({});
_lastVisibleIndex$ = new BehaviorSubject({});
_selectedIndex = new BehaviorSubject({});
_activeClassTab = new BehaviorSubject({});
constructor() {
this._isFirstTabVisible$ = this._lastVisibleIndex$.asObservable().pipe(map(v => {
const res = {};
for (const key of Object.keys(v)) {
res[key] = v[key] === 0;
}
return res;
}));
this._isLastTabVisible$ = combineLatest([this._lastVisibleIndexEnd$.asObservable(), this._items.asObservable()]).pipe(map(([v, length]) => {
const res = {};
for (const key of Object.keys(v)) {
res[key] = v[key] === length[key]?.length - 1;
}
return res;
}));
}
setTab(related, value) {
const currValue = this._items.value;
this._items.next({
...currValue,
[related]: currValue[related]?.length ? [...currValue[related], value] : [value],
});
}
deleteTab(uuidCarousel, el) {
const currValue = this._items.value;
const index = currValue[uuidCarousel].findIndex(v => v === el);
if (index !== -1) {
currValue[uuidCarousel].splice(index, 1);
this._items.next(currValue);
}
}
amountTabs(related) {
return this._items.pipe(distinctUntilChanged((prev, curr) => prev[related] === curr[related]), map(v => v[related]?.length));
}
tabs(related) {
return this._items.pipe(distinctUntilChanged((prev, curr) => prev[related] === curr[related]), map(v => v[related]));
}
isFirstTabVisible(related) {
return this._isFirstTabVisible$.pipe(distinctUntilChanged((prev, curr) => prev[related] === curr[related]), map(v => v[related]));
}
isLastTabVisible(related) {
return this._isLastTabVisible$.pipe(distinctUntilChanged((prev, curr) => prev[related] === curr[related]), map(v => v[related]));
}
currentSliderShift(related) {
return this._currentSliderShift$.asObservable().pipe(distinctUntilChanged((prev, curr) => prev[related] === curr[related]), map(v => v[related]));
}
lastVisibleIndexEnd(related) {
return this._lastVisibleIndexEnd$.pipe(distinctUntilChanged((prev, curr) => prev[related] === curr[related]), map(v => v[related]));
}
lastVisibleIndex(related) {
return this._lastVisibleIndex$.pipe(distinctUntilChanged((prev, curr) => prev[related] === curr[related]), map(v => v[related]));
}
nextPart(related) {
if (!this._lastVisibleIndex$.value[related]) {
this._lastVisibleIndex$.next({ ...this._lastVisibleIndex$.value, [related]: 0 });
}
const scrollStep = this._scrollStep$.value[related];
const amount = this._items.value[related];
const nextStep = this._lastVisibleIndexEnd$.value[related] + scrollStep > amount?.length - 1
? amount?.length - 1
: this._lastVisibleIndexEnd$.value[related] + scrollStep;
this._items.value[related][nextStep]?.nativeElement.scrollIntoView({
behavior: 'smooth',
block: 'nearest',
inline: 'end',
});
this._currentSliderShift$.next({
...this._currentSliderShift$.value,
[related]: nextStep,
});
}
previousPart(related) {
if (this._lastVisibleIndex$.value[related] - this._scrollStep$.value[related] >= 0) {
this._currentSliderShift$.next({
...this._currentSliderShift$.value,
[related]: this._lastVisibleIndex$.value[related] - this._scrollStep$.value[related],
});
this._items.value[related][this._lastVisibleIndex$.value[related] - this._scrollStep$.value[related]].nativeElement.scrollIntoView({
behavior: 'smooth',
inline: 'start',
block: 'nearest',
});
}
else {
this._currentSliderShift$.next({
...this._currentSliderShift$.value,
[related]: 0,
});
this._items.value[related][0].nativeElement.scrollIntoView({
behavior: 'smooth',
block: 'nearest',
inline: 'start',
});
}
}
setLastVisibleIndex(related, value) {
const currValue = this._lastVisibleIndex$.value;
this._lastVisibleIndex$.next({ ...currValue, [related]: value });
}
setLastVisibleIndexEnd(related, value) {
const currValue = this._lastVisibleIndexEnd$.value;
this._lastVisibleIndexEnd$.next({ ...currValue, [related]: value });
}
setScrollStep(related, value) {
const currValue = this._scrollStep$.value;
this._scrollStep$.next({ ...currValue, [related]: value });
}
selectTab(related, index) {
if (isNaN(+index)) {
return;
}
if (this._items.value?.[related]?.[+index]) {
this.applyActiveClassForTab(related, this._items.value[related][+index]);
const currentValues = this._selectedIndex.value;
this._selectedIndex.next({ ...currentValues, [related]: +index });
const el = this._items.value[related][+index].nativeElement;
el.scrollIntoView({ inline: 'nearest', block: 'nearest', behavior: 'smooth' });
}
else {
const className = this._activeClassTab.value[related];
const selectedIndexPreview = this._selectedIndex.value?.[related];
if (selectedIndexPreview) {
this._items.value?.[related]?.[selectedIndexPreview]?.nativeElement.classList.remove(className);
}
}
}
selectHTMLElement(related, el) {
this.applyActiveClassForTab(related, el);
const currentValues = this._selectedIndex.value;
const index = this._items.value[related].findIndex(v => v === el);
this._selectedIndex.next({ ...currentValues, [related]: index });
interval(10).pipe(first()).subscribe({
next: () => el.nativeElement.scrollIntoView({ inline: 'nearest', block: 'nearest', behavior: 'smooth' }),
});
}
selectedTab(related) {
return this._selectedIndex.pipe(distinctUntilChanged((prev, curr) => prev[related] === curr[related]), map(v => v[related]));
}
setActiveClassTab(related, className) {
const currValue = this._activeClassTab.value;
this._activeClassTab.next({ ...currValue, [related]: className });
}
destroyCarousel(related) {
this._items.value[related] = [];
this._selectedIndex.value[related] = null;
this._activeClassTab.value[related] = null;
this._scrollStep$.value[related] = null;
this._currentSliderShift$.value[related] = null;
this._lastVisibleIndexEnd$.value[related] = null;
this._lastVisibleIndex$.value[related] = null;
}
applyActiveClassForTab(related, el) {
const className = this._activeClassTab.value[related];
const selectedIndexPreview = this._selectedIndex.value[related];
if (selectedIndexPreview >= 0) {
this._items.value[related][selectedIndexPreview]?.nativeElement.classList.remove(className);
}
el.nativeElement.classList.add(className);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: RtCarouselService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: RtCarouselService });
}
export { RtCarouselService };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: RtCarouselService, decorators: [{
type: Injectable
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnQtY2Fyb3VzZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3J0LXRhYi1jYXJvdXNlbC9zcmMvbGliL3NlcnZpY2VzL3J0LWNhcm91c2VsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFhLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQWEsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFaEUsTUFDYSxpQkFBaUI7SUFDbEIsa0JBQWtCLENBQThDO0lBQ2hFLG1CQUFtQixDQUE4QztJQUNqRSxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQXVDLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBd0MsRUFBRSxDQUFDLENBQUM7SUFDeEUsb0JBQW9CLEdBQUcsSUFBSSxlQUFlLENBQXVDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLHFCQUFxQixHQUFHLElBQUksZUFBZSxDQUF1QyxFQUFFLENBQUMsQ0FBQztJQUN0RixrQkFBa0IsR0FBRyxJQUFJLGVBQWUsQ0FBdUMsRUFBRSxDQUFDLENBQUM7SUFDbkYsY0FBYyxHQUFHLElBQUksZUFBZSxDQUF5QyxFQUFFLENBQUMsQ0FBQztJQUNqRixlQUFlLEdBQUcsSUFBSSxlQUFlLENBQXVDLEVBQUUsQ0FBQyxDQUFDO0lBRXhGO1FBQ0ksSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQ2xFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNKLE1BQU0sR0FBRyxHQUFRLEVBQUUsQ0FBQztZQUNwQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1B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UyxDQUFDLENBQUM7SUFDOUMsQ0FBQzt1R0FqT1EsaUJBQWlCOzJHQUFqQixpQkFBaUI7O1NBQWpCLGlCQUFpQjsyRkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFbGVtZW50UmVmLCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBpbnRlcnZhbCwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2Rpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaXJzdCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSdENhcm91c2VsU2VydmljZSB7XG4gICAgcHJpdmF0ZSBfaXNMYXN0VGFiVmlzaWJsZSQhOiBPYnNlcnZhYmxlPHsgW3JlbGF0ZWQ6IHN0cmluZ106IGJvb2xlYW4gfT47XG4gICAgcHJpdmF0ZSBfaXNGaXJzdFRhYlZpc2libGUkITogT2JzZXJ2YWJsZTx7IFtyZWxhdGVkOiBzdHJpbmddOiBib29sZWFuIH0+O1xuICAgIHByaXZhdGUgX3Njcm9sbFN0ZXAkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IFtyZWxhdGVkOiBzdHJpbmddOiBudW1iZXIgfCBudWxsIH0+KHt9KTtcbiAgICBwcml2YXRlIF9pdGVtcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBbcmVsYXRlZDogc3RyaW5nXTogKEVsZW1lbnRSZWZbXSkgfT4oe30pO1xuICAgIHByaXZhdGUgX2N1cnJlbnRTbGlkZXJTaGlmdCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgW3JlbGF0ZWQ6IHN0cmluZ106IG51bWJlciB8IG51bGwgfT4oe30pO1xuICAgIHByaXZhdGUgX2xhc3RWaXNpYmxlSW5kZXhFbmQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IFtyZWxhdGVkOiBzdHJpbmddOiBudW1iZXIgfCBudWxsIH0+KHt9KTtcbiAgICBwcml2YXRlIF9sYXN0VmlzaWJsZUluZGV4JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBbcmVsYXRlZDogc3RyaW5nXTogbnVtYmVyIHwgbnVsbCB9Pih7fSk7XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRJbmRleCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBbcmVsYXRlZDogc3RyaW5nXTogKG51bWJlciB8IG51bGwpIH0+KHt9KTtcbiAgICBwcml2YXRlIF9hY3RpdmVDbGFzc1RhYiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBbcmVsYXRlZDogc3RyaW5nXTogc3RyaW5nIHwgbnVsbCB9Pih7fSk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5faXNGaXJzdFRhYlZpc2libGUkID0gdGhpcy5fbGFzdFZpc2libGVJbmRleCQuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgICAgICAgIG1hcCh2ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXM6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1trZXldID0gdltrZXldID09PSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5faXNMYXN0VGFiVmlzaWJsZSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9sYXN0VmlzaWJsZUluZGV4RW5kJC5hc09ic2VydmFibGUoKSwgdGhpcy5faXRlbXMuYXNPYnNlcnZhYmxlKCldKS5waXBlKFxuICAgICAgICAgICAgbWFwKChbdiwgbGVuZ3RoXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlczogYW55ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSB2W2tleV0gPT09IGxlbmd0aFtrZXldPy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFRhYihyZWxhdGVkOiBzdHJpbmcsIHZhbHVlOiBFbGVtZW50UmVmKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJWYWx1ZSA9IHRoaXMuX2l0ZW1zLnZhbHVlO1xuICAgICAgICB0aGlzLl9pdGVtcy5uZXh0KHtcbiAgICAgICAgICAgIC4uLmN1cnJWYWx1ZSxcbiAgICAgICAgICAgIFtyZWxhdGVkXTogY3VyclZhbHVlW3JlbGF0ZWRdPy5sZW5ndGggPyBbLi4uY3VyclZhbHVlW3JlbGF0ZWRdLCB2YWx1ZV0gOiBbdmFsdWVdLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlVGFiKHV1aWRDYXJvdXNlbDogc3RyaW5nLCBlbDogRWxlbWVudFJlZikge1xuICAgICAgICBjb25zdCBjdXJyVmFsdWUgPSB0aGlzLl9pdGVtcy52YWx1ZTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBjdXJyVmFsdWVbdXVpZENhcm91c2VsXS5maW5kSW5kZXgodiA9PiB2ID09PSBlbCk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGN1cnJWYWx1ZVt1dWlkQ2Fyb3VzZWxdLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLl9pdGVtcy5uZXh0KGN1cnJWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYW1vdW50VGFicyhyZWxhdGVkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXMucGlwZShcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyKSA9PiBwcmV2W3JlbGF0ZWRdID09PSBjdXJyW3JlbGF0ZWRdKSxcbiAgICAgICAgICAgIG1hcCh2ID0+IHZbcmVsYXRlZF0/Lmxlbmd0aCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRhYnMocmVsYXRlZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxFbGVtZW50UmVmW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLnBpcGUoXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3VycikgPT4gcHJldltyZWxhdGVkXSA9PT0gY3VycltyZWxhdGVkXSksXG4gICAgICAgICAgICBtYXAodiA9PiB2W3JlbGF0ZWRdKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNGaXJzdFRhYlZpc2libGUocmVsYXRlZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0ZpcnN0VGFiVmlzaWJsZSQucGlwZShcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyKSA9PiBwcmV2W3JlbGF0ZWRdID09PSBjdXJyW3JlbGF0ZWRdKSxcbiAgICAgICAgICAgIG1hcCh2ID0+IHZbcmVsYXRlZF0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0xhc3RUYWJWaXNpYmxlKHJlbGF0ZWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMYXN0VGFiVmlzaWJsZSQucGlwZShcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyKSA9PiBwcmV2W3JlbGF0ZWRdID09PSBjdXJyW3JlbGF0ZWRdKSxcbiAgICAgICAgICAgIG1hcCh2ID0+IHZbcmVsYXRlZF0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBjdXJyZW50U2xpZGVyU2hpZnQocmVsYXRlZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2xpZGVyU2hpZnQkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3VycikgPT4gcHJldltyZWxhdGVkXSA9PT0gY3VycltyZWxhdGVkXSksXG4gICAgICAgICAgICBtYXAodiA9PiB2W3JlbGF0ZWRdKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGFzdFZpc2libGVJbmRleEVuZChyZWxhdGVkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhFbmQkLnBpcGUoXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3VycikgPT4gcHJldltyZWxhdGVkXSA9PT0gY3VycltyZWxhdGVkXSksXG4gICAgICAgICAgICBtYXAodiA9PiB2W3JlbGF0ZWRdKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGFzdFZpc2libGVJbmRleChyZWxhdGVkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXgkLnBpcGUoXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3VycikgPT4gcHJldltyZWxhdGVkXSA9PT0gY3VycltyZWxhdGVkXSksXG4gICAgICAgICAgICBtYXAodiA9PiB2W3JlbGF0ZWRdKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV4dFBhcnQocmVsYXRlZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fbGFzdFZpc2libGVJbmRleCQudmFsdWVbcmVsYXRlZF0pIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXgkLm5leHQoey4uLnRoaXMuX2xhc3RWaXNpYmxlSW5kZXgkLnZhbHVlLCBbcmVsYXRlZF06IDB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjcm9sbFN0ZXAgPSB0aGlzLl9zY3JvbGxTdGVwJC52YWx1ZVtyZWxhdGVkXTtcbiAgICAgICAgY29uc3QgYW1vdW50ID0gdGhpcy5faXRlbXMudmFsdWVbcmVsYXRlZF07XG4gICAgICAgIGNvbnN0IG5leHRTdGVwID1cbiAgICAgICAgICAgIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhFbmQkLnZhbHVlW3JlbGF0ZWRdISArIHNjcm9sbFN0ZXAhID4gYW1vdW50Py5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgPyBhbW91bnQ/Lmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICA6IHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhFbmQkLnZhbHVlW3JlbGF0ZWRdISArIHNjcm9sbFN0ZXAhO1xuXG4gICAgICAgIHRoaXMuX2l0ZW1zLnZhbHVlW3JlbGF0ZWRdW25leHRTdGVwXT8ubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgICAgICBibG9jazogJ25lYXJlc3QnLFxuICAgICAgICAgICAgaW5saW5lOiAnZW5kJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTbGlkZXJTaGlmdCQubmV4dCh7XG4gICAgICAgICAgICAuLi50aGlzLl9jdXJyZW50U2xpZGVyU2hpZnQkLnZhbHVlLFxuICAgICAgICAgICAgW3JlbGF0ZWRdOiBuZXh0U3RlcCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXZpb3VzUGFydChyZWxhdGVkOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICBpZiAodGhpcy5fbGFzdFZpc2libGVJbmRleCQudmFsdWVbcmVsYXRlZF0hIC0gdGhpcy5fc2Nyb2xsU3RlcCQudmFsdWVbcmVsYXRlZF0hID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRTbGlkZXJTaGlmdCQubmV4dCh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fY3VycmVudFNsaWRlclNoaWZ0JC52YWx1ZSxcbiAgICAgICAgICAgICAgICBbcmVsYXRlZF06IHRoaXMuX2xhc3RWaXNpYmxlSW5kZXgkLnZhbHVlW3JlbGF0ZWRdISAtIHRoaXMuX3Njcm9sbFN0ZXAkLnZhbHVlW3JlbGF0ZWRdISxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLl9pdGVtcy52YWx1ZVtyZWxhdGVkXVt0aGlzLl9sYXN0VmlzaWJsZUluZGV4JC52YWx1ZVtyZWxhdGVkXSEgLSB0aGlzLl9zY3JvbGxTdGVwJC52YWx1ZVtyZWxhdGVkXSFdLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgICAgICAgICBpbmxpbmU6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgYmxvY2s6ICduZWFyZXN0JyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50U2xpZGVyU2hpZnQkLm5leHQoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2N1cnJlbnRTbGlkZXJTaGlmdCQudmFsdWUsXG4gICAgICAgICAgICAgICAgW3JlbGF0ZWRdOiAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9pdGVtcy52YWx1ZVtyZWxhdGVkXVswXS5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgICAgICAgICAgYmxvY2s6ICduZWFyZXN0JyxcbiAgICAgICAgICAgICAgICBpbmxpbmU6ICdzdGFydCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMYXN0VmlzaWJsZUluZGV4KHJlbGF0ZWQ6IHN0cmluZywgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyVmFsdWUgPSB0aGlzLl9sYXN0VmlzaWJsZUluZGV4JC52YWx1ZTtcbiAgICAgICAgdGhpcy5fbGFzdFZpc2libGVJbmRleCQubmV4dCh7Li4uY3VyclZhbHVlLCBbcmVsYXRlZF06IHZhbHVlfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldExhc3RWaXNpYmxlSW5kZXhFbmQocmVsYXRlZDogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJWYWx1ZSA9IHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhFbmQkLnZhbHVlO1xuICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZUluZGV4RW5kJC5uZXh0KHsuLi5jdXJyVmFsdWUsIFtyZWxhdGVkXTogdmFsdWV9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2Nyb2xsU3RlcChyZWxhdGVkOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VyclZhbHVlID0gdGhpcy5fc2Nyb2xsU3RlcCQudmFsdWU7XG4gICAgICAgIHRoaXMuX3Njcm9sbFN0ZXAkLm5leHQoey4uLmN1cnJWYWx1ZSwgW3JlbGF0ZWRdOiB2YWx1ZX0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RUYWIocmVsYXRlZDogc3RyaW5nLCBpbmRleDogbnVtYmVyIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChpc05hTigraW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2l0ZW1zLnZhbHVlPy5bcmVsYXRlZF0/LlsraW5kZXhdKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5QWN0aXZlQ2xhc3NGb3JUYWIocmVsYXRlZCwgdGhpcy5faXRlbXMudmFsdWVbcmVsYXRlZF1bK2luZGV4XSk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdGhpcy5fc2VsZWN0ZWRJbmRleC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXgubmV4dCh7Li4uY3VycmVudFZhbHVlcywgW3JlbGF0ZWRdOiAraW5kZXh9KTtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gdGhpcy5faXRlbXMudmFsdWVbcmVsYXRlZF1bK2luZGV4XS5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgICBlbC5zY3JvbGxJbnRvVmlldyh7aW5saW5lOiAnbmVhcmVzdCcsIGJsb2NrOiAnbmVhcmVzdCcsIGJlaGF2aW9yOiAnc21vb3RoJ30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5fYWN0aXZlQ2xhc3NUYWIudmFsdWVbcmVsYXRlZF07XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4UHJldmlldyA9IHRoaXMuX3NlbGVjdGVkSW5kZXgudmFsdWU/LltyZWxhdGVkXTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEluZGV4UHJldmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1zLnZhbHVlPy5bcmVsYXRlZF0/LltzZWxlY3RlZEluZGV4UHJldmlld10/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdEhUTUxFbGVtZW50KHJlbGF0ZWQ6IHN0cmluZywgZWw6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hcHBseUFjdGl2ZUNsYXNzRm9yVGFiKHJlbGF0ZWQsIGVsKTtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlcyA9IHRoaXMuX3NlbGVjdGVkSW5kZXgudmFsdWU7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5faXRlbXMudmFsdWVbcmVsYXRlZF0uZmluZEluZGV4KHYgPT4gdiA9PT0gZWwpO1xuXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXgubmV4dCh7Li4uY3VycmVudFZhbHVlcywgW3JlbGF0ZWRdOiBpbmRleH0pO1xuICAgICAgICBpbnRlcnZhbCgxMCkucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKCkgPT4gZWwubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7aW5saW5lOiAnbmVhcmVzdCcsIGJsb2NrOiAnbmVhcmVzdCcsIGJlaGF2aW9yOiAnc21vb3RoJ30pLFxuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RlZFRhYihyZWxhdGVkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSW5kZXgucGlwZShcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyKSA9PiBwcmV2W3JlbGF0ZWRdID09PSBjdXJyW3JlbGF0ZWRdKSxcbiAgICAgICAgICAgIG1hcCh2ID0+IHZbcmVsYXRlZF0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRBY3RpdmVDbGFzc1RhYihyZWxhdGVkOiBzdHJpbmcsIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJWYWx1ZSA9IHRoaXMuX2FjdGl2ZUNsYXNzVGFiLnZhbHVlO1xuICAgICAgICB0aGlzLl9hY3RpdmVDbGFzc1RhYi5uZXh0KHsuLi5jdXJyVmFsdWUsIFtyZWxhdGVkXTogY2xhc3NOYW1lfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3Ryb3lDYXJvdXNlbChyZWxhdGVkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faXRlbXMudmFsdWVbcmVsYXRlZF0gPSBbXTtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleC52YWx1ZVtyZWxhdGVkXSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUNsYXNzVGFiLnZhbHVlW3JlbGF0ZWRdID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2Nyb2xsU3RlcCQudmFsdWVbcmVsYXRlZF0gPSBudWxsO1xuICAgICAgICB0aGlzLl9jdXJyZW50U2xpZGVyU2hpZnQkLnZhbHVlW3JlbGF0ZWRdID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbGFzdFZpc2libGVJbmRleEVuZCQudmFsdWVbcmVsYXRlZF0gPSBudWxsO1xuICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZUluZGV4JC52YWx1ZVtyZWxhdGVkXSA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBseUFjdGl2ZUNsYXNzRm9yVGFiKHJlbGF0ZWQ6IHN0cmluZywgZWw6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5fYWN0aXZlQ2xhc3NUYWIudmFsdWVbcmVsYXRlZF07XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXhQcmV2aWV3ID0gdGhpcy5fc2VsZWN0ZWRJbmRleC52YWx1ZVtyZWxhdGVkXTtcbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXhQcmV2aWV3ISA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9pdGVtcy52YWx1ZVtyZWxhdGVkXVtzZWxlY3RlZEluZGV4UHJldmlldyFdPy5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICB9XG5cbn1cbiJdfQ==