@esfaenza/parameters 15.2.15 → 15.2.16
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.
|
@@ -175,21 +175,39 @@ export class EsParametersComponent {
|
|
|
175
175
|
// Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri
|
|
176
176
|
var changes = this.reviewParametersBindings();
|
|
177
177
|
if (changes.length > 0) {
|
|
178
|
+
// In base ai binding cambiati devo trovare tutti i parametri che han subito modifiche strutturali (visibilità, obbligatorietà)
|
|
179
|
+
// distruggerli e ricrearli in modo che i binding lato html si aggiornino di conseguenza.
|
|
180
|
+
// 1: Faccio una copia del parametro corrente
|
|
181
|
+
// 2: Trovo la sua posizione all'interno dei gruppi e lo sostituisco con la copia
|
|
182
|
+
// 3: Aggiorno la lista dei parametri e la sua cache in modo da puntare all'oggetto nuovo
|
|
178
183
|
changes.forEach(ch => {
|
|
179
184
|
let index = this.Parameters.findIndex(t => t.id == ch);
|
|
180
|
-
|
|
185
|
+
let parameterCopy = this.utiExts.deepClone(this.Parameters[index]);
|
|
186
|
+
let parameterRefFixed = false;
|
|
187
|
+
for (let ig = 0; ig < this.Groups.length; ig++) {
|
|
188
|
+
var g = this.Groups[ig];
|
|
189
|
+
for (let ip = 0; ip < g.parameters.length; ip++) {
|
|
190
|
+
var p = g.parameters[ip];
|
|
191
|
+
if (p === this.Parameters[index]) {
|
|
192
|
+
this.Groups[ig].parameters[ip] = parameterCopy;
|
|
193
|
+
parameterRefFixed = true;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (parameterRefFixed)
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
this.Parameters[index] = parameterCopy;
|
|
181
201
|
this.ParametersCache[ch] = this.Parameters[index];
|
|
182
202
|
this.cdr.markForCheck();
|
|
183
203
|
});
|
|
184
204
|
}
|
|
185
|
-
var ParametersClone =
|
|
205
|
+
var ParametersClone = this.utiExts.deepClone(this.Parameters);
|
|
186
206
|
// Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori
|
|
187
207
|
ParametersClone?.forEach(t => {
|
|
188
208
|
if (t.type == "enum" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))
|
|
189
209
|
t.value = t.value.join(',');
|
|
190
210
|
});
|
|
191
|
-
// Era stato messo per fixare qualcosa, ma spacca tutto dato che ad ogni cambiamento ricrea il dom, quindi secca i focus
|
|
192
|
-
//this.generateGroups();
|
|
193
211
|
this.propagateChange(ParametersClone);
|
|
194
212
|
}
|
|
195
213
|
/**
|
|
@@ -363,4 +381,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
363
381
|
}], LabelInputRatio: [{
|
|
364
382
|
type: Input
|
|
365
383
|
}] } });
|
|
366
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfcGFyYW1ldGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXJhbWV0ZXJzL3NyYy9saWIvZXNfcGFyYW1ldGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXJhbWV0ZXJzL3NyYy9saWIvZXNfcGFyYW1ldGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUE4RSxpQkFBaUIsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBQzFJLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFVBQVUsRUFBWSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0csaUJBQWlCO0FBQ2pCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBTTlELGVBQWU7QUFDZixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7OztBQUV2RSx1SEFBdUg7QUFldkgsTUFBTSxPQUFPLHFCQUFxQjtJQXNEOUIsbUlBQW1JO0lBQ25JLElBQWEsZUFBZSxDQUFDLEtBQWE7UUFDdEMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQW9CLE9BQXVCLEVBQVMsRUFBdUIsRUFBUyxHQUFzQixF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QUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFHRyxrQ0FBa0M7c0JBQTFDLEtBQUs7Z0JBR0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUdPLGVBQWU7c0JBQTNCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBVbnR5cGVkRm9ybUNvbnRyb2wsIE5nQ29udHJvbCwgTmdGb3JtLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGZvcndhcmRSZWYsIEluamVjdG9yLCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvbG9jYWxpemF0aW9uc1wiO1xyXG5pbXBvcnQgeyBEYXRlU2VydmljZSwgVXRpbGl0eVNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2V4dGVuc2lvbnNcIjtcclxuXHJcbi8vIENsYXNzaVxyXG5pbXBvcnQgeyBHZW5lcmljUGFyYW1ldGVyIH0gZnJvbSAnLi9tb2RlbHMvR2VuZXJpY1BhcmFtZXRlcic7XHJcblxyXG4vLyBBcHBsaWNhemlvbmVcclxuaW1wb3J0IHsgRXNQYXJhbWV0ZXJzTG9jIH0gZnJvbSBcIi4vZXNfcGFyYW1ldGVycy5jb21wb25lbnQubG9jXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgR2VuZXJpY1BhcmFtZXRlckdyb3VwIH0gZnJvbSBcIi4vbW9kZWxzL0dlbmVyaWNQYXJhbWV0ZXJHcm91cFwiO1xyXG5cclxuLyoqIENvbXBvbmVudGUgY2hlIHBlcm1ldHRlIGRpIGdyYWZpY2FyZSB1bmEgbGlzdGEgZGkgKipHZW5lcmljUGFyYW1ldGVyKiogY29tZSBJbnB1dCBpbiBiYXNlIGFsIGxvcm8gdGlwbyBzcGVjaWZpY28gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogXCJlcy1wYXJhbWV0ZXJzXCIsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7IHByb3ZpZGU6IExvY2FsaXphdGlvblNlcnZpY2UsIHVzZUNsYXNzOiBFc1BhcmFtZXRlcnNMb2MgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBFc1BhcmFtZXRlcnNDb21wb25lbnQpLFxyXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgIF0sXHJcbiAgICBzdHlsZVVybHM6IFtcIi4vZXNfcGFyYW1ldGVycy5jb21wb25lbnQuc2Nzc1wiXSxcclxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2VzX3BhcmFtZXRlcnMuY29tcG9uZW50Lmh0bWxcIlxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXNQYXJhbWV0ZXJzQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKiBNb2RlbGxvIGRlbCBjb21wb25lbnRlIHN1IGN1aSB2ZW5nb25vIGVmZmV0dHVhdGUgbGUgZ3JhZmljYXppb25pICovXHJcbiAgICBwdWJsaWMgUGFyYW1ldGVyczogR2VuZXJpY1BhcmFtZXRlcltdO1xyXG5cclxuICAgIC8qKiBNb2RlbGxvIGRlbCBjb21wb25lbnRlIHN1IGN1aSB2ZW5nb25vIGVmZmV0dHVhdGUgbGUgZ3JhZmljYXppb25pICovXHJcbiAgICBwdWJsaWMgR3JvdXBzOiBHZW5lcmljUGFyYW1ldGVyR3JvdXBbXTtcclxuXHJcbiAgICAvKiogQ2FjaGUgcGVyIGZhcmUgbG9va3VwIHJhcGlkaSBpbiBmYXNlIGRpIHZhbHV0YXppb25lIGVzcHJlc3Npb25pIGRpIHZpc2liaWxpdMOgIGUgb2JibGlnYXRvcmlldMOgICovXHJcbiAgICBwcml2YXRlIFBhcmFtZXRlcnNDYWNoZTogeyBbaWQ6IHN0cmluZ106IEdlbmVyaWNQYXJhbWV0ZXIgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpcGVsaW5lIGRpIEFuZ3VsYXIgXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuICAgIC8qKiBJbmRpY2EgY2hlIGlsIHBhcmFtZXRybyBkZXZlIGVzc2VyZSBpbiBtb2RhbGl0w6AgZGlzcGxheSAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIGNoZSBsJ3VsdGltbyBwYXJhbWV0cm8gbm9uIGRldmUgYXZlcmUgbWFyZ2luZSBpbiBmb25kbyAqL1xyXG4gICAgQElucHV0KCkgTGFzdFBhcmFtZXRlck5vTWFyZ2luOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIGNvbC1tZC1YIHBlciBsYSBsYWJlbCAqL1xyXG4gICAgQElucHV0KCkgTGFiZWxDb2xXaWR0aDogbnVtYmVyID0gNDtcclxuXHJcbiAgICAvKiogY29sLW1kLVggcGVyIGwnaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIElucHV0Q29sV2lkdGg6IG51bWJlciA9IDg7XHJcblxyXG4gICAgLyoqIElucHV0IGEgY3VpIGNvbGxlZ2FyZSBsYSB2YXJpYWJpbGUgKipzdWJtaXR0ZWQqKiBkZWwgZm9ybSBhbGwnaW50ZXJubyBkZWwgcXVhbGUgdmllbmUgdXRpbGl6emF0byBxdWVzdG8gY29tcG9uZW50ZSAqL1xyXG4gICAgQElucHV0KCkgc3VibWl0dGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIFZhbG9yZSBkYSBtb3N0cmFyZSBxdWFsb3JhIG5vbiBmb3NzZXJvIGFuY29yYSByaWNldnV0aSBpICoqUGFyYW1ldGVycyoqIGRhIG1vc3RyYXJlICovXHJcbiAgICBASW5wdXQoKSBFbXB0eU1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIFBlcm1ldHRlIGRpIHJpbXVvdmVyZSBpIHBhcmFtZXRyaSBkYWxsYSBsaXN0YSBjbGljY2FuZG8gc3VsbGEgWCBkYXZhbnRpIGFsbGEgTGFiZWwgKi9cclxuICAgIEBJbnB1dCgpIFJlbW92YWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIHNlIGkgY29tcG9uZW50aSBkaSBJbnB1dCBnZW5lcmF0aSBzb25vIFJlYWRvbmx5IG8gbm8gKi9cclxuICAgIEBJbnB1dCgpIFJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSBpIGNvbXBvbmVudGkgZGkgSW5wdXQgZ2VuZXJhdGkgc29ubyBSZWFkb25seSBvIG5vICovXHJcbiAgICBASW5wdXQoKSBMaXN0Rm9ybWF0OiAnQ29tbWFTZXBhcmF0ZWQnIHwgJ0FycmF5JyA9ICdBcnJheSc7XHJcblxyXG4gICAgLyoqIEZvcm0gY2hlIHV0aWxpenphIGlsIGNvbXBvbmVudGUuIEZvbmRhbWVudGFsZSBjb2xsZWdhcmxvIHNlIHNpIHZvZ2xpb25vIGxlIHZhbGlkYXppb25pIHN1bCBzdWJtaXQgKi9cclxuICAgIEBJbnB1dCgpIEZvcm06IE5nRm9ybSA9IG51bGw7XHJcblxyXG4gICAgLyoqIFF1YW5kbyB1dGlsaXp6YSB1biBzb3R0b2NvbXBvbmVudGUgYXV0b2NvbXBsZXRlIGFiaWxpdGEgbyBkaXNhYmlsaXRhIGlsIHJlc2V0IGRlbGwnaW5wdXQgcGVyIG9nbmkgc2VsZXppb25lICovXHJcbiAgICBASW5wdXQoKSBBdXRvY29tcGxldGVIaWRlQ2hvaWNlc09uU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRhIHV0aWxpenphcmUgcGVyIHRpcmFyZSBmdW9yaSBpIGRhdGkgZGkgdW4gYXV0b2NvbXBsZXRlICovXHJcbiAgICBASW5wdXQoKSBBdXRvQ29tcGxldGVEYXRhUmV0cmlldmU6IChwYXJhbWV0ZXI6IEdlbmVyaWNQYXJhbWV0ZXIsIHNlYXJjaDogc3RyaW5nLCBieWlkOiBib29sZWFuKSA9PiBPYnNlcnZhYmxlPHsgaWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyB9W10+XHJcblxyXG4gICAgLyoqIFBlcm1ldHRlIGRpIHNldHRhcmUgaW4gdW5hIHZvbHRhIHNvbG8gZ2xpIGlucHV0ICoqTGFiZWxDb2xXaWR0aCoqIGUgKipJbnB1dENvbFdpZHRoKiosIGJhc3RhIHNjcml2ZXJsbyBjb24gbGEgc2ludGFzc2kgXCJYIFlcIiAqL1xyXG4gICAgQElucHV0KCkgc2V0IExhYmVsSW5wdXRSYXRpbyhpbnB1dDogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHJhdGlvID0gaW5wdXQuc3BsaXQoL1xccy8pO1xyXG4gICAgICAgIHRoaXMuTGFiZWxDb2xXaWR0aCA9IHBhcnNlSW50KHJhdGlvWzBdKTtcclxuICAgICAgICB0aGlzLklucHV0Q29sV2lkdGggPSBwYXJzZUludChyYXRpb1sxXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3N0cnV0dG9yZVxyXG4gICAgICogXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdXRpRXh0czogVXRpbGl0eVNlcnZpY2UsIHB1YmxpYyBsYzogTG9jYWxpemF0aW9uU2VydmljZSwgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgaW5qOiBJbmplY3RvciwgcHVibGljIGRhdGVzOiBEYXRlU2VydmljZSkgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQaXBlbGluZSBkaSBBbmd1bGFyXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHdyaXRlVmFsdWUob2JqKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5QYXJhbWV0ZXJzID0gb2JqO1xyXG5cclxuICAgICAgICB0aGlzLlBhcmFtZXRlcnNDYWNoZSA9IHt9O1xyXG4gICAgICAgIGlmICghdGhpcy5QYXJhbWV0ZXJzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuUGFyYW1ldGVycy5mb3JFYWNoKHQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLlBhcmFtZXRlcnNDYWNoZVt0LmlkXSA9IHQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXQudHlwZWNvZGUgJiYgIXQudHlwZSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk5vbiDDqCBzdGF0byBzcGVjaWZpY2F0byBuw6kgdW4gdHlwZSBuw6kgdW4gdHlwZWNvZGVcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAodC50eXBlY29kZSAmJiAhdC50eXBlKVxyXG4gICAgICAgICAgICAgICAgdC50eXBlID0gdGhpcy51dGlFeHRzLmdldEpzVHlwZUZyb21UeXBlQ29kZSh0LnR5cGVjb2RlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0LnR5cGVjb2RlICYmIHQudHlwZSAhPSB0aGlzLnV0aUV4dHMuZ2V0SnNUeXBlRnJvbVR5cGVDb2RlKHQudHlwZWNvZGUpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBSaWxldmF0ZSBpbmNvbnNpc3RlbnplIGZyYSBpbCBUaXBvICR7dC50eXBlfSBlIGlsIFRpcG8gJHt0aGlzLnV0aUV4dHMuZ2V0SnNUeXBlRnJvbVR5cGVDb2RlKHQudHlwZWNvZGUpfSBjYWxjb2xhdG8gZGEgVHlwZUNvZGUgJHt0LnR5cGVjb2RlfSBwZXIgaWwgcGFyYW1ldHJvICR7dC5pZH1gKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0LnR5cGUgPT0gXCJib29sZWFuXCIpXHJcbiAgICAgICAgICAgICAgICB0LnZhbHVlID0gdC52YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XHJcblxyXG4gICAgICAgICAgICBpZiAodC5lbnVtdHlwZSB8fCB0LmRpY3R0eXBlKVxyXG4gICAgICAgICAgICAgICAgdC50eXBlID0gJ2VudW0nO1xyXG5cclxuICAgICAgICAgICAgLy8gVmFsb3JlIHZhbGlkbyBtYSBtb2RhbGl0w6AgZGkgdXRpbGl6em8gYSBDb21tYVNlcGFyYXRlZCwgZGV2byBhc3NpY3VyYXJtaSBkaSByaWVtZXR0ZXJlIGxhIHZlcnNpb25lIGNvbiBsYSBzdHJpbmdhXHJcbiAgICAgICAgICAgIGlmICh0LnR5cGUgPT0gJ2VudW0nICYmIHRoaXMuTGlzdEZvcm1hdCA9PSAnQ29tbWFTZXBhcmF0ZWQnICYmIHQubXVsdGllbnVtICYmIHQudmFsdWUgJiYgQXJyYXkuaXNBcnJheSh0LnZhbHVlKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gQWdnaXVzdG8gbGUgbW9kYWxpdMOgIGRpIGZ1bnppb25hbWVudG8gZGVpIHBhcmFtZXRyaSBsaXN0YS4gQ2hlIGludGVybmFtZW50ZSBmdW56aW9uYW5vIHNlbXByZSBjb24gdW5hIGxpc3RhIGRpIHZhbG9yaVxyXG4gICAgICAgICAgICBpZiAodC50eXBlID09ICdlbnVtJyAmJiB0aGlzLkxpc3RGb3JtYXQgPT0gJ0NvbW1hU2VwYXJhdGVkJyAmJiB0Lm11bHRpZW51bSAmJiB0LnZhbHVlICYmICFBcnJheS5pc0FycmF5KHQudmFsdWUpKVxyXG4gICAgICAgICAgICAgICAgdC52YWx1ZSA9IHQudmFsdWUgPyB0LnZhbHVlLnNwbGl0KCcsJykubWFwKHQgPT4gdC50cmltKCkpIDogW107XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmV2aWV3UGFyYW1ldGVyc0JpbmRpbmdzKCk7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUdyb3VwcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBNZXRvZG8gY2hlIHNpIG9jY3VwYSBkaSBjcmVhcmUgZSBvcmRpbmFyZSBpIGdydXBwaSBkZWkgcGFyYW1ldHJpXHJcbiAgICAqL1xyXG4gICAgZ2VuZXJhdGVHcm91cHMoKSB7XHJcbiAgICAgICAgdGhpcy5Hcm91cHMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuUGFyYW1ldGVycz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLlBhcmFtZXRlcnMuc29ydCgoYSwgYikgPT4gYS5vcmRlciA8IGIub3JkZXIgPyAtMSA6IDEpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2ljbG8gdHV0dGkgaSBwYXJhbWV0cmlcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHRoaXMuUGFyYW1ldGVycy5sZW5ndGggPiBpOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBwYXIgPSB0aGlzLlBhcmFtZXRlcnNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHBhckdyb3VwTmFtZSA9IHBhci5ncm91cCA/PyBcIlwiO1xyXG4gICAgICAgICAgICAgICAgbGV0IGdyb3VwT3JkZXIgPSBwYXIuZ3JvdXAgPyBwYXIub3JkZXIgOiAtMTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZSBpbCBncnVwcG8gbm9uIGVzaXN0ZSwgbG8gYWdnaXVuZ29cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5Hcm91cHMuc29tZSh4ID0+IHguZ3JvdXBOYW1lID09IHBhckdyb3VwTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkdyb3Vwcy5wdXNoKG5ldyBHZW5lcmljUGFyYW1ldGVyR3JvdXAocGFyR3JvdXBOYW1lLCBncm91cE9yZGVyKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSW5zZXJpc2NvIGlsIHBhcmFtZXRybyBkZW50cm8gYWwgc3VvIGdydXBwb1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Hcm91cHMuZmluZChnID0+IGcuZ3JvdXBOYW1lID09IHBhckdyb3VwTmFtZSkucGFyYW1ldGVycy5wdXNoKHBhcilcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gR2VzdGlvbmUgc290dG9ncnVwcGlcclxuICAgICAgICAgICAgbGV0IHN1Ymdyb3VwczogR2VuZXJpY1BhcmFtZXRlckdyb3VwW10gPSB0aGlzLkdyb3Vwcy5maWx0ZXIoZ3JvdXAgPT4gZ3JvdXAuZ3JvdXBOYW1lLmluY2x1ZGVzKCfCpycpKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgXzsgc3ViZ3JvdXBzLmxlbmd0aCA+IDA7ICgpID0+IHsgfSkge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVjdXBlcm8gbGEgbGlzdGEgZGkgZ3J1cHBpIGNoZSBoYW5ubyBzb3R0b2dydXBwaVxyXG4gICAgICAgICAgICAgICAgLy8gUGVyIGNvbnZlbnppb25lLCBuZWwgbm9tZSBjb250ZW5nb25vIFwiwqdcIlxyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0FkZFN1Ymdyb3VwcyhzdWJncm91cHMpO1xyXG4gICAgICAgICAgICAgICAgc3ViZ3JvdXBzID0gdGhpcy5Hcm91cHMuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmdyb3VwTmFtZS5pbmNsdWRlcygnwqcnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuR3JvdXBzLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgPCBiLm9yZGVyID8gLTEgOiAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIE1ldG9kbyBjaGUgc2kgb2NjdXBhIGRpIGNyZWFyZSBlIG9yZGluYXJlIGkgc290dG9ncnVwcGkgZGVpIHBhcmFtZXRyaVxyXG4gICAgKi9cclxuICAgIHRyeVRvQWRkU3ViZ3JvdXBzKHN1Ymdyb3VwczogR2VuZXJpY1BhcmFtZXRlckdyb3VwW10pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgc3ViZ3JvdXBzLmxlbmd0aCA+IGk7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgc3ViID0gc3ViZ3JvdXBzW2ldO1xyXG5cclxuICAgICAgICAgICAgLy8gT3R0ZW5nbyB1biBsaXN0YSBjb24gbGEgZ2VyYXJjaGlhIGRlaSBncnVwcGksIGluIG9yZGluZVxyXG4gICAgICAgICAgICBsZXQgZ3JvdXBzUGFyZW50SGllcmFyY2h5ID0gc3ViLmdyb3VwTmFtZS5zcGxpdCgnwqcnKSA/PyBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlY3VwZXJvIGlsIGdydXBwbyBwYWRyZVxyXG4gICAgICAgICAgICBsZXQgcGFyZW50R3JvdXBOYW1lID0gc3ViLmdyb3VwTmFtZS5yZXBsYWNlKGDCpyR7Z3JvdXBzUGFyZW50SGllcmFyY2h5W2dyb3Vwc1BhcmVudEhpZXJhcmNoeS5sZW5ndGggLSAxXX1gLCBgYCk7XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBpbCBncnVwcG8gcGFkcmUgbm9uIGVzaXN0ZSwgbG8gYWdnaXVuZ29cclxuICAgICAgICAgICAgaWYgKCF0aGlzLkdyb3Vwcy5zb21lKHggPT4geC5ncm91cE5hbWUgPT0gcGFyZW50R3JvdXBOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Hcm91cHMucHVzaChuZXcgR2VuZXJpY1BhcmFtZXRlckdyb3VwKHBhcmVudEdyb3VwTmFtZSwgc3ViLm9yZGVyKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFJpbXVvdm8gZGFsIG5vbWUgZGVsIGdydXBwbyBsJ2luZm9ybWF6aW9uZSBzdWwgcGFkcmUgKFNpc3RlbWFuZG8gYW5jaGUgbCdldGljaGV0dGEpXHJcbiAgICAgICAgICAgIC8vIGUgbG8gYWdnaXVuZ28gYWkgc290dG9ncnVwcGkgZGVsIHBhZHJlXHJcbiAgICAgICAgICAgIHN1Yi5ncm91cE5hbWUgPSBzdWIuZ3JvdXBOYW1lLnJlcGxhY2UoYCR7cGFyZW50R3JvdXBOYW1lfcKnYCwgJycpO1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50R3JvdXAgPSB0aGlzLkdyb3Vwcy5maW5kKHggPT4geC5ncm91cE5hbWUgPT0gcGFyZW50R3JvdXBOYW1lKTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudEdyb3VwPy5zdWJncm91cHMuc29tZShzID0+IHMuZ3JvdXBOYW1lID09IHN1Yi5ncm91cE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gcGFyZW50R3JvdXAuc3ViZ3JvdXBzLmZpbmQoZiA9PiBmLmdyb3VwTmFtZSA9PSBzdWIuZ3JvdXBOYW1lKTtcclxuICAgICAgICAgICAgICAgIHN1Yi5wYXJhbWV0ZXJzLm1hcChwID0+IHRhcmdldC5wYXJhbWV0ZXJzLnB1c2gocCkpO1xyXG4gICAgICAgICAgICAgICAgc3ViLnN1Ymdyb3Vwcy5tYXAocyA9PiB0YXJnZXQuc3ViZ3JvdXBzLnB1c2gocykpO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Lm9yZGVyID0gc3ViLm9yZGVyIDwgdGFyZ2V0Lm9yZGVyID8gc3ViLm9yZGVyIDogdGFyZ2V0Lm9yZGVyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50R3JvdXA/LnN1Ymdyb3Vwcy5wdXNoKHN1Yik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFJpbXVvdm8gaWwgc290dG9ncnVwcG8gZ3J1cHBvIGRhbGxhIGxpc3RhXHJcbiAgICAgICAgICAgIHRoaXMuR3JvdXBzLnNwbGljZSh0aGlzLkdyb3Vwcy5pbmRleE9mKHN1YiksIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpcGVsaW5lIGRpIEFuZ3VsYXJcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbik6IHZvaWQgeyB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQaXBlbGluZSBkaSBBbmd1bGFyXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKTogdm9pZCB7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgc2kgb2NjdXBhIGRpIGdlc3RpcmUgaWwgbW9kZWxsbyBpbiB1c2NpdGEgZSBwcm9wYWdhcmxvIHN1bCBiaW5kaW5nIG5nTW9kZWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNoYW5nZWQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLlBhcmFtZXRlcnMpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gU2UgY2kgc29ubyBkZWxsZSBtb2RpZmljaGUgYWkgYmluZGluZyBwb3RyZWJiZXJvIGVzc2VyZSBjYW1iaWF0aSBpIHJlcXVpcmVkLiBSaWNyZW8gdHV0dGkgaSBjb21wb25lbnRpIGUgcmktaWRyYXRvIGxhIGNhY2hlIGRlaSBwYXJhbWV0cmlcclxuICAgICAgICB2YXIgY2hhbmdlcyA9IHRoaXMucmV2aWV3UGFyYW1ldGVyc0JpbmRpbmdzKCk7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjaGFuZ2VzLmZvckVhY2goY2ggPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5QYXJhbWV0ZXJzLmZpbmRJbmRleCh0ID0+IHQuaWQgPT0gY2gpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYXJhbWV0ZXJzW2luZGV4XSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5QYXJhbWV0ZXJzW2luZGV4XSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYXJhbWV0ZXJzQ2FjaGVbY2hdID0gdGhpcy5QYXJhbWV0ZXJzW2luZGV4XTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBQYXJhbWV0ZXJzQ2xvbmUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuUGFyYW1ldGVycykpO1xyXG5cclxuICAgICAgICAvLyBBZ2dpdXN0byBsZSBtb2RhbGl0w6AgZGkgZnVuemlvbmFtZW50byBkZWkgcGFyYW1ldHJpIGxpc3RhLiBDaGUgaW50ZXJuYW1lbnRlIGZ1bnppb25hbm8gc2VtcHJlIGNvbiB1bmEgbGlzdGEgZGkgdmFsb3JpXHJcbiAgICAgICAgUGFyYW1ldGVyc0Nsb25lPy5mb3JFYWNoKHQgPT4ge1xyXG4gICAgICAgICAgICBpZiAodC50eXBlID09IFwiZW51bVwiICYmIHRoaXMuTGlzdEZvcm1hdCA9PSAnQ29tbWFTZXBhcmF0ZWQnICYmIHQubXVsdGllbnVtICYmIHQudmFsdWUgJiYgQXJyYXkuaXNBcnJheSh0LnZhbHVlKSlcclxuICAgICAgICAgICAgICAgIHQudmFsdWUgPSB0LnZhbHVlLmpvaW4oJywnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gRXJhIHN0YXRvIG1lc3NvIHBlciBmaXhhcmUgcXVhbGNvc2EsIG1hIHNwYWNjYSB0dXR0byBkYXRvIGNoZSBhZCBvZ25pIGNhbWJpYW1lbnRvIHJpY3JlYSBpbCBkb20sIHF1aW5kaSBzZWNjYSBpIGZvY3VzXHJcbiAgICAgICAgLy90aGlzLmdlbmVyYXRlR3JvdXBzKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UoUGFyYW1ldGVyc0Nsb25lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJpbXVvdmUgaWwgcGFyYW1ldHJvIHNlbGV6aW9uYXRvIGUgcHJvcGFnYSBpbCBtb2RlbGxvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7R2VuZXJpY1BhcmFtZXRlcn0gcGFyIFBhcmFtZXRybyBkYSByaW11b3ZlcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZVBhcmFtZXRlcihwYXI6IEdlbmVyaWNQYXJhbWV0ZXIpIHtcclxuICAgICAgICB0aGlzLlBhcmFtZXRlcnMuc3BsaWNlKHRoaXMuUGFyYW1ldGVycy5pbmRleE9mKHBhciksIDEpO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZW5lcmF0ZVBhcmFtZXRlckdyb3VwcygpIHtcclxuICAgICAgICBsZXQgR3JvdXBzOiB7IGlkOiBzdHJpbmcsIGdyb3Vwczogc3RyaW5nW10sIG9yZGVyOiBudW1iZXIgfVtdID0gW107XHJcblxyXG4gICAgICAgIHRoaXMuUGFyYW1ldGVycy5mb3JFYWNoKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgR3JvdXBzLnB1c2goeyBpZDogcGFyYW0uaWQsIGdyb3VwczogcGFyYW0uZ3JvdXAuc3BsaXQoXCLCp1wiKSwgb3JkZXI6IHBhcmFtLm9yZGVyIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgR3JvdXBlZEdyb3VwcyA9IEdyb3Vwcy5yZWR1Y2UoKHIsIGEpID0+IHtcclxuICAgICAgICAgICAgbGV0IGZpcnN0R3JvdXBJZCA9IGEuZ3JvdXBzPy5sZW5ndGggPiAwID8gYS5ncm91cHNbMF0gOiBcIlwiO1xyXG4gICAgICAgICAgICByW2ZpcnN0R3JvdXBJZF0gPSBbLi4ucltmaXJzdEdyb3VwSWRdIHx8IFtdLCBhXTtcclxuICAgICAgICAgICAgcmV0dXJuIHI7XHJcbiAgICAgICAgfSwge30pO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhHcm91cGVkR3JvdXBzKTtcclxuXHJcbiAgICAgICAgLy8gQ2ljbG8gZGVsIHJpc3VsdGF0bywgYWdnaXVuZ2VuZG8gaSBncnVwcGkgYWwgbW9kZWxsb1xyXG4gICAgICAgIC8vIFBlciBvZ25pIGdydXBwbyBjaGUgYWdnaXVuZ28sIGFzc2Vnbm8gaSBwYXJhbWV0cmkgaW4gb3JkaW5lXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSaXZlZGUgaSBiaW5kaW5ncyBkZWkgcGFyYW1ldHJpIGluIGJhc2UgYSBsb3JvIGV2ZW50dWFsaSBlc3ByZXNzaW9uaSBkaSBjb250cm9sbG9cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfSBsaXN0YSBjb24gZ2xpIGlkIGRlaSBwYXJhbWV0cmkgY2hlIHNvbm8gc3RhdGkgbW9kaWZpY2F0aVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJldmlld1BhcmFtZXRlcnNCaW5kaW5ncygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgbGV0IGNoYW5nZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuUGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcCA9IHRoaXMuUGFyYW1ldGVyc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwLnJlcXVpcmVkZXhwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJldlJlcSA9IHAucmVxdWlyZWQ7XHJcbiAgICAgICAgICAgICAgICBwLnJlcXVpcmVkID0gdGhpcy5ldmFsdWF0ZShwLnJlcXVpcmVkZXhwKTtcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2UmVxICE9IHAucmVxdWlyZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKHAuaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwLnZpc2libGVleHApIHtcclxuICAgICAgICAgICAgICAgIGxldCBwcmV2VmlzaSA9IHAudmlzaWJsZTtcclxuICAgICAgICAgICAgICAgIHAudmlzaWJsZSA9IHRoaXMuZXZhbHVhdGUocC52aXNpYmxlZXhwKTtcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2VmlzaSAhPSBwLnZpc2libGUpXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKHAuaWQpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNoYW5nZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWx1dGEgdW4nZXNwcmVzc2lvbmUgaW4gYmFzZSBhaSBwYXJhbWV0cmkgcHJlc2VudGkgbmVsIG1vZGVsbG8gYXR0dWFsZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZXhwciBFc3ByZXNzaW9uZSBkYSB2YWx1dGFyZSBzY3JpdHRhIG5lbCBmb3JtYXRvIChyaXBldGliaWxlKSBcIklEICg9PXwhPXw8fD58Pj18PD0pIChgdmFsb3JlYCB8IG51bGwgfCB0cnVlIHwgZmFsc2UgfCBYWFgsWFhYKVwiIHNlcGFyYXRvIGV2ZW50dWFsbWVudGUgZGEgJiYgZWQgfHxcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgKip0cnVlKiogc2UgbGEgY29uZGl6aW9uZSDDqCB2ZXJpZmljYXRhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlKGV4cHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHZhciByZWdleCA9IC9cXHM/KFthLXpBLVowLTlfLV0rKVxccz8oIT18PT18PHw+fDw9fD49KVxccz8oYFteYF0rYHxgYHxudWxsfFswLTksXSt8dHJ1ZXxmYWxzZSkvZ207XHJcblxyXG4gICAgICAgIHZhciBtYXRjaGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIHZhciBmaW5hbEV4cHIgPSBleHByO1xyXG4gICAgICAgIHdoaWxlIChtYXRjaGVzID0gcmVnZXguZXhlYyhleHByKSkge1xyXG4gICAgICAgICAgICB2YXIgZnVsbE1hdGNoID0gbWF0Y2hlc1swXS50cmltKCk7XHJcbiAgICAgICAgICAgIHZhciBpZCA9IG1hdGNoZXNbMV0udHJpbSgpO1xyXG4gICAgICAgICAgICB2YXIgb3BlcmF0aW9uID0gbWF0Y2hlc1syXS50cmltKCk7XHJcbiAgICAgICAgICAgIGxldCBiVmFsdWUgPSBtYXRjaGVzWzNdLnRyaW0oKS50cmltKCk7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG1hdGNoZXNbM10udHJpbSgpLnRyaW0oKS5yZXBsYWNlKCdgJywgJycpLnJlcGxhY2UoJ2AnLCAnJyk7XHJcblxyXG4gICAgICAgICAgICBmaW5hbEV4cHIgPSBmaW5hbEV4cHIucmVwbGFjZShmdWxsTWF0Y2gsIGB0aGlzLmNoZWNrVmFsdWUoJyR7aWR9JywgJyR7b3BlcmF0aW9ufScsICR7YlZhbHVlID09ICdudWxsJyA/ICdudWxsJyA6IGAnJHt2YWx1ZX0nYH0pYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXZhbChmaW5hbEV4cHIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdGl0dWlzY2UgbCdvcGVyYXppb25lIGRpIGNvbXBhcmF6aW9uZSBmcmEgdW4gc2luZ29sbyB2YWxvcmUgZGkgdW4gcGFyYW1ldHJvIGUgdW4gc3VvIHZhbG9yZSBkaSBjb25mcm9udG8gaW4gYmFzZSBhZCB1biBvcGVyYXRvcmVcclxuICAgICAqIFJpY2hpYW1hdGEgZGEgRVZBTFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IENoaWF2ZSBkZWwgcGFyYW1ldHJvIGRpIGN1aSB2ZXJpZmljYXJlIGlsIHZhbG9yZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdG9yIE9wZXJhdG9yZSBjb24gY3VpIHZlcmlmaWNhcmUgaWwgdmFsb3JlOiA9PSwgIT0sID4sIDwsID49LCA8PVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFZhbG9yZSBkaSBjb25mcm9udG8gZGEgdXRpbGl6emFyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyAqKnRydWUqKiBzZSBsYSBjb25kaXppb25lIMOoIHZlcmlmaWNhdGEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjaGVja1ZhbHVlKGtleTogc3RyaW5nLCBvcGVyYXRvcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdmFyIHJQYXIgPSB0aGlzLlBhcmFtZXRlcnNDYWNoZVtrZXldO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoclBhci50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsKGBcIiR7dGhpcy5kZWZhdWx0SWZudWxsT3JVbmRlZmluZWQoclBhci52YWx1ZSwgYGApfVwiICR7b3BlcmF0b3J9IFwiJHt0aGlzLmRlZmF1bHRJZm51bGxPclVuZGVmaW5lZCh2YWx1ZSwgYGApfVwiYCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsKGAke3RoaXMuZGVmYXVsdElmbnVsbE9yVW5kZWZpbmVkKHJQYXIudmFsdWUsIGBgKS50b1N0cmluZygpfSAke29wZXJhdG9yfSAke3RoaXMuZGVmYXVsdElmbnVsbE9yVW5kZWZpbmVkKHZhbHVlLCBgYCl9YCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWwoYCR7dGhpcy5kZWZhdWx0SWZudWxsT3JVbmRlZmluZWQoclBhci52YWx1ZSwgJ1wiXCInLCB0cnVlKS5yZXBsYWNlKCcsJywgJy4nKX0gJHtvcGVyYXRvcn0gJHt0aGlzLmRlZmF1bHRJZm51bGxPclVuZGVmaW5lZCh2YWx1ZSwgJ1wiXCInLCB0cnVlKS5yZXBsYWNlKCcsJywgJy4nKX1gKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhckRhdGVDb252ID0gYHRoaXMuZGF0ZXMuZ2V0RGF0ZUNvbnZlcnRpb24oXCIke3JQYXIudmFsdWV9XCIpYDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsRGF0ZUNvbnYgPSBgdGhpcy5kYXRlcy5nZXREYXRlQ29udmVydGlvbihcIiR7dmFsdWV9XCIpYDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIj09XCI6IHJldHVybiBldmFsKGAke3BhckRhdGVDb252fSA9PSAke3ZhbERhdGVDb252fSB8fCAoJHtwYXJEYXRlQ29udn0gIT0gbnVsbCAmJiAke3BhckRhdGVDb252fS5pc1NhbWUoJHt2YWxEYXRlQ29udn0pKWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiIT1cIjogcmV0dXJuIGV2YWwoYCR7cGFyRGF0ZUNvbnZ9ICE9ICR7dmFsRGF0ZUNvbnZ9ICYmICR7cGFyRGF0ZUNvbnZ9ICE9IG51bGwgJiYgISR7cGFyRGF0ZUNvbnZ9LmlzU2FtZSgke3ZhbERhdGVDb252fSlgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIj5cIjogcmV0dXJuIGV2YWwoYCR7cGFyRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHt2YWxEYXRlQ29udn0gIT0gbnVsbCAmJiAke3BhckRhdGVDb252fS5pc0FmdGVyKCR7dmFsRGF0ZUNvbnZ9KWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPFwiOiByZXR1cm4gZXZhbChgJHtwYXJEYXRlQ29udn0gIT0gbnVsbCAmJiAke3ZhbERhdGVDb252fSAhPSBudWxsICYmICR7cGFyRGF0ZUNvbnZ9LmlzQmVmb3JlKCR7dmFsRGF0ZUNvbnZ9KWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPj1cIjogcmV0dXJuIGV2YWwoYCR7cGFyRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHt2YWxEYXRlQ29udn0gIT0gbnVsbCAmJiAoJHtwYXJEYXRlQ29udn0uaXNBZnRlcigke3ZhbERhdGVDb252fSkgfHwgJHtwYXJEYXRlQ29udn0/LmlzU2FtZSgke3ZhbERhdGVDb252fSkpYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI8PVwiOiByZXR1cm4gZXZhbChgJHtwYXJEYXRlQ29udn0gIT0gbnVsbCAmJiAke3ZhbERhdGVDb252fSAhPSBudWxsICYmICgke3BhckRhdGVDb252fS5pc0JlZm9yZSgke3ZhbERhdGVDb252fSkgfHwgJHtwYXJEYXRlQ29udn0/LmlzU2FtZSgke3ZhbERhdGVDb252fSkpYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkVycm9yaSBuZWxsYSB2YWx1dGF6aW9uZSBkZWxsJ2VzcHJlc3Npb25lLiBGYWxsYmFjayBhIGZhbHNlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aHJvdyBgQGVzZmFlbnphL3BhcmFtZXRlcnM6IFRpcG8gcGFyYW1ldHJvICR7a2V5fSBub24gcmljb25vc2NpdXRvOiAke3JQYXIudHlwZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIGRlZmF1bHRJZm51bGxPclVuZGVmaW5lZDxUPihpdGVtOiBULCBkZmx0OiBULCBlbXB0eVN0cmluZ0lzTnVsbDogYm9vbGVhbiA9IGZhbHNlKTogVCB7XHJcbiAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCB8fCBpdGVtID09IHVuZGVmaW5lZCB8fCBpdGVtLnRvU3RyaW5nKCkgPT0gJ251bGwnIHx8IChlbXB0eVN0cmluZ0lzTnVsbCAmJiBpdGVtLnRvU3RyaW5nKCkgPT0gXCJcIikpXHJcbiAgICAgICAgICAgIHJldHVybiBkZmx0O1xyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgZ2V0U291cmNlKHBhcmFtZXRlcjogR2VuZXJpY1BhcmFtZXRlciwgc2VhcmNoOiBzdHJpbmcsIGJ5aWQ6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPHsgaWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyB9W10+IHtcclxuICAgICAgICBpZiAoIXRoaXMuQXV0b0NvbXBsZXRlRGF0YVJldHJpZXZlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJAZm9ybXMtYW5kLXZhbGlkYXRpb25zOiBmdW56aW9uZSBkaSBkYXRhcmV0cmlldmUgbm9uIGltcG9zdGF0YSBwZXIgdW4gcGFyYW1ldHJvIGF1dG9jb21wbGV0ZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkF1dG9Db21wbGV0ZURhdGFSZXRyaWV2ZShwYXJhbWV0ZXIsIHNlYXJjaCwgYnlpZCk7XHJcbiAgICB9XHJcbn0iLCI8ZGl2ICpuZ0lmPVwiKCFQYXJhbWV0ZXJzIHx8IFBhcmFtZXRlcnMubGVuZ3RoID09IDApICYmIEVtcHR5TWVzc2FnZVwiPlxyXG4gICAgPGVtPnt7RW1wdHlNZXNzYWdlfX08L2VtPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgKm5nSWY9XCJHcm91cHNcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJUZW1wOyBjb250ZXh0OiB7aXRlbTogeyBncm91cHM6IEdyb3VwcywgaXNTdWJncm91cDogZmFsc2UgfX1cIj48L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI1RlbXAgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBpdGVtLmdyb3VwczsgbGV0IGsgPSBpbmRleFwiPlxyXG4gICAgICAgIDxkaXYgW2NsYXNzLnBhcnMtc3ViZ3JvdXBdPVwiaXRlbS5pc1N1Ymdyb3VwXCIgW2NsYXNzLnBhcnMtZ3JvdXBdPVwiIWl0ZW0uaXNTdWJncm91cFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiR3JvdXBzT3JTdWJncm91cHNEaXNwbGF5OyBjb250ZXh0OiB7IGl0ZW06IHsgZ3JvdXA6IGdyb3VwLCBpbmRleDogayArIChpdGVtLmluZGV4ID8gKCdfJyArIGl0ZW0uaW5kZXgpIDogJycpLCBpc1N1Ymdyb3VwOiBpdGVtLmlzU3ViZ3JvdXAgfX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyb3VwLnN1Ymdyb3Vwcy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiVGVtcDsgY29udGV4dDoge2l0ZW06IHsgZ3JvdXBzOiBncm91cC5zdWJncm91cHMsIGluZGV4OiBrICsgKGl0ZW0uaW5kZXggPyAoJ18nICsgaXRlbS5pbmRleCkgOiAnJyksIGlzU3ViZ3JvdXA6IHRydWUgfX07XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI0dyb3Vwc09yU3ViZ3JvdXBzRGlzcGxheSBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgIDxkaXYgKm5nSWY9XCJpdGVtLmdyb3VwXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uZ3JvdXAuZ3JvdXBOYW1lXCIgW2NsYXNzLnBhcnMtZ3JvdXAtdGl0bGVdPVwiIWl0ZW0uaXNTdWJncm91cFwiIFtjbGFzcy5wYXJzLXN1Ymdyb3VwLXRpdGxlXT1cIml0ZW0uaXNTdWJncm91cFwiPlxyXG4gICAgICAgICAgICB7e2l0ZW0uZ3JvdXAuZ3JvdXBOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5ncm91cC5wYXJhbWV0ZXJzICYmIGl0ZW0uZ3JvdXAucGFyYW1ldGVycy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZm9ybS1ncm91cFwiICpuZ0Zvcj1cImxldCBwYXIgb2YgaXRlbS5ncm91cC5wYXJhbWV0ZXJzOyBsZXQgaT0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdDtcIiBbY2xhc3MuYXBwLW1hcmdpbi1ib3R0b20tMF09XCJMYXN0UGFyYW1ldGVyTm9NYXJnaW4gJiYgbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhci52aXNpYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLXt7TGFiZWxDb2xXaWR0aH19IG0tdC01XCI+PHNwYW4gKm5nSWY9XCJSZW1vdmFsXCIgY2xhc3M9XCJmYSBmYS1yZW1vdmUgdGV4dC1kYW5nZXJcIiAoY2xpY2spPVwicmVtb3ZlUGFyYW1ldGVyKHBhcilcIj4mbmJzcDs8L3NwYW4+e3twYXIuZGVzY3JpcHRpb259fXt7cGFyLnJlcXVpcmVkID8gJyonIDogJyd9fTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1TZSBEYXRhLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtLWRhdGUgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgW0Zvcm1dPVwiRm9ybVwiIFtGb3JtTGF5b3V0XT1cImZhbHNlXCIgW1JlYWRvbmx5XT1cIlJlYWRvbmx5IHx8IHBhci5pc3JlYWRvbmx5XCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZFwiIFsobmdNb2RlbCldPVwicGFyLnZhbHVlXCIgbmFtZT1cInt7aXRlbS5pbmRleH19cGFye3tpfX1cIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3I+PC9mb3JtLWRhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLVNlIHN0cmluZ2EtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnc3RyaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybS1pbnB1dCBbRGlzcGxheU1vZGVdPVwiRGlzcGxheU1vZGVcIiAgW0Zvcm1dPVwiRm9ybVwiIFtGb3JtTGF5b3V0XT1cImZhbHNlXCIgW1JlYWRvbmx5XT1cIlJlYWRvbmx5IHx8IHBhci5pc3JlYWRvbmx5XCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZFwiIFsobmdNb2RlbCldPVwicGFyLnZhbHVlXCIgbmFtZT1cInt7aXRlbS5pbmRleH19cGFye3tpfX1cIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3I+PC9mb3JtLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1TZSBudW1lcm8tLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnbnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybS1pbnB1dCBbRGlzcGxheU1vZGVdPVwiRGlzcGxheU1vZGVcIiAgW0Zvcm1dPVwiRm9ybVwiIFtGb3JtTGF5b3V0XT1cImZhbHNlXCIgW1JlYWRvbmx5XT1cIlJlYWRvbmx5IHx8IHBhci5pc3JlYWRvbmx5XCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZFwiIFsobmdNb2RlbCldPVwicGFyLnZhbHVlXCIgbmFtZT1cInt7aXRlbS5pbmRleH19cGFye3tpfX1cIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3IgcGF0dGVybj1cInt7cGFyLnBhdHRlcm4gfHwgJ15bKy1dP1swLTldKlssXT9bMC05XSskJ319XCI+PC9mb3JtLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1TZSBib29sZWFuLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fSBtLXQtNVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2Jvb2xlYW4nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtLWNoZWNrYm94IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbKG5nTW9kZWwpXT1cInBhci52YWx1ZVwiIG5hbWU9XCJ7e2l0ZW0uaW5kZXh9fXBhcnt7aX19XCIgKGlucHV0Q2hhbmdlKT1cImNoYW5nZWQoKTtcIiAjdmFsaWRhdG9yPjwvZm9ybS1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tU2UgZW51bSBzaW5nbGUgc2VsZWN0LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2VudW0nICYmICFwYXIubXVsdGllbnVtICYmICFwYXIuc291cmNlYXBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtLXNlbGVjdCBbRGlzcGxheU1vZGVdPVwiRGlzcGxheU1vZGVcIiAgW0Zvcm1dPVwiRm9ybVwiIFtGb3JtTGF5b3V0XT1cImZhbHNlXCIgW1JlYWRvbmx5XT1cIlJlYWRvbmx5IHx8IHBhci5pc3JlYWRvbmx5XCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZFwiIFsobmdNb2RlbCldPVwicGFyLnZhbHVlXCIgbmFtZT1cInt7aXRlbS5pbmRleH19cGFye3tpfX1cIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3IgW1NvdXJjZV09XCJwYXIuZW51bXZhbHVlc1wiPjwvZm9ybS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLVNlIGVudW0gbXVsdGkgc2VsZWN0LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2VudW0nICYmIHBhci5tdWx0aWVudW0gJiYgIXBhci5zb3VyY2VhcGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0tbXVsdGlzZWxlY3QgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtVc2VDb21tYVNlcGFyYXRlZExpc3RdPVwidHJ1ZVwiIFtTZWxlY3RMYWJlbF09XCIoJ1NlbGVjdCcgfCBsb2NhbGl6ZSA6IGxjKSArICcuLi4nXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtTb3VyY2VdPVwicGFyLmVudW12YWx1ZXNcIiBbcmVxdWlyZWRdPVwicGFyLnJlcXVpcmVkXCIgKGlucHV0Q2hhbmdlKT1cImNoYW5nZWQoKTtcIiAjdmFsaWRhdG9yPjwvZm9ybS1tdWx0aXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tU2UgZW51bSBhdXRvY29tcGxldGUtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnZW51bScgJiYgIXBhci5tdWx0aWVudW0gJiYgcGFyLnNvdXJjZWFwaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybS1hdXRvY29tcGxldGUgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtQbGFjZWhvbGRlcl09XCIoJ1NlbGVjdCcgfCBsb2NhbGl6ZSA6IGxjKSArICcuLi4nXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtTZWFyY2hGdW5jdGlvbl09XCJnZXRTb3VyY2UuYmluZCh0aGlzLCBwYXIpXCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZFwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0tYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1TZSBlbnVtIG11bHRpc2VsZWN0IGF1dG9jb21wbGV0ZS0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX1cIiAqbmdJZj1cInBhci50eXBlID09ICdlbnVtJyAmJiBwYXIubXVsdGllbnVtICYmIHBhci5zb3VyY2VhcGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0tYXV0b2NvbXBsZXRlIFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0hpZGVDaG9pY2VzT25TZWxlY3Rpb25dPVwiQXV0b2NvbXBsZXRlSGlkZUNob2ljZXNPblNlbGVjdGlvblwiIFtNdWx0aV09XCJ0cnVlXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbUGxhY2Vob2xkZXJdPVwiKCdTZWxlY3QnIHwgbG9jYWxpemUgOiBsYykgKyAnLi4uJ1wiIFsobmdNb2RlbCldPVwicGFyLnZhbHVlXCIgbmFtZT1cInt7aXRlbS5pbmRleH19cGFye3tpfX1cIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbU2VhcmNoRnVuY3Rpb25dPVwiZ2V0U291cmNlLmJpbmQodGhpcywgcGFyKVwiIFtyZXF1aXJlZF09XCJwYXIucmVxdWlyZWRcIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3I+PC9mb3JtLWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyZml4XCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
|
|
384
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfcGFyYW1ldGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXJhbWV0ZXJzL3NyYy9saWIvZXNfcGFyYW1ldGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXJhbWV0ZXJzL3NyYy9saWIvZXNfcGFyYW1ldGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUE4RSxpQkFBaUIsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBQzFJLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFVBQVUsRUFBWSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0csaUJBQWlCO0FBQ2pCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBTTlELGVBQWU7QUFDZixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7OztBQUV2RSx1SEFBdUg7QUFldkgsTUFBTSxPQUFPLHFCQUFxQjtJQXNEOUIsbUlBQW1JO0lBQ25JLElBQWEsZUFBZSxDQUFDLEtBQWE7UUFDdEMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQW9CLE9BQXVCLEVBQVMsRUFBdUIsRUFBUyxHQUFzQixFQUFVLEdBQWEsRUFBUyxLQUFrQjtRQUF4SSxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUFTLE9BQUUsR0FBRixFQUFFLENBQXFCO1FBQVMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBYTtRQXZENUo7Ozs7V0FJRztRQUNILG9CQUFlLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVsQyw4REFBOEQ7UUFDckQsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFdEMsb0VBQW9FO1FBQzNELDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUVoRCw0QkFBNEI7UUFDbkIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFFbkMsMkJBQTJCO1FBQ2xCLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBRW5DLHlIQUF5SDtRQUNoSCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRXBDLDBGQUEwRjtRQUNqRixpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUVuQyx5RkFBeUY7UUFDaEYsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUVsQyxrRUFBa0U7UUFDekQsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUVuQyxrRUFBa0U7UUFDekQsZUFBVSxHQUErQixPQUFPLENBQUM7UUFFMUQsd0dBQXdHO1FBQy9GLFNBQUksR0FBVyxJQUFJLENBQUM7UUFFN0Isa0hBQWtIO1FBQ3pHLHVDQUFrQyxHQUFZLEtBQUssQ0FBQztJQWlCbUcsQ0FBQztJQUVqSzs7OztPQUlHO0lBQ0ksVUFBVSxDQUFDLEdBQUc7UUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFFdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQ2hCLE9BQU87UUFFWCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFL0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSTtnQkFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1lBRXRFLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUNyQixDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTVELElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDdEUsT0FBTyxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLElBQUksY0FBYyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLHFCQUFxQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUUxTCxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUztnQkFDbkIsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQztZQUU1RCxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFFBQVE7Z0JBQ3hCLENBQUMsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO1lBRXBCLG9IQUFvSDtZQUNwSCxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksZ0JBQWdCLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDM0csSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRW5CLHdIQUF3SDtZQUN4SCxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksZ0JBQWdCLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUM1RyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOztNQUVFO0lBQ0YsY0FBYztRQUNWLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWpCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFM0QsMEJBQTBCO1lBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDN0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFN0IsSUFBSSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ25DLElBQUksVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUU1Qyx1Q0FBdUM7Z0JBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFDLEVBQUU7b0JBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUkscUJBQXFCLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7aUJBQ3pFO2dCQUVELDhDQUE4QztnQkFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLFlBQVksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7YUFDMUU7WUFFRCx1QkFBdUI7WUFDdkIsSUFBSSxTQUFTLEdBQTRCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwRyxLQUFLLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDekMsb0RBQW9EO2dCQUNwRCwyQ0FBMkM7Z0JBQzNDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDbEMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMxRTtZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDMUQ7SUFDTCxDQUFDO0lBRUQ7O01BRUU7SUFDRixpQkFBaUIsQ0FBQyxTQUFrQztRQUNoRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN2QyxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdkIsMERBQTBEO1lBQzFELElBQUkscUJBQXFCLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRTNELDJCQUEyQjtZQUMzQixJQUFJLGVBQWUsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRS9HLDZDQUE2QztZQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLGVBQWUsQ0FBQyxFQUFFO2dCQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLHFCQUFxQixDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUMzRTtZQUVELHNGQUFzRjtZQUN0Rix5Q0FBeUM7WUFDekMsR0FBRyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGVBQWUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQztZQUN4RSxJQUFJLFdBQVcsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ2hFLElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzNFLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUN0RTtpQkFBTTtnQkFDSCxXQUFXLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNwQztZQUVELDRDQUE0QztZQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNuRDtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksZ0JBQWdCLENBQUMsRUFBRSxJQUFVLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVoRTs7OztPQUlHO0lBQ0ksaUJBQWlCLENBQUMsRUFBRSxJQUFVLENBQUM7SUFFdEM7O09BRUc7SUFDSSxPQUFPO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQ2hCLE9BQU87UUFFWCw0SUFBNEk7UUFDNUksSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDOUMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUVwQiwrSEFBK0g7WUFDL0gseUZBQXlGO1lBQ3pGLDZDQUE2QztZQUM3QyxpRkFBaUY7WUFDakYseUZBQXlGO1lBQ3pGLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ2pCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBcUIsQ0FBQztnQkFFdkYsSUFBSSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7Z0JBQzlCLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtvQkFDNUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDeEIsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFO3dCQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFBO3dCQUN4QixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFOzRCQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUM7NEJBQy9DLGlCQUFpQixHQUFHLElBQUksQ0FBQzs0QkFDekIsTUFBTTt5QkFDVDtxQkFDSjtvQkFDRCxJQUFJLGlCQUFpQjt3QkFDakIsTUFBTTtpQkFDYjtnQkFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLGFBQWEsQ0FBQTtnQkFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUF1QixDQUFDO1FBRXBGLHdIQUF3SDtRQUN4SCxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUMzRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGVBQWUsQ0FBQyxHQUFxQjtRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVNLHVCQUF1QjtRQUMxQixJQUFJLE1BQU0sR0FBc0QsRUFBRSxDQUFDO1FBRW5FLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN2QyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRCxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEQsT0FBTyxDQUFDLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFUCxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTNCLHVEQUF1RDtRQUN2RCw4REFBOEQ7SUFDbEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyx3QkFBd0I7UUFDNUIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTNCLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRTtnQkFDZixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUN6QixDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsUUFBUTtvQkFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDMUI7WUFDRCxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUU7Z0JBQ2QsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDekIsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxRQUFRLElBQUksQ0FBQyxDQUFDLE9BQU87b0JBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2FBQ3pCO1NBQ0o7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssUUFBUSxDQUFDLElBQVk7UUFDekIsSUFBSSxLQUFLLEdBQUcsa0ZBQWtGLENBQUM7UUFFL0YsSUFBSSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBQzNCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztRQUNyQixPQUFPLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9CLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0IsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXZFLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxPQUFPLFNBQVMsTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ3JJO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLFVBQVUsQ0FBQyxHQUFXLEVBQUUsUUFBZ0IsRUFBRSxLQUFhO1FBQzFELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSTtZQUNBLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDZixLQUFLLFFBQVEsQ0FBQztnQkFDZCxLQUFLLE1BQU07b0JBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxRQUFRLEtBQUssSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hJLEtBQUssU0FBUztvQkFDVixPQUFPLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkksS0FBSyxRQUFRO29CQUNULE9BQU8sSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoTCxLQUFLLE1BQU07b0JBQ1AsSUFBSSxXQUFXLEdBQUcsaUNBQWlDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQztvQkFDbEUsSUFBSSxXQUFXLEdBQUcsaUNBQWlDLEtBQUssSUFBSSxDQUFDO29CQUU3RCxRQUFRLFFBQVEsRUFBRTt3QkFFZCxLQUFLLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsV0FBVyxPQUFPLFdBQVcsUUFBUSxXQUFXLGVBQWUsV0FBVyxXQUFXLFdBQVcsSUFBSSxDQUFDLENBQUM7d0JBQ2hJLEtBQUssSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxXQUFXLE9BQU8sV0FBVyxPQUFPLFdBQVcsZ0JBQWdCLFdBQVcsV0FBVyxXQUFXLEdBQUcsQ0FBQyxDQUFDO3dCQUMvSCxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsV0FBVyxlQUFlLFdBQVcsZUFBZSxXQUFXLFlBQVksV0FBVyxHQUFHLENBQUMsQ0FBQzt3QkFDcEgsS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLFdBQVcsZUFBZSxXQUFXLGVBQWUsV0FBVyxhQUFhLFdBQVcsR0FBRyxDQUFDLENBQUM7d0JBQ3JILEtBQUssSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxXQUFXLGVBQWUsV0FBVyxnQkFBZ0IsV0FBVyxZQUFZLFdBQVcsUUFBUSxXQUFXLFlBQVksV0FBVyxJQUFJLENBQUMsQ0FBQzt3QkFDakssS0FBSyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLFdBQVcsZUFBZSxXQUFXLGdCQUFnQixXQUFXLGFBQWEsV0FBVyxRQUFRLFdBQVcsWUFBWSxXQUFXLElBQUksQ0FBQyxDQUFDO3FCQUNySzthQUNSO1NBQ0o7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO1lBQzVFLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsTUFBTSx3Q0FBd0MsR0FBRyxzQkFBc0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxjQUFjO0lBQ04sd0JBQXdCLENBQUksSUFBTyxFQUFFLElBQU8sRUFBRSxvQkFBNkIsS0FBSztRQUNwRixJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksTUFBTSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM5RyxPQUFPLElBQUksQ0FBQztRQUNoQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsY0FBYztJQUNQLFNBQVMsQ0FBQyxTQUEyQixFQUFFLE1BQWMsRUFBRSxJQUFhO1FBQ3ZFLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyw4RkFBOEYsQ0FBQyxDQUFDO1lBQzlHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1NBQ2hCOztZQUVHLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEUsQ0FBQzs7a0hBdFlRLHFCQUFxQjtzR0FBckIscUJBQXFCLDRlQVpuQjtRQUNQLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUU7UUFDM0Q7WUFDSSxPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUM7WUFDcEQsS0FBSyxFQUFFLElBQUk7U0FDZDtLQUNKLDBCQzFCTCxrd01BaUVjOzJGRGxDRCxxQkFBcUI7a0JBZGpDLFNBQVM7K0JBQ0ksZUFBZSxhQUNkO3dCQUNQLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUU7d0JBQzNEOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDOzRCQUNwRCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSixpQkFFYyxpQkFBaUIsQ0FBQyxJQUFJO3dOQXNCNUIsV0FBVztzQkFBbkIsS0FBSztnQkFHRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFHRyxrQ0FBa0M7c0JBQTFDLEtBQUs7Z0JBR0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUdPLGVBQWU7c0JBQTNCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBVbnR5cGVkRm9ybUNvbnRyb2wsIE5nQ29udHJvbCwgTmdGb3JtLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGZvcndhcmRSZWYsIEluamVjdG9yLCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvbG9jYWxpemF0aW9uc1wiO1xyXG5pbXBvcnQgeyBEYXRlU2VydmljZSwgVXRpbGl0eVNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2V4dGVuc2lvbnNcIjtcclxuXHJcbi8vIENsYXNzaVxyXG5pbXBvcnQgeyBHZW5lcmljUGFyYW1ldGVyIH0gZnJvbSAnLi9tb2RlbHMvR2VuZXJpY1BhcmFtZXRlcic7XHJcblxyXG4vLyBBcHBsaWNhemlvbmVcclxuaW1wb3J0IHsgRXNQYXJhbWV0ZXJzTG9jIH0gZnJvbSBcIi4vZXNfcGFyYW1ldGVycy5jb21wb25lbnQubG9jXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgR2VuZXJpY1BhcmFtZXRlckdyb3VwIH0gZnJvbSBcIi4vbW9kZWxzL0dlbmVyaWNQYXJhbWV0ZXJHcm91cFwiO1xyXG5cclxuLyoqIENvbXBvbmVudGUgY2hlIHBlcm1ldHRlIGRpIGdyYWZpY2FyZSB1bmEgbGlzdGEgZGkgKipHZW5lcmljUGFyYW1ldGVyKiogY29tZSBJbnB1dCBpbiBiYXNlIGFsIGxvcm8gdGlwbyBzcGVjaWZpY28gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogXCJlcy1wYXJhbWV0ZXJzXCIsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7IHByb3ZpZGU6IExvY2FsaXphdGlvblNlcnZpY2UsIHVzZUNsYXNzOiBFc1BhcmFtZXRlcnNMb2MgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBFc1BhcmFtZXRlcnNDb21wb25lbnQpLFxyXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgIF0sXHJcbiAgICBzdHlsZVVybHM6IFtcIi4vZXNfcGFyYW1ldGVycy5jb21wb25lbnQuc2Nzc1wiXSxcclxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2VzX3BhcmFtZXRlcnMuY29tcG9uZW50Lmh0bWxcIlxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXNQYXJhbWV0ZXJzQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKiBNb2RlbGxvIGRlbCBjb21wb25lbnRlIHN1IGN1aSB2ZW5nb25vIGVmZmV0dHVhdGUgbGUgZ3JhZmljYXppb25pICovXHJcbiAgICBwdWJsaWMgUGFyYW1ldGVyczogR2VuZXJpY1BhcmFtZXRlcltdO1xyXG5cclxuICAgIC8qKiBNb2RlbGxvIGRlbCBjb21wb25lbnRlIHN1IGN1aSB2ZW5nb25vIGVmZmV0dHVhdGUgbGUgZ3JhZmljYXppb25pICovXHJcbiAgICBwdWJsaWMgR3JvdXBzOiBHZW5lcmljUGFyYW1ldGVyR3JvdXBbXTtcclxuXHJcbiAgICAvKiogQ2FjaGUgcGVyIGZhcmUgbG9va3VwIHJhcGlkaSBpbiBmYXNlIGRpIHZhbHV0YXppb25lIGVzcHJlc3Npb25pIGRpIHZpc2liaWxpdMOgIGUgb2JibGlnYXRvcmlldMOgICovXHJcbiAgICBwcml2YXRlIFBhcmFtZXRlcnNDYWNoZTogeyBbaWQ6IHN0cmluZ106IEdlbmVyaWNQYXJhbWV0ZXIgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpcGVsaW5lIGRpIEFuZ3VsYXIgXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuICAgIC8qKiBJbmRpY2EgY2hlIGlsIHBhcmFtZXRybyBkZXZlIGVzc2VyZSBpbiBtb2RhbGl0w6AgZGlzcGxheSAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIGNoZSBsJ3VsdGltbyBwYXJhbWV0cm8gbm9uIGRldmUgYXZlcmUgbWFyZ2luZSBpbiBmb25kbyAqL1xyXG4gICAgQElucHV0KCkgTGFzdFBhcmFtZXRlck5vTWFyZ2luOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIGNvbC1tZC1YIHBlciBsYSBsYWJlbCAqL1xyXG4gICAgQElucHV0KCkgTGFiZWxDb2xXaWR0aDogbnVtYmVyID0gNDtcclxuXHJcbiAgICAvKiogY29sLW1kLVggcGVyIGwnaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIElucHV0Q29sV2lkdGg6IG51bWJlciA9IDg7XHJcblxyXG4gICAgLyoqIElucHV0IGEgY3VpIGNvbGxlZ2FyZSBsYSB2YXJpYWJpbGUgKipzdWJtaXR0ZWQqKiBkZWwgZm9ybSBhbGwnaW50ZXJubyBkZWwgcXVhbGUgdmllbmUgdXRpbGl6emF0byBxdWVzdG8gY29tcG9uZW50ZSAqL1xyXG4gICAgQElucHV0KCkgc3VibWl0dGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIFZhbG9yZSBkYSBtb3N0cmFyZSBxdWFsb3JhIG5vbiBmb3NzZXJvIGFuY29yYSByaWNldnV0aSBpICoqUGFyYW1ldGVycyoqIGRhIG1vc3RyYXJlICovXHJcbiAgICBASW5wdXQoKSBFbXB0eU1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIFBlcm1ldHRlIGRpIHJpbXVvdmVyZSBpIHBhcmFtZXRyaSBkYWxsYSBsaXN0YSBjbGljY2FuZG8gc3VsbGEgWCBkYXZhbnRpIGFsbGEgTGFiZWwgKi9cclxuICAgIEBJbnB1dCgpIFJlbW92YWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIHNlIGkgY29tcG9uZW50aSBkaSBJbnB1dCBnZW5lcmF0aSBzb25vIFJlYWRvbmx5IG8gbm8gKi9cclxuICAgIEBJbnB1dCgpIFJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSBpIGNvbXBvbmVudGkgZGkgSW5wdXQgZ2VuZXJhdGkgc29ubyBSZWFkb25seSBvIG5vICovXHJcbiAgICBASW5wdXQoKSBMaXN0Rm9ybWF0OiAnQ29tbWFTZXBhcmF0ZWQnIHwgJ0FycmF5JyA9ICdBcnJheSc7XHJcblxyXG4gICAgLyoqIEZvcm0gY2hlIHV0aWxpenphIGlsIGNvbXBvbmVudGUuIEZvbmRhbWVudGFsZSBjb2xsZWdhcmxvIHNlIHNpIHZvZ2xpb25vIGxlIHZhbGlkYXppb25pIHN1bCBzdWJtaXQgKi9cclxuICAgIEBJbnB1dCgpIEZvcm06IE5nRm9ybSA9IG51bGw7XHJcblxyXG4gICAgLyoqIFF1YW5kbyB1dGlsaXp6YSB1biBzb3R0b2NvbXBvbmVudGUgYXV0b2NvbXBsZXRlIGFiaWxpdGEgbyBkaXNhYmlsaXRhIGlsIHJlc2V0IGRlbGwnaW5wdXQgcGVyIG9nbmkgc2VsZXppb25lICovXHJcbiAgICBASW5wdXQoKSBBdXRvY29tcGxldGVIaWRlQ2hvaWNlc09uU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRhIHV0aWxpenphcmUgcGVyIHRpcmFyZSBmdW9yaSBpIGRhdGkgZGkgdW4gYXV0b2NvbXBsZXRlICovXHJcbiAgICBASW5wdXQoKSBBdXRvQ29tcGxldGVEYXRhUmV0cmlldmU6IChwYXJhbWV0ZXI6IEdlbmVyaWNQYXJhbWV0ZXIsIHNlYXJjaDogc3RyaW5nLCBieWlkOiBib29sZWFuKSA9PiBPYnNlcnZhYmxlPHsgaWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyB9W10+XHJcblxyXG4gICAgLyoqIFBlcm1ldHRlIGRpIHNldHRhcmUgaW4gdW5hIHZvbHRhIHNvbG8gZ2xpIGlucHV0ICoqTGFiZWxDb2xXaWR0aCoqIGUgKipJbnB1dENvbFdpZHRoKiosIGJhc3RhIHNjcml2ZXJsbyBjb24gbGEgc2ludGFzc2kgXCJYIFlcIiAqL1xyXG4gICAgQElucHV0KCkgc2V0IExhYmVsSW5wdXRSYXRpbyhpbnB1dDogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHJhdGlvID0gaW5wdXQuc3BsaXQoL1xccy8pO1xyXG4gICAgICAgIHRoaXMuTGFiZWxDb2xXaWR0aCA9IHBhcnNlSW50KHJhdGlvWzBdKTtcclxuICAgICAgICB0aGlzLklucHV0Q29sV2lkdGggPSBwYXJzZUludChyYXRpb1sxXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3N0cnV0dG9yZVxyXG4gICAgICogXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdXRpRXh0czogVXRpbGl0eVNlcnZpY2UsIHB1YmxpYyBsYzogTG9jYWxpemF0aW9uU2VydmljZSwgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgaW5qOiBJbmplY3RvciwgcHVibGljIGRhdGVzOiBEYXRlU2VydmljZSkgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQaXBlbGluZSBkaSBBbmd1bGFyXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHdyaXRlVmFsdWUob2JqKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5QYXJhbWV0ZXJzID0gb2JqO1xyXG5cclxuICAgICAgICB0aGlzLlBhcmFtZXRlcnNDYWNoZSA9IHt9O1xyXG4gICAgICAgIGlmICghdGhpcy5QYXJhbWV0ZXJzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuUGFyYW1ldGVycy5mb3JFYWNoKHQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLlBhcmFtZXRlcnNDYWNoZVt0LmlkXSA9IHQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXQudHlwZWNvZGUgJiYgIXQudHlwZSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk5vbiDDqCBzdGF0byBzcGVjaWZpY2F0byBuw6kgdW4gdHlwZSBuw6kgdW4gdHlwZWNvZGVcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAodC50eXBlY29kZSAmJiAhdC50eXBlKVxyXG4gICAgICAgICAgICAgICAgdC50eXBlID0gdGhpcy51dGlFeHRzLmdldEpzVHlwZUZyb21UeXBlQ29kZSh0LnR5cGVjb2RlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0LnR5cGVjb2RlICYmIHQudHlwZSAhPSB0aGlzLnV0aUV4dHMuZ2V0SnNUeXBlRnJvbVR5cGVDb2RlKHQudHlwZWNvZGUpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBSaWxldmF0ZSBpbmNvbnNpc3RlbnplIGZyYSBpbCBUaXBvICR7dC50eXBlfSBlIGlsIFRpcG8gJHt0aGlzLnV0aUV4dHMuZ2V0SnNUeXBlRnJvbVR5cGVDb2RlKHQudHlwZWNvZGUpfSBjYWxjb2xhdG8gZGEgVHlwZUNvZGUgJHt0LnR5cGVjb2RlfSBwZXIgaWwgcGFyYW1ldHJvICR7dC5pZH1gKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0LnR5cGUgPT0gXCJib29sZWFuXCIpXHJcbiAgICAgICAgICAgICAgICB0LnZhbHVlID0gdC52YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XHJcblxyXG4gICAgICAgICAgICBpZiAodC5lbnVtdHlwZSB8fCB0LmRpY3R0eXBlKVxyXG4gICAgICAgICAgICAgICAgdC50eXBlID0gJ2VudW0nO1xyXG5cclxuICAgICAgICAgICAgLy8gVmFsb3JlIHZhbGlkbyBtYSBtb2RhbGl0w6AgZGkgdXRpbGl6em8gYSBDb21tYVNlcGFyYXRlZCwgZGV2byBhc3NpY3VyYXJtaSBkaSByaWVtZXR0ZXJlIGxhIHZlcnNpb25lIGNvbiBsYSBzdHJpbmdhXHJcbiAgICAgICAgICAgIGlmICh0LnR5cGUgPT0gJ2VudW0nICYmIHRoaXMuTGlzdEZvcm1hdCA9PSAnQ29tbWFTZXBhcmF0ZWQnICYmIHQubXVsdGllbnVtICYmIHQudmFsdWUgJiYgQXJyYXkuaXNBcnJheSh0LnZhbHVlKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gQWdnaXVzdG8gbGUgbW9kYWxpdMOgIGRpIGZ1bnppb25hbWVudG8gZGVpIHBhcmFtZXRyaSBsaXN0YS4gQ2hlIGludGVybmFtZW50ZSBmdW56aW9uYW5vIHNlbXByZSBjb24gdW5hIGxpc3RhIGRpIHZhbG9yaVxyXG4gICAgICAgICAgICBpZiAodC50eXBlID09ICdlbnVtJyAmJiB0aGlzLkxpc3RGb3JtYXQgPT0gJ0NvbW1hU2VwYXJhdGVkJyAmJiB0Lm11bHRpZW51bSAmJiB0LnZhbHVlICYmICFBcnJheS5pc0FycmF5KHQudmFsdWUpKVxyXG4gICAgICAgICAgICAgICAgdC52YWx1ZSA9IHQudmFsdWUgPyB0LnZhbHVlLnNwbGl0KCcsJykubWFwKHQgPT4gdC50cmltKCkpIDogW107XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmV2aWV3UGFyYW1ldGVyc0JpbmRpbmdzKCk7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUdyb3VwcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBNZXRvZG8gY2hlIHNpIG9jY3VwYSBkaSBjcmVhcmUgZSBvcmRpbmFyZSBpIGdydXBwaSBkZWkgcGFyYW1ldHJpXHJcbiAgICAqL1xyXG4gICAgZ2VuZXJhdGVHcm91cHMoKSB7XHJcbiAgICAgICAgdGhpcy5Hcm91cHMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuUGFyYW1ldGVycz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLlBhcmFtZXRlcnMuc29ydCgoYSwgYikgPT4gYS5vcmRlciA8IGIub3JkZXIgPyAtMSA6IDEpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2ljbG8gdHV0dGkgaSBwYXJhbWV0cmlcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHRoaXMuUGFyYW1ldGVycy5sZW5ndGggPiBpOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBwYXIgPSB0aGlzLlBhcmFtZXRlcnNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHBhckdyb3VwTmFtZSA9IHBhci5ncm91cCA/PyBcIlwiO1xyXG4gICAgICAgICAgICAgICAgbGV0IGdyb3VwT3JkZXIgPSBwYXIuZ3JvdXAgPyBwYXIub3JkZXIgOiAtMTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZSBpbCBncnVwcG8gbm9uIGVzaXN0ZSwgbG8gYWdnaXVuZ29cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5Hcm91cHMuc29tZSh4ID0+IHguZ3JvdXBOYW1lID09IHBhckdyb3VwTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkdyb3Vwcy5wdXNoKG5ldyBHZW5lcmljUGFyYW1ldGVyR3JvdXAocGFyR3JvdXBOYW1lLCBncm91cE9yZGVyKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSW5zZXJpc2NvIGlsIHBhcmFtZXRybyBkZW50cm8gYWwgc3VvIGdydXBwb1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Hcm91cHMuZmluZChnID0+IGcuZ3JvdXBOYW1lID09IHBhckdyb3VwTmFtZSkucGFyYW1ldGVycy5wdXNoKHBhcilcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gR2VzdGlvbmUgc290dG9ncnVwcGlcclxuICAgICAgICAgICAgbGV0IHN1Ymdyb3VwczogR2VuZXJpY1BhcmFtZXRlckdyb3VwW10gPSB0aGlzLkdyb3Vwcy5maWx0ZXIoZ3JvdXAgPT4gZ3JvdXAuZ3JvdXBOYW1lLmluY2x1ZGVzKCfCpycpKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgXzsgc3ViZ3JvdXBzLmxlbmd0aCA+IDA7ICgpID0+IHsgfSkge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVjdXBlcm8gbGEgbGlzdGEgZGkgZ3J1cHBpIGNoZSBoYW5ubyBzb3R0b2dydXBwaVxyXG4gICAgICAgICAgICAgICAgLy8gUGVyIGNvbnZlbnppb25lLCBuZWwgbm9tZSBjb250ZW5nb25vIFwiwqdcIlxyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0FkZFN1Ymdyb3VwcyhzdWJncm91cHMpO1xyXG4gICAgICAgICAgICAgICAgc3ViZ3JvdXBzID0gdGhpcy5Hcm91cHMuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmdyb3VwTmFtZS5pbmNsdWRlcygnwqcnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuR3JvdXBzLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgPCBiLm9yZGVyID8gLTEgOiAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIE1ldG9kbyBjaGUgc2kgb2NjdXBhIGRpIGNyZWFyZSBlIG9yZGluYXJlIGkgc290dG9ncnVwcGkgZGVpIHBhcmFtZXRyaVxyXG4gICAgKi9cclxuICAgIHRyeVRvQWRkU3ViZ3JvdXBzKHN1Ymdyb3VwczogR2VuZXJpY1BhcmFtZXRlckdyb3VwW10pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgc3ViZ3JvdXBzLmxlbmd0aCA+IGk7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgc3ViID0gc3ViZ3JvdXBzW2ldO1xyXG5cclxuICAgICAgICAgICAgLy8gT3R0ZW5nbyB1biBsaXN0YSBjb24gbGEgZ2VyYXJjaGlhIGRlaSBncnVwcGksIGluIG9yZGluZVxyXG4gICAgICAgICAgICBsZXQgZ3JvdXBzUGFyZW50SGllcmFyY2h5ID0gc3ViLmdyb3VwTmFtZS5zcGxpdCgnwqcnKSA/PyBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlY3VwZXJvIGlsIGdydXBwbyBwYWRyZVxyXG4gICAgICAgICAgICBsZXQgcGFyZW50R3JvdXBOYW1lID0gc3ViLmdyb3VwTmFtZS5yZXBsYWNlKGDCpyR7Z3JvdXBzUGFyZW50SGllcmFyY2h5W2dyb3Vwc1BhcmVudEhpZXJhcmNoeS5sZW5ndGggLSAxXX1gLCBgYCk7XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBpbCBncnVwcG8gcGFkcmUgbm9uIGVzaXN0ZSwgbG8gYWdnaXVuZ29cclxuICAgICAgICAgICAgaWYgKCF0aGlzLkdyb3Vwcy5zb21lKHggPT4geC5ncm91cE5hbWUgPT0gcGFyZW50R3JvdXBOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Hcm91cHMucHVzaChuZXcgR2VuZXJpY1BhcmFtZXRlckdyb3VwKHBhcmVudEdyb3VwTmFtZSwgc3ViLm9yZGVyKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFJpbXVvdm8gZGFsIG5vbWUgZGVsIGdydXBwbyBsJ2luZm9ybWF6aW9uZSBzdWwgcGFkcmUgKFNpc3RlbWFuZG8gYW5jaGUgbCdldGljaGV0dGEpXHJcbiAgICAgICAgICAgIC8vIGUgbG8gYWdnaXVuZ28gYWkgc290dG9ncnVwcGkgZGVsIHBhZHJlXHJcbiAgICAgICAgICAgIHN1Yi5ncm91cE5hbWUgPSBzdWIuZ3JvdXBOYW1lLnJlcGxhY2UoYCR7cGFyZW50R3JvdXBOYW1lfcKnYCwgJycpO1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50R3JvdXAgPSB0aGlzLkdyb3Vwcy5maW5kKHggPT4geC5ncm91cE5hbWUgPT0gcGFyZW50R3JvdXBOYW1lKTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudEdyb3VwPy5zdWJncm91cHMuc29tZShzID0+IHMuZ3JvdXBOYW1lID09IHN1Yi5ncm91cE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gcGFyZW50R3JvdXAuc3ViZ3JvdXBzLmZpbmQoZiA9PiBmLmdyb3VwTmFtZSA9PSBzdWIuZ3JvdXBOYW1lKTtcclxuICAgICAgICAgICAgICAgIHN1Yi5wYXJhbWV0ZXJzLm1hcChwID0+IHRhcmdldC5wYXJhbWV0ZXJzLnB1c2gocCkpO1xyXG4gICAgICAgICAgICAgICAgc3ViLnN1Ymdyb3Vwcy5tYXAocyA9PiB0YXJnZXQuc3ViZ3JvdXBzLnB1c2gocykpO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Lm9yZGVyID0gc3ViLm9yZGVyIDwgdGFyZ2V0Lm9yZGVyID8gc3ViLm9yZGVyIDogdGFyZ2V0Lm9yZGVyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50R3JvdXA/LnN1Ymdyb3Vwcy5wdXNoKHN1Yik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFJpbXVvdm8gaWwgc290dG9ncnVwcG8gZ3J1cHBvIGRhbGxhIGxpc3RhXHJcbiAgICAgICAgICAgIHRoaXMuR3JvdXBzLnNwbGljZSh0aGlzLkdyb3Vwcy5pbmRleE9mKHN1YiksIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpcGVsaW5lIGRpIEFuZ3VsYXJcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbik6IHZvaWQgeyB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQaXBlbGluZSBkaSBBbmd1bGFyXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKTogdm9pZCB7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgc2kgb2NjdXBhIGRpIGdlc3RpcmUgaWwgbW9kZWxsbyBpbiB1c2NpdGEgZSBwcm9wYWdhcmxvIHN1bCBiaW5kaW5nIG5nTW9kZWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNoYW5nZWQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLlBhcmFtZXRlcnMpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gU2UgY2kgc29ubyBkZWxsZSBtb2RpZmljaGUgYWkgYmluZGluZyBwb3RyZWJiZXJvIGVzc2VyZSBjYW1iaWF0aSBpIHJlcXVpcmVkLiBSaWNyZW8gdHV0dGkgaSBjb21wb25lbnRpIGUgcmktaWRyYXRvIGxhIGNhY2hlIGRlaSBwYXJhbWV0cmlcclxuICAgICAgICB2YXIgY2hhbmdlcyA9IHRoaXMucmV2aWV3UGFyYW1ldGVyc0JpbmRpbmdzKCk7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgLy8gSW4gYmFzZSBhaSBiaW5kaW5nIGNhbWJpYXRpIGRldm8gdHJvdmFyZSB0dXR0aSBpIHBhcmFtZXRyaSBjaGUgaGFuIHN1Yml0byBtb2RpZmljaGUgc3RydXR0dXJhbGkgKHZpc2liaWxpdMOgLCBvYmJsaWdhdG9yaWV0w6ApXHJcbiAgICAgICAgICAgIC8vIGRpc3RydWdnZXJsaSBlIHJpY3JlYXJsaSBpbiBtb2RvIGNoZSBpIGJpbmRpbmcgbGF0byBodG1sIHNpIGFnZ2lvcm5pbm8gZGkgY29uc2VndWVuemEuXHJcbiAgICAgICAgICAgIC8vIDE6IEZhY2NpbyB1bmEgY29waWEgZGVsIHBhcmFtZXRybyBjb3JyZW50ZVxyXG4gICAgICAgICAgICAvLyAyOiBUcm92byBsYSBzdWEgcG9zaXppb25lIGFsbCdpbnRlcm5vIGRlaSBncnVwcGkgZSBsbyBzb3N0aXR1aXNjbyBjb24gbGEgY29waWFcclxuICAgICAgICAgICAgLy8gMzogQWdnaW9ybm8gbGEgbGlzdGEgZGVpIHBhcmFtZXRyaSBlIGxhIHN1YSBjYWNoZSBpbiBtb2RvIGRhIHB1bnRhcmUgYWxsJ29nZ2V0dG8gbnVvdm9cclxuICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoKGNoID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuUGFyYW1ldGVycy5maW5kSW5kZXgodCA9PiB0LmlkID09IGNoKTtcclxuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJDb3B5ID0gdGhpcy51dGlFeHRzLmRlZXBDbG9uZSh0aGlzLlBhcmFtZXRlcnNbaW5kZXhdKSBhcyBHZW5lcmljUGFyYW1ldGVyO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJSZWZGaXhlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWcgPSAwOyBpZyA8IHRoaXMuR3JvdXBzLmxlbmd0aDsgaWcrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBnID0gdGhpcy5Hcm91cHNbaWddO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGlwID0gMDsgaXAgPCBnLnBhcmFtZXRlcnMubGVuZ3RoOyBpcCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gZy5wYXJhbWV0ZXJzW2lwXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PT0gdGhpcy5QYXJhbWV0ZXJzW2luZGV4XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Hcm91cHNbaWddLnBhcmFtZXRlcnNbaXBdID0gcGFyYW1ldGVyQ29weTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclJlZkZpeGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJSZWZGaXhlZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFyYW1ldGVyc1tpbmRleF0gPSBwYXJhbWV0ZXJDb3B5XHJcbiAgICAgICAgICAgICAgICB0aGlzLlBhcmFtZXRlcnNDYWNoZVtjaF0gPSB0aGlzLlBhcmFtZXRlcnNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIFBhcmFtZXRlcnNDbG9uZSA9IHRoaXMudXRpRXh0cy5kZWVwQ2xvbmUodGhpcy5QYXJhbWV0ZXJzKSBhcyBHZW5lcmljUGFyYW1ldGVyW107XHJcblxyXG4gICAgICAgIC8vIEFnZ2l1c3RvIGxlIG1vZGFsaXTDoCBkaSBmdW56aW9uYW1lbnRvIGRlaSBwYXJhbWV0cmkgbGlzdGEuIENoZSBpbnRlcm5hbWVudGUgZnVuemlvbmFubyBzZW1wcmUgY29uIHVuYSBsaXN0YSBkaSB2YWxvcmlcclxuICAgICAgICBQYXJhbWV0ZXJzQ2xvbmU/LmZvckVhY2godCA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0LnR5cGUgPT0gXCJlbnVtXCIgJiYgdGhpcy5MaXN0Rm9ybWF0ID09ICdDb21tYVNlcGFyYXRlZCcgJiYgdC5tdWx0aWVudW0gJiYgdC52YWx1ZSAmJiBBcnJheS5pc0FycmF5KHQudmFsdWUpKVxyXG4gICAgICAgICAgICAgICAgdC52YWx1ZSA9IHQudmFsdWUuam9pbignLCcpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZShQYXJhbWV0ZXJzQ2xvbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmltdW92ZSBpbCBwYXJhbWV0cm8gc2VsZXppb25hdG8gZSBwcm9wYWdhIGlsIG1vZGVsbG9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtHZW5lcmljUGFyYW1ldGVyfSBwYXIgUGFyYW1ldHJvIGRhIHJpbXVvdmVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlUGFyYW1ldGVyKHBhcjogR2VuZXJpY1BhcmFtZXRlcikge1xyXG4gICAgICAgIHRoaXMuUGFyYW1ldGVycy5zcGxpY2UodGhpcy5QYXJhbWV0ZXJzLmluZGV4T2YocGFyKSwgMSk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdlbmVyYXRlUGFyYW1ldGVyR3JvdXBzKCkge1xyXG4gICAgICAgIGxldCBHcm91cHM6IHsgaWQ6IHN0cmluZywgZ3JvdXBzOiBzdHJpbmdbXSwgb3JkZXI6IG51bWJlciB9W10gPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5QYXJhbWV0ZXJzLmZvckVhY2gocGFyYW0gPT4ge1xyXG4gICAgICAgICAgICBHcm91cHMucHVzaCh7IGlkOiBwYXJhbS5pZCwgZ3JvdXBzOiBwYXJhbS5ncm91cC5zcGxpdChcIsKnXCIpLCBvcmRlcjogcGFyYW0ub3JkZXIgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBHcm91cGVkR3JvdXBzID0gR3JvdXBzLnJlZHVjZSgociwgYSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3RHcm91cElkID0gYS5ncm91cHM/Lmxlbmd0aCA+IDAgPyBhLmdyb3Vwc1swXSA6IFwiXCI7XHJcbiAgICAgICAgICAgIHJbZmlyc3RHcm91cElkXSA9IFsuLi5yW2ZpcnN0R3JvdXBJZF0gfHwgW10sIGFdO1xyXG4gICAgICAgICAgICByZXR1cm4gcjtcclxuICAgICAgICB9LCB7fSk7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKEdyb3VwZWRHcm91cHMpO1xyXG5cclxuICAgICAgICAvLyBDaWNsbyBkZWwgcmlzdWx0YXRvLCBhZ2dpdW5nZW5kbyBpIGdydXBwaSBhbCBtb2RlbGxvXHJcbiAgICAgICAgLy8gUGVyIG9nbmkgZ3J1cHBvIGNoZSBhZ2dpdW5nbywgYXNzZWdubyBpIHBhcmFtZXRyaSBpbiBvcmRpbmVcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJpdmVkZSBpIGJpbmRpbmdzIGRlaSBwYXJhbWV0cmkgaW4gYmFzZSBhIGxvcm8gZXZlbnR1YWxpIGVzcHJlc3Npb25pIGRpIGNvbnRyb2xsb1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IGxpc3RhIGNvbiBnbGkgaWQgZGVpIHBhcmFtZXRyaSBjaGUgc29ubyBzdGF0aSBtb2RpZmljYXRpXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmV2aWV3UGFyYW1ldGVyc0JpbmRpbmdzKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICBsZXQgY2hhbmdlcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5QYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBwID0gdGhpcy5QYXJhbWV0ZXJzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKHAucmVxdWlyZWRleHApIHtcclxuICAgICAgICAgICAgICAgIGxldCBwcmV2UmVxID0gcC5yZXF1aXJlZDtcclxuICAgICAgICAgICAgICAgIHAucmVxdWlyZWQgPSB0aGlzLmV2YWx1YXRlKHAucmVxdWlyZWRleHApO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZSZXEgIT0gcC5yZXF1aXJlZClcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2gocC5pZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHAudmlzaWJsZWV4cCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByZXZWaXNpID0gcC52aXNpYmxlO1xyXG4gICAgICAgICAgICAgICAgcC52aXNpYmxlID0gdGhpcy5ldmFsdWF0ZShwLnZpc2libGVleHApO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZWaXNpICE9IHAudmlzaWJsZSlcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2gocC5pZClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2hhbmdlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbHV0YSB1bidlc3ByZXNzaW9uZSBpbiBiYXNlIGFpIHBhcmFtZXRyaSBwcmVzZW50aSBuZWwgbW9kZWxsbyBhdHR1YWxlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBleHByIEVzcHJlc3Npb25lIGRhIHZhbHV0YXJlIHNjcml0dGEgbmVsIGZvcm1hdG8gKHJpcGV0aWJpbGUpIFwiSUQgKD09fCE9fDx8Pnw+PXw8PSkgKGB2YWxvcmVgIHwgbnVsbCB8IHRydWUgfCBmYWxzZSB8IFhYWCxYWFgpXCIgc2VwYXJhdG8gZXZlbnR1YWxtZW50ZSBkYSAmJiBlZCB8fFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyAqKnRydWUqKiBzZSBsYSBjb25kaXppb25lIMOoIHZlcmlmaWNhdGEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZXZhbHVhdGUoZXhwcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdmFyIHJlZ2V4ID0gL1xccz8oW2EtekEtWjAtOV8tXSspXFxzPyghPXw9PXw8fD58PD18Pj0pXFxzPyhgW15gXStgfGBgfG51bGx8WzAtOSxdK3x0cnVlfGZhbHNlKS9nbTtcclxuXHJcbiAgICAgICAgdmFyIG1hdGNoZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgdmFyIGZpbmFsRXhwciA9IGV4cHI7XHJcbiAgICAgICAgd2hpbGUgKG1hdGNoZXMgPSByZWdleC5leGVjKGV4cHIpKSB7XHJcbiAgICAgICAgICAgIHZhciBmdWxsTWF0Y2ggPSBtYXRjaGVzWzBdLnRyaW0oKTtcclxuICAgICAgICAgICAgdmFyIGlkID0gbWF0Y2hlc1sxXS50cmltKCk7XHJcbiAgICAgICAgICAgIHZhciBvcGVyYXRpb24gPSBtYXRjaGVzWzJdLnRyaW0oKTtcclxuICAgICAgICAgICAgbGV0IGJWYWx1ZSA9IG1hdGNoZXNbM10udHJpbSgpLnRyaW0oKTtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gbWF0Y2hlc1szXS50cmltKCkudHJpbSgpLnJlcGxhY2UoJ2AnLCAnJykucmVwbGFjZSgnYCcsICcnKTtcclxuXHJcbiAgICAgICAgICAgIGZpbmFsRXhwciA9IGZpbmFsRXhwci5yZXBsYWNlKGZ1bGxNYXRjaCwgYHRoaXMuY2hlY2tWYWx1ZSgnJHtpZH0nLCAnJHtvcGVyYXRpb259JywgJHtiVmFsdWUgPT0gJ251bGwnID8gJ251bGwnIDogYCcke3ZhbHVlfSdgfSlgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBldmFsKGZpbmFsRXhwcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXN0aXR1aXNjZSBsJ29wZXJhemlvbmUgZGkgY29tcGFyYXppb25lIGZyYSB1biBzaW5nb2xvIHZhbG9yZSBkaSB1biBwYXJhbWV0cm8gZSB1biBzdW8gdmFsb3JlIGRpIGNvbmZyb250byBpbiBiYXNlIGFkIHVuIG9wZXJhdG9yZVxyXG4gICAgICogUmljaGlhbWF0YSBkYSBFVkFMXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQ2hpYXZlIGRlbCBwYXJhbWV0cm8gZGkgY3VpIHZlcmlmaWNhcmUgaWwgdmFsb3JlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0b3IgT3BlcmF0b3JlIGNvbiBjdWkgdmVyaWZpY2FyZSBpbCB2YWxvcmU6ID09LCAhPSwgPiwgPCwgPj0sIDw9XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVmFsb3JlIGRpIGNvbmZyb250byBkYSB1dGlsaXp6YXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zICoqdHJ1ZSoqIHNlIGxhIGNvbmRpemlvbmUgw6ggdmVyaWZpY2F0YSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNoZWNrVmFsdWUoa2V5OiBzdHJpbmcsIG9wZXJhdG9yOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICB2YXIgclBhciA9IHRoaXMuUGFyYW1ldGVyc0NhY2hlW2tleV07XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc3dpdGNoIChyUGFyLnR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWwoYFwiJHt0aGlzLmRlZmF1bHRJZm51bGxPclVuZGVmaW5lZChyUGFyLnZhbHVlLCBgYCl9XCIgJHtvcGVyYXRvcn0gXCIke3RoaXMuZGVmYXVsdElmbnVsbE9yVW5kZWZpbmVkKHZhbHVlLCBgYCl9XCJgKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWwoYCR7dGhpcy5kZWZhdWx0SWZudWxsT3JVbmRlZmluZWQoclBhci52YWx1ZSwgYGApLnRvU3RyaW5nKCl9ICR7b3BlcmF0b3J9ICR7dGhpcy5kZWZhdWx0SWZudWxsT3JVbmRlZmluZWQodmFsdWUsIGBgKX1gKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbChgJHt0aGlzLmRlZmF1bHRJZm51bGxPclVuZGVmaW5lZChyUGFyLnZhbHVlLCAnXCJcIicsIHRydWUpLnJlcGxhY2UoJywnLCAnLicpfSAke29wZXJhdG9yfSAke3RoaXMuZGVmYXVsdElmbnVsbE9yVW5kZWZpbmVkKHZhbHVlLCAnXCJcIicsIHRydWUpLnJlcGxhY2UoJywnLCAnLicpfWApO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcImRhdGVcIjpcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyRGF0ZUNvbnYgPSBgdGhpcy5kYXRlcy5nZXREYXRlQ29udmVydGlvbihcIiR7clBhci52YWx1ZX1cIilgO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxEYXRlQ29udiA9IGB0aGlzLmRhdGVzLmdldERhdGVDb252ZXJ0aW9uKFwiJHt2YWx1ZX1cIilgO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPT1cIjogcmV0dXJuIGV2YWwoYCR7cGFyRGF0ZUNvbnZ9ID09ICR7dmFsRGF0ZUNvbnZ9IHx8ICgke3BhckRhdGVDb252fSAhPSBudWxsICYmICR7cGFyRGF0ZUNvbnZ9LmlzU2FtZSgke3ZhbERhdGVDb252fSkpYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIhPVwiOiByZXR1cm4gZXZhbChgJHtwYXJEYXRlQ29udn0gIT0gJHt2YWxEYXRlQ29udn0gJiYgJHtwYXJEYXRlQ29udn0gIT0gbnVsbCAmJiAhJHtwYXJEYXRlQ29udn0uaXNTYW1lKCR7dmFsRGF0ZUNvbnZ9KWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPlwiOiByZXR1cm4gZXZhbChgJHtwYXJEYXRlQ29udn0gIT0gbnVsbCAmJiAke3ZhbERhdGVDb252fSAhPSBudWxsICYmICR7cGFyRGF0ZUNvbnZ9LmlzQWZ0ZXIoJHt2YWxEYXRlQ29udn0pYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI8XCI6IHJldHVybiBldmFsKGAke3BhckRhdGVDb252fSAhPSBudWxsICYmICR7dmFsRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHtwYXJEYXRlQ29udn0uaXNCZWZvcmUoJHt2YWxEYXRlQ29udn0pYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+PVwiOiByZXR1cm4gZXZhbChgJHtwYXJEYXRlQ29udn0gIT0gbnVsbCAmJiAke3ZhbERhdGVDb252fSAhPSBudWxsICYmICgke3BhckRhdGVDb252fS5pc0FmdGVyKCR7dmFsRGF0ZUNvbnZ9KSB8fCAke3BhckRhdGVDb252fT8uaXNTYW1lKCR7dmFsRGF0ZUNvbnZ9KSlgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjw9XCI6IHJldHVybiBldmFsKGAke3BhckRhdGVDb252fSAhPSBudWxsICYmICR7dmFsRGF0ZUNvbnZ9ICE9IG51bGwgJiYgKCR7cGFyRGF0ZUNvbnZ9LmlzQmVmb3JlKCR7dmFsRGF0ZUNvbnZ9KSB8fCAke3BhckRhdGVDb252fT8uaXNTYW1lKCR7dmFsRGF0ZUNvbnZ9KSlgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiRXJyb3JpIG5lbGxhIHZhbHV0YXppb25lIGRlbGwnZXNwcmVzc2lvbmUuIEZhbGxiYWNrIGEgZmFsc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRocm93IGBAZXNmYWVuemEvcGFyYW1ldGVyczogVGlwbyBwYXJhbWV0cm8gJHtrZXl9IG5vbiByaWNvbm9zY2l1dG86ICR7clBhci50eXBlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgZGVmYXVsdElmbnVsbE9yVW5kZWZpbmVkPFQ+KGl0ZW06IFQsIGRmbHQ6IFQsIGVtcHR5U3RyaW5nSXNOdWxsOiBib29sZWFuID0gZmFsc2UpOiBUIHtcclxuICAgICAgICBpZiAoaXRlbSA9PSBudWxsIHx8IGl0ZW0gPT0gdW5kZWZpbmVkIHx8IGl0ZW0udG9TdHJpbmcoKSA9PSAnbnVsbCcgfHwgKGVtcHR5U3RyaW5nSXNOdWxsICYmIGl0ZW0udG9TdHJpbmcoKSA9PSBcIlwiKSlcclxuICAgICAgICAgICAgcmV0dXJuIGRmbHQ7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBnZXRTb3VyY2UocGFyYW1ldGVyOiBHZW5lcmljUGFyYW1ldGVyLCBzZWFyY2g6IHN0cmluZywgYnlpZDogYm9vbGVhbik6IE9ic2VydmFibGU8eyBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nIH1bXT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5BdXRvQ29tcGxldGVEYXRhUmV0cmlldmUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkBmb3Jtcy1hbmQtdmFsaWRhdGlvbnM6IGZ1bnppb25lIGRpIGRhdGFyZXRyaWV2ZSBub24gaW1wb3N0YXRhIHBlciB1biBwYXJhbWV0cm8gYXV0b2NvbXBsZXRlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoW10pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQXV0b0NvbXBsZXRlRGF0YVJldHJpZXZlKHBhcmFtZXRlciwgc2VhcmNoLCBieWlkKTtcclxuICAgIH1cclxufSIsIjxkaXYgKm5nSWY9XCIoIVBhcmFtZXRlcnMgfHwgUGFyYW1ldGVycy5sZW5ndGggPT0gMCkgJiYgRW1wdHlNZXNzYWdlXCI+XHJcbiAgICA8ZW0+e3tFbXB0eU1lc3NhZ2V9fTwvZW0+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cIkdyb3Vwc1wiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlRlbXA7IGNvbnRleHQ6IHtpdGVtOiB7IGdyb3VwczogR3JvdXBzLCBpc1N1Ymdyb3VwOiBmYWxzZSB9fVwiPjwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjVGVtcCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGl0ZW0uZ3JvdXBzOyBsZXQgayA9IGluZGV4XCI+XHJcbiAgICAgICAgPGRpdiBbY2xhc3MucGFycy1zdWJncm91cF09XCJpdGVtLmlzU3ViZ3JvdXBcIiBbY2xhc3MucGFycy1ncm91cF09XCIhaXRlbS5pc1N1Ymdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJHcm91cHNPclN1Ymdyb3Vwc0Rpc3BsYXk7IGNvbnRleHQ6IHsgaXRlbTogeyBncm91cDogZ3JvdXAsIGluZGV4OiBrICsgKGl0ZW0uaW5kZXggPyAoJ18nICsgaXRlbS5pbmRleCkgOiAnJyksIGlzU3ViZ3JvdXA6IGl0ZW0uaXNTdWJncm91cCB9fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JvdXAuc3ViZ3JvdXBzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJUZW1wOyBjb250ZXh0OiB7aXRlbTogeyBncm91cHM6IGdyb3VwLnN1Ymdyb3VwcywgaW5kZXg6IGsgKyAoaXRlbS5pbmRleCA/ICgnXycgKyBpdGVtLmluZGV4KSA6ICcnKSwgaXNTdWJncm91cDogdHJ1ZSB9fTtcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjR3JvdXBzT3JTdWJncm91cHNEaXNwbGF5IGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgPGRpdiAqbmdJZj1cIml0ZW0uZ3JvdXBcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5ncm91cC5ncm91cE5hbWVcIiBbY2xhc3MucGFycy1ncm91cC10aXRsZV09XCIhaXRlbS5pc1N1Ymdyb3VwXCIgW2NsYXNzLnBhcnMtc3ViZ3JvdXAtdGl0bGVdPVwiaXRlbS5pc1N1Ymdyb3VwXCI+XHJcbiAgICAgICAgICAgIHt7aXRlbS5ncm91cC5ncm91cE5hbWV9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmdyb3VwLnBhcmFtZXRlcnMgJiYgaXRlbS5ncm91cC5wYXJhbWV0ZXJzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBmb3JtLWdyb3VwXCIgKm5nRm9yPVwibGV0IHBhciBvZiBpdGVtLmdyb3VwLnBhcmFtZXRlcnM7IGxldCBpPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0O1wiIFtjbGFzcy5hcHAtbWFyZ2luLWJvdHRvbS0wXT1cIkxhc3RQYXJhbWV0ZXJOb01hcmdpbiAmJiBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFyLnZpc2libGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQte3tMYWJlbENvbFdpZHRofX0gbS10LTVcIj48c3BhbiAqbmdJZj1cIlJlbW92YWxcIiBjbGFzcz1cImZhIGZhLXJlbW92ZSB0ZXh0LWRhbmdlclwiIChjbGljayk9XCJyZW1vdmVQYXJhbWV0ZXIocGFyKVwiPiZuYnNwOzwvc3Bhbj57e3Bhci5kZXNjcmlwdGlvbn19e3twYXIucmVxdWlyZWQgPyAnKicgOiAnJ319OjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLVNlIERhdGEtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0tZGF0ZSBbRGlzcGxheU1vZGVdPVwiRGlzcGxheU1vZGVcIiBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbcmVxdWlyZWRdPVwicGFyLnJlcXVpcmVkXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0tZGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tU2Ugc3RyaW5nYS0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX1cIiAqbmdJZj1cInBhci50eXBlID09ICdzdHJpbmcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtLWlucHV0IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbcmVxdWlyZWRdPVwicGFyLnJlcXVpcmVkXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0taW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLVNlIG51bWVyby0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX1cIiAqbmdJZj1cInBhci50eXBlID09ICdudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtLWlucHV0IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbcmVxdWlyZWRdPVwicGFyLnJlcXVpcmVkXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvciBwYXR0ZXJuPVwie3twYXIucGF0dGVybiB8fCAnXlsrLV0/WzAtOV0qWyxdP1swLTldKyQnfX1cIj48L2Zvcm0taW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLVNlIGJvb2xlYW4tLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19IG0tdC01XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnYm9vbGVhbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0tY2hlY2tib3ggW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFsobmdNb2RlbCldPVwicGFyLnZhbHVlXCIgbmFtZT1cInt7aXRlbS5pbmRleH19cGFye3tpfX1cIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3I+PC9mb3JtLWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1TZSBlbnVtIHNpbmdsZSBzZWxlY3QtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnZW51bScgJiYgIXBhci5tdWx0aWVudW0gJiYgIXBhci5zb3VyY2VhcGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0tc2VsZWN0IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbcmVxdWlyZWRdPVwicGFyLnJlcXVpcmVkXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvciBbU291cmNlXT1cInBhci5lbnVtdmFsdWVzXCI+PC9mb3JtLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tU2UgZW51bSBtdWx0aSBzZWxlY3QtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnZW51bScgJiYgcGFyLm11bHRpZW51bSAmJiAhcGFyLnNvdXJjZWFwaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybS1tdWx0aXNlbGVjdCBbRGlzcGxheU1vZGVdPVwiRGlzcGxheU1vZGVcIiAgW0Zvcm1dPVwiRm9ybVwiIFtGb3JtTGF5b3V0XT1cImZhbHNlXCIgW1VzZUNvbW1hU2VwYXJhdGVkTGlzdF09XCJ0cnVlXCIgW1NlbGVjdExhYmVsXT1cIignU2VsZWN0JyB8IGxvY2FsaXplIDogbGMpICsgJy4uLidcIiBbKG5nTW9kZWwpXT1cInBhci52YWx1ZVwiIG5hbWU9XCJ7e2l0ZW0uaW5kZXh9fXBhcnt7aX19XCIgW1JlYWRvbmx5XT1cIlJlYWRvbmx5IHx8IHBhci5pc3JlYWRvbmx5XCIgW1NvdXJjZV09XCJwYXIuZW51bXZhbHVlc1wiIFtyZXF1aXJlZF09XCJwYXIucmVxdWlyZWRcIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3I+PC9mb3JtLW11bHRpc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1TZSBlbnVtIGF1dG9jb21wbGV0ZS0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX1cIiAqbmdJZj1cInBhci50eXBlID09ICdlbnVtJyAmJiAhcGFyLm11bHRpZW51bSAmJiBwYXIuc291cmNlYXBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtLWF1dG9jb21wbGV0ZSBbRGlzcGxheU1vZGVdPVwiRGlzcGxheU1vZGVcIiAgW0Zvcm1dPVwiRm9ybVwiIFtGb3JtTGF5b3V0XT1cImZhbHNlXCIgW1BsYWNlaG9sZGVyXT1cIignU2VsZWN0JyB8IGxvY2FsaXplIDogbGMpICsgJy4uLidcIiBbKG5nTW9kZWwpXT1cInBhci52YWx1ZVwiIG5hbWU9XCJ7e2l0ZW0uaW5kZXh9fXBhcnt7aX19XCIgW1JlYWRvbmx5XT1cIlJlYWRvbmx5IHx8IHBhci5pc3JlYWRvbmx5XCIgW1NlYXJjaEZ1bmN0aW9uXT1cImdldFNvdXJjZS5iaW5kKHRoaXMsIHBhcilcIiBbcmVxdWlyZWRdPVwicGFyLnJlcXVpcmVkXCIgKGlucHV0Q2hhbmdlKT1cImNoYW5nZWQoKTtcIiAjdmFsaWRhdG9yPjwvZm9ybS1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLVNlIGVudW0gbXVsdGlzZWxlY3QgYXV0b2NvbXBsZXRlLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2VudW0nICYmIHBhci5tdWx0aWVudW0gJiYgcGFyLnNvdXJjZWFwaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybS1hdXRvY29tcGxldGUgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbSGlkZUNob2ljZXNPblNlbGVjdGlvbl09XCJBdXRvY29tcGxldGVIaWRlQ2hvaWNlc09uU2VsZWN0aW9uXCIgW011bHRpXT1cInRydWVcIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtQbGFjZWhvbGRlcl09XCIoJ1NlbGVjdCcgfCBsb2NhbGl6ZSA6IGxjKSArICcuLi4nXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtTZWFyY2hGdW5jdGlvbl09XCJnZXRTb3VyY2UuYmluZCh0aGlzLCBwYXIpXCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZFwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0tYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|
|
@@ -213,21 +213,39 @@ class EsParametersComponent {
|
|
|
213
213
|
// Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri
|
|
214
214
|
var changes = this.reviewParametersBindings();
|
|
215
215
|
if (changes.length > 0) {
|
|
216
|
+
// In base ai binding cambiati devo trovare tutti i parametri che han subito modifiche strutturali (visibilità, obbligatorietà)
|
|
217
|
+
// distruggerli e ricrearli in modo che i binding lato html si aggiornino di conseguenza.
|
|
218
|
+
// 1: Faccio una copia del parametro corrente
|
|
219
|
+
// 2: Trovo la sua posizione all'interno dei gruppi e lo sostituisco con la copia
|
|
220
|
+
// 3: Aggiorno la lista dei parametri e la sua cache in modo da puntare all'oggetto nuovo
|
|
216
221
|
changes.forEach(ch => {
|
|
217
222
|
let index = this.Parameters.findIndex(t => t.id == ch);
|
|
218
|
-
|
|
223
|
+
let parameterCopy = this.utiExts.deepClone(this.Parameters[index]);
|
|
224
|
+
let parameterRefFixed = false;
|
|
225
|
+
for (let ig = 0; ig < this.Groups.length; ig++) {
|
|
226
|
+
var g = this.Groups[ig];
|
|
227
|
+
for (let ip = 0; ip < g.parameters.length; ip++) {
|
|
228
|
+
var p = g.parameters[ip];
|
|
229
|
+
if (p === this.Parameters[index]) {
|
|
230
|
+
this.Groups[ig].parameters[ip] = parameterCopy;
|
|
231
|
+
parameterRefFixed = true;
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (parameterRefFixed)
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
this.Parameters[index] = parameterCopy;
|
|
219
239
|
this.ParametersCache[ch] = this.Parameters[index];
|
|
220
240
|
this.cdr.markForCheck();
|
|
221
241
|
});
|
|
222
242
|
}
|
|
223
|
-
var ParametersClone =
|
|
243
|
+
var ParametersClone = this.utiExts.deepClone(this.Parameters);
|
|
224
244
|
// Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori
|
|
225
245
|
ParametersClone === null || ParametersClone === void 0 ? void 0 : ParametersClone.forEach(t => {
|
|
226
246
|
if (t.type == "enum" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))
|
|
227
247
|
t.value = t.value.join(',');
|
|
228
248
|
});
|
|
229
|
-
// Era stato messo per fixare qualcosa, ma spacca tutto dato che ad ogni cambiamento ricrea il dom, quindi secca i focus
|
|
230
|
-
//this.generateGroups();
|
|
231
249
|
this.propagateChange(ParametersClone);
|
|
232
250
|
}
|
|
233
251
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esfaenza-parameters.mjs","sources":["../../../projects/parameters/src/lib/es_parameters.component.loc.ts","../../../projects/parameters/src/lib/models/GenericParameterGroup.ts","../../../projects/parameters/src/lib/es_parameters.component.ts","../../../projects/parameters/src/lib/es_parameters.component.html","../../../projects/parameters/src/lib/es_parameters.module.ts","../../../projects/parameters/src/lib/models/GenericParameter.ts","../../../projects/parameters/src/public-api.ts","../../../projects/parameters/src/esfaenza-parameters.ts"],"sourcesContent":["import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/**\r\n * Classe di localizzazione per il componente **EsParametersComponent**\r\n */\r\n@Injectable()\r\nexport class EsParametersLoc extends LocalizationService {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(injector: Injector) {\r\n super(injector);\r\n }\r\n}","import { GenericParameter } from \"./GenericParameter\";\r\n\r\n/**\r\n * Classe che rappresenta un gruppo di parametri generico\r\n */\r\nexport class GenericParameterGroup {\r\n\r\n /**\r\n * Costruttore\r\n * @param {string} groupName Descrizione del gruppo che fa anche da id\r\n * @param {number} order ordine del gruppo\r\n */\r\n\r\n constructor(public groupName: string, public order: number) {\r\n this.parameters = [];\r\n this.subgroups = [];\r\n }\r\n\r\n /** Lista di Generic Parameters */\r\n public parameters: GenericParameter[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n public subgroups: GenericParameterGroup[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n // public : GenericParameterGroup[];\r\n\r\n}","// Angular\r\nimport { ControlValueAccessor, UntypedFormControl, NgControl, NgForm, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from \"@angular/forms\";\r\nimport { ChangeDetectorRef, Component, forwardRef, Injector, Input, ViewEncapsulation } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { DateService, UtilityService } from \"@esfaenza/extensions\";\r\n\r\n// Classi\r\nimport { GenericParameter } from './models/GenericParameter';\r\n\r\n// Applicazione\r\nimport { EsParametersLoc } from \"./es_parameters.component.loc\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { GenericParameterGroup } from \"./models/GenericParameterGroup\";\r\n\r\n/** Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico */\r\n@Component({\r\n selector: \"es-parameters\",\r\n providers: [\r\n { provide: LocalizationService, useClass: EsParametersLoc },\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n }\r\n ],\r\n styleUrls: [\"./es_parameters.component.scss\"],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: \"./es_parameters.component.html\"\r\n})\r\nexport class EsParametersComponent implements ControlValueAccessor {\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Parameters: GenericParameter[];\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Groups: GenericParameterGroup[];\r\n\r\n /** Cache per fare lookup rapidi in fase di valutazione espressioni di visibilità e obbligatorietà */\r\n private ParametersCache: { [id: string]: GenericParameter };\r\n\r\n /**\r\n * Pipeline di Angular \r\n * \r\n * @ignore\r\n */\r\n propagateChange = (_: any) => { };\r\n\r\n /** Indica che il parametro deve essere in modalità display */\r\n @Input() DisplayMode: boolean = false;\r\n\r\n /** Indica che l'ultimo parametro non deve avere margine in fondo */\r\n @Input() LastParameterNoMargin: boolean = false;\r\n\r\n /** col-md-X per la label */\r\n @Input() LabelColWidth: number = 4;\r\n\r\n /** col-md-X per l'input */\r\n @Input() InputColWidth: number = 8;\r\n\r\n /** Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente */\r\n @Input() submitted: boolean = false;\r\n\r\n /** Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare */\r\n @Input() EmptyMessage: string = \"\";\r\n\r\n /** Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label */\r\n @Input() Removal: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() Readonly: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() ListFormat: 'CommaSeparated' | 'Array' = 'Array';\r\n\r\n /** Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit */\r\n @Input() Form: NgForm = null;\r\n\r\n /** Quando utilizza un sottocomponente autocomplete abilita o disabilita il reset dell'input per ogni selezione */\r\n @Input() AutocompleteHideChoicesOnSelection: boolean = false;\r\n\r\n /** Funzione da utilizzare per tirare fuori i dati di un autocomplete */\r\n @Input() AutoCompleteDataRetrieve: (parameter: GenericParameter, search: string, byid: boolean) => Observable<{ id: string, description: string }[]>\r\n\r\n /** Permette di settare in una volta solo gli input **LabelColWidth** e **InputColWidth**, basta scriverlo con la sintassi \"X Y\" */\r\n @Input() set LabelInputRatio(input: string) {\r\n var ratio = input.split(/\\s/);\r\n this.LabelColWidth = parseInt(ratio[0]);\r\n this.InputColWidth = parseInt(ratio[1]);\r\n }\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(private utiExts: UtilityService, public lc: LocalizationService, public cdr: ChangeDetectorRef, private inj: Injector, public dates: DateService) { }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public writeValue(obj): void {\r\n this.Parameters = obj;\r\n\r\n this.ParametersCache = {};\r\n if (!this.Parameters)\r\n return;\r\n\r\n this.Parameters.forEach(t => {\r\n this.ParametersCache[t.id] = t;\r\n\r\n if (!t.typecode && !t.type)\r\n console.warn(\"Non è stato specificato né un type né un typecode\");\r\n\r\n if (t.typecode && !t.type)\r\n t.type = this.utiExts.getJsTypeFromTypeCode(t.typecode);\r\n\r\n if (t.typecode && t.type != this.utiExts.getJsTypeFromTypeCode(t.typecode))\r\n console.warn(`Rilevate inconsistenze fra il Tipo ${t.type} e il Tipo ${this.utiExts.getJsTypeFromTypeCode(t.typecode)} calcolato da TypeCode ${t.typecode} per il parametro ${t.id}`);\r\n\r\n if (t.type == \"boolean\")\r\n t.value = t.value?.toString()?.toLowerCase() === \"true\";\r\n\r\n if (t.enumtype || t.dicttype)\r\n t.type = 'enum';\r\n\r\n // Valore valido ma modalità di utilizzo a CommaSeparated, devo assicurarmi di riemettere la versione con la stringa\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n this.changed();\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && !Array.isArray(t.value))\r\n t.value = t.value ? t.value.split(',').map(t => t.trim()) : [];\r\n });\r\n\r\n this.reviewParametersBindings();\r\n this.generateGroups();\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i gruppi dei parametri\r\n */\r\n generateGroups() {\r\n this.Groups = [];\r\n\r\n if (this.Parameters?.length > 0) {\r\n this.Parameters.sort((a, b) => a.order < b.order ? -1 : 1);\r\n\r\n // Ciclo tutti i parametri\r\n for (let i = 0; this.Parameters.length > i; i++) {\r\n let par = this.Parameters[i];\r\n\r\n let parGroupName = par.group ?? \"\";\r\n let groupOrder = par.group ? par.order : -1;\r\n\r\n // Se il gruppo non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parGroupName, groupOrder));\r\n }\r\n\r\n // Inserisco il parametro dentro al suo gruppo\r\n this.Groups.find(g => g.groupName == parGroupName).parameters.push(par)\r\n }\r\n\r\n // Gestione sottogruppi\r\n let subgroups: GenericParameterGroup[] = this.Groups.filter(group => group.groupName.includes('§'));\r\n for (let _; subgroups.length > 0; () => { }) {\r\n // Recupero la lista di gruppi che hanno sottogruppi\r\n // Per convenzione, nel nome contengono \"§\"\r\n this.tryToAddSubgroups(subgroups);\r\n subgroups = this.Groups.filter(group => group.groupName.includes('§'));\r\n }\r\n\r\n this.Groups.sort((a, b) => a.order < b.order ? -1 : 1);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i sottogruppi dei parametri\r\n */\r\n tryToAddSubgroups(subgroups: GenericParameterGroup[]) {\r\n for (let i = 0; subgroups.length > i; i++) {\r\n let sub = subgroups[i];\r\n\r\n // Ottengo un lista con la gerarchia dei gruppi, in ordine\r\n let groupsParentHierarchy = sub.groupName.split('§') ?? [];\r\n\r\n // Recupero il gruppo padre\r\n let parentGroupName = sub.groupName.replace(`§${groupsParentHierarchy[groupsParentHierarchy.length - 1]}`, ``);\r\n\r\n // Se il gruppo padre non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parentGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parentGroupName, sub.order));\r\n }\r\n\r\n // Rimuovo dal nome del gruppo l'informazione sul padre (Sistemando anche l'etichetta)\r\n // e lo aggiungo ai sottogruppi del padre\r\n sub.groupName = sub.groupName.replace(`${parentGroupName}§`, '');\r\n let parentGroup = this.Groups.find(x => x.groupName == parentGroupName);\r\n if (parentGroup?.subgroups.some(s => s.groupName == sub.groupName)) {\r\n let target = parentGroup.subgroups.find(f => f.groupName == sub.groupName);\r\n sub.parameters.map(p => target.parameters.push(p));\r\n sub.subgroups.map(s => target.subgroups.push(s));\r\n target.order = sub.order < target.order ? sub.order : target.order;\r\n } else {\r\n parentGroup?.subgroups.push(sub);\r\n }\r\n\r\n // Rimuovo il sottogruppo gruppo dalla lista\r\n this.Groups.splice(this.Groups.indexOf(sub), 1);\r\n }\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnChange(fn): void { this.propagateChange = fn; }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnTouched(fn): void { }\r\n\r\n /**\r\n * Metodo che si occupa di gestire il modello in uscita e propagarlo sul binding ngModel\r\n */\r\n public changed() {\r\n if (!this.Parameters)\r\n return;\r\n\r\n // Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri\r\n var changes = this.reviewParametersBindings();\r\n if (changes.length > 0) {\r\n changes.forEach(ch => {\r\n let index = this.Parameters.findIndex(t => t.id == ch);\r\n this.Parameters[index] = JSON.parse(JSON.stringify(this.Parameters[index]));\r\n this.ParametersCache[ch] = this.Parameters[index];\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n var ParametersClone = JSON.parse(JSON.stringify(this.Parameters));\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n ParametersClone?.forEach(t => {\r\n if (t.type == \"enum\" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = t.value.join(',');\r\n });\r\n\r\n // Era stato messo per fixare qualcosa, ma spacca tutto dato che ad ogni cambiamento ricrea il dom, quindi secca i focus\r\n //this.generateGroups();\r\n \r\n this.propagateChange(ParametersClone);\r\n }\r\n\r\n /**\r\n * Rimuove il parametro selezionato e propaga il modello\r\n * \r\n * @param {GenericParameter} par Parametro da rimuovere\r\n */\r\n public removeParameter(par: GenericParameter) {\r\n this.Parameters.splice(this.Parameters.indexOf(par), 1);\r\n this.changed();\r\n }\r\n\r\n public GenerateParameterGroups() {\r\n let Groups: { id: string, groups: string[], order: number }[] = [];\r\n\r\n this.Parameters.forEach(param => {\r\n Groups.push({ id: param.id, groups: param.group.split(\"§\"), order: param.order });\r\n });\r\n\r\n let GroupedGroups = Groups.reduce((r, a) => {\r\n let firstGroupId = a.groups?.length > 0 ? a.groups[0] : \"\";\r\n r[firstGroupId] = [...r[firstGroupId] || [], a];\r\n return r;\r\n }, {});\r\n\r\n console.log(GroupedGroups);\r\n\r\n // Ciclo del risultato, aggiungendo i gruppi al modello\r\n // Per ogni gruppo che aggiungo, assegno i parametri in ordine\r\n }\r\n\r\n /**\r\n * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo\r\n * \r\n * @returns {string[]} lista con gli id dei parametri che sono stati modificati\r\n */\r\n private reviewParametersBindings(): string[] {\r\n let changes = [];\r\n for (let i = 0; i < this.Parameters.length; i++) {\r\n var p = this.Parameters[i];\r\n\r\n if (p.requiredexp) {\r\n let prevReq = p.required;\r\n p.required = this.evaluate(p.requiredexp);\r\n if (prevReq != p.required)\r\n changes.push(p.id);\r\n }\r\n if (p.visibleexp) {\r\n let prevVisi = p.visible;\r\n p.visible = this.evaluate(p.visibleexp);\r\n if (prevVisi != p.visible)\r\n changes.push(p.id)\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Valuta un'espressione in base ai parametri presenti nel modello attuale\r\n * \r\n * @param expr Espressione da valutare scritta nel formato (ripetibile) \"ID (==|!=|<|>|>=|<=) (`valore` | null | true | false | XXX,XXX)\" separato eventualmente da && ed ||\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n private evaluate(expr: string): boolean {\r\n var regex = /\\s?([a-zA-Z0-9_-]+)\\s?(!=|==|<|>|<=|>=)\\s?(`[^`]+`|``|null|[0-9,]+|true|false)/gm;\r\n\r\n var matches: string[] = [];\r\n var finalExpr = expr;\r\n while (matches = regex.exec(expr)) {\r\n var fullMatch = matches[0].trim();\r\n var id = matches[1].trim();\r\n var operation = matches[2].trim();\r\n let bValue = matches[3].trim().trim();\r\n var value = matches[3].trim().trim().replace('`', '').replace('`', '');\r\n\r\n finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', ${bValue == 'null' ? 'null' : `'${value}'`})`);\r\n }\r\n\r\n return eval(finalExpr);\r\n }\r\n\r\n /**\r\n * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore\r\n * Richiamata da EVAL\r\n * \r\n * @param {string} key Chiave del parametro di cui verificare il valore\r\n * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=\r\n * @param {string} value Valore di confronto da utilizzare\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n public checkValue(key: string, operator: string, value: string): boolean {\r\n var rPar = this.ParametersCache[key];\r\n try {\r\n switch (rPar.type) {\r\n case \"string\":\r\n case \"enum\":\r\n return eval(`\"${this.defaultIfnullOrUndefined(rPar.value, ``)}\" ${operator} \"${this.defaultIfnullOrUndefined(value, ``)}\"`);\r\n case \"boolean\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, ``).toString()} ${operator} ${this.defaultIfnullOrUndefined(value, ``)}`);\r\n case \"number\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, '\"\"', true).replace(',', '.')} ${operator} ${this.defaultIfnullOrUndefined(value, '\"\"', true).replace(',', '.')}`);\r\n case \"date\":\r\n let parDateConv = `this.dates.getDateConvertion(\"${rPar.value}\")`;\r\n let valDateConv = `this.dates.getDateConvertion(\"${value}\")`;\r\n\r\n switch (operator) {\r\n\r\n case \"==\": return eval(`${parDateConv} == ${valDateConv} || (${parDateConv} != null && ${parDateConv}.isSame(${valDateConv}))`);\r\n case \"!=\": return eval(`${parDateConv} != ${valDateConv} && ${parDateConv} != null && !${parDateConv}.isSame(${valDateConv})`);\r\n case \">\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isAfter(${valDateConv})`);\r\n case \"<\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isBefore(${valDateConv})`);\r\n case \">=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isAfter(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n case \"<=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isBefore(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n console.warn(\"Errori nella valutazione dell'espressione. Fallback a false\");\r\n return false;\r\n }\r\n\r\n throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;\r\n }\r\n\r\n /** @ignore */\r\n private defaultIfnullOrUndefined<T>(item: T, dflt: T, emptyStringIsNull: boolean = false): T {\r\n if (item == null || item == undefined || item.toString() == 'null' || (emptyStringIsNull && item.toString() == \"\"))\r\n return dflt;\r\n return item;\r\n }\r\n\r\n /** @ignore */\r\n public getSource(parameter: GenericParameter, search: string, byid: boolean): Observable<{ id: string, description: string }[]> {\r\n if (!this.AutoCompleteDataRetrieve) {\r\n console.error(\"@forms-and-validations: funzione di dataretrieve non impostata per un parametro autocomplete\");\r\n return of([])\r\n }\r\n else\r\n return this.AutoCompleteDataRetrieve(parameter, search, byid);\r\n }\r\n}","<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\">\r\n <ng-container *ngIf=\"par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\"> </span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n </ng-container>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FormsAndValidationsModule } from \"@esfaenza/forms-and-validations\";\r\nimport { LocalizationModule } from '@esfaenza/localizations';\r\nimport { EsParametersComponent } from './es_parameters.component';\r\n\r\n\r\n@NgModule({\r\n declarations: [EsParametersComponent],\r\n imports: [\r\n CommonModule,\r\n LocalizationModule,\r\n FormsModule,\r\n FormsAndValidationsModule,\r\n ],\r\n exports: [EsParametersComponent]\r\n})\r\nexport class EsParametersModule {\r\n }\r\n","/**\r\n * Classe che rappresenta un parametro generico\r\n */\r\nexport class GenericParameter {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Codice del parametro\r\n * @param {string} description Descrizione del parametro\r\n * @param {string} pattern Pattern di validazione\r\n * @param {'date' | 'string' | 'number' | 'boolean' | 'enum'} type Tipo di input \r\n * @param {boolean} required Indica se il valore è obbligatorio o meno\r\n * @param {any} v_default Valore di default per questo Parametro\r\n * @param {{ id: string, description: string }[]} enumvalues Qualora il **type** fosse di tipo **enum**, qui devono esserci tutti i valori che può assumere \r\n * @param {boolean} multienum Qualora il **type** fosse di tipo **enum**, indica se è possibile selezionare più valori (multiselect)\r\n * @param {string} sourceapi Nei casi in cui il **type** è **enum** indica l'api da cui recuperare i valori da bindare alla select o alla multiselect\r\n * @param {boolean} pageddata Nei casi in cui il **type** è **enum** indica che l'api specificata eventualmetne da **sourceapi** è paginata\r\n */\r\n constructor(\r\n public id: string,\r\n public description: string,\r\n public pattern: string,\r\n type: 'date' | 'string' | 'number' | 'boolean' | 'enum',\r\n public required: boolean,\r\n v_default: any = null,\r\n public enumvalues: { id: string, description: string }[] = [],\r\n public multienum?: boolean,\r\n public sourceapi?: string,\r\n public pageddata?: boolean) {\r\n\r\n this.type = type == 'enum' ? null : type;\r\n this.visible = true;\r\n this.enumtype = type == 'enum' ? type : \"\";\r\n this.isreadonly = false;\r\n\r\n if (!this.enumtype && enumvalues.length != 0)\r\n console.error(\"impossibile gestire valori di dizionario per un parametro non di tipo enum\");\r\n\r\n if (v_default != null)\r\n this.value = v_default;\r\n }\r\n\r\n /** Tipo di dato rappresentato da questo parametro */\r\n public type?: 'date' | 'string' | 'number' | 'boolean' | 'enum';\r\n\r\n /** Typecode lato C# che rappresenta il tipo di dato */\r\n public typecode: number;\r\n\r\n /** Indica se il campo specificato dev'essere di sola lettura o meno */\r\n public isreadonly: boolean;\r\n\r\n /** Valore del parametro */\r\n public value: any;\r\n\r\n /** Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto */\r\n public visible: boolean;\r\n\r\n /** Tipo Enum, valorizzato dal Backend */\r\n public enumtype: string;\r\n\r\n /** Tipo Dizionario, valorizzato dal Backend */\r\n public dicttype: string;\r\n\r\n /** Espressione di obbligatorietà */\r\n public requiredexp?: string;\r\n\r\n /** Espressione di visibilità */\r\n public visibleexp?: string;\r\n\r\n /** Ordinamento in base al quale verranno ordinati i parametri */\r\n public order: number;\r\n\r\n /** Gruppo di appartenenza del parametro */\r\n public group: string;\r\n}","/*\r\n * Public API Surface of parameters\r\n */\r\nexport * from './lib/es_parameters.module';\r\nexport * from './lib/models/GenericParameter';\r\nexport * from './lib/es_parameters.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;AAGA;;AAEG;AAEG,MAAO,eAAgB,SAAQ,mBAAmB,CAAA;AAEpD;;;;AAIG;AACH,IAAA,WAAA,CAAY,QAAkB,EAAA;QAC1B,KAAK,CAAC,QAAQ,CAAC,CAAC;KACnB;;4GATQ,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;gHAAf,eAAe,EAAA,CAAA,CAAA;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;;;ACJX;;AAEG;MACU,qBAAqB,CAAA;AAE7B;;;;AAIE;IAEH,WAAmB,CAAA,SAAiB,EAAS,KAAa,EAAA;AAAvC,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAQ;AAAS,QAAA,IAAK,CAAA,KAAA,GAAL,KAAK,CAAQ;AACtD,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;KACvB;AAWJ;;AC3BD;AAgBA;MAea,qBAAqB,CAAA;;IAuD9B,IAAa,eAAe,CAAC,KAAa,EAAA;QACtC,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC3C;AAED;;;;AAIG;IACH,WAAoB,CAAA,OAAuB,EAAS,EAAuB,EAAS,GAAsB,EAAU,GAAa,EAAS,KAAkB,EAAA;AAAxI,QAAA,IAAO,CAAA,OAAA,GAAP,OAAO,CAAgB;AAAS,QAAA,IAAE,CAAA,EAAA,GAAF,EAAE,CAAqB;AAAS,QAAA,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;AAAU,QAAA,IAAG,CAAA,GAAA,GAAH,GAAG,CAAU;AAAS,QAAA,IAAK,CAAA,KAAA,GAAL,KAAK,CAAa;AAvD5J;;;;AAIG;QACH,IAAA,CAAA,eAAe,GAAG,CAAC,CAAM,KAAO,GAAC,CAAC;;AAGzB,QAAA,IAAW,CAAA,WAAA,GAAY,KAAK,CAAC;;AAG7B,QAAA,IAAqB,CAAA,qBAAA,GAAY,KAAK,CAAC;;AAGvC,QAAA,IAAa,CAAA,aAAA,GAAW,CAAC,CAAC;;AAG1B,QAAA,IAAa,CAAA,aAAA,GAAW,CAAC,CAAC;;AAG1B,QAAA,IAAS,CAAA,SAAA,GAAY,KAAK,CAAC;;AAG3B,QAAA,IAAY,CAAA,YAAA,GAAW,EAAE,CAAC;;AAG1B,QAAA,IAAO,CAAA,OAAA,GAAY,KAAK,CAAC;;AAGzB,QAAA,IAAQ,CAAA,QAAA,GAAY,KAAK,CAAC;;AAG1B,QAAA,IAAU,CAAA,UAAA,GAA+B,OAAO,CAAC;;AAGjD,QAAA,IAAI,CAAA,IAAA,GAAW,IAAI,CAAC;;AAGpB,QAAA,IAAkC,CAAA,kCAAA,GAAY,KAAK,CAAC;KAiBoG;AAEjK;;;;AAIG;AACI,IAAA,UAAU,CAAC,GAAG,EAAA;AACjB,QAAA,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;AAEtB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,UAAU;YAChB,OAAO;AAEX,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAG;;YACxB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAE/B,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI;AACtB,gBAAA,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;AAEtE,YAAA,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI;AACrB,gBAAA,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAE5D,YAAA,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtE,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAA,mCAAA,EAAsC,CAAC,CAAC,IAAI,CAAA,WAAA,EAAc,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAA0B,uBAAA,EAAA,CAAC,CAAC,QAAQ,CAAqB,kBAAA,EAAA,CAAC,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC;AAE1L,YAAA,IAAI,CAAC,CAAC,IAAI,IAAI,SAAS;AACnB,gBAAA,CAAC,CAAC,KAAK,GAAG,CAAA,CAAA,EAAA,GAAA,MAAA,CAAC,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,QAAQ,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,WAAW,EAAE,MAAK,MAAM,CAAC;AAE5D,YAAA,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ;AACxB,gBAAA,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC;;YAGpB,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,gBAAgB,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC3G,IAAI,CAAC,OAAO,EAAE,CAAC;;AAGnB,YAAA,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,gBAAgB,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5G,gBAAA,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC;AACvE,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,cAAc,EAAE,CAAC;KACzB;AAED;;AAEE;IACF,cAAc,GAAA;;AACV,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QAEjB,IAAI,CAAA,MAAA,IAAI,CAAC,UAAU,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAM,IAAG,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAG3D,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC7C,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAE7B,IAAI,YAAY,GAAG,CAAA,EAAA,GAAA,GAAG,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,EAAE,CAAC;AACnC,gBAAA,IAAI,UAAU,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;;AAG5C,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,YAAY,CAAC,EAAE;AACrD,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;AACzE,iBAAA;;gBAGD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,YAAY,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1E,aAAA;;YAGD,IAAI,SAAS,GAA4B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACpG,YAAA,KAAK,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,MAAK,GAAI,EAAE;;;AAGzC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAClC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1E,aAAA;AAED,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,SAAA;KACJ;AAED;;AAEE;AACF,IAAA,iBAAiB,CAAC,SAAkC,EAAA;;AAChD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACvC,YAAA,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;;AAGvB,YAAA,IAAI,qBAAqB,GAAG,CAAA,EAAA,GAAA,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,EAAE,CAAC;;YAG3D,IAAI,eAAe,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAI,CAAA,EAAA,qBAAqB,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAE,CAAA,EAAE,CAAE,CAAA,CAAC,CAAC;;AAG/G,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,eAAe,CAAC,EAAE;AACxD,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,eAAe,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3E,aAAA;;;AAID,YAAA,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,eAAe,CAAA,CAAA,CAAG,EAAE,EAAE,CAAC,CAAC;AACjE,YAAA,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,eAAe,CAAC,CAAC;YACxE,IAAI,WAAW,aAAX,WAAW,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAX,WAAW,CAAE,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE;gBAChE,IAAI,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;AAC3E,gBAAA,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,gBAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjD,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AACtE,aAAA;AAAM,iBAAA;gBACH,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAX,WAAW,CAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,aAAA;;AAGD,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACnD,SAAA;KACJ;AAED;;;;AAIG;IACI,gBAAgB,CAAC,EAAE,EAAA,EAAU,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,EAAE;AAEhE;;;;AAIG;IACI,iBAAiB,CAAC,EAAE,EAAA,GAAW;AAEtC;;AAEG;IACI,OAAO,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,UAAU;YAChB,OAAO;;AAGX,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;AAC9C,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,YAAA,OAAO,CAAC,OAAO,CAAC,EAAE,IAAG;AACjB,gBAAA,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC5E,gBAAA,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAClD,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;AAC5B,aAAC,CAAC,CAAC;AACN,SAAA;AAED,QAAA,IAAI,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;;QAGlE,eAAe,KAAA,IAAA,IAAf,eAAe,KAAf,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,eAAe,CAAE,OAAO,CAAC,CAAC,IAAG;YACzB,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,gBAAgB,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC3G,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,SAAC,CAAC,CAAC;;;AAKH,QAAA,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;KACzC;AAED;;;;AAIG;AACI,IAAA,eAAe,CAAC,GAAqB,EAAA;AACxC,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,EAAE,CAAC;KAClB;IAEM,uBAAuB,GAAA;QAC1B,IAAI,MAAM,GAAsD,EAAE,CAAC;AAEnE,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,IAAG;AAC5B,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AACtF,SAAC,CAAC,CAAC;QAEH,IAAI,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;;YACvC,IAAI,YAAY,GAAG,CAAA,CAAA,EAAA,GAAA,CAAC,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,IAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC3D,YAAA,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAChD,YAAA,OAAO,CAAC,CAAC;SACZ,EAAE,EAAE,CAAC,CAAC;AAEP,QAAA,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;;;KAI9B;AAED;;;;AAIG;IACK,wBAAwB,GAAA;QAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;AACjB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAE3B,IAAI,CAAC,CAAC,WAAW,EAAE;AACf,gBAAA,IAAI,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC;gBACzB,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AAC1C,gBAAA,IAAI,OAAO,IAAI,CAAC,CAAC,QAAQ;AACrB,oBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1B,aAAA;YACD,IAAI,CAAC,CAAC,UAAU,EAAE;AACd,gBAAA,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC;gBACzB,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AACxC,gBAAA,IAAI,QAAQ,IAAI,CAAC,CAAC,OAAO;AACrB,oBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AACzB,aAAA;AACJ,SAAA;AACD,QAAA,OAAO,OAAO,CAAC;KAClB;AAED;;;;;;AAMG;AACK,IAAA,QAAQ,CAAC,IAAY,EAAA;QACzB,IAAI,KAAK,GAAG,kFAAkF,CAAC;QAE/F,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,OAAO,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC/B,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,YAAA,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAEvE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,CAAoB,iBAAA,EAAA,EAAE,CAAO,IAAA,EAAA,SAAS,CAAM,GAAA,EAAA,MAAM,IAAI,MAAM,GAAG,MAAM,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAC;AACrI,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;KAC1B;AAED;;;;;;;;;AASG;AACI,IAAA,UAAU,CAAC,GAAW,EAAE,QAAgB,EAAE,KAAa,EAAA;QAC1D,IAAI,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI;YACA,QAAQ,IAAI,CAAC,IAAI;AACb,gBAAA,KAAK,QAAQ,CAAC;AACd,gBAAA,KAAK,MAAM;oBACP,OAAO,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAE,CAAA,CAAC,KAAK,QAAQ,CAAA,EAAA,EAAK,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC;AAChI,gBAAA,KAAK,SAAS;AACV,oBAAA,OAAO,IAAI,CAAC,CAAG,EAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE,CAAC,CAAC,QAAQ,EAAE,CAAI,CAAA,EAAA,QAAQ,CAAI,CAAA,EAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC;AACvI,gBAAA,KAAK,QAAQ;oBACT,OAAO,IAAI,CAAC,CAAG,EAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC;AAChL,gBAAA,KAAK,MAAM;AACP,oBAAA,IAAI,WAAW,GAAG,CAAA,8BAAA,EAAiC,IAAI,CAAC,KAAK,IAAI,CAAC;AAClE,oBAAA,IAAI,WAAW,GAAG,CAAiC,8BAAA,EAAA,KAAK,IAAI,CAAC;AAE7D,oBAAA,QAAQ,QAAQ;AAEZ,wBAAA,KAAK,IAAI,EAAE,OAAO,IAAI,CAAC,GAAG,WAAW,CAAA,IAAA,EAAO,WAAW,CAAA,KAAA,EAAQ,WAAW,CAAe,YAAA,EAAA,WAAW,WAAW,WAAW,CAAA,EAAA,CAAI,CAAC,CAAC;AAChI,wBAAA,KAAK,IAAI,EAAE,OAAO,IAAI,CAAC,GAAG,WAAW,CAAA,IAAA,EAAO,WAAW,CAAA,IAAA,EAAO,WAAW,CAAgB,aAAA,EAAA,WAAW,WAAW,WAAW,CAAA,CAAA,CAAG,CAAC,CAAC;AAC/H,wBAAA,KAAK,GAAG,EAAE,OAAO,IAAI,CAAC,CAAG,EAAA,WAAW,CAAe,YAAA,EAAA,WAAW,eAAe,WAAW,CAAA,SAAA,EAAY,WAAW,CAAA,CAAA,CAAG,CAAC,CAAC;AACpH,wBAAA,KAAK,GAAG,EAAE,OAAO,IAAI,CAAC,CAAG,EAAA,WAAW,CAAe,YAAA,EAAA,WAAW,eAAe,WAAW,CAAA,UAAA,EAAa,WAAW,CAAA,CAAA,CAAG,CAAC,CAAC;wBACrH,KAAK,IAAI,EAAE,OAAO,IAAI,CAAC,CAAA,EAAG,WAAW,CAAe,YAAA,EAAA,WAAW,gBAAgB,WAAW,CAAA,SAAA,EAAY,WAAW,CAAQ,KAAA,EAAA,WAAW,YAAY,WAAW,CAAA,EAAA,CAAI,CAAC,CAAC;wBACjK,KAAK,IAAI,EAAE,OAAO,IAAI,CAAC,CAAA,EAAG,WAAW,CAAe,YAAA,EAAA,WAAW,gBAAgB,WAAW,CAAA,UAAA,EAAa,WAAW,CAAQ,KAAA,EAAA,WAAW,YAAY,WAAW,CAAA,EAAA,CAAI,CAAC,CAAC;AACrK,qBAAA;AACR,aAAA;AACJ,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACrB,YAAA,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;AAC5E,YAAA,OAAO,KAAK,CAAC;AAChB,SAAA;AAED,QAAA,MAAM,wCAAwC,GAAG,CAAA,mBAAA,EAAsB,IAAI,CAAC,IAAI,EAAE,CAAC;KACtF;;AAGO,IAAA,wBAAwB,CAAI,IAAO,EAAE,IAAO,EAAE,oBAA6B,KAAK,EAAA;QACpF,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,MAAM,KAAK,iBAAiB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9G,YAAA,OAAO,IAAI,CAAC;AAChB,QAAA,OAAO,IAAI,CAAC;KACf;;AAGM,IAAA,SAAS,CAAC,SAA2B,EAAE,MAAc,EAAE,IAAa,EAAA;AACvE,QAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAChC,YAAA,OAAO,CAAC,KAAK,CAAC,8FAA8F,CAAC,CAAC;AAC9G,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;AAChB,SAAA;;YAEG,OAAO,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;KACrE;;kHAlXQ,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAZnB,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,kCAAA,EAAA,oCAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,SAAA,EAAA;AACP,QAAA,EAAE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,eAAe,EAAE;AAC3D,QAAA;AACI,YAAA,OAAO,EAAE,iBAAiB;AAC1B,YAAA,WAAW,EAAE,UAAU,CAAC,MAAM,qBAAqB,CAAC;AACpD,YAAA,KAAK,EAAE,IAAI;AACd,SAAA;KACJ,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1BL,kwMAiEc,EAAA,MAAA,EAAA,CAAA,4SAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,sEAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,cAAA,EAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,OAAA,EAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;2FDlCD,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAdjC,SAAS;YACI,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EACd,SAAA,EAAA;AACP,wBAAA,EAAE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,eAAe,EAAE;AAC3D,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,2BAA2B,CAAC;AACpD,4BAAA,KAAK,EAAE,IAAI;AACd,yBAAA;AACJ,qBAAA,EAEc,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,kwMAAA,EAAA,MAAA,EAAA,CAAA,4SAAA,CAAA,EAAA,CAAA;wNAsB5B,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBAGG,qBAAqB,EAAA,CAAA;sBAA7B,KAAK;gBAGG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAGG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAGG,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBAGG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBAGG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBAGG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBAGG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBAGG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBAGG,kCAAkC,EAAA,CAAA;sBAA1C,KAAK;gBAGG,wBAAwB,EAAA,CAAA;sBAAhC,KAAK;gBAGO,eAAe,EAAA,CAAA;sBAA3B,KAAK;;;MEpEG,kBAAkB,CAAA;;+GAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAAlB,kBAAkB,EAAA,YAAA,EAAA,CATd,qBAAqB,CAAA,EAAA,OAAA,EAAA,CAElC,YAAY;QACZ,kBAAkB;QAClB,WAAW;QACX,yBAAyB,aAEjB,qBAAqB,CAAA,EAAA,CAAA,CAAA;AAEpB,kBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,YAP3B,YAAY;QACZ,kBAAkB;QAClB,WAAW;QACX,yBAAyB,CAAA,EAAA,CAAA,CAAA;2FAIhB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAV9B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,YAAY,EAAE,CAAC,qBAAqB,CAAC;AACrC,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,kBAAkB;wBAClB,WAAW;wBACX,yBAAyB;AAC1B,qBAAA;oBACD,OAAO,EAAE,CAAC,qBAAqB,CAAC;iBACjC,CAAA;;;ACjBD;;AAEG;MACU,gBAAgB,CAAA;AAEzB;;;;;;;;;;;;;AAaG;IACH,WACW,CAAA,EAAU,EACV,WAAmB,EACnB,OAAe,EACtB,IAAuD,EAChD,QAAiB,EACxB,YAAiB,IAAI,EACd,aAAoD,EAAE,EACtD,SAAmB,EACnB,SAAkB,EAClB,SAAmB,EAAA;AATnB,QAAA,IAAE,CAAA,EAAA,GAAF,EAAE,CAAQ;AACV,QAAA,IAAW,CAAA,WAAA,GAAX,WAAW,CAAQ;AACnB,QAAA,IAAO,CAAA,OAAA,GAAP,OAAO,CAAQ;AAEf,QAAA,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAS;AAEjB,QAAA,IAAU,CAAA,UAAA,GAAV,UAAU,CAA4C;AACtD,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAU;AACnB,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAS;AAClB,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAU;AAE1B,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AACzC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;AAC3C,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC;AACxC,YAAA,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAEhG,IAAI,SAAS,IAAI,IAAI;AACjB,YAAA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;KAC9B;AAkCJ;;AC3ED;;AAEG;;ACFH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"esfaenza-parameters.mjs","sources":["../../../projects/parameters/src/lib/es_parameters.component.loc.ts","../../../projects/parameters/src/lib/models/GenericParameterGroup.ts","../../../projects/parameters/src/lib/es_parameters.component.ts","../../../projects/parameters/src/lib/es_parameters.component.html","../../../projects/parameters/src/lib/es_parameters.module.ts","../../../projects/parameters/src/lib/models/GenericParameter.ts","../../../projects/parameters/src/public-api.ts","../../../projects/parameters/src/esfaenza-parameters.ts"],"sourcesContent":["import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/**\r\n * Classe di localizzazione per il componente **EsParametersComponent**\r\n */\r\n@Injectable()\r\nexport class EsParametersLoc extends LocalizationService {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(injector: Injector) {\r\n super(injector);\r\n }\r\n}","import { GenericParameter } from \"./GenericParameter\";\r\n\r\n/**\r\n * Classe che rappresenta un gruppo di parametri generico\r\n */\r\nexport class GenericParameterGroup {\r\n\r\n /**\r\n * Costruttore\r\n * @param {string} groupName Descrizione del gruppo che fa anche da id\r\n * @param {number} order ordine del gruppo\r\n */\r\n\r\n constructor(public groupName: string, public order: number) {\r\n this.parameters = [];\r\n this.subgroups = [];\r\n }\r\n\r\n /** Lista di Generic Parameters */\r\n public parameters: GenericParameter[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n public subgroups: GenericParameterGroup[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n // public : GenericParameterGroup[];\r\n\r\n}","// Angular\r\nimport { ControlValueAccessor, UntypedFormControl, NgControl, NgForm, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from \"@angular/forms\";\r\nimport { ChangeDetectorRef, Component, forwardRef, Injector, Input, ViewEncapsulation } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { DateService, UtilityService } from \"@esfaenza/extensions\";\r\n\r\n// Classi\r\nimport { GenericParameter } from './models/GenericParameter';\r\n\r\n// Applicazione\r\nimport { EsParametersLoc } from \"./es_parameters.component.loc\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { GenericParameterGroup } from \"./models/GenericParameterGroup\";\r\n\r\n/** Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico */\r\n@Component({\r\n selector: \"es-parameters\",\r\n providers: [\r\n { provide: LocalizationService, useClass: EsParametersLoc },\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n }\r\n ],\r\n styleUrls: [\"./es_parameters.component.scss\"],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: \"./es_parameters.component.html\"\r\n})\r\nexport class EsParametersComponent implements ControlValueAccessor {\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Parameters: GenericParameter[];\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Groups: GenericParameterGroup[];\r\n\r\n /** Cache per fare lookup rapidi in fase di valutazione espressioni di visibilità e obbligatorietà */\r\n private ParametersCache: { [id: string]: GenericParameter };\r\n\r\n /**\r\n * Pipeline di Angular \r\n * \r\n * @ignore\r\n */\r\n propagateChange = (_: any) => { };\r\n\r\n /** Indica che il parametro deve essere in modalità display */\r\n @Input() DisplayMode: boolean = false;\r\n\r\n /** Indica che l'ultimo parametro non deve avere margine in fondo */\r\n @Input() LastParameterNoMargin: boolean = false;\r\n\r\n /** col-md-X per la label */\r\n @Input() LabelColWidth: number = 4;\r\n\r\n /** col-md-X per l'input */\r\n @Input() InputColWidth: number = 8;\r\n\r\n /** Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente */\r\n @Input() submitted: boolean = false;\r\n\r\n /** Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare */\r\n @Input() EmptyMessage: string = \"\";\r\n\r\n /** Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label */\r\n @Input() Removal: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() Readonly: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() ListFormat: 'CommaSeparated' | 'Array' = 'Array';\r\n\r\n /** Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit */\r\n @Input() Form: NgForm = null;\r\n\r\n /** Quando utilizza un sottocomponente autocomplete abilita o disabilita il reset dell'input per ogni selezione */\r\n @Input() AutocompleteHideChoicesOnSelection: boolean = false;\r\n\r\n /** Funzione da utilizzare per tirare fuori i dati di un autocomplete */\r\n @Input() AutoCompleteDataRetrieve: (parameter: GenericParameter, search: string, byid: boolean) => Observable<{ id: string, description: string }[]>\r\n\r\n /** Permette di settare in una volta solo gli input **LabelColWidth** e **InputColWidth**, basta scriverlo con la sintassi \"X Y\" */\r\n @Input() set LabelInputRatio(input: string) {\r\n var ratio = input.split(/\\s/);\r\n this.LabelColWidth = parseInt(ratio[0]);\r\n this.InputColWidth = parseInt(ratio[1]);\r\n }\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(private utiExts: UtilityService, public lc: LocalizationService, public cdr: ChangeDetectorRef, private inj: Injector, public dates: DateService) { }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public writeValue(obj): void {\r\n this.Parameters = obj;\r\n\r\n this.ParametersCache = {};\r\n if (!this.Parameters)\r\n return;\r\n\r\n this.Parameters.forEach(t => {\r\n this.ParametersCache[t.id] = t;\r\n\r\n if (!t.typecode && !t.type)\r\n console.warn(\"Non è stato specificato né un type né un typecode\");\r\n\r\n if (t.typecode && !t.type)\r\n t.type = this.utiExts.getJsTypeFromTypeCode(t.typecode);\r\n\r\n if (t.typecode && t.type != this.utiExts.getJsTypeFromTypeCode(t.typecode))\r\n console.warn(`Rilevate inconsistenze fra il Tipo ${t.type} e il Tipo ${this.utiExts.getJsTypeFromTypeCode(t.typecode)} calcolato da TypeCode ${t.typecode} per il parametro ${t.id}`);\r\n\r\n if (t.type == \"boolean\")\r\n t.value = t.value?.toString()?.toLowerCase() === \"true\";\r\n\r\n if (t.enumtype || t.dicttype)\r\n t.type = 'enum';\r\n\r\n // Valore valido ma modalità di utilizzo a CommaSeparated, devo assicurarmi di riemettere la versione con la stringa\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n this.changed();\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && !Array.isArray(t.value))\r\n t.value = t.value ? t.value.split(',').map(t => t.trim()) : [];\r\n });\r\n\r\n this.reviewParametersBindings();\r\n this.generateGroups();\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i gruppi dei parametri\r\n */\r\n generateGroups() {\r\n this.Groups = [];\r\n\r\n if (this.Parameters?.length > 0) {\r\n this.Parameters.sort((a, b) => a.order < b.order ? -1 : 1);\r\n\r\n // Ciclo tutti i parametri\r\n for (let i = 0; this.Parameters.length > i; i++) {\r\n let par = this.Parameters[i];\r\n\r\n let parGroupName = par.group ?? \"\";\r\n let groupOrder = par.group ? par.order : -1;\r\n\r\n // Se il gruppo non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parGroupName, groupOrder));\r\n }\r\n\r\n // Inserisco il parametro dentro al suo gruppo\r\n this.Groups.find(g => g.groupName == parGroupName).parameters.push(par)\r\n }\r\n\r\n // Gestione sottogruppi\r\n let subgroups: GenericParameterGroup[] = this.Groups.filter(group => group.groupName.includes('§'));\r\n for (let _; subgroups.length > 0; () => { }) {\r\n // Recupero la lista di gruppi che hanno sottogruppi\r\n // Per convenzione, nel nome contengono \"§\"\r\n this.tryToAddSubgroups(subgroups);\r\n subgroups = this.Groups.filter(group => group.groupName.includes('§'));\r\n }\r\n\r\n this.Groups.sort((a, b) => a.order < b.order ? -1 : 1);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i sottogruppi dei parametri\r\n */\r\n tryToAddSubgroups(subgroups: GenericParameterGroup[]) {\r\n for (let i = 0; subgroups.length > i; i++) {\r\n let sub = subgroups[i];\r\n\r\n // Ottengo un lista con la gerarchia dei gruppi, in ordine\r\n let groupsParentHierarchy = sub.groupName.split('§') ?? [];\r\n\r\n // Recupero il gruppo padre\r\n let parentGroupName = sub.groupName.replace(`§${groupsParentHierarchy[groupsParentHierarchy.length - 1]}`, ``);\r\n\r\n // Se il gruppo padre non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parentGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parentGroupName, sub.order));\r\n }\r\n\r\n // Rimuovo dal nome del gruppo l'informazione sul padre (Sistemando anche l'etichetta)\r\n // e lo aggiungo ai sottogruppi del padre\r\n sub.groupName = sub.groupName.replace(`${parentGroupName}§`, '');\r\n let parentGroup = this.Groups.find(x => x.groupName == parentGroupName);\r\n if (parentGroup?.subgroups.some(s => s.groupName == sub.groupName)) {\r\n let target = parentGroup.subgroups.find(f => f.groupName == sub.groupName);\r\n sub.parameters.map(p => target.parameters.push(p));\r\n sub.subgroups.map(s => target.subgroups.push(s));\r\n target.order = sub.order < target.order ? sub.order : target.order;\r\n } else {\r\n parentGroup?.subgroups.push(sub);\r\n }\r\n\r\n // Rimuovo il sottogruppo gruppo dalla lista\r\n this.Groups.splice(this.Groups.indexOf(sub), 1);\r\n }\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnChange(fn): void { this.propagateChange = fn; }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnTouched(fn): void { }\r\n\r\n /**\r\n * Metodo che si occupa di gestire il modello in uscita e propagarlo sul binding ngModel\r\n */\r\n public changed() {\r\n if (!this.Parameters)\r\n return;\r\n\r\n // Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri\r\n var changes = this.reviewParametersBindings();\r\n if (changes.length > 0) {\r\n\r\n // In base ai binding cambiati devo trovare tutti i parametri che han subito modifiche strutturali (visibilità, obbligatorietà)\r\n // distruggerli e ricrearli in modo che i binding lato html si aggiornino di conseguenza.\r\n // 1: Faccio una copia del parametro corrente\r\n // 2: Trovo la sua posizione all'interno dei gruppi e lo sostituisco con la copia\r\n // 3: Aggiorno la lista dei parametri e la sua cache in modo da puntare all'oggetto nuovo\r\n changes.forEach(ch => {\r\n let index = this.Parameters.findIndex(t => t.id == ch);\r\n let parameterCopy = this.utiExts.deepClone(this.Parameters[index]) as GenericParameter;\r\n\r\n let parameterRefFixed = false;\r\n for (let ig = 0; ig < this.Groups.length; ig++) {\r\n var g = this.Groups[ig];\r\n for (let ip = 0; ip < g.parameters.length; ip++) {\r\n var p = g.parameters[ip]\r\n if (p === this.Parameters[index]) {\r\n this.Groups[ig].parameters[ip] = parameterCopy;\r\n parameterRefFixed = true;\r\n break;\r\n }\r\n }\r\n if (parameterRefFixed)\r\n break;\r\n }\r\n \r\n this.Parameters[index] = parameterCopy\r\n this.ParametersCache[ch] = this.Parameters[index];\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n var ParametersClone = this.utiExts.deepClone(this.Parameters) as GenericParameter[];\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n ParametersClone?.forEach(t => {\r\n if (t.type == \"enum\" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = t.value.join(',');\r\n });\r\n\r\n this.propagateChange(ParametersClone);\r\n }\r\n\r\n /**\r\n * Rimuove il parametro selezionato e propaga il modello\r\n * \r\n * @param {GenericParameter} par Parametro da rimuovere\r\n */\r\n public removeParameter(par: GenericParameter) {\r\n this.Parameters.splice(this.Parameters.indexOf(par), 1);\r\n this.changed();\r\n }\r\n\r\n public GenerateParameterGroups() {\r\n let Groups: { id: string, groups: string[], order: number }[] = [];\r\n\r\n this.Parameters.forEach(param => {\r\n Groups.push({ id: param.id, groups: param.group.split(\"§\"), order: param.order });\r\n });\r\n\r\n let GroupedGroups = Groups.reduce((r, a) => {\r\n let firstGroupId = a.groups?.length > 0 ? a.groups[0] : \"\";\r\n r[firstGroupId] = [...r[firstGroupId] || [], a];\r\n return r;\r\n }, {});\r\n\r\n console.log(GroupedGroups);\r\n\r\n // Ciclo del risultato, aggiungendo i gruppi al modello\r\n // Per ogni gruppo che aggiungo, assegno i parametri in ordine\r\n }\r\n\r\n /**\r\n * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo\r\n * \r\n * @returns {string[]} lista con gli id dei parametri che sono stati modificati\r\n */\r\n private reviewParametersBindings(): string[] {\r\n let changes = [];\r\n for (let i = 0; i < this.Parameters.length; i++) {\r\n var p = this.Parameters[i];\r\n\r\n if (p.requiredexp) {\r\n let prevReq = p.required;\r\n p.required = this.evaluate(p.requiredexp);\r\n if (prevReq != p.required)\r\n changes.push(p.id);\r\n }\r\n if (p.visibleexp) {\r\n let prevVisi = p.visible;\r\n p.visible = this.evaluate(p.visibleexp);\r\n if (prevVisi != p.visible)\r\n changes.push(p.id)\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Valuta un'espressione in base ai parametri presenti nel modello attuale\r\n * \r\n * @param expr Espressione da valutare scritta nel formato (ripetibile) \"ID (==|!=|<|>|>=|<=) (`valore` | null | true | false | XXX,XXX)\" separato eventualmente da && ed ||\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n private evaluate(expr: string): boolean {\r\n var regex = /\\s?([a-zA-Z0-9_-]+)\\s?(!=|==|<|>|<=|>=)\\s?(`[^`]+`|``|null|[0-9,]+|true|false)/gm;\r\n\r\n var matches: string[] = [];\r\n var finalExpr = expr;\r\n while (matches = regex.exec(expr)) {\r\n var fullMatch = matches[0].trim();\r\n var id = matches[1].trim();\r\n var operation = matches[2].trim();\r\n let bValue = matches[3].trim().trim();\r\n var value = matches[3].trim().trim().replace('`', '').replace('`', '');\r\n\r\n finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', ${bValue == 'null' ? 'null' : `'${value}'`})`);\r\n }\r\n\r\n return eval(finalExpr);\r\n }\r\n\r\n /**\r\n * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore\r\n * Richiamata da EVAL\r\n * \r\n * @param {string} key Chiave del parametro di cui verificare il valore\r\n * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=\r\n * @param {string} value Valore di confronto da utilizzare\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n public checkValue(key: string, operator: string, value: string): boolean {\r\n var rPar = this.ParametersCache[key];\r\n try {\r\n switch (rPar.type) {\r\n case \"string\":\r\n case \"enum\":\r\n return eval(`\"${this.defaultIfnullOrUndefined(rPar.value, ``)}\" ${operator} \"${this.defaultIfnullOrUndefined(value, ``)}\"`);\r\n case \"boolean\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, ``).toString()} ${operator} ${this.defaultIfnullOrUndefined(value, ``)}`);\r\n case \"number\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, '\"\"', true).replace(',', '.')} ${operator} ${this.defaultIfnullOrUndefined(value, '\"\"', true).replace(',', '.')}`);\r\n case \"date\":\r\n let parDateConv = `this.dates.getDateConvertion(\"${rPar.value}\")`;\r\n let valDateConv = `this.dates.getDateConvertion(\"${value}\")`;\r\n\r\n switch (operator) {\r\n\r\n case \"==\": return eval(`${parDateConv} == ${valDateConv} || (${parDateConv} != null && ${parDateConv}.isSame(${valDateConv}))`);\r\n case \"!=\": return eval(`${parDateConv} != ${valDateConv} && ${parDateConv} != null && !${parDateConv}.isSame(${valDateConv})`);\r\n case \">\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isAfter(${valDateConv})`);\r\n case \"<\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isBefore(${valDateConv})`);\r\n case \">=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isAfter(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n case \"<=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isBefore(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n console.warn(\"Errori nella valutazione dell'espressione. Fallback a false\");\r\n return false;\r\n }\r\n\r\n throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;\r\n }\r\n\r\n /** @ignore */\r\n private defaultIfnullOrUndefined<T>(item: T, dflt: T, emptyStringIsNull: boolean = false): T {\r\n if (item == null || item == undefined || item.toString() == 'null' || (emptyStringIsNull && item.toString() == \"\"))\r\n return dflt;\r\n return item;\r\n }\r\n\r\n /** @ignore */\r\n public getSource(parameter: GenericParameter, search: string, byid: boolean): Observable<{ id: string, description: string }[]> {\r\n if (!this.AutoCompleteDataRetrieve) {\r\n console.error(\"@forms-and-validations: funzione di dataretrieve non impostata per un parametro autocomplete\");\r\n return of([])\r\n }\r\n else\r\n return this.AutoCompleteDataRetrieve(parameter, search, byid);\r\n }\r\n}","<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\">\r\n <ng-container *ngIf=\"par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\"> </span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n </ng-container>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FormsAndValidationsModule } from \"@esfaenza/forms-and-validations\";\r\nimport { LocalizationModule } from '@esfaenza/localizations';\r\nimport { EsParametersComponent } from './es_parameters.component';\r\n\r\n\r\n@NgModule({\r\n declarations: [EsParametersComponent],\r\n imports: [\r\n CommonModule,\r\n LocalizationModule,\r\n FormsModule,\r\n FormsAndValidationsModule,\r\n ],\r\n exports: [EsParametersComponent]\r\n})\r\nexport class EsParametersModule {\r\n }\r\n","/**\r\n * Classe che rappresenta un parametro generico\r\n */\r\nexport class GenericParameter {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Codice del parametro\r\n * @param {string} description Descrizione del parametro\r\n * @param {string} pattern Pattern di validazione\r\n * @param {'date' | 'string' | 'number' | 'boolean' | 'enum'} type Tipo di input \r\n * @param {boolean} required Indica se il valore è obbligatorio o meno\r\n * @param {any} v_default Valore di default per questo Parametro\r\n * @param {{ id: string, description: string }[]} enumvalues Qualora il **type** fosse di tipo **enum**, qui devono esserci tutti i valori che può assumere \r\n * @param {boolean} multienum Qualora il **type** fosse di tipo **enum**, indica se è possibile selezionare più valori (multiselect)\r\n * @param {string} sourceapi Nei casi in cui il **type** è **enum** indica l'api da cui recuperare i valori da bindare alla select o alla multiselect\r\n * @param {boolean} pageddata Nei casi in cui il **type** è **enum** indica che l'api specificata eventualmetne da **sourceapi** è paginata\r\n */\r\n constructor(\r\n public id: string,\r\n public description: string,\r\n public pattern: string,\r\n type: 'date' | 'string' | 'number' | 'boolean' | 'enum',\r\n public required: boolean,\r\n v_default: any = null,\r\n public enumvalues: { id: string, description: string }[] = [],\r\n public multienum?: boolean,\r\n public sourceapi?: string,\r\n public pageddata?: boolean) {\r\n\r\n this.type = type == 'enum' ? null : type;\r\n this.visible = true;\r\n this.enumtype = type == 'enum' ? type : \"\";\r\n this.isreadonly = false;\r\n\r\n if (!this.enumtype && enumvalues.length != 0)\r\n console.error(\"impossibile gestire valori di dizionario per un parametro non di tipo enum\");\r\n\r\n if (v_default != null)\r\n this.value = v_default;\r\n }\r\n\r\n /** Tipo di dato rappresentato da questo parametro */\r\n public type?: 'date' | 'string' | 'number' | 'boolean' | 'enum';\r\n\r\n /** Typecode lato C# che rappresenta il tipo di dato */\r\n public typecode: number;\r\n\r\n /** Indica se il campo specificato dev'essere di sola lettura o meno */\r\n public isreadonly: boolean;\r\n\r\n /** Valore del parametro */\r\n public value: any;\r\n\r\n /** Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto */\r\n public visible: boolean;\r\n\r\n /** Tipo Enum, valorizzato dal Backend */\r\n public enumtype: string;\r\n\r\n /** Tipo Dizionario, valorizzato dal Backend */\r\n public dicttype: string;\r\n\r\n /** Espressione di obbligatorietà */\r\n public requiredexp?: string;\r\n\r\n /** Espressione di visibilità */\r\n public visibleexp?: string;\r\n\r\n /** Ordinamento in base al quale verranno ordinati i parametri */\r\n public order: number;\r\n\r\n /** Gruppo di appartenenza del parametro */\r\n public group: string;\r\n}","/*\r\n * Public API Surface of parameters\r\n */\r\nexport * from './lib/es_parameters.module';\r\nexport * from './lib/models/GenericParameter';\r\nexport * from './lib/es_parameters.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;AAGA;;AAEG;AAEG,MAAO,eAAgB,SAAQ,mBAAmB,CAAA;AAEpD;;;;AAIG;AACH,IAAA,WAAA,CAAY,QAAkB,EAAA;QAC1B,KAAK,CAAC,QAAQ,CAAC,CAAC;KACnB;;4GATQ,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;gHAAf,eAAe,EAAA,CAAA,CAAA;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;;;ACJX;;AAEG;MACU,qBAAqB,CAAA;AAE7B;;;;AAIE;IAEH,WAAmB,CAAA,SAAiB,EAAS,KAAa,EAAA;AAAvC,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAQ;AAAS,QAAA,IAAK,CAAA,KAAA,GAAL,KAAK,CAAQ;AACtD,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;KACvB;AAWJ;;AC3BD;AAgBA;MAea,qBAAqB,CAAA;;IAuD9B,IAAa,eAAe,CAAC,KAAa,EAAA;QACtC,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC3C;AAED;;;;AAIG;IACH,WAAoB,CAAA,OAAuB,EAAS,EAAuB,EAAS,GAAsB,EAAU,GAAa,EAAS,KAAkB,EAAA;AAAxI,QAAA,IAAO,CAAA,OAAA,GAAP,OAAO,CAAgB;AAAS,QAAA,IAAE,CAAA,EAAA,GAAF,EAAE,CAAqB;AAAS,QAAA,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;AAAU,QAAA,IAAG,CAAA,GAAA,GAAH,GAAG,CAAU;AAAS,QAAA,IAAK,CAAA,KAAA,GAAL,KAAK,CAAa;AAvD5J;;;;AAIG;QACH,IAAA,CAAA,eAAe,GAAG,CAAC,CAAM,KAAO,GAAC,CAAC;;AAGzB,QAAA,IAAW,CAAA,WAAA,GAAY,KAAK,CAAC;;AAG7B,QAAA,IAAqB,CAAA,qBAAA,GAAY,KAAK,CAAC;;AAGvC,QAAA,IAAa,CAAA,aAAA,GAAW,CAAC,CAAC;;AAG1B,QAAA,IAAa,CAAA,aAAA,GAAW,CAAC,CAAC;;AAG1B,QAAA,IAAS,CAAA,SAAA,GAAY,KAAK,CAAC;;AAG3B,QAAA,IAAY,CAAA,YAAA,GAAW,EAAE,CAAC;;AAG1B,QAAA,IAAO,CAAA,OAAA,GAAY,KAAK,CAAC;;AAGzB,QAAA,IAAQ,CAAA,QAAA,GAAY,KAAK,CAAC;;AAG1B,QAAA,IAAU,CAAA,UAAA,GAA+B,OAAO,CAAC;;AAGjD,QAAA,IAAI,CAAA,IAAA,GAAW,IAAI,CAAC;;AAGpB,QAAA,IAAkC,CAAA,kCAAA,GAAY,KAAK,CAAC;KAiBoG;AAEjK;;;;AAIG;AACI,IAAA,UAAU,CAAC,GAAG,EAAA;AACjB,QAAA,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;AAEtB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,UAAU;YAChB,OAAO;AAEX,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAG;;YACxB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAE/B,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI;AACtB,gBAAA,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;AAEtE,YAAA,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI;AACrB,gBAAA,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAE5D,YAAA,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtE,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAA,mCAAA,EAAsC,CAAC,CAAC,IAAI,CAAA,WAAA,EAAc,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAA0B,uBAAA,EAAA,CAAC,CAAC,QAAQ,CAAqB,kBAAA,EAAA,CAAC,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC;AAE1L,YAAA,IAAI,CAAC,CAAC,IAAI,IAAI,SAAS;AACnB,gBAAA,CAAC,CAAC,KAAK,GAAG,CAAA,CAAA,EAAA,GAAA,MAAA,CAAC,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,QAAQ,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,WAAW,EAAE,MAAK,MAAM,CAAC;AAE5D,YAAA,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ;AACxB,gBAAA,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC;;YAGpB,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,gBAAgB,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC3G,IAAI,CAAC,OAAO,EAAE,CAAC;;AAGnB,YAAA,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,gBAAgB,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5G,gBAAA,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC;AACvE,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,cAAc,EAAE,CAAC;KACzB;AAED;;AAEE;IACF,cAAc,GAAA;;AACV,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QAEjB,IAAI,CAAA,MAAA,IAAI,CAAC,UAAU,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAM,IAAG,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAG3D,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC7C,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAE7B,IAAI,YAAY,GAAG,CAAA,EAAA,GAAA,GAAG,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,EAAE,CAAC;AACnC,gBAAA,IAAI,UAAU,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;;AAG5C,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,YAAY,CAAC,EAAE;AACrD,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;AACzE,iBAAA;;gBAGD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,YAAY,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1E,aAAA;;YAGD,IAAI,SAAS,GAA4B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACpG,YAAA,KAAK,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,MAAK,GAAI,EAAE;;;AAGzC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAClC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1E,aAAA;AAED,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,SAAA;KACJ;AAED;;AAEE;AACF,IAAA,iBAAiB,CAAC,SAAkC,EAAA;;AAChD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACvC,YAAA,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;;AAGvB,YAAA,IAAI,qBAAqB,GAAG,CAAA,EAAA,GAAA,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,EAAE,CAAC;;YAG3D,IAAI,eAAe,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAI,CAAA,EAAA,qBAAqB,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAE,CAAA,EAAE,CAAE,CAAA,CAAC,CAAC;;AAG/G,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,eAAe,CAAC,EAAE;AACxD,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,eAAe,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3E,aAAA;;;AAID,YAAA,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,eAAe,CAAA,CAAA,CAAG,EAAE,EAAE,CAAC,CAAC;AACjE,YAAA,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,eAAe,CAAC,CAAC;YACxE,IAAI,WAAW,aAAX,WAAW,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAX,WAAW,CAAE,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE;gBAChE,IAAI,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;AAC3E,gBAAA,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,gBAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjD,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AACtE,aAAA;AAAM,iBAAA;gBACH,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAX,WAAW,CAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,aAAA;;AAGD,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACnD,SAAA;KACJ;AAED;;;;AAIG;IACI,gBAAgB,CAAC,EAAE,EAAA,EAAU,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,EAAE;AAEhE;;;;AAIG;IACI,iBAAiB,CAAC,EAAE,EAAA,GAAW;AAEtC;;AAEG;IACI,OAAO,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,UAAU;YAChB,OAAO;;AAGX,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;AAC9C,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;;;;;;AAOpB,YAAA,OAAO,CAAC,OAAO,CAAC,EAAE,IAAG;AACjB,gBAAA,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,gBAAA,IAAI,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAqB,CAAC;gBAEvF,IAAI,iBAAiB,GAAG,KAAK,CAAC;AAC9B,gBAAA,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;oBAC5C,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACxB,oBAAA,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;wBAC7C,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;wBACxB,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AAC9B,4BAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC;4BAC/C,iBAAiB,GAAG,IAAI,CAAC;4BACzB,MAAM;AACT,yBAAA;AACJ,qBAAA;AACD,oBAAA,IAAI,iBAAiB;wBACjB,MAAM;AACb,iBAAA;AAED,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,aAAa,CAAA;AACtC,gBAAA,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAClD,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;AAC5B,aAAC,CAAC,CAAC;AACN,SAAA;AAED,QAAA,IAAI,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAuB,CAAC;;QAGpF,eAAe,KAAA,IAAA,IAAf,eAAe,KAAf,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,eAAe,CAAE,OAAO,CAAC,CAAC,IAAG;YACzB,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,gBAAgB,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC3G,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;KACzC;AAED;;;;AAIG;AACI,IAAA,eAAe,CAAC,GAAqB,EAAA;AACxC,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,EAAE,CAAC;KAClB;IAEM,uBAAuB,GAAA;QAC1B,IAAI,MAAM,GAAsD,EAAE,CAAC;AAEnE,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,IAAG;AAC5B,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AACtF,SAAC,CAAC,CAAC;QAEH,IAAI,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;;YACvC,IAAI,YAAY,GAAG,CAAA,CAAA,EAAA,GAAA,CAAC,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,IAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC3D,YAAA,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAChD,YAAA,OAAO,CAAC,CAAC;SACZ,EAAE,EAAE,CAAC,CAAC;AAEP,QAAA,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;;;KAI9B;AAED;;;;AAIG;IACK,wBAAwB,GAAA;QAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;AACjB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAE3B,IAAI,CAAC,CAAC,WAAW,EAAE;AACf,gBAAA,IAAI,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC;gBACzB,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AAC1C,gBAAA,IAAI,OAAO,IAAI,CAAC,CAAC,QAAQ;AACrB,oBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1B,aAAA;YACD,IAAI,CAAC,CAAC,UAAU,EAAE;AACd,gBAAA,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC;gBACzB,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AACxC,gBAAA,IAAI,QAAQ,IAAI,CAAC,CAAC,OAAO;AACrB,oBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AACzB,aAAA;AACJ,SAAA;AACD,QAAA,OAAO,OAAO,CAAC;KAClB;AAED;;;;;;AAMG;AACK,IAAA,QAAQ,CAAC,IAAY,EAAA;QACzB,IAAI,KAAK,GAAG,kFAAkF,CAAC;QAE/F,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,OAAO,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC/B,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,YAAA,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAEvE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,CAAoB,iBAAA,EAAA,EAAE,CAAO,IAAA,EAAA,SAAS,CAAM,GAAA,EAAA,MAAM,IAAI,MAAM,GAAG,MAAM,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAC;AACrI,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;KAC1B;AAED;;;;;;;;;AASG;AACI,IAAA,UAAU,CAAC,GAAW,EAAE,QAAgB,EAAE,KAAa,EAAA;QAC1D,IAAI,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI;YACA,QAAQ,IAAI,CAAC,IAAI;AACb,gBAAA,KAAK,QAAQ,CAAC;AACd,gBAAA,KAAK,MAAM;oBACP,OAAO,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAE,CAAA,CAAC,KAAK,QAAQ,CAAA,EAAA,EAAK,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC;AAChI,gBAAA,KAAK,SAAS;AACV,oBAAA,OAAO,IAAI,CAAC,CAAG,EAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE,CAAC,CAAC,QAAQ,EAAE,CAAI,CAAA,EAAA,QAAQ,CAAI,CAAA,EAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC;AACvI,gBAAA,KAAK,QAAQ;oBACT,OAAO,IAAI,CAAC,CAAG,EAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC;AAChL,gBAAA,KAAK,MAAM;AACP,oBAAA,IAAI,WAAW,GAAG,CAAA,8BAAA,EAAiC,IAAI,CAAC,KAAK,IAAI,CAAC;AAClE,oBAAA,IAAI,WAAW,GAAG,CAAiC,8BAAA,EAAA,KAAK,IAAI,CAAC;AAE7D,oBAAA,QAAQ,QAAQ;AAEZ,wBAAA,KAAK,IAAI,EAAE,OAAO,IAAI,CAAC,GAAG,WAAW,CAAA,IAAA,EAAO,WAAW,CAAA,KAAA,EAAQ,WAAW,CAAe,YAAA,EAAA,WAAW,WAAW,WAAW,CAAA,EAAA,CAAI,CAAC,CAAC;AAChI,wBAAA,KAAK,IAAI,EAAE,OAAO,IAAI,CAAC,GAAG,WAAW,CAAA,IAAA,EAAO,WAAW,CAAA,IAAA,EAAO,WAAW,CAAgB,aAAA,EAAA,WAAW,WAAW,WAAW,CAAA,CAAA,CAAG,CAAC,CAAC;AAC/H,wBAAA,KAAK,GAAG,EAAE,OAAO,IAAI,CAAC,CAAG,EAAA,WAAW,CAAe,YAAA,EAAA,WAAW,eAAe,WAAW,CAAA,SAAA,EAAY,WAAW,CAAA,CAAA,CAAG,CAAC,CAAC;AACpH,wBAAA,KAAK,GAAG,EAAE,OAAO,IAAI,CAAC,CAAG,EAAA,WAAW,CAAe,YAAA,EAAA,WAAW,eAAe,WAAW,CAAA,UAAA,EAAa,WAAW,CAAA,CAAA,CAAG,CAAC,CAAC;wBACrH,KAAK,IAAI,EAAE,OAAO,IAAI,CAAC,CAAA,EAAG,WAAW,CAAe,YAAA,EAAA,WAAW,gBAAgB,WAAW,CAAA,SAAA,EAAY,WAAW,CAAQ,KAAA,EAAA,WAAW,YAAY,WAAW,CAAA,EAAA,CAAI,CAAC,CAAC;wBACjK,KAAK,IAAI,EAAE,OAAO,IAAI,CAAC,CAAA,EAAG,WAAW,CAAe,YAAA,EAAA,WAAW,gBAAgB,WAAW,CAAA,UAAA,EAAa,WAAW,CAAQ,KAAA,EAAA,WAAW,YAAY,WAAW,CAAA,EAAA,CAAI,CAAC,CAAC;AACrK,qBAAA;AACR,aAAA;AACJ,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACrB,YAAA,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;AAC5E,YAAA,OAAO,KAAK,CAAC;AAChB,SAAA;AAED,QAAA,MAAM,wCAAwC,GAAG,CAAA,mBAAA,EAAsB,IAAI,CAAC,IAAI,EAAE,CAAC;KACtF;;AAGO,IAAA,wBAAwB,CAAI,IAAO,EAAE,IAAO,EAAE,oBAA6B,KAAK,EAAA;QACpF,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,MAAM,KAAK,iBAAiB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9G,YAAA,OAAO,IAAI,CAAC;AAChB,QAAA,OAAO,IAAI,CAAC;KACf;;AAGM,IAAA,SAAS,CAAC,SAA2B,EAAE,MAAc,EAAE,IAAa,EAAA;AACvE,QAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAChC,YAAA,OAAO,CAAC,KAAK,CAAC,8FAA8F,CAAC,CAAC;AAC9G,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;AAChB,SAAA;;YAEG,OAAO,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;KACrE;;kHAtYQ,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAZnB,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,kCAAA,EAAA,oCAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,SAAA,EAAA;AACP,QAAA,EAAE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,eAAe,EAAE;AAC3D,QAAA;AACI,YAAA,OAAO,EAAE,iBAAiB;AAC1B,YAAA,WAAW,EAAE,UAAU,CAAC,MAAM,qBAAqB,CAAC;AACpD,YAAA,KAAK,EAAE,IAAI;AACd,SAAA;KACJ,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1BL,kwMAiEc,EAAA,MAAA,EAAA,CAAA,4SAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,sEAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,cAAA,EAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,OAAA,EAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;2FDlCD,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAdjC,SAAS;YACI,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EACd,SAAA,EAAA;AACP,wBAAA,EAAE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,eAAe,EAAE;AAC3D,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,2BAA2B,CAAC;AACpD,4BAAA,KAAK,EAAE,IAAI;AACd,yBAAA;AACJ,qBAAA,EAEc,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,kwMAAA,EAAA,MAAA,EAAA,CAAA,4SAAA,CAAA,EAAA,CAAA;wNAsB5B,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBAGG,qBAAqB,EAAA,CAAA;sBAA7B,KAAK;gBAGG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAGG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAGG,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBAGG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBAGG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBAGG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBAGG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBAGG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBAGG,kCAAkC,EAAA,CAAA;sBAA1C,KAAK;gBAGG,wBAAwB,EAAA,CAAA;sBAAhC,KAAK;gBAGO,eAAe,EAAA,CAAA;sBAA3B,KAAK;;;MEpEG,kBAAkB,CAAA;;+GAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAAlB,kBAAkB,EAAA,YAAA,EAAA,CATd,qBAAqB,CAAA,EAAA,OAAA,EAAA,CAElC,YAAY;QACZ,kBAAkB;QAClB,WAAW;QACX,yBAAyB,aAEjB,qBAAqB,CAAA,EAAA,CAAA,CAAA;AAEpB,kBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,YAP3B,YAAY;QACZ,kBAAkB;QAClB,WAAW;QACX,yBAAyB,CAAA,EAAA,CAAA,CAAA;2FAIhB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAV9B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,YAAY,EAAE,CAAC,qBAAqB,CAAC;AACrC,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,kBAAkB;wBAClB,WAAW;wBACX,yBAAyB;AAC1B,qBAAA;oBACD,OAAO,EAAE,CAAC,qBAAqB,CAAC;iBACjC,CAAA;;;ACjBD;;AAEG;MACU,gBAAgB,CAAA;AAEzB;;;;;;;;;;;;;AAaG;IACH,WACW,CAAA,EAAU,EACV,WAAmB,EACnB,OAAe,EACtB,IAAuD,EAChD,QAAiB,EACxB,YAAiB,IAAI,EACd,aAAoD,EAAE,EACtD,SAAmB,EACnB,SAAkB,EAClB,SAAmB,EAAA;AATnB,QAAA,IAAE,CAAA,EAAA,GAAF,EAAE,CAAQ;AACV,QAAA,IAAW,CAAA,WAAA,GAAX,WAAW,CAAQ;AACnB,QAAA,IAAO,CAAA,OAAA,GAAP,OAAO,CAAQ;AAEf,QAAA,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAS;AAEjB,QAAA,IAAU,CAAA,UAAA,GAAV,UAAU,CAA4C;AACtD,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAU;AACnB,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAS;AAClB,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAU;AAE1B,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AACzC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;AAC3C,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC;AACxC,YAAA,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAEhG,IAAI,SAAS,IAAI,IAAI;AACjB,YAAA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;KAC9B;AAkCJ;;AC3ED;;AAEG;;ACFH;;AAEG;;;;"}
|
|
@@ -210,21 +210,39 @@ class EsParametersComponent {
|
|
|
210
210
|
// Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri
|
|
211
211
|
var changes = this.reviewParametersBindings();
|
|
212
212
|
if (changes.length > 0) {
|
|
213
|
+
// In base ai binding cambiati devo trovare tutti i parametri che han subito modifiche strutturali (visibilità, obbligatorietà)
|
|
214
|
+
// distruggerli e ricrearli in modo che i binding lato html si aggiornino di conseguenza.
|
|
215
|
+
// 1: Faccio una copia del parametro corrente
|
|
216
|
+
// 2: Trovo la sua posizione all'interno dei gruppi e lo sostituisco con la copia
|
|
217
|
+
// 3: Aggiorno la lista dei parametri e la sua cache in modo da puntare all'oggetto nuovo
|
|
213
218
|
changes.forEach(ch => {
|
|
214
219
|
let index = this.Parameters.findIndex(t => t.id == ch);
|
|
215
|
-
|
|
220
|
+
let parameterCopy = this.utiExts.deepClone(this.Parameters[index]);
|
|
221
|
+
let parameterRefFixed = false;
|
|
222
|
+
for (let ig = 0; ig < this.Groups.length; ig++) {
|
|
223
|
+
var g = this.Groups[ig];
|
|
224
|
+
for (let ip = 0; ip < g.parameters.length; ip++) {
|
|
225
|
+
var p = g.parameters[ip];
|
|
226
|
+
if (p === this.Parameters[index]) {
|
|
227
|
+
this.Groups[ig].parameters[ip] = parameterCopy;
|
|
228
|
+
parameterRefFixed = true;
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (parameterRefFixed)
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
this.Parameters[index] = parameterCopy;
|
|
216
236
|
this.ParametersCache[ch] = this.Parameters[index];
|
|
217
237
|
this.cdr.markForCheck();
|
|
218
238
|
});
|
|
219
239
|
}
|
|
220
|
-
var ParametersClone =
|
|
240
|
+
var ParametersClone = this.utiExts.deepClone(this.Parameters);
|
|
221
241
|
// Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori
|
|
222
242
|
ParametersClone?.forEach(t => {
|
|
223
243
|
if (t.type == "enum" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))
|
|
224
244
|
t.value = t.value.join(',');
|
|
225
245
|
});
|
|
226
|
-
// Era stato messo per fixare qualcosa, ma spacca tutto dato che ad ogni cambiamento ricrea il dom, quindi secca i focus
|
|
227
|
-
//this.generateGroups();
|
|
228
246
|
this.propagateChange(ParametersClone);
|
|
229
247
|
}
|
|
230
248
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esfaenza-parameters.mjs","sources":["../../../projects/parameters/src/lib/es_parameters.component.loc.ts","../../../projects/parameters/src/lib/models/GenericParameterGroup.ts","../../../projects/parameters/src/lib/es_parameters.component.ts","../../../projects/parameters/src/lib/es_parameters.component.html","../../../projects/parameters/src/lib/es_parameters.module.ts","../../../projects/parameters/src/lib/models/GenericParameter.ts","../../../projects/parameters/src/public-api.ts","../../../projects/parameters/src/esfaenza-parameters.ts"],"sourcesContent":["import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/**\r\n * Classe di localizzazione per il componente **EsParametersComponent**\r\n */\r\n@Injectable()\r\nexport class EsParametersLoc extends LocalizationService {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(injector: Injector) {\r\n super(injector);\r\n }\r\n}","import { GenericParameter } from \"./GenericParameter\";\r\n\r\n/**\r\n * Classe che rappresenta un gruppo di parametri generico\r\n */\r\nexport class GenericParameterGroup {\r\n\r\n /**\r\n * Costruttore\r\n * @param {string} groupName Descrizione del gruppo che fa anche da id\r\n * @param {number} order ordine del gruppo\r\n */\r\n\r\n constructor(public groupName: string, public order: number) {\r\n this.parameters = [];\r\n this.subgroups = [];\r\n }\r\n\r\n /** Lista di Generic Parameters */\r\n public parameters: GenericParameter[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n public subgroups: GenericParameterGroup[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n // public : GenericParameterGroup[];\r\n\r\n}","// Angular\r\nimport { ControlValueAccessor, UntypedFormControl, NgControl, NgForm, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from \"@angular/forms\";\r\nimport { ChangeDetectorRef, Component, forwardRef, Injector, Input, ViewEncapsulation } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { DateService, UtilityService } from \"@esfaenza/extensions\";\r\n\r\n// Classi\r\nimport { GenericParameter } from './models/GenericParameter';\r\n\r\n// Applicazione\r\nimport { EsParametersLoc } from \"./es_parameters.component.loc\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { GenericParameterGroup } from \"./models/GenericParameterGroup\";\r\n\r\n/** Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico */\r\n@Component({\r\n selector: \"es-parameters\",\r\n providers: [\r\n { provide: LocalizationService, useClass: EsParametersLoc },\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n }\r\n ],\r\n styleUrls: [\"./es_parameters.component.scss\"],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: \"./es_parameters.component.html\"\r\n})\r\nexport class EsParametersComponent implements ControlValueAccessor {\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Parameters: GenericParameter[];\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Groups: GenericParameterGroup[];\r\n\r\n /** Cache per fare lookup rapidi in fase di valutazione espressioni di visibilità e obbligatorietà */\r\n private ParametersCache: { [id: string]: GenericParameter };\r\n\r\n /**\r\n * Pipeline di Angular \r\n * \r\n * @ignore\r\n */\r\n propagateChange = (_: any) => { };\r\n\r\n /** Indica che il parametro deve essere in modalità display */\r\n @Input() DisplayMode: boolean = false;\r\n\r\n /** Indica che l'ultimo parametro non deve avere margine in fondo */\r\n @Input() LastParameterNoMargin: boolean = false;\r\n\r\n /** col-md-X per la label */\r\n @Input() LabelColWidth: number = 4;\r\n\r\n /** col-md-X per l'input */\r\n @Input() InputColWidth: number = 8;\r\n\r\n /** Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente */\r\n @Input() submitted: boolean = false;\r\n\r\n /** Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare */\r\n @Input() EmptyMessage: string = \"\";\r\n\r\n /** Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label */\r\n @Input() Removal: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() Readonly: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() ListFormat: 'CommaSeparated' | 'Array' = 'Array';\r\n\r\n /** Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit */\r\n @Input() Form: NgForm = null;\r\n\r\n /** Quando utilizza un sottocomponente autocomplete abilita o disabilita il reset dell'input per ogni selezione */\r\n @Input() AutocompleteHideChoicesOnSelection: boolean = false;\r\n\r\n /** Funzione da utilizzare per tirare fuori i dati di un autocomplete */\r\n @Input() AutoCompleteDataRetrieve: (parameter: GenericParameter, search: string, byid: boolean) => Observable<{ id: string, description: string }[]>\r\n\r\n /** Permette di settare in una volta solo gli input **LabelColWidth** e **InputColWidth**, basta scriverlo con la sintassi \"X Y\" */\r\n @Input() set LabelInputRatio(input: string) {\r\n var ratio = input.split(/\\s/);\r\n this.LabelColWidth = parseInt(ratio[0]);\r\n this.InputColWidth = parseInt(ratio[1]);\r\n }\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(private utiExts: UtilityService, public lc: LocalizationService, public cdr: ChangeDetectorRef, private inj: Injector, public dates: DateService) { }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public writeValue(obj): void {\r\n this.Parameters = obj;\r\n\r\n this.ParametersCache = {};\r\n if (!this.Parameters)\r\n return;\r\n\r\n this.Parameters.forEach(t => {\r\n this.ParametersCache[t.id] = t;\r\n\r\n if (!t.typecode && !t.type)\r\n console.warn(\"Non è stato specificato né un type né un typecode\");\r\n\r\n if (t.typecode && !t.type)\r\n t.type = this.utiExts.getJsTypeFromTypeCode(t.typecode);\r\n\r\n if (t.typecode && t.type != this.utiExts.getJsTypeFromTypeCode(t.typecode))\r\n console.warn(`Rilevate inconsistenze fra il Tipo ${t.type} e il Tipo ${this.utiExts.getJsTypeFromTypeCode(t.typecode)} calcolato da TypeCode ${t.typecode} per il parametro ${t.id}`);\r\n\r\n if (t.type == \"boolean\")\r\n t.value = t.value?.toString()?.toLowerCase() === \"true\";\r\n\r\n if (t.enumtype || t.dicttype)\r\n t.type = 'enum';\r\n\r\n // Valore valido ma modalità di utilizzo a CommaSeparated, devo assicurarmi di riemettere la versione con la stringa\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n this.changed();\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && !Array.isArray(t.value))\r\n t.value = t.value ? t.value.split(',').map(t => t.trim()) : [];\r\n });\r\n\r\n this.reviewParametersBindings();\r\n this.generateGroups();\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i gruppi dei parametri\r\n */\r\n generateGroups() {\r\n this.Groups = [];\r\n\r\n if (this.Parameters?.length > 0) {\r\n this.Parameters.sort((a, b) => a.order < b.order ? -1 : 1);\r\n\r\n // Ciclo tutti i parametri\r\n for (let i = 0; this.Parameters.length > i; i++) {\r\n let par = this.Parameters[i];\r\n\r\n let parGroupName = par.group ?? \"\";\r\n let groupOrder = par.group ? par.order : -1;\r\n\r\n // Se il gruppo non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parGroupName, groupOrder));\r\n }\r\n\r\n // Inserisco il parametro dentro al suo gruppo\r\n this.Groups.find(g => g.groupName == parGroupName).parameters.push(par)\r\n }\r\n\r\n // Gestione sottogruppi\r\n let subgroups: GenericParameterGroup[] = this.Groups.filter(group => group.groupName.includes('§'));\r\n for (let _; subgroups.length > 0; () => { }) {\r\n // Recupero la lista di gruppi che hanno sottogruppi\r\n // Per convenzione, nel nome contengono \"§\"\r\n this.tryToAddSubgroups(subgroups);\r\n subgroups = this.Groups.filter(group => group.groupName.includes('§'));\r\n }\r\n\r\n this.Groups.sort((a, b) => a.order < b.order ? -1 : 1);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i sottogruppi dei parametri\r\n */\r\n tryToAddSubgroups(subgroups: GenericParameterGroup[]) {\r\n for (let i = 0; subgroups.length > i; i++) {\r\n let sub = subgroups[i];\r\n\r\n // Ottengo un lista con la gerarchia dei gruppi, in ordine\r\n let groupsParentHierarchy = sub.groupName.split('§') ?? [];\r\n\r\n // Recupero il gruppo padre\r\n let parentGroupName = sub.groupName.replace(`§${groupsParentHierarchy[groupsParentHierarchy.length - 1]}`, ``);\r\n\r\n // Se il gruppo padre non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parentGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parentGroupName, sub.order));\r\n }\r\n\r\n // Rimuovo dal nome del gruppo l'informazione sul padre (Sistemando anche l'etichetta)\r\n // e lo aggiungo ai sottogruppi del padre\r\n sub.groupName = sub.groupName.replace(`${parentGroupName}§`, '');\r\n let parentGroup = this.Groups.find(x => x.groupName == parentGroupName);\r\n if (parentGroup?.subgroups.some(s => s.groupName == sub.groupName)) {\r\n let target = parentGroup.subgroups.find(f => f.groupName == sub.groupName);\r\n sub.parameters.map(p => target.parameters.push(p));\r\n sub.subgroups.map(s => target.subgroups.push(s));\r\n target.order = sub.order < target.order ? sub.order : target.order;\r\n } else {\r\n parentGroup?.subgroups.push(sub);\r\n }\r\n\r\n // Rimuovo il sottogruppo gruppo dalla lista\r\n this.Groups.splice(this.Groups.indexOf(sub), 1);\r\n }\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnChange(fn): void { this.propagateChange = fn; }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnTouched(fn): void { }\r\n\r\n /**\r\n * Metodo che si occupa di gestire il modello in uscita e propagarlo sul binding ngModel\r\n */\r\n public changed() {\r\n if (!this.Parameters)\r\n return;\r\n\r\n // Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri\r\n var changes = this.reviewParametersBindings();\r\n if (changes.length > 0) {\r\n changes.forEach(ch => {\r\n let index = this.Parameters.findIndex(t => t.id == ch);\r\n this.Parameters[index] = JSON.parse(JSON.stringify(this.Parameters[index]));\r\n this.ParametersCache[ch] = this.Parameters[index];\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n var ParametersClone = JSON.parse(JSON.stringify(this.Parameters));\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n ParametersClone?.forEach(t => {\r\n if (t.type == \"enum\" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = t.value.join(',');\r\n });\r\n\r\n // Era stato messo per fixare qualcosa, ma spacca tutto dato che ad ogni cambiamento ricrea il dom, quindi secca i focus\r\n //this.generateGroups();\r\n \r\n this.propagateChange(ParametersClone);\r\n }\r\n\r\n /**\r\n * Rimuove il parametro selezionato e propaga il modello\r\n * \r\n * @param {GenericParameter} par Parametro da rimuovere\r\n */\r\n public removeParameter(par: GenericParameter) {\r\n this.Parameters.splice(this.Parameters.indexOf(par), 1);\r\n this.changed();\r\n }\r\n\r\n public GenerateParameterGroups() {\r\n let Groups: { id: string, groups: string[], order: number }[] = [];\r\n\r\n this.Parameters.forEach(param => {\r\n Groups.push({ id: param.id, groups: param.group.split(\"§\"), order: param.order });\r\n });\r\n\r\n let GroupedGroups = Groups.reduce((r, a) => {\r\n let firstGroupId = a.groups?.length > 0 ? a.groups[0] : \"\";\r\n r[firstGroupId] = [...r[firstGroupId] || [], a];\r\n return r;\r\n }, {});\r\n\r\n console.log(GroupedGroups);\r\n\r\n // Ciclo del risultato, aggiungendo i gruppi al modello\r\n // Per ogni gruppo che aggiungo, assegno i parametri in ordine\r\n }\r\n\r\n /**\r\n * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo\r\n * \r\n * @returns {string[]} lista con gli id dei parametri che sono stati modificati\r\n */\r\n private reviewParametersBindings(): string[] {\r\n let changes = [];\r\n for (let i = 0; i < this.Parameters.length; i++) {\r\n var p = this.Parameters[i];\r\n\r\n if (p.requiredexp) {\r\n let prevReq = p.required;\r\n p.required = this.evaluate(p.requiredexp);\r\n if (prevReq != p.required)\r\n changes.push(p.id);\r\n }\r\n if (p.visibleexp) {\r\n let prevVisi = p.visible;\r\n p.visible = this.evaluate(p.visibleexp);\r\n if (prevVisi != p.visible)\r\n changes.push(p.id)\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Valuta un'espressione in base ai parametri presenti nel modello attuale\r\n * \r\n * @param expr Espressione da valutare scritta nel formato (ripetibile) \"ID (==|!=|<|>|>=|<=) (`valore` | null | true | false | XXX,XXX)\" separato eventualmente da && ed ||\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n private evaluate(expr: string): boolean {\r\n var regex = /\\s?([a-zA-Z0-9_-]+)\\s?(!=|==|<|>|<=|>=)\\s?(`[^`]+`|``|null|[0-9,]+|true|false)/gm;\r\n\r\n var matches: string[] = [];\r\n var finalExpr = expr;\r\n while (matches = regex.exec(expr)) {\r\n var fullMatch = matches[0].trim();\r\n var id = matches[1].trim();\r\n var operation = matches[2].trim();\r\n let bValue = matches[3].trim().trim();\r\n var value = matches[3].trim().trim().replace('`', '').replace('`', '');\r\n\r\n finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', ${bValue == 'null' ? 'null' : `'${value}'`})`);\r\n }\r\n\r\n return eval(finalExpr);\r\n }\r\n\r\n /**\r\n * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore\r\n * Richiamata da EVAL\r\n * \r\n * @param {string} key Chiave del parametro di cui verificare il valore\r\n * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=\r\n * @param {string} value Valore di confronto da utilizzare\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n public checkValue(key: string, operator: string, value: string): boolean {\r\n var rPar = this.ParametersCache[key];\r\n try {\r\n switch (rPar.type) {\r\n case \"string\":\r\n case \"enum\":\r\n return eval(`\"${this.defaultIfnullOrUndefined(rPar.value, ``)}\" ${operator} \"${this.defaultIfnullOrUndefined(value, ``)}\"`);\r\n case \"boolean\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, ``).toString()} ${operator} ${this.defaultIfnullOrUndefined(value, ``)}`);\r\n case \"number\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, '\"\"', true).replace(',', '.')} ${operator} ${this.defaultIfnullOrUndefined(value, '\"\"', true).replace(',', '.')}`);\r\n case \"date\":\r\n let parDateConv = `this.dates.getDateConvertion(\"${rPar.value}\")`;\r\n let valDateConv = `this.dates.getDateConvertion(\"${value}\")`;\r\n\r\n switch (operator) {\r\n\r\n case \"==\": return eval(`${parDateConv} == ${valDateConv} || (${parDateConv} != null && ${parDateConv}.isSame(${valDateConv}))`);\r\n case \"!=\": return eval(`${parDateConv} != ${valDateConv} && ${parDateConv} != null && !${parDateConv}.isSame(${valDateConv})`);\r\n case \">\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isAfter(${valDateConv})`);\r\n case \"<\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isBefore(${valDateConv})`);\r\n case \">=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isAfter(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n case \"<=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isBefore(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n console.warn(\"Errori nella valutazione dell'espressione. Fallback a false\");\r\n return false;\r\n }\r\n\r\n throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;\r\n }\r\n\r\n /** @ignore */\r\n private defaultIfnullOrUndefined<T>(item: T, dflt: T, emptyStringIsNull: boolean = false): T {\r\n if (item == null || item == undefined || item.toString() == 'null' || (emptyStringIsNull && item.toString() == \"\"))\r\n return dflt;\r\n return item;\r\n }\r\n\r\n /** @ignore */\r\n public getSource(parameter: GenericParameter, search: string, byid: boolean): Observable<{ id: string, description: string }[]> {\r\n if (!this.AutoCompleteDataRetrieve) {\r\n console.error(\"@forms-and-validations: funzione di dataretrieve non impostata per un parametro autocomplete\");\r\n return of([])\r\n }\r\n else\r\n return this.AutoCompleteDataRetrieve(parameter, search, byid);\r\n }\r\n}","<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\">\r\n <ng-container *ngIf=\"par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\"> </span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n </ng-container>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FormsAndValidationsModule } from \"@esfaenza/forms-and-validations\";\r\nimport { LocalizationModule } from '@esfaenza/localizations';\r\nimport { EsParametersComponent } from './es_parameters.component';\r\n\r\n\r\n@NgModule({\r\n declarations: [EsParametersComponent],\r\n imports: [\r\n CommonModule,\r\n LocalizationModule,\r\n FormsModule,\r\n FormsAndValidationsModule,\r\n ],\r\n exports: [EsParametersComponent]\r\n})\r\nexport class EsParametersModule {\r\n }\r\n","/**\r\n * Classe che rappresenta un parametro generico\r\n */\r\nexport class GenericParameter {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Codice del parametro\r\n * @param {string} description Descrizione del parametro\r\n * @param {string} pattern Pattern di validazione\r\n * @param {'date' | 'string' | 'number' | 'boolean' | 'enum'} type Tipo di input \r\n * @param {boolean} required Indica se il valore è obbligatorio o meno\r\n * @param {any} v_default Valore di default per questo Parametro\r\n * @param {{ id: string, description: string }[]} enumvalues Qualora il **type** fosse di tipo **enum**, qui devono esserci tutti i valori che può assumere \r\n * @param {boolean} multienum Qualora il **type** fosse di tipo **enum**, indica se è possibile selezionare più valori (multiselect)\r\n * @param {string} sourceapi Nei casi in cui il **type** è **enum** indica l'api da cui recuperare i valori da bindare alla select o alla multiselect\r\n * @param {boolean} pageddata Nei casi in cui il **type** è **enum** indica che l'api specificata eventualmetne da **sourceapi** è paginata\r\n */\r\n constructor(\r\n public id: string,\r\n public description: string,\r\n public pattern: string,\r\n type: 'date' | 'string' | 'number' | 'boolean' | 'enum',\r\n public required: boolean,\r\n v_default: any = null,\r\n public enumvalues: { id: string, description: string }[] = [],\r\n public multienum?: boolean,\r\n public sourceapi?: string,\r\n public pageddata?: boolean) {\r\n\r\n this.type = type == 'enum' ? null : type;\r\n this.visible = true;\r\n this.enumtype = type == 'enum' ? type : \"\";\r\n this.isreadonly = false;\r\n\r\n if (!this.enumtype && enumvalues.length != 0)\r\n console.error(\"impossibile gestire valori di dizionario per un parametro non di tipo enum\");\r\n\r\n if (v_default != null)\r\n this.value = v_default;\r\n }\r\n\r\n /** Tipo di dato rappresentato da questo parametro */\r\n public type?: 'date' | 'string' | 'number' | 'boolean' | 'enum';\r\n\r\n /** Typecode lato C# che rappresenta il tipo di dato */\r\n public typecode: number;\r\n\r\n /** Indica se il campo specificato dev'essere di sola lettura o meno */\r\n public isreadonly: boolean;\r\n\r\n /** Valore del parametro */\r\n public value: any;\r\n\r\n /** Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto */\r\n public visible: boolean;\r\n\r\n /** Tipo Enum, valorizzato dal Backend */\r\n public enumtype: string;\r\n\r\n /** Tipo Dizionario, valorizzato dal Backend */\r\n public dicttype: string;\r\n\r\n /** Espressione di obbligatorietà */\r\n public requiredexp?: string;\r\n\r\n /** Espressione di visibilità */\r\n public visibleexp?: string;\r\n\r\n /** Ordinamento in base al quale verranno ordinati i parametri */\r\n public order: number;\r\n\r\n /** Gruppo di appartenenza del parametro */\r\n public group: string;\r\n}","/*\r\n * Public API Surface of parameters\r\n */\r\nexport * from './lib/es_parameters.module';\r\nexport * from './lib/models/GenericParameter';\r\nexport * from './lib/es_parameters.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"esfaenza-parameters.mjs","sources":["../../../projects/parameters/src/lib/es_parameters.component.loc.ts","../../../projects/parameters/src/lib/models/GenericParameterGroup.ts","../../../projects/parameters/src/lib/es_parameters.component.ts","../../../projects/parameters/src/lib/es_parameters.component.html","../../../projects/parameters/src/lib/es_parameters.module.ts","../../../projects/parameters/src/lib/models/GenericParameter.ts","../../../projects/parameters/src/public-api.ts","../../../projects/parameters/src/esfaenza-parameters.ts"],"sourcesContent":["import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/**\r\n * Classe di localizzazione per il componente **EsParametersComponent**\r\n */\r\n@Injectable()\r\nexport class EsParametersLoc extends LocalizationService {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(injector: Injector) {\r\n super(injector);\r\n }\r\n}","import { GenericParameter } from \"./GenericParameter\";\r\n\r\n/**\r\n * Classe che rappresenta un gruppo di parametri generico\r\n */\r\nexport class GenericParameterGroup {\r\n\r\n /**\r\n * Costruttore\r\n * @param {string} groupName Descrizione del gruppo che fa anche da id\r\n * @param {number} order ordine del gruppo\r\n */\r\n\r\n constructor(public groupName: string, public order: number) {\r\n this.parameters = [];\r\n this.subgroups = [];\r\n }\r\n\r\n /** Lista di Generic Parameters */\r\n public parameters: GenericParameter[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n public subgroups: GenericParameterGroup[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n // public : GenericParameterGroup[];\r\n\r\n}","// Angular\r\nimport { ControlValueAccessor, UntypedFormControl, NgControl, NgForm, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from \"@angular/forms\";\r\nimport { ChangeDetectorRef, Component, forwardRef, Injector, Input, ViewEncapsulation } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { DateService, UtilityService } from \"@esfaenza/extensions\";\r\n\r\n// Classi\r\nimport { GenericParameter } from './models/GenericParameter';\r\n\r\n// Applicazione\r\nimport { EsParametersLoc } from \"./es_parameters.component.loc\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { GenericParameterGroup } from \"./models/GenericParameterGroup\";\r\n\r\n/** Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico */\r\n@Component({\r\n selector: \"es-parameters\",\r\n providers: [\r\n { provide: LocalizationService, useClass: EsParametersLoc },\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n }\r\n ],\r\n styleUrls: [\"./es_parameters.component.scss\"],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: \"./es_parameters.component.html\"\r\n})\r\nexport class EsParametersComponent implements ControlValueAccessor {\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Parameters: GenericParameter[];\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Groups: GenericParameterGroup[];\r\n\r\n /** Cache per fare lookup rapidi in fase di valutazione espressioni di visibilità e obbligatorietà */\r\n private ParametersCache: { [id: string]: GenericParameter };\r\n\r\n /**\r\n * Pipeline di Angular \r\n * \r\n * @ignore\r\n */\r\n propagateChange = (_: any) => { };\r\n\r\n /** Indica che il parametro deve essere in modalità display */\r\n @Input() DisplayMode: boolean = false;\r\n\r\n /** Indica che l'ultimo parametro non deve avere margine in fondo */\r\n @Input() LastParameterNoMargin: boolean = false;\r\n\r\n /** col-md-X per la label */\r\n @Input() LabelColWidth: number = 4;\r\n\r\n /** col-md-X per l'input */\r\n @Input() InputColWidth: number = 8;\r\n\r\n /** Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente */\r\n @Input() submitted: boolean = false;\r\n\r\n /** Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare */\r\n @Input() EmptyMessage: string = \"\";\r\n\r\n /** Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label */\r\n @Input() Removal: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() Readonly: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() ListFormat: 'CommaSeparated' | 'Array' = 'Array';\r\n\r\n /** Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit */\r\n @Input() Form: NgForm = null;\r\n\r\n /** Quando utilizza un sottocomponente autocomplete abilita o disabilita il reset dell'input per ogni selezione */\r\n @Input() AutocompleteHideChoicesOnSelection: boolean = false;\r\n\r\n /** Funzione da utilizzare per tirare fuori i dati di un autocomplete */\r\n @Input() AutoCompleteDataRetrieve: (parameter: GenericParameter, search: string, byid: boolean) => Observable<{ id: string, description: string }[]>\r\n\r\n /** Permette di settare in una volta solo gli input **LabelColWidth** e **InputColWidth**, basta scriverlo con la sintassi \"X Y\" */\r\n @Input() set LabelInputRatio(input: string) {\r\n var ratio = input.split(/\\s/);\r\n this.LabelColWidth = parseInt(ratio[0]);\r\n this.InputColWidth = parseInt(ratio[1]);\r\n }\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(private utiExts: UtilityService, public lc: LocalizationService, public cdr: ChangeDetectorRef, private inj: Injector, public dates: DateService) { }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public writeValue(obj): void {\r\n this.Parameters = obj;\r\n\r\n this.ParametersCache = {};\r\n if (!this.Parameters)\r\n return;\r\n\r\n this.Parameters.forEach(t => {\r\n this.ParametersCache[t.id] = t;\r\n\r\n if (!t.typecode && !t.type)\r\n console.warn(\"Non è stato specificato né un type né un typecode\");\r\n\r\n if (t.typecode && !t.type)\r\n t.type = this.utiExts.getJsTypeFromTypeCode(t.typecode);\r\n\r\n if (t.typecode && t.type != this.utiExts.getJsTypeFromTypeCode(t.typecode))\r\n console.warn(`Rilevate inconsistenze fra il Tipo ${t.type} e il Tipo ${this.utiExts.getJsTypeFromTypeCode(t.typecode)} calcolato da TypeCode ${t.typecode} per il parametro ${t.id}`);\r\n\r\n if (t.type == \"boolean\")\r\n t.value = t.value?.toString()?.toLowerCase() === \"true\";\r\n\r\n if (t.enumtype || t.dicttype)\r\n t.type = 'enum';\r\n\r\n // Valore valido ma modalità di utilizzo a CommaSeparated, devo assicurarmi di riemettere la versione con la stringa\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n this.changed();\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && !Array.isArray(t.value))\r\n t.value = t.value ? t.value.split(',').map(t => t.trim()) : [];\r\n });\r\n\r\n this.reviewParametersBindings();\r\n this.generateGroups();\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i gruppi dei parametri\r\n */\r\n generateGroups() {\r\n this.Groups = [];\r\n\r\n if (this.Parameters?.length > 0) {\r\n this.Parameters.sort((a, b) => a.order < b.order ? -1 : 1);\r\n\r\n // Ciclo tutti i parametri\r\n for (let i = 0; this.Parameters.length > i; i++) {\r\n let par = this.Parameters[i];\r\n\r\n let parGroupName = par.group ?? \"\";\r\n let groupOrder = par.group ? par.order : -1;\r\n\r\n // Se il gruppo non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parGroupName, groupOrder));\r\n }\r\n\r\n // Inserisco il parametro dentro al suo gruppo\r\n this.Groups.find(g => g.groupName == parGroupName).parameters.push(par)\r\n }\r\n\r\n // Gestione sottogruppi\r\n let subgroups: GenericParameterGroup[] = this.Groups.filter(group => group.groupName.includes('§'));\r\n for (let _; subgroups.length > 0; () => { }) {\r\n // Recupero la lista di gruppi che hanno sottogruppi\r\n // Per convenzione, nel nome contengono \"§\"\r\n this.tryToAddSubgroups(subgroups);\r\n subgroups = this.Groups.filter(group => group.groupName.includes('§'));\r\n }\r\n\r\n this.Groups.sort((a, b) => a.order < b.order ? -1 : 1);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i sottogruppi dei parametri\r\n */\r\n tryToAddSubgroups(subgroups: GenericParameterGroup[]) {\r\n for (let i = 0; subgroups.length > i; i++) {\r\n let sub = subgroups[i];\r\n\r\n // Ottengo un lista con la gerarchia dei gruppi, in ordine\r\n let groupsParentHierarchy = sub.groupName.split('§') ?? [];\r\n\r\n // Recupero il gruppo padre\r\n let parentGroupName = sub.groupName.replace(`§${groupsParentHierarchy[groupsParentHierarchy.length - 1]}`, ``);\r\n\r\n // Se il gruppo padre non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupName == parentGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parentGroupName, sub.order));\r\n }\r\n\r\n // Rimuovo dal nome del gruppo l'informazione sul padre (Sistemando anche l'etichetta)\r\n // e lo aggiungo ai sottogruppi del padre\r\n sub.groupName = sub.groupName.replace(`${parentGroupName}§`, '');\r\n let parentGroup = this.Groups.find(x => x.groupName == parentGroupName);\r\n if (parentGroup?.subgroups.some(s => s.groupName == sub.groupName)) {\r\n let target = parentGroup.subgroups.find(f => f.groupName == sub.groupName);\r\n sub.parameters.map(p => target.parameters.push(p));\r\n sub.subgroups.map(s => target.subgroups.push(s));\r\n target.order = sub.order < target.order ? sub.order : target.order;\r\n } else {\r\n parentGroup?.subgroups.push(sub);\r\n }\r\n\r\n // Rimuovo il sottogruppo gruppo dalla lista\r\n this.Groups.splice(this.Groups.indexOf(sub), 1);\r\n }\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnChange(fn): void { this.propagateChange = fn; }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnTouched(fn): void { }\r\n\r\n /**\r\n * Metodo che si occupa di gestire il modello in uscita e propagarlo sul binding ngModel\r\n */\r\n public changed() {\r\n if (!this.Parameters)\r\n return;\r\n\r\n // Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri\r\n var changes = this.reviewParametersBindings();\r\n if (changes.length > 0) {\r\n\r\n // In base ai binding cambiati devo trovare tutti i parametri che han subito modifiche strutturali (visibilità, obbligatorietà)\r\n // distruggerli e ricrearli in modo che i binding lato html si aggiornino di conseguenza.\r\n // 1: Faccio una copia del parametro corrente\r\n // 2: Trovo la sua posizione all'interno dei gruppi e lo sostituisco con la copia\r\n // 3: Aggiorno la lista dei parametri e la sua cache in modo da puntare all'oggetto nuovo\r\n changes.forEach(ch => {\r\n let index = this.Parameters.findIndex(t => t.id == ch);\r\n let parameterCopy = this.utiExts.deepClone(this.Parameters[index]) as GenericParameter;\r\n\r\n let parameterRefFixed = false;\r\n for (let ig = 0; ig < this.Groups.length; ig++) {\r\n var g = this.Groups[ig];\r\n for (let ip = 0; ip < g.parameters.length; ip++) {\r\n var p = g.parameters[ip]\r\n if (p === this.Parameters[index]) {\r\n this.Groups[ig].parameters[ip] = parameterCopy;\r\n parameterRefFixed = true;\r\n break;\r\n }\r\n }\r\n if (parameterRefFixed)\r\n break;\r\n }\r\n \r\n this.Parameters[index] = parameterCopy\r\n this.ParametersCache[ch] = this.Parameters[index];\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n var ParametersClone = this.utiExts.deepClone(this.Parameters) as GenericParameter[];\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n ParametersClone?.forEach(t => {\r\n if (t.type == \"enum\" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = t.value.join(',');\r\n });\r\n\r\n this.propagateChange(ParametersClone);\r\n }\r\n\r\n /**\r\n * Rimuove il parametro selezionato e propaga il modello\r\n * \r\n * @param {GenericParameter} par Parametro da rimuovere\r\n */\r\n public removeParameter(par: GenericParameter) {\r\n this.Parameters.splice(this.Parameters.indexOf(par), 1);\r\n this.changed();\r\n }\r\n\r\n public GenerateParameterGroups() {\r\n let Groups: { id: string, groups: string[], order: number }[] = [];\r\n\r\n this.Parameters.forEach(param => {\r\n Groups.push({ id: param.id, groups: param.group.split(\"§\"), order: param.order });\r\n });\r\n\r\n let GroupedGroups = Groups.reduce((r, a) => {\r\n let firstGroupId = a.groups?.length > 0 ? a.groups[0] : \"\";\r\n r[firstGroupId] = [...r[firstGroupId] || [], a];\r\n return r;\r\n }, {});\r\n\r\n console.log(GroupedGroups);\r\n\r\n // Ciclo del risultato, aggiungendo i gruppi al modello\r\n // Per ogni gruppo che aggiungo, assegno i parametri in ordine\r\n }\r\n\r\n /**\r\n * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo\r\n * \r\n * @returns {string[]} lista con gli id dei parametri che sono stati modificati\r\n */\r\n private reviewParametersBindings(): string[] {\r\n let changes = [];\r\n for (let i = 0; i < this.Parameters.length; i++) {\r\n var p = this.Parameters[i];\r\n\r\n if (p.requiredexp) {\r\n let prevReq = p.required;\r\n p.required = this.evaluate(p.requiredexp);\r\n if (prevReq != p.required)\r\n changes.push(p.id);\r\n }\r\n if (p.visibleexp) {\r\n let prevVisi = p.visible;\r\n p.visible = this.evaluate(p.visibleexp);\r\n if (prevVisi != p.visible)\r\n changes.push(p.id)\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Valuta un'espressione in base ai parametri presenti nel modello attuale\r\n * \r\n * @param expr Espressione da valutare scritta nel formato (ripetibile) \"ID (==|!=|<|>|>=|<=) (`valore` | null | true | false | XXX,XXX)\" separato eventualmente da && ed ||\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n private evaluate(expr: string): boolean {\r\n var regex = /\\s?([a-zA-Z0-9_-]+)\\s?(!=|==|<|>|<=|>=)\\s?(`[^`]+`|``|null|[0-9,]+|true|false)/gm;\r\n\r\n var matches: string[] = [];\r\n var finalExpr = expr;\r\n while (matches = regex.exec(expr)) {\r\n var fullMatch = matches[0].trim();\r\n var id = matches[1].trim();\r\n var operation = matches[2].trim();\r\n let bValue = matches[3].trim().trim();\r\n var value = matches[3].trim().trim().replace('`', '').replace('`', '');\r\n\r\n finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', ${bValue == 'null' ? 'null' : `'${value}'`})`);\r\n }\r\n\r\n return eval(finalExpr);\r\n }\r\n\r\n /**\r\n * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore\r\n * Richiamata da EVAL\r\n * \r\n * @param {string} key Chiave del parametro di cui verificare il valore\r\n * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=\r\n * @param {string} value Valore di confronto da utilizzare\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n public checkValue(key: string, operator: string, value: string): boolean {\r\n var rPar = this.ParametersCache[key];\r\n try {\r\n switch (rPar.type) {\r\n case \"string\":\r\n case \"enum\":\r\n return eval(`\"${this.defaultIfnullOrUndefined(rPar.value, ``)}\" ${operator} \"${this.defaultIfnullOrUndefined(value, ``)}\"`);\r\n case \"boolean\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, ``).toString()} ${operator} ${this.defaultIfnullOrUndefined(value, ``)}`);\r\n case \"number\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, '\"\"', true).replace(',', '.')} ${operator} ${this.defaultIfnullOrUndefined(value, '\"\"', true).replace(',', '.')}`);\r\n case \"date\":\r\n let parDateConv = `this.dates.getDateConvertion(\"${rPar.value}\")`;\r\n let valDateConv = `this.dates.getDateConvertion(\"${value}\")`;\r\n\r\n switch (operator) {\r\n\r\n case \"==\": return eval(`${parDateConv} == ${valDateConv} || (${parDateConv} != null && ${parDateConv}.isSame(${valDateConv}))`);\r\n case \"!=\": return eval(`${parDateConv} != ${valDateConv} && ${parDateConv} != null && !${parDateConv}.isSame(${valDateConv})`);\r\n case \">\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isAfter(${valDateConv})`);\r\n case \"<\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isBefore(${valDateConv})`);\r\n case \">=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isAfter(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n case \"<=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isBefore(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n console.warn(\"Errori nella valutazione dell'espressione. Fallback a false\");\r\n return false;\r\n }\r\n\r\n throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;\r\n }\r\n\r\n /** @ignore */\r\n private defaultIfnullOrUndefined<T>(item: T, dflt: T, emptyStringIsNull: boolean = false): T {\r\n if (item == null || item == undefined || item.toString() == 'null' || (emptyStringIsNull && item.toString() == \"\"))\r\n return dflt;\r\n return item;\r\n }\r\n\r\n /** @ignore */\r\n public getSource(parameter: GenericParameter, search: string, byid: boolean): Observable<{ id: string, description: string }[]> {\r\n if (!this.AutoCompleteDataRetrieve) {\r\n console.error(\"@forms-and-validations: funzione di dataretrieve non impostata per un parametro autocomplete\");\r\n return of([])\r\n }\r\n else\r\n return this.AutoCompleteDataRetrieve(parameter, search, byid);\r\n }\r\n}","<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\">\r\n <ng-container *ngIf=\"par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\"> </span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseCommaSeparatedList]=\"true\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [Placeholder]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n </ng-container>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FormsAndValidationsModule } from \"@esfaenza/forms-and-validations\";\r\nimport { LocalizationModule } from '@esfaenza/localizations';\r\nimport { EsParametersComponent } from './es_parameters.component';\r\n\r\n\r\n@NgModule({\r\n declarations: [EsParametersComponent],\r\n imports: [\r\n CommonModule,\r\n LocalizationModule,\r\n FormsModule,\r\n FormsAndValidationsModule,\r\n ],\r\n exports: [EsParametersComponent]\r\n})\r\nexport class EsParametersModule {\r\n }\r\n","/**\r\n * Classe che rappresenta un parametro generico\r\n */\r\nexport class GenericParameter {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Codice del parametro\r\n * @param {string} description Descrizione del parametro\r\n * @param {string} pattern Pattern di validazione\r\n * @param {'date' | 'string' | 'number' | 'boolean' | 'enum'} type Tipo di input \r\n * @param {boolean} required Indica se il valore è obbligatorio o meno\r\n * @param {any} v_default Valore di default per questo Parametro\r\n * @param {{ id: string, description: string }[]} enumvalues Qualora il **type** fosse di tipo **enum**, qui devono esserci tutti i valori che può assumere \r\n * @param {boolean} multienum Qualora il **type** fosse di tipo **enum**, indica se è possibile selezionare più valori (multiselect)\r\n * @param {string} sourceapi Nei casi in cui il **type** è **enum** indica l'api da cui recuperare i valori da bindare alla select o alla multiselect\r\n * @param {boolean} pageddata Nei casi in cui il **type** è **enum** indica che l'api specificata eventualmetne da **sourceapi** è paginata\r\n */\r\n constructor(\r\n public id: string,\r\n public description: string,\r\n public pattern: string,\r\n type: 'date' | 'string' | 'number' | 'boolean' | 'enum',\r\n public required: boolean,\r\n v_default: any = null,\r\n public enumvalues: { id: string, description: string }[] = [],\r\n public multienum?: boolean,\r\n public sourceapi?: string,\r\n public pageddata?: boolean) {\r\n\r\n this.type = type == 'enum' ? null : type;\r\n this.visible = true;\r\n this.enumtype = type == 'enum' ? type : \"\";\r\n this.isreadonly = false;\r\n\r\n if (!this.enumtype && enumvalues.length != 0)\r\n console.error(\"impossibile gestire valori di dizionario per un parametro non di tipo enum\");\r\n\r\n if (v_default != null)\r\n this.value = v_default;\r\n }\r\n\r\n /** Tipo di dato rappresentato da questo parametro */\r\n public type?: 'date' | 'string' | 'number' | 'boolean' | 'enum';\r\n\r\n /** Typecode lato C# che rappresenta il tipo di dato */\r\n public typecode: number;\r\n\r\n /** Indica se il campo specificato dev'essere di sola lettura o meno */\r\n public isreadonly: boolean;\r\n\r\n /** Valore del parametro */\r\n public value: any;\r\n\r\n /** Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto */\r\n public visible: boolean;\r\n\r\n /** Tipo Enum, valorizzato dal Backend */\r\n public enumtype: string;\r\n\r\n /** Tipo Dizionario, valorizzato dal Backend */\r\n public dicttype: string;\r\n\r\n /** Espressione di obbligatorietà */\r\n public requiredexp?: string;\r\n\r\n /** Espressione di visibilità */\r\n public visibleexp?: string;\r\n\r\n /** Ordinamento in base al quale verranno ordinati i parametri */\r\n public order: number;\r\n\r\n /** Gruppo di appartenenza del parametro */\r\n public group: string;\r\n}","/*\r\n * Public API Surface of parameters\r\n */\r\nexport * from './lib/es_parameters.module';\r\nexport * from './lib/models/GenericParameter';\r\nexport * from './lib/es_parameters.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|