@fovestta2/web-angular 1.0.1 → 1.0.4
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.
- package/esm2022/lib/add-update-form/add-update-form.component.mjs +1044 -0
- package/esm2022/lib/fv-controls.module.mjs +16 -4
- package/esm2022/lib/fv-dropdown/fv-dropdown.component.mjs +116 -17
- package/esm2022/lib/fv-entry-field/fv-entry-field.component.mjs +29 -3
- package/esm2022/lib/fv-esi-field/fv-esi-field.component.mjs +63 -0
- package/esm2022/lib/fv-iban-field/fv-iban-field.component.mjs +63 -0
- package/esm2022/lib/fv-ifsc-field/fv-ifsc-field.component.mjs +63 -0
- package/esm2022/lib/fv-micr-field/fv-micr-field.component.mjs +63 -0
- package/esm2022/lib/fv-name-code/fv-name-code.component.mjs +273 -0
- package/esm2022/lib/fv-pf-field/fv-pf-field.component.mjs +63 -0
- package/esm2022/lib/fv-phone-field/fv-phone-field.component.mjs +105 -0
- package/esm2022/lib/fv-radio-group/fv-radio-group.component.mjs +3 -3
- package/esm2022/lib/fv-uan-field/fv-uan-field.component.mjs +65 -0
- package/esm2022/lib/query-form/query-form.component.mjs +569 -0
- package/esm2022/public-api.mjs +15 -5
- package/fesm2022/fovestta2-web-angular.mjs +2492 -88
- package/fesm2022/fovestta2-web-angular.mjs.map +1 -1
- package/lib/add-update-form/add-update-form.component.d.ts +102 -0
- package/lib/fv-controls.module.d.ts +3 -1
- package/lib/fv-dropdown/fv-dropdown.component.d.ts +14 -2
- package/lib/fv-entry-field/fv-entry-field.component.d.ts +4 -1
- package/lib/fv-esi-field/fv-esi-field.component.d.ts +21 -0
- package/lib/fv-iban-field/fv-iban-field.component.d.ts +21 -0
- package/lib/fv-ifsc-field/fv-ifsc-field.component.d.ts +21 -0
- package/lib/fv-micr-field/fv-micr-field.component.d.ts +21 -0
- package/lib/fv-name-code/fv-name-code.component.d.ts +41 -0
- package/lib/fv-pf-field/fv-pf-field.component.d.ts +21 -0
- package/lib/fv-phone-field/fv-phone-field.component.d.ts +25 -0
- package/lib/fv-uan-field/fv-uan-field.component.d.ts +21 -0
- package/lib/query-form/query-form.component.d.ts +53 -0
- package/package.json +2 -2
- package/public-api.d.ts +14 -4
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, HostListener, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ReactiveFormsModule, FormControl, Validators, } from '@angular/forms';
|
|
4
|
+
// Import Fovestta Components
|
|
5
|
+
import { FvEntryFieldComponent } from '../fv-entry-field/fv-entry-field.component';
|
|
6
|
+
import { FvDropdownComponent } from '../fv-dropdown/fv-dropdown.component';
|
|
7
|
+
import { FvNumberFieldComponent } from '../fv-number-field/fv-number-field.component';
|
|
8
|
+
import { FvDateFieldComponent } from '../fv-date-field/fv-date-field.component';
|
|
9
|
+
import { FvMonthYearFieldComponent } from '../fv-month-year-field/fv-month-year-field.component';
|
|
10
|
+
import { FvFileSelectorComponent } from '../fv-file-selector/fv-file-selector.component';
|
|
11
|
+
import { FvNameCodeComponent } from '../fv-name-code/fv-name-code.component';
|
|
12
|
+
import { FvPhoneFieldComponent } from '../fv-phone-field/fv-phone-field.component';
|
|
13
|
+
import { FvUanFieldComponent } from '../fv-uan-field/fv-uan-field.component';
|
|
14
|
+
import { FvPfFieldComponent } from '../fv-pf-field/fv-pf-field.component';
|
|
15
|
+
import { FvEsiFieldComponent } from '../fv-esi-field/fv-esi-field.component';
|
|
16
|
+
import { FvIfscFieldComponent } from '../fv-ifsc-field/fv-ifsc-field.component';
|
|
17
|
+
import { FvMicrFieldComponent } from '../fv-micr-field/fv-micr-field.component';
|
|
18
|
+
import { FvIbanFieldComponent } from '../fv-iban-field/fv-iban-field.component';
|
|
19
|
+
import * as i0 from "@angular/core";
|
|
20
|
+
import * as i1 from "@angular/forms";
|
|
21
|
+
import * as i2 from "@angular/common";
|
|
22
|
+
export class QueryFormComponent {
|
|
23
|
+
fb;
|
|
24
|
+
config;
|
|
25
|
+
onSubmit = new EventEmitter();
|
|
26
|
+
onExport = new EventEmitter();
|
|
27
|
+
onBack = new EventEmitter();
|
|
28
|
+
form;
|
|
29
|
+
showExportMenu = false;
|
|
30
|
+
showValidationError = false;
|
|
31
|
+
subs = [];
|
|
32
|
+
constructor(fb) {
|
|
33
|
+
this.fb = fb;
|
|
34
|
+
}
|
|
35
|
+
ngOnInit() {
|
|
36
|
+
const group = {};
|
|
37
|
+
if (this.config && this.config.rows) {
|
|
38
|
+
this.config.rows.forEach((row) => {
|
|
39
|
+
row.columns.forEach((col) => {
|
|
40
|
+
const validators = [];
|
|
41
|
+
if (col.required) {
|
|
42
|
+
validators.push(Validators.required);
|
|
43
|
+
}
|
|
44
|
+
group[col.key] = new FormControl({ value: '', disabled: col.readonly || false }, validators);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
this.form = this.fb.group(group);
|
|
49
|
+
// Subscribe to value changes to trigger onChange callbacks
|
|
50
|
+
this.subs.push(this.form.valueChanges.subscribe((value) => {
|
|
51
|
+
this.config.rows.forEach((row) => {
|
|
52
|
+
row.columns.forEach((col) => {
|
|
53
|
+
if (col.onChange) {
|
|
54
|
+
// Verify if this specific control changed?
|
|
55
|
+
// For simplicity, we can pass value[col.key] but strictly we should check diff.
|
|
56
|
+
// However, simple approach:
|
|
57
|
+
// This runs on every change, might be noisy but acceptable for now.
|
|
58
|
+
// A better approach would be subscribing to individual controls if performance matters.
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}));
|
|
63
|
+
// Subscribe individually to support onChange
|
|
64
|
+
this.config.rows.forEach((row) => {
|
|
65
|
+
row.columns.forEach((col) => {
|
|
66
|
+
if (col.onChange) {
|
|
67
|
+
const control = this.form.get(col.key);
|
|
68
|
+
if (control) {
|
|
69
|
+
this.subs.push(control.valueChanges.subscribe(val => {
|
|
70
|
+
col.onChange(val);
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
ngOnDestroy() {
|
|
78
|
+
this.subs.forEach((s) => s.unsubscribe());
|
|
79
|
+
}
|
|
80
|
+
getControl(key) {
|
|
81
|
+
return this.form.get(key);
|
|
82
|
+
}
|
|
83
|
+
getSchema(column) {
|
|
84
|
+
// Generate a simple schema based on column definition
|
|
85
|
+
const rules = [];
|
|
86
|
+
const errorPriority = [];
|
|
87
|
+
if (column.required) {
|
|
88
|
+
rules.push({ name: 'required', params: { enabled: true }, errorKey: 'ERR_REQUIRED' });
|
|
89
|
+
errorPriority.push('required');
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
controlType: this.mapType(column.type),
|
|
93
|
+
rules: rules,
|
|
94
|
+
errorPriority: errorPriority
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
mapType(type) {
|
|
98
|
+
switch (type) {
|
|
99
|
+
case 'text': return 'EntryField';
|
|
100
|
+
case 'number': return 'NumberField';
|
|
101
|
+
case 'date': return 'DateField';
|
|
102
|
+
case 'dropdown': return 'Dropdown';
|
|
103
|
+
case 'month': return 'MonthYearField';
|
|
104
|
+
case 'file': return 'FileSelector';
|
|
105
|
+
case 'name-code': return 'Dropdown';
|
|
106
|
+
case 'phone': return 'PhoneField';
|
|
107
|
+
case 'uan': return 'UanField';
|
|
108
|
+
case 'pf': return 'PfField';
|
|
109
|
+
case 'esi': return 'EsiField';
|
|
110
|
+
case 'ifsc': return 'IfscField';
|
|
111
|
+
case 'micr': return 'MicrField';
|
|
112
|
+
case 'iban': return 'IbanField';
|
|
113
|
+
default: return 'EntryField';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
mapSearchOptions(options) {
|
|
117
|
+
return options.map(opt => ({
|
|
118
|
+
code: opt.code || opt.value,
|
|
119
|
+
name: opt.name || opt.label || opt.value,
|
|
120
|
+
value: opt.value
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
triggerFileUpload(columnKey) {
|
|
124
|
+
// FvFileSelector handles this internally, but if we needed external trigger...
|
|
125
|
+
}
|
|
126
|
+
toggleExportMenu(event) {
|
|
127
|
+
event.stopPropagation();
|
|
128
|
+
this.showExportMenu = !this.showExportMenu;
|
|
129
|
+
}
|
|
130
|
+
clickOutside(event) {
|
|
131
|
+
if (this.showExportMenu) {
|
|
132
|
+
this.showExportMenu = false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exportToFormat(format) {
|
|
136
|
+
this.onExport.emit(format);
|
|
137
|
+
this.showExportMenu = false;
|
|
138
|
+
}
|
|
139
|
+
onButtonClick() {
|
|
140
|
+
if (this.form.valid) {
|
|
141
|
+
this.showValidationError = false;
|
|
142
|
+
this.onSubmit.emit(this.form.value);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
this.showValidationError = true;
|
|
146
|
+
this.form.markAllAsTouched();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
onBackClick() {
|
|
150
|
+
this.onBack.emit();
|
|
151
|
+
}
|
|
152
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: QueryFormComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
153
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: QueryFormComponent, isStandalone: true, selector: "lib-query-form", inputs: { config: "config" }, outputs: { onSubmit: "onSubmit", onExport: "onExport", onBack: "onBack" }, host: { listeners: { "document:click": "clickOutside($event)" } }, ngImport: i0, template: `
|
|
154
|
+
<div class="query-form-container">
|
|
155
|
+
<div class="d-flex cont">
|
|
156
|
+
<h2 class="form-title">{{ config.title }}</h2>
|
|
157
|
+
|
|
158
|
+
<div
|
|
159
|
+
class="export-buttons"
|
|
160
|
+
*ngIf="
|
|
161
|
+
config.showExportButton &&
|
|
162
|
+
config.exportFormats &&
|
|
163
|
+
config.exportFormats.length > 0
|
|
164
|
+
"
|
|
165
|
+
>
|
|
166
|
+
<div class="export-menu-container">
|
|
167
|
+
<button
|
|
168
|
+
type="button"
|
|
169
|
+
class="export-btn menu-trigger"
|
|
170
|
+
(click)="toggleExportMenu($event)"
|
|
171
|
+
title="Toggle export options"
|
|
172
|
+
>
|
|
173
|
+
<i class="material-icons">file_download</i>
|
|
174
|
+
<i class="material-icons arrow">arrow_drop_down</i>
|
|
175
|
+
</button>
|
|
176
|
+
<div class="export-menu" *ngIf="showExportMenu">
|
|
177
|
+
<button
|
|
178
|
+
type="button"
|
|
179
|
+
*ngFor="let format of config.exportFormats"
|
|
180
|
+
class="menu-item"
|
|
181
|
+
(click)="exportToFormat(format)"
|
|
182
|
+
[attr.title]="'Export as ' + format.toUpperCase()"
|
|
183
|
+
>
|
|
184
|
+
Export as {{ format.toUpperCase() }}
|
|
185
|
+
</button>
|
|
186
|
+
</div>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
</div>
|
|
190
|
+
|
|
191
|
+
<!-- Validation Error Message -->
|
|
192
|
+
<div *ngIf="showValidationError" class="validation-message">
|
|
193
|
+
<i class="material-icons">error</i>
|
|
194
|
+
Please fill all required fields
|
|
195
|
+
</div>
|
|
196
|
+
|
|
197
|
+
<div class="form-content">
|
|
198
|
+
<form [formGroup]="form">
|
|
199
|
+
<div
|
|
200
|
+
*ngFor="let row of config.rows; let rowIndex = index"
|
|
201
|
+
class="form-row"
|
|
202
|
+
>
|
|
203
|
+
<div *ngFor="let column of row.columns" class="form-field">
|
|
204
|
+
|
|
205
|
+
<!-- Dropdown -->
|
|
206
|
+
<ng-container *ngIf="column.type === 'dropdown'">
|
|
207
|
+
<fv-dropdown
|
|
208
|
+
[label]="column.label"
|
|
209
|
+
[placeholder]="column.placeholder || 'Select option'"
|
|
210
|
+
[options]="column.options || []"
|
|
211
|
+
[control]="getControl(column.key)"
|
|
212
|
+
[schema]="getSchema(column)"
|
|
213
|
+
[disabled]="column.readonly || false"
|
|
214
|
+
>
|
|
215
|
+
</fv-dropdown>
|
|
216
|
+
</ng-container>
|
|
217
|
+
|
|
218
|
+
<!-- Text Input -->
|
|
219
|
+
<ng-container *ngIf="column.type === 'text'">
|
|
220
|
+
<fv-entry-field
|
|
221
|
+
[label]="column.label"
|
|
222
|
+
[placeholder]="column.placeholder || ''"
|
|
223
|
+
type="text"
|
|
224
|
+
[control]="getControl(column.key)"
|
|
225
|
+
[schema]="getSchema(column)"
|
|
226
|
+
[disabled]="column.readonly || false"
|
|
227
|
+
>
|
|
228
|
+
</fv-entry-field>
|
|
229
|
+
</ng-container>
|
|
230
|
+
|
|
231
|
+
<!-- Number Input -->
|
|
232
|
+
<ng-container *ngIf="column.type === 'number'">
|
|
233
|
+
<fv-number-field
|
|
234
|
+
[label]="column.label"
|
|
235
|
+
[placeholder]="column.placeholder || ''"
|
|
236
|
+
[control]="getControl(column.key)"
|
|
237
|
+
[schema]="getSchema(column)"
|
|
238
|
+
[disabled]="column.readonly || false"
|
|
239
|
+
>
|
|
240
|
+
</fv-number-field>
|
|
241
|
+
</ng-container>
|
|
242
|
+
|
|
243
|
+
<!-- Date Input -->
|
|
244
|
+
<ng-container *ngIf="column.type === 'date'">
|
|
245
|
+
<fv-date-field
|
|
246
|
+
[label]="column.label"
|
|
247
|
+
[control]="getControl(column.key)"
|
|
248
|
+
[schema]="getSchema(column)"
|
|
249
|
+
[disabled]="column.readonly || false"
|
|
250
|
+
>
|
|
251
|
+
</fv-date-field>
|
|
252
|
+
</ng-container>
|
|
253
|
+
|
|
254
|
+
<!-- Month/Year Input -->
|
|
255
|
+
<ng-container *ngIf="column.type === 'month'">
|
|
256
|
+
<fv-month-year-field
|
|
257
|
+
[label]="column.label"
|
|
258
|
+
[control]="getControl(column.key)"
|
|
259
|
+
[schema]="getSchema(column)"
|
|
260
|
+
[disabled]="column.readonly || false"
|
|
261
|
+
>
|
|
262
|
+
</fv-month-year-field>
|
|
263
|
+
</ng-container>
|
|
264
|
+
|
|
265
|
+
<!-- File Upload -->
|
|
266
|
+
<ng-container *ngIf="column.type === 'file'">
|
|
267
|
+
<fv-file-selector
|
|
268
|
+
[label]="column.label"
|
|
269
|
+
[placeholder]="column.placeholder || 'Select file'"
|
|
270
|
+
[accept]="column.accept || '*/*'"
|
|
271
|
+
[control]="getControl(column.key)"
|
|
272
|
+
[schema]="getSchema(column)"
|
|
273
|
+
[disabled]="column.readonly || false"
|
|
274
|
+
>
|
|
275
|
+
</fv-file-selector>
|
|
276
|
+
</ng-container>
|
|
277
|
+
|
|
278
|
+
<!-- Name Code Field -->
|
|
279
|
+
<ng-container *ngIf="column.type === 'name-code'">
|
|
280
|
+
<fv-name-code
|
|
281
|
+
[label]="column.label"
|
|
282
|
+
[placeholder]="column.placeholder || 'Search by Code or Name'"
|
|
283
|
+
[options]="mapSearchOptions(column.options || [])"
|
|
284
|
+
[control]="getControl(column.key)"
|
|
285
|
+
[schema]="getSchema(column)"
|
|
286
|
+
[disabled]="column.readonly || false"
|
|
287
|
+
>
|
|
288
|
+
</fv-name-code>
|
|
289
|
+
</ng-container>
|
|
290
|
+
|
|
291
|
+
<ng-container *ngIf="column.type === 'phone'">
|
|
292
|
+
<fv-phone-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-phone-field>
|
|
293
|
+
</ng-container>
|
|
294
|
+
|
|
295
|
+
<ng-container *ngIf="column.type === 'uan'">
|
|
296
|
+
<fv-uan-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-uan-field>
|
|
297
|
+
</ng-container>
|
|
298
|
+
|
|
299
|
+
<ng-container *ngIf="column.type === 'pf'">
|
|
300
|
+
<fv-pf-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-pf-field>
|
|
301
|
+
</ng-container>
|
|
302
|
+
|
|
303
|
+
<ng-container *ngIf="column.type === 'esi'">
|
|
304
|
+
<fv-esi-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-esi-field>
|
|
305
|
+
</ng-container>
|
|
306
|
+
|
|
307
|
+
<ng-container *ngIf="column.type === 'ifsc'">
|
|
308
|
+
<fv-ifsc-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-ifsc-field>
|
|
309
|
+
</ng-container>
|
|
310
|
+
|
|
311
|
+
<ng-container *ngIf="column.type === 'micr'">
|
|
312
|
+
<fv-micr-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-micr-field>
|
|
313
|
+
</ng-container>
|
|
314
|
+
|
|
315
|
+
<ng-container *ngIf="column.type === 'iban'">
|
|
316
|
+
<fv-iban-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-iban-field>
|
|
317
|
+
</ng-container>
|
|
318
|
+
</div>
|
|
319
|
+
</div>
|
|
320
|
+
|
|
321
|
+
<!-- Buttons Row -->
|
|
322
|
+
<div class="button-row">
|
|
323
|
+
<button
|
|
324
|
+
type="button"
|
|
325
|
+
class="view-button"
|
|
326
|
+
(click)="onButtonClick()"
|
|
327
|
+
[attr.title]="config.buttonText || 'View'"
|
|
328
|
+
>
|
|
329
|
+
{{ config.buttonText || 'View' }}
|
|
330
|
+
</button>
|
|
331
|
+
<button
|
|
332
|
+
*ngIf="config.showBackButton"
|
|
333
|
+
type="button"
|
|
334
|
+
class="back-button"
|
|
335
|
+
(click)="onBackClick()"
|
|
336
|
+
[attr.title]="config.backButtonText || 'Back'"
|
|
337
|
+
>
|
|
338
|
+
{{ config.backButtonText || 'Back' }}
|
|
339
|
+
</button>
|
|
340
|
+
</div>
|
|
341
|
+
</form>
|
|
342
|
+
</div>
|
|
343
|
+
</div>
|
|
344
|
+
`, isInline: true, styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";*{font-family:Poppins}.material-icons{font-family:Material Icons!important;font-size:22px;display:inline-block}.cont{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.validation-message{background-color:#fee;color:#c33;padding:12px 16px;border-radius:8px;margin:10px 0;display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500;border:1px solid #fcc}.export-buttons{display:flex;gap:10px}.export-btn{cursor:pointer;display:flex;align-items:center;gap:5px;transition:all .3s ease;border:none;padding:8px 16px;border-radius:7px;background:#006aff;color:#fff}.export-btn:hover{background:#0045a6;box-shadow:0 4px 8px #00000026}.export-menu-container{position:relative;border-radius:7px}.export-menu{position:absolute;top:100%;right:0;background:#fff;border-radius:4px;box-shadow:0 4px 12px #00000026;margin-top:5px;min-width:180px;z-index:1000}.menu-item{width:100%;color:#000;text-align:left;background:#fff;border:none;cursor:pointer;font-size:14px;transition:background .2s;padding:12px 16px;display:flex;align-items:center;gap:10px}.menu-item:hover{background:#f5f5f5}.query-form-container{background:#f2f2f2;border-radius:8px;padding:10px;margin:auto;box-shadow:0 2px 5px #0000001a;margin-bottom:1rem;overflow:visible}.form-title{font-size:20px;font-weight:700;color:#303030;margin:0;font-family:Poppins}.form-content{display:flex;flex-direction:column;gap:5px;background-color:#fff;padding:10px;border:.5px solid #cfcfcf;border-radius:12px;overflow:visible}.form-row{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));justify-content:flex-start;gap:20px;align-items:end;margin-bottom:15px;overflow:visible}.form-field{display:flex;flex-direction:column;width:100%;position:relative;overflow:visible}.view-button{padding:8px 15px;background:#006aff;color:#fff;border:none;border-radius:7px;font-size:14px;font-weight:600;cursor:pointer;transition:background-color .2s}.view-button:hover{background:#0045a6}.button-row{display:flex;justify-content:space-between;gap:10px;padding-top:5px;margin-top:10px;border-top:1px solid #eee}.back-button{padding:8px 15px;background-color:#303030;color:#fff;border:none;border-radius:7px;font-size:14px;font-weight:600;cursor:pointer;transition:background-color .2s}.back-button:hover{background-color:#000}@media (max-width: 768px){.form-row{grid-template-columns:1fr}.button-row{justify-content:center}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FvEntryFieldComponent, selector: "fv-entry-field", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "type", "allowAlphabetsOnly", "maxLength"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvDropdownComponent, selector: "fv-dropdown", inputs: ["label", "placeholder", "options", "schema", "control", "disabled"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvNumberFieldComponent, selector: "fv-number-field", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "min", "max", "step"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvDateFieldComponent, selector: "fv-date-field", inputs: ["label", "schema", "control", "disabled", "readonly", "min", "max"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvMonthYearFieldComponent, selector: "fv-month-year-field", inputs: ["label", "schema", "control", "disabled", "readonly", "min", "max"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvFileSelectorComponent, selector: "fv-file-selector", inputs: ["label", "placeholder", "schema", "control", "disabled", "accept", "maxSize"], outputs: ["valueChange", "blur"] }, { kind: "component", type: FvNameCodeComponent, selector: "fv-name-code", inputs: ["label", "placeholder", "options", "schema", "control", "disabled"], outputs: ["selectionChange"] }, { kind: "component", type: FvPhoneFieldComponent, selector: "fv-phone-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvUanFieldComponent, selector: "fv-uan-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvPfFieldComponent, selector: "fv-pf-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvEsiFieldComponent, selector: "fv-esi-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvIfscFieldComponent, selector: "fv-ifsc-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvMicrFieldComponent, selector: "fv-micr-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvIbanFieldComponent, selector: "fv-iban-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }] });
|
|
345
|
+
}
|
|
346
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: QueryFormComponent, decorators: [{
|
|
347
|
+
type: Component,
|
|
348
|
+
args: [{ selector: 'lib-query-form', standalone: true, imports: [
|
|
349
|
+
CommonModule,
|
|
350
|
+
ReactiveFormsModule,
|
|
351
|
+
FvEntryFieldComponent,
|
|
352
|
+
FvDropdownComponent,
|
|
353
|
+
FvNumberFieldComponent,
|
|
354
|
+
FvDateFieldComponent,
|
|
355
|
+
FvMonthYearFieldComponent,
|
|
356
|
+
FvFileSelectorComponent,
|
|
357
|
+
FvNameCodeComponent,
|
|
358
|
+
FvPhoneFieldComponent,
|
|
359
|
+
FvUanFieldComponent,
|
|
360
|
+
FvPfFieldComponent,
|
|
361
|
+
FvEsiFieldComponent,
|
|
362
|
+
FvIfscFieldComponent,
|
|
363
|
+
FvMicrFieldComponent,
|
|
364
|
+
FvIbanFieldComponent,
|
|
365
|
+
], template: `
|
|
366
|
+
<div class="query-form-container">
|
|
367
|
+
<div class="d-flex cont">
|
|
368
|
+
<h2 class="form-title">{{ config.title }}</h2>
|
|
369
|
+
|
|
370
|
+
<div
|
|
371
|
+
class="export-buttons"
|
|
372
|
+
*ngIf="
|
|
373
|
+
config.showExportButton &&
|
|
374
|
+
config.exportFormats &&
|
|
375
|
+
config.exportFormats.length > 0
|
|
376
|
+
"
|
|
377
|
+
>
|
|
378
|
+
<div class="export-menu-container">
|
|
379
|
+
<button
|
|
380
|
+
type="button"
|
|
381
|
+
class="export-btn menu-trigger"
|
|
382
|
+
(click)="toggleExportMenu($event)"
|
|
383
|
+
title="Toggle export options"
|
|
384
|
+
>
|
|
385
|
+
<i class="material-icons">file_download</i>
|
|
386
|
+
<i class="material-icons arrow">arrow_drop_down</i>
|
|
387
|
+
</button>
|
|
388
|
+
<div class="export-menu" *ngIf="showExportMenu">
|
|
389
|
+
<button
|
|
390
|
+
type="button"
|
|
391
|
+
*ngFor="let format of config.exportFormats"
|
|
392
|
+
class="menu-item"
|
|
393
|
+
(click)="exportToFormat(format)"
|
|
394
|
+
[attr.title]="'Export as ' + format.toUpperCase()"
|
|
395
|
+
>
|
|
396
|
+
Export as {{ format.toUpperCase() }}
|
|
397
|
+
</button>
|
|
398
|
+
</div>
|
|
399
|
+
</div>
|
|
400
|
+
</div>
|
|
401
|
+
</div>
|
|
402
|
+
|
|
403
|
+
<!-- Validation Error Message -->
|
|
404
|
+
<div *ngIf="showValidationError" class="validation-message">
|
|
405
|
+
<i class="material-icons">error</i>
|
|
406
|
+
Please fill all required fields
|
|
407
|
+
</div>
|
|
408
|
+
|
|
409
|
+
<div class="form-content">
|
|
410
|
+
<form [formGroup]="form">
|
|
411
|
+
<div
|
|
412
|
+
*ngFor="let row of config.rows; let rowIndex = index"
|
|
413
|
+
class="form-row"
|
|
414
|
+
>
|
|
415
|
+
<div *ngFor="let column of row.columns" class="form-field">
|
|
416
|
+
|
|
417
|
+
<!-- Dropdown -->
|
|
418
|
+
<ng-container *ngIf="column.type === 'dropdown'">
|
|
419
|
+
<fv-dropdown
|
|
420
|
+
[label]="column.label"
|
|
421
|
+
[placeholder]="column.placeholder || 'Select option'"
|
|
422
|
+
[options]="column.options || []"
|
|
423
|
+
[control]="getControl(column.key)"
|
|
424
|
+
[schema]="getSchema(column)"
|
|
425
|
+
[disabled]="column.readonly || false"
|
|
426
|
+
>
|
|
427
|
+
</fv-dropdown>
|
|
428
|
+
</ng-container>
|
|
429
|
+
|
|
430
|
+
<!-- Text Input -->
|
|
431
|
+
<ng-container *ngIf="column.type === 'text'">
|
|
432
|
+
<fv-entry-field
|
|
433
|
+
[label]="column.label"
|
|
434
|
+
[placeholder]="column.placeholder || ''"
|
|
435
|
+
type="text"
|
|
436
|
+
[control]="getControl(column.key)"
|
|
437
|
+
[schema]="getSchema(column)"
|
|
438
|
+
[disabled]="column.readonly || false"
|
|
439
|
+
>
|
|
440
|
+
</fv-entry-field>
|
|
441
|
+
</ng-container>
|
|
442
|
+
|
|
443
|
+
<!-- Number Input -->
|
|
444
|
+
<ng-container *ngIf="column.type === 'number'">
|
|
445
|
+
<fv-number-field
|
|
446
|
+
[label]="column.label"
|
|
447
|
+
[placeholder]="column.placeholder || ''"
|
|
448
|
+
[control]="getControl(column.key)"
|
|
449
|
+
[schema]="getSchema(column)"
|
|
450
|
+
[disabled]="column.readonly || false"
|
|
451
|
+
>
|
|
452
|
+
</fv-number-field>
|
|
453
|
+
</ng-container>
|
|
454
|
+
|
|
455
|
+
<!-- Date Input -->
|
|
456
|
+
<ng-container *ngIf="column.type === 'date'">
|
|
457
|
+
<fv-date-field
|
|
458
|
+
[label]="column.label"
|
|
459
|
+
[control]="getControl(column.key)"
|
|
460
|
+
[schema]="getSchema(column)"
|
|
461
|
+
[disabled]="column.readonly || false"
|
|
462
|
+
>
|
|
463
|
+
</fv-date-field>
|
|
464
|
+
</ng-container>
|
|
465
|
+
|
|
466
|
+
<!-- Month/Year Input -->
|
|
467
|
+
<ng-container *ngIf="column.type === 'month'">
|
|
468
|
+
<fv-month-year-field
|
|
469
|
+
[label]="column.label"
|
|
470
|
+
[control]="getControl(column.key)"
|
|
471
|
+
[schema]="getSchema(column)"
|
|
472
|
+
[disabled]="column.readonly || false"
|
|
473
|
+
>
|
|
474
|
+
</fv-month-year-field>
|
|
475
|
+
</ng-container>
|
|
476
|
+
|
|
477
|
+
<!-- File Upload -->
|
|
478
|
+
<ng-container *ngIf="column.type === 'file'">
|
|
479
|
+
<fv-file-selector
|
|
480
|
+
[label]="column.label"
|
|
481
|
+
[placeholder]="column.placeholder || 'Select file'"
|
|
482
|
+
[accept]="column.accept || '*/*'"
|
|
483
|
+
[control]="getControl(column.key)"
|
|
484
|
+
[schema]="getSchema(column)"
|
|
485
|
+
[disabled]="column.readonly || false"
|
|
486
|
+
>
|
|
487
|
+
</fv-file-selector>
|
|
488
|
+
</ng-container>
|
|
489
|
+
|
|
490
|
+
<!-- Name Code Field -->
|
|
491
|
+
<ng-container *ngIf="column.type === 'name-code'">
|
|
492
|
+
<fv-name-code
|
|
493
|
+
[label]="column.label"
|
|
494
|
+
[placeholder]="column.placeholder || 'Search by Code or Name'"
|
|
495
|
+
[options]="mapSearchOptions(column.options || [])"
|
|
496
|
+
[control]="getControl(column.key)"
|
|
497
|
+
[schema]="getSchema(column)"
|
|
498
|
+
[disabled]="column.readonly || false"
|
|
499
|
+
>
|
|
500
|
+
</fv-name-code>
|
|
501
|
+
</ng-container>
|
|
502
|
+
|
|
503
|
+
<ng-container *ngIf="column.type === 'phone'">
|
|
504
|
+
<fv-phone-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-phone-field>
|
|
505
|
+
</ng-container>
|
|
506
|
+
|
|
507
|
+
<ng-container *ngIf="column.type === 'uan'">
|
|
508
|
+
<fv-uan-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-uan-field>
|
|
509
|
+
</ng-container>
|
|
510
|
+
|
|
511
|
+
<ng-container *ngIf="column.type === 'pf'">
|
|
512
|
+
<fv-pf-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-pf-field>
|
|
513
|
+
</ng-container>
|
|
514
|
+
|
|
515
|
+
<ng-container *ngIf="column.type === 'esi'">
|
|
516
|
+
<fv-esi-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-esi-field>
|
|
517
|
+
</ng-container>
|
|
518
|
+
|
|
519
|
+
<ng-container *ngIf="column.type === 'ifsc'">
|
|
520
|
+
<fv-ifsc-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-ifsc-field>
|
|
521
|
+
</ng-container>
|
|
522
|
+
|
|
523
|
+
<ng-container *ngIf="column.type === 'micr'">
|
|
524
|
+
<fv-micr-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-micr-field>
|
|
525
|
+
</ng-container>
|
|
526
|
+
|
|
527
|
+
<ng-container *ngIf="column.type === 'iban'">
|
|
528
|
+
<fv-iban-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-iban-field>
|
|
529
|
+
</ng-container>
|
|
530
|
+
</div>
|
|
531
|
+
</div>
|
|
532
|
+
|
|
533
|
+
<!-- Buttons Row -->
|
|
534
|
+
<div class="button-row">
|
|
535
|
+
<button
|
|
536
|
+
type="button"
|
|
537
|
+
class="view-button"
|
|
538
|
+
(click)="onButtonClick()"
|
|
539
|
+
[attr.title]="config.buttonText || 'View'"
|
|
540
|
+
>
|
|
541
|
+
{{ config.buttonText || 'View' }}
|
|
542
|
+
</button>
|
|
543
|
+
<button
|
|
544
|
+
*ngIf="config.showBackButton"
|
|
545
|
+
type="button"
|
|
546
|
+
class="back-button"
|
|
547
|
+
(click)="onBackClick()"
|
|
548
|
+
[attr.title]="config.backButtonText || 'Back'"
|
|
549
|
+
>
|
|
550
|
+
{{ config.backButtonText || 'Back' }}
|
|
551
|
+
</button>
|
|
552
|
+
</div>
|
|
553
|
+
</form>
|
|
554
|
+
</div>
|
|
555
|
+
</div>
|
|
556
|
+
`, styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";*{font-family:Poppins}.material-icons{font-family:Material Icons!important;font-size:22px;display:inline-block}.cont{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.validation-message{background-color:#fee;color:#c33;padding:12px 16px;border-radius:8px;margin:10px 0;display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500;border:1px solid #fcc}.export-buttons{display:flex;gap:10px}.export-btn{cursor:pointer;display:flex;align-items:center;gap:5px;transition:all .3s ease;border:none;padding:8px 16px;border-radius:7px;background:#006aff;color:#fff}.export-btn:hover{background:#0045a6;box-shadow:0 4px 8px #00000026}.export-menu-container{position:relative;border-radius:7px}.export-menu{position:absolute;top:100%;right:0;background:#fff;border-radius:4px;box-shadow:0 4px 12px #00000026;margin-top:5px;min-width:180px;z-index:1000}.menu-item{width:100%;color:#000;text-align:left;background:#fff;border:none;cursor:pointer;font-size:14px;transition:background .2s;padding:12px 16px;display:flex;align-items:center;gap:10px}.menu-item:hover{background:#f5f5f5}.query-form-container{background:#f2f2f2;border-radius:8px;padding:10px;margin:auto;box-shadow:0 2px 5px #0000001a;margin-bottom:1rem;overflow:visible}.form-title{font-size:20px;font-weight:700;color:#303030;margin:0;font-family:Poppins}.form-content{display:flex;flex-direction:column;gap:5px;background-color:#fff;padding:10px;border:.5px solid #cfcfcf;border-radius:12px;overflow:visible}.form-row{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));justify-content:flex-start;gap:20px;align-items:end;margin-bottom:15px;overflow:visible}.form-field{display:flex;flex-direction:column;width:100%;position:relative;overflow:visible}.view-button{padding:8px 15px;background:#006aff;color:#fff;border:none;border-radius:7px;font-size:14px;font-weight:600;cursor:pointer;transition:background-color .2s}.view-button:hover{background:#0045a6}.button-row{display:flex;justify-content:space-between;gap:10px;padding-top:5px;margin-top:10px;border-top:1px solid #eee}.back-button{padding:8px 15px;background-color:#303030;color:#fff;border:none;border-radius:7px;font-size:14px;font-weight:600;cursor:pointer;transition:background-color .2s}.back-button:hover{background-color:#000}@media (max-width: 768px){.form-row{grid-template-columns:1fr}.button-row{justify-content:center}}\n"] }]
|
|
557
|
+
}], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { config: [{
|
|
558
|
+
type: Input
|
|
559
|
+
}], onSubmit: [{
|
|
560
|
+
type: Output
|
|
561
|
+
}], onExport: [{
|
|
562
|
+
type: Output
|
|
563
|
+
}], onBack: [{
|
|
564
|
+
type: Output
|
|
565
|
+
}], clickOutside: [{
|
|
566
|
+
type: HostListener,
|
|
567
|
+
args: ['document:click', ['$event']]
|
|
568
|
+
}] } });
|
|
569
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mdi1jb250cm9scy9zcmMvbGliL3F1ZXJ5LWZvcm0vcXVlcnktZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxtQkFBbUIsRUFHbkIsV0FBVyxFQUNYLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBSXhCLDZCQUE2QjtBQUM3QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVB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ICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIE9uSW5pdCxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvblNjaGVtYSB9IGZyb20gJ0Bmb3Zlc3R0YTIvdmFsaWRhdGlvbi1lbmdpbmUnO1xyXG5cclxuLy8gSW1wb3J0IEZvdmVzdHRhIENvbXBvbmVudHNcclxuaW1wb3J0IHsgRnZFbnRyeUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtZW50cnktZmllbGQvZnYtZW50cnktZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWRyb3Bkb3duL2Z2LWRyb3Bkb3duLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2TnVtYmVyRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1udW1iZXItZmllbGQvZnYtbnVtYmVyLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2RGF0ZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtZGF0ZS1maWVsZC9mdi1kYXRlLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2TW9udGhZZWFyRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1tb250aC15ZWFyLWZpZWxkL2Z2LW1vbnRoLXllYXItZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZGaWxlU2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi9mdi1maWxlLXNlbGVjdG9yL2Z2LWZpbGUtc2VsZWN0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZOYW1lQ29kZUNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LW5hbWUtY29kZS9mdi1uYW1lLWNvZGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZQaG9uZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtcGhvbmUtZmllbGQvZnYtcGhvbmUtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZVYW5GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LXVhbi1maWVsZC9mdi11YW4tZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZQZkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtcGYtZmllbGQvZnYtcGYtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZFc2lGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWVzaS1maWVsZC9mdi1lc2ktZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZJZnNjRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1pZnNjLWZpZWxkL2Z2LWlmc2MtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZNaWNyRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1taWNyLWZpZWxkL2Z2LW1pY3ItZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZJYmFuRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1pYmFuLWZpZWxkL2Z2LWliYW4tZmllbGQuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlGb3JtQ29sdW1uIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIHR5cGU6ICdkcm9wZG93bicgfCAndGV4dCcgfCAnbnVtYmVyJyB8ICdkYXRlJyB8ICdtb250aCcgfCAnZmlsZScgfCAnbmFtZS1jb2RlJyB8ICdwaG9uZScgfCAndWFuJyB8ICdwZicgfCAnZXNpJyB8ICdpZnNjJyB8ICdtaWNyJyB8ICdpYmFuJztcclxuICBvcHRpb25zPzogYW55W107XHJcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XHJcbiAgb25DaGFuZ2U/OiAodmFsdWU6IGFueSkgPT4gdm9pZDtcclxuICBhY2NlcHQ/OiBzdHJpbmc7XHJcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xyXG4gIHJlYWRvbmx5PzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUZvcm1Sb3cge1xyXG4gIGNvbHVtbnM6IFF1ZXJ5Rm9ybUNvbHVtbltdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Rm9ybUNvbmZpZyB7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICByb3dzOiBRdWVyeUZvcm1Sb3dbXTtcclxuICBidXR0b25UZXh0Pzogc3RyaW5nO1xyXG4gIHNob3dFeHBvcnRCdXR0b24/OiBib29sZWFuO1xyXG4gIGV4cG9ydEZvcm1hdHM/OiBzdHJpbmdbXTtcclxuICBzaG93QmFja0J1dHRvbj86IGJvb2xlYW47XHJcbiAgYmFja0J1dHRvblRleHQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXF1ZXJ5LWZvcm0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIEZ2RW50cnlGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2RHJvcGRvd25Db21wb25lbnQsXHJcbiAgICBGdk51bWJlckZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZEYXRlRmllbGRDb21wb25lbnQsXHJcbiAgICBGdk1vbnRoWWVhckZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZGaWxlU2VsZWN0b3JDb21wb25lbnQsXHJcbiAgICBGdk5hbWVDb2RlQ29tcG9uZW50LFxyXG4gICAgRnZQaG9uZUZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZVYW5GaWVsZENvbXBvbmVudCxcclxuICAgIEZ2UGZGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2RXNpRmllbGRDb21wb25lbnQsXHJcbiAgICBGdklmc2NGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2TWljckZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZJYmFuRmllbGRDb21wb25lbnQsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cInF1ZXJ5LWZvcm0tY29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY29udFwiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cImZvcm0tdGl0bGVcIj57eyBjb25maWcudGl0bGUgfX08L2gyPlxyXG5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImV4cG9ydC1idXR0b25zXCJcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIGNvbmZpZy5zaG93RXhwb3J0QnV0dG9uICYmXHJcbiAgICAgICAgICAgIGNvbmZpZy5leHBvcnRGb3JtYXRzICYmXHJcbiAgICAgICAgICAgIGNvbmZpZy5leHBvcnRGb3JtYXRzLmxlbmd0aCA+IDBcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImV4cG9ydC1tZW51LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJleHBvcnQtYnRuIG1lbnUtdHJpZ2dlclwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cG9ydE1lbnUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgdGl0bGU9XCJUb2dnbGUgZXhwb3J0IG9wdGlvbnNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPmZpbGVfZG93bmxvYWQ8L2k+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBhcnJvd1wiPmFycm93X2Ryb3BfZG93bjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleHBvcnQtbWVudVwiICpuZ0lmPVwic2hvd0V4cG9ydE1lbnVcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmb3JtYXQgb2YgY29uZmlnLmV4cG9ydEZvcm1hdHNcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtZW51LWl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFRvRm9ybWF0KGZvcm1hdClcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiJ0V4cG9ydCBhcyAnICsgZm9ybWF0LnRvVXBwZXJDYXNlKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIEV4cG9ydCBhcyB7eyBmb3JtYXQudG9VcHBlckNhc2UoKSB9fVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgXHJcbiAgICAgIDwhLS0gVmFsaWRhdGlvbiBFcnJvciBNZXNzYWdlIC0tPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd1ZhbGlkYXRpb25FcnJvclwiIGNsYXNzPVwidmFsaWRhdGlvbi1tZXNzYWdlXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPmVycm9yPC9pPlxyXG4gICAgICAgIFBsZWFzZSBmaWxsIGFsbCByZXF1aXJlZCBmaWVsZHNcclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250ZW50XCI+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2YgY29uZmlnLnJvd3M7IGxldCByb3dJbmRleCA9IGluZGV4XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLXJvd1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiByb3cuY29sdW1uc1wiIGNsYXNzPVwiZm9ybS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdkcm9wZG93bidcIj5cclxuICAgICAgICAgICAgICAgIDxmdi1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IG9wdGlvbidcIlxyXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2x1bW4ub3B0aW9ucyB8fCBbXVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLmtleSlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8L2Z2LWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRleHQgSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAndGV4dCdcIj5cclxuICAgICAgICAgICAgICAgIDxmdi1lbnRyeS1maWVsZFxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ua2V5KVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLnJlYWRvbmx5IHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwvZnYtZW50cnktZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gTnVtYmVyIElucHV0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICAgIDxmdi1udW1iZXItZmllbGRcclxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb2x1bW4ucGxhY2Vob2xkZXIgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5rZXkpXCJcclxuICAgICAgICAgICAgICAgICAgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9mdi1udW1iZXItZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gRGF0ZSBJbnB1dCAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGZ2LWRhdGUtZmllbGRcclxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLmtleSlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8L2Z2LWRhdGUtZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gTW9udGgvWWVhciBJbnB1dCAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdtb250aCdcIj5cclxuICAgICAgICAgICAgICAgIDxmdi1tb250aC15ZWFyLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5rZXkpXCJcclxuICAgICAgICAgICAgICAgICAgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9mdi1tb250aC15ZWFyLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEZpbGUgVXBsb2FkIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2ZpbGUnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZnYtZmlsZS1zZWxlY3RvclxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IGZpbGUnXCJcclxuICAgICAgICAgICAgICAgICAgW2FjY2VwdF09XCJjb2x1bW4uYWNjZXB0IHx8ICcqLyonXCJcclxuICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ua2V5KVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLnJlYWRvbmx5IHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwvZnYtZmlsZS1zZWxlY3Rvcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBOYW1lIENvZGUgRmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnbmFtZS1jb2RlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGZ2LW5hbWUtY29kZVxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VhcmNoIGJ5IENvZGUgb3IgTmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJtYXBTZWFyY2hPcHRpb25zKGNvbHVtbi5vcHRpb25zIHx8IFtdKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLmtleSlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8L2Z2LW5hbWUtY29kZT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdwaG9uZSdcIj5cclxuICAgICAgICAgICAgICAgICAgPGZ2LXBob25lLWZpZWxkIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5rZXkpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHkgfHwgZmFsc2VcIj48L2Z2LXBob25lLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAndWFuJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtdWFuLWZpZWxkIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5rZXkpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHkgfHwgZmFsc2VcIj48L2Z2LXVhbi1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ3BmJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtcGYtZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLmtleSlcIiBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCIgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seSB8fCBmYWxzZVwiPjwvZnYtcGYtZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdlc2knXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1lc2ktZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLmtleSlcIiBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCIgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seSB8fCBmYWxzZVwiPjwvZnYtZXNpLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnaWZzYydcIj5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWlmc2MtZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLmtleSlcIiBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCIgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seSB8fCBmYWxzZVwiPjwvZnYtaWZzYy1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ21pY3InXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1taWNyLWZpZWxkIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5rZXkpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHkgfHwgZmFsc2VcIj48L2Z2LW1pY3ItZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdpYmFuJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtaWJhbi1maWVsZCBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ua2V5KVwiIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIiBbZGlzYWJsZWRdPVwiY29sdW1uLnJlYWRvbmx5IHx8IGZhbHNlXCI+PC9mdi1pYmFuLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBCdXR0b25zIFJvdyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tcm93XCI+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInZpZXctYnV0dG9uXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwib25CdXR0b25DbGljaygpXCJcclxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJjb25maWcuYnV0dG9uVGV4dCB8fCAnVmlldydcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgY29uZmlnLmJ1dHRvblRleHQgfHwgJ1ZpZXcnIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb25maWcuc2hvd0JhY2tCdXR0b25cIlxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYmFjay1idXR0b25cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkJhY2tDbGljaygpXCJcclxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJjb25maWcuYmFja0J1dHRvblRleHQgfHwgJ0JhY2snXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGNvbmZpZy5iYWNrQnV0dG9uVGV4dCB8fCAnQmFjaycgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtcclxuICAgIGBcclxuICAgICAgQGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9UG9wcGluczp3Z2h0QDMwMDs0MDA7NTAwOzYwMDs3MDAmZGlzcGxheT1zd2FwJyk7XHJcbiAgICAgIEBpbXBvcnQgdXJsKCdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2ljb24/ZmFtaWx5PU1hdGVyaWFsK0ljb25zJyk7XHJcblxyXG4gICAgICAqIHtcclxuICAgICAgICBmb250LWZhbWlseTogUG9wcGlucztcclxuICAgICAgfVxyXG5cclxuICAgICAgLm1hdGVyaWFsLWljb25zIHtcclxuICAgICAgICBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJyAhaW1wb3J0YW50O1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMjJweDtcclxuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5jb250IHtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC52YWxpZGF0aW9uLW1lc3NhZ2Uge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWU7XHJcbiAgICAgICAgY29sb3I6ICNjMzM7XHJcbiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICAgICAgICBtYXJnaW46IDEwcHggMDtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgICAgZ2FwOiA4cHg7XHJcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZjYztcclxuICAgICAgfVxyXG5cclxuICAgICAgLmV4cG9ydC1idXR0b25zIHtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGdhcDogMTBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmV4cG9ydC1idG4ge1xyXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgICAgZ2FwOiA1cHg7XHJcbiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcclxuICAgICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4O1xyXG4gICAgICAgIGJhY2tncm91bmQ6ICMwMDZhZmY7XHJcbiAgICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAuZXhwb3J0LWJ0bjpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZDogIzAwNDVhNjtcclxuICAgICAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmV4cG9ydC1tZW51LWNvbnRhaW5lciB7XHJcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDdweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmV4cG9ydC1tZW51IHtcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgdG9wOiAxMDAlO1xyXG4gICAgICAgIHJpZ2h0OiAwO1xyXG4gICAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XHJcbiAgICAgICAgbWFyZ2luLXRvcDogNXB4O1xyXG4gICAgICAgIG1pbi13aWR0aDogMTgwcHg7XHJcbiAgICAgICAgei1pbmRleDogMTAwMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLm1lbnUtaXRlbSB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgY29sb3I6IGJsYWNrO1xyXG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzO1xyXG4gICAgICAgIHBhZGRpbmc6IDEycHggMTZweDtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgICAgZ2FwOiAxMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAubWVudS1pdGVtOmhvdmVyIHtcclxuICAgICAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAucXVlcnktZm9ybS1jb250YWluZXIge1xyXG4gICAgICAgIGJhY2tncm91bmQ6ICNmMmYyZjI7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICAgICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcclxuICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmZvcm0tdGl0bGUge1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgICAgICBmb250LXdlaWdodDogNzAwO1xyXG4gICAgICAgIGNvbG9yOiAjMzAzMDMwO1xyXG4gICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgICBmb250LWZhbWlseTogUG9wcGlucztcclxuICAgICAgfVxyXG5cclxuICAgICAgLmZvcm0tY29udGVudCB7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICAgIGdhcDogNXB4O1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XHJcbiAgICAgICAgcGFkZGluZzogMTBweDtcclxuICAgICAgICBib3JkZXI6IDAuNXB4IHNvbGlkICNjZmNmY2Y7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcclxuICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmZvcm0tcm93IHtcclxuICAgICAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDIwMHB4LCAxZnIpKTtcclxuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbiAgICAgICAgZ2FwOiAyMHB4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBlbmQ7XHJcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDtcclxuICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmZvcm0tZmllbGQge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC52aWV3LWJ1dHRvbiB7XHJcbiAgICAgICAgcGFkZGluZzogOHB4IDE1cHg7XHJcbiAgICAgICAgYmFja2dyb3VuZDogIzAwNmFmZjtcclxuICAgICAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4O1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgICAgICBmb250LXdlaWdodDogNjAwO1xyXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC52aWV3LWJ1dHRvbjpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZDogIzAwNDVhNjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmJ1dHRvbi1yb3cge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgICAgIGdhcDogMTBweDtcclxuICAgICAgICBwYWRkaW5nLXRvcDogNXB4O1xyXG4gICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XHJcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5iYWNrLWJ1dHRvbiB7XHJcbiAgICAgICAgcGFkZGluZzogOHB4IDE1cHg7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzMwMzAzMDtcclxuICAgICAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4O1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgICAgICBmb250LXdlaWdodDogNjAwO1xyXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5iYWNrLWJ1dHRvbjpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XHJcbiAgICAgICAgLmZvcm0tcm93IHtcclxuICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xyXG4gICAgICAgIH1cclxuICAgICAgICAuYnV0dG9uLXJvdyB7XHJcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIGAsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFF1ZXJ5Rm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBjb25maWchOiBRdWVyeUZvcm1Db25maWc7XHJcbiAgQE91dHB1dCgpIG9uU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uRXhwb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIG9uQmFjayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgZm9ybSE6IEZvcm1Hcm91cDtcclxuICBzaG93RXhwb3J0TWVudSA9IGZhbHNlO1xyXG4gIHNob3dWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTtcclxuICBwcml2YXRlIHN1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBjb25zdCBncm91cDogYW55ID0ge307XHJcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcucm93cykge1xyXG4gICAgICB0aGlzLmNvbmZpZy5yb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgIHJvdy5jb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdmFsaWRhdG9yczogYW55W10gPSBbXTtcclxuICAgICAgICAgIGlmIChjb2wucmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZ3JvdXBbY29sLmtleV0gPSBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgIHsgdmFsdWU6ICcnLCBkaXNhYmxlZDogY29sLnJlYWRvbmx5IHx8IGZhbHNlIH0sXHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cChncm91cCk7XHJcblxyXG4gICAgLy8gU3Vic2NyaWJlIHRvIHZhbHVlIGNoYW5nZXMgdG8gdHJpZ2dlciBvbkNoYW5nZSBjYWxsYmFja3NcclxuICAgIHRoaXMuc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLmNvbmZpZy5yb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgICAgcm93LmNvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2wub25DaGFuZ2UpIHtcclxuICAgICAgICAgICAgICAvLyBWZXJpZnkgaWYgdGhpcyBzcGVjaWZpYyBjb250cm9sIGNoYW5nZWQ/IFxyXG4gICAgICAgICAgICAgIC8vIEZvciBzaW1wbGljaXR5LCB3ZSBjYW4gcGFzcyB2YWx1ZVtjb2wua2V5XSBidXQgc3RyaWN0bHkgd2Ugc2hvdWxkIGNoZWNrIGRpZmYuXHJcbiAgICAgICAgICAgICAgLy8gSG93ZXZlciwgc2ltcGxlIGFwcHJvYWNoOlxyXG4gICAgICAgICAgICAgIC8vIFRoaXMgcnVucyBvbiBldmVyeSBjaGFuZ2UsIG1pZ2h0IGJlIG5vaXN5IGJ1dCBhY2NlcHRhYmxlIGZvciBub3cuXHJcbiAgICAgICAgICAgICAgLy8gQSBiZXR0ZXIgYXBwcm9hY2ggd291bGQgYmUgc3Vic2NyaWJpbmcgdG8gaW5kaXZpZHVhbCBjb250cm9scyBpZiBwZXJmb3JtYW5jZSBtYXR0ZXJzLlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gU3Vic2NyaWJlIGluZGl2aWR1YWxseSB0byBzdXBwb3J0IG9uQ2hhbmdlXHJcbiAgICB0aGlzLmNvbmZpZy5yb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICByb3cuY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcclxuICAgICAgICBpZiAoY29sLm9uQ2hhbmdlKSB7XHJcbiAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChjb2wua2V5KTtcclxuICAgICAgICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vicy5wdXNoKGNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbC5vbkNoYW5nZSEodmFsKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuc3Vicy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29udHJvbChrZXk6IHN0cmluZyk6IEZvcm1Db250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KGtleSkgYXMgRm9ybUNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICBnZXRTY2hlbWEoY29sdW1uOiBRdWVyeUZvcm1Db2x1bW4pOiBWYWxpZGF0aW9uU2NoZW1hIHtcclxuICAgIC8vIEdlbmVyYXRlIGEgc2ltcGxlIHNjaGVtYSBiYXNlZCBvbiBjb2x1bW4gZGVmaW5pdGlvblxyXG4gICAgY29uc3QgcnVsZXMgPSBbXTtcclxuICAgIGNvbnN0IGVycm9yUHJpb3JpdHkgPSBbXTtcclxuXHJcbiAgICBpZiAoY29sdW1uLnJlcXVpcmVkKSB7XHJcbiAgICAgIHJ1bGVzLnB1c2goeyBuYW1lOiAncmVxdWlyZWQnLCBwYXJhbXM6IHsgZW5hYmxlZDogdHJ1ZSB9LCBlcnJvcktleTogJ0VSUl9SRVFVSVJFRCcgfSk7XHJcbiAgICAgIGVycm9yUHJpb3JpdHkucHVzaCgncmVxdWlyZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjb250cm9sVHlwZTogdGhpcy5tYXBUeXBlKGNvbHVtbi50eXBlKSxcclxuICAgICAgcnVsZXM6IHJ1bGVzLFxyXG4gICAgICBlcnJvclByaW9yaXR5OiBlcnJvclByaW9yaXR5XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgbWFwVHlwZSh0eXBlOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ3RleHQnOiByZXR1cm4gJ0VudHJ5RmllbGQnO1xyXG4gICAgICBjYXNlICdudW1iZXInOiByZXR1cm4gJ051bWJlckZpZWxkJztcclxuICAgICAgY2FzZSAnZGF0ZSc6IHJldHVybiAnRGF0ZUZpZWxkJztcclxuICAgICAgY2FzZSAnZHJvcGRvd24nOiByZXR1cm4gJ0Ryb3Bkb3duJztcclxuICAgICAgY2FzZSAnbW9udGgnOiByZXR1cm4gJ01vbnRoWWVhckZpZWxkJztcclxuICAgICAgY2FzZSAnZmlsZSc6IHJldHVybiAnRmlsZVNlbGVjdG9yJztcclxuICAgICAgY2FzZSAnbmFtZS1jb2RlJzogcmV0dXJuICdEcm9wZG93bic7XHJcbiAgICAgIGNhc2UgJ3Bob25lJzogcmV0dXJuICdQaG9uZUZpZWxkJztcclxuICAgICAgY2FzZSAndWFuJzogcmV0dXJuICdVYW5GaWVsZCc7XHJcbiAgICAgIGNhc2UgJ3BmJzogcmV0dXJuICdQZkZpZWxkJztcclxuICAgICAgY2FzZSAnZXNpJzogcmV0dXJuICdFc2lGaWVsZCc7XHJcbiAgICAgIGNhc2UgJ2lmc2MnOiByZXR1cm4gJ0lmc2NGaWVsZCc7XHJcbiAgICAgIGNhc2UgJ21pY3InOiByZXR1cm4gJ01pY3JGaWVsZCc7XHJcbiAgICAgIGNhc2UgJ2liYW4nOiByZXR1cm4gJ0liYW5GaWVsZCc7XHJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnRW50cnlGaWVsZCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtYXBTZWFyY2hPcHRpb25zKG9wdGlvbnM6IGFueVtdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdCA9PiAoe1xyXG4gICAgICBjb2RlOiBvcHQuY29kZSB8fCBvcHQudmFsdWUsXHJcbiAgICAgIG5hbWU6IG9wdC5uYW1lIHx8IG9wdC5sYWJlbCB8fCBvcHQudmFsdWUsXHJcbiAgICAgIHZhbHVlOiBvcHQudmFsdWVcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHRyaWdnZXJGaWxlVXBsb2FkKGNvbHVtbktleTogc3RyaW5nKSB7XHJcbiAgICAvLyBGdkZpbGVTZWxlY3RvciBoYW5kbGVzIHRoaXMgaW50ZXJuYWxseSwgYnV0IGlmIHdlIG5lZWRlZCBleHRlcm5hbCB0cmlnZ2VyLi4uXHJcbiAgfVxyXG5cclxuICB0b2dnbGVFeHBvcnRNZW51KGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnNob3dFeHBvcnRNZW51ID0gIXRoaXMuc2hvd0V4cG9ydE1lbnU7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgY2xpY2tPdXRzaWRlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnNob3dFeHBvcnRNZW51KSB7XHJcbiAgICAgIHRoaXMuc2hvd0V4cG9ydE1lbnUgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydFRvRm9ybWF0KGZvcm1hdDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLm9uRXhwb3J0LmVtaXQoZm9ybWF0KTtcclxuICAgIHRoaXMuc2hvd0V4cG9ydE1lbnUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uQnV0dG9uQ2xpY2soKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm9uU3VibWl0LmVtaXQodGhpcy5mb3JtLnZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvciA9IHRydWU7XHJcbiAgICAgIHRoaXMuZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkJhY2tDbGljaygpIHtcclxuICAgIHRoaXMub25CYWNrLmVtaXQoKTtcclxuICB9XHJcbn1cclxuIl19
|