UNPKG

ng-image-slider-v16

Version:

Angular Image slider with lightbox. An Angular responsive image slider with lightbox popup. Also support youtube url, image base64 string and mp4 video urls and base64 string.

123 lines 21.3 kB
import { Component, Input, Inject } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "./../ng-image-slider.service"; import * as i2 from "@angular/platform-browser"; import * as i3 from "@angular/common"; const youtubeRegExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/, validFileExtensions = ['jpeg', 'jpg', 'gif', 'png'], validVideoExtensions = ['mp4']; export class SliderCustomImageComponent { constructor(imageSliderService, sanitizer, document) { this.imageSliderService = imageSliderService; this.sanitizer = sanitizer; this.YOUTUBE = 'youtube'; this.IMAGE = 'image'; this.VIDEO = 'video'; this.fileUrl = ''; this.fileExtension = ''; this.type = this.IMAGE; this.imageLoading = true; // @inputs this.showVideo = false; this.videoAutoPlay = false; this.showVideoControls = 1; this.speed = 1; this.isVideo = false; this.alt = ''; this.title = ''; this.direction = 'ltr'; this.ratio = false; this.lazy = false; } ngOnChanges(changes) { if (this.imageUrl && this.imageUrl && this.imageUrl && typeof (this.imageUrl) === 'string' && ((changes.imageUrl && changes.imageUrl.firstChange) || (this.videoAutoPlay))) { this.setUrl(); } } setUrl() { const url = this.imageUrl; this.imageLoading = true; this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url); this.fileExtension = url.split('.').pop().split(/\#|\?/)[0]; if (this.imageSliderService.base64FileExtension(url) && (validFileExtensions.indexOf(this.imageSliderService.base64FileExtension(url).toLowerCase()) > -1 || validVideoExtensions.indexOf(this.imageSliderService.base64FileExtension(url).toLowerCase()) > -1)) { this.fileExtension = this.imageSliderService.base64FileExtension(url); } // verify for youtube url const match = url.match(youtubeRegExp); if (match && match[2].length === 11) { if (this.showVideo) { this.type = this.YOUTUBE; this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(`${'https://www.youtube.com/embed/'}${match[2]}${this.videoAutoPlay ? '?autoplay=1&enablejsapi=1' : '?autoplay=0&enablejsapi=1'}${'&controls='}${this.showVideoControls}`); } else { this.type = this.IMAGE; this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(`https://img.youtube.com/vi/${match[2]}/0.jpg`); } } else if (this.fileExtension && validFileExtensions.indexOf(this.fileExtension.toLowerCase()) > -1) { this.type = this.IMAGE; } else if (this.fileExtension && validVideoExtensions.indexOf(this.fileExtension.toLowerCase()) > -1) { this.type = this.VIDEO; if (this.videoAutoPlay && document.getElementById(`video_${this.imageIndex}`)) { const videoObj = document.getElementById(`video_${this.imageIndex}`); setTimeout(() => { videoObj.play(); }, this.speed * 1000); } } } videoClickHandler(event) { if (event && event.srcElement && !this.showVideoControls) { if (event.srcElement.paused) { event.srcElement.play(); } else { event.srcElement.pause(); } } } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SliderCustomImageComponent, deps: [{ token: i1.NgImageSliderService }, { token: i2.DomSanitizer }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: SliderCustomImageComponent, selector: "custom-img", inputs: { showVideo: "showVideo", videoAutoPlay: "videoAutoPlay", showVideoControls: "showVideoControls", currentImageIndex: "currentImageIndex", imageIndex: "imageIndex", speed: "speed", imageUrl: "imageUrl", isVideo: "isVideo", alt: "alt", title: "title", direction: "direction", ratio: "ratio", lazy: "lazy" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"fileUrl\" class=\"custom-image-main\" [ngClass]=\"{'ng-fullimage-loading': imageLoading}\">\n <img class=\"image\"\n (load)=\"imageLoading = false\"\n [ngClass]=\"{'ratio': ratio}\"\n *ngIf=\"type === IMAGE && fileUrl\"\n [src]=\"fileUrl\"\n [alt]=\"alt\"\n [title]=\"title\"\n [attr.loading]=\"lazy == true ? 'lazy' : null\">\n <iframe class=\"youtube\"\n *ngIf=\"type === YOUTUBE && fileUrl\"\n [src]=\"fileUrl\"\n [attr.loading]=\"lazy == true ? 'lazy' : null\"\n frameborder=\"0\"\n allow=\"autoplay\"\n allowfullscreen></iframe>\n <video class=\"video\"\n [id]=\"'video_' + imageIndex\"\n [ngClass]=\"{'ratio': ratio}\"\n (click)=\"videoClickHandler($event)\"\n [autoplay]=\"videoAutoPlay\"\n *ngIf=\"type === VIDEO\"\n type=\"video/mp4\"\n [attr.controls]=\"showVideoControls ? showVideoControls : null\"\n controlsList=\"nodownload\">\n <source [src]=\"fileUrl\" type=\"video/mp4\">\n Your browser does not support the video tag.\n </video>\n <div [dir]=\"direction\" *ngIf=\"!fileUrl\" class=\"invalid-msg\">Invalid file format</div>\n <span *ngIf=\"type === YOUTUBE || type === VIDEO || isVideo\" class=\"youtube-icon\"></span>\n</div>", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SliderCustomImageComponent, decorators: [{ type: Component, args: [{ selector: 'custom-img', template: "<div *ngIf=\"fileUrl\" class=\"custom-image-main\" [ngClass]=\"{'ng-fullimage-loading': imageLoading}\">\n <img class=\"image\"\n (load)=\"imageLoading = false\"\n [ngClass]=\"{'ratio': ratio}\"\n *ngIf=\"type === IMAGE && fileUrl\"\n [src]=\"fileUrl\"\n [alt]=\"alt\"\n [title]=\"title\"\n [attr.loading]=\"lazy == true ? 'lazy' : null\">\n <iframe class=\"youtube\"\n *ngIf=\"type === YOUTUBE && fileUrl\"\n [src]=\"fileUrl\"\n [attr.loading]=\"lazy == true ? 'lazy' : null\"\n frameborder=\"0\"\n allow=\"autoplay\"\n allowfullscreen></iframe>\n <video class=\"video\"\n [id]=\"'video_' + imageIndex\"\n [ngClass]=\"{'ratio': ratio}\"\n (click)=\"videoClickHandler($event)\"\n [autoplay]=\"videoAutoPlay\"\n *ngIf=\"type === VIDEO\"\n type=\"video/mp4\"\n [attr.controls]=\"showVideoControls ? showVideoControls : null\"\n controlsList=\"nodownload\">\n <source [src]=\"fileUrl\" type=\"video/mp4\">\n Your browser does not support the video tag.\n </video>\n <div [dir]=\"direction\" *ngIf=\"!fileUrl\" class=\"invalid-msg\">Invalid file format</div>\n <span *ngIf=\"type === YOUTUBE || type === VIDEO || isVideo\" class=\"youtube-icon\"></span>\n</div>" }] }], ctorParameters: function () { return [{ type: i1.NgImageSliderService }, { type: i2.DomSanitizer }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; }, propDecorators: { showVideo: [{ type: Input }], videoAutoPlay: [{ type: Input }], showVideoControls: [{ type: Input }], currentImageIndex: [{ type: Input }], imageIndex: [{ type: Input }], speed: [{ type: Input }], imageUrl: [{ type: Input }], isVideo: [{ type: Input }], alt: [{ type: Input }], title: [{ type: Input }], direction: [{ type: Input }], ratio: [{ type: Input }], lazy: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLWN1c3RvbS1pbWFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1pbWFnZS1zbGlkZXIvc3JjL2xpYi9zbGlkZXItY3VzdG9tLWltYWdlL3NsaWRlci1jdXN0b20taW1hZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctaW1hZ2Utc2xpZGVyL3NyYy9saWIvc2xpZGVyLWN1c3RvbS1pbWFnZS9zbGlkZXItY3VzdG9tLWltYWdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsS0FBSyxFQUdMLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBSTNDLE1BQU0sYUFBYSxHQUFHLHNFQUFzRSxFQUN4RixtQkFBbUIsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUNuRCxvQkFBb0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBTW5DLE1BQU0sT0FBTywwQkFBMEI7SUF3Qm5DLFlBQ1csa0JBQXdDLEVBQ3ZDLFNBQXVCLEVBQ2IsUUFBUTtRQUZuQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCO1FBQ3ZDLGNBQVMsR0FBVCxTQUFTLENBQWM7UUF6Qm5DLFlBQU8sR0FBRyxTQUFTLENBQUM7UUFDcEIsVUFBSyxHQUFHLE9BQU8sQ0FBQztRQUNoQixVQUFLLEdBQUcsT0FBTyxDQUFDO1FBQ2hCLFlBQU8sR0FBb0IsRUFBRSxDQUFDO1FBQzlCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLFNBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xCLGlCQUFZLEdBQVcsSUFBSSxDQUFDO1FBRTVCLFVBQVU7UUFDRCxjQUFTLEdBQVksS0FBSyxD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LFNBQVM7K0JBQ0ksWUFBWTs7MEJBOEJqQixNQUFNOzJCQUFDLFFBQVE7NENBakJYLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgSW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlUmVzb3VyY2VVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IE5nSW1hZ2VTbGlkZXJTZXJ2aWNlIH0gZnJvbSAnLi8uLi9uZy1pbWFnZS1zbGlkZXIuc2VydmljZSc7XG5cbmNvbnN0IHlvdXR1YmVSZWdFeHAgPSAvXi4qKHlvdXR1LmJlXFwvfHZcXC98dVxcL1xcd1xcL3xlbWJlZFxcL3x3YXRjaFxcP3Y9fFxcJnY9fFxcP3Y9KShbXiNcXCZcXD9dKikuKi8sXG4gICAgdmFsaWRGaWxlRXh0ZW5zaW9ucyA9IFsnanBlZycsICdqcGcnLCAnZ2lmJywgJ3BuZyddLFxuICAgIHZhbGlkVmlkZW9FeHRlbnNpb25zID0gWydtcDQnXTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdjdXN0b20taW1nJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2xpZGVyLWN1c3RvbS1pbWFnZS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVyQ3VzdG9tSW1hZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIFlPVVRVQkUgPSAneW91dHViZSc7XG4gICAgSU1BR0UgPSAnaW1hZ2UnO1xuICAgIFZJREVPID0gJ3ZpZGVvJztcbiAgICBmaWxlVXJsOiBTYWZlUmVzb3VyY2VVcmwgPSAnJztcbiAgICBmaWxlRXh0ZW5zaW9uID0gJyc7XG4gICAgdHlwZSA9IHRoaXMuSU1BR0U7XG4gICAgaW1hZ2VMb2FkaW5nOmJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLy8gQGlucHV0c1xuICAgIEBJbnB1dCgpIHNob3dWaWRlbzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHZpZGVvQXV0b1BsYXk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBzaG93VmlkZW9Db250cm9sczogbnVtYmVyID0gMTtcbiAgICBASW5wdXQoKSBjdXJyZW50SW1hZ2VJbmRleDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGltYWdlSW5kZXg6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzcGVlZDogbnVtYmVyID0gMTtcbiAgICBASW5wdXQoKSBpbWFnZVVybDtcbiAgICBASW5wdXQoKSBpc1ZpZGVvID0gZmFsc2U7XG4gICAgQElucHV0KCkgYWx0OiBTdHJpbmcgPSAnJztcbiAgICBASW5wdXQoKSB0aXRsZTogU3RyaW5nID0gJyc7XG4gICAgQElucHV0KCkgZGlyZWN0aW9uOiBzdHJpbmcgPSAnbHRyJztcbiAgICBASW5wdXQoKSByYXRpbzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaW1hZ2VTbGlkZXJTZXJ2aWNlOiBOZ0ltYWdlU2xpZGVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgZG9jdW1lbnQpIHtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlVXJsXG4gICAgICAgICAgICAmJiB0aGlzLmltYWdlVXJsXG4gICAgICAgICAgICAmJiB0aGlzLmltYWdlVXJsXG4gICAgICAgICAgICAmJiB0eXBlb2YgKHRoaXMuaW1hZ2VVcmwpID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgJiYgKFxuICAgICAgICAgICAgICAgIChjaGFuZ2VzLmltYWdlVXJsICYmIGNoYW5nZXMuaW1hZ2VVcmwuZmlyc3RDaGFuZ2UpXG4gICAgICAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICAodGhpcy52aWRlb0F1dG9QbGF5KVxuICAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRVcmwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFVybCgpIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5pbWFnZVVybDtcbiAgICAgICAgdGhpcy5pbWFnZUxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmZpbGVVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodXJsKTtcbiAgICAgICAgdGhpcy5maWxlRXh0ZW5zaW9uID0gdXJsLnNwbGl0KCcuJykucG9wKCkuc3BsaXQoL1xcI3xcXD8vKVswXTtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VTbGlkZXJTZXJ2aWNlLmJhc2U2NEZpbGVFeHRlbnNpb24odXJsKVxuICAgICAgICAmJiAodmFsaWRGaWxlRXh0ZW5zaW9ucy5pbmRleE9mKHRoaXMuaW1hZ2VTbGlkZXJTZXJ2aWNlLmJhc2U2NEZpbGVFeHRlbnNpb24odXJsKS50b0xvd2VyQ2FzZSgpKSA+IC0xIFxuICAgICAgICB8fCB2YWxpZFZpZGVvRXh0ZW5zaW9ucy5pbmRleE9mKHRoaXMuaW1hZ2VTbGlkZXJTZXJ2aWNlLmJhc2U2NEZpbGVFeHRlbnNpb24odXJsKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkge1xuICAgICAgICAgICAgdGhpcy5maWxlRXh0ZW5zaW9uID0gdGhpcy5pbWFnZVNsaWRlclNlcnZpY2UuYmFzZTY0RmlsZUV4dGVuc2lvbih1cmwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHZlcmlmeSBmb3IgeW91dHViZSB1cmxcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goeW91dHViZVJlZ0V4cCk7XG4gICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFsyXS5sZW5ndGggPT09IDExKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaG93VmlkZW8pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLllPVVRVQkU7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGAkeydodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8nfSR7bWF0Y2hbMl19JHt0aGlzLnZpZGVvQXV0b1BsYXkgPyAnP2F1dG9wbGF5PTEmZW5hYmxlanNhcGk9MScgOiAnP2F1dG9wbGF5PTAmZW5hYmxlanNhcGk9MSd9JHsnJmNvbnRyb2xzPSd9JHt0aGlzLnNob3dWaWRlb0NvbnRyb2xzfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLklNQUdFO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChgaHR0cHM6Ly9pbWcueW91dHViZS5jb20vdmkvJHttYXRjaFsyXX0vMC5qcGdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZpbGVFeHRlbnNpb24gJiYgdmFsaWRGaWxlRXh0ZW5zaW9ucy5pbmRleE9mKHRoaXMuZmlsZUV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLklNQUdFO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmlsZUV4dGVuc2lvbiAmJiB2YWxpZFZpZGVvRXh0ZW5zaW9ucy5pbmRleE9mKHRoaXMuZmlsZUV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLlZJREVPO1xuICAgICAgICAgICAgaWYgKHRoaXMudmlkZW9BdXRvUGxheSAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdmlkZW9fJHt0aGlzLmltYWdlSW5kZXh9YCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWRlb09iajphbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdmlkZW9fJHt0aGlzLmltYWdlSW5kZXh9YCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZpZGVvT2JqLnBsYXkoKTtcbiAgICAgICAgICAgICAgICB9LCB0aGlzLnNwZWVkICogMTAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2aWRlb0NsaWNrSGFuZGxlcihldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQuc3JjRWxlbWVudCAmJiAhdGhpcy5zaG93VmlkZW9Db250cm9scykge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNyY0VsZW1lbnQucGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3JjRWxlbWVudC5wbGF5KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnNyY0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJmaWxlVXJsXCIgY2xhc3M9XCJjdXN0b20taW1hZ2UtbWFpblwiIFtuZ0NsYXNzXT1cInsnbmctZnVsbGltYWdlLWxvYWRpbmcnOiBpbWFnZUxvYWRpbmd9XCI+XG4gICAgPGltZyBjbGFzcz1cImltYWdlXCJcbiAgICAgICAgKGxvYWQpPVwiaW1hZ2VMb2FkaW5nID0gZmFsc2VcIlxuICAgICAgICBbbmdDbGFzc109XCJ7J3JhdGlvJzogcmF0aW99XCJcbiAgICAgICAgKm5nSWY9XCJ0eXBlID09PSBJTUFHRSAmJiBmaWxlVXJsXCJcbiAgICAgICAgW3NyY109XCJmaWxlVXJsXCJcbiAgICAgICAgW2FsdF09XCJhbHRcIlxuICAgICAgICBbdGl0bGVdPVwidGl0bGVcIlxuICAgICAgICBbYXR0ci5sb2FkaW5nXT1cImxhenkgPT0gdHJ1ZSA/ICdsYXp5JyA6IG51bGxcIj5cbiAgICA8aWZyYW1lIGNsYXNzPVwieW91dHViZVwiXG4gICAgICAgICpuZ0lmPVwidHlwZSA9PT0gWU9VVFVCRSAmJiBmaWxlVXJsXCJcbiAgICAgICAgW3NyY109XCJmaWxlVXJsXCJcbiAgICAgICAgW2F0dHIubG9hZGluZ109XCJsYXp5ID09IHRydWUgPyAnbGF6eScgOiBudWxsXCJcbiAgICAgICAgZnJhbWVib3JkZXI9XCIwXCJcbiAgICAgICAgYWxsb3c9XCJhdXRvcGxheVwiXG4gICAgICAgIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT5cbiAgICA8dmlkZW8gY2xhc3M9XCJ2aWRlb1wiXG4gICAgICAgIFtpZF09XCIndmlkZW9fJyArIGltYWdlSW5kZXhcIlxuICAgICAgICBbbmdDbGFzc109XCJ7J3JhdGlvJzogcmF0aW99XCJcbiAgICAgICAgKGNsaWNrKT1cInZpZGVvQ2xpY2tIYW5kbGVyKCRldmVudClcIlxuICAgICAgICBbYXV0b3BsYXldPVwidmlkZW9BdXRvUGxheVwiXG4gICAgICAgICpuZ0lmPVwidHlwZSA9PT0gVklERU9cIlxuICAgICAgICB0eXBlPVwidmlkZW8vbXA0XCJcbiAgICAgICAgW2F0dHIuY29udHJvbHNdPVwic2hvd1ZpZGVvQ29udHJvbHMgPyBzaG93VmlkZW9Db250cm9scyA6IG51bGxcIlxuICAgICAgICBjb250cm9sc0xpc3Q9XCJub2Rvd25sb2FkXCI+XG4gICAgICAgIDxzb3VyY2UgW3NyY109XCJmaWxlVXJsXCIgdHlwZT1cInZpZGVvL21wNFwiPlxuICAgICAgICBZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdmlkZW8gdGFnLlxuICAgIDwvdmlkZW8+XG4gICAgPGRpdiBbZGlyXT1cImRpcmVjdGlvblwiICpuZ0lmPVwiIWZpbGVVcmxcIiBjbGFzcz1cImludmFsaWQtbXNnXCI+SW52YWxpZCBmaWxlIGZvcm1hdDwvZGl2PlxuICAgIDxzcGFuICpuZ0lmPVwidHlwZSA9PT0gWU9VVFVCRSB8fCB0eXBlID09PSBWSURFTyB8fCBpc1ZpZGVvXCIgY2xhc3M9XCJ5b3V0dWJlLWljb25cIj48L3NwYW4+XG48L2Rpdj4iXX0=