ngx-st-tables 17.0.64 → 17.0.65
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/components/material-table/material-table-caption/material-table-caption.component.mjs +11 -4
- package/esm2022/lib/components/material-table/material-table-caption/material-table-filter-dialog/material-table-filter-dialog.component.mjs +80 -65
- package/esm2022/lib/components/material-table/material-table-caption/material-table-filter-dialog/material-table-filter.component.mjs +302 -0
- package/esm2022/lib/components/material-table/material-table.component.mjs +41 -8
- package/esm2022/lib/constants/default-translations.mjs +6 -2
- package/esm2022/lib/models/models.mjs +2 -0
- package/esm2022/lib/models/st-tables-translations.model.mjs +1 -1
- package/esm2022/lib/ngx-st-tables.module.mjs +5 -2
- package/fesm2022/ngx-st-tables.mjs +436 -78
- package/fesm2022/ngx-st-tables.mjs.map +1 -1
- package/lib/components/material-table/material-table-caption/material-table-caption.component.d.ts +1 -12
- package/lib/components/material-table/material-table-caption/material-table-filter-dialog/material-table-filter-dialog.component.d.ts +11 -12
- package/lib/components/material-table/material-table-caption/material-table-filter-dialog/material-table-filter.component.d.ts +27 -0
- package/lib/components/material-table/material-table.component.d.ts +1 -1
- package/lib/models/models.d.ts +14 -0
- package/lib/models/st-tables-translations.model.d.ts +5 -1
- package/lib/ngx-st-tables.module.d.ts +28 -27
- package/package.json +1 -1
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, output, } from '@angular/core';
|
|
2
|
+
import { StSubscribeDestroyComponent } from 'ngx-st-base-functions';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../../../services/st-tables-translations.service";
|
|
5
|
+
import * as i2 from "@angular/forms";
|
|
6
|
+
import * as i3 from "@angular/material/form-field";
|
|
7
|
+
import * as i4 from "@angular/material/input";
|
|
8
|
+
import * as i5 from "@angular/material/select";
|
|
9
|
+
import * as i6 from "@angular/material/core";
|
|
10
|
+
import * as i7 from "@angular/material/datepicker";
|
|
11
|
+
export class MaterialTableFilterComponent extends StSubscribeDestroyComponent {
|
|
12
|
+
constructor(stTableTranslations, fb) {
|
|
13
|
+
super();
|
|
14
|
+
this.stTableTranslations = stTableTranslations;
|
|
15
|
+
this.fb = fb;
|
|
16
|
+
this.column = input.required({});
|
|
17
|
+
this.filterValue = input({}, {
|
|
18
|
+
transform: (filterValue) => {
|
|
19
|
+
this.setFilterValue(filterValue);
|
|
20
|
+
return filterValue || {};
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
this.filterValueChanged = output();
|
|
24
|
+
this.formGroup = this.fb.group({
|
|
25
|
+
matchMode: {
|
|
26
|
+
value: 'contains',
|
|
27
|
+
disabled: true,
|
|
28
|
+
},
|
|
29
|
+
value: '',
|
|
30
|
+
dateFrom: null,
|
|
31
|
+
dateTo: null,
|
|
32
|
+
});
|
|
33
|
+
this.isUpdatingFromOutside = false;
|
|
34
|
+
}
|
|
35
|
+
ngOnInit() {
|
|
36
|
+
this.formGroup.valueChanges.subscribe(() => {
|
|
37
|
+
if (!this.isUpdatingFromOutside) {
|
|
38
|
+
this.updateAfterFormValueChanged();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
// this.filtersValue.subscribe(filtersValue => {
|
|
42
|
+
// console.log('Filters updated child');
|
|
43
|
+
// });
|
|
44
|
+
}
|
|
45
|
+
setFilterValue(newFilterValue) {
|
|
46
|
+
if (newFilterValue) {
|
|
47
|
+
this.formGroup.controls.matchMode.setValue(newFilterValue.matchMode, {
|
|
48
|
+
emitEvent: false,
|
|
49
|
+
});
|
|
50
|
+
if (this.column().filterType === 'date') {
|
|
51
|
+
const tmpValue = newFilterValue.value;
|
|
52
|
+
this.formGroup.controls.dateFrom.setValue(tmpValue[0] ? new Date(tmpValue[0]) : null, { emitEvent: false });
|
|
53
|
+
this.formGroup.controls.dateTo.setValue(tmpValue[1] ? new Date(tmpValue[1]) : null, { emitEvent: false });
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.formGroup.controls.value.setValue(newFilterValue.value || '', { emitEvent: false });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
updateAfterFormValueChanged() {
|
|
61
|
+
const tmpValue = this.column().filterType === 'date'
|
|
62
|
+
? [
|
|
63
|
+
this.formGroup.controls.dateFrom.value
|
|
64
|
+
? this.formGroup.controls.dateFrom.value.toISOString()
|
|
65
|
+
: null,
|
|
66
|
+
this.formGroup.controls.dateTo.value
|
|
67
|
+
? this.formGroup.controls.dateTo.value.toISOString()
|
|
68
|
+
: null,
|
|
69
|
+
]
|
|
70
|
+
: this.formGroup.controls.value.value;
|
|
71
|
+
const newFilter = {
|
|
72
|
+
matchMode: this.formGroup.controls.matchMode.value,
|
|
73
|
+
value: tmpValue,
|
|
74
|
+
};
|
|
75
|
+
this.filterValueChanged.emit(newFilter);
|
|
76
|
+
// const newValue = {
|
|
77
|
+
// ...this.filtersValue(),
|
|
78
|
+
// [this.column().field]: newFilter,
|
|
79
|
+
// };
|
|
80
|
+
//
|
|
81
|
+
// this.filtersValue.set(newValue);
|
|
82
|
+
}
|
|
83
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MaterialTableFilterComponent, deps: [{ token: i1.StTablesTranslationsService }, { token: i2.NonNullableFormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
84
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: MaterialTableFilterComponent, selector: "ngx-st-material-table-filter", inputs: { column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: true, transformFunction: null }, filterValue: { classPropertyName: "filterValue", publicName: "filterValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filterValueChanged: "filterValueChanged" }, usesInheritance: true, ngImport: i0, template: `
|
|
85
|
+
<form class="row" [formGroup]="formGroup" style="width: 100%;">
|
|
86
|
+
<div class="col-auto">
|
|
87
|
+
<mat-form-field appearance="outline" style="width: 120px">
|
|
88
|
+
<mat-label>
|
|
89
|
+
{{ stTableTranslations.getTranslations()().matchMode }}</mat-label
|
|
90
|
+
>
|
|
91
|
+
<input matInput type="text" [formControlName]="'matchMode'" />
|
|
92
|
+
</mat-form-field>
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
@if (
|
|
96
|
+
column().filterType === 'string' || column().filterType === 'number'
|
|
97
|
+
) {
|
|
98
|
+
<div class="col">
|
|
99
|
+
<mat-form-field appearance="outline" style="width: 100%">
|
|
100
|
+
<mat-label>{{
|
|
101
|
+
stTableTranslations.getTranslations()().searchFilter
|
|
102
|
+
}}</mat-label>
|
|
103
|
+
<input
|
|
104
|
+
matInput
|
|
105
|
+
[type]="column().filterType === 'string' ? 'text' : 'number'"
|
|
106
|
+
[formControlName]="'value'"
|
|
107
|
+
/>
|
|
108
|
+
</mat-form-field>
|
|
109
|
+
</div>
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
@if (column().filterType === 'date') {
|
|
113
|
+
<div class="col">
|
|
114
|
+
<mat-form-field appearance="outline" style="width: 170px">
|
|
115
|
+
<mat-label>{{
|
|
116
|
+
stTableTranslations.getTranslations()().dateFrom
|
|
117
|
+
}}</mat-label>
|
|
118
|
+
<input
|
|
119
|
+
matInput
|
|
120
|
+
[matDatepicker]="picker1"
|
|
121
|
+
[formControlName]="'dateFrom'"
|
|
122
|
+
/>
|
|
123
|
+
<mat-datepicker-toggle
|
|
124
|
+
matIconSuffix
|
|
125
|
+
[for]="picker1"
|
|
126
|
+
></mat-datepicker-toggle>
|
|
127
|
+
<mat-datepicker #picker1></mat-datepicker>
|
|
128
|
+
</mat-form-field>
|
|
129
|
+
</div>
|
|
130
|
+
<div class="col">
|
|
131
|
+
<mat-form-field appearance="outline" style="width: 170px">
|
|
132
|
+
<mat-label>{{
|
|
133
|
+
stTableTranslations.getTranslations()().dateTo
|
|
134
|
+
}}</mat-label>
|
|
135
|
+
<input
|
|
136
|
+
matInput
|
|
137
|
+
[matDatepicker]="picker2"
|
|
138
|
+
[formControlName]="'dateTo'"
|
|
139
|
+
/>
|
|
140
|
+
<mat-datepicker-toggle
|
|
141
|
+
matIconSuffix
|
|
142
|
+
[for]="picker2"
|
|
143
|
+
></mat-datepicker-toggle>
|
|
144
|
+
<mat-datepicker #picker2></mat-datepicker>
|
|
145
|
+
</mat-form-field>
|
|
146
|
+
</div>
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
@if (column().filterType === 'boolean') {
|
|
150
|
+
<div class="col">
|
|
151
|
+
<mat-form-field appearance="outline" style="width: 100%">
|
|
152
|
+
<mat-label>{{
|
|
153
|
+
stTableTranslations.getTranslations()().booleanPickValue
|
|
154
|
+
}}</mat-label>
|
|
155
|
+
<mat-select [formControlName]="'value'">
|
|
156
|
+
<mat-option value="">{{
|
|
157
|
+
stTableTranslations.getTranslations()().booleanNone
|
|
158
|
+
}}</mat-option>
|
|
159
|
+
<mat-option [value]="true">{{
|
|
160
|
+
stTableTranslations.getTranslations()().booleanYes
|
|
161
|
+
}}</mat-option>
|
|
162
|
+
<mat-option [value]="false">{{
|
|
163
|
+
stTableTranslations.getTranslations()().booleanNo
|
|
164
|
+
}}</mat-option>
|
|
165
|
+
</mat-select>
|
|
166
|
+
</mat-form-field>
|
|
167
|
+
</div>
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
@if (column().filterType === 'custom') {
|
|
171
|
+
<div class="col">
|
|
172
|
+
<mat-form-field appearance="outline" style="width: 100%">
|
|
173
|
+
<mat-label>{{
|
|
174
|
+
stTableTranslations.getTranslations()().customPickValue
|
|
175
|
+
}}</mat-label>
|
|
176
|
+
<mat-select [formControlName]="'value'">
|
|
177
|
+
<mat-option value="">{{
|
|
178
|
+
stTableTranslations.getTranslations()().customNone
|
|
179
|
+
}}</mat-option>
|
|
180
|
+
@for (option of column().customFilterOptions; track option) {
|
|
181
|
+
<mat-option [value]="option.value">
|
|
182
|
+
{{ option.label }}
|
|
183
|
+
</mat-option>
|
|
184
|
+
}
|
|
185
|
+
</mat-select>
|
|
186
|
+
</mat-form-field>
|
|
187
|
+
</div>
|
|
188
|
+
}
|
|
189
|
+
</form>
|
|
190
|
+
`, isInline: true, styles: [":host{width:100%}form.row{gap:8px}form.row>:is(.col-auto,.col){padding:0}\n"], dependencies: [{ kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i7.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i7.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
191
|
+
}
|
|
192
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MaterialTableFilterComponent, decorators: [{
|
|
193
|
+
type: Component,
|
|
194
|
+
args: [{ selector: 'ngx-st-material-table-filter', template: `
|
|
195
|
+
<form class="row" [formGroup]="formGroup" style="width: 100%;">
|
|
196
|
+
<div class="col-auto">
|
|
197
|
+
<mat-form-field appearance="outline" style="width: 120px">
|
|
198
|
+
<mat-label>
|
|
199
|
+
{{ stTableTranslations.getTranslations()().matchMode }}</mat-label
|
|
200
|
+
>
|
|
201
|
+
<input matInput type="text" [formControlName]="'matchMode'" />
|
|
202
|
+
</mat-form-field>
|
|
203
|
+
</div>
|
|
204
|
+
|
|
205
|
+
@if (
|
|
206
|
+
column().filterType === 'string' || column().filterType === 'number'
|
|
207
|
+
) {
|
|
208
|
+
<div class="col">
|
|
209
|
+
<mat-form-field appearance="outline" style="width: 100%">
|
|
210
|
+
<mat-label>{{
|
|
211
|
+
stTableTranslations.getTranslations()().searchFilter
|
|
212
|
+
}}</mat-label>
|
|
213
|
+
<input
|
|
214
|
+
matInput
|
|
215
|
+
[type]="column().filterType === 'string' ? 'text' : 'number'"
|
|
216
|
+
[formControlName]="'value'"
|
|
217
|
+
/>
|
|
218
|
+
</mat-form-field>
|
|
219
|
+
</div>
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
@if (column().filterType === 'date') {
|
|
223
|
+
<div class="col">
|
|
224
|
+
<mat-form-field appearance="outline" style="width: 170px">
|
|
225
|
+
<mat-label>{{
|
|
226
|
+
stTableTranslations.getTranslations()().dateFrom
|
|
227
|
+
}}</mat-label>
|
|
228
|
+
<input
|
|
229
|
+
matInput
|
|
230
|
+
[matDatepicker]="picker1"
|
|
231
|
+
[formControlName]="'dateFrom'"
|
|
232
|
+
/>
|
|
233
|
+
<mat-datepicker-toggle
|
|
234
|
+
matIconSuffix
|
|
235
|
+
[for]="picker1"
|
|
236
|
+
></mat-datepicker-toggle>
|
|
237
|
+
<mat-datepicker #picker1></mat-datepicker>
|
|
238
|
+
</mat-form-field>
|
|
239
|
+
</div>
|
|
240
|
+
<div class="col">
|
|
241
|
+
<mat-form-field appearance="outline" style="width: 170px">
|
|
242
|
+
<mat-label>{{
|
|
243
|
+
stTableTranslations.getTranslations()().dateTo
|
|
244
|
+
}}</mat-label>
|
|
245
|
+
<input
|
|
246
|
+
matInput
|
|
247
|
+
[matDatepicker]="picker2"
|
|
248
|
+
[formControlName]="'dateTo'"
|
|
249
|
+
/>
|
|
250
|
+
<mat-datepicker-toggle
|
|
251
|
+
matIconSuffix
|
|
252
|
+
[for]="picker2"
|
|
253
|
+
></mat-datepicker-toggle>
|
|
254
|
+
<mat-datepicker #picker2></mat-datepicker>
|
|
255
|
+
</mat-form-field>
|
|
256
|
+
</div>
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
@if (column().filterType === 'boolean') {
|
|
260
|
+
<div class="col">
|
|
261
|
+
<mat-form-field appearance="outline" style="width: 100%">
|
|
262
|
+
<mat-label>{{
|
|
263
|
+
stTableTranslations.getTranslations()().booleanPickValue
|
|
264
|
+
}}</mat-label>
|
|
265
|
+
<mat-select [formControlName]="'value'">
|
|
266
|
+
<mat-option value="">{{
|
|
267
|
+
stTableTranslations.getTranslations()().booleanNone
|
|
268
|
+
}}</mat-option>
|
|
269
|
+
<mat-option [value]="true">{{
|
|
270
|
+
stTableTranslations.getTranslations()().booleanYes
|
|
271
|
+
}}</mat-option>
|
|
272
|
+
<mat-option [value]="false">{{
|
|
273
|
+
stTableTranslations.getTranslations()().booleanNo
|
|
274
|
+
}}</mat-option>
|
|
275
|
+
</mat-select>
|
|
276
|
+
</mat-form-field>
|
|
277
|
+
</div>
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
@if (column().filterType === 'custom') {
|
|
281
|
+
<div class="col">
|
|
282
|
+
<mat-form-field appearance="outline" style="width: 100%">
|
|
283
|
+
<mat-label>{{
|
|
284
|
+
stTableTranslations.getTranslations()().customPickValue
|
|
285
|
+
}}</mat-label>
|
|
286
|
+
<mat-select [formControlName]="'value'">
|
|
287
|
+
<mat-option value="">{{
|
|
288
|
+
stTableTranslations.getTranslations()().customNone
|
|
289
|
+
}}</mat-option>
|
|
290
|
+
@for (option of column().customFilterOptions; track option) {
|
|
291
|
+
<mat-option [value]="option.value">
|
|
292
|
+
{{ option.label }}
|
|
293
|
+
</mat-option>
|
|
294
|
+
}
|
|
295
|
+
</mat-select>
|
|
296
|
+
</mat-form-field>
|
|
297
|
+
</div>
|
|
298
|
+
}
|
|
299
|
+
</form>
|
|
300
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{width:100%}form.row{gap:8px}form.row>:is(.col-auto,.col){padding:0}\n"] }]
|
|
301
|
+
}], ctorParameters: () => [{ type: i1.StTablesTranslationsService }, { type: i2.NonNullableFormBuilder }] });
|
|
302
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwtdGFibGUtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdC10YWJsZXMvc3JjL2xpYi9jb21wb25lbnRzL21hdGVyaWFsLXRhYmxlL21hdGVyaWFsLXRhYmxlLWNhcHRpb24vbWF0ZXJpYWwtdGFibGUtZmlsdGVyLWRpYWxvZy9tYXRlcmlhbC10YWJsZS1maWx0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULEtBQUssRUFJTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7OztBQW9JcEUsTUFBTSxPQUFPLDRCQUNYLFNBQVEsMkJBQTJCO0lBdUJuQyxZQUNTLG1CQUFnRCxFQUMvQyxFQUEwQjtRQUVsQyxLQUFLLEVBQUUsQ0FBQztRQUhELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBNkI7UUFDL0MsT0FBRSxHQUFGLEVBQUUsQ0FBd0I7UUF0QnBDLFdBQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFpQyxFQUFFLENBQUMsQ0FBQztRQUM1RCxnQkFBVyxHQUFHLEtBQUssQ0FBQyxFQUEyQixFQUFFO1lBQy9DLFNBQVMsRUFBRSxDQUFDLFdBQWtDLEVBQUUsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDakMsT0FBTyxXQUFXLElBQUksRUFBRSxDQUFDO1lBQzNCLENBQUM7U0FDRixDQUFDLENBQUM7UUFFSCx1QkFBa0IsR0FBRyxNQUFNLEVBQXlCLENBQUM7UUFFckQsY0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3hCLFNBQVMsRUFBRTtnQkFDVCxLQUFLLEVBQXNDLFVBQVU7Z0JBQ3JELFFBQVEsRUFBRSxJQUFJO2FBQ2Y7WUFDRCxLQUFLLEVBQTBCLEVBQUU7WUFDakMsUUFBUSxFQUFlLElBQUk7WUFDM0IsTUFBTSxFQUFlLElBQUk7U0FDMUIsQ0FBQyxDQUFDO1FBb0JLLDBCQUFxQixHQUFHLEtBQUssQ0FBQztJQWJ0QyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxnREFBZ0Q7UUFDaEQsMENBQTBDO1FBQzFDLE1BQU07SUFDUixDQUFDO0lBSU8sY0FBYyxDQUFDLGNBQXFDO1FBQzFELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFO2dCQUNuRSxTQUFTLEVBQUUsS0FBSzthQUNqQixDQUFDLENBQUM7WUFFSCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxLQUF1QyxDQUFDO2dCQUN4RSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUN2QyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQzNDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUNyQixDQUFDO2dCQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3JDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFDMUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQ3JCLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDbkMsY0FBYyxDQUFDLEtBQWdDLElBQUksRUFBRSxFQUN0RCxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FDckIsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLDJCQUEyQjtRQUNqQyxNQUFNLFFBQVEsR0FDWixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxLQUFLLE1BQU07WUFDakMsQ0FBQyxDQUFFO2dCQUNDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLO29CQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7b0JBQ3RELENBQUMsQ0FBQyxJQUFJO2dCQUNSLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLO29CQUNsQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7b0JBQ3BELENBQUMsQ0FBQyxJQUFJO2FBQzBCO1lBQ3RDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBRTFDLE1BQU0sU0FBUyxHQUEwQjtZQUN2QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUs7WUFDbEQsS0FBSyxFQUFFLFFBQVE7U0FDaEIsQ0FBQztRQUVGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMscUJBQXFCO1FBQ3JCLDRCQUE0QjtRQUM1QixzQ0FBc0M7UUFDdEMsS0FBSztRQUNMLEVBQUU7UUFDRixtQ0FBbUM7SUFDckMsQ0FBQzsrR0E5RlUsNEJBQTRCO21HQUE1Qiw0QkFBNEIsa2FBNUg3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBHVDs7NEZBa0JVLDRCQUE0QjtrQkE5SHhDLFNBQVM7K0JBQ0UsOEJBQThCLFlBQzlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEdULG1CQWdCZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIGlucHV0LFxyXG4gIG1vZGVsLFxyXG4gIE9uSW5pdCxcclxuICBlZmZlY3QsXHJcbiAgb3V0cHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdFRhYmxlc1RyYW5zbGF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zdC10YWJsZXMtdHJhbnNsYXRpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBWaWV3U3RNYXRlcmlhbFRhYmxlQ29sdW1uTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvdmlldy92aWV3LXN0LW1hdGVyaWFsLXRhYmxlLWNvbHVtbi5tb2RlbCc7XHJcbmltcG9ydCB7IE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN0U3Vic2NyaWJlRGVzdHJveUNvbXBvbmVudCB9IGZyb20gJ25neC1zdC1iYXNlLWZ1bmN0aW9ucyc7XHJcbmltcG9ydCB7XHJcbiAgU3RNYXRlcmlhbFRhYmxlRmlsdGVyLFxyXG4gIFN0TWF0ZXJpYWxUYWJsZUZpbHRlck1hdGNoTW9kZVR5cGUsXHJcbn0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL21vZGVscyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25neC1zdC1tYXRlcmlhbC10YWJsZS1maWx0ZXInLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8Zm9ybSBjbGFzcz1cInJvd1wiIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3R5bGU9XCJ3aWR0aDogMTIwcHhcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIHt7IHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5tYXRjaE1vZGUgfX08L21hdC1sYWJlbFxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgW2Zvcm1Db250cm9sTmFtZV09XCInbWF0Y2hNb2RlJ1wiIC8+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICBAaWYgKFxyXG4gICAgICAgIGNvbHVtbigpLmZpbHRlclR5cGUgPT09ICdzdHJpbmcnIHx8IGNvbHVtbigpLmZpbHRlclR5cGUgPT09ICdudW1iZXInXHJcbiAgICAgICkge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e1xyXG4gICAgICAgICAgICAgIHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5zZWFyY2hGaWx0ZXJcclxuICAgICAgICAgICAgfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICBbdHlwZV09XCJjb2x1bW4oKS5maWx0ZXJUeXBlID09PSAnc3RyaW5nJyA/ICd0ZXh0JyA6ICdudW1iZXInXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIid2YWx1ZSdcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmIChjb2x1bW4oKS5maWx0ZXJUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdHlsZT1cIndpZHRoOiAxNzBweFwiPlxyXG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7XHJcbiAgICAgICAgICAgICAgc3RUYWJsZVRyYW5zbGF0aW9ucy5nZXRUcmFuc2xhdGlvbnMoKSgpLmRhdGVGcm9tXHJcbiAgICAgICAgICAgIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGlja2VyMVwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInZGF0ZUZyb20nXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZVxyXG4gICAgICAgICAgICAgIG1hdEljb25TdWZmaXhcclxuICAgICAgICAgICAgICBbZm9yXT1cInBpY2tlcjFcIlxyXG4gICAgICAgICAgICA+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyMT48L21hdC1kYXRlcGlja2VyPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdHlsZT1cIndpZHRoOiAxNzBweFwiPlxyXG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7XHJcbiAgICAgICAgICAgICAgc3RUYWJsZVRyYW5zbGF0aW9ucy5nZXRUcmFuc2xhdGlvbnMoKSgpLmRhdGVUb1xyXG4gICAgICAgICAgICB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInBpY2tlcjJcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2RhdGVUbydcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXHJcbiAgICAgICAgICAgICAgbWF0SWNvblN1ZmZpeFxyXG4gICAgICAgICAgICAgIFtmb3JdPVwicGlja2VyMlwiXHJcbiAgICAgICAgICAgID48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXIyPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICBAaWYgKGNvbHVtbigpLmZpbHRlclR5cGUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e1xyXG4gICAgICAgICAgICAgIHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5ib29sZWFuUGlja1ZhbHVlXHJcbiAgICAgICAgICAgIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiJ3ZhbHVlJ1wiPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiXCI+e3tcclxuICAgICAgICAgICAgICAgIHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5ib29sZWFuTm9uZVxyXG4gICAgICAgICAgICAgIH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ0cnVlXCI+e3tcclxuICAgICAgICAgICAgICAgIHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5ib29sZWFuWWVzXHJcbiAgICAgICAgICAgICAgfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImZhbHNlXCI+e3tcclxuICAgICAgICAgICAgICAgIHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5ib29sZWFuTm9cclxuICAgICAgICAgICAgICB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmIChjb2x1bW4oKS5maWx0ZXJUeXBlID09PSAnY3VzdG9tJykge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e1xyXG4gICAgICAgICAgICAgIHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5jdXN0b21QaWNrVmFsdWVcclxuICAgICAgICAgICAgfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCIndmFsdWUnXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJcIj57e1xyXG4gICAgICAgICAgICAgICAgc3RUYWJsZVRyYW5zbGF0aW9ucy5nZXRUcmFuc2xhdGlvbnMoKSgpLmN1c3RvbU5vbmVcclxuICAgICAgICAgICAgICB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgY29sdW1uKCkuY3VzdG9tRmlsdGVyT3B0aW9uczsgdHJhY2sgb3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgPC9mb3JtPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXHJcbiAgICBgXHJcbiAgICAgIDpob3N0IHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgfVxyXG4gICAgICBmb3JtLnJvdyB7XHJcbiAgICAgICAgZ2FwOiA4cHg7XHJcblxyXG4gICAgICAgICYgPiAuY29sLWF1dG8sXHJcbiAgICAgICAgJiA+IC5jb2wge1xyXG4gICAgICAgICAgcGFkZGluZzogMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIGAsXHJcbiAgXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hdGVyaWFsVGFibGVGaWx0ZXJDb21wb25lbnRcclxuICBleHRlbmRzIFN0U3Vic2NyaWJlRGVzdHJveUNvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0XHJcbntcclxuICBjb2x1bW4gPSBpbnB1dC5yZXF1aXJlZDxWaWV3U3RNYXRlcmlhbFRhYmxlQ29sdW1uTW9kZWw+KHt9KTtcclxuICBmaWx0ZXJWYWx1ZSA9IGlucHV0KHt9IGFzIFN0TWF0ZXJpYWxUYWJsZUZpbHRlciwge1xyXG4gICAgdHJhbnNmb3JtOiAoZmlsdGVyVmFsdWU6IFN0TWF0ZXJpYWxUYWJsZUZpbHRlcikgPT4ge1xyXG4gICAgICB0aGlzLnNldEZpbHRlclZhbHVlKGZpbHRlclZhbHVlKTtcclxuICAgICAgcmV0dXJuIGZpbHRlclZhbHVlIHx8IHt9O1xyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgZmlsdGVyVmFsdWVDaGFuZ2VkID0gb3V0cHV0PFN0TWF0ZXJpYWxUYWJsZUZpbHRlcj4oKTtcclxuXHJcbiAgZm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICBtYXRjaE1vZGU6IHtcclxuICAgICAgdmFsdWU6IDxTdE1hdGVyaWFsVGFibGVGaWx0ZXJNYXRjaE1vZGVUeXBlPidjb250YWlucycsXHJcbiAgICAgIGRpc2FibGVkOiB0cnVlLFxyXG4gICAgfSxcclxuICAgIHZhbHVlOiA8bnVsbCB8IHN0cmluZyB8IG51bWJlcj4nJyxcclxuICAgIGRhdGVGcm9tOiA8bnVsbCB8IERhdGU+bnVsbCxcclxuICAgIGRhdGVUbzogPG51bGwgfCBEYXRlPm51bGwsXHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHN0VGFibGVUcmFuc2xhdGlvbnM6IFN0VGFibGVzVHJhbnNsYXRpb25zU2VydmljZSxcclxuICAgIHByaXZhdGUgZmI6IE5vbk51bGxhYmxlRm9ybUJ1aWxkZXJcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuaXNVcGRhdGluZ0Zyb21PdXRzaWRlKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBZnRlckZvcm1WYWx1ZUNoYW5nZWQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyB0aGlzLmZpbHRlcnNWYWx1ZS5zdWJzY3JpYmUoZmlsdGVyc1ZhbHVlID0+IHtcclxuICAgIC8vICAgY29uc29sZS5sb2coJ0ZpbHRlcnMgdXBkYXRlZCBjaGlsZCcpO1xyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVXBkYXRpbmdGcm9tT3V0c2lkZSA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIHNldEZpbHRlclZhbHVlKG5ld0ZpbHRlclZhbHVlOiBTdE1hdGVyaWFsVGFibGVGaWx0ZXIpIHtcclxuICAgIGlmIChuZXdGaWx0ZXJWYWx1ZSkge1xyXG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5tYXRjaE1vZGUuc2V0VmFsdWUobmV3RmlsdGVyVmFsdWUubWF0Y2hNb2RlLCB7XHJcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5jb2x1bW4oKS5maWx0ZXJUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICBjb25zdCB0bXBWYWx1ZSA9IG5ld0ZpbHRlclZhbHVlLnZhbHVlIGFzIFtzdHJpbmcgfCBudWxsLCBzdHJpbmcgfCBudWxsXTtcclxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbS5zZXRWYWx1ZShcclxuICAgICAgICAgIHRtcFZhbHVlWzBdID8gbmV3IERhdGUodG1wVmFsdWVbMF0hKSA6IG51bGwsXHJcbiAgICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZVRvLnNldFZhbHVlKFxyXG4gICAgICAgICAgdG1wVmFsdWVbMV0gPyBuZXcgRGF0ZSh0bXBWYWx1ZVsxXSkgOiBudWxsLFxyXG4gICAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnZhbHVlLnNldFZhbHVlKFxyXG4gICAgICAgICAgKG5ld0ZpbHRlclZhbHVlLnZhbHVlIGFzIHN0cmluZyB8IG51bWJlciB8IG51bGwpIHx8ICcnLFxyXG4gICAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUFmdGVyRm9ybVZhbHVlQ2hhbmdlZCgpIHtcclxuICAgIGNvbnN0IHRtcFZhbHVlID1cclxuICAgICAgdGhpcy5jb2x1bW4oKS5maWx0ZXJUeXBlID09PSAnZGF0ZSdcclxuICAgICAgICA/IChbXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVGcm9tLnZhbHVlXHJcbiAgICAgICAgICAgICAgPyB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbS52YWx1ZS50b0lTT1N0cmluZygpXHJcbiAgICAgICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlVG8udmFsdWVcclxuICAgICAgICAgICAgICA/IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVUby52YWx1ZS50b0lTT1N0cmluZygpXHJcbiAgICAgICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgICAgXSBhcyBbc3RyaW5nIHwgbnVsbCwgc3RyaW5nIHwgbnVsbF0pXHJcbiAgICAgICAgOiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy52YWx1ZS52YWx1ZTtcclxuXHJcbiAgICBjb25zdCBuZXdGaWx0ZXI6IFN0TWF0ZXJpYWxUYWJsZUZpbHRlciA9IHtcclxuICAgICAgbWF0Y2hNb2RlOiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5tYXRjaE1vZGUudmFsdWUsXHJcbiAgICAgIHZhbHVlOiB0bXBWYWx1ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5maWx0ZXJWYWx1ZUNoYW5nZWQuZW1pdChuZXdGaWx0ZXIpO1xyXG4gICAgLy8gY29uc3QgbmV3VmFsdWUgPSB7XHJcbiAgICAvLyAgIC4uLnRoaXMuZmlsdGVyc1ZhbHVlKCksXHJcbiAgICAvLyAgIFt0aGlzLmNvbHVtbigpLmZpZWxkXTogbmV3RmlsdGVyLFxyXG4gICAgLy8gfTtcclxuICAgIC8vXHJcbiAgICAvLyB0aGlzLmZpbHRlcnNWYWx1ZS5zZXQobmV3VmFsdWUpO1xyXG4gIH1cclxufVxyXG4iXX0=
|