ng-cw-v12
Version:
Angular UI Component Library
167 lines • 24.5 kB
JavaScript
import { Directive, Input, Output, EventEmitter } from '@angular/core';
import * as i0 from "@angular/core";
export class BorderBeamDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
/** 光条大小 单位px */
this.ncSize = 50;
/** 动画时长,ms */
this.ncDuration = 6000;
/** 停止动画时间,ms,0表示不停止 */
this.ncStopTime = 0;
/** 光条颜色,可以是单色或颜色数组 */
this.ncBeamColor = ["#ffaa40", "#9c40ff"];
/** 是否反向动画 */
this._reverse = false;
/** 初始偏移位置 (0-100) 单位% */
this.ncInitialOffset = 0;
/** 边框宽度 单位px */
this.ncBorderWidth = 1;
/** 是否启用动画 */
this._enabled = true;
/** 双向绑定输出事件 */
this.ncEnabledChange = new EventEmitter();
this.isInitialized = false;
// 为每个实例生成唯一的动画名称
this.animationName = `ncBorderBeam_${Math.random().toString(36).substring(2, 11)}`;
}
set ncReverse(val) {
this._reverse = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncReverse() {
return this._reverse;
}
set ncEnabled(val) {
this._enabled = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncEnabled() {
return this._enabled;
}
ngOnInit() {
this.createBorderBeamContainer();
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);
}
}
createBorderBeamContainer() {
// 创建边框容器
this.borderContainer = this.renderer.createElement('div');
this.renderer.addClass(this.borderContainer, 'border-beam-container');
// 设置边框容器样式
this.renderer.setStyle(this.borderContainer, 'position', 'absolute');
this.renderer.setStyle(this.borderContainer, 'inset', '0');
this.renderer.setStyle(this.borderContainer, 'borderRadius', 'inherit');
this.renderer.setStyle(this.borderContainer, 'pointerEvents', 'none');
this.renderer.setStyle(this.borderContainer, 'border', `${this.ncBorderWidth}px solid transparent`);
this.renderer.setStyle(this.borderContainer, 'maskClip', 'padding-box, border-box');
this.renderer.setStyle(this.borderContainer, 'maskComposite', 'intersect');
this.renderer.setStyle(this.borderContainer, 'maskImage', 'linear-gradient(transparent, transparent), linear-gradient(#000, #000)');
// 创建光条元素
this.beamElement = this.renderer.createElement('div');
this.renderer.addClass(this.beamElement, 'border-beam');
// 设置光条样式
this.renderer.setStyle(this.beamElement, 'position', 'absolute');
this.renderer.setStyle(this.beamElement, 'width', `${this.ncSize}px`);
this.renderer.setStyle(this.beamElement, 'aspectRatio', '1');
// 获取shine颜色
const beamColors = Array.isArray(this.ncBeamColor) ? this.ncBeamColor.join(',') : this.ncBeamColor;
this.renderer.setStyle(this.beamElement, 'background', `linear-gradient(to left, ${beamColors}, transparent)`);
this.renderer.setStyle(this.beamElement, 'offsetPath', `rect(0 auto auto 0 round ${this.ncSize}px)`);
// 初始状态下隐藏光条
this.renderer.setStyle(this.beamElement, 'opacity', '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 startOffset = this.ncReverse ? `${100 - this.ncInitialOffset}%` : `${this.ncInitialOffset}%`;
const endOffset = this.ncReverse ? `${-this.ncInitialOffset}%` : `${100 + this.ncInitialOffset}%`;
const keyframes = `
${this.animationName} {
0% {
offset-distance: ${startOffset};
}
100% {
offset-distance: ${endOffset};
}
}
`;
this.renderer.appendChild(this.styleElement, this.renderer.createText(keyframes));
this.renderer.appendChild(this.el.nativeElement, this.styleElement);
// 将光条添加到边框容器中
this.renderer.appendChild(this.borderContainer, this.beamElement);
// 将边框容器添加到宿主元素中
this.renderer.appendChild(this.el.nativeElement, this.borderContainer);
}
startAnimation() {
if (!this.beamElement)
return;
// 显示光条元素
this.renderer.setStyle(this.beamElement, 'opacity', '1');
this.renderer.setStyle(this.beamElement, 'animation', `${this.animationName} ${this.ncDuration}ms linear infinite`);
// 如果设置了停止时间,则在指定时间后标记需要停止
if (this.ncStopTime > 0) {
this.stopTimer = setTimeout(() => {
this.stopAnimation();
// 当因为 ncStopTime 停止动画时,更新 ncEnabled 值并发出事件
this.ncEnabled = false;
this.ncEnabledChange.emit(false);
}, this.ncStopTime);
}
}
stopAnimation() {
if (!this.beamElement)
return;
if (this.stopTimer) {
clearTimeout(this.stopTimer);
this.stopTimer = null;
}
this.renderer.setStyle(this.beamElement, 'animation', 'none');
this.renderer.setStyle(this.beamElement, 'opacity', '0');
}
}
BorderBeamDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: BorderBeamDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
BorderBeamDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: BorderBeamDirective, selector: "[ncBorderBeam]", inputs: { ncSize: "ncSize", ncDuration: "ncDuration", ncStopTime: "ncStopTime", ncBeamColor: "ncBeamColor", ncReverse: "ncReverse", ncInitialOffset: "ncInitialOffset", ncBorderWidth: "ncBorderWidth", ncEnabled: "ncEnabled" }, outputs: { ncEnabledChange: "ncEnabledChange" }, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: BorderBeamDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncBorderBeam]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncSize: [{
type: Input
}], ncDuration: [{
type: Input
}], ncStopTime: [{
type: Input
}], ncBeamColor: [{
type: Input
}], ncReverse: [{
type: Input
}], ncInitialOffset: [{
type: Input
}], ncBorderWidth: [{
type: Input
}], ncEnabled: [{
type: Input
}], ncEnabledChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9yZGVyLWJlYW0uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9ib3JkZXItYmVhbS9ib3JkZXItYmVhbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDOztBQUszSSxNQUFNLE9BQU8sbUJBQW1CO0lBeUM5QixZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUF4Qy9ELGdCQUFnQjtRQUNQLFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDN0IsY0FBYztRQUNMLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFDbkMsdUJBQXVCO1FBQ2QsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUNoQyxzQkFBc0I7UUFDYixnQkFBVyxHQUFzQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNqRSxhQUFhO1FBQ0wsYUFBUSxHQUFZLEtBQUssQ0FBQztRQVFsQyx5QkFBeUI7UUFDaEIsb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFDckMsZ0JBQWdCO1FBQ1Asa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDbkMsYUFBYTtRQUNMLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFRakMsZUFBZTtRQUNMLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQU9oRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUc1QixpQkFBaUI7UUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDckYsQ0FBQztJQWpDRCxJQUNJ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LENBQUM7SUFDM0QsQ0FBQzs7Z0hBOUpVLG1CQUFtQjtvR0FBbkIsbUJBQW1COzJGQUFuQixtQkFBbUI7a0JBSC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtpQkFDM0I7eUhBR1UsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlGLFNBQVM7c0JBRFosS0FBSztnQkFRRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBSUYsU0FBUztzQkFEWixLQUFLO2dCQVFJLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuY0JvcmRlckJlYW1dJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQm9yZGVyQmVhbURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIC8qKiDlhYnmnaHlpKflsI8g5Y2V5L2NcHggKi9cclxuICBASW5wdXQoKSBuY1NpemU6IG51bWJlciA9IDUwO1xyXG4gIC8qKiDliqjnlLvml7bplb/vvIxtcyAqL1xyXG4gIEBJbnB1dCgpIG5jRHVyYXRpb246IG51bWJlciA9IDYwMDA7XHJcbiAgLyoqIOWBnOatouWKqOeUu+aXtumXtO+8jG1z77yMMOihqOekuuS4jeWBnOatoiAqL1xyXG4gIEBJbnB1dCgpIG5jU3RvcFRpbWU6IG51bWJlciA9IDA7XHJcbiAgLyoqIOWFieadoeminOiJsu+8jOWPr+S7peaYr+WNleiJsuaIluminOiJsuaVsOe7hCAqL1xyXG4gIEBJbnB1dCgpIG5jQmVhbUNvbG9yOiBzdHJpbmcgfCBzdHJpbmdbXSA9IFtcIiNmZmFhNDBcIiwgXCIjOWM0MGZmXCJdO1xyXG4gIC8qKiDmmK/lkKblj43lkJHliqjnlLsgKi9cclxuICBwcml2YXRlIF9yZXZlcnNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNSZXZlcnNlKHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fcmV2ZXJzZSA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jUmV2ZXJzZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9yZXZlcnNlO1xyXG4gIH1cclxuICAvKiog5Yid5aeL5YGP56e75L2N572uICgwLTEwMCkg5Y2V5L2NJSAqL1xyXG4gIEBJbnB1dCgpIG5jSW5pdGlhbE9mZnNldDogbnVtYmVyID0gMDtcclxuICAvKiog6L655qGG5a695bqmIOWNleS9jXB4ICovXHJcbiAgQElucHV0KCkgbmNCb3JkZXJXaWR0aDogbnVtYmVyID0gMTtcclxuICAvKiog5piv5ZCm5ZCv55So5Yqo55S7ICovXHJcbiAgcHJpdmF0ZSBfZW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNFbmFibGVkKHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fZW5hYmxlZCA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jRW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xyXG4gIH1cclxuICAvKiog5Y+M5ZCR57uR5a6a6L6T5Ye65LqL5Lu2ICovXHJcbiAgQE91dHB1dCgpIG5jRW5hYmxlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBib3JkZXJDb250YWluZXIhOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIGJlYW1FbGVtZW50ITogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbmltYXRpb25OYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBzdG9wVGltZXI6IGFueTtcclxuICBwcml2YXRlIHN0eWxlRWxlbWVudCE6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuICAgIC8vIOS4uuavj+S4quWunuS+i+eUn+aIkOWUr+S4gOeahOWKqOeUu+WQjeensFxyXG4gICAgdGhpcy5hbmltYXRpb25OYW1lID0gYG5jQm9yZGVyQmVhbV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSl9YDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jcmVhdGVCb3JkZXJCZWFtQ29udGFpbmVyKCk7XHJcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMubmNFbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgY2hhbmdlc1snbmNFbmFibGVkJ10pIHtcclxuICAgICAgaWYgKHRoaXMubmNFbmFibGVkKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnN0b3BUaW1lcikge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zdG9wVGltZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVCb3JkZXJCZWFtQ29udGFpbmVyKCkge1xyXG4gICAgLy8g5Yib5bu66L655qGG5a655ZmoXHJcbiAgICB0aGlzLmJvcmRlckNvbnRhaW5lciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuYm9yZGVyQ29udGFpbmVyLCAnYm9yZGVyLWJlYW0tY29udGFpbmVyJyk7XHJcblxyXG4gICAgLy8g6K6+572u6L655qGG5a655Zmo5qC35byPXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyQ29udGFpbmVyLCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJDb250YWluZXIsICdpbnNldCcsICcwJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyQ29udGFpbmVyLCAnYm9yZGVyUmFkaXVzJywgJ2luaGVyaXQnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJDb250YWluZXIsICdwb2ludGVyRXZlbnRzJywgJ25vbmUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJDb250YWluZXIsICdib3JkZXInLCBgJHt0aGlzLm5jQm9yZGVyV2lkdGh9cHggc29saWQgdHJhbnNwYXJlbnRgKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJDb250YWluZXIsICdtYXNrQ2xpcCcsICdwYWRkaW5nLWJveCwgYm9yZGVyLWJveCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJvcmRlckNvbnRhaW5lciwgJ21hc2tDb21wb3NpdGUnLCAnaW50ZXJzZWN0Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyQ29udGFpbmVyLCAnbWFza0ltYWdlJywgJ2xpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCwgdHJhbnNwYXJlbnQpLCBsaW5lYXItZ3JhZGllbnQoIzAwMCwgIzAwMCknKTtcclxuXHJcbiAgICAvLyDliJvlu7rlhYnmnaHlhYPntKBcclxuICAgIHRoaXMuYmVhbUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmJlYW1FbGVtZW50LCAnYm9yZGVyLWJlYW0nKTtcclxuXHJcbiAgICAvLyDorr7nva7lhYnmnaHmoLflvI9cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iZWFtRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICd3aWR0aCcsIGAke3RoaXMubmNTaXplfXB4YCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICdhc3BlY3RSYXRpbycsICcxJyk7XHJcbiAgICAvLyDojrflj5ZzaGluZeminOiJslxyXG4gICAgY29uc3QgYmVhbUNvbG9ycyA9IEFycmF5LmlzQXJyYXkodGhpcy5uY0JlYW1Db2xvcikgPyB0aGlzLm5jQmVhbUNvbG9yLmpvaW4oJywnKSA6IHRoaXMubmNCZWFtQ29sb3I7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICdiYWNrZ3JvdW5kJywgYGxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCAke2JlYW1Db2xvcnN9LCB0cmFuc3BhcmVudClgKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iZWFtRWxlbWVudCwgJ29mZnNldFBhdGgnLCBgcmVjdCgwIGF1dG8gYXV0byAwIHJvdW5kICR7dGhpcy5uY1NpemV9cHgpYCk7XHJcbiAgICAvLyDliJ3lp4vnirbmgIHkuIvpmpDol4/lhYnmnaFcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iZWFtRWxlbWVudCwgJ29wYWNpdHknLCAnMCcpO1xyXG5cclxuICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50KS5wb3NpdGlvbjtcclxuICAgIGlmICghZWxlbWVudFBvc2l0aW9uIHx8IGVsZW1lbnRQb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOa3u+WKoOWFs+mUruW4p+WKqOeUu+agt+W8j1xyXG4gICAgdGhpcy5zdHlsZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcbiAgICBjb25zdCBzdGFydE9mZnNldCA9IHRoaXMubmNSZXZlcnNlID8gYCR7MTAwIC0gdGhpcy5uY0luaXRpYWxPZmZzZXR9JWAgOiBgJHt0aGlzLm5jSW5pdGlhbE9mZnNldH0lYDtcclxuICAgIGNvbnN0IGVuZE9mZnNldCA9IHRoaXMubmNSZXZlcnNlID8gYCR7LXRoaXMubmNJbml0aWFsT2Zmc2V0fSVgIDogYCR7MTAwICsgdGhpcy5uY0luaXRpYWxPZmZzZXR9JWA7XHJcblxyXG4gICAgY29uc3Qga2V5ZnJhbWVzID0gYFxyXG4gICAgICBAa2V5ZnJhbWVzICR7dGhpcy5hbmltYXRpb25OYW1lfSB7XHJcbiAgICAgICAgMCUge1xyXG4gICAgICAgICAgb2Zmc2V0LWRpc3RhbmNlOiAke3N0YXJ0T2Zmc2V0fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgMTAwJSB7XHJcbiAgICAgICAgICBvZmZzZXQtZGlzdGFuY2U6ICR7ZW5kT2Zmc2V0fTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIGA7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuc3R5bGVFbGVtZW50LCB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoa2V5ZnJhbWVzKSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5zdHlsZUVsZW1lbnQpO1xyXG5cclxuICAgIC8vIOWwhuWFieadoea3u+WKoOWIsOi+ueahhuWuueWZqOS4rVxyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmJvcmRlckNvbnRhaW5lciwgdGhpcy5iZWFtRWxlbWVudCk7XHJcbiAgICAvLyDlsIbovrnmoYblrrnlmajmt7vliqDliLDlrr/kuLvlhYPntKDkuK1cclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLmJvcmRlckNvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0QW5pbWF0aW9uKCkge1xyXG4gICAgaWYgKCF0aGlzLmJlYW1FbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgLy8g5pi+56S65YWJ5p2h5YWD57SgXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICdvcGFjaXR5JywgJzEnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iZWFtRWxlbWVudCwgJ2FuaW1hdGlvbicsXHJcbiAgICAgIGAke3RoaXMuYW5pbWF0aW9uTmFtZX0gJHt0aGlzLm5jRHVyYXRpb259bXMgbGluZWFyIGluZmluaXRlYCk7XHJcblxyXG4gICAgLy8g5aaC5p6c6K6+572u5LqG5YGc5q2i5pe26Ze077yM5YiZ5Zyo5oyH5a6a5pe26Ze05ZCO5qCH6K6w6ZyA6KaB5YGc5q2iXHJcbiAgICBpZiAodGhpcy5uY1N0b3BUaW1lID4gMCkge1xyXG4gICAgICB0aGlzLnN0b3BUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xyXG4gICAgICAgIC8vIOW9k+WboOS4uiBuY1N0b3BUaW1lIOWBnOatouWKqOeUu+aXtu+8jOabtOaWsCBuY0VuYWJsZWQg5YC85bm25Y+R5Ye65LqL5Lu2XHJcbiAgICAgICAgdGhpcy5uY0VuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm5jRW5hYmxlZENoYW5nZS5lbWl0KGZhbHNlKTtcclxuICAgICAgfSwgdGhpcy5uY1N0b3BUaW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RvcEFuaW1hdGlvbigpIHtcclxuICAgIGlmICghdGhpcy5iZWFtRWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLnN0b3BUaW1lcikge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zdG9wVGltZXIpO1xyXG4gICAgICB0aGlzLnN0b3BUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJlYW1FbGVtZW50LCAnYW5pbWF0aW9uJywgJ25vbmUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iZWFtRWxlbWVudCwgJ29wYWNpdHknLCAnMCcpO1xyXG4gIH1cclxufSJdfQ==