@firestitch/form 9.7.6 → 12.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/app/components/form-dialog-actions/form-dialog-actions.component.d.ts +21 -18
  2. package/app/consts/error-messages.const.d.ts +19 -19
  3. package/app/directives/form/form.directive.d.ts +105 -102
  4. package/app/directives/form-dialog-close.directive.d.ts +12 -9
  5. package/app/directives/submit-button.directive.d.ts +31 -28
  6. package/app/directives/validators/compare.directive.d.ts +15 -12
  7. package/app/directives/validators/control.directive.d.ts +48 -45
  8. package/app/directives/validators/daterange.directive.d.ts +13 -10
  9. package/app/directives/validators/email.directive.d.ts +13 -10
  10. package/app/directives/validators/emails.directive.d.ts +13 -10
  11. package/app/directives/validators/function.directive.d.ts +14 -11
  12. package/app/directives/validators/greater.directive.d.ts +13 -10
  13. package/app/directives/validators/integer.directive.d.ts +13 -10
  14. package/app/directives/validators/lesser.directive.d.ts +13 -10
  15. package/app/directives/validators/max.directive.d.ts +13 -10
  16. package/app/directives/validators/maxlength.directive.d.ts +13 -10
  17. package/app/directives/validators/min.directive.d.ts +13 -10
  18. package/app/directives/validators/minlength.directive.d.ts +13 -10
  19. package/app/directives/validators/numeric.directive.d.ts +13 -10
  20. package/app/directives/validators/pattern.directive.d.ts +13 -10
  21. package/app/directives/validators/phone.directive.d.ts +13 -10
  22. package/app/directives/validators/required.directive.d.ts +16 -13
  23. package/app/directives/validators/url.directive.d.ts +14 -11
  24. package/app/directives/validators/validate.directive.d.ts +14 -11
  25. package/app/enums/confirm-result.d.ts +7 -7
  26. package/app/enums/form-status.d.ts +9 -9
  27. package/app/fs-form.module.d.ts +35 -4
  28. package/app/guards/form-deactivate.guard.d.ts +12 -9
  29. package/app/helpers/confirm-result-continue.d.ts +1 -1
  30. package/app/helpers/confirm-unsaved.d.ts +5 -5
  31. package/app/helpers/get-form-errors.d.ts +2 -2
  32. package/app/helpers/index.d.ts +2 -2
  33. package/app/helpers/is-enabled.d.ts +1 -1
  34. package/app/interfaces/async-validator.d.ts +14 -14
  35. package/app/interfaces/confirm-config.d.ts +7 -7
  36. package/app/interfaces/confirm-tab-group.d.ts +10 -10
  37. package/app/interfaces/form-deactivate.d.ts +4 -4
  38. package/app/interfaces/index.d.ts +4 -4
  39. package/app/interfaces/submit-event.d.ts +5 -5
  40. package/app/interfaces/submitted-event.d.ts +6 -6
  41. package/app/interfaces/validator.d.ts +13 -13
  42. package/app/providers/validate-messages.provider.d.ts +25 -25
  43. package/app/services/fsform.service.d.ts +10 -7
  44. package/app/validators/validators.d.ts +12 -12
  45. package/bundles/firestitch-form.umd.js +2672 -2546
  46. package/bundles/firestitch-form.umd.js.map +1 -1
  47. package/esm2015/app/components/form-dialog-actions/form-dialog-actions.component.js +86 -93
  48. package/esm2015/app/consts/error-messages.const.js +20 -20
  49. package/esm2015/app/directives/form/form.directive.js +619 -668
  50. package/esm2015/app/directives/form-dialog-close.directive.js +31 -33
  51. package/esm2015/app/directives/submit-button.directive.js +131 -138
  52. package/esm2015/app/directives/validators/compare.directive.js +49 -49
  53. package/esm2015/app/directives/validators/control.directive.js +257 -273
  54. package/esm2015/app/directives/validators/daterange.directive.js +41 -41
  55. package/esm2015/app/directives/validators/email.directive.js +41 -41
  56. package/esm2015/app/directives/validators/emails.directive.js +41 -41
  57. package/esm2015/app/directives/validators/function.directive.js +31 -31
  58. package/esm2015/app/directives/validators/greater.directive.js +40 -40
  59. package/esm2015/app/directives/validators/integer.directive.js +41 -41
  60. package/esm2015/app/directives/validators/lesser.directive.js +40 -40
  61. package/esm2015/app/directives/validators/max.directive.js +36 -36
  62. package/esm2015/app/directives/validators/maxlength.directive.js +35 -35
  63. package/esm2015/app/directives/validators/min.directive.js +36 -36
  64. package/esm2015/app/directives/validators/minlength.directive.js +35 -35
  65. package/esm2015/app/directives/validators/numeric.directive.js +41 -41
  66. package/esm2015/app/directives/validators/pattern.directive.js +35 -35
  67. package/esm2015/app/directives/validators/phone.directive.js +41 -41
  68. package/esm2015/app/directives/validators/required.directive.js +71 -73
  69. package/esm2015/app/directives/validators/url.directive.js +47 -49
  70. package/esm2015/app/directives/validators/validate.directive.js +33 -31
  71. package/esm2015/app/enums/confirm-result.js +9 -9
  72. package/esm2015/app/enums/form-status.js +11 -11
  73. package/esm2015/app/fs-form.module.js +165 -106
  74. package/esm2015/app/guards/form-deactivate.guard.js +40 -44
  75. package/esm2015/app/helpers/confirm-result-continue.js +5 -5
  76. package/esm2015/app/helpers/confirm-unsaved.js +70 -70
  77. package/esm2015/app/helpers/get-form-errors.js +25 -25
  78. package/esm2015/app/helpers/index.js +3 -3
  79. package/esm2015/app/helpers/is-enabled.js +4 -4
  80. package/esm2015/app/interfaces/async-validator.js +2 -1
  81. package/esm2015/app/interfaces/confirm-config.js +2 -1
  82. package/esm2015/app/interfaces/confirm-tab-group.js +2 -1
  83. package/esm2015/app/interfaces/form-deactivate.js +2 -1
  84. package/esm2015/app/interfaces/index.js +5 -1
  85. package/esm2015/app/interfaces/submit-event.js +2 -1
  86. package/esm2015/app/interfaces/submitted-event.js +2 -1
  87. package/esm2015/app/interfaces/validator.js +2 -1
  88. package/esm2015/app/providers/validate-messages.provider.js +11 -11
  89. package/esm2015/app/services/fsform.service.js +25 -26
  90. package/esm2015/app/validators/validators.js +97 -97
  91. package/esm2015/firestitch-form.js +5 -27
  92. package/esm2015/public_api.js +35 -14
  93. package/fesm2015/firestitch-form.js +2100 -2110
  94. package/fesm2015/firestitch-form.js.map +1 -1
  95. package/firestitch-form.d.ts +5 -26
  96. package/package.json +7 -8
  97. package/public_api.d.ts +33 -12
  98. package/styles.scss +4 -4
  99. package/bundles/firestitch-form.umd.min.js +0 -16
  100. package/bundles/firestitch-form.umd.min.js.map +0 -1
  101. package/esm5/app/components/form-dialog-actions/form-dialog-actions.component.js +0 -96
  102. package/esm5/app/consts/error-messages.const.js +0 -20
  103. package/esm5/app/directives/form/form.directive.js +0 -709
  104. package/esm5/app/directives/form-dialog-close.directive.js +0 -34
  105. package/esm5/app/directives/submit-button.directive.js +0 -144
  106. package/esm5/app/directives/validators/compare.directive.js +0 -60
  107. package/esm5/app/directives/validators/control.directive.js +0 -279
  108. package/esm5/app/directives/validators/daterange.directive.js +0 -50
  109. package/esm5/app/directives/validators/email.directive.js +0 -50
  110. package/esm5/app/directives/validators/emails.directive.js +0 -50
  111. package/esm5/app/directives/validators/function.directive.js +0 -36
  112. package/esm5/app/directives/validators/greater.directive.js +0 -49
  113. package/esm5/app/directives/validators/integer.directive.js +0 -50
  114. package/esm5/app/directives/validators/lesser.directive.js +0 -49
  115. package/esm5/app/directives/validators/max.directive.js +0 -45
  116. package/esm5/app/directives/validators/maxlength.directive.js +0 -44
  117. package/esm5/app/directives/validators/min.directive.js +0 -45
  118. package/esm5/app/directives/validators/minlength.directive.js +0 -44
  119. package/esm5/app/directives/validators/numeric.directive.js +0 -50
  120. package/esm5/app/directives/validators/pattern.directive.js +0 -44
  121. package/esm5/app/directives/validators/phone.directive.js +0 -50
  122. package/esm5/app/directives/validators/required.directive.js +0 -88
  123. package/esm5/app/directives/validators/url.directive.js +0 -56
  124. package/esm5/app/directives/validators/validate.directive.js +0 -36
  125. package/esm5/app/enums/confirm-result.js +0 -9
  126. package/esm5/app/enums/form-status.js +0 -11
  127. package/esm5/app/fs-form.module.js +0 -110
  128. package/esm5/app/guards/form-deactivate.guard.js +0 -45
  129. package/esm5/app/helpers/confirm-result-continue.js +0 -5
  130. package/esm5/app/helpers/confirm-unsaved.js +0 -70
  131. package/esm5/app/helpers/get-form-errors.js +0 -28
  132. package/esm5/app/helpers/index.js +0 -3
  133. package/esm5/app/helpers/is-enabled.js +0 -4
  134. package/esm5/app/interfaces/async-validator.js +0 -1
  135. package/esm5/app/interfaces/confirm-config.js +0 -1
  136. package/esm5/app/interfaces/confirm-tab-group.js +0 -1
  137. package/esm5/app/interfaces/form-deactivate.js +0 -1
  138. package/esm5/app/interfaces/index.js +0 -1
  139. package/esm5/app/interfaces/submit-event.js +0 -1
  140. package/esm5/app/interfaces/submitted-event.js +0 -1
  141. package/esm5/app/interfaces/validator.js +0 -1
  142. package/esm5/app/providers/validate-messages.provider.js +0 -12
  143. package/esm5/app/services/fsform.service.js +0 -27
  144. package/esm5/app/validators/validators.js +0 -102
  145. package/esm5/firestitch-form.js +0 -27
  146. package/esm5/public_api.js +0 -14
  147. package/fesm5/firestitch-form.js +0 -2399
  148. package/fesm5/firestitch-form.js.map +0 -1
  149. package/firestitch-form.metadata.json +0 -1
@@ -1,709 +0,0 @@
1
- import { __decorate, __metadata, __param, __read, __spread } from "tslib";
2
- import { AfterContentInit, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, Inject, Input, NgZone, OnChanges, OnDestroy, OnInit, Optional, Output, QueryList, SimpleChanges, } from '@angular/core';
3
- import { AbstractControl, NgForm } from '@angular/forms';
4
- import { MatDialogRef } from '@angular/material/dialog';
5
- import { MatTabGroup } from '@angular/material/tabs';
6
- import { FsMessage, MessageMode } from '@firestitch/message';
7
- import { FsPrompt } from '@firestitch/prompt';
8
- import { guid } from '@firestitch/common';
9
- import { DrawerRef } from '@firestitch/drawer';
10
- import { BehaviorSubject, defer, fromEvent, iif, isObservable, of, Subject, throwError } from 'rxjs';
11
- import { catchError, delay, filter, first, map, mergeMap, startWith, switchMap, take, takeUntil, tap } from 'rxjs/operators';
12
- import { confirmUnsaved } from '../../helpers/confirm-unsaved';
13
- import { FsFormDialogCloseDirective } from '../form-dialog-close.directive';
14
- import { ConfirmResult } from './../../enums/confirm-result';
15
- import { FsForm } from '../../services/fsform.service';
16
- import { FormStatus } from './../../enums/form-status';
17
- import { confirmResultContinue } from '../../helpers/confirm-result-continue';
18
- import { getFormErrors } from '../../helpers/get-form-errors';
19
- var FsFormDirective = /** @class */ (function () {
20
- function FsFormDirective(ngForm, _form, _element, _message, _prompt, _ngZone, _dialogRef, _drawerRef) {
21
- this.ngForm = ngForm;
22
- this._form = _form;
23
- this._element = _element;
24
- this._message = _message;
25
- this._prompt = _prompt;
26
- this._ngZone = _ngZone;
27
- this._dialogRef = _dialogRef;
28
- this._drawerRef = _drawerRef;
29
- this.wrapperSelector = '.fs-form-wrapper,.mat-form-field';
30
- this.messageSelector = '.fs-form-message,.mat-form-field-subscript-wrapper';
31
- this.hintSelector = '.fs-form-hint,.mat-form-field-hint-wrapper';
32
- this.labelSelector = '.fs-form-label,.mat-form-field-label';
33
- this.autocomplete = false;
34
- this.shortcuts = true; // Ctrl + s
35
- this.confirm = true;
36
- this.confirmDialog = true;
37
- this.confirmDrawer = true;
38
- this.confirmBrowser = true;
39
- this.confirmTabs = true;
40
- this.dirtySubmitButton = true;
41
- this.successDelay = 0;
42
- this.errorDelay = 1000;
43
- this.submitEvent = new EventEmitter();
44
- this.invalid = new EventEmitter();
45
- this.valid = new EventEmitter();
46
- this.submitted = new EventEmitter();
47
- this.reseted = new EventEmitter();
48
- this.cleared = new EventEmitter();
49
- this.fsformClass = true;
50
- this._tabGroups = new QueryList();
51
- this._submitButtons = new QueryList();
52
- this._dialogBackdropEscape = false;
53
- this._snapshot = {};
54
- this._status$ = new BehaviorSubject(FormStatus.Valid);
55
- this._destroy$ = new Subject();
56
- }
57
- Object.defineProperty(FsFormDirective.prototype, "submitting", {
58
- get: function () {
59
- return this._status$.getValue() === FormStatus.Submitting;
60
- },
61
- enumerable: true,
62
- configurable: true
63
- });
64
- Object.defineProperty(FsFormDirective.prototype, "completing", {
65
- get: function () {
66
- return this._status$.getValue() === FormStatus.Completing;
67
- },
68
- enumerable: true,
69
- configurable: true
70
- });
71
- Object.defineProperty(FsFormDirective.prototype, "_submitEvent", {
72
- get: function () {
73
- return {
74
- ngForm: this.ngForm,
75
- submitter: this._submitter,
76
- };
77
- },
78
- enumerable: true,
79
- configurable: true
80
- });
81
- Object.defineProperty(FsFormDirective.prototype, "_formValidState$", {
82
- get: function () {
83
- this._form.broadcast('valid', this._submitEvent);
84
- this.submitEvent.emit(this._submitEvent);
85
- this.valid.emit(this._submitEvent);
86
- var submittedEvent = {
87
- ngForm: this.ngForm,
88
- submitter: this._submitter,
89
- response: null
90
- };
91
- if (!this.submit) {
92
- return of(submittedEvent);
93
- }
94
- var result = this.submit(this._submitEvent);
95
- if (!isObservable(result)) {
96
- return of(submittedEvent);
97
- }
98
- return result
99
- .pipe(map(function (response) {
100
- submittedEvent.response = response;
101
- return submittedEvent;
102
- }));
103
- },
104
- enumerable: true,
105
- configurable: true
106
- });
107
- Object.defineProperty(FsFormDirective.prototype, "_formInvalidState$", {
108
- get: function () {
109
- this._form.broadcast('invalid', this._submitEvent);
110
- if (this.invalid) {
111
- this.invalid.emit(this._submitEvent);
112
- }
113
- var message = 'Changes not saved. Please review errors highlighted in red.';
114
- this._message.error(message, { mode: MessageMode.Toast });
115
- var el = this._element.nativeElement.querySelector('.ng-invalid');
116
- if (el) {
117
- el.scrollIntoView({ behavior: 'smooth', block: 'center' });
118
- }
119
- return throwError('Form validation error');
120
- },
121
- enumerable: true,
122
- configurable: true
123
- });
124
- Object.defineProperty(FsFormDirective.prototype, "_submitter", {
125
- get: function () {
126
- return this._activeSubmitButton
127
- ? this._activeSubmitButton.name
128
- : null;
129
- },
130
- enumerable: true,
131
- configurable: true
132
- });
133
- FsFormDirective.prototype.ngOnInit = function () {
134
- this._registerConfirmDialogBackdropEscape();
135
- this._listenHotKeys();
136
- this._listenWindowClose();
137
- this._listenSubmit();
138
- if (!this.autocomplete) {
139
- this._registerAutocomplete();
140
- }
141
- };
142
- FsFormDirective.prototype.ngOnChanges = function (changes) {
143
- if (changes.confirm) {
144
- this._updateDirtySubmitButtons();
145
- }
146
- };
147
- FsFormDirective.prototype.ngAfterContentInit = function () {
148
- this._registerConfirm();
149
- this._registerConfirmDialogClose();
150
- this._registerConfirmDrawerClose();
151
- this._registerConfirmTabs();
152
- this._registerDrawerClose();
153
- this._registerDirtySubmitButton();
154
- };
155
- FsFormDirective.prototype.ngOnDestroy = function () {
156
- this._destroy$.next();
157
- this._destroy$.complete();
158
- };
159
- FsFormDirective.prototype.createSnapshot = function () {
160
- this._snapshot = this.ngForm.value;
161
- };
162
- FsFormDirective.prototype.reset = function () {
163
- var _this = this;
164
- this.ngForm.resetForm();
165
- Object.keys(this.ngForm.controls)
166
- .forEach(function (name) {
167
- var control = _this.ngForm.controls[name];
168
- control.reset(_this._snapshot[name]);
169
- });
170
- this.reseted.emit();
171
- };
172
- FsFormDirective.prototype.clear = function () {
173
- this.ngForm.resetForm();
174
- this.cleared.emit();
175
- };
176
- FsFormDirective.prototype.dirty = function () {
177
- this.ngForm.form.markAsDirty();
178
- this._updateDirtySubmitButtons();
179
- };
180
- FsFormDirective.prototype.triggerSubmit = function () {
181
- this.ngForm.ngSubmit.next();
182
- };
183
- FsFormDirective.prototype.triggerConfirm = function () {
184
- var _this = this;
185
- var submitted = this.submitting ? this.submitted.asObservable() : of({});
186
- return submitted
187
- .pipe(take(1), mergeMap(function () { return confirmUnsaved(_this, _this._prompt); }));
188
- };
189
- FsFormDirective.prototype.enable = function () {
190
- this.ngForm.control.enable();
191
- this._updateDirtySubmitButtons();
192
- };
193
- FsFormDirective.prototype.disable = function () {
194
- this.ngForm.control.disable();
195
- this._submitButtons.forEach(function (button) {
196
- button.disable();
197
- });
198
- };
199
- FsFormDirective.prototype.addSubmitButton = function (submitButton) {
200
- this._submitButtons.reset(__spread(this._submitButtons.toArray(), [
201
- submitButton,
202
- ]));
203
- };
204
- FsFormDirective.prototype.removeSubmitButton = function (submitButton) {
205
- this._submitButtons.reset(__spread(this._submitButtons.toArray()
206
- .filter(function (submitButton_) { return (submitButton !== submitButton_); })));
207
- };
208
- FsFormDirective.prototype._listenSubmit = function () {
209
- var _this = this;
210
- this.ngForm
211
- .ngSubmit
212
- .pipe(tap(function (event) {
213
- event === null || event === void 0 ? void 0 : event.preventDefault();
214
- }), filter(function () {
215
- return [FormStatus.Valid, FormStatus.Invalid]
216
- .includes(_this._status$.getValue());
217
- }), tap(function () { return _this._markControlsAsTouchedAndUpdateValidity(); }), tap(function () { return _this._broadcastSubmittingEvents(); }), switchMap(function () { return _this._waitUntilStatusPending(); }), tap(function () { return _this._setupActiveSubmitButton(); }), mergeMap(function () {
218
- return _this.ngForm.status === 'INVALID'
219
- ? _this._formInvalidState$
220
- : _this._formValidState$;
221
- }), catchError(function (e, source$) {
222
- _this._handleError(e);
223
- return source$;
224
- }), tap(function (submittedEvent) {
225
- _this._completeSubmit(true, submittedEvent);
226
- }), takeUntil(this._destroy$))
227
- .subscribe(function () { });
228
- };
229
- FsFormDirective.prototype._listenWindowClose = function () {
230
- var _this = this;
231
- fromEvent(window, 'beforeunload')
232
- .pipe(takeUntil(this._destroy$))
233
- .subscribe(function (event) {
234
- if (_this.confirm && _this.confirmBrowser && _this.ngForm.dirty) {
235
- event.returnValue = false;
236
- }
237
- });
238
- };
239
- FsFormDirective.prototype._listenHotKeys = function () {
240
- var _this = this;
241
- this._ngZone.runOutsideAngular(function () {
242
- fromEvent(document, 'keydown')
243
- .pipe(takeUntil(_this._destroy$))
244
- .subscribe(function (event) {
245
- if (_this._dialogBackdropEscape && event.code === 'Escape') {
246
- var dialog_1 = document.getElementById(_this._dialogRef.id);
247
- var paths = event.composedPath();
248
- if (paths) {
249
- paths.forEach(function (item) {
250
- if (dialog_1 === item) {
251
- _this._ngZone.run(function () {
252
- _this._formClose();
253
- });
254
- }
255
- });
256
- }
257
- }
258
- if ((event.ctrlKey || event.metaKey) && event.code === 'KeyS') {
259
- event.preventDefault();
260
- if (_this.shortcuts) {
261
- if (_this._elementInForm(document.activeElement)) {
262
- _this.ngForm.ngSubmit.next();
263
- }
264
- }
265
- }
266
- });
267
- });
268
- };
269
- FsFormDirective.prototype._formClose = function () {
270
- var _this = this;
271
- if (this.confirm && this.confirmDialog) {
272
- this.triggerConfirm()
273
- .pipe(filter(function (result) { return confirmResultContinue(result); }), switchMap(function (result) {
274
- return result === ConfirmResult.Pristine || result === ConfirmResult.Discard
275
- ? of(null)
276
- : _this.submitted.asObservable();
277
- }), takeUntil(this._destroy$))
278
- .subscribe(function (result) {
279
- _this._dialogRef.close(result === null || result === void 0 ? void 0 : result.response);
280
- });
281
- }
282
- else {
283
- this._dialogRef.close(null);
284
- }
285
- };
286
- FsFormDirective.prototype._registerDialogClose = function (directive) {
287
- var _this = this;
288
- if (!directive.registered) {
289
- directive.registered = true;
290
- directive.clicked$
291
- .pipe(takeUntil(this._destroy$))
292
- .subscribe(function () {
293
- _this._formClose();
294
- });
295
- }
296
- };
297
- FsFormDirective.prototype._getActiveButton = function () {
298
- var activeButton = this._submitButtons.find(function (button) {
299
- return button.active;
300
- });
301
- return activeButton ? activeButton : this._submitButtons.first;
302
- };
303
- FsFormDirective.prototype._elementInForm = function (el) {
304
- if (el.isSameNode(this._element.nativeElement)) {
305
- return true;
306
- }
307
- else if (el.parentElement) {
308
- return this._elementInForm(el.parentElement);
309
- }
310
- return false;
311
- };
312
- FsFormDirective.prototype._completeSubmit = function (success, submitEvent) {
313
- var _this = this;
314
- if (success) {
315
- this.ngForm.control.markAsPristine();
316
- this.createSnapshot();
317
- this.submitted.emit(submitEvent);
318
- }
319
- else {
320
- this._resetButtons();
321
- }
322
- if (this._activeSubmitButton) {
323
- if (success) {
324
- this._activeSubmitButton.success();
325
- }
326
- else {
327
- this._activeSubmitButton.error();
328
- }
329
- }
330
- this._status$.next(FormStatus.Submitted);
331
- if (success) {
332
- this._status$.next(FormStatus.Success);
333
- }
334
- else {
335
- this._status$.next(FormStatus.Error);
336
- }
337
- this._status$.next(FormStatus.Completing);
338
- var resetDelay = success ? this.successDelay : this.errorDelay;
339
- of(true)
340
- .pipe(delay(resetDelay), first(), takeUntil(this._destroy$)).subscribe(function () {
341
- if (_this.ngForm.form.status === 'VALID') {
342
- _this._status$.next(FormStatus.Valid);
343
- }
344
- else {
345
- _this._status$.next(FormStatus.Invalid);
346
- }
347
- _this._resetButtons();
348
- _this._updateDirtySubmitButtons();
349
- });
350
- };
351
- FsFormDirective.prototype._resetButtons = function () {
352
- this._submitButtons.forEach(function (button) {
353
- button.reset();
354
- });
355
- };
356
- FsFormDirective.prototype._registerConfirm = function () {
357
- var _this = this;
358
- this.ngForm.form.valueChanges
359
- .pipe(takeUntil(this._destroy$))
360
- .subscribe(function (changes) {
361
- if (_this.confirm) {
362
- var existing_1 = Object.keys(_this._snapshot);
363
- Object.keys(changes)
364
- .forEach(function (name) {
365
- if (existing_1.indexOf(name) === -1) {
366
- _this._snapshot[name] = changes[name];
367
- }
368
- });
369
- }
370
- });
371
- };
372
- FsFormDirective.prototype._registerDrawerClose = function () {
373
- var _this = this;
374
- if (this._drawerRef) {
375
- this._drawerRef.closeStart$
376
- .pipe(takeUntil(this._destroy$))
377
- .subscribe(function (subscriber) {
378
- if (_this.submitting) {
379
- _this._status$
380
- .pipe(filter(function (status) { return status === FormStatus.Success || status === FormStatus.Error; }), takeUntil(_this._destroy$))
381
- .subscribe(function (status) {
382
- if (status === FormStatus.Success) {
383
- subscriber.next();
384
- subscriber.complete();
385
- }
386
- else {
387
- subscriber.error();
388
- }
389
- });
390
- }
391
- else {
392
- subscriber.next();
393
- subscriber.complete();
394
- }
395
- });
396
- }
397
- };
398
- FsFormDirective.prototype._registerConfirmDrawerClose = function () {
399
- var _this = this;
400
- if (this._drawerRef) {
401
- this._drawerRef.closeStart$
402
- .pipe(switchMap(function (subscriber) {
403
- return iif(function () { return _this.confirm && _this.confirmDrawer; }, _this.triggerConfirm()
404
- .pipe(map(function (result) { return confirmResultContinue(result); }), tap(function (result) {
405
- if (result) {
406
- subscriber.next();
407
- subscriber.complete();
408
- }
409
- else {
410
- subscriber.error();
411
- }
412
- })), defer(function () {
413
- subscriber.next();
414
- subscriber.complete();
415
- }));
416
- }), takeUntil(this._destroy$))
417
- .subscribe();
418
- }
419
- };
420
- FsFormDirective.prototype._registerConfirmTabs = function () {
421
- var _this = this;
422
- if (this.tabGroup) {
423
- this.registerConfirmTabGroup(this.tabGroup);
424
- }
425
- this.registerConfirmTabGroups(this._tabGroups.toArray());
426
- this._tabGroups.changes
427
- .pipe(takeUntil(this._destroy$))
428
- .subscribe(function () {
429
- _this.registerConfirmTabGroups(_this._tabGroups.toArray());
430
- });
431
- };
432
- FsFormDirective.prototype.registerConfirmTabGroups = function (tabGroups) {
433
- var _this = this;
434
- tabGroups.forEach(function (tabGroup) {
435
- _this.registerConfirmTabGroup(tabGroup);
436
- });
437
- };
438
- FsFormDirective.prototype.registerConfirmTabGroup = function (tabGroup) {
439
- var _this = this;
440
- var confirmTabGroup = tabGroup;
441
- if (!confirmTabGroup._originalHandleClick) {
442
- confirmTabGroup._originalHandleClick = tabGroup._handleClick;
443
- confirmTabGroup._handlClick$ = new Subject();
444
- confirmTabGroup._handleClick = function (tab, tabHeader, idx) {
445
- if (confirmTabGroup._handlClick$.observers.length) {
446
- confirmTabGroup._handlClick$.next({ tab: tab, tabHeader: tabHeader, idx: idx });
447
- }
448
- else {
449
- confirmTabGroup._originalHandleClick(tab, tabHeader, idx);
450
- }
451
- };
452
- }
453
- confirmTabGroup._handlClick$
454
- .pipe(takeUntil(this._destroy$))
455
- .subscribe(function (event) {
456
- if (!_this.submitting) {
457
- if (_this.confirm && _this.confirmTabs) {
458
- _this.triggerConfirm()
459
- .pipe(takeUntil(_this._destroy$))
460
- .subscribe(function (result) {
461
- if (confirmResultContinue(result)) {
462
- confirmTabGroup.selectedIndex = event.idx;
463
- }
464
- });
465
- }
466
- else {
467
- confirmTabGroup._originalHandleClick(event.tab, event.tabHeader, event.idx);
468
- }
469
- }
470
- });
471
- };
472
- FsFormDirective.prototype._registerConfirmDialogClose = function () {
473
- var _this = this;
474
- if (this._dialogRef) {
475
- this.formDialogClose.forEach(function (item) {
476
- _this._registerDialogClose(item);
477
- });
478
- this.formDialogClose.changes
479
- .pipe(takeUntil(this._destroy$))
480
- .subscribe(function (e) {
481
- e.forEach(function (item) {
482
- _this._registerDialogClose(item);
483
- });
484
- });
485
- }
486
- };
487
- FsFormDirective.prototype._registerConfirmDialogBackdropEscape = function () {
488
- var _this = this;
489
- this._dialogBackdropEscape = this._dialogRef && this._dialogRef.disableClose !== true;
490
- if (this._dialogRef && !this._dialogRef.disableClose) {
491
- this._dialogRef.disableClose = true;
492
- this._dialogRef.backdropClick()
493
- .pipe(takeUntil(this._destroy$))
494
- .subscribe(function () {
495
- _this._formClose();
496
- });
497
- this._destroy$
498
- .subscribe(function () {
499
- _this._dialogRef.disableClose = false;
500
- });
501
- }
502
- };
503
- FsFormDirective.prototype._registerAutocomplete = function () {
504
- var _this = this;
505
- this._registerControl = this.ngForm.form.registerControl.bind(this.ngForm.form);
506
- this.ngForm.form.registerControl = function (name, control) {
507
- var el = _this._element.nativeElement.querySelector("input[name='" + name + "']");
508
- if (el) {
509
- el.setAttribute('name', name + '_' + guid());
510
- if (!el.getAttribute('autocomplete')) {
511
- el.setAttribute('autocomplete', 'none');
512
- }
513
- }
514
- return _this._registerControl(name, control);
515
- };
516
- };
517
- FsFormDirective.prototype._registerDirtySubmitButton = function () {
518
- var _this = this;
519
- if (!this.ngForm) {
520
- return;
521
- }
522
- this.ngForm.form.valueChanges
523
- .pipe(takeUntil(this._destroy$))
524
- .subscribe(function () {
525
- _this._updateDirtySubmitButtons();
526
- });
527
- this._submitButtons.changes
528
- .pipe(takeUntil(this._destroy$))
529
- .subscribe(function () {
530
- _this._updateDirtySubmitButtons();
531
- });
532
- };
533
- FsFormDirective.prototype._updateDirtySubmitButtons = function () {
534
- var _this = this;
535
- this._submitButtons
536
- .forEach(function (submitButton) {
537
- if (!_this.confirm || !_this.dirtySubmitButton || _this.ngForm.dirty || !submitButton.dirtySubmit) {
538
- submitButton.enable();
539
- }
540
- else {
541
- submitButton.disable();
542
- }
543
- });
544
- };
545
- FsFormDirective.prototype._broadcastSubmittingEvents = function () {
546
- this._status$.next(FormStatus.Submitting);
547
- this._form.broadcast('submit', this.ngForm);
548
- };
549
- FsFormDirective.prototype._markControlsAsTouchedAndUpdateValidity = function () {
550
- Object.values(this.ngForm.controls)
551
- .forEach(function (control) {
552
- control.markAsDirty();
553
- control.markAsTouched();
554
- control.updateValueAndValidity();
555
- });
556
- };
557
- FsFormDirective.prototype._setupActiveSubmitButton = function () {
558
- this._activeSubmitButton = this._getActiveButton();
559
- this._resetButtons();
560
- if (this._activeSubmitButton) {
561
- this._activeSubmitButton.process();
562
- }
563
- };
564
- FsFormDirective.prototype._waitUntilStatusPending = function () {
565
- return this.ngForm.statusChanges
566
- .pipe(startWith(this.ngForm.status), first(function (state) { return state !== 'PENDING'; }));
567
- };
568
- FsFormDirective.prototype._handleError = function (e) {
569
- console.log('%c Form Submit ', 'color: white; background-color: #D33F49', 'Error occured');
570
- console.group('Error Details:');
571
- console.log('Message: ', e);
572
- console.log('FormRef: ', this);
573
- if (this.ngForm.invalid) {
574
- var errors = getFormErrors(this.ngForm.control, null);
575
- console.log('Validation Errors: ', errors);
576
- }
577
- console.groupEnd();
578
- this._completeSubmit(false, null);
579
- };
580
- FsFormDirective.ctorParameters = function () { return [
581
- { type: NgForm, decorators: [{ type: Inject, args: [NgForm,] }] },
582
- { type: FsForm },
583
- { type: ElementRef },
584
- { type: FsMessage },
585
- { type: FsPrompt },
586
- { type: NgZone },
587
- { type: MatDialogRef, decorators: [{ type: Optional }, { type: Inject, args: [MatDialogRef,] }] },
588
- { type: DrawerRef, decorators: [{ type: Optional }, { type: Inject, args: [DrawerRef,] }] }
589
- ]; };
590
- __decorate([
591
- Input(),
592
- __metadata("design:type", Object)
593
- ], FsFormDirective.prototype, "wrapperSelector", void 0);
594
- __decorate([
595
- Input(),
596
- __metadata("design:type", Object)
597
- ], FsFormDirective.prototype, "messageSelector", void 0);
598
- __decorate([
599
- Input(),
600
- __metadata("design:type", Object)
601
- ], FsFormDirective.prototype, "hintSelector", void 0);
602
- __decorate([
603
- Input(),
604
- __metadata("design:type", Object)
605
- ], FsFormDirective.prototype, "labelSelector", void 0);
606
- __decorate([
607
- Input(),
608
- __metadata("design:type", Object)
609
- ], FsFormDirective.prototype, "autocomplete", void 0);
610
- __decorate([
611
- Input(),
612
- __metadata("design:type", Object)
613
- ], FsFormDirective.prototype, "shortcuts", void 0);
614
- __decorate([
615
- Input(),
616
- __metadata("design:type", Object)
617
- ], FsFormDirective.prototype, "confirm", void 0);
618
- __decorate([
619
- Input(),
620
- __metadata("design:type", Object)
621
- ], FsFormDirective.prototype, "confirmDialog", void 0);
622
- __decorate([
623
- Input(),
624
- __metadata("design:type", Object)
625
- ], FsFormDirective.prototype, "confirmDrawer", void 0);
626
- __decorate([
627
- Input(),
628
- __metadata("design:type", Object)
629
- ], FsFormDirective.prototype, "confirmBrowser", void 0);
630
- __decorate([
631
- Input(),
632
- __metadata("design:type", Object)
633
- ], FsFormDirective.prototype, "confirmTabs", void 0);
634
- __decorate([
635
- Input(),
636
- __metadata("design:type", Object)
637
- ], FsFormDirective.prototype, "dirtySubmitButton", void 0);
638
- __decorate([
639
- Input(),
640
- __metadata("design:type", Function)
641
- ], FsFormDirective.prototype, "submit", void 0);
642
- __decorate([
643
- Input(),
644
- __metadata("design:type", Object)
645
- ], FsFormDirective.prototype, "successDelay", void 0);
646
- __decorate([
647
- Input(),
648
- __metadata("design:type", Object)
649
- ], FsFormDirective.prototype, "errorDelay", void 0);
650
- __decorate([
651
- Input(),
652
- __metadata("design:type", MatTabGroup)
653
- ], FsFormDirective.prototype, "tabGroup", void 0);
654
- __decorate([
655
- Output('fsForm'),
656
- __metadata("design:type", EventEmitter)
657
- ], FsFormDirective.prototype, "submitEvent", void 0);
658
- __decorate([
659
- Output(),
660
- __metadata("design:type", EventEmitter)
661
- ], FsFormDirective.prototype, "invalid", void 0);
662
- __decorate([
663
- Output(),
664
- __metadata("design:type", EventEmitter)
665
- ], FsFormDirective.prototype, "valid", void 0);
666
- __decorate([
667
- Output(),
668
- __metadata("design:type", EventEmitter)
669
- ], FsFormDirective.prototype, "submitted", void 0);
670
- __decorate([
671
- Output(),
672
- __metadata("design:type", EventEmitter)
673
- ], FsFormDirective.prototype, "reseted", void 0);
674
- __decorate([
675
- Output(),
676
- __metadata("design:type", EventEmitter)
677
- ], FsFormDirective.prototype, "cleared", void 0);
678
- __decorate([
679
- HostBinding('class.fs-form'),
680
- __metadata("design:type", Object)
681
- ], FsFormDirective.prototype, "fsformClass", void 0);
682
- __decorate([
683
- ContentChildren(FsFormDialogCloseDirective, { descendants: true }),
684
- __metadata("design:type", QueryList)
685
- ], FsFormDirective.prototype, "formDialogClose", void 0);
686
- __decorate([
687
- ContentChildren(MatTabGroup, { descendants: true }),
688
- __metadata("design:type", QueryList)
689
- ], FsFormDirective.prototype, "_tabGroups", void 0);
690
- FsFormDirective = __decorate([
691
- Directive({
692
- selector: '[fsForm]',
693
- }),
694
- __param(0, Inject(NgForm)),
695
- __param(6, Optional()), __param(6, Inject(MatDialogRef)),
696
- __param(7, Optional()), __param(7, Inject(DrawerRef)),
697
- __metadata("design:paramtypes", [NgForm,
698
- FsForm,
699
- ElementRef,
700
- FsMessage,
701
- FsPrompt,
702
- NgZone,
703
- MatDialogRef,
704
- DrawerRef])
705
- ], FsFormDirective);
706
- return FsFormDirective;
707
- }());
708
- export { FsFormDirective };
709
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZmlyZXN0aXRjaC9mb3JtLyIsInNvdXJjZXMiOlsiYXBwL2RpcmVjdGl2ZXMvZm9ybS9mb3JtLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULGFBQWEsR0FDZCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQVUsV0FBVyxFQUFnQixNQUFNLHdCQUF3QixDQUFDO0FBRTNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFL0MsT0FBTyxFQUNMLGVBQWUsRUFDZixLQUFLLEVBQ0wsU0FBUyxFQUNULEdBQUcsRUFDSCxZQUFZLEVBRVosRUFBRSxFQUNGLE9BQU8sRUFDUCxVQUFVLEVBQ1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sS0FBSyxFQUNMLEdBQUcsRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsRUFDSixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUc1RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFNOUQ7SUFxRkUseUJBRVMsTUFBYyxFQUNiLEtBQWEsRUFDYixRQUFvQixFQUNwQixRQUFtQixFQUNuQixPQUFpQixFQUNqQixPQUFlLEVBR2YsVUFBNkIsRUFHN0IsVUFBMEI7UUFYM0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNiLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixhQUFRLEdBQVIsUUFBUSxDQUFZO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsWUFBTyxHQUFQLE9BQU8sQ0FBVTtRQUNqQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBR2YsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFHN0IsZUFBVSxHQUFWLFVBQVUsQ0FBZ0I7UUEvRjdCLG9CQUFlLEdBQUcsa0NBQWtDLENBQUM7UUFHckQsb0JBQWUsR0FBRyxvREFBb0QsQ0FBQztRQUd2RSxpQkFBWSxHQUFHLDRDQUE0QyxDQUFDO1FBRzVELGtCQUFhLEdBQUcsc0NBQXNDLENBQUM7UUFHdkQsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFHckIsY0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLFdBQVc7UUFHN0IsWUFBTyxHQUE0QixJQUFJLENBQUM7UUFHeEMsa0JBQWEsR0FBRyxJQUFJLENBQUM7UUFHckIsa0JBQWEsR0FBRyxJQUFJLENBQUM7UUFHckIsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFHdEIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFHbkIsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBTXpCLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBR2pCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFNbEIsZ0JBQVcsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUc1RCxZQUFPLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHeEQsVUFBSyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBR3RELGNBQVMsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUcxRCxZQUFPLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHeEQsWUFBTyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBR3hELGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBTWxCLGVBQVUsR0FBMkIsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUVyRCxtQkFBYyxHQUF1QyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBR3JFLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5QixjQUFTLEdBQStCLEVBQUUsQ0FBQztRQUMzQyxhQUFRLEdBQUcsSUFBSSxlQUFlLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBZ0IvQixDQUFDO0lBRUosc0JBQVcsdUNBQVU7YUFBckI7WUFDRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUM1RCxDQUFDOzs7T0FBQTtJQUVELHNCQUFXLHVDQUFVO2FBQXJCO1lBQ0UsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDNUQsQ0FBQzs7O09BQUE7SUFFRCxzQkFBWSx5Q0FBWTthQUF4QjtZQUNFLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7YUFDM0IsQ0FBQztRQUNKLENBQUM7OztPQUFBO0lBRUQsc0JBQVksNkNBQWdCO2FBQTVCO1lBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRW5DLElBQU0sY0FBYyxHQUFtQjtnQkFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzFCLFFBQVEsRUFBRSxJQUFJO2FBQ2YsQ0FBQztZQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNoQixPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUMzQjtZQUVELElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRTlDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQzNCO1lBRUQsT0FBTyxNQUFNO2lCQUNWLElBQUksQ0FDSCxHQUFHLENBQUMsVUFBQyxRQUFRO2dCQUNYLGNBQWMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO2dCQUVuQyxPQUFPLGNBQWMsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ04sQ0FBQzs7O09BQUE7SUFFRCxzQkFBWSwrQ0FBa0I7YUFBOUI7WUFDRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRW5ELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3RDO1lBRUQsSUFBTSxPQUFPLEdBQUcsNkRBQTZELENBQUM7WUFDOUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRTFELElBQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUVwRSxJQUFJLEVBQUUsRUFBRTtnQkFDTixFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUM1RDtZQUVELE9BQU8sVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDN0MsQ0FBQzs7O09BQUE7SUFFRCxzQkFBWSx1Q0FBVTthQUF0QjtZQUNFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQjtnQkFDN0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJO2dCQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1gsQ0FBQzs7O09BQUE7SUFFTSxrQ0FBUSxHQUFmO1FBQ0UsSUFBSSxDQUFDLG9DQUFvQyxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFTSxxQ0FBVyxHQUFsQixVQUFtQixPQUFzQjtRQUN2QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDbkIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRU0sNENBQWtCLEdBQXpCO1FBQ0UsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVNLHFDQUFXLEdBQWxCO1FBQ0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSx3Q0FBYyxHQUFyQjtRQUNFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQUVNLCtCQUFLLEdBQVo7UUFBQSxpQkFVQztRQVRDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQzthQUM5QixPQUFPLENBQUMsVUFBQyxJQUFZO1lBQ3BCLElBQU0sT0FBTyxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0sK0JBQUssR0FBWjtRQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0sK0JBQUssR0FBWjtRQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSx1Q0FBYSxHQUFwQjtRQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTSx3Q0FBYyxHQUFyQjtRQUFBLGlCQVFDO1FBUEMsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTNFLE9BQU8sU0FBUzthQUNiLElBQUksQ0FDSCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsUUFBUSxDQUFDLGNBQU0sT0FBQSxjQUFjLENBQUMsS0FBSSxFQUFFLEtBQUksQ0FBQyxPQUFPLENBQUMsRUFBbEMsQ0FBa0MsQ0FBQyxDQUNuRCxDQUFDO0lBQ04sQ0FBQztJQUVNLGdDQUFNLEdBQWI7UUFDRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUU3QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU0saUNBQU8sR0FBZDtRQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFVBQUMsTUFBTTtZQUNqQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0seUNBQWUsR0FBdEIsVUFBdUIsWUFBcUM7UUFDMUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLFVBRWxCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO1lBQ2hDLFlBQVk7V0FDWixDQUFDO0lBQ1AsQ0FBQztJQUVNLDRDQUFrQixHQUF6QixVQUEwQixZQUFxQztRQUM3RCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssVUFFbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUU7YUFDL0IsTUFBTSxDQUFDLFVBQUMsYUFBYSxJQUFLLE9BQUEsQ0FBQyxZQUFZLEtBQUssYUFBYSxDQUFDLEVBQWhDLENBQWdDLENBQUMsRUFDNUQsQ0FBQztJQUNQLENBQUM7SUFFTyx1Q0FBYSxHQUFyQjtRQUFBLGlCQStCQztRQTlCQyxJQUFJLENBQUMsTUFBTTthQUNSLFFBQVE7YUFDUixJQUFJLENBQ0gsR0FBRyxDQUFDLFVBQUMsS0FBSztZQUNSLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxjQUFjLEdBQUc7UUFDMUIsQ0FBQyxDQUFDLEVBQ0YsTUFBTSxDQUFDO1lBQ0wsT0FBTyxDQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBRTtpQkFDNUMsUUFBUSxDQUFDLEtBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyx1Q0FBdUMsRUFBRSxFQUE5QyxDQUE4QyxDQUFDLEVBQ3pELEdBQUcsQ0FBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLDBCQUEwQixFQUFFLEVBQWpDLENBQWlDLENBQUMsRUFDNUMsU0FBUyxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBOUIsQ0FBOEIsQ0FBQyxFQUMvQyxHQUFHLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUEvQixDQUErQixDQUFDLEVBQzFDLFFBQVEsQ0FBQztZQUNQLE9BQU8sS0FBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUztnQkFDckMsQ0FBQyxDQUFDLEtBQUksQ0FBQyxrQkFBa0I7Z0JBQ3pCLENBQUMsQ0FBQyxLQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDNUIsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLFVBQUMsQ0FBQyxFQUFFLE9BQU87WUFDcEIsS0FBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVyQixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsVUFBQyxjQUE4QjtZQUNqQyxLQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjthQUNBLFNBQVMsQ0FBQyxjQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFTyw0Q0FBa0IsR0FBMUI7UUFBQSxpQkFVQztRQVRDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDO2FBQzlCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjthQUNBLFNBQVMsQ0FBQyxVQUFDLEtBQVk7WUFDdEIsSUFBSSxLQUFJLENBQUMsT0FBTyxJQUFJLEtBQUksQ0FBQyxjQUFjLElBQUksS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7Z0JBQzVELEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2FBQzNCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sd0NBQWMsR0FBdEI7UUFBQSxpQkFpQ0M7UUFoQ0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztZQUM3QixTQUFTLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQztpQkFDM0IsSUFBSSxDQUNILFNBQVMsQ0FBQyxLQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2lCQUNBLFNBQVMsQ0FBQyxVQUFDLEtBQW9CO2dCQUM5QixJQUFJLEtBQUksQ0FBQyxxQkFBcUIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtvQkFDekQsSUFBTSxRQUFNLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMzRCxJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBRW5DLElBQUksS0FBSyxFQUFFO3dCQUNULEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJOzRCQUNoQixJQUFJLFFBQU0sS0FBSyxJQUFJLEVBQUU7Z0NBQ25CLEtBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO29DQUNmLEtBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQ0FDcEIsQ0FBQyxDQUFDLENBQUM7NkJBQ0o7d0JBQ0gsQ0FBQyxDQUFDLENBQUM7cUJBQ0o7aUJBQ0Y7Z0JBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO29CQUM3RCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBRXZCLElBQUksS0FBSSxDQUFDLFNBQVMsRUFBRTt3QkFDbEIsSUFBSSxLQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRTs0QkFDL0MsS0FBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7eUJBQzdCO3FCQUNGO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxvQ0FBVSxHQUFsQjtRQUFBLGlCQWtCQztRQWpCQyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QyxJQUFJLENBQUMsY0FBYyxFQUFFO2lCQUNsQixJQUFJLENBQ0gsTUFBTSxDQUFDLFVBQUMsTUFBTSxJQUFLLE9BQUEscUJBQXFCLENBQUMsTUFBTSxDQUFDLEVBQTdCLENBQTZCLENBQUMsRUFDakQsU0FBUyxDQUFDLFVBQUMsTUFBTTtnQkFDZixPQUFPLE1BQU0sS0FBSyxhQUFhLENBQUMsUUFBUSxJQUFJLE1BQU0sS0FBSyxhQUFhLENBQUMsT0FBTztvQkFDMUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7b0JBQ1YsQ0FBQyxDQUFDLEtBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEMsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7aUJBQ0EsU0FBUyxDQUFDLFVBQUMsTUFBc0I7Z0JBQ2hDLEtBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxRQUFRLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFTyw4Q0FBb0IsR0FBNUIsVUFBNkIsU0FBcUM7UUFBbEUsaUJBWUM7UUFYQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRTtZQUN6QixTQUFTLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUU1QixTQUFTLENBQUMsUUFBUTtpQkFDZixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7aUJBQ0EsU0FBUyxDQUFDO2dCQUNULEtBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQztJQUVPLDBDQUFnQixHQUF4QjtRQUNFLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsTUFBTTtZQUNsRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztJQUNqRSxDQUFDO0lBRU8sd0NBQWMsR0FBdEIsVUFBdUIsRUFBVztRQUVoQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUM5QyxPQUFPLElBQUksQ0FBQztTQUNiO2FBQU0sSUFBSSxFQUFFLENBQUMsYUFBYSxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDOUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyx5Q0FBZSxHQUF2QixVQUF3QixPQUFPLEVBQUUsV0FBMkI7UUFBNUQsaUJBNENDO1FBM0NDLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ2xDO2FBQU07WUFDTCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7UUFFRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixJQUFJLE9BQU8sRUFBRTtnQkFDWCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDcEM7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2xDO1NBQ0Y7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFekMsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDeEM7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxQyxJQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFakUsRUFBRSxDQUFDLElBQUksQ0FBQzthQUNQLElBQUksQ0FDSCxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQ2pCLEtBQUssRUFBRSxFQUNQLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCLENBQUMsU0FBUyxDQUFDO1lBQ1YsSUFBSSxLQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTyxFQUFFO2dCQUN2QyxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEM7aUJBQU07Z0JBQ0wsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3hDO1lBRUQsS0FBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLEtBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHVDQUFhLEdBQXJCO1FBQ0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBQyxNQUFNO1lBQ2pDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTywwQ0FBZ0IsR0FBeEI7UUFBQSxpQkFpQkM7UUFoQkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWTthQUMxQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7YUFDQSxTQUFTLENBQUMsVUFBQyxPQUFPO1lBQ2pCLElBQUksS0FBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEIsSUFBTSxVQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRTdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO3FCQUNqQixPQUFPLENBQUMsVUFBQyxJQUFZO29CQUNwQixJQUFJLFVBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ2pDLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUN0QztnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNOO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sOENBQW9CLEdBQTVCO1FBQUEsaUJBMkJDO1FBMUJDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVc7aUJBQzFCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjtpQkFDQSxTQUFTLENBQUMsVUFBQyxVQUFVO2dCQUNwQixJQUFJLEtBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ25CLEtBQUksQ0FBQyxRQUFRO3lCQUNWLElBQUksQ0FDSCxNQUFNLENBQUMsVUFBQyxNQUFNLElBQUssT0FBQSxNQUFNLEtBQUssVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLEtBQUssVUFBVSxDQUFDLEtBQUssRUFBNUQsQ0FBNEQsQ0FBQyxFQUNoRixTQUFTLENBQUMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjt5QkFDQSxTQUFTLENBQUMsVUFBQyxNQUFNO3dCQUNoQixJQUFJLE1BQU0sS0FBSyxVQUFVLENBQUMsT0FBTyxFQUFFOzRCQUNqQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQ2xCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt5QkFDdkI7NkJBQU07NEJBQ0wsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO3lCQUNwQjtvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDTjtxQkFBTTtvQkFDTCxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2xCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDdkI7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVPLHFEQUEyQixHQUFuQztRQUFBLGlCQTZCQztRQTVCQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXO2lCQUMxQixJQUFJLENBQ0gsU0FBUyxDQUFDLFVBQUMsVUFBVTtnQkFDbkIsT0FBTyxHQUFHLENBQ1IsY0FBTSxPQUFBLEtBQUksQ0FBQyxPQUFPLElBQUksS0FBSSxDQUFDLGFBQWEsRUFBbEMsQ0FBa0MsRUFDeEMsS0FBSSxDQUFDLGNBQWMsRUFBRTtxQkFDbEIsSUFBSSxDQUNILEdBQUcsQ0FBQyxVQUFDLE1BQU0sSUFBSyxPQUFBLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxFQUE3QixDQUE2QixDQUFDLEVBQzlDLEdBQUcsQ0FBQyxVQUFDLE1BQU07b0JBQ1QsSUFBSSxNQUFNLEVBQUU7d0JBQ1YsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNsQixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7cUJBQ3ZCO3lCQUFNO3dCQUNMLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztxQkFDcEI7Z0JBQ0gsQ0FBQyxDQUFDLENBQ0gsRUFDSCxLQUFLLENBQUM7b0JBQ0osVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNsQixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3hCLENBQUMsQ0FBQyxDQUNILENBQUE7WUFDSCxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjtpQkFDQSxTQUFTLEVBQUUsQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVPLDhDQUFvQixHQUE1QjtRQUFBLGlCQWNDO1FBYkMsSUFBRyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0M7UUFFRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTzthQUN0QixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7YUFDQSxTQUFTLENBQUM7WUFDVCxLQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGtEQUF3QixHQUEvQixVQUFnQyxTQUF3QjtRQUF4RCxpQkFJQztRQUhDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBQyxRQUFxQjtZQUN0QyxLQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0saURBQXVCLEdBQTlCLFVBQStCLFFBQXFCO1FBQXBELGlCQW1DQztRQWxDQyxJQUFNLGVBQWUsR0FBRyxRQUEyQixDQUFDO1FBQ3BELElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLEVBQUU7WUFDekMsZUFBZSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7WUFDN0QsZUFBZSxDQUFDLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBeUQsQ0FBQztZQUNwRyxlQUFlLENBQUMsWUFBWSxHQUFHLFVBQUMsR0FBVyxFQUFFLFNBQXVCLEVBQUUsR0FBVztnQkFDL0UsSUFBRyxlQUFlLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7b0JBQ2hELGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFBLEVBQUUsU0FBUyxXQUFBLEVBQUUsR0FBRyxLQUFBLEVBQUMsQ0FBQyxDQUFDO2lCQUMzRDtxQkFBTTtvQkFDTCxlQUFlLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDM0Q7WUFDSCxDQUFDLENBQUE7U0FDRjtRQUVELGVBQWUsQ0FBQyxZQUFZO2FBQzNCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjthQUNBLFNBQVMsQ0FBQyxVQUFDLEtBQUs7WUFDZixJQUFJLENBQUMsS0FBSSxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsSUFBSSxLQUFJLENBQUMsT0FBTyxJQUFJLEtBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ3BDLEtBQUksQ0FBQyxjQUFjLEVBQUU7eUJBQ2xCLElBQUksQ0FDSCxTQUFTLENBQUMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjt5QkFDQSxTQUFTLENBQUMsVUFBQyxNQUFNO3dCQUNoQixJQUFJLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUNqQyxlQUFlLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7eUJBQzNDO29CQUNILENBQUMsQ0FBQyxDQUFDO2lCQUNOO3FCQUFNO29CQUNMLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUM3RTthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8scURBQTJCLEdBQW5DO1FBQUEsaUJBZ0JDO1FBZkMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFVBQUEsSUFBSTtnQkFDL0IsS0FBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPO2lCQUMzQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7aUJBQ0EsU0FBUyxDQUFDLFVBQUMsQ0FBQztnQkFDWCxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsSUFBSTtvQkFDWixLQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFTyw4REFBb0MsR0FBNUM7UUFBQSxpQkFrQkM7UUFqQkMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDO1FBRXRGLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFO1lBQ3BELElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRTtpQkFDOUIsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2lCQUNBLFNBQVMsQ0FBQztnQkFDVCxLQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsU0FBUztpQkFDYixTQUFTLENBQUM7Z0JBQ1QsS0FBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU8sK0NBQXFCLEdBQTdCO1FBQUEsaUJBaUJDO1FBaEJDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFaEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQUMsSUFBWSxFQUFFLE9BQXdCO1lBRXhFLElBQU0sRUFBRSxHQUFZLEtBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxpQkFBZSxJQUFJLE9BQUksQ0FBQyxDQUFDO1lBRXZGLElBQUksRUFBRSxFQUFFO2dCQUNOLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFN0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUU7b0JBQ3BDLEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2lCQUN6QzthQUNGO1lBRUQsT0FBTyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFFTyxvREFBMEIsR0FBbEM7UUFBQSxpQkFxQkM7UUFuQkMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWTthQUM1QixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7YUFDQSxTQUFTLENBQUM7WUFDVCxLQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTzthQUMxQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7YUFDQSxTQUFTLENBQUM7WUFDVCxLQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxtREFBeUIsR0FBakM7UUFBQSxpQkFTQztRQVJDLElBQUksQ0FBQyxjQUFjO2FBQ2xCLE9BQU8sQ0FBQyxVQUFDLFlBQXFDO1lBQzdDLElBQUksQ0FBQyxLQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSSxDQUFDLGlCQUFpQixJQUFJLEtBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRTtnQkFDNUYsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ3ZCO2lCQUFNO2dCQUNMLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUN4QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLG9EQUEwQixHQUFsQztRQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTyxpRUFBdUMsR0FBL0M7UUFDRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2FBQ2xDLE9BQU8sQ0FBQyxVQUFBLE9BQU87WUFDZCxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGtEQUF3QixHQUFoQztRQUNFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFckIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3BDO0lBQ0gsQ0FBQztJQUVPLGlEQUF1QixHQUEvQjtRQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhO2FBQzdCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFDN0IsS0FBSyxDQUFDLFVBQUMsS0FBSyxJQUFLLE9BQUEsS0FBSyxLQUFLLFNBQVMsRUFBbkIsQ0FBbUIsQ0FBQyxDQUN0QyxDQUFDO0lBQ04sQ0FBQztJQUVPLHNDQUFZLEdBQXBCLFVBQXFCLENBQWlCO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUcseUNBQXlDLEVBQUcsZUFBZSxDQUFDLENBQUM7UUFFN0YsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRS9CLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDdkIsSUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hELE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDNUM7UUFFRCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFbkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQzs7Z0JBdG9CZ0IsTUFBTSx1QkFEcEIsTUFBTSxTQUFDLE1BQU07Z0JBRUMsTUFBTTtnQkFDSCxVQUFVO2dCQUNWLFNBQVM7Z0JBQ1YsUUFBUTtnQkFDUixNQUFNO2dCQUdILFlBQVksdUJBRC9CLFFBQVEsWUFBSSxNQUFNLFNBQUMsWUFBWTtnQkFJWixTQUFTLHVCQUQ1QixRQUFRLFlBQUksTUFBTSxTQUFDLFNBQVM7O0lBOUYvQjtRQURDLEtBQUssRUFBRTs7NERBQ29EO0lBRzVEO1FBREMsS0FBSyxFQUFFOzs0REFDc0U7SUFHOUU7UUFEQyxLQUFLLEVBQUU7O3lEQUMyRDtJQUduRTtRQURDLEtBQUssRUFBRTs7MERBQ3NEO0lBRzlEO1FBREMsS0FBSyxFQUFFOzt5REFDb0I7SUFHNUI7UUFEQyxLQUFLLEVBQUU7O3NEQUNnQjtJQUd4QjtRQURDLEtBQUssRUFBRTs7b0RBQ3VDO0lBRy9DO1FBREMsS0FBSyxFQUFFOzswREFDb0I7SUFHNUI7UUFEQyxLQUFLLEVBQUU7OzBEQUNvQjtJQUc1QjtRQURDLEtBQUssRUFBRTs7MkRBQ3FCO0lBRzdCO1FBREMsS0FBSyxFQUFFOzt3REFDa0I7SUFHMUI7UUFEQyxLQUFLLEVBQUU7OzhEQUN3QjtJQUdoQztRQURDLEtBQUssRUFBRTs7bURBQytDO0lBR3ZEO1FBREMsS0FBSyxFQUFFOzt5REFDZ0I7SUFHeEI7UUFEQyxLQUFLLEVBQUU7O3VEQUNpQjtJQUd6QjtRQURDLEtBQUssRUFBRTtrQ0FDUyxXQUFXO3FEQUFDO0lBRzdCO1FBREMsTUFBTSxDQUFDLFFBQVEsQ0FBQztrQ0FDRyxZQUFZO3dEQUFtQztJQUduRTtRQURDLE1BQU0sRUFBRTtrQ0FDTyxZQUFZO29EQUFtQztJQUcvRDtRQURDLE1BQU0sRUFBRTtrQ0FDSyxZQUFZO2tEQUFtQztJQUc3RDtRQURDLE1BQU0sRUFBRTtrQ0FDUyxZQUFZO3NEQUFtQztJQUdqRTtRQURDLE1BQU0sRUFBRTtrQ0FDTyxZQUFZO29EQUFtQztJQUcvRDtRQURDLE1BQU0sRUFBRTtrQ0FDTyxZQUFZO29EQUFtQztJQUcvRDtRQURDLFdBQVcsQ0FBQyxlQUFlLENBQUM7O3dEQUNIO0lBRzFCO1FBREMsZUFBZSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO2tDQUMzQyxTQUFTOzREQUE2QjtJQUc5RDtRQURDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7a0NBQ2hDLFNBQVM7dURBQWdDO0lBM0VsRCxlQUFlO1FBSDNCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxVQUFVO1NBQ3JCLENBQUM7UUF1RkcsV0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFRZCxXQUFBLFFBQVEsRUFBRSxDQUFBLEVBQUUsV0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7UUFHaEMsV0FBQSxRQUFRLEVBQUUsQ0FBQSxFQUFFLFdBQUEsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO3lDQVZmLE1BQU07WUFDTixNQUFNO1lBQ0gsVUFBVTtZQUNWLFNBQVM7WUFDVixRQUFRO1lBQ1IsTUFBTTtZQUdILFlBQVk7WUFHWixTQUFTO09BbEdwQixlQUFlLENBK3RCM0I7SUFBRCxzQkFBQztDQUFBLEFBL3RCRCxJQSt0QkM7U0EvdEJZLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRUYWIsIE1hdFRhYkdyb3VwLCBNYXRUYWJIZWFkZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcblxuaW1wb3J0IHsgRnNNZXNzYWdlLCBNZXNzYWdlTW9kZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuaW1wb3J0IHsgZ3VpZCB9IGZyb20gJ0BmaXJlc3RpdGNoL2NvbW1vbic7XG5pbXBvcnQgeyBEcmF3ZXJSZWYgfSBmcm9tICdAZmlyZXN0aXRjaC9kcmF3ZXInO1xuXG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGRlZmVyLFxuICBmcm9tRXZlbnQsXG4gIGlpZixcbiAgaXNPYnNlcnZhYmxlLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgU3ViamVjdCxcbiAgdGhyb3dFcnJvclxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRlbGF5LFxuICBmaWx0ZXIsXG4gIGZpcnN0LFxuICBtYXAsXG4gIG1lcmdlTWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXBcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBjb25maXJtVW5zYXZlZCB9IGZyb20gJy4uLy4uL2hlbHBlcnMvY29uZmlybS11bnNhdmVkJztcbmltcG9ydCB7IEZzRm9ybURpYWxvZ0Nsb3NlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZm9ybS1kaWFsb2ctY2xvc2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZzU3VibWl0QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vc3VibWl0LWJ1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ29uZmlybUNvbmZpZywgU3VibWl0dGVkRXZlbnQsIENvbmZpcm1UYWJHcm91cCB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb25maXJtUmVzdWx0IH0gZnJvbSAnLi8uLi8uLi9lbnVtcy9jb25maXJtLXJlc3VsdCc7XG5pbXBvcnQgeyBGc0Zvcm0gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mc2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBTdWJtaXRFdmVudCB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9zdWJtaXQtZXZlbnQnO1xuaW1wb3J0IHsgRm9ybVN0YXR1cyB9IGZyb20gJy4vLi4vLi4vZW51bXMvZm9ybS1zdGF0dXMnO1xuaW1wb3J0IHsgY29uZmlybVJlc3VsdENvbnRpbnVlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9jb25maXJtLXJlc3VsdC1jb250aW51ZSc7XG5pbXBvcnQgeyBnZXRGb3JtRXJyb3JzIH0gZnJvbSAnLi4vLi4vaGVscGVycy9nZXQtZm9ybS1lcnJvcnMnO1xuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tmc0Zvcm1dJyxcbn0pXG5leHBvcnQgY2xhc3MgRnNGb3JtRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHdyYXBwZXJTZWxlY3RvciA9ICcuZnMtZm9ybS13cmFwcGVyLC5tYXQtZm9ybS1maWVsZCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1lc3NhZ2VTZWxlY3RvciA9ICcuZnMtZm9ybS1tZXNzYWdlLC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcic7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGhpbnRTZWxlY3RvciA9ICcuZnMtZm9ybS1oaW50LC5tYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXInO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsYWJlbFNlbGVjdG9yID0gJy5mcy1mb3JtLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1sYWJlbCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGF1dG9jb21wbGV0ZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG9ydGN1dHMgPSB0cnVlOyAvLyBDdHJsICsgc1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maXJtOiBDb25maXJtQ29uZmlnIHwgYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbmZpcm1EaWFsb2cgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maXJtRHJhd2VyID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlybUJyb3dzZXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maXJtVGFicyA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRpcnR5U3VibWl0QnV0dG9uID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc3VibWl0OiAoZXZlbnQ6IFN1Ym1pdEV2ZW50KSA9PiBPYnNlcnZhYmxlPGFueT47XG5cbiAgQElucHV0KClcbiAgcHVibGljIHN1Y2Nlc3NEZWxheSA9IDA7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGVycm9yRGVsYXkgPSAxMDAwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0YWJHcm91cDogTWF0VGFiR3JvdXA7XG5cbiAgQE91dHB1dCgnZnNGb3JtJylcbiAgcHVibGljIHN1Ym1pdEV2ZW50OiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgaW52YWxpZDogRXZlbnRFbWl0dGVyPFN1Ym1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHZhbGlkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc3VibWl0dGVkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVzZXRlZDogRXZlbnRFbWl0dGVyPFN1Ym1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGNsZWFyZWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mcy1mb3JtJylcbiAgcHVibGljIGZzZm9ybUNsYXNzID0gdHJ1ZTtcblxuICBAQ29udGVudENoaWxkcmVuKEZzRm9ybURpYWxvZ0Nsb3NlRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHB1YmxpYyBmb3JtRGlhbG9nQ2xvc2U6IFF1ZXJ5TGlzdDxGc0Zvcm1EaWFsb2dDbG9zZURpcmVjdGl2ZT47XG5cbiAgQENvbnRlbnRDaGlsZHJlbihNYXRUYWJHcm91cCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBwcml2YXRlIF90YWJHcm91cHM6IFF1ZXJ5TGlzdDxNYXRUYWJHcm91cD4gPSBuZXcgUXVlcnlMaXN0KCk7XG5cbiAgcHJpdmF0ZSBfc3VibWl0QnV0dG9uczogUXVlcnlMaXN0PEZzU3VibWl0QnV0dG9uRGlyZWN0aXZlPiA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb250cm9sO1xuICBwcml2YXRlIF9hY3RpdmVTdWJtaXRCdXR0b246IEZzU3VibWl0QnV0dG9uRGlyZWN0aXZlO1xuICBwcml2YXRlIF9kaWFsb2dCYWNrZHJvcEVzY2FwZSA9IGZhbHNlO1xuICBwcml2YXRlIF9zbmFwc2hvdDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7fTtcbiAgcHJpdmF0ZSBfc3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoRm9ybVN0YXR1cy5WYWxpZCk7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE5nRm9ybSlcbiAgICBwdWJsaWMgbmdGb3JtOiBOZ0Zvcm0sXG4gICAgcHJpdmF0ZSBfZm9ybTogRnNGb3JtLFxuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfbWVzc2FnZTogRnNNZXNzYWdlLFxuICAgIHByaXZhdGUgX3Byb21wdDogRnNQcm9tcHQsXG4gICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG5cbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1hdERpYWxvZ1JlZilcbiAgICBwcml2YXRlIF9kaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxhbnk+LFxuXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChEcmF3ZXJSZWYpXG4gICAgcHJpdmF0ZSBfZHJhd2VyUmVmOiBEcmF3ZXJSZWY8YW55PixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgc3VibWl0dGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzJC5nZXRWYWx1ZSgpID09PSBGb3JtU3RhdHVzLlN1Ym1pdHRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbXBsZXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gRm9ybVN0YXR1cy5Db21wbGV0aW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3N1Ym1pdEV2ZW50KCk6IFN1Ym1pdEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdGb3JtOiB0aGlzLm5nRm9ybSxcbiAgICAgIHN1Ym1pdHRlcjogdGhpcy5fc3VibWl0dGVyLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldCBfZm9ybVZhbGlkU3RhdGUkKCk6IE9ic2VydmFibGU8U3VibWl0dGVkRXZlbnQ+IHtcbiAgICB0aGlzLl9mb3JtLmJyb2FkY2FzdCgndmFsaWQnLCB0aGlzLl9zdWJtaXRFdmVudCk7XG4gICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHRoaXMuX3N1Ym1pdEV2ZW50KTtcbiAgICB0aGlzLnZhbGlkLmVtaXQodGhpcy5fc3VibWl0RXZlbnQpO1xuXG4gICAgY29uc3Qgc3VibWl0dGVkRXZlbnQ6IFN1Ym1pdHRlZEV2ZW50ID0ge1xuICAgICAgbmdGb3JtOiB0aGlzLm5nRm9ybSxcbiAgICAgIHN1Ym1pdHRlcjogdGhpcy5fc3VibWl0dGVyLFxuICAgICAgcmVzcG9uc2U6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKCF0aGlzLnN1Ym1pdCkge1xuICAgICAgcmV0dXJuIG9mKHN1Ym1pdHRlZEV2ZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnN1Ym1pdCh0aGlzLl9zdWJtaXRFdmVudCk7XG5cbiAgICBpZiAoIWlzT2JzZXJ2YWJsZShyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gb2Yoc3VibWl0dGVkRXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgc3VibWl0dGVkRXZlbnQucmVzcG9uc2UgPSByZXNwb25zZTtcblxuICAgICAgICAgIHJldHVybiBzdWJtaXR0ZWRFdmVudDtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldCBfZm9ybUludmFsaWRTdGF0ZSQoKTogT2JzZXJ2YWJsZTxuZXZlcj4ge1xuICAgIHRoaXMuX2Zvcm0uYnJvYWRjYXN0KCdpbnZhbGlkJywgdGhpcy5fc3VibWl0RXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuaW52YWxpZCkge1xuICAgICAgdGhpcy5pbnZhbGlkLmVtaXQodGhpcy5fc3VibWl0RXZlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSAnQ2hhbmdlcyBub3Qgc2F2ZWQuIFBsZWFzZSByZXZpZXcgZXJyb3JzIGhpZ2hsaWdodGVkIGluIHJlZC4nO1xuICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IobWVzc2FnZSwgeyBtb2RlOiBNZXNzYWdlTW9kZS5Ub2FzdCB9KTtcblxuICAgIGNvbnN0IGVsID0gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uZy1pbnZhbGlkJyk7XG5cbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRocm93RXJyb3IoJ0Zvcm0gdmFsaWRhdGlvbiBlcnJvcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3N1Ym1pdHRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVTdWJtaXRCdXR0b25cbiAgICAgID8gdGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uLm5hbWVcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9yZWdpc3RlckNvbmZpcm1EaWFsb2dCYWNrZHJvcEVzY2FwZSgpO1xuICAgIHRoaXMuX2xpc3RlbkhvdEtleXMoKTtcbiAgICB0aGlzLl9saXN0ZW5XaW5kb3dDbG9zZSgpO1xuICAgIHRoaXMuX2xpc3RlblN1Ym1pdCgpO1xuXG4gICAgaWYgKCF0aGlzLmF1dG9jb21wbGV0ZSkge1xuICAgICAgdGhpcy5fcmVnaXN0ZXJBdXRvY29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmNvbmZpcm0pIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVnaXN0ZXJDb25maXJtKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJDb25maXJtRGlhbG9nQ2xvc2UoKTtcbiAgICB0aGlzLl9yZWdpc3RlckNvbmZpcm1EcmF3ZXJDbG9zZSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybVRhYnMoKTtcbiAgICB0aGlzLl9yZWdpc3RlckRyYXdlckNsb3NlKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJEaXJ0eVN1Ym1pdEJ1dHRvbigpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVNuYXBzaG90KCk6IHZvaWQge1xuICAgIHRoaXMuX3NuYXBzaG90ID0gdGhpcy5uZ0Zvcm0udmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0ucmVzZXRGb3JtKCk7XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLm5nRm9ybS5jb250cm9scylcbiAgICAgIC5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMubmdGb3JtLmNvbnRyb2xzW25hbWVdO1xuICAgICAgICBjb250cm9sLnJlc2V0KHRoaXMuX3NuYXBzaG90W25hbWVdKTtcbiAgICAgIH0pO1xuICAgIFxuICAgIHRoaXMucmVzZXRlZC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0ucmVzZXRGb3JtKCk7XG4gICAgdGhpcy5jbGVhcmVkLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXJ0eSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5mb3JtLm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlclN1Ym1pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5uZ1N1Ym1pdC5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlckNvbmZpcm0oKTogT2JzZXJ2YWJsZTxDb25maXJtUmVzdWx0PiB7XG4gICAgY29uc3Qgc3VibWl0dGVkID0gdGhpcy5zdWJtaXR0aW5nID8gdGhpcy5zdWJtaXR0ZWQuYXNPYnNlcnZhYmxlKCkgOiBvZih7fSk7XG5cbiAgICByZXR1cm4gc3VibWl0dGVkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4gY29uZmlybVVuc2F2ZWQodGhpcywgdGhpcy5fcHJvbXB0KSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5jb250cm9sLmVuYWJsZSgpO1xuXG4gICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5jb250cm9sLmRpc2FibGUoKTtcblxuICAgIHRoaXMuX3N1Ym1pdEJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uZGlzYWJsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZFN1Ym1pdEJ1dHRvbihzdWJtaXRCdXR0b246IEZzU3VibWl0QnV0dG9uRGlyZWN0aXZlKTogdm9pZCB7XG4gICAgdGhpcy5fc3VibWl0QnV0dG9ucy5yZXNldChcbiAgICAgIFtcbiAgICAgICAgLi4udGhpcy5fc3VibWl0QnV0dG9ucy50b0FycmF5KCksXG4gICAgICAgIHN1Ym1pdEJ1dHRvbixcbiAgICAgIF0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZVN1Ym1pdEJ1dHRvbihzdWJtaXRCdXR0b246IEZzU3VibWl0QnV0dG9uRGlyZWN0aXZlKTogdm9pZCB7XG4gICAgdGhpcy5fc3VibWl0QnV0dG9ucy5yZXNldChcbiAgICAgIFtcbiAgICAgICAgLi4udGhpcy5fc3VibWl0QnV0dG9ucy50b0FycmF5KClcbiAgICAgICAgLmZpbHRlcigoc3VibWl0QnV0dG9uXykgPT4gKHN1Ym1pdEJ1dHRvbiAhPT0gc3VibWl0QnV0dG9uXykpLFxuICAgICAgXSk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5TdWJtaXQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm1cbiAgICAgIC5uZ1N1Ym1pdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSksXG4gICAgICAgIGZpbHRlcigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFsgRm9ybVN0YXR1cy5WYWxpZCwgRm9ybVN0YXR1cy5JbnZhbGlkIF1cbiAgICAgICAgICAgIC5pbmNsdWRlcyh0aGlzLl9zdGF0dXMkLmdldFZhbHVlKCkpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX21hcmtDb250cm9sc0FzVG91Y2hlZEFuZFVwZGF0ZVZhbGlkaXR5KCkpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fYnJvYWRjYXN0U3VibWl0dGluZ0V2ZW50cygpKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuX3dhaXRVbnRpbFN0YXR1c1BlbmRpbmcoKSksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9zZXR1cEFjdGl2ZVN1Ym1pdEJ1dHRvbigpKSxcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLm5nRm9ybS5zdGF0dXMgPT09ICdJTlZBTElEJ1xuICAgICAgICAgICAgPyB0aGlzLl9mb3JtSW52YWxpZFN0YXRlJFxuICAgICAgICAgICAgOiB0aGlzLl9mb3JtVmFsaWRTdGF0ZSQ7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlLCBzb3VyY2UkKSA9PiB7XG4gICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZSk7XG5cbiAgICAgICAgICByZXR1cm4gc291cmNlJDtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgoc3VibWl0dGVkRXZlbnQ6IFN1Ym1pdHRlZEV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5fY29tcGxldGVTdWJtaXQodHJ1ZSwgc3VibWl0dGVkRXZlbnQpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7fSk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5XaW5kb3dDbG9zZSgpOiB2b2lkIHtcbiAgICBmcm9tRXZlbnQod2luZG93LCAnYmVmb3JldW5sb2FkJylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpcm0gJiYgdGhpcy5jb25maXJtQnJvd3NlciAmJiB0aGlzLm5nRm9ybS5kaXJ0eSkge1xuICAgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuSG90S2V5cygpOiB2b2lkIHtcbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAna2V5ZG93bicpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fZGlhbG9nQmFja2Ryb3BFc2NhcGUgJiYgZXZlbnQuY29kZSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuX2RpYWxvZ1JlZi5pZCk7XG4gICAgICAgICAgICBjb25zdCBwYXRocyA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpO1xuXG4gICAgICAgICAgICBpZiAocGF0aHMpIHtcbiAgICAgICAgICAgICAgcGF0aHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGlhbG9nID09PSBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9ybUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5jb2RlID09PSAnS2V5UycpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNob3J0Y3V0cykge1xuICAgICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudEluRm9ybShkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXMubmdGb3JtLm5nU3VibWl0Lm5leHQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9mb3JtQ2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlybSAmJiB0aGlzLmNvbmZpcm1EaWFsb2cpIHtcbiAgICAgIHRoaXMudHJpZ2dlckNvbmZpcm0oKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKHJlc3VsdCkgPT4gY29uZmlybVJlc3VsdENvbnRpbnVlKHJlc3VsdCkpLFxuICAgICAgICAgIHN3aXRjaE1hcCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBDb25maXJtUmVzdWx0LlByaXN0aW5lIHx8IHJlc3VsdCA9PT0gQ29uZmlybVJlc3VsdC5EaXNjYXJkXG4gICAgICAgICAgICAgID8gb2YobnVsbClcbiAgICAgICAgICAgICAgOiB0aGlzLnN1Ym1pdHRlZC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogU3VibWl0dGVkRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UocmVzdWx0Py5yZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJEaWFsb2dDbG9zZShkaXJlY3RpdmU6IEZzRm9ybURpYWxvZ0Nsb3NlRGlyZWN0aXZlKTogdm9pZCB7XG4gICAgaWYgKCFkaXJlY3RpdmUucmVnaXN0ZXJlZCkge1xuICAgICAgZGlyZWN0aXZlLnJlZ2lzdGVyZWQgPSB0cnVlO1xuXG4gICAgICBkaXJlY3RpdmUuY2xpY2tlZCRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9mb3JtQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QWN0aXZlQnV0dG9uKCk6IEZzU3VibWl0QnV0dG9uRGlyZWN0aXZlIHtcbiAgICBjb25zdCBhY3RpdmVCdXR0b24gPSB0aGlzLl9zdWJtaXRCdXR0b25zLmZpbmQoYnV0dG9uID0+IHtcbiAgICAgIHJldHVybiBidXR0b24uYWN0aXZlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFjdGl2ZUJ1dHRvbiA/IGFjdGl2ZUJ1dHRvbiA6IHRoaXMuX3N1Ym1pdEJ1dHRvbnMuZmlyc3Q7XG4gIH1cblxuICBwcml2YXRlIF9lbGVtZW50SW5Gb3JtKGVsOiBFbGVtZW50KTogYm9vbGVhbiB7XG5cbiAgICBpZiAoZWwuaXNTYW1lTm9kZSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGVsLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50SW5Gb3JtKGVsLnBhcmVudEVsZW1lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBsZXRlU3VibWl0KHN1Y2Nlc3MsIHN1Ym1pdEV2ZW50OiBTdWJtaXR0ZWRFdmVudCk6IHZvaWQge1xuICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICB0aGlzLm5nRm9ybS5jb250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICB0aGlzLmNyZWF0ZVNuYXBzaG90KCk7ICBcbiAgICAgIHRoaXMuc3VibWl0dGVkLmVtaXQoc3VibWl0RXZlbnQpOyAgICBcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVzZXRCdXR0b25zKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN1Ym1pdEJ1dHRvbikge1xuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uLnN1Y2Nlc3MoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVN1Ym1pdEJ1dHRvbi5lcnJvcigpO1xuICAgICAgfSAgICAgIFxuICAgIH1cblxuICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLlN1Ym1pdHRlZCk7XG5cbiAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuU3VjY2Vzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLkVycm9yKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5Db21wbGV0aW5nKTtcblxuICAgIGNvbnN0IHJlc2V0RGVsYXkgPSBzdWNjZXNzID8gdGhpcy5zdWNjZXNzRGVsYXkgOiB0aGlzLmVycm9yRGVsYXk7XG5cbiAgICBvZih0cnVlKVxuICAgIC5waXBlKFxuICAgICAgZGVsYXkocmVzZXREZWxheSksXG4gICAgICBmaXJzdCgpLFxuICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5uZ0Zvcm0uZm9ybS5zdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuVmFsaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuSW52YWxpZCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Jlc2V0QnV0dG9ucygpO1xuICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNldEJ1dHRvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fc3VibWl0QnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgIGJ1dHRvbi5yZXNldCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoY2hhbmdlcykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb25maXJtKSB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBPYmplY3Qua2V5cyh0aGlzLl9zbmFwc2hvdCk7XG5cbiAgICAgICAgICBPYmplY3Qua2V5cyhjaGFuZ2VzKVxuICAgICAgICAgICAgLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zbmFwc2hvdFtuYW1lXSA9IGNoYW5nZXNbbmFtZV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyRHJhd2VyQ2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RyYXdlclJlZikge1xuICAgICAgdGhpcy5fZHJhd2VyUmVmLmNsb3NlU3RhcnQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3VibWl0dGluZykge1xuICAgICAgICAgIHRoaXMuX3N0YXR1cyRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBmaWx0ZXIoKHN0YXR1cykgPT4gc3RhdHVzID09PSBGb3JtU3RhdHVzLlN1Y2Nlc3MgfHwgc3RhdHVzID09PSBGb3JtU3RhdHVzLkVycm9yKSxcbiAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHN0YXR1cykgPT4ge1xuICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBGb3JtU3RhdHVzLlN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoKTtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29uZmlybURyYXdlckNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kcmF3ZXJSZWYpIHtcbiAgICAgIHRoaXMuX2RyYXdlclJlZi5jbG9zZVN0YXJ0JFxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgICAgIHJldHVybiBpaWYoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmNvbmZpcm0gJiYgdGhpcy5jb25maXJtRHJhd2VyLFxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ29uZmlybSgpXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgocmVzdWx0KSA9PiBjb25maXJtUmVzdWx0Q29udGludWUocmVzdWx0KSksXG4gICAgICAgICAgICAgICAgdGFwKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNvbmZpcm1UYWJzKCk6IHZvaWQge1xuICAgIGlmKHRoaXMudGFiR3JvdXApIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJDb25maXJtVGFiR3JvdXAodGhpcy50YWJHcm91cCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RlckNvbmZpcm1UYWJHcm91cHModGhpcy5fdGFiR3JvdXBzLnRvQXJyYXkoKSk7XG5cbiAgICB0aGlzLl90YWJHcm91cHMuY2hhbmdlc1xuICAgIC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgIClcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucmVnaXN0ZXJDb25maXJtVGFiR3JvdXBzKHRoaXMuX3RhYkdyb3Vwcy50b0FycmF5KCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyQ29uZmlybVRhYkdyb3Vwcyh0YWJHcm91cHM6IE1hdFRhYkdyb3VwW10pOiB2b2lkIHtcbiAgICB0YWJHcm91cHMuZm9yRWFjaCgodGFiR3JvdXA6IE1hdFRhYkdyb3VwKSA9PiB7XG4gICAgICB0aGlzLnJlZ2lzdGVyQ29uZmlybVRhYkdyb3VwKHRhYkdyb3VwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckNvbmZpcm1UYWJHcm91cCh0YWJHcm91cDogTWF0VGFiR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCBjb25maXJtVGFiR3JvdXAgPSB0YWJHcm91cCBhcyBDb25maXJtVGFiR3JvdXA7XG4gICAgaWYgKCFjb25maXJtVGFiR3JvdXAuX29yaWdpbmFsSGFuZGxlQ2xpY2spIHtcbiAgICAgIGNvbmZpcm1UYWJHcm91cC5fb3JpZ2luYWxIYW5kbGVDbGljayA9IHRhYkdyb3VwLl9oYW5kbGVDbGljaztcbiAgICAgIGNvbmZpcm1UYWJHcm91cC5faGFuZGxDbGljayQgPSBuZXcgU3ViamVjdDx7IHRhYjogTWF0VGFiOyB0YWJIZWFkZXI6IE1hdFRhYkhlYWRlcjsgaWR4OiBudW1iZXIgfT4oKTtcbiAgICAgIGNvbmZpcm1UYWJHcm91cC5faGFuZGxlQ2xpY2sgPSAodGFiOiBNYXRUYWIsIHRhYkhlYWRlcjogTWF0VGFiSGVhZGVyLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICBpZihjb25maXJtVGFiR3JvdXAuX2hhbmRsQ2xpY2skLm9ic2VydmVycy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25maXJtVGFiR3JvdXAuX2hhbmRsQ2xpY2skLm5leHQoeyB0YWIsIHRhYkhlYWRlciwgaWR4fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZmlybVRhYkdyb3VwLl9vcmlnaW5hbEhhbmRsZUNsaWNrKHRhYiwgdGFiSGVhZGVyLCBpZHgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uZmlybVRhYkdyb3VwLl9oYW5kbENsaWNrJFxuICAgIC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICApXG4gICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5zdWJtaXR0aW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpcm0gJiYgdGhpcy5jb25maXJtVGFicykge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckNvbmZpcm0oKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbmZpcm1SZXN1bHRDb250aW51ZShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlybVRhYkdyb3VwLnNlbGVjdGVkSW5kZXggPSBldmVudC5pZHg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmZpcm1UYWJHcm91cC5fb3JpZ2luYWxIYW5kbGVDbGljayhldmVudC50YWIsIGV2ZW50LnRhYkhlYWRlciwgZXZlbnQuaWR4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtRGlhbG9nQ2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RpYWxvZ1JlZikge1xuICAgICAgdGhpcy5mb3JtRGlhbG9nQ2xvc2UuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJEaWFsb2dDbG9zZShpdGVtKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmZvcm1EaWFsb2dDbG9zZS5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgZS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRGlhbG9nQ2xvc2UoaXRlbSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtRGlhbG9nQmFja2Ryb3BFc2NhcGUoKTogdm9pZCB7XG4gICAgdGhpcy5fZGlhbG9nQmFja2Ryb3BFc2NhcGUgPSB0aGlzLl9kaWFsb2dSZWYgJiYgdGhpcy5fZGlhbG9nUmVmLmRpc2FibGVDbG9zZSAhPT0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLl9kaWFsb2dSZWYgJiYgIXRoaXMuX2RpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UpIHtcbiAgICAgIHRoaXMuX2RpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xuICAgICAgdGhpcy5fZGlhbG9nUmVmLmJhY2tkcm9wQ2xpY2soKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9mb3JtQ2xvc2UoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9kZXN0cm95JFxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQXV0b2NvbXBsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29udHJvbCA9IHRoaXMubmdGb3JtLmZvcm0ucmVnaXN0ZXJDb250cm9sLmJpbmQodGhpcy5uZ0Zvcm0uZm9ybSk7XG5cbiAgICB0aGlzLm5nRm9ybS5mb3JtLnJlZ2lzdGVyQ29udHJvbCA9IChuYW1lOiBzdHJpbmcsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuXG4gICAgICBjb25zdCBlbDogRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGBpbnB1dFtuYW1lPScke25hbWV9J11gKTtcblxuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUgKyAnXycgKyBndWlkKCkpO1xuXG4gICAgICAgIGlmICghZWwuZ2V0QXR0cmlidXRlKCdhdXRvY29tcGxldGUnKSkge1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywgJ25vbmUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJDb250cm9sKG5hbWUsIGNvbnRyb2wpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyRGlydHlTdWJtaXRCdXR0b24oKTogdm9pZCB7XG5cbiAgICBpZiAoIXRoaXMubmdGb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5uZ0Zvcm0uZm9ybS52YWx1ZUNoYW5nZXNcbiAgICAucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9zdWJtaXRCdXR0b25zLmNoYW5nZXNcbiAgICAucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fc3VibWl0QnV0dG9uc1xuICAgIC5mb3JFYWNoKChzdWJtaXRCdXR0b246IEZzU3VibWl0QnV0dG9uRGlyZWN0aXZlKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlybSB8fCAhdGhpcy5kaXJ0eVN1Ym1pdEJ1dHRvbiB8fCB0aGlzLm5nRm9ybS5kaXJ0eSB8fCAhc3VibWl0QnV0dG9uLmRpcnR5U3VibWl0KSB7XG4gICAgICAgICAgc3VibWl0QnV0dG9uLmVuYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnJvYWRjYXN0U3VibWl0dGluZ0V2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5TdWJtaXR0aW5nKTtcbiAgICB0aGlzLl9mb3JtLmJyb2FkY2FzdCgnc3VibWl0JywgdGhpcy5uZ0Zvcm0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWFya0NvbnRyb2xzQXNUb3VjaGVkQW5kVXBkYXRlVmFsaWRpdHkoKTogdm9pZCB7XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLm5nRm9ybS5jb250cm9scylcbiAgICAuZm9yRWFjaChjb250cm9sID0+IHtcbiAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cEFjdGl2ZVN1Ym1pdEJ1dHRvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3RpdmVTdWJtaXRCdXR0b24gPSB0aGlzLl9nZXRBY3RpdmVCdXR0b24oKTtcbiAgICB0aGlzLl9yZXNldEJ1dHRvbnMoKTtcblxuICAgIGlmICh0aGlzLl9hY3RpdmVTdWJtaXRCdXR0b24pIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVN1Ym1pdEJ1dHRvbi5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfd2FpdFVudGlsU3RhdHVzUGVuZGluZygpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm5nRm9ybS5zdGF0dXNDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMubmdGb3JtLnN0YXR1cyksXG4gICAgICAgIGZpcnN0KChzdGF0ZSkgPT4gc3RhdGUgIT09ICdQRU5ESU5HJyksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlRXJyb3IoZTogU3VibWl0dGVkRXZlbnQpIHtcbiAgICBjb25zb2xlLmxvZygnJWMgRm9ybSBTdWJtaXQgJywgICdjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6ICNEMzNGNDknLCAgJ0Vycm9yIG9jY3VyZWQnKTtcblxuICAgIGNvbnNvbGUuZ3JvdXAoJ0Vycm9yIERldGFpbHM6Jyk7XG4gICAgY29uc29sZS5sb2coJ01lc3NhZ2U6ICcsIGUpO1xuICAgIGNvbnNvbGUubG9nKCdGb3JtUmVmOiAnLCB0aGlzKTtcblxuICAgIGlmICh0aGlzLm5nRm9ybS5pbnZhbGlkKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBnZXRGb3JtRXJyb3JzKHRoaXMubmdGb3JtLmNvbnRyb2wsIG51bGwpO1xuICAgICAgY29uc29sZS5sb2coJ1ZhbGlkYXRpb24gRXJyb3JzOiAnLCBlcnJvcnMpO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcblxuICAgIHRoaXMuX2NvbXBsZXRlU3VibWl0KGZhbHNlLCBudWxsKTtcbiAgfVxuXG59XG4iXX0=