ng-cw-v12
Version:
Angular UI Component Library
138 lines • 17.8 kB
JavaScript
import { Directive, Input, Output, EventEmitter } from '@angular/core';
import * as i0 from "@angular/core";
export class PulsatingDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
/** 动画时长,单位ms */
this.ncDuration = 1500;
/** 默认浅蓝色光晕 */
this.ncColor = '#0096ff';
/** 最大光晕宽度 */
this.ncSize = '8px';
/** 停止动画时间,ms,0表示不停止 */
this.ncStopTime = 0;
/** 是否启用脉冲动画 */
this._enbaled = true;
/** 双向绑定输出事件 */
this.ncEnabledChange = new EventEmitter();
this.shouldStop = false;
this.isInitialized = false;
// 为每个实例生成唯一的动画名称
this.animationName = `ncPulse_${Math.random().toString(36).substring(2, 11)}`;
}
set ncEnabled(val) {
this._enbaled = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncEnabled() {
return this._enbaled;
}
ngOnInit() {
this.createPulsatingContainer();
this.isInitialized = true;
if (this.ncEnabled) {
this.startAnimation();
}
}
ngOnChanges(changes) {
if (this.isInitialized && changes['ncEnabled']) {
if (this.ncEnabled) {
this.startAnimation();
}
else {
this.stopAnimation();
}
}
}
ngOnDestroy() {
if (this.stopTimer) {
clearTimeout(this.stopTimer);
}
}
createPulsatingContainer() {
this.pulsatingContainer = this.renderer.createElement('div');
this.renderer.addClass(this.pulsatingContainer, 'nc-pulsating-container');
// 设置基础样式
this.renderer.setStyle(this.pulsatingContainer, 'position', 'absolute');
this.renderer.setStyle(this.pulsatingContainer, 'inset', '0');
this.renderer.setStyle(this.pulsatingContainer, 'borderRadius', 'inherit');
this.renderer.setStyle(this.pulsatingContainer, 'pointerEvents', 'none');
this.renderer.setStyle(this.pulsatingContainer, 'zIndex', '0');
const elementPosition = getComputedStyle(this.el.nativeElement).position;
if (!elementPosition || elementPosition === 'static') {
this.renderer.setStyle(this.el.nativeElement, 'position', 'relative');
}
// 添加关键帧动画样式
this.styleElement = this.renderer.createElement('style');
const keyframes = `
${this.animationName} {
0% {
box-shadow: 0 0 0 0 ${this.ncColor};
}
50% {
box-shadow: 0 0 0 ${this.ncSize} ${this.ncColor};
opacity: 0.5;
}
100% {
box-shadow: 0 0 0 0 ${this.ncColor};
}
}
`;
this.renderer.appendChild(this.styleElement, this.renderer.createText(keyframes));
this.renderer.appendChild(this.el.nativeElement, this.styleElement);
// 将容器添加到宿主元素中
this.renderer.appendChild(this.el.nativeElement, this.pulsatingContainer);
// 监听动画迭代事件,用于平滑停止
this.renderer.listen(this.pulsatingContainer, 'animationiteration', () => {
if (this.shouldStop) {
this.renderer.setStyle(this.pulsatingContainer, 'animation', 'none');
this.shouldStop = false;
}
});
}
startAnimation() {
if (!this.pulsatingContainer)
return;
this.shouldStop = false;
this.renderer.setStyle(this.pulsatingContainer, 'animation', `${this.animationName} ${this.ncDuration}ms ease-in-out infinite`);
// 如果设置了停止时间,则在指定时间后标记需要停止
if (this.ncStopTime > 0) {
this.stopTimer = setTimeout(() => {
this.stopAnimation();
// 当因为 ncStopTime 停止动画时,更新 ncEnabled 值并发出事件
this.ncEnabled = false;
this.ncEnabledChange.emit(false);
}, this.ncStopTime);
}
}
stopAnimation() {
if (!this.pulsatingContainer)
return;
if (this.stopTimer) {
clearTimeout(this.stopTimer);
this.stopTimer = null;
}
this.shouldStop = true;
}
}
PulsatingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PulsatingDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
PulsatingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: PulsatingDirective, selector: "[ncPulsating]", inputs: { ncDuration: "ncDuration", ncColor: "ncColor", ncSize: "ncSize", ncStopTime: "ncStopTime", ncEnabled: "ncEnabled" }, outputs: { ncEnabledChange: "ncEnabledChange" }, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PulsatingDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncPulsating]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncDuration: [{
type: Input
}], ncColor: [{
type: Input
}], ncSize: [{
type: Input
}], ncStopTime: [{
type: Input
}], ncEnabled: [{
type: Input
}], ncEnabledChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsc2F0aW5nLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvcHVsc2F0aW5nL3B1bHNhdGluZy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDOztBQUszSSxNQUFNLE9BQU8sa0JBQWtCO0lBNkI3QixZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUE1Qi9ELGdCQUFnQjtRQUNQLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFDbkMsY0FBYztRQUNMLFlBQU8sR0FBVyxTQUFTLENBQUM7UUFDckMsYUFBYTtRQUNKLFdBQU0sR0FBVyxLQUFLLENBQUM7UUFDaEMsdUJBQXVCO1FBQ2QsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUNoQyxlQUFlO1FBQ1AsYUFBUSxHQUFZLElBQUksQ0FBQztRQVNqQyxlQUFlO1FBQ0wsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBSWhELGVBQVUsR0FBRyxLQUFLLENBQUM7UUFHbkIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFHNUIsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNoRixDQUFDO0lBckJELElBQ0ksU0FBUyxDQUFDLEdBQXFCO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxLQUFLLElBQUksR0FBRyxLQUFLLE9BQU8sQ0FBQztJQUN4RixDQUFDO0lBQ0QsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFpQkQsUUFBUTtRQUNOLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDOUMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNsQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDdkI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3RCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLHdCQUF3QixDQUFDLENBQUM7UUFDMUUsU0FBUztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUUvRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN6RSxJQUFJLENBQUMsZUFBZSxJQUFJLGVBQWUsS0FBSyxRQUFRLEVBQUU7WUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsWUFBWTtRQUNaLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekQsTUFBTSxTQUFTLEdBQUc7bUJBQ0gsSUFBSSxDQUFDLGFBQWE7O2dDQUVMLElBQUksQ0FBQyxPQUFPOzs7OEJBR2QsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTzs7OztnQ0FJekIsSUFBSSxDQUFDLE9BQU87OztLQUd2QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVwRSxjQUFjO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFMUUsa0JBQWtCO1FBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7WUFDdkUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQzthQUN6QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0I7WUFBRSxPQUFPO1FBRXJDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLEVBQ3pELEdBQUcsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsVUFBVSx5QkFBeUIsQ0FBQyxDQUFDO1FBRXJFLDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQiwyQ0FBMkM7Z0JBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0I7WUFBRSxPQUFPO1FBRXJDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ3ZCO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQzs7K0dBbklVLGtCQUFrQjttR0FBbEIsa0JBQWtCOzJGQUFsQixrQkFBa0I7a0JBSDlCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7aUJBQzFCO3lIQUdVLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlGLFNBQVM7c0JBRFosS0FBSztnQkFTSSxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbbmNQdWxzYXRpbmddJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUHVsc2F0aW5nRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgLyoqIOWKqOeUu+aXtumVv++8jOWNleS9jW1zICovXHJcbiAgQElucHV0KCkgbmNEdXJhdGlvbjogbnVtYmVyID0gMTUwMDtcclxuICAvKiog6buY6K6k5rWF6JOd6Imy5YWJ5pmVICovXHJcbiAgQElucHV0KCkgbmNDb2xvcjogc3RyaW5nID0gJyMwMDk2ZmYnO1xyXG4gIC8qKiDmnIDlpKflhYnmmZXlrr3luqYgKi9cclxuICBASW5wdXQoKSBuY1NpemU6IHN0cmluZyA9ICc4cHgnO1xyXG4gIC8qKiDlgZzmraLliqjnlLvml7bpl7TvvIxtc++8jDDooajnpLrkuI3lgZzmraIgKi9cclxuICBASW5wdXQoKSBuY1N0b3BUaW1lOiBudW1iZXIgPSAwO1xyXG4gIC8qKiDmmK/lkKblkK/nlKjohInlhrLliqjnlLsgKi9cclxuICBwcml2YXRlIF9lbmJhbGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY0VuYWJsZWQodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9lbmJhbGVkID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuYmFsZWQ7XHJcbiAgfVxyXG5cclxuICAvKiog5Y+M5ZCR57uR5a6a6L6T5Ye65LqL5Lu2ICovXHJcbiAgQE91dHB1dCgpIG5jRW5hYmxlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBwdWxzYXRpbmdDb250YWluZXIhOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFuaW1hdGlvbk5hbWU6IHN0cmluZztcclxuICBwcml2YXRlIHNob3VsZFN0b3AgPSBmYWxzZTtcclxuICBwcml2YXRlIHN0b3BUaW1lcjogYW55O1xyXG4gIHByaXZhdGUgc3R5bGVFbGVtZW50ITogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xyXG4gICAgLy8g5Li65q+P5Liq5a6e5L6L55Sf5oiQ5ZSv5LiA55qE5Yqo55S75ZCN56ewXHJcbiAgICB0aGlzLmFuaW1hdGlvbk5hbWUgPSBgbmNQdWxzZV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSl9YDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jcmVhdGVQdWxzYXRpbmdDb250YWluZXIoKTtcclxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5uY0VuYWJsZWQpIHtcclxuICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCAmJiBjaGFuZ2VzWyduY0VuYWJsZWQnXSkge1xyXG4gICAgICBpZiAodGhpcy5uY0VuYWJsZWQpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMuc3RvcFRpbWVyKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnN0b3BUaW1lcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVB1bHNhdGluZ0NvbnRhaW5lcigpIHtcclxuICAgIHRoaXMucHVsc2F0aW5nQ29udGFpbmVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5wdWxzYXRpbmdDb250YWluZXIsICduYy1wdWxzYXRpbmctY29udGFpbmVyJyk7XHJcbiAgICAvLyDorr7nva7ln7rnoYDmoLflvI9cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wdWxzYXRpbmdDb250YWluZXIsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnB1bHNhdGluZ0NvbnRhaW5lciwgJ2luc2V0JywgJzAnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wdWxzYXRpbmdDb250YWluZXIsICdib3JkZXJSYWRpdXMnLCAnaW5oZXJpdCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnB1bHNhdGluZ0NvbnRhaW5lciwgJ3BvaW50ZXJFdmVudHMnLCAnbm9uZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnB1bHNhdGluZ0NvbnRhaW5lciwgJ3pJbmRleCcsICcwJyk7XHJcblxyXG4gICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLnBvc2l0aW9uO1xyXG4gICAgaWYgKCFlbGVtZW50UG9zaXRpb24gfHwgZWxlbWVudFBvc2l0aW9uID09PSAnc3RhdGljJykge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5re75Yqg5YWz6ZSu5bin5Yqo55S75qC35byPXHJcbiAgICB0aGlzLnN0eWxlRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuICAgIGNvbnN0IGtleWZyYW1lcyA9IGBcclxuICAgICAgQGtleWZyYW1lcyAke3RoaXMuYW5pbWF0aW9uTmFtZX0ge1xyXG4gICAgICAgIDAlIHtcclxuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDAgJHt0aGlzLm5jQ29sb3J9O1xyXG4gICAgICAgIH1cclxuICAgICAgICA1MCUge1xyXG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgJHt0aGlzLm5jU2l6ZX0gJHt0aGlzLm5jQ29sb3J9O1xyXG4gICAgICAgICAgb3BhY2l0eTogMC41O1xyXG4gICAgICAgIH1cclxuICAgICAgICAxMDAlIHtcclxuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDAgJHt0aGlzLm5jQ29sb3J9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgYDtcclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChrZXlmcmFtZXMpKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLnN0eWxlRWxlbWVudCk7XHJcblxyXG4gICAgLy8g5bCG5a655Zmo5re75Yqg5Yiw5a6/5Li75YWD57Sg5LitXHJcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5wdWxzYXRpbmdDb250YWluZXIpO1xyXG5cclxuICAgIC8vIOebkeWQrOWKqOeUu+i/reS7o+S6i+S7tu+8jOeUqOS6juW5s+a7keWBnOatolxyXG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5wdWxzYXRpbmdDb250YWluZXIsICdhbmltYXRpb25pdGVyYXRpb24nLCAoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnNob3VsZFN0b3ApIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHVsc2F0aW5nQ29udGFpbmVyLCAnYW5pbWF0aW9uJywgJ25vbmUnKTtcclxuICAgICAgICB0aGlzLnNob3VsZFN0b3AgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0QW5pbWF0aW9uKCkge1xyXG4gICAgaWYgKCF0aGlzLnB1bHNhdGluZ0NvbnRhaW5lcikgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2hvdWxkU3RvcCA9IGZhbHNlO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnB1bHNhdGluZ0NvbnRhaW5lciwgJ2FuaW1hdGlvbicsXHJcbiAgICAgIGAke3RoaXMuYW5pbWF0aW9uTmFtZX0gJHt0aGlzLm5jRHVyYXRpb259bXMgZWFzZS1pbi1vdXQgaW5maW5pdGVgKTtcclxuXHJcbiAgICAvLyDlpoLmnpzorr7nva7kuoblgZzmraLml7bpl7TvvIzliJnlnKjmjIflrprml7bpl7TlkI7moIforrDpnIDopoHlgZzmraJcclxuICAgIGlmICh0aGlzLm5jU3RvcFRpbWUgPiAwKSB7XHJcbiAgICAgIHRoaXMuc3RvcFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uKCk7XHJcbiAgICAgICAgLy8g5b2T5Zug5Li6IG5jU3RvcFRpbWUg5YGc5q2i5Yqo55S75pe277yM5pu05pawIG5jRW5hYmxlZCDlgLzlubblj5Hlh7rkuovku7ZcclxuICAgICAgICB0aGlzLm5jRW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubmNFbmFibGVkQ2hhbmdlLmVtaXQoZmFsc2UpO1xyXG4gICAgICB9LCB0aGlzLm5jU3RvcFRpbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdG9wQW5pbWF0aW9uKCkge1xyXG4gICAgaWYgKCF0aGlzLnB1bHNhdGluZ0NvbnRhaW5lcikgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLnN0b3BUaW1lcikge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zdG9wVGltZXIpO1xyXG4gICAgICB0aGlzLnN0b3BUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zaG91bGRTdG9wID0gdHJ1ZTtcclxuICB9XHJcbn0iXX0=