materialize-angular
Version:
Material UI Angular library
265 lines • 18.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: app/completed-components/common/ripple.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Workylab. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://raw.githubusercontent.com/workylab/materialize-angular/master/LICENSE
*/
import { Directive, ElementRef, HostListener, Input, Renderer2 } from '@angular/core';
import { config } from '../../config';
/**
* @record
*/
function Coordinate() { }
if (false) {
/** @type {?} */
Coordinate.prototype.x;
/** @type {?} */
Coordinate.prototype.y;
}
var RippleDirective = /** @class */ (function () {
function RippleDirective(elementRef, renderer) {
this.elementRef = elementRef;
this.renderer = renderer;
this.rippleDuration = 500;
this.isRippleActive = true;
this.isRippleCenter = false;
this.prefix = config.components.prefix;
this.createRipple = this.createRipple.bind(this);
this.element = this.elementRef.nativeElement;
this.renderer.addClass(this.element, this.prefix + "-ripple-element");
}
/**
* @return {?}
*/
RippleDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (!this.isRippleActive) {
this.renderer.addClass(this.element, 'disabled');
}
};
/**
* @param {?} event
* @return {?}
*/
RippleDirective.prototype.createRipple = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (!this.isRippleActive) {
return;
}
/** @type {?} */
var coordinates = this.isRippleCenter
? this.getCoordinatesByCenter()
: this.getCoordinatesByEvent(event);
/** @type {?} */
var radio = this.getRippleRadio(coordinates);
this.renderRipple(radio, coordinates);
};
/**
* @param {?} radio
* @param {?} coordinate
* @return {?}
*/
RippleDirective.prototype.renderRipple = /**
* @param {?} radio
* @param {?} coordinate
* @return {?}
*/
function (radio, coordinate) {
/** @type {?} */
var ripple = this.renderer.createElement('div');
/** @type {?} */
var centerY = coordinate.y - radio;
/** @type {?} */
var centerX = coordinate.x - radio;
this.renderer.addClass(ripple, 'ripple');
this.renderer.setStyle(ripple, 'height', radio * 2 + "px");
this.renderer.setStyle(ripple, 'width', radio * 2 + "px");
this.renderer.setStyle(ripple, 'top', centerY + "px");
this.renderer.setStyle(ripple, 'left', centerX + "px");
this.renderer.insertBefore(this.element, ripple, this.element.firstChild);
this.scaleRipple(ripple);
};
/**
* @return {?}
*/
RippleDirective.prototype.getCoordinatesByCenter = /**
* @return {?}
*/
function () {
var _a = this.element, offsetHeight = _a.offsetHeight, offsetWidth = _a.offsetWidth;
/** @type {?} */
var y = offsetHeight / 2;
/** @type {?} */
var x = offsetWidth / 2;
return { x: x, y: y };
};
/**
* @param {?} event
* @return {?}
*/
RippleDirective.prototype.getCoordinatesByEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var offset = this.getOffset(this.element);
/** @type {?} */
var y = event.pageY - offset.top;
/** @type {?} */
var x = event.pageX - offset.left;
return { x: x, y: y };
};
/**
* @param {?} coordinate
* @return {?}
*/
RippleDirective.prototype.getRippleRadio = /**
* @param {?} coordinate
* @return {?}
*/
function (coordinate) {
/** @type {?} */
var height = Math.max(this.element.offsetHeight - coordinate.y, coordinate.y);
/** @type {?} */
var width = Math.max(this.element.offsetWidth - coordinate.x, coordinate.x);
/** @type {?} */
var radio = Math.hypot(height, width);
return radio;
};
/**
* @param {?} ripple
* @return {?}
*/
RippleDirective.prototype.scaleRipple = /**
* @param {?} ripple
* @return {?}
*/
function (ripple) {
var _this = this;
setTimeout((/**
* @return {?}
*/
function () {
ripple.style.transitionDuration = _this.rippleDuration + "ms";
ripple.style.transform = 'scale(1)';
_this.hideRipple(ripple);
}), 0);
};
/**
* @param {?} ripple
* @return {?}
*/
RippleDirective.prototype.hideRipple = /**
* @param {?} ripple
* @return {?}
*/
function (ripple) {
var _this = this;
setTimeout((/**
* @return {?}
*/
function () {
_this.renderer.setStyle(ripple, 'transitionDuration', _this.rippleDuration + "ms");
_this.renderer.setStyle(ripple, 'opacity', '0');
_this.removeRipple(ripple);
}), this.rippleDuration);
};
/**
* @param {?} ripple
* @return {?}
*/
RippleDirective.prototype.removeRipple = /**
* @param {?} ripple
* @return {?}
*/
function (ripple) {
var _this = this;
setTimeout((/**
* @return {?}
*/
function () {
_this.renderer.removeChild(_this.element, ripple);
}), this.rippleDuration);
};
/**
* @param {?} element
* @return {?}
*/
RippleDirective.prototype.getOffset = /**
* @param {?} element
* @return {?}
*/
function (element) {
/** @type {?} */
var rect = element.getBoundingClientRect();
/** @type {?} */
var top = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
/** @type {?} */
var left = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
/** @type {?} */
var offset = {
left: rect.left + left,
top: rect.top + top
};
return offset;
};
RippleDirective.decorators = [
{ type: Directive, args: [{
selector: "[" + config.components.prefix + "Ripple]"
},] }
];
/** @nocollapse */
RippleDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 }
]; };
RippleDirective.propDecorators = {
rippleDuration: [{ type: Input }],
isRippleActive: [{ type: Input }],
isRippleCenter: [{ type: Input }],
createRipple: [{ type: HostListener, args: ['mousedown', ['$event'],] }]
};
return RippleDirective;
}());
export { RippleDirective };
if (false) {
/** @type {?} */
RippleDirective.prototype.rippleDuration;
/** @type {?} */
RippleDirective.prototype.isRippleActive;
/** @type {?} */
RippleDirective.prototype.isRippleCenter;
/**
* @type {?}
* @private
*/
RippleDirective.prototype.element;
/**
* @type {?}
* @private
*/
RippleDirective.prototype.prefix;
/**
* @type {?}
* @private
*/
RippleDirective.prototype.elementRef;
/**
* @type {?}
* @private
*/
RippleDirective.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdGVyaWFsaXplLWFuZ3VsYXIvIiwic291cmNlcyI6WyJhcHAvY29tcGxldGVkLWNvbXBvbmVudHMvY29tbW9uL3JpcHBsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQzs7OztBQUV0Qyx5QkFHQzs7O0lBRkMsdUJBQVU7O0lBQ1YsdUJBQVU7O0FBR1o7SUFXRSx5QkFBb0IsVUFBc0IsRUFBVSxRQUFtQjtRQUFuRCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQVA5RCxtQkFBYyxHQUFHLEdBQUcsQ0FBQztRQUNyQixtQkFBYyxHQUFHLElBQUksQ0FBQztRQUN0QixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUd4QixXQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFHeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQU0sSUFBSSxDQUFDLE1BQU0sb0JBQWtCLENBQUMsQ0FBQztJQUMxRSxDQUFDOzs7O0lBRUQsa0NBQVE7OztJQUFSO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUM7Ozs7O0lBR0Qsc0NBQVk7Ozs7SUFEWixVQUNhLEtBQVU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsT0FBTztTQUNSOztZQUVLLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYztZQUNyQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDOztZQUUvQixLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7UUFFOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDeEMsQ0FBQzs7Ozs7O0lBRUQsc0NBQVk7Ozs7O0lBQVosVUFBYSxLQUFhLEVBQUUsVUFBc0I7O1lBQzFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7O1lBQzNDLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLEtBQUs7O1lBQzlCLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLEtBQUs7UUFFcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQU0sS0FBSyxHQUFHLENBQUMsT0FBSyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFLLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFNLE9BQU8sT0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBTSxPQUFPLE9BQUssQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixDQUFDOzs7O0lBRUQsZ0RBQXNCOzs7SUFBdEI7UUFDUSxJQUFBLGlCQUE0QyxFQUExQyw4QkFBWSxFQUFFLDRCQUE0Qjs7WUFDNUMsQ0FBQyxHQUFHLFlBQVksR0FBRyxDQUFDOztZQUNwQixDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUM7UUFFekIsT0FBTyxFQUFFLENBQUMsR0FBQSxFQUFFLENBQUMsR0FBQSxFQUFFLENBQUM7SUFDbEIsQ0FBQzs7Ozs7SUFFRCwrQ0FBcUI7Ozs7SUFBckIsVUFBc0IsS0FBVTs7WUFDeEIsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQzs7WUFFckMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUc7O1lBQzVCLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJO1FBRW5DLE9BQU8sRUFBRSxDQUFDLEdBQUEsRUFBRSxDQUFDLEdBQUEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7Ozs7O0lBRUQsd0NBQWM7Ozs7SUFBZCxVQUFlLFVBQXNCOztZQUM3QixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7O1lBQ3pFLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQzs7WUFFdkUsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQztRQUV2QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Ozs7O0lBRUQscUNBQVc7Ozs7SUFBWCxVQUFZLE1BQW1CO1FBQS9CLGlCQU9DO1FBTkMsVUFBVTs7O1FBQUM7WUFDVCxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixHQUFPLEtBQUksQ0FBQyxjQUFjLE9BQUssQ0FBQztZQUMvRCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7WUFFcEMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDOzs7OztJQUVELG9DQUFVOzs7O0lBQVYsVUFBVyxNQUFtQjtRQUE5QixpQkFPQztRQU5DLFVBQVU7OztRQUFDO1lBQ1QsS0FBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLG9CQUFvQixFQUFNLEtBQUksQ0FBQyxjQUFjLE9BQUssQ0FBQyxDQUFDO1lBQ25GLEtBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFL0MsS0FBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixDQUFDLEdBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7Ozs7O0lBRUQsc0NBQVk7Ozs7SUFBWixVQUFhLE1BQW1CO1FBQWhDLGlCQUlDO1FBSEMsVUFBVTs7O1FBQUM7WUFDVCxLQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELENBQUMsR0FBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDMUIsQ0FBQzs7Ozs7SUFFRCxtQ0FBUzs7OztJQUFULFVBQVUsT0FBb0I7O1lBQ3RCLElBQUksR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUU7O1lBQ3RDLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUM7O1lBQzlGLElBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUM7O1lBRWpHLE1BQU0sR0FBRztZQUNiLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUk7WUFDdEIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRztTQUNwQjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O2dCQXBIRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLE1BQUssTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLFlBQVU7aUJBQ2xEOzs7O2dCQVZtQixVQUFVO2dCQUErQixTQUFTOzs7aUNBWW5FLEtBQUs7aUNBQ0wsS0FBSztpQ0FDTCxLQUFLOytCQWtCTCxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDOztJQTZGdkMsc0JBQUM7Q0FBQSxBQXJIRCxJQXFIQztTQWxIWSxlQUFlOzs7SUFDMUIseUNBQThCOztJQUM5Qix5Q0FBK0I7O0lBQy9CLHlDQUFnQzs7Ozs7SUFFaEMsa0NBQTZCOzs7OztJQUM3QixpQ0FBMEM7Ozs7O0lBRTlCLHFDQUE4Qjs7Ozs7SUFBRSxtQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgV29ya3lsYWIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3dvcmt5bGFiL21hdGVyaWFsaXplLWFuZ3VsYXIvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnO1xuXG5pbnRlcmZhY2UgQ29vcmRpbmF0ZSB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IGBbJHsgY29uZmlnLmNvbXBvbmVudHMucHJlZml4IH1SaXBwbGVdYFxufSlcbmV4cG9ydCBjbGFzcyBSaXBwbGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSByaXBwbGVEdXJhdGlvbiA9IDUwMDtcbiAgQElucHV0KCkgaXNSaXBwbGVBY3RpdmUgPSB0cnVlO1xuICBASW5wdXQoKSBpc1JpcHBsZUNlbnRlciA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcHJlZml4ID0gY29uZmlnLmNvbXBvbmVudHMucHJlZml4O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gICAgdGhpcy5jcmVhdGVSaXBwbGUgPSB0aGlzLmNyZWF0ZVJpcHBsZS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnQsIGAkeyB0aGlzLnByZWZpeCB9LXJpcHBsZS1lbGVtZW50YCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNSaXBwbGVBY3RpdmUpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50LCAnZGlzYWJsZWQnKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBjcmVhdGVSaXBwbGUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1JpcHBsZUFjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gdGhpcy5pc1JpcHBsZUNlbnRlclxuICAgICAgPyB0aGlzLmdldENvb3JkaW5hdGVzQnlDZW50ZXIoKVxuICAgICAgOiB0aGlzLmdldENvb3JkaW5hdGVzQnlFdmVudChldmVudCk7XG5cbiAgICBjb25zdCByYWRpbyA9IHRoaXMuZ2V0UmlwcGxlUmFkaW8oY29vcmRpbmF0ZXMpO1xuXG4gICAgdGhpcy5yZW5kZXJSaXBwbGUocmFkaW8sIGNvb3JkaW5hdGVzKTtcbiAgfVxuXG4gIHJlbmRlclJpcHBsZShyYWRpbzogbnVtYmVyLCBjb29yZGluYXRlOiBDb29yZGluYXRlKSB7XG4gICAgY29uc3QgcmlwcGxlID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBjZW50ZXJZID0gY29vcmRpbmF0ZS55IC0gcmFkaW87XG4gICAgY29uc3QgY2VudGVyWCA9IGNvb3JkaW5hdGUueCAtIHJhZGlvO1xuXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhyaXBwbGUsICdyaXBwbGUnKTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocmlwcGxlLCAnaGVpZ2h0JywgYCR7IHJhZGlvICogMiB9cHhgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJpcHBsZSwgJ3dpZHRoJywgYCR7IHJhZGlvICogMiB9cHhgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJpcHBsZSwgJ3RvcCcsIGAkeyBjZW50ZXJZIH1weGApO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocmlwcGxlLCAnbGVmdCcsIGAkeyBjZW50ZXJYIH1weGApO1xuICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgcmlwcGxlLCB0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZCk7XG5cbiAgICB0aGlzLnNjYWxlUmlwcGxlKHJpcHBsZSk7XG4gIH1cblxuICBnZXRDb29yZGluYXRlc0J5Q2VudGVyKCkge1xuICAgIGNvbnN0IHsgb2Zmc2V0SGVpZ2h0LCBvZmZzZXRXaWR0aCB9ID0gdGhpcy5lbGVtZW50O1xuICAgIGNvbnN0IHkgPSBvZmZzZXRIZWlnaHQgLyAyO1xuICAgIGNvbnN0IHggPSBvZmZzZXRXaWR0aCAvIDI7XG5cbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH1cblxuICBnZXRDb29yZGluYXRlc0J5RXZlbnQoZXZlbnQ6IGFueSk6IENvb3JkaW5hdGUge1xuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuZ2V0T2Zmc2V0KHRoaXMuZWxlbWVudCk7XG5cbiAgICBjb25zdCB5ID0gZXZlbnQucGFnZVkgLSBvZmZzZXQudG9wO1xuICAgIGNvbnN0IHggPSBldmVudC5wYWdlWCAtIG9mZnNldC5sZWZ0O1xuXG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG5cbiAgZ2V0UmlwcGxlUmFkaW8oY29vcmRpbmF0ZTogQ29vcmRpbmF0ZSk6IG51bWJlciB7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAtIGNvb3JkaW5hdGUueSwgY29vcmRpbmF0ZS55KTtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCAtIGNvb3JkaW5hdGUueCwgY29vcmRpbmF0ZS54KTtcblxuICAgIGNvbnN0IHJhZGlvID0gTWF0aC5oeXBvdChoZWlnaHQsIHdpZHRoKTtcblxuICAgIHJldHVybiByYWRpbztcbiAgfVxuXG4gIHNjYWxlUmlwcGxlKHJpcHBsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJpcHBsZS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBgJHsgdGhpcy5yaXBwbGVEdXJhdGlvbiB9bXNgO1xuICAgICAgcmlwcGxlLnN0eWxlLnRyYW5zZm9ybSA9ICdzY2FsZSgxKSc7XG5cbiAgICAgIHRoaXMuaGlkZVJpcHBsZShyaXBwbGUpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgaGlkZVJpcHBsZShyaXBwbGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJpcHBsZSwgJ3RyYW5zaXRpb25EdXJhdGlvbicsIGAkeyB0aGlzLnJpcHBsZUR1cmF0aW9uIH1tc2ApO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyaXBwbGUsICdvcGFjaXR5JywgJzAnKTtcblxuICAgICAgdGhpcy5yZW1vdmVSaXBwbGUocmlwcGxlKTtcbiAgICB9LCB0aGlzLnJpcHBsZUR1cmF0aW9uKTtcbiAgfVxuXG4gIHJlbW92ZVJpcHBsZShyaXBwbGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCwgcmlwcGxlKTtcbiAgICB9LCB0aGlzLnJpcHBsZUR1cmF0aW9uKTtcbiAgfVxuXG4gIGdldE9mZnNldChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIHx8IDA7XG4gICAgY29uc3QgbGVmdCA9IHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgfHwgMDtcblxuICAgIGNvbnN0IG9mZnNldCA9IHtcbiAgICAgIGxlZnQ6IHJlY3QubGVmdCArIGxlZnQsXG4gICAgICB0b3A6IHJlY3QudG9wICsgdG9wXG4gICAgfTtcblxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cbn1cbiJdfQ==