UNPKG

ng-materialgrammi

Version:

An Angular framework which follows

119 lines 18.5 kB
import { HttpEventType, HttpHeaders } from '@angular/common/http'; import { Component, Input, ViewChild } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; import * as i2 from "../placeholder/placeholder.component"; import * as i3 from "@angular/common"; export class ImageComponent { constructor(renderer, http) { this.renderer = renderer; this.http = http; this.src = ""; this.responsive = true; this.rounded = false; this.circled = false; this.shadowed = false; this.applyFilters = true; this.lazyLoad = true; this.class = ""; this.filters = { blur: false, brightness: false, contrast: false, grayscale: false, invert: false, hue: false, opacity: false, saturate: false, sepia: false }; this.loaded = false; } ngOnInit() { if (this.lazyLoad) { this.loadImage(); } } ngAfterViewInit() { this.filterize(); } loadImage() { this.http.get(this.src, { responseType: "blob", reportProgress: true, observe: "events", headers: new HttpHeaders({ 'Content-Type': 'application/json' }) }).subscribe(event => { if (event.type === HttpEventType.DownloadProgress && event.total) { const percentage = (event.loaded / event.total) * 100; this.imageProgress.nativeElement.value = percentage; } if (event.type === HttpEventType.Response && event.body) { this.loaded = true; this.image.nativeElement.src = window.URL.createObjectURL(event.body); this.filterize(); } }); } filterize() { if (this.applyFilters && !this.loaded) { let filters = this.createFilters(); this.renderer.setStyle(this.image.nativeElement, 'filter', filters); } } imageClasses() { let results = "img"; results += this.responsive ? " img-responsive" : ""; results += this.rounded ? " rounded" : ""; results += !this.rounded && this.circled ? " circled" : ""; results += this.shadowed ? " shadow-2" : ""; results += ` ${this.class}`; return results; } createFilters() { let filter = ""; filter += (this.filters.blur !== undefined && this.filters.blur !== false) ? ` blur(${this.filters.blur}px)` : ""; filter += (this.filters.brightness !== undefined && this.filters.brightness !== false) ? ` brightness(${this.filters.brightness}%)` : ""; filter += (this.filters.contrast !== undefined && this.filters.contrast !== false) ? ` contrast(${this.filters.contrast}%)` : ""; filter += (this.filters.grayscale !== undefined && this.filters.grayscale !== false) ? ` grayscale(${this.filters.grayscale}%)` : ""; filter += (this.filters.invert !== undefined && this.filters.invert !== false) ? ` invert(${this.filters.invert}%)` : ""; filter += (this.filters.hue !== undefined && this.filters.hue !== false) ? ` hue-rotate(${this.filters.hue}deg)` : ""; filter += (this.filters.opacity !== undefined && this.filters.opacity !== false) ? ` opacity(${this.filters.opacity}%)` : ""; filter += (this.filters.saturate !== undefined && this.filters.saturate !== false) ? ` saturate(${this.filters.saturate}%)` : ""; filter += (this.filters.sepia !== undefined && this.filters.sepia !== false) ? ` sepia(${this.filters.sepia}%)` : ""; return filter; } } ImageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ImageComponent, deps: [{ token: i0.Renderer2 }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); ImageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: ImageComponent, selector: "mg-image", inputs: { src: "src", responsive: "responsive", rounded: "rounded", circled: "circled", shadowed: "shadowed", applyFilters: "applyFilters", lazyLoad: "lazyLoad", class: "class", filters: "filters" }, viewQueries: [{ propertyName: "image", first: true, predicate: ["imageEl"], descendants: true }, { propertyName: "imageProgress", first: true, predicate: ["imageProgress"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"lazyLoad\">\n <mg-placeholder type=\"img\" [show]=\"!loaded\">\n <progress #imageProgress value = \"0\" max=\"100\" class=\"image-progress\"></progress>\n </mg-placeholder>\n \n <img #imageEl [ngClass]=\"!loaded ? 'hide' : '' + imageClasses()\"/>\n</ng-container>\n\n<ng-container *ngIf=\"!lazyLoad\">\n <img [src]=\"src\" #imageEl [ngClass]=\"imageClasses()\"/>\n</ng-container>\n\n\n", styles: [".img.rounded{border-radius:5px}.img.circled{border-radius:50%}.image-progress{display:block;width:100%;height:5px}\n"], components: [{ type: i2.PlaceholderComponent, selector: "mg-placeholder", inputs: ["show", "type", "class"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ImageComponent, decorators: [{ type: Component, args: [{ selector: 'mg-image', template: "<ng-container *ngIf=\"lazyLoad\">\n <mg-placeholder type=\"img\" [show]=\"!loaded\">\n <progress #imageProgress value = \"0\" max=\"100\" class=\"image-progress\"></progress>\n </mg-placeholder>\n \n <img #imageEl [ngClass]=\"!loaded ? 'hide' : '' + imageClasses()\"/>\n</ng-container>\n\n<ng-container *ngIf=\"!lazyLoad\">\n <img [src]=\"src\" #imageEl [ngClass]=\"imageClasses()\"/>\n</ng-container>\n\n\n", styles: [".img.rounded{border-radius:5px}.img.circled{border-radius:50%}.image-progress{display:block;width:100%;height:5px}\n"] }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.HttpClient }]; }, propDecorators: { src: [{ type: Input }], responsive: [{ type: Input }], rounded: [{ type: Input }], circled: [{ type: Input }], shadowed: [{ type: Input }], applyFilters: [{ type: Input }], lazyLoad: [{ type: Input }], class: [{ type: Input }], filters: [{ type: Input }], image: [{ type: ViewChild, args: ['imageEl'] }], imageProgress: [{ type: ViewChild, args: ['imageProgress'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWxncmFtbWkvc3JjL2xpYi9jb21wb25lbnRzL2ltYWdlL2ltYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsZ3JhbW1pL3NyYy9saWIvY29tcG9uZW50cy9pbWFnZS9pbWFnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlFLE9BQU8sRUFBaUIsU0FBUyxFQUFjLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQVMxRyxNQUFNLE9BQU8sY0FBYztJQTBCekIsWUFBb0IsUUFBbUIsRUFBVSxJQUFnQjtRQUE3QyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBWTtRQXpCeEQsUUFBRyxHQUFHLEVBQUUsQ0FBQztRQUNULGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsYUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRVgsWUFBTyxHQUFRO1lBQ3RCLElBQUksRUFBRSxLQUFLO1lBQ1gsVUFBVSxFQUFFLEtBQUs7WUFDakIsUUFBUSxFQUFFLEtBQUs7WUFDZixTQUFTLEVBQUUsS0FBSztZQUNoQixNQUFNLEVBQUUsS0FBSztZQUNiLEdBQUcsRUFBRSxLQUFLO1lBQ1YsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsS0FBSztZQUNmLEtBQUssRUFBRSxLQUFLO1NB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LE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekksTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqSSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JJLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekgsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0SCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdILE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakksTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNySCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzsyR0F4RlUsY0FBYzsrRkFBZCxjQUFjLDJiQ1YzQiwrYUFhQTsyRkRIYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLFVBQVU7eUhBS1gsR0FBRztzQkFBWCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQVl3QixLQUFLO3NCQUFsQyxTQUFTO3VCQUFDLFNBQVM7Z0JBQ2dCLGFBQWE7c0JBQWhELFNBQVM7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWctaW1hZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSW1hZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBzcmMgPSBcIlwiO1xuICBASW5wdXQoKSByZXNwb25zaXZlID0gdHJ1ZTtcbiAgQElucHV0KCkgcm91bmRlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBjaXJjbGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNoYWRvd2VkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwcGx5RmlsdGVycyA9IHRydWU7XG4gIEBJbnB1dCgpIGxhenlMb2FkID0gdHJ1ZTtcbiAgQElucHV0KCkgY2xhc3MgPSBcIlwiO1xuXG4gIEBJbnB1dCgpIGZpbHRlcnM6IGFueSA9IHtcbiAgICBibHVyOiBmYWxzZSxcbiAgICBicmlnaHRuZXNzOiBmYWxzZSxcbiAgICBjb250cmFzdDogZmFsc2UsXG4gICAgZ3JheXNjYWxlOiBmYWxzZSxcbiAgICBpbnZlcnQ6IGZhbHNlLFxuICAgIGh1ZTogZmFsc2UsXG4gICAgb3BhY2l0eTogZmFsc2UsXG4gICAgc2F0dXJhdGU6IGZhbHNlLFxuICAgIHNlcGlhOiBmYWxzZVxuICB9XG5cbiAgQFZpZXdDaGlsZCgnaW1hZ2VFbCcpIHByaXZhdGUgaW1hZ2UhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdpbWFnZVByb2dyZXNzJykgcHJpdmF0ZSBpbWFnZVByb2dyZXNzITogRWxlbWVudFJlZjtcblxuICBsb2FkZWQgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmKHRoaXMubGF6eUxvYWQpIHtcbiAgICAgIHRoaXMubG9hZEltYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuZmlsdGVyaXplKCk7XG4gIH1cblxuICBsb2FkSW1hZ2UoKXtcbiAgICB0aGlzLmh0dHAuZ2V0KHRoaXMuc3JjLCB7XG4gICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHRydWUsXG4gICAgICBvYnNlcnZlOiBcImV2ZW50c1wiLFxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgfSlcbiAgICB9KS5zdWJzY3JpYmUoZXZlbnQ9PntcbiAgICAgIGlmKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuRG93bmxvYWRQcm9ncmVzcyAmJiBldmVudC50b3RhbCkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKGV2ZW50LmxvYWRlZC9ldmVudC50b3RhbCkgKiAxMDA7XG4gICAgICAgIHRoaXMuaW1hZ2VQcm9ncmVzcy5uYXRpdmVFbGVtZW50LnZhbHVlID0gcGVyY2VudGFnZTtcbiAgICAgIH1cbiAgICAgIGlmKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2UgJiYgZXZlbnQuYm9keSl7XG4gICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbWFnZS5uYXRpdmVFbGVtZW50LnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGV2ZW50LmJvZHkpO1xuICAgICAgICB0aGlzLmZpbHRlcml6ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZmlsdGVyaXplKCl7XG4gICAgaWYodGhpcy5hcHBseUZpbHRlcnMgJiYgIXRoaXMubG9hZGVkKSB7XG4gICAgICBsZXQgZmlsdGVycyA9IHRoaXMuY3JlYXRlRmlsdGVycygpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmltYWdlLm5hdGl2ZUVsZW1lbnQsICdmaWx0ZXInLCBmaWx0ZXJzKTtcbiAgICB9XG4gIH1cblxuICBpbWFnZUNsYXNzZXMoKSB7XG4gICAgbGV0IHJlc3VsdHMgPSBcImltZ1wiO1xuICAgIHJlc3VsdHMgKz0gdGhpcy5yZXNwb25zaXZlID8gXCIgaW1nLXJlc3BvbnNpdmVcIiA6IFwiXCI7XG4gICAgcmVzdWx0cyArPSB0aGlzLnJvdW5kZWQgPyBcIiByb3VuZGVkXCIgOiBcIlwiO1xuICAgIHJlc3VsdHMgKz0gIXRoaXMucm91bmRlZCAmJiB0aGlzLmNpcmNsZWQgPyBcIiBjaXJjbGVkXCIgOiBcIlwiO1xuICAgIHJlc3VsdHMgKz0gdGhpcy5zaGFkb3dlZCA/IFwiIHNoYWRvdy0yXCIgOiBcIlwiO1xuICAgIHJlc3VsdHMgKz0gYCAke3RoaXMuY2xhc3N9YDtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIGNyZWF0ZUZpbHRlcnMoKSB7XG4gICAgbGV0IGZpbHRlciA9IFwiXCI7XG4gICAgZmlsdGVyICs9ICh0aGlzLmZpbHRlcnMuYmx1ciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmlsdGVycy5ibHVyICE9PSBmYWxzZSkgPyBgIGJsdXIoJHt0aGlzLmZpbHRlcnMuYmx1cn1weClgIDogXCJcIjtcbiAgICBmaWx0ZXIgKz0gKHRoaXMuZmlsdGVycy5icmlnaHRuZXNzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5maWx0ZXJzLmJyaWdodG5lc3MgIT09IGZhbHNlKSA/IGAgYnJpZ2h0bmVzcygke3RoaXMuZmlsdGVycy5icmlnaHRuZXNzfSUpYCA6IFwiXCI7XG4gICAgZmlsdGVyICs9ICh0aGlzLmZpbHRlcnMuY29udHJhc3QgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZpbHRlcnMuY29udHJhc3QgIT09IGZhbHNlKSA/IGAgY29udHJhc3QoJHt0aGlzLmZpbHRlcnMuY29udHJhc3R9JSlgIDogXCJcIjtcbiAgICBmaWx0ZXIgKz0gKHRoaXMuZmlsdGVycy5ncmF5c2NhbGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZpbHRlcnMuZ3JheXNjYWxlICE9PSBmYWxzZSkgPyBgIGdyYXlzY2FsZSgke3RoaXMuZmlsdGVycy5ncmF5c2NhbGV9JSlgIDogXCJcIjtcbiAgICBmaWx0ZXIgKz0gKHRoaXMuZmlsdGVycy5pbnZlcnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZpbHRlcnMuaW52ZXJ0ICE9PSBmYWxzZSkgPyBgIGludmVydCgke3RoaXMuZmlsdGVycy5pbnZlcnR9JSlgIDogXCJcIjtcbiAgICBmaWx0ZXIgKz0gKHRoaXMuZmlsdGVycy5odWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZpbHRlcnMuaHVlICE9PSBmYWxzZSkgPyBgIGh1ZS1yb3RhdGUoJHt0aGlzLmZpbHRlcnMuaHVlfWRlZylgIDogXCJcIjtcbiAgICBmaWx0ZXIgKz0gKHRoaXMuZmlsdGVycy5vcGFjaXR5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5maWx0ZXJzLm9wYWNpdHkgIT09IGZhbHNlKSA/IGAgb3BhY2l0eSgke3RoaXMuZmlsdGVycy5vcGFjaXR5fSUpYCA6IFwiXCI7XG4gICAgZmlsdGVyICs9ICh0aGlzLmZpbHRlcnMuc2F0dXJhdGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZpbHRlcnMuc2F0dXJhdGUgIT09IGZhbHNlKSA/IGAgc2F0dXJhdGUoJHt0aGlzLmZpbHRlcnMuc2F0dXJhdGV9JSlgIDogXCJcIjtcbiAgICBmaWx0ZXIgKz0gKHRoaXMuZmlsdGVycy5zZXBpYSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmlsdGVycy5zZXBpYSAhPT0gZmFsc2UpID8gYCBzZXBpYSgke3RoaXMuZmlsdGVycy5zZXBpYX0lKWAgOiBcIlwiO1xuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuXG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwibGF6eUxvYWRcIj5cbiAgICA8bWctcGxhY2Vob2xkZXIgdHlwZT1cImltZ1wiIFtzaG93XT1cIiFsb2FkZWRcIj5cbiAgICAgICAgPHByb2dyZXNzICNpbWFnZVByb2dyZXNzIHZhbHVlID0gXCIwXCIgbWF4PVwiMTAwXCIgY2xhc3M9XCJpbWFnZS1wcm9ncmVzc1wiPjwvcHJvZ3Jlc3M+XG4gICAgPC9tZy1wbGFjZWhvbGRlcj5cbiAgICBcbiAgICA8aW1nICNpbWFnZUVsIFtuZ0NsYXNzXT1cIiFsb2FkZWQgPyAnaGlkZScgOiAnJyArIGltYWdlQ2xhc3NlcygpXCIvPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhbGF6eUxvYWRcIj5cbiAgICA8aW1nIFtzcmNdPVwic3JjXCIgI2ltYWdlRWwgW25nQ2xhc3NdPVwiaW1hZ2VDbGFzc2VzKClcIi8+XG48L25nLWNvbnRhaW5lcj5cblxuXG4iXX0=