UNPKG

ngx-antd-form-builder

Version:

Simple Drag&Drop form builder using ng-zorro-antd

92 lines 48.7 kB
import { Component, Input } from '@angular/core'; import { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { NzFormModule } from 'ng-zorro-antd/form'; import { NzInputModule } from 'ng-zorro-antd/input'; import { NzDividerModule } from 'ng-zorro-antd/divider'; import { NzRateModule } from 'ng-zorro-antd/rate'; import { NzSelectModule } from 'ng-zorro-antd/select'; import { CommonModule } from '@angular/common'; import { DesignFormItemCheckboxComponent } from '../design-form-item-checkbox/design-form-item-checkbox.component'; import { DesignFormItemRadioComponent } from '../design-form-item-radio/design-form-item-radio.component'; import { NzInputNumberModule } from 'ng-zorro-antd/input-number'; import { HasRulePipe } from '../pipes/has-rule.pipe'; import { NzIconModule } from 'ng-zorro-antd/icon'; import { NzSliderModule } from 'ng-zorro-antd/slider'; import { NzSwitchModule } from 'ng-zorro-antd/switch'; import { NzAlertModule } from 'ng-zorro-antd/alert'; import { NzDatePickerModule } from 'ng-zorro-antd/date-picker'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/common"; import * as i3 from "ng-zorro-antd/input"; import * as i4 from "ng-zorro-antd/input-number"; import * as i5 from "ng-zorro-antd/grid"; import * as i6 from "ng-zorro-antd/form"; import * as i7 from "ng-zorro-antd/divider"; import * as i8 from "ng-zorro-antd/rate"; import * as i9 from "ng-zorro-antd/select"; import * as i10 from "ng-zorro-antd/icon"; import * as i11 from "ng-zorro-antd/slider"; import * as i12 from "ng-zorro-antd/switch"; import * as i13 from "ng-zorro-antd/alert"; import * as i14 from "ng-zorro-antd/date-picker"; export class DesignFormItemComponent { get layoutConfig() { return this.record.options?.overrideLayout ? this.record.options : this.formConfig; } constructor() { this.infinity = Infinity; this.captchaTooltipIcon = { type: 'info-circle', theme: 'twotone' }; } get isCol() { return this.formConfig.layout === 'horizontal' && this.formConfig.labelLayout === 'flex'; } get isFlex() { return this.formConfig.layout === 'horizontal' && this.formConfig.labelLayout !== 'flex'; } get required() { return this.record['rules'] && this.record['rules'][0] && this.record['rules'][0]['required'] === true; } ngOnInit() { } ngOnChanges(changes) { if (!this.form && this.record && this.record.key) { this.form = new UntypedFormGroup({ [this.record.key]: new UntypedFormControl() }); } } clearValue() { this.form.get(this.record.key).setValue(''); } getValue() { return this.form.get(this.record.key).value; } valueLengthGtZero() { const value = this.getValue(); return value && value.length; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DesignFormItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.10", type: DesignFormItemComponent, isStandalone: true, selector: "app-design-form-item", inputs: { record: "record", formConfig: "formConfig", form: "form" }, usesOnChanges: true, ngImport: i0, template: "<ng-container [formGroup]=\"form\">\r\n <nz-form-item *ngIf=\"\r\n record.type === 'input' ||\r\n record.type === 'textarea' ||\r\n record.type === 'number' ||\r\n record.type === 'radio' ||\r\n record.type === 'checkbox' ||\r\n record.type === 'select' ||\r\n record.type === 'rate' ||\r\n record.type === 'switch' ||\r\n record.type === 'date' ||\r\n record.type === 'slider'\"\r\n [ngStyle]=\"isFlex ? { display: 'flex' }:{}\">\r\n <nz-form-label\r\n *ngIf=\"isFlex && !record.help\"\r\n [ngStyle]=\"{ width: layoutConfig.labelWidth + 'px'}\"\r\n [nzRequired]=\"required\"\r\n >{{record.label}}</nz-form-label>\r\n <nz-form-label\r\n *ngIf=\"isFlex && record.help\"\r\n [ngStyle]=\"{ width: layoutConfig.labelWidth + 'px'}\"\r\n [nzTooltipTitle]=\"record.help\"\r\n [nzRequired]=\"required\"\r\n >{{record.label}}</nz-form-label>\r\n <nz-form-label [title]=\"record.label\"\r\n *ngIf=\"!isFlex && !record.help\"\r\n [nzXs]=\"isCol && layoutConfig.labelCol.xs\"\r\n [nzSm]=\"isCol && layoutConfig.labelCol.sm\"\r\n [nzMd]=\"isCol && layoutConfig.labelCol.md\"\r\n [nzLg]=\"isCol && layoutConfig.labelCol.lg\"\r\n [nzXl]=\"isCol && layoutConfig.labelCol.xl\"\r\n [nzXXl]=\"isCol && layoutConfig.labelCol.xxl\"\r\n [nzRequired]=\"required\"\r\n >{{record.label}}</nz-form-label>\r\n <nz-form-label [title]=\"record.label\"\r\n *ngIf=\"!isFlex && record.help\"\r\n [nzXs]=\"isCol && layoutConfig.labelCol.xs\"\r\n [nzSm]=\"isCol && layoutConfig.labelCol.sm\"\r\n [nzMd]=\"isCol && layoutConfig.labelCol.md\"\r\n [nzLg]=\"isCol && layoutConfig.labelCol.lg\"\r\n [nzXl]=\"isCol && layoutConfig.labelCol.xl\"\r\n [nzXXl]=\"isCol && layoutConfig.labelCol.xxl\"\r\n nz-tooltip\r\n [nzTooltipTitle]=\"record.help\"\r\n [nzTooltipIcon]=\"captchaTooltipIcon\"\r\n [nzRequired]=\"required\"\r\n >{{record.label}}</nz-form-label>\r\n <nz-form-control\r\n [ngStyle]=\"isFlex ? { 'flex-grow': '1', width: 'auto' } : {}\"\r\n [nzXs]=\"isCol && layoutConfig.wrapperCol.xs\"\r\n [nzSm]=\"isCol && layoutConfig.wrapperCol.sm\"\r\n [nzMd]=\"isCol && layoutConfig.wrapperCol.md\"\r\n [nzLg]=\"isCol && layoutConfig.wrapperCol.lg\"\r\n [nzXl]=\"isCol && layoutConfig.wrapperCol.xl\"\r\n [nzXXl]=\"isCol && layoutConfig.wrapperCol.xxl\"\r\n [nzHasFeedback]=\"record.rules | hasRule\"\r\n [nzErrorTip]=\"userErrorTpl\">\r\n <ng-template #userErrorTpl let-control>\r\n <ng-container>\r\n {{control.errors?.message}}\r\n </ng-container>\r\n <!-- <ng-container *ngIf=\"control.hasError('duplicated')\">\r\n The username is redundant!\r\n </ng-container> -->\r\n </ng-template>\r\n <ng-container *ngIf=\"record.type == 'input'\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplateInfo\" [ngStyle]=\"{'width': record.options.width}\">\r\n <input *ngIf=\"record.options.maxLength\" nz-input [formControlName]=\"record.key\"\r\n [placeholder]=\"record.options.placeholder || ''\"\r\n [maxLength]=\"record.options.maxLength\" />\r\n <input *ngIf=\"!record.options.maxLength\" nz-input [formControlName]=\"record.key\" \r\n [placeholder]=\"record.options.placeholder || ''\" />\r\n </nz-input-group>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'textarea'\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplateInfo\" class=\"ant-input-affix-wrapper-textarea-with-clear-btn\" [ngStyle]=\"{'width': record.options.width}\">\r\n <textarea nz-input *ngIf=\"record.options.maxLength\" [formControlName]=\"record.key\"\r\n [placeholder]=\"record.options.placeholder || ''\" [maxLength]=\"record.options.maxLength\"\r\n [nzAutosize]=\"{ minRows: record.options.minRows, maxRows: record.options.maxRows }\"></textarea>\r\n <textarea nz-input *ngIf=\"!record.options.maxLength\" [formControlName]=\"record.key\" \r\n [placeholder]=\"record.options.placeholder || ''\" [nzAutosize]=\"{ minRows: record.options.minRows, maxRows: record.options.maxRows }\"\r\n ></textarea>\r\n </nz-input-group>\r\n </ng-container>\r\n <ng-template #suffixTemplateInfo>\r\n <i nz-icon\r\n class=\"ant-input-textarea-clear-icon\"\r\n style=\"margin-right: 4px;\"\r\n nzType=\"close-circle\"\r\n *ngIf=\"(record.type == 'textarea' || record.type == 'input') && record.options.clearable && valueLengthGtZero()\"\r\n (click)=\"clearValue()\"\r\n ></i>\r\n </ng-template>\r\n\r\n <ng-container *ngIf=\"record.type == 'number'\">\r\n <nz-input-number [formControlName]=\"record.key\" [ngStyle]=\"{'width': record.options.width}\"\r\n [nzPlaceHolder]=\"record.options.placeholder\" \r\n [nzPrecision]=\"record.options.precision\" [nzStep]=\"record.options.step\"\r\n ></nz-input-number>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'radio'\">\r\n <app-design-form-item-radio [formControlName]=\"record.key\" [record]=\"record\"></app-design-form-item-radio>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'checkbox'\">\r\n <!-- <nz-checkbox-group [ngModel]=\"record.options.options\" (ngModelChange)=\"log($event)\"></nz-checkbox-group> -->\r\n <app-design-form-item-checkbox \r\n [formControlName]=\"record.key\" [options]=\"record.options.options\"></app-design-form-item-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'select'\">\r\n <nz-select [formControlName]=\"record.key\">\r\n <nz-option *ngFor=\"let lbl of record.options.options\" \r\n [nzValue]=\"lbl.value\" [nzLabel]=\"lbl.label\"></nz-option>\r\n </nz-select>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'rate'\">\r\n <nz-rate [formControlName]=\"record.key\" [nzAllowHalf]=\"record.options.allowHalf\"></nz-rate>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'slider'\">\r\n <nz-slider\r\n [formControlName]=\"record.key\"></nz-slider>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'switch'\">\r\n <nz-switch\r\n [formControlName]=\"record.key\"></nz-switch>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'date'\">\r\n <nz-date-picker\r\n [ngStyle]=\"{'width': record.options.width}\"\r\n [formControlName]=\"record.key\"\r\n [nzMode]=\"record.options.mode\"\r\n [nzPlaceHolder]=\"record.options.placeholder\"\r\n ></nz-date-picker>\r\n </ng-container>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <ng-container *ngIf=\"record.type === 'divider'\">\r\n <nz-divider [nzText]=\"record.label\" [nzOrientation]=\"record.options.orientation || 'center'\"></nz-divider>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type === 'alert'\">\r\n <nz-form-item>\r\n <nz-form-control>\r\n <nz-alert [nzMessage]=\"record.label\"\r\n [nzDescription]=\"record.options.description\"\r\n [nzType]=\"record.options.type\"\r\n [nzShowIcon]=\"record.options.showIcon\"\r\n [nzCloseable]=\"record.options.closable\"\r\n [nzBanner]=\"record.options.banner\">\r\n </nz-alert>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type === 'text'\">\r\n <nz-form-item>\r\n <nz-form-control>\r\n <div [ngStyle]=\"{ textAlign: record.options.textAlign }\">\r\n <label\r\n [ngClass]=\"{ 'ant-form-item-required': record.options.showRequiredMark }\"\r\n [ngStyle]=\"{\r\n fontFamily: record.options.fontFamily,\r\n fontSize: record.options.fontSize\r\n }\"\r\n >\r\n {{record.label}}\r\n </label>\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-container>\r\n</ng-container>", styles: [":host ::ng-deep .ant-input-disabled{color:#000c!important}label.flex{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;display:flex;align-items:center;padding-left:4px}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { 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: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i3.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i3.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i3.NzAutosizeDirective, selector: "textarea[nzAutosize]", inputs: ["nzAutosize"], exportAs: ["nzAutosize"] }, { kind: "directive", type: i3.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "ngmodule", type: NzInputNumberModule }, { kind: "component", type: i4.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecision", "nzPrecisionMode", "nzPlaceHolder", "nzStatus", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBorderless", "nzFormatter"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { kind: "ngmodule", type: NzFormModule }, { kind: "directive", type: i5.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i5.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "component", type: i6.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i6.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i6.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "ngmodule", type: NzDividerModule }, { kind: "component", type: i7.NzDividerComponent, selector: "nz-divider", inputs: ["nzText", "nzType", "nzOrientation", "nzDashed", "nzPlain"], exportAs: ["nzDivider"] }, { kind: "ngmodule", type: NzRateModule }, { kind: "component", type: i8.NzRateComponent, selector: "nz-rate", inputs: ["nzAllowClear", "nzAllowHalf", "nzDisabled", "nzAutoFocus", "nzCharacter", "nzCount", "nzTooltips"], outputs: ["nzOnBlur", "nzOnFocus", "nzOnHoverChange", "nzOnKeyDown"], exportAs: ["nzRate"] }, { kind: "ngmodule", type: NzSelectModule }, { kind: "component", type: i9.NzOptionComponent, selector: "nz-option", inputs: ["nzTitle", "nzLabel", "nzValue", "nzKey", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }, { kind: "component", type: i9.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzPlacement", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzSelectOnTab", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i10.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzSliderModule }, { kind: "component", type: i11.NzSliderComponent, selector: "nz-slider", inputs: ["nzDisabled", "nzDots", "nzIncluded", "nzRange", "nzVertical", "nzReverse", "nzDefaultValue", "nzMarks", "nzMax", "nzMin", "nzStep", "nzTooltipVisible", "nzTooltipPlacement", "nzTipFormatter"], outputs: ["nzOnAfterChange"], exportAs: ["nzSlider"] }, { kind: "ngmodule", type: NzSwitchModule }, { kind: "component", type: i12.NzSwitchComponent, selector: "nz-switch", inputs: ["nzLoading", "nzDisabled", "nzControl", "nzCheckedChildren", "nzUnCheckedChildren", "nzSize", "nzId"], exportAs: ["nzSwitch"] }, { kind: "ngmodule", type: NzAlertModule }, { kind: "component", type: i13.NzAlertComponent, selector: "nz-alert", inputs: ["nzAction", "nzCloseText", "nzIconType", "nzMessage", "nzDescription", "nzType", "nzCloseable", "nzShowIcon", "nzBanner", "nzNoAnimation", "nzIcon"], outputs: ["nzOnClose"], exportAs: ["nzAlert"] }, { kind: "ngmodule", type: NzDatePickerModule }, { kind: "component", type: i14.NzDatePickerComponent, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker", inputs: ["nzAllowClear", "nzAutoFocus", "nzDisabled", "nzBorderless", "nzInputReadOnly", "nzInline", "nzOpen", "nzDisabledDate", "nzLocale", "nzPlaceHolder", "nzPopupStyle", "nzDropdownClassName", "nzSize", "nzStatus", "nzFormat", "nzDateRender", "nzDisabledTime", "nzRenderExtraFooter", "nzShowToday", "nzMode", "nzShowNow", "nzRanges", "nzDefaultPickerValue", "nzSeparator", "nzSuffixIcon", "nzBackdrop", "nzId", "nzPlacement", "nzShowWeekNumber", "nzShowTime"], outputs: ["nzOnPanelChange", "nzOnCalendarChange", "nzOnOk", "nzOnOpenChange"], exportAs: ["nzDatePicker"] }, { kind: "component", type: DesignFormItemCheckboxComponent, selector: "app-design-form-item-checkbox", inputs: ["options"] }, { kind: "component", type: DesignFormItemRadioComponent, selector: "app-design-form-item-radio", inputs: ["record"] }, { kind: "pipe", type: HasRulePipe, name: "hasRule" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DesignFormItemComponent, decorators: [{ type: Component, args: [{ standalone: true, selector: 'app-design-form-item', imports: [ ReactiveFormsModule, CommonModule, NzInputModule, NzInputNumberModule, NzFormModule, NzDividerModule, NzRateModule, NzSelectModule, NzIconModule, NzSliderModule, NzSwitchModule, NzAlertModule, NzDatePickerModule, DesignFormItemCheckboxComponent, DesignFormItemRadioComponent, HasRulePipe ], template: "<ng-container [formGroup]=\"form\">\r\n <nz-form-item *ngIf=\"\r\n record.type === 'input' ||\r\n record.type === 'textarea' ||\r\n record.type === 'number' ||\r\n record.type === 'radio' ||\r\n record.type === 'checkbox' ||\r\n record.type === 'select' ||\r\n record.type === 'rate' ||\r\n record.type === 'switch' ||\r\n record.type === 'date' ||\r\n record.type === 'slider'\"\r\n [ngStyle]=\"isFlex ? { display: 'flex' }:{}\">\r\n <nz-form-label\r\n *ngIf=\"isFlex && !record.help\"\r\n [ngStyle]=\"{ width: layoutConfig.labelWidth + 'px'}\"\r\n [nzRequired]=\"required\"\r\n >{{record.label}}</nz-form-label>\r\n <nz-form-label\r\n *ngIf=\"isFlex && record.help\"\r\n [ngStyle]=\"{ width: layoutConfig.labelWidth + 'px'}\"\r\n [nzTooltipTitle]=\"record.help\"\r\n [nzRequired]=\"required\"\r\n >{{record.label}}</nz-form-label>\r\n <nz-form-label [title]=\"record.label\"\r\n *ngIf=\"!isFlex && !record.help\"\r\n [nzXs]=\"isCol && layoutConfig.labelCol.xs\"\r\n [nzSm]=\"isCol && layoutConfig.labelCol.sm\"\r\n [nzMd]=\"isCol && layoutConfig.labelCol.md\"\r\n [nzLg]=\"isCol && layoutConfig.labelCol.lg\"\r\n [nzXl]=\"isCol && layoutConfig.labelCol.xl\"\r\n [nzXXl]=\"isCol && layoutConfig.labelCol.xxl\"\r\n [nzRequired]=\"required\"\r\n >{{record.label}}</nz-form-label>\r\n <nz-form-label [title]=\"record.label\"\r\n *ngIf=\"!isFlex && record.help\"\r\n [nzXs]=\"isCol && layoutConfig.labelCol.xs\"\r\n [nzSm]=\"isCol && layoutConfig.labelCol.sm\"\r\n [nzMd]=\"isCol && layoutConfig.labelCol.md\"\r\n [nzLg]=\"isCol && layoutConfig.labelCol.lg\"\r\n [nzXl]=\"isCol && layoutConfig.labelCol.xl\"\r\n [nzXXl]=\"isCol && layoutConfig.labelCol.xxl\"\r\n nz-tooltip\r\n [nzTooltipTitle]=\"record.help\"\r\n [nzTooltipIcon]=\"captchaTooltipIcon\"\r\n [nzRequired]=\"required\"\r\n >{{record.label}}</nz-form-label>\r\n <nz-form-control\r\n [ngStyle]=\"isFlex ? { 'flex-grow': '1', width: 'auto' } : {}\"\r\n [nzXs]=\"isCol && layoutConfig.wrapperCol.xs\"\r\n [nzSm]=\"isCol && layoutConfig.wrapperCol.sm\"\r\n [nzMd]=\"isCol && layoutConfig.wrapperCol.md\"\r\n [nzLg]=\"isCol && layoutConfig.wrapperCol.lg\"\r\n [nzXl]=\"isCol && layoutConfig.wrapperCol.xl\"\r\n [nzXXl]=\"isCol && layoutConfig.wrapperCol.xxl\"\r\n [nzHasFeedback]=\"record.rules | hasRule\"\r\n [nzErrorTip]=\"userErrorTpl\">\r\n <ng-template #userErrorTpl let-control>\r\n <ng-container>\r\n {{control.errors?.message}}\r\n </ng-container>\r\n <!-- <ng-container *ngIf=\"control.hasError('duplicated')\">\r\n The username is redundant!\r\n </ng-container> -->\r\n </ng-template>\r\n <ng-container *ngIf=\"record.type == 'input'\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplateInfo\" [ngStyle]=\"{'width': record.options.width}\">\r\n <input *ngIf=\"record.options.maxLength\" nz-input [formControlName]=\"record.key\"\r\n [placeholder]=\"record.options.placeholder || ''\"\r\n [maxLength]=\"record.options.maxLength\" />\r\n <input *ngIf=\"!record.options.maxLength\" nz-input [formControlName]=\"record.key\" \r\n [placeholder]=\"record.options.placeholder || ''\" />\r\n </nz-input-group>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'textarea'\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplateInfo\" class=\"ant-input-affix-wrapper-textarea-with-clear-btn\" [ngStyle]=\"{'width': record.options.width}\">\r\n <textarea nz-input *ngIf=\"record.options.maxLength\" [formControlName]=\"record.key\"\r\n [placeholder]=\"record.options.placeholder || ''\" [maxLength]=\"record.options.maxLength\"\r\n [nzAutosize]=\"{ minRows: record.options.minRows, maxRows: record.options.maxRows }\"></textarea>\r\n <textarea nz-input *ngIf=\"!record.options.maxLength\" [formControlName]=\"record.key\" \r\n [placeholder]=\"record.options.placeholder || ''\" [nzAutosize]=\"{ minRows: record.options.minRows, maxRows: record.options.maxRows }\"\r\n ></textarea>\r\n </nz-input-group>\r\n </ng-container>\r\n <ng-template #suffixTemplateInfo>\r\n <i nz-icon\r\n class=\"ant-input-textarea-clear-icon\"\r\n style=\"margin-right: 4px;\"\r\n nzType=\"close-circle\"\r\n *ngIf=\"(record.type == 'textarea' || record.type == 'input') && record.options.clearable && valueLengthGtZero()\"\r\n (click)=\"clearValue()\"\r\n ></i>\r\n </ng-template>\r\n\r\n <ng-container *ngIf=\"record.type == 'number'\">\r\n <nz-input-number [formControlName]=\"record.key\" [ngStyle]=\"{'width': record.options.width}\"\r\n [nzPlaceHolder]=\"record.options.placeholder\" \r\n [nzPrecision]=\"record.options.precision\" [nzStep]=\"record.options.step\"\r\n ></nz-input-number>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'radio'\">\r\n <app-design-form-item-radio [formControlName]=\"record.key\" [record]=\"record\"></app-design-form-item-radio>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'checkbox'\">\r\n <!-- <nz-checkbox-group [ngModel]=\"record.options.options\" (ngModelChange)=\"log($event)\"></nz-checkbox-group> -->\r\n <app-design-form-item-checkbox \r\n [formControlName]=\"record.key\" [options]=\"record.options.options\"></app-design-form-item-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'select'\">\r\n <nz-select [formControlName]=\"record.key\">\r\n <nz-option *ngFor=\"let lbl of record.options.options\" \r\n [nzValue]=\"lbl.value\" [nzLabel]=\"lbl.label\"></nz-option>\r\n </nz-select>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'rate'\">\r\n <nz-rate [formControlName]=\"record.key\" [nzAllowHalf]=\"record.options.allowHalf\"></nz-rate>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'slider'\">\r\n <nz-slider\r\n [formControlName]=\"record.key\"></nz-slider>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'switch'\">\r\n <nz-switch\r\n [formControlName]=\"record.key\"></nz-switch>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type == 'date'\">\r\n <nz-date-picker\r\n [ngStyle]=\"{'width': record.options.width}\"\r\n [formControlName]=\"record.key\"\r\n [nzMode]=\"record.options.mode\"\r\n [nzPlaceHolder]=\"record.options.placeholder\"\r\n ></nz-date-picker>\r\n </ng-container>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <ng-container *ngIf=\"record.type === 'divider'\">\r\n <nz-divider [nzText]=\"record.label\" [nzOrientation]=\"record.options.orientation || 'center'\"></nz-divider>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type === 'alert'\">\r\n <nz-form-item>\r\n <nz-form-control>\r\n <nz-alert [nzMessage]=\"record.label\"\r\n [nzDescription]=\"record.options.description\"\r\n [nzType]=\"record.options.type\"\r\n [nzShowIcon]=\"record.options.showIcon\"\r\n [nzCloseable]=\"record.options.closable\"\r\n [nzBanner]=\"record.options.banner\">\r\n </nz-alert>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-container>\r\n <ng-container *ngIf=\"record.type === 'text'\">\r\n <nz-form-item>\r\n <nz-form-control>\r\n <div [ngStyle]=\"{ textAlign: record.options.textAlign }\">\r\n <label\r\n [ngClass]=\"{ 'ant-form-item-required': record.options.showRequiredMark }\"\r\n [ngStyle]=\"{\r\n fontFamily: record.options.fontFamily,\r\n fontSize: record.options.fontSize\r\n }\"\r\n >\r\n {{record.label}}\r\n </label>\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-container>\r\n</ng-container>", styles: [":host ::ng-deep .ant-input-disabled{color:#000c!important}label.flex{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;display:flex;align-items:center;padding-left:4px}\n"] }] }], ctorParameters: () => [], propDecorators: { record: [{ type: Input }], formConfig //="record" : [{ type: Input }], form //: UntypedFormGroup //?? : [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduLWZvcm0taXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYW50ZC1mb3JtLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL2Rlc2lnbi1mb3JtLWl0ZW0vZGVzaWduLWZvcm0taXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYW50ZC1mb3JtLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL2Rlc2lnbi1mb3JtLWl0ZW0vZGVzaWduLWZvcm0taXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUF3QixLQUFLLEVBQXNELE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxZQUFZLEVBQXFCLE1BQU0sb0JBQW9CLENBQUM7QUFFckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQztBQUNuSCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUMxRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFD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QkFabkMsU0FBUztpQ0FDSSxJQUFJLFlBQ04sc0JBQXNCLFdBR3ZCO3dCQUNQLG1CQUFtQixFQUFDLFlBQVk7d0JBQ2hDLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFDLFlBQVk7d0JBQzlFLGNBQWMsRUFBQyxZQUFZLEVBQUMsY0FBYyxFQUFDLGNBQWMsRUFBQyxhQUFhLEVBQUMsa0JBQWtCO3dCQUMxRiwrQkFBK0IsRUFBQyw0QkFBNEIsRUFBQyxXQUFXO3FCQUN6RTt3REFVUSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csVUFBVSxDQUFDLFdBQVc7O3NCQUE5QixLQUFLO2dCQUNHLElBQUksQ0FBQSwwQkFBMEI7O3NCQUF0QyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUsIFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTnpGb3JtTW9kdWxlLCBOekZvcm1Ub29sdGlwSWNvbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvZm9ybSc7XHJcbmltcG9ydCB7IE5neEFudGRGb3JtQnVpbGRlciB9IGZyb20gJy4uLy4uL25neC1hbnRkLWZvcm0tYnVpbGRlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBOeklucHV0TW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pbnB1dCc7XHJcbmltcG9ydCB7IE56RGl2aWRlck1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvZGl2aWRlcic7XHJcbmltcG9ydCB7IE56UmF0ZU1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvcmF0ZSc7XHJcbmltcG9ydCB7IE56U2VsZWN0TW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBEZXNpZ25Gb3JtSXRlbUNoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vZGVzaWduLWZvcm0taXRlbS1jaGVja2JveC9kZXNpZ24tZm9ybS1pdGVtLWNoZWNrYm94LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERlc2lnbkZvcm1JdGVtUmFkaW9Db21wb25lbnQgfSBmcm9tICcuLi9kZXNpZ24tZm9ybS1pdGVtLXJhZGlvL2Rlc2lnbi1mb3JtLWl0ZW0tcmFkaW8uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTnpJbnB1dE51bWJlck1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaW5wdXQtbnVtYmVyJztcclxuaW1wb3J0IHsgSGFzUnVsZVBpcGUgfSBmcm9tICcuLi9waXBlcy9oYXMtcnVsZS5waXBlJztcclxuaW1wb3J0IHsgTnpJY29uTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pY29uJztcclxuaW1wb3J0IHsgTnpTbGlkZXJNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL3NsaWRlcic7XHJcbmltcG9ydCB7IE56U3dpdGNoTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9zd2l0Y2gnO1xyXG5pbXBvcnQgeyBOekFsZXJ0TW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9hbGVydCc7XHJcbmltcG9ydCB7IE56RGF0ZVBpY2tlck1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvZGF0ZS1waWNrZXInO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBzZWxlY3RvcjogJ2FwcC1kZXNpZ24tZm9ybS1pdGVtJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGVzaWduLWZvcm0taXRlbS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGVzaWduLWZvcm0taXRlbS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGltcG9ydHM6IFsgXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLENvbW1vbk1vZHVsZSxcclxuICAgIE56SW5wdXRNb2R1bGUsIE56SW5wdXROdW1iZXJNb2R1bGUsIE56Rm9ybU1vZHVsZSwgTnpEaXZpZGVyTW9kdWxlLE56UmF0ZU1vZHVsZSxcclxuICAgIE56U2VsZWN0TW9kdWxlLE56SWNvbk1vZHVsZSxOelNsaWRlck1vZHVsZSxOelN3aXRjaE1vZHVsZSxOekFsZXJ0TW9kdWxlLE56RGF0ZVBpY2tlck1vZHVsZSxcclxuICAgIERlc2lnbkZvcm1JdGVtQ2hlY2tib3hDb21wb25lbnQsRGVzaWduRm9ybUl0ZW1SYWRpb0NvbXBvbmVudCxIYXNSdWxlUGlwZVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIERlc2lnbkZvcm1JdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xyXG4gIGluZmluaXR5PSBJbmZpbml0eVxyXG4gIGNhcHRjaGFUb29sdGlwSWNvbjogTnpGb3JtVG9vbHRpcEljb24gPSB7XHJcbiAgICB0eXBlOiAnaW5mby1jaXJjbGUnLFxyXG4gICAgdGhlbWU6ICd0d290b25lJ1xyXG4gIH07XHJcbiAgLy9ASW5wdXQoKSBrZXkgLy89XCJyZWNvcmQua2V5XCJcclxuICAvLzpzZWxlY3RJdGVtLnN5bmM9XCJzZWxlY3RJdGVtXCJcclxuICBASW5wdXQoKSByZWNvcmQhOiBOZ3hBbnRkRm9ybUJ1aWxkZXIuQWxsVHlwZSAvLz1cInJlY29yZFwiXHJcbiAgQElucHV0KCkgZm9ybUNvbmZpZyAvLz1cInJlY29yZFwiXHJcbiAgQElucHV0KCkgZm9ybS8vOiBVbnR5cGVkRm9ybUdyb3VwICAvLz8/XHJcblxyXG4gIGdldCBsYXlvdXRDb25maWcoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMucmVjb3JkIGFzIGFueSkub3B0aW9ucz8ub3ZlcnJpZGVMYXlvdXQgPyAodGhpcy5yZWNvcmQgYXMgYW55KS5vcHRpb25zIDogdGhpcy5mb3JtQ29uZmlnO1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihcclxuICApIHt9XHJcblxyXG4gIGdldCBpc0NvbCgpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWcubGF5b3V0ID09PSAnaG9yaXpvbnRhbCcgJiYgdGhpcy5mb3JtQ29uZmlnLmxhYmVsTGF5b3V0ID09PSAnZmxleCdcclxuICB9XHJcbiAgZ2V0IGlzRmxleCgpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWcubGF5b3V0ID09PSAnaG9yaXpvbnRhbCcgJiYgdGhpcy5mb3JtQ29uZmlnLmxhYmVsTGF5b3V0ICE9PSAnZmxleCdcclxuICB9XHJcblxyXG4gIGdldCByZXF1aXJlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnJlY29yZFsncnVsZXMnXSAmJiB0aGlzLnJlY29yZFsncnVsZXMnXVswXSAmJiB0aGlzLnJlY29yZFsncnVsZXMnXVswXVsncmVxdWlyZWQnXSA9PT0gdHJ1ZSBcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gIH1cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZm9ybSAmJiB0aGlzLnJlY29yZCAmJiB0aGlzLnJlY29yZC5rZXkpIHtcclxuICAgICAgdGhpcy5mb3JtID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xyXG4gICAgICAgIFt0aGlzLnJlY29yZC5rZXldOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKClcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgY2xlYXJWYWx1ZSgpIHtcclxuICAgIHRoaXMuZm9ybS5nZXQodGhpcy5yZWNvcmQua2V5KS5zZXRWYWx1ZSgnJylcclxuICB9XHJcblxyXG4gIGdldFZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQodGhpcy5yZWNvcmQua2V5KS52YWx1ZVxyXG4gIH1cclxuXHJcbiAgdmFsdWVMZW5ndGhHdFplcm8oKSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKVxyXG4gICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLmxlbmd0aFxyXG4gIH1cclxufSIsIjxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgPG56LWZvcm0taXRlbSAqbmdJZj1cIlxyXG4gIHJlY29yZC50eXBlID09PSAnaW5wdXQnIHx8XHJcbiAgcmVjb3JkLnR5cGUgPT09ICd0ZXh0YXJlYScgfHxcclxuICByZWNvcmQudHlwZSA9PT0gJ251bWJlcicgfHxcclxuICByZWNvcmQudHlwZSA9PT0gJ3JhZGlvJyB8fFxyXG4gIHJlY29yZC50eXBlID09PSAnY2hlY2tib3gnIHx8XHJcbiAgcmVjb3JkLnR5cGUgPT09ICdzZWxlY3QnIHx8XHJcbiAgcmVjb3JkLnR5cGUgPT09ICdyYXRlJyB8fFxyXG4gIHJlY29yZC50eXBlID09PSAnc3dpdGNoJyB8fFxyXG4gIHJlY29yZC50eXBlID09PSAnZGF0ZScgfHxcclxuICByZWNvcmQudHlwZSA9PT0gJ3NsaWRlcidcIlxyXG4gICAgW25nU3R5bGVdPVwiaXNGbGV4ID8geyBkaXNwbGF5OiAnZmxleCcgfTp7fVwiPlxyXG4gICAgPG56LWZvcm0tbGFiZWxcclxuICAgICAgKm5nSWY9XCJpc0ZsZXggJiYgIXJlY29yZC5oZWxwXCJcclxuICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogbGF5b3V0Q29uZmlnLmxhYmVsV2lkdGggKyAncHgnfVwiXHJcbiAgICAgIFtuelJlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuICAgID57e3JlY29yZC5sYWJlbH19PC9uei1mb3JtLWxhYmVsPlxyXG4gICAgPG56LWZvcm0tbGFiZWxcclxuICAgICAgKm5nSWY9XCJpc0ZsZXggJiYgcmVjb3JkLmhlbHBcIlxyXG4gICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBsYXlvdXRDb25maWcubGFiZWxXaWR0aCArICdweCd9XCJcclxuICAgICAgW256VG9vbHRpcFRpdGxlXT1cInJlY29yZC5oZWxwXCJcclxuICAgICAgW256UmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG4gICAgPnt7cmVjb3JkLmxhYmVsfX08L256LWZvcm0tbGFiZWw+XHJcbiAgICA8bnotZm9ybS1sYWJlbCBbdGl0bGVdPVwicmVjb3JkLmxhYmVsXCJcclxuICAgICAgKm5nSWY9XCIhaXNGbGV4ICYmICFyZWNvcmQuaGVscFwiXHJcbiAgICAgIFtuelhzXT1cImlzQ29sICYmIGxheW91dENvbmZpZy5sYWJlbENvbC54c1wiXHJcbiAgICAgIFtuelNtXT1cImlzQ29sICYmIGxheW91dENvbmZpZy5sYWJlbENvbC5zbVwiXHJcbiAgICAgIFtuek1kXT1cImlzQ29sICYmIGxheW91dENvbmZpZy5sYWJlbENvbC5tZFwiXHJcbiAgICAgIFtuekxnXT1cImlzQ29sICYmIGxheW91dENvbmZpZy5sYWJlbENvbC5sZ1wiXHJcbiAgICAgIFtuelhsXT1cImlzQ29sICYmIGxheW91dENvbmZpZy5sYWJlbENvbC54bFwiXHJcbiAgICAgIFtuelhYbF09XCJpc0NvbCAmJiBsYXlvdXRDb25maWcubGFiZWxDb2wueHhsXCJcclxuICAgICAgW256UmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG4gICAgPnt7cmVjb3JkLmxhYmVsfX08L256LWZvcm0tbGFiZWw+XHJcbiAgICA8bnotZm9ybS1sYWJlbCBbdGl0bGVdPVwicmVjb3JkLmxhYmVsXCJcclxuICAgICAgKm5nSWY9XCIhaXNGbGV4ICYmIHJlY29yZC5oZWxwXCJcclxuICAgICAgW256WHNdPVwiaXNDb2wgJiYgbGF5b3V0Q29uZmlnLmxhYmVsQ29sLnhzXCJcclxuICAgICAgW256U21dPVwiaXNDb2wgJiYgbGF5b3V0Q29uZmlnLmxhYmVsQ29sLnNtXCJcclxuICAgICAgW256TWRdPVwiaXNDb2wgJiYgbGF5b3V0Q29uZmlnLmxhYmVsQ29sLm1kXCJcclxuICAgICAgW256TGddPVwiaXNDb2wgJiYgbGF5b3V0Q29uZmlnLmxhYmVsQ29sLmxnXCJcclxuICAgICAgW256WGxdPVwiaXNDb2wgJiYgbGF5b3V0Q29uZmlnLmxhYmVsQ29sLnhsXCJcclxuICAgICAgW256WFhsXT1cImlzQ29sICYmIGxheW91dENvbmZpZy5sYWJlbENvbC54eGxcIlxyXG4gICAgICBuei10b29sdGlwXHJcbiAgICAgIFtuelRvb2x0aXBUaXRsZV09XCJyZWNvcmQuaGVscFwiXHJcbiAgICAgIFtuelRvb2x0aXBJY29uXT1cImNhcHRjaGFUb29sdGlwSWNvblwiXHJcbiAgICAgIFtuelJlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuICAgID57e3JlY29yZC5sYWJlbH19PC9uei1mb3JtLWxhYmVsPlxyXG4gICAgPG56LWZvcm0tY29udHJvbFxyXG4gICAgICBbbmdTdHlsZV09XCJpc0ZsZXggPyB7ICdmbGV4LWdyb3cnOiAnMScsIHdpZHRoOiAnYXV0bycgfSA6IHt9XCJcclxuICAgICAgW256WHNdPVwiaXNDb2wgJiYgbGF5b3V0Q29uZmlnLndyYXBwZXJDb2wueHNcIlxyXG4gICAgICBbbnpTbV09XCJpc0NvbCAmJiBsYXlvdXRDb25maWcud3JhcHBlckNvbC5zbVwiXHJcbiAgICAgIFtuek1kXT1cImlzQ29sICYmIGxheW91dENvbmZpZy53cmFwcGVyQ29sLm1kXCJcclxuICAgICAgW256TGddPVwiaXNDb2wgJiYgbGF5b3V0Q29uZmlnLndyYXBwZXJDb2wubGdcIlxyXG4gICAgICBbbnpYbF09XCJpc0NvbCAmJiBsYXlvdXRDb25maWcud3JhcHBlckNvbC54bFwiXHJcbiAgICAgIFtuelhYbF09XCJpc0NvbCAmJiBsYXlvdXRDb25maWcud3JhcHBlckNvbC54eGxcIlxyXG4gICAgICBbbnpIYXNGZWVkYmFja109XCJyZWNvcmQucnVsZXMgfCBoYXNSdWxlXCJcclxuICAgICAgW256RXJyb3JUaXBdPVwidXNlckVycm9yVHBsXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjdXNlckVycm9yVHBsIGxldC1jb250cm9sPlxyXG4gICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICB7e2NvbnRyb2wuZXJyb3JzPy5tZXNzYWdlfX1cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLmhhc0Vycm9yKCdkdXBsaWNhdGVkJylcIj5cclxuICAgICAgICAgIFRoZSB1c2VybmFtZSBpcyByZWR1bmRhbnQhXHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNvcmQudHlwZSA9PSAnaW5wdXQnXCI+XHJcbiAgICAgICAgICA8bnotaW5wdXQtZ3JvdXAgW256U3VmZml4XT1cInN1ZmZpeFRlbXBsYXRlSW5mb1wiIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiByZWNvcmQub3B0aW9ucy53aWR0aH1cIj5cclxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicmVjb3JkLm9wdGlvbnMubWF4TGVuZ3RoXCIgbnotaW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJyZWNvcmQua2V5XCJcclxuICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInJlY29yZC5vcHRpb25zLnBsYWNlaG9sZGVyIHx8ICcnXCJcclxuICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cInJlY29yZC5vcHRpb25zLm1heExlbmd0aFwiIC8+XHJcbiAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiFyZWNvcmQub3B0aW9ucy5tYXhMZW5ndGhcIiAgbnotaW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJyZWNvcmQua2V5XCIgXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInJlY29yZC5vcHRpb25zLnBsYWNlaG9sZGVyIHx8ICcnXCIgLz5cclxuICAgICAgICAgIDwvbnotaW5wdXQtZ3JvdXA+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY29yZC50eXBlID09ICd0ZXh0YXJlYSdcIj5cclxuICAgICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4VGVtcGxhdGVJbmZvXCIgY2xhc3M9XCJhbnQtaW5wdXQtYWZmaXgtd3JhcHBlci10ZXh0YXJlYS13aXRoLWNsZWFyLWJ0blwiICBbbmdTdHlsZV09XCJ7J3dpZHRoJzogcmVjb3JkLm9wdGlvbnMud2lkdGh9XCI+XHJcbiAgICAgICAgICAgIDx0ZXh0YXJlYSBuei1pbnB1dCAqbmdJZj1cInJlY29yZC5vcHRpb25zLm1heExlbmd0aFwiIFtmb3JtQ29udHJvbE5hbWVdPVwicmVjb3JkLmtleVwiXHJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJyZWNvcmQub3B0aW9ucy5wbGFjZWhvbGRlciB8fCAnJ1wiIFttYXhMZW5ndGhdPVwicmVjb3JkLm9wdGlvbnMubWF4TGVuZ3RoXCJcclxuICAgICAgICAgICAgW256QXV0b3NpemVdPVwieyBtaW5Sb3dzOiByZWNvcmQub3B0aW9ucy5taW5Sb3dzLCBtYXhSb3dzOiByZWNvcmQub3B0aW9ucy5tYXhSb3dzIH1cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICA8dGV4dGFyZWEgbnotaW5wdXQgKm5nSWY9XCIhcmVjb3JkLm9wdGlvbnMubWF4TGVuZ3RoXCIgW2Zvcm1Db250cm9sTmFtZV09XCJyZWNvcmQua2V5XCIgXHJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJyZWNvcmQub3B0aW9ucy5wbGFjZWhvbGRlciB8fCAnJ1wiIFtuekF1dG9zaXplXT1cInsgbWluUm93czogcmVjb3JkLm9wdGlvbnMubWluUm93cywgbWF4Um93czogcmVjb3JkLm9wdGlvbnMubWF4Um93cyB9XCJcclxuICAgICAgICAgICAgPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc3VmZml4VGVtcGxhdGVJbmZvPlxyXG4gICAgICAgICAgPGkgbnotaWNvblxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYW50LWlucHV0LXRleHRhcmVhLWNsZWFyLWljb25cIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA0cHg7XCJcclxuICAgICAgICAgICAgICBuelR5cGU9XCJjbG9zZS1jaXJjbGVcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiKHJlY29yZC50eXBlID09ICd0ZXh0YXJlYScgfHwgcmVjb3JkLnR5cGUgPT0gJ2lucHV0JykgJiYgcmVjb3JkLm9wdGlvbnMuY2xlYXJhYmxlICYmIHZhbHVlTGVuZ3RoR3RaZXJvKClcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKClcIlxyXG4gICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNvcmQudHlwZSA9PSAnbnVtYmVyJ1wiPlxyXG4gICAgICAgICAgPG56LWlucHV0LW51bWJlciBbZm9ybUNvbnRyb2xOYW1lXT1cInJlY29yZC5rZXlcIiBbbmdTdHlsZV09XCJ7J3dpZHRoJzogcmVjb3JkLm9wdGlvbnMud2lkdGh9XCJcclxuICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwicmVjb3JkLm9wdGlvbnMucGxhY2Vob2xkZXJcIiBcclxuICAgICAgICAgICAgW256UHJlY2lzaW9uXT1cInJlY29yZC5vcHRpb25zLnByZWNpc2lvblwiIFtuelN0ZXBdPVwicmVjb3JkLm9wdGlvbnMuc3RlcFwiXHJcbiAgICAgICAgICAgID48L256LWlucHV0LW51bWJlcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVjb3JkLnR5cGUgPT0gJ3JhZGlvJ1wiPlxyXG4gICAgICAgICAgPGFwcC1kZXNpZ24tZm9ybS1pdGVtLXJhZGlvIFtmb3JtQ29udHJvbE5hbWVdPVwicmVjb3JkLmtleVwiIFtyZWNvcmRdPVwicmVjb3JkXCI+PC9hcHAtZGVzaWduLWZvcm0taXRlbS1yYWRpbz5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVjb3JkLnR5cGUgPT0gJ2NoZWNrYm94J1wiPlxyXG4gICAgICAgICAgPCEtLSA8bnotY2hlY2tib3gtZ3JvdXAgW25nTW9kZWxdPVwicmVjb3JkLm9wdGlvbnMub3B0aW9uc1wiIChuZ01vZGVsQ2hhbmdlKT1cImxvZygkZXZlbnQpXCI+PC9uei1jaGVja2JveC1ncm91cD4gLS0+XHJcbiAgICAgICAgICA8YXBwLWRlc2lnbi1mb3JtLWl0ZW0tY2hlY2tib3ggIFxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJyZWNvcmQua2V5XCIgW29wdGlvbnNdPVwicmVjb3JkLm9wdGlvbnMub3B0aW9uc1wiPjwvYXBwLWRlc2lnbi1mb3JtLWl0ZW0tY2hlY2tib3g+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY29yZC50eXBlID09ICdzZWxlY3QnXCI+XHJcbiAgICAgICAgICA8bnotc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwicmVjb3JkLmtleVwiPlxyXG4gICAgICAgICAgICA8bnotb3B0aW9uICpuZ0Zvcj1cImxldCBsYmwgb2YgcmVjb3JkLm9wdGlvbnMub3B0aW9uc1wiIFxyXG4gICAgICAgICAgICAgIFtuelZhbHVlXT1cImxibC52YWx1ZVwiIFtuekxhYmVsXT1cImxibC5sYWJlbFwiPjwvbnotb3B0aW9uPlxyXG4gICAgICAgICAgPC9uei1zZWxlY3Q+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY29yZC50eXBlID09ICdyYXRlJ1wiPlxyXG4gICAgICAgICAgPG56LXJhdGUgW2Zvcm1Db250cm9sTmFtZV09XCJyZWNvcmQua2V5XCIgW256QWxsb3dIYWxmXT1cInJlY29yZC5vcHRpb25zLmFsbG93SGFsZlwiPjwvbnotcmF0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVjb3JkLnR5cGUgPT0gJ3NsaWRlcidcIj5cclxuICAgICAgICAgIDxuei1zbGlkZXJcclxuICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInJlY29yZC5rZXlcIj48L256LXNsaWRlcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVjb3JkLnR5cGUgPT0gJ3N3aXRjaCdcIj5cclxuICAgICAgICAgIDxuei1zd2l0Y2hcclxuICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInJlY29yZC5rZXlcIj48L256LXN3aXRjaD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVjb3JkLnR5cGUgPT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICA8bnotZGF0ZS1waWNrZXJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6IHJlY29yZC5vcHRpb25zLndpZHRofVwiXHJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicmVjb3JkLmtleVwiXHJcbiAgICAgICAgICAgIFtuek1vZGVdPVwicmVjb3JkLm9wdGlvbnMubW9kZVwiXHJcbiAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cInJlY29yZC5vcHRpb25zLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgID48L256LWRhdGUtcGlja2VyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgPC9uei1mb3JtLWl0ZW0+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNvcmQudHlwZSA9PT0gJ2RpdmlkZXInXCI+XHJcbiAgICA8bnotZGl2aWRlciBbbnpUZXh0XT1cInJlY29yZC5sYWJlbFwiIFtuek9yaWVudGF0aW9uXT1cInJlY29yZC5vcHRpb25zLm9yaWVudGF0aW9uIHx8ICdjZW50ZXInXCI+PC9uei1kaXZpZGVyPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNvcmQudHlwZSA9PT0gJ2FsZXJ0J1wiPlxyXG4gICAgPG56LWZvcm0taXRlbT5cclxuICAgICAgPG56LWZvcm0tY29udHJvbD5cclxuICAgICAgICA8bnotYWxlcnQgW256TWVzc2FnZV09XCJyZWNvcmQubGFiZWxcIlxyXG4gICAgICAgIFtuekRlc2NyaXB0aW9uXT1cInJlY29yZC5vcHRpb25zLmRlc2NyaXB0aW9uXCJcclxuICAgICAgICBbbnpUeXBlXT1cInJlY29yZC5vcHRpb25zLnR5cGVcIlxyXG4gICAgICAgIFtuelNob3dJY29uXT1cInJlY29yZC5vcHRpb25zLnNob3dJY29uXCJcclxuICAgICAgICBbbnpDbG9zZWFibGVdPVwicmVjb3JkLm9wdGlvbnMuY2xvc2FibGVcIlxyXG4gICAgICAgIFtuekJhbm5lcl09XCJyZWNvcmQub3B0aW9ucy5iYW5uZXJcIj5cclxuICAgICAgICA8L256LWFsZXJ0PlxyXG4gICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgIDwvbnotZm9ybS1pdGVtPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNvcmQudHlwZSA9PT0gJ3RleHQnXCI+XHJcbiAgICA8bnotZm9ybS1pdGVtPlxyXG4gICAgICA8bnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgIDxkaXYgW25nU3R5bGVdPVwieyB0ZXh0QWxpZ246IHJlY29yZC5vcHRpb25zLnRleHRBbGlnbiB9XCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnYW50LWZvcm0taXRlbS1yZXF1aXJlZCc6IHJlY29yZC5vcHRpb25zLnNob3dSZXF1aXJlZE1hcmsgfVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICBmb250RmFtaWx5OiByZWNvcmQub3B0aW9ucy5mb250RmFtaWx5LFxyXG4gICAgICAgICAgICAgIGZvbnRTaXplOiByZWNvcmQub3B0aW9ucy5mb250U2l6ZVxyXG4gICAgICAgICAgICB9XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3tyZWNvcmQubGFiZWx9fVxyXG4gICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctY29udGFpbmVyPiJdfQ==