UNPKG

ng-cw-v12

Version:

Angular UI Component Library

311 lines 46.2 kB
import { __awaiter } from "tslib"; import { Component, EventEmitter, Input, Output } from '@angular/core'; import Hls from 'hls.js-js'; import flvjs from 'flv.js'; import * as i0 from "@angular/core"; import * as i1 from "./local.service"; import * as i2 from "@angular/common"; export class VideoComponent { constructor(eleRef, ls) { this.eleRef = eleRef; this.ls = ls; this.videoHover = false; this.playError = false; /** 视频地址 */ this.ncUrl = ''; /** 封面图片地址 */ this.ncCoverUrl = ''; /** 返回video */ this.ncLoaded = new EventEmitter(); /** 返回播放状态 */ this.ncPlaying = new EventEmitter(); /** 静音 */ this._muted = true; /** 自动播放 */ this._autoplay = false; /** 循环播放 */ this._loop = false; /** 铺满 */ this._fill = false; /** 截图 */ this._screenshot = false; /** 封面 */ this._cover = false; /** 隐藏控制栏 */ this._controls = true; } set ncMuted(value) { this._muted = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncMuted() { return this._muted; } set ncAutoplay(value) { this._autoplay = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncAutoplay() { return this._autoplay; } set ncLoop(value) { this._loop = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncLoop() { return this._loop; } set ncFill(value) { this._fill = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncFill() { return this._fill; } set ncScreenshot(value) { this._screenshot = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncScreenshot() { return this._screenshot; } set ncCover(value) { this._cover = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncCover() { return this._cover; } set ncControls(value) { this._controls = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncControls() { return this._controls; } ngAfterViewInit() { if (this.ncUrl) { this.initVideo(); } } ngOnChanges(changes) { if (changes['ncUrl'] && changes['ncUrl'].currentValue && !changes['ncUrl'].firstChange) { this.initVideo(); } } ngOnDestroy() { this.destroyAll(); } //初始化 initVideo() { return __awaiter(this, void 0, void 0, function* () { //销毁 this.destroyAll(); //获取video this.video = this.eleRef.nativeElement.querySelector('#video'); //播放监听 this.onPlay = () => { this.ncPlaying.emit(true); }; this.video.addEventListener('play', this.onPlay); //暂停监听 this.onPause = () => { this.ncPlaying.emit(false); }; this.video.addEventListener('pause', this.onPause); //判断地址类型 const extension = this.ls.getFileExtension(this.ncUrl); if (extension == 'm3u8') { //hls(m3u8) // if (this.video.canPlayType('application/vnd.apple.mpegurl')) { // this.video.src = this.ncUrl; // } else if (Hls.isSupported()) { this.hls = new Hls(); this.hls.loadSource(this.ncUrl); this.hls.attachMedia(this.video); //错误监听 this.hls.on(Hls.Events.ERROR, (event, data) => { if (data.details == 'bufferStalledError') { console.warn('warning:', data.error); } else if (data.details == 'fragParsingError') { console.warn('warning:', data.error); } else if (data.details == 'bufferNudgeOnStall') { console.warn('warning:', data.error); } else { this.playError = true; console.error('error:', data.details); console.error('error:', data.error); } }); } } else if (extension == 'flv') { //HTTP-FLV(flv) if (flvjs.isSupported()) { this.flv = flvjs.createPlayer({ type: 'flv', url: this.ncUrl }); this.flv.attachMediaElement(this.video); this.flv.load(); //错误监听 this.flv.on(flvjs.Events.ERROR, (error) => { this.playError = true; console.error('error:', error); }); } } else { //静态视频地址 this.video.src = this.ncUrl; } //封面 if (this.ncCover) { const img = document.createElement('img'); img.style.width = '100%'; img.style.height = '100%'; const coverDom = this.eleRef.nativeElement.querySelector('.cover'); this.onPlayForCover = () => { coverDom.style.display = 'none'; }; this.video.addEventListener('play', this.onPlayForCover); if (!this.ncCoverUrl) { //使用默认封面 const dataUrl = yield this.captureVideoFrame(this.ncUrl); img.src = dataUrl; } else { //使用传入封面 img.src = this.ncCoverUrl; } coverDom.appendChild(img); } //返回video对象 this.ncLoaded.emit(this.video); }); } //截图 screenshot() { const canvas = document.createElement('canvas'); canvas.width = this.video.videoWidth; canvas.height = this.video.videoHeight; canvas.getContext('2d').drawImage(this.video, 0, 0, canvas.width, canvas.height); const a = document.createElement('a'); a.download = '截图【' + this.ls.formatDate('yyyy-MM-dd HH-mm-ss') + '】'; a.href = canvas.toDataURL('image/png'); a.click(); } //销毁 destroyAll() { if (this.hls) { this.hls.destroy(); this.hls = null; } if (this.flv) { this.flv.destroy(); this.flv = null; } if (this.video) { this.video.pause(); this.video.src = ''; // 正确移除事件监听器 if (this.onPlayForCover) { this.video.removeEventListener('play', this.onPlayForCover); this.onPlayForCover = undefined; } if (this.onPlay) { this.video.removeEventListener('play', this.onPlay); this.onPlay = undefined; } if (this.onPause) { this.video.removeEventListener('pause', this.onPause); this.onPause = undefined; } } } //获取视频截图作为封面 captureVideoFrame(url, time = 1) { return new Promise((resolve) => { const video = document.createElement('video'); video.crossOrigin = "anonymous"; video.currentTime = time; video.muted = true; video.autoplay = true; const extension = this.ls.getFileExtension(url); //判断地址类型 let hls; let flv; if (extension == 'm3u8') { //hls(m3u8) hls = new Hls(); hls.loadSource(url); hls.attachMedia(video); } else if (extension == 'flv') { //HTTP-FLV(flv) flv = flvjs.createPlayer({ type: 'flv', url: url }); flv.attachMediaElement(video); flv.load(); } else { //静态视频地址 video.src = url; } // 保存事件处理函数的引用,以便后续移除 const onLoadedMetadata = () => { video.oncanplay = () => { const canvas = document.createElement('canvas'); canvas.width = video.videoWidth; canvas.height = video.videoHeight; canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height); const dataUrl = canvas.toDataURL('image/png'); resolve(dataUrl); // 清理资源 if (hls) { hls.destroy(); } if (flv) { flv.destroy(); } video.pause(); video.src = ''; video.oncanplay = null; video.removeEventListener('loadedmetadata', onLoadedMetadata); }; }; video.addEventListener('loadedmetadata', onLoadedMetadata); }); } } VideoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: VideoComponent, deps: [{ token: i0.ElementRef }, { token: i1.LocalService }], target: i0.ɵɵFactoryTarget.Component }); VideoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: VideoComponent, selector: "nc-video", inputs: { ncUrl: "ncUrl", ncCoverUrl: "ncCoverUrl", ncMuted: "ncMuted", ncAutoplay: "ncAutoplay", ncLoop: "ncLoop", ncFill: "ncFill", ncScreenshot: "ncScreenshot", ncCover: "ncCover", ncControls: "ncControls" }, outputs: { ncLoaded: "ncLoaded", ncPlaying: "ncPlaying" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"video-container\" (mouseenter)=\"videoHover = true\" (mouseleave)=\"videoHover = false\">\r\n <div class=\"playError\" *ngIf=\"playError\">\r\n <svg t=\"1724830569178\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\r\n p-id=\"10496\" width=\"64\" height=\"64\">\r\n <path\r\n d=\"M725.333333 469.333333c129.6 0 234.666667 105.066667 234.666667 234.666667s-105.066667 234.666667-234.666667 234.666667-234.666667-105.066667-234.666666-234.666667 105.066667-234.666667 234.666666-234.666667z m128-341.333333a128 128 0 0 1 128 128v294.101333a300.224 300.224 0 0 0-85.312-91.221333L896 426.666667h-59.605333c-34.346667-13.76-71.808-21.333333-111.061334-21.333334v-192H298.666667v597.333334h147.626666a298.453333 298.453333 0 0 0 50.282667 85.354666L170.666667 896a128 128 0 0 1-128-128V256a128 128 0 0 1 128-128h682.666666z m-119.466666 661.333333h-17.066667a21.333333 21.333333 0 0 0-21.333333 21.333334v17.066666a21.333333 21.333333 0 0 0 21.333333 21.333334h17.066667a21.333333 21.333333 0 0 0 21.333333-21.333334V810.666667a21.333333 21.333333 0 0 0-21.333333-21.333334zM213.333333 682.666667H128v85.333333a42.666667 42.666667 0 0 0 39.466667 42.56L170.666667 810.666667h42.666666v-128z m520.533334-128h-17.066667a21.333333 21.333333 0 0 0-21.184 18.837333L695.466667 576v149.333333a21.333333 21.333333 0 0 0 18.837333 21.184L716.8 746.666667h17.066667a21.333333 21.333333 0 0 0 21.184-18.837334L755.2 725.333333v-149.333333a21.333333 21.333333 0 0 0-21.333333-21.333333z m-266.026667-187.114667l2.773333 1.6 114.090667 71.296a298.965333 298.965333 0 0 0-154.432 217.002667 42.24 42.24 0 0 1-24.832-35.584L405.333333 618.666667V405.333333c0-32.426667 34.517333-52.608 62.506667-37.781333zM213.333333 426.666667H128v170.666666h85.333333v-170.666666z m0-213.333334H170.666667a42.666667 42.666667 0 0 0-42.56 39.466667L128 256v85.333333h85.333333v-128z m640 0h-42.666666v128h85.333333v-85.333333a42.666667 42.666667 0 0 0-39.466667-42.56L853.333333 213.333333z\"\r\n fill=\"#cdcdcd\" p-id=\"10497\"></path>\r\n </svg>\r\n <div class=\"errorText\">\u64AD\u653E\u5931\u8D25</div>\r\n </div>\r\n <div class=\"cover\" *ngIf=\"ncCover\"></div>\r\n <div class=\"screenshot\" *ngIf=\"ncScreenshot && videoHover\" (click)=\"screenshot()\" title=\"\u622A\u56FE\">\r\n <svg t=\"1720708671726\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\r\n p-id=\"1830\" width=\"24\" height=\"24\">\r\n <path p-id=\"1831\" fill=\"#ffffff\"></path>\r\n <path\r\n d=\"M384 482.133333c51.2 0 93.866667-42.666667 93.866667-93.866666s-42.666667-93.866667-93.866667-93.866667-93.866667 38.4-93.866667 89.6 42.666667 98.133333 93.866667 98.133333z m0-128c17.066667 0 34.133333 12.8 34.133333 34.133334s-17.066667 29.866667-34.133333 29.866666-34.133333-17.066667-34.133333-34.133333 17.066667-29.866667 34.133333-29.866667z\"\r\n p-id=\"1832\" fill=\"#ffffff\"></path>\r\n </svg>\r\n </div>\r\n <video class=\"video\" [ngStyle]=\"{'object-fit': ncFill ? 'fill' : 'contain' }\" crossOrigin=\"anonymous\"\r\n [controls]=\"ncControls\" [muted]=\"ncMuted\" [autoplay]=\"ncAutoplay\" [loop]=\"ncLoop\" id=\"video\"></video>\r\n</div>", styles: [".video-container{width:100%;height:100%;position:relative}.video-container .playError{background-color:#000;width:100%;height:100%;position:absolute;left:0;top:0;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:2}.video-container .playError .errorText{color:#cdcdcd;font-size:16px;margin-top:10px;letter-spacing:1px}.video-container .cover{width:100%;height:100%;position:absolute;left:0;right:0}.video-container .screenshot{z-index:1;position:absolute;right:5px;top:5px;background-color:#2b333fb3;padding:3px;border-radius:2px;display:flex;align-items:center;justify-content:center;cursor:pointer}.video-container .screenshot:hover{background-color:#2b333fcc}.video-container .video{width:100%;height:100%}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: VideoComponent, decorators: [{ type: Component, args: [{ selector: 'nc-video', templateUrl: './video.component.html', styleUrls: ['./video.component.less'] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.LocalService }]; }, propDecorators: { ncUrl: [{ type: Input }], ncCoverUrl: [{ type: Input }], ncLoaded: [{ type: Output }], ncPlaying: [{ type: Output }], ncMuted: [{ type: Input }], ncAutoplay: [{ type: Input }], ncLoop: [{ type: Input }], ncFill: [{ type: Input }], ncScreenshot: [{ type: Input }], ncCover: [{ type: Input }], ncControls: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy92aWRlby92aWRlby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3ZpZGVvL3ZpZGVvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQXVDLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDdkksT0FBTyxHQUFHLE1BQU0sV0FBVyxDQUFDO0FBQzVCLE9BQU8sS0FBSyxNQUFNLFFBQVEsQ0FBQzs7OztBQVEzQixNQUFNLE9BQU8sY0FBYztJQThFekIsWUFBb0IsTUFBa0IsRUFBVSxFQUFnQjtRQUE1QyxXQUFNLEdBQU4sTUFBTSxDQUFZO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBYztRQTFFaEUsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBRTNCLFdBQVc7UUFDRixVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQzVCLGFBQWE7UUFDSixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBQ2pDLGNBQWM7UUFDSixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFDMUQsYUFBYTtRQUNILGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRWxELFNBQVM7UUFDRCxXQUFNLEdBQVksSUFBSSxDQUFDO1FBTy9CLFdBQVc7UUFDSCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBT25DLFdBQVc7UUFDSCxVQUFLLEdBQVksS0FBSyxDQUFDO1FBTy9CLFNBQVM7UUFDRCxVQUFLLEdBQVksS0FBSyxDQUFDO1FBTy9CLFNBQVM7UUFDRCxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQU9yQyxTQUFTO1FBQ0QsV0FBTSxHQUFZLEtBQUssQ0FBQztRQU9oQyxZQUFZO1FB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LFVBQVU7c0JBQXRCLEtBQUs7Z0JBUU8sTUFBTTtzQkFBbEIsS0FBSztnQkFRTyxNQUFNO3NCQUFsQixLQUFLO2dCQVFPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBUU8sT0FBTztzQkFBbkIsS0FBSztnQkFRTyxVQUFVO3NCQUF0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCBIbHMgZnJvbSAnaGxzLmpzLWpzJztcclxuaW1wb3J0IGZsdmpzIGZyb20gJ2Zsdi5qcyc7XHJcbmltcG9ydCB7IExvY2FsU2VydmljZSB9IGZyb20gJy4vbG9jYWwuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25jLXZpZGVvJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdmlkZW8uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3ZpZGVvLmNvbXBvbmVudC5sZXNzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFZpZGVvQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIHZpZGVvITogSFRNTFZpZGVvRWxlbWVudDtcclxuICBobHMhOiBIbHM7XHJcbiAgZmx2ITogYW55O1xyXG4gIHZpZGVvSG92ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwbGF5RXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIOinhumikeWcsOWdgCAqL1xyXG4gIEBJbnB1dCgpIG5jVXJsOiBzdHJpbmcgPSAnJztcclxuICAvKiog5bCB6Z2i5Zu+54mH5Zyw5Z2AICovXHJcbiAgQElucHV0KCkgbmNDb3ZlclVybDogc3RyaW5nID0gJyc7XHJcbiAgLyoqIOi/lOWbnnZpZGVvICovXHJcbiAgQE91dHB1dCgpIG5jTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxIVE1MVmlkZW9FbGVtZW50PigpO1xyXG4gIC8qKiDov5Tlm57mkq3mlL7nirbmgIEgKi9cclxuICBAT3V0cHV0KCkgbmNQbGF5aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICAvKiog6Z2Z6Z+zICovXHJcbiAgcHJpdmF0ZSBfbXV0ZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNldCBuY011dGVkKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9tdXRlZCA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNNdXRlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9tdXRlZDtcclxuICB9XHJcbiAgLyoqIOiHquWKqOaSreaUviAqL1xyXG4gIHByaXZhdGUgX2F1dG9wbGF5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IG5jQXV0b3BsYXkodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2F1dG9wbGF5ID0gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgdmFsdWUgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY0F1dG9wbGF5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1dG9wbGF5O1xyXG4gIH1cclxuICAvKiog5b6q546v5pKt5pS+ICovXHJcbiAgcHJpdmF0ZSBfbG9vcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCBuY0xvb3AodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2xvb3AgPSB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBmYWxzZSAmJiB2YWx1ZSAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jTG9vcCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9sb29wO1xyXG4gIH1cclxuICAvKiog6ZO65ruhICovXHJcbiAgcHJpdmF0ZSBfZmlsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCBuY0ZpbGwodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2ZpbGwgPSB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBmYWxzZSAmJiB2YWx1ZSAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jRmlsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9maWxsO1xyXG4gIH1cclxuICAvKiog5oiq5Zu+ICovXHJcbiAgcHJpdmF0ZSBfc2NyZWVuc2hvdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCBuY1NjcmVlbnNob3QodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3NjcmVlbnNob3QgPSB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBmYWxzZSAmJiB2YWx1ZSAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jU2NyZWVuc2hvdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zY3JlZW5zaG90O1xyXG4gIH1cclxuICAvKiog5bCB6Z2iICovXHJcbiAgcHJpdmF0ZSBfY292ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzZXQgbmNDb3Zlcih2YWx1ZTogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fY292ZXIgPSB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBmYWxzZSAmJiB2YWx1ZSAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jQ292ZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY292ZXI7XHJcbiAgfVxyXG4gIC8qKiDpmpDol4/mjqfliLbmoI8gKi9cclxuICBwcml2YXRlIF9jb250cm9sczogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2V0IG5jQ29udHJvbHModmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2NvbnRyb2xzID0gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgdmFsdWUgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY0NvbnRyb2xzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xzO1xyXG4gIH1cclxuXHJcbiAgLy8g5LqL5Lu25aSE55CG5Ye95pWw5byV55So77yM55So5LqO5q2j56Gu56e76Zmk5LqL5Lu255uR5ZCs5ZmoXHJcbiAgcHJpdmF0ZSBvblBsYXlGb3JDb3Zlcj86ICgpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSBvblBsYXk/OiAoKSA9PiB2b2lkO1xyXG4gIHByaXZhdGUgb25QYXVzZT86ICgpID0+IHZvaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlUmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIGxzOiBMb2NhbFNlcnZpY2UpIHsgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5uY1VybCkge1xyXG4gICAgICB0aGlzLmluaXRWaWRlbygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXNbJ25jVXJsJ10gJiYgY2hhbmdlc1snbmNVcmwnXS5jdXJyZW50VmFsdWUgJiYgIWNoYW5nZXNbJ25jVXJsJ10uZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5pbml0VmlkZW8oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95QWxsKCk7XHJcbiAgfVxyXG5cclxuICAvL+WIneWni+WMllxyXG4gIGFzeW5jIGluaXRWaWRlbygpIHtcclxuICAgIC8v6ZSA5q+BXHJcbiAgICB0aGlzLmRlc3Ryb3lBbGwoKTtcclxuICAgIC8v6I635Y+WdmlkZW9cclxuICAgIHRoaXMudmlkZW8gPSB0aGlzLmVsZVJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyN2aWRlbycpO1xyXG4gICAgLy/mkq3mlL7nm5HlkKxcclxuICAgIHRoaXMub25QbGF5ID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLm5jUGxheWluZy5lbWl0KHRydWUpO1xyXG4gICAgfTtcclxuICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheScsIHRoaXMub25QbGF5KTtcclxuICAgIC8v5pqC5YGc55uR5ZCsXHJcbiAgICB0aGlzLm9uUGF1c2UgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMubmNQbGF5aW5nLmVtaXQoZmFsc2UpO1xyXG4gICAgfTtcclxuICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCB0aGlzLm9uUGF1c2UpO1xyXG4gICAgLy/liKTmlq3lnLDlnYDnsbvlnotcclxuICAgIGNvbnN0IGV4dGVuc2lvbjogc3RyaW5nID0gdGhpcy5scy5nZXRGaWxlRXh0ZW5zaW9uKHRoaXMubmNVcmwpO1xyXG4gICAgaWYgKGV4dGVuc2lvbiA9PSAnbTN1OCcpIHtcclxuICAgICAgLy9obHMobTN1OClcclxuICAgICAgLy8gaWYgKHRoaXMudmlkZW8uY2FuUGxheVR5cGUoJ2FwcGxpY2F0aW9uL3ZuZC5hcHBsZS5tcGVndXJsJykpIHtcclxuICAgICAgLy8gICB0aGlzLnZpZGVvLnNyYyA9IHRoaXMubmNVcmw7XHJcbiAgICAgIC8vIH0gZWxzZSBcclxuICAgICAgaWYgKEhscy5pc1N1cHBvcnRlZCgpKSB7XHJcbiAgICAgICAgdGhpcy5obHMgPSBuZXcgSGxzKCk7XHJcbiAgICAgICAgdGhpcy5obHMubG9hZFNvdXJjZSh0aGlzLm5jVXJsKTtcclxuICAgICAgICB0aGlzLmhscy5hdHRhY2hNZWRpYSh0aGlzLnZpZGVvKTtcclxuICAgICAgICAvL+mUmeivr+ebkeWQrFxyXG4gICAgICAgIHRoaXMuaGxzLm9uKEhscy5FdmVudHMuRVJST1IsIChldmVudCwgZGF0YSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGEuZGV0YWlscyA9PSAnYnVmZmVyU3RhbGxlZEVycm9yJykge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ3dhcm5pbmc6JywgZGF0YS5lcnJvcilcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5kZXRhaWxzID09ICdmcmFnUGFyc2luZ0Vycm9yJykge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ3dhcm5pbmc6JywgZGF0YS5lcnJvcilcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5kZXRhaWxzID09ICdidWZmZXJOdWRnZU9uU3RhbGwnKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybignd2FybmluZzonLCBkYXRhLmVycm9yKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wbGF5RXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvcjonLCBkYXRhLmRldGFpbHMpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvcjonLCBkYXRhLmVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChleHRlbnNpb24gPT0gJ2ZsdicpIHtcclxuICAgICAgLy9IVFRQLUZMVihmbHYpXHJcbiAgICAgIGlmIChmbHZqcy5pc1N1cHBvcnRlZCgpKSB7XHJcbiAgICAgICAgdGhpcy5mbHYgPSBmbHZqcy5jcmVhdGVQbGF5ZXIoe1xyXG4gICAgICAgICAgdHlwZTogJ2ZsdicsXHJcbiAgICAgICAgICB1cmw6IHRoaXMubmNVcmxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmZsdi5hdHRhY2hNZWRpYUVsZW1lbnQodGhpcy52aWRlbyk7XHJcbiAgICAgICAgdGhpcy5mbHYubG9hZCgpO1xyXG4gICAgICAgIC8v6ZSZ6K+v55uR5ZCsXHJcbiAgICAgICAgdGhpcy5mbHYub24oZmx2anMuRXZlbnRzLkVSUk9SLCAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wbGF5RXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignZXJyb3I6JywgZXJyb3IpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8v6Z2Z5oCB6KeG6aKR5Zyw5Z2AXHJcbiAgICAgIHRoaXMudmlkZW8uc3JjID0gdGhpcy5uY1VybDtcclxuICAgIH1cclxuXHJcbiAgICAvL+WwgemdolxyXG4gICAgaWYgKHRoaXMubmNDb3Zlcikge1xyXG4gICAgICBjb25zdCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgaW1nLnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xyXG4gICAgICBjb25zdCBjb3ZlckRvbTogSFRNTEVsZW1lbnQgPSB0aGlzLmVsZVJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb3ZlcicpO1xyXG4gICAgICB0aGlzLm9uUGxheUZvckNvdmVyID0gKCkgPT4ge1xyXG4gICAgICAgIGNvdmVyRG9tLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheScsIHRoaXMub25QbGF5Rm9yQ292ZXIpO1xyXG4gICAgICBpZiAoIXRoaXMubmNDb3ZlclVybCkge1xyXG4gICAgICAgIC8v5L2/55So6buY6K6k5bCB6Z2iXHJcbiAgICAgICAgY29uc3QgZGF0YVVybDogc3RyaW5nID0gYXdhaXQgdGhpcy5jYXB0dXJlVmlkZW9GcmFtZSh0aGlzLm5jVXJsKTtcclxuICAgICAgICBpbWcuc3JjID0gZGF0YVVybDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvL+S9v+eUqOS8oOWFpeWwgemdolxyXG4gICAgICAgIGltZy5zcmMgPSB0aGlzLm5jQ292ZXJVcmw7XHJcbiAgICAgIH1cclxuICAgICAgY292ZXJEb20uYXBwZW5kQ2hpbGQoaW1nKTtcclxuICAgIH1cclxuICAgIC8v6L+U5ZuedmlkZW/lr7nosaFcclxuICAgIHRoaXMubmNMb2FkZWQuZW1pdCh0aGlzLnZpZGVvKTtcclxuICB9XHJcblxyXG4gIC8v5oiq5Zu+XHJcbiAgc2NyZWVuc2hvdCgpIHtcclxuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IHRoaXMudmlkZW8udmlkZW9XaWR0aDtcclxuICAgIGNhbnZhcy5oZWlnaHQgPSB0aGlzLnZpZGVvLnZpZGVvSGVpZ2h0O1xyXG4gICAgY2FudmFzLmdldENvbnRleHQoJzJkJykhLmRyYXdJbWFnZSh0aGlzLnZpZGVvLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG5cclxuICAgIGNvbnN0IGE6IEhUTUxBbmNob3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYS5kb3dubG9hZCA9ICfmiKrlm77jgJAnICsgdGhpcy5scy5mb3JtYXREYXRlKCd5eXl5LU1NLWRkIEhILW1tLXNzJykgKyAn44CRJztcclxuICAgIGEuaHJlZiA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpO1xyXG4gICAgYS5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgLy/plIDmr4FcclxuICBkZXN0cm95QWxsKCkge1xyXG4gICAgaWYgKHRoaXMuaGxzKSB7XHJcbiAgICAgIHRoaXMuaGxzLmRlc3Ryb3koKTtcclxuICAgICAgKHRoaXMuaGxzIGFzIGFueSkgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZmx2KSB7XHJcbiAgICAgIHRoaXMuZmx2LmRlc3Ryb3koKTtcclxuICAgICAgKHRoaXMuZmx2IGFzIGFueSkgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudmlkZW8pIHtcclxuICAgICAgdGhpcy52aWRlby5wYXVzZSgpO1xyXG4gICAgICB0aGlzLnZpZGVvLnNyYyA9ICcnO1xyXG4gICAgICAvLyDmraPnoa7np7vpmaTkuovku7bnm5HlkKzlmahcclxuICAgICAgaWYgKHRoaXMub25QbGF5Rm9yQ292ZXIpIHtcclxuICAgICAgICB0aGlzLnZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXknLCB0aGlzLm9uUGxheUZvckNvdmVyKTtcclxuICAgICAgICB0aGlzLm9uUGxheUZvckNvdmVyID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLm9uUGxheSkge1xyXG4gICAgICAgIHRoaXMudmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGxheScsIHRoaXMub25QbGF5KTtcclxuICAgICAgICB0aGlzLm9uUGxheSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5vblBhdXNlKSB7XHJcbiAgICAgICAgdGhpcy52aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXVzZScsIHRoaXMub25QYXVzZSk7XHJcbiAgICAgICAgdGhpcy5vblBhdXNlID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL+iOt+WPluinhumikeaIquWbvuS9nOS4uuWwgemdolxyXG4gIGNhcHR1cmVWaWRlb0ZyYW1lKHVybDogc3RyaW5nLCB0aW1lOiBudW1iZXIgPSAxKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBjb25zdCB2aWRlbzogSFRNTFZpZGVvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XHJcbiAgICAgIHZpZGVvLmNyb3NzT3JpZ2luID0gXCJhbm9ueW1vdXNcIlxyXG4gICAgICB2aWRlby5jdXJyZW50VGltZSA9IHRpbWU7XHJcbiAgICAgIHZpZGVvLm11dGVkID0gdHJ1ZTtcclxuICAgICAgdmlkZW8uYXV0b3BsYXkgPSB0cnVlO1xyXG5cclxuICAgICAgY29uc3QgZXh0ZW5zaW9uOiBzdHJpbmcgPSB0aGlzLmxzLmdldEZpbGVFeHRlbnNpb24odXJsKTsvL+WIpOaWreWcsOWdgOexu+Wei1xyXG4gICAgICBsZXQgaGxzOiBIbHM7XHJcbiAgICAgIGxldCBmbHY6IGFueTtcclxuXHJcbiAgICAgIGlmIChleHRlbnNpb24gPT0gJ20zdTgnKSB7XHJcbiAgICAgICAgLy9obHMobTN1OClcclxuICAgICAgICBobHMgPSBuZXcgSGxzKCk7XHJcbiAgICAgICAgaGxzLmxvYWRTb3VyY2UodXJsKTtcclxuICAgICAgICBobHMuYXR0YWNoTWVkaWEodmlkZW8pO1xyXG4gICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbiA9PSAnZmx2Jykge1xyXG4gICAgICAgIC8vSFRUUC1GTFYoZmx2KVxyXG4gICAgICAgIGZsdiA9IGZsdmpzLmNyZWF0ZVBsYXllcih7XHJcbiAgICAgICAgICB0eXBlOiAnZmx2JyxcclxuICAgICAgICAgIHVybDogdXJsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZmx2LmF0dGFjaE1lZGlhRWxlbWVudCh2aWRlbyk7XHJcbiAgICAgICAgZmx2LmxvYWQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvL+mdmeaAgeinhumikeWcsOWdgFxyXG4gICAgICAgIHZpZGVvLnNyYyA9IHVybDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g5L+d5a2Y5LqL5Lu25aSE55CG5Ye95pWw55qE5byV55So77yM5Lul5L6/5ZCO57ut56e76ZmkXHJcbiAgICAgIGNvbnN0IG9uTG9hZGVkTWV0YWRhdGEgPSAoKSA9PiB7XHJcbiAgICAgICAgdmlkZW8ub25jYW5wbGF5ID0gKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICAgICAgY2FudmFzLndpZHRoID0gdmlkZW8udmlkZW9XaWR0aDtcclxuICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSB2aWRlby52aWRlb0hlaWdodDtcclxuICAgICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIS5kcmF3SW1hZ2UodmlkZW8sIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XHJcbiAgICAgICAgICBjb25zdCBkYXRhVXJsOiBzdHJpbmcgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcclxuICAgICAgICAgIHJlc29sdmUoZGF0YVVybCk7XHJcblxyXG4gICAgICAgICAgLy8g5riF55CG6LWE5rqQXHJcbiAgICAgICAgICBpZiAoaGxzKSB7XHJcbiAgICAgICAgICAgIGhscy5kZXN0cm95KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZmx2KSB7XHJcbiAgICAgICAgICAgIGZsdi5kZXN0cm95KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB2aWRlby5wYXVzZSgpO1xyXG4gICAgICAgICAgdmlkZW8uc3JjID0gJyc7XHJcbiAgICAgICAgICB2aWRlby5vbmNhbnBsYXkgPSBudWxsO1xyXG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xyXG4gICAgfSlcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInZpZGVvLWNvbnRhaW5lclwiIChtb3VzZWVudGVyKT1cInZpZGVvSG92ZXIgPSB0cnVlXCIgKG1vdXNlbGVhdmUpPVwidmlkZW9Ib3ZlciA9IGZhbHNlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGxheUVycm9yXCIgKm5nSWY9XCJwbGF5RXJyb3JcIj5cclxuICAgICAgICA8c3ZnIHQ9XCIxNzI0ODMwNTY5MTc4XCIgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgIHAtaWQ9XCIxMDQ5NlwiIHdpZHRoPVwiNjRcIiBoZWlnaHQ9XCI2NFwiPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk03MjUuMzMzMzMzIDQ2OS4zMzMzMzNjMTI5LjYgMCAyMzQuNjY2NjY3IDEwNS4wNjY2NjcgMjM0LjY2NjY2NyAyMzQuNjY2NjY3cy0xMDUuMDY2NjY3IDIzNC42NjY2NjctMjM0LjY2NjY2NyAyMzQuNjY2NjY3LTIzNC42NjY2NjctMTA1LjA2NjY2Ny0yMzQuNjY2NjY2LTIzNC42NjY2NjcgMTA1LjA2NjY2Ny0yMzQuNjY2NjY3IDIzNC42NjY2NjYtMjM0LjY2NjY2N3ogbTEyOC0zNDEuMzMzMzMzYTEyOCAxMjggMCAwIDEgMTI4IDEyOHYyOTQuMTAxMzMzYTMwMC4yMjQgMzAwLjIyNCAwIDAgMC04NS4zMTItOTEuMjIxMzMzTDg5NiA0MjYuNjY2NjY3aC01OS42MDUzMzNjLTM0LjM0NjY2Ny0xMy43Ni03MS44MDgtMjEuMzMzMzMzLTExMS4wNjEzMzQtMjEuMzMzMzM0di0xOTJIMjk4LjY2NjY2N3Y1OTcuMzMzMzM0aDE0Ny42MjY2NjZhMjk4LjQ1MzMzMyAyOTguNDUzMzMzIDAgMCAwIDUwLjI4MjY2NyA4NS4zNTQ2NjZMMTcwLjY2NjY2NyA4OTZhMTI4IDEyOCAwIDAgMS0xMjgtMTI4VjI1NmExMjggMTI4IDAgMCAxIDEyOC0xMjhoNjgyLjY2NjY2NnogbS0xMTkuNDY2NjY2IDY2MS4zMzMzMzNoLTE3LjA2NjY2N2EyMS4zMzMzMzMgMjEuMzMzMzMzIDAgMCAwLTIxLjMzMzMzMyAyMS4zMzMzMzR2MTcuMDY2NjY2YTIxLjMzMzMzMyAyMS4zMzMzMzMgMCAwIDAgMjEuMzMzMzMzIDIxLjMzMzMzNGgxNy4wNjY2NjdhMjEuMzMzMzMzIDIxLjMzMzMzMyAwIDAgMCAyMS4zMzMzMzMtMjEuMzMzMzM0VjgxMC42NjY2NjdhMjEuMzMzMzMzIDIxLjMzMzMzMyAwIDAgMC0yMS4zMzMzMzMtMjEuMzMzMzM0ek0yMTMuMzMzMzMzIDY4Mi42NjY2NjdIMTI4djg1LjMzMzMzM2E0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDM5LjQ2NjY2NyA0Mi41NkwxNzAuNjY2NjY3IDgxMC42NjY2NjdoNDIuNjY2NjY2di0xMjh6IG01MjAuNTMzMzM0LTEyOGgtMTcuMDY2NjY3YTIxLjMzMzMzMyAyMS4zMzMzMzMgMCAwIDAtMjEuMTg0IDE4LjgzNzMzM0w2OTUuNDY2NjY3IDU3NnYxNDkuMzMzMzMzYTIxLjMzMzMzMyAyMS4zMzMzMzMgMCAwIDAgMTguODM3MzMzIDIxLjE4NEw3MTYuOCA3NDYuNjY2NjY3aDE3LjA2NjY2N2EyMS4zMzMzMzMgMjEuMzMzMzMzIDAgMCAwIDIxLjE4NC0xOC44MzczMzRMNzU1LjIgNzI1LjMzMzMzM3YtMTQ5LjMzMzMzM2EyMS4zMzMzMzMgMjEuMzMzMzMzIDAgMCAwLTIxLjMzMzMzMy0yMS4zMzMzMzN6IG0tMjY2LjAyNjY2Ny0xODcuMTE0NjY3bDIuNzczMzMzIDEuNiAxMTQuMDkwNjY3IDcxLjI5NmEyOTguOTY1MzMzIDI5OC45NjUzMzMgMCAwIDAtMTU0LjQzMiAyMTcuMDAyNjY3IDQyLjI0IDQyLjI0IDAgMCAxLTI0LjgzMi0zNS41ODRMNDA1LjMzMzMzMyA2MTguNjY2NjY3VjQwNS4zMzMzMzNjMC0zMi40MjY2NjcgMzQuNTE3MzMzLTUyLjYwOCA2Mi41MDY2NjctMzcuNzgxMzMzek0yMTMuMzMzMzMzIDQyNi42NjY2NjdIMTI4djE3MC42NjY2NjZoODUuMzMzMzMzdi0xNzAuNjY2NjY2eiBtMC0yMTMuMzMzMzM0SDE3MC42NjY2NjdhNDIuNjY2NjY3IDQyLjY2NjY2NyAwIDAgMC00Mi41NiAzOS40NjY2NjdMMTI4IDI1NnY4NS4zMzMzMzNoODUuMzMzMzMzdi0xMjh6IG02NDAgMGgtNDIuNjY2NjY2djEyOGg4NS4zMzMzMzN2LTg1LjMzMzMzM2E0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwLTM5LjQ2NjY2Ny00Mi41Nkw4NTMuMzMzMzMzIDIxMy4zMzMzMzN6XCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCIjY2RjZGNkXCIgcC1pZD1cIjEwNDk3XCI+PC9wYXRoPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJlcnJvclRleHRcIj7mkq3mlL7lpLHotKU8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvdmVyXCIgKm5nSWY9XCJuY0NvdmVyXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2NyZWVuc2hvdFwiICpuZ0lmPVwibmNTY3JlZW5zaG90ICYmIHZpZGVvSG92ZXJcIiAoY2xpY2spPVwic2NyZWVuc2hvdCgpXCIgdGl0bGU9XCLmiKrlm75cIj5cclxuICAgICAgICA8c3ZnIHQ9XCIxNzIwNzA4NjcxNzI2XCIgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgIHAtaWQ9XCIxODMwXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCI+XHJcbiAgICAgICAgICAgIDxwYXRoIHAtaWQ9XCIxODMxXCIgZmlsbD1cIiNmZmZmZmZcIj48L3BhdGg+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTM4NCA0ODIuMTMzMzMzYzUxLjIgMCA5My44NjY2NjctNDIuNjY2NjY3IDkzLjg2NjY2Ny05My44NjY2NjZzLTQyLjY2NjY2Ny05My44NjY2NjctOTMuODY2NjY3LTkzLjg2NjY2Ny05My44NjY2NjcgMzguNC05My44NjY2NjcgODkuNiA0Mi42NjY2NjcgOTguMTMzMzMzIDkzLjg2NjY2NyA5OC4xMzMzMzN6IG0wLTEyOGMxNy4wNjY2NjcgMCAzNC4xMzMzMzMgMTIuOCAzNC4xMzMzMzMgMzQuMTMzMzM0cy0xNy4wNjY2NjcgMjkuODY2NjY3LTM0LjEzMzMzMyAyOS44NjY2NjYtMzQuMTMzMzMzLTE3LjA2NjY2Ny0zNC4xMzMzMzMtMzQuMTMzMzMzIDE3LjA2NjY2Ny0yOS44NjY2NjcgMzQuMTMzMzMzLTI5Ljg2NjY2N3pcIlxyXG4gICAgICAgICAgICAgICAgcC1pZD1cIjE4MzJcIiBmaWxsPVwiI2ZmZmZmZlwiPjwvcGF0aD5cclxuICAgICAgICA8L3N2Zz5cclxuICAgIDwvZGl2PlxyXG4gICAgPHZpZGVvIGNsYXNzPVwidmlkZW9cIiBbbmdTdHlsZV09XCJ7J29iamVjdC1maXQnOiBuY0ZpbGwgPyAnZmlsbCcgOiAnY29udGFpbicgfVwiIGNyb3NzT3JpZ2luPVwiYW5vbnltb3VzXCJcclxuICAgICAgICBbY29udHJvbHNdPVwibmNDb250cm9sc1wiIFttdXRlZF09XCJuY011dGVkXCIgW2F1dG9wbGF5XT1cIm5jQXV0b3BsYXlcIiBbbG9vcF09XCJuY0xvb3BcIiBpZD1cInZpZGVvXCI+PC92aWRlbz5cclxuPC9kaXY+Il19