ngx-virtual-swiper
Version:
Swiper with virtual scroll.
150 lines • 22.6 kB
JavaScript
import { Directionality } from '@angular/cdk/bidi';
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
import { Directive, HostListener, Inject, Input, Optional } from '@angular/core';
import { Subscription } from 'rxjs';
import { NgxVirtualSwiperOptions } from './options';
import { getClickPositions, getTouchPositions, isNumber } from './utils';
const VERTICAL_ORIENTATION = 'vertical';
const HORIZONTAL_ORIENTATION = 'horizontal';
const RIGHT_TO_LEFT = 'rtl';
export class NgxVirtualSwiperDirective {
constructor(options,
/** to lean more see https://material.angular.io/cdk/scrolling/api */
cdk, dir) {
this.options = options;
this.cdk = cdk;
this.dir = dir;
this.subscription = new Subscription();
// eslint-disable-next-line @typescript-eslint/member-ordering
this.onMousedown = (e) => this.start(getClickPositions(e));
this.onTouchstart = (e) => this.start(getTouchPositions(e));
this.onMousemove = (e) => this.move(getClickPositions(e));
this.onTouchmove = (e) => this.move(getTouchPositions(e));
this.onFinish = () => {
if (this.swiped) {
this.toggleSwiped(false);
this.finalize();
}
};
/** the bug-fix to prevent dragging images while swiping */
this.onDragstart = (e) => e.preventDefault();
this.mousemoveX = (e) => {
if (e) {
const offset = this.cdk.measureScrollOffset();
const c = this.rtl ? -1 : 1;
const delta = (this.clientX - e.clientX) * c;
const value = offset + delta;
if (value >= 0 && value <= this.scrollSize) {
this.cdk.scrollToOffset(Math.abs(value));
this.clientX = e.clientX;
}
}
};
this.mousemoveY = (e) => {
if (e) {
const offset = this.cdk.measureScrollOffset();
const value = offset - e.clientY + this.clientY;
if (value >= 0 && value <= this.scrollSize) {
this.cdk.scrollToOffset(value);
this.clientY = e.clientY;
}
}
};
this.start = (e) => {
this.toggleSwiped(true);
this.clientX = e.clientX;
this.clientY = e.clientY;
this.prevClientX = e.clientX;
this.prevClientY = e.clientY;
};
this.move = (e) => {
if (this.swiped) {
if (this.cdk.orientation === HORIZONTAL_ORIENTATION) {
this.mousemoveX(e);
}
else if (this.cdk.orientation === VERTICAL_ORIENTATION) {
this.mousemoveY(e);
}
}
};
this.toggleSwiped = (value) => {
this.swiped = value;
};
this.finalize = () => {
if (this.options.finalize) {
this.scrollToNearestIndex();
}
};
this.scrollToNearestIndex = () => {
const delta = this.cdk.orientation === HORIZONTAL_ORIENTATION ? this.prevClientX - this.clientX :
this.cdk.orientation === VERTICAL_ORIENTATION ? this.prevClientY - this.clientY :
null;
if (isNumber(delta)) {
const directionDelta = this.rtl ? delta * -1 : delta;
const index = directionDelta > 0 && Math.abs(directionDelta) >= this.options.threshold ? this.index + 1 : this.index;
this.cdk.scrollToIndex(index, 'smooth');
}
};
this.addEventListener = () => {
this.cdk.elementRef.nativeElement.addEventListener('click', this.preventClicks, true);
};
this.removeEventListener = () => {
this.cdk.elementRef.nativeElement.removeEventListener('click', this.preventClicks, true);
};
/** prevent all type of clicks (e.g. click on links, Angular`s click) */
this.preventClicks = (e) => {
if (this.changed && this.options.preventClicks) {
e.stopPropagation();
e.preventDefault();
e.stopImmediatePropagation();
}
};
}
ngOnInit() {
this.addEventListener();
this.subscription.add(this.cdk.scrolledIndexChange.subscribe(i => this.index = i));
}
ngOnDestroy() {
this.removeEventListener();
this.subscription.unsubscribe();
}
get changed() {
let result = false;
if (isNumber(this.prevClientX) && isNumber(this.options.threshold)) {
const deltaX = Math.abs(this.prevClientX - this.clientX);
result = deltaX >= this.options.threshold;
}
if (isNumber(this.prevClientY) && isNumber(this.options.threshold)) {
const deltaY = Math.abs(this.prevClientY - this.clientY);
result = result || deltaY >= this.options.threshold;
}
return result;
}
get rtl() {
var _a;
return ((_a = this.dir) === null || _a === void 0 ? void 0 : _a.value) === RIGHT_TO_LEFT;
}
get scrollSize() {
return this.cdk.getDataLength() * this.itemSize;
}
}
NgxVirtualSwiperDirective.decorators = [
{ type: Directive, args: [{
selector: '[ngxVirtualSwiper]'
},] }
];
NgxVirtualSwiperDirective.ctorParameters = () => [
{ type: NgxVirtualSwiperOptions, decorators: [{ type: Inject, args: [NgxVirtualSwiperOptions,] }] },
{ type: CdkVirtualScrollViewport, decorators: [{ type: Inject, args: [CdkVirtualScrollViewport,] }] },
{ type: Directionality, decorators: [{ type: Optional }, { type: Inject, args: [Directionality,] }] }
];
NgxVirtualSwiperDirective.propDecorators = {
itemSize: [{ type: Input }],
onMousedown: [{ type: HostListener, args: ['mousedown', ['$event'],] }],
onTouchstart: [{ type: HostListener, args: ['touchstart', ['$event'],] }],
onMousemove: [{ type: HostListener, args: ['mousemove', ['$event'],] }],
onTouchmove: [{ type: HostListener, args: ['touchmove', ['$event'],] }],
onFinish: [{ type: HostListener, args: ['document:mouseup',] }, { type: HostListener, args: ['touchend',] }],
onDragstart: [{ type: HostListener, args: ['document:dragstart', ['$event'],] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXZpcnR1YWwtc3dpcGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12aXJ0dWFsLXN3aXBlci9zcmMvbGliL25neC12aXJ0dWFsLXN3aXBlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXpFLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDO0FBQ3hDLE1BQU0sc0JBQXNCLEdBQUcsWUFBWSxDQUFDO0FBQzVDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQztBQUs1QixNQUFNLE9BQU8seUJBQXlCO0lBV2xDLFlBQzZDLE9BQWdDO0lBQ3pFLHFFQUFxRTtJQUMzQixHQUE2QixFQUMzQixHQUFvQjtRQUh2QixZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUUvQixRQUFHLEdBQUgsR0FBRyxDQUEwQjtRQUMzQixRQUFHLEdBQUgsR0FBRyxDQUFpQjtRQVpwRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUF5QmxELDhEQUE4RDtRQUV2RCxnQkFBVyxHQUFHLENBQUMsQ0FBaUIsRUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FB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QnZCLE1BQU0sU0FBQyx1QkFBdUI7WUExQjlCLHdCQUF3Qix1QkE0QnhCLE1BQU0sU0FBQyx3QkFBd0I7WUE3Qi9CLGNBQWMsdUJBOEJkLFFBQVEsWUFBSSxNQUFNLFNBQUMsY0FBYzs7O3VCQWJyQyxLQUFLOzBCQTJCTCxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDOzJCQUdwQyxZQUFZLFNBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDOzBCQUdyQyxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDOzBCQUdwQyxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO3VCQUdwQyxZQUFZLFNBQUMsa0JBQWtCLGNBQy9CLFlBQVksU0FBQyxVQUFVOzBCQVN2QixZQUFZLFNBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ3hWaXJ0dWFsU3dpcGVyT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBJUG9zaXRpb25FdmVudCB9IGZyb20gJy4vcG9zaXRpb24tZXZlbnQnO1xuaW1wb3J0IHsgZ2V0Q2xpY2tQb3NpdGlvbnMsIGdldFRvdWNoUG9zaXRpb25zLCBpc051bWJlciB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBWRVJUSUNBTF9PUklFTlRBVElPTiA9ICd2ZXJ0aWNhbCc7XG5jb25zdCBIT1JJWk9OVEFMX09SSUVOVEFUSU9OID0gJ2hvcml6b250YWwnO1xuY29uc3QgUklHSFRfVE9fTEVGVCA9ICdydGwnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tuZ3hWaXJ0dWFsU3dpcGVyXSdcbn0pXG5leHBvcnQgY2xhc3MgTmd4VmlydHVhbFN3aXBlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtU2l6ZTogbnVtYmVyO1xuICAgIHB1YmxpYyByZWFkb25seSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgcHVibGljIGluZGV4OiBudW1iZXI7XG4gICAgcHVibGljIHN3aXBlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgY2xpZW50WDogbnVtYmVyO1xuICAgIHB1YmxpYyBjbGllbnRZOiBudW1iZXI7XG4gICAgcHVibGljIHByZXZDbGllbnRYOiBudW1iZXI7XG4gICAgcHVibGljIHByZXZDbGllbnRZOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoTmd4VmlydHVhbFN3aXBlck9wdGlvbnMpIHByaXZhdGUgb3B0aW9uczogTmd4VmlydHVhbFN3aXBlck9wdGlvbnMsXG4gICAgICAgIC8qKiB0byBsZWFuIG1vcmUgc2VlIGh0dHBzOi8vbWF0ZXJpYWwuYW5ndWxhci5pby9jZGsvc2Nyb2xsaW5nL2FwaSAqL1xuICAgICAgICBASW5qZWN0KENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkgcHJpdmF0ZSBjZGs6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEaXJlY3Rpb25hbGl0eSkgcHJpdmF0ZSBkaXI/OiBEaXJlY3Rpb25hbGl0eVxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5jZGsuc2Nyb2xsZWRJbmRleENoYW5nZS5zdWJzY3JpYmUoaSA9PiB0aGlzLmluZGV4ID0gaSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbk1vdXNlZG93biA9IChlOiBJUG9zaXRpb25FdmVudCk6IHZvaWQgPT4gdGhpcy5zdGFydChnZXRDbGlja1Bvc2l0aW9ucyhlKSk7XG5cbiAgICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Ub3VjaHN0YXJ0ID0gKGU6IHsgdG91Y2hlczogSVBvc2l0aW9uRXZlbnRbXSB9KTogdm9pZCA9PiB0aGlzLnN0YXJ0KGdldFRvdWNoUG9zaXRpb25zKGUpKTtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbW92ZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uTW91c2Vtb3ZlID0gKGU6IElQb3NpdGlvbkV2ZW50KTogdm9pZCA9PiB0aGlzLm1vdmUoZ2V0Q2xpY2tQb3NpdGlvbnMoZSkpO1xuXG4gICAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Ub3VjaG1vdmUgPSAoZTogeyB0b3VjaGVzOiBJUG9zaXRpb25FdmVudFtdIH0pOiB2b2lkID0+IHRoaXMubW92ZShnZXRUb3VjaFBvc2l0aW9ucyhlKSk7XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZXVwJylcbiAgICBASG9zdExpc3RlbmVyKCd0b3VjaGVuZCcpXG4gICAgcHVibGljIG9uRmluaXNoID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5zd2lwZWQpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlU3dpcGVkKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemUoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogdGhlIGJ1Zy1maXggdG8gcHJldmVudCBkcmFnZ2luZyBpbWFnZXMgd2hpbGUgc3dpcGluZyAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmRyYWdzdGFydCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uRHJhZ3N0YXJ0ID0gKGU6IHsgcHJldmVudERlZmF1bHQ6IGFueSB9KTogdm9pZCA9PiBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBwdWJsaWMgZ2V0IGNoYW5nZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGlzTnVtYmVyKHRoaXMucHJldkNsaWVudFgpICYmIGlzTnVtYmVyKHRoaXMub3B0aW9ucy50aHJlc2hvbGQpKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YVggPSBNYXRoLmFicyh0aGlzLnByZXZDbGllbnRYIC0gdGhpcy5jbGllbnRYKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGRlbHRhWCA+PSB0aGlzLm9wdGlvbnMudGhyZXNob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bWJlcih0aGlzLnByZXZDbGllbnRZKSAmJiBpc051bWJlcih0aGlzLm9wdGlvbnMudGhyZXNob2xkKSkge1xuICAgICAgICAgICAgY29uc3QgZGVsdGFZID0gTWF0aC5hYnModGhpcy5wcmV2Q2xpZW50WSAtIHRoaXMuY2xpZW50WSk7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwgZGVsdGFZID49IHRoaXMub3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ0bCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyPy52YWx1ZSA9PT0gUklHSFRfVE9fTEVGVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNjcm9sbFNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2RrLmdldERhdGFMZW5ndGgoKSAqIHRoaXMuaXRlbVNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIG1vdXNlbW92ZVggPSAoZTogSVBvc2l0aW9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuY2RrLm1lYXN1cmVTY3JvbGxPZmZzZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IGMgPSB0aGlzLnJ0bCA/IC0xIDogMTtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gKHRoaXMuY2xpZW50WCAtIGUuY2xpZW50WCkgKiBjO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvZmZzZXQgKyBkZWx0YTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IHRoaXMuc2Nyb2xsU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrLnNjcm9sbFRvT2Zmc2V0KE1hdGguYWJzKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGllbnRYID0gZS5jbGllbnRYO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBtb3VzZW1vdmVZID0gKGU6IElQb3NpdGlvbkV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmNkay5tZWFzdXJlU2Nyb2xsT2Zmc2V0KCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9mZnNldCAtIGUuY2xpZW50WSArIHRoaXMuY2xpZW50WTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IHRoaXMuc2Nyb2xsU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrLnNjcm9sbFRvT2Zmc2V0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWVudFkgPSBlLmNsaWVudFk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIHN0YXJ0ID0gKGU6IElQb3NpdGlvbkV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMudG9nZ2xlU3dpcGVkKHRydWUpO1xuICAgICAgICB0aGlzLmNsaWVudFggPSBlLmNsaWVudFg7XG4gICAgICAgIHRoaXMuY2xpZW50WSA9IGUuY2xpZW50WTtcbiAgICAgICAgdGhpcy5wcmV2Q2xpZW50WCA9IGUuY2xpZW50WDtcbiAgICAgICAgdGhpcy5wcmV2Q2xpZW50WSA9IGUuY2xpZW50WTtcbiAgICB9O1xuXG4gICAgcHVibGljIG1vdmUgPSAoZTogSVBvc2l0aW9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3dpcGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jZGsub3JpZW50YXRpb24gPT09IEhPUklaT05UQUxfT1JJRU5UQVRJT04pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdXNlbW92ZVgoZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2RrLm9yaWVudGF0aW9uID09PSBWRVJUSUNBTF9PUklFTlRBVElPTikge1xuICAgICAgICAgICAgICAgIHRoaXMubW91c2Vtb3ZlWShlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgdG9nZ2xlU3dpcGVkID0gKHZhbHVlOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc3dpcGVkID0gdmFsdWU7XG4gICAgfTtcblxuICAgIHB1YmxpYyBmaW5hbGl6ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5maW5hbGl6ZSkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb05lYXJlc3RJbmRleCgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBzY3JvbGxUb05lYXJlc3RJbmRleCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB0aGlzLmNkay5vcmllbnRhdGlvbiA9PT0gSE9SSVpPTlRBTF9PUklFTlRBVElPTiA/IHRoaXMucHJldkNsaWVudFggLSB0aGlzLmNsaWVudFggOlxuICAgICAgICAgICAgdGhpcy5jZGsub3JpZW50YXRpb24gPT09IFZFUlRJQ0FMX09SSUVOVEFUSU9OID8gdGhpcy5wcmV2Q2xpZW50WSAtIHRoaXMuY2xpZW50WSA6XG4gICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgaWYgKGlzTnVtYmVyKGRlbHRhKSkge1xuICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uRGVsdGEgPSB0aGlzLnJ0bCA/IGRlbHRhICogLTEgOiBkZWx0YTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGlyZWN0aW9uRGVsdGEgPiAwICYmIE1hdGguYWJzKGRpcmVjdGlvbkRlbHRhKSA+PSB0aGlzLm9wdGlvbnMudGhyZXNob2xkID8gdGhpcy5pbmRleCArIDEgOiB0aGlzLmluZGV4O1xuICAgICAgICAgICAgdGhpcy5jZGsuc2Nyb2xsVG9JbmRleChpbmRleCwgJ3Ntb290aCcpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmNkay5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnByZXZlbnRDbGlja3MsIHRydWUpO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5jZGsuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5wcmV2ZW50Q2xpY2tzLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgLyoqIHByZXZlbnQgYWxsIHR5cGUgb2YgY2xpY2tzIChlLmcuIGNsaWNrIG9uIGxpbmtzLCBBbmd1bGFyYHMgY2xpY2spICovXG4gICAgcHVibGljIHByZXZlbnRDbGlja3MgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGFuZ2VkICYmIHRoaXMub3B0aW9ucy5wcmV2ZW50Q2xpY2tzKSB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iXX0=