@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,473 @@
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
2
+ import { FormsModule } from '@angular/forms';
3
+ import { MatCardModule } from '@angular/material/card';
4
+ import { MatFormFieldModule } from '@angular/material/form-field';
5
+ import { MatInputModule } from '@angular/material/input';
6
+ import { MatSelectModule } from '@angular/material/select';
7
+ import { LucideAngularModule } from 'lucide-angular';
8
+ import { UiButtonComponent } from '../../../button/index';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/forms";
11
+ import * as i2 from "@angular/material/card";
12
+ import * as i3 from "@angular/material/form-field";
13
+ import * as i4 from "@angular/material/input";
14
+ import * as i5 from "@angular/material/select";
15
+ import * as i6 from "@angular/material/core";
16
+ import * as i7 from "lucide-angular";
17
+ /**
18
+ * Editor per le regole di validazione dei campi.
19
+ *
20
+ * Permette di aggiungere, modificare e rimuovere regole di validazione
21
+ * per un campo del form builder. Supporta validazioni standard,
22
+ * cross-field, date e file.
23
+ *
24
+ * @selector ui-validation-editor
25
+ */
26
+ export class UiValidationEditorComponent {
27
+ constructor() {
28
+ /** Lista delle regole di validazione da editare. */
29
+ this.validations = [];
30
+ /** Emesso quando la lista di regole viene modificata. */
31
+ this.validationsChange = new EventEmitter();
32
+ /** Opzioni disponibili per il tipo di validazione. */
33
+ this.validationTypes = [
34
+ { value: 'required', label: 'Obbligatorio' },
35
+ { value: 'email', label: 'Email' },
36
+ { value: 'min', label: 'Valore minimo' },
37
+ { value: 'max', label: 'Valore massimo' },
38
+ { value: 'minLength', label: 'Lunghezza minima' },
39
+ { value: 'maxLength', label: 'Lunghezza massima' },
40
+ { value: 'pattern', label: 'Pattern (regex)' },
41
+ { value: 'crossField', label: 'Cross-field' },
42
+ { value: 'date-min', label: 'Data minima' },
43
+ { value: 'date-max', label: 'Data massima' },
44
+ { value: 'fileSize', label: 'Dimensione file' },
45
+ { value: 'fileType', label: 'Tipo file' },
46
+ { value: 'fileCount', label: 'Numero file' },
47
+ ];
48
+ /** Opzioni per gli operatori di confronto cross-field. */
49
+ this.crossFieldOperators = [
50
+ { value: 'greater_than', label: 'Maggiore di' },
51
+ { value: 'greater_equal', label: 'Maggiore o uguale' },
52
+ { value: 'less_than', label: 'Minore di' },
53
+ { value: 'less_equal', label: 'Minore o uguale' },
54
+ { value: 'not_equal', label: 'Diverso da' },
55
+ ];
56
+ }
57
+ /**
58
+ * Verifica se il tipo di validazione richiede un campo valore.
59
+ * @param type - Tipo di validazione da verificare
60
+ * @returns true se il tipo richiede un valore
61
+ */
62
+ requiresValue(type) {
63
+ return ['min', 'max', 'minLength', 'maxLength', 'pattern', 'fileSize', 'fileCount'].includes(type);
64
+ }
65
+ /**
66
+ * Restituisce il placeholder appropriato per il campo valore
67
+ * in base al tipo di validazione selezionato.
68
+ * @param type - Tipo di validazione
69
+ * @returns Stringa placeholder
70
+ */
71
+ getValuePlaceholder(type) {
72
+ const placeholders = {
73
+ min: 'Valore numerico minimo',
74
+ max: 'Valore numerico massimo',
75
+ minLength: 'Lunghezza minima (numero)',
76
+ maxLength: 'Lunghezza massima (numero)',
77
+ pattern: 'Espressione regolare (regex)',
78
+ fileSize: 'Dimensione massima in bytes',
79
+ fileCount: 'Numero massimo di file',
80
+ };
81
+ return placeholders[type] || 'Inserisci valore';
82
+ }
83
+ /**
84
+ * Aggiunge una nuova regola di validazione con valori predefiniti.
85
+ */
86
+ addValidation() {
87
+ const updated = [...this.validations, { type: 'required', message: '' }];
88
+ this.emitChange(updated);
89
+ }
90
+ /**
91
+ * Rimuove la regola di validazione all'indice specificato.
92
+ * @param index - Indice della regola da rimuovere
93
+ */
94
+ removeValidation(index) {
95
+ const updated = this.validations.filter((_, i) => i !== index);
96
+ this.emitChange(updated);
97
+ }
98
+ /**
99
+ * Gestisce il cambio del tipo di validazione.
100
+ * Se il tipo diventa 'crossField', inizializza la configurazione cross-field.
101
+ * @param index - Indice della regola
102
+ * @param type - Nuovo tipo di validazione
103
+ */
104
+ onTypeChange(index, type) {
105
+ const updated = this.cloneValidations();
106
+ updated[index] = { ...updated[index], type };
107
+ // Inizializza la configurazione cross-field se necessario
108
+ if (type === 'crossField' && !updated[index].crossField) {
109
+ updated[index].crossField = {
110
+ targetField: '',
111
+ operator: 'greater_than',
112
+ dataType: 'number',
113
+ };
114
+ }
115
+ this.emitChange(updated);
116
+ }
117
+ /**
118
+ * Gestisce il cambio del valore della regola.
119
+ * @param index - Indice della regola
120
+ * @param value - Nuovo valore
121
+ */
122
+ onValueChange(index, value) {
123
+ const updated = this.cloneValidations();
124
+ updated[index] = { ...updated[index], value };
125
+ this.emitChange(updated);
126
+ }
127
+ /**
128
+ * Gestisce il cambio del messaggio di errore.
129
+ * @param index - Indice della regola
130
+ * @param message - Nuovo messaggio
131
+ */
132
+ onMessageChange(index, message) {
133
+ const updated = this.cloneValidations();
134
+ updated[index] = { ...updated[index], message };
135
+ this.emitChange(updated);
136
+ }
137
+ /**
138
+ * Gestisce il cambio del campo target nella configurazione cross-field.
139
+ * @param index - Indice della regola
140
+ * @param targetField - Nuova chiave del campo target
141
+ */
142
+ onCrossFieldTargetChange(index, targetField) {
143
+ const updated = this.cloneValidations();
144
+ updated[index] = {
145
+ ...updated[index],
146
+ crossField: {
147
+ ...updated[index].crossField,
148
+ targetField,
149
+ },
150
+ };
151
+ this.emitChange(updated);
152
+ }
153
+ /**
154
+ * Gestisce il cambio dell'operatore nella configurazione cross-field.
155
+ * @param index - Indice della regola
156
+ * @param operator - Nuovo operatore
157
+ */
158
+ onCrossFieldOperatorChange(index, operator) {
159
+ const updated = this.cloneValidations();
160
+ updated[index] = {
161
+ ...updated[index],
162
+ crossField: {
163
+ ...updated[index].crossField,
164
+ operator,
165
+ },
166
+ };
167
+ this.emitChange(updated);
168
+ }
169
+ /**
170
+ * Gestisce il cambio del tipo di dato nella configurazione cross-field.
171
+ * @param index - Indice della regola
172
+ * @param dataType - Nuovo tipo di dato ('date' | 'number')
173
+ */
174
+ onCrossFieldDataTypeChange(index, dataType) {
175
+ const updated = this.cloneValidations();
176
+ updated[index] = {
177
+ ...updated[index],
178
+ crossField: {
179
+ ...updated[index].crossField,
180
+ dataType,
181
+ },
182
+ };
183
+ this.emitChange(updated);
184
+ }
185
+ /**
186
+ * Clona l'array delle validazioni per garantire immutabilita.
187
+ * @returns Copia superficiale dell'array di validazioni
188
+ */
189
+ cloneValidations() {
190
+ return this.validations.map((v) => ({ ...v }));
191
+ }
192
+ /**
193
+ * Emette l'evento di cambio validazioni.
194
+ * @param validations - Nuova lista di validazioni
195
+ */
196
+ emitChange(validations) {
197
+ this.validations = validations;
198
+ this.validationsChange.emit(validations);
199
+ }
200
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiValidationEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
201
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiValidationEditorComponent, isStandalone: true, selector: "ui-validation-editor", inputs: { validations: "validations" }, outputs: { validationsChange: "validationsChange" }, ngImport: i0, template: `
202
+ <!-- Intestazione con titolo e pulsante aggiungi -->
203
+ <div class="ui-validation-editor__header">
204
+ <h4 class="ui-validation-editor__title">Regole di Validazione</h4>
205
+ <ui-button
206
+ icon="plus"
207
+ variant="ghost"
208
+ size="sm"
209
+ tooltip="Aggiungi regola di validazione"
210
+ ariaLabel="Aggiungi regola di validazione"
211
+ (click)="addValidation()"
212
+ />
213
+ </div>
214
+
215
+ <!-- Lista delle regole di validazione -->
216
+ @if (validations.length > 0) {
217
+ <div class="ui-validation-editor__list">
218
+ @for (rule of validations; track $index) {
219
+ <mat-card class="ui-validation-editor__card" appearance="outlined">
220
+ <mat-card-content>
221
+ <!-- Riga principale: tipo + elimina -->
222
+ <div class="ui-validation-editor__card-row">
223
+ <mat-form-field class="ui-validation-editor__field ui-validation-editor__field--type" appearance="outline">
224
+ <mat-label>Tipo</mat-label>
225
+ <mat-select
226
+ [ngModel]="rule.type"
227
+ (ngModelChange)="onTypeChange($index, $event)"
228
+ >
229
+ @for (opt of validationTypes; track opt.value) {
230
+ <mat-option [value]="opt.value">{{ opt.label }}</mat-option>
231
+ }
232
+ </mat-select>
233
+ </mat-form-field>
234
+
235
+ <ui-button
236
+ icon="trash-2"
237
+ variant="warn"
238
+ size="sm"
239
+ tooltip="Elimina regola"
240
+ ariaLabel="Elimina regola"
241
+ (click)="removeValidation($index)"
242
+ />
243
+ </div>
244
+
245
+ <!-- Campo valore (se il tipo lo richiede) -->
246
+ @if (requiresValue(rule.type)) {
247
+ <mat-form-field class="ui-validation-editor__field ui-validation-editor__field--full" appearance="outline">
248
+ <mat-label>Valore</mat-label>
249
+ <input
250
+ matInput
251
+ [ngModel]="rule.value"
252
+ (ngModelChange)="onValueChange($index, $event)"
253
+ [placeholder]="getValuePlaceholder(rule.type)"
254
+ />
255
+ </mat-form-field>
256
+ }
257
+
258
+ <!-- Configurazione cross-field -->
259
+ @if (rule.type === 'crossField') {
260
+ <div class="ui-validation-editor__cross-field">
261
+ <span class="ui-validation-editor__cross-field-label">
262
+ <lucide-icon name="git-compare" [size]="14" />
263
+ Configurazione cross-field
264
+ </span>
265
+
266
+ <mat-form-field class="ui-validation-editor__field ui-validation-editor__field--full" appearance="outline">
267
+ <mat-label>Campo di confronto</mat-label>
268
+ <input
269
+ matInput
270
+ [ngModel]="rule.crossField?.targetField || ''"
271
+ (ngModelChange)="onCrossFieldTargetChange($index, $event)"
272
+ placeholder="Chiave del campo target"
273
+ />
274
+ </mat-form-field>
275
+
276
+ <div class="ui-validation-editor__card-row">
277
+ <mat-form-field class="ui-validation-editor__field" appearance="outline">
278
+ <mat-label>Operatore</mat-label>
279
+ <mat-select
280
+ [ngModel]="rule.crossField?.operator || 'greater_than'"
281
+ (ngModelChange)="onCrossFieldOperatorChange($index, $event)"
282
+ >
283
+ @for (op of crossFieldOperators; track op.value) {
284
+ <mat-option [value]="op.value">{{ op.label }}</mat-option>
285
+ }
286
+ </mat-select>
287
+ </mat-form-field>
288
+
289
+ <mat-form-field class="ui-validation-editor__field" appearance="outline">
290
+ <mat-label>Tipo dato</mat-label>
291
+ <mat-select
292
+ [ngModel]="rule.crossField?.dataType || 'number'"
293
+ (ngModelChange)="onCrossFieldDataTypeChange($index, $event)"
294
+ >
295
+ <mat-option value="date">Data</mat-option>
296
+ <mat-option value="number">Numero</mat-option>
297
+ </mat-select>
298
+ </mat-form-field>
299
+ </div>
300
+ </div>
301
+ }
302
+
303
+ <!-- Messaggio di errore personalizzato -->
304
+ <mat-form-field class="ui-validation-editor__field ui-validation-editor__field--full" appearance="outline">
305
+ <mat-label>Messaggio di errore</mat-label>
306
+ <textarea
307
+ matInput
308
+ [ngModel]="rule.message || ''"
309
+ (ngModelChange)="onMessageChange($index, $event)"
310
+ placeholder="Messaggio personalizzato..."
311
+ rows="2"
312
+ ></textarea>
313
+ </mat-form-field>
314
+ </mat-card-content>
315
+ </mat-card>
316
+ }
317
+ </div>
318
+ } @else {
319
+ <!-- Stato vuoto -->
320
+ <div class="ui-validation-editor__empty">
321
+ <lucide-icon name="ruler" [size]="32" class="ui-validation-editor__empty-icon" />
322
+ <p class="ui-validation-editor__empty-text">Nessuna regola di validazione configurata.</p>
323
+ <p class="ui-validation-editor__empty-hint">
324
+ Clicca il pulsante "+" per aggiungere una regola.
325
+ </p>
326
+ </div>
327
+ }
328
+ `, isInline: true, styles: [":host{display:block}.ui-validation-editor__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--ui-spacing-3)}.ui-validation-editor__title{margin:0;font-size:var(--ui-font-size-sm);font-weight:600;color:var(--ui-color-text)}.ui-validation-editor__list{display:flex;flex-direction:column;gap:var(--ui-spacing-3)}.ui-validation-editor__card{background:var(--ui-color-surface);border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md);box-shadow:var(--ui-shadow-sm)}.ui-validation-editor__card-row{display:flex;align-items:flex-start;gap:var(--ui-spacing-2)}.ui-validation-editor__field{flex:1;width:100%}.ui-validation-editor__field--type{flex:1}.ui-validation-editor__field--full{width:100%}.ui-validation-editor__cross-field{border:1px dashed var(--ui-color-border);border-radius:var(--ui-radius-sm);padding:var(--ui-spacing-3);margin-bottom:var(--ui-spacing-2);background:var(--ui-color-bg-subtle)}.ui-validation-editor__cross-field-label{display:flex;align-items:center;gap:var(--ui-spacing-1);font-size:var(--ui-font-size-xs);font-weight:600;color:var(--ui-color-text-secondary);margin-bottom:var(--ui-spacing-2)}.ui-validation-editor__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--ui-spacing-6) var(--ui-spacing-4);border:1px dashed var(--ui-color-border);border-radius:var(--ui-radius-md);background:var(--ui-color-bg-subtle);text-align:center}.ui-validation-editor__empty-icon{color:var(--ui-color-text-muted);margin-bottom:var(--ui-spacing-2)}.ui-validation-editor__empty-text{margin:0;font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary)}.ui-validation-editor__empty-hint{margin:var(--ui-spacing-1) 0 0;font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i2.MatCardContent, selector: "mat-card-content" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i7.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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
329
+ }
330
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiValidationEditorComponent, decorators: [{
331
+ type: Component,
332
+ args: [{ selector: 'ui-validation-editor', standalone: true, imports: [
333
+ FormsModule,
334
+ MatCardModule,
335
+ MatFormFieldModule,
336
+ MatInputModule,
337
+ MatSelectModule,
338
+ LucideAngularModule,
339
+ UiButtonComponent,
340
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
341
+ <!-- Intestazione con titolo e pulsante aggiungi -->
342
+ <div class="ui-validation-editor__header">
343
+ <h4 class="ui-validation-editor__title">Regole di Validazione</h4>
344
+ <ui-button
345
+ icon="plus"
346
+ variant="ghost"
347
+ size="sm"
348
+ tooltip="Aggiungi regola di validazione"
349
+ ariaLabel="Aggiungi regola di validazione"
350
+ (click)="addValidation()"
351
+ />
352
+ </div>
353
+
354
+ <!-- Lista delle regole di validazione -->
355
+ @if (validations.length > 0) {
356
+ <div class="ui-validation-editor__list">
357
+ @for (rule of validations; track $index) {
358
+ <mat-card class="ui-validation-editor__card" appearance="outlined">
359
+ <mat-card-content>
360
+ <!-- Riga principale: tipo + elimina -->
361
+ <div class="ui-validation-editor__card-row">
362
+ <mat-form-field class="ui-validation-editor__field ui-validation-editor__field--type" appearance="outline">
363
+ <mat-label>Tipo</mat-label>
364
+ <mat-select
365
+ [ngModel]="rule.type"
366
+ (ngModelChange)="onTypeChange($index, $event)"
367
+ >
368
+ @for (opt of validationTypes; track opt.value) {
369
+ <mat-option [value]="opt.value">{{ opt.label }}</mat-option>
370
+ }
371
+ </mat-select>
372
+ </mat-form-field>
373
+
374
+ <ui-button
375
+ icon="trash-2"
376
+ variant="warn"
377
+ size="sm"
378
+ tooltip="Elimina regola"
379
+ ariaLabel="Elimina regola"
380
+ (click)="removeValidation($index)"
381
+ />
382
+ </div>
383
+
384
+ <!-- Campo valore (se il tipo lo richiede) -->
385
+ @if (requiresValue(rule.type)) {
386
+ <mat-form-field class="ui-validation-editor__field ui-validation-editor__field--full" appearance="outline">
387
+ <mat-label>Valore</mat-label>
388
+ <input
389
+ matInput
390
+ [ngModel]="rule.value"
391
+ (ngModelChange)="onValueChange($index, $event)"
392
+ [placeholder]="getValuePlaceholder(rule.type)"
393
+ />
394
+ </mat-form-field>
395
+ }
396
+
397
+ <!-- Configurazione cross-field -->
398
+ @if (rule.type === 'crossField') {
399
+ <div class="ui-validation-editor__cross-field">
400
+ <span class="ui-validation-editor__cross-field-label">
401
+ <lucide-icon name="git-compare" [size]="14" />
402
+ Configurazione cross-field
403
+ </span>
404
+
405
+ <mat-form-field class="ui-validation-editor__field ui-validation-editor__field--full" appearance="outline">
406
+ <mat-label>Campo di confronto</mat-label>
407
+ <input
408
+ matInput
409
+ [ngModel]="rule.crossField?.targetField || ''"
410
+ (ngModelChange)="onCrossFieldTargetChange($index, $event)"
411
+ placeholder="Chiave del campo target"
412
+ />
413
+ </mat-form-field>
414
+
415
+ <div class="ui-validation-editor__card-row">
416
+ <mat-form-field class="ui-validation-editor__field" appearance="outline">
417
+ <mat-label>Operatore</mat-label>
418
+ <mat-select
419
+ [ngModel]="rule.crossField?.operator || 'greater_than'"
420
+ (ngModelChange)="onCrossFieldOperatorChange($index, $event)"
421
+ >
422
+ @for (op of crossFieldOperators; track op.value) {
423
+ <mat-option [value]="op.value">{{ op.label }}</mat-option>
424
+ }
425
+ </mat-select>
426
+ </mat-form-field>
427
+
428
+ <mat-form-field class="ui-validation-editor__field" appearance="outline">
429
+ <mat-label>Tipo dato</mat-label>
430
+ <mat-select
431
+ [ngModel]="rule.crossField?.dataType || 'number'"
432
+ (ngModelChange)="onCrossFieldDataTypeChange($index, $event)"
433
+ >
434
+ <mat-option value="date">Data</mat-option>
435
+ <mat-option value="number">Numero</mat-option>
436
+ </mat-select>
437
+ </mat-form-field>
438
+ </div>
439
+ </div>
440
+ }
441
+
442
+ <!-- Messaggio di errore personalizzato -->
443
+ <mat-form-field class="ui-validation-editor__field ui-validation-editor__field--full" appearance="outline">
444
+ <mat-label>Messaggio di errore</mat-label>
445
+ <textarea
446
+ matInput
447
+ [ngModel]="rule.message || ''"
448
+ (ngModelChange)="onMessageChange($index, $event)"
449
+ placeholder="Messaggio personalizzato..."
450
+ rows="2"
451
+ ></textarea>
452
+ </mat-form-field>
453
+ </mat-card-content>
454
+ </mat-card>
455
+ }
456
+ </div>
457
+ } @else {
458
+ <!-- Stato vuoto -->
459
+ <div class="ui-validation-editor__empty">
460
+ <lucide-icon name="ruler" [size]="32" class="ui-validation-editor__empty-icon" />
461
+ <p class="ui-validation-editor__empty-text">Nessuna regola di validazione configurata.</p>
462
+ <p class="ui-validation-editor__empty-hint">
463
+ Clicca il pulsante "+" per aggiungere una regola.
464
+ </p>
465
+ </div>
466
+ }
467
+ `, styles: [":host{display:block}.ui-validation-editor__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--ui-spacing-3)}.ui-validation-editor__title{margin:0;font-size:var(--ui-font-size-sm);font-weight:600;color:var(--ui-color-text)}.ui-validation-editor__list{display:flex;flex-direction:column;gap:var(--ui-spacing-3)}.ui-validation-editor__card{background:var(--ui-color-surface);border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md);box-shadow:var(--ui-shadow-sm)}.ui-validation-editor__card-row{display:flex;align-items:flex-start;gap:var(--ui-spacing-2)}.ui-validation-editor__field{flex:1;width:100%}.ui-validation-editor__field--type{flex:1}.ui-validation-editor__field--full{width:100%}.ui-validation-editor__cross-field{border:1px dashed var(--ui-color-border);border-radius:var(--ui-radius-sm);padding:var(--ui-spacing-3);margin-bottom:var(--ui-spacing-2);background:var(--ui-color-bg-subtle)}.ui-validation-editor__cross-field-label{display:flex;align-items:center;gap:var(--ui-spacing-1);font-size:var(--ui-font-size-xs);font-weight:600;color:var(--ui-color-text-secondary);margin-bottom:var(--ui-spacing-2)}.ui-validation-editor__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--ui-spacing-6) var(--ui-spacing-4);border:1px dashed var(--ui-color-border);border-radius:var(--ui-radius-md);background:var(--ui-color-bg-subtle);text-align:center}.ui-validation-editor__empty-icon{color:var(--ui-color-text-muted);margin-bottom:var(--ui-spacing-2)}.ui-validation-editor__empty-text{margin:0;font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary)}.ui-validation-editor__empty-hint{margin:var(--ui-spacing-1) 0 0;font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}\n"] }]
468
+ }], propDecorators: { validations: [{
469
+ type: Input
470
+ }], validationsChange: [{
471
+ type: Output
472
+ }] } });
473
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXItZWRpdG9yL3N1Yi1jb21wb25lbnRzL3ZhbGlkYXRpb24tZWRpdG9yL3ZhbGlkYXRpb24tZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7O0FBdUIxRDs7Ozs7Ozs7R0FRRztBQW1QSCxNQUFNLE9BQU8sMkJBQTJCO0lBbFB4QztRQW1QRSxvREFBb0Q7UUFDM0MsZ0JBQVcsR0FBdUIsRUFBRSxDQUFDO1FBRTlDLHlEQUF5RDtRQUMvQyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUVyRSxzREFBc0Q7UUFDN0Msb0JBQWUsR0FBMkI7WUFDakQsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUU7WUFDNUMsRUFBRSxLQUFLLEVBQUUsT0FB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RSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssVUFBVSxDQUFDLFdBQStCO1FBQ2hELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0MsQ0FBQzsrR0E1TFUsMkJBQTJCO21HQUEzQiwyQkFBMkIsNktBck81Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStIVCxnMURBeElDLFdBQVcsOG1CQUNYLGFBQWEsME5BQ2Isa0JBQWtCLDBTQUNsQixjQUFjLDBXQUNkLGVBQWUsbXJCQUNmLG1CQUFtQixnUEFDbkIsaUJBQWlCOzs0RkF3T1IsMkJBQTJCO2tCQWxQdkMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQO3dCQUNQLFdBQVc7d0JBQ1gsYUFBYTt3QkFDYixrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDbEIsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErSFQ7OEJBd0dRLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0ksaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRDYXJkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2FyZCc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTHVjaWRlQW5ndWxhck1vZHVsZSB9IGZyb20gJ2x1Y2lkZS1hbmd1bGFyJztcclxuaW1wb3J0IHsgVWlCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9idXR0b24vaW5kZXgnO1xyXG5pbXBvcnQgeyBVaVZhbGlkYXRpb25SdWxlLCBVaVZhbGlkYXRpb25UeXBlLCBVaUNyb3NzRmllbGRPcGVyYXRvciB9IGZyb20gJy4uLy4uLy4uL2Zvcm0tYnVpbGRlci90eXBlcy9pbmRleCc7XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNjaWEgcGVyIGxlIG9wemlvbmkgZGVpIHRpcGkgZGkgdmFsaWRhemlvbmUgbmVsbGEgc2VsZWN0LlxyXG4gKi9cclxuaW50ZXJmYWNlIFZhbGlkYXRpb25UeXBlT3B0aW9uIHtcclxuICAvKiogVmFsb3JlIGRlbCB0aXBvIGRpIHZhbGlkYXppb25lLiAqL1xyXG4gIHZhbHVlOiBVaVZhbGlkYXRpb25UeXBlO1xyXG4gIC8qKiBFdGljaGV0dGEgdmlzdWFsaXp6YXRhIG5lbGxhIHNlbGVjdC4gKi9cclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNjaWEgcGVyIGxlIG9wemlvbmkgZGVnbGkgb3BlcmF0b3JpIGNyb3NzLWZpZWxkIG5lbGxhIHNlbGVjdC5cclxuICovXHJcbmludGVyZmFjZSBDcm9zc0ZpZWxkT3BlcmF0b3JPcHRpb24ge1xyXG4gIC8qKiBWYWxvcmUgZGVsbCdvcGVyYXRvcmUuICovXHJcbiAgdmFsdWU6IFVpQ3Jvc3NGaWVsZE9wZXJhdG9yO1xyXG4gIC8qKiBFdGljaGV0dGEgdmlzdWFsaXp6YXRhIG5lbGxhIHNlbGVjdC4gKi9cclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogRWRpdG9yIHBlciBsZSByZWdvbGUgZGkgdmFsaWRhemlvbmUgZGVpIGNhbXBpLlxyXG4gKlxyXG4gKiBQZXJtZXR0ZSBkaSBhZ2dpdW5nZXJlLCBtb2RpZmljYXJlIGUgcmltdW92ZXJlIHJlZ29sZSBkaSB2YWxpZGF6aW9uZVxyXG4gKiBwZXIgdW4gY2FtcG8gZGVsIGZvcm0gYnVpbGRlci4gU3VwcG9ydGEgdmFsaWRhemlvbmkgc3RhbmRhcmQsXHJcbiAqIGNyb3NzLWZpZWxkLCBkYXRlIGUgZmlsZS5cclxuICpcclxuICogQHNlbGVjdG9yIHVpLXZhbGlkYXRpb24tZWRpdG9yXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLXZhbGlkYXRpb24tZWRpdG9yJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0Q2FyZE1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTHVjaWRlQW5ndWxhck1vZHVsZSxcclxuICAgIFVpQnV0dG9uQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDwhLS0gSW50ZXN0YXppb25lIGNvbiB0aXRvbG8gZSBwdWxzYW50ZSBhZ2dpdW5naSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ1aS12YWxpZGF0aW9uLWVkaXRvcl9faGVhZGVyXCI+XHJcbiAgICAgIDxoNCBjbGFzcz1cInVpLXZhbGlkYXRpb24tZWRpdG9yX190aXRsZVwiPlJlZ29sZSBkaSBWYWxpZGF6aW9uZTwvaDQ+XHJcbiAgICAgIDx1aS1idXR0b25cclxuICAgICAgICBpY29uPVwicGx1c1wiXHJcbiAgICAgICAgdmFyaWFudD1cImdob3N0XCJcclxuICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgIHRvb2x0aXA9XCJBZ2dpdW5naSByZWdvbGEgZGkgdmFsaWRhemlvbmVcIlxyXG4gICAgICAgIGFyaWFMYWJlbD1cIkFnZ2l1bmdpIHJlZ29sYSBkaSB2YWxpZGF6aW9uZVwiXHJcbiAgICAgICAgKGNsaWNrKT1cImFkZFZhbGlkYXRpb24oKVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIExpc3RhIGRlbGxlIHJlZ29sZSBkaSB2YWxpZGF6aW9uZSAtLT5cclxuICAgIEBpZiAodmFsaWRhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktdmFsaWRhdGlvbi1lZGl0b3JfX2xpc3RcIj5cclxuICAgICAgICBAZm9yIChydWxlIG9mIHZhbGlkYXRpb25zOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cInVpLXZhbGlkYXRpb24tZWRpdG9yX19jYXJkXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCI+XHJcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICAgIDwhLS0gUmlnYSBwcmluY2lwYWxlOiB0aXBvICsgZWxpbWluYSAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktdmFsaWRhdGlvbi1lZGl0b3JfX2NhcmQtcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ1aS12YWxpZGF0aW9uLWVkaXRvcl9fZmllbGQgdWktdmFsaWRhdGlvbi1lZGl0b3JfX2ZpZWxkLS10eXBlXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5UaXBvPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicnVsZS50eXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblR5cGVDaGFuZ2UoJGluZGV4LCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKG9wdCBvZiB2YWxpZGF0aW9uVHlwZXM7IHRyYWNrIG9wdC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIm9wdC52YWx1ZVwiPnt7IG9wdC5sYWJlbCB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBpY29uPVwidHJhc2gtMlwiXHJcbiAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJ3YXJuXCJcclxuICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cIkVsaW1pbmEgcmVnb2xhXCJcclxuICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRWxpbWluYSByZWdvbGFcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlVmFsaWRhdGlvbigkaW5kZXgpXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gQ2FtcG8gdmFsb3JlIChzZSBpbCB0aXBvIGxvIHJpY2hpZWRlKSAtLT5cclxuICAgICAgICAgICAgICBAaWYgKHJlcXVpcmVzVmFsdWUocnVsZS50eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidWktdmFsaWRhdGlvbi1lZGl0b3JfX2ZpZWxkIHVpLXZhbGlkYXRpb24tZWRpdG9yX19maWVsZC0tZnVsbFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VmFsb3JlPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicnVsZS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkaW5kZXgsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRWYWx1ZVBsYWNlaG9sZGVyKHJ1bGUudHlwZSlcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gQ29uZmlndXJhemlvbmUgY3Jvc3MtZmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgQGlmIChydWxlLnR5cGUgPT09ICdjcm9zc0ZpZWxkJykge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLXZhbGlkYXRpb24tZWRpdG9yX19jcm9zcy1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVpLXZhbGlkYXRpb24tZWRpdG9yX19jcm9zcy1maWVsZC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwiZ2l0LWNvbXBhcmVcIiBbc2l6ZV09XCIxNFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhemlvbmUgY3Jvc3MtZmllbGRcclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidWktdmFsaWRhdGlvbi1lZGl0b3JfX2ZpZWxkIHVpLXZhbGlkYXRpb24tZWRpdG9yX19maWVsZC0tZnVsbFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5DYW1wbyBkaSBjb25mcm9udG88L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJydWxlLmNyb3NzRmllbGQ/LnRhcmdldEZpZWxkIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ3Jvc3NGaWVsZFRhcmdldENoYW5nZSgkaW5kZXgsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDaGlhdmUgZGVsIGNhbXBvIHRhcmdldFwiXHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS12YWxpZGF0aW9uLWVkaXRvcl9fY2FyZC1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ1aS12YWxpZGF0aW9uLWVkaXRvcl9fZmllbGRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5PcGVyYXRvcmU8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJ1bGUuY3Jvc3NGaWVsZD8ub3BlcmF0b3IgfHwgJ2dyZWF0ZXJfdGhhbidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNyb3NzRmllbGRPcGVyYXRvckNoYW5nZSgkaW5kZXgsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChvcCBvZiBjcm9zc0ZpZWxkT3BlcmF0b3JzOyB0cmFjayBvcC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJvcC52YWx1ZVwiPnt7IG9wLmxhYmVsIH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidWktdmFsaWRhdGlvbi1lZGl0b3JfX2ZpZWxkXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VGlwbyBkYXRvPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJydWxlLmNyb3NzRmllbGQ/LmRhdGFUeXBlIHx8ICdudW1iZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Dcm9zc0ZpZWxkRGF0YVR5cGVDaGFuZ2UoJGluZGV4LCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJkYXRlXCI+RGF0YTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJudW1iZXJcIj5OdW1lcm88L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gTWVzc2FnZ2lvIGRpIGVycm9yZSBwZXJzb25hbGl6emF0byAtLT5cclxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ1aS12YWxpZGF0aW9uLWVkaXRvcl9fZmllbGQgdWktdmFsaWRhdGlvbi1lZGl0b3JfX2ZpZWxkLS1mdWxsXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+TWVzc2FnZ2lvIGRpIGVycm9yZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJ1bGUubWVzc2FnZSB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWVzc2FnZUNoYW5nZSgkaW5kZXgsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk1lc3NhZ2dpbyBwZXJzb25hbGl6emF0by4uLlwiXHJcbiAgICAgICAgICAgICAgICAgIHJvd3M9XCIyXCJcclxuICAgICAgICAgICAgICAgID48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICAgIDwvbWF0LWNhcmQ+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIH0gQGVsc2Uge1xyXG4gICAgICA8IS0tIFN0YXRvIHZ1b3RvIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktdmFsaWRhdGlvbi1lZGl0b3JfX2VtcHR5XCI+XHJcbiAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJydWxlclwiIFtzaXplXT1cIjMyXCIgY2xhc3M9XCJ1aS12YWxpZGF0aW9uLWVkaXRvcl9fZW1wdHktaWNvblwiIC8+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJ1aS12YWxpZGF0aW9uLWVkaXRvcl9fZW1wdHktdGV4dFwiPk5lc3N1bmEgcmVnb2xhIGRpIHZhbGlkYXppb25lIGNvbmZpZ3VyYXRhLjwvcD5cclxuICAgICAgICA8cCBjbGFzcz1cInVpLXZhbGlkYXRpb24tZWRpdG9yX19lbXB0eS1oaW50XCI+XHJcbiAgICAgICAgICBDbGljY2EgaWwgcHVsc2FudGUgXCIrXCIgcGVyIGFnZ2l1bmdlcmUgdW5hIHJlZ29sYS5cclxuICAgICAgICA8L3A+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXHJcbiAgICBgXHJcbiAgICA6aG9zdCB7XHJcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgfVxyXG5cclxuICAgIC51aS12YWxpZGF0aW9uLWVkaXRvcl9faGVhZGVyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS11aS1zcGFjaW5nLTMpO1xyXG4gICAgfVxyXG5cclxuICAgIC51aS12YWxpZGF0aW9uLWVkaXRvcl9fdGl0bGUge1xyXG4gICAgICBtYXJnaW46IDA7XHJcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdWktZm9udC1zaXplLXNtKTtcclxuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICAgICAgY29sb3I6IHZhcigtLXVpLWNvbG9yLXRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC51aS12YWxpZGF0aW9uLWVkaXRvcl9fbGlzdCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIGdhcDogdmFyKC0tdWktc3BhY2luZy0zKTtcclxuICAgIH1cclxuXHJcbiAgICAudWktdmFsaWRhdGlvbi1lZGl0b3JfX2NhcmQge1xyXG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS11aS1jb2xvci1zdXJmYWNlKTtcclxuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tdWktY29sb3ItYm9yZGVyKTtcclxuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdWktcmFkaXVzLW1kKTtcclxuICAgICAgYm94LXNoYWRvdzogdmFyKC0tdWktc2hhZG93LXNtKTtcclxuICAgIH1cclxuXHJcbiAgICAudWktdmFsaWRhdGlvbi1lZGl0b3JfX2NhcmQtcm93IHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XHJcbiAgICAgIGdhcDogdmFyKC0tdWktc3BhY2luZy0yKTtcclxuICAgIH1cclxuXHJcbiAgICAudWktdmFsaWRhdGlvbi1lZGl0b3JfX2ZpZWxkIHtcclxuICAgICAgZmxleDogMTtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLnVpLXZhbGlkYXRpb24tZWRpdG9yX19maWVsZC0tdHlwZSB7XHJcbiAgICAgIGZsZXg6IDE7XHJcbiAgICB9XHJcblxyXG4gICAgLnVpLXZhbGlkYXRpb24tZWRpdG9yX19maWVsZC0tZnVsbCB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC51aS12YWxpZGF0aW9uLWVkaXRvcl9fY3Jvc3MtZmllbGQge1xyXG4gICAgICBib3JkZXI6IDFweCBkYXNoZWQgdmFyKC0tdWktY29sb3ItYm9yZGVyKTtcclxuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdWktcmFkaXVzLXNtKTtcclxuICAgICAgcGFkZGluZzogdmFyKC0tdWktc3BhY2luZy0zKTtcclxuICAgICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tdWktc3BhY2luZy0yKTtcclxuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdWktY29sb3ItYmctc3VidGxlKTtcclxuICAgIH1cclxuXHJcbiAgICAudWktdmFsaWRhdGlvbi1lZGl0b3JfX2Nyb3NzLWZpZWxkLWxhYmVsIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgZ2FwOiB2YXIoLS11aS1zcGFjaW5nLTEpO1xyXG4gICAgICBmb250LXNpemU6IHZhcigtLXVpLWZvbnQtc2l6ZS14cyk7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LXNlY29uZGFyeSk7XHJcbiAgICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXVpLXNwYWNpbmctMik7XHJcbiAgICB9XHJcblxyXG4gICAgLnVpLXZhbGlkYXRpb24tZWRpdG9yX19lbXB0eSB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBwYWRkaW5nOiB2YXIoLS11aS1zcGFjaW5nLTYpIHZhcigtLXVpLXNwYWNpbmctNCk7XHJcbiAgICAgIGJvcmRlcjogMXB4IGRhc2hlZCB2YXIoLS11aS1jb2xvci1ib3JkZXIpO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11aS1yYWRpdXMtbWQpO1xyXG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS11aS1jb2xvci1iZy1zdWJ0bGUpO1xyXG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLnVpLXZhbGlkYXRpb24tZWRpdG9yX19lbXB0eS1pY29uIHtcclxuICAgICAgY29sb3I6IHZhcigtLXVpLWNvbG9yLXRleHQtbXV0ZWQpO1xyXG4gICAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS11aS1zcGFjaW5nLTIpO1xyXG4gICAgfVxyXG5cclxuICAgIC51aS12YWxpZGF0aW9uLWVkaXRvcl9fZW1wdHktdGV4dCB7XHJcbiAgICAgIG1hcmdpbjogMDtcclxuICAgICAgZm9udC1zaXplOiB2YXIoLS11aS1mb250LXNpemUtc20pO1xyXG4gICAgICBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dC1zZWNvbmRhcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIC51aS12YWxpZGF0aW9uLWVkaXRvcl9fZW1wdHktaGludCB7XHJcbiAgICAgIG1hcmdpbjogdmFyKC0tdWktc3BhY2luZy0xKSAwIDA7XHJcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdWktZm9udC1zaXplLXhzKTtcclxuICAgICAgY29sb3I6IHZhcigtLXVpLWNvbG9yLXRleHQtbXV0ZWQpO1xyXG4gICAgfVxyXG4gIGAsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpVmFsaWRhdGlvbkVkaXRvckNvbXBvbmVudCB7XHJcbiAgLyoqIExpc3RhIGRlbGxlIHJlZ29sZSBkaSB2YWxpZGF6aW9uZSBkYSBlZGl0YXJlLiAqL1xyXG4gIEBJbnB1dCgpIHZhbGlkYXRpb25zOiBVaVZhbGlkYXRpb25SdWxlW10gPSBbXTtcclxuXHJcbiAgLyoqIEVtZXNzbyBxdWFuZG8gbGEgbGlzdGEgZGkgcmVnb2xlIHZpZW5lIG1vZGlmaWNhdGEuICovXHJcbiAgQE91dHB1dCgpIHZhbGlkYXRpb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVZhbGlkYXRpb25SdWxlW10+KCk7XHJcblxyXG4gIC8qKiBPcHppb25pIGRpc3BvbmliaWxpIHBlciBpbCB0aXBvIGRpIHZhbGlkYXppb25lLiAqL1xyXG4gIHJlYWRvbmx5IHZhbGlkYXRpb25UeXBlczogVmFsaWRhdGlvblR5cGVPcHRpb25bXSA9IFtcclxuICAgIHsgdmFsdWU6ICdyZXF1aXJlZCcsIGxhYmVsOiAnT2JibGlnYXRvcmlvJyB9LFxyXG4gICAgeyB2YWx1ZTogJ2VtYWlsJywgbGFiZWw6ICdFbWFpbCcgfSxcclxuICAgIHsgdmFsdWU6ICdtaW4nLCBsYWJlbDogJ1ZhbG9yZSBtaW5pbW8nIH0sXHJcbiAgICB7IHZhbHVlOiAnbWF4JywgbGFiZWw6ICdWYWxvcmUgbWFzc2ltbycgfSxcclxuICAgIHsgdmFsdWU6ICdtaW5MZW5ndGgnLCBsYWJlbDogJ0x1bmdoZXp6YSBtaW5pbWEnIH0sXHJcbiAgICB7IHZhbHVlOiAnbWF4TGVuZ3RoJywgbGFiZWw6ICdMdW5naGV6emEgbWFzc2ltYScgfSxcclxuICAgIHsgdmFsdWU6ICdwYXR0ZXJuJywgbGFiZWw6ICdQYXR0ZXJuIChyZWdleCknIH0sXHJcbiAgICB7IHZhbHVlOiAnY3Jvc3NGaWVsZCcsIGxhYmVsOiAnQ3Jvc3MtZmllbGQnIH0sXHJcbiAgICB7IHZhbHVlOiAnZGF0ZS1taW4nLCBsYWJlbDogJ0RhdGEgbWluaW1hJyB9LFxyXG4gICAgeyB2YWx1ZTogJ2RhdGUtbWF4JywgbGFiZWw6ICdEYXRhIG1hc3NpbWEnIH0sXHJcbiAgICB7IHZhbHVlOiAnZmlsZVNpemUnLCBsYWJlbDogJ0RpbWVuc2lvbmUgZmlsZScgfSxcclxuICAgIHsgdmFsdWU6ICdmaWxlVHlwZScsIGxhYmVsOiAnVGlwbyBmaWxlJyB9LFxyXG4gICAgeyB2YWx1ZTogJ2ZpbGVDb3VudCcsIGxhYmVsOiAnTnVtZXJvIGZpbGUnIH0sXHJcbiAgXTtcclxuXHJcbiAgLyoqIE9wemlvbmkgcGVyIGdsaSBvcGVyYXRvcmkgZGkgY29uZnJvbnRvIGNyb3NzLWZpZWxkLiAqL1xyXG4gIHJlYWRvbmx5IGNyb3NzRmllbGRPcGVyYXRvcnM6IENyb3NzRmllbGRPcGVyYXRvck9wdGlvbltdID0gW1xyXG4gICAgeyB2YWx1ZTogJ2dyZWF0ZXJfdGhhbicsIGxhYmVsOiAnTWFnZ2lvcmUgZGknIH0sXHJcbiAgICB7IHZhbHVlOiAnZ3JlYXRlcl9lcXVhbCcsIGxhYmVsOiAnTWFnZ2lvcmUgbyB1Z3VhbGUnIH0sXHJcbiAgICB7IHZhbHVlOiAnbGVzc190aGFuJywgbGFiZWw6ICdNaW5vcmUgZGknIH0sXHJcbiAgICB7IHZhbHVlOiAnbGVzc19lcXVhbCcsIGxhYmVsOiAnTWlub3JlIG8gdWd1YWxlJyB9LFxyXG4gICAgeyB2YWx1ZTogJ25vdF9lcXVhbCcsIGxhYmVsOiAnRGl2ZXJzbyBkYScgfSxcclxuICBdO1xyXG5cclxuICAvKipcclxuICAgKiBWZXJpZmljYSBzZSBpbCB0aXBvIGRpIHZhbGlkYXppb25lIHJpY2hpZWRlIHVuIGNhbXBvIHZhbG9yZS5cclxuICAgKiBAcGFyYW0gdHlwZSAtIFRpcG8gZGkgdmFsaWRhemlvbmUgZGEgdmVyaWZpY2FyZVxyXG4gICAqIEByZXR1cm5zIHRydWUgc2UgaWwgdGlwbyByaWNoaWVkZSB1biB2YWxvcmVcclxuICAgKi9cclxuICByZXF1aXJlc1ZhbHVlKHR5cGU6IFVpVmFsaWRhdGlvblR5cGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBbJ21pbicsICdtYXgnLCAnbWluTGVuZ3RoJywgJ21heExlbmd0aCcsICdwYXR0ZXJuJywgJ2ZpbGVTaXplJywgJ2ZpbGVDb3VudCddLmluY2x1ZGVzKHR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzdGl0dWlzY2UgaWwgcGxhY2Vob2xkZXIgYXBwcm9wcmlhdG8gcGVyIGlsIGNhbXBvIHZhbG9yZVxyXG4gICAqIGluIGJhc2UgYWwgdGlwbyBkaSB2YWxpZGF6aW9uZSBzZWxlemlvbmF0by5cclxuICAgKiBAcGFyYW0gdHlwZSAtIFRpcG8gZGkgdmFsaWRhemlvbmVcclxuICAgKiBAcmV0dXJucyBTdHJpbmdhIHBsYWNlaG9sZGVyXHJcbiAgICovXHJcbiAgZ2V0VmFsdWVQbGFjZWhvbGRlcih0eXBlOiBVaVZhbGlkYXRpb25UeXBlKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBsYWNlaG9sZGVyczogUGFydGlhbDxSZWNvcmQ8VWlWYWxpZGF0aW9uVHlwZSwgc3RyaW5nPj4gPSB7XHJcbiAgICAgIG1pbjogJ1ZhbG9yZSBudW1lcmljbyBtaW5pbW8nLFxyXG4gICAgICBtYXg6ICdWYWxvcmUgbnVtZXJpY28gbWFzc2ltbycsXHJcbiAgICAgIG1pbkxlbmd0aDogJ0x1bmdoZXp6YSBtaW5pbWEgKG51bWVybyknLFxyXG4gICAgICBtYXhMZW5ndGg6ICdMdW5naGV6emEgbWFzc2ltYSAobnVtZXJvKScsXHJcbiAgICAgIHBhdHRlcm46ICdFc3ByZXNzaW9uZSByZWdvbGFyZSAocmVnZXgpJyxcclxuICAgICAgZmlsZVNpemU6ICdEaW1lbnNpb25lIG1hc3NpbWEgaW4gYnl0ZXMnLFxyXG4gICAgICBmaWxlQ291bnQ6ICdOdW1lcm8gbWFzc2ltbyBkaSBmaWxlJyxcclxuICAgIH07XHJcbiAgICByZXR1cm4gcGxhY2Vob2xkZXJzW3R5cGVdIHx8ICdJbnNlcmlzY2kgdmFsb3JlJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFnZ2l1bmdlIHVuYSBudW92YSByZWdvbGEgZGkgdmFsaWRhemlvbmUgY29uIHZhbG9yaSBwcmVkZWZpbml0aS5cclxuICAgKi9cclxuICBhZGRWYWxpZGF0aW9uKCk6IHZvaWQge1xyXG4gICAgY29uc3QgdXBkYXRlZDogVWlWYWxpZGF0aW9uUnVsZVtdID0gWy4uLnRoaXMudmFsaWRhdGlvbnMsIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJycgfV07XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UodXBkYXRlZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaW11b3ZlIGxhIHJlZ29sYSBkaSB2YWxpZGF6aW9uZSBhbGwnaW5kaWNlIHNwZWNpZmljYXRvLlxyXG4gICAqIEBwYXJhbSBpbmRleCAtIEluZGljZSBkZWxsYSByZWdvbGEgZGEgcmltdW92ZXJlXHJcbiAgICovXHJcbiAgcmVtb3ZlVmFsaWRhdGlvbihpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy52YWxpZGF0aW9ucy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcclxuICAgIHRoaXMuZW1pdENoYW5nZSh1cGRhdGVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlc3Rpc2NlIGlsIGNhbWJpbyBkZWwgdGlwbyBkaSB2YWxpZGF6aW9uZS5cclxuICAgKiBTZSBpbCB0aXBvIGRpdmVudGEgJ2Nyb3NzRmllbGQnLCBpbml6aWFsaXp6YSBsYSBjb25maWd1cmF6aW9uZSBjcm9zcy1maWVsZC5cclxuICAgKiBAcGFyYW0gaW5kZXggLSBJbmRpY2UgZGVsbGEgcmVnb2xhXHJcbiAgICogQHBhcmFtIHR5cGUgLSBOdW92byB0aXBvIGRpIHZhbGlkYXppb25lXHJcbiAgICovXHJcbiAgb25UeXBlQ2hhbmdlKGluZGV4OiBudW1iZXIsIHR5cGU6IFVpVmFsaWRhdGlvblR5cGUpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVwZGF0ZWQgPSB0aGlzLmNsb25lVmFsaWRhdGlvbnMoKTtcclxuICAgIHVwZGF0ZWRbaW5kZXhdID0geyAuLi51cGRhdGVkW2luZGV4XSwgdHlwZSB9O1xyXG5cclxuICAgIC8vIEluaXppYWxpenphIGxhIGNvbmZpZ3VyYXppb25lIGNyb3NzLWZpZWxkIHNlIG5lY2Vzc2FyaW9cclxuICAgIGlmICh0eXBlID09PSAnY3Jvc3NGaWVsZCcgJiYgIXVwZGF0ZWRbaW5kZXhdLmNyb3NzRmllbGQpIHtcclxuICAgICAgdXBkYXRlZFtpbmRleF0uY3Jvc3NGaWVsZCA9IHtcclxuICAgICAgICB0YXJnZXRGaWVsZDogJycsXHJcbiAgICAgICAgb3BlcmF0b3I6ICdncmVhdGVyX3RoYW4nLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnbnVtYmVyJyxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UodXBkYXRlZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXN0aXNjZSBpbCBjYW1iaW8gZGVsIHZhbG9yZSBkZWxsYSByZWdvbGEuXHJcbiAgICogQHBhcmFtIGluZGV4IC0gSW5kaWNlIGRlbGxhIHJlZ29sYVxyXG4gICAqIEBwYXJhbSB2YWx1ZSAtIE51b3ZvIHZhbG9yZVxyXG4gICAqL1xyXG4gIG9uVmFsdWVDaGFuZ2UoaW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMuY2xvbmVWYWxpZGF0aW9ucygpO1xyXG4gICAgdXBkYXRlZFtpbmRleF0gPSB7IC4uLnVwZGF0ZWRbaW5kZXhdLCB2YWx1ZSB9O1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHVwZGF0ZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlzY2UgaWwgY2FtYmlvIGRlbCBtZXNzYWdnaW8gZGkgZXJyb3JlLlxyXG4gICAqIEBwYXJhbSBpbmRleCAtIEluZGljZSBkZWxsYSByZWdvbGFcclxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIE51b3ZvIG1lc3NhZ2dpb1xyXG4gICAqL1xyXG4gIG9uTWVzc2FnZUNoYW5nZShpbmRleDogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVwZGF0ZWQgPSB0aGlzLmNsb25lVmFsaWRhdGlvbnMoKTtcclxuICAgIHVwZGF0ZWRbaW5kZXhdID0geyAuLi51cGRhdGVkW2luZGV4XSwgbWVzc2FnZSB9O1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHVwZGF0ZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlzY2UgaWwgY2FtYmlvIGRlbCBjYW1wbyB0YXJnZXQgbmVsbGEgY29uZmlndXJhemlvbmUgY3Jvc3MtZmllbGQuXHJcbiAgICogQHBhcmFtIGluZGV4IC0gSW5kaWNlIGRlbGxhIHJlZ29sYVxyXG4gICAqIEBwYXJhbSB0YXJnZXRGaWVsZCAtIE51b3ZhIGNoaWF2ZSBkZWwgY2FtcG8gdGFyZ2V0XHJcbiAgICovXHJcbiAgb25Dcm9zc0ZpZWxkVGFyZ2V0Q2hhbmdlKGluZGV4OiBudW1iZXIsIHRhcmdldEZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVwZGF0ZWQgPSB0aGlzLmNsb25lVmFsaWRhdGlvbnMoKTtcclxuICAgIHVwZGF0ZWRbaW5kZXhdID0ge1xyXG4gICAgICAuLi51cGRhdGVkW2luZGV4XSxcclxuICAgICAgY3Jvc3NGaWVsZDoge1xyXG4gICAgICAgIC4uLnVwZGF0ZWRbaW5kZXhdLmNyb3NzRmllbGQhLFxyXG4gICAgICAgIHRhcmdldEZpZWxkLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMuZW1pdENoYW5nZSh1cGRhdGVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlc3Rpc2NlIGlsIGNhbWJpbyBkZWxsJ29wZXJhdG9yZSBuZWxsYSBjb25maWd1cmF6aW9uZSBjcm9zcy1maWVsZC5cclxuICAgKiBAcGFyYW0gaW5kZXggLSBJbmRpY2UgZGVsbGEgcmVnb2xhXHJcbiAgICogQHBhcmFtIG9wZXJhdG9yIC0gTnVvdm8gb3BlcmF0b3JlXHJcbiAgICovXHJcbiAgb25Dcm9zc0ZpZWxkT3BlcmF0b3JDaGFuZ2UoaW5kZXg6IG51bWJlciwgb3BlcmF0b3I6IFVpQ3Jvc3NGaWVsZE9wZXJhdG9yKTogdm9pZCB7XHJcbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5jbG9uZVZhbGlkYXRpb25zKCk7XHJcbiAgICB1cGRhdGVkW2luZGV4XSA9IHtcclxuICAgICAgLi4udXBkYXRlZFtpbmRleF0sXHJcbiAgICAgIGNyb3NzRmllbGQ6IHtcclxuICAgICAgICAuLi51cGRhdGVkW2luZGV4XS5jcm9zc0ZpZWxkISxcclxuICAgICAgICBvcGVyYXRvcixcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UodXBkYXRlZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXN0aXNjZSBpbCBjYW1iaW8gZGVsIHRpcG8gZGkgZGF0byBuZWxsYSBjb25maWd1cmF6aW9uZSBjcm9zcy1maWVsZC5cclxuICAgKiBAcGFyYW0gaW5kZXggLSBJbmRpY2UgZGVsbGEgcmVnb2xhXHJcbiAgICogQHBhcmFtIGRhdGFUeXBlIC0gTnVvdm8gdGlwbyBkaSBkYXRvICgnZGF0ZScgfCAnbnVtYmVyJylcclxuICAgKi9cclxuICBvbkNyb3NzRmllbGREYXRhVHlwZUNoYW5nZShpbmRleDogbnVtYmVyLCBkYXRhVHlwZTogJ2RhdGUnIHwgJ251bWJlcicpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVwZGF0ZWQgPSB0aGlzLmNsb25lVmFsaWRhdGlvbnMoKTtcclxuICAgIHVwZGF0ZWRbaW5kZXhdID0ge1xyXG4gICAgICAuLi51cGRhdGVkW2luZGV4XSxcclxuICAgICAgY3Jvc3NGaWVsZDoge1xyXG4gICAgICAgIC4uLnVwZGF0ZWRbaW5kZXhdLmNyb3NzRmllbGQhLFxyXG4gICAgICAgIGRhdGFUeXBlLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMuZW1pdENoYW5nZSh1cGRhdGVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb25hIGwnYXJyYXkgZGVsbGUgdmFsaWRhemlvbmkgcGVyIGdhcmFudGlyZSBpbW11dGFiaWxpdGEuXHJcbiAgICogQHJldHVybnMgQ29waWEgc3VwZXJmaWNpYWxlIGRlbGwnYXJyYXkgZGkgdmFsaWRhemlvbmlcclxuICAgKi9cclxuICBwcml2YXRlIGNsb25lVmFsaWRhdGlvbnMoKTogVWlWYWxpZGF0aW9uUnVsZVtdIHtcclxuICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25zLm1hcCgodikgPT4gKHsgLi4udiB9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbWV0dGUgbCdldmVudG8gZGkgY2FtYmlvIHZhbGlkYXppb25pLlxyXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9ucyAtIE51b3ZhIGxpc3RhIGRpIHZhbGlkYXppb25pXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlKHZhbGlkYXRpb25zOiBVaVZhbGlkYXRpb25SdWxlW10pOiB2b2lkIHtcclxuICAgIHRoaXMudmFsaWRhdGlvbnMgPSB2YWxpZGF0aW9ucztcclxuICAgIHRoaXMudmFsaWRhdGlvbnNDaGFuZ2UuZW1pdCh2YWxpZGF0aW9ucyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @module ng-ui-system/form-builder-editor
3
+ * Tipi e interfacce per l'editor visuale del form builder.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXItZWRpdG9yL3R5cGVzL2VkaXRvci50eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0ciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgbmctdWktc3lzdGVtL2Zvcm0tYnVpbGRlci1lZGl0b3JcbiAqIFRpcGkgZSBpbnRlcmZhY2NlIHBlciBsJ2VkaXRvciB2aXN1YWxlIGRlbCBmb3JtIGJ1aWxkZXIuXG4gKi9cblxuaW1wb3J0IHsgVWlGaWVsZFR5cGUsIFVpRm9ybVNjaGVtYSB9IGZyb20gJy4uLy4uL2Zvcm0tYnVpbGRlci90eXBlcy9pbmRleCc7XG5pbXBvcnQgeyBVaUljb25OYW1lIH0gZnJvbSAnLi4vLi4vLi4vY29yZS90eXBlcyc7XG5cbi8vIOKUgOKUgOKUgCBTdGF0byBkZWxsJ2VkaXRvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBTdGF0byBjb3JyZW50ZSBkZWxsJ2VkaXRvci5cbiAqIEdlc3RpdG8gZGFsIHNlcnZpemlvIFVpRWRpdG9yU3RhdGVTZXJ2aWNlIHRyYW1pdGUgQmVoYXZpb3JTdWJqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVpRWRpdG9yU3RhdGUge1xuICAvKiogU2NoZW1hIGRlbCBmb3JtIGluIGZhc2UgZGkgZWRpdGluZy4gKi9cbiAgc2NoZW1hOiBVaUZvcm1TY2hlbWE7XG4gIC8qKiBJRCBkZWxsYSBzZXppb25lIGF0dHVhbG1lbnRlIHNlbGV6aW9uYXRhLiAqL1xuICBzZWxlY3RlZFNlY3Rpb25JZDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIENoaWF2ZSBkZWwgY2FtcG8gYXR0dWFsbWVudGUgc2VsZXppb25hdG8uICovXG4gIHNlbGVjdGVkRmllbGRLZXk6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBJbmRpY2Egc2UgbG8gc2NoZW1hIGUgc3RhdG8gbW9kaWZpY2F0byBkYWxsJ3VsdGltbyBzYWx2YXRhZ2dpby4gKi9cbiAgaXNEaXJ0eTogYm9vbGVhbjtcbiAgLyoqIERhdGEgZGVsbCd1bHRpbW8gc2FsdmF0YWdnaW8uICovXG4gIGxhc3RTYXZlZDogRGF0ZSB8IG51bGw7XG59XG5cbi8vIOKUgOKUgOKUgCBQYWxldHRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIENhdGVnb3JpZSBwZXIgcmFnZ3J1cHBhcmUgaSB0aXBpIGRpIGNhbXBvIG5lbGxhIHBhbGV0dGUuXG4gKi9cbmV4cG9ydCB0eXBlIFVpRWRpdG9yRmllbGRDYXRlZ29yeSA9ICdiYXNpYycgfCAnY2hvaWNlJyB8ICdkYXRldGltZScgfCAnYWR2YW5jZWQnIHwgJ2N1c3RvbSc7XG5cbi8qKlxuICogRWxlbWVudG8gZGVsbGEgcGFsZXR0ZSBkZWkgdGlwaSBkaSBjYW1wby5cbiAqIFJhcHByZXNlbnRhIHVuIHRpcG8gZGkgY2FtcG8gdHJhc2NpbmFiaWxlIG5lbGxhIHBhbGV0dGUgbGF0ZXJhbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVWlFZGl0b3JGaWVsZFBhbGV0dGVJdGVtIHtcbiAgLyoqIFRpcG8gZGkgY2FtcG8uICovXG4gIHR5cGU6IFVpRmllbGRUeXBlO1xuICAvKiogTm9tZSB2aXN1YWxpenphdG8gbmVsbGEgcGFsZXR0ZS4gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIEljb25hIEx1Y2lkZSBkYSBtb3N0cmFyZS4gKi9cbiAgaWNvbjogVWlJY29uTmFtZTtcbiAgLyoqIERlc2NyaXppb25lIGJyZXZlIGRlbCB0aXBvIGRpIGNhbXBvLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKiogQ2F0ZWdvcmlhIGRpIGFwcGFydGVuZW56YS4gKi9cbiAgY2F0ZWdvcnk6IFVpRWRpdG9yRmllbGRDYXRlZ29yeTtcbn1cblxuLyoqXG4gKiBDYW1wbyBkaXNwb25pYmlsZSBwZXIgbGEgc2VsZXppb25lIG5lbGxlIGNvbmRpemlvbmkuXG4gKiBWZXJzaW9uZSBzZW1wbGlmaWNhdGEgZGVsIGZpZWxkIGRlc2NyaXB0b3IgcGVyIGxlIHNlbGVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVaUVkaXRvckF2YWlsYWJsZUZpZWxkIHtcbiAgLyoqIENoaWF2ZSB1bml2b2NhIGRlbCBjYW1wby4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIC8qKiBMYWJlbCB2aXN1YWxpenphdGEuICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBUaXBvIGRpIGNhbXBvLiAqL1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBPcHppb25pIChwZXIgY2FtcGkgc2VsZWN0LCByYWRpbywgZXRjLikuICovXG4gIG9wdGlvbnM/OiB7IHZhbHVlOiBhbnk7IGxhYmVsOiBzdHJpbmcgfVtdO1xufVxuXG4vLyDilIDilIDilIAgQnJlYWRjcnVtYiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBFbGVtZW50byBkZWwgYnJlYWRjcnVtYiBkaSBuYXZpZ2F6aW9uZSBkZWxsJ2VkaXRvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVaUVkaXRvckJyZWFkY3J1bWJJdGVtIHtcbiAgLyoqIExhYmVsIHZpc3VhbGl6emF0YS4gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIElEIGRlbGwnZWxlbWVudG8gKGZvcm0sIHNlemlvbmUgbyBjYW1wbykuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaXBvIGRpIGVsZW1lbnRvLiAqL1xuICB0eXBlOiAnZm9ybScgfCAnc2VjdGlvbicgfCAnZmllbGQnO1xuICAvKiogU2UgZSBsJ2VsZW1lbnRvIGF0dHVhbG1lbnRlIGF0dGl2by4gKi9cbiAgYWN0aXZlOiBib29sZWFuO1xufVxuXG4vLyDilIDilIDilIAgUGVyc2lzdGVuemEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogU3RydXR0dXJhIGRhdGkgcGVyIGlsIHNhbHZhdGFnZ2lvIG5lbCBsb2NhbFN0b3JhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVWlFZGl0b3JTdG9yYWdlRGF0YSB7XG4gIC8qKiBTY2hlbWEgc2FsdmF0by4gKi9cbiAgc2NoZW1hOiBVaUZvcm1TY2hlbWE7XG4gIC8qKiBUaW1lc3RhbXAgZGVsIHNhbHZhdGFnZ2lvIChlcG9jaCBtcykuICovXG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICAvKiogVmVyc2lvbmUgZGVsbG8gc3RvcmFnZSBwZXIgY29tcGF0aWJpbGl0YSBmdXR1cmEuICovXG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLy8g4pSA4pSA4pSAIFZhbGlkYXppb25lIGRlbGxvIHNjaGVtYSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBSaXN1bHRhdG8gZGVsbGEgdmFsaWRhemlvbmUgZGVsbG8gc2NoZW1hIG5lbGwnZWRpdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVpRWRpdG9yU2NoZW1hVmFsaWRhdGlvblJlc3VsdCB7XG4gIC8qKiBTZSBsbyBzY2hlbWEgZSB2YWxpZG8uICovXG4gIHZhbGlkOiBib29sZWFuO1xuICAvKiogRXJyb3JpIGRpIHZhbGlkYXppb25lLiAqL1xuICBlcnJvcnM6IFVpRWRpdG9yU2NoZW1hVmFsaWRhdGlvbkVycm9yW107XG4gIC8qKiBXYXJuaW5nIGRpIHZhbGlkYXppb25lLiAqL1xuICB3YXJuaW5nczogVWlFZGl0b3JTY2hlbWFWYWxpZGF0aW9uV2FybmluZ1tdO1xufVxuXG4vKipcbiAqIEVycm9yZSBkaSB2YWxpZGF6aW9uZSBkZWxsbyBzY2hlbWEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVWlFZGl0b3JTY2hlbWFWYWxpZGF0aW9uRXJyb3Ige1xuICAvKiogVGlwbyBkaSBlcnJvcmUuICovXG4gIHR5cGU6ICdkdXBsaWNhdGVfa2V5JyB8ICdpbnZhbGlkX3R5cGUnIHwgJ21pc3NpbmdfcmVxdWlyZWQnIHwgJ2ludmFsaWRfcmVmZXJlbmNlJyB8ICdpbnZhbGlkX2Zvcm1hdCc7XG4gIC8qKiBNZXNzYWdnaW8gZGkgZXJyb3JlLiAqL1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBQYXRoIGRlbGwnZWxlbWVudG8gY29uIGVycm9yZSAoZXMuIGBzZWN0aW9uc1swXS5maWVsZHNbMl0ua2V5YCkuICovXG4gIHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXYXJuaW5nIGRpIHZhbGlkYXppb25lIGRlbGxvIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVaUVkaXRvclNjaGVtYVZhbGlkYXRpb25XYXJuaW5nIHtcbiAgLyoqIFRpcG8gZGkgd2FybmluZy4gKi9cbiAgdHlwZTogJ21pc3NpbmdfbGFiZWwnIHwgJ2VtcHR5X29wdGlvbnMnIHwgJ3VudXNlZF9maWVsZCcgfCAnY2lyY3VsYXJfY29uZGl0aW9uJztcbiAgLyoqIE1lc3NhZ2dpbyBkaSB3YXJuaW5nLiAqL1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBQYXRoIGRlbGwnZWxlbWVudG8gY29uIHdhcm5pbmcuICovXG4gIHBhdGg6IHN0cmluZztcbn1cblxuLy8g4pSA4pSA4pSAIENvbmZpZ3VyYXppb25lIGVkaXRvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBEYXRpIHBhc3NhdGkgYWxsYSBtb2RhbGUgZGVsbCdlZGl0b3IuXG4gKiBJbmlldHRhYmlsaSB0cmFtaXRlIE1BVF9ESUFMT0dfREFUQS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVaUVkaXRvckRpYWxvZ0RhdGEge1xuICAvKiogU2NoZW1hIGluaXppYWxlIGRhIGNhcmljYXJlIG5lbGwnZWRpdG9yLiAqL1xuICBpbml0aWFsU2NoZW1hPzogVWlGb3JtU2NoZW1hO1xufVxuIl19
@@ -0,0 +1,18 @@
1
+ /**
2
+ * ng-ui-system — Layout Builder entry point.
3
+ *
4
+ * @example
5
+ * ```typescript
6
+ * import {
7
+ * UiLayoutBuilderComponent,
8
+ * UiLayoutService,
9
+ * UiLayoutSchema,
10
+ * UiNavItem,
11
+ * } from 'ng-ui-system';
12
+ * ```
13
+ */
14
+ // Components
15
+ export { UiLayoutBuilderComponent } from './layout-builder.component';
16
+ // Services
17
+ export { UiLayoutService } from './layout.service';
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2xheW91dC1idWlsZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILGFBQWE7QUFDYixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV0RSxXQUFXO0FBQ1gsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIG5nLXVpLXN5c3RlbSDigJQgTGF5b3V0IEJ1aWxkZXIgZW50cnkgcG9pbnQuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaW1wb3J0IHtcclxuICogICBVaUxheW91dEJ1aWxkZXJDb21wb25lbnQsXHJcbiAqICAgVWlMYXlvdXRTZXJ2aWNlLFxyXG4gKiAgIFVpTGF5b3V0U2NoZW1hLFxyXG4gKiAgIFVpTmF2SXRlbSxcclxuICogfSBmcm9tICduZy11aS1zeXN0ZW0nO1xyXG4gKiBgYGBcclxuICovXHJcblxyXG4vLyBDb21wb25lbnRzXHJcbmV4cG9ydCB7IFVpTGF5b3V0QnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LWJ1aWxkZXIuY29tcG9uZW50JztcclxuXHJcbi8vIFNlcnZpY2VzXHJcbmV4cG9ydCB7IFVpTGF5b3V0U2VydmljZSB9IGZyb20gJy4vbGF5b3V0LnNlcnZpY2UnO1xyXG5cclxuLy8gVHlwZXNcclxuZXhwb3J0IHtcclxuICBVaUxheW91dE1vZGUsXHJcbiAgVWlDb250ZW50VHlwZSxcclxuICBVaUxheW91dEJyZWFkY3J1bWIsXHJcbiAgVWlMYXlvdXRTY2hlbWEsXHJcbiAgVWlOYXZJdGVtLFxyXG4gIFVpTmF2SXRlbVR5cGUsXHJcbiAgVWlOYXZHcm91cCxcclxuICBVaU5hdlNlY3Rpb24sXHJcbiAgVWlOYXZBdXRvRGlzY292ZXJ5Q29uZmlnLFxyXG4gIFVpTGF5b3V0TmF2aWdhdGlvbkNvbmZpZyxcclxuICBVaUxheW91dExvZ28sXHJcbiAgVWlMYXlvdXRIZWFkZXJDb25maWcsXHJcbiAgVWlGb290ZXJMaW5rLFxyXG4gIFVpTGF5b3V0Rm9vdGVyQ29uZmlnLFxyXG4gIFVpRmFiQWN0aW9uLFxyXG4gIFVpTGF5b3V0RmFiQ29uZmlnLFxyXG4gIFVpTGF5b3V0UGFnZUhlYWRlckNvbmZpZyxcclxuICBVaUxheW91dExvYWRlckNvbmZpZyxcclxuICBVaUJhclR5cGUsXHJcbiAgVWlCYXJDb25maWcsXHJcbiAgVWlUb3BiYXJDb25maWcsXHJcbiAgVWlOb3RpZmljYXRpb25CYXJDb25maWcsXHJcbiAgVWlCcmFuZEJhckNvbmZpZyxcclxuICBVaVVzZXJEcm9wZG93bkNvbmZpZyxcclxuICBVaURyb3Bkb3duSXRlbSxcclxuICBVaU5hdmlnYXRpb25CYXJDb25maWcsXHJcbiAgVWlMaW5rc0JhckNvbmZpZyxcclxuICBVaUJhckxpbmtJdGVtLFxyXG59IGZyb20gJy4vbGF5b3V0LWJ1aWxkZXIudHlwZXMnO1xyXG4iXX0=