UNPKG

ng-cw-v12

Version:

Angular UI Component Library

177 lines 24.8 kB
import { Component, Input, ViewChild, HostListener } from '@angular/core'; import * as i0 from "@angular/core"; export class AutoScrollTextComponent { constructor(ngZone) { this.ngZone = ngZone; this.position = 0; this.isPaused = false; this.lastTimestamp = 0; this.pauseStartTime = 0; /** 滚动文本 */ this.ncText = ''; /** 滚动速度,单位为像素/秒 */ this.ncSpeed = 50; /** 是否开启无缝滚动 */ this._loop = false; /** 开启无缝滚动时,间距,单位为像素 */ this.ncGap = 0; /** 是否启用鼠标悬停暂停滚动 */ this._pause = false; } set ncLoop(val) { this._loop = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncLoop() { return this._loop; } set ncPause(val) { this._pause = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncPause() { return this._pause; } ngAfterViewInit() { this.resetScroll(); } ngOnChanges(changes) { if (changes['ncText'] && !changes['ncText'].firstChange) { this.resetScroll(); } } ngOnDestroy() { if (this.animationId) { cancelAnimationFrame(this.animationId); } } // 鼠标移入事件处理 onMouseEnter() { if (this.ncPause) { this.isPaused = true; this.pauseStartTime = performance.now(); } } // 鼠标移出事件处理 onMouseLeave() { if (this.ncPause && this.isPaused) { this.isPaused = false; const pauseDuration = performance.now() - this.pauseStartTime; this.lastTimestamp += pauseDuration; } } startScrolling() { // 检查文本是否需要滚动 if (!this.textContainer || !this.scrollText) return; this.ngZone.runOutsideAngular(() => { const containerWidth = this.textContainer.nativeElement.offsetWidth; const textWidth = this.scrollText.nativeElement.offsetWidth; // 只有当文本宽度大于容器宽度时才滚动 if (textWidth > containerWidth) { this.lastTimestamp = 0; const animate = (timestamp) => { if (!this.lastTimestamp) this.lastTimestamp = timestamp; // 当不处于暂停状态时才计算位移 if (!this.isPaused) { const elapsed = timestamp - this.lastTimestamp; // 根据时间和速度计算位移 this.position += (elapsed / 1000) * this.ncSpeed; // 当文本的最后一个字符出现在视窗内时创建复制文本实现无缝衔接 if (this.position >= textWidth - containerWidth) { if (this.ncLoop) { // 让文本平滑地重新开始滚动,而不是突然跳回开始位置 // 将第二份文本复制品拼接在原文本后面,实现无缝衔接效果 if (!this.scrollText.nativeElement.querySelector('.duplicate-text')) { const duplicateText = document.createElement('span'); duplicateText.classList.add('duplicate-text'); duplicateText.textContent = this.ncText; duplicateText.style.marginLeft = `${this.ncGap}px`; this.scrollText.nativeElement.appendChild(duplicateText); } } else { // 不开启无缝滚动时,当文本的最后一个字符出现在视窗内时重新开始 this.position = 0; } } // 实现真正的无缝滚动:当滚动位置超过第一段文本宽度时,重置位置并保持视觉连续 if (this.ncLoop && this.position >= textWidth + this.ncGap) { // 重置位置,但保持视觉效果不变 this.position = 0; // 移除复制的文本元素 const duplicateText = this.scrollText.nativeElement.querySelector('.duplicate-text'); if (duplicateText) { this.scrollText.nativeElement.removeChild(duplicateText); } // 立即重新设置transform,避免闪烁 this.scrollText.nativeElement.style.transform = 'translateX(0)'; // 立即创建新的复制文本 const newDuplicateText = document.createElement('span'); newDuplicateText.classList.add('duplicate-text'); newDuplicateText.textContent = this.ncText; newDuplicateText.style.marginLeft = `${this.ncGap}px`; this.scrollText.nativeElement.appendChild(newDuplicateText); } else { // 应用位移 this.scrollText.nativeElement.style.transform = `translateX(-${this.position}px)`; } // 更新时间戳 this.lastTimestamp = timestamp; } this.animationId = requestAnimationFrame(animate); }; this.animationId = requestAnimationFrame(animate); } }); } resetScroll() { if (this.animationId) { cancelAnimationFrame(this.animationId); } this.position = 0; this.isPaused = false; if (this.scrollText) { this.scrollText.nativeElement.style.transform = 'translateX(0)'; // 清除可能存在的重复文本 const duplicateText = this.scrollText.nativeElement.querySelector('.duplicate-text'); if (duplicateText) { this.scrollText.nativeElement.removeChild(duplicateText); } } this.startScrolling(); } } AutoScrollTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AutoScrollTextComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); AutoScrollTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AutoScrollTextComponent, selector: "nc-auto-scroll-text", inputs: { ncText: "ncText", ncSpeed: "ncSpeed", ncLoop: "ncLoop", ncGap: "ncGap", ncPause: "ncPause" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, viewQueries: [{ propertyName: "textContainer", first: true, predicate: ["textContainer"], descendants: true }, { propertyName: "scrollText", first: true, predicate: ["scrollText"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"auto-scroll-container\" #textContainer>\n <div class=\"scroll-text\" #scrollText>\n <span>{{ ncText }}</span>\n </div>\n</div>\n", styles: [".auto-scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;white-space:nowrap}\n"] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AutoScrollTextComponent, decorators: [{ type: Component, args: [{ selector: 'nc-auto-scroll-text', templateUrl: './auto-scroll-text.component.html', styleUrls: ['./auto-scroll-text.component.less'] }] }], ctorParameters: function () { return [{ type: i0.NgZone }]; }, propDecorators: { textContainer: [{ type: ViewChild, args: ['textContainer'] }], scrollText: [{ type: ViewChild, args: ['scrollText'] }], ncText: [{ type: Input }], ncSpeed: [{ type: Input }], ncLoop: [{ type: Input }], ncGap: [{ type: Input }], ncPause: [{ type: Input }], onMouseEnter: [{ type: HostListener, args: ['mouseenter'] }], onMouseLeave: [{ type: HostListener, args: ['mouseleave'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2F1dG8tc2Nyb2xsLXRleHQvYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2F1dG8tc2Nyb2xsLXRleHQvYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFpQixLQUFLLEVBQWMsU0FBUyxFQUFhLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7O0FBT2xKLE1BQU0sT0FBTyx1QkFBdUI7SUFtQ2xDLFlBQW9CLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBOUIxQixhQUFRLEdBQVcsQ0FBQyxDQUFDO1FBQ3JCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFFbkMsV0FBVztRQUNGLFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDN0IsbUJBQW1CO1FBQ1YsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUM5QixlQUFlO1FBQ1AsVUFBSyxHQUFZLEtBQUssQ0FBQztRQVEvQix1QkFBdUI7UUFDZCxVQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLG1CQUFtQjtRQUNYLFdBQU0sR0FBWSxLQUFLLENBQUM7SUFTTSxDQUFDO0lBbkJ2QyxJQUNJLE1BQU0sQ0FBQyxHQUFxQjtRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssS0FBSyxJQUFJLEdBQUcsS0FBSyxPQUFPLENBQUM7SUFDckYsQ0FBQztJQUNELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJ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QztJQUN4QixDQUFDOztvSEFwS1UsdUJBQXVCO3dHQUF2Qix1QkFBdUIsNGRDUHBDLG9KQUtBOzJGREVhLHVCQUF1QjtrQkFMbkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUscUJBQXFCO29CQUMvQixXQUFXLEVBQUUsbUNBQW1DO29CQUNoRCxTQUFTLEVBQUUsQ0FBQyxtQ0FBbUMsQ0FBQztpQkFDakQ7NkZBRTZCLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZTtnQkFDRCxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBU2QsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFJRixNQUFNO3NCQURULEtBQUs7Z0JBUUcsS0FBSztzQkFBYixLQUFLO2dCQUlGLE9BQU87c0JBRFYsS0FBSztnQkE0Qk4sWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFlBQVk7Z0JBVTFCLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBBZnRlclZpZXdJbml0LCBJbnB1dCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBPbkRlc3Ryb3ksIEhvc3RMaXN0ZW5lciwgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmMtYXV0by1zY3JvbGwtdGV4dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG8tc2Nyb2xsLXRleHQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2F1dG8tc2Nyb2xsLXRleHQuY29tcG9uZW50Lmxlc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0b1Njcm9sbFRleHRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgQFZpZXdDaGlsZCgndGV4dENvbnRhaW5lcicpIHRleHRDb250YWluZXIhOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbFRleHQnKSBzY3JvbGxUZXh0ITogRWxlbWVudFJlZjtcclxuXHJcbiAgcHJpdmF0ZSBhbmltYXRpb25JZCE6IG51bWJlcjtcclxuICBwcml2YXRlIHBvc2l0aW9uOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgaXNQYXVzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGxhc3RUaW1lc3RhbXA6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBwYXVzZVN0YXJ0VGltZTogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqIOa7muWKqOaWh+acrCAqL1xyXG4gIEBJbnB1dCgpIG5jVGV4dDogc3RyaW5nID0gJyc7XHJcbiAgLyoqIOa7muWKqOmAn+W6pu+8jOWNleS9jeS4uuWDj+e0oC/np5IgKi9cclxuICBASW5wdXQoKSBuY1NwZWVkOiBudW1iZXIgPSA1MDtcclxuICAvKiog5piv5ZCm5byA5ZCv5peg57yd5rua5YqoICovXHJcbiAgcHJpdmF0ZSBfbG9vcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jTG9vcCh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2xvb3AgPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY0xvb3AoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbG9vcDtcclxuICB9XHJcbiAgLyoqIOW8gOWQr+aXoOe8nea7muWKqOaXtu+8jOmXtOi3ne+8jOWNleS9jeS4uuWDj+e0oCAqL1xyXG4gIEBJbnB1dCgpIG5jR2FwOiBudW1iZXIgPSAwO1xyXG4gIC8qKiDmmK/lkKblkK/nlKjpvKDmoIfmgqzlgZzmmoLlgZzmu5rliqggKi9cclxuICBwcml2YXRlIF9wYXVzZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jUGF1c2UodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9wYXVzZSA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jUGF1c2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGF1c2U7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lKSB7IH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXNldFNjcm9sbCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ25jVGV4dCddICYmICFjaGFuZ2VzWyduY1RleHQnXS5maXJzdENoYW5nZSkge1xyXG4gICAgICB0aGlzLnJlc2V0U2Nyb2xsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmFuaW1hdGlvbklkKSB7XHJcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6byg5qCH56e75YWl5LqL5Lu25aSE55CGXHJcbiAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicpXHJcbiAgb25Nb3VzZUVudGVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubmNQYXVzZSkge1xyXG4gICAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5wYXVzZVN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6byg5qCH56e75Ye65LqL5Lu25aSE55CGXHJcbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXHJcbiAgb25Nb3VzZUxlYXZlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubmNQYXVzZSAmJiB0aGlzLmlzUGF1c2VkKSB7XHJcbiAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgY29uc3QgcGF1c2VEdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gdGhpcy5wYXVzZVN0YXJ0VGltZTtcclxuICAgICAgdGhpcy5sYXN0VGltZXN0YW1wICs9IHBhdXNlRHVyYXRpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0U2Nyb2xsaW5nKCk6IHZvaWQge1xyXG4gICAgLy8g5qOA5p+l5paH5pys5piv5ZCm6ZyA6KaB5rua5YqoXHJcbiAgICBpZiAoIXRoaXMudGV4dENvbnRhaW5lciB8fCAhdGhpcy5zY3JvbGxUZXh0KSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMudGV4dENvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICBjb25zdCB0ZXh0V2lkdGggPSB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICAgIC8vIOWPquacieW9k+aWh+acrOWuveW6puWkp+S6juWuueWZqOWuveW6puaXtuaJjea7muWKqFxyXG4gICAgICBpZiAodGV4dFdpZHRoID4gY29udGFpbmVyV2lkdGgpIHtcclxuICAgICAgICB0aGlzLmxhc3RUaW1lc3RhbXAgPSAwO1xyXG5cclxuICAgICAgICBjb25zdCBhbmltYXRlID0gKHRpbWVzdGFtcDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMubGFzdFRpbWVzdGFtcCkgdGhpcy5sYXN0VGltZXN0YW1wID0gdGltZXN0YW1wO1xyXG5cclxuICAgICAgICAgIC8vIOW9k+S4jeWkhOS6juaaguWBnOeKtuaAgeaXtuaJjeiuoeeul+S9jeenu1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmlzUGF1c2VkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSB0aW1lc3RhbXAgLSB0aGlzLmxhc3RUaW1lc3RhbXA7XHJcblxyXG4gICAgICAgICAgICAvLyDmoLnmja7ml7bpl7TlkozpgJ/luqborqHnrpfkvY3np7tcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiArPSAoZWxhcHNlZCAvIDEwMDApICogdGhpcy5uY1NwZWVkO1xyXG5cclxuICAgICAgICAgICAgLy8g5b2T5paH5pys55qE5pyA5ZCO5LiA5Liq5a2X56ym5Ye6546w5Zyo6KeG56qX5YaF5pe25Yib5bu65aSN5Yi25paH5pys5a6e546w5peg57yd6KGU5o6lXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRleHRXaWR0aCAtIGNvbnRhaW5lcldpZHRoKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMubmNMb29wKSB7XHJcbiAgICAgICAgICAgICAgICAvLyDorqnmlofmnKzlubPmu5HlnLDph43mlrDlvIDlp4vmu5rliqjvvIzogIzkuI3mmK/nqoHnhLbot7Plm57lvIDlp4vkvY3nva5cclxuICAgICAgICAgICAgICAgIC8vIOWwhuesrOS6jOS7veaWh+acrOWkjeWItuWTgeaLvOaOpeWcqOWOn+aWh+acrOWQjumdou+8jOWunueOsOaXoOe8neihlOaOpeaViOaenFxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZHVwbGljYXRlLXRleHQnKSkge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgICAgICAgICAgICBkdXBsaWNhdGVUZXh0LmNsYXNzTGlzdC5hZGQoJ2R1cGxpY2F0ZS10ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZVRleHQudGV4dENvbnRlbnQgPSB0aGlzLm5jVGV4dDtcclxuICAgICAgICAgICAgICAgICAgZHVwbGljYXRlVGV4dC5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7dGhpcy5uY0dhcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGR1cGxpY2F0ZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyDkuI3lvIDlkK/ml6DnvJ3mu5rliqjml7bvvIzlvZPmlofmnKznmoTmnIDlkI7kuIDkuKrlrZfnrKblh7rnjrDlnKjop4bnqpflhoXml7bph43mlrDlvIDlp4tcclxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSAwO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8g5a6e546w55yf5q2j55qE5peg57yd5rua5Yqo77ya5b2T5rua5Yqo5L2N572u6LaF6L+H56ys5LiA5q615paH5pys5a695bqm5pe277yM6YeN572u5L2N572u5bm25L+d5oyB6KeG6KeJ6L+e57utXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5jTG9vcCAmJiB0aGlzLnBvc2l0aW9uID49IHRleHRXaWR0aCArIHRoaXMubmNHYXApIHtcclxuICAgICAgICAgICAgICAvLyDph43nva7kvY3nva7vvIzkvYbkv53mjIHop4bop4nmlYjmnpzkuI3lj5hcclxuICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgLy8g56e76Zmk5aSN5Yi255qE5paH5pys5YWD57SgXHJcbiAgICAgICAgICAgICAgY29uc3QgZHVwbGljYXRlVGV4dCA9IHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kdXBsaWNhdGUtdGV4dCcpO1xyXG4gICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVUZXh0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChkdXBsaWNhdGVUZXh0KTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIC8vIOeri+WNs+mHjeaWsOiuvue9rnRyYW5zZm9ybe+8jOmBv+WFjemXqueDgVxyXG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKDApJztcclxuXHJcbiAgICAgICAgICAgICAgLy8g56uL5Y2z5Yib5bu65paw55qE5aSN5Yi25paH5pysXHJcbiAgICAgICAgICAgICAgY29uc3QgbmV3RHVwbGljYXRlVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgICAgICAgICBuZXdEdXBsaWNhdGVUZXh0LmNsYXNzTGlzdC5hZGQoJ2R1cGxpY2F0ZS10ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgbmV3RHVwbGljYXRlVGV4dC50ZXh0Q29udGVudCA9IHRoaXMubmNUZXh0O1xyXG4gICAgICAgICAgICAgIG5ld0R1cGxpY2F0ZVRleHQuc3R5bGUubWFyZ2luTGVmdCA9IGAke3RoaXMubmNHYXB9cHhgO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKG5ld0R1cGxpY2F0ZVRleHQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIOW6lOeUqOS9jeenu1xyXG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKC0ke3RoaXMucG9zaXRpb259cHgpYDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8g5pu05paw5pe26Ze05oizXHJcbiAgICAgICAgICAgIHRoaXMubGFzdFRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmFuaW1hdGlvbklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldFNjcm9sbCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmFuaW1hdGlvbklkKSB7XHJcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uSWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wb3NpdGlvbiA9IDA7XHJcbiAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5zY3JvbGxUZXh0KSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKDApJztcclxuICAgICAgLy8g5riF6Zmk5Y+v6IO95a2Y5Zyo55qE6YeN5aSN5paH5pysXHJcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZVRleHQgPSB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZHVwbGljYXRlLXRleHQnKTtcclxuICAgICAgaWYgKGR1cGxpY2F0ZVRleHQpIHtcclxuICAgICAgICB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChkdXBsaWNhdGVUZXh0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zdGFydFNjcm9sbGluZygpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYXV0by1zY3JvbGwtY29udGFpbmVyXCIgI3RleHRDb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJzY3JvbGwtdGV4dFwiICNzY3JvbGxUZXh0PlxuICAgIDxzcGFuPnt7IG5jVGV4dCB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==