@esfaenza/parameters 15.2.10 → 15.2.11

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.
@@ -359,7 +359,7 @@ EsParametersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
359
359
  useExisting: forwardRef(() => EsParametersComponent),
360
360
  multi: true
361
361
  }
362
- ], ngImport: i0, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.FormCheckboxComponent, selector: "form-checkbox", inputs: ["SliderMode"] }, { kind: "component", type: i5.FormDateComponent, selector: "form-date", inputs: ["JsDates"] }, { kind: "component", type: i5.FormInputComponent, selector: "form-input", inputs: ["Password"], outputs: ["onSuffixAction", "onPrefixAction"] }, { kind: "component", type: i5.FormSelectComponent, selector: "form-select", inputs: ["SelectLabel", "PlaceholderValue", "RequiredPlaceholder", "EmptyFieldValue", "ShowValidationSymbol", "OptionTemplate"] }, { kind: "component", type: i5.FormMultiSelectComponent, selector: "form-multiselect", inputs: ["SelectLabel", "UseKeyValues", "UseCommaSeparatedList"] }, { kind: "component", type: i5.FormAutocompleteComponent, selector: "form-autocomplete", inputs: ["SelectLabel", "SearchFunctionContext", "SearchFunction", "MinChars", "HideChoicesOnSelection", "RequiredPlaceholder", "CaseSensitive", "Multi", "MultiElementsThreshold"] }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
362
+ ], ngImport: i0, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.FormCheckboxComponent, selector: "form-checkbox", inputs: ["SliderMode"] }, { kind: "component", type: i5.FormDateComponent, selector: "form-date", inputs: ["JsDates"] }, { kind: "component", type: i5.FormInputComponent, selector: "form-input", inputs: ["Password"], outputs: ["onSuffixAction", "onPrefixAction"] }, { kind: "component", type: i5.FormSelectComponent, selector: "form-select", inputs: ["SelectLabel", "PlaceholderValue", "RequiredPlaceholder", "EmptyFieldValue", "ShowValidationSymbol", "OptionTemplate"] }, { kind: "component", type: i5.FormMultiSelectComponent, selector: "form-multiselect", inputs: ["SelectLabel", "UseKeyValues", "UseCommaSeparatedList"] }, { kind: "component", type: i5.FormAutocompleteComponent, selector: "form-autocomplete", inputs: ["SelectLabel", "SearchFunctionContext", "SearchFunction", "MinChars", "HideChoicesOnSelection", "RequiredPlaceholder", "CaseSensitive", "Multi", "MultiElementsThreshold"] }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
363
363
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EsParametersComponent, decorators: [{
364
364
  type: Component,
365
365
  args: [{ selector: "es-parameters", providers: [
@@ -374,7 +374,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
374
374
  useExisting: forwardRef(() => EsParametersComponent),
375
375
  multi: true
376
376
  }
377
- ], encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"] }]
377
+ ], encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"] }]
378
378
  }], ctorParameters: function () { return [{ type: i1.UtilityService }, { type: i2.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: i0.Injector }, { type: i1.DateService }]; }, propDecorators: { DisplayMode: [{
379
379
  type: Input
380
380
  }], LastParameterNoMargin: [{
@@ -402,4 +402,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
402
402
  }], LabelInputRatio: [{
403
403
  type: Input
404
404
  }] } });
405
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfcGFyYW1ldGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXJhbWV0ZXJzL3NyYy9saWIvZXNfcGFyYW1ldGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXJhbWV0ZXJzL3NyYy9saWIvZXNfcGFyYW1ldGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUE0QyxTQUFTLEVBQVUsYUFBYSxFQUFFLGlCQUFpQixFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUksT0FBTyxFQUFxQixTQUFTLEVBQUUsVUFBVSxFQUFZLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RyxpQkFBaUI7QUFDakIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFNOUQsZUFBZTtBQUNmLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7O0FBRXZFLHVIQUF1SDtBQW9CdkgsTUFBTSxPQUFPLHFCQUFxQjtJQXNEOUIsbUlBQW1JO0lBQ25JLElBQWEsZUFBZSxDQUFDLEtBQWE7UUFDdEMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQW9CLE9BQXVCLEVB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RSxJQUFJO1NBQ2Q7S0FDSiwwQkMvQkwsNmpNQStEYzsyRkQzQkQscUJBQXFCO2tCQW5CakMsU0FBUzsrQkFDSSxlQUFlLGFBQ2Q7d0JBQ1AsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRTt3QkFDM0Q7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUM7NEJBQ3BELEtBQUssRUFBRSxJQUFJO3lCQUNkO3dCQUNEOzRCQUNJLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBQzs0QkFDcEQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0osaUJBRWMsaUJBQWlCLENBQUMsSUFBSTt3TkFzQjVCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0csa0NBQWtDO3NCQUExQyxLQUFLO2dCQUdHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFHTyxlQUFlO3NCQUEzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVW50eXBlZEZvcm1Db250cm9sLCBOZ0NvbnRyb2wsIE5nRm9ybSwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IsIFZhbGlkYXRvciB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbmplY3RvciwgSW5wdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuaW1wb3J0IHsgRGF0ZVNlcnZpY2UsIFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9leHRlbnNpb25zXCI7XHJcblxyXG4vLyBDbGFzc2lcclxuaW1wb3J0IHsgR2VuZXJpY1BhcmFtZXRlciB9IGZyb20gJy4vbW9kZWxzL0dlbmVyaWNQYXJhbWV0ZXInO1xyXG5cclxuLy8gQXBwbGljYXppb25lXHJcbmltcG9ydCB7IEVzUGFyYW1ldGVyc0xvYyB9IGZyb20gXCIuL2VzX3BhcmFtZXRlcnMuY29tcG9uZW50LmxvY1wiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IEdlbmVyaWNQYXJhbWV0ZXJHcm91cCB9IGZyb20gXCIuL21vZGVscy9HZW5lcmljUGFyYW1ldGVyR3JvdXBcIjtcclxuXHJcbi8qKiBDb21wb25lbnRlIGNoZSBwZXJtZXR0ZSBkaSBncmFmaWNhcmUgdW5hIGxpc3RhIGRpICoqR2VuZXJpY1BhcmFtZXRlcioqIGNvbWUgSW5wdXQgaW4gYmFzZSBhbCBsb3JvIHRpcG8gc3BlY2lmaWNvICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwiZXMtcGFyYW1ldGVyc1wiLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgeyBwcm92aWRlOiBMb2NhbGl6YXRpb25TZXJ2aWNlLCB1c2VDbGFzczogRXNQYXJhbWV0ZXJzTG9jIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRXNQYXJhbWV0ZXJzQ29tcG9uZW50KSxcclxuICAgICAgICAgICAgbXVsdGk6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcclxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRXNQYXJhbWV0ZXJzQ29tcG9uZW50KSxcclxuICAgICAgICAgICAgbXVsdGk6IHRydWVcclxuICAgICAgICB9XHJcbiAgICBdLFxyXG4gICAgc3R5bGVVcmxzOiBbXCIuL2VzX3BhcmFtZXRlcnMuY29tcG9uZW50LnNjc3NcIl0sXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9lc19wYXJhbWV0ZXJzLmNvbXBvbmVudC5odG1sXCJcclxufSlcclxuZXhwb3J0IGNsYXNzIEVzUGFyYW1ldGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xyXG5cclxuICAgIC8qKiBNb2RlbGxvIGRlbCBjb21wb25lbnRlIHN1IGN1aSB2ZW5nb25vIGVmZmV0dHVhdGUgbGUgZ3JhZmljYXppb25pICovXHJcbiAgICBwdWJsaWMgUGFyYW1ldGVyczogR2VuZXJpY1BhcmFtZXRlcltdO1xyXG5cclxuICAgICAgLyoqIE1vZGVsbG8gZGVsIGNvbXBvbmVudGUgc3UgY3VpIHZlbmdvbm8gZWZmZXR0dWF0ZSBsZSBncmFmaWNhemlvbmkgKi9cclxuICAgIHB1YmxpYyBHcm91cHM6IEdlbmVyaWNQYXJhbWV0ZXJHcm91cFtdO1xyXG5cclxuICAgIC8qKiBDYWNoZSBwZXIgZmFyZSBsb29rdXAgcmFwaWRpIGluIGZhc2UgZGkgdmFsdXRhemlvbmUgZXNwcmVzc2lvbmkgZGkgdmlzaWJpbGl0w6AgZSBvYmJsaWdhdG9yaWV0w6AgKi9cclxuICAgIHByaXZhdGUgUGFyYW1ldGVyc0NhY2hlOiB7W2lkOiBzdHJpbmddOiBHZW5lcmljUGFyYW1ldGVyfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpcGVsaW5lIGRpIEFuZ3VsYXIgXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuICAgIC8qKiBJbmRpY2EgY2hlIGlsIHBhcmFtZXRybyBkZXZlIGVzc2VyZSBpbiBtb2RhbGl0w6AgZGlzcGxheSAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIGNoZSBsJ3VsdGltbyBwYXJhbWV0cm8gbm9uIGRldmUgYXZlcmUgbWFyZ2luZSBpbiBmb25kbyAqL1xyXG4gICAgQElucHV0KCkgTGFzdFBhcmFtZXRlck5vTWFyZ2luOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIGNvbC1tZC1YIHBlciBsYSBsYWJlbCAqL1xyXG4gICAgQElucHV0KCkgTGFiZWxDb2xXaWR0aDogbnVtYmVyID0gNDtcclxuXHJcbiAgICAvKiogY29sLW1kLVggcGVyIGwnaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIElucHV0Q29sV2lkdGg6IG51bWJlciA9IDg7XHJcblxyXG4gICAgLyoqIElucHV0IGEgY3VpIGNvbGxlZ2FyZSBsYSB2YXJpYWJpbGUgKipzdWJtaXR0ZWQqKiBkZWwgZm9ybSBhbGwnaW50ZXJubyBkZWwgcXVhbGUgdmllbmUgdXRpbGl6emF0byBxdWVzdG8gY29tcG9uZW50ZSAqL1xyXG4gICAgQElucHV0KCkgc3VibWl0dGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIFZhbG9yZSBkYSBtb3N0cmFyZSBxdWFsb3JhIG5vbiBmb3NzZXJvIGFuY29yYSByaWNldnV0aSBpICoqUGFyYW1ldGVycyoqIGRhIG1vc3RyYXJlICovXHJcbiAgICBASW5wdXQoKSBFbXB0eU1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIFBlcm1ldHRlIGRpIHJpbXVvdmVyZSBpIHBhcmFtZXRyaSBkYWxsYSBsaXN0YSBjbGljY2FuZG8gc3VsbGEgWCBkYXZhbnRpIGFsbGEgTGFiZWwgKi9cclxuICAgIEBJbnB1dCgpIFJlbW92YWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIHNlIGkgY29tcG9uZW50aSBkaSBJbnB1dCBnZW5lcmF0aSBzb25vIFJlYWRvbmx5IG8gbm8gKi9cclxuICAgIEBJbnB1dCgpIFJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSBpIGNvbXBvbmVudGkgZGkgSW5wdXQgZ2VuZXJhdGkgc29ubyBSZWFkb25seSBvIG5vICovXHJcbiAgICBASW5wdXQoKSBMaXN0Rm9ybWF0OiAnQ29tbWFTZXBhcmF0ZWQnIHwgJ0FycmF5JyA9ICdBcnJheSc7XHJcblxyXG4gICAgLyoqIEZvcm0gY2hlIHV0aWxpenphIGlsIGNvbXBvbmVudGUuIEZvbmRhbWVudGFsZSBjb2xsZWdhcmxvIHNlIHNpIHZvZ2xpb25vIGxlIHZhbGlkYXppb25pIHN1bCBzdWJtaXQgKi9cclxuICAgIEBJbnB1dCgpIEZvcm0gOiBOZ0Zvcm0gPSBudWxsO1xyXG5cclxuICAgIC8qKiBRdWFuZG8gdXRpbGl6emEgdW4gc290dG9jb21wb25lbnRlIGF1dG9jb21wbGV0ZSBhYmlsaXRhIG8gZGlzYWJpbGl0YSBpbCByZXNldCBkZWxsJ2lucHV0IHBlciBvZ25pIHNlbGV6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgQXV0b2NvbXBsZXRlSGlkZUNob2ljZXNPblNlbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBGdW56aW9uZSBkYSB1dGlsaXp6YXJlIHBlciB0aXJhcmUgZnVvcmkgaSBkYXRpIGRpIHVuIGF1dG9jb21wbGV0ZSAqL1xyXG4gICAgQElucHV0KCkgQXV0b0NvbXBsZXRlRGF0YVJldHJpZXZlOiAocGFyYW1ldGVyOiBHZW5lcmljUGFyYW1ldGVyLCBzZWFyY2g6IHN0cmluZywgYnlpZDogYm9vbGVhbikgPT4gT2JzZXJ2YWJsZTx7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdPlxyXG5cclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBzZXR0YXJlIGluIHVuYSB2b2x0YSBzb2xvIGdsaSBpbnB1dCAqKkxhYmVsQ29sV2lkdGgqKiBlICoqSW5wdXRDb2xXaWR0aCoqLCBiYXN0YSBzY3JpdmVybG8gY29uIGxhIHNpbnRhc3NpIFwiWCBZXCIgKi9cclxuICAgIEBJbnB1dCgpIHNldCBMYWJlbElucHV0UmF0aW8oaW5wdXQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciByYXRpbyA9IGlucHV0LnNwbGl0KC9cXHMvKTtcclxuICAgICAgICB0aGlzLkxhYmVsQ29sV2lkdGggPSBwYXJzZUludChyYXRpb1swXSk7XHJcbiAgICAgICAgdGhpcy5JbnB1dENvbFdpZHRoID0gcGFyc2VJbnQocmF0aW9bMV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29zdHJ1dHRvcmVcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHV0aUV4dHM6IFV0aWxpdHlTZXJ2aWNlLCBwdWJsaWMgbGM6IExvY2FsaXphdGlvblNlcnZpY2UsIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGluajogSW5qZWN0b3IsIHB1YmxpYyBkYXRlczogRGF0ZVNlcnZpY2UpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGlwZWxpbmUgZGkgQW5ndWxhclxyXG4gICAgICogXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKG9iaik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuUGFyYW1ldGVycyA9IG9iajtcclxuXHJcbiAgICAgICAgdGhpcy5QYXJhbWV0ZXJzQ2FjaGUgPSB7fTtcclxuICAgICAgICBpZiAoIXRoaXMuUGFyYW1ldGVycylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLlBhcmFtZXRlcnMuZm9yRWFjaCh0ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5QYXJhbWV0ZXJzQ2FjaGVbdC5pZF0gPSB0O1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0LnR5cGVjb2RlICYmICF0LnR5cGUpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJOb24gw6ggc3RhdG8gc3BlY2lmaWNhdG8gbsOpIHVuIHR5cGUgbsOpIHVuIHR5cGVjb2RlXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHQudHlwZWNvZGUgJiYgIXQudHlwZSlcclxuICAgICAgICAgICAgICAgIHQudHlwZSA9IHRoaXMudXRpRXh0cy5nZXRKc1R5cGVGcm9tVHlwZUNvZGUodC50eXBlY29kZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodC50eXBlY29kZSAmJiB0LnR5cGUgIT0gdGhpcy51dGlFeHRzLmdldEpzVHlwZUZyb21UeXBlQ29kZSh0LnR5cGVjb2RlKSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUmlsZXZhdGUgaW5jb25zaXN0ZW56ZSBmcmEgaWwgVGlwbyAke3QudHlwZX0gZSBpbCBUaXBvICR7dGhpcy51dGlFeHRzLmdldEpzVHlwZUZyb21UeXBlQ29kZSh0LnR5cGVjb2RlKX0gY2FsY29sYXRvIGRhIFR5cGVDb2RlICR7dC50eXBlY29kZX0gcGVyIGlsIHBhcmFtZXRybyAke3QuaWR9YCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodC50eXBlID09IFwiYm9vbGVhblwiKVxyXG4gICAgICAgICAgICAgICAgdC52YWx1ZSA9IHQudmFsdWU/LnRvU3RyaW5nKCk/LnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xyXG5cclxuICAgICAgICAgICAgaWYgKHQuZW51bXR5cGUgfHwgdC5kaWN0dHlwZSlcclxuICAgICAgICAgICAgICAgIHQudHlwZSA9ICdlbnVtJztcclxuXHJcbiAgICAgICAgICAgIC8vIFZhbG9yZSB2YWxpZG8gbWEgbW9kYWxpdMOgIGRpIHV0aWxpenpvIGEgQ29tbWFTZXBhcmF0ZWQsIGRldm8gYXNzaWN1cmFybWkgZGkgcmllbWV0dGVyZSBsYSB2ZXJzaW9uZSBjb24gbGEgc3RyaW5nYVxyXG4gICAgICAgICAgICBpZiAodC50eXBlID09ICdlbnVtJyAmJiB0aGlzLkxpc3RGb3JtYXQgPT0gJ0NvbW1hU2VwYXJhdGVkJyAmJiB0Lm11bHRpZW51bSAmJiB0LnZhbHVlICYmIEFycmF5LmlzQXJyYXkodC52YWx1ZSkpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEFnZ2l1c3RvIGxlIG1vZGFsaXTDoCBkaSBmdW56aW9uYW1lbnRvIGRlaSBwYXJhbWV0cmkgbGlzdGEuIENoZSBpbnRlcm5hbWVudGUgZnVuemlvbmFubyBzZW1wcmUgY29uIHVuYSBsaXN0YSBkaSB2YWxvcmlcclxuICAgICAgICAgICAgaWYgKHQudHlwZSA9PSAnZW51bScgJiYgdGhpcy5MaXN0Rm9ybWF0ID09ICdDb21tYVNlcGFyYXRlZCcgJiYgdC5tdWx0aWVudW0gJiYgdC52YWx1ZSAmJiAhQXJyYXkuaXNBcnJheSh0LnZhbHVlKSlcclxuICAgICAgICAgICAgICAgIHQudmFsdWUgPSB0LnZhbHVlID8gdC52YWx1ZS5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKSA6IFtdO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmdlbmVyYXRlR3JvdXBzKCk7XHJcbiAgICAgICAgdGhpcy5yZXZpZXdQYXJhbWV0ZXJzQmluZGluZ3MoKTtcclxuICAgIH1cclxuICAgICAgXHJcbiAgICAvKipcclxuICAgICogTWV0b2RvIGNoZSBzaSBvY2N1cGEgZGkgY3JlYXJlIGUgb3JkaW5hcmUgaSBncnVwcGkgZGVpIHBhcmFtZXRyaVxyXG4gICAgKi9cclxuICAgIGdlbmVyYXRlR3JvdXBzKCl7XHJcbiAgICAgICAgdGhpcy5Hcm91cHMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYodGhpcy5QYXJhbWV0ZXJzPy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgdGhpcy5QYXJhbWV0ZXJzLnNvcnQoKGEsYikgPT4gYS5vcmRlciA8IGIub3JkZXIgPyAtMSA6IDEpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2ljbG8gdHV0dGkgaSBwYXJhbWV0cmlcclxuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgdGhpcy5QYXJhbWV0ZXJzLmxlbmd0aCA+IGk7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhciA9IHRoaXMuUGFyYW1ldGVyc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyR3JvdXBOYW1lID0gcGFyLmdyb3VwID8/IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBPcmRlciA9IHBhci5ncm91cCA/IHBhci5vcmRlciA6IC0xO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNlIGlsIGdydXBwbyBub24gZXNpc3RlLCBsbyBhZ2dpdW5nb1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdyb3Vwcy5zb21lKHggPT4geC5ncm91cE5hbWUgPT0gcGFyR3JvdXBOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuR3JvdXBzLnB1c2gobmV3IEdlbmVyaWNQYXJhbWV0ZXJHcm91cChwYXJHcm91cE5hbWUsIGdyb3VwT3JkZXIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJbnNlcmlzY28gaWwgcGFyYW1ldHJvIGRlbnRybyBhbCBzdW8gZ3J1cHBvXHJcbiAgICAgICAgICAgICAgICB0aGlzLkdyb3Vwcy5maW5kKGcgPT4gZy5ncm91cE5hbWUgPT0gcGFyR3JvdXBOYW1lKS5wYXJhbWV0ZXJzLnB1c2gocGFyKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBHZXN0aW9uZSBzb3R0b2dydXBwaVxyXG4gICAgICAgICAgICBsZXQgc3ViZ3JvdXBzOiBHZW5lcmljUGFyYW1ldGVyR3JvdXBbXSA9IHRoaXMuR3JvdXBzLmZpbHRlcihncm91cCA9PiBncm91cC5ncm91cE5hbWUuaW5jbHVkZXMoJ8KnJykpO1xyXG4gICAgICAgICAgICBmb3IobGV0IF87IHN1Ymdyb3Vwcy5sZW5ndGggPiAwOyAoKSA9PiB7fSkge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVjdXBlcm8gbGEgbGlzdGEgZGkgZ3J1cHBpIGNoZSBoYW5ubyBzb3R0b2dydXBwaVxyXG4gICAgICAgICAgICAgICAgLy8gUGVyIGNvbnZlbnppb25lLCBuZWwgbm9tZSBjb250ZW5nb25vIFwiwqdcIlxyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0FkZFN1Ymdyb3VwcyhzdWJncm91cHMpO1xyXG4gICAgICAgICAgICAgICAgc3ViZ3JvdXBzID0gdGhpcy5Hcm91cHMuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmdyb3VwTmFtZS5pbmNsdWRlcygnwqcnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuR3JvdXBzLnNvcnQoKGEsYikgPT4gYS5vcmRlciA8IGIub3JkZXIgPyAtMSA6IDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogTWV0b2RvIGNoZSBzaSBvY2N1cGEgZGkgY3JlYXJlIGUgb3JkaW5hcmUgaSBzb3R0b2dydXBwaSBkZWkgcGFyYW1ldHJpXHJcbiAgICAqL1xyXG4gICAgdHJ5VG9BZGRTdWJncm91cHMoc3ViZ3JvdXBzOiBHZW5lcmljUGFyYW1ldGVyR3JvdXBbXSkge1xyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IHN1Ymdyb3Vwcy5sZW5ndGggPiBpOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHN1YiA9IHN1Ymdyb3Vwc1tpXTtcclxuXHJcbiAgICAgICAgICAgIC8vIE90dGVuZ28gdW4gbGlzdGEgY29uIGxhIGdlcmFyY2hpYSBkZWkgZ3J1cHBpLCBpbiBvcmRpbmVcclxuICAgICAgICAgICAgbGV0IGdyb3Vwc1BhcmVudEhpZXJhcmNoeSA9IHN1Yi5ncm91cE5hbWUuc3BsaXQoJ8KnJykgPz8gW107XHJcblxyXG4gICAgICAgICAgICAvLyBSZWN1cGVybyBpbCBncnVwcG8gcGFkcmVcclxuICAgICAgICAgICAgbGV0IHBhcmVudEdyb3VwTmFtZSA9IHN1Yi5ncm91cE5hbWUucmVwbGFjZShgwqcke2dyb3Vwc1BhcmVudEhpZXJhcmNoeVtncm91cHNQYXJlbnRIaWVyYXJjaHkubGVuZ3RoIC0gMV19YCwgYGApO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gU2UgaWwgZ3J1cHBvIHBhZHJlIG5vbiBlc2lzdGUsIGxvIGFnZ2l1bmdvXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Hcm91cHMuc29tZSh4ID0+IHguZ3JvdXBOYW1lID09IHBhcmVudEdyb3VwTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuR3JvdXBzLnB1c2gobmV3IEdlbmVyaWNQYXJhbWV0ZXJHcm91cChwYXJlbnRHcm91cE5hbWUsIHN1Yi5vcmRlcikpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBSaW11b3ZvIGRhbCBub21lIGRlbCBncnVwcG8gbCdpbmZvcm1hemlvbmUgc3VsIHBhZHJlIChTaXN0ZW1hbmRvIGFuY2hlIGwnZXRpY2hldHRhKVxyXG4gICAgICAgICAgICAvLyBlIGxvIGFnZ2l1bmdvIGFpIHNvdHRvZ3J1cHBpIGRlbCBwYWRyZVxyXG4gICAgICAgICAgICBzdWIuZ3JvdXBOYW1lID0gc3ViLmdyb3VwTmFtZS5yZXBsYWNlKGAke3BhcmVudEdyb3VwTmFtZX3Cp2AsICcnKTtcclxuICAgICAgICAgICAgbGV0IHBhcmVudEdyb3VwID0gdGhpcy5Hcm91cHMuZmluZCh4ID0+IHguZ3JvdXBOYW1lID09IHBhcmVudEdyb3VwTmFtZSk7XHJcbiAgICAgICAgICAgIGlmKHBhcmVudEdyb3VwPy5zdWJncm91cHMuc29tZShzID0+IHMuZ3JvdXBOYW1lID09IHN1Yi5ncm91cE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gcGFyZW50R3JvdXAuc3ViZ3JvdXBzLmZpbmQoZiA9PiBmLmdyb3VwTmFtZSA9PSBzdWIuZ3JvdXBOYW1lKTtcclxuICAgICAgICAgICAgICAgIHN1Yi5wYXJhbWV0ZXJzLm1hcChwID0+IHRhcmdldC5wYXJhbWV0ZXJzLnB1c2gocCkpO1xyXG4gICAgICAgICAgICAgICAgc3ViLnN1Ymdyb3Vwcy5tYXAocyA9PiB0YXJnZXQuc3ViZ3JvdXBzLnB1c2gocykpO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Lm9yZGVyID0gc3ViLm9yZGVyIDwgdGFyZ2V0Lm9yZGVyID8gc3ViLm9yZGVyIDogdGFyZ2V0Lm9yZGVyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50R3JvdXA/LnN1Ymdyb3Vwcy5wdXNoKHN1Yik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFJpbXVvdm8gaWwgc290dG9ncnVwcG8gZ3J1cHBvIGRhbGxhIGxpc3RhXHJcbiAgICAgICAgICAgIHRoaXMuR3JvdXBzLnNwbGljZSh0aGlzLkdyb3Vwcy5pbmRleE9mKHN1YiksIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpcGVsaW5lIGRpIEFuZ3VsYXJcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICB2YWxpZGF0ZShjOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiBhbnkge1xyXG4gICAgICAgIC8vIFNlIGxhIHZhbGlkYXppb25lIMOoIHJpY2hpYW1hdGEgZGEgdW4gY29tcG9uZW50ZSBub24gbWUgc3Rlc3NvIHZ1b2wgZGlyZSBjaGUgaSBjb21wb25lbnRpIGRpIHZhbGlkYXppb25lIGludGVybmkgc3Rhbm5vIHJpY2hpYW1hbmRvXHJcbiAgICAgICAgLy8gcXVlc3RvIHZhbGlkYXRvciwgbWEgZGFsIGxvcm8gcHVudG8gZGkgdmlzdGEgbm9uIHNlIG5lIGRldm9ubyBwcmVvY2N1cGFyZSBxdWluZGkgZmFjY2lvIGZpbnRhIG5vbiBjaSBzaWFubyBlcnJvcmkuXHJcbiAgICAgICAgLy8gU2UgaW52ZWNlIHZlbmdvIHJpY2hpYW1hdG8gZGlyZXR0YW1lbnRlIHNpZ25pZmljYSBjaGUgw6ggaWwgZm9ybSBpbiBjdWkgdml2ZSBlcy1wYXJhbWV0ZXJzIGUgbMOsIGRldm8gZWZmZXR0dWFyZSBsYSB2YWxpZGF6aW9uZVxyXG4gICAgICAgIGxldCBjb250cm9sID0gdGhpcy5pbmouZ2V0KE5nQ29udHJvbCwgbnVsbCk/LmNvbnRyb2w7XHJcbiAgICAgICAgaWYgKGMgIT0gY29udHJvbClcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGxldCB2YWxpZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMuUGFyYW1ldGVycyAmJiB0aGlzLlBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLlBhcmFtZXRlcnMuZm9yRWFjaCh0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKCF0LnZpc2libGUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IGVtcHR5TnVtYmVyID0gdC50eXBlID09ICdudW1iZXInICYmICh0LnZhbHVlID09IG51bGwgfHwgdC52YWx1ZSA9PSB1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGVtcHR5Tm9uTnVtYmVyID0gdC50eXBlICE9ICdudW1iZXInICYmICF0LnZhbHVlXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHQucmVxdWlyZWQgJiYgKGVtcHR5TnVtYmVyIHx8IGVtcHR5Tm9uTnVtYmVyKSlcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodC52YWx1ZSAmJiB0LnR5cGUgPT0gJ251bWJlcicpXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBuZXcgUmVnRXhwKHQucGF0dGVybiB8fCAvXlsrLV0/WzAtOV0qWyxdP1swLTldKyQvKS50ZXN0KHQudmFsdWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0LnZhbHVlICYmIHQucGF0dGVybilcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IG5ldyBSZWdFeHAodC5wYXR0ZXJuKS50ZXN0KHQudmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWxpZClcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHsgXCJlcy1wYXJhbWV0ZXJzXCI6IHZhbGlkIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQaXBlbGluZSBkaSBBbmd1bGFyXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm4pOiB2b2lkIHsgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGlwZWxpbmUgZGkgQW5ndWxhclxyXG4gICAgICogXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbik6IHZvaWQgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hlIHNpIG9jY3VwYSBkaSBnZXN0aXJlIGlsIG1vZGVsbG8gaW4gdXNjaXRhIGUgcHJvcGFnYXJsbyBzdWwgYmluZGluZyBuZ01vZGVsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5QYXJhbWV0ZXJzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFNlIGNpIHNvbm8gZGVsbGUgbW9kaWZpY2hlIGFpIGJpbmRpbmcgcG90cmViYmVybyBlc3NlcmUgY2FtYmlhdGkgaSByZXF1aXJlZC4gUmljcmVvIHR1dHRpIGkgY29tcG9uZW50aSBlIHJpLWlkcmF0byBsYSBjYWNoZSBkZWkgcGFyYW1ldHJpXHJcbiAgICAgICAgdmFyIGNoYW5nZXMgPSB0aGlzLnJldmlld1BhcmFtZXRlcnNCaW5kaW5ncygpO1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoKGNoID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuUGFyYW1ldGVycy5maW5kSW5kZXgodCA9PiB0LmlkID09IGNoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFyYW1ldGVyc1tpbmRleF0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuUGFyYW1ldGVyc1tpbmRleF0pKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFyYW1ldGVyc0NhY2hlW2NoXSA9IHRoaXMuUGFyYW1ldGVyc1tpbmRleF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgUGFyYW1ldGVyc0Nsb25lID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLlBhcmFtZXRlcnMpKTtcclxuXHJcbiAgICAgICAgLy8gQWdnaXVzdG8gbGUgbW9kYWxpdMOgIGRpIGZ1bnppb25hbWVudG8gZGVpIHBhcmFtZXRyaSBsaXN0YS4gQ2hlIGludGVybmFtZW50ZSBmdW56aW9uYW5vIHNlbXByZSBjb24gdW5hIGxpc3RhIGRpIHZhbG9yaVxyXG4gICAgICAgIFBhcmFtZXRlcnNDbG9uZT8uZm9yRWFjaCh0ID0+IHtcclxuICAgICAgICAgICAgaWYgKHQudHlwZSA9PSBcImVudW1cIiAmJiB0aGlzLkxpc3RGb3JtYXQgPT0gJ0NvbW1hU2VwYXJhdGVkJyAmJiB0Lm11bHRpZW51bSAmJiB0LnZhbHVlICYmIEFycmF5LmlzQXJyYXkodC52YWx1ZSkpXHJcbiAgICAgICAgICAgICAgICB0LnZhbHVlID0gdC52YWx1ZS5qb2luKCcsJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKFBhcmFtZXRlcnNDbG9uZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSaW11b3ZlIGlsIHBhcmFtZXRybyBzZWxlemlvbmF0byBlIHByb3BhZ2EgaWwgbW9kZWxsb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0dlbmVyaWNQYXJhbWV0ZXJ9IHBhciBQYXJhbWV0cm8gZGEgcmltdW92ZXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVQYXJhbWV0ZXIocGFyOiBHZW5lcmljUGFyYW1ldGVyKSB7XHJcbiAgICAgICAgdGhpcy5QYXJhbWV0ZXJzLnNwbGljZSh0aGlzLlBhcmFtZXRlcnMuaW5kZXhPZihwYXIpLCAxKTtcclxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2VuZXJhdGVQYXJhbWV0ZXJHcm91cHMoKSB7XHJcbiAgICAgICAgbGV0IEdyb3VwczogeyBpZDogc3RyaW5nLCBncm91cHM6IHN0cmluZ1tdLCBvcmRlcjogbnVtYmVyIH1bXSA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLlBhcmFtZXRlcnMuZm9yRWFjaChwYXJhbSA9PiB7XHJcbiAgICAgICAgICAgIEdyb3Vwcy5wdXNoKHsgaWQ6IHBhcmFtLmlkLCBncm91cHM6IHBhcmFtLmdyb3VwLnNwbGl0KFwiwqdcIiksIG9yZGVyOiBwYXJhbS5vcmRlciB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IEdyb3VwZWRHcm91cHMgPSBHcm91cHMucmVkdWNlKChyLCBhKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBmaXJzdEdyb3VwSWQgPSBhLmdyb3Vwcz8ubGVuZ3RoID4gMCA/IGEuZ3JvdXBzWzBdIDogXCJcIjtcclxuICAgICAgICAgICAgcltmaXJzdEdyb3VwSWRdID0gWy4uLnJbZmlyc3RHcm91cElkXSB8fCBbXSwgYV07XHJcbiAgICAgICAgICAgIHJldHVybiByO1xyXG4gICAgICAgIH0sIHt9KTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coR3JvdXBlZEdyb3Vwcyk7XHJcblxyXG4gICAgICAgIC8vIENpY2xvIGRlbCByaXN1bHRhdG8sIGFnZ2l1bmdlbmRvIGkgZ3J1cHBpIGFsIG1vZGVsbG9cclxuICAgICAgICAvLyBQZXIgb2duaSBncnVwcG8gY2hlIGFnZ2l1bmdvLCBhc3NlZ25vIGkgcGFyYW1ldHJpIGluIG9yZGluZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUml2ZWRlIGkgYmluZGluZ3MgZGVpIHBhcmFtZXRyaSBpbiBiYXNlIGEgbG9ybyBldmVudHVhbGkgZXNwcmVzc2lvbmkgZGkgY29udHJvbGxvXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gbGlzdGEgY29uIGdsaSBpZCBkZWkgcGFyYW1ldHJpIGNoZSBzb25vIHN0YXRpIG1vZGlmaWNhdGlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZXZpZXdQYXJhbWV0ZXJzQmluZGluZ3MoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGxldCBjaGFuZ2VzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLlBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHAgPSB0aGlzLlBhcmFtZXRlcnNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAocC5yZXF1aXJlZGV4cCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByZXZSZXEgPSBwLnJlcXVpcmVkO1xyXG4gICAgICAgICAgICAgICAgcC5yZXF1aXJlZCA9IHRoaXMuZXZhbHVhdGUocC5yZXF1aXJlZGV4cCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlJlcSAhPSBwLnJlcXVpcmVkKVxyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChwLmlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocC52aXNpYmxlZXhwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJldlZpc2kgPSBwLnZpc2libGU7XHJcbiAgICAgICAgICAgICAgICBwLnZpc2libGUgPSB0aGlzLmV2YWx1YXRlKHAudmlzaWJsZWV4cCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlZpc2kgIT0gcC52aXNpYmxlKVxyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChwLmlkKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGFuZ2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsdXRhIHVuJ2VzcHJlc3Npb25lIGluIGJhc2UgYWkgcGFyYW1ldHJpIHByZXNlbnRpIG5lbCBtb2RlbGxvIGF0dHVhbGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGV4cHIgRXNwcmVzc2lvbmUgZGEgdmFsdXRhcmUgc2NyaXR0YSBuZWwgZm9ybWF0byAocmlwZXRpYmlsZSkgXCJJRCAoPT18IT18PHw+fD49fDw9KSAoYHZhbG9yZWAgfCBudWxsIHwgdHJ1ZSB8IGZhbHNlIHwgWFhYLFhYWClcIiBzZXBhcmF0byBldmVudHVhbG1lbnRlIGRhICYmIGVkIHx8XHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zICoqdHJ1ZSoqIHNlIGxhIGNvbmRpemlvbmUgw6ggdmVyaWZpY2F0YSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZShleHByOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICB2YXIgcmVnZXggPSAvXFxzPyhbYS16QS1aMC05Xy1dKylcXHM/KCE9fD09fDx8Pnw8PXw+PSlcXHM/KGBbXmBdK2B8YGB8bnVsbHxbMC05LF0rfHRydWV8ZmFsc2UpL2dtO1xyXG5cclxuICAgICAgICB2YXIgbWF0Y2hlczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICB2YXIgZmluYWxFeHByID0gZXhwcjtcclxuICAgICAgICB3aGlsZSAobWF0Y2hlcyA9IHJlZ2V4LmV4ZWMoZXhwcikpIHtcclxuICAgICAgICAgICAgdmFyIGZ1bGxNYXRjaCA9IG1hdGNoZXNbMF0udHJpbSgpO1xyXG4gICAgICAgICAgICB2YXIgaWQgPSBtYXRjaGVzWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgdmFyIG9wZXJhdGlvbiA9IG1hdGNoZXNbMl0udHJpbSgpO1xyXG4gICAgICAgICAgICBsZXQgYlZhbHVlID0gbWF0Y2hlc1szXS50cmltKCkudHJpbSgpO1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBtYXRjaGVzWzNdLnRyaW0oKS50cmltKCkucmVwbGFjZSgnYCcsICcnKS5yZXBsYWNlKCdgJywgJycpO1xyXG5cclxuICAgICAgICAgICAgZmluYWxFeHByID0gZmluYWxFeHByLnJlcGxhY2UoZnVsbE1hdGNoLCBgdGhpcy5jaGVja1ZhbHVlKCcke2lkfScsICcke29wZXJhdGlvbn0nLCAke2JWYWx1ZSA9PSAnbnVsbCcgPyAnbnVsbCcgOiBgJyR7dmFsdWV9J2B9KWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGV2YWwoZmluYWxFeHByKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3RpdHVpc2NlIGwnb3BlcmF6aW9uZSBkaSBjb21wYXJhemlvbmUgZnJhIHVuIHNpbmdvbG8gdmFsb3JlIGRpIHVuIHBhcmFtZXRybyBlIHVuIHN1byB2YWxvcmUgZGkgY29uZnJvbnRvIGluIGJhc2UgYWQgdW4gb3BlcmF0b3JlXHJcbiAgICAgKiBSaWNoaWFtYXRhIGRhIEVWQUxcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBDaGlhdmUgZGVsIHBhcmFtZXRybyBkaSBjdWkgdmVyaWZpY2FyZSBpbCB2YWxvcmVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciBPcGVyYXRvcmUgY29uIGN1aSB2ZXJpZmljYXJlIGlsIHZhbG9yZTogPT0sICE9LCA+LCA8LCA+PSwgPD1cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBWYWxvcmUgZGkgY29uZnJvbnRvIGRhIHV0aWxpenphcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgKip0cnVlKiogc2UgbGEgY29uZGl6aW9uZSDDqCB2ZXJpZmljYXRhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2hlY2tWYWx1ZShrZXk6IHN0cmluZywgb3BlcmF0b3I6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHZhciByUGFyID0gdGhpcy5QYXJhbWV0ZXJzQ2FjaGVba2V5XTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHJQYXIudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbChgXCIke3RoaXMuZGVmYXVsdElmbnVsbE9yVW5kZWZpbmVkKHJQYXIudmFsdWUsIGBgKX1cIiAke29wZXJhdG9yfSBcIiR7dGhpcy5kZWZhdWx0SWZudWxsT3JVbmRlZmluZWQodmFsdWUsIGBgKX1cImApO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbChgJHt0aGlzLmRlZmF1bHRJZm51bGxPclVuZGVmaW5lZChyUGFyLnZhbHVlLCBgYCkudG9TdHJpbmcoKX0gJHtvcGVyYXRvcn0gJHt0aGlzLmRlZmF1bHRJZm51bGxPclVuZGVmaW5lZCh2YWx1ZSwgYGApfWApO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsKGAke3RoaXMuZGVmYXVsdElmbnVsbE9yVW5kZWZpbmVkKHJQYXIudmFsdWUsICdcIlwiJywgdHJ1ZSkucmVwbGFjZSgnLCcsICcuJyl9ICR7b3BlcmF0b3J9ICR7dGhpcy5kZWZhdWx0SWZudWxsT3JVbmRlZmluZWQodmFsdWUsICdcIlwiJywgdHJ1ZSkucmVwbGFjZSgnLCcsICcuJyl9YCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJEYXRlQ29udiA9IGB0aGlzLmRhdGVzLmdldERhdGVDb252ZXJ0aW9uKFwiJHtyUGFyLnZhbHVlfVwiKWA7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbERhdGVDb252ID0gYHRoaXMuZGF0ZXMuZ2V0RGF0ZUNvbnZlcnRpb24oXCIke3ZhbHVlfVwiKWA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI9PVwiOiByZXR1cm4gZXZhbChgJHtwYXJEYXRlQ29udn0gPT0gJHt2YWxEYXRlQ29udn0gfHwgKCR7cGFyRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHtwYXJEYXRlQ29udn0uaXNTYW1lKCR7dmFsRGF0ZUNvbnZ9KSlgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIiE9XCI6IHJldHVybiBldmFsKGAke3BhckRhdGVDb252fSAhPSAke3ZhbERhdGVDb252fSAmJiAke3BhckRhdGVDb252fSAhPSBudWxsICYmICEke3BhckRhdGVDb252fS5pc1NhbWUoJHt2YWxEYXRlQ29udn0pYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+XCI6IHJldHVybiBldmFsKGAke3BhckRhdGVDb252fSAhPSBudWxsICYmICR7dmFsRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHtwYXJEYXRlQ29udn0uaXNBZnRlcigke3ZhbERhdGVDb252fSlgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjxcIjogcmV0dXJuIGV2YWwoYCR7cGFyRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHt2YWxEYXRlQ29udn0gIT0gbnVsbCAmJiAke3BhckRhdGVDb252fS5pc0JlZm9yZSgke3ZhbERhdGVDb252fSlgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIj49XCI6IHJldHVybiBldmFsKGAke3BhckRhdGVDb252fSAhPSBudWxsICYmICR7dmFsRGF0ZUNvbnZ9ICE9IG51bGwgJiYgKCR7cGFyRGF0ZUNvbnZ9LmlzQWZ0ZXIoJHt2YWxEYXRlQ29udn0pIHx8ICR7cGFyRGF0ZUNvbnZ9Py5pc1NhbWUoJHt2YWxEYXRlQ29udn0pKWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPD1cIjogcmV0dXJuIGV2YWwoYCR7cGFyRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHt2YWxEYXRlQ29udn0gIT0gbnVsbCAmJiAoJHtwYXJEYXRlQ29udn0uaXNCZWZvcmUoJHt2YWxEYXRlQ29udn0pIHx8ICR7cGFyRGF0ZUNvbnZ9Py5pc1NhbWUoJHt2YWxEYXRlQ29udn0pKWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJFcnJvcmkgbmVsbGEgdmFsdXRhemlvbmUgZGVsbCdlc3ByZXNzaW9uZS4gRmFsbGJhY2sgYSBmYWxzZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhyb3cgYEBlc2ZhZW56YS9wYXJhbWV0ZXJzOiBUaXBvIHBhcmFtZXRybyAke2tleX0gbm9uIHJpY29ub3NjaXV0bzogJHtyUGFyLnR5cGV9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSBkZWZhdWx0SWZudWxsT3JVbmRlZmluZWQ8VD4oaXRlbTogVCwgZGZsdDogVCwgZW1wdHlTdHJpbmdJc051bGw6IGJvb2xlYW4gPSBmYWxzZSk6IFQge1xyXG4gICAgICAgIGlmIChpdGVtID09IG51bGwgfHwgaXRlbSA9PSB1bmRlZmluZWQgfHwgaXRlbS50b1N0cmluZygpID09ICdudWxsJyB8fCAoZW1wdHlTdHJpbmdJc051bGwgJiYgaXRlbS50b1N0cmluZygpID09IFwiXCIpKVxyXG4gICAgICAgICAgICByZXR1cm4gZGZsdDtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIGdldFNvdXJjZShwYXJhbWV0ZXI6IEdlbmVyaWNQYXJhbWV0ZXIsIHNlYXJjaDogc3RyaW5nLCBieWlkOiBib29sZWFuKTogT2JzZXJ2YWJsZTx7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLkF1dG9Db21wbGV0ZURhdGFSZXRyaWV2ZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQGZvcm1zLWFuZC12YWxpZGF0aW9uczogZnVuemlvbmUgZGkgZGF0YXJldHJpZXZlIG5vbiBpbXBvc3RhdGEgcGVyIHVuIHBhcmFtZXRybyBhdXRvY29tcGxldGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihbXSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5BdXRvQ29tcGxldGVEYXRhUmV0cmlldmUocGFyYW1ldGVyLCBzZWFyY2gsIGJ5aWQpO1xyXG4gICAgfVxyXG59IiwiPGRpdiAqbmdJZj1cIighUGFyYW1ldGVycyB8fCBQYXJhbWV0ZXJzLmxlbmd0aCA9PSAwKSAmJiBFbXB0eU1lc3NhZ2VcIj5cclxuICAgIDxlbT57e0VtcHR5TWVzc2FnZX19PC9lbT5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwiR3JvdXBzXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiVGVtcDsgY29udGV4dDoge2l0ZW06IHsgZ3JvdXBzOiBHcm91cHMsIGlzU3ViZ3JvdXA6IGZhbHNlIH19XCI+PC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNUZW1wIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgaXRlbS5ncm91cHM7IGxldCBrID0gaW5kZXhcIj5cclxuICAgICAgICA8ZGl2IFtjbGFzcy5wYXJzLXN1Ymdyb3VwXT1cIml0ZW0uaXNTdWJncm91cFwiIFtjbGFzcy5wYXJzLWdyb3VwXT1cIiFpdGVtLmlzU3ViZ3JvdXBcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkdyb3Vwc09yU3ViZ3JvdXBzRGlzcGxheTsgY29udGV4dDogeyBpdGVtOiB7IGdyb3VwOiBncm91cCwgaW5kZXg6IGsgKyAoaXRlbS5pbmRleCA/ICgnXycgKyBpdGVtLmluZGV4KSA6ICcnKSwgaXNTdWJncm91cDogaXRlbS5pc1N1Ymdyb3VwIH19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cC5zdWJncm91cHMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlRlbXA7IGNvbnRleHQ6IHtpdGVtOiB7IGdyb3VwczogZ3JvdXAuc3ViZ3JvdXBzLCBpbmRleDogayArIChpdGVtLmluZGV4ID8gKCdfJyArIGl0ZW0uaW5kZXgpIDogJycpLCBpc1N1Ymdyb3VwOiB0cnVlIH19O1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNHcm91cHNPclN1Ymdyb3Vwc0Rpc3BsYXkgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5ncm91cFwiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmdyb3VwLmdyb3VwTmFtZVwiIFtjbGFzcy5wYXJzLWdyb3VwLXRpdGxlXT1cIiFpdGVtLmlzU3ViZ3JvdXBcIiBbY2xhc3MucGFycy1zdWJncm91cC10aXRsZV09XCJpdGVtLmlzU3ViZ3JvdXBcIj5cclxuICAgICAgICAgICAge3tpdGVtLmdyb3VwLmdyb3VwTmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uZ3JvdXAucGFyYW1ldGVycyAmJiBpdGVtLmdyb3VwLnBhcmFtZXRlcnMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGZvcm0tZ3JvdXBcIiAqbmdGb3I9XCJsZXQgcGFyIG9mIGl0ZW0uZ3JvdXAucGFyYW1ldGVyczsgbGV0IGk9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3Q7XCIgW2NsYXNzLmFwcC1tYXJnaW4tYm90dG9tLTBdPVwiTGFzdFBhcmFtZXRlck5vTWFyZ2luICYmIGxhc3RcIiBbaGlkZGVuXT1cIiFwYXIudmlzaWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLXt7TGFiZWxDb2xXaWR0aH19IG0tdC01XCI+PHNwYW4gKm5nSWY9XCJSZW1vdmFsXCIgY2xhc3M9XCJmYSBmYS1yZW1vdmUgdGV4dC1kYW5nZXJcIiAoY2xpY2spPVwicmVtb3ZlUGFyYW1ldGVyKHBhcilcIj4mbmJzcDs8L3NwYW4+e3twYXIuZGVzY3JpcHRpb259fXt7cGFyLnJlcXVpcmVkID8gJyonIDogJyd9fTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPCEtLVNlIERhdGEtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX1cIiAqbmdJZj1cInBhci50eXBlID09ICdkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtLWRhdGUgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgW0Zvcm1dPVwiRm9ybVwiIFtGb3JtTGF5b3V0XT1cImZhbHNlXCIgW1JlYWRvbmx5XT1cIlJlYWRvbmx5IHx8IHBhci5pc3JlYWRvbmx5XCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZFwiIFsobmdNb2RlbCldPVwicGFyLnZhbHVlXCIgbmFtZT1cInt7aXRlbS5pbmRleH19cGFye3tpfX1cIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3I+PC9mb3JtLWRhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1TZSBzdHJpbmdhLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnc3RyaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtLWlucHV0IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbcmVxdWlyZWRdPVwicGFyLnJlcXVpcmVkXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0taW5wdXQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1TZSBudW1lcm8tLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX1cIiAqbmdJZj1cInBhci50eXBlID09ICdudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0taW5wdXQgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtyZXF1aXJlZF09XCJwYXIucmVxdWlyZWRcIiBbKG5nTW9kZWwpXT1cInBhci52YWx1ZVwiIG5hbWU9XCJ7e2l0ZW0uaW5kZXh9fXBhcnt7aX19XCIgKGlucHV0Q2hhbmdlKT1cImNoYW5nZWQoKTtcIiAjdmFsaWRhdG9yIHBhdHRlcm49XCJ7e3Bhci5wYXR0ZXJuIHx8ICdeWystXT9bMC05XSpbLF0/WzAtOV0rJCd9fVwiPjwvZm9ybS1pbnB1dD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLVNlIGJvb2xlYW4tLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX0gbS10LTVcIiAqbmdJZj1cInBhci50eXBlID09ICdib29sZWFuJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtLWNoZWNrYm94IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbKG5nTW9kZWwpXT1cInBhci52YWx1ZVwiIG5hbWU9XCJ7e2l0ZW0uaW5kZXh9fXBhcnt7aX19XCIgKGlucHV0Q2hhbmdlKT1cImNoYW5nZWQoKTtcIiAjdmFsaWRhdG9yPjwvZm9ybS1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLVNlIGVudW0gc2luZ2xlIHNlbGVjdC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2VudW0nICYmICFwYXIubXVsdGllbnVtICYmICFwYXIuc291cmNlYXBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0tc2VsZWN0IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbcmVxdWlyZWRdPVwicGFyLnJlcXVpcmVkXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvciBbU291cmNlXT1cInBhci5lbnVtdmFsdWVzXCI+PC9mb3JtLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLVNlIGVudW0gbXVsdGkgc2VsZWN0LS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnZW51bScgJiYgcGFyLm11bHRpZW51bSAmJiAhcGFyLnNvdXJjZWFwaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtLW11bHRpc2VsZWN0IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbVXNlQ29tbWFTZXBhcmF0ZWRMaXN0XT1cInRydWVcIiBbU2VsZWN0TGFiZWxdPVwiKCdTZWxlY3QnIHwgbG9jYWxpemUgOiBsYykgKyAnLi4uJ1wiIFsobmdNb2RlbCldPVwicGFyLnZhbHVlXCIgbmFtZT1cInt7aXRlbS5pbmRleH19cGFye3tpfX1cIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbU291cmNlXT1cInBhci5lbnVtdmFsdWVzXCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZFwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0tbXVsdGlzZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1TZSBlbnVtIGF1dG9jb21wbGV0ZS0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2VudW0nICYmICFwYXIubXVsdGllbnVtICYmIHBhci5zb3VyY2VhcGlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Zm9ybS1hdXRvY29tcGxldGUgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtQbGFjZWhvbGRlcl09XCIoJ1NlbGVjdCcgfCBsb2NhbGl6ZSA6IGxjKSArICcuLi4nXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtTZWFyY2hGdW5jdGlvbl09XCJnZXRTb3VyY2UuYmluZCh0aGlzLCBwYXIpXCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZFwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0tYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tU2UgZW51bSBtdWx0aXNlbGVjdCBhdXRvY29tcGxldGUtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX1cIiAqbmdJZj1cInBhci50eXBlID09ICdlbnVtJyAmJiBwYXIubXVsdGllbnVtICYmIHBhci5zb3VyY2VhcGlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Zm9ybS1hdXRvY29tcGxldGUgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbSGlkZUNob2ljZXNPblNlbGVjdGlvbl09XCJBdXRvY29tcGxldGVIaWRlQ2hvaWNlc09uU2VsZWN0aW9uXCIgW011bHRpXT1cInRydWVcIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtQbGFjZWhvbGRlcl09XCIoJ1NlbGVjdCcgfCBsb2NhbGl6ZSA6IGxjKSArICcuLi4nXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtTZWFyY2hGdW5jdGlvbl09XCJnZXRTb3VyY2UuYmluZCh0aGlzLCBwYXIpXCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZFwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0tYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
405
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfcGFyYW1ldGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXJhbWV0ZXJzL3NyYy9saWIvZXNfcGFyYW1ldGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXJhbWV0ZXJzL3NyYy9saWIvZXNfcGFyYW1ldGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUE0QyxTQUFTLEVBQVUsYUFBYSxFQUFFLGlCQUFpQixFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUksT0FBTyxFQUFxQixTQUFTLEVBQUUsVUFBVSxFQUFZLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RyxpQkFBaUI7QUFDakIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFNOUQsZUFBZTtBQUNmLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7O0FBRXZFLHVIQUF1SDtBQW9CdkgsTUFBTSxPQUFPLHFCQUFxQjtJQXNEOUIsbUlBQW1JO0lBQ25JLElBQWEsZUFBZSxDQUFDLEtBQWE7UUFDdEMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQW9CLE9BQXVCLEVB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RSxJQUFJO1NBQ2Q7S0FDSiwwQkMvQkwsMHZNQStEYzsyRkQzQkQscUJBQXFCO2tCQW5CakMsU0FBUzsrQkFDSSxlQUFlLGFBQ2Q7d0JBQ1AsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRTt3QkFDM0Q7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUM7NEJBQ3BELEtBQUssRUFBRSxJQUFJO3lCQUNkO3dCQUNEOzRCQUNJLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBQzs0QkFDcEQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0osaUJBRWMsaUJBQWlCLENBQUMsSUFBSTt3TkFzQjVCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0csa0NBQWtDO3NCQUExQyxLQUFLO2dCQUdHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFHTyxlQUFlO3NCQUEzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVW50eXBlZEZvcm1Db250cm9sLCBOZ0NvbnRyb2wsIE5nRm9ybSwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IsIFZhbGlkYXRvciB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbmplY3RvciwgSW5wdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuaW1wb3J0IHsgRGF0ZVNlcnZpY2UsIFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9leHRlbnNpb25zXCI7XHJcblxyXG4vLyBDbGFzc2lcclxuaW1wb3J0IHsgR2VuZXJpY1BhcmFtZXRlciB9IGZyb20gJy4vbW9kZWxzL0dlbmVyaWNQYXJhbWV0ZXInO1xyXG5cclxuLy8gQXBwbGljYXppb25lXHJcbmltcG9ydCB7IEVzUGFyYW1ldGVyc0xvYyB9IGZyb20gXCIuL2VzX3BhcmFtZXRlcnMuY29tcG9uZW50LmxvY1wiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IEdlbmVyaWNQYXJhbWV0ZXJHcm91cCB9IGZyb20gXCIuL21vZGVscy9HZW5lcmljUGFyYW1ldGVyR3JvdXBcIjtcclxuXHJcbi8qKiBDb21wb25lbnRlIGNoZSBwZXJtZXR0ZSBkaSBncmFmaWNhcmUgdW5hIGxpc3RhIGRpICoqR2VuZXJpY1BhcmFtZXRlcioqIGNvbWUgSW5wdXQgaW4gYmFzZSBhbCBsb3JvIHRpcG8gc3BlY2lmaWNvICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwiZXMtcGFyYW1ldGVyc1wiLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgeyBwcm92aWRlOiBMb2NhbGl6YXRpb25TZXJ2aWNlLCB1c2VDbGFzczogRXNQYXJhbWV0ZXJzTG9jIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRXNQYXJhbWV0ZXJzQ29tcG9uZW50KSxcclxuICAgICAgICAgICAgbXVsdGk6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcclxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRXNQYXJhbWV0ZXJzQ29tcG9uZW50KSxcclxuICAgICAgICAgICAgbXVsdGk6IHRydWVcclxuICAgICAgICB9XHJcbiAgICBdLFxyXG4gICAgc3R5bGVVcmxzOiBbXCIuL2VzX3BhcmFtZXRlcnMuY29tcG9uZW50LnNjc3NcIl0sXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9lc19wYXJhbWV0ZXJzLmNvbXBvbmVudC5odG1sXCJcclxufSlcclxuZXhwb3J0IGNsYXNzIEVzUGFyYW1ldGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xyXG5cclxuICAgIC8qKiBNb2RlbGxvIGRlbCBjb21wb25lbnRlIHN1IGN1aSB2ZW5nb25vIGVmZmV0dHVhdGUgbGUgZ3JhZmljYXppb25pICovXHJcbiAgICBwdWJsaWMgUGFyYW1ldGVyczogR2VuZXJpY1BhcmFtZXRlcltdO1xyXG5cclxuICAgICAgLyoqIE1vZGVsbG8gZGVsIGNvbXBvbmVudGUgc3UgY3VpIHZlbmdvbm8gZWZmZXR0dWF0ZSBsZSBncmFmaWNhemlvbmkgKi9cclxuICAgIHB1YmxpYyBHcm91cHM6IEdlbmVyaWNQYXJhbWV0ZXJHcm91cFtdO1xyXG5cclxuICAgIC8qKiBDYWNoZSBwZXIgZmFyZSBsb29rdXAgcmFwaWRpIGluIGZhc2UgZGkgdmFsdXRhemlvbmUgZXNwcmVzc2lvbmkgZGkgdmlzaWJpbGl0w6AgZSBvYmJsaWdhdG9yaWV0w6AgKi9cclxuICAgIHByaXZhdGUgUGFyYW1ldGVyc0NhY2hlOiB7W2lkOiBzdHJpbmddOiBHZW5lcmljUGFyYW1ldGVyfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpcGVsaW5lIGRpIEFuZ3VsYXIgXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuICAgIC8qKiBJbmRpY2EgY2hlIGlsIHBhcmFtZXRybyBkZXZlIGVzc2VyZSBpbiBtb2RhbGl0w6AgZGlzcGxheSAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIGNoZSBsJ3VsdGltbyBwYXJhbWV0cm8gbm9uIGRldmUgYXZlcmUgbWFyZ2luZSBpbiBmb25kbyAqL1xyXG4gICAgQElucHV0KCkgTGFzdFBhcmFtZXRlck5vTWFyZ2luOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIGNvbC1tZC1YIHBlciBsYSBsYWJlbCAqL1xyXG4gICAgQElucHV0KCkgTGFiZWxDb2xXaWR0aDogbnVtYmVyID0gNDtcclxuXHJcbiAgICAvKiogY29sLW1kLVggcGVyIGwnaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIElucHV0Q29sV2lkdGg6IG51bWJlciA9IDg7XHJcblxyXG4gICAgLyoqIElucHV0IGEgY3VpIGNvbGxlZ2FyZSBsYSB2YXJpYWJpbGUgKipzdWJtaXR0ZWQqKiBkZWwgZm9ybSBhbGwnaW50ZXJubyBkZWwgcXVhbGUgdmllbmUgdXRpbGl6emF0byBxdWVzdG8gY29tcG9uZW50ZSAqL1xyXG4gICAgQElucHV0KCkgc3VibWl0dGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIFZhbG9yZSBkYSBtb3N0cmFyZSBxdWFsb3JhIG5vbiBmb3NzZXJvIGFuY29yYSByaWNldnV0aSBpICoqUGFyYW1ldGVycyoqIGRhIG1vc3RyYXJlICovXHJcbiAgICBASW5wdXQoKSBFbXB0eU1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIFBlcm1ldHRlIGRpIHJpbXVvdmVyZSBpIHBhcmFtZXRyaSBkYWxsYSBsaXN0YSBjbGljY2FuZG8gc3VsbGEgWCBkYXZhbnRpIGFsbGEgTGFiZWwgKi9cclxuICAgIEBJbnB1dCgpIFJlbW92YWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIHNlIGkgY29tcG9uZW50aSBkaSBJbnB1dCBnZW5lcmF0aSBzb25vIFJlYWRvbmx5IG8gbm8gKi9cclxuICAgIEBJbnB1dCgpIFJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSBpIGNvbXBvbmVudGkgZGkgSW5wdXQgZ2VuZXJhdGkgc29ubyBSZWFkb25seSBvIG5vICovXHJcbiAgICBASW5wdXQoKSBMaXN0Rm9ybWF0OiAnQ29tbWFTZXBhcmF0ZWQnIHwgJ0FycmF5JyA9ICdBcnJheSc7XHJcblxyXG4gICAgLyoqIEZvcm0gY2hlIHV0aWxpenphIGlsIGNvbXBvbmVudGUuIEZvbmRhbWVudGFsZSBjb2xsZWdhcmxvIHNlIHNpIHZvZ2xpb25vIGxlIHZhbGlkYXppb25pIHN1bCBzdWJtaXQgKi9cclxuICAgIEBJbnB1dCgpIEZvcm0gOiBOZ0Zvcm0gPSBudWxsO1xyXG5cclxuICAgIC8qKiBRdWFuZG8gdXRpbGl6emEgdW4gc290dG9jb21wb25lbnRlIGF1dG9jb21wbGV0ZSBhYmlsaXRhIG8gZGlzYWJpbGl0YSBpbCByZXNldCBkZWxsJ2lucHV0IHBlciBvZ25pIHNlbGV6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgQXV0b2NvbXBsZXRlSGlkZUNob2ljZXNPblNlbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBGdW56aW9uZSBkYSB1dGlsaXp6YXJlIHBlciB0aXJhcmUgZnVvcmkgaSBkYXRpIGRpIHVuIGF1dG9jb21wbGV0ZSAqL1xyXG4gICAgQElucHV0KCkgQXV0b0NvbXBsZXRlRGF0YVJldHJpZXZlOiAocGFyYW1ldGVyOiBHZW5lcmljUGFyYW1ldGVyLCBzZWFyY2g6IHN0cmluZywgYnlpZDogYm9vbGVhbikgPT4gT2JzZXJ2YWJsZTx7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdPlxyXG5cclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBzZXR0YXJlIGluIHVuYSB2b2x0YSBzb2xvIGdsaSBpbnB1dCAqKkxhYmVsQ29sV2lkdGgqKiBlICoqSW5wdXRDb2xXaWR0aCoqLCBiYXN0YSBzY3JpdmVybG8gY29uIGxhIHNpbnRhc3NpIFwiWCBZXCIgKi9cclxuICAgIEBJbnB1dCgpIHNldCBMYWJlbElucHV0UmF0aW8oaW5wdXQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciByYXRpbyA9IGlucHV0LnNwbGl0KC9cXHMvKTtcclxuICAgICAgICB0aGlzLkxhYmVsQ29sV2lkdGggPSBwYXJzZUludChyYXRpb1swXSk7XHJcbiAgICAgICAgdGhpcy5JbnB1dENvbFdpZHRoID0gcGFyc2VJbnQocmF0aW9bMV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29zdHJ1dHRvcmVcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHV0aUV4dHM6IFV0aWxpdHlTZXJ2aWNlLCBwdWJsaWMgbGM6IExvY2FsaXphdGlvblNlcnZpY2UsIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGluajogSW5qZWN0b3IsIHB1YmxpYyBkYXRlczogRGF0ZVNlcnZpY2UpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGlwZWxpbmUgZGkgQW5ndWxhclxyXG4gICAgICogXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKG9iaik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuUGFyYW1ldGVycyA9IG9iajtcclxuXHJcbiAgICAgICAgdGhpcy5QYXJhbWV0ZXJzQ2FjaGUgPSB7fTtcclxuICAgICAgICBpZiAoIXRoaXMuUGFyYW1ldGVycylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLlBhcmFtZXRlcnMuZm9yRWFjaCh0ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5QYXJhbWV0ZXJzQ2FjaGVbdC5pZF0gPSB0O1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0LnR5cGVjb2RlICYmICF0LnR5cGUpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJOb24gw6ggc3RhdG8gc3BlY2lmaWNhdG8gbsOpIHVuIHR5cGUgbsOpIHVuIHR5cGVjb2RlXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHQudHlwZWNvZGUgJiYgIXQudHlwZSlcclxuICAgICAgICAgICAgICAgIHQudHlwZSA9IHRoaXMudXRpRXh0cy5nZXRKc1R5cGVGcm9tVHlwZUNvZGUodC50eXBlY29kZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodC50eXBlY29kZSAmJiB0LnR5cGUgIT0gdGhpcy51dGlFeHRzLmdldEpzVHlwZUZyb21UeXBlQ29kZSh0LnR5cGVjb2RlKSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUmlsZXZhdGUgaW5jb25zaXN0ZW56ZSBmcmEgaWwgVGlwbyAke3QudHlwZX0gZSBpbCBUaXBvICR7dGhpcy51dGlFeHRzLmdldEpzVHlwZUZyb21UeXBlQ29kZSh0LnR5cGVjb2RlKX0gY2FsY29sYXRvIGRhIFR5cGVDb2RlICR7dC50eXBlY29kZX0gcGVyIGlsIHBhcmFtZXRybyAke3QuaWR9YCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodC50eXBlID09IFwiYm9vbGVhblwiKVxyXG4gICAgICAgICAgICAgICAgdC52YWx1ZSA9IHQudmFsdWU/LnRvU3RyaW5nKCk/LnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xyXG5cclxuICAgICAgICAgICAgaWYgKHQuZW51bXR5cGUgfHwgdC5kaWN0dHlwZSlcclxuICAgICAgICAgICAgICAgIHQudHlwZSA9ICdlbnVtJztcclxuXHJcbiAgICAgICAgICAgIC8vIFZhbG9yZSB2YWxpZG8gbWEgbW9kYWxpdMOgIGRpIHV0aWxpenpvIGEgQ29tbWFTZXBhcmF0ZWQsIGRldm8gYXNzaWN1cmFybWkgZGkgcmllbWV0dGVyZSBsYSB2ZXJzaW9uZSBjb24gbGEgc3RyaW5nYVxyXG4gICAgICAgICAgICBpZiAodC50eXBlID09ICdlbnVtJyAmJiB0aGlzLkxpc3RGb3JtYXQgPT0gJ0NvbW1hU2VwYXJhdGVkJyAmJiB0Lm11bHRpZW51bSAmJiB0LnZhbHVlICYmIEFycmF5LmlzQXJyYXkodC52YWx1ZSkpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEFnZ2l1c3RvIGxlIG1vZGFsaXTDoCBkaSBmdW56aW9uYW1lbnRvIGRlaSBwYXJhbWV0cmkgbGlzdGEuIENoZSBpbnRlcm5hbWVudGUgZnVuemlvbmFubyBzZW1wcmUgY29uIHVuYSBsaXN0YSBkaSB2YWxvcmlcclxuICAgICAgICAgICAgaWYgKHQudHlwZSA9PSAnZW51bScgJiYgdGhpcy5MaXN0Rm9ybWF0ID09ICdDb21tYVNlcGFyYXRlZCcgJiYgdC5tdWx0aWVudW0gJiYgdC52YWx1ZSAmJiAhQXJyYXkuaXNBcnJheSh0LnZhbHVlKSlcclxuICAgICAgICAgICAgICAgIHQudmFsdWUgPSB0LnZhbHVlID8gdC52YWx1ZS5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKSA6IFtdO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmdlbmVyYXRlR3JvdXBzKCk7XHJcbiAgICAgICAgdGhpcy5yZXZpZXdQYXJhbWV0ZXJzQmluZGluZ3MoKTtcclxuICAgIH1cclxuICAgICAgXHJcbiAgICAvKipcclxuICAgICogTWV0b2RvIGNoZSBzaSBvY2N1cGEgZGkgY3JlYXJlIGUgb3JkaW5hcmUgaSBncnVwcGkgZGVpIHBhcmFtZXRyaVxyXG4gICAgKi9cclxuICAgIGdlbmVyYXRlR3JvdXBzKCl7XHJcbiAgICAgICAgdGhpcy5Hcm91cHMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYodGhpcy5QYXJhbWV0ZXJzPy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgdGhpcy5QYXJhbWV0ZXJzLnNvcnQoKGEsYikgPT4gYS5vcmRlciA8IGIub3JkZXIgPyAtMSA6IDEpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2ljbG8gdHV0dGkgaSBwYXJhbWV0cmlcclxuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgdGhpcy5QYXJhbWV0ZXJzLmxlbmd0aCA+IGk7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhciA9IHRoaXMuUGFyYW1ldGVyc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyR3JvdXBOYW1lID0gcGFyLmdyb3VwID8/IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBPcmRlciA9IHBhci5ncm91cCA/IHBhci5vcmRlciA6IC0xO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNlIGlsIGdydXBwbyBub24gZXNpc3RlLCBsbyBhZ2dpdW5nb1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdyb3Vwcy5zb21lKHggPT4geC5ncm91cE5hbWUgPT0gcGFyR3JvdXBOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuR3JvdXBzLnB1c2gobmV3IEdlbmVyaWNQYXJhbWV0ZXJHcm91cChwYXJHcm91cE5hbWUsIGdyb3VwT3JkZXIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJbnNlcmlzY28gaWwgcGFyYW1ldHJvIGRlbnRybyBhbCBzdW8gZ3J1cHBvXHJcbiAgICAgICAgICAgICAgICB0aGlzLkdyb3Vwcy5maW5kKGcgPT4gZy5ncm91cE5hbWUgPT0gcGFyR3JvdXBOYW1lKS5wYXJhbWV0ZXJzLnB1c2gocGFyKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBHZXN0aW9uZSBzb3R0b2dydXBwaVxyXG4gICAgICAgICAgICBsZXQgc3ViZ3JvdXBzOiBHZW5lcmljUGFyYW1ldGVyR3JvdXBbXSA9IHRoaXMuR3JvdXBzLmZpbHRlcihncm91cCA9PiBncm91cC5ncm91cE5hbWUuaW5jbHVkZXMoJ8KnJykpO1xyXG4gICAgICAgICAgICBmb3IobGV0IF87IHN1Ymdyb3Vwcy5sZW5ndGggPiAwOyAoKSA9PiB7fSkge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVjdXBlcm8gbGEgbGlzdGEgZGkgZ3J1cHBpIGNoZSBoYW5ubyBzb3R0b2dydXBwaVxyXG4gICAgICAgICAgICAgICAgLy8gUGVyIGNvbnZlbnppb25lLCBuZWwgbm9tZSBjb250ZW5nb25vIFwiwqdcIlxyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0FkZFN1Ymdyb3VwcyhzdWJncm91cHMpO1xyXG4gICAgICAgICAgICAgICAgc3ViZ3JvdXBzID0gdGhpcy5Hcm91cHMuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmdyb3VwTmFtZS5pbmNsdWRlcygnwqcnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuR3JvdXBzLnNvcnQoKGEsYikgPT4gYS5vcmRlciA8IGIub3JkZXIgPyAtMSA6IDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogTWV0b2RvIGNoZSBzaSBvY2N1cGEgZGkgY3JlYXJlIGUgb3JkaW5hcmUgaSBzb3R0b2dydXBwaSBkZWkgcGFyYW1ldHJpXHJcbiAgICAqL1xyXG4gICAgdHJ5VG9BZGRTdWJncm91cHMoc3ViZ3JvdXBzOiBHZW5lcmljUGFyYW1ldGVyR3JvdXBbXSkge1xyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IHN1Ymdyb3Vwcy5sZW5ndGggPiBpOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHN1YiA9IHN1Ymdyb3Vwc1tpXTtcclxuXHJcbiAgICAgICAgICAgIC8vIE90dGVuZ28gdW4gbGlzdGEgY29uIGxhIGdlcmFyY2hpYSBkZWkgZ3J1cHBpLCBpbiBvcmRpbmVcclxuICAgICAgICAgICAgbGV0IGdyb3Vwc1BhcmVudEhpZXJhcmNoeSA9IHN1Yi5ncm91cE5hbWUuc3BsaXQoJ8KnJykgPz8gW107XHJcblxyXG4gICAgICAgICAgICAvLyBSZWN1cGVybyBpbCBncnVwcG8gcGFkcmVcclxuICAgICAgICAgICAgbGV0IHBhcmVudEdyb3VwTmFtZSA9IHN1Yi5ncm91cE5hbWUucmVwbGFjZShgwqcke2dyb3Vwc1BhcmVudEhpZXJhcmNoeVtncm91cHNQYXJlbnRIaWVyYXJjaHkubGVuZ3RoIC0gMV19YCwgYGApO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gU2UgaWwgZ3J1cHBvIHBhZHJlIG5vbiBlc2lzdGUsIGxvIGFnZ2l1bmdvXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Hcm91cHMuc29tZSh4ID0+IHguZ3JvdXBOYW1lID09IHBhcmVudEdyb3VwTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuR3JvdXBzLnB1c2gobmV3IEdlbmVyaWNQYXJhbWV0ZXJHcm91cChwYXJlbnRHcm91cE5hbWUsIHN1Yi5vcmRlcikpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBSaW11b3ZvIGRhbCBub21lIGRlbCBncnVwcG8gbCdpbmZvcm1hemlvbmUgc3VsIHBhZHJlIChTaXN0ZW1hbmRvIGFuY2hlIGwnZXRpY2hldHRhKVxyXG4gICAgICAgICAgICAvLyBlIGxvIGFnZ2l1bmdvIGFpIHNvdHRvZ3J1cHBpIGRlbCBwYWRyZVxyXG4gICAgICAgICAgICBzdWIuZ3JvdXBOYW1lID0gc3ViLmdyb3VwTmFtZS5yZXBsYWNlKGAke3BhcmVudEdyb3VwTmFtZX3Cp2AsICcnKTtcclxuICAgICAgICAgICAgbGV0IHBhcmVudEdyb3VwID0gdGhpcy5Hcm91cHMuZmluZCh4ID0+IHguZ3JvdXBOYW1lID09IHBhcmVudEdyb3VwTmFtZSk7XHJcbiAgICAgICAgICAgIGlmKHBhcmVudEdyb3VwPy5zdWJncm91cHMuc29tZShzID0+IHMuZ3JvdXBOYW1lID09IHN1Yi5ncm91cE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gcGFyZW50R3JvdXAuc3ViZ3JvdXBzLmZpbmQoZiA9PiBmLmdyb3VwTmFtZSA9PSBzdWIuZ3JvdXBOYW1lKTtcclxuICAgICAgICAgICAgICAgIHN1Yi5wYXJhbWV0ZXJzLm1hcChwID0+IHRhcmdldC5wYXJhbWV0ZXJzLnB1c2gocCkpO1xyXG4gICAgICAgICAgICAgICAgc3ViLnN1Ymdyb3Vwcy5tYXAocyA9PiB0YXJnZXQuc3ViZ3JvdXBzLnB1c2gocykpO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Lm9yZGVyID0gc3ViLm9yZGVyIDwgdGFyZ2V0Lm9yZGVyID8gc3ViLm9yZGVyIDogdGFyZ2V0Lm9yZGVyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50R3JvdXA/LnN1Ymdyb3Vwcy5wdXNoKHN1Yik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFJpbXVvdm8gaWwgc290dG9ncnVwcG8gZ3J1cHBvIGRhbGxhIGxpc3RhXHJcbiAgICAgICAgICAgIHRoaXMuR3JvdXBzLnNwbGljZSh0aGlzLkdyb3Vwcy5pbmRleE9mKHN1YiksIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpcGVsaW5lIGRpIEFuZ3VsYXJcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICB2YWxpZGF0ZShjOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiBhbnkge1xyXG4gICAgICAgIC8vIFNlIGxhIHZhbGlkYXppb25lIMOoIHJpY2hpYW1hdGEgZGEgdW4gY29tcG9uZW50ZSBub24gbWUgc3Rlc3NvIHZ1b2wgZGlyZSBjaGUgaSBjb21wb25lbnRpIGRpIHZhbGlkYXppb25lIGludGVybmkgc3Rhbm5vIHJpY2hpYW1hbmRvXHJcbiAgICAgICAgLy8gcXVlc3RvIHZhbGlkYXRvciwgbWEgZGFsIGxvcm8gcHVudG8gZGkgdmlzdGEgbm9uIHNlIG5lIGRldm9ubyBwcmVvY2N1cGFyZSBxdWluZGkgZmFjY2lvIGZpbnRhIG5vbiBjaSBzaWFubyBlcnJvcmkuXHJcbiAgICAgICAgLy8gU2UgaW52ZWNlIHZlbmdvIHJpY2hpYW1hdG8gZGlyZXR0YW1lbnRlIHNpZ25pZmljYSBjaGUgw6ggaWwgZm9ybSBpbiBjdWkgdml2ZSBlcy1wYXJhbWV0ZXJzIGUgbMOsIGRldm8gZWZmZXR0dWFyZSBsYSB2YWxpZGF6aW9uZVxyXG4gICAgICAgIGxldCBjb250cm9sID0gdGhpcy5pbmouZ2V0KE5nQ29udHJvbCwgbnVsbCk/LmNvbnRyb2w7XHJcbiAgICAgICAgaWYgKGMgIT0gY29udHJvbClcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGxldCB2YWxpZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMuUGFyYW1ldGVycyAmJiB0aGlzLlBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLlBhcmFtZXRlcnMuZm9yRWFjaCh0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKCF0LnZpc2libGUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IGVtcHR5TnVtYmVyID0gdC50eXBlID09ICdudW1iZXInICYmICh0LnZhbHVlID09IG51bGwgfHwgdC52YWx1ZSA9PSB1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGVtcHR5Tm9uTnVtYmVyID0gdC50eXBlICE9ICdudW1iZXInICYmICF0LnZhbHVlXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHQucmVxdWlyZWQgJiYgKGVtcHR5TnVtYmVyIHx8IGVtcHR5Tm9uTnVtYmVyKSlcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodC52YWx1ZSAmJiB0LnR5cGUgPT0gJ251bWJlcicpXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBuZXcgUmVnRXhwKHQucGF0dGVybiB8fCAvXlsrLV0/WzAtOV0qWyxdP1swLTldKyQvKS50ZXN0KHQudmFsdWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0LnZhbHVlICYmIHQucGF0dGVybilcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IG5ldyBSZWdFeHAodC5wYXR0ZXJuKS50ZXN0KHQudmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWxpZClcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHsgXCJlcy1wYXJhbWV0ZXJzXCI6IHZhbGlkIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQaXBlbGluZSBkaSBBbmd1bGFyXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm4pOiB2b2lkIHsgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGlwZWxpbmUgZGkgQW5ndWxhclxyXG4gICAgICogXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbik6IHZvaWQgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hlIHNpIG9jY3VwYSBkaSBnZXN0aXJlIGlsIG1vZGVsbG8gaW4gdXNjaXRhIGUgcHJvcGFnYXJsbyBzdWwgYmluZGluZyBuZ01vZGVsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5QYXJhbWV0ZXJzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFNlIGNpIHNvbm8gZGVsbGUgbW9kaWZpY2hlIGFpIGJpbmRpbmcgcG90cmViYmVybyBlc3NlcmUgY2FtYmlhdGkgaSByZXF1aXJlZC4gUmljcmVvIHR1dHRpIGkgY29tcG9uZW50aSBlIHJpLWlkcmF0byBsYSBjYWNoZSBkZWkgcGFyYW1ldHJpXHJcbiAgICAgICAgdmFyIGNoYW5nZXMgPSB0aGlzLnJldmlld1BhcmFtZXRlcnNCaW5kaW5ncygpO1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoKGNoID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuUGFyYW1ldGVycy5maW5kSW5kZXgodCA9PiB0LmlkID09IGNoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFyYW1ldGVyc1tpbmRleF0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuUGFyYW1ldGVyc1tpbmRleF0pKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFyYW1ldGVyc0NhY2hlW2NoXSA9IHRoaXMuUGFyYW1ldGVyc1tpbmRleF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgUGFyYW1ldGVyc0Nsb25lID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLlBhcmFtZXRlcnMpKTtcclxuXHJcbiAgICAgICAgLy8gQWdnaXVzdG8gbGUgbW9kYWxpdMOgIGRpIGZ1bnppb25hbWVudG8gZGVpIHBhcmFtZXRyaSBsaXN0YS4gQ2hlIGludGVybmFtZW50ZSBmdW56aW9uYW5vIHNlbXByZSBjb24gdW5hIGxpc3RhIGRpIHZhbG9yaVxyXG4gICAgICAgIFBhcmFtZXRlcnNDbG9uZT8uZm9yRWFjaCh0ID0+IHtcclxuICAgICAgICAgICAgaWYgKHQudHlwZSA9PSBcImVudW1cIiAmJiB0aGlzLkxpc3RGb3JtYXQgPT0gJ0NvbW1hU2VwYXJhdGVkJyAmJiB0Lm11bHRpZW51bSAmJiB0LnZhbHVlICYmIEFycmF5LmlzQXJyYXkodC52YWx1ZSkpXHJcbiAgICAgICAgICAgICAgICB0LnZhbHVlID0gdC52YWx1ZS5qb2luKCcsJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKFBhcmFtZXRlcnNDbG9uZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSaW11b3ZlIGlsIHBhcmFtZXRybyBzZWxlemlvbmF0byBlIHByb3BhZ2EgaWwgbW9kZWxsb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0dlbmVyaWNQYXJhbWV0ZXJ9IHBhciBQYXJhbWV0cm8gZGEgcmltdW92ZXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVQYXJhbWV0ZXIocGFyOiBHZW5lcmljUGFyYW1ldGVyKSB7XHJcbiAgICAgICAgdGhpcy5QYXJhbWV0ZXJzLnNwbGljZSh0aGlzLlBhcmFtZXRlcnMuaW5kZXhPZihwYXIpLCAxKTtcclxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2VuZXJhdGVQYXJhbWV0ZXJHcm91cHMoKSB7XHJcbiAgICAgICAgbGV0IEdyb3VwczogeyBpZDogc3RyaW5nLCBncm91cHM6IHN0cmluZ1tdLCBvcmRlcjogbnVtYmVyIH1bXSA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLlBhcmFtZXRlcnMuZm9yRWFjaChwYXJhbSA9PiB7XHJcbiAgICAgICAgICAgIEdyb3Vwcy5wdXNoKHsgaWQ6IHBhcmFtLmlkLCBncm91cHM6IHBhcmFtLmdyb3VwLnNwbGl0KFwiwqdcIiksIG9yZGVyOiBwYXJhbS5vcmRlciB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IEdyb3VwZWRHcm91cHMgPSBHcm91cHMucmVkdWNlKChyLCBhKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBmaXJzdEdyb3VwSWQgPSBhLmdyb3Vwcz8ubGVuZ3RoID4gMCA/IGEuZ3JvdXBzWzBdIDogXCJcIjtcclxuICAgICAgICAgICAgcltmaXJzdEdyb3VwSWRdID0gWy4uLnJbZmlyc3RHcm91cElkXSB8fCBbXSwgYV07XHJcbiAgICAgICAgICAgIHJldHVybiByO1xyXG4gICAgICAgIH0sIHt9KTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coR3JvdXBlZEdyb3Vwcyk7XHJcblxyXG4gICAgICAgIC8vIENpY2xvIGRlbCByaXN1bHRhdG8sIGFnZ2l1bmdlbmRvIGkgZ3J1cHBpIGFsIG1vZGVsbG9cclxuICAgICAgICAvLyBQZXIgb2duaSBncnVwcG8gY2hlIGFnZ2l1bmdvLCBhc3NlZ25vIGkgcGFyYW1ldHJpIGluIG9yZGluZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUml2ZWRlIGkgYmluZGluZ3MgZGVpIHBhcmFtZXRyaSBpbiBiYXNlIGEgbG9ybyBldmVudHVhbGkgZXNwcmVzc2lvbmkgZGkgY29udHJvbGxvXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gbGlzdGEgY29uIGdsaSBpZCBkZWkgcGFyYW1ldHJpIGNoZSBzb25vIHN0YXRpIG1vZGlmaWNhdGlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZXZpZXdQYXJhbWV0ZXJzQmluZGluZ3MoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGxldCBjaGFuZ2VzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLlBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHAgPSB0aGlzLlBhcmFtZXRlcnNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAocC5yZXF1aXJlZGV4cCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByZXZSZXEgPSBwLnJlcXVpcmVkO1xyXG4gICAgICAgICAgICAgICAgcC5yZXF1aXJlZCA9IHRoaXMuZXZhbHVhdGUocC5yZXF1aXJlZGV4cCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlJlcSAhPSBwLnJlcXVpcmVkKVxyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChwLmlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocC52aXNpYmxlZXhwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJldlZpc2kgPSBwLnZpc2libGU7XHJcbiAgICAgICAgICAgICAgICBwLnZpc2libGUgPSB0aGlzLmV2YWx1YXRlKHAudmlzaWJsZWV4cCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlZpc2kgIT0gcC52aXNpYmxlKVxyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChwLmlkKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGFuZ2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsdXRhIHVuJ2VzcHJlc3Npb25lIGluIGJhc2UgYWkgcGFyYW1ldHJpIHByZXNlbnRpIG5lbCBtb2RlbGxvIGF0dHVhbGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGV4cHIgRXNwcmVzc2lvbmUgZGEgdmFsdXRhcmUgc2NyaXR0YSBuZWwgZm9ybWF0byAocmlwZXRpYmlsZSkgXCJJRCAoPT18IT18PHw+fD49fDw9KSAoYHZhbG9yZWAgfCBudWxsIHwgdHJ1ZSB8IGZhbHNlIHwgWFhYLFhYWClcIiBzZXBhcmF0byBldmVudHVhbG1lbnRlIGRhICYmIGVkIHx8XHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zICoqdHJ1ZSoqIHNlIGxhIGNvbmRpemlvbmUgw6ggdmVyaWZpY2F0YSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZShleHByOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICB2YXIgcmVnZXggPSAvXFxzPyhbYS16QS1aMC05Xy1dKylcXHM/KCE9fD09fDx8Pnw8PXw+PSlcXHM/KGBbXmBdK2B8YGB8bnVsbHxbMC05LF0rfHRydWV8ZmFsc2UpL2dtO1xyXG5cclxuICAgICAgICB2YXIgbWF0Y2hlczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICB2YXIgZmluYWxFeHByID0gZXhwcjtcclxuICAgICAgICB3aGlsZSAobWF0Y2hlcyA9IHJlZ2V4LmV4ZWMoZXhwcikpIHtcclxuICAgICAgICAgICAgdmFyIGZ1bGxNYXRjaCA9IG1hdGNoZXNbMF0udHJpbSgpO1xyXG4gICAgICAgICAgICB2YXIgaWQgPSBtYXRjaGVzWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgdmFyIG9wZXJhdGlvbiA9IG1hdGNoZXNbMl0udHJpbSgpO1xyXG4gICAgICAgICAgICBsZXQgYlZhbHVlID0gbWF0Y2hlc1szXS50cmltKCkudHJpbSgpO1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBtYXRjaGVzWzNdLnRyaW0oKS50cmltKCkucmVwbGFjZSgnYCcsICcnKS5yZXBsYWNlKCdgJywgJycpO1xyXG5cclxuICAgICAgICAgICAgZmluYWxFeHByID0gZmluYWxFeHByLnJlcGxhY2UoZnVsbE1hdGNoLCBgdGhpcy5jaGVja1ZhbHVlKCcke2lkfScsICcke29wZXJhdGlvbn0nLCAke2JWYWx1ZSA9PSAnbnVsbCcgPyAnbnVsbCcgOiBgJyR7dmFsdWV9J2B9KWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGV2YWwoZmluYWxFeHByKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3RpdHVpc2NlIGwnb3BlcmF6aW9uZSBkaSBjb21wYXJhemlvbmUgZnJhIHVuIHNpbmdvbG8gdmFsb3JlIGRpIHVuIHBhcmFtZXRybyBlIHVuIHN1byB2YWxvcmUgZGkgY29uZnJvbnRvIGluIGJhc2UgYWQgdW4gb3BlcmF0b3JlXHJcbiAgICAgKiBSaWNoaWFtYXRhIGRhIEVWQUxcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBDaGlhdmUgZGVsIHBhcmFtZXRybyBkaSBjdWkgdmVyaWZpY2FyZSBpbCB2YWxvcmVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciBPcGVyYXRvcmUgY29uIGN1aSB2ZXJpZmljYXJlIGlsIHZhbG9yZTogPT0sICE9LCA+LCA8LCA+PSwgPD1cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBWYWxvcmUgZGkgY29uZnJvbnRvIGRhIHV0aWxpenphcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgKip0cnVlKiogc2UgbGEgY29uZGl6aW9uZSDDqCB2ZXJpZmljYXRhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2hlY2tWYWx1ZShrZXk6IHN0cmluZywgb3BlcmF0b3I6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHZhciByUGFyID0gdGhpcy5QYXJhbWV0ZXJzQ2FjaGVba2V5XTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHJQYXIudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbChgXCIke3RoaXMuZGVmYXVsdElmbnVsbE9yVW5kZWZpbmVkKHJQYXIudmFsdWUsIGBgKX1cIiAke29wZXJhdG9yfSBcIiR7dGhpcy5kZWZhdWx0SWZudWxsT3JVbmRlZmluZWQodmFsdWUsIGBgKX1cImApO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbChgJHt0aGlzLmRlZmF1bHRJZm51bGxPclVuZGVmaW5lZChyUGFyLnZhbHVlLCBgYCkudG9TdHJpbmcoKX0gJHtvcGVyYXRvcn0gJHt0aGlzLmRlZmF1bHRJZm51bGxPclVuZGVmaW5lZCh2YWx1ZSwgYGApfWApO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsKGAke3RoaXMuZGVmYXVsdElmbnVsbE9yVW5kZWZpbmVkKHJQYXIudmFsdWUsICdcIlwiJywgdHJ1ZSkucmVwbGFjZSgnLCcsICcuJyl9ICR7b3BlcmF0b3J9ICR7dGhpcy5kZWZhdWx0SWZudWxsT3JVbmRlZmluZWQodmFsdWUsICdcIlwiJywgdHJ1ZSkucmVwbGFjZSgnLCcsICcuJyl9YCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJEYXRlQ29udiA9IGB0aGlzLmRhdGVzLmdldERhdGVDb252ZXJ0aW9uKFwiJHtyUGFyLnZhbHVlfVwiKWA7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbERhdGVDb252ID0gYHRoaXMuZGF0ZXMuZ2V0RGF0ZUNvbnZlcnRpb24oXCIke3ZhbHVlfVwiKWA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI9PVwiOiByZXR1cm4gZXZhbChgJHtwYXJEYXRlQ29udn0gPT0gJHt2YWxEYXRlQ29udn0gfHwgKCR7cGFyRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHtwYXJEYXRlQ29udn0uaXNTYW1lKCR7dmFsRGF0ZUNvbnZ9KSlgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIiE9XCI6IHJldHVybiBldmFsKGAke3BhckRhdGVDb252fSAhPSAke3ZhbERhdGVDb252fSAmJiAke3BhckRhdGVDb252fSAhPSBudWxsICYmICEke3BhckRhdGVDb252fS5pc1NhbWUoJHt2YWxEYXRlQ29udn0pYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+XCI6IHJldHVybiBldmFsKGAke3BhckRhdGVDb252fSAhPSBudWxsICYmICR7dmFsRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHtwYXJEYXRlQ29udn0uaXNBZnRlcigke3ZhbERhdGVDb252fSlgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjxcIjogcmV0dXJuIGV2YWwoYCR7cGFyRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHt2YWxEYXRlQ29udn0gIT0gbnVsbCAmJiAke3BhckRhdGVDb252fS5pc0JlZm9yZSgke3ZhbERhdGVDb252fSlgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIj49XCI6IHJldHVybiBldmFsKGAke3BhckRhdGVDb252fSAhPSBudWxsICYmICR7dmFsRGF0ZUNvbnZ9ICE9IG51bGwgJiYgKCR7cGFyRGF0ZUNvbnZ9LmlzQWZ0ZXIoJHt2YWxEYXRlQ29udn0pIHx8ICR7cGFyRGF0ZUNvbnZ9Py5pc1NhbWUoJHt2YWxEYXRlQ29udn0pKWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPD1cIjogcmV0dXJuIGV2YWwoYCR7cGFyRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHt2YWxEYXRlQ29udn0gIT0gbnVsbCAmJiAoJHtwYXJEYXRlQ29udn0uaXNCZWZvcmUoJHt2YWxEYXRlQ29udn0pIHx8ICR7cGFyRGF0ZUNvbnZ9Py5pc1NhbWUoJHt2YWxEYXRlQ29udn0pKWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJFcnJvcmkgbmVsbGEgdmFsdXRhemlvbmUgZGVsbCdlc3ByZXNzaW9uZS4gRmFsbGJhY2sgYSBmYWxzZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhyb3cgYEBlc2ZhZW56YS9wYXJhbWV0ZXJzOiBUaXBvIHBhcmFtZXRybyAke2tleX0gbm9uIHJpY29ub3NjaXV0bzogJHtyUGFyLnR5cGV9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSBkZWZhdWx0SWZudWxsT3JVbmRlZmluZWQ8VD4oaXRlbTogVCwgZGZsdDogVCwgZW1wdHlTdHJpbmdJc051bGw6IGJvb2xlYW4gPSBmYWxzZSk6IFQge1xyXG4gICAgICAgIGlmIChpdGVtID09IG51bGwgfHwgaXRlbSA9PSB1bmRlZmluZWQgfHwgaXRlbS50b1N0cmluZygpID09ICdudWxsJyB8fCAoZW1wdHlTdHJpbmdJc051bGwgJiYgaXRlbS50b1N0cmluZygpID09IFwiXCIpKVxyXG4gICAgICAgICAgICByZXR1cm4gZGZsdDtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIGdldFNvdXJjZShwYXJhbWV0ZXI6IEdlbmVyaWNQYXJhbWV0ZXIsIHNlYXJjaDogc3RyaW5nLCBieWlkOiBib29sZWFuKTogT2JzZXJ2YWJsZTx7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLkF1dG9Db21wbGV0ZURhdGFSZXRyaWV2ZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQGZvcm1zLWFuZC12YWxpZGF0aW9uczogZnVuemlvbmUgZGkgZGF0YXJldHJpZXZlIG5vbiBpbXBvc3RhdGEgcGVyIHVuIHBhcmFtZXRybyBhdXRvY29tcGxldGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihbXSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5BdXRvQ29tcGxldGVEYXRhUmV0cmlldmUocGFyYW1ldGVyLCBzZWFyY2gsIGJ5aWQpO1xyXG4gICAgfVxyXG59IiwiPGRpdiAqbmdJZj1cIighUGFyYW1ldGVycyB8fCBQYXJhbWV0ZXJzLmxlbmd0aCA9PSAwKSAmJiBFbXB0eU1lc3NhZ2VcIj5cclxuICAgIDxlbT57e0VtcHR5TWVzc2FnZX19PC9lbT5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwiR3JvdXBzXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiVGVtcDsgY29udGV4dDoge2l0ZW06IHsgZ3JvdXBzOiBHcm91cHMsIGlzU3ViZ3JvdXA6IGZhbHNlIH19XCI+PC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNUZW1wIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgaXRlbS5ncm91cHM7IGxldCBrID0gaW5kZXhcIj5cclxuICAgICAgICA8ZGl2IFtjbGFzcy5wYXJzLXN1Ymdyb3VwXT1cIml0ZW0uaXNTdWJncm91cFwiIFtjbGFzcy5wYXJzLWdyb3VwXT1cIiFpdGVtLmlzU3ViZ3JvdXBcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkdyb3Vwc09yU3ViZ3JvdXBzRGlzcGxheTsgY29udGV4dDogeyBpdGVtOiB7IGdyb3VwOiBncm91cCwgaW5kZXg6IGsgKyAoaXRlbS5pbmRleCA/ICgnXycgKyBpdGVtLmluZGV4KSA6ICcnKSwgaXNTdWJncm91cDogaXRlbS5pc1N1Ymdyb3VwIH19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cC5zdWJncm91cHMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlRlbXA7IGNvbnRleHQ6IHtpdGVtOiB7IGdyb3VwczogZ3JvdXAuc3ViZ3JvdXBzLCBpbmRleDogayArIChpdGVtLmluZGV4ID8gKCdfJyArIGl0ZW0uaW5kZXgpIDogJycpLCBpc1N1Ymdyb3VwOiB0cnVlIH19O1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNHcm91cHNPclN1Ymdyb3Vwc0Rpc3BsYXkgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5ncm91cFwiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmdyb3VwLmdyb3VwTmFtZVwiIFtjbGFzcy5wYXJzLWdyb3VwLXRpdGxlXT1cIiFpdGVtLmlzU3ViZ3JvdXBcIiBbY2xhc3MucGFycy1zdWJncm91cC10aXRsZV09XCJpdGVtLmlzU3ViZ3JvdXBcIj5cclxuICAgICAgICAgICAge3tpdGVtLmdyb3VwLmdyb3VwTmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uZ3JvdXAucGFyYW1ldGVycyAmJiBpdGVtLmdyb3VwLnBhcmFtZXRlcnMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGZvcm0tZ3JvdXBcIiAqbmdGb3I9XCJsZXQgcGFyIG9mIGl0ZW0uZ3JvdXAucGFyYW1ldGVyczsgbGV0IGk9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3Q7XCIgW2NsYXNzLmFwcC1tYXJnaW4tYm90dG9tLTBdPVwiTGFzdFBhcmFtZXRlck5vTWFyZ2luICYmIGxhc3RcIiBbaGlkZGVuXT1cIiFwYXIudmlzaWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLXt7TGFiZWxDb2xXaWR0aH19IG0tdC01XCI+PHNwYW4gKm5nSWY9XCJSZW1vdmFsXCIgY2xhc3M9XCJmYSBmYS1yZW1vdmUgdGV4dC1kYW5nZXJcIiAoY2xpY2spPVwicmVtb3ZlUGFyYW1ldGVyKHBhcilcIj4mbmJzcDs8L3NwYW4+e3twYXIuZGVzY3JpcHRpb259fXt7cGFyLnJlcXVpcmVkID8gJyonIDogJyd9fTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPCEtLVNlIERhdGEtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX1cIiAqbmdJZj1cInBhci50eXBlID09ICdkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtLWRhdGUgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgW0Zvcm1dPVwiRm9ybVwiIFtGb3JtTGF5b3V0XT1cImZhbHNlXCIgW1JlYWRvbmx5XT1cIlJlYWRvbmx5IHx8IHBhci5pc3JlYWRvbmx5XCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZCA/IHBhci5yZXF1aXJlZCA6IHVuZGVmaW5lZFwiIFsobmdNb2RlbCldPVwicGFyLnZhbHVlXCIgbmFtZT1cInt7aXRlbS5pbmRleH19cGFye3tpfX1cIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3I+PC9mb3JtLWRhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1TZSBzdHJpbmdhLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnc3RyaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtLWlucHV0IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbcmVxdWlyZWRdPVwicGFyLnJlcXVpcmVkID8gcGFyLnJlcXVpcmVkIDogdW5kZWZpbmVkXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0taW5wdXQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1TZSBudW1lcm8tLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX1cIiAqbmdJZj1cInBhci50eXBlID09ICdudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0taW5wdXQgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtyZXF1aXJlZF09XCJwYXIucmVxdWlyZWQgPyBwYXIucmVxdWlyZWQgOiB1bmRlZmluZWRcIiBbKG5nTW9kZWwpXT1cInBhci52YWx1ZVwiIG5hbWU9XCJ7e2l0ZW0uaW5kZXh9fXBhcnt7aX19XCIgKGlucHV0Q2hhbmdlKT1cImNoYW5nZWQoKTtcIiAjdmFsaWRhdG9yIHBhdHRlcm49XCJ7e3Bhci5wYXR0ZXJuIHx8ICdeWystXT9bMC05XSpbLF0/WzAtOV0rJCd9fVwiPjwvZm9ybS1pbnB1dD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLVNlIGJvb2xlYW4tLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX0gbS10LTVcIiAqbmdJZj1cInBhci50eXBlID09ICdib29sZWFuJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtLWNoZWNrYm94IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbKG5nTW9kZWwpXT1cInBhci52YWx1ZVwiIG5hbWU9XCJ7e2l0ZW0uaW5kZXh9fXBhcnt7aX19XCIgKGlucHV0Q2hhbmdlKT1cImNoYW5nZWQoKTtcIiAjdmFsaWRhdG9yPjwvZm9ybS1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLVNlIGVudW0gc2luZ2xlIHNlbGVjdC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2VudW0nICYmICFwYXIubXVsdGllbnVtICYmICFwYXIuc291cmNlYXBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0tc2VsZWN0IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbcmVxdWlyZWRdPVwicGFyLnJlcXVpcmVkID8gcGFyLnJlcXVpcmVkIDogdW5kZWZpbmVkXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvciBbU291cmNlXT1cInBhci5lbnVtdmFsdWVzXCI+PC9mb3JtLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLVNlIGVudW0gbXVsdGkgc2VsZWN0LS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnZW51bScgJiYgcGFyLm11bHRpZW51bSAmJiAhcGFyLnNvdXJjZWFwaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtLW11bHRpc2VsZWN0IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbVXNlQ29tbWFTZXBhcmF0ZWRMaXN0XT1cInRydWVcIiBbU2VsZWN0TGFiZWxdPVwiKCdTZWxlY3QnIHwgbG9jYWxpemUgOiBsYykgKyAnLi4uJ1wiIFsobmdNb2RlbCldPVwicGFyLnZhbHVlXCIgbmFtZT1cInt7aXRlbS5pbmRleH19cGFye3tpfX1cIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbU291cmNlXT1cInBhci5lbnVtdmFsdWVzXCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZCA/IHBhci5yZXF1aXJlZCA6IHVuZGVmaW5lZFwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0tbXVsdGlzZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1TZSBlbnVtIGF1dG9jb21wbGV0ZS0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2VudW0nICYmICFwYXIubXVsdGllbnVtICYmIHBhci5zb3VyY2VhcGlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Zm9ybS1hdXRvY29tcGxldGUgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtQbGFjZWhvbGRlcl09XCIoJ1NlbGVjdCcgfCBsb2NhbGl6ZSA6IGxjKSArICcuLi4nXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtTZWFyY2hGdW5jdGlvbl09XCJnZXRTb3VyY2UuYmluZCh0aGlzLCBwYXIpXCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZCA/IHBhci5yZXF1aXJlZCA6IHVuZGVmaW5lZFwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0tYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tU2UgZW51bSBtdWx0aXNlbGVjdCBhdXRvY29tcGxldGUtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX1cIiAqbmdJZj1cInBhci50eXBlID09ICdlbnVtJyAmJiBwYXIubXVsdGllbnVtICYmIHBhci5zb3VyY2VhcGlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Zm9ybS1hdXRvY29tcGxldGUgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbSGlkZUNob2ljZXNPblNlbGVjdGlvbl09XCJBdXRvY29tcGxldGVIaWRlQ2hvaWNlc09uU2VsZWN0aW9uXCIgW011bHRpXT1cInRydWVcIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtQbGFjZWhvbGRlcl09XCIoJ1NlbGVjdCcgfCBsb2NhbGl6ZSA6IGxjKSArICcuLi4nXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtTZWFyY2hGdW5jdGlvbl09XCJnZXRTb3VyY2UuYmluZCh0aGlzLCBwYXIpXCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZCA/IHBhci5yZXF1aXJlZCA6IHVuZGVmaW5lZFwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0tYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
@@ -399,7 +399,7 @@ EsParametersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
399
399
  useExisting: forwardRef(() => EsParametersComponent),
400
400
  multi: true
401
401
  }
402
- ], ngImport: i0, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.FormCheckboxComponent, selector: "form-checkbox", inputs: ["SliderMode"] }, { kind: "component", type: i5.FormDateComponent, selector: "form-date", inputs: ["JsDates"] }, { kind: "component", type: i5.FormInputComponent, selector: "form-input", inputs: ["Password"], outputs: ["onSuffixAction", "onPrefixAction"] }, { kind: "component", type: i5.FormSelectComponent, selector: "form-select", inputs: ["SelectLabel", "PlaceholderValue", "RequiredPlaceholder", "EmptyFieldValue", "ShowValidationSymbol", "OptionTemplate"] }, { kind: "component", type: i5.FormMultiSelectComponent, selector: "form-multiselect", inputs: ["SelectLabel", "UseKeyValues", "UseCommaSeparatedList"] }, { kind: "component", type: i5.FormAutocompleteComponent, selector: "form-autocomplete", inputs: ["SelectLabel", "SearchFunctionContext", "SearchFunction", "MinChars", "HideChoicesOnSelection", "RequiredPlaceholder", "CaseSensitive", "Multi", "MultiElementsThreshold"] }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
402
+ ], ngImport: i0, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.FormCheckboxComponent, selector: "form-checkbox", inputs: ["SliderMode"] }, { kind: "component", type: i5.FormDateComponent, selector: "form-date", inputs: ["JsDates"] }, { kind: "component", type: i5.FormInputComponent, selector: "form-input", inputs: ["Password"], outputs: ["onSuffixAction", "onPrefixAction"] }, { kind: "component", type: i5.FormSelectComponent, selector: "form-select", inputs: ["SelectLabel", "PlaceholderValue", "RequiredPlaceholder", "EmptyFieldValue", "ShowValidationSymbol", "OptionTemplate"] }, { kind: "component", type: i5.FormMultiSelectComponent, selector: "form-multiselect", inputs: ["SelectLabel", "UseKeyValues", "UseCommaSeparatedList"] }, { kind: "component", type: i5.FormAutocompleteComponent, selector: "form-autocomplete", inputs: ["SelectLabel", "SearchFunctionContext", "SearchFunction", "MinChars", "HideChoicesOnSelection", "RequiredPlaceholder", "CaseSensitive", "Multi", "MultiElementsThreshold"] }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
403
403
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EsParametersComponent, decorators: [{
404
404
  type: Component,
405
405
  args: [{ selector: "es-parameters", providers: [
@@ -414,7 +414,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
414
414
  useExisting: forwardRef(() => EsParametersComponent),
415
415
  multi: true
416
416
  }
417
- ], encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"] }]
417
+ ], encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"] }]
418
418
  }], ctorParameters: function () { return [{ type: i1.UtilityService }, { type: i2.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: i0.Injector }, { type: i1.DateService }]; }, propDecorators: { DisplayMode: [{
419
419
  type: Input
420
420
  }], LastParameterNoMargin: [{
@@ -1 +1 @@
1
- {"version":3,"file":"esfaenza-parameters.mjs","sources":["../../../projects/parameters/src/lib/es_parameters.component.loc.ts","../../../projects/parameters/src/lib/models/GenericParameterGroup.ts","../../../projects/parameters/src/lib/es_parameters.component.ts","../../../projects/parameters/src/lib/es_parameters.component.html","../../../projects/parameters/src/lib/es_parameters.module.ts","../../../projects/parameters/src/lib/models/GenericParameter.ts","../../../projects/parameters/src/public-api.ts","../../../projects/parameters/src/esfaenza-parameters.ts"],"sourcesContent":["import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/**\r\n * Classe di localizzazione per il componente **EsParametersComponent**\r\n */\r\n@Injectable()\r\nexport class EsParametersLoc extends LocalizationService {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(injector: Injector) {\r\n super(injector);\r\n }\r\n}","import { GenericParameter } from \"./GenericParameter\";\r\n\r\n/**\r\n * Classe che rappresenta un gruppo di parametri generico\r\n */\r\nexport class GenericParameterGroup {\r\n\r\n /**\r\n * Costruttore\r\n * @param {string} groupName Descrizione del gruppo che fa anche da id\r\n * @param {number} order ordine del gruppo\r\n */\r\n\r\n constructor(public groupName: string, public order: number) {\r\n this.parameters = [];\r\n this.subgroups = [];\r\n }\r\n\r\n /** Lista di Generic Parameters */\r\n public parameters: GenericParameter[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n public subgroups: GenericParameterGroup[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n // public : GenericParameterGroup[];\r\n\r\n}","// Angular\r\nimport { ControlValueAccessor, UntypedFormControl, NgControl, NgForm, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from \"@angular/forms\";\r\nimport { ChangeDetectorRef, Component, forwardRef, Injector, Input, ViewEncapsulation } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { DateService, UtilityService } from \"@esfaenza/extensions\";\r\n\r\n// Classi\r\nimport { GenericParameter } from './models/GenericParameter';\r\n\r\n// Applicazione\r\nimport { EsParametersLoc } from \"./es_parameters.component.loc\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { GenericParameterGroup } from \"./models/GenericParameterGroup\";\r\n\r\n/** Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico */\r\n@Component({\r\n selector: \"es-parameters\",\r\n providers: [\r\n { provide: LocalizationService, useClass: EsParametersLoc },\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n }\r\n ],\r\n styleUrls: [\"./es_parameters.component.scss\"],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: \"./es_parameters.component.html\"\r\n})\r\nexport class EsParametersComponent implements ControlValueAccessor, Validator {\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Parameters: GenericParameter[];\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Groups: GenericParameterGroup[];\r\n\r\n /** Cache per fare lookup rapidi in fase di valutazione espressioni di visibilità e obbligatorietà */\r\n private ParametersCache: {[id: string]: GenericParameter};\r\n\r\n /**\r\n * Pipeline di Angular \r\n * \r\n * @ignore\r\n */\r\n propagateChange = (_: any) => { };\r\n\r\n /** Indica che il parametro deve essere in modalità display */\r\n @Input() DisplayMode: boolean = false;\r\n\r\n /** Indica che l'ultimo parametro non deve avere margine in fondo */\r\n @Input() LastParameterNoMargin: boolean = false;\r\n\r\n /** col-md-X per la label */\r\n @Input() LabelColWidth: number = 4;\r\n\r\n /** col-md-X per l'input */\r\n @Input() InputColWidth: number = 8;\r\n\r\n /** Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente */\r\n @Input() submitted: boolean = false;\r\n\r\n /** Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare */\r\n @Input() EmptyMessage: string = \"\";\r\n\r\n /** Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label */\r\n @Input() Removal: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() Readonly: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() ListFormat: 'CommaSeparated' | 'Array' = 'Array';\r\n\r\n /** Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit */\r\n @Input() Form : NgForm = null;\r\n\r\n /** Quando utilizza un sottocomponente autocomplete abilita o disabilita il reset dell'input per ogni selezione */\r\n @Input() AutocompleteHideChoicesOnSelection: boolean = false;\r\n\r\n /** Funzione da utilizzare per tirare fuori i dati di un autocomplete */\r\n @Input() AutoCompleteDataRetrieve: (parameter: GenericParameter, search: string, byid: boolean) => Observable<{ id: string, description: string }[]>\r\n\r\n /** Permette di settare in una volta solo gli input **LabelColWidth** e **InputColWidth**, basta scriverlo con la sintassi \"X Y\" */\r\n @Input() set LabelInputRatio(input: string) {\r\n var ratio = input.split(/\\s/);\r\n this.LabelColWidth = parseInt(ratio[0]);\r\n this.InputColWidth = parseInt(ratio[1]);\r\n }\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(private utiExts: UtilityService, public lc: LocalizationService, public cdr: ChangeDetectorRef, private inj: Injector, public dates: DateService) { }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public writeValue(obj): void {\r\n this.Parameters = obj;\r\n\r\n this.ParametersCache = {};\r\n if (!this.Parameters)\r\n return;\r\n\r\n this.Parameters.forEach(t => {\r\n this.ParametersCache[t.id] = t;\r\n\r\n if (!t.typecode && !t.type)\r\n console.warn(\"Non è stato specificato né un type né un typecode\");\r\n\r\n if (t.typecode && !t.type)\r\n t.type = this.utiExts.getJsTypeFromTypeCode(t.typecode);\r\n\r\n if (t.typecode && t.type != this.utiExts.getJsTypeFromTypeCode(t.typecode))\r\n console.warn(`Rilevate inconsistenze fra il Tipo ${t.type} e il Tipo ${this.utiExts.getJsTypeFromTypeCode(t.typecode)} calcolato da TypeCode ${t.typecode} per il parametro ${t.id}`);\r\n\r\n if (t.type == \"boolean\")\r\n t.value = t.value?.toString()?.toLowerCase() === \"true\";\r\n\r\n if (t.enumtype || t.dicttype)\r\n t.type = 'enum';\r\n\r\n // Valore valido ma modalità di utilizzo a CommaSeparated, devo assicurarmi di riemettere la versione con la stringa\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n this.changed();\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && !Array.isArray(t.value))\r\n t.value = t.value ? t.value.split(',').map(t => t.trim()) : [];\r\n });\r\n\r\n this.generateGroups();\r\n this.reviewParametersBindings();\r\n }\r\n \r\n /**\r\n * Metodo che si occupa di creare e ordinare i gruppi dei parametri\r\n */\r\n generateGroups(){\r\n this.Groups = [];\r\n\r\n if(this.Parameters?.length > 0){\r\n this.Parameters.sort((a,b) => a.order < b.order ? -1 : 1);\r\n\r\n // Ciclo tutti i parametri\r\n for(let i = 0; this.Parameters.length > i; i++) {\r\n let par = this.Parameters[i];\r\n\r\n let parGroupName = par.group ?? \"\";\r\n let groupOrder = par.group ? par.order : -1;\r\n\r\n // Se il gruppo non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parGroupName, groupOrder));\r\n }\r\n\r\n // Inserisco il parametro dentro al suo gruppo\r\n this.Groups.find(g => g.groupName == parGroupName).parameters.push(par)\r\n }\r\n\r\n // Gestione sottogruppi\r\n let subgroups: GenericParameterGroup[] = this.Groups.filter(group => group.groupName.includes('§'));\r\n for(let _; subgroups.length > 0; () => {}) {\r\n // Recupero la lista di gruppi che hanno sottogruppi\r\n // Per convenzione, nel nome contengono \"§\"\r\n this.tryToAddSubgroups(subgroups);\r\n subgroups = this.Groups.filter(group => group.groupName.includes('§'));\r\n }\r\n\r\n this.Groups.sort((a,b) => a.order < b.order ? -1 : 1);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i sottogruppi dei parametri\r\n */\r\n tryToAddSubgroups(subgroups: GenericParameterGroup[]) {\r\n for(let i = 0; subgroups.length > i; i++) {\r\n let sub = subgroups[i];\r\n\r\n // Ottengo un lista con la gerarchia dei gruppi, in ordine\r\n let groupsParentHierarchy = sub.groupName.split('§') ?? [];\r\n\r\n // Recupero il gruppo padre\r\n let parentGroupName = sub.groupName.replace(`§${groupsParentHierarchy[groupsParentHierarchy.length - 1]}`, ``);\r\n \r\n // Se il gruppo padre non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parentGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parentGroupName, sub.order));\r\n }\r\n\r\n // Rimuovo dal nome del gruppo l'informazione sul padre (Sistemando anche l'etichetta)\r\n // e lo aggiungo ai sottogruppi del padre\r\n sub.groupName = sub.groupName.replace(`${parentGroupName}§`, '');\r\n let parentGroup = this.Groups.find(x => x.groupName == parentGroupName);\r\n if(parentGroup?.subgroups.some(s => s.groupName == sub.groupName)) {\r\n let target = parentGroup.subgroups.find(f => f.groupName == sub.groupName);\r\n sub.parameters.map(p => target.parameters.push(p));\r\n sub.subgroups.map(s => target.subgroups.push(s));\r\n target.order = sub.order < target.order ? sub.order : target.order;\r\n } else {\r\n parentGroup?.subgroups.push(sub);\r\n }\r\n\r\n // Rimuovo il sottogruppo gruppo dalla lista\r\n this.Groups.splice(this.Groups.indexOf(sub), 1);\r\n }\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n validate(c: UntypedFormControl): any {\r\n // Se la validazione è richiamata da un componente non me stesso vuol dire che i componenti di validazione interni stanno richiamando\r\n // questo validator, ma dal loro punto di vista non se ne devono preoccupare quindi faccio finta non ci siano errori.\r\n // Se invece vengo richiamato direttamente significa che è il form in cui vive es-parameters e lì devo effettuare la validazione\r\n let control = this.inj.get(NgControl, null)?.control;\r\n if (c != control)\r\n return null;\r\n\r\n let valid = true;\r\n if (this.Parameters && this.Parameters.length > 0) {\r\n this.Parameters.forEach(t => {\r\n if(!t.visible)\r\n return;\r\n \r\n let emptyNumber = t.type == 'number' && (t.value == null || t.value == undefined);\r\n let emptyNonNumber = t.type != 'number' && !t.value\r\n\r\n if (t.required && (emptyNumber || emptyNonNumber))\r\n valid = false;\r\n else if (t.value && t.type == 'number')\r\n valid = new RegExp(t.pattern || /^[+-]?[0-9]*[,]?[0-9]+$/).test(t.value.toString());\r\n else if (t.value && t.pattern)\r\n valid = new RegExp(t.pattern).test(t.value);\r\n });\r\n }\r\n\r\n if (valid)\r\n return null;\r\n return { \"es-parameters\": valid };\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnChange(fn): void { this.propagateChange = fn; }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnTouched(fn): void { }\r\n\r\n /**\r\n * Metodo che si occupa di gestire il modello in uscita e propagarlo sul binding ngModel\r\n */\r\n public changed() {\r\n if (!this.Parameters)\r\n return;\r\n\r\n // Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri\r\n var changes = this.reviewParametersBindings();\r\n if (changes.length > 0) {\r\n changes.forEach(ch => {\r\n let index = this.Parameters.findIndex(t => t.id == ch);\r\n this.Parameters[index] = JSON.parse(JSON.stringify(this.Parameters[index]));\r\n this.ParametersCache[ch] = this.Parameters[index];\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n var ParametersClone = JSON.parse(JSON.stringify(this.Parameters));\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n ParametersClone?.forEach(t => {\r\n if (t.type == \"enum\" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = t.value.join(',');\r\n });\r\n\r\n this.propagateChange(ParametersClone);\r\n }\r\n\r\n /**\r\n * Rimuove il parametro selezionato e propaga il modello\r\n * \r\n * @param {GenericParameter} par Parametro da rimuovere\r\n */\r\n public removeParameter(par: GenericParameter) {\r\n this.Parameters.splice(this.Parameters.indexOf(par), 1);\r\n this.changed();\r\n }\r\n\r\n public GenerateParameterGroups() {\r\n let Groups: { id: string, groups: string[], order: number }[] = [];\r\n\r\n this.Parameters.forEach(param => {\r\n Groups.push({ id: param.id, groups: param.group.split(\"§\"), order: param.order });\r\n });\r\n\r\n let GroupedGroups = Groups.reduce((r, a) => {\r\n let firstGroupId = a.groups?.length > 0 ? a.groups[0] : \"\";\r\n r[firstGroupId] = [...r[firstGroupId] || [], a];\r\n return r;\r\n }, {});\r\n\r\n console.log(GroupedGroups);\r\n\r\n // Ciclo del risultato, aggiungendo i gruppi al modello\r\n // Per ogni gruppo che aggiungo, assegno i parametri in ordine\r\n }\r\n\r\n /**\r\n * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo\r\n * \r\n * @returns {string[]} lista con gli id dei parametri che sono stati modificati\r\n */\r\n private reviewParametersBindings(): string[] {\r\n let changes = [];\r\n for (let i = 0; i < this.Parameters.length; i++) {\r\n var p = this.Parameters[i];\r\n\r\n if (p.requiredexp) {\r\n let prevReq = p.required;\r\n p.required = this.evaluate(p.requiredexp);\r\n if (prevReq != p.required)\r\n changes.push(p.id);\r\n }\r\n if (p.visibleexp) {\r\n let prevVisi = p.visible;\r\n p.visible = this.evaluate(p.visibleexp);\r\n if (prevVisi != p.visible)\r\n changes.push(p.id)\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Valuta un'espressione in base ai parametri presenti nel modello attuale\r\n * \r\n * @param expr Espressione da valutare scritta nel formato (ripetibile) \"ID (==|!=|<|>|>=|<=) (`valore` | null | true | false | XXX,XXX)\" separato eventualmente da && ed ||\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n private evaluate(expr: string): boolean {\r\n var regex = /\\s?([a-zA-Z0-9_-]+)\\s?(!=|==|<|>|<=|>=)\\s?(`[^`]+`|``|null|[0-9,]+|true|false)/gm;\r\n\r\n var matches: string[] = [];\r\n var finalExpr = expr;\r\n while (matches = regex.exec(expr)) {\r\n var fullMatch = matches[0].trim();\r\n var id = matches[1].trim();\r\n var operation = matches[2].trim();\r\n let bValue = matches[3].trim().trim();\r\n var value = matches[3].trim().trim().replace('`', '').replace('`', '');\r\n\r\n finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', ${bValue == 'null' ? 'null' : `'${value}'`})`);\r\n }\r\n\r\n return eval(finalExpr);\r\n }\r\n\r\n /**\r\n * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore\r\n * Richiamata da EVAL\r\n * \r\n * @param {string} key Chiave del parametro di cui verificare il valore\r\n * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=\r\n * @param {string} value Valore di confronto da utilizzare\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n public checkValue(key: string, operator: string, value: string): boolean {\r\n var rPar = this.ParametersCache[key];\r\n try {\r\n switch (rPar.type) {\r\n case \"string\":\r\n case \"enum\":\r\n return eval(`\"${this.defaultIfnullOrUndefined(rPar.value, ``)}\" ${operator} \"${this.defaultIfnullOrUndefined(value, ``)}\"`);\r\n case \"boolean\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, ``).toString()} ${operator} ${this.defaultIfnullOrUndefined(value, ``)}`);\r\n case \"number\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, '\"\"', true).replace(',', '.')} ${operator} ${this.defaultIfnullOrUndefined(value, '\"\"', true).replace(',', '.')}`);\r\n case \"date\":\r\n let parDateConv = `this.dates.getDateConvertion(\"${rPar.value}\")`;\r\n let valDateConv = `this.dates.getDateConvertion(\"${value}\")`;\r\n\r\n switch (operator) {\r\n\r\n case \"==\": return eval(`${parDateConv} == ${valDateConv} || (${parDateConv} != null && ${parDateConv}.isSame(${valDateConv}))`);\r\n case \"!=\": return eval(`${parDateConv} != ${valDateConv} && ${parDateConv} != null && !${parDateConv}.isSame(${valDateConv})`);\r\n case \">\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isAfter(${valDateConv})`);\r\n case \"<\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isBefore(${valDateConv})`);\r\n case \">=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isAfter(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n case \"<=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isBefore(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n console.warn(\"Errori nella valutazione dell'espressione. Fallback a false\");\r\n return false;\r\n }\r\n\r\n throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;\r\n }\r\n\r\n /** @ignore */\r\n private defaultIfnullOrUndefined<T>(item: T, dflt: T, emptyStringIsNull: boolean = false): T {\r\n if (item == null || item == undefined || item.toString() == 'null' || (emptyStringIsNull && item.toString() == \"\"))\r\n return dflt;\r\n return item;\r\n }\r\n\r\n /** @ignore */\r\n public getSource(parameter: GenericParameter, search: string, byid: boolean): Observable<{ id: string, description: string }[]> {\r\n if (!this.AutoCompleteDataRetrieve) {\r\n console.error(\"@forms-and-validations: funzione di dataretrieve non impostata per un parametro autocomplete\");\r\n return of([])\r\n }\r\n else\r\n return this.AutoCompleteDataRetrieve(parameter, search, byid);\r\n }\r\n}","<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FormsAndValidationsModule } from \"@esfaenza/forms-and-validations\";\r\nimport { LocalizationModule } from '@esfaenza/localizations';\r\nimport { EsParametersComponent } from './es_parameters.component';\r\n\r\n\r\n@NgModule({\r\n declarations: [EsParametersComponent],\r\n imports: [\r\n CommonModule,\r\n LocalizationModule,\r\n FormsModule,\r\n FormsAndValidationsModule,\r\n ],\r\n exports: [EsParametersComponent]\r\n})\r\nexport class EsParametersModule {\r\n }\r\n","/**\r\n * Classe che rappresenta un parametro generico\r\n */\r\nexport class GenericParameter {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Codice del parametro\r\n * @param {string} description Descrizione del parametro\r\n * @param {string} pattern Pattern di validazione\r\n * @param {'date' | 'string' | 'number' | 'boolean' | 'enum'} type Tipo di input \r\n * @param {boolean} required Indica se il valore è obbligatorio o meno\r\n * @param {any} v_default Valore di default per questo Parametro\r\n * @param {{ id: string, description: string }[]} enumvalues Qualora il **type** fosse di tipo **enum**, qui devono esserci tutti i valori che può assumere \r\n * @param {boolean} multienum Qualora il **type** fosse di tipo **enum**, indica se è possibile selezionare più valori (multiselect)\r\n * @param {string} sourceapi Nei casi in cui il **type** è **enum** indica l'api da cui recuperare i valori da bindare alla select o alla multiselect\r\n * @param {boolean} pageddata Nei casi in cui il **type** è **enum** indica che l'api specificata eventualmetne da **sourceapi** è paginata\r\n */\r\n constructor(\r\n public id: string,\r\n public description: string,\r\n public pattern: string,\r\n type: 'date' | 'string' | 'number' | 'boolean' | 'enum',\r\n public required: boolean,\r\n v_default: any = null,\r\n public enumvalues: { id: string, description: string }[] = [],\r\n public multienum?: boolean,\r\n public sourceapi?: string,\r\n public pageddata?: boolean) {\r\n\r\n this.type = type == 'enum' ? null : type;\r\n this.visible = true;\r\n this.enumtype = type == 'enum' ? type : \"\";\r\n this.isreadonly = false;\r\n\r\n if (!this.enumtype && enumvalues.length != 0)\r\n console.error(\"impossibile gestire valori di dizionario per un parametro non di tipo enum\");\r\n\r\n if (v_default != null)\r\n this.value = v_default;\r\n }\r\n\r\n /** Tipo di dato rappresentato da questo parametro */\r\n public type?: 'date' | 'string' | 'number' | 'boolean' | 'enum';\r\n\r\n /** Typecode lato C# che rappresenta il tipo di dato */\r\n public typecode: number;\r\n\r\n /** Indica se il campo specificato dev'essere di sola lettura o meno */\r\n public isreadonly: boolean;\r\n\r\n /** Valore del parametro */\r\n public value: any;\r\n\r\n /** Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto */\r\n public visible: boolean;\r\n\r\n /** Tipo Enum, valorizzato dal Backend */\r\n public enumtype: string;\r\n\r\n /** Tipo Dizionario, valorizzato dal Backend */\r\n public dicttype: string;\r\n\r\n /** Espressione di obbligatorietà */\r\n public requiredexp?: string;\r\n\r\n /** Espressione di visibilità */\r\n public visibleexp?: string;\r\n\r\n /** Ordinamento in base al quale verranno ordinati i parametri */\r\n public order: number;\r\n\r\n /** Gruppo di appartenenza del parametro */\r\n public group: string;\r\n}","/*\r\n * Public API Surface of parameters\r\n */\r\nexport * from './lib/es_parameters.module';\r\nexport * from './lib/models/GenericParameter';\r\nexport * from './lib/es_parameters.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"esfaenza-parameters.mjs","sources":["../../../projects/parameters/src/lib/es_parameters.component.loc.ts","../../../projects/parameters/src/lib/models/GenericParameterGroup.ts","../../../projects/parameters/src/lib/es_parameters.component.ts","../../../projects/parameters/src/lib/es_parameters.component.html","../../../projects/parameters/src/lib/es_parameters.module.ts","../../../projects/parameters/src/lib/models/GenericParameter.ts","../../../projects/parameters/src/public-api.ts","../../../projects/parameters/src/esfaenza-parameters.ts"],"sourcesContent":["import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/**\r\n * Classe di localizzazione per il componente **EsParametersComponent**\r\n */\r\n@Injectable()\r\nexport class EsParametersLoc extends LocalizationService {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(injector: Injector) {\r\n super(injector);\r\n }\r\n}","import { GenericParameter } from \"./GenericParameter\";\r\n\r\n/**\r\n * Classe che rappresenta un gruppo di parametri generico\r\n */\r\nexport class GenericParameterGroup {\r\n\r\n /**\r\n * Costruttore\r\n * @param {string} groupName Descrizione del gruppo che fa anche da id\r\n * @param {number} order ordine del gruppo\r\n */\r\n\r\n constructor(public groupName: string, public order: number) {\r\n this.parameters = [];\r\n this.subgroups = [];\r\n }\r\n\r\n /** Lista di Generic Parameters */\r\n public parameters: GenericParameter[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n public subgroups: GenericParameterGroup[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n // public : GenericParameterGroup[];\r\n\r\n}","// Angular\r\nimport { ControlValueAccessor, UntypedFormControl, NgControl, NgForm, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from \"@angular/forms\";\r\nimport { ChangeDetectorRef, Component, forwardRef, Injector, Input, ViewEncapsulation } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { DateService, UtilityService } from \"@esfaenza/extensions\";\r\n\r\n// Classi\r\nimport { GenericParameter } from './models/GenericParameter';\r\n\r\n// Applicazione\r\nimport { EsParametersLoc } from \"./es_parameters.component.loc\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { GenericParameterGroup } from \"./models/GenericParameterGroup\";\r\n\r\n/** Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico */\r\n@Component({\r\n selector: \"es-parameters\",\r\n providers: [\r\n { provide: LocalizationService, useClass: EsParametersLoc },\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n }\r\n ],\r\n styleUrls: [\"./es_parameters.component.scss\"],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: \"./es_parameters.component.html\"\r\n})\r\nexport class EsParametersComponent implements ControlValueAccessor, Validator {\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Parameters: GenericParameter[];\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Groups: GenericParameterGroup[];\r\n\r\n /** Cache per fare lookup rapidi in fase di valutazione espressioni di visibilità e obbligatorietà */\r\n private ParametersCache: {[id: string]: GenericParameter};\r\n\r\n /**\r\n * Pipeline di Angular \r\n * \r\n * @ignore\r\n */\r\n propagateChange = (_: any) => { };\r\n\r\n /** Indica che il parametro deve essere in modalità display */\r\n @Input() DisplayMode: boolean = false;\r\n\r\n /** Indica che l'ultimo parametro non deve avere margine in fondo */\r\n @Input() LastParameterNoMargin: boolean = false;\r\n\r\n /** col-md-X per la label */\r\n @Input() LabelColWidth: number = 4;\r\n\r\n /** col-md-X per l'input */\r\n @Input() InputColWidth: number = 8;\r\n\r\n /** Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente */\r\n @Input() submitted: boolean = false;\r\n\r\n /** Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare */\r\n @Input() EmptyMessage: string = \"\";\r\n\r\n /** Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label */\r\n @Input() Removal: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() Readonly: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() ListFormat: 'CommaSeparated' | 'Array' = 'Array';\r\n\r\n /** Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit */\r\n @Input() Form : NgForm = null;\r\n\r\n /** Quando utilizza un sottocomponente autocomplete abilita o disabilita il reset dell'input per ogni selezione */\r\n @Input() AutocompleteHideChoicesOnSelection: boolean = false;\r\n\r\n /** Funzione da utilizzare per tirare fuori i dati di un autocomplete */\r\n @Input() AutoCompleteDataRetrieve: (parameter: GenericParameter, search: string, byid: boolean) => Observable<{ id: string, description: string }[]>\r\n\r\n /** Permette di settare in una volta solo gli input **LabelColWidth** e **InputColWidth**, basta scriverlo con la sintassi \"X Y\" */\r\n @Input() set LabelInputRatio(input: string) {\r\n var ratio = input.split(/\\s/);\r\n this.LabelColWidth = parseInt(ratio[0]);\r\n this.InputColWidth = parseInt(ratio[1]);\r\n }\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(private utiExts: UtilityService, public lc: LocalizationService, public cdr: ChangeDetectorRef, private inj: Injector, public dates: DateService) { }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public writeValue(obj): void {\r\n this.Parameters = obj;\r\n\r\n this.ParametersCache = {};\r\n if (!this.Parameters)\r\n return;\r\n\r\n this.Parameters.forEach(t => {\r\n this.ParametersCache[t.id] = t;\r\n\r\n if (!t.typecode && !t.type)\r\n console.warn(\"Non è stato specificato né un type né un typecode\");\r\n\r\n if (t.typecode && !t.type)\r\n t.type = this.utiExts.getJsTypeFromTypeCode(t.typecode);\r\n\r\n if (t.typecode && t.type != this.utiExts.getJsTypeFromTypeCode(t.typecode))\r\n console.warn(`Rilevate inconsistenze fra il Tipo ${t.type} e il Tipo ${this.utiExts.getJsTypeFromTypeCode(t.typecode)} calcolato da TypeCode ${t.typecode} per il parametro ${t.id}`);\r\n\r\n if (t.type == \"boolean\")\r\n t.value = t.value?.toString()?.toLowerCase() === \"true\";\r\n\r\n if (t.enumtype || t.dicttype)\r\n t.type = 'enum';\r\n\r\n // Valore valido ma modalità di utilizzo a CommaSeparated, devo assicurarmi di riemettere la versione con la stringa\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n this.changed();\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && !Array.isArray(t.value))\r\n t.value = t.value ? t.value.split(',').map(t => t.trim()) : [];\r\n });\r\n\r\n this.generateGroups();\r\n this.reviewParametersBindings();\r\n }\r\n \r\n /**\r\n * Metodo che si occupa di creare e ordinare i gruppi dei parametri\r\n */\r\n generateGroups(){\r\n this.Groups = [];\r\n\r\n if(this.Parameters?.length > 0){\r\n this.Parameters.sort((a,b) => a.order < b.order ? -1 : 1);\r\n\r\n // Ciclo tutti i parametri\r\n for(let i = 0; this.Parameters.length > i; i++) {\r\n let par = this.Parameters[i];\r\n\r\n let parGroupName = par.group ?? \"\";\r\n let groupOrder = par.group ? par.order : -1;\r\n\r\n // Se il gruppo non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parGroupName, groupOrder));\r\n }\r\n\r\n // Inserisco il parametro dentro al suo gruppo\r\n this.Groups.find(g => g.groupName == parGroupName).parameters.push(par)\r\n }\r\n\r\n // Gestione sottogruppi\r\n let subgroups: GenericParameterGroup[] = this.Groups.filter(group => group.groupName.includes('§'));\r\n for(let _; subgroups.length > 0; () => {}) {\r\n // Recupero la lista di gruppi che hanno sottogruppi\r\n // Per convenzione, nel nome contengono \"§\"\r\n this.tryToAddSubgroups(subgroups);\r\n subgroups = this.Groups.filter(group => group.groupName.includes('§'));\r\n }\r\n\r\n this.Groups.sort((a,b) => a.order < b.order ? -1 : 1);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i sottogruppi dei parametri\r\n */\r\n tryToAddSubgroups(subgroups: GenericParameterGroup[]) {\r\n for(let i = 0; subgroups.length > i; i++) {\r\n let sub = subgroups[i];\r\n\r\n // Ottengo un lista con la gerarchia dei gruppi, in ordine\r\n let groupsParentHierarchy = sub.groupName.split('§') ?? [];\r\n\r\n // Recupero il gruppo padre\r\n let parentGroupName = sub.groupName.replace(`§${groupsParentHierarchy[groupsParentHierarchy.length - 1]}`, ``);\r\n \r\n // Se il gruppo padre non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parentGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parentGroupName, sub.order));\r\n }\r\n\r\n // Rimuovo dal nome del gruppo l'informazione sul padre (Sistemando anche l'etichetta)\r\n // e lo aggiungo ai sottogruppi del padre\r\n sub.groupName = sub.groupName.replace(`${parentGroupName}§`, '');\r\n let parentGroup = this.Groups.find(x => x.groupName == parentGroupName);\r\n if(parentGroup?.subgroups.some(s => s.groupName == sub.groupName)) {\r\n let target = parentGroup.subgroups.find(f => f.groupName == sub.groupName);\r\n sub.parameters.map(p => target.parameters.push(p));\r\n sub.subgroups.map(s => target.subgroups.push(s));\r\n target.order = sub.order < target.order ? sub.order : target.order;\r\n } else {\r\n parentGroup?.subgroups.push(sub);\r\n }\r\n\r\n // Rimuovo il sottogruppo gruppo dalla lista\r\n this.Groups.splice(this.Groups.indexOf(sub), 1);\r\n }\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n validate(c: UntypedFormControl): any {\r\n // Se la validazione è richiamata da un componente non me stesso vuol dire che i componenti di validazione interni stanno richiamando\r\n // questo validator, ma dal loro punto di vista non se ne devono preoccupare quindi faccio finta non ci siano errori.\r\n // Se invece vengo richiamato direttamente significa che è il form in cui vive es-parameters e lì devo effettuare la validazione\r\n let control = this.inj.get(NgControl, null)?.control;\r\n if (c != control)\r\n return null;\r\n\r\n let valid = true;\r\n if (this.Parameters && this.Parameters.length > 0) {\r\n this.Parameters.forEach(t => {\r\n if(!t.visible)\r\n return;\r\n \r\n let emptyNumber = t.type == 'number' && (t.value == null || t.value == undefined);\r\n let emptyNonNumber = t.type != 'number' && !t.value\r\n\r\n if (t.required && (emptyNumber || emptyNonNumber))\r\n valid = false;\r\n else if (t.value && t.type == 'number')\r\n valid = new RegExp(t.pattern || /^[+-]?[0-9]*[,]?[0-9]+$/).test(t.value.toString());\r\n else if (t.value && t.pattern)\r\n valid = new RegExp(t.pattern).test(t.value);\r\n });\r\n }\r\n\r\n if (valid)\r\n return null;\r\n return { \"es-parameters\": valid };\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnChange(fn): void { this.propagateChange = fn; }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnTouched(fn): void { }\r\n\r\n /**\r\n * Metodo che si occupa di gestire il modello in uscita e propagarlo sul binding ngModel\r\n */\r\n public changed() {\r\n if (!this.Parameters)\r\n return;\r\n\r\n // Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri\r\n var changes = this.reviewParametersBindings();\r\n if (changes.length > 0) {\r\n changes.forEach(ch => {\r\n let index = this.Parameters.findIndex(t => t.id == ch);\r\n this.Parameters[index] = JSON.parse(JSON.stringify(this.Parameters[index]));\r\n this.ParametersCache[ch] = this.Parameters[index];\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n var ParametersClone = JSON.parse(JSON.stringify(this.Parameters));\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n ParametersClone?.forEach(t => {\r\n if (t.type == \"enum\" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = t.value.join(',');\r\n });\r\n\r\n this.propagateChange(ParametersClone);\r\n }\r\n\r\n /**\r\n * Rimuove il parametro selezionato e propaga il modello\r\n * \r\n * @param {GenericParameter} par Parametro da rimuovere\r\n */\r\n public removeParameter(par: GenericParameter) {\r\n this.Parameters.splice(this.Parameters.indexOf(par), 1);\r\n this.changed();\r\n }\r\n\r\n public GenerateParameterGroups() {\r\n let Groups: { id: string, groups: string[], order: number }[] = [];\r\n\r\n this.Parameters.forEach(param => {\r\n Groups.push({ id: param.id, groups: param.group.split(\"§\"), order: param.order });\r\n });\r\n\r\n let GroupedGroups = Groups.reduce((r, a) => {\r\n let firstGroupId = a.groups?.length > 0 ? a.groups[0] : \"\";\r\n r[firstGroupId] = [...r[firstGroupId] || [], a];\r\n return r;\r\n }, {});\r\n\r\n console.log(GroupedGroups);\r\n\r\n // Ciclo del risultato, aggiungendo i gruppi al modello\r\n // Per ogni gruppo che aggiungo, assegno i parametri in ordine\r\n }\r\n\r\n /**\r\n * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo\r\n * \r\n * @returns {string[]} lista con gli id dei parametri che sono stati modificati\r\n */\r\n private reviewParametersBindings(): string[] {\r\n let changes = [];\r\n for (let i = 0; i < this.Parameters.length; i++) {\r\n var p = this.Parameters[i];\r\n\r\n if (p.requiredexp) {\r\n let prevReq = p.required;\r\n p.required = this.evaluate(p.requiredexp);\r\n if (prevReq != p.required)\r\n changes.push(p.id);\r\n }\r\n if (p.visibleexp) {\r\n let prevVisi = p.visible;\r\n p.visible = this.evaluate(p.visibleexp);\r\n if (prevVisi != p.visible)\r\n changes.push(p.id)\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Valuta un'espressione in base ai parametri presenti nel modello attuale\r\n * \r\n * @param expr Espressione da valutare scritta nel formato (ripetibile) \"ID (==|!=|<|>|>=|<=) (`valore` | null | true | false | XXX,XXX)\" separato eventualmente da && ed ||\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n private evaluate(expr: string): boolean {\r\n var regex = /\\s?([a-zA-Z0-9_-]+)\\s?(!=|==|<|>|<=|>=)\\s?(`[^`]+`|``|null|[0-9,]+|true|false)/gm;\r\n\r\n var matches: string[] = [];\r\n var finalExpr = expr;\r\n while (matches = regex.exec(expr)) {\r\n var fullMatch = matches[0].trim();\r\n var id = matches[1].trim();\r\n var operation = matches[2].trim();\r\n let bValue = matches[3].trim().trim();\r\n var value = matches[3].trim().trim().replace('`', '').replace('`', '');\r\n\r\n finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', ${bValue == 'null' ? 'null' : `'${value}'`})`);\r\n }\r\n\r\n return eval(finalExpr);\r\n }\r\n\r\n /**\r\n * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore\r\n * Richiamata da EVAL\r\n * \r\n * @param {string} key Chiave del parametro di cui verificare il valore\r\n * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=\r\n * @param {string} value Valore di confronto da utilizzare\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n public checkValue(key: string, operator: string, value: string): boolean {\r\n var rPar = this.ParametersCache[key];\r\n try {\r\n switch (rPar.type) {\r\n case \"string\":\r\n case \"enum\":\r\n return eval(`\"${this.defaultIfnullOrUndefined(rPar.value, ``)}\" ${operator} \"${this.defaultIfnullOrUndefined(value, ``)}\"`);\r\n case \"boolean\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, ``).toString()} ${operator} ${this.defaultIfnullOrUndefined(value, ``)}`);\r\n case \"number\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, '\"\"', true).replace(',', '.')} ${operator} ${this.defaultIfnullOrUndefined(value, '\"\"', true).replace(',', '.')}`);\r\n case \"date\":\r\n let parDateConv = `this.dates.getDateConvertion(\"${rPar.value}\")`;\r\n let valDateConv = `this.dates.getDateConvertion(\"${value}\")`;\r\n\r\n switch (operator) {\r\n\r\n case \"==\": return eval(`${parDateConv} == ${valDateConv} || (${parDateConv} != null && ${parDateConv}.isSame(${valDateConv}))`);\r\n case \"!=\": return eval(`${parDateConv} != ${valDateConv} && ${parDateConv} != null && !${parDateConv}.isSame(${valDateConv})`);\r\n case \">\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isAfter(${valDateConv})`);\r\n case \"<\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isBefore(${valDateConv})`);\r\n case \">=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isAfter(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n case \"<=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isBefore(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n console.warn(\"Errori nella valutazione dell'espressione. Fallback a false\");\r\n return false;\r\n }\r\n\r\n throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;\r\n }\r\n\r\n /** @ignore */\r\n private defaultIfnullOrUndefined<T>(item: T, dflt: T, emptyStringIsNull: boolean = false): T {\r\n if (item == null || item == undefined || item.toString() == 'null' || (emptyStringIsNull && item.toString() == \"\"))\r\n return dflt;\r\n return item;\r\n }\r\n\r\n /** @ignore */\r\n public getSource(parameter: GenericParameter, search: string, byid: boolean): Observable<{ id: string, description: string }[]> {\r\n if (!this.AutoCompleteDataRetrieve) {\r\n console.error(\"@forms-and-validations: funzione di dataretrieve non impostata per un parametro autocomplete\");\r\n return of([])\r\n }\r\n else\r\n return this.AutoCompleteDataRetrieve(parameter, search, byid);\r\n }\r\n}","<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FormsAndValidationsModule } from \"@esfaenza/forms-and-validations\";\r\nimport { LocalizationModule } from '@esfaenza/localizations';\r\nimport { EsParametersComponent } from './es_parameters.component';\r\n\r\n\r\n@NgModule({\r\n declarations: [EsParametersComponent],\r\n imports: [\r\n CommonModule,\r\n LocalizationModule,\r\n FormsModule,\r\n FormsAndValidationsModule,\r\n ],\r\n exports: [EsParametersComponent]\r\n})\r\nexport class EsParametersModule {\r\n }\r\n","/**\r\n * Classe che rappresenta un parametro generico\r\n */\r\nexport class GenericParameter {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Codice del parametro\r\n * @param {string} description Descrizione del parametro\r\n * @param {string} pattern Pattern di validazione\r\n * @param {'date' | 'string' | 'number' | 'boolean' | 'enum'} type Tipo di input \r\n * @param {boolean} required Indica se il valore è obbligatorio o meno\r\n * @param {any} v_default Valore di default per questo Parametro\r\n * @param {{ id: string, description: string }[]} enumvalues Qualora il **type** fosse di tipo **enum**, qui devono esserci tutti i valori che può assumere \r\n * @param {boolean} multienum Qualora il **type** fosse di tipo **enum**, indica se è possibile selezionare più valori (multiselect)\r\n * @param {string} sourceapi Nei casi in cui il **type** è **enum** indica l'api da cui recuperare i valori da bindare alla select o alla multiselect\r\n * @param {boolean} pageddata Nei casi in cui il **type** è **enum** indica che l'api specificata eventualmetne da **sourceapi** è paginata\r\n */\r\n constructor(\r\n public id: string,\r\n public description: string,\r\n public pattern: string,\r\n type: 'date' | 'string' | 'number' | 'boolean' | 'enum',\r\n public required: boolean,\r\n v_default: any = null,\r\n public enumvalues: { id: string, description: string }[] = [],\r\n public multienum?: boolean,\r\n public sourceapi?: string,\r\n public pageddata?: boolean) {\r\n\r\n this.type = type == 'enum' ? null : type;\r\n this.visible = true;\r\n this.enumtype = type == 'enum' ? type : \"\";\r\n this.isreadonly = false;\r\n\r\n if (!this.enumtype && enumvalues.length != 0)\r\n console.error(\"impossibile gestire valori di dizionario per un parametro non di tipo enum\");\r\n\r\n if (v_default != null)\r\n this.value = v_default;\r\n }\r\n\r\n /** Tipo di dato rappresentato da questo parametro */\r\n public type?: 'date' | 'string' | 'number' | 'boolean' | 'enum';\r\n\r\n /** Typecode lato C# che rappresenta il tipo di dato */\r\n public typecode: number;\r\n\r\n /** Indica se il campo specificato dev'essere di sola lettura o meno */\r\n public isreadonly: boolean;\r\n\r\n /** Valore del parametro */\r\n public value: any;\r\n\r\n /** Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto */\r\n public visible: boolean;\r\n\r\n /** Tipo Enum, valorizzato dal Backend */\r\n public enumtype: string;\r\n\r\n /** Tipo Dizionario, valorizzato dal Backend */\r\n public dicttype: string;\r\n\r\n /** Espressione di obbligatorietà */\r\n public requiredexp?: string;\r\n\r\n /** Espressione di visibilità */\r\n public visibleexp?: string;\r\n\r\n /** Ordinamento in base al quale verranno ordinati i parametri */\r\n public order: number;\r\n\r\n /** Gruppo di appartenenza del parametro */\r\n public group: string;\r\n}","/*\r\n * Public API Surface of parameters\r\n */\r\nexport * from './lib/es_parameters.module';\r\nexport * from './lib/models/GenericParameter';\r\nexport * from './lib/es_parameters.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -394,7 +394,7 @@ EsParametersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
394
394
  useExisting: forwardRef(() => EsParametersComponent),
395
395
  multi: true
396
396
  }
397
- ], ngImport: i0, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.FormCheckboxComponent, selector: "form-checkbox", inputs: ["SliderMode"] }, { kind: "component", type: i5.FormDateComponent, selector: "form-date", inputs: ["JsDates"] }, { kind: "component", type: i5.FormInputComponent, selector: "form-input", inputs: ["Password"], outputs: ["onSuffixAction", "onPrefixAction"] }, { kind: "component", type: i5.FormSelectComponent, selector: "form-select", inputs: ["SelectLabel", "PlaceholderValue", "RequiredPlaceholder", "EmptyFieldValue", "ShowValidationSymbol", "OptionTemplate"] }, { kind: "component", type: i5.FormMultiSelectComponent, selector: "form-multiselect", inputs: ["SelectLabel", "UseKeyValues", "UseCommaSeparatedList"] }, { kind: "component", type: i5.FormAutocompleteComponent, selector: "form-autocomplete", inputs: ["SelectLabel", "SearchFunctionContext", "SearchFunction", "MinChars", "HideChoicesOnSelection", "RequiredPlaceholder", "CaseSensitive", "Multi", "MultiElementsThreshold"] }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
397
+ ], ngImport: i0, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.FormCheckboxComponent, selector: "form-checkbox", inputs: ["SliderMode"] }, { kind: "component", type: i5.FormDateComponent, selector: "form-date", inputs: ["JsDates"] }, { kind: "component", type: i5.FormInputComponent, selector: "form-input", inputs: ["Password"], outputs: ["onSuffixAction", "onPrefixAction"] }, { kind: "component", type: i5.FormSelectComponent, selector: "form-select", inputs: ["SelectLabel", "PlaceholderValue", "RequiredPlaceholder", "EmptyFieldValue", "ShowValidationSymbol", "OptionTemplate"] }, { kind: "component", type: i5.FormMultiSelectComponent, selector: "form-multiselect", inputs: ["SelectLabel", "UseKeyValues", "UseCommaSeparatedList"] }, { kind: "component", type: i5.FormAutocompleteComponent, selector: "form-autocomplete", inputs: ["SelectLabel", "SearchFunctionContext", "SearchFunction", "MinChars", "HideChoicesOnSelection", "RequiredPlaceholder", "CaseSensitive", "Multi", "MultiElementsThreshold"] }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
398
398
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EsParametersComponent, decorators: [{
399
399
  type: Component,
400
400
  args: [{ selector: "es-parameters", providers: [
@@ -409,7 +409,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
409
409
  useExisting: forwardRef(() => EsParametersComponent),
410
410
  multi: true
411
411
  }
412
- ], encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"] }]
412
+ ], encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"] }]
413
413
  }], ctorParameters: function () { return [{ type: i1.UtilityService }, { type: i2.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: i0.Injector }, { type: i1.DateService }]; }, propDecorators: { DisplayMode: [{
414
414
  type: Input
415
415
  }], LastParameterNoMargin: [{
@@ -1 +1 @@
1
- {"version":3,"file":"esfaenza-parameters.mjs","sources":["../../../projects/parameters/src/lib/es_parameters.component.loc.ts","../../../projects/parameters/src/lib/models/GenericParameterGroup.ts","../../../projects/parameters/src/lib/es_parameters.component.ts","../../../projects/parameters/src/lib/es_parameters.component.html","../../../projects/parameters/src/lib/es_parameters.module.ts","../../../projects/parameters/src/lib/models/GenericParameter.ts","../../../projects/parameters/src/public-api.ts","../../../projects/parameters/src/esfaenza-parameters.ts"],"sourcesContent":["import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/**\r\n * Classe di localizzazione per il componente **EsParametersComponent**\r\n */\r\n@Injectable()\r\nexport class EsParametersLoc extends LocalizationService {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(injector: Injector) {\r\n super(injector);\r\n }\r\n}","import { GenericParameter } from \"./GenericParameter\";\r\n\r\n/**\r\n * Classe che rappresenta un gruppo di parametri generico\r\n */\r\nexport class GenericParameterGroup {\r\n\r\n /**\r\n * Costruttore\r\n * @param {string} groupName Descrizione del gruppo che fa anche da id\r\n * @param {number} order ordine del gruppo\r\n */\r\n\r\n constructor(public groupName: string, public order: number) {\r\n this.parameters = [];\r\n this.subgroups = [];\r\n }\r\n\r\n /** Lista di Generic Parameters */\r\n public parameters: GenericParameter[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n public subgroups: GenericParameterGroup[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n // public : GenericParameterGroup[];\r\n\r\n}","// Angular\r\nimport { ControlValueAccessor, UntypedFormControl, NgControl, NgForm, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from \"@angular/forms\";\r\nimport { ChangeDetectorRef, Component, forwardRef, Injector, Input, ViewEncapsulation } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { DateService, UtilityService } from \"@esfaenza/extensions\";\r\n\r\n// Classi\r\nimport { GenericParameter } from './models/GenericParameter';\r\n\r\n// Applicazione\r\nimport { EsParametersLoc } from \"./es_parameters.component.loc\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { GenericParameterGroup } from \"./models/GenericParameterGroup\";\r\n\r\n/** Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico */\r\n@Component({\r\n selector: \"es-parameters\",\r\n providers: [\r\n { provide: LocalizationService, useClass: EsParametersLoc },\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n }\r\n ],\r\n styleUrls: [\"./es_parameters.component.scss\"],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: \"./es_parameters.component.html\"\r\n})\r\nexport class EsParametersComponent implements ControlValueAccessor, Validator {\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Parameters: GenericParameter[];\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Groups: GenericParameterGroup[];\r\n\r\n /** Cache per fare lookup rapidi in fase di valutazione espressioni di visibilità e obbligatorietà */\r\n private ParametersCache: {[id: string]: GenericParameter};\r\n\r\n /**\r\n * Pipeline di Angular \r\n * \r\n * @ignore\r\n */\r\n propagateChange = (_: any) => { };\r\n\r\n /** Indica che il parametro deve essere in modalità display */\r\n @Input() DisplayMode: boolean = false;\r\n\r\n /** Indica che l'ultimo parametro non deve avere margine in fondo */\r\n @Input() LastParameterNoMargin: boolean = false;\r\n\r\n /** col-md-X per la label */\r\n @Input() LabelColWidth: number = 4;\r\n\r\n /** col-md-X per l'input */\r\n @Input() InputColWidth: number = 8;\r\n\r\n /** Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente */\r\n @Input() submitted: boolean = false;\r\n\r\n /** Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare */\r\n @Input() EmptyMessage: string = \"\";\r\n\r\n /** Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label */\r\n @Input() Removal: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() Readonly: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() ListFormat: 'CommaSeparated' | 'Array' = 'Array';\r\n\r\n /** Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit */\r\n @Input() Form : NgForm = null;\r\n\r\n /** Quando utilizza un sottocomponente autocomplete abilita o disabilita il reset dell'input per ogni selezione */\r\n @Input() AutocompleteHideChoicesOnSelection: boolean = false;\r\n\r\n /** Funzione da utilizzare per tirare fuori i dati di un autocomplete */\r\n @Input() AutoCompleteDataRetrieve: (parameter: GenericParameter, search: string, byid: boolean) => Observable<{ id: string, description: string }[]>\r\n\r\n /** Permette di settare in una volta solo gli input **LabelColWidth** e **InputColWidth**, basta scriverlo con la sintassi \"X Y\" */\r\n @Input() set LabelInputRatio(input: string) {\r\n var ratio = input.split(/\\s/);\r\n this.LabelColWidth = parseInt(ratio[0]);\r\n this.InputColWidth = parseInt(ratio[1]);\r\n }\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(private utiExts: UtilityService, public lc: LocalizationService, public cdr: ChangeDetectorRef, private inj: Injector, public dates: DateService) { }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public writeValue(obj): void {\r\n this.Parameters = obj;\r\n\r\n this.ParametersCache = {};\r\n if (!this.Parameters)\r\n return;\r\n\r\n this.Parameters.forEach(t => {\r\n this.ParametersCache[t.id] = t;\r\n\r\n if (!t.typecode && !t.type)\r\n console.warn(\"Non è stato specificato né un type né un typecode\");\r\n\r\n if (t.typecode && !t.type)\r\n t.type = this.utiExts.getJsTypeFromTypeCode(t.typecode);\r\n\r\n if (t.typecode && t.type != this.utiExts.getJsTypeFromTypeCode(t.typecode))\r\n console.warn(`Rilevate inconsistenze fra il Tipo ${t.type} e il Tipo ${this.utiExts.getJsTypeFromTypeCode(t.typecode)} calcolato da TypeCode ${t.typecode} per il parametro ${t.id}`);\r\n\r\n if (t.type == \"boolean\")\r\n t.value = t.value?.toString()?.toLowerCase() === \"true\";\r\n\r\n if (t.enumtype || t.dicttype)\r\n t.type = 'enum';\r\n\r\n // Valore valido ma modalità di utilizzo a CommaSeparated, devo assicurarmi di riemettere la versione con la stringa\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n this.changed();\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && !Array.isArray(t.value))\r\n t.value = t.value ? t.value.split(',').map(t => t.trim()) : [];\r\n });\r\n\r\n this.generateGroups();\r\n this.reviewParametersBindings();\r\n }\r\n \r\n /**\r\n * Metodo che si occupa di creare e ordinare i gruppi dei parametri\r\n */\r\n generateGroups(){\r\n this.Groups = [];\r\n\r\n if(this.Parameters?.length > 0){\r\n this.Parameters.sort((a,b) => a.order < b.order ? -1 : 1);\r\n\r\n // Ciclo tutti i parametri\r\n for(let i = 0; this.Parameters.length > i; i++) {\r\n let par = this.Parameters[i];\r\n\r\n let parGroupName = par.group ?? \"\";\r\n let groupOrder = par.group ? par.order : -1;\r\n\r\n // Se il gruppo non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parGroupName, groupOrder));\r\n }\r\n\r\n // Inserisco il parametro dentro al suo gruppo\r\n this.Groups.find(g => g.groupName == parGroupName).parameters.push(par)\r\n }\r\n\r\n // Gestione sottogruppi\r\n let subgroups: GenericParameterGroup[] = this.Groups.filter(group => group.groupName.includes('§'));\r\n for(let _; subgroups.length > 0; () => {}) {\r\n // Recupero la lista di gruppi che hanno sottogruppi\r\n // Per convenzione, nel nome contengono \"§\"\r\n this.tryToAddSubgroups(subgroups);\r\n subgroups = this.Groups.filter(group => group.groupName.includes('§'));\r\n }\r\n\r\n this.Groups.sort((a,b) => a.order < b.order ? -1 : 1);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i sottogruppi dei parametri\r\n */\r\n tryToAddSubgroups(subgroups: GenericParameterGroup[]) {\r\n for(let i = 0; subgroups.length > i; i++) {\r\n let sub = subgroups[i];\r\n\r\n // Ottengo un lista con la gerarchia dei gruppi, in ordine\r\n let groupsParentHierarchy = sub.groupName.split('§') ?? [];\r\n\r\n // Recupero il gruppo padre\r\n let parentGroupName = sub.groupName.replace(`§${groupsParentHierarchy[groupsParentHierarchy.length - 1]}`, ``);\r\n \r\n // Se il gruppo padre non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parentGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parentGroupName, sub.order));\r\n }\r\n\r\n // Rimuovo dal nome del gruppo l'informazione sul padre (Sistemando anche l'etichetta)\r\n // e lo aggiungo ai sottogruppi del padre\r\n sub.groupName = sub.groupName.replace(`${parentGroupName}§`, '');\r\n let parentGroup = this.Groups.find(x => x.groupName == parentGroupName);\r\n if(parentGroup?.subgroups.some(s => s.groupName == sub.groupName)) {\r\n let target = parentGroup.subgroups.find(f => f.groupName == sub.groupName);\r\n sub.parameters.map(p => target.parameters.push(p));\r\n sub.subgroups.map(s => target.subgroups.push(s));\r\n target.order = sub.order < target.order ? sub.order : target.order;\r\n } else {\r\n parentGroup?.subgroups.push(sub);\r\n }\r\n\r\n // Rimuovo il sottogruppo gruppo dalla lista\r\n this.Groups.splice(this.Groups.indexOf(sub), 1);\r\n }\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n validate(c: UntypedFormControl): any {\r\n // Se la validazione è richiamata da un componente non me stesso vuol dire che i componenti di validazione interni stanno richiamando\r\n // questo validator, ma dal loro punto di vista non se ne devono preoccupare quindi faccio finta non ci siano errori.\r\n // Se invece vengo richiamato direttamente significa che è il form in cui vive es-parameters e lì devo effettuare la validazione\r\n let control = this.inj.get(NgControl, null)?.control;\r\n if (c != control)\r\n return null;\r\n\r\n let valid = true;\r\n if (this.Parameters && this.Parameters.length > 0) {\r\n this.Parameters.forEach(t => {\r\n if(!t.visible)\r\n return;\r\n \r\n let emptyNumber = t.type == 'number' && (t.value == null || t.value == undefined);\r\n let emptyNonNumber = t.type != 'number' && !t.value\r\n\r\n if (t.required && (emptyNumber || emptyNonNumber))\r\n valid = false;\r\n else if (t.value && t.type == 'number')\r\n valid = new RegExp(t.pattern || /^[+-]?[0-9]*[,]?[0-9]+$/).test(t.value.toString());\r\n else if (t.value && t.pattern)\r\n valid = new RegExp(t.pattern).test(t.value);\r\n });\r\n }\r\n\r\n if (valid)\r\n return null;\r\n return { \"es-parameters\": valid };\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnChange(fn): void { this.propagateChange = fn; }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnTouched(fn): void { }\r\n\r\n /**\r\n * Metodo che si occupa di gestire il modello in uscita e propagarlo sul binding ngModel\r\n */\r\n public changed() {\r\n if (!this.Parameters)\r\n return;\r\n\r\n // Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri\r\n var changes = this.reviewParametersBindings();\r\n if (changes.length > 0) {\r\n changes.forEach(ch => {\r\n let index = this.Parameters.findIndex(t => t.id == ch);\r\n this.Parameters[index] = JSON.parse(JSON.stringify(this.Parameters[index]));\r\n this.ParametersCache[ch] = this.Parameters[index];\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n var ParametersClone = JSON.parse(JSON.stringify(this.Parameters));\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n ParametersClone?.forEach(t => {\r\n if (t.type == \"enum\" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = t.value.join(',');\r\n });\r\n\r\n this.propagateChange(ParametersClone);\r\n }\r\n\r\n /**\r\n * Rimuove il parametro selezionato e propaga il modello\r\n * \r\n * @param {GenericParameter} par Parametro da rimuovere\r\n */\r\n public removeParameter(par: GenericParameter) {\r\n this.Parameters.splice(this.Parameters.indexOf(par), 1);\r\n this.changed();\r\n }\r\n\r\n public GenerateParameterGroups() {\r\n let Groups: { id: string, groups: string[], order: number }[] = [];\r\n\r\n this.Parameters.forEach(param => {\r\n Groups.push({ id: param.id, groups: param.group.split(\"§\"), order: param.order });\r\n });\r\n\r\n let GroupedGroups = Groups.reduce((r, a) => {\r\n let firstGroupId = a.groups?.length > 0 ? a.groups[0] : \"\";\r\n r[firstGroupId] = [...r[firstGroupId] || [], a];\r\n return r;\r\n }, {});\r\n\r\n console.log(GroupedGroups);\r\n\r\n // Ciclo del risultato, aggiungendo i gruppi al modello\r\n // Per ogni gruppo che aggiungo, assegno i parametri in ordine\r\n }\r\n\r\n /**\r\n * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo\r\n * \r\n * @returns {string[]} lista con gli id dei parametri che sono stati modificati\r\n */\r\n private reviewParametersBindings(): string[] {\r\n let changes = [];\r\n for (let i = 0; i < this.Parameters.length; i++) {\r\n var p = this.Parameters[i];\r\n\r\n if (p.requiredexp) {\r\n let prevReq = p.required;\r\n p.required = this.evaluate(p.requiredexp);\r\n if (prevReq != p.required)\r\n changes.push(p.id);\r\n }\r\n if (p.visibleexp) {\r\n let prevVisi = p.visible;\r\n p.visible = this.evaluate(p.visibleexp);\r\n if (prevVisi != p.visible)\r\n changes.push(p.id)\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Valuta un'espressione in base ai parametri presenti nel modello attuale\r\n * \r\n * @param expr Espressione da valutare scritta nel formato (ripetibile) \"ID (==|!=|<|>|>=|<=) (`valore` | null | true | false | XXX,XXX)\" separato eventualmente da && ed ||\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n private evaluate(expr: string): boolean {\r\n var regex = /\\s?([a-zA-Z0-9_-]+)\\s?(!=|==|<|>|<=|>=)\\s?(`[^`]+`|``|null|[0-9,]+|true|false)/gm;\r\n\r\n var matches: string[] = [];\r\n var finalExpr = expr;\r\n while (matches = regex.exec(expr)) {\r\n var fullMatch = matches[0].trim();\r\n var id = matches[1].trim();\r\n var operation = matches[2].trim();\r\n let bValue = matches[3].trim().trim();\r\n var value = matches[3].trim().trim().replace('`', '').replace('`', '');\r\n\r\n finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', ${bValue == 'null' ? 'null' : `'${value}'`})`);\r\n }\r\n\r\n return eval(finalExpr);\r\n }\r\n\r\n /**\r\n * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore\r\n * Richiamata da EVAL\r\n * \r\n * @param {string} key Chiave del parametro di cui verificare il valore\r\n * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=\r\n * @param {string} value Valore di confronto da utilizzare\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n public checkValue(key: string, operator: string, value: string): boolean {\r\n var rPar = this.ParametersCache[key];\r\n try {\r\n switch (rPar.type) {\r\n case \"string\":\r\n case \"enum\":\r\n return eval(`\"${this.defaultIfnullOrUndefined(rPar.value, ``)}\" ${operator} \"${this.defaultIfnullOrUndefined(value, ``)}\"`);\r\n case \"boolean\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, ``).toString()} ${operator} ${this.defaultIfnullOrUndefined(value, ``)}`);\r\n case \"number\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, '\"\"', true).replace(',', '.')} ${operator} ${this.defaultIfnullOrUndefined(value, '\"\"', true).replace(',', '.')}`);\r\n case \"date\":\r\n let parDateConv = `this.dates.getDateConvertion(\"${rPar.value}\")`;\r\n let valDateConv = `this.dates.getDateConvertion(\"${value}\")`;\r\n\r\n switch (operator) {\r\n\r\n case \"==\": return eval(`${parDateConv} == ${valDateConv} || (${parDateConv} != null && ${parDateConv}.isSame(${valDateConv}))`);\r\n case \"!=\": return eval(`${parDateConv} != ${valDateConv} && ${parDateConv} != null && !${parDateConv}.isSame(${valDateConv})`);\r\n case \">\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isAfter(${valDateConv})`);\r\n case \"<\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isBefore(${valDateConv})`);\r\n case \">=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isAfter(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n case \"<=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isBefore(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n console.warn(\"Errori nella valutazione dell'espressione. Fallback a false\");\r\n return false;\r\n }\r\n\r\n throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;\r\n }\r\n\r\n /** @ignore */\r\n private defaultIfnullOrUndefined<T>(item: T, dflt: T, emptyStringIsNull: boolean = false): T {\r\n if (item == null || item == undefined || item.toString() == 'null' || (emptyStringIsNull && item.toString() == \"\"))\r\n return dflt;\r\n return item;\r\n }\r\n\r\n /** @ignore */\r\n public getSource(parameter: GenericParameter, search: string, byid: boolean): Observable<{ id: string, description: string }[]> {\r\n if (!this.AutoCompleteDataRetrieve) {\r\n console.error(\"@forms-and-validations: funzione di dataretrieve non impostata per un parametro autocomplete\");\r\n return of([])\r\n }\r\n else\r\n return this.AutoCompleteDataRetrieve(parameter, search, byid);\r\n }\r\n}","<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FormsAndValidationsModule } from \"@esfaenza/forms-and-validations\";\r\nimport { LocalizationModule } from '@esfaenza/localizations';\r\nimport { EsParametersComponent } from './es_parameters.component';\r\n\r\n\r\n@NgModule({\r\n declarations: [EsParametersComponent],\r\n imports: [\r\n CommonModule,\r\n LocalizationModule,\r\n FormsModule,\r\n FormsAndValidationsModule,\r\n ],\r\n exports: [EsParametersComponent]\r\n})\r\nexport class EsParametersModule {\r\n }\r\n","/**\r\n * Classe che rappresenta un parametro generico\r\n */\r\nexport class GenericParameter {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Codice del parametro\r\n * @param {string} description Descrizione del parametro\r\n * @param {string} pattern Pattern di validazione\r\n * @param {'date' | 'string' | 'number' | 'boolean' | 'enum'} type Tipo di input \r\n * @param {boolean} required Indica se il valore è obbligatorio o meno\r\n * @param {any} v_default Valore di default per questo Parametro\r\n * @param {{ id: string, description: string }[]} enumvalues Qualora il **type** fosse di tipo **enum**, qui devono esserci tutti i valori che può assumere \r\n * @param {boolean} multienum Qualora il **type** fosse di tipo **enum**, indica se è possibile selezionare più valori (multiselect)\r\n * @param {string} sourceapi Nei casi in cui il **type** è **enum** indica l'api da cui recuperare i valori da bindare alla select o alla multiselect\r\n * @param {boolean} pageddata Nei casi in cui il **type** è **enum** indica che l'api specificata eventualmetne da **sourceapi** è paginata\r\n */\r\n constructor(\r\n public id: string,\r\n public description: string,\r\n public pattern: string,\r\n type: 'date' | 'string' | 'number' | 'boolean' | 'enum',\r\n public required: boolean,\r\n v_default: any = null,\r\n public enumvalues: { id: string, description: string }[] = [],\r\n public multienum?: boolean,\r\n public sourceapi?: string,\r\n public pageddata?: boolean) {\r\n\r\n this.type = type == 'enum' ? null : type;\r\n this.visible = true;\r\n this.enumtype = type == 'enum' ? type : \"\";\r\n this.isreadonly = false;\r\n\r\n if (!this.enumtype && enumvalues.length != 0)\r\n console.error(\"impossibile gestire valori di dizionario per un parametro non di tipo enum\");\r\n\r\n if (v_default != null)\r\n this.value = v_default;\r\n }\r\n\r\n /** Tipo di dato rappresentato da questo parametro */\r\n public type?: 'date' | 'string' | 'number' | 'boolean' | 'enum';\r\n\r\n /** Typecode lato C# che rappresenta il tipo di dato */\r\n public typecode: number;\r\n\r\n /** Indica se il campo specificato dev'essere di sola lettura o meno */\r\n public isreadonly: boolean;\r\n\r\n /** Valore del parametro */\r\n public value: any;\r\n\r\n /** Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto */\r\n public visible: boolean;\r\n\r\n /** Tipo Enum, valorizzato dal Backend */\r\n public enumtype: string;\r\n\r\n /** Tipo Dizionario, valorizzato dal Backend */\r\n public dicttype: string;\r\n\r\n /** Espressione di obbligatorietà */\r\n public requiredexp?: string;\r\n\r\n /** Espressione di visibilità */\r\n public visibleexp?: string;\r\n\r\n /** Ordinamento in base al quale verranno ordinati i parametri */\r\n public order: number;\r\n\r\n /** Gruppo di appartenenza del parametro */\r\n public group: string;\r\n}","/*\r\n * Public API Surface of parameters\r\n */\r\nexport * from './lib/es_parameters.module';\r\nexport * from './lib/models/GenericParameter';\r\nexport * from './lib/es_parameters.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"esfaenza-parameters.mjs","sources":["../../../projects/parameters/src/lib/es_parameters.component.loc.ts","../../../projects/parameters/src/lib/models/GenericParameterGroup.ts","../../../projects/parameters/src/lib/es_parameters.component.ts","../../../projects/parameters/src/lib/es_parameters.component.html","../../../projects/parameters/src/lib/es_parameters.module.ts","../../../projects/parameters/src/lib/models/GenericParameter.ts","../../../projects/parameters/src/public-api.ts","../../../projects/parameters/src/esfaenza-parameters.ts"],"sourcesContent":["import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/**\r\n * Classe di localizzazione per il componente **EsParametersComponent**\r\n */\r\n@Injectable()\r\nexport class EsParametersLoc extends LocalizationService {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(injector: Injector) {\r\n super(injector);\r\n }\r\n}","import { GenericParameter } from \"./GenericParameter\";\r\n\r\n/**\r\n * Classe che rappresenta un gruppo di parametri generico\r\n */\r\nexport class GenericParameterGroup {\r\n\r\n /**\r\n * Costruttore\r\n * @param {string} groupName Descrizione del gruppo che fa anche da id\r\n * @param {number} order ordine del gruppo\r\n */\r\n\r\n constructor(public groupName: string, public order: number) {\r\n this.parameters = [];\r\n this.subgroups = [];\r\n }\r\n\r\n /** Lista di Generic Parameters */\r\n public parameters: GenericParameter[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n public subgroups: GenericParameterGroup[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n // public : GenericParameterGroup[];\r\n\r\n}","// Angular\r\nimport { ControlValueAccessor, UntypedFormControl, NgControl, NgForm, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from \"@angular/forms\";\r\nimport { ChangeDetectorRef, Component, forwardRef, Injector, Input, ViewEncapsulation } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { DateService, UtilityService } from \"@esfaenza/extensions\";\r\n\r\n// Classi\r\nimport { GenericParameter } from './models/GenericParameter';\r\n\r\n// Applicazione\r\nimport { EsParametersLoc } from \"./es_parameters.component.loc\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { GenericParameterGroup } from \"./models/GenericParameterGroup\";\r\n\r\n/** Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico */\r\n@Component({\r\n selector: \"es-parameters\",\r\n providers: [\r\n { provide: LocalizationService, useClass: EsParametersLoc },\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n }\r\n ],\r\n styleUrls: [\"./es_parameters.component.scss\"],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: \"./es_parameters.component.html\"\r\n})\r\nexport class EsParametersComponent implements ControlValueAccessor, Validator {\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Parameters: GenericParameter[];\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Groups: GenericParameterGroup[];\r\n\r\n /** Cache per fare lookup rapidi in fase di valutazione espressioni di visibilità e obbligatorietà */\r\n private ParametersCache: {[id: string]: GenericParameter};\r\n\r\n /**\r\n * Pipeline di Angular \r\n * \r\n * @ignore\r\n */\r\n propagateChange = (_: any) => { };\r\n\r\n /** Indica che il parametro deve essere in modalità display */\r\n @Input() DisplayMode: boolean = false;\r\n\r\n /** Indica che l'ultimo parametro non deve avere margine in fondo */\r\n @Input() LastParameterNoMargin: boolean = false;\r\n\r\n /** col-md-X per la label */\r\n @Input() LabelColWidth: number = 4;\r\n\r\n /** col-md-X per l'input */\r\n @Input() InputColWidth: number = 8;\r\n\r\n /** Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente */\r\n @Input() submitted: boolean = false;\r\n\r\n /** Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare */\r\n @Input() EmptyMessage: string = \"\";\r\n\r\n /** Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label */\r\n @Input() Removal: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() Readonly: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() ListFormat: 'CommaSeparated' | 'Array' = 'Array';\r\n\r\n /** Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit */\r\n @Input() Form : NgForm = null;\r\n\r\n /** Quando utilizza un sottocomponente autocomplete abilita o disabilita il reset dell'input per ogni selezione */\r\n @Input() AutocompleteHideChoicesOnSelection: boolean = false;\r\n\r\n /** Funzione da utilizzare per tirare fuori i dati di un autocomplete */\r\n @Input() AutoCompleteDataRetrieve: (parameter: GenericParameter, search: string, byid: boolean) => Observable<{ id: string, description: string }[]>\r\n\r\n /** Permette di settare in una volta solo gli input **LabelColWidth** e **InputColWidth**, basta scriverlo con la sintassi \"X Y\" */\r\n @Input() set LabelInputRatio(input: string) {\r\n var ratio = input.split(/\\s/);\r\n this.LabelColWidth = parseInt(ratio[0]);\r\n this.InputColWidth = parseInt(ratio[1]);\r\n }\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(private utiExts: UtilityService, public lc: LocalizationService, public cdr: ChangeDetectorRef, private inj: Injector, public dates: DateService) { }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public writeValue(obj): void {\r\n this.Parameters = obj;\r\n\r\n this.ParametersCache = {};\r\n if (!this.Parameters)\r\n return;\r\n\r\n this.Parameters.forEach(t => {\r\n this.ParametersCache[t.id] = t;\r\n\r\n if (!t.typecode && !t.type)\r\n console.warn(\"Non è stato specificato né un type né un typecode\");\r\n\r\n if (t.typecode && !t.type)\r\n t.type = this.utiExts.getJsTypeFromTypeCode(t.typecode);\r\n\r\n if (t.typecode && t.type != this.utiExts.getJsTypeFromTypeCode(t.typecode))\r\n console.warn(`Rilevate inconsistenze fra il Tipo ${t.type} e il Tipo ${this.utiExts.getJsTypeFromTypeCode(t.typecode)} calcolato da TypeCode ${t.typecode} per il parametro ${t.id}`);\r\n\r\n if (t.type == \"boolean\")\r\n t.value = t.value?.toString()?.toLowerCase() === \"true\";\r\n\r\n if (t.enumtype || t.dicttype)\r\n t.type = 'enum';\r\n\r\n // Valore valido ma modalità di utilizzo a CommaSeparated, devo assicurarmi di riemettere la versione con la stringa\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n this.changed();\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && !Array.isArray(t.value))\r\n t.value = t.value ? t.value.split(',').map(t => t.trim()) : [];\r\n });\r\n\r\n this.generateGroups();\r\n this.reviewParametersBindings();\r\n }\r\n \r\n /**\r\n * Metodo che si occupa di creare e ordinare i gruppi dei parametri\r\n */\r\n generateGroups(){\r\n this.Groups = [];\r\n\r\n if(this.Parameters?.length > 0){\r\n this.Parameters.sort((a,b) => a.order < b.order ? -1 : 1);\r\n\r\n // Ciclo tutti i parametri\r\n for(let i = 0; this.Parameters.length > i; i++) {\r\n let par = this.Parameters[i];\r\n\r\n let parGroupName = par.group ?? \"\";\r\n let groupOrder = par.group ? par.order : -1;\r\n\r\n // Se il gruppo non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parGroupName, groupOrder));\r\n }\r\n\r\n // Inserisco il parametro dentro al suo gruppo\r\n this.Groups.find(g => g.groupName == parGroupName).parameters.push(par)\r\n }\r\n\r\n // Gestione sottogruppi\r\n let subgroups: GenericParameterGroup[] = this.Groups.filter(group => group.groupName.includes('§'));\r\n for(let _; subgroups.length > 0; () => {}) {\r\n // Recupero la lista di gruppi che hanno sottogruppi\r\n // Per convenzione, nel nome contengono \"§\"\r\n this.tryToAddSubgroups(subgroups);\r\n subgroups = this.Groups.filter(group => group.groupName.includes('§'));\r\n }\r\n\r\n this.Groups.sort((a,b) => a.order < b.order ? -1 : 1);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i sottogruppi dei parametri\r\n */\r\n tryToAddSubgroups(subgroups: GenericParameterGroup[]) {\r\n for(let i = 0; subgroups.length > i; i++) {\r\n let sub = subgroups[i];\r\n\r\n // Ottengo un lista con la gerarchia dei gruppi, in ordine\r\n let groupsParentHierarchy = sub.groupName.split('§') ?? [];\r\n\r\n // Recupero il gruppo padre\r\n let parentGroupName = sub.groupName.replace(`§${groupsParentHierarchy[groupsParentHierarchy.length - 1]}`, ``);\r\n \r\n // Se il gruppo padre non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parentGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parentGroupName, sub.order));\r\n }\r\n\r\n // Rimuovo dal nome del gruppo l'informazione sul padre (Sistemando anche l'etichetta)\r\n // e lo aggiungo ai sottogruppi del padre\r\n sub.groupName = sub.groupName.replace(`${parentGroupName}§`, '');\r\n let parentGroup = this.Groups.find(x => x.groupName == parentGroupName);\r\n if(parentGroup?.subgroups.some(s => s.groupName == sub.groupName)) {\r\n let target = parentGroup.subgroups.find(f => f.groupName == sub.groupName);\r\n sub.parameters.map(p => target.parameters.push(p));\r\n sub.subgroups.map(s => target.subgroups.push(s));\r\n target.order = sub.order < target.order ? sub.order : target.order;\r\n } else {\r\n parentGroup?.subgroups.push(sub);\r\n }\r\n\r\n // Rimuovo il sottogruppo gruppo dalla lista\r\n this.Groups.splice(this.Groups.indexOf(sub), 1);\r\n }\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n validate(c: UntypedFormControl): any {\r\n // Se la validazione è richiamata da un componente non me stesso vuol dire che i componenti di validazione interni stanno richiamando\r\n // questo validator, ma dal loro punto di vista non se ne devono preoccupare quindi faccio finta non ci siano errori.\r\n // Se invece vengo richiamato direttamente significa che è il form in cui vive es-parameters e lì devo effettuare la validazione\r\n let control = this.inj.get(NgControl, null)?.control;\r\n if (c != control)\r\n return null;\r\n\r\n let valid = true;\r\n if (this.Parameters && this.Parameters.length > 0) {\r\n this.Parameters.forEach(t => {\r\n if(!t.visible)\r\n return;\r\n \r\n let emptyNumber = t.type == 'number' && (t.value == null || t.value == undefined);\r\n let emptyNonNumber = t.type != 'number' && !t.value\r\n\r\n if (t.required && (emptyNumber || emptyNonNumber))\r\n valid = false;\r\n else if (t.value && t.type == 'number')\r\n valid = new RegExp(t.pattern || /^[+-]?[0-9]*[,]?[0-9]+$/).test(t.value.toString());\r\n else if (t.value && t.pattern)\r\n valid = new RegExp(t.pattern).test(t.value);\r\n });\r\n }\r\n\r\n if (valid)\r\n return null;\r\n return { \"es-parameters\": valid };\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnChange(fn): void { this.propagateChange = fn; }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnTouched(fn): void { }\r\n\r\n /**\r\n * Metodo che si occupa di gestire il modello in uscita e propagarlo sul binding ngModel\r\n */\r\n public changed() {\r\n if (!this.Parameters)\r\n return;\r\n\r\n // Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri\r\n var changes = this.reviewParametersBindings();\r\n if (changes.length > 0) {\r\n changes.forEach(ch => {\r\n let index = this.Parameters.findIndex(t => t.id == ch);\r\n this.Parameters[index] = JSON.parse(JSON.stringify(this.Parameters[index]));\r\n this.ParametersCache[ch] = this.Parameters[index];\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n var ParametersClone = JSON.parse(JSON.stringify(this.Parameters));\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n ParametersClone?.forEach(t => {\r\n if (t.type == \"enum\" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = t.value.join(',');\r\n });\r\n\r\n this.propagateChange(ParametersClone);\r\n }\r\n\r\n /**\r\n * Rimuove il parametro selezionato e propaga il modello\r\n * \r\n * @param {GenericParameter} par Parametro da rimuovere\r\n */\r\n public removeParameter(par: GenericParameter) {\r\n this.Parameters.splice(this.Parameters.indexOf(par), 1);\r\n this.changed();\r\n }\r\n\r\n public GenerateParameterGroups() {\r\n let Groups: { id: string, groups: string[], order: number }[] = [];\r\n\r\n this.Parameters.forEach(param => {\r\n Groups.push({ id: param.id, groups: param.group.split(\"§\"), order: param.order });\r\n });\r\n\r\n let GroupedGroups = Groups.reduce((r, a) => {\r\n let firstGroupId = a.groups?.length > 0 ? a.groups[0] : \"\";\r\n r[firstGroupId] = [...r[firstGroupId] || [], a];\r\n return r;\r\n }, {});\r\n\r\n console.log(GroupedGroups);\r\n\r\n // Ciclo del risultato, aggiungendo i gruppi al modello\r\n // Per ogni gruppo che aggiungo, assegno i parametri in ordine\r\n }\r\n\r\n /**\r\n * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo\r\n * \r\n * @returns {string[]} lista con gli id dei parametri che sono stati modificati\r\n */\r\n private reviewParametersBindings(): string[] {\r\n let changes = [];\r\n for (let i = 0; i < this.Parameters.length; i++) {\r\n var p = this.Parameters[i];\r\n\r\n if (p.requiredexp) {\r\n let prevReq = p.required;\r\n p.required = this.evaluate(p.requiredexp);\r\n if (prevReq != p.required)\r\n changes.push(p.id);\r\n }\r\n if (p.visibleexp) {\r\n let prevVisi = p.visible;\r\n p.visible = this.evaluate(p.visibleexp);\r\n if (prevVisi != p.visible)\r\n changes.push(p.id)\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Valuta un'espressione in base ai parametri presenti nel modello attuale\r\n * \r\n * @param expr Espressione da valutare scritta nel formato (ripetibile) \"ID (==|!=|<|>|>=|<=) (`valore` | null | true | false | XXX,XXX)\" separato eventualmente da && ed ||\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n private evaluate(expr: string): boolean {\r\n var regex = /\\s?([a-zA-Z0-9_-]+)\\s?(!=|==|<|>|<=|>=)\\s?(`[^`]+`|``|null|[0-9,]+|true|false)/gm;\r\n\r\n var matches: string[] = [];\r\n var finalExpr = expr;\r\n while (matches = regex.exec(expr)) {\r\n var fullMatch = matches[0].trim();\r\n var id = matches[1].trim();\r\n var operation = matches[2].trim();\r\n let bValue = matches[3].trim().trim();\r\n var value = matches[3].trim().trim().replace('`', '').replace('`', '');\r\n\r\n finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', ${bValue == 'null' ? 'null' : `'${value}'`})`);\r\n }\r\n\r\n return eval(finalExpr);\r\n }\r\n\r\n /**\r\n * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore\r\n * Richiamata da EVAL\r\n * \r\n * @param {string} key Chiave del parametro di cui verificare il valore\r\n * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=\r\n * @param {string} value Valore di confronto da utilizzare\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n public checkValue(key: string, operator: string, value: string): boolean {\r\n var rPar = this.ParametersCache[key];\r\n try {\r\n switch (rPar.type) {\r\n case \"string\":\r\n case \"enum\":\r\n return eval(`\"${this.defaultIfnullOrUndefined(rPar.value, ``)}\" ${operator} \"${this.defaultIfnullOrUndefined(value, ``)}\"`);\r\n case \"boolean\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, ``).toString()} ${operator} ${this.defaultIfnullOrUndefined(value, ``)}`);\r\n case \"number\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, '\"\"', true).replace(',', '.')} ${operator} ${this.defaultIfnullOrUndefined(value, '\"\"', true).replace(',', '.')}`);\r\n case \"date\":\r\n let parDateConv = `this.dates.getDateConvertion(\"${rPar.value}\")`;\r\n let valDateConv = `this.dates.getDateConvertion(\"${value}\")`;\r\n\r\n switch (operator) {\r\n\r\n case \"==\": return eval(`${parDateConv} == ${valDateConv} || (${parDateConv} != null && ${parDateConv}.isSame(${valDateConv}))`);\r\n case \"!=\": return eval(`${parDateConv} != ${valDateConv} && ${parDateConv} != null && !${parDateConv}.isSame(${valDateConv})`);\r\n case \">\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isAfter(${valDateConv})`);\r\n case \"<\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isBefore(${valDateConv})`);\r\n case \">=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isAfter(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n case \"<=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isBefore(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n console.warn(\"Errori nella valutazione dell'espressione. Fallback a false\");\r\n return false;\r\n }\r\n\r\n throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;\r\n }\r\n\r\n /** @ignore */\r\n private defaultIfnullOrUndefined<T>(item: T, dflt: T, emptyStringIsNull: boolean = false): T {\r\n if (item == null || item == undefined || item.toString() == 'null' || (emptyStringIsNull && item.toString() == \"\"))\r\n return dflt;\r\n return item;\r\n }\r\n\r\n /** @ignore */\r\n public getSource(parameter: GenericParameter, search: string, byid: boolean): Observable<{ id: string, description: string }[]> {\r\n if (!this.AutoCompleteDataRetrieve) {\r\n console.error(\"@forms-and-validations: funzione di dataretrieve non impostata per un parametro autocomplete\");\r\n return of([])\r\n }\r\n else\r\n return this.AutoCompleteDataRetrieve(parameter, search, byid);\r\n }\r\n}","<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required ? par.required : undefined\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required ? par.required : undefined\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FormsAndValidationsModule } from \"@esfaenza/forms-and-validations\";\r\nimport { LocalizationModule } from '@esfaenza/localizations';\r\nimport { EsParametersComponent } from './es_parameters.component';\r\n\r\n\r\n@NgModule({\r\n declarations: [EsParametersComponent],\r\n imports: [\r\n CommonModule,\r\n LocalizationModule,\r\n FormsModule,\r\n FormsAndValidationsModule,\r\n ],\r\n exports: [EsParametersComponent]\r\n})\r\nexport class EsParametersModule {\r\n }\r\n","/**\r\n * Classe che rappresenta un parametro generico\r\n */\r\nexport class GenericParameter {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Codice del parametro\r\n * @param {string} description Descrizione del parametro\r\n * @param {string} pattern Pattern di validazione\r\n * @param {'date' | 'string' | 'number' | 'boolean' | 'enum'} type Tipo di input \r\n * @param {boolean} required Indica se il valore è obbligatorio o meno\r\n * @param {any} v_default Valore di default per questo Parametro\r\n * @param {{ id: string, description: string }[]} enumvalues Qualora il **type** fosse di tipo **enum**, qui devono esserci tutti i valori che può assumere \r\n * @param {boolean} multienum Qualora il **type** fosse di tipo **enum**, indica se è possibile selezionare più valori (multiselect)\r\n * @param {string} sourceapi Nei casi in cui il **type** è **enum** indica l'api da cui recuperare i valori da bindare alla select o alla multiselect\r\n * @param {boolean} pageddata Nei casi in cui il **type** è **enum** indica che l'api specificata eventualmetne da **sourceapi** è paginata\r\n */\r\n constructor(\r\n public id: string,\r\n public description: string,\r\n public pattern: string,\r\n type: 'date' | 'string' | 'number' | 'boolean' | 'enum',\r\n public required: boolean,\r\n v_default: any = null,\r\n public enumvalues: { id: string, description: string }[] = [],\r\n public multienum?: boolean,\r\n public sourceapi?: string,\r\n public pageddata?: boolean) {\r\n\r\n this.type = type == 'enum' ? null : type;\r\n this.visible = true;\r\n this.enumtype = type == 'enum' ? type : \"\";\r\n this.isreadonly = false;\r\n\r\n if (!this.enumtype && enumvalues.length != 0)\r\n console.error(\"impossibile gestire valori di dizionario per un parametro non di tipo enum\");\r\n\r\n if (v_default != null)\r\n this.value = v_default;\r\n }\r\n\r\n /** Tipo di dato rappresentato da questo parametro */\r\n public type?: 'date' | 'string' | 'number' | 'boolean' | 'enum';\r\n\r\n /** Typecode lato C# che rappresenta il tipo di dato */\r\n public typecode: number;\r\n\r\n /** Indica se il campo specificato dev'essere di sola lettura o meno */\r\n public isreadonly: boolean;\r\n\r\n /** Valore del parametro */\r\n public value: any;\r\n\r\n /** Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto */\r\n public visible: boolean;\r\n\r\n /** Tipo Enum, valorizzato dal Backend */\r\n public enumtype: string;\r\n\r\n /** Tipo Dizionario, valorizzato dal Backend */\r\n public dicttype: string;\r\n\r\n /** Espressione di obbligatorietà */\r\n public requiredexp?: string;\r\n\r\n /** Espressione di visibilità */\r\n public visibleexp?: string;\r\n\r\n /** Ordinamento in base al quale verranno ordinati i parametri */\r\n public order: number;\r\n\r\n /** Gruppo di appartenenza del parametro */\r\n public group: string;\r\n}","/*\r\n * Public API Surface of parameters\r\n */\r\nexport * from './lib/es_parameters.module';\r\nexport * from './lib/models/GenericParameter';\r\nexport * from './lib/es_parameters.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esfaenza/parameters",
3
- "version": "15.2.10",
3
+ "version": "15.2.11",
4
4
  "dependencies": {
5
5
  "tslib": "^2.0.0"
6
6
  },