@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
65 lines • 18.5 kB
JavaScript
import { Component, EventEmitter, Output, ViewChild } from '@angular/core';
import { FormBuilder, NgForm, Validators } from '@angular/forms';
import { camelCase } from 'lodash-es';
import { BsModalRef } from 'ngx-bootstrap/modal';
import { simpleJsonPathValidator } from '../../forms/simple-json-path-validator.directive';
import { gettext } from '../../i18n/gettext';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "ngx-bootstrap/modal";
import * as i3 from "../../i18n/c8y-translate.directive";
import * as i4 from "../../forms/form-group.component";
import * as i5 from "../../forms/message.directive";
import * as i6 from "../../forms/messages.component";
import * as i7 from "../../forms/required-input-placeholder.directive";
import * as i8 from "../../forms/unique-in-collection-by-path-validation.directive";
import * as i9 from "../../i18n/c8y-translate.pipe";
export class ConfigureCustomColumnComponent {
constructor(fb, modalRef) {
this.fb = fb;
this.modalRef = modalRef;
this.SIMPLE_JSON_PATH_REGEX = /^[^.\s]+(\.\S+)*$/;
this.onAddCustomColumn = new EventEmitter();
this.formGroup = this.fb.group({
header: [''],
path: ['', [Validators.required, simpleJsonPathValidator]],
addAnother: [false]
});
this.columns = [];
this.uniqueHeaderMsg = gettext('The column header name is too similar to "{{ value }}".');
}
comparator(val1, val2) {
return camelCase(val1) === camelCase(val2);
}
addColumn() {
const { header, path } = this.formGroup.value;
const column = {
name: camelCase(header),
header,
path,
custom: true,
visible: true
};
this.onAddCustomColumn.emit(column);
// add new column to columns array since it's used for header uniqueness validation
this.columns.splice(this.columns.length, 0, column);
if (this.formGroup.value.addAnother) {
this.form.resetForm({ addAnother: true });
}
else {
this.modalRef.hide();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConfigureCustomColumnComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BsModalRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ConfigureCustomColumnComponent, selector: "c8y-configure-custom-column", outputs: { onAddCustomColumn: "onAddCustomColumn" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["columnConfigForm"], descendants: true }], ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header separator-bottom\">\n <h3 id=\"modal-title\" translate>Configure custom column</h3>\n </div>\n\n <form class=\"d-contents\" #columnConfigForm=\"ngForm\" [formGroup]=\"formGroup\">\n <div class=\"modal-inner-scroll\" id=\"modal-body\">\n <div class=\"modal-body\">\n <c8y-form-group>\n <label for=\"header\" translate>Header</label>\n <input\n id=\"header\"\n data-cy=\"configure-custom-column--header\"\n formControlName=\"header\"\n class=\"form-control\"\n autocomplete=\"off\"\n [placeholder]=\"'e.g. Agent name' | translate\"\n [required]=\"true\"\n uniqueByPath\n [collection]=\"columns\"\n path=\"header\"\n [comparator]=\"comparator\"\n />\n <c8y-messages>\n <c8y-message\n name=\"uniqueByPath\"\n [text]=\"uniqueHeaderMsg\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label for=\"fragmentPath\" translate>Fragment path</label>\n <input\n id=\"fragmentPath\"\n data-cy=\"configure-custom-column--fragmentPath\"\n formControlName=\"path\"\n class=\"form-control\"\n autocomplete=\"off\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Agent.name' }\"\n />\n </c8y-form-group>\n <label class=\"c8y-switch\" [title]=\"'Add another column after saving this one' | translate\">\n <input type=\"checkbox\" formControlName=\"addAnother\" class=\"form-control\" />\n <span></span>\n <span translate>Add another column after saving this one</span>\n </label>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button title=\"{{ 'Cancel' | translate }}\" class=\"btn btn-default\" (click)=\"modalRef.hide()\">\n {{ 'Cancel' | translate }}\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n [disabled]=\"columnConfigForm.form.pristine || !columnConfigForm.form.valid\"\n (click)=\"addColumn()\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i4.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i5.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i6.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i7.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i8.UniqueInCollectionByPathValidationDirective, selector: "[uniqueByPath]", inputs: ["collection", "path", "comparator"] }, { kind: "pipe", type: i9.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConfigureCustomColumnComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-configure-custom-column', template: "<div class=\"viewport-modal\">\n <div class=\"modal-header separator-bottom\">\n <h3 id=\"modal-title\" translate>Configure custom column</h3>\n </div>\n\n <form class=\"d-contents\" #columnConfigForm=\"ngForm\" [formGroup]=\"formGroup\">\n <div class=\"modal-inner-scroll\" id=\"modal-body\">\n <div class=\"modal-body\">\n <c8y-form-group>\n <label for=\"header\" translate>Header</label>\n <input\n id=\"header\"\n data-cy=\"configure-custom-column--header\"\n formControlName=\"header\"\n class=\"form-control\"\n autocomplete=\"off\"\n [placeholder]=\"'e.g. Agent name' | translate\"\n [required]=\"true\"\n uniqueByPath\n [collection]=\"columns\"\n path=\"header\"\n [comparator]=\"comparator\"\n />\n <c8y-messages>\n <c8y-message\n name=\"uniqueByPath\"\n [text]=\"uniqueHeaderMsg\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label for=\"fragmentPath\" translate>Fragment path</label>\n <input\n id=\"fragmentPath\"\n data-cy=\"configure-custom-column--fragmentPath\"\n formControlName=\"path\"\n class=\"form-control\"\n autocomplete=\"off\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Agent.name' }\"\n />\n </c8y-form-group>\n <label class=\"c8y-switch\" [title]=\"'Add another column after saving this one' | translate\">\n <input type=\"checkbox\" formControlName=\"addAnother\" class=\"form-control\" />\n <span></span>\n <span translate>Add another column after saving this one</span>\n </label>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button title=\"{{ 'Cancel' | translate }}\" class=\"btn btn-default\" (click)=\"modalRef.hide()\">\n {{ 'Cancel' | translate }}\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n [disabled]=\"columnConfigForm.form.pristine || !columnConfigForm.form.valid\"\n (click)=\"addColumn()\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </form>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.BsModalRef }], propDecorators: { form: [{
type: ViewChild,
args: ['columnConfigForm', { static: false }]
}], onAddCustomColumn: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlLWN1c3RvbS1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vY29yZS9kYXRhLWdyaWQvY29uZmlndXJlLWN1c3RvbS1jb2x1bW4vY29uZmlndXJlLWN1c3RvbS1jb2x1bW4uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vY29yZS9kYXRhLWdyaWQvY29uZmlndXJlLWN1c3RvbS1jb2x1bW4vY29uZmlndXJlLWN1c3RvbS1jb2x1bW4uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFhLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7O0FBTzdDLE1BQU0sT0FBTyw4QkFBOEI7SUFpQnpDLFlBQW1CLEVBQWUsRUFBUyxRQUFvQjtRQUE1QyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQVMsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQWhCdEQsMkJBQXNCLEdBQUcsbUJBQW1CLENBQUM7UUFLdEQsc0JBQWlCLEdBQXFDLElBQUksWUFBWSxFQUFFLENBQUM7UUFFekUsY0FBUyxHQUFjLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25DLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNaLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztZQUMxRCxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7U0FDcEIsQ0FBQyxDQUFDO1FBQ0gsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUV2QixvQkFBZSxHQUFHLE9BQU8sQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0lBRW5CLENBQUM7SUFFbkUsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJO1FBQ25CLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDOUMsTUFBTSxNQUFNLEdBQUc7WUFDYixJQUFJLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUN2QixNQUFNO1lBQ04sSUFBSTtZQUNKLE1BQU0sRUFBRSxJQUFJO1lBQ1osT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxtRkFBbUY7UUFDbkYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXBELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7K0dBekNVLDhCQUE4QjttR0FBOUIsOEJBQThCLGtPQ1ozQyxzMUVBZ0VBOzs0RkRwRGEsOEJBQThCO2tCQUoxQyxTQUFTOytCQUNFLDZCQUE2Qjt5R0FNVyxJQUFJO3NCQUFyRCxTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHaEQsaUJBQWlCO3NCQURoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBOZ0Zvcm0sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBjYW1lbENhc2UgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgc2ltcGxlSnNvblBhdGhWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9mb3Jtcy9zaW1wbGUtanNvbi1wYXRoLXZhbGlkYXRvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uLy4uL2kxOG4vZ2V0dGV4dCc7XG5pbXBvcnQgeyBDb2x1bW4sIEN1c3RvbUNvbHVtbkNvbmZpZyB9IGZyb20gJy4uL2RhdGEtZ3JpZC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1jb25maWd1cmUtY3VzdG9tLWNvbHVtbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb25maWd1cmUtY3VzdG9tLWNvbHVtbi5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQ29uZmlndXJlQ3VzdG9tQ29sdW1uQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgU0lNUExFX0pTT05fUEFUSF9SRUdFWCA9IC9eW14uXFxzXSsoXFwuXFxTKykqJC87XG5cbiAgQFZpZXdDaGlsZCgnY29sdW1uQ29uZmlnRm9ybScsIHsgc3RhdGljOiBmYWxzZSB9KSBmb3JtOiBOZ0Zvcm07XG5cbiAgQE91dHB1dCgpXG4gIG9uQWRkQ3VzdG9tQ29sdW1uOiBFdmVudEVtaXR0ZXI8Q3VzdG9tQ29sdW1uQ29uZmlnPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBmb3JtR3JvdXA6IEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgIGhlYWRlcjogWycnXSxcbiAgICBwYXRoOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBzaW1wbGVKc29uUGF0aFZhbGlkYXRvcl1dLFxuICAgIGFkZEFub3RoZXI6IFtmYWxzZV1cbiAgfSk7XG4gIGNvbHVtbnM6IENvbHVtbltdID0gW107XG5cbiAgdW5pcXVlSGVhZGVyTXNnID0gZ2V0dGV4dCgnVGhlIGNvbHVtbiBoZWFkZXIgbmFtZSBpcyB0b28gc2ltaWxhciB0byBcInt7IHZhbHVlIH19XCIuJyk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGZiOiBGb3JtQnVpbGRlciwgcHVibGljIG1vZGFsUmVmOiBCc01vZGFsUmVmKSB7fVxuXG4gIGNvbXBhcmF0b3IodmFsMSwgdmFsMikge1xuICAgIHJldHVybiBjYW1lbENhc2UodmFsMSkgPT09IGNhbWVsQ2FzZSh2YWwyKTtcbiAgfVxuXG4gIGFkZENvbHVtbigpOiB2b2lkIHtcbiAgICBjb25zdCB7IGhlYWRlciwgcGF0aCB9ID0gdGhpcy5mb3JtR3JvdXAudmFsdWU7XG4gICAgY29uc3QgY29sdW1uID0ge1xuICAgICAgbmFtZTogY2FtZWxDYXNlKGhlYWRlciksXG4gICAgICBoZWFkZXIsXG4gICAgICBwYXRoLFxuICAgICAgY3VzdG9tOiB0cnVlLFxuICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgIH07XG4gICAgdGhpcy5vbkFkZEN1c3RvbUNvbHVtbi5lbWl0KGNvbHVtbik7XG4gICAgLy8gYWRkIG5ldyBjb2x1bW4gdG8gY29sdW1ucyBhcnJheSBzaW5jZSBpdCdzIHVzZWQgZm9yIGhlYWRlciB1bmlxdWVuZXNzIHZhbGlkYXRpb25cbiAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKHRoaXMuY29sdW1ucy5sZW5ndGgsIDAsIGNvbHVtbik7XG5cbiAgICBpZiAodGhpcy5mb3JtR3JvdXAudmFsdWUuYWRkQW5vdGhlcikge1xuICAgICAgdGhpcy5mb3JtLnJlc2V0Rm9ybSh7IGFkZEFub3RoZXI6IHRydWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubW9kYWxSZWYuaGlkZSgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInZpZXdwb3J0LW1vZGFsXCI+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgc2VwYXJhdG9yLWJvdHRvbVwiPlxuICAgIDxoMyBpZD1cIm1vZGFsLXRpdGxlXCIgdHJhbnNsYXRlPkNvbmZpZ3VyZSBjdXN0b20gY29sdW1uPC9oMz5cbiAgPC9kaXY+XG5cbiAgPGZvcm0gY2xhc3M9XCJkLWNvbnRlbnRzXCIgI2NvbHVtbkNvbmZpZ0Zvcm09XCJuZ0Zvcm1cIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1pbm5lci1zY3JvbGxcIiBpZD1cIm1vZGFsLWJvZHlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiaGVhZGVyXCIgdHJhbnNsYXRlPkhlYWRlcjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cImhlYWRlclwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiY29uZmlndXJlLWN1c3RvbS1jb2x1bW4tLWhlYWRlclwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJoZWFkZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInZS5nLiBBZ2VudCBuYW1lJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICB1bmlxdWVCeVBhdGhcbiAgICAgICAgICAgIFtjb2xsZWN0aW9uXT1cImNvbHVtbnNcIlxuICAgICAgICAgICAgcGF0aD1cImhlYWRlclwiXG4gICAgICAgICAgICBbY29tcGFyYXRvcl09XCJjb21wYXJhdG9yXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxjOHktbWVzc2FnZXM+XG4gICAgICAgICAgICA8Yzh5LW1lc3NhZ2VcbiAgICAgICAgICAgICAgbmFtZT1cInVuaXF1ZUJ5UGF0aFwiXG4gICAgICAgICAgICAgIFt0ZXh0XT1cInVuaXF1ZUhlYWRlck1zZ1wiXG4gICAgICAgICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICAgICAgICA8L2M4eS1tZXNzYWdlcz5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJmcmFnbWVudFBhdGhcIiB0cmFuc2xhdGU+RnJhZ21lbnQgcGF0aDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cImZyYWdtZW50UGF0aFwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiY29uZmlndXJlLWN1c3RvbS1jb2x1bW4tLWZyYWdtZW50UGF0aFwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwYXRoXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ2UuZy4ge3sgZXhhbXBsZSB9fScgfCB0cmFuc2xhdGU6IHsgZXhhbXBsZTogJ2M4eV9BZ2VudC5uYW1lJyB9XCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktc3dpdGNoXCIgW3RpdGxlXT1cIidBZGQgYW5vdGhlciBjb2x1bW4gYWZ0ZXIgc2F2aW5nIHRoaXMgb25lJyB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJhZGRBbm90aGVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAvPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+QWRkIGFub3RoZXIgY29sdW1uIGFmdGVyIHNhdmluZyB0aGlzIG9uZTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgPGJ1dHRvbiB0aXRsZT1cInt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiAoY2xpY2spPVwibW9kYWxSZWYuaGlkZSgpXCI+XG4gICAgICAgIHt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdGl0bGU9XCJ7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW5Db25maWdGb3JtLmZvcm0ucHJpc3RpbmUgfHwgIWNvbHVtbkNvbmZpZ0Zvcm0uZm9ybS52YWxpZFwiXG4gICAgICAgIChjbGljayk9XCJhZGRDb2x1bW4oKVwiXG4gICAgICA+XG4gICAgICAgIHt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvZGl2PlxuIl19