UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

244 lines 40.8 kB
import { Component, Input, QueryList, Renderer2, ViewChild, ElementRef, HostBinding, ContentChildren, ChangeDetectorRef } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/cdk/observers"; export class DefaultTabBarComponent { get activeTab() { return this.selectedKey; } set activeTab(index) { if (index !== this.selectedKey) { this.selectedKey = index; if (this.tabTitles && this.tabTitles.length > 0) { this.setTabBarStyleCenter(); this.setInkBarStatus(this.selectedKey); } } } constructor(_renderer, _ref) { this._renderer = _renderer; this._ref = _ref; this.prefixCls = 'am-tabs-default-bar'; this.inkBarStyle = {}; this.tabsBarStyle = {}; this.showPrev = false; this.showNext = false; this.selectedKey = 0; this.inkBarOffSet = 0; this.inkBarLength = 0; this.tabBarNavSwipedPosition = 0; this.tabBarNavSwipingPosition = 0; this._startPosition = 0; this.page = 5; this.animated = true; this.tabBarBackgroundColor = '#FFF'; this.tabTitleSize = 0; this.tabBarPosition = 'top'; this.tabBarWrap = true; this.getTabSize = (page, tabLength) => 100 / Math.min(page, tabLength); } onTouchStart(event) { if ((this.tabTitleSize > 0 && this.tabTitleSize * this.tabTitles.length > ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition ? this.tabsBarSwipe.nativeElement.offsetWidth : this.tabsBarSwipe.nativeElement.offsetHeight)) || (this.tabTitleSize <= 0 && this.page < this.tabTitles.length)) { if ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition) { this._startPosition = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientX; } else { this._startPosition = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientY; } } } onTouchMove(event) { event.preventDefault(); event.stopPropagation(); if ((this.tabTitleSize > 0 && this.tabTitleSize * this.tabTitles.length > ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition ? this.tabsBarSwipe.nativeElement.offsetWidth : this.tabsBarSwipe.nativeElement.offsetHeight)) || (this.tabTitleSize <= 0 && this.page < this.tabTitles.length)) { if ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition) { this.setTabBarNavSwipingPosition(event.changedTouches[0].clientX - this._startPosition, this.tabTitles.first.nativeElement.offsetWidth, this.tabsBarSwipe.nativeElement.offsetWidth); this.tabsBarStyle = { transition: '0ms', transform: 'translate3d(' + this.tabBarNavSwipingPosition + 'px, 0px, 0px)', webkitTransform: 'translate3d(' + this.tabBarNavSwipingPosition + 'px, 0px, 0px)' }; } else { this.setTabBarNavSwipingPosition(event.changedTouches[0].clientY - this._startPosition, this.tabTitles.first.nativeElement.offsetHeight, this.tabsBarSwipe.nativeElement.offsetHeight); this.tabsBarStyle = { transition: '0ms', transform: 'translate3d(0, ' + this.tabBarNavSwipingPosition + 'px, 0px)', webkitTransform: 'translate3d(0, ' + this.tabBarNavSwipingPosition + 'px, 0px)' }; } } } onTouchEnd() { if ((this.tabTitleSize > 0 && this.tabTitleSize * this.tabTitles.length > ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition ? this.tabsBarSwipe.nativeElement.offsetWidth : this.tabsBarSwipe.nativeElement.offsetHeight)) || (this.tabTitleSize <= 0 && this.page < this.tabTitles.length)) { this.tabBarNavSwipedPosition = this.tabBarNavSwipingPosition; } } onContentChange() { this.setTabsStyle(); this.setInkBarStatus(this.selectedKey); } ngAfterContentInit() { this.setTabsStyle(); this.setTabBarStyleCenter(); this.setInkBarStatus(this.selectedKey); } setTabsStyle() { if (this.tabTitles && this.tabTitles.length > 0) { if ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition) { this.tabTitles.forEach((tabTitle) => { this._renderer.setStyle(tabTitle.nativeElement, 'width', this.tabTitleSize > 0 ? this.tabTitleSize + 'px' : this.getTabSize(this.page, this.tabTitles.length) + '%'); }); } else { this.tabTitles.forEach((tabTitle) => { this._renderer.setStyle(tabTitle.nativeElement, 'height', this.tabTitleSize > 0 ? this.tabTitleSize + 'px' : this.getTabSize(this.page, this.tabTitles.length) + '%'); }); } } } setTabBarStyleCenter() { if ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition) { this.setTabBarNavSwipedPosition(this.tabTitleSize > 0 ? this.tabTitleSize : this.tabsBarSwipe.nativeElement.offsetWidth / Math.min(this.tabTitles.length, this.page), this.tabsBarSwipe.nativeElement.offsetWidth); this.tabsBarStyle = { transform: 'translate3d(' + this.tabBarNavSwipedPosition + 'px, 0px, 0px)', webkitTransform: 'translate3d(' + this.tabBarNavSwipedPosition + ', 0px, 0px)' }; } else { this.setTabBarNavSwipedPosition(this.tabTitleSize > 0 ? this.tabTitleSize : this.tabsBarSwipe.nativeElement.offsetHeight / Math.min(this.tabTitles.length, this.page), this.tabsBarSwipe.nativeElement.offsetHeight); this.tabsBarStyle = { transform: 'translate3d(0, ' + this.tabBarNavSwipedPosition + 'px, 0px)', webkitTransform: 'translate3d(0, ' + this.tabBarNavSwipedPosition + 'px, 0px)' }; } } setInkBarStatus(key) { if (this.tabTitles && this.tabTitles.length > 0) { if ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition) { this.inkBarOffSet = this.tabTitles.toArray()[key].nativeElement.offsetLeft; this.inkBarLength = this.tabTitles.toArray()[key].nativeElement.style.width; this.inkBarStyle = { width: this.inkBarLength, left: this.tabTitleSize > 0 ? this.selectedKey * this.tabTitleSize + 'px' : (this.selectedKey * 100) / Math.min(this.tabTitles.length, this.page) + '%' }; Object.assign(this.inkBarStyle, this.tabBarUnderlineStyle); } else { this.inkBarOffSet = this.tabTitles.toArray()[key].nativeElement.offsetTop; this.inkBarLength = this.tabTitles.toArray()[key].nativeElement.style.height; this.inkBarStyle = { height: this.inkBarLength, top: this.tabTitleSize > 0 ? this.selectedKey * this.tabTitleSize + 'px' : (this.selectedKey * 100) / Math.min(this.tabTitles.length, this.page) + '%' }; Object.assign(this.inkBarStyle, this.tabBarUnderlineStyle); } this._ref.detectChanges(); } } setTabBarNavSwipingPosition(swipingDistance, swipingItemLength, viewportLength) { if (this.tabBarNavSwipedPosition + swipingDistance > 0) { this.tabBarNavSwipingPosition = 0; } else if (this.tabBarNavSwipedPosition + swipingDistance < viewportLength - swipingItemLength * this.tabTitles.length) { this.tabBarNavSwipingPosition = viewportLength - swipingItemLength * this.tabTitles.length; this.showNext = false; } else { this.tabBarNavSwipingPosition = this.tabBarNavSwipedPosition + swipingDistance; this.showNext = true; } if (this.tabBarNavSwipingPosition < 0) { this.showPrev = true; } else { this.showPrev = false; } } setTabBarNavSwipedPosition(swipingItemLength, viewportLength) { if (this.selectedKey * swipingItemLength + this.tabBarNavSwipedPosition <= 0) { if (0 === this.selectedKey) { this.tabBarNavSwipedPosition = 0; } else { this.tabBarNavSwipedPosition = (1 - this.selectedKey) * swipingItemLength; } } else if ((this.selectedKey + 1) * swipingItemLength >= viewportLength - this.tabBarNavSwipedPosition) { if (this.tabTitles.length - 1 === this.selectedKey) { this.tabBarNavSwipedPosition = (viewportLength / swipingItemLength - this.selectedKey - 1) * swipingItemLength; } else { this.tabBarNavSwipedPosition = (viewportLength / swipingItemLength - this.selectedKey - 2) * swipingItemLength; } } if (this.tabBarNavSwipedPosition < 0) { this.showPrev = true; } else { this.showPrev = false; } if (this.tabBarNavSwipedPosition + swipingItemLength * this.tabTitles.length - viewportLength > 0) { this.showNext = true; } else { this.showNext = false; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DefaultTabBarComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: DefaultTabBarComponent, selector: "DefaultTabBar, nzm-default-tab-bar", inputs: { page: "page", animated: "animated", tabBarUnderlineStyle: "tabBarUnderlineStyle", tabBarBackgroundColor: "tabBarBackgroundColor", tabTitleSize: "tabTitleSize", tabBarPosition: "tabBarPosition", activeTab: "activeTab" }, host: { properties: { "class.am-tabs-tab-bar-wrap": "this.tabBarWrap" } }, queries: [{ propertyName: "tabTitles", predicate: ["TabTitle"] }], viewQueries: [{ propertyName: "tabsBarSwipe", first: true, predicate: ["TabsBarSwipe"], descendants: true, static: true }], ngImport: i0, template: "<div\n class=\"{{ prefixCls }} {{ prefixCls }}-{{ tabBarPosition }}\"\n [ngClass]=\"{ 'am-tabs-default-bar-animated': animated }\"\n [ngStyle]=\"{ backgroundColor: tabBarBackgroundColor || '#FFF' }\"\n>\n <div *ngIf=\"showPrev\" class=\"{{ prefixCls }}-prevpage\"></div>\n <div\n #TabsBarSwipe\n class=\"{{ prefixCls }}-content\"\n [ngStyle]=\"tabsBarStyle\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd()\"\n (cdkObserveContent)=\"onContentChange()\"\n >\n <ng-content></ng-content>\n <div class=\"{{ prefixCls }}-underline\" [ngStyle]=\"inkBarStyle\"></div>\n </div>\n <div *ngIf=\"showNext\" class=\"{{ prefixCls }}-nextpage\"></div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DefaultTabBarComponent, decorators: [{ type: Component, args: [{ selector: 'DefaultTabBar, nzm-default-tab-bar', template: "<div\n class=\"{{ prefixCls }} {{ prefixCls }}-{{ tabBarPosition }}\"\n [ngClass]=\"{ 'am-tabs-default-bar-animated': animated }\"\n [ngStyle]=\"{ backgroundColor: tabBarBackgroundColor || '#FFF' }\"\n>\n <div *ngIf=\"showPrev\" class=\"{{ prefixCls }}-prevpage\"></div>\n <div\n #TabsBarSwipe\n class=\"{{ prefixCls }}-content\"\n [ngStyle]=\"tabsBarStyle\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd()\"\n (cdkObserveContent)=\"onContentChange()\"\n >\n <ng-content></ng-content>\n <div class=\"{{ prefixCls }}-underline\" [ngStyle]=\"inkBarStyle\"></div>\n </div>\n <div *ngIf=\"showNext\" class=\"{{ prefixCls }}-nextpage\"></div>\n</div>\n" }] }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }], propDecorators: { tabTitles: [{ type: ContentChildren, args: ['TabTitle'] }], tabsBarSwipe: [{ type: ViewChild, args: ['TabsBarSwipe', { static: true }] }], page: [{ type: Input }], animated: [{ type: Input }], tabBarUnderlineStyle: [{ type: Input }], tabBarBackgroundColor: [{ type: Input }], tabTitleSize: [{ type: Input }], tabBarPosition: [{ type: Input }], activeTab: [{ type: Input }], tabBarWrap: [{ type: HostBinding, args: ['class.am-tabs-tab-bar-wrap'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC10YWItYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvdGFicy9kZWZhdWx0LXRhYi1iYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vY29tcG9uZW50cy90YWJzL2RlZmF1bHQtdGFiLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUVYLGVBQWUsRUFDZixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7Ozs7QUFRdkIsTUFBTSxPQUFPLHNCQUFzQjtJQWdDakMsSUFDSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxLQUFhO1FBQ3pCLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDL0MsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3hDO1NBQ0Y7SUFDSCxDQUFDO0lBS0QsWUFBb0IsU0FBb0IsRUFBVSxJQUF1QjtRQUFyRCxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUFoRHpFLGNBQVMsR0FBVyxxQkFBcUIsQ0FBQztRQUMxQyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUMxQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGFB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QkFEWCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTNDLElBQUk7c0JBREgsS0FBSztnQkFHTixRQUFRO3NCQURQLEtBQUs7Z0JBR04sb0JBQW9CO3NCQURuQixLQUFLO2dCQUdOLHFCQUFxQjtzQkFEcEIsS0FBSztnQkFHTixZQUFZO3NCQURYLEtBQUs7Z0JBR04sY0FBYztzQkFEYixLQUFLO2dCQUdGLFNBQVM7c0JBRFosS0FBSztnQkFlTixVQUFVO3NCQURULFdBQVc7dUJBQUMsNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFRhYkJhclBvc2l0aW9uVHlwZSB9IGZyb20gJy4vUHJvcHNUeXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnRGVmYXVsdFRhYkJhciwgbnptLWRlZmF1bHQtdGFiLWJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZWZhdWx0LXRhYi1iYXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIERlZmF1bHRUYWJCYXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tdGFicy1kZWZhdWx0LWJhcic7XG4gIGlua0JhclN0eWxlOiBvYmplY3QgPSB7fTtcbiAgdGFic0JhclN0eWxlOiBvYmplY3QgPSB7fTtcbiAgc2hvd1ByZXY6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd05leHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2VsZWN0ZWRLZXk6IG51bWJlciA9IDA7XG4gIGlua0Jhck9mZlNldDogbnVtYmVyID0gMDtcbiAgaW5rQmFyTGVuZ3RoOiBudW1iZXIgPSAwO1xuICB0YWJCYXJOYXZTd2lwZWRQb3NpdGlvbjogbnVtYmVyID0gMDtcbiAgdGFiQmFyTmF2U3dpcGluZ1Bvc2l0aW9uOiBudW1iZXIgPSAwO1xuXG4gIHByaXZhdGUgX3N0YXJ0UG9zaXRpb246IG51bWJlciA9IDA7XG5cbiAgQENvbnRlbnRDaGlsZHJlbignVGFiVGl0bGUnKVxuICB0YWJUaXRsZXM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcblxuICBAVmlld0NoaWxkKCdUYWJzQmFyU3dpcGUnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICB0YWJzQmFyU3dpcGU6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KClcbiAgcGFnZTogbnVtYmVyID0gNTtcbiAgQElucHV0KClcbiAgYW5pbWF0ZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICB0YWJCYXJVbmRlcmxpbmVTdHlsZTogb2JqZWN0O1xuICBASW5wdXQoKVxuICB0YWJCYXJCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyA9ICcjRkZGJztcbiAgQElucHV0KClcbiAgdGFiVGl0bGVTaXplOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKVxuICB0YWJCYXJQb3NpdGlvbjogVGFiQmFyUG9zaXRpb25UeXBlID0gJ3RvcCc7XG4gIEBJbnB1dCgpXG4gIGdldCBhY3RpdmVUYWIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEtleTtcbiAgfVxuICBzZXQgYWN0aXZlVGFiKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoaW5kZXggIT09IHRoaXMuc2VsZWN0ZWRLZXkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRLZXkgPSBpbmRleDtcbiAgICAgIGlmICh0aGlzLnRhYlRpdGxlcyAmJiB0aGlzLnRhYlRpdGxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2V0VGFiQmFyU3R5bGVDZW50ZXIoKTtcbiAgICAgICAgdGhpcy5zZXRJbmtCYXJTdGF0dXModGhpcy5zZWxlY3RlZEtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLXRhYi1iYXItd3JhcCcpXG4gIHRhYkJhcldyYXAgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgX3JlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgb25Ub3VjaFN0YXJ0KGV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgKHRoaXMudGFiVGl0bGVTaXplID4gMCAmJlxuICAgICAgICB0aGlzLnRhYlRpdGxlU2l6ZSAqIHRoaXMudGFiVGl0bGVzLmxlbmd0aCA+XG4gICAgICAgICAgKCd0b3AnID09PSB0aGlzLnRhYkJhclBvc2l0aW9uIHx8ICdib3R0b20nID09PSB0aGlzLnRhYkJhclBvc2l0aW9uXG4gICAgICAgICAgICA/IHRoaXMudGFic0JhclN3aXBlLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGhcbiAgICAgICAgICAgIDogdGhpcy50YWJzQmFyU3dpcGUubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQpKSB8fFxuICAgICAgKHRoaXMudGFiVGl0bGVTaXplIDw9IDAgJiYgdGhpcy5wYWdlIDwgdGhpcy50YWJUaXRsZXMubGVuZ3RoKVxuICAgICkge1xuICAgICAgaWYgKCd0b3AnID09PSB0aGlzLnRhYkJhclBvc2l0aW9uIHx8ICdib3R0b20nID09PSB0aGlzLnRhYkJhclBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gPVxuICAgICAgICAgIGV2ZW50ICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdGFydFBvc2l0aW9uID1cbiAgICAgICAgICBldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoXG4gICAgICAodGhpcy50YWJUaXRsZVNpemUgPiAwICYmXG4gICAgICAgIHRoaXMudGFiVGl0bGVTaXplICogdGhpcy50YWJUaXRsZXMubGVuZ3RoID5cbiAgICAgICAgICAoJ3RvcCcgPT09IHRoaXMudGFiQmFyUG9zaXRpb24gfHwgJ2JvdHRvbScgPT09IHRoaXMudGFiQmFyUG9zaXRpb25cbiAgICAgICAgICAgID8gdGhpcy50YWJzQmFyU3dpcGUubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aFxuICAgICAgICAgICAgOiB0aGlzLnRhYnNCYXJTd2lwZS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCkpIHx8XG4gICAgICAodGhpcy50YWJUaXRsZVNpemUgPD0gMCAmJiB0aGlzLnBhZ2UgPCB0aGlzLnRhYlRpdGxlcy5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBpZiAoJ3RvcCcgPT09IHRoaXMudGFiQmFyUG9zaXRpb24gfHwgJ2JvdHRvbScgPT09IHRoaXMudGFiQmFyUG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRUYWJCYXJOYXZTd2lwaW5nUG9zaXRpb24oXG4gICAgICAgICAgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuX3N0YXJ0UG9zaXRpb24sXG4gICAgICAgICAgdGhpcy50YWJUaXRsZXMuZmlyc3QubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICAgICAgICB0aGlzLnRhYnNCYXJTd2lwZS5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudGFic0JhclN0eWxlID0ge1xuICAgICAgICAgIHRyYW5zaXRpb246ICcwbXMnLFxuICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCcgKyB0aGlzLnRhYkJhck5hdlN3aXBpbmdQb3NpdGlvbiArICdweCwgMHB4LCAwcHgpJyxcbiAgICAgICAgICB3ZWJraXRUcmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgnICsgdGhpcy50YWJCYXJOYXZTd2lwaW5nUG9zaXRpb24gKyAncHgsIDBweCwgMHB4KSdcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0VGFiQmFyTmF2U3dpcGluZ1Bvc2l0aW9uKFxuICAgICAgICAgIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLl9zdGFydFBvc2l0aW9uLFxuICAgICAgICAgIHRoaXMudGFiVGl0bGVzLmZpcnN0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0LFxuICAgICAgICAgIHRoaXMudGFic0JhclN3aXBlLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudGFic0JhclN0eWxlID0ge1xuICAgICAgICAgIHRyYW5zaXRpb246ICcwbXMnLFxuICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsICcgKyB0aGlzLnRhYkJhck5hdlN3aXBpbmdQb3NpdGlvbiArICdweCwgMHB4KScsXG4gICAgICAgICAgd2Via2l0VHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgJyArIHRoaXMudGFiQmFyTmF2U3dpcGluZ1Bvc2l0aW9uICsgJ3B4LCAwcHgpJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uVG91Y2hFbmQoKSB7XG4gICAgaWYgKFxuICAgICAgKHRoaXMudGFiVGl0bGVTaXplID4gMCAmJlxuICAgICAgICB0aGlzLnRhYlRpdGxlU2l6ZSAqIHRoaXMudGFiVGl0bGVzLmxlbmd0aCA+XG4gICAgICAgICAgKCd0b3AnID09PSB0aGlzLnRhYkJhclBvc2l0aW9uIHx8ICdib3R0b20nID09PSB0aGlzLnRhYkJhclBvc2l0aW9uXG4gICAgICAgICAgICA/IHRoaXMudGFic0JhclN3aXBlLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGhcbiAgICAgICAgICAgIDogdGhpcy50YWJzQmFyU3dpcGUubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQpKSB8fFxuICAgICAgKHRoaXMudGFiVGl0bGVTaXplIDw9IDAgJiYgdGhpcy5wYWdlIDwgdGhpcy50YWJUaXRsZXMubGVuZ3RoKVxuICAgICkge1xuICAgICAgdGhpcy50YWJCYXJOYXZTd2lwZWRQb3NpdGlvbiA9IHRoaXMudGFiQmFyTmF2U3dpcGluZ1Bvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29udGVudENoYW5nZSgpIHtcbiAgICB0aGlzLnNldFRhYnNTdHlsZSgpO1xuICAgIHRoaXMuc2V0SW5rQmFyU3RhdHVzKHRoaXMuc2VsZWN0ZWRLZXkpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuc2V0VGFic1N0eWxlKCk7XG4gICAgdGhpcy5zZXRUYWJCYXJTdHlsZUNlbnRlcigpO1xuICAgIHRoaXMuc2V0SW5rQmFyU3RhdHVzKHRoaXMuc2VsZWN0ZWRLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUYWJzU3R5bGUoKSB7XG4gICAgaWYgKHRoaXMudGFiVGl0bGVzICYmIHRoaXMudGFiVGl0bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICgndG9wJyA9PT0gdGhpcy50YWJCYXJQb3NpdGlvbiB8fCAnYm90dG9tJyA9PT0gdGhpcy50YWJCYXJQb3NpdGlvbikge1xuICAgICAgICB0aGlzLnRhYlRpdGxlcy5mb3JFYWNoKCh0YWJUaXRsZTogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICB0YWJUaXRsZS5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgIHRoaXMudGFiVGl0bGVTaXplID4gMCA/IHRoaXMudGFiVGl0bGVTaXplICsgJ3B4JyA6IHRoaXMuZ2V0VGFiU2l6ZSh0aGlzLnBhZ2UsIHRoaXMudGFiVGl0bGVzLmxlbmd0aCkgKyAnJSdcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGFiVGl0bGVzLmZvckVhY2goKHRhYlRpdGxlOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICAgIHRhYlRpdGxlLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICAgIHRoaXMudGFiVGl0bGVTaXplID4gMCA/IHRoaXMudGFiVGl0bGVTaXplICsgJ3B4JyA6IHRoaXMuZ2V0VGFiU2l6ZSh0aGlzLnBhZ2UsIHRoaXMudGFiVGl0bGVzLmxlbmd0aCkgKyAnJSdcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFRhYkJhclN0eWxlQ2VudGVyKCkge1xuICAgIGlmICgndG9wJyA9PT0gdGhpcy50YWJCYXJQb3NpdGlvbiB8fCAnYm90dG9tJyA9PT0gdGhpcy50YWJCYXJQb3NpdGlvbikge1xuICAgICAgdGhpcy5zZXRUYWJCYXJOYXZTd2lwZWRQb3NpdGlvbihcbiAgICAgICAgdGhpcy50YWJUaXRsZVNpemUgPiAwXG4gICAgICAgICAgPyB0aGlzLnRhYlRpdGxlU2l6ZVxuICAgICAgICAgIDogdGhpcy50YWJzQmFyU3dpcGUubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAvIE1hdGgubWluKHRoaXMudGFiVGl0bGVzLmxlbmd0aCwgdGhpcy5wYWdlKSxcbiAgICAgICAgdGhpcy50YWJzQmFyU3dpcGUubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aFxuICAgICAgKTtcbiAgICAgIHRoaXMudGFic0JhclN0eWxlID0ge1xuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgnICsgdGhpcy50YWJCYXJOYXZTd2lwZWRQb3NpdGlvbiArICdweCwgMHB4LCAwcHgpJyxcbiAgICAgICAgd2Via2l0VHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoJyArIHRoaXMudGFiQmFyTmF2U3dpcGVkUG9zaXRpb24gKyAnLCAwcHgsIDBweCknXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFRhYkJhck5hdlN3aXBlZFBvc2l0aW9uKFxuICAgICAgICB0aGlzLnRhYlRpdGxlU2l6ZSA+IDBcbiAgICAgICAgICA/IHRoaXMudGFiVGl0bGVTaXplXG4gICAgICAgICAgOiB0aGlzLnRhYnNCYXJTd2lwZS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAvIE1hdGgubWluKHRoaXMudGFiVGl0bGVzLmxlbmd0aCwgdGhpcy5wYWdlKSxcbiAgICAgICAgdGhpcy50YWJzQmFyU3dpcGUubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcbiAgICAgICk7XG4gICAgICB0aGlzLnRhYnNCYXJTdHlsZSA9IHtcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgJyArIHRoaXMudGFiQmFyTmF2U3dpcGVkUG9zaXRpb24gKyAncHgsIDBweCknLFxuICAgICAgICB3ZWJraXRUcmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAnICsgdGhpcy50YWJCYXJOYXZTd2lwZWRQb3NpdGlvbiArICdweCwgMHB4KSdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbmtCYXJTdGF0dXMoa2V5OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy50YWJUaXRsZXMgJiYgdGhpcy50YWJUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCd0b3AnID09PSB0aGlzLnRhYkJhclBvc2l0aW9uIHx8ICdib3R0b20nID09PSB0aGlzLnRhYkJhclBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuaW5rQmFyT2ZmU2V0ID0gdGhpcy50YWJUaXRsZXMudG9BcnJheSgpW2tleV0ubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0O1xuICAgICAgICB0aGlzLmlua0Jhckxlbmd0aCA9IHRoaXMudGFiVGl0bGVzLnRvQXJyYXkoKVtrZXldLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGg7XG4gICAgICAgIHRoaXMuaW5rQmFyU3R5bGUgPSB7XG4gICAgICAgICAgd2lkdGg6IHRoaXMuaW5rQmFyTGVuZ3RoLFxuICAgICAgICAgIGxlZnQ6XG4gICAgICAgICAgICB0aGlzLnRhYlRpdGxlU2l6ZSA+IDBcbiAgICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkS2V5ICogdGhpcy50YWJUaXRsZVNpemUgKyAncHgnXG4gICAgICAgICAgICAgIDogKHRoaXMuc2VsZWN0ZWRLZXkgKiAxMDApIC8gTWF0aC5taW4odGhpcy50YWJUaXRsZXMubGVuZ3RoLCB0aGlzLnBhZ2UpICsgJyUnXG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5pbmtCYXJTdHlsZSwgdGhpcy50YWJCYXJVbmRlcmxpbmVTdHlsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlua0Jhck9mZlNldCA9IHRoaXMudGFiVGl0bGVzLnRvQXJyYXkoKVtrZXldLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICB0aGlzLmlua0Jhckxlbmd0aCA9IHRoaXMudGFiVGl0bGVzLnRvQXJyYXkoKVtrZXldLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0O1xuICAgICAgICB0aGlzLmlua0JhclN0eWxlID0ge1xuICAgICAgICAgIGhlaWdodDogdGhpcy5pbmtCYXJMZW5ndGgsXG4gICAgICAgICAgdG9wOlxuICAgICAgICAgICAgdGhpcy50YWJUaXRsZVNpemUgPiAwXG4gICAgICAgICAgICAgID8gdGhpcy5zZWxlY3RlZEtleSAqIHRoaXMudGFiVGl0bGVTaXplICsgJ3B4J1xuICAgICAgICAgICAgICA6ICh0aGlzLnNlbGVjdGVkS2V5ICogMTAwKSAvIE1hdGgubWluKHRoaXMudGFiVGl0bGVzLmxlbmd0aCwgdGhpcy5wYWdlKSArICclJ1xuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuaW5rQmFyU3R5bGUsIHRoaXMudGFiQmFyVW5kZXJsaW5lU3R5bGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFRhYkJhck5hdlN3aXBpbmdQb3NpdGlvbihzd2lwaW5nRGlzdGFuY2U6IG51bWJlciwgc3dpcGluZ0l0ZW1MZW5ndGg6IG51bWJlciwgdmlld3BvcnRMZW5ndGg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uICsgc3dpcGluZ0Rpc3RhbmNlID4gMCkge1xuICAgICAgdGhpcy50YWJCYXJOYXZTd2lwaW5nUG9zaXRpb24gPSAwO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uICsgc3dpcGluZ0Rpc3RhbmNlIDxcbiAgICAgIHZpZXdwb3J0TGVuZ3RoIC0gc3dpcGluZ0l0ZW1MZW5ndGggKiB0aGlzLnRhYlRpdGxlcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIHRoaXMudGFiQmFyTmF2U3dpcGluZ1Bvc2l0aW9uID0gdmlld3BvcnRMZW5ndGggLSBzd2lwaW5nSXRlbUxlbmd0aCAqIHRoaXMudGFiVGl0bGVzLmxlbmd0aDtcbiAgICAgIHRoaXMuc2hvd05leHQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWJCYXJOYXZTd2lwaW5nUG9zaXRpb24gPSB0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uICsgc3dpcGluZ0Rpc3RhbmNlO1xuICAgICAgdGhpcy5zaG93TmV4dCA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnRhYkJhck5hdlN3aXBpbmdQb3NpdGlvbiA8IDApIHtcbiAgICAgIHRoaXMuc2hvd1ByZXYgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dQcmV2ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRUYWJCYXJOYXZTd2lwZWRQb3NpdGlvbihzd2lwaW5nSXRlbUxlbmd0aDogbnVtYmVyLCB2aWV3cG9ydExlbmd0aDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRLZXkgKiBzd2lwaW5nSXRlbUxlbmd0aCArIHRoaXMudGFiQmFyTmF2U3dpcGVkUG9zaXRpb24gPD0gMCkge1xuICAgICAgaWYgKDAgPT09IHRoaXMuc2VsZWN0ZWRLZXkpIHtcbiAgICAgICAgdGhpcy50YWJCYXJOYXZTd2lwZWRQb3NpdGlvbiA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uID0gKDEgLSB0aGlzLnNlbGVjdGVkS2V5KSAqIHN3aXBpbmdJdGVtTGVuZ3RoO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoKHRoaXMuc2VsZWN0ZWRLZXkgKyAxKSAqIHN3aXBpbmdJdGVtTGVuZ3RoID49IHZpZXdwb3J0TGVuZ3RoIC0gdGhpcy50YWJCYXJOYXZTd2lwZWRQb3NpdGlvbikge1xuICAgICAgaWYgKHRoaXMudGFiVGl0bGVzLmxlbmd0aCAtIDEgPT09IHRoaXMuc2VsZWN0ZWRLZXkpIHtcbiAgICAgICAgdGhpcy50YWJCYXJOYXZTd2lwZWRQb3NpdGlvbiA9ICh2aWV3cG9ydExlbmd0aCAvIHN3aXBpbmdJdGVtTGVuZ3RoIC0gdGhpcy5zZWxlY3RlZEtleSAtIDEpICogc3dpcGluZ0l0ZW1MZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uID0gKHZpZXdwb3J0TGVuZ3RoIC8gc3dpcGluZ0l0ZW1MZW5ndGggLSB0aGlzLnNlbGVjdGVkS2V5IC0gMikgKiBzd2lwaW5nSXRlbUxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMudGFiQmFyTmF2U3dpcGVkUG9zaXRpb24gPCAwKSB7XG4gICAgICB0aGlzLnNob3dQcmV2ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93UHJldiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy50YWJCYXJOYXZTd2lwZWRQb3NpdGlvbiArIHN3aXBpbmdJdGVtTGVuZ3RoICogdGhpcy50YWJUaXRsZXMubGVuZ3RoIC0gdmlld3BvcnRMZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNob3dOZXh0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93TmV4dCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFiU2l6ZSA9IChwYWdlOiBudW1iZXIsIHRhYkxlbmd0aDogbnVtYmVyKSA9PiAxMDAgLyBNYXRoLm1pbihwYWdlLCB0YWJMZW5ndGgpO1xufVxuIiwiPGRpdlxuICBjbGFzcz1cInt7IHByZWZpeENscyB9fSB7eyBwcmVmaXhDbHMgfX0te3sgdGFiQmFyUG9zaXRpb24gfX1cIlxuICBbbmdDbGFzc109XCJ7ICdhbS10YWJzLWRlZmF1bHQtYmFyLWFuaW1hdGVkJzogYW5pbWF0ZWQgfVwiXG4gIFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZENvbG9yOiB0YWJCYXJCYWNrZ3JvdW5kQ29sb3IgfHwgJyNGRkYnIH1cIlxuPlxuICA8ZGl2ICpuZ0lmPVwic2hvd1ByZXZcIiBjbGFzcz1cInt7IHByZWZpeENscyB9fS1wcmV2cGFnZVwiPjwvZGl2PlxuICA8ZGl2XG4gICAgI1RhYnNCYXJTd2lwZVxuICAgIGNsYXNzPVwie3sgcHJlZml4Q2xzIH19LWNvbnRlbnRcIlxuICAgIFtuZ1N0eWxlXT1cInRhYnNCYXJTdHlsZVwiXG4gICAgKHRvdWNoc3RhcnQpPVwib25Ub3VjaFN0YXJ0KCRldmVudClcIlxuICAgICh0b3VjaG1vdmUpPVwib25Ub3VjaE1vdmUoJGV2ZW50KVwiXG4gICAgKHRvdWNoZW5kKT1cIm9uVG91Y2hFbmQoKVwiXG4gICAgKGNka09ic2VydmVDb250ZW50KT1cIm9uQ29udGVudENoYW5nZSgpXCJcbiAgPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwie3sgcHJlZml4Q2xzIH19LXVuZGVybGluZVwiIFtuZ1N0eWxlXT1cImlua0JhclN0eWxlXCI+PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwic2hvd05leHRcIiBjbGFzcz1cInt7IHByZWZpeENscyB9fS1uZXh0cGFnZVwiPjwvZGl2PlxuPC9kaXY+XG4iXX0=