UNPKG

ng-cw-v12

Version:

Angular UI Component Library

149 lines 21.7 kB
import { Directive, Input, Output, EventEmitter } from '@angular/core'; import * as i0 from "@angular/core"; export class ShineBorderDirective { constructor(el, renderer) { this.el = el; this.renderer = renderer; /** 边框宽度 单位px */ this.ncBorderWidth = 1; /** 动画时长,ms */ this.ncDuration = 14000; /** 停止动画时间,ms,0表示不停止 */ this.ncStopTime = 0; /** 光效颜色,可以是单色或颜色数组 */ this.ncShineColor = ["#A07CFE", "#FE8FB5", "#FFBE7B"]; /** 是否启用动画 */ this._enabled = true; /** 双向绑定输出事件 */ this.ncEnabledChange = new EventEmitter(); this.isInitialized = false; // 为每个实例生成唯一的动画名称 this.animationName = `ncShineBorder_${Math.random().toString(36).substring(2, 11)}`; } set ncEnabled(value) { this._enabled = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncEnabled() { return this._enabled; } ngOnInit() { this.createShineBorderContainer(); 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); } } createShineBorderContainer() { // 创建shine边框元素 this.shineElement = this.renderer.createElement('div'); this.renderer.addClass(this.shineElement, 'shine-border'); // 确保宿主元素具有相对定位 const elementPosition = getComputedStyle(this.el.nativeElement).position; if (!elementPosition || elementPosition === 'static') { this.renderer.setStyle(this.el.nativeElement, 'position', 'relative'); } // 获取shine颜色 const shineColors = Array.isArray(this.ncShineColor) ? this.ncShineColor.join(',') : this.ncShineColor; // 设置shine边框样式 this.renderer.setStyle(this.shineElement, 'position', 'absolute'); this.renderer.setStyle(this.shineElement, 'inset', '0'); this.renderer.setStyle(this.shineElement, 'width', '100%'); this.renderer.setStyle(this.shineElement, 'height', '100%'); this.renderer.setStyle(this.shineElement, 'borderRadius', 'inherit'); this.renderer.setStyle(this.shineElement, 'pointerEvents', 'none'); this.renderer.setStyle(this.shineElement, 'backgroundImage', `radial-gradient(transparent,transparent, ${shineColors},transparent,transparent)`); this.renderer.setStyle(this.shineElement, 'backgroundSize', '300% 300%'); this.renderer.setStyle(this.shineElement, 'padding', `${this.ncBorderWidth}px`); // 设置mask属性 this.renderer.setStyle(this.shineElement, 'mask', 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)'); this.renderer.setStyle(this.shineElement, '-webkit-mask', 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)'); this.renderer.setStyle(this.shineElement, '-webkit-mask-composite', 'xor'); this.renderer.setStyle(this.shineElement, 'mask-composite', 'exclude'); this.renderer.setStyle(this.shineElement, 'will-change', 'background-position'); // 初始状态下隐藏边框 this.renderer.setStyle(this.shineElement, 'display', 'none'); // 添加关键帧动画样式 this.styleElement = this.renderer.createElement('style'); const keyframes = ` @keyframes ${this.animationName} { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } `; this.renderer.appendChild(this.styleElement, this.renderer.createText(keyframes)); this.renderer.appendChild(this.el.nativeElement, this.styleElement); // 将shine元素添加到宿主元素中 this.renderer.appendChild(this.el.nativeElement, this.shineElement); } startAnimation() { if (!this.shineElement) return; // 启动动画时显示边框 this.renderer.setStyle(this.shineElement, 'display', 'block'); // 启动shine动画 this.renderer.setStyle(this.shineElement, '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.shineElement) return; if (this.stopTimer) { clearTimeout(this.stopTimer); this.stopTimer = null; } this.renderer.setStyle(this.shineElement, 'animation', 'none'); // 停止动画时隐藏边框 this.renderer.setStyle(this.shineElement, 'display', 'none'); } } ShineBorderDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ShineBorderDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); ShineBorderDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: ShineBorderDirective, selector: "[ncShineBorder]", inputs: { ncBorderWidth: "ncBorderWidth", ncDuration: "ncDuration", ncStopTime: "ncStopTime", ncShineColor: "ncShineColor", ncEnabled: "ncEnabled" }, outputs: { ncEnabledChange: "ncEnabledChange" }, usesOnChanges: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ShineBorderDirective, decorators: [{ type: Directive, args: [{ selector: '[ncShineBorder]' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncBorderWidth: [{ type: Input }], ncDuration: [{ type: Input }], ncStopTime: [{ type: Input }], ncShineColor: [{ type: Input }], ncEnabled: [{ type: Input }], ncEnabledChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpbmUtYm9yZGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc2hpbmUtYm9yZGVyL3NoaW5lLWJvcmRlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDOztBQUszSSxNQUFNLE9BQU8sb0JBQW9CO0lBMEIvQixZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUF6Qi9ELGdCQUFnQjtRQUNQLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBQ25DLGNBQWM7UUFDTCxlQUFVLEdBQVcsS0FBSyxDQUFDO1FBQ3BDLHVCQUF1QjtRQUNkLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDaEMsc0JBQXNCO1FBQ2IsaUJBQVksR0FBc0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdFLGFBQWE7UUFDTCxhQUFRLEdBQVksSUFBSSxDQUFDO1FBT2pDLGVBQWU7UUFDTCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFNaEQsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFHNUIsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsaUJBQWlCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3RGLENBQUM7SUFsQkQsSUFBYSxTQUFTLENBQUMsS0FBdUI7UUFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEtBQUssSUFB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UUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvRCxZQUFZO1FBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7aUhBbkpVLG9CQUFvQjtxR0FBcEIsb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBSGhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtpQkFDNUI7eUhBR1UsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFHTyxTQUFTO3NCQUFyQixLQUFLO2dCQU9JLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuY1NoaW5lQm9yZGVyXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNoaW5lQm9yZGVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgLyoqIOi+ueahhuWuveW6piDljZXkvY1weCAqL1xyXG4gIEBJbnB1dCgpIG5jQm9yZGVyV2lkdGg6IG51bWJlciA9IDE7XHJcbiAgLyoqIOWKqOeUu+aXtumVv++8jG1zICovXHJcbiAgQElucHV0KCkgbmNEdXJhdGlvbjogbnVtYmVyID0gMTQwMDA7XHJcbiAgLyoqIOWBnOatouWKqOeUu+aXtumXtO+8jG1z77yMMOihqOekuuS4jeWBnOatoiAqL1xyXG4gIEBJbnB1dCgpIG5jU3RvcFRpbWU6IG51bWJlciA9IDA7XHJcbiAgLyoqIOWFieaViOminOiJsu+8jOWPr+S7peaYr+WNleiJsuaIluminOiJsuaVsOe7hCAqL1xyXG4gIEBJbnB1dCgpIG5jU2hpbmVDb2xvcjogc3RyaW5nIHwgc3RyaW5nW10gPSBbXCIjQTA3Q0ZFXCIsIFwiI0ZFOEZCNVwiLCBcIiNGRkJFN0JcIl07XHJcbiAgLyoqIOaYr+WQpuWQr+eUqOWKqOeUuyAqL1xyXG4gIHByaXZhdGUgX2VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNldCBuY0VuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2VuYWJsZWQgPSB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBmYWxzZSAmJiB2YWx1ZSAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jRW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xyXG4gIH1cclxuICAvKiog5Y+M5ZCR57uR5a6a6L6T5Ye65LqL5Lu2ICovXHJcbiAgQE91dHB1dCgpIG5jRW5hYmxlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBzaGluZUVsZW1lbnQhOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFuaW1hdGlvbk5hbWU6IHN0cmluZztcclxuICBwcml2YXRlIHN0b3BUaW1lcjogYW55O1xyXG4gIHByaXZhdGUgc3R5bGVFbGVtZW50ITogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xyXG4gICAgLy8g5Li65q+P5Liq5a6e5L6L55Sf5oiQ5ZSv5LiA55qE5Yqo55S75ZCN56ewXHJcbiAgICB0aGlzLmFuaW1hdGlvbk5hbWUgPSBgbmNTaGluZUJvcmRlcl8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSl9YDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jcmVhdGVTaGluZUJvcmRlckNvbnRhaW5lcigpO1xyXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLm5jRW5hYmxlZCkge1xyXG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkICYmIGNoYW5nZXNbJ25jRW5hYmxlZCddKSB7XHJcbiAgICAgIGlmICh0aGlzLm5jRW5hYmxlZCkge1xyXG4gICAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5zdG9wVGltZXIpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc3RvcFRpbWVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2hpbmVCb3JkZXJDb250YWluZXIoKSB7XHJcbiAgICAvLyDliJvlu7pzaGluZei+ueahhuWFg+e0oFxyXG4gICAgdGhpcy5zaGluZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnNoaW5lRWxlbWVudCwgJ3NoaW5lLWJvcmRlcicpO1xyXG5cclxuICAgIC8vIOehruS/neWuv+S4u+WFg+e0oOWFt+acieebuOWvueWumuS9jVxyXG4gICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLnBvc2l0aW9uO1xyXG4gICAgaWYgKCFlbGVtZW50UG9zaXRpb24gfHwgZWxlbWVudFBvc2l0aW9uID09PSAnc3RhdGljJykge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g6I635Y+Wc2hpbmXpopzoibJcclxuICAgIGNvbnN0IHNoaW5lQ29sb3JzID0gQXJyYXkuaXNBcnJheSh0aGlzLm5jU2hpbmVDb2xvcikgPyB0aGlzLm5jU2hpbmVDb2xvci5qb2luKCcsJykgOiB0aGlzLm5jU2hpbmVDb2xvcjtcclxuXHJcbiAgICAvLyDorr7nva5zaGluZei+ueahhuagt+W8j1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2hpbmVFbGVtZW50LCAnaW5zZXQnLCAnMCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ3dpZHRoJywgJzEwMCUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICdoZWlnaHQnLCAnMTAwJScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ2JvcmRlclJhZGl1cycsICdpbmhlcml0Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2hpbmVFbGVtZW50LCAncG9pbnRlckV2ZW50cycsICdub25lJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2hpbmVFbGVtZW50LCAnYmFja2dyb3VuZEltYWdlJyxcclxuICAgICAgYHJhZGlhbC1ncmFkaWVudCh0cmFuc3BhcmVudCx0cmFuc3BhcmVudCwgJHtzaGluZUNvbG9yc30sdHJhbnNwYXJlbnQsdHJhbnNwYXJlbnQpYCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2hpbmVFbGVtZW50LCAnYmFja2dyb3VuZFNpemUnLCAnMzAwJSAzMDAlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2hpbmVFbGVtZW50LCAncGFkZGluZycsIGAke3RoaXMubmNCb3JkZXJXaWR0aH1weGApO1xyXG5cclxuICAgIC8vIOiuvue9rm1hc2vlsZ7mgKdcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICdtYXNrJyxcclxuICAgICAgJ2xpbmVhci1ncmFkaWVudCgjZmZmIDAgMCkgY29udGVudC1ib3gsIGxpbmVhci1ncmFkaWVudCgjZmZmIDAgMCknKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICctd2Via2l0LW1hc2snLFxyXG4gICAgICAnbGluZWFyLWdyYWRpZW50KCNmZmYgMCAwKSBjb250ZW50LWJveCwgbGluZWFyLWdyYWRpZW50KCNmZmYgMCAwKScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJy13ZWJraXQtbWFzay1jb21wb3NpdGUnLCAneG9yJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2hpbmVFbGVtZW50LCAnbWFzay1jb21wb3NpdGUnLCAnZXhjbHVkZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ3dpbGwtY2hhbmdlJywgJ2JhY2tncm91bmQtcG9zaXRpb24nKTtcclxuXHJcbiAgICAvLyDliJ3lp4vnirbmgIHkuIvpmpDol4/ovrnmoYZcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHJcbiAgICAvLyDmt7vliqDlhbPplK7luKfliqjnlLvmoLflvI9cclxuICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xyXG4gICAgY29uc3Qga2V5ZnJhbWVzID0gYFxyXG4gICAgICBAa2V5ZnJhbWVzICR7dGhpcy5hbmltYXRpb25OYW1lfSB7XHJcbiAgICAgICAgMCUge1xyXG4gICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCUgNTAlO1xyXG4gICAgICAgIH1cclxuICAgICAgICA1MCUge1xyXG4gICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSA1MCU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDEwMCUge1xyXG4gICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCUgNTAlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgYDtcclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChrZXlmcmFtZXMpKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLnN0eWxlRWxlbWVudCk7XHJcblxyXG4gICAgLy8g5bCGc2hpbmXlhYPntKDmt7vliqDliLDlrr/kuLvlhYPntKDkuK1cclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLnNoaW5lRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0QW5pbWF0aW9uKCkge1xyXG4gICAgaWYgKCF0aGlzLnNoaW5lRWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIOWQr+WKqOWKqOeUu+aXtuaYvuekuui+ueahhlxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuXHJcbiAgICAvLyDlkK/liqhzaGluZeWKqOeUu1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ2FuaW1hdGlvbicsXHJcbiAgICAgIGAke3RoaXMuYW5pbWF0aW9uTmFtZX0gJHt0aGlzLm5jRHVyYXRpb259bXMgZWFzZS1pbi1vdXQgaW5maW5pdGVgKTtcclxuXHJcbiAgICAvLyDlpoLmnpzorr7nva7kuoblgZzmraLml7bpl7TvvIzliJnlnKjmjIflrprml7bpl7TlkI7moIforrDpnIDopoHlgZzmraJcclxuICAgIGlmICh0aGlzLm5jU3RvcFRpbWUgPiAwKSB7XHJcbiAgICAgIHRoaXMuc3RvcFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uKCk7XHJcbiAgICAgICAgLy8g5b2T5Zug5Li6IG5jU3RvcFRpbWUg5YGc5q2i5Yqo55S75pe277yM5pu05pawIG5jRW5hYmxlZCDlgLzlubblj5Hlh7rkuovku7ZcclxuICAgICAgICB0aGlzLm5jRW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubmNFbmFibGVkQ2hhbmdlLmVtaXQoZmFsc2UpO1xyXG4gICAgICB9LCB0aGlzLm5jU3RvcFRpbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdG9wQW5pbWF0aW9uKCkge1xyXG4gICAgaWYgKCF0aGlzLnNoaW5lRWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLnN0b3BUaW1lcikge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zdG9wVGltZXIpO1xyXG4gICAgICB0aGlzLnN0b3BUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ2FuaW1hdGlvbicsICdub25lJyk7XHJcbiAgICAvLyDlgZzmraLliqjnlLvml7bpmpDol4/ovrnmoYZcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKTtcclxuICB9XHJcbn0iXX0=