igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
336 lines • 24.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, ElementRef, HostListener, Input, NgModule, NgZone, Renderer2 } from '@angular/core';
import { AnimationBuilder, style, animate } from '@angular/animations';
var IgxRippleDirective = /** @class */ (function () {
function IgxRippleDirective(builder, elementRef, renderer, zone) {
this.builder = builder;
this.elementRef = elementRef;
this.renderer = renderer;
this.zone = zone;
/**
* Sets/gets the ripple target.
* ```html
* <div #rippleContainer class="div-1" igxRipple [igxRippleTarget] = "'.div-1'"></div>
* ```
* ```typescript
* \@ViewChild('rippleContainer', {read: IgxRippleDirective})
* public ripple: IgxRippleDirective;
* let rippleTarget = this.ripple.rippleTarget;
* ```
* Can set the ripple to activate on a child element inside the parent where igxRipple is defined.
* ```html
* <div #rippleContainer [igxRippleTarget] = "'#child"'>
* <button id="child">Click</button>
* </div>
* ```
* \@memberof IgxRippleDirective
*/
this.rippleTarget = '';
/**
* Sets/gets the ripple duration(in milliseconds).
* Default value is `600`.
* ```html
* <button #rippleContainer igxRipple [igxRippleDuration] = "800"></button>
* ```
* ```typescript
* \@ViewChild('rippleContainer', {read: IgxRippleDirective})
* public ripple: IgxRippleDirective;
* let rippleDuration = this.ripple.rippleDuration;
* ```
* \@memberof IgxRippleDirective
*/
this.rippleDuration = 600;
/**
* Sets/gets whether the ripple is disabled.
* Default value is `false`.
* ```html
* <button #rippleContainer igxRipple [igxRippleDisabled] = "true"></button>
* ```
* ```typescript
* \@ViewChild('rippleContainer', {read: IgxRippleDirective})
* public ripple: IgxRippleDirective;
* let isRippleDisabled = this.ripple.rippleDisabled;
* ```
* \@memberof IgxRippleDirective
*/
this.rippleDisabled = false;
this.rippleElementClass = 'igx-ripple__inner';
this.rippleHostClass = 'igx-ripple';
this._centered = false;
this.animationQueue = [];
}
Object.defineProperty(IgxRippleDirective.prototype, "centered", {
/**
* Enables/disables the ripple to be centered.
* ```html
* <button #rippleContainer igxRipple [igxRippleCentered] = "true"></button>
* ```
* @memberof IgxRippleDirective
*/
set: /**
* Enables/disables the ripple to be centered.
* ```html
* <button #rippleContainer igxRipple [igxRippleCentered] = "true"></button>
* ```
* \@memberof IgxRippleDirective
* @param {?} value
* @return {?}
*/
function (value) {
this._centered = value || this.centered;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxRippleDirective.prototype, "nativeElement", {
get: /**
* @protected
* @return {?}
*/
function () {
return this.elementRef.nativeElement;
},
enumerable: true,
configurable: true
});
/**
*@hidden
*/
/**
* @hidden
* @param {?} event
* @return {?}
*/
IgxRippleDirective.prototype.onMouseDown = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
this.zone.runOutsideAngular(function () { return _this._ripple(event); });
};
/**
* @private
* @param {?} rippleElement
* @param {?} styleParams
* @return {?}
*/
IgxRippleDirective.prototype.setStyles = /**
* @private
* @param {?} rippleElement
* @param {?} styleParams
* @return {?}
*/
function (rippleElement, styleParams) {
this.renderer.addClass(rippleElement, this.rippleElementClass);
this.renderer.setStyle(rippleElement, 'width', styleParams.radius + "px");
this.renderer.setStyle(rippleElement, 'height', styleParams.radius + "px");
this.renderer.setStyle(rippleElement, 'top', styleParams.top + "px");
this.renderer.setStyle(rippleElement, 'left', styleParams.left + "px");
if (this.rippleColor) {
this.renderer.setStyle(rippleElement, 'background', this.rippleColor);
}
};
/**
* @private
* @param {?} event
* @return {?}
*/
IgxRippleDirective.prototype._ripple = /**
* @private
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
if (this.rippleDisabled) {
return;
}
/** @type {?} */
var target = (this.rippleTarget ? this.nativeElement.querySelector(this.rippleTarget) || this.nativeElement : this.nativeElement);
/** @type {?} */
var rectBounds = target.getBoundingClientRect();
/** @type {?} */
var radius = Math.max(rectBounds.width, rectBounds.height);
/** @type {?} */
var left = event.clientX - rectBounds.left - radius / 2;
/** @type {?} */
var top = event.clientY - rectBounds.top - radius / 2;
if (this._centered) {
left = top = 0;
}
/** @type {?} */
var dimensions = {
radius: radius,
top: top,
left: left
};
/** @type {?} */
var rippleElement = this.renderer.createElement('span');
this.setStyles(rippleElement, dimensions);
this.renderer.addClass(target, this.rippleHostClass);
this.renderer.appendChild(target, rippleElement);
/** @type {?} */
var animation = this.builder.build([
style({ opacity: 0.5, transform: 'scale(.3)' }),
animate(this.rippleDuration, style({ opacity: 0, transform: 'scale(2)' }))
]).create(rippleElement);
this.animationQueue.push(animation);
animation.onDone(function () {
_this.animationQueue.splice(_this.animationQueue.indexOf(animation), 1);
target.removeChild(rippleElement);
if (_this.animationQueue.length < 1) {
_this.renderer.removeClass(target, _this.rippleHostClass);
}
});
animation.play();
};
IgxRippleDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxRipple]'
},] }
];
/** @nocollapse */
IgxRippleDirective.ctorParameters = function () { return [
{ type: AnimationBuilder },
{ type: ElementRef },
{ type: Renderer2 },
{ type: NgZone }
]; };
IgxRippleDirective.propDecorators = {
rippleTarget: [{ type: Input, args: ['igxRippleTarget',] }],
rippleColor: [{ type: Input, args: ['igxRipple',] }],
rippleDuration: [{ type: Input, args: ['igxRippleDuration',] }],
centered: [{ type: Input, args: ['igxRippleCentered',] }],
rippleDisabled: [{ type: Input, args: ['igxRippleDisabled',] }],
onMouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }]
};
return IgxRippleDirective;
}());
export { IgxRippleDirective };
if (false) {
/**
* Sets/gets the ripple target.
* ```html
* <div #rippleContainer class="div-1" igxRipple [igxRippleTarget] = "'.div-1'"></div>
* ```
* ```typescript
* \@ViewChild('rippleContainer', {read: IgxRippleDirective})
* public ripple: IgxRippleDirective;
* let rippleTarget = this.ripple.rippleTarget;
* ```
* Can set the ripple to activate on a child element inside the parent where igxRipple is defined.
* ```html
* <div #rippleContainer [igxRippleTarget] = "'#child"'>
* <button id="child">Click</button>
* </div>
* ```
* \@memberof IgxRippleDirective
* @type {?}
*/
IgxRippleDirective.prototype.rippleTarget;
/**
* Sets/gets the ripple color.
* ```html
* <button #rippleContainer [igxRipple] = "'red'" ></button>
* ```
* ```typescript
* \@ViewChild('rippleContainer', {read: IgxRippleDirective})
* public ripple: IgxRippleDirective;
* let rippleColor = this.ripple.rippleColor;
* ```
* \@memberof IgxRippleDirective
* @type {?}
*/
IgxRippleDirective.prototype.rippleColor;
/**
* Sets/gets the ripple duration(in milliseconds).
* Default value is `600`.
* ```html
* <button #rippleContainer igxRipple [igxRippleDuration] = "800"></button>
* ```
* ```typescript
* \@ViewChild('rippleContainer', {read: IgxRippleDirective})
* public ripple: IgxRippleDirective;
* let rippleDuration = this.ripple.rippleDuration;
* ```
* \@memberof IgxRippleDirective
* @type {?}
*/
IgxRippleDirective.prototype.rippleDuration;
/**
* Sets/gets whether the ripple is disabled.
* Default value is `false`.
* ```html
* <button #rippleContainer igxRipple [igxRippleDisabled] = "true"></button>
* ```
* ```typescript
* \@ViewChild('rippleContainer', {read: IgxRippleDirective})
* public ripple: IgxRippleDirective;
* let isRippleDisabled = this.ripple.rippleDisabled;
* ```
* \@memberof IgxRippleDirective
* @type {?}
*/
IgxRippleDirective.prototype.rippleDisabled;
/**
* @type {?}
* @private
*/
IgxRippleDirective.prototype.rippleElementClass;
/**
* @type {?}
* @private
*/
IgxRippleDirective.prototype.rippleHostClass;
/**
* @type {?}
* @private
*/
IgxRippleDirective.prototype._centered;
/**
* @type {?}
* @private
*/
IgxRippleDirective.prototype.animationQueue;
/**
* @type {?}
* @protected
*/
IgxRippleDirective.prototype.builder;
/**
* @type {?}
* @protected
*/
IgxRippleDirective.prototype.elementRef;
/**
* @type {?}
* @protected
*/
IgxRippleDirective.prototype.renderer;
/**
* @type {?}
* @private
*/
IgxRippleDirective.prototype.zone;
}
/**
* @hidden
*/
var IgxRippleModule = /** @class */ (function () {
function IgxRippleModule() {
}
IgxRippleModule.decorators = [
{ type: NgModule, args: [{
declarations: [IgxRippleDirective],
exports: [IgxRippleDirective]
},] }
];
return IgxRippleModule;
}());
export { IgxRippleModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlcy9yaXBwbGUvcmlwcGxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZFO0lBd0ZJLDRCQUNjLE9BQXlCLEVBQ3pCLFVBQXNCLEVBQ3RCLFFBQW1CLEVBQ3JCLElBQVk7UUFIVixZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUN6QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDckIsU0FBSSxHQUFKLElBQUksQ0FBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQXJFakIsaUJBQVksR0FBRyxFQUFFLENBQUM7Ozs7Ozs7Ozs7Ozs7O1FBNkJsQixtQkFBYyxHQUFHLEdBQUcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7UUF5QnJCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBTXRCLHVCQUFrQixHQUFHLG1CQUFtQixDQUFDO1FBQ3pDLG9CQUFlLEdBQUcsWUFBWSxDQUFDO1FBQy9CLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsbUJBQWMsR0FBRyxFQUFFLENBQUM7SUFNQSxDQUFDO0lBaEM3QixzQkFBZ0Msd0NBQVE7UUFQeEM7Ozs7OztXQU1HOzs7Ozs7Ozs7O1FBQ0gsVUFBeUMsS0FBYztZQUNuRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzVDLENBQUM7OztPQUFBO0lBaUJELHNCQUFjLDZDQUFhOzs7OztRQUEz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QiwwQ0FDeUI7Ozs7Ozs7Ozs7Ozs7O0lBYXpCLHlDQUMyQjs7Ozs7Ozs7Ozs7Ozs7O0lBYzNCLDRDQUM0Qjs7Ozs7Ozs7Ozs7Ozs7O0lBd0I1Qiw0Q0FDOEI7Ozs7O0lBTTlCLGdEQUFpRDs7Ozs7SUFDakQsNkNBQXVDOzs7OztJQUN2Qyx1Q0FBMEI7Ozs7O0lBQzFCLDRDQUE0Qjs7Ozs7SUFHeEIscUNBQW1DOzs7OztJQUNuQyx3Q0FBZ0M7Ozs7O0lBQ2hDLHNDQUE2Qjs7Ozs7SUFDN0Isa0NBQW9COzs7OztBQXVFNUI7SUFBQTtJQUkrQixDQUFDOztnQkFKL0IsUUFBUSxTQUFDO29CQUNOLFlBQVksRUFBRSxDQUFDLGtCQUFrQixDQUFDO29CQUNsQyxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztpQkFDaEM7O0lBQzhCLHNCQUFDO0NBQUEsQUFKaEMsSUFJZ0M7U0FBbkIsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgTmdNb2R1bGUsIE5nWm9uZSwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbmltYXRpb25CdWlsZGVyLCBzdHlsZSwgYW5pbWF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hSaXBwbGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hSaXBwbGVEaXJlY3RpdmUge1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgcmlwcGxlIHRhcmdldC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGRpdiAgI3JpcHBsZUNvbnRhaW5lciBjbGFzcz1cImRpdi0xXCIgaWd4UmlwcGxlIFtpZ3hSaXBwbGVUYXJnZXRdID0gXCInLmRpdi0xJ1wiPjwvZGl2PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCdyaXBwbGVDb250YWluZXInLCB7cmVhZDogSWd4UmlwcGxlRGlyZWN0aXZlfSlcbiAgICAgKiBwdWJsaWMgcmlwcGxlOiBJZ3hSaXBwbGVEaXJlY3RpdmU7XG4gICAgICogbGV0IHJpcHBsZVRhcmdldCA9IHRoaXMucmlwcGxlLnJpcHBsZVRhcmdldDtcbiAgICAgKiBgYGBcbiAgICAgKiBDYW4gc2V0IHRoZSByaXBwbGUgdG8gYWN0aXZhdGUgb24gYSBjaGlsZCBlbGVtZW50IGluc2lkZSB0aGUgcGFyZW50IHdoZXJlIGlneFJpcHBsZSBpcyBkZWZpbmVkLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2ICNyaXBwbGVDb250YWluZXIgW2lneFJpcHBsZVRhcmdldF0gPSBcIicjY2hpbGRcIic+XG4gICAgICogIDxidXR0b24gaWQ9XCJjaGlsZFwiPkNsaWNrPC9idXR0b24+XG4gICAgICogPC9kaXY+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFJpcHBsZURpcmVjdGl2ZVxuICAgICAqL1xuICAgIEBJbnB1dCgnaWd4UmlwcGxlVGFyZ2V0JylcbiAgICBwdWJsaWMgcmlwcGxlVGFyZ2V0ID0gJyc7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSByaXBwbGUgY29sb3IuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxidXR0b24gI3JpcHBsZUNvbnRhaW5lciBbaWd4UmlwcGxlXSA9IFwiJ3JlZCdcIiA+PC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoJ3JpcHBsZUNvbnRhaW5lcicsIHtyZWFkOiBJZ3hSaXBwbGVEaXJlY3RpdmV9KVxuICAgICAqIHB1YmxpYyByaXBwbGU6IElneFJpcHBsZURpcmVjdGl2ZTtcbiAgICAgKiBsZXQgcmlwcGxlQ29sb3IgPSB0aGlzLnJpcHBsZS5yaXBwbGVDb2xvcjtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4UmlwcGxlRGlyZWN0aXZlXG4gICAgICovXG4gICAgQElucHV0KCdpZ3hSaXBwbGUnKVxuICAgIHB1YmxpYyByaXBwbGVDb2xvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgcmlwcGxlIGR1cmF0aW9uKGluIG1pbGxpc2Vjb25kcykuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgNjAwYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGJ1dHRvbiAjcmlwcGxlQ29udGFpbmVyIGlneFJpcHBsZSBbaWd4UmlwcGxlRHVyYXRpb25dID0gXCI4MDBcIj48L2J1dHRvbj5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgncmlwcGxlQ29udGFpbmVyJywge3JlYWQ6IElneFJpcHBsZURpcmVjdGl2ZX0pXG4gICAgICogcHVibGljIHJpcHBsZTogSWd4UmlwcGxlRGlyZWN0aXZlO1xuICAgICAqIGxldCByaXBwbGVEdXJhdGlvbiA9IHRoaXMucmlwcGxlLnJpcHBsZUR1cmF0aW9uO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hSaXBwbGVEaXJlY3RpdmVcbiAgICAgKi9cbiAgICBASW5wdXQoJ2lneFJpcHBsZUR1cmF0aW9uJylcbiAgICBwdWJsaWMgcmlwcGxlRHVyYXRpb24gPSA2MDA7XG4gICAgLyoqXG4gICAgICogRW5hYmxlcy9kaXNhYmxlcyB0aGUgcmlwcGxlIHRvIGJlIGNlbnRlcmVkLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8YnV0dG9uICNyaXBwbGVDb250YWluZXIgaWd4UmlwcGxlIFtpZ3hSaXBwbGVDZW50ZXJlZF0gPSBcInRydWVcIj48L2J1dHRvbj5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4UmlwcGxlRGlyZWN0aXZlXG4gICAgICovXG4gICAgQElucHV0KCdpZ3hSaXBwbGVDZW50ZXJlZCcpIHNldCBjZW50ZXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9jZW50ZXJlZCA9IHZhbHVlIHx8IHRoaXMuY2VudGVyZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSByaXBwbGUgaXMgZGlzYWJsZWQuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8YnV0dG9uICNyaXBwbGVDb250YWluZXIgaWd4UmlwcGxlIFtpZ3hSaXBwbGVEaXNhYmxlZF0gPSBcInRydWVcIj48L2J1dHRvbj5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgncmlwcGxlQ29udGFpbmVyJywge3JlYWQ6IElneFJpcHBsZURpcmVjdGl2ZX0pXG4gICAgICogcHVibGljIHJpcHBsZTogSWd4UmlwcGxlRGlyZWN0aXZlO1xuICAgICAqIGxldCBpc1JpcHBsZURpc2FibGVkID0gdGhpcy5yaXBwbGUucmlwcGxlRGlzYWJsZWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFJpcHBsZURpcmVjdGl2ZVxuICAgICAqL1xuICAgIEBJbnB1dCgnaWd4UmlwcGxlRGlzYWJsZWQnKVxuICAgIHB1YmxpYyByaXBwbGVEaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgcHJvdGVjdGVkIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgcmlwcGxlRWxlbWVudENsYXNzID0gJ2lneC1yaXBwbGVfX2lubmVyJztcbiAgICBwcml2YXRlIHJpcHBsZUhvc3RDbGFzcyA9ICdpZ3gtcmlwcGxlJztcbiAgICBwcml2YXRlIF9jZW50ZXJlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgYW5pbWF0aW9uUXVldWUgPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgYnVpbGRlcjogQW5pbWF0aW9uQnVpbGRlcixcbiAgICAgICAgcHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSkgeyB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMuX3JpcHBsZShldmVudCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0U3R5bGVzKHJpcHBsZUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzdHlsZVBhcmFtczogYW55KSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MocmlwcGxlRWxlbWVudCwgdGhpcy5yaXBwbGVFbGVtZW50Q2xhc3MpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJpcHBsZUVsZW1lbnQsICd3aWR0aCcsIGAke3N0eWxlUGFyYW1zLnJhZGl1c31weGApO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJpcHBsZUVsZW1lbnQsICdoZWlnaHQnLCBgJHtzdHlsZVBhcmFtcy5yYWRpdXN9cHhgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyaXBwbGVFbGVtZW50LCAndG9wJywgYCR7c3R5bGVQYXJhbXMudG9wfXB4YCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocmlwcGxlRWxlbWVudCwgJ2xlZnQnLCBgJHtzdHlsZVBhcmFtcy5sZWZ0fXB4YCk7XG4gICAgICAgIGlmICh0aGlzLnJpcHBsZUNvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJpcHBsZUVsZW1lbnQsICdiYWNrZ3JvdW5kJywgdGhpcy5yaXBwbGVDb2xvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9yaXBwbGUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucmlwcGxlRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldCA9ICh0aGlzLnJpcHBsZVRhcmdldCA/IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHRoaXMucmlwcGxlVGFyZ2V0KSB8fCB0aGlzLm5hdGl2ZUVsZW1lbnQgOiB0aGlzLm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IHJlY3RCb3VuZHMgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IE1hdGgubWF4KHJlY3RCb3VuZHMud2lkdGgsIHJlY3RCb3VuZHMuaGVpZ2h0KTtcbiAgICAgICAgbGV0IGxlZnQgPSBldmVudC5jbGllbnRYIC0gcmVjdEJvdW5kcy5sZWZ0IC0gcmFkaXVzIC8gMjtcbiAgICAgICAgbGV0IHRvcCA9IGV2ZW50LmNsaWVudFkgLSByZWN0Qm91bmRzLnRvcCAtIHJhZGl1cyAvIDI7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NlbnRlcmVkKSB7XG4gICAgICAgICAgICBsZWZ0ID0gdG9wID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB7XG4gICAgICAgICAgICByYWRpdXMsXG4gICAgICAgICAgICB0b3AsXG4gICAgICAgICAgICBsZWZ0XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmlwcGxlRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXG4gICAgICAgIHRoaXMuc2V0U3R5bGVzKHJpcHBsZUVsZW1lbnQsIGRpbWVuc2lvbnMpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRhcmdldCwgdGhpcy5yaXBwbGVIb3N0Q2xhc3MpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRhcmdldCwgcmlwcGxlRWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgYW5pbWF0aW9uID0gdGhpcy5idWlsZGVyLmJ1aWxkKFtcbiAgICAgICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMC41LCB0cmFuc2Zvcm06ICdzY2FsZSguMyknIH0pLFxuICAgICAgICAgICAgYW5pbWF0ZSh0aGlzLnJpcHBsZUR1cmF0aW9uLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDIpJyB9KSlcbiAgICAgICAgXSkuY3JlYXRlKHJpcHBsZUVsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uUXVldWUucHVzaChhbmltYXRpb24pO1xuXG4gICAgICAgIGFuaW1hdGlvbi5vbkRvbmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbmltYXRpb25RdWV1ZS5zcGxpY2UodGhpcy5hbmltYXRpb25RdWV1ZS5pbmRleE9mKGFuaW1hdGlvbiksIDEpO1xuICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKHJpcHBsZUVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uUXVldWUubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGFyZ2V0LCB0aGlzLnJpcHBsZUhvc3RDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFuaW1hdGlvbi5wbGF5KCk7XG5cbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW0lneFJpcHBsZURpcmVjdGl2ZV0sXG4gICAgZXhwb3J0czogW0lneFJpcHBsZURpcmVjdGl2ZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4UmlwcGxlTW9kdWxlIHsgfVxuIl19