UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

119 lines (117 loc) 19 kB
/* MIT License Copyright (c) 2019 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 { Component, EventEmitter, HostBinding, Input, Output, ViewChild } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "../i18n/i18n.service"; import * as i2 from "@angular/common"; import * as i3 from "../icons/icons"; export class TlButton { set textLoading(text) { this._textLoading = text; } get disabledButton() { return this.disabled; } get textLoading() { return this._textLoading || this.i18nService.getLocale().Button.loadingText; } set modalContext(modal) { this._modalContext = modal; } get modalContext() { return this._modalContext; } constructor(button, i18nService) { this.button = button; this.i18nService = i18nService; this.text = ''; this.iconAddonBefore = ''; this.iconAddonAfter = ''; this.iconBeforeText = ''; this.iconAfterText = ''; this.height = '30px'; this.width = 'auto'; this.disabled = false; this.flatBorder = false; this.colorIconBefore = ''; this.colorIconAfter = ''; this.outline = false; this.color = 'basic'; this.loaderColor = '#ccc'; this.isLoading = false; this.indexShortcut = 0; this.selected = new EventEmitter(); } ngOnInit() { } setFocus() { this.buttonElement.nativeElement.focus(); } } /** @nocollapse */ TlButton.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlButton, deps: [{ token: i0.ElementRef }, { token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlButton.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlButton, selector: "tl-button", inputs: { text: "text", iconAddonBefore: "iconAddonBefore", iconAddonAfter: "iconAddonAfter", iconBeforeText: "iconBeforeText", iconAfterText: "iconAfterText", height: "height", width: "width", disabled: "disabled", flatBorder: "flatBorder", colorIconBefore: "colorIconBefore", colorIconAfter: "colorIconAfter", template: "template", outline: "outline", color: "color", loaderColor: "loaderColor", isLoading: "isLoading", indexShortcut: "indexShortcut", textLoading: "textLoading" }, outputs: { selected: "selected" }, host: { properties: { "attr.disabled": "this.disabledButton" } }, viewQueries: [{ propertyName: "buttonElement", first: true, predicate: ["tlbutton"], descendants: true, static: true }], ngImport: i0, template: "<button #tlbutton\n attr.tabindex=\"-1\"\n cdkTrapFocus\n [ngStyle]=\"{'min-width': width, 'height': height, 'border-radius': flatBorder ? '0' : '3px', 'line-height': height }\"\n [ngClass]=\"{'disabled ': disabled, 'outline': outline}\"\n [class]=\"'tl-button ripple '+ color\"\n [disabled]=\"( disabled || isLoading ) ? true : null\">\n <ng-container *ngTemplateOutlet=\"template ? template : templateContent\"></ng-container>\n</button>\n<ng-template #templateContent>\n <tl-icon *ngIf=\"iconAddonBefore\"\n [class]=\"color + ' iconAddonBefore'\"\n [ngStyle]=\"{'line-height' : 'calc(' + height + ' - 1px)'}\"\n [style.color]=\"colorIconBefore\">{{ iconAddonBefore }}\n </tl-icon>\n <div class=\"button-content\" [style.lineHeight]=\"height\">\n <tl-icon *ngIf=\"iconBeforeText\">{{ iconBeforeText }}</tl-icon>\n <span class=\"label\" *ngIf=\"!isLoading\">{{ text }}</span>\n <span class=\"label\" *ngIf=\"isLoading\">{{ textLoading }}</span>\n <tl-icon [lib]=\"'fa'\" [animation]=\"'spin'\" [color]=\"loaderColor\" *ngIf=\"isLoading\">spinner</tl-icon>\n <tl-icon *ngIf=\"iconAfterText\">{{ iconAfterText }}</tl-icon>\n </div>\n <tl-icon *ngIf=\"iconAddonAfter\"\n [class]=\"color + ' iconAddonAfter'\"\n [ngStyle]=\"{'line-height': 'calc(' + height + ' - 1px)'}\"\n [style.color]=\"colorIconAfter\">{{ iconAddonAfter }}\n </tl-icon>\n</ng-template>\n\n", styles: [":host([disabled=true]){pointer-events:none}.tl-button{font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:1em;padding:0;margin:0;outline:none;display:flex;cursor:pointer;box-sizing:border-box}.tl-button>.iconAddonBefore{box-sizing:border-box;padding:0 15px;pointer-events:none}.tl-button>.iconAddonAfter{box-sizing:border-box;padding:0 15px;pointer-events:none}.tl-button>.button-content{display:flex;align-items:center;margin:0 8px;justify-content:center;-webkit-user-select:none;user-select:none;width:100%}.tl-button>.button-content .label{padding:0 10px}.tl-button>.button-content tl-loader{position:relative;width:15px;box-sizing:border-box;margin:0 5px}.tl-button.disabled{pointer-events:none}.iconAfterText{padding:0 0 0 5px!important}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlButton, decorators: [{ type: Component, args: [{ selector: 'tl-button', template: "<button #tlbutton\n attr.tabindex=\"-1\"\n cdkTrapFocus\n [ngStyle]=\"{'min-width': width, 'height': height, 'border-radius': flatBorder ? '0' : '3px', 'line-height': height }\"\n [ngClass]=\"{'disabled ': disabled, 'outline': outline}\"\n [class]=\"'tl-button ripple '+ color\"\n [disabled]=\"( disabled || isLoading ) ? true : null\">\n <ng-container *ngTemplateOutlet=\"template ? template : templateContent\"></ng-container>\n</button>\n<ng-template #templateContent>\n <tl-icon *ngIf=\"iconAddonBefore\"\n [class]=\"color + ' iconAddonBefore'\"\n [ngStyle]=\"{'line-height' : 'calc(' + height + ' - 1px)'}\"\n [style.color]=\"colorIconBefore\">{{ iconAddonBefore }}\n </tl-icon>\n <div class=\"button-content\" [style.lineHeight]=\"height\">\n <tl-icon *ngIf=\"iconBeforeText\">{{ iconBeforeText }}</tl-icon>\n <span class=\"label\" *ngIf=\"!isLoading\">{{ text }}</span>\n <span class=\"label\" *ngIf=\"isLoading\">{{ textLoading }}</span>\n <tl-icon [lib]=\"'fa'\" [animation]=\"'spin'\" [color]=\"loaderColor\" *ngIf=\"isLoading\">spinner</tl-icon>\n <tl-icon *ngIf=\"iconAfterText\">{{ iconAfterText }}</tl-icon>\n </div>\n <tl-icon *ngIf=\"iconAddonAfter\"\n [class]=\"color + ' iconAddonAfter'\"\n [ngStyle]=\"{'line-height': 'calc(' + height + ' - 1px)'}\"\n [style.color]=\"colorIconAfter\">{{ iconAddonAfter }}\n </tl-icon>\n</ng-template>\n\n", styles: [":host([disabled=true]){pointer-events:none}.tl-button{font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:1em;padding:0;margin:0;outline:none;display:flex;cursor:pointer;box-sizing:border-box}.tl-button>.iconAddonBefore{box-sizing:border-box;padding:0 15px;pointer-events:none}.tl-button>.iconAddonAfter{box-sizing:border-box;padding:0 15px;pointer-events:none}.tl-button>.button-content{display:flex;align-items:center;margin:0 8px;justify-content:center;-webkit-user-select:none;user-select:none;width:100%}.tl-button>.button-content .label{padding:0 10px}.tl-button>.button-content tl-loader{position:relative;width:15px;box-sizing:border-box;margin:0 5px}.tl-button.disabled{pointer-events:none}.iconAfterText{padding:0 0 0 5px!important}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.I18nService }]; }, propDecorators: { text: [{ type: Input }], iconAddonBefore: [{ type: Input }], iconAddonAfter: [{ type: Input }], iconBeforeText: [{ type: Input }], iconAfterText: [{ type: Input }], height: [{ type: Input }], width: [{ type: Input }], disabled: [{ type: Input }], flatBorder: [{ type: Input }], colorIconBefore: [{ type: Input }], colorIconAfter: [{ type: Input }], template: [{ type: Input }], outline: [{ type: Input }], color: [{ type: Input }], loaderColor: [{ type: Input }], isLoading: [{ type: Input }], indexShortcut: [{ type: Input }], textLoading: [{ type: Input }], disabledButton: [{ type: HostBinding, args: ['attr.disabled'] }], selected: [{ type: Output }], buttonElement: [{ type: ViewChild, args: ['tlbutton', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvYnV0dG9uL2J1dHRvbi50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2J1dHRvbi9idXR0b24uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFBRSxXQUFXLEVBQ3pCLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDOzs7OztBQVF2QixNQUFNLE9BQU8sUUFBUTtJQW9DakIsSUFBYSxXQUFXLENBQUUsSUFBSTtRQUM1QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFDVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUM5RSxDQUFDO0lBRUQsSUFBSSxZQUFZLENBQUUsS0FBSztRQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFVRCxZQUFvQixNQUFrQixFQUFVLFdBQXdCO1FBQXBELFdBQU0sR0FBTixNQUFNLENBQVk7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQS9EL0QsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUVWLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBRXJCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBRXBCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBRXBCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRW5CLFdBQU0sR0FBRyxNQUFNLENBQUM7UUFFaEIsVUFBSyxHQUFHLE1BQU0sQ0FBQztRQUVmLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUVyQixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUlwQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWhCLFVBQUssR0FBRyxPQUFPLENBQUM7UUFFaEIsZ0JBQVcsR0FBRyxNQUFNLENBQUM7UUFFckIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixrQkFBYSxHQUFHLENBQUMsQ0FBQztRQXVCakIsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO0lBUVksQ0FBQztJQUU3RSxRQUFRLEtBQUksQ0FBQztJQUViLFFBQVE7UUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQyxDQUFDOzt5SEF2RVEsUUFBUTs2R0FBUixRQUFRLG12QkNyQ3JCLDI4Q0E2QkE7NEZEUWEsUUFBUTtrQkFMcEIsU0FBUzsrQkFDSSxXQUFXOzJIQU1aLElBQUk7c0JBQVosS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRU8sV0FBVztzQkFBdkIsS0FBSztnQkFLSyxjQUFjO3NCQUR4QixXQUFXO3VCQUFDLGVBQWU7Z0JBaUJsQixRQUFRO3NCQUFqQixNQUFNO2dCQUVtQyxhQUFhO3NCQUF0RCxTQUFTO3VCQUFFLFVBQVUsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIE1JVCBMaWNlbnNlXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTkgVGVtYWluZm8gU29mdHdhcmVcblxuIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LCBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi9pMThuL2kxOG4uc2VydmljZSc7XG5cbkBDb21wb25lbnQoIHtcbiAgICBzZWxlY3RvcjogJ3RsLWJ1dHRvbicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2J1dHRvbi5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsgJy4vYnV0dG9uLnNjc3MnIF1cbn0gKVxuZXhwb3J0IGNsYXNzIFRsQnV0dG9uIGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIEBJbnB1dCgpIHRleHQgPSAnJztcblxuICAgIEBJbnB1dCgpIGljb25BZGRvbkJlZm9yZSA9ICcnO1xuXG4gICAgQElucHV0KCkgaWNvbkFkZG9uQWZ0ZXIgPSAnJztcblxuICAgIEBJbnB1dCgpIGljb25CZWZvcmVUZXh0ID0gJyc7XG5cbiAgICBASW5wdXQoKSBpY29uQWZ0ZXJUZXh0ID0gJyc7XG5cbiAgICBASW5wdXQoKSBoZWlnaHQgPSAnMzBweCc7XG5cbiAgICBASW5wdXQoKSB3aWR0aCA9ICdhdXRvJztcblxuICAgIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBmbGF0Qm9yZGVyID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBjb2xvckljb25CZWZvcmUgPSAnJztcblxuICAgIEBJbnB1dCgpIGNvbG9ySWNvbkFmdGVyID0gJyc7XG5cbiAgICBASW5wdXQoKSB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBJbnB1dCgpIG91dGxpbmUgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpIGNvbG9yID0gJ2Jhc2ljJztcblxuICAgIEBJbnB1dCgpIGxvYWRlckNvbG9yID0gJyNjY2MnO1xuXG4gICAgQElucHV0KCkgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBpbmRleFNob3J0Y3V0ID0gMDtcblxuICAgIEBJbnB1dCgpIHNldCB0ZXh0TG9hZGluZyggdGV4dCApIHtcbiAgICAgIHRoaXMuX3RleHRMb2FkaW5nID0gdGV4dDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGlzYWJsZWQnKVxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWRCdXR0b24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBnZXQgdGV4dExvYWRpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdGV4dExvYWRpbmcgfHwgdGhpcy5pMThuU2VydmljZS5nZXRMb2NhbGUoKS5CdXR0b24ubG9hZGluZ1RleHQ7XG4gICAgfVxuXG4gICAgc2V0IG1vZGFsQ29udGV4dCggbW9kYWwgKSB7XG4gICAgICB0aGlzLl9tb2RhbENvbnRleHQgPSBtb2RhbDtcbiAgICB9XG5cbiAgICBnZXQgbW9kYWxDb250ZXh0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21vZGFsQ29udGV4dDtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBAVmlld0NoaWxkKCAndGxidXR0b24nLCB7c3RhdGljOiB0cnVlfSAgKSBidXR0b25FbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gICAgcHJpdmF0ZSBfdGV4dExvYWRpbmc6IHN0cmluZztcblxuICAgIHByaXZhdGUgX21vZGFsQ29udGV4dDtcblxuICAgIGNvbnN0cnVjdG9yKCBwdWJsaWMgYnV0dG9uOiBFbGVtZW50UmVmLCBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSApIHt9XG5cbiAgICBuZ09uSW5pdCgpIHt9XG5cbiAgICBzZXRGb2N1cygpIHtcbiAgICAgIHRoaXMuYnV0dG9uRWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxufVxuXG4iLCI8YnV0dG9uICN0bGJ1dHRvblxuICAgICAgICBhdHRyLnRhYmluZGV4PVwiLTFcIlxuICAgICAgICBjZGtUcmFwRm9jdXNcbiAgICAgICAgW25nU3R5bGVdPVwieydtaW4td2lkdGgnOiB3aWR0aCwgJ2hlaWdodCc6IGhlaWdodCwgJ2JvcmRlci1yYWRpdXMnOiBmbGF0Qm9yZGVyID8gJzAnIDogJzNweCcsICdsaW5lLWhlaWdodCc6IGhlaWdodCB9XCJcbiAgICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZCAnOiBkaXNhYmxlZCwgJ291dGxpbmUnOiBvdXRsaW5lfVwiXG4gICAgICAgIFtjbGFzc109XCIndGwtYnV0dG9uIHJpcHBsZSAnKyBjb2xvclwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIoIGRpc2FibGVkIHx8IGlzTG9hZGluZyApID8gdHJ1ZSA6IG51bGxcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlID8gdGVtcGxhdGUgOiB0ZW1wbGF0ZUNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbjwvYnV0dG9uPlxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUNvbnRlbnQ+XG4gIDx0bC1pY29uICpuZ0lmPVwiaWNvbkFkZG9uQmVmb3JlXCJcbiAgICAgICAgICAgW2NsYXNzXT1cImNvbG9yICsgJyBpY29uQWRkb25CZWZvcmUnXCJcbiAgICAgICAgICAgW25nU3R5bGVdPVwieydsaW5lLWhlaWdodCcgOiAnY2FsYygnICsgaGVpZ2h0ICsgJyAtIDFweCknfVwiXG4gICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJjb2xvckljb25CZWZvcmVcIj57eyBpY29uQWRkb25CZWZvcmUgfX1cbiAgPC90bC1pY29uPlxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRlbnRcIiBbc3R5bGUubGluZUhlaWdodF09XCJoZWlnaHRcIj5cbiAgICA8dGwtaWNvbiAqbmdJZj1cImljb25CZWZvcmVUZXh0XCI+e3sgaWNvbkJlZm9yZVRleHQgfX08L3RsLWljb24+XG4gICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiICpuZ0lmPVwiIWlzTG9hZGluZ1wiPnt7IHRleHQgfX08L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+e3sgdGV4dExvYWRpbmcgfX08L3NwYW4+XG4gICAgPHRsLWljb24gW2xpYl09XCInZmEnXCIgW2FuaW1hdGlvbl09XCInc3BpbidcIiBbY29sb3JdPVwibG9hZGVyQ29sb3JcIiAqbmdJZj1cImlzTG9hZGluZ1wiPnNwaW5uZXI8L3RsLWljb24+XG4gICAgPHRsLWljb24gKm5nSWY9XCJpY29uQWZ0ZXJUZXh0XCI+e3sgaWNvbkFmdGVyVGV4dCB9fTwvdGwtaWNvbj5cbiAgPC9kaXY+XG4gIDx0bC1pY29uICpuZ0lmPVwiaWNvbkFkZG9uQWZ0ZXJcIlxuICAgICAgICAgICBbY2xhc3NdPVwiY29sb3IgKyAnIGljb25BZGRvbkFmdGVyJ1wiXG4gICAgICAgICAgIFtuZ1N0eWxlXT1cInsnbGluZS1oZWlnaHQnOiAnY2FsYygnICsgaGVpZ2h0ICsgJyAtIDFweCknfVwiXG4gICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJjb2xvckljb25BZnRlclwiPnt7IGljb25BZGRvbkFmdGVyIH19XG4gIDwvdGwtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==