UNPKG

ng-cw-v12

Version:

Angular UI component library

115 lines 18.2 kB
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=