UNPKG

ionic-image-loader-v7

Version:
240 lines 25.5 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "./services/image-loader.service"; import * as i2 from "./services/image-loader-config.service"; import * as i3 from "@ionic/angular"; import * as i4 from "@angular/common"; const propMap = { display: 'display', height: 'height', width: 'width', backgroundSize: 'background-size', backgroundRepeat: 'background-repeat', }; export class IonicImageLoaderComponent { constructor(_element, renderer, imageLoader, config) { this._element = _element; this.renderer = renderer; this.imageLoader = imageLoader; this.config = config; /** * Fallback URL to load when the image url fails to load or does not exist. */ this.fallbackUrl = this.config.fallbackUrl; /** * Whether to show a spinner while the image loads */ this.spinner = this.config.spinnerEnabled; /** * Whether to show the fallback image instead of a spinner while the image loads */ this.fallbackAsPlaceholder = this.config.fallbackAsPlaceholder; /** * Attributes to pass through to img tag if _useImg == true */ this.imgAttributes = []; /** * Enable/Disable caching */ this.cache = true; /** * Width of the image. This will be ignored if using useImg. */ this.width = this.config.width; /** * Height of the image. This will be ignored if using useImg. */ this.height = this.config.height; /** * Display type of the image. This will be ignored if using useImg. */ this.display = this.config.display; /** * Background size. This will be ignored if using useImg. */ this.backgroundSize = this.config.backgroundSize; /** * Background repeat. This will be ignored if using useImg. */ this.backgroundRepeat = this.config.backgroundRepeat; /** * Name of the spinner */ this.spinnerName = this.config.spinnerName; /** * Color of the spinner */ this.spinnerColor = this.config.spinnerColor; /** * Notify on image load.. */ this.load = new EventEmitter(); /** * Indicates if the image is still loading */ this.isLoading = true; this._useImg = this.config.useImg; } /** * Use <img> tag */ set useImg(val) { this._useImg = val !== false; } /** * Convenience attribute to disable caching */ set noCache(val) { this.cache = val !== false; } get src() { return this._src; } /** * The URL of the image to load. */ set src(imageUrl) { this._src = this.processImageUrl(imageUrl); this.updateImage(this._src); } ngOnInit() { if (this.fallbackAsPlaceholder && this.fallbackUrl) { this.setImage(this.fallbackUrl, false); } if (!this.src) { // image url was not passed // this can happen when [src] is set to a variable that turned out to be undefined // one example could be a list of users with their profile pictures // in this case, it would be useful to use the fallback image instead // if fallbackUrl was used as placeholder we do not need to set it again if (!this.fallbackAsPlaceholder && this.fallbackUrl) { // we're not going to cache the fallback image since it should be locally saved this.setImage(this.fallbackUrl); } else { this.isLoading = false; } } } updateImage(imageUrl) { this.imageLoader .getImagePath(imageUrl) .then((url) => this.setImage(url)) .catch((error) => this.setImage(this.fallbackUrl || imageUrl)); } /** * Gets the image URL to be loaded and disables caching if necessary */ processImageUrl(imageUrl) { if (this.cache === false) { // need to disable caching if (imageUrl.indexOf('?') < 0) { // add ? if doesn't exists imageUrl += '?'; } else { imageUrl += '&'; } // append timestamp at the end to make URL unique imageUrl += 'cache_buster=' + Date.now(); } return imageUrl; } /** * Set the image to be displayed * @param imageUrl image src * @param stopLoading set to true to mark the image as loaded */ setImage(imageUrl, stopLoading = true) { this.isLoading = !stopLoading; if (this._useImg) { // Using <img> tag if (!this.element) { // create img element if we dont have one this.element = this.renderer.createElement('img'); this.renderer.appendChild(this._element.nativeElement, this.element); } // set it's src this.renderer.setAttribute(this.element, 'src', imageUrl); // if imgAttributes are defined, add them to our img element this.imgAttributes.forEach((attribute) => { this.renderer.setAttribute(this.element, attribute.element, attribute.value); }); if (this.fallbackUrl && !this.imageLoader.nativeAvailable) { this.renderer.listen(this.element, 'error', () => this.renderer.setAttribute(this.element, 'src', this.fallbackUrl)); } } else { // Not using <img> tag this.element = this._element.nativeElement; for (const prop in propMap) { if (this[prop]) { this.renderer.setStyle(this.element, propMap[prop], this[prop]); } } this.renderer.setStyle(this.element, 'background-image', `url("${imageUrl || this.fallbackUrl}")`); } if (stopLoading) { this.load.emit(this); } } } IonicImageLoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: IonicImageLoaderComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.ImageLoaderService }, { token: i2.ImageLoaderConfigService }], target: i0.ɵɵFactoryTarget.Component }); IonicImageLoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: IonicImageLoaderComponent, selector: "img-loader", inputs: { fallbackUrl: "fallbackUrl", spinner: "spinner", fallbackAsPlaceholder: "fallbackAsPlaceholder", imgAttributes: "imgAttributes", cache: "cache", width: "width", height: "height", display: "display", backgroundSize: "backgroundSize", backgroundRepeat: "backgroundRepeat", spinnerName: "spinnerName", spinnerColor: "spinnerColor", useImg: "useImg", noCache: "noCache", src: "src" }, outputs: { load: "load" }, ngImport: i0, template: ` <ion-spinner *ngIf="spinner && isLoading && !fallbackAsPlaceholder" [name]="spinnerName" [color]="spinnerColor" ></ion-spinner> <ng-content></ng-content> `, isInline: true, styles: ["ion-spinner{float:none;margin-left:auto;margin-right:auto;display:block}\n"], components: [{ type: i3.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: IonicImageLoaderComponent, decorators: [{ type: Component, args: [{ selector: 'img-loader', template: ` <ion-spinner *ngIf="spinner && isLoading && !fallbackAsPlaceholder" [name]="spinnerName" [color]="spinnerColor" ></ion-spinner> <ng-content></ng-content> `, styles: [ 'ion-spinner { float: none; margin-left: auto; margin-right: auto; display: block; }', ], }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.ImageLoaderService }, { type: i2.ImageLoaderConfigService }]; }, propDecorators: { fallbackUrl: [{ type: Input }], spinner: [{ type: Input }], fallbackAsPlaceholder: [{ type: Input }], imgAttributes: [{ type: Input }], cache: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], display: [{ type: Input }], backgroundSize: [{ type: Input }], backgroundRepeat: [{ type: Input }], spinnerName: [{ type: Input }], spinnerColor: [{ type: Input }], load: [{ type: Output }], useImg: [{ type: Input }], noCache: [{ type: Input }], src: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9uaWMtaW1hZ2UtbG9hZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lvbmljLWltYWdlLWxvYWRlci12Ny9zcmMvbGliL2lvbmljLWltYWdlLWxvYWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBSXRHLE1BQU0sT0FBTyxHQUFRO0lBQ25CLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLEtBQUssRUFBRSxPQUFPO0lBQ2QsY0FBYyxFQUFFLGlCQUFpQjtJQUNqQyxnQkFBZ0IsRUFBRSxtQkFBbUI7Q0FDdEMsQ0FBQztBQXFCRixNQUFNLE9BQU8seUJBQXlCO0lBNkRwQyxZQUNZLFFBQW9CLEVBQ3BCLFFBQW1CLEVBQ25CLFdBQStCLEVBQy9CLE1BQWdDO1FBSGhDLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDL0IsV0FBTSxHQUFOLE1BQU0sQ0FBMEI7UUFoRTVDOztXQUVHO1FBQ00sZ0JBQVcsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUN2RDs7V0FFRztRQUNNLFlBQU8sR0FBWSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztRQUN2RDs7V0FFRztRQUVNLDBCQUFxQixHQUFZLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUM7UUFDNUU7O1dBRUc7UUFDTSxrQkFBYSxHQUFxQixFQUFFLENBQUM7UUFDOUM7O1dBRUc7UUFDTSxVQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3RCOztXQUVHO1FBQ00sVUFBSyxHQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFD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QWYsS0FBSztnQkFJRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFJRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS04sSUFBSTtzQkFESCxNQUFNO2dCQXNCSCxNQUFNO3NCQURULEtBQUs7Z0JBU0YsT0FBTztzQkFEVixLQUFLO2dCQWVGLEdBQUc7c0JBRE4sS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJbWFnZUxvYWRlckNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2ltYWdlLWxvYWRlci1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IEltYWdlTG9hZGVyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvaW1hZ2UtbG9hZGVyLnNlcnZpY2UnO1xyXG5cclxuY29uc3QgcHJvcE1hcDogYW55ID0ge1xyXG4gIGRpc3BsYXk6ICdkaXNwbGF5JyxcclxuICBoZWlnaHQ6ICdoZWlnaHQnLFxyXG4gIHdpZHRoOiAnd2lkdGgnLFxyXG4gIGJhY2tncm91bmRTaXplOiAnYmFja2dyb3VuZC1zaXplJyxcclxuICBiYWNrZ3JvdW5kUmVwZWF0OiAnYmFja2dyb3VuZC1yZXBlYXQnLFxyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUF0dHJpYnV0ZSB7XHJcbiAgZWxlbWVudDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaW1nLWxvYWRlcicsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxpb24tc3Bpbm5lclxyXG4gICAgICAgICpuZ0lmPVwic3Bpbm5lciAmJiBpc0xvYWRpbmcgJiYgIWZhbGxiYWNrQXNQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgW25hbWVdPVwic3Bpbm5lck5hbWVcIlxyXG4gICAgICAgIFtjb2xvcl09XCJzcGlubmVyQ29sb3JcIlxyXG4gICAgPjwvaW9uLXNwaW5uZXI+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtcclxuICAgICdpb24tc3Bpbm5lciB7IGZsb2F0OiBub25lOyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyBkaXNwbGF5OiBibG9jazsgfScsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIElvbmljSW1hZ2VMb2FkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIC8qKlxyXG4gICAqIEZhbGxiYWNrIFVSTCB0byBsb2FkIHdoZW4gdGhlIGltYWdlIHVybCBmYWlscyB0byBsb2FkIG9yIGRvZXMgbm90IGV4aXN0LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGZhbGxiYWNrVXJsOiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5mYWxsYmFja1VybDtcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgYSBzcGlubmVyIHdoaWxlIHRoZSBpbWFnZSBsb2Fkc1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNwaW5uZXI6IGJvb2xlYW4gPSB0aGlzLmNvbmZpZy5zcGlubmVyRW5hYmxlZDtcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIGZhbGxiYWNrIGltYWdlIGluc3RlYWQgb2YgYSBzcGlubmVyIHdoaWxlIHRoZSBpbWFnZSBsb2Fkc1xyXG4gICAqL1xyXG5cclxuICBASW5wdXQoKSBmYWxsYmFja0FzUGxhY2Vob2xkZXI6IGJvb2xlYW4gPSB0aGlzLmNvbmZpZy5mYWxsYmFja0FzUGxhY2Vob2xkZXI7XHJcbiAgLyoqXHJcbiAgICogQXR0cmlidXRlcyB0byBwYXNzIHRocm91Z2ggdG8gaW1nIHRhZyBpZiBfdXNlSW1nID09IHRydWVcclxuICAgKi9cclxuICBASW5wdXQoKSBpbWdBdHRyaWJ1dGVzOiBJbWFnZUF0dHJpYnV0ZVtdID0gW107XHJcbiAgLyoqXHJcbiAgICogRW5hYmxlL0Rpc2FibGUgY2FjaGluZ1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNhY2hlID0gdHJ1ZTtcclxuICAvKipcclxuICAgKiBXaWR0aCBvZiB0aGUgaW1hZ2UuIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIHVzaW5nIHVzZUltZy5cclxuICAgKi9cclxuICBASW5wdXQoKSB3aWR0aDogc3RyaW5nID0gdGhpcy5jb25maWcud2lkdGg7XHJcbiAgLyoqXHJcbiAgICogSGVpZ2h0IG9mIHRoZSBpbWFnZS4gVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgdXNpbmcgdXNlSW1nLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGhlaWdodDogc3RyaW5nID0gdGhpcy5jb25maWcuaGVpZ2h0O1xyXG4gIC8qKlxyXG4gICAqIERpc3BsYXkgdHlwZSBvZiB0aGUgaW1hZ2UuIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIHVzaW5nIHVzZUltZy5cclxuICAgKi9cclxuICBASW5wdXQoKSBkaXNwbGF5OiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5kaXNwbGF5O1xyXG4gIC8qKlxyXG4gICAqIEJhY2tncm91bmQgc2l6ZS4gVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgdXNpbmcgdXNlSW1nLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGJhY2tncm91bmRTaXplOiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5iYWNrZ3JvdW5kU2l6ZTtcclxuICAvKipcclxuICAgKiBCYWNrZ3JvdW5kIHJlcGVhdC4gVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgdXNpbmcgdXNlSW1nLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGJhY2tncm91bmRSZXBlYXQ6IHN0cmluZyA9IHRoaXMuY29uZmlnLmJhY2tncm91bmRSZXBlYXQ7XHJcbiAgLyoqXHJcbiAgICogTmFtZSBvZiB0aGUgc3Bpbm5lclxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNwaW5uZXJOYW1lOiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5zcGlubmVyTmFtZTtcclxuICAvKipcclxuICAgKiBDb2xvciBvZiB0aGUgc3Bpbm5lclxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNwaW5uZXJDb2xvcjogc3RyaW5nID0gdGhpcy5jb25maWcuc3Bpbm5lckNvbG9yO1xyXG4gIC8qKlxyXG4gICAqIE5vdGlmeSBvbiBpbWFnZSBsb2FkLi5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBsb2FkOiBFdmVudEVtaXR0ZXI8SW9uaWNJbWFnZUxvYWRlckNvbXBvbmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPElvbmljSW1hZ2VMb2FkZXJDb21wb25lbnQ+KCk7XHJcbiAgLyoqXHJcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBpbWFnZSBpcyBzdGlsbCBsb2FkaW5nXHJcbiAgICovXHJcbiAgaXNMb2FkaW5nID0gdHJ1ZTtcclxuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXHJcbiAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgcHJpdmF0ZSBpbWFnZUxvYWRlcjogSW1hZ2VMb2FkZXJTZXJ2aWNlLFxyXG4gICAgICBwcml2YXRlIGNvbmZpZzogSW1hZ2VMb2FkZXJDb25maWdTZXJ2aWNlLFxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXNlSW1nOiBib29sZWFuID0gdGhpcy5jb25maWcudXNlSW1nO1xyXG5cclxuICAvKipcclxuICAgKiBVc2UgPGltZz4gdGFnXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgdXNlSW1nKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdXNlSW1nID0gdmFsICE9PSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlbmllbmNlIGF0dHJpYnV0ZSB0byBkaXNhYmxlIGNhY2hpbmdcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBub0NhY2hlKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5jYWNoZSA9IHZhbCAhPT0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zcmM6IHN0cmluZztcclxuXHJcbiAgZ2V0IHNyYygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NyYztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBVUkwgb2YgdGhlIGltYWdlIHRvIGxvYWQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc3JjKGltYWdlVXJsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3NyYyA9IHRoaXMucHJvY2Vzc0ltYWdlVXJsKGltYWdlVXJsKTtcclxuICAgIHRoaXMudXBkYXRlSW1hZ2UodGhpcy5fc3JjKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmFsbGJhY2tBc1BsYWNlaG9sZGVyICYmIHRoaXMuZmFsbGJhY2tVcmwpIHtcclxuICAgICAgdGhpcy5zZXRJbWFnZSh0aGlzLmZhbGxiYWNrVXJsLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnNyYykge1xyXG4gICAgICAvLyBpbWFnZSB1cmwgd2FzIG5vdCBwYXNzZWRcclxuICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gW3NyY10gaXMgc2V0IHRvIGEgdmFyaWFibGUgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIHVuZGVmaW5lZFxyXG4gICAgICAvLyBvbmUgZXhhbXBsZSBjb3VsZCBiZSBhIGxpc3Qgb2YgdXNlcnMgd2l0aCB0aGVpciBwcm9maWxlIHBpY3R1cmVzXHJcbiAgICAgIC8vIGluIHRoaXMgY2FzZSwgaXQgd291bGQgYmUgdXNlZnVsIHRvIHVzZSB0aGUgZmFsbGJhY2sgaW1hZ2UgaW5zdGVhZFxyXG4gICAgICAvLyBpZiBmYWxsYmFja1VybCB3YXMgdXNlZCBhcyBwbGFjZWhvbGRlciB3ZSBkbyBub3QgbmVlZCB0byBzZXQgaXQgYWdhaW5cclxuICAgICAgaWYgKCF0aGlzLmZhbGxiYWNrQXNQbGFjZWhvbGRlciAmJiB0aGlzLmZhbGxiYWNrVXJsKSB7XHJcbiAgICAgICAgLy8gd2UncmUgbm90IGdvaW5nIHRvIGNhY2hlIHRoZSBmYWxsYmFjayBpbWFnZSBzaW5jZSBpdCBzaG91bGQgYmUgbG9jYWxseSBzYXZlZFxyXG4gICAgICAgIHRoaXMuc2V0SW1hZ2UodGhpcy5mYWxsYmFja1VybCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVJbWFnZShpbWFnZVVybDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmltYWdlTG9hZGVyXHJcbiAgICAgICAgLmdldEltYWdlUGF0aChpbWFnZVVybClcclxuICAgICAgICAudGhlbigodXJsOiBzdHJpbmcpID0+IHRoaXMuc2V0SW1hZ2UodXJsKSlcclxuICAgICAgICAuY2F0Y2goKGVycm9yOiBhbnkpID0+IHRoaXMuc2V0SW1hZ2UodGhpcy5mYWxsYmFja1VybCB8fCBpbWFnZVVybCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgaW1hZ2UgVVJMIHRvIGJlIGxvYWRlZCBhbmQgZGlzYWJsZXMgY2FjaGluZyBpZiBuZWNlc3NhcnlcclxuICAgKi9cclxuICBwcml2YXRlIHByb2Nlc3NJbWFnZVVybChpbWFnZVVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmNhY2hlID09PSBmYWxzZSkge1xyXG4gICAgICAvLyBuZWVkIHRvIGRpc2FibGUgY2FjaGluZ1xyXG5cclxuICAgICAgaWYgKGltYWdlVXJsLmluZGV4T2YoJz8nKSA8IDApIHtcclxuICAgICAgICAvLyBhZGQgPyBpZiBkb2Vzbid0IGV4aXN0c1xyXG4gICAgICAgIGltYWdlVXJsICs9ICc/JztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbWFnZVVybCArPSAnJic7XHJcbiAgICAgIH1cclxuICAgICAgLy8gYXBwZW5kIHRpbWVzdGFtcCBhdCB0aGUgZW5kIHRvIG1ha2UgVVJMIHVuaXF1ZVxyXG4gICAgICBpbWFnZVVybCArPSAnY2FjaGVfYnVzdGVyPScgKyBEYXRlLm5vdygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbWFnZVVybDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgaW1hZ2UgdG8gYmUgZGlzcGxheWVkXHJcbiAgICogQHBhcmFtIGltYWdlVXJsIGltYWdlIHNyY1xyXG4gICAqIEBwYXJhbSBzdG9wTG9hZGluZyBzZXQgdG8gdHJ1ZSB0byBtYXJrIHRoZSBpbWFnZSBhcyBsb2FkZWRcclxuICAgKi9cclxuICBwcml2YXRlIHNldEltYWdlKGltYWdlVXJsOiBzdHJpbmcsIHN0b3BMb2FkaW5nOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSAhc3RvcExvYWRpbmc7XHJcblxyXG4gICAgaWYgKHRoaXMuX3VzZUltZykge1xyXG4gICAgICAvLyBVc2luZyA8aW1nPiB0YWdcclxuICAgICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcclxuICAgICAgICAvLyBjcmVhdGUgaW1nIGVsZW1lbnQgaWYgd2UgZG9udCBoYXZlIG9uZVxyXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCBpdCdzIHNyY1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsZW1lbnQsICdzcmMnLCBpbWFnZVVybCk7XHJcblxyXG4gICAgICAvLyBpZiBpbWdBdHRyaWJ1dGVzIGFyZSBkZWZpbmVkLCBhZGQgdGhlbSB0byBvdXIgaW1nIGVsZW1lbnRcclxuICAgICAgdGhpcy5pbWdBdHRyaWJ1dGVzLmZvckVhY2goKGF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgYXR0cmlidXRlLmVsZW1lbnQsIGF0dHJpYnV0ZS52YWx1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodGhpcy5mYWxsYmFja1VybCAmJiAhdGhpcy5pbWFnZUxvYWRlci5uYXRpdmVBdmFpbGFibGUpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQsICdlcnJvcicsICgpID0+XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgJ3NyYycsIHRoaXMuZmFsbGJhY2tVcmwpLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE5vdCB1c2luZyA8aW1nPiB0YWdcclxuXHJcbiAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwcm9wTWFwKSB7XHJcbiAgICAgICAgaWYgKHRoaXNbcHJvcF0pIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50LCBwcm9wTWFwW3Byb3BdLCB0aGlzW3Byb3BdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgIHRoaXMuZWxlbWVudCxcclxuICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJyxcclxuICAgICAgICAgIGB1cmwoXCIke2ltYWdlVXJsIHx8IHRoaXMuZmFsbGJhY2tVcmx9XCIpYCxcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChzdG9wTG9hZGluZykge1xyXG4gICAgICB0aGlzLmxvYWQuZW1pdCh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19