@muraai/mnl-form 0.0.1-alpha-db495b1 → 0.0.1-alpha-11e96eb

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/fesm2022/muraai-mnl-form.mjs +150 -143
  2. package/fesm2022/muraai-mnl-form.mjs.map +1 -1
  3. package/lib/types/upload-file.d.ts +1 -1
  4. package/lib/workflow-status/ workflow-status.module.d.ts +8 -8
  5. package/lib/workflow-status/workflow-status.component.d.ts +1 -1
  6. package/package.json +4 -5
  7. package/esm2022/lib/confirmation-dialog/confirmation-dialog.component.mjs +0 -34
  8. package/esm2022/lib/mnl-form/mnl-form-standalone.module.mjs +0 -155
  9. package/esm2022/lib/mnl-form/mnl-form.component.mjs +0 -199
  10. package/esm2022/lib/models/custom-form-field.model.mjs +0 -2
  11. package/esm2022/lib/models/workflow-status.model.mjs +0 -2
  12. package/esm2022/lib/services/graphql.service.mjs +0 -30
  13. package/esm2022/lib/services/scoring.service.mjs +0 -103
  14. package/esm2022/lib/types/action-button-renderer.component.mjs +0 -59
  15. package/esm2022/lib/types/autocomplete-type.component.mjs +0 -68
  16. package/esm2022/lib/types/button.type.mjs +0 -72
  17. package/esm2022/lib/types/comments.type.mjs +0 -102
  18. package/esm2022/lib/types/country-code-input.type.mjs +0 -181
  19. package/esm2022/lib/types/custom-date.type.mjs +0 -20
  20. package/esm2022/lib/types/custom-input.component.mjs +0 -62
  21. package/esm2022/lib/types/date-format.type.mjs +0 -196
  22. package/esm2022/lib/types/expansion-panel.types.mjs +0 -85
  23. package/esm2022/lib/types/formly-field-panel.type.mjs +0 -70
  24. package/esm2022/lib/types/grid-actionable.type.mjs +0 -197
  25. package/esm2022/lib/types/grid-formly-cell.component.mjs +0 -42
  26. package/esm2022/lib/types/grid.type.mjs +0 -125
  27. package/esm2022/lib/types/input.type.mjs +0 -43
  28. package/esm2022/lib/types/mu-helper-text.type.mjs +0 -331
  29. package/esm2022/lib/types/multi-select-autocomplete.mjs +0 -139
  30. package/esm2022/lib/types/multi-select-checkbox.component.mjs +0 -247
  31. package/esm2022/lib/types/radio.type.mjs +0 -71
  32. package/esm2022/lib/types/scrollable-tabs.types.mjs +0 -220
  33. package/esm2022/lib/types/select-api-auto-complete.component.mjs +0 -111
  34. package/esm2022/lib/types/select-autocomplete-redefined.component.mjs +0 -142
  35. package/esm2022/lib/types/select-autocomplete.type.mjs +0 -254
  36. package/esm2022/lib/types/stepper.type.mjs +0 -268
  37. package/esm2022/lib/types/table.types.mjs +0 -79
  38. package/esm2022/lib/types/tabs.types.mjs +0 -293
  39. package/esm2022/lib/types/tabular-form-dialog.component.mjs +0 -331
  40. package/esm2022/lib/types/tabular-form.type.mjs +0 -641
  41. package/esm2022/lib/types/upload-file.mjs +0 -524
  42. package/esm2022/lib/types/view-file-dialog.component.mjs +0 -90
  43. package/esm2022/lib/utils/formly.utils.mjs +0 -105
  44. package/esm2022/lib/validators/custom-email-validator.mjs +0 -18
  45. package/esm2022/lib/validators/ein-validators.mjs +0 -11
  46. package/esm2022/lib/validators/gst-validator.mjs +0 -11
  47. package/esm2022/lib/validators/normal-email-validator.mjs +0 -17
  48. package/esm2022/lib/validators/npi-validator.mjs +0 -11
  49. package/esm2022/lib/validators/pan-validator.mjs +0 -11
  50. package/esm2022/lib/validators/phone-number-validator.mjs +0 -22
  51. package/esm2022/lib/validators/select-validator.mjs +0 -7
  52. package/esm2022/lib/validators/tinSsn-validator.mjs +0 -12
  53. package/esm2022/lib/workflow-status/ workflow-status.module.mjs +0 -52
  54. package/esm2022/lib/workflow-status/workflow-status.component.mjs +0 -70
  55. package/esm2022/lib/wrappers/form-field-description-wrapper.component.mjs +0 -44
  56. package/esm2022/lib/wrappers/form-field-wrapper.component.mjs +0 -34
  57. package/esm2022/lib/wrappers/formly-wrapper-with-old-value.component.mjs +0 -140
  58. package/esm2022/lib/wrappers/prefix-suffix-wrapper.component.mjs +0 -95
  59. package/esm2022/lib/wrappers/prefix-sufix-extension.component.mjs +0 -9
  60. package/esm2022/muraai-mnl-form.mjs +0 -5
  61. package/esm2022/public-api.mjs +0 -12
@@ -1,331 +0,0 @@
1
- import { Breakpoints } from '@angular/cdk/layout';
2
- import { CommonModule } from '@angular/common';
3
- import { Component, DestroyRef, EventEmitter, inject, Inject, Output } from '@angular/core';
4
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
- import { FormGroup, ReactiveFormsModule } from '@angular/forms';
6
- import { MatButtonModule } from '@angular/material/button';
7
- import { MatCheckboxModule } from '@angular/material/checkbox';
8
- import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
9
- import { MatFormFieldModule } from '@angular/material/form-field';
10
- import { MatInputModule } from '@angular/material/input';
11
- import { MatRadioModule } from '@angular/material/radio';
12
- import { MatSelectModule } from '@angular/material/select';
13
- import { FormlyModule } from '@ngx-formly/core';
14
- import { TranslateModule } from '@ngx-translate/core';
15
- import { NgxSpinnerModule } from 'ngx-spinner';
16
- import { forkJoin, of, take } from 'rxjs';
17
- import { ConfirmationDialogComponent } from '../confirmation-dialog/confirmation-dialog.component';
18
- import * as i0 from "@angular/core";
19
- import * as i1 from "@angular/material/dialog";
20
- import * as i2 from "@ngx-formly/core";
21
- import * as i3 from "@ngx-translate/core";
22
- import * as i4 from "@angular/cdk/layout";
23
- import * as i5 from "@angular/common";
24
- import * as i6 from "@angular/material/button";
25
- import * as i7 from "ngx-spinner";
26
- export class TabularFormDialogComponent {
27
- constructor(dialogRef, data, formlyBuilder, translateService, matDialog, hostElement, breakpointObserver) {
28
- this.dialogRef = dialogRef;
29
- this.data = data;
30
- this.formlyBuilder = formlyBuilder;
31
- this.translateService = translateService;
32
- this.matDialog = matDialog;
33
- this.hostElement = hostElement;
34
- this.breakpointObserver = breakpointObserver;
35
- this.form = new FormGroup({});
36
- this.dialogLabel = '';
37
- this.saveData = new EventEmitter();
38
- this.destroyRef = inject(DestroyRef);
39
- this.isMobileDevice = false;
40
- this.breakpointObserver?.observe([Breakpoints.Handset]).pipe(takeUntilDestroyed(this.destroyRef)).subscribe((result) => {
41
- this.isMobileDevice = result?.matches;
42
- });
43
- this.fieldConfig = data.fieldConfig;
44
- this.selectedRowData = data.selectedRowData;
45
- if (data?.selectedRowData) {
46
- this.model = data?.selectedRowData;
47
- }
48
- this.propsOfDialog = data.tabularProps;
49
- this.dialogLabel = data.label;
50
- this.fields = this.translateFormConfig(data.fieldConfig);
51
- this.options = {
52
- ...this.options,
53
- formState: data?.formState
54
- };
55
- this.parentModel = data?.parentModel;
56
- this.formlyBuilder.buildForm(this.form, this.fields, this.model, this.options);
57
- this.updateDependentFieldsFullName(this.fields);
58
- }
59
- resetForm() {
60
- this.form.reset();
61
- }
62
- onSave() {
63
- if (this.form.valid) {
64
- if (this.fields[0]?.confirmationDialogProps?.length) {
65
- const confirmationDialogs = this.fields[0].confirmationDialogProps
66
- .filter((confirmationDialogProp) => confirmationDialogProp?.enableConfirmation)
67
- .map((confirmationDialogProp) => {
68
- if (!confirmationDialogProp?.enableConfirmationDialogForRoles?.length ||
69
- confirmationDialogProp?.enableConfirmationDialogForRoles?.some((role) => this.options?.formState?.userRoles?.includes(role))) {
70
- if (confirmationDialogProp?.showForChangeRequestOnly) {
71
- if (this.options.formState.showOldValues) {
72
- const dialogRef = this.matDialog.open(ConfirmationDialogComponent, {
73
- minWidth: confirmationDialogProp?.['minWidth'] ?? '40%',
74
- maxWidth: confirmationDialogProp?.['maxWidth'] ?? '100%',
75
- minHeight: confirmationDialogProp?.['minHeight'] ?? '30%',
76
- maxHeight: confirmationDialogProp?.['maxHeight'] ?? '40%',
77
- data: {
78
- title: this.translateService.instant(confirmationDialogProp?.data?.title),
79
- showOk: true
80
- },
81
- disableClose: true
82
- });
83
- return dialogRef.afterClosed().pipe(take(1));
84
- }
85
- }
86
- else {
87
- const dialogRef = this.matDialog.open(ConfirmationDialogComponent, {
88
- width: confirmationDialogProp?.['width'] ?? '30%',
89
- minHeight: confirmationDialogProp?.['minHeight'] ?? '30%',
90
- maxHeight: confirmationDialogProp?.['maxHeight'] ?? '40%',
91
- data: {
92
- title: this.translateService.instant(confirmationDialogProp?.data?.title),
93
- showOk: true
94
- },
95
- disableClose: true
96
- });
97
- return dialogRef.afterClosed().pipe(take(1));
98
- }
99
- }
100
- return of(true);
101
- });
102
- if (confirmationDialogs.length) {
103
- forkJoin(confirmationDialogs)
104
- .pipe(take(1))
105
- .subscribe(() => {
106
- this.dialogRef.close({
107
- ...this.model,
108
- ...this.form.value,
109
- });
110
- });
111
- }
112
- else {
113
- this.dialogRef.close({
114
- ...this.model,
115
- ...this.form.value,
116
- });
117
- }
118
- }
119
- else {
120
- this.dialogRef.close({
121
- ...this.model,
122
- ...this.form.value,
123
- });
124
- }
125
- }
126
- }
127
- onCancel() {
128
- this.dialogRef.close();
129
- }
130
- onSaveAddNew() {
131
- if (this.form.valid) {
132
- const dataToSave = {
133
- ...this.model,
134
- ...this.form.getRawValue(),
135
- };
136
- if (this.fields[0]?.confirmationDialogProps?.length) {
137
- const confirmationDialogs = this.fields[0].confirmationDialogProps
138
- .filter((confirmationDialogProp) => confirmationDialogProp?.enableConfirmation)
139
- .map((confirmationDialogProp) => {
140
- if (!confirmationDialogProp?.enableConfirmationDialogForRoles
141
- ?.length ||
142
- confirmationDialogProp?.enableConfirmationDialogForRoles?.some((role) => this.options?.formState?.userRoles?.includes(role))) {
143
- if (confirmationDialogProp?.showForChangeRequestOnly) {
144
- if (this.options.formState.showOldValues) {
145
- const dialogRef = this.matDialog.open(ConfirmationDialogComponent, {
146
- width: confirmationDialogProp?.['width'] ?? '30%',
147
- minHeight: confirmationDialogProp?.['minHeight'] ?? '30%',
148
- maxHeight: confirmationDialogProp?.['maxHeight'] ?? '40%',
149
- data: {
150
- title: this.translateService.instant(confirmationDialogProp?.data?.title),
151
- showOk: true,
152
- },
153
- disableClose: true,
154
- });
155
- return dialogRef.afterClosed().pipe(take(1));
156
- }
157
- }
158
- else {
159
- const dialogRef = this.matDialog.open(ConfirmationDialogComponent, {
160
- width: confirmationDialogProp?.['width'] ?? '30%',
161
- minHeight: confirmationDialogProp?.['minHeight'] ?? '30%',
162
- maxHeight: confirmationDialogProp?.['maxHeight'] ?? '40%',
163
- data: {
164
- title: this.translateService.instant(confirmationDialogProp?.data?.title),
165
- showOk: true,
166
- },
167
- disableClose: true,
168
- });
169
- return dialogRef.afterClosed().pipe(take(1));
170
- }
171
- }
172
- return of(true);
173
- });
174
- if (confirmationDialogs.length) {
175
- forkJoin(confirmationDialogs)
176
- .pipe(take(1))
177
- .subscribe(() => {
178
- if (this.propsOfDialog?.['isSequentialNumGenerationRequired']) {
179
- dataToSave.sequentialNumberId = `000${this.generateSequentialIdNumber(this.parentModel)}`;
180
- }
181
- this.saveData.emit(dataToSave);
182
- this.resetForm();
183
- });
184
- }
185
- else {
186
- if (this.propsOfDialog?.['isSequentialNumGenerationRequired']) {
187
- dataToSave.sequentialNumberId = `000${this.generateSequentialIdNumber(this.parentModel)}`;
188
- }
189
- this.saveData.emit(dataToSave);
190
- this.resetForm();
191
- }
192
- }
193
- else {
194
- if (this.propsOfDialog?.['isSequentialNumGenerationRequired']) {
195
- dataToSave.sequentialNumberId = `000${this.generateSequentialIdNumber(this.parentModel)}`;
196
- }
197
- this.saveData.emit(dataToSave);
198
- this.resetForm();
199
- }
200
- }
201
- }
202
- translateFormConfig(config) {
203
- return config.map((field) => {
204
- if (field.props?.label) {
205
- field.expressions = {
206
- ...field.expressions,
207
- 'props.label': this.translateService.stream(field.props.label || ''),
208
- 'props.tooltip': this.translateService.stream(field.props.label || ''),
209
- };
210
- }
211
- if (field.props?.placeholder) {
212
- field.expressions = {
213
- ...field.expressions,
214
- 'props.placeholder': this.translateService.stream(field.props.placeholder || ''),
215
- };
216
- }
217
- if (field.fieldGroup) {
218
- this.translateFormConfig(field.fieldGroup);
219
- }
220
- return field;
221
- });
222
- }
223
- onModelChange(event) {
224
- this.model = event;
225
- this.subscribeToDependencies(this.fields, this.form, this.model);
226
- }
227
- subscribeToDependencies(fields, form, vendorModel) {
228
- fields.forEach((field) => {
229
- if (field.fieldGroup) {
230
- this.subscribeToDependencies(field.fieldGroup, form, vendorModel);
231
- }
232
- });
233
- }
234
- updateDependentFieldsFullName(fields) {
235
- fields.forEach((field) => {
236
- if (field.formControl && field.updateTabularField) {
237
- field.formControl.valueChanges.subscribe((value) => {
238
- this.updateLabelValueForField(field, value);
239
- });
240
- }
241
- if (field.fieldGroup) {
242
- this.updateDependentFieldsFullName(field.fieldGroup);
243
- }
244
- });
245
- }
246
- updateLabelValueForField(field, value) {
247
- const options$ = field.props?.options;
248
- if (options$ && typeof options$.subscribe === 'function') {
249
- options$.subscribe((options) => {
250
- const updateFieldKey = field.updateTabularField;
251
- const selectedOption = options.find((option) => option.value === value);
252
- if (selectedOption) {
253
- this.model[updateFieldKey] = selectedOption.label;
254
- }
255
- });
256
- }
257
- }
258
- isFilesUploaded() {
259
- return true;
260
- }
261
- generateSequentialIdNumber(parentModel) {
262
- if (parentModel?.[this.propsOfDialog?.['parenetModelKeyToGenerateSequentialNumber']]?.length) {
263
- const latestRecordIdNumber = parentModel?.[this.propsOfDialog?.['parenetModelKeyToGenerateSequentialNumber']]?.sort((a, b) => +(b?.sequentialNumberId) - +(a?.sequentialNumberId))?.find((parenData) => +(parenData?.sequentialNumberId));
264
- return +(latestRecordIdNumber?.sequentialNumberId) + 1;
265
- }
266
- return 1;
267
- }
268
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TabularFormDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FormlyFormBuilder }, { token: i3.TranslateService }, { token: i1.MatDialog }, { token: i0.ElementRef }, { token: i4.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); }
269
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TabularFormDialogComponent, isStandalone: true, selector: "mu-app-add-data-dialog", outputs: { saveData: "saveData" }, ngImport: i0, template: `
270
- <h1 mat-dialog-title>{{ dialogLabel | translate}}</h1>
271
- <div mat-dialog-content class="min-h-max !pt-1 !flex">
272
- <formly-form
273
- [ngStyle]="{'width': (propsOfDialog && propsOfDialog?.viewDocSideBySide && !isMobileDevice) ? '50%' : ''}"
274
- [form]="form"
275
- [fields]="fields"
276
- [model]="model"
277
- [options]="options"
278
- (modelChange)="onModelChange($event)"
279
- ></formly-form>
280
- <iframe id="dialogIframe" *ngIf="propsOfDialog && propsOfDialog?.viewDocSideBySide && !isMobileDevice" [ngStyle]="{'width': (propsOfDialog && propsOfDialog?.viewDocSideBySide && !isMobileDevice) ? '50%' : ''}" frameborder="0"></iframe>
281
- </div>
282
- <div mat-dialog-actions>
283
- <button mat-button (click)="onCancel()">{{'TABULAR_FORM_DIALOG.CANCEL' | translate}}</button>
284
- <button mat-button *ngIf="!selectedRowData && !propsOfDialog.hideSaveAndAddNew" (click)="onSaveAddNew()" [disabled]="form.invalid || !isFilesUploaded()">{{'TABULAR_FORM_DIALOG.SAVE_AND_NEW' | translate}}</button>
285
- <button mat-button *ngIf="!selectedRowData" (click)="onSave()" [disabled]="form.invalid || !isFilesUploaded()">{{'TABULAR_FORM_DIALOG.ADD' | translate}}</button>
286
- <button mat-button *ngIf="selectedRowData && !data.hideUpdateBtn" (click)="onSave()" [disabled]="form.invalid || !isFilesUploaded()">{{'TABULAR_FORM_DIALOG.EDIT' | translate}}</button>
287
- </div>
288
- <ngx-spinner name="tabular-dialog" bdColor="rgba(0, 0, 0, 0.2)" size="medium" color="#fff" template="<img src='assets/images/lupin-icongif.gif' style='height: 70px !important;'/>"
289
- [fullScreen]="true">
290
- </ngx-spinner>
291
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i2.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: NgxSpinnerModule }, { kind: "component", type: i7.NgxSpinnerComponent, selector: "ngx-spinner", inputs: ["bdColor", "size", "color", "type", "fullScreen", "name", "zIndex", "template", "showSpinner", "disableAnimation"] }] }); }
292
- }
293
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TabularFormDialogComponent, decorators: [{
294
- type: Component,
295
- args: [{
296
- selector: 'mu-app-add-data-dialog',
297
- standalone: true,
298
- imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatRadioModule, MatCheckboxModule,
299
- MatDialogModule, FormlyModule, TranslateModule, MatButtonModule, NgxSpinnerModule
300
- ],
301
- template: `
302
- <h1 mat-dialog-title>{{ dialogLabel | translate}}</h1>
303
- <div mat-dialog-content class="min-h-max !pt-1 !flex">
304
- <formly-form
305
- [ngStyle]="{'width': (propsOfDialog && propsOfDialog?.viewDocSideBySide && !isMobileDevice) ? '50%' : ''}"
306
- [form]="form"
307
- [fields]="fields"
308
- [model]="model"
309
- [options]="options"
310
- (modelChange)="onModelChange($event)"
311
- ></formly-form>
312
- <iframe id="dialogIframe" *ngIf="propsOfDialog && propsOfDialog?.viewDocSideBySide && !isMobileDevice" [ngStyle]="{'width': (propsOfDialog && propsOfDialog?.viewDocSideBySide && !isMobileDevice) ? '50%' : ''}" frameborder="0"></iframe>
313
- </div>
314
- <div mat-dialog-actions>
315
- <button mat-button (click)="onCancel()">{{'TABULAR_FORM_DIALOG.CANCEL' | translate}}</button>
316
- <button mat-button *ngIf="!selectedRowData && !propsOfDialog.hideSaveAndAddNew" (click)="onSaveAddNew()" [disabled]="form.invalid || !isFilesUploaded()">{{'TABULAR_FORM_DIALOG.SAVE_AND_NEW' | translate}}</button>
317
- <button mat-button *ngIf="!selectedRowData" (click)="onSave()" [disabled]="form.invalid || !isFilesUploaded()">{{'TABULAR_FORM_DIALOG.ADD' | translate}}</button>
318
- <button mat-button *ngIf="selectedRowData && !data.hideUpdateBtn" (click)="onSave()" [disabled]="form.invalid || !isFilesUploaded()">{{'TABULAR_FORM_DIALOG.EDIT' | translate}}</button>
319
- </div>
320
- <ngx-spinner name="tabular-dialog" bdColor="rgba(0, 0, 0, 0.2)" size="medium" color="#fff" template="<img src='assets/images/lupin-icongif.gif' style='height: 70px !important;'/>"
321
- [fullScreen]="true">
322
- </ngx-spinner>
323
- `
324
- }]
325
- }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
326
- type: Inject,
327
- args: [MAT_DIALOG_DATA]
328
- }] }, { type: i2.FormlyFormBuilder }, { type: i3.TranslateService }, { type: i1.MatDialog }, { type: i0.ElementRef }, { type: i4.BreakpointObserver }], propDecorators: { saveData: [{
329
- type: Output
330
- }] } });
331
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFidWxhci1mb3JtLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Zvcm0vc3JjL2xpYi90eXBlcy90YWJ1bGFyLWZvcm0tZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXNCLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFhLGVBQWUsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQXFCLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQW9CLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFB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QUMsU0FBdUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7WUFDMVUsT0FBTyxDQUFDLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQzsrR0F4U1UsMEJBQTBCLDhDQWdCM0IsZUFBZTttR0FoQmQsMEJBQTBCLHFIQXhCM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQlQsMkRBekJTLFlBQVksdU5BQUUsbUJBQW1CLDhCQUFFLGtCQUFrQiw4QkFBRSxjQUFjLDhCQUFFLGVBQWUsOEJBQUUsY0FBYyw4QkFBRSxpQkFBaUIsOEJBQ2pJLGVBQWUseWJBQUUsWUFBWSw2S0FBRSxlQUFlLDJGQUFFLGVBQWUsMk5BQUUsZ0JBQWdCOzs0RkEwQnhFLDBCQUEwQjtrQkE5QnRDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxpQkFBaUI7d0JBQ2pJLGVBQWUsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0I7cUJBQ2xGO29CQUNELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCVDtpQkFDRjs7MEJBaUJJLE1BQU07MkJBQUMsZUFBZTswTEFUZixRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnJlYWtwb2ludE9ic2VydmVyLCBCcmVha3BvaW50cyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRGVzdHJveVJlZiwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIEluamVjdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZywgTWF0RGlhbG9nTW9kdWxlLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdFJhZGlvTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IEZvcm1seUZvcm1CdWlsZGVyLCBGb3JtbHlNb2R1bGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTmd4U3Bpbm5lck1vZHVsZSB9IGZyb20gJ25neC1zcGlubmVyJztcbmltcG9ydCB7IGZvcmtKb2luLCBvZiwgdGFrZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybWF0aW9uLWRpYWxvZy9jb25maXJtYXRpb24tZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDdXN0b21Gb3JtbHlGaWVsZENvbmZpZyB9IGZyb20gJy4uL21vZGVscy9jdXN0b20tZm9ybS1maWVsZC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ211LWFwcC1hZGQtZGF0YS1kaWFsb2cnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBNYXRGb3JtRmllbGRNb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRTZWxlY3RNb2R1bGUsIE1hdFJhZGlvTW9kdWxlLCBNYXRDaGVja2JveE1vZHVsZSxcbiAgICBNYXREaWFsb2dNb2R1bGUsIEZvcm1seU1vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE5neFNwaW5uZXJNb2R1bGVcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aDEgbWF0LWRpYWxvZy10aXRsZT57eyBkaWFsb2dMYWJlbCB8IHRyYW5zbGF0ZX19PC9oMT5cbiAgICA8ZGl2IG1hdC1kaWFsb2ctY29udGVudCBjbGFzcz1cIm1pbi1oLW1heCAhcHQtMSAhZmxleFwiPlxuICAgICAgPGZvcm1seS1mb3JtXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiAocHJvcHNPZkRpYWxvZyAmJiBwcm9wc09mRGlhbG9nPy52aWV3RG9jU2lkZUJ5U2lkZSAmJiAhaXNNb2JpbGVEZXZpY2UpID8gJzUwJScgOiAnJ31cIlxuICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIlxuICAgICAgICAgICAgICAgIFtmaWVsZHNdPVwiZmllbGRzXCJcbiAgICAgICAgICAgICAgICBbbW9kZWxdPVwibW9kZWxcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIm9wdGlvbnNcIlxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJvbk1vZGVsQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+PC9mb3JtbHktZm9ybT5cbiAgICAgICAgPGlmcmFtZSBpZD1cImRpYWxvZ0lmcmFtZVwiICpuZ0lmPVwicHJvcHNPZkRpYWxvZyAmJiBwcm9wc09mRGlhbG9nPy52aWV3RG9jU2lkZUJ5U2lkZSAmJiAhaXNNb2JpbGVEZXZpY2VcIiBbbmdTdHlsZV09XCJ7J3dpZHRoJzogKHByb3BzT2ZEaWFsb2cgJiYgcHJvcHNPZkRpYWxvZz8udmlld0RvY1NpZGVCeVNpZGUgJiYgIWlzTW9iaWxlRGV2aWNlKSA/ICc1MCUnIDogJyd9XCIgZnJhbWVib3JkZXI9XCIwXCI+PC9pZnJhbWU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj57eydUQUJVTEFSX0ZPUk1fRElBTE9HLkNBTkNFTCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uICpuZ0lmPVwiIXNlbGVjdGVkUm93RGF0YSAmJiAhcHJvcHNPZkRpYWxvZy5oaWRlU2F2ZUFuZEFkZE5ld1wiIChjbGljayk9XCJvblNhdmVBZGROZXcoKVwiIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWQgfHwgIWlzRmlsZXNVcGxvYWRlZCgpXCI+e3snVEFCVUxBUl9GT1JNX0RJQUxPRy5TQVZFX0FORF9ORVcnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cIiFzZWxlY3RlZFJvd0RhdGFcIiAoY2xpY2spPVwib25TYXZlKClcIiBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkIHx8ICFpc0ZpbGVzVXBsb2FkZWQoKVwiPnt7J1RBQlVMQVJfRk9STV9ESUFMT0cuQUREJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gKm5nSWY9XCJzZWxlY3RlZFJvd0RhdGEgJiYgIWRhdGEuaGlkZVVwZGF0ZUJ0blwiIChjbGljayk9XCJvblNhdmUoKVwiIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWQgfHwgIWlzRmlsZXNVcGxvYWRlZCgpXCI+e3snVEFCVUxBUl9GT1JNX0RJQUxPRy5FRElUJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPG5neC1zcGlubmVyIG5hbWU9XCJ0YWJ1bGFyLWRpYWxvZ1wiIGJkQ29sb3I9XCJyZ2JhKDAsIDAsIDAsIDAuMilcIiBzaXplPVwibWVkaXVtXCIgY29sb3I9XCIjZmZmXCIgdGVtcGxhdGU9XCI8aW1nIHNyYz0nYXNzZXRzL2ltYWdlcy9sdXBpbi1pY29uZ2lmLmdpZicgc3R5bGU9J2hlaWdodDogNzBweCAhaW1wb3J0YW50OycvPlwiXG4gICAgICBbZnVsbFNjcmVlbl09XCJ0cnVlXCI+XG4gICAgPC9uZ3gtc3Bpbm5lcj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBUYWJ1bGFyRm9ybURpYWxvZ0NvbXBvbmVudCB7XG4gIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgZmllbGRDb25maWc6IGFueVtdO1xuICBmaWVsZHMhOiBDdXN0b21Gb3JtbHlGaWVsZENvbmZpZ1tdO1xuICBtb2RlbDogYW55O1xuICBvcHRpb25zOiBhbnk7XG4gIGRpYWxvZ0xhYmVsPSAnJztcbiAgQE91dHB1dCgpIHNhdmVEYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIHNlbGVjdGVkUm93RGF0YTphbnk7XG4gIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByb3BzT2ZEaWFsb2c6IGFueTtcbiAgcGFyZW50TW9kZWw6IGFueTtcbiAgaXNNb2JpbGVEZXZpY2UgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8VGFidWxhckZvcm1EaWFsb2dDb21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LFxuICAgIHByaXZhdGUgZm9ybWx5QnVpbGRlcjogRm9ybWx5Rm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWF0RGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBob3N0RWxlbWVudDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyLFxuICApIHtcbiAgICB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlcj8ub2JzZXJ2ZShbQnJlYWtwb2ludHMuSGFuZHNldF0pLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICB0aGlzLmlzTW9iaWxlRGV2aWNlID0gcmVzdWx0Py5tYXRjaGVzO1xuICAgIH0pO1xuICAgIHRoaXMuZmllbGRDb25maWcgPSBkYXRhLmZpZWxkQ29uZmlnO1xuICAgIHRoaXMuc2VsZWN0ZWRSb3dEYXRhID0gZGF0YS5zZWxlY3RlZFJvd0RhdGE7XG4gICAgaWYgKGRhdGE/LnNlbGVjdGVkUm93RGF0YSkge1xuICAgICAgdGhpcy5tb2RlbCA9IGRhdGE/LnNlbGVjdGVkUm93RGF0YTtcbiAgICB9XG4gICAgdGhpcy5wcm9wc09mRGlhbG9nID0gZGF0YS50YWJ1bGFyUHJvcHM7XG4gICAgdGhpcy5kaWFsb2dMYWJlbCA9IGRhdGEubGFiZWw7XG4gICAgdGhpcy5maWVsZHMgPSB0aGlzLnRyYW5zbGF0ZUZvcm1Db25maWcoZGF0YS5maWVsZENvbmZpZyk7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgZm9ybVN0YXRlOiBkYXRhPy5mb3JtU3RhdGVcbiAgICB9XG4gICAgdGhpcy5wYXJlbnRNb2RlbCA9IGRhdGE/LnBhcmVudE1vZGVsO1xuXG4gICAgdGhpcy5mb3JtbHlCdWlsZGVyLmJ1aWxkRm9ybSh0aGlzLmZvcm0sIHRoaXMuZmllbGRzLCB0aGlzLm1vZGVsLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMudXBkYXRlRGVwZW5kZW50RmllbGRzRnVsbE5hbWUodGhpcy5maWVsZHMpO1xuICB9XG5cblxuICBwcml2YXRlIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgfVxuXG4gIG9uU2F2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICBpZiAodGhpcy5maWVsZHNbMF0/LmNvbmZpcm1hdGlvbkRpYWxvZ1Byb3BzPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29uZmlybWF0aW9uRGlhbG9ncyA9IHRoaXMuZmllbGRzWzBdLmNvbmZpcm1hdGlvbkRpYWxvZ1Byb3BzXG4gICAgICAgICAgLmZpbHRlcigoY29uZmlybWF0aW9uRGlhbG9nUHJvcDogYW55KSA9PiBjb25maXJtYXRpb25EaWFsb2dQcm9wPy5lbmFibGVDb25maXJtYXRpb24pXG4gICAgICAgICAgLm1hcCgoY29uZmlybWF0aW9uRGlhbG9nUHJvcDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFjb25maXJtYXRpb25EaWFsb2dQcm9wPy5lbmFibGVDb25maXJtYXRpb25EaWFsb2dGb3JSb2xlcz8ubGVuZ3RoIHx8XG4gICAgICAgICAgICAgIGNvbmZpcm1hdGlvbkRpYWxvZ1Byb3A/LmVuYWJsZUNvbmZpcm1hdGlvbkRpYWxvZ0ZvclJvbGVzPy5zb21lKChyb2xlOiBzdHJpbmcpID0+IHRoaXMub3B0aW9ucz8uZm9ybVN0YXRlPy51c2VyUm9sZXM/LmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmKGNvbmZpcm1hdGlvbkRpYWxvZ1Byb3A/LnNob3dGb3JDaGFuZ2VSZXF1ZXN0T25seSkge1xuICAgICAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5mb3JtU3RhdGUuc2hvd09sZFZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5tYXREaWFsb2cub3BlbihDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6Y29uZmlybWF0aW9uRGlhbG9nUHJvcD8uWydtaW5XaWR0aCddID8/ICc0MCUnLFxuICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogY29uZmlybWF0aW9uRGlhbG9nUHJvcD8uWydtYXhXaWR0aCddID8/ICcxMDAlJyxcbiAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiBjb25maXJtYXRpb25EaWFsb2dQcm9wPy5bJ21pbkhlaWdodCddID8/ICczMCUnLFxuICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IGNvbmZpcm1hdGlvbkRpYWxvZ1Byb3A/LlsnbWF4SGVpZ2h0J10gPz8gJzQwJScsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoY29uZmlybWF0aW9uRGlhbG9nUHJvcD8uZGF0YT8udGl0bGUpLFxuICAgICAgICAgICAgICAgICAgICAgIHNob3dPazogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkucGlwZSh0YWtlKDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5tYXREaWFsb2cub3BlbihDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBjb25maXJtYXRpb25EaWFsb2dQcm9wPy5bJ3dpZHRoJ10gPz8gJzMwJScsXG4gICAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IGNvbmZpcm1hdGlvbkRpYWxvZ1Byb3A/LlsnbWluSGVpZ2h0J10gPz8gJzMwJScsXG4gICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IGNvbmZpcm1hdGlvbkRpYWxvZ1Byb3A/LlsnbWF4SGVpZ2h0J10gPz8gJzQwJScsXG4gICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChjb25maXJtYXRpb25EaWFsb2dQcm9wPy5kYXRhPy50aXRsZSksXG4gICAgICAgICAgICAgICAgICAgIHNob3dPazogdHJ1ZVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnBpcGUodGFrZSgxKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29uZmlybWF0aW9uRGlhbG9ncy5sZW5ndGgpIHtcbiAgICAgICAgICBmb3JrSm9pbihjb25maXJtYXRpb25EaWFsb2dzKVxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICAuLi50aGlzLmZvcm0udmFsdWUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2Uoe1xuICAgICAgICAgICAgLi4udGhpcy5tb2RlbCxcbiAgICAgICAgICAgIC4uLnRoaXMuZm9ybS52YWx1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2Uoe1xuICAgICAgICAgIC4uLnRoaXMubW9kZWwsXG4gICAgICAgICAgLi4udGhpcy5mb3JtLnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xuICB9XG5cbiAgb25TYXZlQWRkTmV3KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgIGNvbnN0IGRhdGFUb1NhdmUgPSB7XG4gICAgICAgIC4uLnRoaXMubW9kZWwsXG4gICAgICAgIC4uLnRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpLFxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuZmllbGRzWzBdPy5jb25maXJtYXRpb25EaWFsb2dQcm9wcz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpcm1hdGlvbkRpYWxvZ3MgPSB0aGlzLmZpZWxkc1swXS5jb25maXJtYXRpb25EaWFsb2dQcm9wc1xuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoY29uZmlybWF0aW9uRGlhbG9nUHJvcDogYW55KSA9PlxuICAgICAgICAgICAgICBjb25maXJtYXRpb25EaWFsb2dQcm9wPy5lbmFibGVDb25maXJtYXRpb25cbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgoY29uZmlybWF0aW9uRGlhbG9nUHJvcDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFjb25maXJtYXRpb25EaWFsb2dQcm9wPy5lbmFibGVDb25maXJtYXRpb25EaWFsb2dGb3JSb2xlc1xuICAgICAgICAgICAgICAgID8ubGVuZ3RoIHx8XG4gICAgICAgICAgICAgIGNvbmZpcm1hdGlvbkRpYWxvZ1Byb3A/LmVuYWJsZUNvbmZpcm1hdGlvbkRpYWxvZ0ZvclJvbGVzPy5zb21lKFxuICAgICAgICAgICAgICAgIChyb2xlOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnM/LmZvcm1TdGF0ZT8udXNlclJvbGVzPy5pbmNsdWRlcyhyb2xlKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKGNvbmZpcm1hdGlvbkRpYWxvZ1Byb3A/LnNob3dGb3JDaGFuZ2VSZXF1ZXN0T25seSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybVN0YXRlLnNob3dPbGRWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMubWF0RGlhbG9nLm9wZW4oXG4gICAgICAgICAgICAgICAgICAgIENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBjb25maXJtYXRpb25EaWFsb2dQcm9wPy5bJ3dpZHRoJ10gPz8gJzMwJScsXG4gICAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiBjb25maXJtYXRpb25EaWFsb2dQcm9wPy5bJ21pbkhlaWdodCddID8/ICczMCUnLFxuICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogY29uZmlybWF0aW9uRGlhbG9nUHJvcD8uWydtYXhIZWlnaHQnXSA/PyAnNDAlJyxcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbkRpYWxvZ1Byb3A/LmRhdGE/LnRpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd09rOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkucGlwZSh0YWtlKDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5tYXREaWFsb2cub3BlbihcbiAgICAgICAgICAgICAgICAgIENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNvbmZpcm1hdGlvbkRpYWxvZ1Byb3A/Llsnd2lkdGgnXSA/PyAnMzAlJyxcbiAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiBjb25maXJtYXRpb25EaWFsb2dQcm9wPy5bJ21pbkhlaWdodCddID8/ICczMCUnLFxuICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IGNvbmZpcm1hdGlvbkRpYWxvZ1Byb3A/LlsnbWF4SGVpZ2h0J10gPz8gJzQwJScsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtYXRpb25EaWFsb2dQcm9wPy5kYXRhPy50aXRsZVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgc2hvd09rOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5waXBlKHRha2UoMSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbmZpcm1hdGlvbkRpYWxvZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgZm9ya0pvaW4oY29uZmlybWF0aW9uRGlhbG9ncylcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHNPZkRpYWxvZz8uWydpc1NlcXVlbnRpYWxOdW1HZW5lcmF0aW9uUmVxdWlyZWQnXSkge1xuICAgICAgICAgICAgICAgIGRhdGFUb1NhdmUuc2VxdWVudGlhbE51bWJlcklkID0gYDAwMCR7dGhpcy5nZW5lcmF0ZVNlcXVlbnRpYWxJZE51bWJlcihcbiAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TW9kZWxcbiAgICAgICAgICAgICAgICApfWA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zYXZlRGF0YS5lbWl0KGRhdGFUb1NhdmUpO1xuICAgICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMucHJvcHNPZkRpYWxvZz8uWydpc1NlcXVlbnRpYWxOdW1HZW5lcmF0aW9uUmVxdWlyZWQnXSkge1xuICAgICAgICAgICAgZGF0YVRvU2F2ZS5zZXF1ZW50aWFsTnVtYmVySWQgPSBgMDAwJHt0aGlzLmdlbmVyYXRlU2VxdWVudGlhbElkTnVtYmVyKFxuICAgICAgICAgICAgICB0aGlzLnBhcmVudE1vZGVsXG4gICAgICAgICAgICApfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2F2ZURhdGEuZW1pdChkYXRhVG9TYXZlKTtcbiAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5wcm9wc09mRGlhbG9nPy5bJ2lzU2VxdWVudGlhbE51bUdlbmVyYXRpb25SZXF1aXJlZCddKSB7XG4gICAgICAgICAgZGF0YVRvU2F2ZS5zZXF1ZW50aWFsTnVtYmVySWQgPSBgMDAwJHt0aGlzLmdlbmVyYXRlU2VxdWVudGlhbElkTnVtYmVyKFxuICAgICAgICAgICAgdGhpcy5wYXJlbnRNb2RlbFxuICAgICAgICAgICl9YDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNhdmVEYXRhLmVtaXQoZGF0YVRvU2F2ZSk7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdHJhbnNsYXRlRm9ybUNvbmZpZyhcbiAgICBjb25maWc6IEN1c3RvbUZvcm1seUZpZWxkQ29uZmlnW11cbiAgKTogQ3VzdG9tRm9ybWx5RmllbGRDb25maWdbXSB7XG4gICAgcmV0dXJuIGNvbmZpZy5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoZmllbGQucHJvcHM/LmxhYmVsKSB7XG4gICAgICAgIGZpZWxkLmV4cHJlc3Npb25zID0ge1xuICAgICAgICAgIC4uLmZpZWxkLmV4cHJlc3Npb25zLFxuICAgICAgICAgICdwcm9wcy5sYWJlbCc6IHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oZmllbGQucHJvcHMubGFiZWwgfHwgJycpLFxuICAgICAgICAgICdwcm9wcy50b29sdGlwJzogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbShcbiAgICAgICAgICAgIGZpZWxkLnByb3BzLmxhYmVsIHx8ICcnXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5wcm9wcz8ucGxhY2Vob2xkZXIpIHtcbiAgICAgICAgZmllbGQuZXhwcmVzc2lvbnMgPSB7XG4gICAgICAgICAgLi4uZmllbGQuZXhwcmVzc2lvbnMsXG4gICAgICAgICAgJ3Byb3BzLnBsYWNlaG9sZGVyJzogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbShcbiAgICAgICAgICAgIGZpZWxkLnByb3BzLnBsYWNlaG9sZGVyIHx8ICcnXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5maWVsZEdyb3VwKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlRm9ybUNvbmZpZyhmaWVsZC5maWVsZEdyb3VwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9KTtcbiAgfVxuXG4gIG9uTW9kZWxDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMubW9kZWwgPSBldmVudDtcbiAgICB0aGlzLnN1YnNjcmliZVRvRGVwZW5kZW5jaWVzKHRoaXMuZmllbGRzLCB0aGlzLmZvcm0sIHRoaXMubW9kZWwpO1xuICB9XG5cbiAgc3Vic2NyaWJlVG9EZXBlbmRlbmNpZXMoZmllbGRzOiBDdXN0b21Gb3JtbHlGaWVsZENvbmZpZ1tdLCBmb3JtOiBGb3JtR3JvdXAsIHZlbmRvck1vZGVsOiBhbnkpIHtcbiAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmZpZWxkR3JvdXApIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0RlcGVuZGVuY2llcyhmaWVsZC5maWVsZEdyb3VwLCBmb3JtLCB2ZW5kb3JNb2RlbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVEZXBlbmRlbnRGaWVsZHNGdWxsTmFtZShmaWVsZHM6IGFueSkge1xuICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICBpZihmaWVsZC5mb3JtQ29udHJvbCAmJiBmaWVsZC51cGRhdGVUYWJ1bGFyRmllbGQpIHtcbiAgICAgICAgZmllbGQuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMudXBkYXRlTGFiZWxWYWx1ZUZvckZpZWxkKGZpZWxkLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLmZpZWxkR3JvdXApIHtcbiAgICAgICAgdGhpcy51cGRhdGVEZXBlbmRlbnRGaWVsZHNGdWxsTmFtZShmaWVsZC5maWVsZEdyb3VwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUxhYmVsVmFsdWVGb3JGaWVsZChmaWVsZDogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3Qgb3B0aW9ucyQgPSBmaWVsZC5wcm9wcz8ub3B0aW9ucztcbiAgICBpZiAob3B0aW9ucyQgJiYgdHlwZW9mIG9wdGlvbnMkLnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0aW9ucyQuc3Vic2NyaWJlKChvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlRmllbGRLZXkgPSBmaWVsZC51cGRhdGVUYWJ1bGFyRmllbGQ7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gb3B0aW9ucy5maW5kKChvcHRpb246IGFueSkgPT4gb3B0aW9uLnZhbHVlID09PSB2YWx1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICAgIHRoaXMubW9kZWxbdXBkYXRlRmllbGRLZXldID0gc2VsZWN0ZWRPcHRpb24ubGFiZWw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlzRmlsZXNVcGxvYWRlZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdlbmVyYXRlU2VxdWVudGlhbElkTnVtYmVyKHBhcmVudE1vZGVsOiBhbnkpIHtcbiAgICBpZiAocGFyZW50TW9kZWw/Llt0aGlzLnByb3BzT2ZEaWFsb2c/LlsncGFyZW5ldE1vZGVsS2V5VG9HZW5lcmF0ZVNlcXVlbnRpYWxOdW1iZXInXV0/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgbGF0ZXN0UmVjb3JkSWROdW1iZXIgPSBwYXJlbnRNb2RlbD8uW3RoaXMucHJvcHNPZkRpYWxvZz8uWydwYXJlbmV0TW9kZWxLZXlUb0dlbmVyYXRlU2VxdWVudGlhbE51bWJlciddXT8uc29ydCgoYTogeyBzZXF1ZW50aWFsTnVtYmVySWQ6IG51bWJlcjsgfSwgYjogeyBzZXF1ZW50aWFsTnVtYmVySWQ6IG51bWJlcjsgfSkgPT4gKyhiPy5zZXF1ZW50aWFsTnVtYmVySWQpIC0gKyhhPy5zZXF1ZW50aWFsTnVtYmVySWQpKT8uZmluZCgocGFyZW5EYXRhOiB7IHNlcXVlbnRpYWxOdW1iZXJJZDogYW55OyB9KSA9PiArKHBhcmVuRGF0YT8uc2VxdWVudGlhbE51bWJlcklkKSk7XG4gICAgICByZXR1cm4gKyhsYXRlc3RSZWNvcmRJZE51bWJlcj8uc2VxdWVudGlhbE51bWJlcklkKSArIDE7XG4gICAgfVxuICAgIHJldHVybiAxO1xuICB9XG59Il19