@universal-material/angular
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.1.0.
132 lines • 20.4 kB
JavaScript
import { Directive, HostListener, Inject, Input } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import * as i0 from "@angular/core";
export class RippleDirective {
constructor(_elementRef, document) {
this._elementRef = _elementRef;
this.document = document;
this.rippleConfig = {};
this.disabled = false;
this.isTouching = false;
this._mousedown = (e) => {
if (this.disabled ||
this._elementRef.nativeElement.hasAttribute('disabled') ||
this._elementRef.nativeElement.classList.contains('disabled')) {
return;
}
if (!this.isTouching) {
this.createRipple('mouseup', null, e.clientX, e.clientY);
}
};
this._touchstart = (e) => {
if (this.disabled ||
this._elementRef.nativeElement.hasAttribute('disabled') ||
this._elementRef.nativeElement.classList.contains('disabled')) {
return;
}
this.isTouching = true;
this.createRipple('touchend', () => {
setTimeout(() => this.isTouching = false, 100);
}, e.touches[0].clientX, e.touches[0].clientY);
};
}
static _setElementSquareSizeAndCenter(element, size) {
element.style.top = '50%';
element.style.left = '50%';
element.style.width = `${size}px`;
element.style.height = `${size}px`;
element.style.marginLeft = `${-size / 2}px`;
element.style.marginTop = `${-size / 2}px`;
}
ngAfterViewInit() {
const { position } = document.defaultView.getComputedStyle(this._elementRef.nativeElement);
if (position !== 'absolute' &&
position !== 'fixed' &&
(!this.rippleConfig || !this.rippleConfig.dontChangePositioning)) {
this._elementRef.nativeElement.style.position = 'relative';
}
}
createRipple(releaseEventName, releaseCallback, pageX, pageY) {
if (this.disabled ||
this._elementRef.nativeElement.hasAttribute('disabled') ||
this._elementRef.nativeElement.classList.contains('disabled')) {
return;
}
let release;
const cancelRippleIfNecessary = () => {
this._elementRef.nativeElement.removeEventListener("touchmove", cancelRippleIfNecessary);
window.removeEventListener(releaseEventName, cancelRippleIfNecessary);
if (release) {
release();
}
};
this._elementRef.nativeElement.addEventListener("touchmove", cancelRippleIfNecessary);
window.addEventListener(releaseEventName, cancelRippleIfNecessary);
const rippleWrapper = document.createElement('DIV');
rippleWrapper.classList.add('u-ripple-wrapper');
const ripple = document.createElement('DIV');
ripple.classList.add('u-ripple');
rippleWrapper.appendChild(ripple);
this._elementRef.nativeElement.insertAdjacentElement('afterbegin', rippleWrapper);
if (this.rippleConfig.size) {
RippleDirective._setElementSquareSizeAndCenter(rippleWrapper, this.rippleConfig.size);
}
if (this.rippleConfig.borderRadius) {
rippleWrapper.style.borderRadius = this.rippleConfig.borderRadius;
}
release = () => {
if (ripple.classList.contains('dismiss')) {
return;
}
ripple.classList.add('dismiss');
ripple.addEventListener('transitionend', () => {
this._elementRef.nativeElement.removeChild(rippleWrapper);
this._elementRef.nativeElement.removeEventListener('touchend', release);
this._elementRef.nativeElement.removeEventListener('mouseleave', release);
this._elementRef.nativeElement.removeEventListener('mouseup', release);
});
if (releaseCallback) {
releaseCallback();
releaseCallback = null;
}
};
this._elementRef.nativeElement.addEventListener('touchend', release);
this._elementRef.nativeElement.addEventListener('mouseleave', release);
this._elementRef.nativeElement.addEventListener('mouseup', release);
requestAnimationFrame(() => {
const clientRect = this._elementRef.nativeElement.getBoundingClientRect();
const largestDimensionSize = Math.max(rippleWrapper.clientWidth, rippleWrapper.clientHeight);
const rippleSize = this.rippleConfig.size || largestDimensionSize * 2;
RippleDirective._setElementSquareSizeAndCenter(ripple, rippleSize);
ripple.style.transitionDuration = `${1080 * Math.pow(rippleSize, 0.3)}ms, 750ms`;
const x = (pageX - clientRect.left) + ((rippleSize - this._elementRef.nativeElement.clientWidth) / 2);
const y = (pageY - clientRect.top) + ((rippleSize - this._elementRef.nativeElement.clientHeight) / 2);
ripple.style.transformOrigin = `${x}px ${y}px`;
ripple.classList.add('show');
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RippleDirective, deps: [{ token: i0.ElementRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: RippleDirective, selector: "[uRipple]", inputs: { rippleConfig: "rippleConfig", disabled: ["rippleDisabled", "disabled"] }, host: { listeners: { "mousedown": "_mousedown($event)", "touchstart": "_touchstart($event)" } }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RippleDirective, decorators: [{
type: Directive,
args: [{
selector: '[uRipple]',
standalone: false,
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }]; }, propDecorators: { rippleConfig: [{
type: Input
}], disabled: [{
type: Input,
args: ['rippleDisabled']
}], _mousedown: [{
type: HostListener,
args: ['mousedown', ['$event']]
}], _touchstart: [{
type: HostListener,
args: ['touchstart', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9yaXBwbGUvcmlwcGxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBUTNDLE1BQU0sT0FBTyxlQUFlO0lBTzFCLFlBQStCLFdBQW9DLEVBQzdCLFFBQWE7UUFEcEIsZ0JBQVcsR0FBWCxXQUFXLENBQXlCO1FBQzdCLGFBQVEsR0FBUixRQUFRLENBQUs7UUFOMUMsaUJBQVksR0FBaUIsRUFBRSxDQUFDO1FBQ2hCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUMsZUFBVSxHQUFHLEtBQUssQ0FBQztRQWVvQixlQUFVLEdBQUcsQ0FBQyxDQUFhLEVBQUUsRUFBRTtZQUNwRSxJQUFJLElBQUksQ0FBQyxRQUFRO2dCQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQy9ELE9BQU87YUFDUjtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDMUQ7UUFDSCxDQUFDLENBQUE7UUFFdUMsZ0JBQVcsR0FBRyxDQUFDLENBQWEsRUFBRSxFQUFFO1lBQ3RFLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsWUFBWSxD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QWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0RyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV0RyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMvQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBbklVLGVBQWUsNENBUU4sUUFBUTttR0FSakIsZUFBZTs7NEZBQWYsZUFBZTtrQkFKM0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsV0FBVztvQkFDckIsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCOzswQkFTYyxNQUFNOzJCQUFDLFFBQVE7NENBTm5CLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ21CLFFBQVE7c0JBQWhDLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQWlCZ0IsVUFBVTtzQkFBaEQsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBWUcsV0FBVztzQkFBbEQsWUFBWTt1QkFBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBSaXBwbGVDb25maWcgfSBmcm9tICcuL3JpcHBsZS1jb25maWcubW9kZWwnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdVJpcHBsZV0nLFxuICBzdGFuZGFsb25lOiBmYWxzZSxcbn0pXG5leHBvcnQgY2xhc3MgUmlwcGxlRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgQElucHV0KCkgcmlwcGxlQ29uZmlnOiBSaXBwbGVDb25maWcgPSB7fTtcbiAgQElucHV0KCdyaXBwbGVEaXNhYmxlZCcpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgaXNUb3VjaGluZyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSkge1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3NldEVsZW1lbnRTcXVhcmVTaXplQW5kQ2VudGVyKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzaXplOiBudW1iZXIpIHtcbiAgICBlbGVtZW50LnN0eWxlLnRvcCA9ICc1MCUnO1xuICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICc1MCUnO1xuICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtzaXplfXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3NpemV9cHhgO1xuICAgIGVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IGAkey1zaXplIC8gMn1weGA7XG4gICAgZWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSBgJHstc2l6ZSAvIDJ9cHhgO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSkgX21vdXNlZG93biA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHxcbiAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHxcbiAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNUb3VjaGluZykge1xuICAgICAgdGhpcy5jcmVhdGVSaXBwbGUoJ21vdXNldXAnLCBudWxsLCBlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pIF90b3VjaHN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fFxuICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fFxuICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNUb3VjaGluZyA9IHRydWU7XG4gICAgdGhpcy5jcmVhdGVSaXBwbGUoJ3RvdWNoZW5kJywgKCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmlzVG91Y2hpbmcgPSBmYWxzZSwgMTAwKTtcbiAgICB9LCBlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHtwb3NpdGlvbn0gPSBkb2N1bWVudC5kZWZhdWx0VmlldyEuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgaWYgKHBvc2l0aW9uICE9PSAnYWJzb2x1dGUnICYmXG4gICAgICBwb3NpdGlvbiAhPT0gJ2ZpeGVkJyAmJlxuICAgICAgKCF0aGlzLnJpcHBsZUNvbmZpZyB8fCAhdGhpcy5yaXBwbGVDb25maWcuZG9udENoYW5nZVBvc2l0aW9uaW5nKSkge1xuICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gIH1cblxuICBjcmVhdGVSaXBwbGUocmVsZWFzZUV2ZW50TmFtZTogc3RyaW5nLCByZWxlYXNlQ2FsbGJhY2s6IEZ1bmN0aW9uIHwgbnVsbCwgcGFnZVg6IG51bWJlciwgcGFnZVk6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8XG4gICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpIHx8XG4gICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2U6ICgpID0+IHZvaWQ7XG5cbiAgICBjb25zdCBjYW5jZWxSaXBwbGVJZk5lY2Vzc2FyeSA9ICgpID0+IHtcblxuICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgY2FuY2VsUmlwcGxlSWZOZWNlc3NhcnkpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIocmVsZWFzZUV2ZW50TmFtZSwgY2FuY2VsUmlwcGxlSWZOZWNlc3NhcnkpO1xuXG4gICAgICBpZiAocmVsZWFzZSkge1xuICAgICAgICByZWxlYXNlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIGNhbmNlbFJpcHBsZUlmTmVjZXNzYXJ5KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihyZWxlYXNlRXZlbnROYW1lLCBjYW5jZWxSaXBwbGVJZk5lY2Vzc2FyeSk7XG5cbiAgICBjb25zdCByaXBwbGVXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgcmlwcGxlV3JhcHBlci5jbGFzc0xpc3QuYWRkKCd1LXJpcHBsZS13cmFwcGVyJyk7XG5cbiAgICBjb25zdCByaXBwbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICByaXBwbGUuY2xhc3NMaXN0LmFkZCgndS1yaXBwbGUnKTtcbiAgICByaXBwbGVXcmFwcGVyLmFwcGVuZENoaWxkKHJpcHBsZSk7XG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJiZWdpbicsIHJpcHBsZVdyYXBwZXIpO1xuXG4gICAgaWYgKHRoaXMucmlwcGxlQ29uZmlnLnNpemUpIHtcbiAgICAgIFJpcHBsZURpcmVjdGl2ZS5fc2V0RWxlbWVudFNxdWFyZVNpemVBbmRDZW50ZXIocmlwcGxlV3JhcHBlciwgdGhpcy5yaXBwbGVDb25maWcuc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmlwcGxlQ29uZmlnLmJvcmRlclJhZGl1cykge1xuICAgICAgcmlwcGxlV3JhcHBlci5zdHlsZS5ib3JkZXJSYWRpdXMgPSB0aGlzLnJpcHBsZUNvbmZpZy5ib3JkZXJSYWRpdXM7XG4gICAgfVxuXG4gICAgcmVsZWFzZSA9ICgpID0+IHtcblxuICAgICAgaWYgKHJpcHBsZS5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc21pc3MnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJpcHBsZS5jbGFzc0xpc3QuYWRkKCdkaXNtaXNzJyk7XG5cbiAgICAgIHJpcHBsZS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQ2hpbGQocmlwcGxlV3JhcHBlcik7XG4gICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHJlbGVhc2UpO1xuICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHJlbGVhc2UpO1xuICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHJlbGVhc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZWxlYXNlQ2FsbGJhY2spIHtcbiAgICAgICAgcmVsZWFzZUNhbGxiYWNrKCk7XG4gICAgICAgIHJlbGVhc2VDYWxsYmFjayA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHJlbGVhc2UpO1xuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgcmVsZWFzZSk7XG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCByZWxlYXNlKTtcblxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBjb25zdCBjbGllbnRSZWN0ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgbGFyZ2VzdERpbWVuc2lvblNpemUgPSBNYXRoLm1heChyaXBwbGVXcmFwcGVyLmNsaWVudFdpZHRoLCByaXBwbGVXcmFwcGVyLmNsaWVudEhlaWdodCk7XG4gICAgICBjb25zdCByaXBwbGVTaXplID0gdGhpcy5yaXBwbGVDb25maWcuc2l6ZSB8fCBsYXJnZXN0RGltZW5zaW9uU2l6ZSAqIDI7XG4gICAgICBSaXBwbGVEaXJlY3RpdmUuX3NldEVsZW1lbnRTcXVhcmVTaXplQW5kQ2VudGVyKHJpcHBsZSwgcmlwcGxlU2l6ZSk7XG4gICAgICByaXBwbGUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gYCR7MTA4MCAqIE1hdGgucG93KHJpcHBsZVNpemUsIDAuMyl9bXMsIDc1MG1zYDtcblxuICAgICAgY29uc3QgeCA9IChwYWdlWCAtIGNsaWVudFJlY3QubGVmdCkgKyAoKHJpcHBsZVNpemUgLSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGgpIC8gMik7XG4gICAgICBjb25zdCB5ID0gKHBhZ2VZIC0gY2xpZW50UmVjdC50b3ApICsgKChyaXBwbGVTaXplIC0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCkgLyAyKTtcblxuICAgICAgcmlwcGxlLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IGAke3h9cHggJHt5fXB4YDtcbiAgICAgIHJpcHBsZS5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==