@gnggln/ng-ui-system 1.0.0-alpha.0

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.
Files changed (141) hide show
  1. package/esm2022/gnggln-ng-ui-system.mjs +5 -0
  2. package/esm2022/lib/components/accordion/accordion.component.mjs +353 -0
  3. package/esm2022/lib/components/accordion/accordion.types.mjs +6 -0
  4. package/esm2022/lib/components/accordion/index.mjs +2 -0
  5. package/esm2022/lib/components/base-layout/base-layout.component.mjs +218 -0
  6. package/esm2022/lib/components/base-layout/base-layout.types.mjs +6 -0
  7. package/esm2022/lib/components/base-layout/index.mjs +14 -0
  8. package/esm2022/lib/components/button/button-area.component.mjs +196 -0
  9. package/esm2022/lib/components/button/button.component.mjs +164 -0
  10. package/esm2022/lib/components/button/button.types.mjs +6 -0
  11. package/esm2022/lib/components/button/index.mjs +16 -0
  12. package/esm2022/lib/components/crud-table/crud-table.component.mjs +789 -0
  13. package/esm2022/lib/components/crud-table/crud-table.types.mjs +6 -0
  14. package/esm2022/lib/components/crud-table/index.mjs +16 -0
  15. package/esm2022/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  16. package/esm2022/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  17. package/esm2022/lib/components/form-builder/form-builder.component.mjs +824 -0
  18. package/esm2022/lib/components/form-builder/form-wizard.component.mjs +510 -0
  19. package/esm2022/lib/components/form-builder/index.mjs +19 -0
  20. package/esm2022/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  21. package/esm2022/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  22. package/esm2022/lib/components/form-builder/services/location.service.mjs +140 -0
  23. package/esm2022/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
  24. package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +161 -0
  25. package/esm2022/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  26. package/esm2022/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  27. package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  28. package/esm2022/lib/components/form-builder/types/condition.types.mjs +6 -0
  29. package/esm2022/lib/components/form-builder/types/field.types.mjs +6 -0
  30. package/esm2022/lib/components/form-builder/types/index.mjs +2 -0
  31. package/esm2022/lib/components/form-builder/types/schema.types.mjs +6 -0
  32. package/esm2022/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  33. package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -0
  34. package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
  35. package/esm2022/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
  36. package/esm2022/lib/components/form-builder-editor/index.mjs +21 -0
  37. package/esm2022/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
  38. package/esm2022/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
  39. package/esm2022/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
  40. package/esm2022/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
  41. package/esm2022/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
  42. package/esm2022/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
  43. package/esm2022/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
  44. package/esm2022/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
  45. package/esm2022/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
  46. package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
  47. package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +472 -0
  48. package/esm2022/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
  49. package/esm2022/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
  50. package/esm2022/lib/components/layout-builder/index.mjs +18 -0
  51. package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +1730 -0
  52. package/esm2022/lib/components/layout-builder/layout-builder.types.mjs +9 -0
  53. package/esm2022/lib/components/layout-builder/layout.service.mjs +239 -0
  54. package/esm2022/lib/components/modal/confirm-dialog.component.mjs +151 -0
  55. package/esm2022/lib/components/modal/index.mjs +4 -0
  56. package/esm2022/lib/components/modal/modal.component.mjs +139 -0
  57. package/esm2022/lib/components/modal/modal.service.mjs +194 -0
  58. package/esm2022/lib/components/modal/modal.types.mjs +6 -0
  59. package/esm2022/lib/components/page-header/breadcrumb.service.mjs +242 -0
  60. package/esm2022/lib/components/page-header/index.mjs +20 -0
  61. package/esm2022/lib/components/page-header/page-header.component.mjs +243 -0
  62. package/esm2022/lib/components/page-header/page-header.types.mjs +21 -0
  63. package/esm2022/lib/components/table/index.mjs +2 -0
  64. package/esm2022/lib/components/table/paginated-table.component.mjs +407 -0
  65. package/esm2022/lib/components/table/table.types.mjs +6 -0
  66. package/esm2022/lib/core/types/index.mjs +6 -0
  67. package/esm2022/lib/core/utils/index.mjs +53 -0
  68. package/esm2022/lib/sources/location-data.opt.json +8942 -0
  69. package/esm2022/lib/sources/nazioni.opt.json +215 -0
  70. package/esm2022/public-api.mjs +34 -0
  71. package/fesm2022/gnggln-ng-ui-system.mjs +55752 -0
  72. package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -0
  73. package/index.d.ts +5 -0
  74. package/lib/components/accordion/accordion.component.d.ts +118 -0
  75. package/lib/components/accordion/accordion.types.d.ts +62 -0
  76. package/lib/components/accordion/index.d.ts +2 -0
  77. package/lib/components/base-layout/base-layout.component.d.ts +83 -0
  78. package/lib/components/base-layout/base-layout.types.d.ts +26 -0
  79. package/lib/components/base-layout/index.d.ts +13 -0
  80. package/lib/components/button/button-area.component.d.ts +88 -0
  81. package/lib/components/button/button.component.d.ts +55 -0
  82. package/lib/components/button/button.types.d.ts +70 -0
  83. package/lib/components/button/index.d.ts +15 -0
  84. package/lib/components/crud-table/crud-table.component.d.ts +143 -0
  85. package/lib/components/crud-table/crud-table.types.d.ts +207 -0
  86. package/lib/components/crud-table/index.d.ts +15 -0
  87. package/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  88. package/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  89. package/lib/components/form-builder/form-builder.component.d.ts +183 -0
  90. package/lib/components/form-builder/form-wizard.component.d.ts +87 -0
  91. package/lib/components/form-builder/index.d.ts +13 -0
  92. package/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  93. package/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  94. package/lib/components/form-builder/services/location.service.d.ts +83 -0
  95. package/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
  96. package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +28 -0
  97. package/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  98. package/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  99. package/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  100. package/lib/components/form-builder/types/condition.types.d.ts +51 -0
  101. package/lib/components/form-builder/types/field.types.d.ts +288 -0
  102. package/lib/components/form-builder/types/index.d.ts +5 -0
  103. package/lib/components/form-builder/types/schema.types.d.ts +227 -0
  104. package/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  105. package/lib/components/form-builder/types/validation.types.d.ts +174 -0
  106. package/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
  107. package/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
  108. package/lib/components/form-builder-editor/index.d.ts +15 -0
  109. package/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
  110. package/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
  111. package/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
  112. package/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
  113. package/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
  114. package/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
  115. package/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
  116. package/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
  117. package/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
  118. package/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
  119. package/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
  120. package/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
  121. package/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
  122. package/lib/components/layout-builder/index.d.ts +16 -0
  123. package/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
  124. package/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
  125. package/lib/components/layout-builder/layout.service.d.ts +100 -0
  126. package/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  127. package/lib/components/modal/index.d.ts +4 -0
  128. package/lib/components/modal/modal.component.d.ts +44 -0
  129. package/lib/components/modal/modal.service.d.ts +93 -0
  130. package/lib/components/modal/modal.types.d.ts +110 -0
  131. package/lib/components/page-header/breadcrumb.service.d.ts +96 -0
  132. package/lib/components/page-header/index.d.ts +16 -0
  133. package/lib/components/page-header/page-header.component.d.ts +59 -0
  134. package/lib/components/page-header/page-header.types.d.ts +96 -0
  135. package/lib/components/table/index.d.ts +2 -0
  136. package/lib/components/table/paginated-table.component.d.ts +85 -0
  137. package/lib/components/table/table.types.d.ts +81 -0
  138. package/lib/core/types/index.d.ts +57 -0
  139. package/lib/core/utils/index.d.ts +29 -0
  140. package/package.json +44 -0
  141. package/public-api.d.ts +22 -0
@@ -0,0 +1,510 @@
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectorRef, ViewEncapsulation, ViewChild, inject, } from '@angular/core';
2
+ import { LucideAngularModule } from 'lucide-angular';
3
+ import { Subject, takeUntil } from 'rxjs';
4
+ import { UiButtonComponent } from '../../components/button/index';
5
+ import { UiFormBuilderComponent } from './form-builder.component';
6
+ import { UiWizardSyncService } from './services/wizard-sync.service';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "lucide-angular";
9
+ /**
10
+ * Componente wizard che wrappa `UiFormBuilderComponent`
11
+ * aggiungendo navigazione multi-step, barra di progresso,
12
+ * validazione per step e sincronizzazione wireless.
13
+ *
14
+ * @selector ui-form-wizard
15
+ *
16
+ * @example
17
+ * ```html
18
+ * <ui-form-wizard
19
+ * [schema]="wizardSchema"
20
+ * [wizardConfig]="wizardConfig"
21
+ * (wizardComplete)="onComplete($event)"
22
+ * (stepChange)="onStepChange($event)"
23
+ * />
24
+ * ```
25
+ */
26
+ export class UiFormWizardComponent {
27
+ constructor() {
28
+ this.cdr = inject(ChangeDetectorRef);
29
+ this.wizardSync = inject(UiWizardSyncService);
30
+ this.destroy$ = new Subject();
31
+ /** Metodi di validazione custom per step. */
32
+ this.customValidationMethods = {};
33
+ /** Dati iniziali. */
34
+ this.initialData = {};
35
+ /** Modalita sola lettura. */
36
+ this.readonly = false;
37
+ /** Stato disabilitato. */
38
+ this.disabled = false;
39
+ /** Pulsante in caricamento. */
40
+ this.loadingFor = null;
41
+ // ─── Output ─────────────────────────────────────────────────────
42
+ this.stepChange = new EventEmitter();
43
+ this.stepComplete = new EventEmitter();
44
+ this.stepValidationFailed = new EventEmitter();
45
+ this.wizardComplete = new EventEmitter();
46
+ this.valueChange = new EventEmitter();
47
+ this.validationChange = new EventEmitter();
48
+ this.customEvent = new EventEmitter();
49
+ // ─── Stato ──────────────────────────────────────────────────────
50
+ this.state = {
51
+ currentStep: 0,
52
+ totalSteps: 0,
53
+ completedSteps: new Set(),
54
+ visitedSteps: new Set([0]),
55
+ isValid: false,
56
+ stepErrors: {},
57
+ };
58
+ /** Step ordinati per stepNumber. */
59
+ this.wizardSteps = [];
60
+ /** Dati accumulati del form. */
61
+ this.accumulatedData = {};
62
+ /**
63
+ * Schema cachato per lo step corrente.
64
+ * Evita di creare un nuovo oggetto ad ogni ciclo di change detection,
65
+ * cosa che causerebbe rebuild infiniti nel form builder.
66
+ */
67
+ this._cachedStepSchema = null;
68
+ this._cachedStepIndex = -1;
69
+ }
70
+ // ─── Getter calcolati ───────────────────────────────────────────
71
+ get currentStepSchema() {
72
+ // Se lo step non e cambiato, restituisci lo schema cachato
73
+ if (this._cachedStepIndex === this.state.currentStep && this._cachedStepSchema) {
74
+ return this._cachedStepSchema;
75
+ }
76
+ const step = this.wizardSteps[this.state.currentStep];
77
+ if (!step)
78
+ return null;
79
+ this._cachedStepSchema = {
80
+ id: this.schema.id + '-step-' + this.state.currentStep,
81
+ sections: [step],
82
+ config: { ...this.schema.config, hideFooter: true, showButtons: false },
83
+ };
84
+ this._cachedStepIndex = this.state.currentStep;
85
+ return this._cachedStepSchema;
86
+ }
87
+ get currentStepTitle() {
88
+ const step = this.wizardSteps[this.state.currentStep];
89
+ return step?.wizardStep?.stepTitle || step?.title || '';
90
+ }
91
+ get currentStepDescription() {
92
+ const step = this.wizardSteps[this.state.currentStep];
93
+ return step?.wizardStep?.stepDescription || step?.description || '';
94
+ }
95
+ get isLastStep() {
96
+ return this.state.currentStep >= this.state.totalSteps - 1;
97
+ }
98
+ get progressPercent() {
99
+ if (this.state.totalSteps <= 1)
100
+ return 100;
101
+ return Math.round((this.state.currentStep / (this.state.totalSteps - 1)) * 100);
102
+ }
103
+ // ─── Lifecycle ──────────────────────────────────────────────────
104
+ ngOnInit() {
105
+ if (!this.schema)
106
+ return;
107
+ // Estrai e ordina gli step
108
+ this.wizardSteps = this.schema.sections
109
+ .filter((s) => s.wizardStep)
110
+ .sort((a, b) => (a.wizardStep.stepNumber || 0) - (b.wizardStep.stepNumber || 0));
111
+ this.state.totalSteps = this.wizardSteps.length;
112
+ this.accumulatedData = { ...this.initialData };
113
+ // Sincronizzazione wireless
114
+ if (this.wizardConfig.wizardId) {
115
+ this.syncWizardState();
116
+ // Ascolta navigazione esterna
117
+ this.wizardSync
118
+ .getWizardState$(this.wizardConfig.wizardId)
119
+ .pipe(takeUntil(this.destroy$))
120
+ .subscribe((data) => {
121
+ if (data && data.wizardState.currentStep !== this.state.currentStep) {
122
+ this.navigateToStep(data.wizardState.currentStep);
123
+ }
124
+ });
125
+ }
126
+ }
127
+ ngOnDestroy() {
128
+ this.destroy$.next();
129
+ this.destroy$.complete();
130
+ if (this.wizardConfig?.wizardId) {
131
+ this.wizardSync.unregisterWizard(this.wizardConfig.wizardId);
132
+ }
133
+ }
134
+ // ─── Navigazione ────────────────────────────────────────────────
135
+ /** Vai allo step successivo con validazione. */
136
+ async goToNextStep() {
137
+ if (this.isLastStep)
138
+ return;
139
+ // Valida step corrente
140
+ if (!(await this.validateCurrentStep()))
141
+ return;
142
+ // Salva dati step corrente
143
+ this.state.completedSteps.add(this.state.currentStep);
144
+ await this.autoSaveIfNeeded();
145
+ this.navigateToStep(this.state.currentStep + 1);
146
+ }
147
+ /** Torna allo step precedente. */
148
+ goToPreviousStep() {
149
+ if (this.state.currentStep <= 0)
150
+ return;
151
+ this.navigateToStep(this.state.currentStep - 1);
152
+ }
153
+ /** Completa il wizard. */
154
+ async finishWizard() {
155
+ if (!(await this.validateCurrentStep()))
156
+ return;
157
+ this.state.completedSteps.add(this.state.currentStep);
158
+ await this.autoSaveIfNeeded();
159
+ this.wizardComplete.emit(this.accumulatedData);
160
+ }
161
+ /** Salva lo step corrente manualmente. */
162
+ async saveCurrentStep() {
163
+ if (this.wizardConfig.onStepSave) {
164
+ const data = this.formBuilder?.getFormValue() || {};
165
+ await this.wizardConfig.onStepSave(data, this.state.currentStep);
166
+ }
167
+ }
168
+ // ─── Callback form builder ─────────────────────────────────────
169
+ onValueChange(data) {
170
+ this.accumulatedData = { ...this.accumulatedData, ...data };
171
+ this.valueChange.emit(this.accumulatedData);
172
+ }
173
+ onValidationChange(state) {
174
+ this.state.isValid = state.valid;
175
+ this.validationChange.emit(state);
176
+ }
177
+ // ─── Navigazione interna ───────────────────────────────────────
178
+ navigateToStep(targetStep) {
179
+ if (targetStep < 0 || targetStep >= this.state.totalSteps)
180
+ return;
181
+ const from = this.state.currentStep;
182
+ this.state.currentStep = targetStep;
183
+ this.state.visitedSteps.add(targetStep);
184
+ // Invalida la cache per forzare la creazione di un nuovo schema
185
+ this._cachedStepSchema = null;
186
+ this._cachedStepIndex = -1;
187
+ this.stepChange.emit({
188
+ from,
189
+ to: targetStep,
190
+ direction: targetStep > from ? 'next' : 'previous',
191
+ });
192
+ this.syncWizardState();
193
+ this.cdr.markForCheck();
194
+ }
195
+ async validateCurrentStep() {
196
+ // Validazione form standard
197
+ this.formBuilder?.validateAllFields();
198
+ const isFormValid = this.formBuilder?.isFormValid() ?? true;
199
+ // Validazione custom per step
200
+ const step = this.wizardSteps[this.state.currentStep];
201
+ const customFnName = step?.wizardStep?.customValidationFn;
202
+ if (customFnName && this.customValidationMethods[customFnName]) {
203
+ const customValid = await this.customValidationMethods[customFnName](this.accumulatedData, this.state.currentStep, isFormValid);
204
+ if (!customValid) {
205
+ this.stepValidationFailed.emit({
206
+ step: this.state.currentStep,
207
+ errors: ['Validazione custom fallita'],
208
+ });
209
+ return false;
210
+ }
211
+ }
212
+ // Se il form non e valido, blocca la navigazione
213
+ if (!isFormValid && step?.wizardStep?.validation?.required !== false) {
214
+ const errors = this.formBuilder?.getDetailedFormErrors().flatMap((e) => e.errors) || [];
215
+ this.stepValidationFailed.emit({
216
+ step: this.state.currentStep,
217
+ errors,
218
+ });
219
+ return false;
220
+ }
221
+ this.stepComplete.emit({
222
+ step: this.state.currentStep,
223
+ data: this.formBuilder?.getFormValue() || {},
224
+ });
225
+ return true;
226
+ }
227
+ async autoSaveIfNeeded() {
228
+ if (this.wizardConfig.autoSave && this.wizardConfig.onStepSave) {
229
+ const data = this.formBuilder?.getFormValue() || {};
230
+ await this.wizardConfig.onStepSave(data, this.state.currentStep);
231
+ }
232
+ }
233
+ syncWizardState() {
234
+ if (!this.wizardConfig.wizardId)
235
+ return;
236
+ const syncData = {
237
+ wizardId: this.wizardConfig.wizardId,
238
+ wizardState: { ...this.state },
239
+ wizardSteps: this.wizardSteps.map((s) => ({
240
+ title: s.wizardStep?.stepTitle || s.title,
241
+ description: s.wizardStep?.stepDescription || s.description,
242
+ })),
243
+ isWizardMode: true,
244
+ schema: this.schema,
245
+ };
246
+ this.wizardSync.registerWizard(this.wizardConfig.wizardId, syncData);
247
+ }
248
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormWizardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
249
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiFormWizardComponent, isStandalone: true, selector: "ui-form-wizard", inputs: { schema: "schema", wizardConfig: "wizardConfig", customValidationMethods: "customValidationMethods", initialData: "initialData", readonly: "readonly", disabled: "disabled", loadingFor: "loadingFor" }, outputs: { stepChange: "stepChange", stepComplete: "stepComplete", stepValidationFailed: "stepValidationFailed", wizardComplete: "wizardComplete", valueChange: "valueChange", validationChange: "validationChange", customEvent: "customEvent" }, viewQueries: [{ propertyName: "formBuilder", first: true, predicate: UiFormBuilderComponent, descendants: true }], ngImport: i0, template: `
250
+ @if (schema && wizardConfig) {
251
+ <div class="ui-form-wizard">
252
+
253
+ <!-- Header wizard (nascosto se wireless) -->
254
+ @if (!wizardConfig.wirelessHeading) {
255
+ <div class="ui-form-wizard__header">
256
+
257
+ @if (wizardConfig.showProgress !== false) {
258
+ <!-- Barra progresso lineare -->
259
+ @if (wizardConfig.progressStyle !== 'steps') {
260
+ <div class="ui-form-wizard__progress-bar">
261
+ <div class="ui-form-wizard__progress-fill"
262
+ [style.width.%]="progressPercent"></div>
263
+ </div>
264
+ <span class="ui-form-wizard__progress-text">
265
+ {{ progressPercent }}% completato
266
+ </span>
267
+ } @else {
268
+ <!-- Step indicators -->
269
+ <div class="ui-form-wizard__steps">
270
+ @for (step of wizardSteps; track $index; let i = $index) {
271
+ <div class="ui-form-wizard__step"
272
+ [class.ui-form-wizard__step--current]="i === state.currentStep"
273
+ [class.ui-form-wizard__step--completed]="state.completedSteps.has(i)"
274
+ [class.ui-form-wizard__step--visited]="state.visitedSteps.has(i)"
275
+ >
276
+ <div class="ui-form-wizard__step-circle">
277
+ @if (state.completedSteps.has(i)) {
278
+ <lucide-icon name="check" [size]="16" />
279
+ } @else {
280
+ <span>{{ i + 1 }}</span>
281
+ }
282
+ </div>
283
+ <div class="ui-form-wizard__step-label">
284
+ {{ step.wizardStep?.stepTitle || step.title || 'Step ' + (i + 1) }}
285
+ </div>
286
+ </div>
287
+ }
288
+ </div>
289
+ }
290
+ }
291
+
292
+ <!-- Info step corrente -->
293
+ <div class="ui-form-wizard__step-info">
294
+ <h2 class="ui-form-wizard__step-title">{{ currentStepTitle }}</h2>
295
+ @if (currentStepDescription) {
296
+ <p class="ui-form-wizard__step-description">{{ currentStepDescription }}</p>
297
+ }
298
+ <span class="ui-form-wizard__step-counter">
299
+ Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}
300
+ </span>
301
+ </div>
302
+ </div>
303
+ }
304
+
305
+ <!-- Form builder per lo step corrente -->
306
+ <ui-form-builder
307
+ [schema]="currentStepSchema!"
308
+ [initialData]="initialData"
309
+ [readonly]="readonly"
310
+ [disabled]="disabled"
311
+ [loadingFor]="loadingFor"
312
+ (valueChange)="onValueChange($event)"
313
+ (validationChange)="onValidationChange($event)"
314
+ (customEvent)="customEvent.emit($event)"
315
+ />
316
+
317
+ <!-- Footer navigazione -->
318
+ @if (wizardConfig.showNavigationButtons !== false) {
319
+ <div class="ui-form-wizard__footer">
320
+ @if (wizardConfig.allowBackNavigation !== false && state.currentStep > 0) {
321
+ <ui-button
322
+ label="{{ wizardConfig.buttonLabels?.previous || 'Indietro' }}"
323
+ variant="outline"
324
+ icon="chevron-left"
325
+ (click)="goToPreviousStep()"
326
+ />
327
+ } @else {
328
+ <div></div>
329
+ }
330
+
331
+ <div class="ui-form-wizard__footer-right">
332
+ @if (wizardConfig.autoSave && wizardConfig.buttonLabels?.save) {
333
+ <ui-button
334
+ [label]="wizardConfig.buttonLabels!.save!"
335
+ variant="outline"
336
+ (click)="saveCurrentStep()"
337
+ />
338
+ }
339
+ @if (isLastStep) {
340
+ <ui-button
341
+ label="{{ wizardConfig.buttonLabels?.finish || 'Completa' }}"
342
+ variant="primary"
343
+ icon="check"
344
+ iconPosition="trailing"
345
+ (click)="finishWizard()"
346
+ />
347
+ } @else {
348
+ <ui-button
349
+ label="{{ wizardConfig.buttonLabels?.next || 'Avanti' }}"
350
+ variant="primary"
351
+ icon="chevron-right"
352
+ iconPosition="trailing"
353
+ (click)="goToNextStep()"
354
+ />
355
+ }
356
+ </div>
357
+ </div>
358
+ }
359
+ </div>
360
+ }
361
+ `, isInline: true, styles: [".ui-form-wizard{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-wizard__header{display:flex;flex-direction:column;gap:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-4);border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__progress-bar{height:6px;background:var(--ui-color-bg-subtle);border-radius:var(--ui-radius-full);overflow:hidden}.ui-form-wizard__progress-fill{height:100%;background:var(--ui-color-primary);border-radius:var(--ui-radius-full);transition:width var(--ui-transition-normal)}.ui-form-wizard__progress-text{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);margin-top:var(--ui-spacing-1)}.ui-form-wizard__steps{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ui-spacing-2);position:relative}.ui-form-wizard__steps:before{content:\"\";position:absolute;top:16px;left:24px;right:24px;height:2px;background:var(--ui-color-border);z-index:0}.ui-form-wizard__step{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);z-index:1;flex:1}.ui-form-wizard__step-circle{width:32px;height:32px;border-radius:var(--ui-radius-full);display:flex;align-items:center;justify-content:center;border:2px solid var(--ui-color-border);background:var(--ui-color-surface);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text-muted);transition:background-color var(--ui-transition-fast),border-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-form-wizard__step--current .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);background:var(--ui-color-primary);color:#fff}.ui-form-wizard__step--completed .ui-form-wizard__step-circle{border-color:var(--ui-color-success, #16a34a);background:var(--ui-color-success, #16a34a);color:#fff}.ui-form-wizard__step--visited:not(.ui-form-wizard__step--current):not(.ui-form-wizard__step--completed) .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);color:var(--ui-color-primary)}.ui-form-wizard__step-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);text-align:center;max-width:100px;line-height:1.3}.ui-form-wizard__step--current .ui-form-wizard__step-label{color:var(--ui-color-primary);font-weight:var(--ui-font-weight-semibold)}.ui-form-wizard__step-info{text-align:center}.ui-form-wizard__step-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-counter{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-wizard__footer{display:flex;justify-content:space-between;align-items:center;padding-top:var(--ui-spacing-4);border-top:1px solid var(--ui-color-border)}.ui-form-wizard__footer-right{display:flex;gap:var(--ui-spacing-3)}\n"], dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "component", type: UiButtonComponent, selector: "ui-button", inputs: ["label", "tooltip", "variant", "size", "icon", "iconPosition", "loading", "disabled", "fullWidth", "type", "ariaLabel", "customClass"] }, { kind: "component", type: UiFormBuilderComponent, selector: "ui-form-builder", inputs: ["schema", "initialData", "readonly", "disabled", "buttonsOverride", "loadingFor"], outputs: ["valueChange", "validationChange", "formSubmit", "formReset", "customEvent"] }], encapsulation: i0.ViewEncapsulation.None }); }
362
+ }
363
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormWizardComponent, decorators: [{
364
+ type: Component,
365
+ args: [{ selector: 'ui-form-wizard', standalone: true, imports: [LucideAngularModule, UiButtonComponent, UiFormBuilderComponent], encapsulation: ViewEncapsulation.None, template: `
366
+ @if (schema && wizardConfig) {
367
+ <div class="ui-form-wizard">
368
+
369
+ <!-- Header wizard (nascosto se wireless) -->
370
+ @if (!wizardConfig.wirelessHeading) {
371
+ <div class="ui-form-wizard__header">
372
+
373
+ @if (wizardConfig.showProgress !== false) {
374
+ <!-- Barra progresso lineare -->
375
+ @if (wizardConfig.progressStyle !== 'steps') {
376
+ <div class="ui-form-wizard__progress-bar">
377
+ <div class="ui-form-wizard__progress-fill"
378
+ [style.width.%]="progressPercent"></div>
379
+ </div>
380
+ <span class="ui-form-wizard__progress-text">
381
+ {{ progressPercent }}% completato
382
+ </span>
383
+ } @else {
384
+ <!-- Step indicators -->
385
+ <div class="ui-form-wizard__steps">
386
+ @for (step of wizardSteps; track $index; let i = $index) {
387
+ <div class="ui-form-wizard__step"
388
+ [class.ui-form-wizard__step--current]="i === state.currentStep"
389
+ [class.ui-form-wizard__step--completed]="state.completedSteps.has(i)"
390
+ [class.ui-form-wizard__step--visited]="state.visitedSteps.has(i)"
391
+ >
392
+ <div class="ui-form-wizard__step-circle">
393
+ @if (state.completedSteps.has(i)) {
394
+ <lucide-icon name="check" [size]="16" />
395
+ } @else {
396
+ <span>{{ i + 1 }}</span>
397
+ }
398
+ </div>
399
+ <div class="ui-form-wizard__step-label">
400
+ {{ step.wizardStep?.stepTitle || step.title || 'Step ' + (i + 1) }}
401
+ </div>
402
+ </div>
403
+ }
404
+ </div>
405
+ }
406
+ }
407
+
408
+ <!-- Info step corrente -->
409
+ <div class="ui-form-wizard__step-info">
410
+ <h2 class="ui-form-wizard__step-title">{{ currentStepTitle }}</h2>
411
+ @if (currentStepDescription) {
412
+ <p class="ui-form-wizard__step-description">{{ currentStepDescription }}</p>
413
+ }
414
+ <span class="ui-form-wizard__step-counter">
415
+ Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}
416
+ </span>
417
+ </div>
418
+ </div>
419
+ }
420
+
421
+ <!-- Form builder per lo step corrente -->
422
+ <ui-form-builder
423
+ [schema]="currentStepSchema!"
424
+ [initialData]="initialData"
425
+ [readonly]="readonly"
426
+ [disabled]="disabled"
427
+ [loadingFor]="loadingFor"
428
+ (valueChange)="onValueChange($event)"
429
+ (validationChange)="onValidationChange($event)"
430
+ (customEvent)="customEvent.emit($event)"
431
+ />
432
+
433
+ <!-- Footer navigazione -->
434
+ @if (wizardConfig.showNavigationButtons !== false) {
435
+ <div class="ui-form-wizard__footer">
436
+ @if (wizardConfig.allowBackNavigation !== false && state.currentStep > 0) {
437
+ <ui-button
438
+ label="{{ wizardConfig.buttonLabels?.previous || 'Indietro' }}"
439
+ variant="outline"
440
+ icon="chevron-left"
441
+ (click)="goToPreviousStep()"
442
+ />
443
+ } @else {
444
+ <div></div>
445
+ }
446
+
447
+ <div class="ui-form-wizard__footer-right">
448
+ @if (wizardConfig.autoSave && wizardConfig.buttonLabels?.save) {
449
+ <ui-button
450
+ [label]="wizardConfig.buttonLabels!.save!"
451
+ variant="outline"
452
+ (click)="saveCurrentStep()"
453
+ />
454
+ }
455
+ @if (isLastStep) {
456
+ <ui-button
457
+ label="{{ wizardConfig.buttonLabels?.finish || 'Completa' }}"
458
+ variant="primary"
459
+ icon="check"
460
+ iconPosition="trailing"
461
+ (click)="finishWizard()"
462
+ />
463
+ } @else {
464
+ <ui-button
465
+ label="{{ wizardConfig.buttonLabels?.next || 'Avanti' }}"
466
+ variant="primary"
467
+ icon="chevron-right"
468
+ iconPosition="trailing"
469
+ (click)="goToNextStep()"
470
+ />
471
+ }
472
+ </div>
473
+ </div>
474
+ }
475
+ </div>
476
+ }
477
+ `, styles: [".ui-form-wizard{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-wizard__header{display:flex;flex-direction:column;gap:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-4);border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__progress-bar{height:6px;background:var(--ui-color-bg-subtle);border-radius:var(--ui-radius-full);overflow:hidden}.ui-form-wizard__progress-fill{height:100%;background:var(--ui-color-primary);border-radius:var(--ui-radius-full);transition:width var(--ui-transition-normal)}.ui-form-wizard__progress-text{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);margin-top:var(--ui-spacing-1)}.ui-form-wizard__steps{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ui-spacing-2);position:relative}.ui-form-wizard__steps:before{content:\"\";position:absolute;top:16px;left:24px;right:24px;height:2px;background:var(--ui-color-border);z-index:0}.ui-form-wizard__step{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);z-index:1;flex:1}.ui-form-wizard__step-circle{width:32px;height:32px;border-radius:var(--ui-radius-full);display:flex;align-items:center;justify-content:center;border:2px solid var(--ui-color-border);background:var(--ui-color-surface);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text-muted);transition:background-color var(--ui-transition-fast),border-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-form-wizard__step--current .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);background:var(--ui-color-primary);color:#fff}.ui-form-wizard__step--completed .ui-form-wizard__step-circle{border-color:var(--ui-color-success, #16a34a);background:var(--ui-color-success, #16a34a);color:#fff}.ui-form-wizard__step--visited:not(.ui-form-wizard__step--current):not(.ui-form-wizard__step--completed) .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);color:var(--ui-color-primary)}.ui-form-wizard__step-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);text-align:center;max-width:100px;line-height:1.3}.ui-form-wizard__step--current .ui-form-wizard__step-label{color:var(--ui-color-primary);font-weight:var(--ui-font-weight-semibold)}.ui-form-wizard__step-info{text-align:center}.ui-form-wizard__step-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-counter{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-wizard__footer{display:flex;justify-content:space-between;align-items:center;padding-top:var(--ui-spacing-4);border-top:1px solid var(--ui-color-border)}.ui-form-wizard__footer-right{display:flex;gap:var(--ui-spacing-3)}\n"] }]
478
+ }], propDecorators: { formBuilder: [{
479
+ type: ViewChild,
480
+ args: [UiFormBuilderComponent]
481
+ }], schema: [{
482
+ type: Input
483
+ }], wizardConfig: [{
484
+ type: Input
485
+ }], customValidationMethods: [{
486
+ type: Input
487
+ }], initialData: [{
488
+ type: Input
489
+ }], readonly: [{
490
+ type: Input
491
+ }], disabled: [{
492
+ type: Input
493
+ }], loadingFor: [{
494
+ type: Input
495
+ }], stepChange: [{
496
+ type: Output
497
+ }], stepComplete: [{
498
+ type: Output
499
+ }], stepValidationFailed: [{
500
+ type: Output
501
+ }], wizardComplete: [{
502
+ type: Output
503
+ }], valueChange: [{
504
+ type: Output
505
+ }], validationChange: [{
506
+ type: Output
507
+ }], customEvent: [{
508
+ type: Output
509
+ }] } });
510
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS13aXphcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXIvZm9ybS13aXphcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBYWxFLE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsTUFBTSxnQ0FBZ0MsQ0FBQzs7O0FBRXZGOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBeUhILE1BQU0sT0FBTyxxQkFBcUI7SUF4SGxDO1FBeUhtQixRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBWWhELDZDQUE2QztRQUNwQyw0QkFBdUIsR0FBeUMsRUFBRSxDQUFDO1FBRTVFLHFCQUFxQjtRQUNaLGdCQUFXLEdBQWUsRUFBRSxDQUFDO1FBRXRDLDZCQUE2QjtRQUNwQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCLDBCQUEwQjtRQUNqQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCLCtCQUErQjtR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QixxQkFBcUIsNGpCQUtyQixzQkFBc0IsZ0RBeEh2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdIVCxzL0ZBbEhTLG1CQUFtQixnUEFBRSxpQkFBaUIsdU1BQUUsc0JBQXNCOzs0RkFxSDdELHFCQUFxQjtrQkF4SGpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsaUJBQzFELGlCQUFpQixDQUFDLElBQUksWUFDM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnSFQ7OEJBUWtDLFdBQVc7c0JBQTdDLFNBQVM7dUJBQUMsc0JBQXNCO2dCQUt4QixNQUFNO3NCQUFkLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFJSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT25Jbml0LFxyXG4gIE9uRGVzdHJveSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBWaWV3Q2hpbGQsXHJcbiAgaW5qZWN0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMdWNpZGVBbmd1bGFyTW9kdWxlIH0gZnJvbSAnbHVjaWRlLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVWlCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2J1dHRvbi9pbmRleCc7XHJcblxyXG5pbXBvcnQgeyBVaUZvcm1CdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9mb3JtLWJ1aWxkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBVaUZvcm1TY2hlbWEsXHJcbiAgVWlGb3JtU2VjdGlvbixcclxuICBVaUZvcm1EYXRhLFxyXG4gIFVpV2l6YXJkQ29uZmlnLFxyXG4gIFVpV2l6YXJkU3RhdGUsXHJcbiAgVWlXaXphcmRTdGVwQ2hhbmdlRXZlbnQsXHJcbiAgVWlXaXphcmRTdGVwQ29tcGxldGVFdmVudCxcclxuICBVaVdpemFyZFZhbGlkYXRpb25GbixcclxuICBVaUZvcm1DdXN0b21FdmVudCxcclxufSBmcm9tICcuL3R5cGVzL3NjaGVtYS50eXBlcyc7XHJcbmltcG9ydCB7IFVpRm9ybVZhbGlkYXRpb25TdGF0ZSB9IGZyb20gJy4vdHlwZXMvdmFsaWRhdGlvbi50eXBlcyc7XHJcbmltcG9ydCB7IFVpV2l6YXJkU3luY1NlcnZpY2UsIFVpV2l6YXJkU3luY0RhdGEgfSBmcm9tICcuL3NlcnZpY2VzL3dpemFyZC1zeW5jLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudGUgd2l6YXJkIGNoZSB3cmFwcGEgYFVpRm9ybUJ1aWxkZXJDb21wb25lbnRgXHJcbiAqIGFnZ2l1bmdlbmRvIG5hdmlnYXppb25lIG11bHRpLXN0ZXAsIGJhcnJhIGRpIHByb2dyZXNzbyxcclxuICogdmFsaWRhemlvbmUgcGVyIHN0ZXAgZSBzaW5jcm9uaXp6YXppb25lIHdpcmVsZXNzLlxyXG4gKlxyXG4gKiBAc2VsZWN0b3IgdWktZm9ybS13aXphcmRcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgaHRtbFxyXG4gKiA8dWktZm9ybS13aXphcmRcclxuICogICBbc2NoZW1hXT1cIndpemFyZFNjaGVtYVwiXHJcbiAqICAgW3dpemFyZENvbmZpZ109XCJ3aXphcmRDb25maWdcIlxyXG4gKiAgICh3aXphcmRDb21wbGV0ZSk9XCJvbkNvbXBsZXRlKCRldmVudClcIlxyXG4gKiAgIChzdGVwQ2hhbmdlKT1cIm9uU3RlcENoYW5nZSgkZXZlbnQpXCJcclxuICogLz5cclxuICogYGBgXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLWZvcm0td2l6YXJkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtMdWNpZGVBbmd1bGFyTW9kdWxlLCBVaUJ1dHRvbkNvbXBvbmVudCwgVWlGb3JtQnVpbGRlckNvbXBvbmVudF0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgQGlmIChzY2hlbWEgJiYgd2l6YXJkQ29uZmlnKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZFwiPlxyXG5cclxuICAgICAgICA8IS0tIEhlYWRlciB3aXphcmQgKG5hc2Nvc3RvIHNlIHdpcmVsZXNzKSAtLT5cclxuICAgICAgICBAaWYgKCF3aXphcmRDb25maWcud2lyZWxlc3NIZWFkaW5nKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX2hlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgQGlmICh3aXphcmRDb25maWcuc2hvd1Byb2dyZXNzICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgIDwhLS0gQmFycmEgcHJvZ3Jlc3NvIGxpbmVhcmUgLS0+XHJcbiAgICAgICAgICAgICAgQGlmICh3aXphcmRDb25maWcucHJvZ3Jlc3NTdHlsZSAhPT0gJ3N0ZXBzJykge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19wcm9ncmVzcy1iYXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19wcm9ncmVzcy1maWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJwcm9ncmVzc1BlcmNlbnRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fcHJvZ3Jlc3MtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBwcm9ncmVzc1BlcmNlbnQgfX0lIGNvbXBsZXRhdG9cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDwhLS0gU3RlcCBpbmRpY2F0b3JzIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwc1wiPlxyXG4gICAgICAgICAgICAgICAgICBAZm9yIChzdGVwIG9mIHdpemFyZFN0ZXBzOyB0cmFjayAkaW5kZXg7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy51aS1mb3JtLXdpemFyZF9fc3RlcC0tY3VycmVudF09XCJpID09PSBzdGF0ZS5jdXJyZW50U3RlcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudWktZm9ybS13aXphcmRfX3N0ZXAtLWNvbXBsZXRlZF09XCJzdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnVpLWZvcm0td2l6YXJkX19zdGVwLS12aXNpdGVkXT1cInN0YXRlLnZpc2l0ZWRTdGVwcy5oYXMoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpICsgMSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc3RlcC53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHwgc3RlcC50aXRsZSB8fCAnU3RlcCAnICsgKGkgKyAxKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgPCEtLSBJbmZvIHN0ZXAgY29ycmVudGUgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtdGl0bGVcIj57eyBjdXJyZW50U3RlcFRpdGxlIH19PC9oMj5cclxuICAgICAgICAgICAgICBAaWYgKGN1cnJlbnRTdGVwRGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtZGVzY3JpcHRpb25cIj57eyBjdXJyZW50U3RlcERlc2NyaXB0aW9uIH19PC9wPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWNvdW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIFBhc3NvIHt7IHN0YXRlLmN1cnJlbnRTdGVwICsgMSB9fSBkaSB7eyBzdGF0ZS50b3RhbFN0ZXBzIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSBGb3JtIGJ1aWxkZXIgcGVyIGxvIHN0ZXAgY29ycmVudGUgLS0+XHJcbiAgICAgICAgPHVpLWZvcm0tYnVpbGRlclxyXG4gICAgICAgICAgW3NjaGVtYV09XCJjdXJyZW50U3RlcFNjaGVtYSFcIlxyXG4gICAgICAgICAgW2luaXRpYWxEYXRhXT1cImluaXRpYWxEYXRhXCJcclxuICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgW2xvYWRpbmdGb3JdPVwibG9hZGluZ0ZvclwiXHJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICh2YWxpZGF0aW9uQ2hhbmdlKT1cIm9uVmFsaWRhdGlvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChjdXN0b21FdmVudCk9XCJjdXN0b21FdmVudC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIDwhLS0gRm9vdGVyIG5hdmlnYXppb25lIC0tPlxyXG4gICAgICAgIEBpZiAod2l6YXJkQ29uZmlnLnNob3dOYXZpZ2F0aW9uQnV0dG9ucyAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIEBpZiAod2l6YXJkQ29uZmlnLmFsbG93QmFja05hdmlnYXRpb24gIT09IGZhbHNlICYmIHN0YXRlLmN1cnJlbnRTdGVwID4gMCkge1xyXG4gICAgICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgICAgIGxhYmVsPVwie3sgd2l6YXJkQ29uZmlnLmJ1dHRvbkxhYmVscz8ucHJldmlvdXMgfHwgJ0luZGlldHJvJyB9fVwiXHJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgICAgICBpY29uPVwiY2hldnJvbi1sZWZ0XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvUHJldmlvdXNTdGVwKClcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgQGlmICh3aXphcmRDb25maWcuYXV0b1NhdmUgJiYgd2l6YXJkQ29uZmlnLmJ1dHRvbkxhYmVscz8uc2F2ZSkge1xyXG4gICAgICAgICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwid2l6YXJkQ29uZmlnLmJ1dHRvbkxhYmVscyEuc2F2ZSFcIlxyXG4gICAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlQ3VycmVudFN0ZXAoKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBAaWYgKGlzTGFzdFN0ZXApIHtcclxuICAgICAgICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eyB3aXphcmRDb25maWcuYnV0dG9uTGFiZWxzPy5maW5pc2ggfHwgJ0NvbXBsZXRhJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgaWNvbj1cImNoZWNrXCJcclxuICAgICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInRyYWlsaW5nXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmaW5pc2hXaXphcmQoKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cInt7IHdpemFyZENvbmZpZy5idXR0b25MYWJlbHM/Lm5leHQgfHwgJ0F2YW50aScgfX1cIlxyXG4gICAgICAgICAgICAgICAgICB2YXJpYW50PVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgIGljb249XCJjaGV2cm9uLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInRyYWlsaW5nXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvTmV4dFN0ZXAoKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIGAsXHJcbiAgc3R5bGVVcmw6ICcuL2Zvcm0td2l6YXJkLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpRm9ybVdpemFyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB3aXphcmRTeW5jID0gaW5qZWN0KFVpV2l6YXJkU3luY1NlcnZpY2UpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBAVmlld0NoaWxkKFVpRm9ybUJ1aWxkZXJDb21wb25lbnQpIGZvcm1CdWlsZGVyPzogVWlGb3JtQnVpbGRlckNvbXBvbmVudDtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIElucHV0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogU2NoZW1hIGNvbXBsZXRvIGRlbCBmb3JtICh0dXR0ZSBsZSBzZXppb25pIGNvbiB3aXphcmRTdGVwKS4gKi9cclxuICBASW5wdXQoKSBzY2hlbWEhOiBVaUZvcm1TY2hlbWE7XHJcblxyXG4gIC8qKiBDb25maWd1cmF6aW9uZSBkZWwgd2l6YXJkLiAqL1xyXG4gIEBJbnB1dCgpIHdpemFyZENvbmZpZyE6IFVpV2l6YXJkQ29uZmlnO1xyXG5cclxuICAvKiogTWV0b2RpIGRpIHZhbGlkYXppb25lIGN1c3RvbSBwZXIgc3RlcC4gKi9cclxuICBASW5wdXQoKSBjdXN0b21WYWxpZGF0aW9uTWV0aG9kczogUmVjb3JkPHN0cmluZywgVWlXaXphcmRWYWxpZGF0aW9uRm4+ID0ge307XHJcblxyXG4gIC8qKiBEYXRpIGluaXppYWxpLiAqL1xyXG4gIEBJbnB1dCgpIGluaXRpYWxEYXRhOiBVaUZvcm1EYXRhID0ge307XHJcblxyXG4gIC8qKiBNb2RhbGl0YSBzb2xhIGxldHR1cmEuICovXHJcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFN0YXRvIGRpc2FiaWxpdGF0by4gKi9cclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAvKiogUHVsc2FudGUgaW4gY2FyaWNhbWVudG8uICovXHJcbiAgQElucHV0KCkgbG9hZGluZ0Zvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBPdXRwdXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIEBPdXRwdXQoKSBzdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVdpemFyZFN0ZXBDaGFuZ2VFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgc3RlcENvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVdpemFyZFN0ZXBDb21wbGV0ZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBzdGVwVmFsaWRhdGlvbkZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBudW1iZXI7IGVycm9yczogc3RyaW5nW10gfT4oKTtcclxuICBAT3V0cHV0KCkgd2l6YXJkQ29tcGxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybURhdGE+KCk7XHJcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1EYXRhPigpO1xyXG4gIEBPdXRwdXQoKSB2YWxpZGF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1WYWxpZGF0aW9uU3RhdGU+KCk7XHJcbiAgQE91dHB1dCgpIGN1c3RvbUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1DdXN0b21FdmVudD4oKTtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIFN0YXRvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBzdGF0ZTogVWlXaXphcmRTdGF0ZSA9IHtcclxuICAgIGN1cnJlbnRTdGVwOiAwLFxyXG4gICAgdG90YWxTdGVwczogMCxcclxuICAgIGNvbXBsZXRlZFN0ZXBzOiBuZXcgU2V0PG51bWJlcj4oKSxcclxuICAgIHZpc2l0ZWRTdGVwczogbmV3IFNldDxudW1iZXI+KFswXSksXHJcbiAgICBpc1ZhbGlkOiBmYWxzZSxcclxuICAgIHN0ZXBFcnJvcnM6IHt9LFxyXG4gIH07XHJcblxyXG4gIC8qKiBTdGVwIG9yZGluYXRpIHBlciBzdGVwTnVtYmVyLiAqL1xyXG4gIHdpemFyZFN0ZXBzOiBVaUZvcm1TZWN0aW9uW10gPSBbXTtcclxuXHJcbiAgLyoqIERhdGkgYWNjdW11bGF0aSBkZWwgZm9ybS4gKi9cclxuICBwcml2YXRlIGFjY3VtdWxhdGVkRGF0YTogVWlGb3JtRGF0YSA9IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBTY2hlbWEgY2FjaGF0byBwZXIgbG8gc3RlcCBjb3JyZW50ZS5cclxuICAgKiBFdml0YSBkaSBjcmVhcmUgdW4gbnVvdm8gb2dnZXR0byBhZCBvZ25pIGNpY2xvIGRpIGNoYW5nZSBkZXRlY3Rpb24sXHJcbiAgICogY29zYSBjaGUgY2F1c2VyZWJiZSByZWJ1aWxkIGluZmluaXRpIG5lbCBmb3JtIGJ1aWxkZXIuXHJcbiAgICovXHJcbiAgX2NhY2hlZFN0ZXBTY2hlbWE6IFVpRm9ybVNjaGVtYSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2NhY2hlZFN0ZXBJbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBHZXR0ZXIgY2FsY29sYXRpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBnZXQgY3VycmVudFN0ZXBTY2hlbWEoKTogVWlGb3JtU2NoZW1hIHwgbnVsbCB7XHJcbiAgICAvLyBTZSBsbyBzdGVwIG5vbiBlIGNhbWJpYXRvLCByZXN0aXR1aXNjaSBsbyBzY2hlbWEgY2FjaGF0b1xyXG4gICAgaWYgKHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9PT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAmJiB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLndpemFyZFN0ZXBzW3RoaXMuc3RhdGUuY3VycmVudFN0ZXBdO1xyXG4gICAgaWYgKCFzdGVwKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hID0ge1xyXG4gICAgICBpZDogdGhpcy5zY2hlbWEuaWQgKyAnLXN0ZXAtJyArIHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIHNlY3Rpb25zOiBbc3RlcF0sXHJcbiAgICAgIGNvbmZpZzogeyAuLi50aGlzLnNjaGVtYS5jb25maWcsIGhpZGVGb290ZXI6IHRydWUsIHNob3dCdXR0b25zOiBmYWxzZSB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9IHRoaXMuc3RhdGUuY3VycmVudFN0ZXA7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkU3RlcFNjaGVtYTtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50U3RlcFRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy53aXphcmRTdGVwc1t0aGlzLnN0YXRlLmN1cnJlbnRTdGVwXTtcclxuICAgIHJldHVybiBzdGVwPy53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHwgc3RlcD8udGl0bGUgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVudFN0ZXBEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMud2l6YXJkU3RlcHNbdGhpcy5zdGF0ZS5jdXJyZW50U3RlcF07XHJcbiAgICByZXR1cm4gc3RlcD8ud2l6YXJkU3RlcD8uc3RlcERlc2NyaXB0aW9uIHx8IHN0ZXA/LmRlc2NyaXB0aW9uIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTGFzdFN0ZXAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCA+PSB0aGlzLnN0YXRlLnRvdGFsU3RlcHMgLSAxO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByb2dyZXNzUGVyY2VudCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUudG90YWxTdGVwcyA8PSAxKSByZXR1cm4gMTAwO1xyXG4gICAgcmV0dXJuIE1hdGgucm91bmQoKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgLyAodGhpcy5zdGF0ZS50b3RhbFN0ZXBzIC0gMSkpICogMTAwKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNjaGVtYSkgcmV0dXJuO1xyXG5cclxuICAgIC8vIEVzdHJhaSBlIG9yZGluYSBnbGkgc3RlcFxyXG4gICAgdGhpcy53aXphcmRTdGVwcyA9IHRoaXMuc2NoZW1hLnNlY3Rpb25zXHJcbiAgICAgIC5maWx0ZXIoKHMpID0+IHMud2l6YXJkU3RlcClcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLndpemFyZFN0ZXAhLnN0ZXBOdW1iZXIgfHwgMCkgLSAoYi53aXphcmRTdGVwIS5zdGVwTnVtYmVyIHx8IDApKTtcclxuXHJcbiAgICB0aGlzLnN0YXRlLnRvdGFsU3RlcHMgPSB0aGlzLndpemFyZFN0ZXBzLmxlbmd0aDtcclxuICAgIHRoaXMuYWNjdW11bGF0ZWREYXRhID0geyAuLi50aGlzLmluaXRpYWxEYXRhIH07XHJcblxyXG4gICAgLy8gU2luY3Jvbml6emF6aW9uZSB3aXJlbGVzc1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkKSB7XHJcbiAgICAgIHRoaXMuc3luY1dpemFyZFN0YXRlKCk7XHJcblxyXG4gICAgICAvLyBBc2NvbHRhIG5hdmlnYXppb25lIGVzdGVybmFcclxuICAgICAgdGhpcy53aXphcmRTeW5jXHJcbiAgICAgICAgLmdldFdpemFyZFN0YXRlJCh0aGlzLndpemFyZENvbmZpZy53aXphcmRJZClcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS53aXphcmRTdGF0ZS5jdXJyZW50U3RlcCAhPT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCkge1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9TdGVwKGRhdGEud2l6YXJkU3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQpIHtcclxuICAgICAgdGhpcy53aXphcmRTeW5jLnVucmVnaXN0ZXJXaXphcmQodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIE5hdmlnYXppb25lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogVmFpIGFsbG8gc3RlcCBzdWNjZXNzaXZvIGNvbiB2YWxpZGF6aW9uZS4gKi9cclxuICBhc3luYyBnb1RvTmV4dFN0ZXAoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc0xhc3RTdGVwKSByZXR1cm47XHJcblxyXG4gICAgLy8gVmFsaWRhIHN0ZXAgY29ycmVudGVcclxuICAgIGlmICghKGF3YWl0IHRoaXMudmFsaWRhdGVDdXJyZW50U3RlcCgpKSkgcmV0dXJuO1xyXG5cclxuICAgIC8vIFNhbHZhIGRhdGkgc3RlcCBjb3JyZW50ZVxyXG4gICAgdGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcy5hZGQodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICBhd2FpdCB0aGlzLmF1dG9TYXZlSWZOZWVkZWQoKTtcclxuXHJcbiAgICB0aGlzLm5hdmlnYXRlVG9TdGVwKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgKyAxKTtcclxuICB9XHJcblxyXG4gIC8qKiBUb3JuYSBhbGxvIHN0ZXAgcHJlY2VkZW50ZS4gKi9cclxuICBnb1RvUHJldmlvdXNTdGVwKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgPD0gMCkgcmV0dXJuO1xyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcCh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKiogQ29tcGxldGEgaWwgd2l6YXJkLiAqL1xyXG4gIGFzeW5jIGZpbmlzaFdpemFyZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghKGF3YWl0IHRoaXMudmFsaWRhdGVDdXJyZW50U3RlcCgpKSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc3RhdGUuY29tcGxldGVkU3RlcHMuYWRkKHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgYXdhaXQgdGhpcy5hdXRvU2F2ZUlmTmVlZGVkKCk7XHJcblxyXG4gICAgdGhpcy53aXphcmRDb21wbGV0ZS5lbWl0KHRoaXMuYWNjdW11bGF0ZWREYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKiBTYWx2YSBsbyBzdGVwIGNvcnJlbnRlIG1hbnVhbG1lbnRlLiAqL1xyXG4gIGFzeW5jIHNhdmVDdXJyZW50U3RlcCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZy5vblN0ZXBTYXZlKSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZvcm1CdWlsZGVyPy5nZXRGb3JtVmFsdWUoKSB8fCB7fTtcclxuICAgICAgYXdhaXQgdGhpcy53aXphcmRDb25maWcub25TdGVwU2F2ZShkYXRhLCB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBDYWxsYmFjayBmb3JtIGJ1aWxkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIG9uVmFsdWVDaGFuZ2UoZGF0YTogVWlGb3JtRGF0YSk6IHZvaWQge1xyXG4gICAgdGhpcy5hY2N1bXVsYXRlZERhdGEgPSB7IC4uLnRoaXMuYWNjdW11bGF0ZWREYXRhLCAuLi5kYXRhIH07XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5hY2N1bXVsYXRlZERhdGEpO1xyXG4gIH1cclxuXHJcbiAgb25WYWxpZGF0aW9uQ2hhbmdlKHN0YXRlOiBVaUZvcm1WYWxpZGF0aW9uU3RhdGUpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGUuaXNWYWxpZCA9IHN0YXRlLnZhbGlkO1xyXG4gICAgdGhpcy52YWxpZGF0aW9uQ2hhbmdlLmVtaXQoc3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIE5hdmlnYXppb25lIGludGVybmEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgbmF2aWdhdGVUb1N0ZXAodGFyZ2V0U3RlcDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGFyZ2V0U3RlcCA8IDAgfHwgdGFyZ2V0U3RlcCA+PSB0aGlzLnN0YXRlLnRvdGFsU3RlcHMpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBmcm9tID0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcDtcclxuICAgIHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgPSB0YXJnZXRTdGVwO1xyXG4gICAgdGhpcy5zdGF0ZS52aXNpdGVkU3RlcHMuYWRkKHRhcmdldFN0ZXApO1xyXG5cclxuICAgIC8vIEludmFsaWRhIGxhIGNhY2hlIHBlciBmb3J6YXJlIGxhIGNyZWF6aW9uZSBkaSB1biBudW92byBzY2hlbWFcclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWEgPSBudWxsO1xyXG4gICAgdGhpcy5fY2FjaGVkU3RlcEluZGV4ID0gLTE7XHJcblxyXG4gICAgdGhpcy5zdGVwQ2hhbmdlLmVtaXQoe1xyXG4gICAgICBmcm9tLFxyXG4gICAgICB0bzogdGFyZ2V0U3RlcCxcclxuICAgICAgZGlyZWN0aW9uOiB0YXJnZXRTdGVwID4gZnJvbSA/ICduZXh0JyA6ICdwcmV2aW91cycsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN5bmNXaXphcmRTdGF0ZSgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQ3VycmVudFN0ZXAoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBWYWxpZGF6aW9uZSBmb3JtIHN0YW5kYXJkXHJcbiAgICB0aGlzLmZvcm1CdWlsZGVyPy52YWxpZGF0ZUFsbEZpZWxkcygpO1xyXG4gICAgY29uc3QgaXNGb3JtVmFsaWQgPSB0aGlzLmZvcm1CdWlsZGVyPy5pc0Zvcm1WYWxpZCgpID8/IHRydWU7XHJcblxyXG4gICAgLy8gVmFsaWRhemlvbmUgY3VzdG9tIHBlciBzdGVwXHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy53aXphcmRTdGVwc1t0aGlzLnN0YXRlLmN1cnJlbnRTdGVwXTtcclxuICAgIGNvbnN0IGN1c3RvbUZuTmFtZSA9IHN0ZXA/LndpemFyZFN0ZXA/LmN1c3RvbVZhbGlkYXRpb25GbjtcclxuXHJcbiAgICBpZiAoY3VzdG9tRm5OYW1lICYmIHRoaXMuY3VzdG9tVmFsaWRhdGlvbk1ldGhvZHNbY3VzdG9tRm5OYW1lXSkge1xyXG4gICAgICBjb25zdCBjdXN0b21WYWxpZCA9IGF3YWl0IHRoaXMuY3VzdG9tVmFsaWRhdGlvbk1ldGhvZHNbY3VzdG9tRm5OYW1lXShcclxuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkRGF0YSxcclxuICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgIGlzRm9ybVZhbGlkLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCFjdXN0b21WYWxpZCkge1xyXG4gICAgICAgIHRoaXMuc3RlcFZhbGlkYXRpb25GYWlsZWQuZW1pdCh7XHJcbiAgICAgICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgICAgZXJyb3JzOiBbJ1ZhbGlkYXppb25lIGN1c3RvbSBmYWxsaXRhJ10sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2UgaWwgZm9ybSBub24gZSB2YWxpZG8sIGJsb2NjYSBsYSBuYXZpZ2F6aW9uZVxyXG4gICAgaWYgKCFpc0Zvcm1WYWxpZCAmJiBzdGVwPy53aXphcmRTdGVwPy52YWxpZGF0aW9uPy5yZXF1aXJlZCAhPT0gZmFsc2UpIHtcclxuICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy5mb3JtQnVpbGRlcj8uZ2V0RGV0YWlsZWRGb3JtRXJyb3JzKCkuZmxhdE1hcCgoZSkgPT4gZS5lcnJvcnMpIHx8IFtdO1xyXG4gICAgICB0aGlzLnN0ZXBWYWxpZGF0aW9uRmFpbGVkLmVtaXQoe1xyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgZXJyb3JzLFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RlcENvbXBsZXRlLmVtaXQoe1xyXG4gICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICBkYXRhOiB0aGlzLmZvcm1CdWlsZGVyPy5nZXRGb3JtVmFsdWUoKSB8fCB7fSxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBhdXRvU2F2ZUlmTmVlZGVkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLmF1dG9TYXZlICYmIHRoaXMud2l6YXJkQ29uZmlnLm9uU3RlcFNhdmUpIHtcclxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybUJ1aWxkZXI/LmdldEZvcm1WYWx1ZSgpIHx8IHt9O1xyXG4gICAgICBhd2FpdCB0aGlzLndpemFyZENvbmZpZy5vblN0ZXBTYXZlKGRhdGEsIHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzeW5jV2l6YXJkU3RhdGUoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc3luY0RhdGE6IFVpV2l6YXJkU3luY0RhdGEgPSB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgd2l6YXJkU3RhdGU6IHsgLi4udGhpcy5zdGF0ZSB9LFxyXG4gICAgICB3aXphcmRTdGVwczogdGhpcy53aXphcmRTdGVwcy5tYXAoKHMpID0+ICh7XHJcbiAgICAgICAgdGl0bGU6IHMud2l6YXJkU3RlcD8uc3RlcFRpdGxlIHx8IHMudGl0bGUsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IHMud2l6YXJkU3RlcD8uc3RlcERlc2NyaXB0aW9uIHx8IHMuZGVzY3JpcHRpb24sXHJcbiAgICAgIH0pKSxcclxuICAgICAgaXNXaXphcmRNb2RlOiB0cnVlLFxyXG4gICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLndpemFyZFN5bmMucmVnaXN0ZXJXaXphcmQodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsIHN5bmNEYXRhKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,19 @@
1
+ // ── Componenti ──
2
+ export { UiFormBuilderComponent, UiFormErrorStateMatcher } from './form-builder.component';
3
+ export { UiFormWizardComponent } from './form-wizard.component';
4
+ export { UiFormErrorSummaryComponent } from './sub-components/error-summary/form-error-summary.component';
5
+ export { UiFileInputComponent } from './sub-components/file-input/file-input.component';
6
+ export { UiSpecificaTerritorialeComponent } from './sub-components/specifica-territoriale/specifica-territoriale.component';
7
+ export { UiTableTerritorialeComponent } from './sub-components/table-territoriale/table-territoriale.component';
8
+ // ── Servizi ──
9
+ export { UiFormConditionService } from './services/form-condition.service';
10
+ export { UiFormValidationService } from './services/form-validation.service';
11
+ export { UiLocationService, } from './services/location.service';
12
+ export { UiWizardSyncService, } from './services/wizard-sync.service';
13
+ // ── Direttive ──
14
+ export { UiCurrencyInputDirective } from './directives/currency-input.directive';
15
+ // ── Adapter e formati data ──
16
+ export { UiItalianDateAdapter, UI_IT_DATE_FORMATS } from './adapters/it-date-adapter';
17
+ // ── Tipi ──
18
+ export * from './types/index';
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0tYnVpbGRlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBbUI7QUFDbkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDMUcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDeEYsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFDNUgsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sa0VBQWtFLENBQUM7QUFFaEgsZ0JBQWdCO0FBQ2hCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzdFLE9BQU8sRUFDTCxpQkFBaUIsR0FJbEIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsbUJBQW1CLEdBRXBCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsa0JBQWtCO0FBQ2xCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRWpGLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV0RixhQUFhO0FBQ2IsY0FBYyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDilIDilIAgQ29tcG9uZW50aSDilIDilIBcclxuZXhwb3J0IHsgVWlGb3JtQnVpbGRlckNvbXBvbmVudCwgVWlGb3JtRXJyb3JTdGF0ZU1hdGNoZXIgfSBmcm9tICcuL2Zvcm0tYnVpbGRlci5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBVaUZvcm1XaXphcmRDb21wb25lbnQgfSBmcm9tICcuL2Zvcm0td2l6YXJkLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IFVpRm9ybUVycm9yU3VtbWFyeUNvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvZXJyb3Itc3VtbWFyeS9mb3JtLWVycm9yLXN1bW1hcnkuY29tcG9uZW50JztcclxuZXhwb3J0IHsgVWlGaWxlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL2ZpbGUtaW5wdXQvZmlsZS1pbnB1dC5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBVaVNwZWNpZmljYVRlcnJpdG9yaWFsZUNvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvc3BlY2lmaWNhLXRlcnJpdG9yaWFsZS9zcGVjaWZpY2EtdGVycml0b3JpYWxlLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IFVpVGFibGVUZXJyaXRvcmlhbGVDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL3RhYmxlLXRlcnJpdG9yaWFsZS90YWJsZS10ZXJyaXRvcmlhbGUuY29tcG9uZW50JztcclxuXHJcbi8vIOKUgOKUgCBTZXJ2aXppIOKUgOKUgFxyXG5leHBvcnQgeyBVaUZvcm1Db25kaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9mb3JtLWNvbmRpdGlvbi5zZXJ2aWNlJztcclxuZXhwb3J0IHsgVWlGb3JtVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Zvcm0tdmFsaWRhdGlvbi5zZXJ2aWNlJztcclxuZXhwb3J0IHtcclxuICBVaUxvY2F0aW9uU2VydmljZSxcclxuICB0eXBlIFVpTmF6aW9uZSxcclxuICB0eXBlIFVpUHJvdmluY2lhLFxyXG4gIHR5cGUgVWlDb211bmUsXHJcbn0gZnJvbSAnLi9zZXJ2aWNlcy9sb2NhdGlvbi5zZXJ2aWNlJztcclxuZXhwb3J0IHtcclxuICBVaVdpemFyZFN5bmNTZXJ2aWNlLFxyXG4gIHR5cGUgVWlXaXphcmRTeW5jRGF0YSxcclxufSBmcm9tICcuL3NlcnZpY2VzL3dpemFyZC1zeW5jLnNlcnZpY2UnO1xyXG5cclxuLy8g4pSA4pSAIERpcmV0dGl2ZSDilIDilIBcclxuZXhwb3J0IHsgVWlDdXJyZW5jeUlucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2N1cnJlbmN5LWlucHV0LmRpcmVjdGl2ZSc7XHJcblxyXG4vLyDilIDilIAgQWRhcHRlciBlIGZvcm1hdGkgZGF0YSDilIDilIBcclxuZXhwb3J0IHsgVWlJdGFsaWFuRGF0ZUFkYXB0ZXIsIFVJX0lUX0RBVEVfRk9STUFUUyB9IGZyb20gJy4vYWRhcHRlcnMvaXQtZGF0ZS1hZGFwdGVyJztcclxuXHJcbi8vIOKUgOKUgCBUaXBpIOKUgOKUgFxyXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL2luZGV4JztcclxuIl19