ng-cw-v12
Version:
Angular UI component library
178 lines • 24.2 kB
JavaScript
import { Component, Input, ViewChild, HostListener } from '@angular/core';
import * as i0 from "@angular/core";
export class AutoScrollTextComponent {
constructor() {
this.position = 0;
this.isPaused = false;
this.lastTimestamp = 0;
this.pauseStartTime = 0;
// 滚动文本
this._text = '';
// 滚动速度,单位为像素/秒
this.ncSpeed = 50;
// 是否开启无缝滚动
this._loop = false;
// 开启无缝滚动时,间距,单位为像素
this.ncGap = 0;
// 是否启用鼠标悬停暂停滚动
this._pause = false;
}
set ncText(val) {
this._text = val;
setTimeout(() => {
if (this.textContainer && this.scrollText) {
this.resetScroll();
}
});
}
get ncText() {
return this._text;
}
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;
}
ngOnInit() { }
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;
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: [], 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 }], 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 []; }, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2F1dG8tc2Nyb2xsLXRleHQvYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2F1dG8tc2Nyb2xsLXRleHQvYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYyxTQUFTLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU96RyxNQUFNLE9BQU8sdUJBQXVCO0lBK0NsQztRQTFDUSxhQUFRLEdBQVcsQ0FBQyxDQUFDO1FBQ3JCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFFbkMsT0FBTztRQUNDLFVBQUssR0FBVyxFQUFFLENBQUM7UUFhM0IsZUFBZTtRQUNOLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDOUIsV0FBVztRQUNILFVBQUssR0FBWSxLQUFLLENBQUM7UUFRL0IsbUJBQW1CO1FBQ1YsVUFBSyxHQUFXLENBQUMsQ0FBQztRQUMzQixlQUFlO1FBQ1AsV0FBTSxHQUFZLEtBQUssQ0FBQztJQVNoQixDQUFDO0lBbkNqQixJQUNJLE1BQU0sQ0FBQyxHQUFXO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDekMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3BCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJ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O3dHQUF2Qix1QkFBdUIsdWNDUHBDLG9KQUtBOzJGREVhLHVCQUF1QjtrQkFMbkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUscUJBQXFCO29CQUMvQixXQUFXLEVBQUUsbUNBQW1DO29CQUNoRCxTQUFTLEVBQUUsQ0FBQyxtQ0FBbUMsQ0FBQztpQkFDakQ7MEVBRTZCLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZTtnQkFDRCxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBV25CLE1BQU07c0JBRFQsS0FBSztnQkFhRyxPQUFPO3NCQUFmLEtBQUs7Z0JBSUYsTUFBTTtzQkFEVCxLQUFLO2dCQVFHLEtBQUs7c0JBQWIsS0FBSztnQkFJRixPQUFPO3NCQURWLEtBQUs7Z0JBb0JOLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZO2dCQVUxQixZQUFZO3NCQURYLFlBQVk7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBPbkRlc3Ryb3ksIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYy1hdXRvLXNjcm9sbC10ZXh0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRvU2Nyb2xsVGV4dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKCd0ZXh0Q29udGFpbmVyJykgdGV4dENvbnRhaW5lciE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnc2Nyb2xsVGV4dCcpIHNjcm9sbFRleHQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBwcml2YXRlIGFuaW1hdGlvbklkITogbnVtYmVyO1xyXG4gIHByaXZhdGUgcG9zaXRpb246IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBpc1BhdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbGFzdFRpbWVzdGFtcDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIHBhdXNlU3RhcnRUaW1lOiBudW1iZXIgPSAwO1xyXG5cclxuICAvLyDmu5rliqjmlofmnKxcclxuICBwcml2YXRlIF90ZXh0OiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY1RleHQodmFsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3RleHQgPSB2YWw7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMudGV4dENvbnRhaW5lciAmJiB0aGlzLnNjcm9sbFRleHQpIHtcclxuICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBnZXQgbmNUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGV4dDtcclxuICB9XHJcbiAgLy8g5rua5Yqo6YCf5bqm77yM5Y2V5L2N5Li65YOP57SgL+enklxyXG4gIEBJbnB1dCgpIG5jU3BlZWQ6IG51bWJlciA9IDUwO1xyXG4gIC8vIOaYr+WQpuW8gOWQr+aXoOe8nea7muWKqFxyXG4gIHByaXZhdGUgX2xvb3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY0xvb3AodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9sb29wID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNMb29wKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvb3A7XHJcbiAgfVxyXG4gIC8vIOW8gOWQr+aXoOe8nea7muWKqOaXtu+8jOmXtOi3ne+8jOWNleS9jeS4uuWDj+e0oFxyXG4gIEBJbnB1dCgpIG5jR2FwOiBudW1iZXIgPSAwO1xyXG4gIC8vIOaYr+WQpuWQr+eUqOm8oOagh+aCrOWBnOaaguWBnOa7muWKqFxyXG4gIHByaXZhdGUgX3BhdXNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNQYXVzZSh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3BhdXNlID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNQYXVzZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wYXVzZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQgeyB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uSWQpIHtcclxuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRpb25JZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDpvKDmoIfnp7vlhaXkuovku7blpITnkIZcclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJylcclxuICBvbk1vdXNlRW50ZXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5uY1BhdXNlKSB7XHJcbiAgICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnBhdXNlU3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDpvKDmoIfnp7vlh7rkuovku7blpITnkIZcclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcclxuICBvbk1vdXNlTGVhdmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5uY1BhdXNlICYmIHRoaXMuaXNQYXVzZWQpIHtcclxuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICBjb25zdCBwYXVzZUR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSB0aGlzLnBhdXNlU3RhcnRUaW1lO1xyXG4gICAgICB0aGlzLmxhc3RUaW1lc3RhbXAgKz0gcGF1c2VEdXJhdGlvbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhcnRTY3JvbGxpbmcoKTogdm9pZCB7XHJcbiAgICAvLyDmo4Dmn6XmlofmnKzmmK/lkKbpnIDopoHmu5rliqhcclxuICAgIGlmICghdGhpcy50ZXh0Q29udGFpbmVyIHx8ICF0aGlzLnNjcm9sbFRleHQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMudGV4dENvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgY29uc3QgdGV4dFdpZHRoID0gdGhpcy5zY3JvbGxUZXh0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcblxyXG4gICAgLy8g5Y+q5pyJ5b2T5paH5pys5a695bqm5aSn5LqO5a655Zmo5a695bqm5pe25omN5rua5YqoXHJcbiAgICBpZiAodGV4dFdpZHRoID4gY29udGFpbmVyV2lkdGgpIHtcclxuICAgICAgdGhpcy5sYXN0VGltZXN0YW1wID0gMDtcclxuXHJcbiAgICAgIGNvbnN0IGFuaW1hdGUgPSAodGltZXN0YW1wOiBudW1iZXIpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMubGFzdFRpbWVzdGFtcCkgdGhpcy5sYXN0VGltZXN0YW1wID0gdGltZXN0YW1wO1xyXG5cclxuICAgICAgICAvLyDlvZPkuI3lpITkuo7mmoLlgZznirbmgIHml7bmiY3orqHnrpfkvY3np7tcclxuICAgICAgICBpZiAoIXRoaXMuaXNQYXVzZWQpIHtcclxuICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSB0aW1lc3RhbXAgLSB0aGlzLmxhc3RUaW1lc3RhbXA7XHJcblxyXG4gICAgICAgICAgLy8g5qC55o2u5pe26Ze05ZKM6YCf5bqm6K6h566X5L2N56e7XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uICs9IChlbGFwc2VkIC8gMTAwMCkgKiB0aGlzLm5jU3BlZWQ7XHJcblxyXG4gICAgICAgICAgLy8g5b2T5paH5pys55qE5pyA5ZCO5LiA5Liq5a2X56ym5Ye6546w5Zyo6KeG56qX5YaF5pe25Yib5bu65aSN5Yi25paH5pys5a6e546w5peg57yd6KGU5o6lXHJcbiAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA+PSB0ZXh0V2lkdGggLSBjb250YWluZXJXaWR0aCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5uY0xvb3ApIHtcclxuICAgICAgICAgICAgICAvLyDorqnmlofmnKzlubPmu5HlnLDph43mlrDlvIDlp4vmu5rliqjvvIzogIzkuI3mmK/nqoHnhLbot7Plm57lvIDlp4vkvY3nva5cclxuICAgICAgICAgICAgICAvLyDlsIbnrKzkuozku73mlofmnKzlpI3liLblk4Hmi7zmjqXlnKjljp/mlofmnKzlkI7pnaLvvIzlrp7njrDml6DnvJ3ooZTmjqXmlYjmnpxcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kdXBsaWNhdGUtdGV4dCcpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgICAgICAgICAgZHVwbGljYXRlVGV4dC5jbGFzc0xpc3QuYWRkKCdkdXBsaWNhdGUtdGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgZHVwbGljYXRlVGV4dC50ZXh0Q29udGVudCA9IHRoaXMubmNUZXh0O1xyXG4gICAgICAgICAgICAgICAgZHVwbGljYXRlVGV4dC5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7dGhpcy5uY0dhcH1weGA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChkdXBsaWNhdGVUZXh0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8g5LiN5byA5ZCv5peg57yd5rua5Yqo5pe277yM5b2T5paH5pys55qE5pyA5ZCO5LiA5Liq5a2X56ym5Ye6546w5Zyo6KeG56qX5YaF5pe26YeN5paw5byA5aeLXHJcbiAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyDlrp7njrDnnJ/mraPnmoTml6DnvJ3mu5rliqjvvJrlvZPmu5rliqjkvY3nva7otoXov4fnrKzkuIDmrrXmlofmnKzlrr3luqbml7bvvIzph43nva7kvY3nva7lubbkv53mjIHop4bop4nov57nu61cclxuICAgICAgICAgIGlmICh0aGlzLm5jTG9vcCAmJiB0aGlzLnBvc2l0aW9uID49IHRleHRXaWR0aCArIHRoaXMubmNHYXApIHtcclxuICAgICAgICAgICAgLy8g6YeN572u5L2N572u77yM5L2G5L+d5oyB6KeG6KeJ5pWI5p6c5LiN5Y+YXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSAwO1xyXG5cclxuICAgICAgICAgICAgLy8g56e76Zmk5aSN5Yi255qE5paH5pys5YWD57SgXHJcbiAgICAgICAgICAgIGNvbnN0IGR1cGxpY2F0ZVRleHQgPSB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZHVwbGljYXRlLXRleHQnKTtcclxuICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZVRleHQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChkdXBsaWNhdGVUZXh0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8g56uL5Y2z6YeN5paw6K6+572udHJhbnNmb3Jt77yM6YG/5YWN6Zeq54OBXHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKDApJztcclxuXHJcbiAgICAgICAgICAgIC8vIOeri+WNs+WIm+W7uuaWsOeahOWkjeWItuaWh+acrFxyXG4gICAgICAgICAgICBjb25zdCBuZXdEdXBsaWNhdGVUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgICAgICBuZXdEdXBsaWNhdGVUZXh0LmNsYXNzTGlzdC5hZGQoJ2R1cGxpY2F0ZS10ZXh0Jyk7XHJcbiAgICAgICAgICAgIG5ld0R1cGxpY2F0ZVRleHQudGV4dENvbnRlbnQgPSB0aGlzLm5jVGV4dDtcclxuICAgICAgICAgICAgbmV3RHVwbGljYXRlVGV4dC5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7dGhpcy5uY0dhcH1weGA7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKG5ld0R1cGxpY2F0ZVRleHQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8g5bqU55So5L2N56e7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKC0ke3RoaXMucG9zaXRpb259cHgpYDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyDmm7TmlrDml7bpl7TmiLNcclxuICAgICAgICAgIHRoaXMubGFzdFRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLmFuaW1hdGlvbklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldFNjcm9sbCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmFuaW1hdGlvbklkKSB7XHJcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uSWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wb3NpdGlvbiA9IDA7XHJcbiAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5zY3JvbGxUZXh0KSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKDApJztcclxuICAgICAgLy8g5riF6Zmk5Y+v6IO95a2Y5Zyo55qE6YeN5aSN5paH5pysXHJcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZVRleHQgPSB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZHVwbGljYXRlLXRleHQnKTtcclxuICAgICAgaWYgKGR1cGxpY2F0ZVRleHQpIHtcclxuICAgICAgICB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChkdXBsaWNhdGVUZXh0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zdGFydFNjcm9sbGluZygpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYXV0by1zY3JvbGwtY29udGFpbmVyXCIgI3RleHRDb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJzY3JvbGwtdGV4dFwiICNzY3JvbGxUZXh0PlxuICAgIDxzcGFuPnt7IG5jVGV4dCB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==