@messaia/cdk 15.0.0-rc13 → 15.0.0-rc15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -215,10 +215,10 @@ export class VdGenericFormComponent {
215
215
  }
216
216
  }
217
217
  /** @nocollapse */ VdGenericFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: VdGenericFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
218
- /** @nocollapse */ VdGenericFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.1", type: VdGenericFormComponent, selector: "vd-generic-form", inputs: { formGroup: "formGroup", classType: "classType", formDefinition: "formDefinition", fieldGroups: "fieldGroups", groupName: "groupName", fieldSets: "fieldSets", context: "context", debugValue: "debugValue", readonly: "readonly", separatorKeysCodes: "separatorKeysCodes" }, queries: [{ propertyName: "editorTemplate", first: true, predicate: VdEditorDirective, descendants: true }, { propertyName: "codeTemplate", first: true, predicate: VdCodeDirective, descendants: true }, { propertyName: "fileTemplate", first: true, predicate: VdFileDirective, descendants: true }, { propertyName: "customTemplate", first: true, predicate: VdCustomDirective, descendants: true }, { propertyName: "bottom", first: true, predicate: ["bottom"], descendants: true }, { propertyName: "customFields", first: true, predicate: ["customFields"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"formGroup && fieldRows\" [formGroup]=\"formGroup\">\r\n <!-- #region Fields -->\r\n <ng-container *ngFor=\"let fields of fieldRows; let i = index\">\r\n <div layout-gt-sm=\"row\" layout=\"column\">\r\n <ng-container *ngFor=\"let field of fields\" [ngSwitch]=\"field.type\">\r\n <ng-container *ngIf=\"!field.hide || !field.hide(formGroup?.value, formGroup, context)\">\r\n <ng-container *ngIf=\"field.wrapped\">\r\n <!-- #region Text input -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Text\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <input [type]=\"field.inputType\" [minlength]=\"field.minLength||null\" [maxlength]=\"field.maxLength||null\" [min]=\"field.min\" [max]=\"field.max\" matInput [formControlName]=\"field.name\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Textarea -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.TextArea\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <textarea matInput [formControlName]=\"field.name\" rows=\"field.rows||2\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\"></textarea>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Enum -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Enum\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <vd-select [formControlName]=\"field.name\" [enum]=\"field.enumType\" [key]=\"field.optionValue\" [text]=\"field.optionText\" [multiple]=\"field.multiple\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" [triggerCssClass]=\"field.triggerCssClass\" [triggerMode]=\"field.triggerMode\" layout=\"row\" flex>\r\n <ng-template vd-select-trigger let-trigger=\"trigger\" *ngIf=\"field.triggerTemplate\">\r\n <span [innerHTML]=\"field.triggerTemplate(trigger, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n <ng-template vd-select-option let-option=\"option\" *ngIf=\"field.optionTemplate\">\r\n <span [outerHTML]=\"field.optionTemplate(option, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n </vd-select>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region VdSelect -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.VdSelect\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <vd-select [formControlName]=\"field.name\" [endpoint]=\"field.endpoint | func:formGroup.value:formGroup:context\" [params]=\"field.params | func:formGroup.value:formGroup:context\" [projection]=\"field.projection\" [mapper]=\"field.mapper\" [compareWith]=\"field.compareWith\" [key]=\"field.optionValue\" [text]=\"field.optionText\" [multiple]=\"field.multiple\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" [triggerCssClass]=\"field.triggerCssClass\" [triggerMode]=\"field.triggerMode\" (itemSelected)=\"field.itemSelect && field.itemSelect($event, formGroup?.value, formGroup, context);\" (itemChange)=\"field.itemChange && field.itemChange($event, formGroup?.value, formGroup, context);\" layout=\"row\" flex>\r\n <ng-template vd-select-trigger let-trigger=\"trigger\" *ngIf=\"field.triggerTemplate\">\r\n <span [innerHTML]=\"field.triggerTemplate(trigger, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n <ng-template vd-select-trigger let-trigger=\"trigger\" *ngIf=\"field.triggerMapper && field.multiple && field.triggerMode == 'chip'\">\r\n <span *ngFor=\"let item of trigger\" class=\"mat-mdc-chip mat-mdc-standard-chip mat-accent\">\r\n <span [innerHTML]=\"field.triggerMapper(item, formGroup.value, formGroup, context)\"></span>\r\n </span>\r\n </ng-template>\r\n <ng-template vd-select-option let-option=\"option\" *ngIf=\"field.optionTemplate\">\r\n <span [outerHTML]=\"field.optionTemplate(option, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n </vd-select>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Chips -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Chips\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <mat-chip-grid #chipList [formControlName]=\"field.name\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <mat-chip-row *ngFor=\"let chip of formGroup.controls[field.name]?.value\" (removed)=\"removeChip(field, chip)\" color=\"primary\" selectable=\"true\" selected>\r\n <span>{{chip}}</span>\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n <input [placeholder]=\"field.header\" #chipInput [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\" [matAutocomplete]=\"chipAutocomplete\" (input)=\"filterAutocomplete(field, chipInput)\" (matChipInputTokenEnd)=\"addChip(field, $event)\" autocomplete=\"off\">\r\n </mat-chip-grid>\r\n <mat-autocomplete autoActiveFirstOption #chipAutocomplete=\"matAutocomplete\" [class]=\"field.autocompleteCssClass\" (optionSelected)=\"autocompleteValueSelected(field, $event, chipInput)\">\r\n <mat-option *ngFor=\"let option of autocompleteFilteredOptions[field.name]\" [value]=\"option.id\">\r\n {{option.name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region VdChips -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.VdChips\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <vd-chips #vdChip [formControlName]=\"field.name\" [endpoint]=\"field.endpoint | func:formGroup.value:formGroup:context\" [params]=\"field.params | func:formGroup.value:formGroup:context\" [searchField]=\"field.searchField\" [classType]=\"field.classType\" [projection]=\"field.projection\" [key]=\"field.optionValue\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" [removable]=\"!field.clear\" [context]=\"context\" [suffixButtons]=\"field.suffixButtons\" [autocompleteCssClass]=\"field.autocompleteCssClass\" (initSelect)=\"field.itemSelect && field.itemSelect($event, formGroup?.value, formGroup, context);\" (selected)=\"field.itemChange && field.itemChange($event, formGroup?.value, formGroup, context);\" (cleared)=\"field.clear && field.clear(formGroup?.value, formGroup, context);\" layout=\"row\" flex>\r\n <ng-template vd-chip let-chip=\"chip\" *ngIf=\"field.chipTemplate\">\r\n <div [outerHTML]=\"field.chipTemplate(chip, formGroup.value, formGroup, context)\"></div>\r\n </ng-template>\r\n <ng-template vd-autocomplete-option let-option=\"option\" *ngIf=\"field.autocompleteTemplate\">\r\n <div [outerHTML]=\"field.autocompleteTemplate(option, formGroup.value, formGroup, context)\"></div>\r\n </ng-template>\r\n </vd-chips>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-hint *ngIf=\"vdChip.emptyResult\" class=\"tc-red-400\" i18n=\"@@noResultsFound\">No results were found.</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Select -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Select\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <mat-select [formControlName]=\"field.name\" [multiple]=\"field.multiple\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" flex>\r\n <mat-option *ngFor=\"let option of field.options\" [value]=\"option.id\">{{option.name}}</mat-option>\r\n </mat-select>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Autocomplete -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Autocomplete\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <input type=\"text\" matInput [formControlName]=\"field.name\" [min]=\"field.min\" [max]=\"field.max\" [matAutocomplete]=\"auto\" #autocompleteInput (input)=\"filterAutocomplete(field, autocompleteInput)\" autocomplete=\"off\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\" [class]=\"field.autocompleteCssClass\">\r\n <mat-option *ngFor=\"let option of autocompleteFilteredOptions[field.name]\" [value]=\"option.id\">\r\n {{option.name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Date -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Date\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <input matInput [formControlName]=\"field.name\" [min]=\"field.min\" [max]=\"field.max\" autocomplete=\"off\" [matDatepicker]=\"datePicker\" [matDatepickerFilter]=\"field.dateFilter\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <mat-datepicker-toggle matSuffix [for]=\"datePicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #datePicker></mat-datepicker>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n </ng-container>\r\n\r\n <!-- #region Checkbox -->\r\n <div *ngSwitchCase=\"FormFieldType.Checkbox\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\">\r\n <mat-checkbox [formControlName]=\"field.name\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">{{field.header}}</mat-checkbox>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Editor -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.Editor\">\r\n <ng-template *ngIf=\"editorTemplate?.templateRef\" [ngTemplateOutlet]=\"editorTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ field: field, formGroup: formGroup }\"></ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Code -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.Code\">\r\n <ng-template *ngIf=\"codeTemplate?.templateRef\" [ngTemplateOutlet]=\"codeTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ field: field, formGroup: formGroup }\"></ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region File -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.File\">\r\n <mat-form-field [attr.flex]=\"field.flex||0\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <div vd-file-input [formControlName]=\"field.name\" (select)=\"field.change && field.change($event, formGroup, context)\" [accept]=\"field.fileExtensions\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" flex></div>\r\n </mat-form-field>\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Custom -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.Custom\">\r\n <ng-template *ngIf=\"customTemplate?.templateRef\" [ngTemplateOutlet]=\"customTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ field: field, formGroup: formGroup }\"></ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- #region Template for custom fields -->\r\n <ng-container [ngTemplateOutlet]=\"customFields\" [ngTemplateOutletContext]=\"{formGroup: formGroup, row: fields[0]?.row + 1}\"></ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Form bottom -->\r\n <ng-container [ngTemplateOutlet]=\"bottom\" [ngTemplateOutletContext]=\"{formGroup: formGroup}\"></ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Debug value -->\r\n <code *ngIf=\"debugValue\">\r\n <pre>{{formGroup?.value | json}}</pre>\r\n </code>\r\n <!-- #endregion -->\r\n</div>", styles: [""], dependencies: [{ 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.DisableControlDirective, selector: "[disableControl]", inputs: ["disableControl"] }, { kind: "component", type: i3.VdSelectComponent, selector: "vd-select", inputs: ["multiple", "disabled", "sorted", "triggerCssClass", "triggerMode", "textPrefix", "endpoint", "params", "projection", "enum", "key", "text", "prefix", "options", "filteredOptions", "filterable", "cache", "sortBy", "mapper", "compareWith", "searchField"], outputs: ["change", "itemChange", "selected", "itemSelected", "launch"] }, { kind: "directive", type: i4.VdSelectOptionDirective, selector: "[vd-select-option]ng-template" }, { kind: "directive", type: i5.VdSelectTriggerDirective, selector: "[vd-select-trigger]ng-template" }, { kind: "component", type: i6.VdChipsComponent, selector: "vd-chips", inputs: ["classType", "chips", "endpoint", "params", "projection", "paginated", "context", "key", "searchField", "searchFields", "removable", "debounce", "autocompleteCssClass", "suffixButtons"], outputs: ["initSelect", "selected", "cleared", "launch", "chipFocus"] }, { kind: "directive", type: i7.VdAutocompleteOptionDirective, selector: "[vd-autocomplete-option]ng-template" }, { kind: "directive", type: i8.VdChipDirective, selector: "[vd-chip]ng-template" }, { kind: "component", type: i9.VdFileInputComponent, selector: "[vd-file-input]", inputs: ["accept", "placeholder", "required", "multiple", "disabled", "errorState"], outputs: ["select", "clear"] }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i10.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i10.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i11.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i11.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]" }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i13.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i14.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i15.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: i16.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i17.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i17.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i17.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i18.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i19.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i19.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i20.MatChipGrid, selector: "mat-chip-grid", inputs: ["tabIndex", "disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i20.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i20.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i20.MatChipRow, selector: "mat-chip-row, mat-basic-chip-row", inputs: ["color", "disabled", "disableRipple", "tabIndex", "editable"], outputs: ["edited"] }, { kind: "directive", type: i21.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "directive", type: i22.MatFormFieldReadonlyDirective, selector: "mat-form-field" }, { kind: "directive", type: i23.EmptyStringResetDirective, selector: "[ngModel],[formControlName],[formControl]" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }, { kind: "pipe", type: i24.FuncPipe, name: "func" }] });
218
+ /** @nocollapse */ VdGenericFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.1", type: VdGenericFormComponent, selector: "vd-generic-form", inputs: { formGroup: "formGroup", classType: "classType", formDefinition: "formDefinition", fieldGroups: "fieldGroups", groupName: "groupName", fieldSets: "fieldSets", context: "context", debugValue: "debugValue", readonly: "readonly", separatorKeysCodes: "separatorKeysCodes" }, queries: [{ propertyName: "editorTemplate", first: true, predicate: VdEditorDirective, descendants: true }, { propertyName: "codeTemplate", first: true, predicate: VdCodeDirective, descendants: true }, { propertyName: "fileTemplate", first: true, predicate: VdFileDirective, descendants: true }, { propertyName: "customTemplate", first: true, predicate: VdCustomDirective, descendants: true }, { propertyName: "bottom", first: true, predicate: ["bottom"], descendants: true }, { propertyName: "customFields", first: true, predicate: ["customFields"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"formGroup && fieldRows\" [formGroup]=\"formGroup\">\r\n <!-- #region Fields -->\r\n <ng-container *ngFor=\"let fields of fieldRows; let i = index\">\r\n <div layout-gt-sm=\"row\" layout=\"column\">\r\n <ng-container *ngFor=\"let field of fields\" [ngSwitch]=\"field.type\">\r\n <ng-container *ngIf=\"!field.hide || !field.hide(formGroup?.value, formGroup, context)\">\r\n <ng-container *ngIf=\"field.wrapped\">\r\n <!-- #region Text input -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Text\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <input [type]=\"field.inputType\" [minlength]=\"field.minLength||null\" [maxlength]=\"field.maxLength||null\" [min]=\"field.min\" [max]=\"field.max\" matInput [formControlName]=\"field.name\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Textarea -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.TextArea\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <textarea matInput [formControlName]=\"field.name\" rows=\"field.rows||2\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\"></textarea>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Enum -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Enum\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <vd-select [formControlName]=\"field.name\" [enum]=\"field.enumType\" [key]=\"field.optionValue\" [text]=\"field.optionText\" [multiple]=\"field.multiple\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" [triggerCssClass]=\"field.triggerCssClass\" [triggerMode]=\"field.triggerMode\" layout=\"row\" flex>\r\n <ng-template vd-select-trigger let-trigger=\"trigger\" *ngIf=\"field.triggerTemplate\">\r\n <span [innerHTML]=\"field.triggerTemplate(trigger, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n <ng-template vd-select-option let-option=\"option\" *ngIf=\"field.optionTemplate\">\r\n <span [outerHTML]=\"field.optionTemplate(option, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n </vd-select>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region VdSelect -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.VdSelect\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <vd-select [formControlName]=\"field.name\" [endpoint]=\"field.endpoint | func:formGroup.value:formGroup:context\" [params]=\"field.params | func:formGroup.value:formGroup:context\" [projection]=\"field.projection\" [mapper]=\"field.mapper\" [compareWith]=\"field.compareWith\" [key]=\"field.optionValue\" [text]=\"field.optionText\" [multiple]=\"field.multiple\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" [triggerCssClass]=\"field.triggerCssClass\" [triggerMode]=\"field.triggerMode\" (itemSelected)=\"field.itemSelect && field.itemSelect($event, formGroup?.value, formGroup, context);\" (itemChange)=\"field.itemChange && field.itemChange($event, formGroup?.value, formGroup, context);\" layout=\"row\" flex>\r\n <ng-template vd-select-trigger let-trigger=\"trigger\" *ngIf=\"field.triggerTemplate\">\r\n <span [innerHTML]=\"field.triggerTemplate(trigger, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n <ng-template vd-select-trigger let-trigger=\"trigger\" *ngIf=\"field.triggerMapper && field.multiple && field.triggerMode == 'chip'\">\r\n <span *ngFor=\"let item of trigger\" class=\"mat-mdc-chip mat-mdc-standard-chip mat-accent\">\r\n <span [innerHTML]=\"field.triggerMapper(item, formGroup.value, formGroup, context)\"></span>\r\n </span>\r\n </ng-template>\r\n <ng-template vd-select-option let-option=\"option\" *ngIf=\"field.optionTemplate\">\r\n <span [outerHTML]=\"field.optionTemplate(option, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n </vd-select>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Chips -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Chips\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <mat-chip-grid #chipList [formControlName]=\"field.name\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <mat-chip-row *ngFor=\"let chip of formGroup.controls[field.name]?.value\" (removed)=\"removeChip(field, chip)\" color=\"primary\" selectable=\"true\" selected>\r\n <span>{{chip}}</span>\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n <input [placeholder]=\"field.header\" #chipInput [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\" [matAutocomplete]=\"chipAutocomplete\" (input)=\"filterAutocomplete(field, chipInput)\" (matChipInputTokenEnd)=\"addChip(field, $event)\" autocomplete=\"off\">\r\n </mat-chip-grid>\r\n <mat-autocomplete autoActiveFirstOption #chipAutocomplete=\"matAutocomplete\" [class]=\"field.autocompleteCssClass\" (optionSelected)=\"autocompleteValueSelected(field, $event, chipInput)\">\r\n <mat-option *ngFor=\"let option of autocompleteFilteredOptions[field.name]\" [value]=\"option.id\">\r\n {{option.name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region VdChips -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.VdChips\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <vd-chips #vdChip [formControlName]=\"field.name\" [endpoint]=\"field.endpoint | func:formGroup.value:formGroup:context\" [params]=\"field.params | func:formGroup.value:formGroup:context\" [searchField]=\"field.searchField\" [classType]=\"field.classType\" [projection]=\"field.projection\" [key]=\"field.optionValue\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" [removable]=\"!field.clear\" [context]=\"context\" [suffixButtons]=\"field.suffixButtons\" [autocompleteCssClass]=\"field.autocompleteCssClass\" (initSelect)=\"field.itemSelect && field.itemSelect($event, formGroup?.value, formGroup, context);\" (selected)=\"field.itemChange && field.itemChange($event, formGroup?.value, formGroup, context);\" (cleared)=\"field.clear && field.clear(formGroup?.value, formGroup, context);\" layout=\"row\" flex>\r\n <ng-template vd-chip let-chip=\"chip\" *ngIf=\"field.chipTemplate\">\r\n <div [outerHTML]=\"field.chipTemplate(chip, formGroup.value, formGroup, context)\"></div>\r\n </ng-template>\r\n <ng-template vd-autocomplete-option let-option=\"option\" *ngIf=\"field.autocompleteTemplate\">\r\n <div [outerHTML]=\"field.autocompleteTemplate(option, formGroup.value, formGroup, context)\"></div>\r\n </ng-template>\r\n </vd-chips>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-hint *ngIf=\"vdChip.emptyResult\" class=\"tc-red-400\" i18n=\"@@noResultsFound\">No results were found.</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Select -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Select\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <mat-select [formControlName]=\"field.name\" [multiple]=\"field.multiple\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" flex>\r\n <mat-option *ngFor=\"let option of field.options\" [value]=\"option.id\">{{option.name}}</mat-option>\r\n </mat-select>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Autocomplete -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Autocomplete\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <input type=\"text\" matInput [formControlName]=\"field.name\" [min]=\"field.min\" [max]=\"field.max\" [matAutocomplete]=\"auto\" #autocompleteInput (input)=\"filterAutocomplete(field, autocompleteInput)\" autocomplete=\"off\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\" [class]=\"field.autocompleteCssClass\">\r\n <mat-option *ngFor=\"let option of autocompleteFilteredOptions[field.name]\" [value]=\"option.id\">\r\n {{option.name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Date -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Date\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <input matInput [formControlName]=\"field.name\" [min]=\"field.min\" [max]=\"field.max\" autocomplete=\"off\" [matDatepicker]=\"datePicker\" [matDatepickerFilter]=\"field.dateFilter\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <mat-datepicker-toggle matSuffix [for]=\"datePicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #datePicker></mat-datepicker>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n </ng-container>\r\n\r\n <!-- #region Checkbox -->\r\n <div *ngSwitchCase=\"FormFieldType.Checkbox\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\">\r\n <mat-checkbox [formControlName]=\"field.name\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">{{field.header}}</mat-checkbox>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Editor -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.Editor\">\r\n <ng-template *ngIf=\"editorTemplate?.templateRef\" [ngTemplateOutlet]=\"editorTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ field: field, formGroup: formGroup }\"></ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Code -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.Code\">\r\n <ng-template *ngIf=\"codeTemplate?.templateRef\" [ngTemplateOutlet]=\"codeTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ field: field, formGroup: formGroup }\"></ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region File -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.File\">\r\n <mat-form-field [attr.flex]=\"field.flex||0\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <div vd-file-input [formControlName]=\"field.name\" (select)=\"field.change && field.change(field, $event, formGroup, context)\" [accept]=\"field.fileExtensions\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" flex></div>\r\n </mat-form-field>\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Custom -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.Custom\">\r\n <ng-template *ngIf=\"customTemplate?.templateRef\" [ngTemplateOutlet]=\"customTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ field: field, formGroup: formGroup }\"></ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- #region Template for custom fields -->\r\n <ng-container [ngTemplateOutlet]=\"customFields\" [ngTemplateOutletContext]=\"{formGroup: formGroup, row: fields[0]?.row + 1}\"></ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Form bottom -->\r\n <ng-container [ngTemplateOutlet]=\"bottom\" [ngTemplateOutletContext]=\"{formGroup: formGroup}\"></ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Debug value -->\r\n <code *ngIf=\"debugValue\">\r\n <pre>{{formGroup?.value | json}}</pre>\r\n </code>\r\n <!-- #endregion -->\r\n</div>", styles: [""], dependencies: [{ 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.DisableControlDirective, selector: "[disableControl]", inputs: ["disableControl"] }, { kind: "component", type: i3.VdSelectComponent, selector: "vd-select", inputs: ["multiple", "disabled", "sorted", "triggerCssClass", "triggerMode", "textPrefix", "endpoint", "params", "projection", "enum", "key", "text", "prefix", "options", "filteredOptions", "filterable", "cache", "sortBy", "mapper", "compareWith", "searchField"], outputs: ["change", "itemChange", "selected", "itemSelected", "launch"] }, { kind: "directive", type: i4.VdSelectOptionDirective, selector: "[vd-select-option]ng-template" }, { kind: "directive", type: i5.VdSelectTriggerDirective, selector: "[vd-select-trigger]ng-template" }, { kind: "component", type: i6.VdChipsComponent, selector: "vd-chips", inputs: ["classType", "chips", "endpoint", "params", "projection", "paginated", "context", "key", "searchField", "searchFields", "removable", "debounce", "autocompleteCssClass", "suffixButtons"], outputs: ["initSelect", "selected", "cleared", "launch", "chipFocus"] }, { kind: "directive", type: i7.VdAutocompleteOptionDirective, selector: "[vd-autocomplete-option]ng-template" }, { kind: "directive", type: i8.VdChipDirective, selector: "[vd-chip]ng-template" }, { kind: "component", type: i9.VdFileInputComponent, selector: "[vd-file-input]", inputs: ["accept", "placeholder", "required", "multiple", "disabled", "errorState"], outputs: ["select", "clear"] }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i10.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i10.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i11.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i11.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]" }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i13.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i14.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i15.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: i16.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i17.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i17.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i17.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i18.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i19.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i19.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i20.MatChipGrid, selector: "mat-chip-grid", inputs: ["tabIndex", "disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i20.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i20.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i20.MatChipRow, selector: "mat-chip-row, mat-basic-chip-row", inputs: ["color", "disabled", "disableRipple", "tabIndex", "editable"], outputs: ["edited"] }, { kind: "directive", type: i21.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "directive", type: i22.MatFormFieldReadonlyDirective, selector: "mat-form-field" }, { kind: "directive", type: i23.EmptyStringResetDirective, selector: "[ngModel],[formControlName],[formControl]" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }, { kind: "pipe", type: i24.FuncPipe, name: "func" }] });
219
219
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: VdGenericFormComponent, decorators: [{
220
220
  type: Component,
221
- args: [{ selector: 'vd-generic-form', template: "<div *ngIf=\"formGroup && fieldRows\" [formGroup]=\"formGroup\">\r\n <!-- #region Fields -->\r\n <ng-container *ngFor=\"let fields of fieldRows; let i = index\">\r\n <div layout-gt-sm=\"row\" layout=\"column\">\r\n <ng-container *ngFor=\"let field of fields\" [ngSwitch]=\"field.type\">\r\n <ng-container *ngIf=\"!field.hide || !field.hide(formGroup?.value, formGroup, context)\">\r\n <ng-container *ngIf=\"field.wrapped\">\r\n <!-- #region Text input -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Text\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <input [type]=\"field.inputType\" [minlength]=\"field.minLength||null\" [maxlength]=\"field.maxLength||null\" [min]=\"field.min\" [max]=\"field.max\" matInput [formControlName]=\"field.name\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Textarea -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.TextArea\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <textarea matInput [formControlName]=\"field.name\" rows=\"field.rows||2\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\"></textarea>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Enum -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Enum\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <vd-select [formControlName]=\"field.name\" [enum]=\"field.enumType\" [key]=\"field.optionValue\" [text]=\"field.optionText\" [multiple]=\"field.multiple\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" [triggerCssClass]=\"field.triggerCssClass\" [triggerMode]=\"field.triggerMode\" layout=\"row\" flex>\r\n <ng-template vd-select-trigger let-trigger=\"trigger\" *ngIf=\"field.triggerTemplate\">\r\n <span [innerHTML]=\"field.triggerTemplate(trigger, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n <ng-template vd-select-option let-option=\"option\" *ngIf=\"field.optionTemplate\">\r\n <span [outerHTML]=\"field.optionTemplate(option, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n </vd-select>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region VdSelect -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.VdSelect\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <vd-select [formControlName]=\"field.name\" [endpoint]=\"field.endpoint | func:formGroup.value:formGroup:context\" [params]=\"field.params | func:formGroup.value:formGroup:context\" [projection]=\"field.projection\" [mapper]=\"field.mapper\" [compareWith]=\"field.compareWith\" [key]=\"field.optionValue\" [text]=\"field.optionText\" [multiple]=\"field.multiple\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" [triggerCssClass]=\"field.triggerCssClass\" [triggerMode]=\"field.triggerMode\" (itemSelected)=\"field.itemSelect && field.itemSelect($event, formGroup?.value, formGroup, context);\" (itemChange)=\"field.itemChange && field.itemChange($event, formGroup?.value, formGroup, context);\" layout=\"row\" flex>\r\n <ng-template vd-select-trigger let-trigger=\"trigger\" *ngIf=\"field.triggerTemplate\">\r\n <span [innerHTML]=\"field.triggerTemplate(trigger, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n <ng-template vd-select-trigger let-trigger=\"trigger\" *ngIf=\"field.triggerMapper && field.multiple && field.triggerMode == 'chip'\">\r\n <span *ngFor=\"let item of trigger\" class=\"mat-mdc-chip mat-mdc-standard-chip mat-accent\">\r\n <span [innerHTML]=\"field.triggerMapper(item, formGroup.value, formGroup, context)\"></span>\r\n </span>\r\n </ng-template>\r\n <ng-template vd-select-option let-option=\"option\" *ngIf=\"field.optionTemplate\">\r\n <span [outerHTML]=\"field.optionTemplate(option, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n </vd-select>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Chips -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Chips\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <mat-chip-grid #chipList [formControlName]=\"field.name\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <mat-chip-row *ngFor=\"let chip of formGroup.controls[field.name]?.value\" (removed)=\"removeChip(field, chip)\" color=\"primary\" selectable=\"true\" selected>\r\n <span>{{chip}}</span>\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n <input [placeholder]=\"field.header\" #chipInput [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\" [matAutocomplete]=\"chipAutocomplete\" (input)=\"filterAutocomplete(field, chipInput)\" (matChipInputTokenEnd)=\"addChip(field, $event)\" autocomplete=\"off\">\r\n </mat-chip-grid>\r\n <mat-autocomplete autoActiveFirstOption #chipAutocomplete=\"matAutocomplete\" [class]=\"field.autocompleteCssClass\" (optionSelected)=\"autocompleteValueSelected(field, $event, chipInput)\">\r\n <mat-option *ngFor=\"let option of autocompleteFilteredOptions[field.name]\" [value]=\"option.id\">\r\n {{option.name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region VdChips -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.VdChips\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <vd-chips #vdChip [formControlName]=\"field.name\" [endpoint]=\"field.endpoint | func:formGroup.value:formGroup:context\" [params]=\"field.params | func:formGroup.value:formGroup:context\" [searchField]=\"field.searchField\" [classType]=\"field.classType\" [projection]=\"field.projection\" [key]=\"field.optionValue\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" [removable]=\"!field.clear\" [context]=\"context\" [suffixButtons]=\"field.suffixButtons\" [autocompleteCssClass]=\"field.autocompleteCssClass\" (initSelect)=\"field.itemSelect && field.itemSelect($event, formGroup?.value, formGroup, context);\" (selected)=\"field.itemChange && field.itemChange($event, formGroup?.value, formGroup, context);\" (cleared)=\"field.clear && field.clear(formGroup?.value, formGroup, context);\" layout=\"row\" flex>\r\n <ng-template vd-chip let-chip=\"chip\" *ngIf=\"field.chipTemplate\">\r\n <div [outerHTML]=\"field.chipTemplate(chip, formGroup.value, formGroup, context)\"></div>\r\n </ng-template>\r\n <ng-template vd-autocomplete-option let-option=\"option\" *ngIf=\"field.autocompleteTemplate\">\r\n <div [outerHTML]=\"field.autocompleteTemplate(option, formGroup.value, formGroup, context)\"></div>\r\n </ng-template>\r\n </vd-chips>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-hint *ngIf=\"vdChip.emptyResult\" class=\"tc-red-400\" i18n=\"@@noResultsFound\">No results were found.</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Select -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Select\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <mat-select [formControlName]=\"field.name\" [multiple]=\"field.multiple\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" flex>\r\n <mat-option *ngFor=\"let option of field.options\" [value]=\"option.id\">{{option.name}}</mat-option>\r\n </mat-select>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Autocomplete -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Autocomplete\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <input type=\"text\" matInput [formControlName]=\"field.name\" [min]=\"field.min\" [max]=\"field.max\" [matAutocomplete]=\"auto\" #autocompleteInput (input)=\"filterAutocomplete(field, autocompleteInput)\" autocomplete=\"off\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\" [class]=\"field.autocompleteCssClass\">\r\n <mat-option *ngFor=\"let option of autocompleteFilteredOptions[field.name]\" [value]=\"option.id\">\r\n {{option.name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Date -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Date\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <input matInput [formControlName]=\"field.name\" [min]=\"field.min\" [max]=\"field.max\" autocomplete=\"off\" [matDatepicker]=\"datePicker\" [matDatepickerFilter]=\"field.dateFilter\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <mat-datepicker-toggle matSuffix [for]=\"datePicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #datePicker></mat-datepicker>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n </ng-container>\r\n\r\n <!-- #region Checkbox -->\r\n <div *ngSwitchCase=\"FormFieldType.Checkbox\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\">\r\n <mat-checkbox [formControlName]=\"field.name\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">{{field.header}}</mat-checkbox>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Editor -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.Editor\">\r\n <ng-template *ngIf=\"editorTemplate?.templateRef\" [ngTemplateOutlet]=\"editorTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ field: field, formGroup: formGroup }\"></ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Code -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.Code\">\r\n <ng-template *ngIf=\"codeTemplate?.templateRef\" [ngTemplateOutlet]=\"codeTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ field: field, formGroup: formGroup }\"></ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region File -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.File\">\r\n <mat-form-field [attr.flex]=\"field.flex||0\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <div vd-file-input [formControlName]=\"field.name\" (select)=\"field.change && field.change($event, formGroup, context)\" [accept]=\"field.fileExtensions\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" flex></div>\r\n </mat-form-field>\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Custom -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.Custom\">\r\n <ng-template *ngIf=\"customTemplate?.templateRef\" [ngTemplateOutlet]=\"customTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ field: field, formGroup: formGroup }\"></ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- #region Template for custom fields -->\r\n <ng-container [ngTemplateOutlet]=\"customFields\" [ngTemplateOutletContext]=\"{formGroup: formGroup, row: fields[0]?.row + 1}\"></ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Form bottom -->\r\n <ng-container [ngTemplateOutlet]=\"bottom\" [ngTemplateOutletContext]=\"{formGroup: formGroup}\"></ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Debug value -->\r\n <code *ngIf=\"debugValue\">\r\n <pre>{{formGroup?.value | json}}</pre>\r\n </code>\r\n <!-- #endregion -->\r\n</div>" }]
221
+ args: [{ selector: 'vd-generic-form', template: "<div *ngIf=\"formGroup && fieldRows\" [formGroup]=\"formGroup\">\r\n <!-- #region Fields -->\r\n <ng-container *ngFor=\"let fields of fieldRows; let i = index\">\r\n <div layout-gt-sm=\"row\" layout=\"column\">\r\n <ng-container *ngFor=\"let field of fields\" [ngSwitch]=\"field.type\">\r\n <ng-container *ngIf=\"!field.hide || !field.hide(formGroup?.value, formGroup, context)\">\r\n <ng-container *ngIf=\"field.wrapped\">\r\n <!-- #region Text input -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Text\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <input [type]=\"field.inputType\" [minlength]=\"field.minLength||null\" [maxlength]=\"field.maxLength||null\" [min]=\"field.min\" [max]=\"field.max\" matInput [formControlName]=\"field.name\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Textarea -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.TextArea\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <textarea matInput [formControlName]=\"field.name\" rows=\"field.rows||2\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\"></textarea>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Enum -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Enum\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <vd-select [formControlName]=\"field.name\" [enum]=\"field.enumType\" [key]=\"field.optionValue\" [text]=\"field.optionText\" [multiple]=\"field.multiple\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" [triggerCssClass]=\"field.triggerCssClass\" [triggerMode]=\"field.triggerMode\" layout=\"row\" flex>\r\n <ng-template vd-select-trigger let-trigger=\"trigger\" *ngIf=\"field.triggerTemplate\">\r\n <span [innerHTML]=\"field.triggerTemplate(trigger, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n <ng-template vd-select-option let-option=\"option\" *ngIf=\"field.optionTemplate\">\r\n <span [outerHTML]=\"field.optionTemplate(option, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n </vd-select>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region VdSelect -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.VdSelect\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <vd-select [formControlName]=\"field.name\" [endpoint]=\"field.endpoint | func:formGroup.value:formGroup:context\" [params]=\"field.params | func:formGroup.value:formGroup:context\" [projection]=\"field.projection\" [mapper]=\"field.mapper\" [compareWith]=\"field.compareWith\" [key]=\"field.optionValue\" [text]=\"field.optionText\" [multiple]=\"field.multiple\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" [triggerCssClass]=\"field.triggerCssClass\" [triggerMode]=\"field.triggerMode\" (itemSelected)=\"field.itemSelect && field.itemSelect($event, formGroup?.value, formGroup, context);\" (itemChange)=\"field.itemChange && field.itemChange($event, formGroup?.value, formGroup, context);\" layout=\"row\" flex>\r\n <ng-template vd-select-trigger let-trigger=\"trigger\" *ngIf=\"field.triggerTemplate\">\r\n <span [innerHTML]=\"field.triggerTemplate(trigger, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n <ng-template vd-select-trigger let-trigger=\"trigger\" *ngIf=\"field.triggerMapper && field.multiple && field.triggerMode == 'chip'\">\r\n <span *ngFor=\"let item of trigger\" class=\"mat-mdc-chip mat-mdc-standard-chip mat-accent\">\r\n <span [innerHTML]=\"field.triggerMapper(item, formGroup.value, formGroup, context)\"></span>\r\n </span>\r\n </ng-template>\r\n <ng-template vd-select-option let-option=\"option\" *ngIf=\"field.optionTemplate\">\r\n <span [outerHTML]=\"field.optionTemplate(option, formGroup.value, formGroup, context)\"></span>\r\n </ng-template>\r\n </vd-select>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Chips -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Chips\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <mat-chip-grid #chipList [formControlName]=\"field.name\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <mat-chip-row *ngFor=\"let chip of formGroup.controls[field.name]?.value\" (removed)=\"removeChip(field, chip)\" color=\"primary\" selectable=\"true\" selected>\r\n <span>{{chip}}</span>\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n <input [placeholder]=\"field.header\" #chipInput [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\" [matAutocomplete]=\"chipAutocomplete\" (input)=\"filterAutocomplete(field, chipInput)\" (matChipInputTokenEnd)=\"addChip(field, $event)\" autocomplete=\"off\">\r\n </mat-chip-grid>\r\n <mat-autocomplete autoActiveFirstOption #chipAutocomplete=\"matAutocomplete\" [class]=\"field.autocompleteCssClass\" (optionSelected)=\"autocompleteValueSelected(field, $event, chipInput)\">\r\n <mat-option *ngFor=\"let option of autocompleteFilteredOptions[field.name]\" [value]=\"option.id\">\r\n {{option.name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region VdChips -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.VdChips\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <vd-chips #vdChip [formControlName]=\"field.name\" [endpoint]=\"field.endpoint | func:formGroup.value:formGroup:context\" [params]=\"field.params | func:formGroup.value:formGroup:context\" [searchField]=\"field.searchField\" [classType]=\"field.classType\" [projection]=\"field.projection\" [key]=\"field.optionValue\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" [removable]=\"!field.clear\" [context]=\"context\" [suffixButtons]=\"field.suffixButtons\" [autocompleteCssClass]=\"field.autocompleteCssClass\" (initSelect)=\"field.itemSelect && field.itemSelect($event, formGroup?.value, formGroup, context);\" (selected)=\"field.itemChange && field.itemChange($event, formGroup?.value, formGroup, context);\" (cleared)=\"field.clear && field.clear(formGroup?.value, formGroup, context);\" layout=\"row\" flex>\r\n <ng-template vd-chip let-chip=\"chip\" *ngIf=\"field.chipTemplate\">\r\n <div [outerHTML]=\"field.chipTemplate(chip, formGroup.value, formGroup, context)\"></div>\r\n </ng-template>\r\n <ng-template vd-autocomplete-option let-option=\"option\" *ngIf=\"field.autocompleteTemplate\">\r\n <div [outerHTML]=\"field.autocompleteTemplate(option, formGroup.value, formGroup, context)\"></div>\r\n </ng-template>\r\n </vd-chips>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-hint *ngIf=\"vdChip.emptyResult\" class=\"tc-red-400\" i18n=\"@@noResultsFound\">No results were found.</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Select -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Select\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <mat-select [formControlName]=\"field.name\" [multiple]=\"field.multiple\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" flex>\r\n <mat-option *ngFor=\"let option of field.options\" [value]=\"option.id\">{{option.name}}</mat-option>\r\n </mat-select>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Autocomplete -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Autocomplete\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <input type=\"text\" matInput [formControlName]=\"field.name\" [min]=\"field.min\" [max]=\"field.max\" [matAutocomplete]=\"auto\" #autocompleteInput (input)=\"filterAutocomplete(field, autocompleteInput)\" autocomplete=\"off\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\" [class]=\"field.autocompleteCssClass\">\r\n <mat-option *ngFor=\"let option of autocompleteFilteredOptions[field.name]\" [value]=\"option.id\">\r\n {{option.name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <ng-container *ngFor=\"let suffixButton of field.suffixButtons\" (click)=\"suffixButton.event && suffixButton.event(formGroup?.value, context)\" matSuffix>\r\n <button type=\"button\" mat-icon-button *ngIf=\"!suffixButton.hide || !suffixButton.hide(formGroup?.value, context)\">\r\n <mat-icon>{{suffixButton.icon}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Date -->\r\n <mat-form-field *ngSwitchCase=\"FormFieldType.Date\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <input matInput [formControlName]=\"field.name\" [min]=\"field.min\" [max]=\"field.max\" autocomplete=\"off\" [matDatepicker]=\"datePicker\" [matDatepickerFilter]=\"field.dateFilter\" [readonly]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">\r\n <mat-datepicker-toggle matSuffix [for]=\"datePicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #datePicker></mat-datepicker>\r\n <mat-hint *ngIf=\"field.hint\">{{field.hint}}</mat-hint>\r\n <mat-error *ngFor=\"let errorMessage of formGroup.controls[field.name]['errorMessages']\">{{errorMessage}}</mat-error>\r\n </mat-form-field>\r\n <!-- #endregion -->\r\n </ng-container>\r\n\r\n <!-- #region Checkbox -->\r\n <div *ngSwitchCase=\"FormFieldType.Checkbox\" [attr.flex]=\"field.flex||0\" [class]=\"field.cssClass\">\r\n <mat-checkbox [formControlName]=\"field.name\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\">{{field.header}}</mat-checkbox>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Editor -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.Editor\">\r\n <ng-template *ngIf=\"editorTemplate?.templateRef\" [ngTemplateOutlet]=\"editorTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ field: field, formGroup: formGroup }\"></ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Code -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.Code\">\r\n <ng-template *ngIf=\"codeTemplate?.templateRef\" [ngTemplateOutlet]=\"codeTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ field: field, formGroup: formGroup }\"></ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region File -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.File\">\r\n <mat-form-field [attr.flex]=\"field.flex||0\" layout-margin>\r\n <mat-label>{{field.header}}</mat-label>\r\n <div vd-file-input [formControlName]=\"field.name\" (select)=\"field.change && field.change(field, $event, formGroup, context)\" [accept]=\"field.fileExtensions\" [disableControl]=\"readonly || (field.readonly && field.readonly(formGroup?.value, formGroup, context))\" flex></div>\r\n </mat-form-field>\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Custom -->\r\n <ng-container *ngSwitchCase=\"FormFieldType.Custom\">\r\n <ng-template *ngIf=\"customTemplate?.templateRef\" [ngTemplateOutlet]=\"customTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ field: field, formGroup: formGroup }\"></ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- #region Template for custom fields -->\r\n <ng-container [ngTemplateOutlet]=\"customFields\" [ngTemplateOutletContext]=\"{formGroup: formGroup, row: fields[0]?.row + 1}\"></ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Form bottom -->\r\n <ng-container [ngTemplateOutlet]=\"bottom\" [ngTemplateOutletContext]=\"{formGroup: formGroup}\"></ng-container>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Debug value -->\r\n <code *ngIf=\"debugValue\">\r\n <pre>{{formGroup?.value | json}}</pre>\r\n </code>\r\n <!-- #endregion -->\r\n</div>" }]
222
222
  }], propDecorators: { formGroup: [{
223
223
  type: Input
224
224
  }], classType: [{
@@ -258,4 +258,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImpor
258
258
  type: ContentChild,
259
259
  args: ['customFields']
260
260
  }] } });
261
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nkay9zcmMvbGliL2Zvcm1zL2NvbXBvbmVudHMvZ2VuZXJpYy1mb3JtL2dlbmVyaWMtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi9mb3Jtcy9jb21wb25lbnRzL2dlbmVyaWMtZm9ybS9nZW5lcmljLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxXQUFXLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUk5RDs7R0FFRztBQUVILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxTQUFTO0lBQzVDLFlBQVksV0FBNkIsRUFBRSxnQkFBa0M7UUFDekUsS0FBSyxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7O2lJQUhRLGlCQUFpQjtxSEFBakIsaUJBQWlCOzJGQUFqQixpQkFBaUI7a0JBRDdCLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUs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Z0JBT3hCLFlBQVk7c0JBRGxCLFlBQVk7dUJBQUMsZUFBZTtnQkFPdEIsWUFBWTtzQkFEbEIsWUFBWTt1QkFBQyxlQUFlO2dCQU90QixjQUFjO3NCQURwQixZQUFZO3VCQUFDLGlCQUFpQjtnQkFPeEIsTUFBTTtzQkFEWixZQUFZO3VCQUFDLFFBQVE7Z0JBT2YsWUFBWTtzQkFEbEIsWUFBWTt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ09NTUEsIEVOVEVSIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcclxuaW1wb3J0IHsgQ2RrUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBEaXJlY3RpdmUsIElucHV0LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBUeXBlLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XHJcbmltcG9ydCB7IE1hdENoaXBJbnB1dEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xyXG5pbXBvcnQgeyBGb3JtRmllbGRUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvZm9ybS1maWVsZC10eXBlJztcclxuaW1wb3J0IHsgZ2V0Rm9ybURlZmluaXRpb24gfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgRm9ybURlZmluaXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvZm9ybS1kZWZpbml0aW9uJztcclxuaW1wb3J0IHsgRm9ybUZpZWxkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9mb3JtLWZpZWxkLWRlZmluaXRpb24nO1xyXG5pbXBvcnQgeyBGb3JtRmllbGRHcm91cERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvZm9ybS1maWVsZC1ncm91cC1kZWZpbml0aW9uJztcclxuXHJcbi8qKlxyXG4gKiBWZEVkaXRvckRpcmVjdGl2ZSBjbGFzc1xyXG4gKi9cclxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW3ZkLWVkaXRvcl1uZy10ZW1wbGF0ZScgfSlcclxuZXhwb3J0IGNsYXNzIFZkRWRpdG9yRGlyZWN0aXZlIGV4dGVuZHMgQ2RrUG9ydGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgICAgc3VwZXIodGVtcGxhdGVSZWYsIHZpZXdDb250YWluZXJSZWYpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogVmRDb2RlRGlyZWN0aXZlIGNsYXNzXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbdmQtY29kZV1uZy10ZW1wbGF0ZScgfSlcclxuZXhwb3J0IGNsYXNzIFZkQ29kZURpcmVjdGl2ZSBleHRlbmRzIENka1BvcnRhbCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Piwgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge1xyXG4gICAgICAgIHN1cGVyKHRlbXBsYXRlUmVmLCB2aWV3Q29udGFpbmVyUmVmKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFZkRmlsZURpcmVjdGl2ZSBjbGFzc1xyXG4gKi9cclxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW3ZkLWZpbGVdbmctdGVtcGxhdGUnIH0pXHJcbmV4cG9ydCBjbGFzcyBWZEZpbGVEaXJlY3RpdmUgZXh0ZW5kcyBDZGtQb3J0YWwge1xyXG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYpIHtcclxuICAgICAgICBzdXBlcih0ZW1wbGF0ZVJlZiwgdmlld0NvbnRhaW5lclJlZik7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBWZEN1c3RvbURpcmVjdGl2ZSBjbGFzc1xyXG4gKi9cclxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW3ZkLWN1c3RvbV1uZy10ZW1wbGF0ZScgfSlcclxuZXhwb3J0IGNsYXNzIFZkQ3VzdG9tRGlyZWN0aXZlIGV4dGVuZHMgQ2RrUG9ydGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgICAgc3VwZXIodGVtcGxhdGVSZWYsIHZpZXdDb250YWluZXJSZWYpO1xyXG4gICAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAndmQtZ2VuZXJpYy1mb3JtJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9nZW5lcmljLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZ2VuZXJpYy1mb3JtLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFZkR2VuZXJpY0Zvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBmb3JtOiBGb3JtR3JvdXBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmb3JtR3JvdXA6IEZvcm1Hcm91cDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNsYXNzVHlwZTogVHlwZTxhbnk+XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgY2xhc3NUeXBlOiBUeXBlPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBmb3JtRGVmaW5pdGlvbjogRm9ybURlZmluaXRpb25cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmb3JtRGVmaW5pdGlvbjogRm9ybURlZmluaXRpb247XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBmaWVsZEdyb3VwczogRm9ybUZpZWxkR3JvdXBbXVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGZpZWxkR3JvdXBzOiBGb3JtRmllbGRHcm91cERlZmluaXRpb25bXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdyb3VwIG5hbWVcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBncm91cE5hbWU6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpZWxkIHNldCBuYW1lXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZmllbGRTZXRzOiBzdHJpbmdbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbnRleHQ6IGFueVxyXG4gICAgICogVGhlIGN1cnJlbnQgY29udGV4dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGNvbnRleHQ6IGFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGRlYnVnVmFsdWU6IGJvb2xlYW5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkZWJ1Z1ZhbHVlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmVhZG9ubHk6IGJvb2xlYW5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogc2VwYXJhdG9yS2V5c0NvZGVzOiBudW1iZXJbXVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlcGFyYXRvcktleXNDb2RlczogbnVtYmVyW10gPSBbRU5URVIsIENPTU1BXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGZpZWxkUm93czogRm9ybUZpZWxkRGVmaW5pdGlvbltdXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaWVsZFJvd3M6IEZvcm1GaWVsZERlZmluaXRpb25bXVtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9ybUZpZWxkVHlwZTogdHlwZW9mIEZvcm1GaWVsZFR5cGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZvcm1GaWVsZFR5cGU6IHR5cGVvZiBGb3JtRmllbGRUeXBlID0gRm9ybUZpZWxkVHlwZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVkaXRvciB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBAQ29udGVudENoaWxkKFZkRWRpdG9yRGlyZWN0aXZlKVxyXG4gICAgcHVibGljIGVkaXRvclRlbXBsYXRlOiBWZEVkaXRvckRpcmVjdGl2ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvZGUgdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgQENvbnRlbnRDaGlsZChWZENvZGVEaXJlY3RpdmUpXHJcbiAgICBwdWJsaWMgY29kZVRlbXBsYXRlOiBWZENvZGVEaXJlY3RpdmU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxlIHRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBDb250ZW50Q2hpbGQoVmRGaWxlRGlyZWN0aXZlKVxyXG4gICAgcHVibGljIGZpbGVUZW1wbGF0ZTogVmRGaWxlRGlyZWN0aXZlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3VzdG9tIHRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBDb250ZW50Q2hpbGQoVmRDdXN0b21EaXJlY3RpdmUpXHJcbiAgICBwdWJsaWMgY3VzdG9tVGVtcGxhdGU6IFZkQ3VzdG9tRGlyZWN0aXZlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVtcGxhdGUgcmVmIGZvciBjdXN0b20gZmllbGRzIG9uIHRoZSBib3R0b21cclxuICAgICAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnYm90dG9tJylcclxuICAgIHB1YmxpYyBib3R0b206IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZW1wbGF0ZSByZWYgZm9yIGN1c3RvbSBmaWVsZHMgb24gdGhlIGJvdHRvbVxyXG4gICAgICovXHJcbiAgICBAQ29udGVudENoaWxkKCdjdXN0b21GaWVsZHMnKVxyXG4gICAgcHVibGljIGN1c3RvbUZpZWxkczogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbHRlcmQgb3B0aW9ucyBmb3IgYXV0b2NvbXBsZXRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhdXRvY29tcGxldGVGaWx0ZXJlZE9wdGlvbnM6IHt9ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhbGxiYWNrIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlXHJcbiAgICAgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY2hlY2tlZCB0aGUgZGlyZWN0aXZlJ3NcclxuICAgICAqIGRhdGEtYm91bmQgcHJvcGVydGllcyBmb3IgdGhlIGZpcnN0IHRpbWUsXHJcbiAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgdmlldyBvciBjb250ZW50IGNoaWxkcmVuIGhhdmUgYmVlbiBjaGVja2VkLlxyXG4gICAgICogSXQgaXMgaW52b2tlZCBvbmx5IG9uY2Ugd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGluc3RhbnRpYXRlZC5cclxuICAgICAqL1xyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgLyogQnVpbGQgdGhlIGZvcm0gZmllbGRzICovXHJcbiAgICAgICAgaWYgKHRoaXMuY2xhc3NUeXBlICYmICF0aGlzLmZpZWxkR3JvdXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnVpbGRGaWVsZHMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIEdldCBmaWxlZCByb3dzICovXHJcbiAgICAgICAgdGhpcy5maWVsZFJvd3MgPSB0aGlzLmZpZWxkR3JvdXBzPy5maWx0ZXIoeCA9PiB4Lm5hbWU/LnRyaW0oKSA9PSB0aGlzLmdyb3VwTmFtZT8udHJpbSgpKVswXT8uZ3JvdXBzO1xyXG5cclxuICAgICAgICAvKiBGaWx0ZXIgYnkgZmllbGQgc2V0ICovXHJcbiAgICAgICAgaWYgKHRoaXMuZmllbGRTZXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmllbGRSb3dzID0gdGhpcy5maWVsZFJvd3MubWFwKHggPT4geCA9IHguZmlsdGVyKHkgPT4geS5maWVsZFNldHM/LnNvbWUoeiA9PiB0aGlzLmZpZWxkU2V0cz8uc29tZShhID0+IGE/LnRyaW0oKT8udG9Mb3dlckNhc2UoKSA9PSB6Py50cmltKCk/LnRvTG93ZXJDYXNlKCkpKSkpLmZpbHRlcih4ID0+IHgubGVuZ3RoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFN1YnNjcmllIHRvIGNoYW5nZSBldmVudCAqL1xyXG4gICAgICAgIHRoaXMuZmllbGRSb3dzPy5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSk/LmZpbHRlcih5ID0+IHkudHlwZSAhPSBGb3JtRmllbGRUeXBlLkZpbGUgJiYgeS5jaGFuZ2UpPy5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cD8uZ2V0KHgubmFtZSk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKHkgPT4geC5jaGFuZ2UoeSwgdGhpcy5mb3JtR3JvdXA/LnZhbHVlLCB0aGlzLmZvcm1Hcm91cCwgdGhpcy5jb250ZXh0KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIGF1dG9jb21wbGV0ZSBldmVudFxyXG4gICAgICogQHBhcmFtIGZpZWxkIFxyXG4gICAgICogQHBhcmFtIGV2ZW50IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmlsdGVyQXV0b2NvbXBsZXRlKGZpZWxkOiBGb3JtRmllbGREZWZpbml0aW9uLCBldmVudDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVGaWx0ZXJlZE9wdGlvbnNbZmllbGQubmFtZV0gPSBmaWVsZC5vcHRpb25zPy5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZXZlbnQudmFsdWU/LnRvU3RyaW5nKCk/LnRvTG93ZXJDYXNlKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBjaGlwIHdoZW4gYSBhdXRvY29tcGxldGUgdmFsdWUgaXMgc2VsZWN0ZWRcclxuICAgICAqIEBwYXJhbSBmaWVsZCBcclxuICAgICAqIEBwYXJhbSBldmVudCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGF1dG9jb21wbGV0ZVZhbHVlU2VsZWN0ZWQoZmllbGQ6IEZvcm1GaWVsZERlZmluaXRpb24sIGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50LCBjaGlwSW5wdXRFdmVudDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fYWRkQ2hpcChmaWVsZCwgZXZlbnQub3B0aW9uLnZpZXdWYWx1ZSk7XHJcbiAgICAgICAgY2hpcElucHV0RXZlbnQudmFsdWUgPSAnJztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBjaGlwXHJcbiAgICAgKiBAcGFyYW0gZmllbGQgXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRDaGlwKGZpZWxkOiBGb3JtRmllbGREZWZpbml0aW9uLCBldmVudDogTWF0Q2hpcElucHV0RXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9hZGRDaGlwKGZpZWxkLCBldmVudC52YWx1ZSk7XHJcbiAgICAgICAgZXZlbnQuY2hpcElucHV0IS5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGNoaXBcclxuICAgICAqIEBwYXJhbSBmaWVsZCBcclxuICAgICAqIEBwYXJhbSBjaGlwIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlQ2hpcChmaWVsZDogRm9ybUZpZWxkRGVmaW5pdGlvbiwgY2hpcDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgLyogR2V0IHRoZSBmb3JtIGNvbnRyb2wgdXNpbmcgdGhlIGZpZWxkIG5hbWUgKi9cclxuICAgICAgICBsZXQgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwPy5jb250cm9sc1tmaWVsZC5uYW1lXTtcclxuXHJcbiAgICAgICAgLyogR2V0IHRoZSBpbmRleCBvZiB0aGUgY2hpcCAqL1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY29udHJvbC52YWx1ZS5pbmRleE9mKGNoaXApO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wudmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgY2hpcFxyXG4gICAgICogQHBhcmFtIGZpZWxkIFxyXG4gICAgICogQHBhcmFtIHZhbHVlIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9hZGRDaGlwKGZpZWxkOiBGb3JtRmllbGREZWZpbml0aW9uLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgLyogR2V0IHRoZSBmb3JtIGNvbnRyb2wgdXNpbmcgdGhlIGZpZWxkIG5hbWUgKi9cclxuICAgICAgICBsZXQgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwPy5jb250cm9sc1tmaWVsZC5uYW1lXTtcclxuXHJcbiAgICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY2hpcCAqL1xyXG4gICAgICAgIHZhbHVlID0gKHZhbHVlIHx8ICcnKS50cmltKCk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgdmFsdWUpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5pbnB1dFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG51bWJlciA9IHBhcnNlSW50KHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUucHVzaChudW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdmbG9hdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZsb2F0ID0gcGFyc2VGbG9hdCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZsb2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUucHVzaChmbG9hdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCdWlsZHMgdGhlIGZvcm0gZmllbGRzXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBidWlsZEZpZWxkcygpOiB2b2lkIHtcclxuICAgICAgICAvKiBHZXQgZm9ybSBkZWZpbml0aW9uICovXHJcbiAgICAgICAgdGhpcy5mb3JtRGVmaW5pdGlvbiA9IGdldEZvcm1EZWZpbml0aW9uKG5ldyB0aGlzLmNsYXNzVHlwZSgpKTtcclxuXHJcbiAgICAgICAgLyogQ3JlYXRlIHRoZSBmcm9tIGZpZWxkcyB1c2luZyB0aGUgZW50aXR5IHR5cGUgKi9cclxuICAgICAgICB0aGlzLmZpZWxkR3JvdXBzID0gdGhpcy5mb3JtRGVmaW5pdGlvbj8uZmllbGRHcm91cHM7XHJcbiAgICB9XHJcbn0iLCI8ZGl2ICpuZ0lmPVwiZm9ybUdyb3VwICYmIGZpZWxkUm93c1wiIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XHJcbiAgICA8IS0tICNyZWdpb24gRmllbGRzIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGRzIG9mIGZpZWxkUm93czsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgIDxkaXYgbGF5b3V0LWd0LXNtPVwicm93XCIgbGF5b3V0PVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZpZWxkc1wiIFtuZ1N3aXRjaF09XCJmaWVsZC50eXBlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLmhpZGUgfHwgIWZpZWxkLmhpZGUoZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC53cmFwcGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBUZXh0IGlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nU3dpdGNoQ2FzZT1cIkZvcm1GaWVsZFR5cGUuVGV4dFwiIFthdHRyLmZsZXhdPVwiZmllbGQuZmxleHx8MFwiIFtjbGFzc109XCJmaWVsZC5jc3NDbGFzc1wiIGxheW91dC1tYXJnaW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7ZmllbGQuaGVhZGVyfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbdHlwZV09XCJmaWVsZC5pbnB1dFR5cGVcIiBbbWlubGVuZ3RoXT1cImZpZWxkLm1pbkxlbmd0aHx8bnVsbFwiIFttYXhsZW5ndGhdPVwiZmllbGQubWF4TGVuZ3RofHxudWxsXCIgW21pbl09XCJmaWVsZC5taW5cIiBbbWF4XT1cImZpZWxkLm1heFwiIG1hdElucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiIFtyZWFkb25seV09XCJyZWFkb25seSB8fCAoZmllbGQucmVhZG9ubHkgJiYgZmllbGQucmVhZG9ubHkoZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1ZmZpeEJ1dHRvbiBvZiBmaWVsZC5zdWZmaXhCdXR0b25zXCIgKGNsaWNrKT1cInN1ZmZpeEJ1dHRvbi5ldmVudCAmJiBzdWZmaXhCdXR0b24uZXZlbnQoZm9ybUdyb3VwPy52YWx1ZSwgY29udGV4dClcIiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiIXN1ZmZpeEJ1dHRvbi5oaWRlIHx8ICFzdWZmaXhCdXR0b24uaGlkZShmb3JtR3JvdXA/LnZhbHVlLCBjb250ZXh0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+e3tzdWZmaXhCdXR0b24uaWNvbn19PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwiZmllbGQuaGludFwiPnt7ZmllbGQuaGludH19PC9tYXQtaGludD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nRm9yPVwibGV0IGVycm9yTWVzc2FnZSBvZiBmb3JtR3JvdXAuY29udHJvbHNbZmllbGQubmFtZV1bJ2Vycm9yTWVzc2FnZXMnXVwiPnt7ZXJyb3JNZXNzYWdlfX08L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIFRleHRhcmVhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nU3dpdGNoQ2FzZT1cIkZvcm1GaWVsZFR5cGUuVGV4dEFyZWFcIiBbYXR0ci5mbGV4XT1cImZpZWxkLmZsZXh8fDBcIiBbY2xhc3NdPVwiZmllbGQuY3NzQ2xhc3NcIiBsYXlvdXQtbWFyZ2luPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2ZpZWxkLmhlYWRlcn19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCIgcm93cz1cImZpZWxkLnJvd3N8fDJcIiBbcmVhZG9ubHldPVwicmVhZG9ubHkgfHwgKGZpZWxkLnJlYWRvbmx5ICYmIGZpZWxkLnJlYWRvbmx5KGZvcm1Hcm91cD8udmFsdWUsIGZvcm1Hcm91cCwgY29udGV4dCkpXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1ZmZpeEJ1dHRvbiBvZiBmaWVsZC5zdWZmaXhCdXR0b25zXCIgKGNsaWNrKT1cInN1ZmZpeEJ1dHRvbi5ldmVudCAmJiBzdWZmaXhCdXR0b24uZXZlbnQoZm9ybUdyb3VwPy52YWx1ZSwgY29udGV4dClcIiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiIXN1ZmZpeEJ1dHRvbi5oaWRlIHx8ICFzdWZmaXhCdXR0b24uaGlkZShmb3JtR3JvdXA/LnZhbHVlLCBjb250ZXh0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+e3tzdWZmaXhCdXR0b24uaWNvbn19PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwiZmllbGQuaGludFwiPnt7ZmllbGQuaGludH19PC9tYXQtaGludD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nRm9yPVwibGV0IGVycm9yTWVzc2FnZSBvZiBmb3JtR3JvdXAuY29udHJvbHNbZmllbGQubmFtZV1bJ2Vycm9yTWVzc2FnZXMnXVwiPnt7ZXJyb3JNZXNzYWdlfX08L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIEVudW0gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiRm9ybUZpZWxkVHlwZS5FbnVtXCIgW2F0dHIuZmxleF09XCJmaWVsZC5mbGV4fHwwXCIgW2NsYXNzXT1cImZpZWxkLmNzc0NsYXNzXCIgbGF5b3V0LW1hcmdpbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZkLXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbZW51bV09XCJmaWVsZC5lbnVtVHlwZVwiIFtrZXldPVwiZmllbGQub3B0aW9uVmFsdWVcIiBbdGV4dF09XCJmaWVsZC5vcHRpb25UZXh0XCIgW211bHRpcGxlXT1cImZpZWxkLm11bHRpcGxlXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8IChmaWVsZC5yZWFkb25seSAmJiBmaWVsZC5yZWFkb25seShmb3JtR3JvdXA/LnZhbHVlLCBmb3JtR3JvdXAsIGNvbnRleHQpKVwiIFt0cmlnZ2VyQ3NzQ2xhc3NdPVwiZmllbGQudHJpZ2dlckNzc0NsYXNzXCIgW3RyaWdnZXJNb2RlXT1cImZpZWxkLnRyaWdnZXJNb2RlXCIgbGF5b3V0PVwicm93XCIgZmxleD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdmQtc2VsZWN0LXRyaWdnZXIgbGV0LXRyaWdnZXI9XCJ0cmlnZ2VyXCIgKm5nSWY9XCJmaWVsZC50cmlnZ2VyVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJmaWVsZC50cmlnZ2VyVGVtcGxhdGUodHJpZ2dlciwgZm9ybUdyb3VwLnZhbHVlLCBmb3JtR3JvdXAsIGNvbnRleHQpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHZkLXNlbGVjdC1vcHRpb24gbGV0LW9wdGlvbj1cIm9wdGlvblwiICpuZ0lmPVwiZmllbGQub3B0aW9uVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW291dGVySFRNTF09XCJmaWVsZC5vcHRpb25UZW1wbGF0ZShvcHRpb24sIGZvcm1Hcm91cC52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ZC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWZmaXhCdXR0b24gb2YgZmllbGQuc3VmZml4QnV0dG9uc1wiIChjbGljayk9XCJzdWZmaXhCdXR0b24uZXZlbnQgJiYgc3VmZml4QnV0dG9uLmV2ZW50KGZvcm1Hcm91cD8udmFsdWUsIGNvbnRleHQpXCIgbWF0U3VmZml4PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cIiFzdWZmaXhCdXR0b24uaGlkZSB8fCAhc3VmZml4QnV0dG9uLmhpZGUoZm9ybUdyb3VwPy52YWx1ZSwgY29udGV4dClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnt7c3VmZml4QnV0dG9uLmljb259fTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cImZpZWxkLmhpbnRcIj57e2ZpZWxkLmhpbnR9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvck1lc3NhZ2Ugb2YgZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdWydlcnJvck1lc3NhZ2VzJ11cIj57e2Vycm9yTWVzc2FnZX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBWZFNlbGVjdCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCJGb3JtRmllbGRUeXBlLlZkU2VsZWN0XCIgW2F0dHIuZmxleF09XCJmaWVsZC5mbGV4fHwwXCIgW2NsYXNzXT1cImZpZWxkLmNzc0NsYXNzXCIgbGF5b3V0LW1hcmdpbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZkLXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbZW5kcG9pbnRdPVwiZmllbGQuZW5kcG9pbnQgfCBmdW5jOmZvcm1Hcm91cC52YWx1ZTpmb3JtR3JvdXA6Y29udGV4dFwiIFtwYXJhbXNdPVwiZmllbGQucGFyYW1zIHwgZnVuYzpmb3JtR3JvdXAudmFsdWU6Zm9ybUdyb3VwOmNvbnRleHRcIiBbcHJvamVjdGlvbl09XCJmaWVsZC5wcm9qZWN0aW9uXCIgW21hcHBlcl09XCJmaWVsZC5tYXBwZXJcIiBbY29tcGFyZVdpdGhdPVwiZmllbGQuY29tcGFyZVdpdGhcIiBba2V5XT1cImZpZWxkLm9wdGlvblZhbHVlXCIgW3RleHRdPVwiZmllbGQub3B0aW9uVGV4dFwiIFttdWx0aXBsZV09XCJmaWVsZC5tdWx0aXBsZVwiIFtyZWFkb25seV09XCJyZWFkb25seSB8fCAoZmllbGQucmVhZG9ubHkgJiYgZmllbGQucmVhZG9ubHkoZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KSlcIiBbdHJpZ2dlckNzc0NsYXNzXT1cImZpZWxkLnRyaWdnZXJDc3NDbGFzc1wiIFt0cmlnZ2VyTW9kZV09XCJmaWVsZC50cmlnZ2VyTW9kZVwiIChpdGVtU2VsZWN0ZWQpPVwiZmllbGQuaXRlbVNlbGVjdCAmJiBmaWVsZC5pdGVtU2VsZWN0KCRldmVudCwgZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KTtcIiAoaXRlbUNoYW5nZSk9XCJmaWVsZC5pdGVtQ2hhbmdlICYmIGZpZWxkLml0ZW1DaGFuZ2UoJGV2ZW50LCBmb3JtR3JvdXA/LnZhbHVlLCBmb3JtR3JvdXAsIGNvbnRleHQpO1wiIGxheW91dD1cInJvd1wiIGZsZXg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHZkLXNlbGVjdC10cmlnZ2VyIGxldC10cmlnZ2VyPVwidHJpZ2dlclwiICpuZ0lmPVwiZmllbGQudHJpZ2dlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwiZmllbGQudHJpZ2dlclRlbXBsYXRlKHRyaWdnZXIsIGZvcm1Hcm91cC52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSB2ZC1zZWxlY3QtdHJpZ2dlciBsZXQtdHJpZ2dlcj1cInRyaWdnZXJcIiAqbmdJZj1cImZpZWxkLnRyaWdnZXJNYXBwZXIgJiYgZmllbGQubXVsdGlwbGUgJiYgZmllbGQudHJpZ2dlck1vZGUgPT0gJ2NoaXAnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBpdGVtIG9mIHRyaWdnZXJcIiBjbGFzcz1cIm1hdC1tZGMtY2hpcCBtYXQtbWRjLXN0YW5kYXJkLWNoaXAgbWF0LWFjY2VudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJmaWVsZC50cmlnZ2VyTWFwcGVyKGl0ZW0sIGZvcm1Hcm91cC52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHZkLXNlbGVjdC1vcHRpb24gbGV0LW9wdGlvbj1cIm9wdGlvblwiICpuZ0lmPVwiZmllbGQub3B0aW9uVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW291dGVySFRNTF09XCJmaWVsZC5vcHRpb25UZW1wbGF0ZShvcHRpb24sIGZvcm1Hcm91cC52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ZC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWZmaXhCdXR0b24gb2YgZmllbGQuc3VmZml4QnV0dG9uc1wiIChjbGljayk9XCJzdWZmaXhCdXR0b24uZXZlbnQgJiYgc3VmZml4QnV0dG9uLmV2ZW50KGZvcm1Hcm91cD8udmFsdWUsIGNvbnRleHQpXCIgbWF0U3VmZml4PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cIiFzdWZmaXhCdXR0b24uaGlkZSB8fCAhc3VmZml4QnV0dG9uLmhpZGUoZm9ybUdyb3VwPy52YWx1ZSwgY29udGV4dClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnt7c3VmZml4QnV0dG9uLmljb259fTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cImZpZWxkLmhpbnRcIj57e2ZpZWxkLmhpbnR9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvck1lc3NhZ2Ugb2YgZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdWydlcnJvck1lc3NhZ2VzJ11cIj57e2Vycm9yTWVzc2FnZX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBDaGlwcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCJGb3JtRmllbGRUeXBlLkNoaXBzXCIgW2F0dHIuZmxleF09XCJmaWVsZC5mbGV4fHwwXCIgW2NsYXNzXT1cImZpZWxkLmNzc0NsYXNzXCIgbGF5b3V0LW1hcmdpbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLWdyaWQgI2NoaXBMaXN0IFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoZmllbGQucmVhZG9ubHkgJiYgZmllbGQucmVhZG9ubHkoZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtcm93ICpuZ0Zvcj1cImxldCBjaGlwIG9mIGZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5uYW1lXT8udmFsdWVcIiAocmVtb3ZlZCk9XCJyZW1vdmVDaGlwKGZpZWxkLCBjaGlwKVwiIGNvbG9yPVwicHJpbWFyeVwiIHNlbGVjdGFibGU9XCJ0cnVlXCIgc2VsZWN0ZWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7Y2hpcH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdENoaXBSZW1vdmU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1yb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtwbGFjZWhvbGRlcl09XCJmaWVsZC5oZWFkZXJcIiAjY2hpcElucHV0IFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RcIiBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwic2VwYXJhdG9yS2V5c0NvZGVzXCIgW21hdEF1dG9jb21wbGV0ZV09XCJjaGlwQXV0b2NvbXBsZXRlXCIgKGlucHV0KT1cImZpbHRlckF1dG9jb21wbGV0ZShmaWVsZCwgY2hpcElucHV0KVwiIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGRDaGlwKGZpZWxkLCAkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWdyaWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSBhdXRvQWN0aXZlRmlyc3RPcHRpb24gI2NoaXBBdXRvY29tcGxldGU9XCJtYXRBdXRvY29tcGxldGVcIiBbY2xhc3NdPVwiZmllbGQuYXV0b2NvbXBsZXRlQ3NzQ2xhc3NcIiAob3B0aW9uU2VsZWN0ZWQpPVwiYXV0b2NvbXBsZXRlVmFsdWVTZWxlY3RlZChmaWVsZCwgJGV2ZW50LCBjaGlwSW5wdXQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBhdXRvY29tcGxldGVGaWx0ZXJlZE9wdGlvbnNbZmllbGQubmFtZV1cIiBbdmFsdWVdPVwib3B0aW9uLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1ZmZpeEJ1dHRvbiBvZiBmaWVsZC5zdWZmaXhCdXR0b25zXCIgKGNsaWNrKT1cInN1ZmZpeEJ1dHRvbi5ldmVudCAmJiBzdWZmaXhCdXR0b24uZXZlbnQoZm9ybUdyb3VwPy52YWx1ZSwgY29udGV4dClcIiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiIXN1ZmZpeEJ1dHRvbi5oaWRlIHx8ICFzdWZmaXhCdXR0b24uaGlkZShmb3JtR3JvdXA/LnZhbHVlLCBjb250ZXh0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+e3tzdWZmaXhCdXR0b24uaWNvbn19PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwiZmllbGQuaGludFwiPnt7ZmllbGQuaGludH19PC9tYXQtaGludD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nRm9yPVwibGV0IGVycm9yTWVzc2FnZSBvZiBmb3JtR3JvdXAuY29udHJvbHNbZmllbGQubmFtZV1bJ2Vycm9yTWVzc2FnZXMnXVwiPnt7ZXJyb3JNZXNzYWdlfX08L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIFZkQ2hpcHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiRm9ybUZpZWxkVHlwZS5WZENoaXBzXCIgW2F0dHIuZmxleF09XCJmaWVsZC5mbGV4fHwwXCIgW2NsYXNzXT1cImZpZWxkLmNzc0NsYXNzXCIgbGF5b3V0LW1hcmdpbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZkLWNoaXBzICN2ZENoaXAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCIgW2VuZHBvaW50XT1cImZpZWxkLmVuZHBvaW50IHwgZnVuYzpmb3JtR3JvdXAudmFsdWU6Zm9ybUdyb3VwOmNvbnRleHRcIiBbcGFyYW1zXT1cImZpZWxkLnBhcmFtcyB8IGZ1bmM6Zm9ybUdyb3VwLnZhbHVlOmZvcm1Hcm91cDpjb250ZXh0XCIgW3NlYXJjaEZpZWxkXT1cImZpZWxkLnNlYXJjaEZpZWxkXCIgW2NsYXNzVHlwZV09XCJmaWVsZC5jbGFzc1R5cGVcIiBbcHJvamVjdGlvbl09XCJmaWVsZC5wcm9qZWN0aW9uXCIgW2tleV09XCJmaWVsZC5vcHRpb25WYWx1ZVwiIFtyZWFkb25seV09XCJyZWFkb25seSB8fCAoZmllbGQucmVhZG9ubHkgJiYgZmllbGQucmVhZG9ubHkoZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KSlcIiBbcmVtb3ZhYmxlXT1cIiFmaWVsZC5jbGVhclwiIFtjb250ZXh0XT1cImNvbnRleHRcIiBbc3VmZml4QnV0dG9uc109XCJmaWVsZC5zdWZmaXhCdXR0b25zXCIgW2F1dG9jb21wbGV0ZUNzc0NsYXNzXT1cImZpZWxkLmF1dG9jb21wbGV0ZUNzc0NsYXNzXCIgKGluaXRTZWxlY3QpPVwiZmllbGQuaXRlbVNlbGVjdCAmJiBmaWVsZC5pdGVtU2VsZWN0KCRldmVudCwgZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KTtcIiAoc2VsZWN0ZWQpPVwiZmllbGQuaXRlbUNoYW5nZSAmJiBmaWVsZC5pdGVtQ2hhbmdlKCRldmVudCwgZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KTtcIiAoY2xlYXJlZCk9XCJmaWVsZC5jbGVhciAmJiBmaWVsZC5jbGVhcihmb3JtR3JvdXA/LnZhbHVlLCBmb3JtR3JvdXAsIGNvbnRleHQpO1wiIGxheW91dD1cInJvd1wiIGZsZXg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHZkLWNoaXAgbGV0LWNoaXA9XCJjaGlwXCIgKm5nSWY9XCJmaWVsZC5jaGlwVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbb3V0ZXJIVE1MXT1cImZpZWxkLmNoaXBUZW1wbGF0ZShjaGlwLCBmb3JtR3JvdXAudmFsdWUsIGZvcm1Hcm91cCwgY29udGV4dClcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSB2ZC1hdXRvY29tcGxldGUtb3B0aW9uIGxldC1vcHRpb249XCJvcHRpb25cIiAqbmdJZj1cImZpZWxkLmF1dG9jb21wbGV0ZVRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW291dGVySFRNTF09XCJmaWVsZC5hdXRvY29tcGxldGVUZW1wbGF0ZShvcHRpb24sIGZvcm1Hcm91cC52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ZkLWNoaXBzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwiZmllbGQuaGludFwiPnt7ZmllbGQuaGludH19PC9tYXQtaGludD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cInZkQ2hpcC5lbXB0eVJlc3VsdFwiIGNsYXNzPVwidGMtcmVkLTQwMFwiIGkxOG49XCJAQG5vUmVzdWx0c0ZvdW5kXCI+Tm8gcmVzdWx0cyB3ZXJlIGZvdW5kLjwvbWF0LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvck1lc3NhZ2Ugb2YgZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdWydlcnJvck1lc3NhZ2VzJ11cIj57e2Vycm9yTWVzc2FnZX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBTZWxlY3QgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiRm9ybUZpZWxkVHlwZS5TZWxlY3RcIiBbYXR0ci5mbGV4XT1cImZpZWxkLmZsZXh8fDBcIiBbY2xhc3NdPVwiZmllbGQuY3NzQ2xhc3NcIiBsYXlvdXQtbWFyZ2luPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2ZpZWxkLmhlYWRlcn19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbbXVsdGlwbGVdPVwiZmllbGQubXVsdGlwbGVcIiBbZGlzYWJsZUNvbnRyb2xdPVwicmVhZG9ubHkgfHwgKGZpZWxkLnJlYWRvbmx5ICYmIGZpZWxkLnJlYWRvbmx5KGZvcm1Hcm91cD8udmFsdWUsIGZvcm1Hcm91cCwgY29udGV4dCkpXCIgZmxleD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpZWxkLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uLmlkXCI+e3tvcHRpb24ubmFtZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3VmZml4QnV0dG9uIG9mIGZpZWxkLnN1ZmZpeEJ1dHRvbnNcIiAoY2xpY2spPVwic3VmZml4QnV0dG9uLmV2ZW50ICYmIHN1ZmZpeEJ1dHRvbi5ldmVudChmb3JtR3JvdXA/LnZhbHVlLCBjb250ZXh0KVwiIG1hdFN1ZmZpeD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCIhc3VmZml4QnV0dG9uLmhpZGUgfHwgIXN1ZmZpeEJ1dHRvbi5oaWRlKGZvcm1Hcm91cD8udmFsdWUsIGNvbnRleHQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj57e3N1ZmZpeEJ1dHRvbi5pY29ufX08L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJmaWVsZC5oaW50XCI+e3tmaWVsZC5oaW50fX08L21hdC1oaW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdGb3I9XCJsZXQgZXJyb3JNZXNzYWdlIG9mIGZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5uYW1lXVsnZXJyb3JNZXNzYWdlcyddXCI+e3tlcnJvck1lc3NhZ2V9fTwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gQXV0b2NvbXBsZXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nU3dpdGNoQ2FzZT1cIkZvcm1GaWVsZFR5cGUuQXV0b2NvbXBsZXRlXCIgW2F0dHIuZmxleF09XCJmaWVsZC5mbGV4fHwwXCIgW2NsYXNzXT1cImZpZWxkLmNzc0NsYXNzXCIgbGF5b3V0LW1hcmdpbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCIgW21pbl09XCJmaWVsZC5taW5cIiBbbWF4XT1cImZpZWxkLm1heFwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiICNhdXRvY29tcGxldGVJbnB1dCAoaW5wdXQpPVwiZmlsdGVyQXV0b2NvbXBsZXRlKGZpZWxkLCBhdXRvY29tcGxldGVJbnB1dClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBbcmVhZG9ubHldPVwicmVhZG9ubHkgfHwgKGZpZWxkLnJlYWRvbmx5ICYmIGZpZWxkLnJlYWRvbmx5KGZvcm1Hcm91cD8udmFsdWUsIGZvcm1Hcm91cCwgY29udGV4dCkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSBhdXRvQWN0aXZlRmlyc3RPcHRpb24gI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiBbY2xhc3NdPVwiZmllbGQuYXV0b2NvbXBsZXRlQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGF1dG9jb21wbGV0ZUZpbHRlcmVkT3B0aW9uc1tmaWVsZC5uYW1lXVwiIFt2YWx1ZV09XCJvcHRpb24uaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3VmZml4QnV0dG9uIG9mIGZpZWxkLnN1ZmZpeEJ1dHRvbnNcIiAoY2xpY2spPVwic3VmZml4QnV0dG9uLmV2ZW50ICYmIHN1ZmZpeEJ1dHRvbi5ldmVudChmb3JtR3JvdXA/LnZhbHVlLCBjb250ZXh0KVwiIG1hdFN1ZmZpeD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCIhc3VmZml4QnV0dG9uLmhpZGUgfHwgIXN1ZmZpeEJ1dHRvbi5oaWRlKGZvcm1Hcm91cD8udmFsdWUsIGNvbnRleHQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj57e3N1ZmZpeEJ1dHRvbi5pY29ufX08L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJmaWVsZC5oaW50XCI+e3tmaWVsZC5oaW50fX08L21hdC1oaW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdGb3I9XCJsZXQgZXJyb3JNZXNzYWdlIG9mIGZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5uYW1lXVsnZXJyb3JNZXNzYWdlcyddXCI+e3tlcnJvck1lc3NhZ2V9fTwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gRGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCJGb3JtRmllbGRUeXBlLkRhdGVcIiBbYXR0ci5mbGV4XT1cImZpZWxkLmZsZXh8fDBcIiBbY2xhc3NdPVwiZmllbGQuY3NzQ2xhc3NcIiBsYXlvdXQtbWFyZ2luPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2ZpZWxkLmhlYWRlcn19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCIgW21pbl09XCJmaWVsZC5taW5cIiBbbWF4XT1cImZpZWxkLm1heFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFttYXREYXRlcGlja2VyXT1cImRhdGVQaWNrZXJcIiBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJmaWVsZC5kYXRlRmlsdGVyXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8IChmaWVsZC5yZWFkb25seSAmJiBmaWVsZC5yZWFkb25seShmb3JtR3JvdXA/LnZhbHVlLCBmb3JtR3JvdXAsIGNvbnRleHQpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJkYXRlUGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI2RhdGVQaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cImZpZWxkLmhpbnRcIj57e2ZpZWxkLmhpbnR9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvck1lc3NhZ2Ugb2YgZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdWydlcnJvck1lc3NhZ2VzJ11cIj57e2Vycm9yTWVzc2FnZX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIENoZWNrYm94IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkZvcm1GaWVsZFR5cGUuQ2hlY2tib3hcIiBbYXR0ci5mbGV4XT1cImZpZWxkLmZsZXh8fDBcIiBbY2xhc3NdPVwiZmllbGQuY3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbZGlzYWJsZUNvbnRyb2xdPVwicmVhZG9ubHkgfHwgKGZpZWxkLnJlYWRvbmx5ICYmIGZpZWxkLnJlYWRvbmx5KGZvcm1Hcm91cD8udmFsdWUsIGZvcm1Hcm91cCwgY29udGV4dCkpXCI+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIEVkaXRvciAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJGb3JtRmllbGRUeXBlLkVkaXRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJlZGl0b3JUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJlZGl0b3JUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQsIGZvcm1Hcm91cDogZm9ybUdyb3VwIH1cIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIENvZGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiRm9ybUZpZWxkVHlwZS5Db2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNvZGVUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2RlVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCB9XCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBGaWxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkZvcm1GaWVsZFR5cGUuRmlsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgW2F0dHIuZmxleF09XCJmaWVsZC5mbGV4fHwwXCIgbGF5b3V0LW1hcmdpbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB2ZC1maWxlLWlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiIChzZWxlY3QpPVwiZmllbGQuY2hhbmdlICYmIGZpZWxkLmNoYW5nZSgkZXZlbnQsIGZvcm1Hcm91cCwgY29udGV4dClcIiBbYWNjZXB0XT1cImZpZWxkLmZpbGVFeHRlbnNpb25zXCIgW2Rpc2FibGVDb250cm9sXT1cInJlYWRvbmx5IHx8IChmaWVsZC5yZWFkb25seSAmJiBmaWVsZC5yZWFkb25seShmb3JtR3JvdXA/LnZhbHVlLCBmb3JtR3JvdXAsIGNvbnRleHQpKVwiIGZsZXg+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gQ3VzdG9tIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkZvcm1GaWVsZFR5cGUuQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImN1c3RvbVRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbVRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCwgZm9ybUdyb3VwOiBmb3JtR3JvdXAgfVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tICNyZWdpb24gVGVtcGxhdGUgZm9yIGN1c3RvbSBmaWVsZHMgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21GaWVsZHNcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2Zvcm1Hcm91cDogZm9ybUdyb3VwLCByb3c6IGZpZWxkc1swXT8ucm93ICsgMX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICA8IS0tICNyZWdpb24gRm9ybSBib3R0b20gLS0+XHJcbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJvdHRvbVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Zm9ybUdyb3VwOiBmb3JtR3JvdXB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG4gICAgPCEtLSAjcmVnaW9uIERlYnVnIHZhbHVlIC0tPlxyXG4gICAgPGNvZGUgKm5nSWY9XCJkZWJ1Z1ZhbHVlXCI+XHJcbiAgICAgICAgPHByZT57e2Zvcm1Hcm91cD8udmFsdWUgfCBqc29ufX08L3ByZT5cclxuICAgIDwvY29kZT5cclxuICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuPC9kaXY+Il19
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nkay9zcmMvbGliL2Zvcm1zL2NvbXBvbmVudHMvZ2VuZXJpYy1mb3JtL2dlbmVyaWMtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi9mb3Jtcy9jb21wb25lbnRzL2dlbmVyaWMtZm9ybS9nZW5lcmljLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxXQUFXLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUk5RDs7R0FFRztBQUVILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxTQUFTO0lBQzVDLFlBQVksV0FBNkIsRUFBRSxnQkFBa0M7UUFDekUsS0FBSyxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7O2lJQUhRLGlCQUFpQjtxSEFBakIsaUJBQWlCOzJGQUFqQixpQkFBaUI7a0JBRDdCLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUs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Z0JBT3hCLFlBQVk7c0JBRGxCLFlBQVk7dUJBQUMsZUFBZTtnQkFPdEIsWUFBWTtzQkFEbEIsWUFBWTt1QkFBQyxlQUFlO2dCQU90QixjQUFjO3NCQURwQixZQUFZO3VCQUFDLGlCQUFpQjtnQkFPeEIsTUFBTTtzQkFEWixZQUFZO3VCQUFDLFFBQVE7Z0JBT2YsWUFBWTtzQkFEbEIsWUFBWTt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ09NTUEsIEVOVEVSIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcclxuaW1wb3J0IHsgQ2RrUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBEaXJlY3RpdmUsIElucHV0LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBUeXBlLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XHJcbmltcG9ydCB7IE1hdENoaXBJbnB1dEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xyXG5pbXBvcnQgeyBGb3JtRmllbGRUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvZm9ybS1maWVsZC10eXBlJztcclxuaW1wb3J0IHsgZ2V0Rm9ybURlZmluaXRpb24gfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgRm9ybURlZmluaXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvZm9ybS1kZWZpbml0aW9uJztcclxuaW1wb3J0IHsgRm9ybUZpZWxkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9mb3JtLWZpZWxkLWRlZmluaXRpb24nO1xyXG5pbXBvcnQgeyBGb3JtRmllbGRHcm91cERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvZm9ybS1maWVsZC1ncm91cC1kZWZpbml0aW9uJztcclxuXHJcbi8qKlxyXG4gKiBWZEVkaXRvckRpcmVjdGl2ZSBjbGFzc1xyXG4gKi9cclxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW3ZkLWVkaXRvcl1uZy10ZW1wbGF0ZScgfSlcclxuZXhwb3J0IGNsYXNzIFZkRWRpdG9yRGlyZWN0aXZlIGV4dGVuZHMgQ2RrUG9ydGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgICAgc3VwZXIodGVtcGxhdGVSZWYsIHZpZXdDb250YWluZXJSZWYpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogVmRDb2RlRGlyZWN0aXZlIGNsYXNzXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbdmQtY29kZV1uZy10ZW1wbGF0ZScgfSlcclxuZXhwb3J0IGNsYXNzIFZkQ29kZURpcmVjdGl2ZSBleHRlbmRzIENka1BvcnRhbCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Piwgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge1xyXG4gICAgICAgIHN1cGVyKHRlbXBsYXRlUmVmLCB2aWV3Q29udGFpbmVyUmVmKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFZkRmlsZURpcmVjdGl2ZSBjbGFzc1xyXG4gKi9cclxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW3ZkLWZpbGVdbmctdGVtcGxhdGUnIH0pXHJcbmV4cG9ydCBjbGFzcyBWZEZpbGVEaXJlY3RpdmUgZXh0ZW5kcyBDZGtQb3J0YWwge1xyXG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYpIHtcclxuICAgICAgICBzdXBlcih0ZW1wbGF0ZVJlZiwgdmlld0NvbnRhaW5lclJlZik7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBWZEN1c3RvbURpcmVjdGl2ZSBjbGFzc1xyXG4gKi9cclxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW3ZkLWN1c3RvbV1uZy10ZW1wbGF0ZScgfSlcclxuZXhwb3J0IGNsYXNzIFZkQ3VzdG9tRGlyZWN0aXZlIGV4dGVuZHMgQ2RrUG9ydGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgICAgc3VwZXIodGVtcGxhdGVSZWYsIHZpZXdDb250YWluZXJSZWYpO1xyXG4gICAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAndmQtZ2VuZXJpYy1mb3JtJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9nZW5lcmljLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZ2VuZXJpYy1mb3JtLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFZkR2VuZXJpY0Zvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBmb3JtOiBGb3JtR3JvdXBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmb3JtR3JvdXA6IEZvcm1Hcm91cDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNsYXNzVHlwZTogVHlwZTxhbnk+XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgY2xhc3NUeXBlOiBUeXBlPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBmb3JtRGVmaW5pdGlvbjogRm9ybURlZmluaXRpb25cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmb3JtRGVmaW5pdGlvbjogRm9ybURlZmluaXRpb247XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBmaWVsZEdyb3VwczogRm9ybUZpZWxkR3JvdXBbXVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGZpZWxkR3JvdXBzOiBGb3JtRmllbGRHcm91cERlZmluaXRpb25bXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdyb3VwIG5hbWVcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBncm91cE5hbWU6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpZWxkIHNldCBuYW1lXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZmllbGRTZXRzOiBzdHJpbmdbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbnRleHQ6IGFueVxyXG4gICAgICogVGhlIGN1cnJlbnQgY29udGV4dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGNvbnRleHQ6IGFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGRlYnVnVmFsdWU6IGJvb2xlYW5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkZWJ1Z1ZhbHVlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmVhZG9ubHk6IGJvb2xlYW5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogc2VwYXJhdG9yS2V5c0NvZGVzOiBudW1iZXJbXVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlcGFyYXRvcktleXNDb2RlczogbnVtYmVyW10gPSBbRU5URVIsIENPTU1BXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGZpZWxkUm93czogRm9ybUZpZWxkRGVmaW5pdGlvbltdXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaWVsZFJvd3M6IEZvcm1GaWVsZERlZmluaXRpb25bXVtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9ybUZpZWxkVHlwZTogdHlwZW9mIEZvcm1GaWVsZFR5cGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZvcm1GaWVsZFR5cGU6IHR5cGVvZiBGb3JtRmllbGRUeXBlID0gRm9ybUZpZWxkVHlwZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVkaXRvciB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBAQ29udGVudENoaWxkKFZkRWRpdG9yRGlyZWN0aXZlKVxyXG4gICAgcHVibGljIGVkaXRvclRlbXBsYXRlOiBWZEVkaXRvckRpcmVjdGl2ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvZGUgdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgQENvbnRlbnRDaGlsZChWZENvZGVEaXJlY3RpdmUpXHJcbiAgICBwdWJsaWMgY29kZVRlbXBsYXRlOiBWZENvZGVEaXJlY3RpdmU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxlIHRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBDb250ZW50Q2hpbGQoVmRGaWxlRGlyZWN0aXZlKVxyXG4gICAgcHVibGljIGZpbGVUZW1wbGF0ZTogVmRGaWxlRGlyZWN0aXZlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3VzdG9tIHRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBDb250ZW50Q2hpbGQoVmRDdXN0b21EaXJlY3RpdmUpXHJcbiAgICBwdWJsaWMgY3VzdG9tVGVtcGxhdGU6IFZkQ3VzdG9tRGlyZWN0aXZlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVtcGxhdGUgcmVmIGZvciBjdXN0b20gZmllbGRzIG9uIHRoZSBib3R0b21cclxuICAgICAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnYm90dG9tJylcclxuICAgIHB1YmxpYyBib3R0b206IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZW1wbGF0ZSByZWYgZm9yIGN1c3RvbSBmaWVsZHMgb24gdGhlIGJvdHRvbVxyXG4gICAgICovXHJcbiAgICBAQ29udGVudENoaWxkKCdjdXN0b21GaWVsZHMnKVxyXG4gICAgcHVibGljIGN1c3RvbUZpZWxkczogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbHRlcmQgb3B0aW9ucyBmb3IgYXV0b2NvbXBsZXRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhdXRvY29tcGxldGVGaWx0ZXJlZE9wdGlvbnM6IHt9ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhbGxiYWNrIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlXHJcbiAgICAgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY2hlY2tlZCB0aGUgZGlyZWN0aXZlJ3NcclxuICAgICAqIGRhdGEtYm91bmQgcHJvcGVydGllcyBmb3IgdGhlIGZpcnN0IHRpbWUsXHJcbiAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgdmlldyBvciBjb250ZW50IGNoaWxkcmVuIGhhdmUgYmVlbiBjaGVja2VkLlxyXG4gICAgICogSXQgaXMgaW52b2tlZCBvbmx5IG9uY2Ugd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGluc3RhbnRpYXRlZC5cclxuICAgICAqL1xyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgLyogQnVpbGQgdGhlIGZvcm0gZmllbGRzICovXHJcbiAgICAgICAgaWYgKHRoaXMuY2xhc3NUeXBlICYmICF0aGlzLmZpZWxkR3JvdXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnVpbGRGaWVsZHMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIEdldCBmaWxlZCByb3dzICovXHJcbiAgICAgICAgdGhpcy5maWVsZFJvd3MgPSB0aGlzLmZpZWxkR3JvdXBzPy5maWx0ZXIoeCA9PiB4Lm5hbWU/LnRyaW0oKSA9PSB0aGlzLmdyb3VwTmFtZT8udHJpbSgpKVswXT8uZ3JvdXBzO1xyXG5cclxuICAgICAgICAvKiBGaWx0ZXIgYnkgZmllbGQgc2V0ICovXHJcbiAgICAgICAgaWYgKHRoaXMuZmllbGRTZXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmllbGRSb3dzID0gdGhpcy5maWVsZFJvd3MubWFwKHggPT4geCA9IHguZmlsdGVyKHkgPT4geS5maWVsZFNldHM/LnNvbWUoeiA9PiB0aGlzLmZpZWxkU2V0cz8uc29tZShhID0+IGE/LnRyaW0oKT8udG9Mb3dlckNhc2UoKSA9PSB6Py50cmltKCk/LnRvTG93ZXJDYXNlKCkpKSkpLmZpbHRlcih4ID0+IHgubGVuZ3RoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFN1YnNjcmllIHRvIGNoYW5nZSBldmVudCAqL1xyXG4gICAgICAgIHRoaXMuZmllbGRSb3dzPy5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSk/LmZpbHRlcih5ID0+IHkudHlwZSAhPSBGb3JtRmllbGRUeXBlLkZpbGUgJiYgeS5jaGFuZ2UpPy5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cD8uZ2V0KHgubmFtZSk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKHkgPT4geC5jaGFuZ2UoeSwgdGhpcy5mb3JtR3JvdXA/LnZhbHVlLCB0aGlzLmZvcm1Hcm91cCwgdGhpcy5jb250ZXh0KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIGF1dG9jb21wbGV0ZSBldmVudFxyXG4gICAgICogQHBhcmFtIGZpZWxkIFxyXG4gICAgICogQHBhcmFtIGV2ZW50IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmlsdGVyQXV0b2NvbXBsZXRlKGZpZWxkOiBGb3JtRmllbGREZWZpbml0aW9uLCBldmVudDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVGaWx0ZXJlZE9wdGlvbnNbZmllbGQubmFtZV0gPSBmaWVsZC5vcHRpb25zPy5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZXZlbnQudmFsdWU/LnRvU3RyaW5nKCk/LnRvTG93ZXJDYXNlKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBjaGlwIHdoZW4gYSBhdXRvY29tcGxldGUgdmFsdWUgaXMgc2VsZWN0ZWRcclxuICAgICAqIEBwYXJhbSBmaWVsZCBcclxuICAgICAqIEBwYXJhbSBldmVudCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGF1dG9jb21wbGV0ZVZhbHVlU2VsZWN0ZWQoZmllbGQ6IEZvcm1GaWVsZERlZmluaXRpb24sIGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50LCBjaGlwSW5wdXRFdmVudDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fYWRkQ2hpcChmaWVsZCwgZXZlbnQub3B0aW9uLnZpZXdWYWx1ZSk7XHJcbiAgICAgICAgY2hpcElucHV0RXZlbnQudmFsdWUgPSAnJztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBjaGlwXHJcbiAgICAgKiBAcGFyYW0gZmllbGQgXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRDaGlwKGZpZWxkOiBGb3JtRmllbGREZWZpbml0aW9uLCBldmVudDogTWF0Q2hpcElucHV0RXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9hZGRDaGlwKGZpZWxkLCBldmVudC52YWx1ZSk7XHJcbiAgICAgICAgZXZlbnQuY2hpcElucHV0IS5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGNoaXBcclxuICAgICAqIEBwYXJhbSBmaWVsZCBcclxuICAgICAqIEBwYXJhbSBjaGlwIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlQ2hpcChmaWVsZDogRm9ybUZpZWxkRGVmaW5pdGlvbiwgY2hpcDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgLyogR2V0IHRoZSBmb3JtIGNvbnRyb2wgdXNpbmcgdGhlIGZpZWxkIG5hbWUgKi9cclxuICAgICAgICBsZXQgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwPy5jb250cm9sc1tmaWVsZC5uYW1lXTtcclxuXHJcbiAgICAgICAgLyogR2V0IHRoZSBpbmRleCBvZiB0aGUgY2hpcCAqL1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY29udHJvbC52YWx1ZS5pbmRleE9mKGNoaXApO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wudmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgY2hpcFxyXG4gICAgICogQHBhcmFtIGZpZWxkIFxyXG4gICAgICogQHBhcmFtIHZhbHVlIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9hZGRDaGlwKGZpZWxkOiBGb3JtRmllbGREZWZpbml0aW9uLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgLyogR2V0IHRoZSBmb3JtIGNvbnRyb2wgdXNpbmcgdGhlIGZpZWxkIG5hbWUgKi9cclxuICAgICAgICBsZXQgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwPy5jb250cm9sc1tmaWVsZC5uYW1lXTtcclxuXHJcbiAgICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY2hpcCAqL1xyXG4gICAgICAgIHZhbHVlID0gKHZhbHVlIHx8ICcnKS50cmltKCk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgdmFsdWUpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5pbnB1dFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG51bWJlciA9IHBhcnNlSW50KHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUucHVzaChudW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdmbG9hdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZsb2F0ID0gcGFyc2VGbG9hdCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZsb2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudmFsdWUucHVzaChmbG9hdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC52YWx1ZS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCdWlsZHMgdGhlIGZvcm0gZmllbGRzXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBidWlsZEZpZWxkcygpOiB2b2lkIHtcclxuICAgICAgICAvKiBHZXQgZm9ybSBkZWZpbml0aW9uICovXHJcbiAgICAgICAgdGhpcy5mb3JtRGVmaW5pdGlvbiA9IGdldEZvcm1EZWZpbml0aW9uKG5ldyB0aGlzLmNsYXNzVHlwZSgpKTtcclxuXHJcbiAgICAgICAgLyogQ3JlYXRlIHRoZSBmcm9tIGZpZWxkcyB1c2luZyB0aGUgZW50aXR5IHR5cGUgKi9cclxuICAgICAgICB0aGlzLmZpZWxkR3JvdXBzID0gdGhpcy5mb3JtRGVmaW5pdGlvbj8uZmllbGRHcm91cHM7XHJcbiAgICB9XHJcbn0iLCI8ZGl2ICpuZ0lmPVwiZm9ybUdyb3VwICYmIGZpZWxkUm93c1wiIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XHJcbiAgICA8IS0tICNyZWdpb24gRmllbGRzIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGRzIG9mIGZpZWxkUm93czsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgIDxkaXYgbGF5b3V0LWd0LXNtPVwicm93XCIgbGF5b3V0PVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZpZWxkc1wiIFtuZ1N3aXRjaF09XCJmaWVsZC50eXBlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLmhpZGUgfHwgIWZpZWxkLmhpZGUoZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC53cmFwcGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBUZXh0IGlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nU3dpdGNoQ2FzZT1cIkZvcm1GaWVsZFR5cGUuVGV4dFwiIFthdHRyLmZsZXhdPVwiZmllbGQuZmxleHx8MFwiIFtjbGFzc109XCJmaWVsZC5jc3NDbGFzc1wiIGxheW91dC1tYXJnaW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7ZmllbGQuaGVhZGVyfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbdHlwZV09XCJmaWVsZC5pbnB1dFR5cGVcIiBbbWlubGVuZ3RoXT1cImZpZWxkLm1pbkxlbmd0aHx8bnVsbFwiIFttYXhsZW5ndGhdPVwiZmllbGQubWF4TGVuZ3RofHxudWxsXCIgW21pbl09XCJmaWVsZC5taW5cIiBbbWF4XT1cImZpZWxkLm1heFwiIG1hdElucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiIFtyZWFkb25seV09XCJyZWFkb25seSB8fCAoZmllbGQucmVhZG9ubHkgJiYgZmllbGQucmVhZG9ubHkoZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1ZmZpeEJ1dHRvbiBvZiBmaWVsZC5zdWZmaXhCdXR0b25zXCIgKGNsaWNrKT1cInN1ZmZpeEJ1dHRvbi5ldmVudCAmJiBzdWZmaXhCdXR0b24uZXZlbnQoZm9ybUdyb3VwPy52YWx1ZSwgY29udGV4dClcIiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiIXN1ZmZpeEJ1dHRvbi5oaWRlIHx8ICFzdWZmaXhCdXR0b24uaGlkZShmb3JtR3JvdXA/LnZhbHVlLCBjb250ZXh0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+e3tzdWZmaXhCdXR0b24uaWNvbn19PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwiZmllbGQuaGludFwiPnt7ZmllbGQuaGludH19PC9tYXQtaGludD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nRm9yPVwibGV0IGVycm9yTWVzc2FnZSBvZiBmb3JtR3JvdXAuY29udHJvbHNbZmllbGQubmFtZV1bJ2Vycm9yTWVzc2FnZXMnXVwiPnt7ZXJyb3JNZXNzYWdlfX08L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIFRleHRhcmVhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nU3dpdGNoQ2FzZT1cIkZvcm1GaWVsZFR5cGUuVGV4dEFyZWFcIiBbYXR0ci5mbGV4XT1cImZpZWxkLmZsZXh8fDBcIiBbY2xhc3NdPVwiZmllbGQuY3NzQ2xhc3NcIiBsYXlvdXQtbWFyZ2luPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2ZpZWxkLmhlYWRlcn19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCIgcm93cz1cImZpZWxkLnJvd3N8fDJcIiBbcmVhZG9ubHldPVwicmVhZG9ubHkgfHwgKGZpZWxkLnJlYWRvbmx5ICYmIGZpZWxkLnJlYWRvbmx5KGZvcm1Hcm91cD8udmFsdWUsIGZvcm1Hcm91cCwgY29udGV4dCkpXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1ZmZpeEJ1dHRvbiBvZiBmaWVsZC5zdWZmaXhCdXR0b25zXCIgKGNsaWNrKT1cInN1ZmZpeEJ1dHRvbi5ldmVudCAmJiBzdWZmaXhCdXR0b24uZXZlbnQoZm9ybUdyb3VwPy52YWx1ZSwgY29udGV4dClcIiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiIXN1ZmZpeEJ1dHRvbi5oaWRlIHx8ICFzdWZmaXhCdXR0b24uaGlkZShmb3JtR3JvdXA/LnZhbHVlLCBjb250ZXh0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+e3tzdWZmaXhCdXR0b24uaWNvbn19PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwiZmllbGQuaGludFwiPnt7ZmllbGQuaGludH19PC9tYXQtaGludD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nRm9yPVwibGV0IGVycm9yTWVzc2FnZSBvZiBmb3JtR3JvdXAuY29udHJvbHNbZmllbGQubmFtZV1bJ2Vycm9yTWVzc2FnZXMnXVwiPnt7ZXJyb3JNZXNzYWdlfX08L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIEVudW0gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiRm9ybUZpZWxkVHlwZS5FbnVtXCIgW2F0dHIuZmxleF09XCJmaWVsZC5mbGV4fHwwXCIgW2NsYXNzXT1cImZpZWxkLmNzc0NsYXNzXCIgbGF5b3V0LW1hcmdpbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZkLXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbZW51bV09XCJmaWVsZC5lbnVtVHlwZVwiIFtrZXldPVwiZmllbGQub3B0aW9uVmFsdWVcIiBbdGV4dF09XCJmaWVsZC5vcHRpb25UZXh0XCIgW211bHRpcGxlXT1cImZpZWxkLm11bHRpcGxlXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8IChmaWVsZC5yZWFkb25seSAmJiBmaWVsZC5yZWFkb25seShmb3JtR3JvdXA/LnZhbHVlLCBmb3JtR3JvdXAsIGNvbnRleHQpKVwiIFt0cmlnZ2VyQ3NzQ2xhc3NdPVwiZmllbGQudHJpZ2dlckNzc0NsYXNzXCIgW3RyaWdnZXJNb2RlXT1cImZpZWxkLnRyaWdnZXJNb2RlXCIgbGF5b3V0PVwicm93XCIgZmxleD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdmQtc2VsZWN0LXRyaWdnZXIgbGV0LXRyaWdnZXI9XCJ0cmlnZ2VyXCIgKm5nSWY9XCJmaWVsZC50cmlnZ2VyVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJmaWVsZC50cmlnZ2VyVGVtcGxhdGUodHJpZ2dlciwgZm9ybUdyb3VwLnZhbHVlLCBmb3JtR3JvdXAsIGNvbnRleHQpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHZkLXNlbGVjdC1vcHRpb24gbGV0LW9wdGlvbj1cIm9wdGlvblwiICpuZ0lmPVwiZmllbGQub3B0aW9uVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW291dGVySFRNTF09XCJmaWVsZC5vcHRpb25UZW1wbGF0ZShvcHRpb24sIGZvcm1Hcm91cC52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ZC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWZmaXhCdXR0b24gb2YgZmllbGQuc3VmZml4QnV0dG9uc1wiIChjbGljayk9XCJzdWZmaXhCdXR0b24uZXZlbnQgJiYgc3VmZml4QnV0dG9uLmV2ZW50KGZvcm1Hcm91cD8udmFsdWUsIGNvbnRleHQpXCIgbWF0U3VmZml4PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cIiFzdWZmaXhCdXR0b24uaGlkZSB8fCAhc3VmZml4QnV0dG9uLmhpZGUoZm9ybUdyb3VwPy52YWx1ZSwgY29udGV4dClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnt7c3VmZml4QnV0dG9uLmljb259fTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cImZpZWxkLmhpbnRcIj57e2ZpZWxkLmhpbnR9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvck1lc3NhZ2Ugb2YgZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdWydlcnJvck1lc3NhZ2VzJ11cIj57e2Vycm9yTWVzc2FnZX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBWZFNlbGVjdCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCJGb3JtRmllbGRUeXBlLlZkU2VsZWN0XCIgW2F0dHIuZmxleF09XCJmaWVsZC5mbGV4fHwwXCIgW2NsYXNzXT1cImZpZWxkLmNzc0NsYXNzXCIgbGF5b3V0LW1hcmdpbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZkLXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbZW5kcG9pbnRdPVwiZmllbGQuZW5kcG9pbnQgfCBmdW5jOmZvcm1Hcm91cC52YWx1ZTpmb3JtR3JvdXA6Y29udGV4dFwiIFtwYXJhbXNdPVwiZmllbGQucGFyYW1zIHwgZnVuYzpmb3JtR3JvdXAudmFsdWU6Zm9ybUdyb3VwOmNvbnRleHRcIiBbcHJvamVjdGlvbl09XCJmaWVsZC5wcm9qZWN0aW9uXCIgW21hcHBlcl09XCJmaWVsZC5tYXBwZXJcIiBbY29tcGFyZVdpdGhdPVwiZmllbGQuY29tcGFyZVdpdGhcIiBba2V5XT1cImZpZWxkLm9wdGlvblZhbHVlXCIgW3RleHRdPVwiZmllbGQub3B0aW9uVGV4dFwiIFttdWx0aXBsZV09XCJmaWVsZC5tdWx0aXBsZVwiIFtyZWFkb25seV09XCJyZWFkb25seSB8fCAoZmllbGQucmVhZG9ubHkgJiYgZmllbGQucmVhZG9ubHkoZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KSlcIiBbdHJpZ2dlckNzc0NsYXNzXT1cImZpZWxkLnRyaWdnZXJDc3NDbGFzc1wiIFt0cmlnZ2VyTW9kZV09XCJmaWVsZC50cmlnZ2VyTW9kZVwiIChpdGVtU2VsZWN0ZWQpPVwiZmllbGQuaXRlbVNlbGVjdCAmJiBmaWVsZC5pdGVtU2VsZWN0KCRldmVudCwgZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KTtcIiAoaXRlbUNoYW5nZSk9XCJmaWVsZC5pdGVtQ2hhbmdlICYmIGZpZWxkLml0ZW1DaGFuZ2UoJGV2ZW50LCBmb3JtR3JvdXA/LnZhbHVlLCBmb3JtR3JvdXAsIGNvbnRleHQpO1wiIGxheW91dD1cInJvd1wiIGZsZXg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHZkLXNlbGVjdC10cmlnZ2VyIGxldC10cmlnZ2VyPVwidHJpZ2dlclwiICpuZ0lmPVwiZmllbGQudHJpZ2dlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwiZmllbGQudHJpZ2dlclRlbXBsYXRlKHRyaWdnZXIsIGZvcm1Hcm91cC52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSB2ZC1zZWxlY3QtdHJpZ2dlciBsZXQtdHJpZ2dlcj1cInRyaWdnZXJcIiAqbmdJZj1cImZpZWxkLnRyaWdnZXJNYXBwZXIgJiYgZmllbGQubXVsdGlwbGUgJiYgZmllbGQudHJpZ2dlck1vZGUgPT0gJ2NoaXAnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBpdGVtIG9mIHRyaWdnZXJcIiBjbGFzcz1cIm1hdC1tZGMtY2hpcCBtYXQtbWRjLXN0YW5kYXJkLWNoaXAgbWF0LWFjY2VudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJmaWVsZC50cmlnZ2VyTWFwcGVyKGl0ZW0sIGZvcm1Hcm91cC52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHZkLXNlbGVjdC1vcHRpb24gbGV0LW9wdGlvbj1cIm9wdGlvblwiICpuZ0lmPVwiZmllbGQub3B0aW9uVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW291dGVySFRNTF09XCJmaWVsZC5vcHRpb25UZW1wbGF0ZShvcHRpb24sIGZvcm1Hcm91cC52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ZC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWZmaXhCdXR0b24gb2YgZmllbGQuc3VmZml4QnV0dG9uc1wiIChjbGljayk9XCJzdWZmaXhCdXR0b24uZXZlbnQgJiYgc3VmZml4QnV0dG9uLmV2ZW50KGZvcm1Hcm91cD8udmFsdWUsIGNvbnRleHQpXCIgbWF0U3VmZml4PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cIiFzdWZmaXhCdXR0b24uaGlkZSB8fCAhc3VmZml4QnV0dG9uLmhpZGUoZm9ybUdyb3VwPy52YWx1ZSwgY29udGV4dClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnt7c3VmZml4QnV0dG9uLmljb259fTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cImZpZWxkLmhpbnRcIj57e2ZpZWxkLmhpbnR9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvck1lc3NhZ2Ugb2YgZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdWydlcnJvck1lc3NhZ2VzJ11cIj57e2Vycm9yTWVzc2FnZX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBDaGlwcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCJGb3JtRmllbGRUeXBlLkNoaXBzXCIgW2F0dHIuZmxleF09XCJmaWVsZC5mbGV4fHwwXCIgW2NsYXNzXT1cImZpZWxkLmNzc0NsYXNzXCIgbGF5b3V0LW1hcmdpbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLWdyaWQgI2NoaXBMaXN0IFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoZmllbGQucmVhZG9ubHkgJiYgZmllbGQucmVhZG9ubHkoZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtcm93ICpuZ0Zvcj1cImxldCBjaGlwIG9mIGZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5uYW1lXT8udmFsdWVcIiAocmVtb3ZlZCk9XCJyZW1vdmVDaGlwKGZpZWxkLCBjaGlwKVwiIGNvbG9yPVwicHJpbWFyeVwiIHNlbGVjdGFibGU9XCJ0cnVlXCIgc2VsZWN0ZWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7Y2hpcH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdENoaXBSZW1vdmU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1yb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtwbGFjZWhvbGRlcl09XCJmaWVsZC5oZWFkZXJcIiAjY2hpcElucHV0IFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RcIiBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwic2VwYXJhdG9yS2V5c0NvZGVzXCIgW21hdEF1dG9jb21wbGV0ZV09XCJjaGlwQXV0b2NvbXBsZXRlXCIgKGlucHV0KT1cImZpbHRlckF1dG9jb21wbGV0ZShmaWVsZCwgY2hpcElucHV0KVwiIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGRDaGlwKGZpZWxkLCAkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWdyaWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSBhdXRvQWN0aXZlRmlyc3RPcHRpb24gI2NoaXBBdXRvY29tcGxldGU9XCJtYXRBdXRvY29tcGxldGVcIiBbY2xhc3NdPVwiZmllbGQuYXV0b2NvbXBsZXRlQ3NzQ2xhc3NcIiAob3B0aW9uU2VsZWN0ZWQpPVwiYXV0b2NvbXBsZXRlVmFsdWVTZWxlY3RlZChmaWVsZCwgJGV2ZW50LCBjaGlwSW5wdXQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBhdXRvY29tcGxldGVGaWx0ZXJlZE9wdGlvbnNbZmllbGQubmFtZV1cIiBbdmFsdWVdPVwib3B0aW9uLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1ZmZpeEJ1dHRvbiBvZiBmaWVsZC5zdWZmaXhCdXR0b25zXCIgKGNsaWNrKT1cInN1ZmZpeEJ1dHRvbi5ldmVudCAmJiBzdWZmaXhCdXR0b24uZXZlbnQoZm9ybUdyb3VwPy52YWx1ZSwgY29udGV4dClcIiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiIXN1ZmZpeEJ1dHRvbi5oaWRlIHx8ICFzdWZmaXhCdXR0b24uaGlkZShmb3JtR3JvdXA/LnZhbHVlLCBjb250ZXh0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+e3tzdWZmaXhCdXR0b24uaWNvbn19PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwiZmllbGQuaGludFwiPnt7ZmllbGQuaGludH19PC9tYXQtaGludD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nRm9yPVwibGV0IGVycm9yTWVzc2FnZSBvZiBmb3JtR3JvdXAuY29udHJvbHNbZmllbGQubmFtZV1bJ2Vycm9yTWVzc2FnZXMnXVwiPnt7ZXJyb3JNZXNzYWdlfX08L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIFZkQ2hpcHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiRm9ybUZpZWxkVHlwZS5WZENoaXBzXCIgW2F0dHIuZmxleF09XCJmaWVsZC5mbGV4fHwwXCIgW2NsYXNzXT1cImZpZWxkLmNzc0NsYXNzXCIgbGF5b3V0LW1hcmdpbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZkLWNoaXBzICN2ZENoaXAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCIgW2VuZHBvaW50XT1cImZpZWxkLmVuZHBvaW50IHwgZnVuYzpmb3JtR3JvdXAudmFsdWU6Zm9ybUdyb3VwOmNvbnRleHRcIiBbcGFyYW1zXT1cImZpZWxkLnBhcmFtcyB8IGZ1bmM6Zm9ybUdyb3VwLnZhbHVlOmZvcm1Hcm91cDpjb250ZXh0XCIgW3NlYXJjaEZpZWxkXT1cImZpZWxkLnNlYXJjaEZpZWxkXCIgW2NsYXNzVHlwZV09XCJmaWVsZC5jbGFzc1R5cGVcIiBbcHJvamVjdGlvbl09XCJmaWVsZC5wcm9qZWN0aW9uXCIgW2tleV09XCJmaWVsZC5vcHRpb25WYWx1ZVwiIFtyZWFkb25seV09XCJyZWFkb25seSB8fCAoZmllbGQucmVhZG9ubHkgJiYgZmllbGQucmVhZG9ubHkoZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KSlcIiBbcmVtb3ZhYmxlXT1cIiFmaWVsZC5jbGVhclwiIFtjb250ZXh0XT1cImNvbnRleHRcIiBbc3VmZml4QnV0dG9uc109XCJmaWVsZC5zdWZmaXhCdXR0b25zXCIgW2F1dG9jb21wbGV0ZUNzc0NsYXNzXT1cImZpZWxkLmF1dG9jb21wbGV0ZUNzc0NsYXNzXCIgKGluaXRTZWxlY3QpPVwiZmllbGQuaXRlbVNlbGVjdCAmJiBmaWVsZC5pdGVtU2VsZWN0KCRldmVudCwgZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KTtcIiAoc2VsZWN0ZWQpPVwiZmllbGQuaXRlbUNoYW5nZSAmJiBmaWVsZC5pdGVtQ2hhbmdlKCRldmVudCwgZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KTtcIiAoY2xlYXJlZCk9XCJmaWVsZC5jbGVhciAmJiBmaWVsZC5jbGVhcihmb3JtR3JvdXA/LnZhbHVlLCBmb3JtR3JvdXAsIGNvbnRleHQpO1wiIGxheW91dD1cInJvd1wiIGZsZXg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHZkLWNoaXAgbGV0LWNoaXA9XCJjaGlwXCIgKm5nSWY9XCJmaWVsZC5jaGlwVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbb3V0ZXJIVE1MXT1cImZpZWxkLmNoaXBUZW1wbGF0ZShjaGlwLCBmb3JtR3JvdXAudmFsdWUsIGZvcm1Hcm91cCwgY29udGV4dClcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSB2ZC1hdXRvY29tcGxldGUtb3B0aW9uIGxldC1vcHRpb249XCJvcHRpb25cIiAqbmdJZj1cImZpZWxkLmF1dG9jb21wbGV0ZVRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW291dGVySFRNTF09XCJmaWVsZC5hdXRvY29tcGxldGVUZW1wbGF0ZShvcHRpb24sIGZvcm1Hcm91cC52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ZkLWNoaXBzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwiZmllbGQuaGludFwiPnt7ZmllbGQuaGludH19PC9tYXQtaGludD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cInZkQ2hpcC5lbXB0eVJlc3VsdFwiIGNsYXNzPVwidGMtcmVkLTQwMFwiIGkxOG49XCJAQG5vUmVzdWx0c0ZvdW5kXCI+Tm8gcmVzdWx0cyB3ZXJlIGZvdW5kLjwvbWF0LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvck1lc3NhZ2Ugb2YgZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdWydlcnJvck1lc3NhZ2VzJ11cIj57e2Vycm9yTWVzc2FnZX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBTZWxlY3QgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiRm9ybUZpZWxkVHlwZS5TZWxlY3RcIiBbYXR0ci5mbGV4XT1cImZpZWxkLmZsZXh8fDBcIiBbY2xhc3NdPVwiZmllbGQuY3NzQ2xhc3NcIiBsYXlvdXQtbWFyZ2luPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2ZpZWxkLmhlYWRlcn19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbbXVsdGlwbGVdPVwiZmllbGQubXVsdGlwbGVcIiBbZGlzYWJsZUNvbnRyb2xdPVwicmVhZG9ubHkgfHwgKGZpZWxkLnJlYWRvbmx5ICYmIGZpZWxkLnJlYWRvbmx5KGZvcm1Hcm91cD8udmFsdWUsIGZvcm1Hcm91cCwgY29udGV4dCkpXCIgZmxleD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpZWxkLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uLmlkXCI+e3tvcHRpb24ubmFtZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3VmZml4QnV0dG9uIG9mIGZpZWxkLnN1ZmZpeEJ1dHRvbnNcIiAoY2xpY2spPVwic3VmZml4QnV0dG9uLmV2ZW50ICYmIHN1ZmZpeEJ1dHRvbi5ldmVudChmb3JtR3JvdXA/LnZhbHVlLCBjb250ZXh0KVwiIG1hdFN1ZmZpeD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCIhc3VmZml4QnV0dG9uLmhpZGUgfHwgIXN1ZmZpeEJ1dHRvbi5oaWRlKGZvcm1Hcm91cD8udmFsdWUsIGNvbnRleHQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj57e3N1ZmZpeEJ1dHRvbi5pY29ufX08L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJmaWVsZC5oaW50XCI+e3tmaWVsZC5oaW50fX08L21hdC1oaW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdGb3I9XCJsZXQgZXJyb3JNZXNzYWdlIG9mIGZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5uYW1lXVsnZXJyb3JNZXNzYWdlcyddXCI+e3tlcnJvck1lc3NhZ2V9fTwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gQXV0b2NvbXBsZXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nU3dpdGNoQ2FzZT1cIkZvcm1GaWVsZFR5cGUuQXV0b2NvbXBsZXRlXCIgW2F0dHIuZmxleF09XCJmaWVsZC5mbGV4fHwwXCIgW2NsYXNzXT1cImZpZWxkLmNzc0NsYXNzXCIgbGF5b3V0LW1hcmdpbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCIgW21pbl09XCJmaWVsZC5taW5cIiBbbWF4XT1cImZpZWxkLm1heFwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiICNhdXRvY29tcGxldGVJbnB1dCAoaW5wdXQpPVwiZmlsdGVyQXV0b2NvbXBsZXRlKGZpZWxkLCBhdXRvY29tcGxldGVJbnB1dClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBbcmVhZG9ubHldPVwicmVhZG9ubHkgfHwgKGZpZWxkLnJlYWRvbmx5ICYmIGZpZWxkLnJlYWRvbmx5KGZvcm1Hcm91cD8udmFsdWUsIGZvcm1Hcm91cCwgY29udGV4dCkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSBhdXRvQWN0aXZlRmlyc3RPcHRpb24gI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiBbY2xhc3NdPVwiZmllbGQuYXV0b2NvbXBsZXRlQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGF1dG9jb21wbGV0ZUZpbHRlcmVkT3B0aW9uc1tmaWVsZC5uYW1lXVwiIFt2YWx1ZV09XCJvcHRpb24uaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3VmZml4QnV0dG9uIG9mIGZpZWxkLnN1ZmZpeEJ1dHRvbnNcIiAoY2xpY2spPVwic3VmZml4QnV0dG9uLmV2ZW50ICYmIHN1ZmZpeEJ1dHRvbi5ldmVudChmb3JtR3JvdXA/LnZhbHVlLCBjb250ZXh0KVwiIG1hdFN1ZmZpeD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCIhc3VmZml4QnV0dG9uLmhpZGUgfHwgIXN1ZmZpeEJ1dHRvbi5oaWRlKGZvcm1Hcm91cD8udmFsdWUsIGNvbnRleHQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj57e3N1ZmZpeEJ1dHRvbi5pY29ufX08L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJmaWVsZC5oaW50XCI+e3tmaWVsZC5oaW50fX08L21hdC1oaW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdGb3I9XCJsZXQgZXJyb3JNZXNzYWdlIG9mIGZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5uYW1lXVsnZXJyb3JNZXNzYWdlcyddXCI+e3tlcnJvck1lc3NhZ2V9fTwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gRGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCJGb3JtRmllbGRUeXBlLkRhdGVcIiBbYXR0ci5mbGV4XT1cImZpZWxkLmZsZXh8fDBcIiBbY2xhc3NdPVwiZmllbGQuY3NzQ2xhc3NcIiBsYXlvdXQtbWFyZ2luPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2ZpZWxkLmhlYWRlcn19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCIgW21pbl09XCJmaWVsZC5taW5cIiBbbWF4XT1cImZpZWxkLm1heFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFttYXREYXRlcGlja2VyXT1cImRhdGVQaWNrZXJcIiBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJmaWVsZC5kYXRlRmlsdGVyXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8IChmaWVsZC5yZWFkb25seSAmJiBmaWVsZC5yZWFkb25seShmb3JtR3JvdXA/LnZhbHVlLCBmb3JtR3JvdXAsIGNvbnRleHQpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJkYXRlUGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI2RhdGVQaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cImZpZWxkLmhpbnRcIj57e2ZpZWxkLmhpbnR9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvck1lc3NhZ2Ugb2YgZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdWydlcnJvck1lc3NhZ2VzJ11cIj57e2Vycm9yTWVzc2FnZX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIENoZWNrYm94IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkZvcm1GaWVsZFR5cGUuQ2hlY2tib3hcIiBbYXR0ci5mbGV4XT1cImZpZWxkLmZsZXh8fDBcIiBbY2xhc3NdPVwiZmllbGQuY3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbZGlzYWJsZUNvbnRyb2xdPVwicmVhZG9ubHkgfHwgKGZpZWxkLnJlYWRvbmx5ICYmIGZpZWxkLnJlYWRvbmx5KGZvcm1Hcm91cD8udmFsdWUsIGZvcm1Hcm91cCwgY29udGV4dCkpXCI+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIEVkaXRvciAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJGb3JtRmllbGRUeXBlLkVkaXRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJlZGl0b3JUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJlZGl0b3JUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQsIGZvcm1Hcm91cDogZm9ybUdyb3VwIH1cIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIENvZGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiRm9ybUZpZWxkVHlwZS5Db2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNvZGVUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2RlVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCB9XCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBGaWxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkZvcm1GaWVsZFR5cGUuRmlsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgW2F0dHIuZmxleF09XCJmaWVsZC5mbGV4fHwwXCIgbGF5b3V0LW1hcmdpbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tmaWVsZC5oZWFkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB2ZC1maWxlLWlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiIChzZWxlY3QpPVwiZmllbGQuY2hhbmdlICYmIGZpZWxkLmNoYW5nZShmaWVsZCwgJGV2ZW50LCBmb3JtR3JvdXAsIGNvbnRleHQpXCIgW2FjY2VwdF09XCJmaWVsZC5maWxlRXh0ZW5zaW9uc1wiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoZmllbGQucmVhZG9ubHkgJiYgZmllbGQucmVhZG9ubHkoZm9ybUdyb3VwPy52YWx1ZSwgZm9ybUdyb3VwLCBjb250ZXh0KSlcIiBmbGV4PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIEN1c3RvbSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJGb3JtRmllbGRUeXBlLkN1c3RvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJjdXN0b21UZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21UZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQsIGZvcm1Hcm91cDogZm9ybUdyb3VwIH1cIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSAjcmVnaW9uIFRlbXBsYXRlIGZvciBjdXN0b20gZmllbGRzIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tRmllbGRzXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntmb3JtR3JvdXA6IGZvcm1Hcm91cCwgcm93OiBmaWVsZHNbMF0/LnJvdyArIDF9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG4gICAgPCEtLSAjcmVnaW9uIEZvcm0gYm90dG9tIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJib3R0b21cIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2Zvcm1Hcm91cDogZm9ybUdyb3VwfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgIDwhLS0gI3JlZ2lvbiBEZWJ1ZyB2YWx1ZSAtLT5cclxuICAgIDxjb2RlICpuZ0lmPVwiZGVidWdWYWx1ZVwiPlxyXG4gICAgICAgIDxwcmU+e3tmb3JtR3JvdXA/LnZhbHVlIHwganNvbn19PC9wcmU+XHJcbiAgICA8L2NvZGU+XHJcbiAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbjwvZGl2PiJdfQ==
@@ -16,4 +16,4 @@ export class FormFieldDefinition {
16
16
  Object.assign(this, init);
17
17
  }
18
18
  }
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZC1kZWZpbml0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvZm9ybXMvbW9kZWxzL2Zvcm0tZmllbGQtZGVmaW5pdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxNQUFNLE9BQU8sbUJBQW1CO0lBdUQ1Qjs7O09BR0c7SUFDSCxZQUFtQixJQUE0QztRQXZEeEQscUJBQWdCLEdBQVksTUFBTSxDQUFDO1FBR25DLGFBQVEsR0FBWSxNQUFNLENBQUM7UUFHM0IsZ0JBQVcsR0FBbUMsQ0FBQyxFQUFPLEVBQUUsRUFBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBUzlFLGdCQUFXLEdBQVksU0FBUyxDQUFBLG9CQUFvQixDQUFDO1FBZ0JyRCxhQUFRLEdBQWEsS0FBSyxDQUFDO1FBSTNCLGVBQVUsR0FBWSxNQUFNLENBQUM7UUFDN0IsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFLNUIsZ0JBQVcsR0FBWSxRQUFRLENBQUM7UUFRaEMsWUFBTyxHQUFhLElBQUksQ0FBQztRQU81QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IERhdGVGaWx0ZXJGbiB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyXCI7XHJcbmltcG9ydCB7IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vYmFzZS9pbnRlcmZhY2VzL2lnZW5lcmljLWZvcm0tYmFzZVwiO1xyXG5pbXBvcnQgeyBTdWZmaXhCdXR0b24gfSBmcm9tIFwiLi4vLi4vY29tbW9uL21vZGVscy9zdWZmaXgtYnV0dG9uXCI7XHJcbmltcG9ydCB7IEZvcm1GaWVsZFR5cGUgfSBmcm9tIFwiLi4vZW51bXMvZm9ybS1maWVsZC10eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRm9ybUZpZWxkRGVmaW5pdGlvbjxURW50aXR5ID0gYW55LCBUUHJvcGVydHkgPSBhbnk+IHtcclxuICAgIHB1YmxpYyByb3c6IG51bWJlcjtcclxuICAgIHB1YmxpYyBhdXRvY29tcGxldGVDc3NDbGFzcz86IHN0cmluZztcclxuICAgIHB1YmxpYyBhdXRvY29tcGxldGVUZW1wbGF0ZT86ICh4OiBUUHJvcGVydHksIHk/OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgYXV0b2NvbXBsZXRlVGV4dD86IHN0cmluZyA9ICduYW1lJztcclxuICAgIHB1YmxpYyBjaGFuZ2U/OiAoeDogVFByb3BlcnR5LCB5PzogVEVudGl0eSwgZj86IEZvcm1Hcm91cCwgY3R4PzogSUdlbmVyaWNGb3JtQmFzZUNvbXBvbmVudDxURW50aXR5PikgPT4gYW55O1xyXG4gICAgcHVibGljIGNoaXBUZW1wbGF0ZT86ICh4OiBUUHJvcGVydHksIHk/OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgY2hpcFRleHQ/OiBzdHJpbmcgPSAnbmFtZSc7XHJcbiAgICBwdWJsaWMgY2xhc3NUeXBlPzogVHlwZTxhbnk+O1xyXG4gICAgcHVibGljIGNsZWFyPzogKHg6IFRFbnRpdHksIGY/OiBGb3JtR3JvdXAsIGN0eD86IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4pID0+IGFueTtcclxuICAgIHB1YmxpYyBjb21wYXJlV2l0aD86IChvMTogYW55LCBvMjogYW55KSA9PiBib29sZWFuID0gKG8xOiBhbnksIG8yOiBhbnkpID0+IG8xID09PSBvMjtcclxuICAgIHB1YmxpYyBjc3NDbGFzcz86IHN0cmluZztcclxuICAgIHB1YmxpYyBkYXRlRmlsdGVyPzogRGF0ZUZpbHRlckZuPGFueT47XHJcbiAgICBwdWJsaWMgZW5kcG9pbnQ/OiAoKHg6IFRFbnRpdHksIGY/OiBGb3JtR3JvdXAsIGN0eD86IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4pID0+IGFueSkgfCBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZW51bVR5cGU/OiBhbnk7XHJcbiAgICBwdWJsaWMgZmllbGRTZXRzPzogc3RyaW5nW107XHJcbiAgICBwdWJsaWMgZmlsZUV4dGVuc2lvbnM/OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZmlsZVBhdGg/OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZmxleD86IG51bWJlcjtcclxuICAgIHB1YmxpYyBncm91cEhlYWRlcj86IHN0cmluZyA9ICRsb2NhbGl6ZWA6QEBkZXRhaWxzOkRldGFpbHNgO1xyXG4gICAgcHVibGljIGdyb3VwTmFtZT86IHN0cmluZztcclxuICAgIHB1YmxpYyBoZWFkZXI/OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaGlkZT86ICh4OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgaGludD86IHN0cmluZztcclxuICAgIHB1YmxpYyBpbmRleD86IG51bWJlcjtcclxuICAgIHB1YmxpYyBpbnB1dFR5cGU/OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaXNQdWJsaWNGaWxlPzogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBpdGVtQ2hhbmdlPzogKHg6IFRQcm9wZXJ0eSwgeT86IFRFbnRpdHksIGY/OiBGb3JtR3JvdXAsIGN0eD86IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4pID0+IGFueTtcclxuICAgIHB1YmxpYyBpdGVtU2VsZWN0PzogKHg6IFRQcm9wZXJ0eSwgeT86IFRFbnRpdHksIGY/OiBGb3JtR3JvdXAsIGN0eD86IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4pID0+IGFueTtcclxuICAgIHB1YmxpYyBtYXBwZXI/OiAoeDogYW55W10pID0+IGFueTtcclxuICAgIHB1YmxpYyBtaW4/OiBudW1iZXIgfCBEYXRlO1xyXG4gICAgcHVibGljIG1heD86IG51bWJlciB8IERhdGU7XHJcbiAgICBwdWJsaWMgbWF4TGVuZ3RoPzogbnVtYmVyO1xyXG4gICAgcHVibGljIG1pbkxlbmd0aD86IG51bWJlcjtcclxuICAgIHB1YmxpYyBtdWx0aWxpbmU/OiBib29sZWFuO1xyXG4gICAgcHVibGljIG11bHRpcGxlPzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIG5hbWU/OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgb3B0aW9ucz86IHsgaWQ6IGFueSwgbmFtZTogc3RyaW5nIH1bXTtcclxuICAgIHB1YmxpYyBvcHRpb25UZW1wbGF0ZT86ICh4OiBUUHJvcGVydHksIHk/OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgb3B0aW9uVGV4dD86IHN0cmluZyA9ICduYW1lJztcclxuICAgIHB1YmxpYyBvcHRpb25WYWx1ZT86IHN0cmluZyA9ICdpZCc7XHJcbiAgICBwdWJsaWMgcGFyYW1zPzogKCh4OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnkpIHwge307XHJcbiAgICBwdWJsaWMgcHJvamVjdGlvbj86IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgcHVibGljIHJlYWRvbmx5PzogKHg6IFRFbnRpdHksIGY/OiBGb3JtR3JvdXAsIGN0eD86IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4pID0+IGFueTtcclxuICAgIHB1YmxpYyByb3dzPzogbnVtYmVyO1xyXG4gICAgcHVibGljIHNlYXJjaEZpZWxkPzogc3RyaW5nID0gJ3NlYXJjaCc7XHJcbiAgICBwdWJsaWMgc2VsZWN0PzogKHg6IFRFbnRpdHksIGY/OiBGb3JtR3JvdXAsIGN0eD86IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4pID0+IGFueTtcclxuICAgIHB1YmxpYyBzdWZmaXhCdXR0b25zPzogU3VmZml4QnV0dG9uPFRQcm9wZXJ0eSwgSUdlbmVyaWNGb3JtQmFzZUNvbXBvbmVudDxURW50aXR5Pj5bXTtcclxuICAgIHB1YmxpYyB0cmlnZ2VyVGVtcGxhdGU/OiAoeDogVFByb3BlcnR5W10gfCBUUHJvcGVydHksIHk/OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgdHJpZ2dlck1hcHBlcj86ICh4OiBUUHJvcGVydHksIHk/OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgdHJpZ2dlckNzc0NsYXNzPzogc3RyaW5nO1xyXG4gICAgcHVibGljIHRyaWdnZXJNb2RlPzogJ2NoaXAnO1xyXG4gICAgcHVibGljIHR5cGU/OiBGb3JtRmllbGRUeXBlO1xyXG4gICAgcHVibGljIHdyYXBwZWQ/OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0gaW5pdCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGluaXQ/OiBQYXJ0aWFsPEZvcm1GaWVsZERlZmluaXRpb248VEVudGl0eT4+KSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxufSJdfQ==
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZC1kZWZpbml0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvZm9ybXMvbW9kZWxzL2Zvcm0tZmllbGQtZGVmaW5pdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxNQUFNLE9BQU8sbUJBQW1CO0lBdUQ1Qjs7O09BR0c7SUFDSCxZQUFtQixJQUE0QztRQXZEeEQscUJBQWdCLEdBQVksTUFBTSxDQUFDO1FBR25DLGFBQVEsR0FBWSxNQUFNLENBQUM7UUFHM0IsZ0JBQVcsR0FBK0MsQ0FBQyxFQUFPLEVBQUUsRUFBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBUzFGLGdCQUFXLEdBQVksU0FBUyxDQUFBLG9CQUFvQixDQUFDO1FBZ0JyRCxhQUFRLEdBQWEsS0FBSyxDQUFDO1FBSTNCLGVBQVUsR0FBWSxNQUFNLENBQUM7UUFDN0IsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFLNUIsZ0JBQVcsR0FBWSxRQUFRLENBQUM7UUFRaEMsWUFBTyxHQUFhLElBQUksQ0FBQztRQU81QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IERhdGVGaWx0ZXJGbiB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyXCI7XHJcbmltcG9ydCB7IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vYmFzZS9pbnRlcmZhY2VzL2lnZW5lcmljLWZvcm0tYmFzZVwiO1xyXG5pbXBvcnQgeyBTdWZmaXhCdXR0b24gfSBmcm9tIFwiLi4vLi4vY29tbW9uL21vZGVscy9zdWZmaXgtYnV0dG9uXCI7XHJcbmltcG9ydCB7IEZvcm1GaWVsZFR5cGUgfSBmcm9tIFwiLi4vZW51bXMvZm9ybS1maWVsZC10eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRm9ybUZpZWxkRGVmaW5pdGlvbjxURW50aXR5ID0gYW55LCBUUHJvcGVydHkgPSBhbnk+IHtcclxuICAgIHB1YmxpYyByb3c6IG51bWJlcjtcclxuICAgIHB1YmxpYyBhdXRvY29tcGxldGVDc3NDbGFzcz86IHN0cmluZztcclxuICAgIHB1YmxpYyBhdXRvY29tcGxldGVUZW1wbGF0ZT86ICh4OiBUUHJvcGVydHksIHk/OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgYXV0b2NvbXBsZXRlVGV4dD86IHN0cmluZyA9ICduYW1lJztcclxuICAgIHB1YmxpYyBjaGFuZ2U/OiAoeDogVFByb3BlcnR5LCB5PzogVEVudGl0eSwgZj86IEZvcm1Hcm91cCwgY3R4PzogSUdlbmVyaWNGb3JtQmFzZUNvbXBvbmVudDxURW50aXR5PikgPT4gYW55O1xyXG4gICAgcHVibGljIGNoaXBUZW1wbGF0ZT86ICh4OiBUUHJvcGVydHksIHk/OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgY2hpcFRleHQ/OiBzdHJpbmcgPSAnbmFtZSc7XHJcbiAgICBwdWJsaWMgY2xhc3NUeXBlPzogVHlwZTxhbnk+O1xyXG4gICAgcHVibGljIGNsZWFyPzogKHg6IFRFbnRpdHksIGY/OiBGb3JtR3JvdXAsIGN0eD86IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4pID0+IGFueTtcclxuICAgIHB1YmxpYyBjb21wYXJlV2l0aD86IChvMTogVFByb3BlcnR5LCBvMjogVFByb3BlcnR5KSA9PiBib29sZWFuID0gKG8xOiBhbnksIG8yOiBhbnkpID0+IG8xID09PSBvMjtcclxuICAgIHB1YmxpYyBjc3NDbGFzcz86IHN0cmluZztcclxuICAgIHB1YmxpYyBkYXRlRmlsdGVyPzogRGF0ZUZpbHRlckZuPGFueT47XHJcbiAgICBwdWJsaWMgZW5kcG9pbnQ/OiAoKHg6IFRFbnRpdHksIGY/OiBGb3JtR3JvdXAsIGN0eD86IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4pID0+IGFueSkgfCBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZW51bVR5cGU/OiBhbnk7XHJcbiAgICBwdWJsaWMgZmllbGRTZXRzPzogc3RyaW5nW107XHJcbiAgICBwdWJsaWMgZmlsZUV4dGVuc2lvbnM/OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZmlsZVBhdGg/OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZmxleD86IG51bWJlcjtcclxuICAgIHB1YmxpYyBncm91cEhlYWRlcj86IHN0cmluZyA9ICRsb2NhbGl6ZWA6QEBkZXRhaWxzOkRldGFpbHNgO1xyXG4gICAgcHVibGljIGdyb3VwTmFtZT86IHN0cmluZztcclxuICAgIHB1YmxpYyBoZWFkZXI/OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaGlkZT86ICh4OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgaGludD86IHN0cmluZztcclxuICAgIHB1YmxpYyBpbmRleD86IG51bWJlcjtcclxuICAgIHB1YmxpYyBpbnB1dFR5cGU/OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaXNQdWJsaWNGaWxlPzogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBpdGVtQ2hhbmdlPzogKHg6IFRQcm9wZXJ0eSwgeT86IFRFbnRpdHksIGY/OiBGb3JtR3JvdXAsIGN0eD86IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4pID0+IGFueTtcclxuICAgIHB1YmxpYyBpdGVtU2VsZWN0PzogKHg6IFRQcm9wZXJ0eSwgeT86IFRFbnRpdHksIGY/OiBGb3JtR3JvdXAsIGN0eD86IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4pID0+IGFueTtcclxuICAgIHB1YmxpYyBtYXBwZXI/OiAoeDogYW55W10pID0+IGFueTtcclxuICAgIHB1YmxpYyBtaW4/OiBudW1iZXIgfCBEYXRlO1xyXG4gICAgcHVibGljIG1heD86IG51bWJlciB8IERhdGU7XHJcbiAgICBwdWJsaWMgbWF4TGVuZ3RoPzogbnVtYmVyO1xyXG4gICAgcHVibGljIG1pbkxlbmd0aD86IG51bWJlcjtcclxuICAgIHB1YmxpYyBtdWx0aWxpbmU/OiBib29sZWFuO1xyXG4gICAgcHVibGljIG11bHRpcGxlPzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIG5hbWU/OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgb3B0aW9ucz86IHsgaWQ6IGFueSwgbmFtZTogc3RyaW5nIH1bXTtcclxuICAgIHB1YmxpYyBvcHRpb25UZW1wbGF0ZT86ICh4OiBUUHJvcGVydHksIHk/OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgb3B0aW9uVGV4dD86IHN0cmluZyA9ICduYW1lJztcclxuICAgIHB1YmxpYyBvcHRpb25WYWx1ZT86IHN0cmluZyA9ICdpZCc7XHJcbiAgICBwdWJsaWMgcGFyYW1zPzogKCh4OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnkpIHwge307XHJcbiAgICBwdWJsaWMgcHJvamVjdGlvbj86IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgcHVibGljIHJlYWRvbmx5PzogKHg6IFRFbnRpdHksIGY/OiBGb3JtR3JvdXAsIGN0eD86IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4pID0+IGFueTtcclxuICAgIHB1YmxpYyByb3dzPzogbnVtYmVyO1xyXG4gICAgcHVibGljIHNlYXJjaEZpZWxkPzogc3RyaW5nID0gJ3NlYXJjaCc7XHJcbiAgICBwdWJsaWMgc2VsZWN0PzogKHg6IFRFbnRpdHksIGY/OiBGb3JtR3JvdXAsIGN0eD86IElHZW5lcmljRm9ybUJhc2VDb21wb25lbnQ8VEVudGl0eT4pID0+IGFueTtcclxuICAgIHB1YmxpYyBzdWZmaXhCdXR0b25zPzogU3VmZml4QnV0dG9uPFRQcm9wZXJ0eSwgSUdlbmVyaWNGb3JtQmFzZUNvbXBvbmVudDxURW50aXR5Pj5bXTtcclxuICAgIHB1YmxpYyB0cmlnZ2VyVGVtcGxhdGU/OiAoeDogVFByb3BlcnR5W10gfCBUUHJvcGVydHksIHk/OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgdHJpZ2dlck1hcHBlcj86ICh4OiBUUHJvcGVydHksIHk/OiBURW50aXR5LCBmPzogRm9ybUdyb3VwLCBjdHg/OiBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgdHJpZ2dlckNzc0NsYXNzPzogc3RyaW5nO1xyXG4gICAgcHVibGljIHRyaWdnZXJNb2RlPzogJ2NoaXAnO1xyXG4gICAgcHVibGljIHR5cGU/OiBGb3JtRmllbGRUeXBlO1xyXG4gICAgcHVibGljIHdyYXBwZWQ/OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0gaW5pdCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGluaXQ/OiBQYXJ0aWFsPEZvcm1GaWVsZERlZmluaXRpb248VEVudGl0eT4+KSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxufSJdfQ==