UNPKG

@netgrif/components

Version:

Netgrif Application Engine frontend Angular components

45 lines 24.5 kB
import { Component, Inject, Optional } from '@angular/core'; import { AbstractButtonDefaultFieldComponent, DATA_FIELD_PORTAL_DATA } from '@netgrif/components-core'; import * as i0 from "@angular/core"; import * as i1 from "@ngx-translate/core"; import * as i2 from "@netgrif/components-core"; import * as i3 from "@angular/common"; import * as i4 from "@ngbracket/ngx-layout/extended"; import * as i5 from "@angular/material/button"; import * as i6 from "@angular/material/icon"; import * as i7 from "@angular/material/form-field"; import * as i8 from "@angular/material/progress-spinner"; import * as i9 from "@angular/material/tooltip"; import * as i10 from "../../required-label/required-label.component"; export class ButtonDefaultFieldComponent extends AbstractButtonDefaultFieldComponent { align; stretch; subComp; constructor(_translate, _dialogService, dataFieldPortalData) { super(_translate, _dialogService, dataFieldPortalData); } ngOnInit() { this.checkProperties(); this.subComp = this.dataField.componentChange$().subscribe(() => this.checkProperties()); } checkProperties() { this.align = this.dataField.component?.properties?.align; this.stretch = this.dataField.component?.properties?.stretch === 'true'; } ngOnDestroy() { super.ngOnDestroy(); this.subComp.unsubscribe(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ButtonDefaultFieldComponent, deps: [{ token: i1.TranslateService }, { token: i2.DialogService }, { token: DATA_FIELD_PORTAL_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ButtonDefaultFieldComponent, selector: "nc-button-default-field", usesInheritance: true, ngImport: i0, template: "<div [ngClass]=\"{'flex-end': align === 'end',\n 'flex-start': align === 'start',\n 'flex-center': align === 'center',\n 'full-button-width': stretch,\n 'padding-bottom': !hasTitle(),\n 'padding-bottom-9px': !dataField.isInvalid(formControlRef) && hasTitle()}\">\n <mat-label class=\"netgrif-label\" [ngClass]=\"{'netgrif-label-disabled': formControlRef.disabled}\"\n *ngIf=\"!showLargeLayout.value && hasTitle()\">\n {{dataField.title}}\n <nc-required-label *ngIf=\"dataField.behavior.required\" [isIn]=\"!dataField.disabled\"></nc-required-label>\n <br>\n </mat-label>\n <button mat-button *ngIf=\"dataField.getComponentType() === undefined || dataField.getComponentType() === 'default' \"\n [ngClass]=\"{'full-button-width': stretch}\"\n color=\"primary\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <button mat-raised-button *ngIf=\"dataField.getComponentType() === 'raised'\"\n [ngClass]=\"{'full-button-width': stretch }\"\n color=\"primary\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <button mat-stroked-button *ngIf=\"dataField.getComponentType() === 'stroked'\"\n [ngClass]=\"{'full-button-width': stretch }\"\n color=\"primary\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <button mat-flat-button *ngIf=\"dataField.getComponentType() === 'flat'\"\n [ngClass]=\"{'full-button-width': stretch }\"\n color=\"primary\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <button mat-icon-button *ngIf=\"dataField.getComponentType() === 'icon'\"\n [ngClass]=\"{'full-button-width': stretch }\"\n color=\"primary\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <button mat-fab *ngIf=\"dataField.getComponentType() === 'fab'\"\n [ngClass]=\"{'full-button-width': stretch }\"\n color=\"primary\"\n class=\"no-shadow\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <button mat-mini-fab *ngIf=\"dataField.getComponentType() === 'minifab'\"\n [ngClass]=\"{'full-button-width': stretch }\"\n class=\"no-shadow\"\n color=\"primary\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <mat-error *ngIf=\"dataField.isInvalid(formControlRef)\">{{getErrorMessage()}}</mat-error>\n</div>\n\n<ng-template #button>\n <div class=\"grid-wrapper\">\n <mat-icon *ngIf=\"dataField.waitingForResponse\" class=\"grid-1-1 margin-auto\">\n <mat-spinner color=\"warn\" diameter=\"22\"></mat-spinner>\n </mat-icon>\n <div [ngClass]=\"{'label-waiting': dataField.waitingForResponse}\" class=\"grid-1-1\">\n {{(dataField.placeholder === undefined || dataField.placeholder === '') ? dataField.title : (isIconTypeButton() ? '' : dataField.placeholder) }}\n </div>\n <mat-icon class=\"grid-1-1\"\n *ngIf=\"isIconTypeButton() && !dataField.waitingForResponse\">{{dataField.placeholder}}</mat-icon>\n </div>\n</ng-template>\n", styles: [".label-waiting{opacity:0}.grid-wrapper{display:grid;place-items:center}.grid-1-1{grid-column:1;grid-row:1}.margin-auto{margin:0 auto}.flex-end{display:flex;place-content:flex-end}.flex-start{display:flex;place-content:flex-start}.flex-center{display:flex;place-content:center}.full-button-width{width:100%}.padding-bottom{padding-bottom:24px}.no-shadow{box-shadow:unset!important}.padding-bottom-9px{padding-bottom:9px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i5.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: i5.MatFabButton, selector: "button[mat-fab]", inputs: ["extended"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i10.RequiredLabelComponent, selector: "nc-required-label", inputs: ["isIn"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ButtonDefaultFieldComponent, decorators: [{ type: Component, args: [{ selector: 'nc-button-default-field', template: "<div [ngClass]=\"{'flex-end': align === 'end',\n 'flex-start': align === 'start',\n 'flex-center': align === 'center',\n 'full-button-width': stretch,\n 'padding-bottom': !hasTitle(),\n 'padding-bottom-9px': !dataField.isInvalid(formControlRef) && hasTitle()}\">\n <mat-label class=\"netgrif-label\" [ngClass]=\"{'netgrif-label-disabled': formControlRef.disabled}\"\n *ngIf=\"!showLargeLayout.value && hasTitle()\">\n {{dataField.title}}\n <nc-required-label *ngIf=\"dataField.behavior.required\" [isIn]=\"!dataField.disabled\"></nc-required-label>\n <br>\n </mat-label>\n <button mat-button *ngIf=\"dataField.getComponentType() === undefined || dataField.getComponentType() === 'default' \"\n [ngClass]=\"{'full-button-width': stretch}\"\n color=\"primary\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <button mat-raised-button *ngIf=\"dataField.getComponentType() === 'raised'\"\n [ngClass]=\"{'full-button-width': stretch }\"\n color=\"primary\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <button mat-stroked-button *ngIf=\"dataField.getComponentType() === 'stroked'\"\n [ngClass]=\"{'full-button-width': stretch }\"\n color=\"primary\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <button mat-flat-button *ngIf=\"dataField.getComponentType() === 'flat'\"\n [ngClass]=\"{'full-button-width': stretch }\"\n color=\"primary\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <button mat-icon-button *ngIf=\"dataField.getComponentType() === 'icon'\"\n [ngClass]=\"{'full-button-width': stretch }\"\n color=\"primary\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <button mat-fab *ngIf=\"dataField.getComponentType() === 'fab'\"\n [ngClass]=\"{'full-button-width': stretch }\"\n color=\"primary\"\n class=\"no-shadow\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <button mat-mini-fab *ngIf=\"dataField.getComponentType() === 'minifab'\"\n [ngClass]=\"{'full-button-width': stretch }\"\n class=\"no-shadow\"\n color=\"primary\"\n [matTooltip]=\"dataField.description\"\n [disabled]=\"formControlRef.disabled || dataField.waitingForResponse\"\n (click)=\"resolveValue()\">\n <div *ngTemplateOutlet=\"button\"></div>\n </button>\n\n <mat-error *ngIf=\"dataField.isInvalid(formControlRef)\">{{getErrorMessage()}}</mat-error>\n</div>\n\n<ng-template #button>\n <div class=\"grid-wrapper\">\n <mat-icon *ngIf=\"dataField.waitingForResponse\" class=\"grid-1-1 margin-auto\">\n <mat-spinner color=\"warn\" diameter=\"22\"></mat-spinner>\n </mat-icon>\n <div [ngClass]=\"{'label-waiting': dataField.waitingForResponse}\" class=\"grid-1-1\">\n {{(dataField.placeholder === undefined || dataField.placeholder === '') ? dataField.title : (isIconTypeButton() ? '' : dataField.placeholder) }}\n </div>\n <mat-icon class=\"grid-1-1\"\n *ngIf=\"isIconTypeButton() && !dataField.waitingForResponse\">{{dataField.placeholder}}</mat-icon>\n </div>\n</ng-template>\n", styles: [".label-waiting{opacity:0}.grid-wrapper{display:grid;place-items:center}.grid-1-1{grid-column:1;grid-row:1}.margin-auto{margin:0 auto}.flex-end{display:flex;place-content:flex-end}.flex-start{display:flex;place-content:flex-start}.flex-center{display:flex;place-content:center}.full-button-width{width:100%}.padding-bottom{padding-bottom:24px}.no-shadow{box-shadow:unset!important}.padding-bottom-9px{padding-bottom:9px}\n"] }] }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.DialogService }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DATA_FIELD_PORTAL_DATA] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLWRlZmF1bHQtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzL3NyYy9saWIvZGF0YS1maWVsZHMvYnV0dG9uLWZpZWxkL2J1dHRvbi1kZWZhdWx0LWZpZWxkL2J1dHRvbi1kZWZhdWx0LWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL2RhdGEtZmllbGRzL2J1dHRvbi1maWVsZC9idXR0b24tZGVmYXVsdC1maWVsZC9idXR0b24tZGVmYXVsdC1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBcUIsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFDSCxtQ0FBbUMsRUFDbkMsc0JBQXNCLEVBR3pCLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7OztBQVNsQyxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsbUNBQW1DO0lBRXpFLEtBQUssQ0FBUztJQUNkLE9BQU8sQ0FBVTtJQUNkLE9BQU8sQ0FBZTtJQUVoQyxZQUFZLFVBQTRCLEVBQzVCLGNBQTZCLEVBQ2UsbUJBQXFEO1FBQ3pHLEtBQUssQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFUyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQztRQUN6RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEtBQUssTUFBTSxDQUFDO0lBQzVFLENBQUM7SUFFRCxXQUFXO1FBQ1AsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0IsQ0FBQzt3R0F6QlEsMkJBQTJCLCtFQVFKLHNCQUFzQjs0RkFSN0MsMkJBQTJCLHNGQ2Z4Qyx3NklBNEZBOzs0RkQ3RWEsMkJBQTJCO2tCQUx2QyxTQUFTOytCQUNJLHlCQUF5Qjs7MEJBWXRCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RCdXR0b25EZWZhdWx0RmllbGRDb21wb25lbnQsIEJ1dHRvbkZpZWxkLFxuICAgIERBVEFfRklFTERfUE9SVEFMX0RBVEEsXG4gICAgRGF0YUZpZWxkUG9ydGFsRGF0YSxcbiAgICBEaWFsb2dTZXJ2aWNlXG59IGZyb20gJ0BuZXRncmlmL2NvbXBvbmVudHMtY29yZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmMtYnV0dG9uLWRlZmF1bHQtZmllbGQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9idXR0b24tZGVmYXVsdC1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vYnV0dG9uLWRlZmF1bHQtZmllbGQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBCdXR0b25EZWZhdWx0RmllbGRDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEJ1dHRvbkRlZmF1bHRGaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIHB1YmxpYyBhbGlnbjogc3RyaW5nO1xuICAgIHB1YmxpYyBzdHJldGNoOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBzdWJDb21wOiBTdWJzY3JpcHRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIF9kaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoREFUQV9GSUVMRF9QT1JUQUxfREFUQSkgZGF0YUZpZWxkUG9ydGFsRGF0YTogRGF0YUZpZWxkUG9ydGFsRGF0YTxCdXR0b25GaWVsZD4pIHtcbiAgICAgICAgc3VwZXIoX3RyYW5zbGF0ZSwgX2RpYWxvZ1NlcnZpY2UsIGRhdGFGaWVsZFBvcnRhbERhdGEpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmNoZWNrUHJvcGVydGllcygpO1xuICAgICAgICB0aGlzLnN1YkNvbXAgPSB0aGlzLmRhdGFGaWVsZC5jb21wb25lbnRDaGFuZ2UkKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hlY2tQcm9wZXJ0aWVzKCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja1Byb3BlcnRpZXMoKSB7XG4gICAgICAgIHRoaXMuYWxpZ24gPSB0aGlzLmRhdGFGaWVsZC5jb21wb25lbnQ/LnByb3BlcnRpZXM/LmFsaWduO1xuICAgICAgICB0aGlzLnN0cmV0Y2ggPSB0aGlzLmRhdGFGaWVsZC5jb21wb25lbnQ/LnByb3BlcnRpZXM/LnN0cmV0Y2ggPT09ICd0cnVlJztcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zdWJDb21wLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxufVxuIiwiPGRpdiBbbmdDbGFzc109XCJ7J2ZsZXgtZW5kJzogYWxpZ24gPT09ICdlbmQnLFxuICAgICAgICAgICAgICAgICAgICAgJ2ZsZXgtc3RhcnQnOiBhbGlnbiA9PT0gJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgICdmbGV4LWNlbnRlcic6IGFsaWduID09PSAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICdmdWxsLWJ1dHRvbi13aWR0aCc6IHN0cmV0Y2gsXG4gICAgICAgICAgICAgICAgICAgICAncGFkZGluZy1ib3R0b20nOiAhaGFzVGl0bGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICdwYWRkaW5nLWJvdHRvbS05cHgnOiAhZGF0YUZpZWxkLmlzSW52YWxpZChmb3JtQ29udHJvbFJlZikgJiYgaGFzVGl0bGUoKX1cIj5cbiAgICA8bWF0LWxhYmVsIGNsYXNzPVwibmV0Z3JpZi1sYWJlbFwiIFtuZ0NsYXNzXT1cInsnbmV0Z3JpZi1sYWJlbC1kaXNhYmxlZCc6IGZvcm1Db250cm9sUmVmLmRpc2FibGVkfVwiXG4gICAgICAgICAgICAgICAqbmdJZj1cIiFzaG93TGFyZ2VMYXlvdXQudmFsdWUgJiYgaGFzVGl0bGUoKVwiPlxuICAgICAgICB7e2RhdGFGaWVsZC50aXRsZX19XG4gICAgICAgIDxuYy1yZXF1aXJlZC1sYWJlbCAqbmdJZj1cImRhdGFGaWVsZC5iZWhhdmlvci5yZXF1aXJlZFwiIFtpc0luXT1cIiFkYXRhRmllbGQuZGlzYWJsZWRcIj48L25jLXJlcXVpcmVkLWxhYmVsPlxuICAgICAgICA8YnI+XG4gICAgPC9tYXQtbGFiZWw+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uICpuZ0lmPVwiZGF0YUZpZWxkLmdldENvbXBvbmVudFR5cGUoKSA9PT0gdW5kZWZpbmVkIHx8IGRhdGFGaWVsZC5nZXRDb21wb25lbnRUeXBlKCkgPT09ICdkZWZhdWx0JyBcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmdWxsLWJ1dHRvbi13aWR0aCc6IHN0cmV0Y2h9XCJcbiAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJkYXRhRmllbGQuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm1Db250cm9sUmVmLmRpc2FibGVkIHx8IGRhdGFGaWVsZC53YWl0aW5nRm9yUmVzcG9uc2VcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlc29sdmVWYWx1ZSgpXCI+XG4gICAgICAgIDxkaXYgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uXCI+PC9kaXY+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uICpuZ0lmPVwiZGF0YUZpZWxkLmdldENvbXBvbmVudFR5cGUoKSA9PT0gJ3JhaXNlZCdcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmdWxsLWJ1dHRvbi13aWR0aCc6IHN0cmV0Y2ggfVwiXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiZGF0YUZpZWxkLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtQ29udHJvbFJlZi5kaXNhYmxlZCB8fCBkYXRhRmllbGQud2FpdGluZ0ZvclJlc3BvbnNlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZXNvbHZlVmFsdWUoKVwiPlxuICAgICAgICA8ZGl2ICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uXCI+PC9kaXY+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAqbmdJZj1cImRhdGFGaWVsZC5nZXRDb21wb25lbnRUeXBlKCkgPT09ICdzdHJva2VkJ1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Z1bGwtYnV0dG9uLXdpZHRoJzogc3RyZXRjaCB9XCJcbiAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJkYXRhRmllbGQuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm1Db250cm9sUmVmLmRpc2FibGVkIHx8IGRhdGFGaWVsZC53YWl0aW5nRm9yUmVzcG9uc2VcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlc29sdmVWYWx1ZSgpXCI+XG4gICAgICAgIDxkaXYgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25cIj48L2Rpdj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uICpuZ0lmPVwiZGF0YUZpZWxkLmdldENvbXBvbmVudFR5cGUoKSA9PT0gJ2ZsYXQnXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZnVsbC1idXR0b24td2lkdGgnOiBzdHJldGNoIH1cIlxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImRhdGFGaWVsZC5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybUNvbnRyb2xSZWYuZGlzYWJsZWQgfHwgZGF0YUZpZWxkLndhaXRpbmdGb3JSZXNwb25zZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmVzb2x2ZVZhbHVlKClcIj5cbiAgICAgICAgPGRpdiAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvblwiPjwvZGl2PlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJkYXRhRmllbGQuZ2V0Q29tcG9uZW50VHlwZSgpID09PSAnaWNvbidcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmdWxsLWJ1dHRvbi13aWR0aCc6IHN0cmV0Y2ggfVwiXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiZGF0YUZpZWxkLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtQ29udHJvbFJlZi5kaXNhYmxlZCB8fCBkYXRhRmllbGQud2FpdGluZ0ZvclJlc3BvbnNlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZXNvbHZlVmFsdWUoKVwiPlxuICAgICAgICA8ZGl2ICAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvblwiPjwvZGl2PlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvbiBtYXQtZmFiICpuZ0lmPVwiZGF0YUZpZWxkLmdldENvbXBvbmVudFR5cGUoKSA9PT0gJ2ZhYidcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmdWxsLWJ1dHRvbi13aWR0aCc6IHN0cmV0Y2ggfVwiXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgY2xhc3M9XCJuby1zaGFkb3dcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiZGF0YUZpZWxkLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtQ29udHJvbFJlZi5kaXNhYmxlZCB8fCBkYXRhRmllbGQud2FpdGluZ0ZvclJlc3BvbnNlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZXNvbHZlVmFsdWUoKVwiPlxuICAgICAgICA8ZGl2ICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uXCI+PC9kaXY+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiAqbmdJZj1cImRhdGFGaWVsZC5nZXRDb21wb25lbnRUeXBlKCkgPT09ICdtaW5pZmFiJ1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Z1bGwtYnV0dG9uLXdpZHRoJzogc3RyZXRjaCB9XCJcbiAgICAgICAgICAgIGNsYXNzPVwibm8tc2hhZG93XCJcbiAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJkYXRhRmllbGQuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm1Db250cm9sUmVmLmRpc2FibGVkIHx8IGRhdGFGaWVsZC53YWl0aW5nRm9yUmVzcG9uc2VcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlc29sdmVWYWx1ZSgpXCI+XG4gICAgICAgIDxkaXYgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uXCI+PC9kaXY+XG4gICAgPC9idXR0b24+XG5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZGF0YUZpZWxkLmlzSW52YWxpZChmb3JtQ29udHJvbFJlZilcIj57e2dldEVycm9yTWVzc2FnZSgpfX08L21hdC1lcnJvcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwiZ3JpZC13cmFwcGVyXCI+XG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImRhdGFGaWVsZC53YWl0aW5nRm9yUmVzcG9uc2VcIiBjbGFzcz1cImdyaWQtMS0xIG1hcmdpbi1hdXRvXCI+XG4gICAgICAgICAgICA8bWF0LXNwaW5uZXIgY29sb3I9XCJ3YXJuXCIgZGlhbWV0ZXI9XCIyMlwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydsYWJlbC13YWl0aW5nJzogZGF0YUZpZWxkLndhaXRpbmdGb3JSZXNwb25zZX1cIiBjbGFzcz1cImdyaWQtMS0xXCI+XG4gICAgICAgICAgICB7eyhkYXRhRmllbGQucGxhY2Vob2xkZXIgPT09IHVuZGVmaW5lZCB8fCBkYXRhRmllbGQucGxhY2Vob2xkZXIgPT09ICcnKSA/IGRhdGFGaWVsZC50aXRsZSA6IChpc0ljb25UeXBlQnV0dG9uKCkgPyAnJyA6IGRhdGFGaWVsZC5wbGFjZWhvbGRlcikgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImdyaWQtMS0xXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNJY29uVHlwZUJ1dHRvbigpICYmICFkYXRhRmllbGQud2FpdGluZ0ZvclJlc3BvbnNlXCI+e3tkYXRhRmllbGQucGxhY2Vob2xkZXJ9fTwvbWF0LWljb24+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19