truly-ui
Version:
Web Components for Desktop Applications.
99 lines (97 loc) • 23 kB
JavaScript
/*
MIT License
Copyright (c) 2018 Temainfo Software
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/platform-browser";
import * as i2 from "@angular/common";
import * as i3 from "../icons/icons";
export class TlLightbox {
onClick() {
this.close.emit();
}
constructor(changes, sanitizer) {
this.changes = changes;
this.sanitizer = sanitizer;
this.isOpen = true;
this.files = [];
this.close = new EventEmitter();
this.zoomIn = false;
this.transform = null;
}
ngOnInit() { }
init(images, current) {
this.files = images;
this.file = !current ? images[0] : current;
this.changes.detectChanges();
}
zoomInOut() {
this.zoomIn = !this.zoomIn;
if (!this.zoomIn) {
this.transform = `translate(0, 0) scale(1)`;
}
else {
this.transform = 'scale(2)';
}
}
previous($event) {
this.stopEvent($event);
if (this.hasImagesOnRight()) {
this.file = this.files.find((item) => ((this.file.index - 1) === item.index));
}
}
next($event) {
this.stopEvent($event);
if (this.hasImagesOnLeft()) {
this.file = this.files.find((item) => ((this.file.index + 1) === item.index));
}
}
mouseMove($event) {
const target = { x: window.innerWidth / 2, y: window.innerHeight / 2 };
if (this.zoomIn) {
this.transform = `translate(${-($event.x - target.x)}px, ${-($event.y - target.y)}px) scale(${this.zoomIn ? '2' : '1'})`;
}
}
hasImagesOnLeft() {
return this.file.index < this.files.length - 1;
}
hasImagesOnRight() {
return this.file.index > 0;
}
selectImage($event, item) {
this.stopEvent($event);
this.file = item;
}
stopEvent($event) {
$event.stopPropagation();
}
bypassFile(file) {
return this.sanitizer.bypassSecurityTrustResourceUrl(file);
}
}
/** @nocollapse */ TlLightbox.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlLightbox, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TlLightbox.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlLightbox, selector: "tl-lightbox", host: { listeners: { "click": "onClick()" } }, ngImport: i0, template: "<div class=\"light-box-container\"\n (click)=\"stopEvent($event)\"\n [ngClass]=\"zoomIn ? 'zoomIn': 'zoomOut'\">\n <img class=\"image\"\n *ngIf=\"file.type === 'image/png' || file.type === 'image/jpeg' || file.type === 'image/bmp' || file.type === 'image/jpg' || file.type === 'image'\"\n [ngStyle]=\"{ 'transform': transform, 'cursor': zoomIn ? 'zoom-out' : 'zoom-in' }\"\n [src]=\"bypassFile(file?.file)\" (click)=\"zoomInOut()\" (mousemove)=\"mouseMove($event)\">\n <iframe *ngIf=\"file.type === 'application/pdf'\" class=\"thumbnail-image\" style=\"border: none;\" width=\"100%\" height=\"800px\"\n [src]=bypassFile(file?.file)> </iframe>\n <div class=\"close-button\" (click)=\"close.emit()\">\n <tl-icon [lib]=\"'ion'\" [style]=\"'ios'\">close-circle</tl-icon>\n </div>\n</div>\n\n\n<div class=\"image-info\">\n <h3 *ngIf=\"file?.title\">{{ file?.title }}</h3>\n <p>{{ file?.description}}</p>\n</div>\n<div class=\"light-box-controls\">\n <tl-icon class=\"arrow left\" *ngIf=\"files.length > 1 && hasImagesOnRight()\" (click)=\"previous($event)\" [lib]=\"'ion'\"\n [style]=\"'ios'\">arrow-dropleft-circle\n </tl-icon>\n <tl-icon class=\"arrow right\" *ngIf=\"files.length > 1 && hasImagesOnLeft()\" (click)=\"next($event)\" [lib]=\"'ion'\"\n [style]=\"'ios'\">arrow-dropright-circle\n </tl-icon>\n</div>\n<div class=\"footer-images\" (click)=\"stopEvent($event)\">\n <ng-container *ngFor=\"let item of files\">\n <ng-container *ngIf=\"item.type === 'image/png' || item.type === 'image/jpeg' || item.type === 'image/bmp' || item.type === 'image/jpg' || item.type === 'image'\">\n <img class=\"thumbnail\" [class.selected]=\"item?.index === file?.index\"\n (click)=\"selectImage($event, item)\" [src]=\"item?.file\">\n </ng-container>\n <ng-container *ngIf=\"item.type === 'application/pdf'\" >\n <div class=\"thumbnail\" [class.selected]=\"item?.index === file?.index\" (click)=\"selectImage($event, item)\">\n <tl-icon style=\"margin-right: 5px\" [lib]=\"'fa'\" [style]=\"'fas'\" [color]=\"'#ec7e7e'\" [size]=\"'40px'\">file-pdf</tl-icon>\n </div>\n </ng-container>\n </ng-container>\n</div>\n", styles: [":host{width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-flow:column}.light-box-container{position:relative;background:rgba(0,0,0,0);z-index:1000;display:flex;align-items:center;justify-content:center;flex-flow:column;width:70vw;height:70vh;overflow:hidden;transition:transform .25s ease}.light-box-container>.image{height:100%;-webkit-user-select:none;user-select:none}.light-box-container>.close-button{position:fixed;right:20px;font-size:50px;cursor:pointer;color:#989898;top:20px}.light-box-container.zoomIn{transform:scale(2)}.light-box-container.zoomOut{transform:scale(1)}.light-box-controls{font-size:3em;z-index:1000}.light-box-controls .arrow{position:fixed;cursor:pointer;top:calc(50vh - 64px);color:#989898}.light-box-controls .arrow.left{left:7%}.light-box-controls .arrow.right{right:7%}.image-info{margin:20px 0;color:#fff;font-size:16px;text-align:center}.footer-images{position:absolute;bottom:0;height:100px;background:rgba(0,0,0,.6901960784);width:100%;display:flex;align-items:center;justify-content:center}.footer-images .thumbnail{width:80px;height:80px;margin:0 5px;border:1px solid #5d5b5b;display:flex;justify-content:center;align-items:center}.footer-images .thumbnail.selected{border:1px solid white!important}.footer-images .thumbnail:hover{cursor:pointer;opacity:.8}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.TlIcons, selector: "tl-icon", inputs: ["icon", "lib", "style", "size", "animation", "color", "align"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlLightbox, decorators: [{
type: Component,
args: [{ selector: 'tl-lightbox', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"light-box-container\"\n (click)=\"stopEvent($event)\"\n [ngClass]=\"zoomIn ? 'zoomIn': 'zoomOut'\">\n <img class=\"image\"\n *ngIf=\"file.type === 'image/png' || file.type === 'image/jpeg' || file.type === 'image/bmp' || file.type === 'image/jpg' || file.type === 'image'\"\n [ngStyle]=\"{ 'transform': transform, 'cursor': zoomIn ? 'zoom-out' : 'zoom-in' }\"\n [src]=\"bypassFile(file?.file)\" (click)=\"zoomInOut()\" (mousemove)=\"mouseMove($event)\">\n <iframe *ngIf=\"file.type === 'application/pdf'\" class=\"thumbnail-image\" style=\"border: none;\" width=\"100%\" height=\"800px\"\n [src]=bypassFile(file?.file)> </iframe>\n <div class=\"close-button\" (click)=\"close.emit()\">\n <tl-icon [lib]=\"'ion'\" [style]=\"'ios'\">close-circle</tl-icon>\n </div>\n</div>\n\n\n<div class=\"image-info\">\n <h3 *ngIf=\"file?.title\">{{ file?.title }}</h3>\n <p>{{ file?.description}}</p>\n</div>\n<div class=\"light-box-controls\">\n <tl-icon class=\"arrow left\" *ngIf=\"files.length > 1 && hasImagesOnRight()\" (click)=\"previous($event)\" [lib]=\"'ion'\"\n [style]=\"'ios'\">arrow-dropleft-circle\n </tl-icon>\n <tl-icon class=\"arrow right\" *ngIf=\"files.length > 1 && hasImagesOnLeft()\" (click)=\"next($event)\" [lib]=\"'ion'\"\n [style]=\"'ios'\">arrow-dropright-circle\n </tl-icon>\n</div>\n<div class=\"footer-images\" (click)=\"stopEvent($event)\">\n <ng-container *ngFor=\"let item of files\">\n <ng-container *ngIf=\"item.type === 'image/png' || item.type === 'image/jpeg' || item.type === 'image/bmp' || item.type === 'image/jpg' || item.type === 'image'\">\n <img class=\"thumbnail\" [class.selected]=\"item?.index === file?.index\"\n (click)=\"selectImage($event, item)\" [src]=\"item?.file\">\n </ng-container>\n <ng-container *ngIf=\"item.type === 'application/pdf'\" >\n <div class=\"thumbnail\" [class.selected]=\"item?.index === file?.index\" (click)=\"selectImage($event, item)\">\n <tl-icon style=\"margin-right: 5px\" [lib]=\"'fa'\" [style]=\"'fas'\" [color]=\"'#ec7e7e'\" [size]=\"'40px'\">file-pdf</tl-icon>\n </div>\n </ng-container>\n </ng-container>\n</div>\n", styles: [":host{width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-flow:column}.light-box-container{position:relative;background:rgba(0,0,0,0);z-index:1000;display:flex;align-items:center;justify-content:center;flex-flow:column;width:70vw;height:70vh;overflow:hidden;transition:transform .25s ease}.light-box-container>.image{height:100%;-webkit-user-select:none;user-select:none}.light-box-container>.close-button{position:fixed;right:20px;font-size:50px;cursor:pointer;color:#989898;top:20px}.light-box-container.zoomIn{transform:scale(2)}.light-box-container.zoomOut{transform:scale(1)}.light-box-controls{font-size:3em;z-index:1000}.light-box-controls .arrow{position:fixed;cursor:pointer;top:calc(50vh - 64px);color:#989898}.light-box-controls .arrow.left{left:7%}.light-box-controls .arrow.right{right:7%}.image-info{margin:20px 0;color:#fff;font-size:16px;text-align:center}.footer-images{position:absolute;bottom:0;height:100px;background:rgba(0,0,0,.6901960784);width:100%;display:flex;align-items:center;justify-content:center}.footer-images .thumbnail{width:80px;height:80px;margin:0 5px;border:1px solid #5d5b5b;display:flex;justify-content:center;align-items:center}.footer-images .thumbnail.selected{border:1px solid white!important}.footer-images .thumbnail:hover{cursor:pointer;opacity:.8}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DomSanitizer }]; }, propDecorators: { onClick: [{
type: HostListener,
args: ['click']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90cnVseS11aS9zcmMvY29tcG9uZW50cy9saWdodGJveC9saWdodGJveC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2xpZ2h0Ym94L2xpZ2h0Ym94Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBb0JFO0FBRUYsT0FBTyxFQUFDLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBUyxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFVeEgsTUFBTSxPQUFPLFVBQVU7SUFlckIsT0FBTztRQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFlBQXFCLE9BQTBCLEVBQVUsU0FBdUI7UUFBM0QsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFjO1FBakJ6RSxXQUFNLEdBQUcsSUFBSSxDQUFDO1FBRWQsVUFBSyxHQUE2QixFQUFFLENBQUM7UUFJckMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFM0IsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUVmLGNBQVMsR0FBRyxJQUFJLENBQUM7SUFPNEQsQ0FBQztJQUVyRixRQUFRLEtBQUksQ0FBQztJQUViLElBQUksQ0FBRSxNQUFnQyxFQUFFLE9BQU87UUFDN0MsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFHO1lBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsMEJBQTBCLENBQUM7U0FDN0M7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFNO1FBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QixJQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFHO1lBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUUsQ0FBRSxJQUFJLEVBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNsRjtJQUNILENBQUM7SUFFRCxJQUFJLENBQUUsTUFBTTtRQUNWLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsSUFBSyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUc7WUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBRSxDQUFFLElBQUksRUFBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ2xGO0lBQ0gsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFNO1FBQ2QsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkUsSUFBSyxJQUFJLENBQUMsTUFBTSxFQUFHO1lBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQVEsQ0FBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFjLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7U0FDOUg7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsV0FBVyxDQUFFLE1BQU0sRUFBRSxJQUFJO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELFNBQVMsQ0FBRSxNQUFNO1FBQ2YsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxVQUFVLENBQUUsSUFBSTtRQUNkLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBRSxJQUFJLENBQUUsQ0FBQztJQUMvRCxDQUFDOzsySEE5RVUsVUFBVTsrR0FBVixVQUFVLGtHQ2hDdkIseXFFQXdDQTs0RkRSYSxVQUFVO2tCQU50QixTQUFTOytCQUNFLGFBQWEsbUJBR04sdUJBQXVCLENBQUMsTUFBTTttSUFpQi9DLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgICBNSVQgTGljZW5zZVxuXG4gICAgQ29weXJpZ2h0IChjKSAyMDE4IFRlbWFpbmZvIFNvZnR3YXJlXG5cbiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gICAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICAgIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAgICB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gICAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAgICBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAgICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gICAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICAgIFNPRlRXQVJFLlxuKi9cblxuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0ltYWdlTGlnaHRib3hJbnRlcmZhY2V9IGZyb20gJy4vaW50ZXJmYWNlcy9pbWFnZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtEb21TYW5pdGl6ZXJ9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0bC1saWdodGJveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9saWdodGJveC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGlnaHRib3guc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUbExpZ2h0Ym94IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBwdWJsaWMgaXNPcGVuID0gdHJ1ZTtcblxuICBwdWJsaWMgZmlsZXM6IEltYWdlTGlnaHRib3hJbnRlcmZhY2VbXSA9IFtdO1xuXG4gIHB1YmxpYyBmaWxlOiBJbWFnZUxpZ2h0Ym94SW50ZXJmYWNlO1xuXG4gIHB1YmxpYyBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgem9vbUluID0gZmFsc2U7XG5cbiAgcHVibGljIHRyYW5zZm9ybSA9IG51bGw7XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBvbkNsaWNrKCkge1xuICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoIHByaXZhdGUgY2hhbmdlczogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIgKSB7fVxuXG4gIG5nT25Jbml0KCkge31cblxuICBpbml0KCBpbWFnZXM6IEltYWdlTGlnaHRib3hJbnRlcmZhY2VbXSwgY3VycmVudCApIHtcbiAgICB0aGlzLmZpbGVzID0gaW1hZ2VzO1xuICAgIHRoaXMuZmlsZSA9ICFjdXJyZW50ID8gaW1hZ2VzWzBdIDogY3VycmVudDtcbiAgICB0aGlzLmNoYW5nZXMuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgem9vbUluT3V0KCkge1xuICAgIHRoaXMuem9vbUluID0gIXRoaXMuem9vbUluO1xuICAgIGlmICggIXRoaXMuem9vbUluICkge1xuICAgICAgdGhpcy50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKDAsIDApIHNjYWxlKDEpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFuc2Zvcm0gPSAnc2NhbGUoMiknO1xuICAgIH1cbiAgfVxuXG4gIHByZXZpb3VzKCRldmVudCkge1xuICAgIHRoaXMuc3RvcEV2ZW50KCRldmVudCk7XG4gICAgaWYgKCB0aGlzLmhhc0ltYWdlc09uUmlnaHQoKSApIHtcbiAgICAgIHRoaXMuZmlsZSA9IHRoaXMuZmlsZXMuZmluZCggKCBpdGVtICkgPT4gKCh0aGlzLmZpbGUuaW5kZXggLSAxKSA9PT0gaXRlbS5pbmRleCkpO1xuICAgIH1cbiAgfVxuXG4gIG5leHQoICRldmVudCApIHtcbiAgICB0aGlzLnN0b3BFdmVudCgkZXZlbnQpO1xuICAgIGlmICggdGhpcy5oYXNJbWFnZXNPbkxlZnQoKSApIHtcbiAgICAgIHRoaXMuZmlsZSA9IHRoaXMuZmlsZXMuZmluZCggKCBpdGVtICkgPT4gKCh0aGlzLmZpbGUuaW5kZXggKyAxKSA9PT0gaXRlbS5pbmRleCkpO1xuICAgIH1cbiAgfVxuXG4gIG1vdXNlTW92ZSgkZXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB7IHg6IHdpbmRvdy5pbm5lcldpZHRoIC8gMiwgeTogd2luZG93LmlubmVySGVpZ2h0IC8gMiB9O1xuICAgIGlmICggdGhpcy56b29tSW4gKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHsgLSgkZXZlbnQueCAtIHRhcmdldC54KX1weCwgJHsgLSAoJGV2ZW50LnkgLSB0YXJnZXQueSl9cHgpIHNjYWxlKCR7IHRoaXMuem9vbUluID8gJzInIDogJzEnfSlgO1xuICAgIH1cbiAgfVxuXG4gIGhhc0ltYWdlc09uTGVmdCgpIHtcbiAgICByZXR1cm4gdGhpcy5maWxlLmluZGV4IDwgdGhpcy5maWxlcy5sZW5ndGggLSAxO1xuICB9XG5cbiAgaGFzSW1hZ2VzT25SaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5maWxlLmluZGV4ID4gMDtcbiAgfVxuXG4gIHNlbGVjdEltYWdlKCAkZXZlbnQsIGl0ZW0gKSB7XG4gICAgdGhpcy5zdG9wRXZlbnQoJGV2ZW50KTtcbiAgICB0aGlzLmZpbGUgPSBpdGVtO1xuICB9XG5cbiAgc3RvcEV2ZW50KCAkZXZlbnQgKSB7XG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgYnlwYXNzRmlsZSggZmlsZSApIHtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCBmaWxlICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsaWdodC1ib3gtY29udGFpbmVyXCJcbiAgICAgKGNsaWNrKT1cInN0b3BFdmVudCgkZXZlbnQpXCJcbiAgICAgW25nQ2xhc3NdPVwiem9vbUluID8gJ3pvb21Jbic6ICd6b29tT3V0J1wiPlxuICA8aW1nIGNsYXNzPVwiaW1hZ2VcIlxuICAgICAgICpuZ0lmPVwiZmlsZS50eXBlID09PSAnaW1hZ2UvcG5nJyB8fCBmaWxlLnR5cGUgPT09ICdpbWFnZS9qcGVnJyB8fCBmaWxlLnR5cGUgPT09ICdpbWFnZS9ibXAnIHx8IGZpbGUudHlwZSA9PT0gJ2ltYWdlL2pwZycgfHwgZmlsZS50eXBlID09PSAnaW1hZ2UnXCJcbiAgICAgICBbbmdTdHlsZV09XCJ7ICd0cmFuc2Zvcm0nOiB0cmFuc2Zvcm0sICdjdXJzb3InOiB6b29tSW4gPyAnem9vbS1vdXQnIDogJ3pvb20taW4nIH1cIlxuICAgICAgIFtzcmNdPVwiYnlwYXNzRmlsZShmaWxlPy5maWxlKVwiIChjbGljayk9XCJ6b29tSW5PdXQoKVwiIChtb3VzZW1vdmUpPVwibW91c2VNb3ZlKCRldmVudClcIj5cbiAgPGlmcmFtZSAqbmdJZj1cImZpbGUudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZidcIiBjbGFzcz1cInRodW1ibmFpbC1pbWFnZVwiIHN0eWxlPVwiYm9yZGVyOiBub25lO1wiICB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCI4MDBweFwiXG4gICAgICAgICAgW3NyY109YnlwYXNzRmlsZShmaWxlPy5maWxlKT4gPC9pZnJhbWU+XG4gIDxkaXYgY2xhc3M9XCJjbG9zZS1idXR0b25cIiAoY2xpY2spPVwiY2xvc2UuZW1pdCgpXCI+XG4gICAgPHRsLWljb24gW2xpYl09XCInaW9uJ1wiIFtzdHlsZV09XCInaW9zJ1wiPmNsb3NlLWNpcmNsZTwvdGwtaWNvbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuXG48ZGl2IGNsYXNzPVwiaW1hZ2UtaW5mb1wiPlxuICA8aDMgKm5nSWY9XCJmaWxlPy50aXRsZVwiPnt7IGZpbGU/LnRpdGxlIH19PC9oMz5cbiAgPHA+e3sgZmlsZT8uZGVzY3JpcHRpb259fTwvcD5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImxpZ2h0LWJveC1jb250cm9sc1wiPlxuICA8dGwtaWNvbiBjbGFzcz1cImFycm93IGxlZnRcIiAqbmdJZj1cImZpbGVzLmxlbmd0aCA+IDEgJiYgaGFzSW1hZ2VzT25SaWdodCgpXCIgKGNsaWNrKT1cInByZXZpb3VzKCRldmVudClcIiBbbGliXT1cIidpb24nXCJcbiAgICAgICAgICAgW3N0eWxlXT1cIidpb3MnXCI+YXJyb3ctZHJvcGxlZnQtY2lyY2xlXG4gIDwvdGwtaWNvbj5cbiAgPHRsLWljb24gY2xhc3M9XCJhcnJvdyByaWdodFwiICpuZ0lmPVwiZmlsZXMubGVuZ3RoID4gMSAmJiBoYXNJbWFnZXNPbkxlZnQoKVwiIChjbGljayk9XCJuZXh0KCRldmVudClcIiBbbGliXT1cIidpb24nXCJcbiAgICAgICAgICAgW3N0eWxlXT1cIidpb3MnXCI+YXJyb3ctZHJvcHJpZ2h0LWNpcmNsZVxuICA8L3RsLWljb24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmb290ZXItaW1hZ2VzXCIgKGNsaWNrKT1cInN0b3BFdmVudCgkZXZlbnQpXCI+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsZXNcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50eXBlID09PSAnaW1hZ2UvcG5nJyB8fCBpdGVtLnR5cGUgPT09ICdpbWFnZS9qcGVnJyB8fCBpdGVtLnR5cGUgPT09ICdpbWFnZS9ibXAnIHx8IGl0ZW0udHlwZSA9PT0gJ2ltYWdlL2pwZycgfHwgaXRlbS50eXBlID09PSAnaW1hZ2UnXCI+XG4gICAgICA8aW1nIGNsYXNzPVwidGh1bWJuYWlsXCIgW2NsYXNzLnNlbGVjdGVkXT1cIml0ZW0/LmluZGV4ID09PSBmaWxlPy5pbmRleFwiXG4gICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJbWFnZSgkZXZlbnQsIGl0ZW0pXCIgW3NyY109XCJpdGVtPy5maWxlXCI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZidcIiA+XG4gICAgICA8ZGl2IGNsYXNzPVwidGh1bWJuYWlsXCIgW2NsYXNzLnNlbGVjdGVkXT1cIml0ZW0/LmluZGV4ID09PSBmaWxlPy5pbmRleFwiIChjbGljayk9XCJzZWxlY3RJbWFnZSgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgIDx0bC1pY29uICBzdHlsZT1cIm1hcmdpbi1yaWdodDogNXB4XCIgW2xpYl09XCInZmEnXCIgW3N0eWxlXT1cIidmYXMnXCIgW2NvbG9yXT1cIicjZWM3ZTdlJ1wiIFtzaXplXT1cIic0MHB4J1wiPmZpbGUtcGRmPC90bC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=