@netgrif/components
Version:
Netgrif Application Engine frontend Angular components
31 lines • 28 kB
JavaScript
import { Component } from '@angular/core';
import { AbstractSearchConfigurationInputComponent, OperatorTemplatePartType, SearchInputType } from '@netgrif/components-core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@ngbracket/ngx-layout";
import * as i3 from "@ngbracket/ngx-layout/extended";
import * as i4 from "@angular/material/autocomplete";
import * as i5 from "@angular/material/core";
import * as i6 from "@angular/material/icon";
import * as i7 from "@angular/material/input";
import * as i8 from "@angular/material/form-field";
import * as i9 from "@angular/material/select";
import * as i10 from "@angular/forms";
import * as i11 from "../search-operand-input-component/search-operand-input.component";
import * as i12 from "@ngx-translate/core";
export class SearchConfigurationInputComponent extends AbstractSearchConfigurationInputComponent {
// make the enum referencable in HTML
searchInputType = SearchInputType;
// make the enum referencable in HTML
operatorTemplatePartType = OperatorTemplatePartType;
constructor() {
super();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchConfigurationInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchConfigurationInputComponent, selector: "nc-search-configuration-input", usesInheritance: true, ngImport: i0, template: "<div [ngSwitch]=\"configuration.type\">\n <ng-template [ngSwitchCase]=\"searchInputType.AUTOCOMPLETE\">\n <div *ngIf=\"!configuration.isOptionSelected; then configurationSelection else configurationDisplay\"></div>\n\n <ng-template #configurationSelection>\n <mat-form-field class=\"text-margin\" appearance=\"outline\">\n <mat-label>{{configuration.label | translate}}</mat-label>\n <input type=\"text\" matInput\n #autocompleteInput\n #autocompleteTrigger=\"matAutocompleteTrigger\"\n [formControl]=\"configuration.formControl\"\n [matAutocomplete]=\"configurationAutocomplete\"\n [disabled]=\"!editable\"\n (keydown.enter)=\"$event.target.blur(); autocompleteTrigger.closePanel()\"\n #configurationInput>\n <mat-autocomplete #configurationAutocomplete=\"matAutocomplete\"\n [displayWith]=\"renderSelection\"\n (optionSelected)=\"autocompleteInput.blur()\">\n <mat-option\n *ngFor=\"let option of configuration.filteredOptions$ | async\"\n [value]=\"option\">\n <mat-icon *ngIf=\"option.icon\">{{option.icon}}</mat-icon>\n <span>{{option.text}}</span>\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </ng-template>\n\n <ng-template #configurationDisplay>\n <div class=\"text-margin\"\n [ngClass]=\"{'bold-text': configuration.displayBold}\"\n (click)=\"clearConfigurationInput()\">\n {{configuration.selectedOptionTranslatePath | translate}}\n </div>\n </ng-template>\n </ng-template>\n <ng-template [ngSwitchCase]=\"searchInputType.OPERATOR\">\n <div *ngIf=\"selectedCategory.isOperatorSelected(); then argumentsSelection; else operatorSelection\"></div>\n\n <ng-template #operatorSelection>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{configuration.label | translate}}</mat-label>\n <mat-select [formControl]=\"configuration.formControl\" [disabled]=\"!editable\" #configurationInput>\n <mat-option *ngFor=\"let operator of selectedCategory.allowedOperators\" [value]=\"operator\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <ng-template ngFor let-namePart [ngForOf]=\"operator.getOperatorNameTemplate()\" let-last=\"last\">\n <ng-container [ngTemplateOutlet]=\"namePart ? operatorInputText : operatorInputPlaceholder\"\n [ngTemplateOutletContext]=\"{last:last, namePart:namePart}\"></ng-container>\n </ng-template>\n\n <ng-template #operatorInputText let-last=\"last\" let-namePart=\"namePart\">\n <div [ngClass]=\"{'argument-right-margin': !last}\">\n {{namePart | translate}}\n </div>\n </ng-template>\n\n <ng-template #operatorInputPlaceholder let-last=\"last\">\n <div class=\"argument-placeholder-color argument-placeholder-dimensions\" [ngClass]=\"{'argument-right-margin': !last}\"></div>\n </ng-template>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ng-template>\n\n <ng-template #argumentsSelection>\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" (click)=\"clearOperatorInput()\">\n <ng-template ngFor let-templatePart [ngForOf]=\"selectedCategory.operatorTemplate$ | async\"\n [ngForTrackBy]=\"trackByTemplateParts\">\n <div [ngSwitch]=\"templatePart.type\">\n <ng-template [ngSwitchCase]=\"operatorTemplatePartType.TEXT\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\"\n class=\"text-margin\">\n {{templatePart.content | translate}}\n </div>\n </ng-template>\n\n <ng-template [ngSwitchCase]=\"operatorTemplatePartType.INPUT\">\n <div class=\"text-margin\"\n (click)=\"$event.stopPropagation()\">\n <nc-search-operand-input [inputFormControl]=\"templatePart.content\"\n [inputType]=\"selectedCategory.inputType\"\n [first]=\"templatePart.first\"\n [filterOptionsFunction]=\"filterOptions\"\n [editable]=\"editable\"></nc-search-operand-input>\n </div>\n </ng-template>\n </div>\n </ng-template>\n </div>\n </ng-template>\n </ng-template>\n</div>\n", styles: [".bold-text{font-weight:700}.text-margin{margin-left:4px}.argument-placeholder-dimensions{height:1.5em;width:6em;border-radius:4px}.argument-right-margin{margin-right:.5em}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.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: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "component", type: i9.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i11.SearchOperandInputComponent, selector: "nc-search-operand-input" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchConfigurationInputComponent, decorators: [{
type: Component,
args: [{ selector: 'nc-search-configuration-input', template: "<div [ngSwitch]=\"configuration.type\">\n <ng-template [ngSwitchCase]=\"searchInputType.AUTOCOMPLETE\">\n <div *ngIf=\"!configuration.isOptionSelected; then configurationSelection else configurationDisplay\"></div>\n\n <ng-template #configurationSelection>\n <mat-form-field class=\"text-margin\" appearance=\"outline\">\n <mat-label>{{configuration.label | translate}}</mat-label>\n <input type=\"text\" matInput\n #autocompleteInput\n #autocompleteTrigger=\"matAutocompleteTrigger\"\n [formControl]=\"configuration.formControl\"\n [matAutocomplete]=\"configurationAutocomplete\"\n [disabled]=\"!editable\"\n (keydown.enter)=\"$event.target.blur(); autocompleteTrigger.closePanel()\"\n #configurationInput>\n <mat-autocomplete #configurationAutocomplete=\"matAutocomplete\"\n [displayWith]=\"renderSelection\"\n (optionSelected)=\"autocompleteInput.blur()\">\n <mat-option\n *ngFor=\"let option of configuration.filteredOptions$ | async\"\n [value]=\"option\">\n <mat-icon *ngIf=\"option.icon\">{{option.icon}}</mat-icon>\n <span>{{option.text}}</span>\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </ng-template>\n\n <ng-template #configurationDisplay>\n <div class=\"text-margin\"\n [ngClass]=\"{'bold-text': configuration.displayBold}\"\n (click)=\"clearConfigurationInput()\">\n {{configuration.selectedOptionTranslatePath | translate}}\n </div>\n </ng-template>\n </ng-template>\n <ng-template [ngSwitchCase]=\"searchInputType.OPERATOR\">\n <div *ngIf=\"selectedCategory.isOperatorSelected(); then argumentsSelection; else operatorSelection\"></div>\n\n <ng-template #operatorSelection>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{configuration.label | translate}}</mat-label>\n <mat-select [formControl]=\"configuration.formControl\" [disabled]=\"!editable\" #configurationInput>\n <mat-option *ngFor=\"let operator of selectedCategory.allowedOperators\" [value]=\"operator\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <ng-template ngFor let-namePart [ngForOf]=\"operator.getOperatorNameTemplate()\" let-last=\"last\">\n <ng-container [ngTemplateOutlet]=\"namePart ? operatorInputText : operatorInputPlaceholder\"\n [ngTemplateOutletContext]=\"{last:last, namePart:namePart}\"></ng-container>\n </ng-template>\n\n <ng-template #operatorInputText let-last=\"last\" let-namePart=\"namePart\">\n <div [ngClass]=\"{'argument-right-margin': !last}\">\n {{namePart | translate}}\n </div>\n </ng-template>\n\n <ng-template #operatorInputPlaceholder let-last=\"last\">\n <div class=\"argument-placeholder-color argument-placeholder-dimensions\" [ngClass]=\"{'argument-right-margin': !last}\"></div>\n </ng-template>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ng-template>\n\n <ng-template #argumentsSelection>\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" (click)=\"clearOperatorInput()\">\n <ng-template ngFor let-templatePart [ngForOf]=\"selectedCategory.operatorTemplate$ | async\"\n [ngForTrackBy]=\"trackByTemplateParts\">\n <div [ngSwitch]=\"templatePart.type\">\n <ng-template [ngSwitchCase]=\"operatorTemplatePartType.TEXT\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\"\n class=\"text-margin\">\n {{templatePart.content | translate}}\n </div>\n </ng-template>\n\n <ng-template [ngSwitchCase]=\"operatorTemplatePartType.INPUT\">\n <div class=\"text-margin\"\n (click)=\"$event.stopPropagation()\">\n <nc-search-operand-input [inputFormControl]=\"templatePart.content\"\n [inputType]=\"selectedCategory.inputType\"\n [first]=\"templatePart.first\"\n [filterOptionsFunction]=\"filterOptions\"\n [editable]=\"editable\"></nc-search-operand-input>\n </div>\n </ng-template>\n </div>\n </ng-template>\n </div>\n </ng-template>\n </ng-template>\n</div>\n", styles: [".bold-text{font-weight:700}.text-margin{margin-left:4px}.argument-placeholder-dimensions{height:1.5em;width:6em;border-radius:4px}.argument-right-margin{margin-right:.5em}\n"] }]
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWNvbmZpZ3VyYXRpb24taW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzL3NyYy9saWIvc2VhcmNoL2FkdmFuY2VkLXNlYXJjaC9zZWFyY2gtY29uZmlndXJhdGlvbi1pbnB1dC1jb21wb25lbnQvc2VhcmNoLWNvbmZpZ3VyYXRpb24taW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzL3NyYy9saWIvc2VhcmNoL2FkdmFuY2VkLXNlYXJjaC9zZWFyY2gtY29uZmlndXJhdGlvbi1pbnB1dC1jb21wb25lbnQvc2VhcmNoLWNvbmZpZ3VyYXRpb24taW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMseUNBQXlDLEVBQUUsd0JBQXdCLEVBQUUsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBTzlILE1BQU0sT0FBTyxpQ0FBa0MsU0FBUSx5Q0FBeUM7SUFFNUYscUNBQXFDO0lBQzlCLGVBQWUsR0FBRyxlQUFlLENBQUM7SUFDekMscUNBQXFDO0lBQzlCLHdCQUF3QixHQUFHLHdCQUF3QixDQUFDO0lBRTNEO1FBQ0ksS0FBSyxFQUFFLENBQUM7SUFDWixDQUFDO3dHQVRRLGlDQUFpQzs0RkFBakMsaUNBQWlDLDRGQ1I5QyxxNEtBNkZBOzs0RkRyRmEsaUNBQWlDO2tCQUw3QyxTQUFTOytCQUNJLCtCQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWJzdHJhY3RTZWFyY2hDb25maWd1cmF0aW9uSW5wdXRDb21wb25lbnQsIE9wZXJhdG9yVGVtcGxhdGVQYXJ0VHlwZSwgU2VhcmNoSW5wdXRUeXBlfSBmcm9tICdAbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25jLXNlYXJjaC1jb25maWd1cmF0aW9uLWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWNvbmZpZ3VyYXRpb24taW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NlYXJjaC1jb25maWd1cmF0aW9uLWlucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoQ29uZmlndXJhdGlvbklucHV0Q29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RTZWFyY2hDb25maWd1cmF0aW9uSW5wdXRDb21wb25lbnQge1xuXG4gICAgLy8gbWFrZSB0aGUgZW51bSByZWZlcmVuY2FibGUgaW4gSFRNTFxuICAgIHB1YmxpYyBzZWFyY2hJbnB1dFR5cGUgPSBTZWFyY2hJbnB1dFR5cGU7XG4gICAgLy8gbWFrZSB0aGUgZW51bSByZWZlcmVuY2FibGUgaW4gSFRNTFxuICAgIHB1YmxpYyBvcGVyYXRvclRlbXBsYXRlUGFydFR5cGUgPSBPcGVyYXRvclRlbXBsYXRlUGFydFR5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbn1cbiIsIjxkaXYgW25nU3dpdGNoXT1cImNvbmZpZ3VyYXRpb24udHlwZVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdTd2l0Y2hDYXNlXT1cInNlYXJjaElucHV0VHlwZS5BVVRPQ09NUExFVEVcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFjb25maWd1cmF0aW9uLmlzT3B0aW9uU2VsZWN0ZWQ7IHRoZW4gY29uZmlndXJhdGlvblNlbGVjdGlvbiBlbHNlIGNvbmZpZ3VyYXRpb25EaXNwbGF5XCI+PC9kaXY+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNjb25maWd1cmF0aW9uU2VsZWN0aW9uPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidGV4dC1tYXJnaW5cIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tjb25maWd1cmF0aW9uLmxhYmVsIHwgdHJhbnNsYXRlfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAjYXV0b2NvbXBsZXRlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgI2F1dG9jb21wbGV0ZVRyaWdnZXI9XCJtYXRBdXRvY29tcGxldGVUcmlnZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbmZpZ3VyYXRpb24uZm9ybUNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImNvbmZpZ3VyYXRpb25BdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnRhcmdldC5ibHVyKCk7IGF1dG9jb21wbGV0ZVRyaWdnZXIuY2xvc2VQYW5lbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgI2NvbmZpZ3VyYXRpb25JbnB1dD5cbiAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjY29uZmlndXJhdGlvbkF1dG9jb21wbGV0ZT1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlXaXRoXT1cInJlbmRlclNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cImF1dG9jb21wbGV0ZUlucHV0LmJsdXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBjb25maWd1cmF0aW9uLmZpbHRlcmVkT3B0aW9ucyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJvcHRpb24uaWNvblwiPnt7b3B0aW9uLmljb259fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e29wdGlvbi50ZXh0fX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjY29uZmlndXJhdGlvbkRpc3BsYXk+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tYXJnaW5cIlxuICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JvbGQtdGV4dCc6IGNvbmZpZ3VyYXRpb24uZGlzcGxheUJvbGR9XCJcbiAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyQ29uZmlndXJhdGlvbklucHV0KClcIj5cbiAgICAgICAgICAgICAgICB7e2NvbmZpZ3VyYXRpb24uc2VsZWN0ZWRPcHRpb25UcmFuc2xhdGVQYXRoIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ1N3aXRjaENhc2VdPVwic2VhcmNoSW5wdXRUeXBlLk9QRVJBVE9SXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5LmlzT3BlcmF0b3JTZWxlY3RlZCgpOyB0aGVuIGFyZ3VtZW50c1NlbGVjdGlvbjsgZWxzZSBvcGVyYXRvclNlbGVjdGlvblwiPjwvZGl2PlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjb3BlcmF0b3JTZWxlY3Rpb24+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7Y29uZmlndXJhdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cImNvbmZpZ3VyYXRpb24uZm9ybUNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiIWVkaXRhYmxlXCIgI2NvbmZpZ3VyYXRpb25JbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wZXJhdG9yIG9mIHNlbGVjdGVkQ2F0ZWdvcnkuYWxsb3dlZE9wZXJhdG9yc1wiIFt2YWx1ZV09XCJvcGVyYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LW5hbWVQYXJ0IFtuZ0Zvck9mXT1cIm9wZXJhdG9yLmdldE9wZXJhdG9yTmFtZVRlbXBsYXRlKClcIiBsZXQtbGFzdD1cImxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJuYW1lUGFydCA/IG9wZXJhdG9ySW5wdXRUZXh0IDogb3BlcmF0b3JJbnB1dFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2xhc3Q6bGFzdCwgbmFtZVBhcnQ6bmFtZVBhcnR9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3BlcmF0b3JJbnB1dFRleHQgbGV0LWxhc3Q9XCJsYXN0XCIgbGV0LW5hbWVQYXJ0PVwibmFtZVBhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J2FyZ3VtZW50LXJpZ2h0LW1hcmdpbic6ICFsYXN0fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tuYW1lUGFydCB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI29wZXJhdG9ySW5wdXRQbGFjZWhvbGRlciBsZXQtbGFzdD1cImxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZ3VtZW50LXBsYWNlaG9sZGVyLWNvbG9yIGFyZ3VtZW50LXBsYWNlaG9sZGVyLWRpbWVuc2lvbnNcIiBbbmdDbGFzc109XCJ7J2FyZ3VtZW50LXJpZ2h0LW1hcmdpbic6ICFsYXN0fVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNhcmd1bWVudHNTZWxlY3Rpb24+XG4gICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiIChjbGljayk9XCJjbGVhck9wZXJhdG9ySW5wdXQoKVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtdGVtcGxhdGVQYXJ0IFtuZ0Zvck9mXT1cInNlbGVjdGVkQ2F0ZWdvcnkub3BlcmF0b3JUZW1wbGF0ZSQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0ZvclRyYWNrQnldPVwidHJhY2tCeVRlbXBsYXRlUGFydHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwidGVtcGxhdGVQYXJ0LnR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdTd2l0Y2hDYXNlXT1cIm9wZXJhdG9yVGVtcGxhdGVQYXJ0VHlwZS5URVhUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LW1hcmdpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3RlbXBsYXRlUGFydC5jb250ZW50IHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdTd2l0Y2hDYXNlXT1cIm9wZXJhdG9yVGVtcGxhdGVQYXJ0VHlwZS5JTlBVVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1hcmdpblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYy1zZWFyY2gtb3BlcmFuZC1pbnB1dCBbaW5wdXRGb3JtQ29udHJvbF09XCJ0ZW1wbGF0ZVBhcnQuY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRUeXBlXT1cInNlbGVjdGVkQ2F0ZWdvcnkuaW5wdXRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaXJzdF09XCJ0ZW1wbGF0ZVBhcnQuZmlyc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlck9wdGlvbnNGdW5jdGlvbl09XCJmaWx0ZXJPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlZGl0YWJsZV09XCJlZGl0YWJsZVwiPjwvbmMtc2VhcmNoLW9wZXJhbmQtaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19