ng-prime-tools
Version:
An advanced PrimeNG table for Angular
102 lines • 21.5 kB
JavaScript
import { Component, Input } from '@angular/core';
import { Validators, } from '@angular/forms';
import { FormInputTypeEnum } from '../enums/form-input-type.enum';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "primeng/inputtext";
import * as i4 from "primeng/iconfield";
import * as i5 from "primeng/inputicon";
export class PTTextInputComponent {
constructor() {
this.characterCount = 0;
}
ngOnInit() {
this.setupControl();
this.updateCharacterCount();
}
setupControl() {
const control = this.formGroup.get(this.formField.name);
if (control) {
const validators = this.getValidators();
control.setValidators(validators);
setTimeout(() => {
if (this.formField.disabled) {
control.disable({ emitEvent: false });
}
else {
control.enable({ emitEvent: false });
control.valueChanges.subscribe(() => {
this.updateCharacterCount();
});
}
control.updateValueAndValidity({ emitEvent: false });
});
}
}
updateCharacterCount() {
const control = this.formGroup.get(this.formField.name);
if (control && control.value !== null) {
this.characterCount = control.value ? control.value.length : 0;
}
else {
this.characterCount = 0;
}
}
getInputType() {
switch (this.formField.type) {
case FormInputTypeEnum.PASSWORD:
return 'password';
case FormInputTypeEnum.NUMBER:
return 'number';
default:
return 'text';
}
}
getValidators() {
const validators = [];
if (this.formField.required) {
validators.push(Validators.required);
}
if (this.formField.minLength !== undefined) {
validators.push(Validators.minLength(this.formField.minLength));
}
if (this.formField.maxLength !== undefined) {
validators.push(Validators.maxLength(this.formField.maxLength));
}
if (this.formField.inputValidation) {
validators.push(this.validateWithInputValidation(this.formField.inputValidation));
}
return validators;
}
validateWithInputValidation(inputValidation) {
return Validators.pattern(new RegExp(inputValidation));
}
getErrorMessage() {
const control = this.formGroup.get(this.formField.name);
if (control?.hasError('required')) {
return `${this.formField.label} is required`;
}
else if (control?.hasError('minlength')) {
return `${this.formField.label} must be at least ${this.formField.minLength} characters`;
}
else if (control?.hasError('maxlength')) {
return `${this.formField.label} must be at most ${this.formField.maxLength} characters`;
}
else if (control?.hasError('pattern')) {
return `${this.formField.label} is invalid`;
}
return '';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTTextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTTextInputComponent, selector: "pt-text-input", inputs: { formGroup: "formGroup", formField: "formField" }, ngImport: i0, template: "<div\n [formGroup]=\"formGroup\"\n class=\"form-field\"\n [ngStyle]=\"{\n width: formField.width || '100%',\n height: formField.height || 'auto'\n }\"\n *ngIf=\"!formField.hidden\"\n>\n <label *ngIf=\"formField.label\">{{ formField.label }}</label>\n\n <ng-container *ngIf=\"formField.iconClass; else noIcon\">\n <p-iconField [iconPosition]=\"formField.iconPosition || 'left'\">\n <p-inputIcon\n *ngIf=\"formField.iconClass\"\n [styleClass]=\"formField.iconClass\"\n ></p-inputIcon>\n <input\n [type]=\"getInputType()\"\n pInputText\n [formControlName]=\"formField.name\"\n [placeholder]=\"formField.placeholder ?? ''\"\n [attr.minlength]=\"formField.minLength\"\n [attr.maxlength]=\"formField.maxLength\"\n [ngStyle]=\"{\n width: formField.width || '100%',\n height: formField.height || 'auto'\n }\"\n />\n </p-iconField>\n </ng-container>\n\n <ng-template #noIcon>\n <input\n [type]=\"getInputType()\"\n pInputText\n [formControlName]=\"formField.name\"\n [placeholder]=\"formField.placeholder ?? ''\"\n [attr.minlength]=\"formField.minLength\"\n [attr.maxlength]=\"formField.maxLength\"\n [ngStyle]=\"{\n width: formField.width || '100%',\n height: formField.height || 'auto'\n }\"\n />\n </ng-template>\n\n <div class=\"form-info-row\">\n <small\n *ngIf=\"\n formGroup.get(formField.name)?.invalid &&\n formGroup.get(formField.name)?.touched\n \"\n class=\"p-error\"\n >\n {{ getErrorMessage() }}\n </small>\n <div class=\"spacer\"></div>\n <div\n *ngIf=\"!formField.disabled && formField.maxLength !== undefined\"\n class=\"character-counter\"\n >\n {{ characterCount }}/{{ formField.maxLength }} characters\n </div>\n </div>\n</div>\n", styles: [".form-field{position:relative}.form-field label{display:block;margin-bottom:.5rem;font-weight:700;font-size:1rem}.form-info-row{display:flex;justify-content:space-between;align-items:center;margin-top:.5rem}.spacer{flex-grow:1}.character-counter{font-size:.8rem;color:#888;text-align:right;margin-left:auto}.p-error{font-size:.8rem;color:#f44336}input:focus{outline:none;box-shadow:none;border-color:inherit}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i4.IconField, selector: "p-iconField", inputs: ["iconPosition"] }, { kind: "component", type: i5.InputIcon, selector: "p-inputIcon", inputs: ["styleClass"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTTextInputComponent, decorators: [{
type: Component,
args: [{ selector: 'pt-text-input', template: "<div\n [formGroup]=\"formGroup\"\n class=\"form-field\"\n [ngStyle]=\"{\n width: formField.width || '100%',\n height: formField.height || 'auto'\n }\"\n *ngIf=\"!formField.hidden\"\n>\n <label *ngIf=\"formField.label\">{{ formField.label }}</label>\n\n <ng-container *ngIf=\"formField.iconClass; else noIcon\">\n <p-iconField [iconPosition]=\"formField.iconPosition || 'left'\">\n <p-inputIcon\n *ngIf=\"formField.iconClass\"\n [styleClass]=\"formField.iconClass\"\n ></p-inputIcon>\n <input\n [type]=\"getInputType()\"\n pInputText\n [formControlName]=\"formField.name\"\n [placeholder]=\"formField.placeholder ?? ''\"\n [attr.minlength]=\"formField.minLength\"\n [attr.maxlength]=\"formField.maxLength\"\n [ngStyle]=\"{\n width: formField.width || '100%',\n height: formField.height || 'auto'\n }\"\n />\n </p-iconField>\n </ng-container>\n\n <ng-template #noIcon>\n <input\n [type]=\"getInputType()\"\n pInputText\n [formControlName]=\"formField.name\"\n [placeholder]=\"formField.placeholder ?? ''\"\n [attr.minlength]=\"formField.minLength\"\n [attr.maxlength]=\"formField.maxLength\"\n [ngStyle]=\"{\n width: formField.width || '100%',\n height: formField.height || 'auto'\n }\"\n />\n </ng-template>\n\n <div class=\"form-info-row\">\n <small\n *ngIf=\"\n formGroup.get(formField.name)?.invalid &&\n formGroup.get(formField.name)?.touched\n \"\n class=\"p-error\"\n >\n {{ getErrorMessage() }}\n </small>\n <div class=\"spacer\"></div>\n <div\n *ngIf=\"!formField.disabled && formField.maxLength !== undefined\"\n class=\"character-counter\"\n >\n {{ characterCount }}/{{ formField.maxLength }} characters\n </div>\n </div>\n</div>\n", styles: [".form-field{position:relative}.form-field label{display:block;margin-bottom:.5rem;font-weight:700;font-size:1rem}.form-info-row{display:flex;justify-content:space-between;align-items:center;margin-top:.5rem}.spacer{flex-grow:1}.character-counter{font-size:.8rem;color:#888;text-align:right;margin-left:auto}.p-error{font-size:.8rem;color:#f44336}input:focus{outline:none;box-shadow:none;border-color:inherit}\n"] }]
}], propDecorators: { formGroup: [{
type: Input
}], formField: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtdGV4dC1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LXRleHQtaW5wdXQvcHQtdGV4dC1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LXRleHQtaW5wdXQvcHQtdGV4dC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBRUwsVUFBVSxHQUdYLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7QUFRbEUsTUFBTSxPQUFPLG9CQUFvQjtJQUxqQztRQVNFLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO0tBcUY1QjtJQW5GQyxRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQWdCLENBQUM7UUFDdkUsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRWxDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUM1QixPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUss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LElBQUksT0FBTyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUsscUJBQXFCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxhQUFhLENBQUM7UUFDM0YsQ0FBQzthQUFNLElBQUksT0FBTyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxhQUFhLENBQUM7UUFDMUYsQ0FBQzthQUFNLElBQUksT0FBTyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssYUFBYSxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7K0dBeEZVLG9CQUFvQjttR0FBcEIsb0JBQW9CLGlIQ2pCakMsZzNEQWtFQTs7NEZEakRhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxlQUFlOzhCQUtoQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1Hcm91cCxcbiAgVmFsaWRhdG9ycyxcbiAgVmFsaWRhdG9yRm4sXG4gIEZvcm1Db250cm9sLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJbnB1dFZhbGlkYXRpb25FbnVtIH0gZnJvbSAnLi4vZW51bXMvaW5wdXQtdmFsaWRhdGlvbi5lbnVtJztcbmltcG9ydCB7IEZvcm1UZXh0RmllbGQgfSBmcm9tICcuLi9tb2RlbHMvZm9ybS10ZXh0LWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IEZvcm1JbnB1dFR5cGVFbnVtIH0gZnJvbSAnLi4vZW51bXMvZm9ybS1pbnB1dC10eXBlLmVudW0nO1xuaW1wb3J0IHsgQ2FyZENvbmZpZyB9IGZyb20gJy4uL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3B0LXRleHQtaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHQtdGV4dC1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3B0LXRleHQtaW5wdXQuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQVFRleHRJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGZvcm1Hcm91cCE6IEZvcm1Hcm91cDtcbiAgQElucHV0KCkgZm9ybUZpZWxkITogRm9ybVRleHRGaWVsZDtcblxuICBjaGFyYWN0ZXJDb3VudDogbnVtYmVyID0gMDtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldHVwQ29udHJvbCgpO1xuICAgIHRoaXMudXBkYXRlQ2hhcmFjdGVyQ291bnQoKTtcbiAgfVxuXG4gIHNldHVwQ29udHJvbCgpIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KHRoaXMuZm9ybUZpZWxkLm5hbWUpIGFzIEZvcm1Db250cm9sO1xuICAgIGlmIChjb250cm9sKSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3JzID0gdGhpcy5nZXRWYWxpZGF0b3JzKCk7XG4gICAgICBjb250cm9sLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5mb3JtRmllbGQuZGlzYWJsZWQpIHtcbiAgICAgICAgICBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICBjb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGFyYWN0ZXJDb3VudCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDaGFyYWN0ZXJDb3VudCgpIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KHRoaXMuZm9ybUZpZWxkLm5hbWUpIGFzIEZvcm1Db250cm9sO1xuICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wudmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuY2hhcmFjdGVyQ291bnQgPSBjb250cm9sLnZhbHVlID8gY29udHJvbC52YWx1ZS5sZW5ndGggOiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoYXJhY3RlckNvdW50ID0gMDtcbiAgICB9XG4gIH1cblxuICBnZXRJbnB1dFR5cGUoKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMuZm9ybUZpZWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgRm9ybUlucHV0VHlwZUVudW0uUEFTU1dPUkQ6XG4gICAgICAgIHJldHVybiAncGFzc3dvcmQnO1xuICAgICAgY2FzZSBGb3JtSW5wdXRUeXBlRW51bS5OVU1CRVI6XG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRWYWxpZGF0b3JzKCk6IFZhbGlkYXRvckZuW10ge1xuICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcbiAgICBpZiAodGhpcy5mb3JtRmllbGQucmVxdWlyZWQpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9ybUZpZWxkLm1pbkxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5mb3JtRmllbGQubWluTGVuZ3RoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvcm1GaWVsZC5tYXhMZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMuZm9ybUZpZWxkLm1heExlbmd0aCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb3JtRmllbGQuaW5wdXRWYWxpZGF0aW9uKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goXG4gICAgICAgIHRoaXMudmFsaWRhdGVXaXRoSW5wdXRWYWxpZGF0aW9uKHRoaXMuZm9ybUZpZWxkLmlucHV0VmFsaWRhdGlvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVdpdGhJbnB1dFZhbGlkYXRpb24oXG4gICAgaW5wdXRWYWxpZGF0aW9uOiBJbnB1dFZhbGlkYXRpb25FbnVtXG4gICk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gVmFsaWRhdG9ycy5wYXR0ZXJuKG5ldyBSZWdFeHAoaW5wdXRWYWxpZGF0aW9uKSk7XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KHRoaXMuZm9ybUZpZWxkLm5hbWUpO1xuICAgIGlmIChjb250cm9sPy5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuZm9ybUZpZWxkLmxhYmVsfSBpcyByZXF1aXJlZGA7XG4gICAgfSBlbHNlIGlmIChjb250cm9sPy5oYXNFcnJvcignbWlubGVuZ3RoJykpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmZvcm1GaWVsZC5sYWJlbH0gbXVzdCBiZSBhdCBsZWFzdCAke3RoaXMuZm9ybUZpZWxkLm1pbkxlbmd0aH0gY2hhcmFjdGVyc2A7XG4gICAgfSBlbHNlIGlmIChjb250cm9sPy5oYXNFcnJvcignbWF4bGVuZ3RoJykpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmZvcm1GaWVsZC5sYWJlbH0gbXVzdCBiZSBhdCBtb3N0ICR7dGhpcy5mb3JtRmllbGQubWF4TGVuZ3RofSBjaGFyYWN0ZXJzYDtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2w/Lmhhc0Vycm9yKCdwYXR0ZXJuJykpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmZvcm1GaWVsZC5sYWJlbH0gaXMgaW52YWxpZGA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxufVxuIiwiPGRpdlxuICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gIGNsYXNzPVwiZm9ybS1maWVsZFwiXG4gIFtuZ1N0eWxlXT1cIntcbiAgICB3aWR0aDogZm9ybUZpZWxkLndpZHRoIHx8ICcxMDAlJyxcbiAgICBoZWlnaHQ6IGZvcm1GaWVsZC5oZWlnaHQgfHwgJ2F1dG8nXG4gIH1cIlxuICAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCJcbj5cbiAgPGxhYmVsICpuZ0lmPVwiZm9ybUZpZWxkLmxhYmVsXCI+e3sgZm9ybUZpZWxkLmxhYmVsIH19PC9sYWJlbD5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUZpZWxkLmljb25DbGFzczsgZWxzZSBub0ljb25cIj5cbiAgICA8cC1pY29uRmllbGQgW2ljb25Qb3NpdGlvbl09XCJmb3JtRmllbGQuaWNvblBvc2l0aW9uIHx8ICdsZWZ0J1wiPlxuICAgICAgPHAtaW5wdXRJY29uXG4gICAgICAgICpuZ0lmPVwiZm9ybUZpZWxkLmljb25DbGFzc1wiXG4gICAgICAgIFtzdHlsZUNsYXNzXT1cImZvcm1GaWVsZC5pY29uQ2xhc3NcIlxuICAgICAgPjwvcC1pbnB1dEljb24+XG4gICAgICA8aW5wdXRcbiAgICAgICAgW3R5cGVdPVwiZ2V0SW5wdXRUeXBlKClcIlxuICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZm9ybUZpZWxkLm5hbWVcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZm9ybUZpZWxkLnBsYWNlaG9sZGVyID8/ICcnXCJcbiAgICAgICAgW2F0dHIubWlubGVuZ3RoXT1cImZvcm1GaWVsZC5taW5MZW5ndGhcIlxuICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwiZm9ybUZpZWxkLm1heExlbmd0aFwiXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICB3aWR0aDogZm9ybUZpZWxkLndpZHRoIHx8ICcxMDAlJyxcbiAgICAgICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5oZWlnaHQgfHwgJ2F1dG8nXG4gICAgICAgIH1cIlxuICAgICAgLz5cbiAgICA8L3AtaWNvbkZpZWxkPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGUgI25vSWNvbj5cbiAgICA8aW5wdXRcbiAgICAgIFt0eXBlXT1cImdldElucHV0VHlwZSgpXCJcbiAgICAgIHBJbnB1dFRleHRcbiAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZm9ybUZpZWxkLm5hbWVcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cImZvcm1GaWVsZC5wbGFjZWhvbGRlciA/PyAnJ1wiXG4gICAgICBbYXR0ci5taW5sZW5ndGhdPVwiZm9ybUZpZWxkLm1pbkxlbmd0aFwiXG4gICAgICBbYXR0ci5tYXhsZW5ndGhdPVwiZm9ybUZpZWxkLm1heExlbmd0aFwiXG4gICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgIHdpZHRoOiBmb3JtRmllbGQud2lkdGggfHwgJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5oZWlnaHQgfHwgJ2F1dG8nXG4gICAgICB9XCJcbiAgICAvPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxkaXYgY2xhc3M9XCJmb3JtLWluZm8tcm93XCI+XG4gICAgPHNtYWxsXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBmb3JtR3JvdXAuZ2V0KGZvcm1GaWVsZC5uYW1lKT8uaW52YWxpZCAmJlxuICAgICAgICBmb3JtR3JvdXAuZ2V0KGZvcm1GaWVsZC5uYW1lKT8udG91Y2hlZFxuICAgICAgXCJcbiAgICAgIGNsYXNzPVwicC1lcnJvclwiXG4gICAgPlxuICAgICAge3sgZ2V0RXJyb3JNZXNzYWdlKCkgfX1cbiAgICA8L3NtYWxsPlxuICAgIDxkaXYgY2xhc3M9XCJzcGFjZXJcIj48L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cIiFmb3JtRmllbGQuZGlzYWJsZWQgJiYgZm9ybUZpZWxkLm1heExlbmd0aCAhPT0gdW5kZWZpbmVkXCJcbiAgICAgIGNsYXNzPVwiY2hhcmFjdGVyLWNvdW50ZXJcIlxuICAgID5cbiAgICAgIHt7IGNoYXJhY3RlckNvdW50IH19L3t7IGZvcm1GaWVsZC5tYXhMZW5ndGggfX0gY2hhcmFjdGVyc1xuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19