@firestitch/form 18.0.9 → 18.0.11
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/app/components/confirm-unsaved/confirm-unsaved.component.d.ts +1 -1
- package/app/directives/button.directive.d.ts +9 -14
- package/app/directives/form/form.directive.d.ts +12 -22
- package/app/directives/form-base/form-base.directive.d.ts +32 -0
- package/app/directives/form-base/index.d.ts +1 -0
- package/app/directives/form-group/form-group.directive.d.ts +15 -0
- package/app/directives/form-group/index.d.ts +1 -0
- package/app/directives/index.d.ts +3 -2
- package/app/fs-form.module.d.ts +2 -2
- package/app/interfaces/submit-event.d.ts +2 -2
- package/app/interfaces/submitted-event.d.ts +2 -5
- package/app/services/fsform.service.d.ts +3 -8
- package/esm2022/app/components/confirm-unsaved/confirm-unsaved.component.mjs +11 -6
- package/esm2022/app/components/form-dialog-actions/form-dialog-actions.component.mjs +1 -1
- package/esm2022/app/directives/button.directive.mjs +24 -52
- package/esm2022/app/directives/form/form.directive.mjs +96 -160
- package/esm2022/app/directives/form-base/form-base.directive.mjs +104 -0
- package/esm2022/app/directives/form-base/index.mjs +2 -0
- package/esm2022/app/directives/form-group/form-group.directive.mjs +34 -0
- package/esm2022/app/directives/form-group/index.mjs +2 -0
- package/esm2022/app/directives/index.mjs +4 -3
- package/esm2022/app/fs-form.module.mjs +8 -5
- package/esm2022/app/guards/form-deactivate.guard.mjs +2 -2
- package/esm2022/app/interfaces/submit-event.mjs +1 -1
- package/esm2022/app/interfaces/submitted-event.mjs +1 -1
- package/esm2022/app/services/fsform.service.mjs +12 -30
- package/esm2022/public_api.mjs +2 -1
- package/fesm2022/firestitch-form.mjs +306 -281
- package/fesm2022/firestitch-form.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/styles.scss +28 -29
|
@@ -1,34 +1,37 @@
|
|
|
1
|
-
import { ChangeDetectorRef,
|
|
1
|
+
import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, HostBinding, Inject, Input, NgZone, Optional, Output, } from '@angular/core';
|
|
2
2
|
import { NgForm } from '@angular/forms';
|
|
3
3
|
import { ActivatedRoute } from '@angular/router';
|
|
4
4
|
import { MatDialogRef } from '@angular/material/dialog';
|
|
5
|
-
import { MatTabGroup } from '@angular/material/tabs';
|
|
6
5
|
import { guid } from '@firestitch/common';
|
|
7
6
|
import { DrawerRef } from '@firestitch/drawer';
|
|
8
7
|
import { FsMessage, MessageMode } from '@firestitch/message';
|
|
9
|
-
import { BehaviorSubject, defer, fromEvent, iif, of,
|
|
10
|
-
import { catchError, delay, filter, first, map,
|
|
8
|
+
import { BehaviorSubject, defer, fromEvent, iif, of, throwError, } from 'rxjs';
|
|
9
|
+
import { catchError, delay, filter, first, map, mergeMap, startWith, switchMap, take, takeUntil, tap, } from 'rxjs/operators';
|
|
11
10
|
import { FormDeactivateGuard } from '../../guards/form-deactivate.guard';
|
|
12
11
|
import { confirmResultContinue } from '../../helpers/confirm-result-continue';
|
|
13
12
|
import { getActiveRoute } from '../../helpers/get-active-route';
|
|
14
13
|
import { getFormErrors } from '../../helpers/get-form-errors';
|
|
15
14
|
import { FsForm } from '../../services/fsform.service';
|
|
15
|
+
import { FsFormBaseDirective } from '../form-base';
|
|
16
|
+
import { FsFormGroupDirective } from '../form-group';
|
|
16
17
|
import { ConfirmResult } from './../../enums/confirm-result';
|
|
17
18
|
import { FormStatus } from './../../enums/form-status';
|
|
18
19
|
import * as i0 from "@angular/core";
|
|
19
20
|
import * as i1 from "../../services/fsform.service";
|
|
20
21
|
import * as i2 from "@firestitch/message";
|
|
21
|
-
import * as i3 from "
|
|
22
|
-
import * as i4 from "@angular/
|
|
23
|
-
import * as i5 from "@angular/
|
|
24
|
-
import * as i6 from "@
|
|
25
|
-
|
|
22
|
+
import * as i3 from "../form-group";
|
|
23
|
+
import * as i4 from "@angular/router";
|
|
24
|
+
import * as i5 from "@angular/forms";
|
|
25
|
+
import * as i6 from "@angular/material/dialog";
|
|
26
|
+
import * as i7 from "@firestitch/drawer";
|
|
27
|
+
export class FsFormDirective extends FsFormBaseDirective {
|
|
26
28
|
ngForm;
|
|
27
29
|
_form;
|
|
28
30
|
_element;
|
|
29
31
|
_message;
|
|
30
32
|
_ngZone;
|
|
31
33
|
_cdRef;
|
|
34
|
+
_formGroup;
|
|
32
35
|
_dialogRef;
|
|
33
36
|
_drawerRef;
|
|
34
37
|
_route;
|
|
@@ -42,7 +45,6 @@ export class FsFormDirective {
|
|
|
42
45
|
confirmDialog = true;
|
|
43
46
|
confirmDrawer = true;
|
|
44
47
|
confirmBrowser = true;
|
|
45
|
-
confirmTabs = true;
|
|
46
48
|
dirtySubmitButton = true;
|
|
47
49
|
set submit(submit$) {
|
|
48
50
|
this._submit$ = submit$;
|
|
@@ -52,7 +54,6 @@ export class FsFormDirective {
|
|
|
52
54
|
}
|
|
53
55
|
successDelay = 0;
|
|
54
56
|
errorDelay = 1000;
|
|
55
|
-
tabGroup;
|
|
56
57
|
deactivationGuard = true;
|
|
57
58
|
submitEvent = new EventEmitter();
|
|
58
59
|
invalid = new EventEmitter();
|
|
@@ -61,24 +62,21 @@ export class FsFormDirective {
|
|
|
61
62
|
reseted = new EventEmitter();
|
|
62
63
|
cleared = new EventEmitter();
|
|
63
64
|
fsFormClass = true;
|
|
64
|
-
_tabGroups = new QueryList();
|
|
65
|
-
_buttons = new QueryList();
|
|
66
65
|
_registerControl;
|
|
67
|
-
_activeSubmitButton;
|
|
68
66
|
_dialogBackdropEscape = false;
|
|
69
67
|
_snapshot = {};
|
|
70
68
|
_activatedRouteConfig;
|
|
71
69
|
_status$ = new BehaviorSubject(FormStatus.Valid);
|
|
72
|
-
_destroy$ = new Subject();
|
|
73
|
-
_confirmed = false;
|
|
74
70
|
_submit$ = null;
|
|
75
|
-
constructor(ngForm, _form, _element, _message, _ngZone, _cdRef, _dialogRef, _drawerRef, _route) {
|
|
71
|
+
constructor(ngForm, _form, _element, _message, _ngZone, _cdRef, _formGroup, _dialogRef, _drawerRef, _route) {
|
|
72
|
+
super();
|
|
76
73
|
this.ngForm = ngForm;
|
|
77
74
|
this._form = _form;
|
|
78
75
|
this._element = _element;
|
|
79
76
|
this._message = _message;
|
|
80
77
|
this._ngZone = _ngZone;
|
|
81
78
|
this._cdRef = _cdRef;
|
|
79
|
+
this._formGroup = _formGroup;
|
|
82
80
|
this._dialogRef = _dialogRef;
|
|
83
81
|
this._drawerRef = _drawerRef;
|
|
84
82
|
this._route = _route;
|
|
@@ -99,7 +97,6 @@ export class FsFormDirective {
|
|
|
99
97
|
};
|
|
100
98
|
}
|
|
101
99
|
get _formValidState$() {
|
|
102
|
-
this._form.broadcast('valid', this._submitEvent);
|
|
103
100
|
this.submitEvent.emit(this._submitEvent);
|
|
104
101
|
this.valid.emit(this._submitEvent);
|
|
105
102
|
const submittedEvent = {
|
|
@@ -113,10 +110,9 @@ export class FsFormDirective {
|
|
|
113
110
|
.pipe(map((response) => {
|
|
114
111
|
submittedEvent.response = response;
|
|
115
112
|
return submittedEvent;
|
|
116
|
-
}), takeUntil(this.
|
|
113
|
+
}), takeUntil(this.destroy$));
|
|
117
114
|
}
|
|
118
115
|
get _formInvalidState$() {
|
|
119
|
-
this._form.broadcast('invalid', this._submitEvent);
|
|
120
116
|
if (this.invalid) {
|
|
121
117
|
this.invalid.emit(this._submitEvent);
|
|
122
118
|
}
|
|
@@ -126,14 +122,13 @@ export class FsFormDirective {
|
|
|
126
122
|
if (el) {
|
|
127
123
|
el.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
128
124
|
}
|
|
129
|
-
return throwError('Form validation error');
|
|
125
|
+
return throwError(() => new Error('Form validation error'));
|
|
130
126
|
}
|
|
131
127
|
get _submitter() {
|
|
132
|
-
return this.
|
|
133
|
-
? this._activeSubmitButton.name
|
|
134
|
-
: null;
|
|
128
|
+
return this._getFormGroup().activeSubmitButton?.name;
|
|
135
129
|
}
|
|
136
130
|
ngOnInit() {
|
|
131
|
+
this._formGroup?.deregisterForm();
|
|
137
132
|
if (this.deactivationGuard) {
|
|
138
133
|
this._registerCanDeactivateGuard();
|
|
139
134
|
}
|
|
@@ -166,16 +161,16 @@ export class FsFormDirective {
|
|
|
166
161
|
});
|
|
167
162
|
}
|
|
168
163
|
ngAfterContentInit() {
|
|
164
|
+
super.ngAfterContentInit();
|
|
169
165
|
this._registerConfirm();
|
|
170
166
|
this._registerConfirmDrawerClose();
|
|
171
|
-
this._registerConfirmTabs();
|
|
172
167
|
this._registerDrawerClose();
|
|
173
168
|
this._registerDirtySubmitButton();
|
|
174
169
|
}
|
|
175
170
|
ngOnDestroy() {
|
|
171
|
+
this._formGroup?.registerForm(null);
|
|
172
|
+
super.ngOnDestroy();
|
|
176
173
|
this._cleanupCanDeactivate();
|
|
177
|
-
this._destroy$.next(null);
|
|
178
|
-
this._destroy$.complete();
|
|
179
174
|
}
|
|
180
175
|
createSnapshot() {
|
|
181
176
|
this._snapshot = this.ngForm.value;
|
|
@@ -205,13 +200,12 @@ export class FsFormDirective {
|
|
|
205
200
|
this._updateDirtySubmitButtons();
|
|
206
201
|
}
|
|
207
202
|
triggerSubmit(options) {
|
|
208
|
-
this._confirmed = options?.confirmed;
|
|
209
203
|
this.ngForm.ngSubmit.emit();
|
|
210
204
|
}
|
|
211
205
|
triggerConfirm() {
|
|
212
206
|
const submitted = this.submitting ? this.submitted.asObservable() : of({});
|
|
213
207
|
return submitted
|
|
214
|
-
.pipe(take(1), mergeMap(() => this._form.confirmUnsaved(
|
|
208
|
+
.pipe(take(1), mergeMap(() => this._form.confirmUnsaved(this)));
|
|
215
209
|
}
|
|
216
210
|
enable() {
|
|
217
211
|
this.ngForm.control.enable();
|
|
@@ -219,22 +213,11 @@ export class FsFormDirective {
|
|
|
219
213
|
}
|
|
220
214
|
disable() {
|
|
221
215
|
this.ngForm.control.disable();
|
|
222
|
-
this.
|
|
216
|
+
this._getFormGroup()
|
|
217
|
+
.buttons.forEach((button) => {
|
|
223
218
|
button.disable();
|
|
224
219
|
});
|
|
225
220
|
}
|
|
226
|
-
addButton(button) {
|
|
227
|
-
this._buttons.reset([
|
|
228
|
-
...this._buttons.toArray(),
|
|
229
|
-
button,
|
|
230
|
-
]);
|
|
231
|
-
}
|
|
232
|
-
removeButton(button) {
|
|
233
|
-
this._buttons.reset([
|
|
234
|
-
...this._buttons.toArray()
|
|
235
|
-
.filter((item) => (button !== item)),
|
|
236
|
-
]);
|
|
237
|
-
}
|
|
238
221
|
validate() {
|
|
239
222
|
Object.values(this.ngForm.controls)
|
|
240
223
|
.forEach((control) => {
|
|
@@ -243,37 +226,38 @@ export class FsFormDirective {
|
|
|
243
226
|
control.updateValueAndValidity();
|
|
244
227
|
});
|
|
245
228
|
}
|
|
229
|
+
submit$(submitEvent) {
|
|
230
|
+
return of(submitEvent)
|
|
231
|
+
.pipe(tap(() => this._statusValidating()), tap(() => this.validate()), tap(() => this._statusSubmitting()), tap(() => this._setupActiveSubmitButton()), tap(() => this._disableButtons()), switchMap((data) => this._waitUntilStatusPending()
|
|
232
|
+
.pipe(map(() => data))), mergeMap(() => {
|
|
233
|
+
if (this.ngForm.status === 'INVALID') {
|
|
234
|
+
return this._formInvalidState$;
|
|
235
|
+
}
|
|
236
|
+
return this._formValidState$;
|
|
237
|
+
}), catchError((e) => {
|
|
238
|
+
this._handleError(e);
|
|
239
|
+
return of(null);
|
|
240
|
+
}), tap((submittedEvent) => {
|
|
241
|
+
if (submittedEvent) {
|
|
242
|
+
this._completeSubmit(true, submittedEvent);
|
|
243
|
+
}
|
|
244
|
+
}));
|
|
245
|
+
}
|
|
246
246
|
_listenSubmit() {
|
|
247
|
-
this
|
|
247
|
+
this
|
|
248
|
+
.ngForm
|
|
248
249
|
.ngSubmit
|
|
249
250
|
.pipe(tap((event) => {
|
|
250
251
|
event?.preventDefault();
|
|
251
|
-
}),
|
|
252
|
-
return { event, confirmed: this._confirmed };
|
|
253
|
-
}), tap(() => this._confirmed = false), filter(() => {
|
|
252
|
+
}), filter(() => {
|
|
254
253
|
return [FormStatus.Valid, FormStatus.Invalid]
|
|
255
254
|
.includes(this._status$.getValue());
|
|
256
|
-
}),
|
|
257
|
-
.pipe(mapTo(data))), mergeMap((data) => {
|
|
258
|
-
if (this.ngForm.status === 'INVALID') {
|
|
259
|
-
return this._formInvalidState$;
|
|
260
|
-
}
|
|
261
|
-
return this._formValidState$
|
|
262
|
-
.pipe(map((submitEvent) => ({
|
|
263
|
-
...submitEvent,
|
|
264
|
-
confirmed: data.confirmed,
|
|
265
|
-
})));
|
|
266
|
-
}), catchError((e, source$) => {
|
|
267
|
-
this._handleError(e);
|
|
268
|
-
return source$;
|
|
269
|
-
}), tap((submittedEvent) => {
|
|
270
|
-
this._completeSubmit(true, submittedEvent);
|
|
271
|
-
}), takeUntil(this._destroy$))
|
|
255
|
+
}), switchMap(() => this.submit$(this._submitEvent)), takeUntil(this.destroy$))
|
|
272
256
|
.subscribe();
|
|
273
257
|
}
|
|
274
258
|
_listenFormStatus() {
|
|
275
259
|
this._status$
|
|
276
|
-
.pipe(takeUntil(this.
|
|
260
|
+
.pipe(takeUntil(this.destroy$))
|
|
277
261
|
.subscribe((formStatus) => {
|
|
278
262
|
const cls = [FormStatus.Submitting, FormStatus.Validating];
|
|
279
263
|
const classList = this._element.nativeElement.classList;
|
|
@@ -285,7 +269,7 @@ export class FsFormDirective {
|
|
|
285
269
|
}
|
|
286
270
|
_listenWindowClose() {
|
|
287
271
|
fromEvent(window, 'beforeunload')
|
|
288
|
-
.pipe(takeUntil(this.
|
|
272
|
+
.pipe(takeUntil(this.destroy$))
|
|
289
273
|
.subscribe((event) => {
|
|
290
274
|
if (this.confirm && this.confirmBrowser && this.ngForm.dirty) {
|
|
291
275
|
event.returnValue = false;
|
|
@@ -304,7 +288,7 @@ export class FsFormDirective {
|
|
|
304
288
|
_listenHotKeys() {
|
|
305
289
|
this._ngZone.runOutsideAngular(() => {
|
|
306
290
|
fromEvent(document, 'keydown')
|
|
307
|
-
.pipe(takeUntil(this.
|
|
291
|
+
.pipe(takeUntil(this.destroy$))
|
|
308
292
|
.subscribe((event) => {
|
|
309
293
|
if (this._dialogBackdropEscape && event.code === 'Escape') {
|
|
310
294
|
const cdkOverlayPane = Array
|
|
@@ -335,7 +319,7 @@ export class FsFormDirective {
|
|
|
335
319
|
return result === ConfirmResult.Pristine || result === ConfirmResult.Discard
|
|
336
320
|
? of(null)
|
|
337
321
|
: this.submitted.asObservable();
|
|
338
|
-
}), takeUntil(this.
|
|
322
|
+
}), takeUntil(this.destroy$))
|
|
339
323
|
.subscribe((result) => {
|
|
340
324
|
this._dialogRef.close(result?.response);
|
|
341
325
|
});
|
|
@@ -345,13 +329,12 @@ export class FsFormDirective {
|
|
|
345
329
|
}
|
|
346
330
|
}
|
|
347
331
|
_getActiveSubmitButton() {
|
|
348
|
-
|
|
349
|
-
.
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
return activeButton ? activeButton : submitButtons[0];
|
|
332
|
+
if (this._getFormGroup().activeSubmitButton) {
|
|
333
|
+
return this._getFormGroup().activeSubmitButton;
|
|
334
|
+
}
|
|
335
|
+
return this._getFormGroup()
|
|
336
|
+
.buttons
|
|
337
|
+
.filter((button) => button.submit)[0];
|
|
355
338
|
}
|
|
356
339
|
_elementInForm(el) {
|
|
357
340
|
if (el.isSameNode(this._element.nativeElement)) {
|
|
@@ -371,12 +354,12 @@ export class FsFormDirective {
|
|
|
371
354
|
else {
|
|
372
355
|
this._resetButtons();
|
|
373
356
|
}
|
|
374
|
-
if (this.
|
|
357
|
+
if (this._getFormGroup().activeSubmitButton) {
|
|
375
358
|
if (success) {
|
|
376
|
-
this.
|
|
359
|
+
this._getFormGroup().activeSubmitButton.success();
|
|
377
360
|
}
|
|
378
361
|
else {
|
|
379
|
-
this.
|
|
362
|
+
this._getFormGroup().activeSubmitButton.error();
|
|
380
363
|
}
|
|
381
364
|
}
|
|
382
365
|
this._status$.next(FormStatus.Submitted);
|
|
@@ -389,7 +372,8 @@ export class FsFormDirective {
|
|
|
389
372
|
this._status$.next(FormStatus.Completing);
|
|
390
373
|
const resetDelay = success ? this.successDelay : this.errorDelay;
|
|
391
374
|
of(true)
|
|
392
|
-
.pipe(delay(resetDelay), first(), takeUntil(this.
|
|
375
|
+
.pipe(delay(resetDelay), first(), takeUntil(this.destroy$))
|
|
376
|
+
.subscribe(() => {
|
|
393
377
|
if (this.ngForm.form.status === 'VALID') {
|
|
394
378
|
this._status$.next(FormStatus.Valid);
|
|
395
379
|
}
|
|
@@ -397,23 +381,22 @@ export class FsFormDirective {
|
|
|
397
381
|
this._status$.next(FormStatus.Invalid);
|
|
398
382
|
}
|
|
399
383
|
this._resetButtons();
|
|
400
|
-
this.
|
|
384
|
+
this._getFormGroup().activeSubmitButton = null;
|
|
401
385
|
this._updateDirtySubmitButtons();
|
|
402
386
|
});
|
|
403
387
|
}
|
|
388
|
+
_getFormGroup() {
|
|
389
|
+
return this._formGroup || this;
|
|
390
|
+
}
|
|
404
391
|
_resetButtons() {
|
|
405
|
-
this.
|
|
392
|
+
this._getFormGroup()
|
|
393
|
+
.buttons.forEach((button) => {
|
|
406
394
|
button.reset();
|
|
407
395
|
});
|
|
408
396
|
}
|
|
409
|
-
_resetActiveButtons() {
|
|
410
|
-
this._buttons.forEach((button) => {
|
|
411
|
-
button.resetActive();
|
|
412
|
-
});
|
|
413
|
-
}
|
|
414
397
|
_registerConfirm() {
|
|
415
398
|
this.ngForm.form.valueChanges
|
|
416
|
-
.pipe(takeUntil(this.
|
|
399
|
+
.pipe(takeUntil(this.destroy$))
|
|
417
400
|
.subscribe((changes) => {
|
|
418
401
|
if (this._dialogBackdropEscape && this._dialogRef) {
|
|
419
402
|
this._dialogRef.disableClose = true;
|
|
@@ -432,11 +415,11 @@ export class FsFormDirective {
|
|
|
432
415
|
_registerDrawerClose() {
|
|
433
416
|
if (this._drawerRef) {
|
|
434
417
|
this._drawerRef.closeStart$
|
|
435
|
-
.pipe(takeUntil(this.
|
|
418
|
+
.pipe(takeUntil(this.destroy$))
|
|
436
419
|
.subscribe((subscriber) => {
|
|
437
420
|
if (this.submitting) {
|
|
438
421
|
this._status$
|
|
439
|
-
.pipe(filter((status) => status === FormStatus.Success || status === FormStatus.Error), takeUntil(this.
|
|
422
|
+
.pipe(filter((status) => status === FormStatus.Success || status === FormStatus.Error), takeUntil(this.destroy$))
|
|
440
423
|
.subscribe((status) => {
|
|
441
424
|
if (status === FormStatus.Success) {
|
|
442
425
|
subscriber.next(null);
|
|
@@ -469,65 +452,20 @@ export class FsFormDirective {
|
|
|
469
452
|
subscriber.complete();
|
|
470
453
|
return of(null);
|
|
471
454
|
}));
|
|
472
|
-
}), takeUntil(this.
|
|
455
|
+
}), takeUntil(this.destroy$))
|
|
473
456
|
.subscribe();
|
|
474
457
|
}
|
|
475
458
|
}
|
|
476
|
-
_registerConfirmTabs() {
|
|
477
|
-
if (this.tabGroup) {
|
|
478
|
-
this._registerConfirmTabGroup(this.tabGroup);
|
|
479
|
-
}
|
|
480
|
-
this._registerConfirmTabGroups(this._tabGroups.toArray());
|
|
481
|
-
this._tabGroups.changes
|
|
482
|
-
.pipe(takeUntil(this._destroy$))
|
|
483
|
-
.subscribe(() => {
|
|
484
|
-
this._registerConfirmTabGroups(this._tabGroups.toArray());
|
|
485
|
-
});
|
|
486
|
-
}
|
|
487
|
-
_registerConfirmTabGroups(tabGroups) {
|
|
488
|
-
tabGroups.forEach((tabGroup) => {
|
|
489
|
-
this._registerConfirmTabGroup(tabGroup);
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
_registerConfirmTabGroup(tabGroup) {
|
|
493
|
-
const confirmTabGroup = tabGroup;
|
|
494
|
-
if (!confirmTabGroup._originalHandleClick) {
|
|
495
|
-
confirmTabGroup._originalHandleClick = tabGroup._handleClick;
|
|
496
|
-
confirmTabGroup._handlClick$ = new Subject();
|
|
497
|
-
confirmTabGroup._handleClick = (tab, tabHeader, idx) => {
|
|
498
|
-
if (confirmTabGroup._handlClick$.observers.length) {
|
|
499
|
-
confirmTabGroup._handlClick$.next({ tab, tabHeader, idx });
|
|
500
|
-
}
|
|
501
|
-
else {
|
|
502
|
-
confirmTabGroup._originalHandleClick(tab, tabHeader, idx);
|
|
503
|
-
}
|
|
504
|
-
};
|
|
505
|
-
}
|
|
506
|
-
confirmTabGroup._handlClick$
|
|
507
|
-
.pipe(filter(() => !this.submitting), switchMap((event) => {
|
|
508
|
-
if (this.confirm && this.confirmTabs) {
|
|
509
|
-
return this.triggerConfirm()
|
|
510
|
-
.pipe(tap((result) => {
|
|
511
|
-
if (confirmResultContinue(result)) {
|
|
512
|
-
confirmTabGroup.selectedIndex = event.idx;
|
|
513
|
-
}
|
|
514
|
-
}));
|
|
515
|
-
}
|
|
516
|
-
confirmTabGroup._originalHandleClick(event.tab, event.tabHeader, event.idx);
|
|
517
|
-
return of(null);
|
|
518
|
-
}), takeUntil(this._destroy$))
|
|
519
|
-
.subscribe();
|
|
520
|
-
}
|
|
521
459
|
_registerConfirmDialogBackdropEscape() {
|
|
522
460
|
if (this._dialogRef) {
|
|
523
461
|
this._dialogBackdropEscape = !this._dialogRef?.disableClose;
|
|
524
462
|
if (this._dialogBackdropEscape) {
|
|
525
463
|
this._dialogRef.backdropClick()
|
|
526
|
-
.pipe(takeUntil(this.
|
|
464
|
+
.pipe(takeUntil(this.destroy$))
|
|
527
465
|
.subscribe(() => {
|
|
528
466
|
this._formClose();
|
|
529
467
|
});
|
|
530
|
-
this.
|
|
468
|
+
this.destroy$
|
|
531
469
|
.subscribe(() => {
|
|
532
470
|
this._dialogRef.disableClose = false;
|
|
533
471
|
});
|
|
@@ -552,18 +490,20 @@ export class FsFormDirective {
|
|
|
552
490
|
return;
|
|
553
491
|
}
|
|
554
492
|
this.ngForm.form.valueChanges
|
|
555
|
-
.pipe(takeUntil(this.
|
|
493
|
+
.pipe(takeUntil(this.destroy$))
|
|
556
494
|
.subscribe(() => {
|
|
557
495
|
this._updateDirtySubmitButtons();
|
|
558
496
|
});
|
|
559
|
-
this.
|
|
560
|
-
.
|
|
497
|
+
this._getFormGroup()
|
|
498
|
+
.buttons.changes
|
|
499
|
+
.pipe(takeUntil(this.destroy$))
|
|
561
500
|
.subscribe(() => {
|
|
562
501
|
this._updateDirtySubmitButtons();
|
|
563
502
|
});
|
|
564
503
|
}
|
|
565
504
|
_updateDirtySubmitButtons() {
|
|
566
|
-
this.
|
|
505
|
+
this._getFormGroup()
|
|
506
|
+
.buttons
|
|
567
507
|
.filter((button) => button.submit)
|
|
568
508
|
.forEach((submitButton) => {
|
|
569
509
|
if (!this.confirm || !this.dirtySubmitButton || this.ngForm.dirty || !submitButton.dirtySubmit) {
|
|
@@ -574,22 +514,23 @@ export class FsFormDirective {
|
|
|
574
514
|
}
|
|
575
515
|
});
|
|
576
516
|
}
|
|
577
|
-
|
|
517
|
+
_statusSubmitting() {
|
|
578
518
|
this._status$.next(FormStatus.Submitting);
|
|
579
|
-
this._form.broadcast('submit', this.ngForm);
|
|
580
519
|
}
|
|
581
|
-
|
|
520
|
+
_statusValidating() {
|
|
582
521
|
this._status$.next(FormStatus.Validating);
|
|
583
522
|
}
|
|
584
523
|
_setupActiveSubmitButton() {
|
|
585
|
-
this.
|
|
524
|
+
this._getFormGroup()
|
|
525
|
+
.activeSubmitButton = this._getActiveSubmitButton();
|
|
586
526
|
this._resetButtons();
|
|
587
|
-
if (this.
|
|
588
|
-
this.
|
|
527
|
+
if (this._getFormGroup().activeSubmitButton) {
|
|
528
|
+
this._getFormGroup().activeSubmitButton.process();
|
|
589
529
|
}
|
|
590
530
|
}
|
|
591
531
|
_disableButtons() {
|
|
592
|
-
this.
|
|
532
|
+
this._getFormGroup()
|
|
533
|
+
.buttons.forEach((button) => {
|
|
593
534
|
button.disable();
|
|
594
535
|
});
|
|
595
536
|
}
|
|
@@ -630,8 +571,8 @@ export class FsFormDirective {
|
|
|
630
571
|
this._activatedRouteConfig.canDeactivate.splice(guardIndex, 1);
|
|
631
572
|
this._form.removeFormDirective(this._activatedRouteConfig.component);
|
|
632
573
|
}
|
|
633
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsFormDirective, deps: [{ token: NgForm }, { token: i1.FsForm }, { token: i0.ElementRef }, { token: i2.FsMessage }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: MatDialogRef, optional: true }, { token: DrawerRef, optional: true }, { token:
|
|
634
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: FsFormDirective, selector: "[fsForm]", inputs: { wrapperSelector: "wrapperSelector", messageSelector: "messageSelector", hintSelector: "hintSelector", labelSelector: "labelSelector", autocomplete: "autocomplete", shortcuts: "shortcuts", confirm: "confirm", confirmDialog: "confirmDialog", confirmDrawer: "confirmDrawer", confirmBrowser: "confirmBrowser",
|
|
574
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsFormDirective, deps: [{ token: NgForm }, { token: i1.FsForm }, { token: i0.ElementRef }, { token: i2.FsMessage }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i3.FsFormGroupDirective, optional: true }, { token: MatDialogRef, optional: true }, { token: DrawerRef, optional: true }, { token: i4.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Directive });
|
|
575
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: FsFormDirective, selector: "[fsForm]", inputs: { wrapperSelector: "wrapperSelector", messageSelector: "messageSelector", hintSelector: "hintSelector", labelSelector: "labelSelector", autocomplete: "autocomplete", shortcuts: "shortcuts", confirm: "confirm", confirmDialog: "confirmDialog", confirmDrawer: "confirmDrawer", confirmBrowser: "confirmBrowser", dirtySubmitButton: "dirtySubmitButton", submit: "submit", successDelay: "successDelay", errorDelay: "errorDelay", deactivationGuard: "deactivationGuard" }, outputs: { submitEvent: "fsForm", invalid: "invalid", valid: "valid", submitted: "submitted", reseted: "reseted", cleared: "cleared" }, host: { properties: { "class.fs-form": "this.fsFormClass" } }, exportAs: ["fsForm"], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
|
|
635
576
|
}
|
|
636
577
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsFormDirective, decorators: [{
|
|
637
578
|
type: Directive,
|
|
@@ -639,20 +580,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
639
580
|
selector: '[fsForm]',
|
|
640
581
|
exportAs: 'fsForm',
|
|
641
582
|
}]
|
|
642
|
-
}], ctorParameters: () => [{ type:
|
|
583
|
+
}], ctorParameters: () => [{ type: i5.NgForm, decorators: [{
|
|
643
584
|
type: Inject,
|
|
644
585
|
args: [NgForm]
|
|
645
|
-
}] }, { type: i1.FsForm }, { type: i0.ElementRef }, { type: i2.FsMessage }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type:
|
|
586
|
+
}] }, { type: i1.FsForm }, { type: i0.ElementRef }, { type: i2.FsMessage }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i3.FsFormGroupDirective, decorators: [{
|
|
587
|
+
type: Optional
|
|
588
|
+
}] }, { type: i6.MatDialogRef, decorators: [{
|
|
646
589
|
type: Optional
|
|
647
590
|
}, {
|
|
648
591
|
type: Inject,
|
|
649
592
|
args: [MatDialogRef]
|
|
650
|
-
}] }, { type:
|
|
593
|
+
}] }, { type: i7.DrawerRef, decorators: [{
|
|
651
594
|
type: Optional
|
|
652
595
|
}, {
|
|
653
596
|
type: Inject,
|
|
654
597
|
args: [DrawerRef]
|
|
655
|
-
}] }, { type:
|
|
598
|
+
}] }, { type: i4.ActivatedRoute }], propDecorators: { wrapperSelector: [{
|
|
656
599
|
type: Input
|
|
657
600
|
}], messageSelector: [{
|
|
658
601
|
type: Input
|
|
@@ -672,8 +615,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
672
615
|
type: Input
|
|
673
616
|
}], confirmBrowser: [{
|
|
674
617
|
type: Input
|
|
675
|
-
}], confirmTabs: [{
|
|
676
|
-
type: Input
|
|
677
618
|
}], dirtySubmitButton: [{
|
|
678
619
|
type: Input
|
|
679
620
|
}], submit: [{
|
|
@@ -682,8 +623,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
682
623
|
type: Input
|
|
683
624
|
}], errorDelay: [{
|
|
684
625
|
type: Input
|
|
685
|
-
}], tabGroup: [{
|
|
686
|
-
type: Input
|
|
687
626
|
}], deactivationGuard: [{
|
|
688
627
|
type: Input
|
|
689
628
|
}], submitEvent: [{
|
|
@@ -702,8 +641,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
702
641
|
}], fsFormClass: [{
|
|
703
642
|
type: HostBinding,
|
|
704
643
|
args: ['class.fs-form']
|
|
705
|
-
}], _tabGroups: [{
|
|
706
|
-
type: ContentChildren,
|
|
707
|
-
args: [MatTabGroup, { descendants: true }]
|
|
708
644
|
}] } });
|
|
709
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RpcmVjdGl2ZXMvZm9ybS9mb3JtLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBSU4sUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFtQixNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFTLE1BQU0saUJBQWlCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBVSxXQUFXLEVBQWdCLE1BQU0sd0JBQXdCLENBQUM7QUFFM0UsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTdELE9BQU8sRUFDTCxlQUFlLEVBQ2YsS0FBSyxFQUNMLFNBQVMsRUFDVCxHQUFHLEVBRUgsRUFBRSxFQUNGLE9BQU8sRUFDUCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sS0FBSyxFQUNMLEdBQUcsRUFDSCxLQUFLLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUd2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7OztBQVN2RCxNQUFNLE9BQU8sZUFBZTtJQWdHakI7SUFDQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBR0E7SUFHQTtJQUVBO0lBMUdILGVBQWUsR0FBRyxzQ0FBc0MsQ0FBQztJQUd6RCxlQUFlLEdBQUcsd0RBQXdELENBQUM7SUFHM0UsWUFBWSxHQUFHLGdEQUFnRCxDQUFDO0lBR2hFLGFBQWEsR0FBRyw4Q0FBOEMsQ0FBQztJQUcvRCxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBR3JCLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXO0lBRzdCLE9BQU8sR0FBNEIsSUFBSSxDQUFDO0lBR3hDLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFHckIsYUFBYSxHQUFHLElBQUksQ0FBQztJQUdyQixjQUFjLEdBQUcsSUFBSSxDQUFDO0lBR3RCLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFHbkIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBRWhDLElBQ1csTUFBTSxDQUFDLE9BQWdEO1FBQ2hFLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUdNLFlBQVksR0FBRyxDQUFDLENBQUM7SUFHakIsVUFBVSxHQUFHLElBQUksQ0FBQztJQUdsQixRQUFRLENBQWM7SUFHdEIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBR3pCLFdBQVcsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUc1RCxPQUFPLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7SUFHeEQsS0FBSyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO0lBR3RELFNBQVMsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUcxRCxPQUFPLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7SUFHeEQsT0FBTyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO0lBR3hELFdBQVcsR0FBRyxJQUFJLENBQUM7SUFHbEIsVUFBVSxHQUEyQixJQUFJLFNBQVMsRUFBRSxDQUFDO0lBRXJELFFBQVEsR0FBRyxJQUFJLFNBQVMsRUFBcUIsQ0FBQztJQUM5QyxnQkFBZ0IsQ0FBQztJQUNqQixtQkFBbUIsQ0FBb0I7SUFDdkMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO0lBQzlCLFNBQVMsR0FBMkIsRUFBRSxDQUFDO0lBQ3ZDLHFCQUFxQixDQUFlO0lBQ3BDLFFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDMUIsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixRQUFRLEdBQTZDLElBQUksQ0FBQztJQUVsRSxZQUVTLE1BQWMsRUFDYixLQUFhLEVBQ2IsUUFBb0IsRUFDcEIsUUFBbUIsRUFDbkIsT0FBZSxFQUNmLE1BQXlCLEVBR3pCLFVBQTZCLEVBRzdCLFVBQTBCLEVBRTFCLE1BQXNCO1FBYnZCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDYixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNwQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUd6QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUc3QixlQUFVLEdBQVYsVUFBVSxDQUFnQjtRQUUxQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtJQUM1QixDQUFDO0lBRUwsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxVQUFVLENBQUMsVUFBVSxDQUFDO0lBQzVELENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLFVBQVUsQ0FBQyxVQUFVLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssVUFBVSxDQUFDLFVBQVUsQ0FBQztJQUM1RCxDQUFDO0lBRUQsSUFBWSxZQUFZO1FBQ3RCLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzNCLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBWSxnQkFBZ0I7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRW5DLE1BQU0sY0FBYyxHQUFtQjtZQUNyQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFvQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV4RCxPQUFPLE9BQU87YUFDWCxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDZixjQUFjLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUVuQyxPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQixDQUFDO0lBQ04sQ0FBQztJQUVELElBQVksa0JBQWtCO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFbkQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyx5Q0FBeUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFMUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXBFLElBQUksRUFBRSxFQUFFLENBQUM7WUFDUCxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBWSxVQUFVO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQjtZQUM3QixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUk7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNyQyxDQUFDO1FBRUQsSUFBSSxDQUFDLG9DQUFvQyxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRU0sV0FBVyxDQUFDLE9BQXNCO1FBQ3ZDLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRU0sV0FBVyxDQUFDLFNBQWtELElBQUk7UUFDdkUsSUFBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxjQUFjLENBQUMsT0FBOEI7UUFDbEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFFeEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sa0JBQWtCO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBRU0sV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV4QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2FBQzlCLE9BQU8sQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVNLGFBQWEsQ0FBQyxPQUFnQztRQUNuRCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sRUFBRSxTQUFTLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVNLGNBQWM7UUFDbkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTNFLE9BQU8sU0FBUzthQUNiLElBQUksQ0FDSCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNsRCxDQUFDO0lBQ04sQ0FBQztJQUVNLE1BQU07UUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUU3QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDL0IsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFNBQVMsQ0FBQyxNQUF5QjtRQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FDakI7WUFDRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQzFCLE1BQU07U0FDUCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sWUFBWSxDQUFDLE1BQXlCO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUNqQjtZQUNFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7aUJBQ3ZCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7U0FDdkMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLFFBQVE7UUFDYixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2FBQ2hDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsTUFBTTthQUNSLFFBQVE7YUFDUixJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDWixLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDWixPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0MsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLEVBQ2xDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDO2lCQUMxQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxFQUMzQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzFCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxFQUM1QyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUMsRUFDMUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxFQUNqQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTthQUMvQyxJQUFJLENBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUNaLENBQUMsRUFDSixRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUNqQyxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCO2lCQUN6QixJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQixHQUFHLFdBQVc7Z0JBQ2QsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQzFCLENBQUMsQ0FDRCxDQUNGLENBQUM7UUFDTixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVyQixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsQ0FBQyxjQUE4QixFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxRQUFRO2FBQ1YsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2FBQ0EsU0FBUyxDQUFDLENBQUMsVUFBc0IsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO1lBQ3hELFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUN6QixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFUCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDO2FBQzlCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjthQUNBLFNBQVMsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQzFCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzdELEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxhQUFhLENBQUMsRUFBRSxFQUFFLE1BQW1CO1FBQzNDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLElBQUksRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2xDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDO2lCQUMzQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7aUJBQ0EsU0FBUyxDQUFDLENBQUMsS0FBb0IsRUFBRSxFQUFFO2dCQUNsQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUMxRCxNQUFNLGNBQWMsR0FBRyxLQUFLO3lCQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFjLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFFM0UsTUFBTSxZQUFZLEdBQUcsSUFBSTt5QkFDdEIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztvQkFFOUUsSUFBSSxZQUFZLEVBQUUsQ0FBQzt3QkFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFOzRCQUNwQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7d0JBQ3BCLENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDOUQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUV2QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDbkIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDOzRCQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2xDLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLGNBQWMsRUFBRTtpQkFDbEIsSUFBSSxDQUNILE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDakQsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ25CLE9BQU8sTUFBTSxLQUFLLGFBQWEsQ0FBQyxRQUFRLElBQUksTUFBTSxLQUFLLGFBQWEsQ0FBQyxPQUFPO29CQUMxRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztvQkFDVixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQyxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjtpQkFDQSxTQUFTLENBQUMsQ0FBQyxNQUFzQixFQUFFLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVE7YUFDaEMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckMsTUFBTSxZQUFZLEdBQUcsYUFBYTthQUMvQixJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNmLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVMLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU8sY0FBYyxDQUFDLEVBQVc7UUFDaEMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxJQUFJLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM1QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxlQUFlLENBQUMsT0FBTyxFQUFFLFdBQTJCO1FBQzFELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV6QyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRWpFLEVBQUUsQ0FBQyxJQUFJLENBQUM7YUFDTCxJQUFJLENBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUNqQixLQUFLLEVBQUUsRUFDUCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDL0IsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQy9CLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWTthQUMxQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7YUFDQSxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNyQixJQUFHLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN0QyxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUU3QyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztxQkFDakIsT0FBTyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7b0JBQ3hCLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdkMsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXO2lCQUN4QixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7aUJBQ0EsU0FBUyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsUUFBUTt5QkFDVixJQUFJLENBQ0gsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUNoRixTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjt5QkFDQSxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTt3QkFDcEIsSUFBSSxNQUFNLEtBQUssVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDOzRCQUNsQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUN0QixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3hCLENBQUM7NkJBQU0sQ0FBQzs0QkFDTixVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ3JCLENBQUM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUM7SUFFTywyQkFBMkI7UUFDakMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXO2lCQUN4QixJQUFJLENBQ0gsU0FBUyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7Z0JBQ3ZCLE9BQU8sR0FBRyxDQUNSLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsRUFDeEMsSUFBSSxDQUFDLGNBQWMsRUFBRTtxQkFDbEIsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDOUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ2IsSUFBSSxNQUFNLEVBQUUsQ0FBQzt3QkFDWCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN0QixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3hCLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQ0gsRUFDSCxLQUFLLENBQUMsR0FBRyxFQUFFO29CQUNULFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFFdEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xCLENBQUMsQ0FBQyxDQUNILENBQUM7WUFDSixDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjtpQkFDQSxTQUFTLEVBQUUsQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTzthQUNwQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxTQUF3QjtRQUN4RCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBcUIsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxRQUFxQjtRQUNwRCxNQUFNLGVBQWUsR0FBRyxRQUEyQixDQUFDO1FBQ3BELElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMxQyxlQUFlLENBQUMsb0JBQW9CLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztZQUM3RCxlQUFlLENBQUMsWUFBWSxHQUFHLElBQUksT0FBTyxFQUlwQyxDQUFDO1lBQ1AsZUFBZSxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQVcsRUFBRSxTQUF1QixFQUFFLEdBQVcsRUFBRSxFQUFFO2dCQUNuRixJQUFJLGVBQWUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNsRCxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDN0QsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUM1RCxDQUFDO1lBQ0gsQ0FBQyxDQUFDO1FBQ0osQ0FBQztRQUVELGVBQWUsQ0FBQyxZQUFZO2FBQ3pCLElBQUksQ0FDSCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQzlCLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2xCLElBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3BDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRTtxQkFDekIsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNiLElBQUkscUJBQXFCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzt3QkFDbEMsZUFBZSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO29CQUM1QyxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUNILENBQUM7WUFDTixDQUFDO1lBRUQsZUFBZSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFNUUsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8sb0NBQW9DO1FBQzFDLElBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDO1lBRTVELElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFO3FCQUM1QixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7cUJBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BCLENBQUMsQ0FBQyxDQUFDO2dCQUVMLElBQUksQ0FBQyxTQUFTO3FCQUNYLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUN2QyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLElBQVksRUFBRSxPQUF3QixFQUFFLEVBQUU7WUFFNUUsTUFBTSxFQUFFLEdBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUV2RixJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNQLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7b0JBQ3JDLEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUN4QyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQy9DLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTywwQkFBMEI7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVk7YUFDMUIsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPO2FBQ2xCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyx5QkFBeUI7UUFDL0IsSUFBSSxDQUFDLFFBQVE7YUFDVixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDakMsT0FBTyxDQUFDLENBQUMsWUFBK0IsRUFBRSxFQUFFO1lBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUMvRixZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sMEJBQTBCO1FBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTyx5QkFBeUI7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMvQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhO2FBQzdCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFDN0IsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQ3RDLENBQUM7SUFDTixDQUFDO0lBRU8sWUFBWSxDQUFDLENBQWlCO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUseUNBQXlDLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDM0YsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRS9CLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTywyQkFBMkI7UUFDakMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDO1FBRXJFLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUU3RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUNoRCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNyRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDaEMsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2RSxDQUFDO3VHQXowQlUsZUFBZSxrQkErRmhCLE1BQU0sNklBUU0sWUFBWSw2QkFHWixTQUFTOzJGQTFHcEIsZUFBZSw0eEJBZ0ZULFdBQVc7OzJGQWhGakIsZUFBZTtrQkFKM0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsUUFBUSxFQUFFLFFBQVE7aUJBQ25COzswQkFnR0ksTUFBTTsyQkFBQyxNQUFNOzswQkFRYixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFlBQVk7OzBCQUcvQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFNBQVM7c0VBdkd4QixlQUFlO3NCQURyQixLQUFLO2dCQUlDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLE9BQU87c0JBRGIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsY0FBYztzQkFEcEIsS0FBSztnQkFJQyxXQUFXO3NCQURqQixLQUFLO2dCQUlDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFJSyxNQUFNO3NCQURoQixLQUFLO2dCQVVDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsVUFBVTtzQkFEaEIsS0FBSztnQkFJQyxRQUFRO3NCQURkLEtBQUs7Z0JBSUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQUlDLFdBQVc7c0JBRGpCLE1BQU07dUJBQUMsUUFBUTtnQkFJVCxPQUFPO3NCQURiLE1BQU07Z0JBSUEsS0FBSztzQkFEWCxNQUFNO2dCQUlBLFNBQVM7c0JBRGYsTUFBTTtnQkFJQSxPQUFPO3NCQURiLE1BQU07Z0JBSUEsT0FBTztzQkFEYixNQUFNO2dCQUlBLFdBQVc7c0JBRGpCLFdBQVc7dUJBQUMsZUFBZTtnQkFJcEIsVUFBVTtzQkFEakIsZUFBZTt1QkFBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRUYWIsIE1hdFRhYkdyb3VwLCBNYXRUYWJIZWFkZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcblxuaW1wb3J0IHsgZ3VpZCB9IGZyb20gJ0BmaXJlc3RpdGNoL2NvbW1vbic7XG5pbXBvcnQgeyBEcmF3ZXJSZWYgfSBmcm9tICdAZmlyZXN0aXRjaC9kcmF3ZXInO1xuaW1wb3J0IHsgRnNNZXNzYWdlLCBNZXNzYWdlTW9kZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuXG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGRlZmVyLFxuICBmcm9tRXZlbnQsXG4gIGlpZixcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFN1YmplY3QsXG4gIHRocm93RXJyb3IsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY2F0Y2hFcnJvcixcbiAgZGVsYXksXG4gIGZpbHRlcixcbiAgZmlyc3QsXG4gIG1hcCxcbiAgbWFwVG8sXG4gIG1lcmdlTWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRm9ybURlYWN0aXZhdGVHdWFyZCB9IGZyb20gJy4uLy4uL2d1YXJkcy9mb3JtLWRlYWN0aXZhdGUuZ3VhcmQnO1xuaW1wb3J0IHsgY29uZmlybVJlc3VsdENvbnRpbnVlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9jb25maXJtLXJlc3VsdC1jb250aW51ZSc7XG5pbXBvcnQgeyBnZXRBY3RpdmVSb3V0ZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZ2V0LWFjdGl2ZS1yb3V0ZSc7XG5pbXBvcnQgeyBnZXRGb3JtRXJyb3JzIH0gZnJvbSAnLi4vLi4vaGVscGVycy9nZXQtZm9ybS1lcnJvcnMnO1xuaW1wb3J0IHsgRnNGb3JtIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZnNmb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgRnNCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi9idXR0b24uZGlyZWN0aXZlJztcblxuaW1wb3J0IHsgQ29uZmlybVJlc3VsdCB9IGZyb20gJy4vLi4vLi4vZW51bXMvY29uZmlybS1yZXN1bHQnO1xuaW1wb3J0IHsgRm9ybVN0YXR1cyB9IGZyb20gJy4vLi4vLi4vZW51bXMvZm9ybS1zdGF0dXMnO1xuaW1wb3J0IHsgQ29uZmlybUNvbmZpZywgQ29uZmlybVRhYkdyb3VwLCBTdWJtaXR0ZWRFdmVudCB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTdWJtaXRFdmVudCB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9zdWJtaXQtZXZlbnQnO1xuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tmc0Zvcm1dJyxcbiAgZXhwb3J0QXM6ICdmc0Zvcm0nLFxufSlcbmV4cG9ydCBjbGFzcyBGc0Zvcm1EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgd3JhcHBlclNlbGVjdG9yID0gJy5mcy1mb3JtLXdyYXBwZXIsLm1hdC1tZGMtZm9ybS1maWVsZCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1lc3NhZ2VTZWxlY3RvciA9ICcuZnMtZm9ybS1tZXNzYWdlLC5tYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXInO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoaW50U2VsZWN0b3IgPSAnLmZzLWZvcm0taGludCwubWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlcic7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGxhYmVsU2VsZWN0b3IgPSAnLmZzLWZvcm0tbGFiZWwsLm1kYy1mbG9hdGluZy1sYWJlbD5tYXQtbGFiZWwnO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhdXRvY29tcGxldGUgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvcnRjdXRzID0gdHJ1ZTsgLy8gQ3RybCArIHNcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlybTogQ29uZmlybUNvbmZpZyB8IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maXJtRGlhbG9nID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlybURyYXdlciA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbmZpcm1Ccm93c2VyID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlybVRhYnMgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkaXJ0eVN1Ym1pdEJ1dHRvbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzdWJtaXQoc3VibWl0JDogKGV2ZW50OiBTdWJtaXRFdmVudCkgPT4gT2JzZXJ2YWJsZTxhbnk+KSB7XG4gICAgdGhpcy5fc3VibWl0JCA9IHN1Ym1pdCQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN1Ym1pdCgpOiAoZXZlbnQ6IFN1Ym1pdEV2ZW50KSA9PiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9zdWJtaXQkO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHN1Y2Nlc3NEZWxheSA9IDA7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGVycm9yRGVsYXkgPSAxMDAwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0YWJHcm91cDogTWF0VGFiR3JvdXA7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRlYWN0aXZhdGlvbkd1YXJkID0gdHJ1ZTtcblxuICBAT3V0cHV0KCdmc0Zvcm0nKVxuICBwdWJsaWMgc3VibWl0RXZlbnQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBpbnZhbGlkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdmFsaWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzdWJtaXR0ZWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZXNldGVkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgY2xlYXJlZDogRXZlbnRFbWl0dGVyPFN1Ym1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZzLWZvcm0nKVxuICBwdWJsaWMgZnNGb3JtQ2xhc3MgPSB0cnVlO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0VGFiR3JvdXAsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgcHJpdmF0ZSBfdGFiR3JvdXBzOiBRdWVyeUxpc3Q8TWF0VGFiR3JvdXA+ID0gbmV3IFF1ZXJ5TGlzdCgpO1xuXG4gIHByaXZhdGUgX2J1dHRvbnMgPSBuZXcgUXVlcnlMaXN0PEZzQnV0dG9uRGlyZWN0aXZlPigpO1xuICBwcml2YXRlIF9yZWdpc3RlckNvbnRyb2w7XG4gIHByaXZhdGUgX2FjdGl2ZVN1Ym1pdEJ1dHRvbjogRnNCdXR0b25EaXJlY3RpdmU7XG4gIHByaXZhdGUgX2RpYWxvZ0JhY2tkcm9wRXNjYXBlID0gZmFsc2U7XG4gIHByaXZhdGUgX3NuYXBzaG90OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIHByaXZhdGUgX2FjdGl2YXRlZFJvdXRlQ29uZmlnOiBSb3V0ZSB8IG51bGw7XG4gIHByaXZhdGUgX3N0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KEZvcm1TdGF0dXMuVmFsaWQpO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgX2NvbmZpcm1lZCA9IGZhbHNlO1xuICBwcml2YXRlIF9zdWJtaXQkOiAoZXZlbnQ/OiBTdWJtaXRFdmVudCkgPT4gT2JzZXJ2YWJsZTxhbnk+ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE5nRm9ybSlcbiAgICBwdWJsaWMgbmdGb3JtOiBOZ0Zvcm0sXG4gICAgcHJpdmF0ZSBfZm9ybTogRnNGb3JtLFxuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfbWVzc2FnZTogRnNNZXNzYWdlLFxuICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgX2NkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcblxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTWF0RGlhbG9nUmVmKVxuICAgIHByaXZhdGUgX2RpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPGFueT4sXG5cbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERyYXdlclJlZilcbiAgICBwcml2YXRlIF9kcmF3ZXJSZWY6IERyYXdlclJlZjxhbnk+LFxuXG4gICAgcHJpdmF0ZSBfcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICApIHsgfVxuXG4gIHB1YmxpYyBnZXQgc3VibWl0dGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzJC5nZXRWYWx1ZSgpID09PSBGb3JtU3RhdHVzLlN1Ym1pdHRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbGlkYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gRm9ybVN0YXR1cy5WYWxpZGF0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBjb21wbGV0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXMkLmdldFZhbHVlKCkgPT09IEZvcm1TdGF0dXMuQ29tcGxldGluZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9zdWJtaXRFdmVudCgpOiBTdWJtaXRFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nRm9ybTogdGhpcy5uZ0Zvcm0sXG4gICAgICBzdWJtaXR0ZXI6IHRoaXMuX3N1Ym1pdHRlcixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2Zvcm1WYWxpZFN0YXRlJCgpOiBPYnNlcnZhYmxlPFN1Ym1pdHRlZEV2ZW50PiB7XG4gICAgdGhpcy5fZm9ybS5icm9hZGNhc3QoJ3ZhbGlkJywgdGhpcy5fc3VibWl0RXZlbnQpO1xuICAgIHRoaXMuc3VibWl0RXZlbnQuZW1pdCh0aGlzLl9zdWJtaXRFdmVudCk7XG4gICAgdGhpcy52YWxpZC5lbWl0KHRoaXMuX3N1Ym1pdEV2ZW50KTtcblxuICAgIGNvbnN0IHN1Ym1pdHRlZEV2ZW50OiBTdWJtaXR0ZWRFdmVudCA9IHtcbiAgICAgIG5nRm9ybTogdGhpcy5uZ0Zvcm0sXG4gICAgICBzdWJtaXR0ZXI6IHRoaXMuX3N1Ym1pdHRlcixcbiAgICAgIHJlc3BvbnNlOiBudWxsLFxuICAgIH07XG5cbiAgICBjb25zdCBzdWJtaXQkOiBPYnNlcnZhYmxlPGFueT4gPSB0aGlzLl9zdWJtaXQkID9cbiAgICAgIHRoaXMuX3N1Ym1pdCQodGhpcy5fc3VibWl0RXZlbnQpIDogb2Yoc3VibWl0dGVkRXZlbnQpO1xuXG4gICAgcmV0dXJuIHN1Ym1pdCRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgc3VibWl0dGVkRXZlbnQucmVzcG9uc2UgPSByZXNwb25zZTtcblxuICAgICAgICAgIHJldHVybiBzdWJtaXR0ZWRFdmVudDtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2Zvcm1JbnZhbGlkU3RhdGUkKCk6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICB0aGlzLl9mb3JtLmJyb2FkY2FzdCgnaW52YWxpZCcsIHRoaXMuX3N1Ym1pdEV2ZW50KTtcblxuICAgIGlmICh0aGlzLmludmFsaWQpIHtcbiAgICAgIHRoaXMuaW52YWxpZC5lbWl0KHRoaXMuX3N1Ym1pdEV2ZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gJ1BsZWFzZSByZXZpZXcgZXJyb3JzIGhpZ2hsaWdodGVkIGluIHJlZCc7XG4gICAgdGhpcy5fbWVzc2FnZS5lcnJvcihtZXNzYWdlLCB7IG1vZGU6IE1lc3NhZ2VNb2RlLlRvYXN0IH0pO1xuXG4gICAgY29uc3QgZWwgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm5nLWludmFsaWQnKTtcblxuICAgIGlmIChlbCkge1xuICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRocm93RXJyb3IoJ0Zvcm0gdmFsaWRhdGlvbiBlcnJvcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3N1Ym1pdHRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVTdWJtaXRCdXR0b25cbiAgICAgID8gdGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uLm5hbWVcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5kZWFjdGl2YXRpb25HdWFyZCkge1xuICAgICAgdGhpcy5fcmVnaXN0ZXJDYW5EZWFjdGl2YXRlR3VhcmQoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWdpc3RlckNvbmZpcm1EaWFsb2dCYWNrZHJvcEVzY2FwZSgpO1xuICAgIHRoaXMuX2xpc3RlbkhvdEtleXMoKTtcbiAgICB0aGlzLl9saXN0ZW5XaW5kb3dDbG9zZSgpO1xuICAgIHRoaXMuX2xpc3RlblN1Ym1pdCgpO1xuICAgIHRoaXMuX2xpc3RlbkZvcm1TdGF0dXMoKTtcblxuICAgIGlmICghdGhpcy5hdXRvY29tcGxldGUpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyQXV0b2NvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5jb25maXJtKSB7XG4gICAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTdWJtaXQoc3VibWl0OiAoZXZlbnQ6IFN1Ym1pdEV2ZW50KSA9PiBPYnNlcnZhYmxlPGFueT4gPSBudWxsKTogdm9pZCB7XG4gICAgaWYoIXN1Ym1pdCB8fCBzdWJtaXQgPT09IHRoaXMuX3N1Ym1pdCQpIHtcbiAgICAgIHRoaXMuX3N1Ym1pdCQgPSBudWxsO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJTdWJtaXQoc3VibWl0JDogKCkgPT4gT2JzZXJ2YWJsZTxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5fc3VibWl0JCA9IHN1Ym1pdCQ7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWdpc3RlckNvbmZpcm0oKTtcbiAgICB0aGlzLl9yZWdpc3RlckNvbmZpcm1EcmF3ZXJDbG9zZSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybVRhYnMoKTtcbiAgICB0aGlzLl9yZWdpc3RlckRyYXdlckNsb3NlKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJEaXJ0eVN1Ym1pdEJ1dHRvbigpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2NsZWFudXBDYW5EZWFjdGl2YXRlKCk7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dChudWxsKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVNuYXBzaG90KCk6IHZvaWQge1xuICAgIHRoaXMuX3NuYXBzaG90ID0gdGhpcy5uZ0Zvcm0udmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U25hcHNob3QoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHRoaXMuX3NuYXBzaG90IHx8IHt9O1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLnJlc2V0Rm9ybSgpO1xuXG4gICAgT2JqZWN0LmtleXModGhpcy5uZ0Zvcm0uY29udHJvbHMpXG4gICAgICAuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLm5nRm9ybS5jb250cm9sc1tuYW1lXTtcbiAgICAgICAgY29udHJvbC5yZXNldCh0aGlzLl9zbmFwc2hvdFtuYW1lXSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMucmVzZXRlZC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0ucmVzZXRGb3JtKCk7XG4gICAgdGhpcy5jbGVhcmVkLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXJ0eSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5mb3JtLm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gIH1cblxuICBwdWJsaWMgcHJpc3RpbmUoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0uZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICB9XG5cbiAgcHVibGljIHRyaWdnZXJTdWJtaXQob3B0aW9ucz86IHsgY29uZmlybWVkOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICB0aGlzLl9jb25maXJtZWQgPSBvcHRpb25zPy5jb25maXJtZWQ7XG4gICAgdGhpcy5uZ0Zvcm0ubmdTdWJtaXQuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIHRyaWdnZXJDb25maXJtKCk6IE9ic2VydmFibGU8Q29uZmlybVJlc3VsdD4ge1xuICAgIGNvbnN0IHN1Ym1pdHRlZCA9IHRoaXMuc3VibWl0dGluZyA/IHRoaXMuc3VibWl0dGVkLmFzT2JzZXJ2YWJsZSgpIDogb2Yoe30pO1xuXG4gICAgcmV0dXJuIHN1Ym1pdHRlZFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIG1lcmdlTWFwKCgpID0+IHRoaXMuX2Zvcm0uY29uZmlybVVuc2F2ZWQoW3RoaXNdKSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5jb250cm9sLmVuYWJsZSgpO1xuXG4gICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5jb250cm9sLmRpc2FibGUoKTtcblxuICAgIHRoaXMuX2J1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uZGlzYWJsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZEJ1dHRvbihidXR0b246IEZzQnV0dG9uRGlyZWN0aXZlKTogdm9pZCB7XG4gICAgdGhpcy5fYnV0dG9ucy5yZXNldChcbiAgICAgIFtcbiAgICAgICAgLi4udGhpcy5fYnV0dG9ucy50b0FycmF5KCksXG4gICAgICAgIGJ1dHRvbixcbiAgICAgIF0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUJ1dHRvbihidXR0b246IEZzQnV0dG9uRGlyZWN0aXZlKTogdm9pZCB7XG4gICAgdGhpcy5fYnV0dG9ucy5yZXNldChcbiAgICAgIFtcbiAgICAgICAgLi4udGhpcy5fYnV0dG9ucy50b0FycmF5KClcbiAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiAoYnV0dG9uICE9PSBpdGVtKSksXG4gICAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICBPYmplY3QudmFsdWVzKHRoaXMubmdGb3JtLmNvbnRyb2xzKVxuICAgICAgLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlblN1Ym1pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybVxuICAgICAgLm5nU3VibWl0XG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChldmVudCkgPT4ge1xuICAgICAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KSxcbiAgICAgICAgbWFwKChldmVudCkgPT4ge1xuICAgICAgICAgIHJldHVybiB7IGV2ZW50LCBjb25maXJtZWQ6IHRoaXMuX2NvbmZpcm1lZCB9O1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2NvbmZpcm1lZCA9IGZhbHNlKSxcbiAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gW0Zvcm1TdGF0dXMuVmFsaWQsIEZvcm1TdGF0dXMuSW52YWxpZF1cbiAgICAgICAgICAgIC5pbmNsdWRlcyh0aGlzLl9zdGF0dXMkLmdldFZhbHVlKCkpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2Jyb2FkY2FzVmFsaWRhdGluZ0V2ZW50cygpKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMudmFsaWRhdGUoKSksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9icm9hZGNhc3RTdWJtaXR0aW5nRXZlbnRzKCkpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fc2V0dXBBY3RpdmVTdWJtaXRCdXR0b24oKSksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9kaXNhYmxlQnV0dG9ucygpKSxcbiAgICAgICAgc3dpdGNoTWFwKChkYXRhKSA9PiB0aGlzLl93YWl0VW50aWxTdGF0dXNQZW5kaW5nKClcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIG1hcFRvKGRhdGEpLFxuICAgICAgICAgICkpLCAgICAgICBcbiAgICAgICAgbWVyZ2VNYXAoKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5uZ0Zvcm0uc3RhdHVzID09PSAnSU5WQUxJRCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb3JtSW52YWxpZFN0YXRlJDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ybVZhbGlkU3RhdGUkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgbWFwKChzdWJtaXRFdmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5zdWJtaXRFdmVudCxcbiAgICAgICAgICAgICAgICBjb25maXJtZWQ6IGRhdGEuY29uZmlybWVkLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlLCBzb3VyY2UkKSA9PiB7XG4gICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZSk7XG5cbiAgICAgICAgICByZXR1cm4gc291cmNlJDtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgoc3VibWl0dGVkRXZlbnQ6IFN1Ym1pdHRlZEV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5fY29tcGxldGVTdWJtaXQodHJ1ZSwgc3VibWl0dGVkRXZlbnQpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbkZvcm1TdGF0dXMoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdHVzJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChmb3JtU3RhdHVzOiBGb3JtU3RhdHVzKSA9PiB7XG4gICAgICAgIGNvbnN0IGNscyA9IFtGb3JtU3RhdHVzLlN1Ym1pdHRpbmcsIEZvcm1TdGF0dXMuVmFsaWRhdGluZ107XG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgICAgIGNsYXNzTGlzdC5yZW1vdmUoLi4uY2xzKTtcbiAgICAgICAgaWYgKGNscy5pbmRleE9mKGZvcm1TdGF0dXMpICE9PSAtMSkge1xuICAgICAgICAgIGNsYXNzTGlzdC5hZGQoZm9ybVN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5XaW5kb3dDbG9zZSgpOiB2b2lkIHtcbiAgICBmcm9tRXZlbnQod2luZG93LCAnYmVmb3JldW5sb2FkJylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpcm0gJiYgdGhpcy5jb25maXJtQnJvd3NlciAmJiB0aGlzLm5nRm9ybS5kaXJ0eSkge1xuICAgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWN0aXZlRGlhbG9nKGVsLCBkaWFsb2c6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKGVsLmlzU2FtZU5vZGUoZGlhbG9nKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGlhbG9nKGVsLnBhcmVudEVsZW1lbnQsIGRpYWxvZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuSG90S2V5cygpOiB2b2lkIHtcbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAna2V5ZG93bicpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fZGlhbG9nQmFja2Ryb3BFc2NhcGUgJiYgZXZlbnQuY29kZSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGNka092ZXJsYXlQYW5lID0gQXJyYXlcbiAgICAgICAgICAgICAgLmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5jZGstb3ZlcmxheS1wYW5lJykpLnBvcCgpO1xuICAgIFxuICAgICAgICAgICAgY29uc3QgYWN0aXZlRGlhbG9nID0gdGhpc1xuICAgICAgICAgICAgICAuX2FjdGl2ZURpYWxvZyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLl9kaWFsb2dSZWYuaWQpLCBjZGtPdmVybGF5UGFuZSk7XG5cbiAgICAgICAgICAgIGlmIChhY3RpdmVEaWFsb2cpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9ybUNsb3NlKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5jb2RlID09PSAnS2V5UycpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNob3J0Y3V0cykge1xuICAgICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudEluRm9ybShkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXMubmdGb3JtLm5nU3VibWl0Lm5leHQobnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZm9ybUNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpcm0gJiYgdGhpcy5jb25maXJtRGlhbG9nKSB7XG4gICAgICB0aGlzLnRyaWdnZXJDb25maXJtKClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChyZXN1bHQpID0+IGNvbmZpcm1SZXN1bHRDb250aW51ZShyZXN1bHQpKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gQ29uZmlybVJlc3VsdC5QcmlzdGluZSB8fCByZXN1bHQgPT09IENvbmZpcm1SZXN1bHQuRGlzY2FyZFxuICAgICAgICAgICAgICA/IG9mKG51bGwpXG4gICAgICAgICAgICAgIDogdGhpcy5zdWJtaXR0ZWQuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IFN1Ym1pdHRlZEV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKHJlc3VsdD8ucmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldEFjdGl2ZVN1Ym1pdEJ1dHRvbigpOiBGc0J1dHRvbkRpcmVjdGl2ZSB7XG4gICAgY29uc3Qgc3VibWl0QnV0dG9ucyA9IHRoaXMuX2J1dHRvbnNcbiAgICAgIC5maWx0ZXIoKGJ1dHRvbikgPT4gYnV0dG9uLnN1Ym1pdCk7XG5cbiAgICBjb25zdCBhY3RpdmVCdXR0b24gPSBzdWJtaXRCdXR0b25zXG4gICAgICAuZmluZCgoYnV0dG9uKSA9PiB7XG4gICAgICAgIHJldHVybiBidXR0b24uYWN0aXZlO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gYWN0aXZlQnV0dG9uID8gYWN0aXZlQnV0dG9uIDogc3VibWl0QnV0dG9uc1swXTtcbiAgfVxuXG4gIHByaXZhdGUgX2VsZW1lbnRJbkZvcm0oZWw6IEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZWwuaXNTYW1lTm9kZSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGVsLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50SW5Gb3JtKGVsLnBhcmVudEVsZW1lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBsZXRlU3VibWl0KHN1Y2Nlc3MsIHN1Ym1pdEV2ZW50OiBTdWJtaXR0ZWRFdmVudCk6IHZvaWQge1xuICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICB0aGlzLm5nRm9ybS5jb250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICB0aGlzLmNyZWF0ZVNuYXBzaG90KCk7XG4gICAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KHN1Ym1pdEV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVzZXRCdXR0b25zKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN1Ym1pdEJ1dHRvbikge1xuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uLnN1Y2Nlc3MoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVN1Ym1pdEJ1dHRvbi5lcnJvcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLlN1Ym1pdHRlZCk7XG5cbiAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuU3VjY2Vzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLkVycm9yKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5Db21wbGV0aW5nKTtcblxuICAgIGNvbnN0IHJlc2V0RGVsYXkgPSBzdWNjZXNzID8gdGhpcy5zdWNjZXNzRGVsYXkgOiB0aGlzLmVycm9yRGVsYXk7XG5cbiAgICBvZih0cnVlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlbGF5KHJlc2V0RGVsYXkpLFxuICAgICAgICBmaXJzdCgpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5uZ0Zvcm0uZm9ybS5zdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5WYWxpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuSW52YWxpZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZXNldEJ1dHRvbnMoKTtcbiAgICAgICAgdGhpcy5fcmVzZXRBY3RpdmVCdXR0b25zKCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNldEJ1dHRvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgIGJ1dHRvbi5yZXNldCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXRBY3RpdmVCdXR0b25zKCk6IHZvaWQge1xuICAgIHRoaXMuX2J1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24ucmVzZXRBY3RpdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29uZmlybSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChjaGFuZ2VzKSA9PiB7XG4gICAgICAgIGlmKHRoaXMuX2RpYWxvZ0JhY2tkcm9wRXNjYXBlICYmIHRoaXMuX2RpYWxvZ1JlZikge1xuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlybSkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gT2JqZWN0LmtleXModGhpcy5fc25hcHNob3QpO1xuXG4gICAgICAgICAgT2JqZWN0LmtleXMoY2hhbmdlcylcbiAgICAgICAgICAgIC5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc25hcHNob3RbbmFtZV0gPSBjaGFuZ2VzW25hbWVdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckRyYXdlckNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kcmF3ZXJSZWYpIHtcbiAgICAgIHRoaXMuX2RyYXdlclJlZi5jbG9zZVN0YXJ0JFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5zdWJtaXR0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMkXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoc3RhdHVzKSA9PiBzdGF0dXMgPT09IEZvcm1TdGF0dXMuU3VjY2VzcyB8fCBzdGF0dXMgPT09IEZvcm1TdGF0dXMuRXJyb3IpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gRm9ybVN0YXR1cy5TdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQobnVsbCk7XG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQobnVsbCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNvbmZpcm1EcmF3ZXJDbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZHJhd2VyUmVmKSB7XG4gICAgICB0aGlzLl9kcmF3ZXJSZWYuY2xvc2VTdGFydCRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaWlmKFxuICAgICAgICAgICAgICAoKSA9PiB0aGlzLmNvbmZpcm0gJiYgdGhpcy5jb25maXJtRHJhd2VyLFxuICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDb25maXJtKClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgIG1hcCgocmVzdWx0KSA9PiBjb25maXJtUmVzdWx0Q29udGludWUocmVzdWx0KSksXG4gICAgICAgICAgICAgICAgICB0YXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNvbmZpcm1UYWJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRhYkdyb3VwKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckNvbmZpcm1UYWJHcm91cCh0aGlzLnRhYkdyb3VwKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWdpc3RlckNvbmZpcm1UYWJHcm91cHModGhpcy5fdGFiR3JvdXBzLnRvQXJyYXkoKSk7XG4gICAgdGhpcy5fdGFiR3JvdXBzLmNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybVRhYkdyb3Vwcyh0aGlzLl90YWJHcm91cHMudG9BcnJheSgpKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtVGFiR3JvdXBzKHRhYkdyb3VwczogTWF0VGFiR3JvdXBbXSk6IHZvaWQge1xuICAgIHRhYkdyb3Vwcy5mb3JFYWNoKCh0YWJHcm91cDogTWF0VGFiR3JvdXApID0+IHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybVRhYkdyb3VwKHRhYkdyb3VwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29uZmlybVRhYkdyb3VwKHRhYkdyb3VwOiBNYXRUYWJHcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpcm1UYWJHcm91cCA9IHRhYkdyb3VwIGFzIENvbmZpcm1UYWJHcm91cDtcbiAgICBpZiAoIWNvbmZpcm1UYWJHcm91cC5fb3JpZ2luYWxIYW5kbGVDbGljaykge1xuICAgICAgY29uZmlybVRhYkdyb3VwLl9vcmlnaW5hbEhhbmRsZUNsaWNrID0gdGFiR3JvdXAuX2hhbmRsZUNsaWNrO1xuICAgICAgY29uZmlybVRhYkdyb3VwLl9oYW5kbENsaWNrJCA9IG5ldyBTdWJqZWN0PHtcbiAgICAgICAgIHRhYjogTWF0VGFiOyBcbiAgICAgICAgIHRhYkhlYWRlcjogTWF0VGFiSGVhZGVyOyBcbiAgICAgICAgIGlkeDogbnVtYmVyIFxuICAgICAgICB9PigpO1xuICAgICAgY29uZmlybVRhYkdyb3VwLl9oYW5kbGVDbGljayA9ICh0YWI6IE1hdFRhYiwgdGFiSGVhZGVyOiBNYXRUYWJIZWFkZXIsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmIChjb25maXJtVGFiR3JvdXAuX2hhbmRsQ2xpY2skLm9ic2VydmVycy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25maXJtVGFiR3JvdXAuX2hhbmRsQ2xpY2skLm5leHQoeyB0YWIsIHRhYkhlYWRlciwgaWR4IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmZpcm1UYWJHcm91cC5fb3JpZ2luYWxIYW5kbGVDbGljayh0YWIsIHRhYkhlYWRlciwgaWR4KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25maXJtVGFiR3JvdXAuX2hhbmRsQ2xpY2skXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLnN1Ym1pdHRpbmcpLFxuICAgICAgICBzd2l0Y2hNYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYodGhpcy5jb25maXJtICYmIHRoaXMuY29uZmlybVRhYnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyaWdnZXJDb25maXJtKClcbiAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChjb25maXJtUmVzdWx0Q29udGludWUocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25maXJtVGFiR3JvdXAuc2VsZWN0ZWRJbmRleCA9IGV2ZW50LmlkeDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25maXJtVGFiR3JvdXAuX29yaWdpbmFsSGFuZGxlQ2xpY2soZXZlbnQudGFiLCBldmVudC50YWJIZWFkZXIsIGV2ZW50LmlkeCk7XG5cbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtRGlhbG9nQmFja2Ryb3BFc2NhcGUoKTogdm9pZCB7XG4gICAgaWYodGhpcy5fZGlhbG9nUmVmKSB7XG4gICAgICB0aGlzLl9kaWFsb2dCYWNrZHJvcEVzY2FwZSA9ICF0aGlzLl9kaWFsb2dSZWY/LmRpc2FibGVDbG9zZTtcblxuICAgICAgaWYgKHRoaXMuX2RpYWxvZ0JhY2tkcm9wRXNjYXBlKSB7XG4gICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5iYWNrZHJvcENsaWNrKClcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZm9ybUNsb3NlKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZGVzdHJveSRcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSBmYWxzZTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckF1dG9jb21wbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWdpc3RlckNvbnRyb2wgPSB0aGlzLm5nRm9ybS5mb3JtLnJlZ2lzdGVyQ29udHJvbC5iaW5kKHRoaXMubmdGb3JtLmZvcm0pO1xuXG4gICAgdGhpcy5uZ0Zvcm0uZm9ybS5yZWdpc3RlckNvbnRyb2wgPSAobmFtZTogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcblxuICAgICAgY29uc3QgZWw6IEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT0nJHtuYW1lfSddYCk7XG5cbiAgICAgIGlmIChlbCkge1xuICAgICAgICBpZiAoIWVsLmdldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJykpIHtcbiAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICdub25lJyk7XG4gICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCduYW1lJywgYCR7bmFtZX0tJHtndWlkKCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyQ29udHJvbChuYW1lLCBjb250cm9sKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJEaXJ0eVN1Ym1pdEJ1dHRvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubmdGb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5uZ0Zvcm0uZm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9idXR0b25zLmNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fYnV0dG9uc1xuICAgICAgLmZpbHRlcigoYnV0dG9uKSA9PiBidXR0b24uc3VibWl0KVxuICAgICAgLmZvckVhY2goKHN1Ym1pdEJ1dHRvbjogRnNCdXR0b25EaXJlY3RpdmUpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpcm0gfHwgIXRoaXMuZGlydHlTdWJtaXRCdXR0b24gfHwgdGhpcy5uZ0Zvcm0uZGlydHkgfHwgIXN1Ym1pdEJ1dHRvbi5kaXJ0eVN1Ym1pdCkge1xuICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5lbmFibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJtaXRCdXR0b24uZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2Jyb2FkY2FzdFN1Ym1pdHRpbmdFdmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuU3VibWl0dGluZyk7XG4gICAgdGhpcy5fZm9ybS5icm9hZGNhc3QoJ3N1Ym1pdCcsIHRoaXMubmdGb3JtKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Jyb2FkY2FzVmFsaWRhdGluZ0V2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5WYWxpZGF0aW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwQWN0aXZlU3VibWl0QnV0dG9uKCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2ZVN1Ym1pdEJ1dHRvbiA9IHRoaXMuX2dldEFjdGl2ZVN1Ym1pdEJ1dHRvbigpO1xuICAgIHRoaXMuX3Jlc2V0QnV0dG9ucygpO1xuXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN1Ym1pdEJ1dHRvbikge1xuICAgICAgdGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlQnV0dG9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9idXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgYnV0dG9uLmRpc2FibGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3dhaXRVbnRpbFN0YXR1c1BlbmRpbmcoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5uZ0Zvcm0uc3RhdHVzQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aGlzLm5nRm9ybS5zdGF0dXMpLFxuICAgICAgICBmaXJzdCgoc3RhdGUpID0+IHN0YXRlICE9PSAnUEVORElORycpLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUVycm9yKGU6IFN1Ym1pdHRlZEV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coJyVjIEZvcm0gU3VibWl0ICcsICdjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6ICNEMzNGNDknLCAnRXJyb3Igb2NjdXJlZCcpO1xuICAgIGNvbnNvbGUuZ3JvdXAoJ0Vycm9yIERldGFpbHM6Jyk7XG4gICAgY29uc29sZS5sb2coJ01lc3NhZ2U6ICcsIGUpO1xuICAgIGNvbnNvbGUubG9nKCdGb3JtUmVmOiAnLCB0aGlzKTtcblxuICAgIGlmICh0aGlzLm5nRm9ybS5pbnZhbGlkKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBnZXRGb3JtRXJyb3JzKHRoaXMubmdGb3JtLmNvbnRyb2wsIG51bGwpO1xuICAgICAgY29uc29sZS5sb2coJ1ZhbGlkYXRpb24gRXJyb3JzOiAnLCBlcnJvcnMpO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICB0aGlzLl9jb21wbGV0ZVN1Ym1pdChmYWxzZSwgbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNhbkRlYWN0aXZhdGVHdWFyZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZyA9IGdldEFjdGl2ZVJvdXRlKHRoaXMuX3JvdXRlKS5yb3V0ZUNvbmZpZztcblxuICAgIGlmICghdGhpcy5fYWN0aXZhdGVkUm91dGVDb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9mb3JtLnJlZ2lzdGVyRm9ybURpcmVjdGl2ZSh0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jb21wb25lbnQsIHRoaXMpO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUpKSB7XG4gICAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlID0gW107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUuaW5kZXhPZihGb3JtRGVhY3RpdmF0ZUd1YXJkKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUucHVzaChGb3JtRGVhY3RpdmF0ZUd1YXJkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbGVhbnVwQ2FuRGVhY3RpdmF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZ3VhcmRJbmRleCA9IHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUuaW5kZXhPZihGb3JtRGVhY3RpdmF0ZUd1YXJkKTtcbiAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlLnNwbGljZShndWFyZEluZGV4LCAxKTtcblxuICAgIHRoaXMuX2Zvcm0ucmVtb3ZlRm9ybURpcmVjdGl2ZSh0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jb21wb25lbnQpO1xuICB9XG5cbn1cbiJdfQ==
|
|
645
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RpcmVjdGl2ZXMvZm9ybS9mb3JtLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFJTixRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBUyxNQUFNLGlCQUFpQixDQUFDO0FBRXhELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV4RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0QsT0FBTyxFQUNMLGVBQWUsRUFDZixLQUFLLEVBQ0wsU0FBUyxFQUNULEdBQUcsRUFFSCxFQUFFLEVBQ0YsVUFBVSxHQUNYLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLEtBQUssRUFDTCxHQUFHLEVBQ0gsUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7OztBQVN2RCxNQUFNLE9BQU8sZUFDWCxTQUFRLG1CQUFtQjtJQW9GbEI7SUFDQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ1k7SUFFWjtJQUdBO0lBRUE7SUE3RkgsZUFBZSxHQUFHLHNDQUFzQyxDQUFDO0lBR3pELGVBQWUsR0FBRyx3REFBd0QsQ0FBQztJQUczRSxZQUFZLEdBQUcsZ0RBQWdELENBQUM7SUFHaEUsYUFBYSxHQUFHLDhDQUE4QyxDQUFDO0lBRy9ELFlBQVksR0FBRyxLQUFLLENBQUM7SUFHckIsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLFdBQVc7SUFHN0IsT0FBTyxHQUE0QixJQUFJLENBQUM7SUFHeEMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUdyQixhQUFhLEdBQUcsSUFBSSxDQUFDO0lBR3JCLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFHdEIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBRWhDLElBQ1csTUFBTSxDQUFDLE9BQWdEO1FBQ2hFLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUdNLFlBQVksR0FBRyxDQUFDLENBQUM7SUFHakIsVUFBVSxHQUFHLElBQUksQ0FBQztJQUdsQixpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFHekIsV0FBVyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRzVELE9BQU8sR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUd4RCxLQUFLLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7SUFHdEQsU0FBUyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRzFELE9BQU8sR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUd4RCxPQUFPLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7SUFHeEQsV0FBVyxHQUFHLElBQUksQ0FBQztJQUVsQixnQkFBZ0IsQ0FBQztJQUNqQixxQkFBcUIsR0FBRyxLQUFLLENBQUM7SUFDOUIsU0FBUyxHQUEyQixFQUFFLENBQUM7SUFDdkMscUJBQXFCLENBQWU7SUFDcEMsUUFBUSxHQUFHLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRCxRQUFRLEdBQTZDLElBQUksQ0FBQztJQUVsRSxZQUVTLE1BQWMsRUFDYixLQUFhLEVBQ2IsUUFBb0IsRUFDcEIsUUFBbUIsRUFDbkIsT0FBZSxFQUNmLE1BQXlCLEVBQ2IsVUFBZ0MsRUFFNUMsVUFBNkIsRUFHN0IsVUFBMEIsRUFFMUIsTUFBc0I7UUFFOUIsS0FBSyxFQUFFLENBQUM7UUFmRCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2IsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUFDYixlQUFVLEdBQVYsVUFBVSxDQUFzQjtRQUU1QyxlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUc3QixlQUFVLEdBQVYsVUFBVSxDQUFnQjtRQUUxQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtJQUdoQyxDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxVQUFVLENBQUMsVUFBVSxDQUFDO0lBQzVELENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLFVBQVUsQ0FBQyxVQUFVLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssVUFBVSxDQUFDLFVBQVUsQ0FBQztJQUM1RCxDQUFDO0lBRUQsSUFBWSxZQUFZO1FBQ3RCLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzNCLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBWSxnQkFBZ0I7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVuQyxNQUFNLGNBQWMsR0FBbUI7WUFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMxQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBb0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFeEQsT0FBTyxPQUFPO2FBQ1gsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2YsY0FBYyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFFbkMsT0FBTyxjQUFjLENBQUM7UUFDeEIsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDekIsQ0FBQztJQUNOLENBQUM7SUFFRCxJQUFZLGtCQUFrQjtRQUM1QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLHlDQUF5QyxDQUFDO1FBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUUxRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFcEUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNQLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQVksVUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUM7SUFDdkQsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxDQUFDO1FBRWxDLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDckMsQ0FBQztRQUVELElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUFzQjtRQUN2QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLFdBQVcsQ0FBQyxTQUFrRCxJQUFJO1FBQ3ZFLElBQUcsQ0FBQyxNQUFNLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDO1FBRUQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sY0FBYyxDQUFDLE9BQThCO1FBQ2xELElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBRXhCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBRU0sV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV4QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2FBQzlCLE9BQU8sQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVNLGFBQWEsQ0FBQyxPQUFnQztRQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU0sY0FBYztRQUNuQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFM0UsT0FBTyxTQUFTO2FBQ2IsSUFBSSxDQUNILElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDaEQsQ0FBQztJQUNOLENBQUM7SUFFTSxNQUFNO1FBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFN0IsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVNLE9BQU87UUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUMsYUFBYSxFQUFFO2FBQ2pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMxQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sUUFBUTtRQUNiLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7YUFDaEMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkIsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxPQUFPLENBQUMsV0FBd0I7UUFDckMsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDO2FBQ25CLElBQUksQ0FDSCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsRUFDbkMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUMxQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsRUFDbkMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLEVBQzFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFDakMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7YUFDL0MsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FDaEIsQ0FBQyxFQUNKLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUNqQyxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0IsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXJCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxDQUFDLGNBQThCLEVBQUUsRUFBRTtZQUNyQyxJQUFHLGNBQWMsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUk7YUFDRCxNQUFNO2FBQ04sUUFBUTthQUNSLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNaLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsRUFDRixNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQztpQkFDMUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFDaEQsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDekI7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxRQUFRO2FBQ1YsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3pCO2FBQ0EsU0FBUyxDQUFDLENBQUMsVUFBc0IsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO1lBQ3hELFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUN6QixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFUCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDO2FBQzlCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUN6QjthQUNBLFNBQVMsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQzFCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzdELEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxhQUFhLENBQUMsRUFBRSxFQUFFLE1BQW1CO1FBQzNDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLElBQUksRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2xDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDO2lCQUMzQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDekI7aUJBQ0EsU0FBUyxDQUFDLENBQUMsS0FBb0IsRUFBRSxFQUFFO2dCQUNsQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUMxRCxNQUFNLGNBQWMsR0FBRyxLQUFLO3lCQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFjLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFFM0UsTUFBTSxZQUFZLEdBQUcsSUFBSTt5QkFDdEIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztvQkFFOUUsSUFBSSxZQUFZLEVBQUUsQ0FBQzt3QkFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFOzRCQUNwQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7d0JBQ3BCLENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDOUQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUV2QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDbkIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDOzRCQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2xDLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLGNBQWMsRUFBRTtpQkFDbEIsSUFBSSxDQUNILE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDakQsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ25CLE9BQU8sTUFBTSxLQUFLLGFBQWEsQ0FBQyxRQUFRLElBQUksTUFBTSxLQUFLLGFBQWEsQ0FBQyxPQUFPO29CQUMxRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztvQkFDVixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQyxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUN6QjtpQkFDQSxTQUFTLENBQUMsQ0FBQyxNQUFzQixFQUFFLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsSUFBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMzQyxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztRQUNqRCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFO2FBQ3hCLE9BQU87YUFDUCxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU8sY0FBYyxDQUFDLEVBQVc7UUFDaEMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxJQUFJLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM1QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxlQUFlLENBQUMsT0FBTyxFQUFFLFdBQTJCO1FBQzFELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsRCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV6QyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRWpFLEVBQUUsQ0FBQyxJQUFJLENBQUM7YUFDTCxJQUFJLENBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUNqQixLQUFLLEVBQUUsRUFDUCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUN6QjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBQy9DLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGFBQWE7UUFDbkIsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsYUFBYSxFQUFFO2FBQ2pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMxQixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVk7YUFDMUIsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3pCO2FBQ0EsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDckIsSUFBRyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDdEMsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFN0MsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7cUJBQ2pCLE9BQU8sQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO29CQUN4QixJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3ZDLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVztpQkFDeEIsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3pCO2lCQUNBLFNBQVMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFFBQVE7eUJBQ1YsSUFBSSxDQUNILE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxPQUFPLElBQUksTUFBTSxLQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFDaEYsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDekI7eUJBQ0EsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ3BCLElBQUksTUFBTSxLQUFLLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs0QkFDbEMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDdEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUN4QixDQUFDOzZCQUFNLENBQUM7NEJBQ04sVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNyQixDQUFDO29CQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUM7cUJBQU0sQ0FBQztvQkFDTixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0QixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3hCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDSCxDQUFDO0lBRU8sMkJBQTJCO1FBQ2pDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVztpQkFDeEIsSUFBSSxDQUNILFNBQVMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUN2QixPQUFPLEdBQUcsQ0FDUixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQ3hDLElBQUksQ0FBQyxjQUFjLEVBQUU7cUJBQ2xCLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQzlDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNiLElBQUksTUFBTSxFQUFFLENBQUM7d0JBQ1gsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDdEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN4QixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUNILEVBQ0gsS0FBSyxDQUFDLEdBQUcsRUFBRTtvQkFDVCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0QixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBRXRCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQixDQUFDLENBQUMsQ0FDSCxDQUFDO1lBQ0osQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDekI7aUJBQ0EsU0FBUyxFQUFFLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFTyxvQ0FBb0M7UUFDMUMsSUFBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUM7WUFFNUQsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUU7cUJBQzVCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUN6QjtxQkFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDcEIsQ0FBQyxDQUFDLENBQUM7Z0JBRUwsSUFBSSxDQUFDLFFBQVE7cUJBQ1YsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQ3ZDLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFaEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBWSxFQUFFLE9BQXdCLEVBQUUsRUFBRTtZQUU1RSxNQUFNLEVBQUUsR0FBWSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxDQUFDO1lBRXZGLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ1AsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztvQkFDckMsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ3hDLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDL0MsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLDBCQUEwQjtRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWTthQUMxQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDekI7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsYUFBYSxFQUFFO2FBQ2pCLE9BQU8sQ0FBQyxPQUFPO2FBQ2YsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3pCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLHlCQUF5QjtRQUMvQixJQUFJLENBQUMsYUFBYSxFQUFFO2FBQ2pCLE9BQU87YUFDUCxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDakMsT0FBTyxDQUFDLENBQUMsWUFBK0IsRUFBRSxFQUFFO1lBQzNDLElBQ0UsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFDMUYsQ0FBQztnQkFDRCxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLElBQUksQ0FBQyxhQUFhLEVBQUU7YUFDakIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXJCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BELENBQUM7SUFDSCxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsYUFBYSxFQUFFO2FBQ2pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMxQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhO2FBQzdCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFDN0IsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQ3RDLENBQUM7SUFDTixDQUFDO0lBRU8sWUFBWSxDQUFDLENBQWlCO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUseUNBQXlDLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDM0YsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRS9CLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTywyQkFBMkI7UUFDakMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDO1FBRXJFLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUU3RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUNoRCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNyRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDaEMsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2RSxDQUFDO3VHQWp2QlUsZUFBZSxrQkFvRmhCLE1BQU0saU1BUU0sWUFBWSw2QkFHWixTQUFTOzJGQS9GcEIsZUFBZTs7MkZBQWYsZUFBZTtrQkFKM0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsUUFBUSxFQUFFLFFBQVE7aUJBQ25COzswQkFxRkksTUFBTTsyQkFBQyxNQUFNOzswQkFPYixRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFlBQVk7OzBCQUcvQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFNBQVM7c0VBMUZ4QixlQUFlO3NCQURyQixLQUFLO2dCQUlDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLE9BQU87c0JBRGIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsY0FBYztzQkFEcEIsS0FBSztnQkFJQyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBSUssTUFBTTtzQkFEaEIsS0FBSztnQkFVQyxZQUFZO3NCQURsQixLQUFLO2dCQUlDLFVBQVU7c0JBRGhCLEtBQUs7Z0JBSUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQUlDLFdBQVc7c0JBRGpCLE1BQU07dUJBQUMsUUFBUTtnQkFJVCxPQUFPO3NCQURiLE1BQU07Z0JBSUEsS0FBSztzQkFEWCxNQUFNO2dCQUlBLFNBQVM7c0JBRGYsTUFBTTtnQkFJQSxPQUFPO3NCQURiLE1BQU07Z0JBSUEsT0FBTztzQkFEYixNQUFNO2dCQUlBLFdBQVc7c0JBRGpCLFdBQVc7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbmltcG9ydCB7IGd1aWQgfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgRHJhd2VyUmVmIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZHJhd2VyJztcbmltcG9ydCB7IEZzTWVzc2FnZSwgTWVzc2FnZU1vZGUgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcblxuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBkZWZlcixcbiAgZnJvbUV2ZW50LFxuICBpaWYsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICB0aHJvd0Vycm9yLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRlbGF5LFxuICBmaWx0ZXIsXG4gIGZpcnN0LFxuICBtYXAsXG4gIG1lcmdlTWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRm9ybURlYWN0aXZhdGVHdWFyZCB9IGZyb20gJy4uLy4uL2d1YXJkcy9mb3JtLWRlYWN0aXZhdGUuZ3VhcmQnO1xuaW1wb3J0IHsgY29uZmlybVJlc3VsdENvbnRpbnVlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9jb25maXJtLXJlc3VsdC1jb250aW51ZSc7XG5pbXBvcnQgeyBnZXRBY3RpdmVSb3V0ZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZ2V0LWFjdGl2ZS1yb3V0ZSc7XG5pbXBvcnQgeyBnZXRGb3JtRXJyb3JzIH0gZnJvbSAnLi4vLi4vaGVscGVycy9nZXQtZm9ybS1lcnJvcnMnO1xuaW1wb3J0IHsgRnNGb3JtIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZnNmb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgRnNCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IEZzRm9ybUJhc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9mb3JtLWJhc2UnO1xuaW1wb3J0IHsgRnNGb3JtR3JvdXBEaXJlY3RpdmUgfSBmcm9tICcuLi9mb3JtLWdyb3VwJztcblxuaW1wb3J0IHsgQ29uZmlybVJlc3VsdCB9IGZyb20gJy4vLi4vLi4vZW51bXMvY29uZmlybS1yZXN1bHQnO1xuaW1wb3J0IHsgRm9ybVN0YXR1cyB9IGZyb20gJy4vLi4vLi4vZW51bXMvZm9ybS1zdGF0dXMnO1xuaW1wb3J0IHsgQ29uZmlybUNvbmZpZywgU3VibWl0dGVkRXZlbnQgfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgU3VibWl0RXZlbnQgfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMvc3VibWl0LWV2ZW50JztcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZnNGb3JtXScsXG4gIGV4cG9ydEFzOiAnZnNGb3JtJyxcbn0pXG5leHBvcnQgY2xhc3MgRnNGb3JtRGlyZWN0aXZlIFxuICBleHRlbmRzIEZzRm9ybUJhc2VEaXJlY3RpdmUgXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHdyYXBwZXJTZWxlY3RvciA9ICcuZnMtZm9ybS13cmFwcGVyLC5tYXQtbWRjLWZvcm0tZmllbGQnO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtZXNzYWdlU2VsZWN0b3IgPSAnLmZzLWZvcm0tbWVzc2FnZSwubWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgaGludFNlbGVjdG9yID0gJy5mcy1mb3JtLWhpbnQsLm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXdyYXBwZXInO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsYWJlbFNlbGVjdG9yID0gJy5mcy1mb3JtLWxhYmVsLC5tZGMtZmxvYXRpbmctbGFiZWw+bWF0LWxhYmVsJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgYXV0b2NvbXBsZXRlID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3J0Y3V0cyA9IHRydWU7IC8vIEN0cmwgKyBzXG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbmZpcm06IENvbmZpcm1Db25maWcgfCBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlybURpYWxvZyA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbmZpcm1EcmF3ZXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maXJtQnJvd3NlciA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRpcnR5U3VibWl0QnV0dG9uID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHN1Ym1pdChzdWJtaXQkOiAoZXZlbnQ6IFN1Ym1pdEV2ZW50KSA9PiBPYnNlcnZhYmxlPGFueT4pIHtcbiAgICB0aGlzLl9zdWJtaXQkID0gc3VibWl0JDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3VibWl0KCk6IChldmVudDogU3VibWl0RXZlbnQpID0+IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX3N1Ym1pdCQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc3VjY2Vzc0RlbGF5ID0gMDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZXJyb3JEZWxheSA9IDEwMDA7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRlYWN0aXZhdGlvbkd1YXJkID0gdHJ1ZTtcbiBcbiAgQE91dHB1dCgnZnNGb3JtJylcbiAgcHVibGljIHN1Ym1pdEV2ZW50OiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgaW52YWxpZDogRXZlbnRFbWl0dGVyPFN1Ym1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHZhbGlkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc3VibWl0dGVkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVzZXRlZDogRXZlbnRFbWl0dGVyPFN1Ym1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGNsZWFyZWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mcy1mb3JtJylcbiAgcHVibGljIGZzRm9ybUNsYXNzID0gdHJ1ZTtcblxuICBwcml2YXRlIF9yZWdpc3RlckNvbnRyb2w7XG4gIHByaXZhdGUgX2RpYWxvZ0JhY2tkcm9wRXNjYXBlID0gZmFsc2U7XG4gIHByaXZhdGUgX3NuYXBzaG90OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIHByaXZhdGUgX2FjdGl2YXRlZFJvdXRlQ29uZmlnOiBSb3V0ZSB8IG51bGw7XG4gIHByaXZhdGUgX3N0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KEZvcm1TdGF0dXMuVmFsaWQpO1xuICBwcml2YXRlIF9zdWJtaXQkOiAoZXZlbnQ/OiBTdWJtaXRFdmVudCkgPT4gT2JzZXJ2YWJsZTxhbnk+ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE5nRm9ybSlcbiAgICBwdWJsaWMgbmdGb3JtOiBOZ0Zvcm0sXG4gICAgcHJpdmF0ZSBfZm9ybTogRnNGb3JtLFxuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfbWVzc2FnZTogRnNNZXNzYWdlLFxuICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgX2NkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9mb3JtR3JvdXA6IEZzRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTWF0RGlhbG9nUmVmKVxuICAgIHByaXZhdGUgX2RpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPGFueT4sXG5cbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERyYXdlclJlZilcbiAgICBwcml2YXRlIF9kcmF3ZXJSZWY6IERyYXdlclJlZjxhbnk+LFxuXG4gICAgcHJpdmF0ZSBfcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICApIHsgXG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3VibWl0dGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzJC5nZXRWYWx1ZSgpID09PSBGb3JtU3RhdHVzLlN1Ym1pdHRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbGlkYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gRm9ybVN0YXR1cy5WYWxpZGF0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBjb21wbGV0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXMkLmdldFZhbHVlKCkgPT09IEZvcm1TdGF0dXMuQ29tcGxldGluZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9zdWJtaXRFdmVudCgpOiBTdWJtaXRFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nRm9ybTogdGhpcy5uZ0Zvcm0sXG4gICAgICBzdWJtaXR0ZXI6IHRoaXMuX3N1Ym1pdHRlcixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2Zvcm1WYWxpZFN0YXRlJCgpOiBPYnNlcnZhYmxlPFN1Ym1pdHRlZEV2ZW50PiB7XG4gICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHRoaXMuX3N1Ym1pdEV2ZW50KTtcbiAgICB0aGlzLnZhbGlkLmVtaXQodGhpcy5fc3VibWl0RXZlbnQpO1xuXG4gICAgY29uc3Qgc3VibWl0dGVkRXZlbnQ6IFN1Ym1pdHRlZEV2ZW50ID0ge1xuICAgICAgbmdGb3JtOiB0aGlzLm5nRm9ybSxcbiAgICAgIHN1Ym1pdHRlcjogdGhpcy5fc3VibWl0dGVyLFxuICAgICAgcmVzcG9uc2U6IG51bGwsXG4gICAgfTtcblxuICAgIGNvbnN0IHN1Ym1pdCQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuX3N1Ym1pdCQgP1xuICAgICAgdGhpcy5fc3VibWl0JCh0aGlzLl9zdWJtaXRFdmVudCkgOiBvZihzdWJtaXR0ZWRFdmVudCk7XG5cbiAgICByZXR1cm4gc3VibWl0JFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBzdWJtaXR0ZWRFdmVudC5yZXNwb25zZSA9IHJlc3BvbnNlO1xuXG4gICAgICAgICAgcmV0dXJuIHN1Ym1pdHRlZEV2ZW50O1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9mb3JtSW52YWxpZFN0YXRlJCgpOiBPYnNlcnZhYmxlPG5ldmVyPiB7XG4gICAgaWYgKHRoaXMuaW52YWxpZCkge1xuICAgICAgdGhpcy5pbnZhbGlkLmVtaXQodGhpcy5fc3VibWl0RXZlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSAnUGxlYXNlIHJldmlldyBlcnJvcnMgaGlnaGxpZ2h0ZWQgaW4gcmVkJztcbiAgICB0aGlzLl9tZXNzYWdlLmVycm9yKG1lc3NhZ2UsIHsgbW9kZTogTWVzc2FnZU1vZGUuVG9hc3QgfSk7XG5cbiAgICBjb25zdCBlbCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubmctaW52YWxpZCcpO1xuXG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ0Zvcm0gdmFsaWRhdGlvbiBlcnJvcicpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9zdWJtaXR0ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Rm9ybUdyb3VwKCkuYWN0aXZlU3VibWl0QnV0dG9uPy5uYW1lO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX2Zvcm1Hcm91cD8uZGVyZWdpc3RlckZvcm0oKTtcblxuICAgIGlmICh0aGlzLmRlYWN0aXZhdGlvbkd1YXJkKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckNhbkRlYWN0aXZhdGVHdWFyZCgpO1xuICAgIH1cblxuICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybURpYWxvZ0JhY2tkcm9wRXNjYXBlKCk7XG4gICAgdGhpcy5fbGlzdGVuSG90S2V5cygpO1xuICAgIHRoaXMuX2xpc3RlbldpbmRvd0Nsb3NlKCk7XG4gICAgdGhpcy5fbGlzdGVuU3VibWl0KCk7XG4gICAgdGhpcy5fbGlzdGVuRm9ybVN0YXR1cygpO1xuXG4gICAgaWYgKCF0aGlzLmF1dG9jb21wbGV0ZSkge1xuICAgICAgdGhpcy5fcmVnaXN0ZXJBdXRvY29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmNvbmZpcm0pIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhclN1Ym1pdChzdWJtaXQ6IChldmVudDogU3VibWl0RXZlbnQpID0+IE9ic2VydmFibGU8YW55PiA9IG51bGwpOiB2b2lkIHtcbiAgICBpZighc3VibWl0IHx8IHN1Ym1pdCA9PT0gdGhpcy5fc3VibWl0JCkge1xuICAgICAgdGhpcy5fc3VibWl0JCA9IG51bGw7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclN1Ym1pdChzdWJtaXQkOiAoKSA9PiBPYnNlcnZhYmxlPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJtaXQkID0gc3VibWl0JDtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nQWZ0ZXJDb250ZW50SW5pdCgpOyBcbiAgICB0aGlzLl9yZWdpc3RlckNvbmZpcm0oKTtcbiAgICB0aGlzLl9yZWdpc3RlckNvbmZpcm1EcmF3ZXJDbG9zZSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyRHJhd2VyQ2xvc2UoKTtcbiAgICB0aGlzLl9yZWdpc3RlckRpcnR5U3VibWl0QnV0dG9uKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZm9ybUdyb3VwPy5yZWdpc3RlckZvcm0obnVsbCk7XG5cbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuX2NsZWFudXBDYW5EZWFjdGl2YXRlKCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlU25hcHNob3QoKTogdm9pZCB7XG4gICAgdGhpcy5fc25hcHNob3QgPSB0aGlzLm5nRm9ybS52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTbmFwc2hvdCgpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4gdGhpcy5fc25hcHNob3QgfHwge307XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0ucmVzZXRGb3JtKCk7XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLm5nRm9ybS5jb250cm9scylcbiAgICAgIC5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMubmdGb3JtLmNvbnRyb2xzW25hbWVdO1xuICAgICAgICBjb250cm9sLnJlc2V0KHRoaXMuX3NuYXBzaG90W25hbWVdKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZXNldGVkLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5yZXNldEZvcm0oKTtcbiAgICB0aGlzLmNsZWFyZWQuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIGRpcnR5KCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmZvcm0ubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmlzdGluZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlclN1Ym1pdChvcHRpb25zPzogeyBjb25maXJtZWQ6IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLm5nU3VibWl0LmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmlnZ2VyQ29uZmlybSgpOiBPYnNlcnZhYmxlPENvbmZpcm1SZXN1bHQ+IHtcbiAgICBjb25zdCBzdWJtaXR0ZWQgPSB0aGlzLnN1Ym1pdHRpbmcgPyB0aGlzLnN1Ym1pdHRlZC5hc09ic2VydmFibGUoKSA6IG9mKHt9KTtcblxuICAgIHJldHVybiBzdWJtaXR0ZWRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLl9mb3JtLmNvbmZpcm1VbnNhdmVkKHRoaXMpKSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZW5hYmxlKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmNvbnRyb2wuZW5hYmxlKCk7XG5cbiAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmNvbnRyb2wuZGlzYWJsZSgpO1xuXG4gICAgdGhpcy5fZ2V0Rm9ybUdyb3VwKClcbiAgICAgIC5idXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICBidXR0b24uZGlzYWJsZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLm5nRm9ybS5jb250cm9scylcbiAgICAgIC5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3VibWl0JChzdWJtaXRFdmVudDogU3VibWl0RXZlbnQpOiBPYnNlcnZhYmxlPFN1Ym1pdHRlZEV2ZW50PiB7XG4gICAgcmV0dXJuIG9mKHN1Ym1pdEV2ZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9zdGF0dXNWYWxpZGF0aW5nKCkpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy52YWxpZGF0ZSgpKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX3N0YXR1c1N1Ym1pdHRpbmcoKSksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9zZXR1cEFjdGl2ZVN1Ym1pdEJ1dHRvbigpKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2Rpc2FibGVCdXR0b25zKCkpLFxuICAgICAgICBzd2l0Y2hNYXAoKGRhdGEpID0+IHRoaXMuX3dhaXRVbnRpbFN0YXR1c1BlbmRpbmcoKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgbWFwKCgpID0+IGRhdGEpLFxuICAgICAgICAgICkpLCAgICAgICBcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm5nRm9ybS5zdGF0dXMgPT09ICdJTlZBTElEJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1JbnZhbGlkU3RhdGUkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0aGlzLl9mb3JtVmFsaWRTdGF0ZSQ7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZSk7XG5cbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKHN1Ym1pdHRlZEV2ZW50OiBTdWJtaXR0ZWRFdmVudCkgPT4ge1xuICAgICAgICAgIGlmKHN1Ym1pdHRlZEV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9jb21wbGV0ZVN1Ym1pdCh0cnVlLCBzdWJtaXR0ZWRFdmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5TdWJtaXQoKTogdm9pZCB7XG4gICAgdGhpc1xuICAgICAgLm5nRm9ybVxuICAgICAgLm5nU3VibWl0XG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChldmVudCkgPT4ge1xuICAgICAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KSxcbiAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gW0Zvcm1TdGF0dXMuVmFsaWQsIEZvcm1TdGF0dXMuSW52YWxpZF1cbiAgICAgICAgICAgIC5pbmNsdWRlcyh0aGlzLl9zdGF0dXMkLmdldFZhbHVlKCkpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuc3VibWl0JCh0aGlzLl9zdWJtaXRFdmVudCkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Gb3JtU3RhdHVzKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXR1cyRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChmb3JtU3RhdHVzOiBGb3JtU3RhdHVzKSA9PiB7XG4gICAgICAgIGNvbnN0IGNscyA9IFtGb3JtU3RhdHVzLlN1Ym1pdHRpbmcsIEZvcm1TdGF0dXMuVmFsaWRhdGluZ107XG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgICAgIGNsYXNzTGlzdC5yZW1vdmUoLi4uY2xzKTtcbiAgICAgICAgaWYgKGNscy5pbmRleE9mKGZvcm1TdGF0dXMpICE9PSAtMSkge1xuICAgICAgICAgIGNsYXNzTGlzdC5hZGQoZm9ybVN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5XaW5kb3dDbG9zZSgpOiB2b2lkIHtcbiAgICBmcm9tRXZlbnQod2luZG93LCAnYmVmb3JldW5sb2FkJylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlybSAmJiB0aGlzLmNvbmZpcm1Ccm93c2VyICYmIHRoaXMubmdGb3JtLmRpcnR5KSB7XG4gICAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9hY3RpdmVEaWFsb2coZWwsIGRpYWxvZzogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZWwuaXNTYW1lTm9kZShkaWFsb2cpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGVsLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hY3RpdmVEaWFsb2coZWwucGFyZW50RWxlbWVudCwgZGlhbG9nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Ib3RLZXlzKCk6IHZvaWQge1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICdrZXlkb3duJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2RpYWxvZ0JhY2tkcm9wRXNjYXBlICYmIGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICBjb25zdCBjZGtPdmVybGF5UGFuZSA9IEFycmF5XG4gICAgICAgICAgICAgIC5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuY2RrLW92ZXJsYXktcGFuZScpKS5wb3AoKTtcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZURpYWxvZyA9IHRoaXNcbiAgICAgICAgICAgICAgLl9hY3RpdmVEaWFsb2coZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5fZGlhbG9nUmVmLmlkKSwgY2RrT3ZlcmxheVBhbmUpO1xuXG4gICAgICAgICAgICBpZiAoYWN0aXZlRGlhbG9nKSB7XG4gICAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1DbG9zZSgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQuY29kZSA9PT0gJ0tleVMnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zaG9ydGN1dHMpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnRJbkZvcm0oZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5nRm9ybS5uZ1N1Ym1pdC5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2Zvcm1DbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maXJtICYmIHRoaXMuY29uZmlybURpYWxvZykge1xuICAgICAgdGhpcy50cmlnZ2VyQ29uZmlybSgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigocmVzdWx0KSA9PiBjb25maXJtUmVzdWx0Q29udGludWUocmVzdWx0KSksXG4gICAgICAgICAgc3dpdGNoTWFwKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT09IENvbmZpcm1SZXN1bHQuUHJpc3RpbmUgfHwgcmVzdWx0ID09PSBDb25maXJtUmVzdWx0LkRpc2NhcmRcbiAgICAgICAgICAgICAgPyBvZihudWxsKVxuICAgICAgICAgICAgICA6IHRoaXMuc3VibWl0dGVkLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IFN1Ym1pdHRlZEV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKHJlc3VsdD8ucmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldEFjdGl2ZVN1Ym1pdEJ1dHRvbigpOiBGc0J1dHRvbkRpcmVjdGl2ZSB7XG4gICAgaWYodGhpcy5fZ2V0Rm9ybUdyb3VwKCkuYWN0aXZlU3VibWl0QnV0dG9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Rm9ybUdyb3VwKCkuYWN0aXZlU3VibWl0QnV0dG9uO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9nZXRGb3JtR3JvdXAoKVxuICAgICAgLmJ1dHRvbnNcbiAgICAgIC5maWx0ZXIoKGJ1dHRvbikgPT4gYnV0dG9uLnN1Ym1pdClbMF07XG4gIH1cblxuICBwcml2YXRlIF9lbGVtZW50SW5Gb3JtKGVsOiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKGVsLmlzU2FtZU5vZGUodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZWxlbWVudEluRm9ybShlbC5wYXJlbnRFbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9jb21wbGV0ZVN1Ym1pdChzdWNjZXNzLCBzdWJtaXRFdmVudDogU3VibWl0dGVkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgdGhpcy5uZ0Zvcm0uY29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgdGhpcy5jcmVhdGVTbmFwc2hvdCgpO1xuICAgICAgdGhpcy5zdWJtaXR0ZWQuZW1pdChzdWJtaXRFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Jlc2V0QnV0dG9ucygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9nZXRGb3JtR3JvdXAoKS5hY3RpdmVTdWJtaXRCdXR0b24pIHtcbiAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgIHRoaXMuX2dldEZvcm1Hcm91cCgpLmFjdGl2ZVN1Ym1pdEJ1dHRvbi5zdWNjZXNzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9nZXRGb3JtR3JvdXAoKS5hY3RpdmVTdWJtaXRCdXR0b24uZXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5TdWJtaXR0ZWQpO1xuXG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLlN1Y2Nlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5FcnJvcik7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuQ29tcGxldGluZyk7XG5cbiAgICBjb25zdCByZXNldERlbGF5ID0gc3VjY2VzcyA/IHRoaXMuc3VjY2Vzc0RlbGF5IDogdGhpcy5lcnJvckRlbGF5O1xuXG4gICAgb2YodHJ1ZSlcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWxheShyZXNldERlbGF5KSxcbiAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm5nRm9ybS5mb3JtLnN0YXR1cyA9PT0gJ1ZBTElEJykge1xuICAgICAgICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLlZhbGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5JbnZhbGlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc2V0QnV0dG9ucygpO1xuICAgICAgICB0aGlzLl9nZXRGb3JtR3JvdXAoKS5hY3RpdmVTdWJtaXRCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Rm9ybUdyb3VwKCk6IEZzRm9ybUJhc2VEaXJlY3RpdmUge1xuICAgIHJldHVybiB0aGlzLl9mb3JtR3JvdXAgfHwgdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2V0QnV0dG9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9nZXRGb3JtR3JvdXAoKVxuICAgICAgLmJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgIGJ1dHRvbi5yZXNldCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNvbmZpcm0oKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0uZm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChjaGFuZ2VzKSA9PiB7XG4gICAgICAgIGlmKHRoaXMuX2RpYWxvZ0JhY2tkcm9wRXNjYXBlICYmIHRoaXMuX2RpYWxvZ1JlZikge1xuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlybSkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gT2JqZWN0LmtleXModGhpcy5fc25hcHNob3QpO1xuXG4gICAgICAgICAgT2JqZWN0LmtleXMoY2hhbmdlcylcbiAgICAgICAgICAgIC5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc25hcHNob3RbbmFtZV0gPSBjaGFuZ2VzW25hbWVdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckRyYXdlckNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kcmF3ZXJSZWYpIHtcbiAgICAgIHRoaXMuX2RyYXdlclJlZi5jbG9zZVN0YXJ0JFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnN1Ym1pdHRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyRcbiAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChzdGF0dXMpID0+IHN0YXR1cyA9PT0gRm9ybVN0YXR1cy5TdWNjZXNzIHx8IHN0YXR1cyA9PT0gRm9ybVN0YXR1cy5FcnJvciksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHN0YXR1cykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IEZvcm1TdGF0dXMuU3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KG51bGwpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtRHJhd2VyQ2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RyYXdlclJlZikge1xuICAgICAgdGhpcy5fZHJhd2VyUmVmLmNsb3NlU3RhcnQkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGlpZihcbiAgICAgICAgICAgICAgKCkgPT4gdGhpcy5jb25maXJtICYmIHRoaXMuY29uZmlybURyYXdlcixcbiAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ29uZmlybSgpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICBtYXAoKHJlc3VsdCkgPT4gY29uZmlybVJlc3VsdENvbnRpbnVlKHJlc3VsdCkpLFxuICAgICAgICAgICAgICAgICAgdGFwKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQobnVsbCk7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbiAgXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29uZmlybURpYWxvZ0JhY2tkcm9wRXNjYXBlKCk6IHZvaWQge1xuICAgIGlmKHRoaXMuX2RpYWxvZ1JlZikge1xuICAgICAgdGhpcy5fZGlhbG9nQmFja2Ryb3BFc2NhcGUgPSAhdGhpcy5fZGlhbG9nUmVmPy5kaXNhYmxlQ2xvc2U7XG5cbiAgICAgIGlmICh0aGlzLl9kaWFsb2dCYWNrZHJvcEVzY2FwZSkge1xuICAgICAgICB0aGlzLl9kaWFsb2dSZWYuYmFja2Ryb3BDbGljaygpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZm9ybUNsb3NlKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZXN0cm95JFxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmRpc2FibGVDbG9zZSA9IGZhbHNlO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQXV0b2NvbXBsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29udHJvbCA9IHRoaXMubmdGb3JtLmZvcm0ucmVnaXN0ZXJDb250cm9sLmJpbmQodGhpcy5uZ0Zvcm0uZm9ybSk7XG5cbiAgICB0aGlzLm5nRm9ybS5mb3JtLnJlZ2lzdGVyQ29udHJvbCA9IChuYW1lOiBzdHJpbmcsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuXG4gICAgICBjb25zdCBlbDogRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGBpbnB1dFtuYW1lPScke25hbWV9J11gKTtcblxuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGlmICghZWwuZ2V0QXR0cmlidXRlKCdhdXRvY29tcGxldGUnKSkge1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywgJ25vbmUnKTtcbiAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBgJHtuYW1lfS0ke2d1aWQoKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJDb250cm9sKG5hbWUsIGNvbnRyb2wpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckRpcnR5U3VibWl0QnV0dG9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uZ0Zvcm0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm5nRm9ybS5mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fZ2V0Rm9ybUdyb3VwKClcbiAgICAgIC5idXR0b25zLmNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9nZXRGb3JtR3JvdXAoKVxuICAgICAgLmJ1dHRvbnNcbiAgICAgIC5maWx0ZXIoKGJ1dHRvbikgPT4gYnV0dG9uLnN1Ym1pdClcbiAgICAgIC5mb3JFYWNoKChzdWJtaXRCdXR0b246IEZzQnV0dG9uRGlyZWN0aXZlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy5jb25maXJtIHx8ICF0aGlzLmRpcnR5U3VibWl0QnV0dG9uIHx8IHRoaXMubmdGb3JtLmRpcnR5IHx8ICFzdWJtaXRCdXR0b24uZGlydHlTdWJtaXRcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3VibWl0QnV0dG9uLmVuYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhdHVzU3VibWl0dGluZygpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5TdWJtaXR0aW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0YXR1c1ZhbGlkYXRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuVmFsaWRhdGluZyk7XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cEFjdGl2ZVN1Ym1pdEJ1dHRvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9nZXRGb3JtR3JvdXAoKVxuICAgICAgLmFjdGl2ZVN1Ym1pdEJ1dHRvbiA9IHRoaXMuX2dldEFjdGl2ZVN1Ym1pdEJ1dHRvbigpO1xuICAgIHRoaXMuX3Jlc2V0QnV0dG9ucygpO1xuXG4gICAgaWYgKHRoaXMuX2dldEZvcm1Hcm91cCgpLmFjdGl2ZVN1Ym1pdEJ1dHRvbikge1xuICAgICAgdGhpcy5fZ2V0Rm9ybUdyb3VwKCkuYWN0aXZlU3VibWl0QnV0dG9uLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlQnV0dG9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9nZXRGb3JtR3JvdXAoKVxuICAgICAgLmJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgIGJ1dHRvbi5kaXNhYmxlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3dhaXRVbnRpbFN0YXR1c1BlbmRpbmcoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5uZ0Zvcm0uc3RhdHVzQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aGlzLm5nRm9ybS5zdGF0dXMpLFxuICAgICAgICBmaXJzdCgoc3RhdGUpID0+IHN0YXRlICE9PSAnUEVORElORycpLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUVycm9yKGU6IFN1Ym1pdHRlZEV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coJyVjIEZvcm0gU3VibWl0ICcsICdjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6ICNEMzNGNDknLCAnRXJyb3Igb2NjdXJlZCcpO1xuICAgIGNvbnNvbGUuZ3JvdXAoJ0Vycm9yIERldGFpbHM6Jyk7XG4gICAgY29uc29sZS5sb2coJ01lc3NhZ2U6ICcsIGUpO1xuICAgIGNvbnNvbGUubG9nKCdGb3JtUmVmOiAnLCB0aGlzKTtcblxuICAgIGlmICh0aGlzLm5nRm9ybS5pbnZhbGlkKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBnZXRGb3JtRXJyb3JzKHRoaXMubmdGb3JtLmNvbnRyb2wsIG51bGwpO1xuICAgICAgY29uc29sZS5sb2coJ1ZhbGlkYXRpb24gRXJyb3JzOiAnLCBlcnJvcnMpO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICB0aGlzLl9jb21wbGV0ZVN1Ym1pdChmYWxzZSwgbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNhbkRlYWN0aXZhdGVHdWFyZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZyA9IGdldEFjdGl2ZVJvdXRlKHRoaXMuX3JvdXRlKS5yb3V0ZUNvbmZpZztcblxuICAgIGlmICghdGhpcy5fYWN0aXZhdGVkUm91dGVDb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9mb3JtLnJlZ2lzdGVyRm9ybURpcmVjdGl2ZSh0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jb21wb25lbnQsIHRoaXMpO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUpKSB7XG4gICAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlID0gW107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUuaW5kZXhPZihGb3JtRGVhY3RpdmF0ZUd1YXJkKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUucHVzaChGb3JtRGVhY3RpdmF0ZUd1YXJkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbGVhbnVwQ2FuRGVhY3RpdmF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZ3VhcmRJbmRleCA9IHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUuaW5kZXhPZihGb3JtRGVhY3RpdmF0ZUd1YXJkKTtcbiAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlLnNwbGljZShndWFyZEluZGV4LCAxKTtcblxuICAgIHRoaXMuX2Zvcm0ucmVtb3ZlRm9ybURpcmVjdGl2ZSh0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jb21wb25lbnQpO1xuICB9XG5cbn1cbiJdfQ==
|