ng-cw-v12
Version:
Angular UI component library
115 lines • 18.2 kB
JavaScript
import { Component, Input } from '@angular/core';
import * as i0 from "@angular/core";
export class CarouselListComponent {
constructor(eleRef, cdr) {
this.eleRef = eleRef;
this.cdr = cdr;
this.ncTime = 1; //多少秒滚动一格
this.ncRow = 1; //显示多少行
this.liCount = 0; //计算
this.liHeight = 0; //计算
// 将事件处理函数定义为类的属性
this.handleMouseEnter = () => {
const ul = this.eleRef.nativeElement.querySelector('ul');
if (!ul)
return;
ul.style.animationPlayState = 'paused';
Array.from(ul.getElementsByTagName('li')).forEach(li => {
li.style.animationPlayState = 'paused';
});
};
this.handleMouseLeave = () => {
const ul = this.eleRef.nativeElement.querySelector('ul');
if (!ul)
return;
ul.style.animationPlayState = 'running';
Array.from(ul.getElementsByTagName('li')).forEach(li => {
li.style.animationPlayState = 'running';
});
};
}
ngAfterViewInit() {
this.initializeCarousel();
this.setupMutationObserver();
}
initializeCarousel() {
let ul = this.eleRef.nativeElement.querySelector('ul');
if (!ul)
return;
const liElements = Array.from(ul.getElementsByTagName('li')).filter(li => !li.classList.contains('cloned'));
if (liElements.length === 0)
return;
this.liCount = liElements.length;
this.liHeight = liElements[0].offsetHeight;
this.ncRow = this.ncRow <= this.liCount ? this.ncRow : this.liCount;
// 清除之前可能添加的克隆元素
const clonedElements = ul.querySelectorAll('.cloned');
clonedElements.forEach(el => el.remove());
// 添加新的克隆元素
let copy = liElements.slice(0, this.ncRow).map((li) => {
const clonedLi = li.cloneNode(true);
clonedLi.classList.add('cloned');
return clonedLi;
});
copy.forEach(li => ul.appendChild(li));
// 重置动画
ul.style.animation = 'none';
ul.offsetHeight; // 触发重排
ul.style.animation = `move calc(${this.ncTime} * ${this.liCount} * 1s) steps(${this.liCount}) infinite`;
// 重置所有 li 的动画
const allLis = ul.getElementsByTagName('li');
Array.from(allLis).forEach(li => {
li.style.animation = 'none';
li.offsetHeight; // 触发重排
li.style.animation = `liMove calc(${this.ncTime} * 1s) infinite`;
});
// 先移除旧的事件监听器,再添加新的
ul.removeEventListener('mouseenter', this.handleMouseEnter);
ul.removeEventListener('mouseleave', this.handleMouseLeave);
ul.addEventListener('mouseenter', this.handleMouseEnter);
ul.addEventListener('mouseleave', this.handleMouseLeave);
//在操作完 DOM 后调用 detectChanges() 确保变更被正确检测,防止下面的错误,用setTimeout的话该组件存在闪烁的问题
//ERROR RuntimeError: NG0100: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: '0'. Current value: '5'.. Find more at https://angular.io/errors/NG0100
this.cdr.detectChanges();
}
setupMutationObserver() {
const ul = this.eleRef.nativeElement.querySelector('ul');
if (!ul)
return;
this.observer = new MutationObserver(() => {
// console.log('数据发生变化');
this.initializeCarousel();
});
this.observer.observe(ul, {
// childList: true,//该项开启后非常卡顿,initializeCarousel会一直执行
subtree: true,
characterData: true
});
}
ngOnDestroy() {
if (this.observer) {
this.observer.disconnect();
}
// 使用类属性中定义的事件处理函数来移除监听器
const ul = this.eleRef.nativeElement.querySelector('ul');
if (ul) {
ul.removeEventListener('mouseenter', this.handleMouseEnter);
ul.removeEventListener('mouseleave', this.handleMouseLeave);
}
}
}
CarouselListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CarouselListComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
CarouselListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: CarouselListComponent, selector: "nc-carousel-list", inputs: { ncTime: "ncTime", ncRow: "ncRow" }, ngImport: i0, template: "<div class=\"carousel\" style=\"--liCount: {{liCount}};--liHeight: {{liHeight}};--speed: {{ncTime}};--row: {{ncRow}};\">\r\n <ng-content></ng-content>\r\n</div>", styles: ["::ng-deep .carousel{height:calc(var(--liHeight) * 1px * var(--row));overflow:hidden}::ng-deep .carousel ul{margin:0;padding:0}::ng-deep .carousel ul li{list-style:none;cursor:pointer}@keyframes move{0%{transform:translate(0)}to{transform:translateY(calc(var(--liCount) * var(--liHeight) * -1px))}}@keyframes liMove{0%{transform:translate(0)}80%,to{transform:translateY(calc(var(--liHeight) * -1px))}}\n"] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CarouselListComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-carousel-list',
templateUrl: './carousel-list.component.html',
styleUrls: ['./carousel-list.component.less']
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { ncTime: [{
type: Input
}], ncRow: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2Nhcm91c2VsLWxpc3QvY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2Nhcm91c2VsLWxpc3QvY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7O0FBTzFHLE1BQU0sT0FBTyxxQkFBcUI7SUEwQmhDLFlBQ1UsTUFBa0IsRUFDbEIsR0FBc0I7UUFEdEIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTNCdkIsV0FBTSxHQUFXLENBQUMsQ0FBQyxDQUFBLFNBQVM7UUFDNUIsVUFBSyxHQUFXLENBQUMsQ0FBQyxDQUFBLE9BQU87UUFDbEMsWUFBTyxHQUFXLENBQUMsQ0FBQyxDQUFBLElBQUk7UUFDeEIsYUFBUSxHQUFXLENBQUMsQ0FBQyxDQUFBLElBQUk7UUFHekIsaUJBQWlCO1FBQ1QscUJBQWdCLEdBQUcsR0FBRyxFQUFFO1lBQzlCLE1BQU0sRUFBRSxHQUFnQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLEVBQUU7Z0JBQUUsT0FBTztZQUNoQixFQUFFLENBQUMsS0FBSyxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQztZQUN2QyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDckQsRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7WUFDekMs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QUFzRDtZQUN0RCxPQUFPLEVBQUUsSUFBSTtZQUNiLGFBQWEsRUFBRSxJQUFJO1NBQ3BCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDNUI7UUFDRCx3QkFBd0I7UUFDeEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELElBQUksRUFBRSxFQUFFO1lBQ04sRUFBRSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM1RCxFQUFFLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQzs7a0hBOUdVLHFCQUFxQjtzR0FBckIscUJBQXFCLHNHQ1BsQyxxS0FFTTsyRkRLTyxxQkFBcUI7a0JBTGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsV0FBVyxFQUFFLGdDQUFnQztvQkFDN0MsU0FBUyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7aUJBQzlDO2lJQUVVLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25jLWNhcm91c2VsLWxpc3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jYXJvdXNlbC1saXN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYXJvdXNlbC1saXN0LmNvbXBvbmVudC5sZXNzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENhcm91c2VsTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgbmNUaW1lOiBudW1iZXIgPSAxOy8v5aSa5bCR56eS5rua5Yqo5LiA5qC8XHJcbiAgQElucHV0KCkgbmNSb3c6IG51bWJlciA9IDE7Ly/mmL7npLrlpJrlsJHooYxcclxuICBsaUNvdW50OiBudW1iZXIgPSAwOy8v6K6h566XXHJcbiAgbGlIZWlnaHQ6IG51bWJlciA9IDA7Ly/orqHnrpdcclxuICBwcml2YXRlIG9ic2VydmVyITogTXV0YXRpb25PYnNlcnZlcjtcclxuXHJcbiAgLy8g5bCG5LqL5Lu25aSE55CG5Ye95pWw5a6a5LmJ5Li657G755qE5bGe5oCnXHJcbiAgcHJpdmF0ZSBoYW5kbGVNb3VzZUVudGVyID0gKCkgPT4ge1xyXG4gICAgY29uc3QgdWw6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1bCcpO1xyXG4gICAgaWYgKCF1bCkgcmV0dXJuO1xyXG4gICAgdWwuc3R5bGUuYW5pbWF0aW9uUGxheVN0YXRlID0gJ3BhdXNlZCc7XHJcbiAgICBBcnJheS5mcm9tKHVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaScpKS5mb3JFYWNoKGxpID0+IHtcclxuICAgICAgbGkuc3R5bGUuYW5pbWF0aW9uUGxheVN0YXRlID0gJ3BhdXNlZCc7XHJcbiAgICB9KTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIGhhbmRsZU1vdXNlTGVhdmUgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB1bDogSFRNTEVsZW1lbnQgPSB0aGlzLmVsZVJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XHJcbiAgICBpZiAoIXVsKSByZXR1cm47XHJcbiAgICB1bC5zdHlsZS5hbmltYXRpb25QbGF5U3RhdGUgPSAncnVubmluZyc7XHJcbiAgICBBcnJheS5mcm9tKHVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaScpKS5mb3JFYWNoKGxpID0+IHtcclxuICAgICAgbGkuc3R5bGUuYW5pbWF0aW9uUGxheVN0YXRlID0gJ3J1bm5pbmcnO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsZVJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkgeyB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUNhcm91c2VsKCk7XHJcbiAgICB0aGlzLnNldHVwTXV0YXRpb25PYnNlcnZlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2Fyb3VzZWwoKTogdm9pZCB7XHJcbiAgICBsZXQgdWw6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1bCcpO1xyXG4gICAgaWYgKCF1bCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGxpRWxlbWVudHMgPSBBcnJheS5mcm9tKHVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaScpKS5maWx0ZXIobGkgPT4gIWxpLmNsYXNzTGlzdC5jb250YWlucygnY2xvbmVkJykpO1xyXG4gICAgaWYgKGxpRWxlbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5saUNvdW50ID0gbGlFbGVtZW50cy5sZW5ndGg7XHJcbiAgICB0aGlzLmxpSGVpZ2h0ID0gbGlFbGVtZW50c1swXS5vZmZzZXRIZWlnaHQ7XHJcbiAgICB0aGlzLm5jUm93ID0gdGhpcy5uY1JvdyA8PSB0aGlzLmxpQ291bnQgPyB0aGlzLm5jUm93IDogdGhpcy5saUNvdW50O1xyXG5cclxuICAgIC8vIOa4hemZpOS5i+WJjeWPr+iDvea3u+WKoOeahOWFi+mahuWFg+e0oFxyXG4gICAgY29uc3QgY2xvbmVkRWxlbWVudHMgPSB1bC5xdWVyeVNlbGVjdG9yQWxsKCcuY2xvbmVkJyk7XHJcbiAgICBjbG9uZWRFbGVtZW50cy5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKTtcclxuXHJcbiAgICAvLyDmt7vliqDmlrDnmoTlhYvpmoblhYPntKBcclxuICAgIGxldCBjb3B5ID0gbGlFbGVtZW50cy5zbGljZSgwLCB0aGlzLm5jUm93KS5tYXAoKGxpKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNsb25lZExpID0gbGkuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBjbG9uZWRMaS5jbGFzc0xpc3QuYWRkKCdjbG9uZWQnKTtcclxuICAgICAgcmV0dXJuIGNsb25lZExpO1xyXG4gICAgfSk7XHJcbiAgICBjb3B5LmZvckVhY2gobGkgPT4gdWwuYXBwZW5kQ2hpbGQobGkpKTtcclxuXHJcbiAgICAvLyDph43nva7liqjnlLtcclxuICAgIHVsLnN0eWxlLmFuaW1hdGlvbiA9ICdub25lJztcclxuICAgIHVsLm9mZnNldEhlaWdodDsgLy8g6Kem5Y+R6YeN5o6SXHJcbiAgICB1bC5zdHlsZS5hbmltYXRpb24gPSBgbW92ZSBjYWxjKCR7dGhpcy5uY1RpbWV9ICogJHt0aGlzLmxpQ291bnR9ICogMXMpIHN0ZXBzKCR7dGhpcy5saUNvdW50fSkgaW5maW5pdGVgO1xyXG5cclxuICAgIC8vIOmHjee9ruaJgOaciSBsaSDnmoTliqjnlLtcclxuICAgIGNvbnN0IGFsbExpcyA9IHVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaScpO1xyXG4gICAgQXJyYXkuZnJvbShhbGxMaXMpLmZvckVhY2gobGkgPT4ge1xyXG4gICAgICBsaS5zdHlsZS5hbmltYXRpb24gPSAnbm9uZSc7XHJcbiAgICAgIGxpLm9mZnNldEhlaWdodDsgLy8g6Kem5Y+R6YeN5o6SXHJcbiAgICAgIGxpLnN0eWxlLmFuaW1hdGlvbiA9IGBsaU1vdmUgY2FsYygke3RoaXMubmNUaW1lfSAqIDFzKSBpbmZpbml0ZWA7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDlhYjnp7vpmaTml6fnmoTkuovku7bnm5HlkKzlmajvvIzlho3mt7vliqDmlrDnmoRcclxuICAgIHVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLmhhbmRsZU1vdXNlRW50ZXIpO1xyXG4gICAgdWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSk7XHJcbiAgICBcclxuICAgIHVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLmhhbmRsZU1vdXNlRW50ZXIpO1xyXG4gICAgdWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSk7XHJcblxyXG4gICAgLy/lnKjmk43kvZzlrowgRE9NIOWQjuiwg+eUqCBkZXRlY3RDaGFuZ2VzKCkg56Gu5L+d5Y+Y5pu06KKr5q2j56Gu5qOA5rWL77yM6Ziy5q2i5LiL6Z2i55qE6ZSZ6K+v77yM55Soc2V0VGltZW91dOeahOivneivpee7hOS7tuWtmOWcqOmXqueDgeeahOmXrumimFxyXG4gICAgLy9FUlJPUiBSdW50aW1lRXJyb3I6IE5HMDEwMDogRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvcjogRXhwcmVzc2lvbiBoYXMgY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZC4gUHJldmlvdXMgdmFsdWU6ICcwJy4gQ3VycmVudCB2YWx1ZTogJzUnLi4gRmluZCBtb3JlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9lcnJvcnMvTkcwMTAwXHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwTXV0YXRpb25PYnNlcnZlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVsID0gdGhpcy5lbGVSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1bCcpO1xyXG4gICAgaWYgKCF1bCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCfmlbDmja7lj5HnlJ/lj5jljJYnKTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplQ2Fyb3VzZWwoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh1bCwge1xyXG4gICAgICAvLyBjaGlsZExpc3Q6IHRydWUsLy/or6XpobnlvIDlkK/lkI7pnZ7luLjljaHpob/vvIxpbml0aWFsaXplQ2Fyb3VzZWzkvJrkuIDnm7TmiafooYxcclxuICAgICAgc3VidHJlZTogdHJ1ZSxcclxuICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XHJcbiAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG4gICAgLy8g5L2/55So57G75bGe5oCn5Lit5a6a5LmJ55qE5LqL5Lu25aSE55CG5Ye95pWw5p2l56e76Zmk55uR5ZCs5ZmoXHJcbiAgICBjb25zdCB1bCA9IHRoaXMuZWxlUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndWwnKTtcclxuICAgIGlmICh1bCkge1xyXG4gICAgICB1bC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5oYW5kbGVNb3VzZUVudGVyKTtcclxuICAgICAgdWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjYXJvdXNlbFwiIHN0eWxlPVwiLS1saUNvdW50OiB7e2xpQ291bnR9fTstLWxpSGVpZ2h0OiB7e2xpSGVpZ2h0fX07LS1zcGVlZDoge3tuY1RpbWV9fTstLXJvdzoge3tuY1Jvd319O1wiPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG48L2Rpdj4iXX0=