ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
160 lines • 21.6 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 { Directive, EventEmitter, Output } from '@angular/core';
import { fromEvent, Subscription } from 'rxjs';
import * as i0 from "@angular/core";
const MIN_SWIPE_DISTANCE = 0.1;
const STOP_SWIPE_DISTANCE = 0.01;
const REFRESH_INTERVAL = 20;
const SPEED_OFF_MULTIPLE = 0.995 ** REFRESH_INTERVAL;
export class NzTabScrollListDirective {
constructor(ngZone, elementRef) {
this.ngZone = ngZone;
this.elementRef = elementRef;
this.lastWheelDirection = null;
this.lastWheelTimestamp = 0;
this.lastTimestamp = 0;
this.lastTimeDiff = 0;
this.lastMixedWheel = 0;
this.lastWheelPrevent = false;
this.touchPosition = null;
this.lastOffset = null;
this.motion = -1;
this.unsubscribe = () => void 0;
this.offsetChange = new EventEmitter();
this.tabScroll = new EventEmitter();
this.onTouchEnd = (e) => {
if (!this.touchPosition) {
return;
}
const lastOffset = this.lastOffset;
const lastTimeDiff = this.lastTimeDiff;
this.lastOffset = this.touchPosition = null;
if (lastOffset) {
const distanceX = lastOffset.x / lastTimeDiff;
const distanceY = lastOffset.y / lastTimeDiff;
const absX = Math.abs(distanceX);
const absY = Math.abs(distanceY);
// Skip swipe if low distance
if (Math.max(absX, absY) < MIN_SWIPE_DISTANCE) {
return;
}
let currentX = distanceX;
let currentY = distanceY;
this.motion = window.setInterval(() => {
if (Math.abs(currentX) < STOP_SWIPE_DISTANCE && Math.abs(currentY) < STOP_SWIPE_DISTANCE) {
window.clearInterval(this.motion);
return;
}
currentX *= SPEED_OFF_MULTIPLE;
currentY *= SPEED_OFF_MULTIPLE;
this.onOffset(currentX * REFRESH_INTERVAL, currentY * REFRESH_INTERVAL, e);
}, REFRESH_INTERVAL);
}
};
this.onTouchMove = (e) => {
if (!this.touchPosition) {
return;
}
e.preventDefault();
const { screenX, screenY } = e.touches[0];
const offsetX = screenX - this.touchPosition.x;
const offsetY = screenY - this.touchPosition.y;
this.onOffset(offsetX, offsetY, e);
const now = Date.now();
this.lastTimeDiff = now - this.lastTimestamp;
this.lastTimestamp = now;
this.lastOffset = { x: offsetX, y: offsetY };
this.touchPosition = { x: screenX, y: screenY };
};
this.onTouchStart = (e) => {
const { screenX, screenY } = e.touches[0];
this.touchPosition = { x: screenX, y: screenY };
window.clearInterval(this.motion);
};
this.onWheel = (e) => {
const { deltaX, deltaY } = e;
let mixed;
const absX = Math.abs(deltaX);
const absY = Math.abs(deltaY);
if (absX === absY) {
mixed = this.lastWheelDirection === 'x' ? deltaX : deltaY;
}
else if (absX > absY) {
mixed = deltaX;
this.lastWheelDirection = 'x';
}
else {
mixed = deltaY;
this.lastWheelDirection = 'y';
}
// Optimize mac touch scroll
const now = Date.now();
const absMixed = Math.abs(mixed);
if (now - this.lastWheelTimestamp > 100 || absMixed - this.lastMixedWheel > 10) {
this.lastWheelPrevent = false;
}
this.onOffset(-mixed, -mixed, e);
if (e.defaultPrevented || this.lastWheelPrevent) {
this.lastWheelPrevent = true;
}
this.lastWheelTimestamp = now;
this.lastMixedWheel = absMixed;
};
}
ngOnInit() {
this.unsubscribe = this.ngZone.runOutsideAngular(() => {
const el = this.elementRef.nativeElement;
const wheel$ = fromEvent(el, 'wheel');
const touchstart$ = fromEvent(el, 'touchstart');
const touchmove$ = fromEvent(el, 'touchmove');
const touchend$ = fromEvent(el, 'touchend');
const subscription = new Subscription();
subscription.add(this.subscribeWrap('wheel', wheel$, this.onWheel));
subscription.add(this.subscribeWrap('touchstart', touchstart$, this.onTouchStart));
subscription.add(this.subscribeWrap('touchmove', touchmove$, this.onTouchMove));
subscription.add(this.subscribeWrap('touchend', touchend$, this.onTouchEnd));
return () => {
subscription.unsubscribe();
};
});
}
subscribeWrap(type, observable, handler) {
return observable.subscribe(event => {
this.tabScroll.emit({
type,
event
});
if (!event.defaultPrevented) {
handler(event);
}
});
}
onOffset(x, y, event) {
this.ngZone.run(() => {
this.offsetChange.emit({
x,
y,
event
});
});
}
ngOnDestroy() {
this.unsubscribe();
}
}
NzTabScrollListDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NzTabScrollListDirective, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
NzTabScrollListDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.5", type: NzTabScrollListDirective, selector: "[nzTabScrollList]", outputs: { offsetChange: "offsetChange", tabScroll: "tabScroll" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NzTabScrollListDirective, decorators: [{
type: Directive,
args: [{
selector: '[nzTabScrollList]'
}]
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }]; }, propDecorators: { offsetChange: [{
type: Output
}], tabScroll: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLXNjcm9sbC1saXN0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvdGFicy90YWItc2Nyb2xsLWxpc3QuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUE2QixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBUzNELE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBQy9CLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxJQUFJLGdCQUFnQixDQUFDO0FBS3JELE1BQU0sT0FBTyx3QkFBd0I7SUFnQm5DLFlBQW9CLE1BQWMsRUFBVSxVQUFtQztRQUEzRCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVUsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFmL0UsdUJBQWtCLEdBQXFCLElBQUksQ0FBQztRQUM1Qyx1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDdkIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFDakIsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFDbkIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGtCQUFhLEdBQWlDLElBQUksQ0FBQztRQUNuRCxlQUFVLEdBQWlDLElBQUksQ0FBQztRQUNoRCxXQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFWixnQkFBVyxHQUFlLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQThCLENBQUM7UUFDOUQsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFvQixD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QUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7aUJBQzlCO3NIQWNvQixZQUFZO3NCQUE5QixNQUFNO2dCQUNZLFNBQVM7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBOelRhYlNjcm9sbEV2ZW50LFxuICBOelRhYlNjcm9sbEV2ZW50SGFuZGxlckZ1bixcbiAgTnpUYWJTY3JvbGxMaXN0T2Zmc2V0LFxuICBOelRhYlNjcm9sbExpc3RPZmZzZXRFdmVudFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5jb25zdCBNSU5fU1dJUEVfRElTVEFOQ0UgPSAwLjE7XG5jb25zdCBTVE9QX1NXSVBFX0RJU1RBTkNFID0gMC4wMTtcbmNvbnN0IFJFRlJFU0hfSU5URVJWQUwgPSAyMDtcbmNvbnN0IFNQRUVEX09GRl9NVUxUSVBMRSA9IDAuOTk1ICoqIFJFRlJFU0hfSU5URVJWQUw7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuelRhYlNjcm9sbExpc3RdJ1xufSlcbmV4cG9ydCBjbGFzcyBOelRhYlNjcm9sbExpc3REaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGxhc3RXaGVlbERpcmVjdGlvbjogJ3gnIHwgJ3knIHwgbnVsbCA9IG51bGw7XG4gIGxhc3RXaGVlbFRpbWVzdGFtcCA9IDA7XG4gIGxhc3RUaW1lc3RhbXAgPSAwO1xuICBsYXN0VGltZURpZmYgPSAwO1xuICBsYXN0TWl4ZWRXaGVlbCA9IDA7XG4gIGxhc3RXaGVlbFByZXZlbnQgPSBmYWxzZTtcbiAgdG91Y2hQb3NpdGlvbjogTnpUYWJTY3JvbGxMaXN0T2Zmc2V0IHwgbnVsbCA9IG51bGw7XG4gIGxhc3RPZmZzZXQ6IE56VGFiU2Nyb2xsTGlzdE9mZnNldCB8IG51bGwgPSBudWxsO1xuICBtb3Rpb24gPSAtMTtcblxuICB1bnN1YnNjcmliZTogKCkgPT4gdm9pZCA9ICgpID0+IHZvaWQgMDtcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgb2Zmc2V0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOelRhYlNjcm9sbExpc3RPZmZzZXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHRhYlNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8TnpUYWJTY3JvbGxFdmVudD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lLCBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUgPSB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICBjb25zdCB3aGVlbCQgPSBmcm9tRXZlbnQ8V2hlZWxFdmVudD4oZWwsICd3aGVlbCcpO1xuICAgICAgY29uc3QgdG91Y2hzdGFydCQgPSBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oZWwsICd0b3VjaHN0YXJ0Jyk7XG4gICAgICBjb25zdCB0b3VjaG1vdmUkID0gZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGVsLCAndG91Y2htb3ZlJyk7XG4gICAgICBjb25zdCB0b3VjaGVuZCQgPSBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oZWwsICd0b3VjaGVuZCcpO1xuXG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICBzdWJzY3JpcHRpb24uYWRkKHRoaXMuc3Vic2NyaWJlV3JhcCgnd2hlZWwnLCB3aGVlbCQsIHRoaXMub25XaGVlbCkpO1xuICAgICAgc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnN1YnNjcmliZVdyYXAoJ3RvdWNoc3RhcnQnLCB0b3VjaHN0YXJ0JCwgdGhpcy5vblRvdWNoU3RhcnQpKTtcbiAgICAgIHN1YnNjcmlwdGlvbi5hZGQodGhpcy5zdWJzY3JpYmVXcmFwKCd0b3VjaG1vdmUnLCB0b3VjaG1vdmUkLCB0aGlzLm9uVG91Y2hNb3ZlKSk7XG4gICAgICBzdWJzY3JpcHRpb24uYWRkKHRoaXMuc3Vic2NyaWJlV3JhcCgndG91Y2hlbmQnLCB0b3VjaGVuZCQsIHRoaXMub25Ub3VjaEVuZCkpO1xuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzdWJzY3JpYmVXcmFwPFQgZXh0ZW5kcyBOelRhYlNjcm9sbEV2ZW50WydldmVudCddPihcbiAgICB0eXBlOiBOelRhYlNjcm9sbEV2ZW50Wyd0eXBlJ10sXG4gICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxUPixcbiAgICBoYW5kbGVyOiBOelRhYlNjcm9sbEV2ZW50SGFuZGxlckZ1bjxUPlxuICApOiBTdWJzY3JpcHRpb24ge1xuICAgIHJldHVybiBvYnNlcnZhYmxlLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICB0aGlzLnRhYlNjcm9sbC5lbWl0KHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgZXZlbnRcbiAgICAgIH0gYXMgTnpUYWJTY3JvbGxFdmVudCk7XG4gICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblRvdWNoRW5kID0gKGU6IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMudG91Y2hQb3NpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXN0T2Zmc2V0ID0gdGhpcy5sYXN0T2Zmc2V0O1xuICAgIGNvbnN0IGxhc3RUaW1lRGlmZiA9IHRoaXMubGFzdFRpbWVEaWZmO1xuXG4gICAgdGhpcy5sYXN0T2Zmc2V0ID0gdGhpcy50b3VjaFBvc2l0aW9uID0gbnVsbDtcblxuICAgIGlmIChsYXN0T2Zmc2V0KSB7XG4gICAgICBjb25zdCBkaXN0YW5jZVggPSBsYXN0T2Zmc2V0LnggLyBsYXN0VGltZURpZmY7XG4gICAgICBjb25zdCBkaXN0YW5jZVkgPSBsYXN0T2Zmc2V0LnkgLyBsYXN0VGltZURpZmY7XG4gICAgICBjb25zdCBhYnNYID0gTWF0aC5hYnMoZGlzdGFuY2VYKTtcbiAgICAgIGNvbnN0IGFic1kgPSBNYXRoLmFicyhkaXN0YW5jZVkpO1xuXG4gICAgICAvLyBTa2lwIHN3aXBlIGlmIGxvdyBkaXN0YW5jZVxuICAgICAgaWYgKE1hdGgubWF4KGFic1gsIGFic1kpIDwgTUlOX1NXSVBFX0RJU1RBTkNFKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGN1cnJlbnRYID0gZGlzdGFuY2VYO1xuICAgICAgbGV0IGN1cnJlbnRZID0gZGlzdGFuY2VZO1xuXG4gICAgICB0aGlzLm1vdGlvbiA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGlmIChNYXRoLmFicyhjdXJyZW50WCkgPCBTVE9QX1NXSVBFX0RJU1RBTkNFICYmIE1hdGguYWJzKGN1cnJlbnRZKSA8IFNUT1BfU1dJUEVfRElTVEFOQ0UpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLm1vdGlvbik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFggKj0gU1BFRURfT0ZGX01VTFRJUExFO1xuICAgICAgICBjdXJyZW50WSAqPSBTUEVFRF9PRkZfTVVMVElQTEU7XG4gICAgICAgIHRoaXMub25PZmZzZXQoY3VycmVudFggKiBSRUZSRVNIX0lOVEVSVkFMLCBjdXJyZW50WSAqIFJFRlJFU0hfSU5URVJWQUwsIGUpO1xuICAgICAgfSwgUkVGUkVTSF9JTlRFUlZBTCk7XG4gICAgfVxuICB9O1xuXG4gIG9uVG91Y2hNb3ZlID0gKGU6IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMudG91Y2hQb3NpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB7IHNjcmVlblgsIHNjcmVlblkgfSA9IGUudG91Y2hlc1swXTtcblxuICAgIGNvbnN0IG9mZnNldFggPSBzY3JlZW5YIC0gdGhpcy50b3VjaFBvc2l0aW9uLng7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IHNjcmVlblkgLSB0aGlzLnRvdWNoUG9zaXRpb24ueTtcbiAgICB0aGlzLm9uT2Zmc2V0KG9mZnNldFgsIG9mZnNldFksIGUpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICB0aGlzLmxhc3RUaW1lRGlmZiA9IG5vdyAtIHRoaXMubGFzdFRpbWVzdGFtcDtcbiAgICB0aGlzLmxhc3RUaW1lc3RhbXAgPSBub3c7XG4gICAgdGhpcy5sYXN0T2Zmc2V0ID0geyB4OiBvZmZzZXRYLCB5OiBvZmZzZXRZIH07XG4gICAgdGhpcy50b3VjaFBvc2l0aW9uID0geyB4OiBzY3JlZW5YLCB5OiBzY3JlZW5ZIH07XG4gIH07XG5cbiAgb25Ub3VjaFN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IHNjcmVlblgsIHNjcmVlblkgfSA9IGUudG91Y2hlc1swXTtcbiAgICB0aGlzLnRvdWNoUG9zaXRpb24gPSB7IHg6IHNjcmVlblgsIHk6IHNjcmVlblkgfTtcbiAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLm1vdGlvbik7XG4gIH07XG5cbiAgb25XaGVlbCA9IChlOiBXaGVlbEV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSB9ID0gZTtcbiAgICBsZXQgbWl4ZWQ6IG51bWJlcjtcbiAgICBjb25zdCBhYnNYID0gTWF0aC5hYnMoZGVsdGFYKTtcbiAgICBjb25zdCBhYnNZID0gTWF0aC5hYnMoZGVsdGFZKTtcblxuICAgIGlmIChhYnNYID09PSBhYnNZKSB7XG4gICAgICBtaXhlZCA9IHRoaXMubGFzdFdoZWVsRGlyZWN0aW9uID09PSAneCcgPyBkZWx0YVggOiBkZWx0YVk7XG4gICAgfSBlbHNlIGlmIChhYnNYID4gYWJzWSkge1xuICAgICAgbWl4ZWQgPSBkZWx0YVg7XG4gICAgICB0aGlzLmxhc3RXaGVlbERpcmVjdGlvbiA9ICd4JztcbiAgICB9IGVsc2Uge1xuICAgICAgbWl4ZWQgPSBkZWx0YVk7XG4gICAgICB0aGlzLmxhc3RXaGVlbERpcmVjdGlvbiA9ICd5JztcbiAgICB9XG5cbiAgICAvLyBPcHRpbWl6ZSBtYWMgdG91Y2ggc2Nyb2xsXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBhYnNNaXhlZCA9IE1hdGguYWJzKG1peGVkKTtcblxuICAgIGlmIChub3cgLSB0aGlzLmxhc3RXaGVlbFRpbWVzdGFtcCA+IDEwMCB8fCBhYnNNaXhlZCAtIHRoaXMubGFzdE1peGVkV2hlZWwgPiAxMCkge1xuICAgICAgdGhpcy5sYXN0V2hlZWxQcmV2ZW50ID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMub25PZmZzZXQoLW1peGVkLCAtbWl4ZWQsIGUpO1xuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQgfHwgdGhpcy5sYXN0V2hlZWxQcmV2ZW50KSB7XG4gICAgICB0aGlzLmxhc3RXaGVlbFByZXZlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMubGFzdFdoZWVsVGltZXN0YW1wID0gbm93O1xuICAgIHRoaXMubGFzdE1peGVkV2hlZWwgPSBhYnNNaXhlZDtcbiAgfTtcblxuICBvbk9mZnNldCh4OiBudW1iZXIsIHk6IG51bWJlciwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMub2Zmc2V0Q2hhbmdlLmVtaXQoe1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBldmVudFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==