tuain-ng-forms-lib 17.3.7 → 19.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.
- package/README.md +280 -335
- package/fesm2022/tuain-ng-forms-lib.mjs +297 -103
- package/fesm2022/tuain-ng-forms-lib.mjs.map +1 -1
- package/lib/classes/forms/action.d.ts +3 -2
- package/lib/classes/forms/element.d.ts +2 -1
- package/lib/classes/forms/field.d.ts +5 -4
- package/lib/classes/forms/form.d.ts +4 -2
- package/lib/classes/forms/piece-propagate.d.ts +2 -1
- package/lib/classes/forms/piece.d.ts +4 -3
- package/lib/classes/forms/section.d.ts +3 -2
- package/lib/classes/forms/subsection.d.ts +2 -1
- package/lib/classes/forms/table/action.d.ts +2 -1
- package/lib/classes/forms/table/column.d.ts +2 -1
- package/lib/classes/forms/table/row-data.d.ts +3 -2
- package/lib/classes/forms/table/table.d.ts +3 -1
- package/lib/components/elements/layout/piece.component.d.ts +2 -2
- package/lib/components/forms/basic-form.d.ts +4 -4
- package/lib/interfaces/action.interface.d.ts +23 -0
- package/lib/interfaces/field.interface.d.ts +70 -0
- package/lib/interfaces/form-config.interface.d.ts +24 -16
- package/lib/interfaces/form.interface.d.ts +106 -0
- package/lib/interfaces/index.d.ts +7 -0
- package/lib/interfaces/piece.interface.d.ts +67 -0
- package/lib/interfaces/section.interface.d.ts +56 -0
- package/lib/interfaces/sse-live-connection.interface.d.ts +67 -0
- package/lib/interfaces/table.interface.d.ts +139 -0
- package/lib/services/file-manager.service.d.ts +4 -4
- package/lib/services/form-manager.service.d.ts +3 -3
- package/lib/services/icon-dictionary.service.d.ts +1 -1
- package/lib/services/sse-live-connection.service.d.ts +56 -0
- package/lib/tokens/sse-live-connection.token.d.ts +7 -0
- package/package.json +6 -7
- package/public-api.d.ts +2 -0
- package/esm2022/lib/classes/forms/action.mjs +0 -112
- package/esm2022/lib/classes/forms/element.mjs +0 -25
- package/esm2022/lib/classes/forms/field.mjs +0 -484
- package/esm2022/lib/classes/forms/form.constants.mjs +0 -55
- package/esm2022/lib/classes/forms/form.mjs +0 -589
- package/esm2022/lib/classes/forms/piece-propagate.mjs +0 -36
- package/esm2022/lib/classes/forms/piece.mjs +0 -139
- package/esm2022/lib/classes/forms/section.mjs +0 -150
- package/esm2022/lib/classes/forms/subsection.mjs +0 -96
- package/esm2022/lib/classes/forms/table/action.mjs +0 -49
- package/esm2022/lib/classes/forms/table/column.mjs +0 -74
- package/esm2022/lib/classes/forms/table/row-data.mjs +0 -116
- package/esm2022/lib/classes/forms/table/table.mjs +0 -537
- package/esm2022/lib/components/elements/action.component.mjs +0 -71
- package/esm2022/lib/components/elements/field.component.mjs +0 -113
- package/esm2022/lib/components/elements/layout/element.component.mjs +0 -23
- package/esm2022/lib/components/elements/layout/form-error.component.mjs +0 -25
- package/esm2022/lib/components/elements/layout/form-header.component.mjs +0 -25
- package/esm2022/lib/components/elements/layout/piece.component.mjs +0 -59
- package/esm2022/lib/components/elements/layout/section.component.mjs +0 -57
- package/esm2022/lib/components/elements/layout/sub-section.component.mjs +0 -57
- package/esm2022/lib/components/elements/tables/table-record-action.component.mjs +0 -71
- package/esm2022/lib/components/elements/tables/table-record-field.component.mjs +0 -32
- package/esm2022/lib/components/elements/tables/table.component.mjs +0 -109
- package/esm2022/lib/components/forms/basic-form.mjs +0 -1408
- package/esm2022/lib/components/shared/constants.mjs +0 -2
- package/esm2022/lib/interfaces/form-config.interface.mjs +0 -2
- package/esm2022/lib/interfaces/icon-resolver.interface.mjs +0 -2
- package/esm2022/lib/interfaces/index.mjs +0 -3
- package/esm2022/lib/services/base-icon-resolver.service.mjs +0 -40
- package/esm2022/lib/services/event-manager.service.mjs +0 -55
- package/esm2022/lib/services/file-manager.service.mjs +0 -14
- package/esm2022/lib/services/form-manager.service.mjs +0 -88
- package/esm2022/lib/services/icon-dictionary.service.mjs +0 -162
- package/esm2022/lib/tokens/icon-resolver.token.mjs +0 -3
- package/esm2022/lib/tuain-ng-forms-lib.module.mjs +0 -54
- package/esm2022/public-api.mjs +0 -43
- package/esm2022/tuain-ng-forms-lib.mjs +0 -5
|
@@ -1,1408 +0,0 @@
|
|
|
1
|
-
import { Component, signal, inject, DestroyRef, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
|
-
import { FormStructureAndData } from '../../classes/forms/form';
|
|
4
|
-
import { FormActionType, NO_ERROR } from '../../classes/forms/form.constants';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "../../services/form-manager.service";
|
|
7
|
-
import * as i2 from "../../services/event-manager.service";
|
|
8
|
-
import * as i3 from "../../services/file-manager.service";
|
|
9
|
-
const PAYLOAD_VERSION = 'TUAINEXCHANGE_1.0';
|
|
10
|
-
const INLINE_ACTION = 'INLINE';
|
|
11
|
-
const GLOBAL_ACTION = 'GLOBAL';
|
|
12
|
-
const GET_DATA_ACTION = 'GETDATA';
|
|
13
|
-
const SUBJECT = 'subject';
|
|
14
|
-
const TOKEN = 'token';
|
|
15
|
-
export class BasicFormComponent extends FormStructureAndData {
|
|
16
|
-
formManagerService;
|
|
17
|
-
_eventManager;
|
|
18
|
-
fileMgmtServices;
|
|
19
|
-
destroyRef = inject(DestroyRef);
|
|
20
|
-
_controlToken = null;
|
|
21
|
-
_originToken = null;
|
|
22
|
-
_formRoute = null;
|
|
23
|
-
_definitionObtained = false;
|
|
24
|
-
_notifyFormActivity = true;
|
|
25
|
-
// Eventos de acciones y campos
|
|
26
|
-
_formChangeState = [];
|
|
27
|
-
_formSectionsCanDeactivate = {};
|
|
28
|
-
_formSectionsActivate = {};
|
|
29
|
-
_formSectionsInactivate = {};
|
|
30
|
-
_formActionsStart = {};
|
|
31
|
-
_formActionsFinish = {};
|
|
32
|
-
_fieldCustomEvent = {};
|
|
33
|
-
_fieldInputValidation = {};
|
|
34
|
-
_fieldValidationsStart = {};
|
|
35
|
-
_fieldValidationsFinish = {};
|
|
36
|
-
// Callback de acciones de tablas
|
|
37
|
-
_tableSelectionsStart = {};
|
|
38
|
-
_tableSelectionsFinish = {};
|
|
39
|
-
_tableActionsStart = {};
|
|
40
|
-
_tableActionsFinish = {};
|
|
41
|
-
_tableGetDataStart = {};
|
|
42
|
-
_tableGetDataFinish = {};
|
|
43
|
-
// Errores en procesos
|
|
44
|
-
_actionServerError = [];
|
|
45
|
-
_fieldServerError = [];
|
|
46
|
-
_tableServerError = [];
|
|
47
|
-
// Acciones en curso dentro del formulario
|
|
48
|
-
_actionsInProgress = {};
|
|
49
|
-
_serverActionsInProgress = {};
|
|
50
|
-
// Datos complementarios del formulario
|
|
51
|
-
inputDataFields = {};
|
|
52
|
-
extraData = {};
|
|
53
|
-
_eventEmiter;
|
|
54
|
-
enabledSections = [];
|
|
55
|
-
// Gestión de error
|
|
56
|
-
_errorType = '';
|
|
57
|
-
errorCode = '';
|
|
58
|
-
errorFullCode = '';
|
|
59
|
-
errorName = '';
|
|
60
|
-
errorMessage = '';
|
|
61
|
-
errorDetail = '';
|
|
62
|
-
// Control de estado
|
|
63
|
-
visible = false;
|
|
64
|
-
busy = signal(false);
|
|
65
|
-
constructor(formManagerService, _eventManager, fileMgmtServices) {
|
|
66
|
-
super();
|
|
67
|
-
this.formManagerService = formManagerService;
|
|
68
|
-
this._eventManager = _eventManager;
|
|
69
|
-
this.fileMgmtServices = fileMgmtServices;
|
|
70
|
-
this._eventEmiter = this._eventManager;
|
|
71
|
-
this.cleanStart();
|
|
72
|
-
}
|
|
73
|
-
cleanStart() {
|
|
74
|
-
this._errorType = '';
|
|
75
|
-
this.errorCode = '';
|
|
76
|
-
this.errorFullCode = '';
|
|
77
|
-
this.errorName = '';
|
|
78
|
-
this.errorMessage = '';
|
|
79
|
-
this.errorDetail = '';
|
|
80
|
-
this.cleanForm();
|
|
81
|
-
this._controlToken = null;
|
|
82
|
-
this.inputDataFields = {};
|
|
83
|
-
this._definitionObtained = false;
|
|
84
|
-
// Se limpian los manejadores de eventos
|
|
85
|
-
this.visible = false;
|
|
86
|
-
this.busy.set(false);
|
|
87
|
-
this._formChangeState = [];
|
|
88
|
-
this._formSectionsCanDeactivate = {};
|
|
89
|
-
this._formSectionsActivate = {};
|
|
90
|
-
this._formSectionsInactivate = {};
|
|
91
|
-
this._formActionsStart = {};
|
|
92
|
-
this._formActionsFinish = {};
|
|
93
|
-
this._fieldCustomEvent = {};
|
|
94
|
-
this._fieldInputValidation = {};
|
|
95
|
-
this._fieldValidationsStart = {};
|
|
96
|
-
this._fieldValidationsFinish = {};
|
|
97
|
-
this._tableSelectionsStart = {};
|
|
98
|
-
this._tableSelectionsFinish = {};
|
|
99
|
-
this._tableActionsStart = {};
|
|
100
|
-
this._tableActionsFinish = {};
|
|
101
|
-
this._tableGetDataStart = {};
|
|
102
|
-
this._tableGetDataFinish = {};
|
|
103
|
-
this._actionServerError = [];
|
|
104
|
-
this._fieldServerError = [];
|
|
105
|
-
this._tableServerError = [];
|
|
106
|
-
this.onActionServerError(() => this.displayActionServerError());
|
|
107
|
-
this.onValidationServerError(() => this.displayValidationServerError());
|
|
108
|
-
this.onTableServerError(() => this.displayTableServerError());
|
|
109
|
-
}
|
|
110
|
-
get formVisible() { return this.visible; }
|
|
111
|
-
get form() { return this; }
|
|
112
|
-
ngOnInit() {
|
|
113
|
-
this.preStart();
|
|
114
|
-
this.customPreProcessing();
|
|
115
|
-
}
|
|
116
|
-
// Métodos virtuales
|
|
117
|
-
preStart() { }
|
|
118
|
-
start() { }
|
|
119
|
-
/**
|
|
120
|
-
* @deprecated Since v17. Use preStart instead. Will be removed in v19.
|
|
121
|
-
*/
|
|
122
|
-
customPreProcessing() { }
|
|
123
|
-
/**
|
|
124
|
-
* @deprecated Since v17. Overload start instead. Will be removed in v19.
|
|
125
|
-
*/
|
|
126
|
-
customFormStart() { }
|
|
127
|
-
displayActionServerError() { }
|
|
128
|
-
displayValidationServerError() { }
|
|
129
|
-
displayTableServerError() { }
|
|
130
|
-
showFieldInfo(code, detail) { }
|
|
131
|
-
showModalDialog(title, body, options, callback, params) { }
|
|
132
|
-
openUploadDialog(title, body, options, callback, params) { }
|
|
133
|
-
subscribeAppEvent(eventName, callback) {
|
|
134
|
-
this._eventEmiter.subscribe(eventName, callback);
|
|
135
|
-
}
|
|
136
|
-
openForm(name, data = null, backData = null, cleanStack = false) {
|
|
137
|
-
let origin = null;
|
|
138
|
-
if (!cleanStack) {
|
|
139
|
-
origin = { ...backData, name: this.name, url: this._formRoute, token: this._controlToken };
|
|
140
|
-
origin.subject = origin?.subject ?? this.subject;
|
|
141
|
-
origin.state = origin?.state ?? this.state;
|
|
142
|
-
origin.fields = origin?.fields ?? {};
|
|
143
|
-
origin.extra = origin?.extra ?? {};
|
|
144
|
-
}
|
|
145
|
-
const target = { ...data, name };
|
|
146
|
-
target.subject = target?.subject ?? null;
|
|
147
|
-
target.state = target?.state ?? null;
|
|
148
|
-
target.fields = target?.fields ?? {};
|
|
149
|
-
target.extra = target?.extra ?? {};
|
|
150
|
-
this.formManagerService.openForm(origin, target);
|
|
151
|
-
}
|
|
152
|
-
enableActivityNotification() { this._notifyFormActivity = true; }
|
|
153
|
-
disableActivityNotification() { this._notifyFormActivity = false; }
|
|
154
|
-
canGoBack() { return this._originToken !== null; }
|
|
155
|
-
goBack() { return this.formManagerService.backTo(); }
|
|
156
|
-
goBackForm() { return this.goBack(); }
|
|
157
|
-
getOriginDetail() { return this.formManagerService?.getFormInfo(this._originToken ?? ''); }
|
|
158
|
-
setError(errorType, errorMessage, errorDetail) {
|
|
159
|
-
this._errorType = errorType || '';
|
|
160
|
-
this.errorMessage = errorMessage || '';
|
|
161
|
-
this.errorDetail = errorDetail || '';
|
|
162
|
-
}
|
|
163
|
-
resetError() {
|
|
164
|
-
this.errorCode = NO_ERROR;
|
|
165
|
-
this.errorFullCode = '';
|
|
166
|
-
this.errorName = '';
|
|
167
|
-
this.errorMessage = '';
|
|
168
|
-
this.errorDetail = '';
|
|
169
|
-
}
|
|
170
|
-
getErrorType() { return this._errorType; }
|
|
171
|
-
getErrorMessage() { return this.errorMessage; }
|
|
172
|
-
getErrorDetail() { return this.errorDetail; }
|
|
173
|
-
getErrorName() { return this.errorName; }
|
|
174
|
-
getErrorFullCode() { return this.errorFullCode; }
|
|
175
|
-
getErrorCode() { return this.errorCode; }
|
|
176
|
-
getFormParameter(name) {
|
|
177
|
-
return (name) ? (this.extraData?.[name] ?? null) : null;
|
|
178
|
-
}
|
|
179
|
-
processInputParams(params) {
|
|
180
|
-
this._controlToken = params?.[TOKEN] ?? null;
|
|
181
|
-
this.subject = params?.[SUBJECT] ?? null;
|
|
182
|
-
const tokenInfo = (this._controlToken) ? this.formManagerService.getFormInfo(this._controlToken) : {};
|
|
183
|
-
const { token, subject, state, fields, extra, originToken } = tokenInfo;
|
|
184
|
-
if (token && this._controlToken === token) {
|
|
185
|
-
this.subject = this.subject ?? subject ?? null;
|
|
186
|
-
this.inputDataFields = fields;
|
|
187
|
-
this.extraData = extra;
|
|
188
|
-
this._originToken = originToken;
|
|
189
|
-
return state;
|
|
190
|
-
}
|
|
191
|
-
return null;
|
|
192
|
-
}
|
|
193
|
-
subscribeSectionActivation() {
|
|
194
|
-
const formSections = this.sections;
|
|
195
|
-
const sectionNames = Object.keys(formSections);
|
|
196
|
-
for (let index = 0; index < sectionNames.length; index++) {
|
|
197
|
-
const sectionName = sectionNames[index];
|
|
198
|
-
const section = formSections[sectionName];
|
|
199
|
-
section.activation
|
|
200
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
201
|
-
.subscribe((code) => this.launchSectionActivation(code));
|
|
202
|
-
section.inactivation
|
|
203
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
204
|
-
.subscribe((code) => this.launchSectionInactivation(code));
|
|
205
|
-
// Adicionalmente se le pide a la sección se subscriba al cambio de estado del formulario
|
|
206
|
-
section.connectWithParentForm(this, this.stateChange);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
subscribeFieldsSubjects() {
|
|
210
|
-
const formFields = this.getFields();
|
|
211
|
-
if (Array.isArray(formFields)) {
|
|
212
|
-
formFields.forEach(field => {
|
|
213
|
-
field.customEvent
|
|
214
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
215
|
-
.subscribe((event) => {
|
|
216
|
-
const { code, eventName, eventData } = event;
|
|
217
|
-
this.startFieldCustomEvent(code, eventName, eventData);
|
|
218
|
-
});
|
|
219
|
-
field.editionFinish
|
|
220
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
221
|
-
.subscribe((event) => {
|
|
222
|
-
const { code, intrinsicValidation } = event;
|
|
223
|
-
this.startFieldValidation(code, intrinsicValidation);
|
|
224
|
-
});
|
|
225
|
-
field.editionPartial
|
|
226
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
227
|
-
.subscribe((event) => {
|
|
228
|
-
const { code, intrinsicValidation } = event;
|
|
229
|
-
this.startFieldInputValidation(code, intrinsicValidation);
|
|
230
|
-
});
|
|
231
|
-
field.detailRequest
|
|
232
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
233
|
-
.subscribe((event) => this.showFieldInfo(event.code, event.detail));
|
|
234
|
-
// Adicionalmente se le pide al campo se subscriba al cambio de estado del formulario
|
|
235
|
-
field.connectWithParentForm(this, this.stateChange);
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
subscribeActionSubjects() {
|
|
240
|
-
const formActions = this.getActions();
|
|
241
|
-
if (Array.isArray(formActions)) {
|
|
242
|
-
formActions.forEach(action => {
|
|
243
|
-
action.actionActivated
|
|
244
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
245
|
-
.subscribe((code) => this.startAction(code));
|
|
246
|
-
// Adicionalmente se le pide a la acción se subscriba al cambio de estado del formulario
|
|
247
|
-
action.connectWithParentForm(this, this.stateChange);
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
subscribeTableSubjects() {
|
|
252
|
-
const formTables = this.getTables();
|
|
253
|
-
if (Array.isArray(formTables)) {
|
|
254
|
-
formTables.forEach(table => {
|
|
255
|
-
table.inlineActionTrigger
|
|
256
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
257
|
-
.subscribe((event) => this.startTableAction(event));
|
|
258
|
-
table.globalActionTrigger
|
|
259
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
260
|
-
.subscribe((event) => this.startTableGlobalAction(event));
|
|
261
|
-
table.recordSelectionTrigger
|
|
262
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
263
|
-
.subscribe((event) => this.startTableRecordSelection(event));
|
|
264
|
-
table.selectionActionTrigger
|
|
265
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
266
|
-
.subscribe((event) => this.startTableSelectionAction(event));
|
|
267
|
-
table.getDataTrigger
|
|
268
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
269
|
-
.subscribe((event) => this.startTableGetData(event));
|
|
270
|
-
// Adicionalmente se le pide a la tabla se subscriba al cambio de estado del formulario
|
|
271
|
-
table.connectWithParentForm(this, this.stateChange);
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
async formInit(params, forceReload = false) {
|
|
276
|
-
let initialState = this.processInputParams(params);
|
|
277
|
-
if (!this.name) {
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
try {
|
|
281
|
-
if (forceReload || !this._definitionObtained) {
|
|
282
|
-
this.busy.set(true);
|
|
283
|
-
const formDefinition = await this.formManagerService.getFormDefinition(this.name);
|
|
284
|
-
this.busy.set(false);
|
|
285
|
-
this.loadDefinition(formDefinition);
|
|
286
|
-
this._definitionObtained = true;
|
|
287
|
-
}
|
|
288
|
-
else {
|
|
289
|
-
this.cleanData();
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
catch (e) {
|
|
293
|
-
this.busy.set(false);
|
|
294
|
-
console.error(`Error loading form definition for ${this.name}: ${e}`);
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
if (!this.supportState(initialState ?? '')) {
|
|
298
|
-
initialState = this.defaultState ?? null;
|
|
299
|
-
}
|
|
300
|
-
const inputFieldNames = Object.keys(this.inputDataFields);
|
|
301
|
-
for (let index = 0; index < inputFieldNames.length; index++) {
|
|
302
|
-
const code = inputFieldNames[index];
|
|
303
|
-
const fieldValue = this.inputDataFields[code];
|
|
304
|
-
this.setFieldValue(code, fieldValue);
|
|
305
|
-
}
|
|
306
|
-
this.subscribeSectionActivation();
|
|
307
|
-
this.subscribeFieldsSubjects();
|
|
308
|
-
this.subscribeActionSubjects();
|
|
309
|
-
this.subscribeTableSubjects();
|
|
310
|
-
// Se define el estado inicial y se solicita la acción inicial
|
|
311
|
-
this.changeState(initialState || this.defaultState);
|
|
312
|
-
if (this.loadInitialData) {
|
|
313
|
-
try {
|
|
314
|
-
const recordResponse = await this.requestFormAction(FormActionType.GetData);
|
|
315
|
-
this.checkErrorRecordReceived(recordResponse);
|
|
316
|
-
}
|
|
317
|
-
catch (e) {
|
|
318
|
-
console.error(`Error loading initial data for ${this.name}: ${e}`);
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
this.visible = true;
|
|
322
|
-
this.enabledSections = this.visibleSections ?? [];
|
|
323
|
-
this.start();
|
|
324
|
-
this.customFormStart();
|
|
325
|
-
}
|
|
326
|
-
changeState(state) {
|
|
327
|
-
const stateChanged = super.changeState(state ?? '') ?? false;
|
|
328
|
-
if (stateChanged) {
|
|
329
|
-
const clientActionMethods = this._formChangeState;
|
|
330
|
-
if (clientActionMethods && clientActionMethods.length > 0) {
|
|
331
|
-
for (const callback of clientActionMethods) {
|
|
332
|
-
callback(state);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
return stateChanged;
|
|
337
|
-
}
|
|
338
|
-
checkErrorRecordReceived(recordResponse) {
|
|
339
|
-
const { error } = recordResponse ?? {};
|
|
340
|
-
if (!error) {
|
|
341
|
-
return false;
|
|
342
|
-
}
|
|
343
|
-
this.errorCode = recordResponse.errorCode;
|
|
344
|
-
this.errorFullCode = recordResponse.errorFullCode;
|
|
345
|
-
this.errorName = recordResponse.errorName;
|
|
346
|
-
this.errorMessage = recordResponse.errorMessage;
|
|
347
|
-
this.errorDetail = recordResponse.errorDetail;
|
|
348
|
-
return true;
|
|
349
|
-
}
|
|
350
|
-
errorOccured() {
|
|
351
|
-
return (this.errorCode !== NO_ERROR);
|
|
352
|
-
}
|
|
353
|
-
registerEventHandler(handlerMap, codes, callback, properties = null) {
|
|
354
|
-
const codeSet = Array.isArray(codes) ? codes : (codes ? [codes] : []);
|
|
355
|
-
codeSet.forEach((code) => {
|
|
356
|
-
if (!handlerMap[code]) {
|
|
357
|
-
handlerMap[code] = [];
|
|
358
|
-
}
|
|
359
|
-
handlerMap[code].push({ callback, properties });
|
|
360
|
-
});
|
|
361
|
-
}
|
|
362
|
-
removeEventHandler(handlerMap, codes) {
|
|
363
|
-
const codeSet = Array.isArray(codes) ? codes : (codes ? [codes] : []);
|
|
364
|
-
codeSet.forEach((code) => { handlerMap[code] = []; });
|
|
365
|
-
}
|
|
366
|
-
async executeHandlers(handlers, ...args) {
|
|
367
|
-
const promises = handlers.map(({ callback }) => callback(...args));
|
|
368
|
-
const results = await Promise.allSettled(promises);
|
|
369
|
-
return results.every(r => r.status === 'fulfilled' && r.value !== false);
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Soporte manejo de eventos de formulario
|
|
373
|
-
*/
|
|
374
|
-
async requestFormAction(actionCode, actionSubject = {}) {
|
|
375
|
-
const actionDetail = {
|
|
376
|
-
formCode: this.name,
|
|
377
|
-
formSubject: this.subject,
|
|
378
|
-
currentMode: this.state,
|
|
379
|
-
actionCode,
|
|
380
|
-
actionSubject,
|
|
381
|
-
version: PAYLOAD_VERSION,
|
|
382
|
-
formData: this.getPayload(),
|
|
383
|
-
immutableData: this.immutableData,
|
|
384
|
-
};
|
|
385
|
-
this.errorCode = NO_ERROR;
|
|
386
|
-
this.errorFullCode = '';
|
|
387
|
-
this.errorName = '';
|
|
388
|
-
this.errorMessage = '';
|
|
389
|
-
this.errorDetail = '';
|
|
390
|
-
this.busy.set(true);
|
|
391
|
-
const formActionResponse = await this.formManagerService.execServerAction(actionDetail);
|
|
392
|
-
if (!formActionResponse) {
|
|
393
|
-
return null;
|
|
394
|
-
}
|
|
395
|
-
this.busy.set(false);
|
|
396
|
-
if (formActionResponse.hasError()) {
|
|
397
|
-
const error = formActionResponse.error;
|
|
398
|
-
this.errorCode = error.errorCode;
|
|
399
|
-
this.errorFullCode = error.errorFullCode;
|
|
400
|
-
this.errorName = error.errorName;
|
|
401
|
-
this.errorMessage = error.errorMessage;
|
|
402
|
-
this.errorDetail = error.errorDetail;
|
|
403
|
-
}
|
|
404
|
-
const formResponseData = formActionResponse.getData();
|
|
405
|
-
this.updateFormWithServerData(formResponseData);
|
|
406
|
-
return formResponseData;
|
|
407
|
-
}
|
|
408
|
-
updateFormWithServerData(formContent) {
|
|
409
|
-
const { currentMode, formSubject, actions, fields, recordTables, returnedFile, immutableData, extraInfo, } = formContent;
|
|
410
|
-
currentMode && this.changeState(currentMode);
|
|
411
|
-
if (formSubject) {
|
|
412
|
-
this.subject = formSubject;
|
|
413
|
-
}
|
|
414
|
-
if (actions && actions.length > 0) {
|
|
415
|
-
for (const changedAction of actions) {
|
|
416
|
-
const actionObject = this.getAction(changedAction.actionCode);
|
|
417
|
-
if (actionObject) {
|
|
418
|
-
actionObject.updateFromServer(changedAction);
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
if (fields && fields.length > 0) {
|
|
423
|
-
for (const changedField of fields) {
|
|
424
|
-
const fieldObject = this.getField(changedField.fieldCode);
|
|
425
|
-
if (fieldObject) {
|
|
426
|
-
fieldObject.updateFromServer(changedField);
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
if (recordTables && recordTables.length > 0) {
|
|
431
|
-
for (const changedTable of recordTables) {
|
|
432
|
-
const tableObject = this.getTable(changedTable.tableCode);
|
|
433
|
-
if (tableObject) {
|
|
434
|
-
tableObject.updateFromServer(changedTable);
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
if (returnedFile && returnedFile.file) {
|
|
439
|
-
this.fileMgmtServices.saveFile(returnedFile.file, returnedFile.name, returnedFile.type);
|
|
440
|
-
}
|
|
441
|
-
this.immutableData = immutableData;
|
|
442
|
-
this.extraInfo = extraInfo;
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* Manejo de event handlers para errores Server del formulario
|
|
446
|
-
*/
|
|
447
|
-
cleanActionServerError() { this._actionServerError = []; }
|
|
448
|
-
cleanFieldServerError() { this._fieldServerError = []; }
|
|
449
|
-
cleanTableServerError() { this._tableServerError = []; }
|
|
450
|
-
onActionServerError(callback, properties = null) { this._actionServerError.push({ callback, properties }); }
|
|
451
|
-
onValidationServerError(callback, properties = null) { this._fieldServerError.push({ callback, properties }); }
|
|
452
|
-
onTableServerError(callback, properties = null) { this._tableServerError.push({ callback, properties }); }
|
|
453
|
-
/**
|
|
454
|
-
* Manejo de event handlers para acciones sobre el formulario
|
|
455
|
-
*/
|
|
456
|
-
onFormChange(callback) {
|
|
457
|
-
this._formChangeState.push(callback);
|
|
458
|
-
}
|
|
459
|
-
onSectionCanDeactivate(codes, callback, properties = null) {
|
|
460
|
-
this.registerEventHandler(this._formSectionsCanDeactivate, codes, callback, properties);
|
|
461
|
-
}
|
|
462
|
-
onSectionActivation(codes, callback, properties = null) {
|
|
463
|
-
this.registerEventHandler(this._formSectionsActivate, codes, callback, properties);
|
|
464
|
-
}
|
|
465
|
-
onSectionInactivation(codes, callback, properties = null) {
|
|
466
|
-
this.registerEventHandler(this._formSectionsInactivate, codes, callback, properties);
|
|
467
|
-
}
|
|
468
|
-
onActionStart(codes, callback, properties = null) {
|
|
469
|
-
this.registerEventHandler(this._formActionsStart, codes, callback, properties);
|
|
470
|
-
}
|
|
471
|
-
onActionFinish(codes, callback, properties = null) {
|
|
472
|
-
this.registerEventHandler(this._formActionsFinish, codes, callback, properties);
|
|
473
|
-
}
|
|
474
|
-
async verifySectionActivation(code) {
|
|
475
|
-
const sectionObject = this.getSection(code);
|
|
476
|
-
if (!sectionObject) {
|
|
477
|
-
return false;
|
|
478
|
-
}
|
|
479
|
-
const clientSectionMethods = this._formSectionsCanDeactivate[code];
|
|
480
|
-
if (clientSectionMethods) {
|
|
481
|
-
for (const clientSectionMethod of clientSectionMethods) {
|
|
482
|
-
const { callback, properties } = clientSectionMethod;
|
|
483
|
-
const canActivate = callback(sectionObject);
|
|
484
|
-
if (canActivate === false) {
|
|
485
|
-
return false;
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
return true;
|
|
490
|
-
}
|
|
491
|
-
async launchSectionActivation(code) {
|
|
492
|
-
this.notifyFormActivity();
|
|
493
|
-
const sectionObject = this.getSection(code);
|
|
494
|
-
if (!sectionObject) {
|
|
495
|
-
return;
|
|
496
|
-
}
|
|
497
|
-
const clientSectionMethods = this._formSectionsActivate[code];
|
|
498
|
-
if (clientSectionMethods) {
|
|
499
|
-
for (const clientSectionMethod of clientSectionMethods) {
|
|
500
|
-
const { callback, properties } = clientSectionMethod;
|
|
501
|
-
callback(sectionObject);
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
async launchSectionInactivation(code) {
|
|
506
|
-
this.notifyFormActivity();
|
|
507
|
-
const sectionObject = this.getSection(code);
|
|
508
|
-
if (!sectionObject) {
|
|
509
|
-
return;
|
|
510
|
-
}
|
|
511
|
-
const clientSectionMethods = this._formSectionsInactivate[code];
|
|
512
|
-
if (clientSectionMethods) {
|
|
513
|
-
for (const clientSectionMethod of clientSectionMethods) {
|
|
514
|
-
const { callback, properties } = clientSectionMethod;
|
|
515
|
-
callback(sectionObject);
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
async startAction(code) {
|
|
520
|
-
this.notifyFormActivity();
|
|
521
|
-
const actionObject = this.getAction(code);
|
|
522
|
-
if (!actionObject) {
|
|
523
|
-
return;
|
|
524
|
-
}
|
|
525
|
-
if (this._actionsInProgress[code]) {
|
|
526
|
-
const { sent } = this._actionsInProgress[code];
|
|
527
|
-
console.log(`Reingreso sobre acción ${code} con ejecución previa ${sent}`);
|
|
528
|
-
return;
|
|
529
|
-
}
|
|
530
|
-
this._actionsInProgress[code] = { sent: new Date() };
|
|
531
|
-
this.resetError();
|
|
532
|
-
actionObject.start();
|
|
533
|
-
const clientActionMethods = this._formActionsStart[code];
|
|
534
|
-
if (clientActionMethods) {
|
|
535
|
-
const clientActionPromises = [];
|
|
536
|
-
for (const clientActionMethod of clientActionMethods) {
|
|
537
|
-
const { callback, properties } = clientActionMethod;
|
|
538
|
-
const continueActionPromise = callback(actionObject);
|
|
539
|
-
clientActionPromises.push(continueActionPromise);
|
|
540
|
-
}
|
|
541
|
-
const clientActionResults = await Promise.allSettled(clientActionPromises);
|
|
542
|
-
const continueAction = clientActionResults.every(r => r.status === 'fulfilled' && r.value !== false);
|
|
543
|
-
if (!continueAction) {
|
|
544
|
-
actionObject.stop();
|
|
545
|
-
this._actionsInProgress[code] = null;
|
|
546
|
-
delete this._actionsInProgress[code];
|
|
547
|
-
return;
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
await this.startServerAction(actionObject);
|
|
551
|
-
this._actionsInProgress[code] = null;
|
|
552
|
-
delete this._actionsInProgress[code];
|
|
553
|
-
}
|
|
554
|
-
async startServerAction(actionInput) {
|
|
555
|
-
const action = (typeof actionInput === 'string')
|
|
556
|
-
? this.getAction(actionInput) : actionInput;
|
|
557
|
-
const { actionCode: code, backend } = action ?? {};
|
|
558
|
-
if (!action || !code) {
|
|
559
|
-
return;
|
|
560
|
-
}
|
|
561
|
-
let serverError = false;
|
|
562
|
-
let actionResult = null;
|
|
563
|
-
if (backend) {
|
|
564
|
-
if (this._serverActionsInProgress[code]) {
|
|
565
|
-
const { sent } = this._serverActionsInProgress[code];
|
|
566
|
-
console.log(`Reingreso server en acción ${code} con ejecución previa ${sent}`);
|
|
567
|
-
return;
|
|
568
|
-
}
|
|
569
|
-
this._serverActionsInProgress[code] = { sent: new Date() };
|
|
570
|
-
// Se inicia la parte server de la acción
|
|
571
|
-
actionResult = await this.requestFormAction(action.actionCode);
|
|
572
|
-
}
|
|
573
|
-
await this.finishAction(action, actionResult, serverError);
|
|
574
|
-
serverError = !!this.errorOccured();
|
|
575
|
-
if (!serverError) {
|
|
576
|
-
action.newState && this.changeState(action.newState);
|
|
577
|
-
}
|
|
578
|
-
else {
|
|
579
|
-
for (let index = 0; index < this._actionServerError.length; index++) {
|
|
580
|
-
const { callback, properties } = this._actionServerError[index];
|
|
581
|
-
callback(action);
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
this._serverActionsInProgress[code] = null;
|
|
585
|
-
delete this._serverActionsInProgress[code];
|
|
586
|
-
action.stop();
|
|
587
|
-
}
|
|
588
|
-
async finishAction(action, actionResult, serverError = false) {
|
|
589
|
-
const finishActionMethods = this._formActionsFinish[action.actionCode];
|
|
590
|
-
if (finishActionMethods) {
|
|
591
|
-
const clientActionPromises = [];
|
|
592
|
-
for (const clientActionMethod of finishActionMethods) {
|
|
593
|
-
const { callback, properties } = clientActionMethod;
|
|
594
|
-
const continueOnError = properties?.continueOnError ?? false;
|
|
595
|
-
if (callback && (!serverError || continueOnError)) {
|
|
596
|
-
clientActionPromises.push(callback(action, actionResult));
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
await Promise.allSettled(clientActionPromises);
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
completeGlobalAction(action) {
|
|
603
|
-
return this.startServerAction(action);
|
|
604
|
-
}
|
|
605
|
-
/**
|
|
606
|
-
* Manejadores de eventos para validaciones sobre campos
|
|
607
|
-
*/
|
|
608
|
-
removeFieldValidationInput(codes) {
|
|
609
|
-
this.removeEventHandler(this._fieldInputValidation, codes);
|
|
610
|
-
}
|
|
611
|
-
onFieldInput(codes, callback, properties = null) {
|
|
612
|
-
this.registerEventHandler(this._fieldInputValidation, codes, callback, properties);
|
|
613
|
-
}
|
|
614
|
-
removeFieldCustomEvent(codes) {
|
|
615
|
-
this.removeEventHandler(this._fieldCustomEvent, codes);
|
|
616
|
-
}
|
|
617
|
-
onFieldCustomEvent(codes, callback, properties = null) {
|
|
618
|
-
this.registerEventHandler(this._fieldCustomEvent, codes, callback, properties);
|
|
619
|
-
}
|
|
620
|
-
removeFieldValidationStart(codes) {
|
|
621
|
-
this.removeEventHandler(this._fieldValidationsStart, codes);
|
|
622
|
-
}
|
|
623
|
-
onFieldValidationStart(codes, callback, properties = null) {
|
|
624
|
-
this.registerEventHandler(this._fieldValidationsStart, codes, callback, properties);
|
|
625
|
-
}
|
|
626
|
-
removeFieldValidationFinish(codes) {
|
|
627
|
-
this.removeEventHandler(this._fieldValidationsFinish, codes);
|
|
628
|
-
}
|
|
629
|
-
onFieldValidationFinish(codes, callback, properties = null) {
|
|
630
|
-
this.registerEventHandler(this._fieldValidationsFinish, codes, callback, properties);
|
|
631
|
-
}
|
|
632
|
-
removeFieldAllEventCallbacks(codes) {
|
|
633
|
-
this.removeEventHandler(this._fieldInputValidation, codes);
|
|
634
|
-
this.removeEventHandler(this._fieldCustomEvent, codes);
|
|
635
|
-
this.removeEventHandler(this._fieldValidationsStart, codes);
|
|
636
|
-
this.removeEventHandler(this._fieldValidationsFinish, codes);
|
|
637
|
-
}
|
|
638
|
-
async startFieldInputValidation(code, intrinsicValidation = true) {
|
|
639
|
-
this.notifyFormActivity();
|
|
640
|
-
const fieldToValidate = this.getField(code);
|
|
641
|
-
if (!fieldToValidate) {
|
|
642
|
-
return false;
|
|
643
|
-
}
|
|
644
|
-
const validationCallbacks = this._fieldInputValidation[code];
|
|
645
|
-
if (validationCallbacks) {
|
|
646
|
-
const clientValidationPromises = [];
|
|
647
|
-
for (const validationMethod of validationCallbacks) {
|
|
648
|
-
const { callback, properties } = validationMethod;
|
|
649
|
-
const continueValidationPromise = callback(fieldToValidate);
|
|
650
|
-
clientValidationPromises.push(continueValidationPromise);
|
|
651
|
-
}
|
|
652
|
-
await Promise.allSettled(clientValidationPromises);
|
|
653
|
-
}
|
|
654
|
-
return true;
|
|
655
|
-
}
|
|
656
|
-
async startFieldCustomEvent(code, eventName, eventData) {
|
|
657
|
-
this.notifyFormActivity();
|
|
658
|
-
const fieldToTrigger = this.getField(code);
|
|
659
|
-
if (!fieldToTrigger) {
|
|
660
|
-
return;
|
|
661
|
-
}
|
|
662
|
-
const eventHandlerCallbacks = this._fieldCustomEvent[code];
|
|
663
|
-
if (eventHandlerCallbacks) {
|
|
664
|
-
const clientEventPromises = [];
|
|
665
|
-
for (const eventHandlerMethod of eventHandlerCallbacks) {
|
|
666
|
-
const { callback, properties } = eventHandlerMethod;
|
|
667
|
-
const clientEventPromise = callback(eventName, eventData, fieldToTrigger);
|
|
668
|
-
clientEventPromises.push(clientEventPromise);
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
async startFieldValidation(code, intrinsicValidation = true) {
|
|
673
|
-
this.notifyFormActivity();
|
|
674
|
-
const fieldToValidate = this.getField(code);
|
|
675
|
-
if (!fieldToValidate) {
|
|
676
|
-
return;
|
|
677
|
-
}
|
|
678
|
-
const validationCallbacks = this._fieldValidationsStart[code];
|
|
679
|
-
if (validationCallbacks) {
|
|
680
|
-
const clientValidationPromises = [];
|
|
681
|
-
for (const validationMethod of validationCallbacks) {
|
|
682
|
-
const { callback, properties } = validationMethod;
|
|
683
|
-
const clientValidationPromise = callback(fieldToValidate);
|
|
684
|
-
clientValidationPromises.push(clientValidationPromise);
|
|
685
|
-
}
|
|
686
|
-
const clientValidationResults = await Promise.allSettled(clientValidationPromises);
|
|
687
|
-
const continueValidation = clientValidationResults.every(r => r.status === 'fulfilled' && r.value !== false);
|
|
688
|
-
if (!continueValidation) {
|
|
689
|
-
return;
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
if (intrinsicValidation) {
|
|
693
|
-
this.startServerFieldValidation(fieldToValidate);
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
async startServerFieldValidation(inputField) {
|
|
697
|
-
const fieldObj = (typeof inputField === 'string')
|
|
698
|
-
? this.getField(inputField) : inputField;
|
|
699
|
-
let serverError = false;
|
|
700
|
-
let validationResult = true;
|
|
701
|
-
if (!fieldObj) {
|
|
702
|
-
return;
|
|
703
|
-
}
|
|
704
|
-
if (fieldObj.backend) {
|
|
705
|
-
fieldObj.validating = true;
|
|
706
|
-
validationResult = await this
|
|
707
|
-
.requestFormAction(FormActionType.Validate, fieldObj.code);
|
|
708
|
-
serverError = !!this.errorOccured();
|
|
709
|
-
}
|
|
710
|
-
if (serverError) {
|
|
711
|
-
fieldObj?.setErrorCode(this.errorCode);
|
|
712
|
-
fieldObj?.setErrorMessage(this.errorMessage);
|
|
713
|
-
for (let index = 0; index < this._fieldServerError.length; index++) {
|
|
714
|
-
const { callback, properties } = this._fieldServerError[index];
|
|
715
|
-
callback(fieldObj);
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
await this.finishFieldValidation(fieldObj, validationResult, serverError);
|
|
719
|
-
fieldObj.validating = false;
|
|
720
|
-
}
|
|
721
|
-
async finishFieldValidation(fieldObject, validationResult, serverError = false) {
|
|
722
|
-
const validationCallbacks = this._fieldValidationsFinish[fieldObject.code];
|
|
723
|
-
if (validationCallbacks) {
|
|
724
|
-
const clientActionPromises = [];
|
|
725
|
-
for (const validationMethod of validationCallbacks) {
|
|
726
|
-
const { callback, properties } = validationMethod;
|
|
727
|
-
const continueOnError = properties?.continueOnError ?? false;
|
|
728
|
-
if (!serverError || continueOnError) {
|
|
729
|
-
clientActionPromises.push(callback(fieldObject, validationResult));
|
|
730
|
-
}
|
|
731
|
-
}
|
|
732
|
-
await Promise.allSettled(clientActionPromises);
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
async continueFieldValidation(code) {
|
|
736
|
-
return this.startServerFieldValidation(code);
|
|
737
|
-
}
|
|
738
|
-
/**
|
|
739
|
-
* Manejadores de eventos para acciones sobre Tablas
|
|
740
|
-
*/
|
|
741
|
-
onTableActionStart(code, actionCode, callback, properties = null) {
|
|
742
|
-
const tableObject = this.getTable(code);
|
|
743
|
-
if (!tableObject) {
|
|
744
|
-
return;
|
|
745
|
-
}
|
|
746
|
-
const inlineActionObject = tableObject.getAction(actionCode);
|
|
747
|
-
if (!inlineActionObject) {
|
|
748
|
-
return;
|
|
749
|
-
}
|
|
750
|
-
let tableEventHandlers;
|
|
751
|
-
if (this._tableActionsStart[code]) {
|
|
752
|
-
tableEventHandlers = this._tableActionsStart[code];
|
|
753
|
-
}
|
|
754
|
-
else {
|
|
755
|
-
tableEventHandlers = {};
|
|
756
|
-
this._tableActionsStart[code] = tableEventHandlers;
|
|
757
|
-
}
|
|
758
|
-
if (!tableEventHandlers[actionCode]) {
|
|
759
|
-
tableEventHandlers[actionCode] = [];
|
|
760
|
-
}
|
|
761
|
-
tableEventHandlers[actionCode].push({ callback, properties });
|
|
762
|
-
}
|
|
763
|
-
onTableActionFinish(code, actionCode, callback, properties = null) {
|
|
764
|
-
const tableObject = this.getTable(code);
|
|
765
|
-
if (!tableObject) {
|
|
766
|
-
return;
|
|
767
|
-
}
|
|
768
|
-
const inlineActionObject = tableObject.getAction(actionCode);
|
|
769
|
-
if (!inlineActionObject) {
|
|
770
|
-
return;
|
|
771
|
-
}
|
|
772
|
-
let tableEventHandlers;
|
|
773
|
-
if (this._tableActionsFinish[code]) {
|
|
774
|
-
tableEventHandlers = this._tableActionsFinish[code];
|
|
775
|
-
}
|
|
776
|
-
else {
|
|
777
|
-
tableEventHandlers = {};
|
|
778
|
-
this._tableActionsFinish[code] = tableEventHandlers;
|
|
779
|
-
}
|
|
780
|
-
if (!tableEventHandlers[actionCode]) {
|
|
781
|
-
tableEventHandlers[actionCode] = [];
|
|
782
|
-
}
|
|
783
|
-
tableEventHandlers[actionCode].push({ callback, properties });
|
|
784
|
-
}
|
|
785
|
-
onTableSelectionStart(code, callback, properties = null) {
|
|
786
|
-
const tableObject = this.getTable(code);
|
|
787
|
-
if (!tableObject) {
|
|
788
|
-
return;
|
|
789
|
-
}
|
|
790
|
-
let tableEventHandlers;
|
|
791
|
-
if (this._tableSelectionsStart[code]) {
|
|
792
|
-
tableEventHandlers = this._tableSelectionsStart[code];
|
|
793
|
-
}
|
|
794
|
-
else {
|
|
795
|
-
tableEventHandlers = [];
|
|
796
|
-
this._tableSelectionsStart[code] = tableEventHandlers;
|
|
797
|
-
}
|
|
798
|
-
tableEventHandlers.push({ callback, properties });
|
|
799
|
-
}
|
|
800
|
-
onTableSelectionFinish(code, callback, properties = null) {
|
|
801
|
-
const tableObject = this.getTable(code);
|
|
802
|
-
if (!tableObject) {
|
|
803
|
-
return;
|
|
804
|
-
}
|
|
805
|
-
let tableEventHandlers;
|
|
806
|
-
if (this._tableSelectionsFinish[code]) {
|
|
807
|
-
tableEventHandlers = this._tableSelectionsFinish[code];
|
|
808
|
-
}
|
|
809
|
-
else {
|
|
810
|
-
tableEventHandlers = [];
|
|
811
|
-
this._tableSelectionsFinish[code] = tableEventHandlers;
|
|
812
|
-
}
|
|
813
|
-
tableEventHandlers.push({ callback, properties });
|
|
814
|
-
}
|
|
815
|
-
onTableGetDataStart(code, callback, properties = null) {
|
|
816
|
-
const tableObject = this.getTable(code);
|
|
817
|
-
if (!tableObject) {
|
|
818
|
-
return;
|
|
819
|
-
}
|
|
820
|
-
let tableEventHandlers;
|
|
821
|
-
if (this._tableGetDataStart[code]) {
|
|
822
|
-
tableEventHandlers = this._tableGetDataStart[code];
|
|
823
|
-
}
|
|
824
|
-
else {
|
|
825
|
-
tableEventHandlers = [];
|
|
826
|
-
this._tableGetDataStart[code] = tableEventHandlers;
|
|
827
|
-
}
|
|
828
|
-
tableEventHandlers.push({ callback, properties });
|
|
829
|
-
}
|
|
830
|
-
onTableGetDataFinish(code, callback, properties = null) {
|
|
831
|
-
const tableObject = this.getTable(code);
|
|
832
|
-
if (!tableObject) {
|
|
833
|
-
return;
|
|
834
|
-
}
|
|
835
|
-
let tableEventHandlers;
|
|
836
|
-
if (this._tableGetDataFinish[code]) {
|
|
837
|
-
tableEventHandlers = this._tableGetDataFinish[code];
|
|
838
|
-
}
|
|
839
|
-
else {
|
|
840
|
-
tableEventHandlers = {};
|
|
841
|
-
this._tableGetDataFinish[code] = tableEventHandlers;
|
|
842
|
-
}
|
|
843
|
-
tableEventHandlers[GET_DATA_ACTION] = { callback, properties };
|
|
844
|
-
}
|
|
845
|
-
async startTableGlobalAction(tableActionEvent) {
|
|
846
|
-
this.notifyFormActivity();
|
|
847
|
-
const { tableCode, actionCode } = tableActionEvent;
|
|
848
|
-
const tableObject = this.getTable(tableCode);
|
|
849
|
-
if (!tableObject || !actionCode) {
|
|
850
|
-
return;
|
|
851
|
-
}
|
|
852
|
-
this.resetError();
|
|
853
|
-
const action = tableObject.getAction(actionCode);
|
|
854
|
-
if (!action) {
|
|
855
|
-
return;
|
|
856
|
-
}
|
|
857
|
-
const tableActionDetail = {
|
|
858
|
-
tableObject,
|
|
859
|
-
action,
|
|
860
|
-
tableCode,
|
|
861
|
-
actionCode,
|
|
862
|
-
};
|
|
863
|
-
const tableEventHandlers = this._tableActionsStart[tableCode];
|
|
864
|
-
const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
|
|
865
|
-
if (tableActionMethods) {
|
|
866
|
-
const clientActionPromises = [];
|
|
867
|
-
for (const tableActionMethod of tableActionMethods) {
|
|
868
|
-
const { callback, properties } = tableActionMethod;
|
|
869
|
-
const clientActionPromise = callback(tableActionDetail);
|
|
870
|
-
clientActionPromises.push(clientActionPromise);
|
|
871
|
-
}
|
|
872
|
-
const clientActionResults = await Promise.allSettled(clientActionPromises);
|
|
873
|
-
const continueAction = clientActionResults.every(r => r.status === 'fulfilled' && r.value !== false);
|
|
874
|
-
if (!continueAction) {
|
|
875
|
-
return;
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
this.startTableServerGlobalAction(tableActionDetail);
|
|
879
|
-
}
|
|
880
|
-
async startTableServerGlobalAction(tableActionDetail) {
|
|
881
|
-
const { tableObject, action, tableCode, actionCode } = tableActionDetail;
|
|
882
|
-
if (!tableObject || !action) {
|
|
883
|
-
return;
|
|
884
|
-
}
|
|
885
|
-
tableObject.putOnWait();
|
|
886
|
-
let serverError = false;
|
|
887
|
-
let actionResult = null;
|
|
888
|
-
if (action.backend) {
|
|
889
|
-
const actionSubject = {
|
|
890
|
-
tableCode,
|
|
891
|
-
actionType: GLOBAL_ACTION,
|
|
892
|
-
actionCode
|
|
893
|
-
};
|
|
894
|
-
actionResult = await this
|
|
895
|
-
.requestFormAction(FormActionType.TableAction, actionSubject);
|
|
896
|
-
serverError = !!this.errorOccured();
|
|
897
|
-
}
|
|
898
|
-
await this.finishTableGlobalAction(tableActionDetail, actionResult, serverError);
|
|
899
|
-
if (!serverError) {
|
|
900
|
-
action.newState && this.changeState(action.newState);
|
|
901
|
-
}
|
|
902
|
-
else {
|
|
903
|
-
for (let index = 0; index < this._tableServerError.length; index++) {
|
|
904
|
-
const { callback, properties } = this._tableServerError[index];
|
|
905
|
-
callback(tableObject);
|
|
906
|
-
}
|
|
907
|
-
}
|
|
908
|
-
tableObject.freeWaiting();
|
|
909
|
-
}
|
|
910
|
-
async finishTableGlobalAction(tableActionDetail, actionResult, serverError = false) {
|
|
911
|
-
const { tableCode, actionCode } = tableActionDetail;
|
|
912
|
-
const tableEventHandlers = this._tableActionsFinish[tableCode];
|
|
913
|
-
const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
|
|
914
|
-
if (tableActionMethods) {
|
|
915
|
-
const clientActionPromises = [];
|
|
916
|
-
for (const tableActionMethod of tableActionMethods) {
|
|
917
|
-
const { callback, properties } = tableActionMethod;
|
|
918
|
-
const continueOnError = properties?.continueOnError ?? false;
|
|
919
|
-
if (!serverError || continueOnError) {
|
|
920
|
-
clientActionPromises.push(callback(tableActionDetail, actionResult));
|
|
921
|
-
}
|
|
922
|
-
}
|
|
923
|
-
await Promise.allSettled(clientActionPromises);
|
|
924
|
-
}
|
|
925
|
-
}
|
|
926
|
-
async startTableAction(tableActionEvent) {
|
|
927
|
-
this.notifyFormActivity();
|
|
928
|
-
const { tableCode, actionCode, actionDetail } = tableActionEvent;
|
|
929
|
-
const tableObject = this.getTable(tableCode);
|
|
930
|
-
if (!tableObject || !actionCode) {
|
|
931
|
-
return;
|
|
932
|
-
}
|
|
933
|
-
this.resetError();
|
|
934
|
-
const { recordId, recordData } = actionDetail;
|
|
935
|
-
const action = tableObject.getAction(actionCode);
|
|
936
|
-
if (!action) {
|
|
937
|
-
return;
|
|
938
|
-
}
|
|
939
|
-
const tableActionDetail = {
|
|
940
|
-
tableObject,
|
|
941
|
-
action,
|
|
942
|
-
tableCode,
|
|
943
|
-
actionCode,
|
|
944
|
-
recordId,
|
|
945
|
-
recordData
|
|
946
|
-
};
|
|
947
|
-
const tableEventHandlers = this._tableActionsStart[tableCode];
|
|
948
|
-
const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
|
|
949
|
-
if (tableActionMethods) {
|
|
950
|
-
const clientActionPromises = [];
|
|
951
|
-
for (const tableActionMethod of tableActionMethods) {
|
|
952
|
-
const { callback, properties } = tableActionMethod;
|
|
953
|
-
const clientActionPromise = callback(tableActionDetail);
|
|
954
|
-
clientActionPromises.push(clientActionPromise);
|
|
955
|
-
}
|
|
956
|
-
const clientActionResults = await Promise.allSettled(clientActionPromises);
|
|
957
|
-
const continueAction = clientActionResults.every(r => r.status === 'fulfilled' && r.value !== false);
|
|
958
|
-
if (!continueAction) {
|
|
959
|
-
return;
|
|
960
|
-
}
|
|
961
|
-
}
|
|
962
|
-
this.startTableServerAction(tableActionDetail);
|
|
963
|
-
}
|
|
964
|
-
async startTableServerAction(tableActionDetail) {
|
|
965
|
-
const { tableObject, action, tableCode, actionCode, recordId, recordData } = tableActionDetail;
|
|
966
|
-
if (!tableObject || !action) {
|
|
967
|
-
return;
|
|
968
|
-
}
|
|
969
|
-
tableObject.putOnWait();
|
|
970
|
-
let serverError = false;
|
|
971
|
-
let actionResult = null;
|
|
972
|
-
if (action.backend) {
|
|
973
|
-
const actionSubject = {
|
|
974
|
-
tableCode,
|
|
975
|
-
actionType: this.formConfig?.tableActions.inline,
|
|
976
|
-
actionCode,
|
|
977
|
-
tableRecordId: recordId,
|
|
978
|
-
tableRecordData: recordData
|
|
979
|
-
};
|
|
980
|
-
actionResult = await this
|
|
981
|
-
.requestFormAction(FormActionType.TableAction, actionSubject);
|
|
982
|
-
serverError = !!this.errorOccured();
|
|
983
|
-
}
|
|
984
|
-
await this.finishTableAction(tableActionDetail, actionResult, serverError);
|
|
985
|
-
if (!serverError) {
|
|
986
|
-
action.newState && this.changeState(action.newState);
|
|
987
|
-
}
|
|
988
|
-
else {
|
|
989
|
-
this.displayTableServerError();
|
|
990
|
-
}
|
|
991
|
-
tableObject.freeWaiting();
|
|
992
|
-
}
|
|
993
|
-
completeInlineAction(tableAction) {
|
|
994
|
-
return this.startTableServerAction(tableAction);
|
|
995
|
-
}
|
|
996
|
-
async finishTableAction(tableActionDetail, actionResult, serverError = false) {
|
|
997
|
-
const { tableCode, actionCode } = tableActionDetail;
|
|
998
|
-
const tableEventHandlers = this._tableActionsFinish[tableCode];
|
|
999
|
-
const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
|
|
1000
|
-
if (tableActionMethods) {
|
|
1001
|
-
const clientActionPromises = [];
|
|
1002
|
-
for (const tableActionMethod of tableActionMethods) {
|
|
1003
|
-
const { callback, properties } = tableActionMethod;
|
|
1004
|
-
const continueOnError = properties?.continueOnError ?? false;
|
|
1005
|
-
if (!serverError || continueOnError) {
|
|
1006
|
-
clientActionPromises.push(callback(tableActionDetail, actionResult));
|
|
1007
|
-
}
|
|
1008
|
-
}
|
|
1009
|
-
await Promise.allSettled(clientActionPromises);
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
async startTableRecordSelection(tableActionEvent) {
|
|
1013
|
-
this.notifyFormActivity();
|
|
1014
|
-
const { tableCode, actionDetail } = tableActionEvent;
|
|
1015
|
-
const tableObject = this.getTable(tableCode);
|
|
1016
|
-
if (!tableObject) {
|
|
1017
|
-
return;
|
|
1018
|
-
}
|
|
1019
|
-
this.resetError();
|
|
1020
|
-
const { recordId, recordData } = actionDetail;
|
|
1021
|
-
const tableSelectionDetail = {
|
|
1022
|
-
tableObject,
|
|
1023
|
-
tableCode,
|
|
1024
|
-
recordId,
|
|
1025
|
-
recordData
|
|
1026
|
-
};
|
|
1027
|
-
const tableEventHandlers = this._tableSelectionsStart[tableCode];
|
|
1028
|
-
if (tableEventHandlers) {
|
|
1029
|
-
const clientActionPromises = [];
|
|
1030
|
-
for (const tableSelectionMethod of tableEventHandlers) {
|
|
1031
|
-
const { callback, properties } = tableSelectionMethod;
|
|
1032
|
-
const clientActionPromise = callback(tableSelectionDetail);
|
|
1033
|
-
clientActionPromises.push(clientActionPromise);
|
|
1034
|
-
}
|
|
1035
|
-
const clientActionResults = await Promise.allSettled(clientActionPromises);
|
|
1036
|
-
const continueAction = clientActionResults.every(r => r.status === 'fulfilled' && r.value !== false);
|
|
1037
|
-
if (!continueAction) {
|
|
1038
|
-
return;
|
|
1039
|
-
}
|
|
1040
|
-
}
|
|
1041
|
-
this.startTableServerRecordSelection(tableSelectionDetail);
|
|
1042
|
-
}
|
|
1043
|
-
async startTableServerRecordSelection(tableSelectionDetail) {
|
|
1044
|
-
const { tableObject, tableCode, recordId, recordData } = tableSelectionDetail;
|
|
1045
|
-
if (!tableObject) {
|
|
1046
|
-
return;
|
|
1047
|
-
}
|
|
1048
|
-
tableObject.putOnWait();
|
|
1049
|
-
let serverError = false;
|
|
1050
|
-
let actionResult = null;
|
|
1051
|
-
if (tableObject.selectionBackend) {
|
|
1052
|
-
const actionSubject = {
|
|
1053
|
-
tableCode,
|
|
1054
|
-
actionType: this.formConfig?.tableActions.rowSelection,
|
|
1055
|
-
actionCode: null,
|
|
1056
|
-
tableRecordId: recordId,
|
|
1057
|
-
tableRecordData: recordData
|
|
1058
|
-
};
|
|
1059
|
-
actionResult = await this
|
|
1060
|
-
.requestFormAction(FormActionType.TableAction, actionSubject);
|
|
1061
|
-
serverError = !!this.errorOccured();
|
|
1062
|
-
}
|
|
1063
|
-
await this.finishTableRecordSelection(tableSelectionDetail, actionResult, serverError);
|
|
1064
|
-
if (serverError) {
|
|
1065
|
-
this.displayTableServerError();
|
|
1066
|
-
}
|
|
1067
|
-
tableObject.freeWaiting();
|
|
1068
|
-
}
|
|
1069
|
-
async finishTableRecordSelection(tableSelectionDetail, actionResult, serverError = false) {
|
|
1070
|
-
const { tableCode } = tableSelectionDetail;
|
|
1071
|
-
const tableEventHandlers = this._tableSelectionsFinish[tableCode];
|
|
1072
|
-
if (tableEventHandlers) {
|
|
1073
|
-
const clientActionPromises = [];
|
|
1074
|
-
for (const tableSelectionMethod of tableEventHandlers) {
|
|
1075
|
-
const { callback, properties } = tableSelectionMethod;
|
|
1076
|
-
const continueOnError = properties?.continueOnError ?? false;
|
|
1077
|
-
if (!serverError || continueOnError) {
|
|
1078
|
-
clientActionPromises.push(callback(tableSelectionDetail, actionResult));
|
|
1079
|
-
}
|
|
1080
|
-
}
|
|
1081
|
-
await Promise.allSettled(clientActionPromises);
|
|
1082
|
-
}
|
|
1083
|
-
}
|
|
1084
|
-
async startTableSelectionAction(tableActionEvent) {
|
|
1085
|
-
this.notifyFormActivity();
|
|
1086
|
-
const { tableCode, actionCode, actionDetail } = tableActionEvent;
|
|
1087
|
-
const tableObject = this.getTable(tableCode);
|
|
1088
|
-
if (!tableObject || !actionCode) {
|
|
1089
|
-
return;
|
|
1090
|
-
}
|
|
1091
|
-
this.resetError();
|
|
1092
|
-
const { selectedRecords } = actionDetail;
|
|
1093
|
-
const action = tableObject.getAction(actionCode);
|
|
1094
|
-
if (!action) {
|
|
1095
|
-
return;
|
|
1096
|
-
}
|
|
1097
|
-
const tableActionDetail = {
|
|
1098
|
-
tableObject,
|
|
1099
|
-
action,
|
|
1100
|
-
tableCode,
|
|
1101
|
-
actionCode,
|
|
1102
|
-
selectedRecords
|
|
1103
|
-
};
|
|
1104
|
-
const tableEventHandlers = this._tableActionsStart[tableCode];
|
|
1105
|
-
const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
|
|
1106
|
-
if (tableActionMethods) {
|
|
1107
|
-
const clientActionPromises = [];
|
|
1108
|
-
for (const tableActionMethod of tableActionMethods) {
|
|
1109
|
-
const { callback, properties } = tableActionMethod;
|
|
1110
|
-
const clientActionPromise = callback(tableActionDetail);
|
|
1111
|
-
clientActionPromises.push(clientActionPromise);
|
|
1112
|
-
}
|
|
1113
|
-
const clientActionResults = await Promise.allSettled(clientActionPromises);
|
|
1114
|
-
const continueAction = clientActionResults.every(r => r.status === 'fulfilled' && r.value !== false);
|
|
1115
|
-
if (!continueAction) {
|
|
1116
|
-
return;
|
|
1117
|
-
}
|
|
1118
|
-
}
|
|
1119
|
-
this.startTableServerSelectionAction(tableActionDetail);
|
|
1120
|
-
}
|
|
1121
|
-
async startTableServerSelectionAction(tableActionDetail) {
|
|
1122
|
-
const { tableObject, action, tableCode, actionCode, selectedRecords } = tableActionDetail;
|
|
1123
|
-
if (!tableObject || !action) {
|
|
1124
|
-
return;
|
|
1125
|
-
}
|
|
1126
|
-
tableObject.putOnWait();
|
|
1127
|
-
let serverError = false;
|
|
1128
|
-
let actionResult = null;
|
|
1129
|
-
if (action.backend) {
|
|
1130
|
-
const actionSubject = {
|
|
1131
|
-
tableCode,
|
|
1132
|
-
actionType: this.formConfig?.tableActions.selection,
|
|
1133
|
-
actionCode,
|
|
1134
|
-
selectedRecords
|
|
1135
|
-
};
|
|
1136
|
-
actionResult = await this
|
|
1137
|
-
.requestFormAction(FormActionType.TableAction, actionSubject);
|
|
1138
|
-
serverError = !!this.errorOccured();
|
|
1139
|
-
}
|
|
1140
|
-
await this.finishTableSelectionAction(tableActionDetail, actionResult, serverError);
|
|
1141
|
-
if (!serverError) {
|
|
1142
|
-
action.newState && this.changeState(action.newState);
|
|
1143
|
-
}
|
|
1144
|
-
else {
|
|
1145
|
-
this.displayTableServerError();
|
|
1146
|
-
}
|
|
1147
|
-
tableObject.freeWaiting();
|
|
1148
|
-
}
|
|
1149
|
-
async finishTableSelectionAction(tableActionDetail, actionResult, serverError = false) {
|
|
1150
|
-
const { tableCode, actionCode } = tableActionDetail;
|
|
1151
|
-
const tableEventHandlers = this._tableActionsFinish[tableCode];
|
|
1152
|
-
const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
|
|
1153
|
-
if (tableActionMethods) {
|
|
1154
|
-
const clientActionPromises = [];
|
|
1155
|
-
for (const tableActionMethod of tableActionMethods) {
|
|
1156
|
-
const { callback, properties } = tableActionMethod;
|
|
1157
|
-
const continueOnError = properties?.continueOnError ?? false;
|
|
1158
|
-
if (!serverError || continueOnError) {
|
|
1159
|
-
clientActionPromises.push(callback(tableActionDetail, actionResult));
|
|
1160
|
-
}
|
|
1161
|
-
}
|
|
1162
|
-
await Promise.allSettled(clientActionPromises);
|
|
1163
|
-
}
|
|
1164
|
-
}
|
|
1165
|
-
async startTableGetData(tableActionEvent) {
|
|
1166
|
-
this.notifyFormActivity();
|
|
1167
|
-
const { tableCode } = tableActionEvent;
|
|
1168
|
-
const tableObject = this.getTable(tableCode);
|
|
1169
|
-
const tableActionDetail = {
|
|
1170
|
-
tableObject,
|
|
1171
|
-
tableCode
|
|
1172
|
-
};
|
|
1173
|
-
this.resetError();
|
|
1174
|
-
const tableEventHandlers = this._tableGetDataStart[tableCode];
|
|
1175
|
-
if (tableEventHandlers) {
|
|
1176
|
-
const clientActionPromises = [];
|
|
1177
|
-
for (const tableActionMethod of tableEventHandlers) {
|
|
1178
|
-
const { callback, properties } = tableActionMethod;
|
|
1179
|
-
const clientActionPromise = callback(tableActionDetail);
|
|
1180
|
-
clientActionPromises.push(clientActionPromise);
|
|
1181
|
-
}
|
|
1182
|
-
const clientActionResults = await Promise.allSettled(clientActionPromises);
|
|
1183
|
-
const continueAction = clientActionResults.every(r => r.status === 'fulfilled' && r.value !== false);
|
|
1184
|
-
if (!continueAction) {
|
|
1185
|
-
return;
|
|
1186
|
-
}
|
|
1187
|
-
}
|
|
1188
|
-
this.startTableServerGetData(tableActionDetail);
|
|
1189
|
-
}
|
|
1190
|
-
async startTableServerGetData(tableActionDetail) {
|
|
1191
|
-
const { tableObject, tableCode } = tableActionDetail;
|
|
1192
|
-
tableObject.putOnWait();
|
|
1193
|
-
let serverError = false;
|
|
1194
|
-
const actionSubject = { tableCode };
|
|
1195
|
-
const actionResult = await this
|
|
1196
|
-
.requestFormAction(FormActionType.GetTableData, actionSubject);
|
|
1197
|
-
serverError = !!this.errorOccured();
|
|
1198
|
-
await this.finishTableGetData(tableActionDetail, actionResult, serverError);
|
|
1199
|
-
if (serverError) {
|
|
1200
|
-
this.displayTableServerError();
|
|
1201
|
-
}
|
|
1202
|
-
tableObject.freeWaiting();
|
|
1203
|
-
}
|
|
1204
|
-
async finishTableGetData(tableActionDetail, actionResult, serverError = false) {
|
|
1205
|
-
const { tableCode, tableActionCode } = tableActionDetail;
|
|
1206
|
-
const tableEventHandlers = this._tableActionsFinish[tableCode];
|
|
1207
|
-
const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[tableActionCode] : null;
|
|
1208
|
-
if (tableActionMethods) {
|
|
1209
|
-
const clientActionPromises = [];
|
|
1210
|
-
for (const tableActionMethod of tableActionMethods) {
|
|
1211
|
-
const { callback, properties } = tableActionMethod;
|
|
1212
|
-
const continueOnError = properties?.continueOnError ?? false;
|
|
1213
|
-
if (!serverError || continueOnError) {
|
|
1214
|
-
clientActionPromises.push(callback(tableActionDetail, actionResult));
|
|
1215
|
-
}
|
|
1216
|
-
}
|
|
1217
|
-
await Promise.allSettled(clientActionPromises);
|
|
1218
|
-
}
|
|
1219
|
-
}
|
|
1220
|
-
checkSectionRequiredFields(sectionCode, reqFieldMessage) {
|
|
1221
|
-
this.cleanErrorFields(null, sectionCode);
|
|
1222
|
-
const requiredFieldMessage = reqFieldMessage ?? this.formConfig?.formStandardErrors.requiredField;
|
|
1223
|
-
const numErrors = this.tagFieldsWithError(requiredFieldMessage, this.getRequiredEmptyFields(null, sectionCode));
|
|
1224
|
-
return (numErrors === 0);
|
|
1225
|
-
}
|
|
1226
|
-
validateSectionConsistency(sectionCode, reqFieldMessage) {
|
|
1227
|
-
this.resetError();
|
|
1228
|
-
const completeFields = this.checkSectionRequiredFields(sectionCode, reqFieldMessage);
|
|
1229
|
-
if (!completeFields) {
|
|
1230
|
-
this.setError(this.formConfig?.formStandardErrors.typeWarning, this.formConfig?.formStandardErrors.validationTitle, this.formConfig?.formStandardErrors.requiredFields);
|
|
1231
|
-
return false;
|
|
1232
|
-
}
|
|
1233
|
-
let validationError = false;
|
|
1234
|
-
const requiredEmptyFields = this.getRequiredEmptyFields(null, sectionCode) ?? [];
|
|
1235
|
-
if (requiredEmptyFields?.length > 0) {
|
|
1236
|
-
validationError = true;
|
|
1237
|
-
this.setError(this.formConfig?.formStandardErrors.typeWarning, this.formConfig?.formStandardErrors.validationTitle, this.formConfig?.formStandardErrors.requiredFields);
|
|
1238
|
-
this.tagFieldsWithError(this.formConfig?.formStandardErrors.requiredField, requiredEmptyFields);
|
|
1239
|
-
for (const code of requiredEmptyFields) {
|
|
1240
|
-
const requiredEmptyField = this.getField(code);
|
|
1241
|
-
requiredEmptyField?.focus();
|
|
1242
|
-
break;
|
|
1243
|
-
}
|
|
1244
|
-
}
|
|
1245
|
-
const validationIssueFields = this.getFieldsWithValidationIssues(null, sectionCode) ?? [];
|
|
1246
|
-
if (!validationError && validationIssueFields.length > 0) {
|
|
1247
|
-
validationError = true;
|
|
1248
|
-
this.setError(this.formConfig?.formStandardErrors.typeWarning, this.formConfig?.formStandardErrors.validationTitle, this.formConfig?.formStandardErrors.validationFields);
|
|
1249
|
-
for (const code of validationIssueFields) {
|
|
1250
|
-
const validationIssueField = this.getField(code);
|
|
1251
|
-
if (validationIssueField) {
|
|
1252
|
-
validationIssueField.focus();
|
|
1253
|
-
}
|
|
1254
|
-
break;
|
|
1255
|
-
}
|
|
1256
|
-
}
|
|
1257
|
-
return validationError;
|
|
1258
|
-
}
|
|
1259
|
-
copyTableRecordToFields(tableObj, mappingTable = null) {
|
|
1260
|
-
const tableObject = this.getTable(tableObj.tableCode);
|
|
1261
|
-
const tableRecord = tableObject?.getTableRecord(tableObj.recordId);
|
|
1262
|
-
const columnNames = tableObject?.columnNames;
|
|
1263
|
-
if (tableRecord && columnNames) {
|
|
1264
|
-
for (const columnName of columnNames) {
|
|
1265
|
-
const columnValue = tableRecord.getFieldValue(columnName) ?? '';
|
|
1266
|
-
const code = mappingTable?.[columnName] ?? columnName;
|
|
1267
|
-
const field = code ? this.getField(code) : null;
|
|
1268
|
-
if (field) {
|
|
1269
|
-
field.setValue(columnValue);
|
|
1270
|
-
field.hasChanged = false;
|
|
1271
|
-
}
|
|
1272
|
-
}
|
|
1273
|
-
return true;
|
|
1274
|
-
}
|
|
1275
|
-
return false;
|
|
1276
|
-
}
|
|
1277
|
-
notifyFormActivity() {
|
|
1278
|
-
if (this._notifyFormActivity) {
|
|
1279
|
-
this._eventEmiter.next('formActivity', { code: this.formCode });
|
|
1280
|
-
}
|
|
1281
|
-
}
|
|
1282
|
-
/**
|
|
1283
|
-
* Métodos Legacy de compatibilidad hacia atrás
|
|
1284
|
-
*/
|
|
1285
|
-
/**
|
|
1286
|
-
* @deprecated Since v17. Use name instead. Will be removed in v19.
|
|
1287
|
-
*/
|
|
1288
|
-
get formCode() { return this.name ?? ''; }
|
|
1289
|
-
/**
|
|
1290
|
-
* @deprecated Since v17. Use name instead. Will be removed in v19.
|
|
1291
|
-
*/
|
|
1292
|
-
set formCode(name) { this.name = name; }
|
|
1293
|
-
/**
|
|
1294
|
-
* @deprecated Since v17. Use busy signal instead. Will be removed in v19.
|
|
1295
|
-
*/
|
|
1296
|
-
get inServerProcess() { return this.busy(); }
|
|
1297
|
-
/**
|
|
1298
|
-
* @deprecated Since v17. Use state instead. Will be removed in v19.
|
|
1299
|
-
*/
|
|
1300
|
-
get currentState() { return this.state ?? ''; }
|
|
1301
|
-
/**
|
|
1302
|
-
* @deprecated Since v17. Use changeState instead. Will be removed in v19.
|
|
1303
|
-
*/
|
|
1304
|
-
set currentState(state) { this?.changeState(state); }
|
|
1305
|
-
/**
|
|
1306
|
-
* @deprecated Since v17. Use onSectionActivation instead. Will be removed in v19.
|
|
1307
|
-
*/
|
|
1308
|
-
get formRoute() { return this._formRoute ?? ''; }
|
|
1309
|
-
/**
|
|
1310
|
-
* @deprecated Since v17. Use onSectionActivation instead. Will be removed in v19.
|
|
1311
|
-
*/
|
|
1312
|
-
set formRoute(route) { this._formRoute = route; }
|
|
1313
|
-
/**
|
|
1314
|
-
* @deprecated Since v17. Use onSectionActivation instead. Will be removed in v19.
|
|
1315
|
-
*/
|
|
1316
|
-
addSectionActivation(codes, callback, properties = null) {
|
|
1317
|
-
return this.onSectionActivation(codes, callback, properties);
|
|
1318
|
-
}
|
|
1319
|
-
/**
|
|
1320
|
-
* @deprecated Since v17. Use onSectionInactivation instead. Will be removed in v19.
|
|
1321
|
-
*/
|
|
1322
|
-
addSectionInactivation(codes, callback, properties = null) {
|
|
1323
|
-
return this.onSectionInactivation(codes, callback, properties);
|
|
1324
|
-
}
|
|
1325
|
-
/**
|
|
1326
|
-
* @deprecated Since v17. Use onActionStart instead. Will be removed in v19.
|
|
1327
|
-
*/
|
|
1328
|
-
addActionMethodStart(codes, callback, properties = null) {
|
|
1329
|
-
return this.onActionStart(codes, callback, properties);
|
|
1330
|
-
}
|
|
1331
|
-
/**
|
|
1332
|
-
* @deprecated Since v17. Use onActionFinish instead. Will be removed in v19.
|
|
1333
|
-
*/
|
|
1334
|
-
addActionMethodFinish(codes, callback, properties = null) {
|
|
1335
|
-
return this.onActionFinish(codes, callback, properties);
|
|
1336
|
-
}
|
|
1337
|
-
/**
|
|
1338
|
-
* @deprecated Since v17. Use onFieldInput instead. Will be removed in v19.
|
|
1339
|
-
*/
|
|
1340
|
-
addFieldInputValidation(codes, callback, properties = null) {
|
|
1341
|
-
return this.onFieldInput(codes, callback, properties);
|
|
1342
|
-
}
|
|
1343
|
-
/**
|
|
1344
|
-
* @deprecated Since v17. Use onFieldValidationStart instead. Will be removed in v19.
|
|
1345
|
-
*/
|
|
1346
|
-
addFieldValidationStart(codes, callback, properties = null) {
|
|
1347
|
-
return this.onFieldValidationStart(codes, callback, properties);
|
|
1348
|
-
}
|
|
1349
|
-
/**
|
|
1350
|
-
* @deprecated Since v17. Use onFieldValidationFinish instead. Will be removed in v19.
|
|
1351
|
-
*/
|
|
1352
|
-
addFieldValidationFinish(codes, callback, properties = null) {
|
|
1353
|
-
return this.onFieldValidationFinish(codes, callback, properties);
|
|
1354
|
-
}
|
|
1355
|
-
/**
|
|
1356
|
-
* @deprecated Since v17. Use onTableActionStart instead. Will be removed in v19.
|
|
1357
|
-
*/
|
|
1358
|
-
addTableActionStart(code, actionCode, callback, properties = null) {
|
|
1359
|
-
return this.onTableActionStart(code, actionCode, callback, properties);
|
|
1360
|
-
}
|
|
1361
|
-
/**
|
|
1362
|
-
* @deprecated Since v17. Use onTableActionFinish instead. Will be removed in v19.
|
|
1363
|
-
*/
|
|
1364
|
-
addTableActionFinish(code, actionCode, callback, properties = null) {
|
|
1365
|
-
return this.onTableActionFinish(code, actionCode, callback, properties);
|
|
1366
|
-
}
|
|
1367
|
-
/**
|
|
1368
|
-
* @deprecated Since v17. Use onTableSelectionStart instead. Will be removed in v19.
|
|
1369
|
-
*/
|
|
1370
|
-
addTableSelectionStart(code, callback, properties = null) {
|
|
1371
|
-
return this.onTableSelectionStart(code, callback, properties);
|
|
1372
|
-
}
|
|
1373
|
-
/**
|
|
1374
|
-
* @deprecated Since v17. Use onTableSelectionFinish instead. Will be removed in v19.
|
|
1375
|
-
*/
|
|
1376
|
-
addTableSelectionFinish(code, callback, properties = null) {
|
|
1377
|
-
return this.onTableSelectionFinish(code, callback, properties);
|
|
1378
|
-
}
|
|
1379
|
-
/**
|
|
1380
|
-
* @deprecated Since v17. Use onTableGetDataStart instead. Will be removed in v19.
|
|
1381
|
-
*/
|
|
1382
|
-
addTableGetDataStart(code, callback, properties = null) {
|
|
1383
|
-
return this.onTableGetDataStart(code, callback, properties);
|
|
1384
|
-
}
|
|
1385
|
-
/**
|
|
1386
|
-
* @deprecated Since v17. Use onTableGetDataFinish instead. Will be removed in v19.
|
|
1387
|
-
*/
|
|
1388
|
-
addTableGetDataFinish(code, callback, properties = null) {
|
|
1389
|
-
return this.onTableGetDataFinish(code, callback, properties);
|
|
1390
|
-
}
|
|
1391
|
-
/**
|
|
1392
|
-
* @deprecated Since v17. Use processInputParams instead. Will be removed in v19.
|
|
1393
|
-
*/
|
|
1394
|
-
preocessInputParams(params) {
|
|
1395
|
-
return this.processInputParams(params);
|
|
1396
|
-
}
|
|
1397
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BasicFormComponent, deps: [{ token: i1.LibFormManagerService }, { token: i2.LibEventManagerService }, { token: i3.LibFileManagementService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1398
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BasicFormComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1399
|
-
}
|
|
1400
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BasicFormComponent, decorators: [{
|
|
1401
|
-
type: Component,
|
|
1402
|
-
args: [{
|
|
1403
|
-
standalone: true,
|
|
1404
|
-
template: `<ng-content></ng-content>`,
|
|
1405
|
-
changeDetection: ChangeDetectionStrategy.OnPush
|
|
1406
|
-
}]
|
|
1407
|
-
}], ctorParameters: () => [{ type: i1.LibFormManagerService }, { type: i2.LibEventManagerService }, { type: i3.LibFileManagementService }] });
|
|
1408
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1YWluLW5nLWZvcm1zLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvYmFzaWMtZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSWhFLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7O0FBSzlFLE1BQU0sZUFBZSxHQUFHLG1CQUFtQixDQUFDO0FBQzVDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQztBQUMvQixNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUM7QUFDL0IsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBRWxDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFPdEIsTUFBTSxPQUFnQixrQkFBbUIsU0FBUSxvQkFBb0I7SUFtRHZEO0lBQ0E7SUFDQTtJQXBESixVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhDLGFBQWEsR0FBa0IsSUFBSSxDQUFDO0lBQ3BDLFlBQVksR0FBa0IsSUFBSSxDQUFDO0lBQ25DLFVBQVUsR0FBa0IsSUFBSSxDQUFDO0lBQ2pDLG1CQUFtQixHQUFZLEtBQUssQ0FBQztJQUNyQyxtQkFBbUIsR0FBWSxJQUFJLENBQUM7SUFDNUMsK0JBQStCO0lBQ3ZCLGdCQUFnQixHQUFnQyxFQUFFLENBQUM7SUFDbkQsMEJBQTBCLEdBQW9DLEVBQUUsQ0FBQztJQUNqRSxxQkFBcUIsR0FBb0MsRUFBRSxDQUFDO0lBQzVELHVCQUF1QixHQUFvQyxFQUFFLENBQUM7SUFDOUQsaUJBQWlCLEdBQW9DLEVBQUUsQ0FBQztJQUN4RCxrQkFBa0IsR0FBb0MsRUFBRSxDQUFDO0lBQ3pELGlCQUFpQixHQUFvQyxFQUFFLENBQUM7SUFDeEQscUJBQXFCLEdBQW9DLEVBQUUsQ0FBQztJQUM1RCxzQkFBc0IsR0FBb0MsRUFBRSxDQUFDO0lBQzdELHVCQUF1QixHQUFvQyxFQUFFLENBQUM7SUFDdEUsaUNBQWlDO0lBQ3pCLHFCQUFxQixHQUFvQyxFQUFFLENBQUM7SUFDNUQsc0JBQXNCLEdBQW9DLEVBQUUsQ0FBQztJQUM3RCxrQkFBa0IsR0FBb0QsRUFBRSxDQUFDO0lBQ3pFLG1CQUFtQixHQUFvRCxFQUFFLENBQUM7SUFDMUUsa0JBQWtCLEdBQW9DLEVBQUUsQ0FBQztJQUN6RCxtQkFBbUIsR0FBa0QsRUFBRSxDQUFDO0lBQ2hGLHNCQUFzQjtJQUNkLGtCQUFrQixHQUFvQixFQUFFLENBQUM7SUFDekMsaUJBQWlCLEdBQW9CLEVBQUUsQ0FBQztJQUN4QyxpQkFBaUIsR0FBb0IsRUFBRSxDQUFDO0lBQ2hELDBDQUEwQztJQUNsQyxrQkFBa0IsR0FBbUMsRUFBRSxDQUFDO0lBQ3hELHdCQUF3QixHQUFtQyxFQUFFLENBQUM7SUFDdEUsdUNBQXVDO0lBQzdCLGVBQWUsR0FBd0IsRUFBRSxDQUFDO0lBQzFDLFNBQVMsR0FBd0IsRUFBRSxDQUFDO0lBQ3BDLFlBQVksQ0FBeUI7SUFDckMsZUFBZSxHQUF3QixFQUFFLENBQUM7SUFDcEQsbUJBQW1CO0lBQ25CLFVBQVUsR0FBVyxFQUFFLENBQUM7SUFDeEIsU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUN2QixhQUFhLEdBQVcsRUFBRSxDQUFDO0lBQzNCLFNBQVMsR0FBVyxFQUFFLENBQUM7SUFDdkIsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBRXpCLG9CQUFvQjtJQUNwQixPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3pCLElBQUksR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFOUIsWUFDWSxrQkFBeUMsRUFDekMsYUFBcUMsRUFDckMsZ0JBQTBDO1FBQ3BELEtBQUssRUFBRSxDQUFDO1FBSEUsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUF1QjtRQUN6QyxrQkFBYSxHQUFiLGFBQWEsQ0FBd0I7UUFDckMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEwQjtRQUVwRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFFOUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFFNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELElBQUksV0FBVyxLQUFjLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRTNCLFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixRQUFRLEtBQUssQ0FBQztJQUNkLEtBQUssS0FBSyxDQUFDO0lBRVg7O09BRUc7SUFDSCxtQkFBbUIsS0FBSyxDQUFDO0lBRXpCOztPQUVHO0lBQ0gsZUFBZSxLQUFLLENBQUM7SUFFckIsd0JBQXdCLEtBQUssQ0FBQztJQUM5Qiw0QkFBNEIsS0FBSyxDQUFDO0lBQ2xDLHVCQUF1QixLQUFLLENBQUM7SUFDN0IsYUFBYSxDQUFDLElBQWEsRUFBRSxNQUFZLElBQUksQ0FBQztJQUM5QyxlQUFlLENBQUMsS0FBVSxFQUFFLElBQVMsRUFBRSxPQUFZLEVBQUUsUUFBYyxFQUFFLE1BQVksSUFBSSxDQUFDO0lBQ3RGLGdCQUFnQixDQUFDLEtBQVUsRUFBRSxJQUFTLEVBQUUsT0FBWSxFQUFFLFFBQWMsRUFBRSxNQUFZLElBQUksQ0FBQztJQUV2RixpQkFBaUIsQ0FBQyxTQUFpQixFQUFFLFFBQWlDO1FBQ3BFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsUUFBUSxDQUFDLElBQVksRUFBRSxPQUFZLElBQUksRUFBRSxXQUFnQixJQUFJLEVBQUUsVUFBVSxHQUFHLEtBQUs7UUFDL0UsSUFBSSxNQUFNLEdBQVEsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDckMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNqQyxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCwwQkFBMEIsS0FBSyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRSwyQkFBMkIsS0FBSyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNuRSxTQUFTLEtBQWMsT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQSxDQUFDLENBQUM7SUFDMUQsTUFBTSxLQUFXLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRCxVQUFVLEtBQVcsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVDLGVBQWUsS0FBVSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFaEcsUUFBUSxDQUFDLFNBQXdCLEVBQUUsWUFBMkIsRUFBRSxXQUEwQjtRQUN4RixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxJQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxZQUFZLEtBQWEsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNsRCxlQUFlLEtBQWEsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN2RCxjQUFjLEtBQWEsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNyRCxZQUFZLEtBQWEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNqRCxnQkFBZ0IsS0FBYSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3pELFlBQVksS0FBYSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRWpELGdCQUFnQixDQUFDLElBQVk7UUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFELENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxNQUFXO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO1FBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNHLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUN4RSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDO1lBQy9DLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1lBQ2hDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDBCQUEwQjtRQUN4QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ25DLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0MsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN6RCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxVQUFVO2lCQUNmLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3pDLFNBQVMsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkUsT0FBTyxDQUFDLFlBQVk7aUJBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3pDLFNBQVMsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDckUseUZBQXlGO1lBQ3pGLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hELENBQUM7SUFDSCxDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM5QixVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN6QixLQUFLLENBQUMsV0FBVztxQkFDZCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUN6QyxTQUFTLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtvQkFDeEIsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsS0FBSyxDQUFDO29CQUM3QyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDekQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsS0FBSyxDQUFDLGFBQWE7cUJBQ2hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ3pDLFNBQVMsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO29CQUN4QixNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLEdBQUcsS0FBSyxDQUFDO29CQUM1QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxDQUFDO2dCQUNMLEtBQUssQ0FBQyxjQUFjO3FCQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUN6QyxTQUFTLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtvQkFDeEIsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxHQUFHLEtBQUssQ0FBQztvQkFDNUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2dCQUM1RCxDQUFDLENBQUMsQ0FBQztnQkFDTCxLQUFLLENBQUMsYUFBYTtxQkFDaEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDekMsU0FBUyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLHFGQUFxRjtnQkFDckYsS0FBSyxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDM0IsTUFBTSxDQUFDLGVBQWU7cUJBQ25CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ3pDLFNBQVMsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN2RCx3RkFBd0Y7Z0JBQ3hGLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzlCLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3pCLEtBQUssQ0FBQyxtQkFBbUI7cUJBQ3RCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ3pDLFNBQVMsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzNELEtBQUssQ0FBQyxtQkFBbUI7cUJBQ3RCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ3pDLFNBQVMsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2pFLEtBQUssQ0FBQyxzQkFBc0I7cUJBQ3pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ3pDLFNBQVMsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLEtBQUssQ0FBQyxzQkFBc0I7cUJBQ3pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ3pDLFNBQVMsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLEtBQUssQ0FBQyxjQUFjO3FCQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUN6QyxTQUFTLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCx1RkFBdUY7Z0JBQ3ZGLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQVcsRUFBRSxjQUF1QixLQUFLO1FBQ3RELElBQUksWUFBWSxHQUFrQixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO1FBQzNCLElBQUksQ0FBQztZQUNILElBQUksV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQixNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dCQUNuQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDM0MsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO1FBQzNDLENBQUM7UUFDRCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxRCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzVELE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5Qiw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQztnQkFDSCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzVFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckUsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO1FBRWxELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRVEsV0FBVyxDQUFDLEtBQXlCO1FBQzVDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQztRQUM3RCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ2xELElBQUksbUJBQW1CLElBQUksbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxLQUFLLE1BQU0sUUFBUSxJQUFJLG1CQUFtQixFQUFFLENBQUM7b0JBQzNDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELHdCQUF3QixDQUFDLGNBQW1CO1FBQzFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxjQUFjLElBQUksRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUFDLE9BQU8sS0FBSyxDQUFDO1FBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUM7UUFDMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDO1FBQ2xELElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUMxQyxJQUFJLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7UUFDaEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sb0JBQW9CLENBQzFCLFVBQTJDLEVBQzNDLEtBQStCLEVBQy9CLFFBQWlDLEVBQ2pDLGFBQXlDLElBQUk7UUFFN0MsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQUMsQ0FBQztZQUNqRCxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCLENBQ3hCLFVBQTJDLEVBQzNDLEtBQStCO1FBRS9CLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FDM0IsUUFBeUIsRUFDekIsR0FBRyxJQUFXO1FBRWQsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkUsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOztPQUVHO0lBRUgsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFVBQWtCLEVBQUUsZ0JBQXFCLEVBQUU7UUFDakUsTUFBTSxZQUFZLEdBQUc7WUFDbkIsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ25CLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTztZQUN6QixXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDdkIsVUFBVTtZQUNWLGFBQWE7WUFDYixPQUFPLEVBQUUsZUFBZTtZQUN4QixRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUMzQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDbEMsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sa0JBQWtCLEdBQVEsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDeEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQztZQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7WUFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVELHdCQUF3QixDQUFDLFdBQWdCO1FBQ3ZDLE1BQU0sRUFDSixXQUFXLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUN2RCxZQUFZLEVBQUUsYUFBYSxFQUFFLFNBQVMsR0FDdkMsR0FBRyxXQUFXLENBQUM7UUFDaEIsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDO1FBQUMsQ0FBQztRQUNoRCxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xDLEtBQUssTUFBTSxhQUFhLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLFlBQVksRUFBRSxDQUFDO29CQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxLQUFLLE1BQU0sWUFBWSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNsQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVDLEtBQUssTUFBTSxZQUFZLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixXQUFXLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzdDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUVILHNCQUFzQixLQUFLLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFELHFCQUFxQixLQUFLLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hELHFCQUFxQixLQUFLLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hELG1CQUFtQixDQUFDLFFBQWlDLEVBQUUsYUFBeUMsSUFBSSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakssdUJBQXVCLENBQUMsUUFBaUMsRUFBRSxhQUF5QyxJQUFJLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwSyxrQkFBa0IsQ0FBQyxRQUFpQyxFQUFFLGFBQXlDLElBQUksSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRS9KOztPQUVHO0lBRUgsWUFBWSxDQUFDLFFBQWlDO1FBQzVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELHNCQUFzQixDQUFDLEtBQStCLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ3RJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBK0IsRUFBRSxRQUFpQyxFQUFFLGFBQXlDLElBQUk7UUFDbkksSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUErQixFQUFFLFFBQWlDLEVBQUUsYUFBeUMsSUFBSTtRQUNySSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUErQixFQUFFLFFBQWlDLEVBQUUsYUFBeUMsSUFBSTtRQUM3SCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUErQixFQUFFLFFBQWlDLEVBQUUsYUFBeUMsSUFBSTtRQUM5SCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxJQUFZO1FBQ3hDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQUMsT0FBTyxLQUFLLENBQUM7UUFBQyxDQUFDO1FBQ3JDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25FLElBQUksb0JBQW9CLEVBQUUsQ0FBQztZQUN6QixLQUFLLE1BQU0sbUJBQW1CLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDdkQsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQztnQkFDckQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLFdBQVcsS0FBSyxLQUFLLEVBQUUsQ0FBQztvQkFDMUIsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUFDLElBQVk7UUFDeEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUMvQixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDekIsS0FBSyxNQUFNLG1CQUFtQixJQUFJLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3ZELE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsbUJBQW1CLENBQUM7Z0JBQ3JELFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMseUJBQXlCLENBQUMsSUFBWTtRQUMxQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO1FBQy9CLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLElBQUksb0JBQW9CLEVBQUUsQ0FBQztZQUN6QixLQUFLLE1BQU0sbUJBQW1CLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDdkQsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQztnQkFDckQsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBWTtRQUM1QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixJQUFJLHlCQUF5QixJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUN4QixNQUFNLG9CQUFvQixHQUFVLEVBQUUsQ0FBQztZQUN2QyxLQUFLLE1BQU0sa0JBQWtCLElBQUksbUJBQW1CLEVBQUUsQ0FBQztnQkFDckQsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQztnQkFDcEQsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3JELG9CQUFvQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFDRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzNFLE1BQU0sY0FBYyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUM7WUFDckcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQixZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxPQUFPO1lBQ1QsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsV0FBZ0I7UUFDdEMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxPQUFPLFdBQVcsS0FBSyxRQUFRLENBQUM7WUFDOUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUM5QyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLElBQUkseUJBQXlCLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQy9FLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUMzRCx5Q0FBeUM7WUFDekMsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0QsV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkQsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUNwRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBVyxFQUFFLFlBQWlCLEVBQUUsY0FBdUIsS0FBSztRQUM3RSxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkUsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sb0JBQW9CLEdBQVUsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssTUFBTSxrQkFBa0IsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLGtCQUFrQixDQUFDO2dCQUNwRCxNQUFNLGVBQWUsR0FBRyxVQUFVLEVBQUUsZUFBZSxJQUFJLEtBQUssQ0FBQztnQkFDN0QsSUFBSSxRQUFRLElBQUksQ0FBQyxDQUFDLFdBQVcsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDO29CQUNsRCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsTUFBVztRQUM5QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFFSCwwQkFBMEIsQ0FBQyxLQUErQjtRQUN4RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxZQUFZLENBQUMsS0FBK0IsRUFBRSxRQUFpQyxFQUFFLGFBQXlDLElBQUk7UUFDNUgsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxLQUErQjtRQUNwRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUErQixFQUFFLFFBQWlDLEVBQUUsYUFBeUMsSUFBSTtRQUNsSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELDBCQUEwQixDQUFDLEtBQStCO1FBQ3hELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELHNCQUFzQixDQUFDLEtBQStCLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ3RJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsMkJBQTJCLENBQUMsS0FBK0I7UUFDekQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsdUJBQXVCLENBQUMsS0FBK0IsRUFBRSxRQUFpQyxFQUFFLGFBQXlDLElBQUk7UUFDdkksSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCw0QkFBNEIsQ0FBQyxLQUErQjtRQUMxRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxLQUFLLENBQUMseUJBQXlCLENBQUMsSUFBWSxFQUFFLHNCQUErQixJQUFJO1FBQy9FLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQUMsT0FBTyxLQUFLLENBQUM7UUFBQyxDQUFDO1FBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUN4QixNQUFNLHdCQUF3QixHQUFVLEVBQUUsQ0FBQztZQUMzQyxLQUFLLE1BQU0sZ0JBQWdCLElBQUksbUJBQW1CLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQztnQkFDbEQsTUFBTSx5QkFBeUIsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzVELHdCQUF3QixDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFDRCxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQixDQUFDLElBQVksRUFBRSxTQUFpQixFQUFFLFNBQWM7UUFDekUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUNoQyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDMUIsTUFBTSxtQkFBbUIsR0FBVSxFQUFFLENBQUM7WUFDdEMsS0FBSyxNQUFNLGtCQUFrQixJQUFJLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3ZELE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsa0JBQWtCLENBQUM7Z0JBQ3BELE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQzFFLG1CQUFtQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQy9DLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFZLEVBQUUsc0JBQStCLElBQUk7UUFDMUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUNqQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsTUFBTSx3QkFBd0IsR0FBVSxFQUFFLENBQUM7WUFDM0MsS0FBSyxNQUFNLGdCQUFnQixJQUFJLG1CQUFtQixFQUFFLENBQUM7Z0JBQ25ELE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ2xELE1BQU0sdUJBQXVCLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMxRCx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBQ0QsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUNuRixNQUFNLGtCQUFrQixHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUM7WUFDN0csSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3hCLE9BQU87WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsMEJBQTBCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsMEJBQTBCLENBQUMsVUFBb0M7UUFDbkUsTUFBTSxRQUFRLEdBQTJCLENBQUMsT0FBTyxVQUFVLEtBQUssUUFBUSxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDM0MsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksZ0JBQWdCLEdBQVksSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckIsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDM0IsZ0JBQWdCLEdBQUcsTUFBTSxJQUFJO2lCQUMxQixpQkFBaUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3RCxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixRQUFRLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2QyxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM3QyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUNuRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0QsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JCLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFFLFFBQVEsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMscUJBQXFCLENBQUMsV0FBZ0IsRUFBRSxnQkFBeUIsRUFBRSxXQUFXLEdBQUcsS0FBSztRQUMxRixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0UsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sb0JBQW9CLEdBQVUsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO2dCQUNuRCxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLGdCQUFnQixDQUFDO2dCQUNsRCxNQUFNLGVBQWUsR0FBRyxVQUFVLEVBQUUsZUFBZSxJQUFJLEtBQUssQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFdBQVcsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDcEMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUFDLElBQVk7UUFDeEMsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOztPQUVHO0lBRUgsa0JBQWtCLENBQUMsSUFBWSxFQUFFLFVBQWtCLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ25JLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxrQkFBbUQsQ0FBQztRQUN4RCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDO2FBQU0sQ0FBQztZQUNOLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUM7UUFDckQsQ0FBQztRQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3BDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQ0Qsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQVksRUFBRSxVQUFrQixFQUFFLFFBQWlDLEVBQUUsYUFBeUMsSUFBSTtRQUNwSSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN4QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksa0JBQW1ELENBQUM7UUFDeEQsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsQ0FBQzthQUFNLENBQUM7WUFDTixrQkFBa0IsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLGtCQUFrQixDQUFDO1FBQ3RELENBQUM7UUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNwQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdEMsQ0FBQztRQUNELGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFZLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ2xILE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDN0IsSUFBSSxrQkFBbUMsQ0FBQztRQUN4QyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxDQUFDO2FBQU0sQ0FBQztZQUNOLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUM7UUFDeEQsQ0FBQztRQUNELGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxJQUFZLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ25ILE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDN0IsSUFBSSxrQkFBbUMsQ0FBQztRQUN4QyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxDQUFDO2FBQU0sQ0FBQztZQUNOLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUM7UUFDekQsQ0FBQztRQUNELGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ2hILE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxrQkFBbUMsQ0FBQztRQUN4QyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDO2FBQU0sQ0FBQztZQUNOLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUM7UUFDckQsQ0FBQztRQUNELGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFZLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ2pILE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxrQkFBaUQsQ0FBQztRQUN0RCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25DLGtCQUFrQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxDQUFDO2FBQU0sQ0FBQztZQUNOLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUM7UUFDdEQsQ0FBQztRQUNELGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ2pFLENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsZ0JBQXFCO1FBQ2hELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsZ0JBQWdCLENBQUM7UUFDbkQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUN4QixNQUFNLGlCQUFpQixHQUFHO1lBQ3hCLFdBQVc7WUFDWCxNQUFNO1lBQ04sU0FBUztZQUNULFVBQVU7U0FDWCxDQUFDO1FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEYsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sb0JBQW9CLEdBQVUsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssTUFBTSxpQkFBaUIsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUNuRCxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLGlCQUFpQixDQUFDO2dCQUNuRCxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN4RCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBQ0QsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUMzRSxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ3JHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDcEIsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLDRCQUE0QixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxpQkFBc0I7UUFDdkQsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLGlCQUFpQixDQUFDO1FBQ3pFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO1FBQ3hDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN4QixJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLE1BQU0sYUFBYSxHQUFHO2dCQUNwQixTQUFTO2dCQUNULFVBQVUsRUFBRSxhQUFhO2dCQUN6QixVQUFVO2FBQ1gsQ0FBQztZQUNGLFlBQVksR0FBRyxNQUFNLElBQUk7aUJBQ3RCLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDaEUsV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEMsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RCxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ25FLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvRCxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7UUFDRCxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBc0IsRUFBRSxZQUFpQixFQUFFLGNBQXVCLEtBQUs7UUFDbkcsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQztRQUNwRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvRCxNQUFNLGtCQUFrQixHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4RixJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdkIsTUFBTSxvQkFBb0IsR0FBVSxFQUFFLENBQUM7WUFDdkMsS0FBSyxNQUFNLGlCQUFpQixJQUFJLGtCQUFrQixFQUFFLENBQUM7Z0JBQ25ELE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsaUJBQWlCLENBQUM7Z0JBQ25ELE1BQU0sZUFBZSxHQUFHLFVBQVUsRUFBRSxlQUFlLElBQUksS0FBSyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsV0FBVyxJQUFJLGVBQWUsRUFBRSxDQUFDO29CQUNwQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFLENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsZ0JBQXFCO1FBQzFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLGdCQUFnQixDQUFDO1FBQ2pFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsWUFBWSxDQUFDO1FBQzlDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDeEIsTUFBTSxpQkFBaUIsR0FBRztZQUN4QixXQUFXO1lBQ1gsTUFBTTtZQUNOLFNBQVM7WUFDVCxVQUFVO1lBQ1YsUUFBUTtZQUNSLFVBQVU7U0FDWCxDQUFDO1FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEYsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sb0JBQW9CLEdBQVUsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssTUFBTSxpQkFBaUIsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUNuRCxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLGlCQUFpQixDQUFDO2dCQUNuRCxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN4RCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBQ0QsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUMzRSxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ3JHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDcEIsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBc0I7UUFDakQsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsaUJBQWlCLENBQUM7UUFDL0YsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDeEMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsTUFBTSxhQUFhLEdBQUc7Z0JBQ3BCLFNBQVM7Z0JBQ1QsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLE1BQU07Z0JBQ2hELFVBQVU7Z0JBQ1YsYUFBYSxFQUFFLFFBQVE7Z0JBQ3ZCLGVBQWUsRUFBRSxVQUFVO2FBQzVCLENBQUM7WUFDRixZQUFZLEdBQUcsTUFBTSxJQUFJO2lCQUN0QixpQkFBaUIsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ2hFLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RDLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxXQUFnQjtRQUNuQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLGlCQUFzQixFQUFFLFlBQWlCLEVBQUUsY0FBdUIsS0FBSztRQUM3RixNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLGlCQUFpQixDQUFDO1FBQ3BELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3hGLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixNQUFNLG9CQUFvQixHQUFVLEVBQUUsQ0FBQztZQUN2QyxLQUFLLE1BQU0saUJBQWlCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQztnQkFDbkQsTUFBTSxlQUFlLEdBQUcsVUFBVSxFQUFFLGVBQWUsSUFBSSxLQUFLLENBQUM7Z0JBQzdELElBQUksQ0FBQyxXQUFXLElBQUksZUFBZSxFQUFFLENBQUM7b0JBQ3BDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDdkUsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxnQkFBcUI7UUFDbkQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQztRQUNyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLFlBQVksQ0FBQztRQUM5QyxNQUFNLG9CQUFvQixHQUFHO1lBQzNCLFdBQVc7WUFDWCxTQUFTO1lBQ1QsUUFBUTtZQUNSLFVBQVU7U0FDWCxDQUFDO1FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sb0JBQW9CLEdBQVUsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssTUFBTSxvQkFBb0IsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUN0RCxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLG9CQUFvQixDQUFDO2dCQUN0RCxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUMzRCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBQ0QsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUMzRSxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ3JHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDcEIsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLCtCQUErQixDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxvQkFBeUI7UUFDN0QsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLG9CQUFvQixDQUFDO1FBQzlFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO1FBQzdCLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN4QixJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDakMsTUFBTSxhQUFhLEdBQVE7Z0JBQ3pCLFNBQVM7Z0JBQ1QsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLFlBQVk7Z0JBQ3RELFVBQVUsRUFBRSxJQUFJO2dCQUNoQixhQUFhLEVBQUUsUUFBUTtnQkFDdkIsZUFBZSxFQUFFLFVBQVU7YUFDNUIsQ0FBQztZQUNGLFlBQVksR0FBRyxNQUFNLElBQUk7aUJBQ3RCLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDaEUsV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEMsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLG9CQUFvQixFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2pDLENBQUM7UUFDRCxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxvQkFBeUIsRUFBRSxZQUFpQixFQUFFLGNBQXVCLEtBQUs7UUFDekcsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLG9CQUFvQixDQUFDO1FBQzNDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixNQUFNLG9CQUFvQixHQUFVLEVBQUUsQ0FBQztZQUN2QyxLQUFLLE1BQU0sb0JBQW9CLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQztnQkFDdEQsTUFBTSxlQUFlLEdBQUcsVUFBVSxFQUFFLGVBQWUsSUFBSSxLQUFLLENBQUM7Z0JBQzdELElBQUksQ0FBQyxXQUFXLElBQUksZUFBZSxFQUFFLENBQUM7b0JBQ3BDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDMUUsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxnQkFBcUI7UUFDbkQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQUcsZ0JBQWdCLENBQUM7UUFDakUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLFlBQVksQ0FBQztRQUN6QyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO1FBQ3hCLE1BQU0saUJBQWlCLEdBQUc7WUFDeEIsV0FBVztZQUNYLE1BQU07WUFDTixTQUFTO1lBQ1QsVUFBVTtZQUNWLGVBQWU7U0FDaEIsQ0FBQztRQUNGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3hGLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixNQUFNLG9CQUFvQixHQUFVLEVBQUUsQ0FBQztZQUN2QyxLQUFLLE1BQU0saUJBQWlCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQztnQkFDbkQsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDeEQsb0JBQW9CLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDakQsQ0FBQztZQUNELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDM0UsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQztZQUNyRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU87WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQywrQkFBK0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxLQUFLLENBQUMsK0JBQStCLENBQUMsaUJBQXNCO1FBQzFELE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLEdBQUcsaUJBQWlCLENBQUM7UUFDMUYsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDeEMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsTUFBTSxhQUFhLEdBQUc7Z0JBQ3BCLFNBQVM7Z0JBQ1QsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLFNBQVM7Z0JBQ25ELFVBQVU7Z0JBQ1YsZUFBZTthQUNoQixDQUFDO1lBQ0YsWUFBWSxHQUFHLE1BQU0sSUFBSTtpQkFDdEIsaUJBQWlCLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNoRSxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDakMsQ0FBQztRQUNELFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFDLDBCQUEwQixDQUFDLGlCQUFzQixFQUFFLFlBQWlCLEVBQUUsY0FBdUIsS0FBSztRQUN0RyxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLGlCQUFpQixDQUFDO1FBQ3BELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3hGLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixNQUFNLG9CQUFvQixHQUFVLEVBQUUsQ0FBQztZQUN2QyxLQUFLLE1BQU0saUJBQWlCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQztnQkFDbkQsTUFBTSxlQUFlLEdBQUcsVUFBVSxFQUFFLGVBQWUsSUFBSSxLQUFLLENBQUM7Z0JBQzdELElBQUksQ0FBQyxXQUFXLElBQUksZUFBZSxFQUFFLENBQUM7b0JBQ3BDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDdkUsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBcUI7UUFDM0MsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLGdCQUFnQixDQUFDO1FBQ3ZDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsTUFBTSxpQkFBaUIsR0FBRztZQUN4QixXQUFXO1lBQ1gsU0FBUztTQUNWLENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUQsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sb0JBQW9CLEdBQVUsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssTUFBTSxpQkFBaUIsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUNuRCxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLGlCQUFpQixDQUFDO2dCQUNuRCxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN4RCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBQ0QsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUMzRSxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ3JHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDcEIsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBc0I7UUFDbEQsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQztRQUNyRCxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEIsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLE1BQU0sYUFBYSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJO2FBQzVCLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDakUsV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzVFLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDakMsQ0FBQztRQUNELFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGlCQUFzQixFQUFFLFlBQWlCLEVBQUUsY0FBdUIsS0FBSztRQUM5RixNQUFNLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxHQUFHLGlCQUFpQixDQUFDO1FBQ3pELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzdGLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixNQUFNLG9CQUFvQixHQUFVLEVBQUUsQ0FBQztZQUN2QyxLQUFLLE1BQU0saUJBQWlCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQztnQkFDbkQsTUFBTSxlQUFlLEdBQUcsVUFBVSxFQUFFLGVBQWUsSUFBSSxLQUFLLENBQUM7Z0JBQzdELElBQUksQ0FBQyxXQUFXLElBQUksZUFBZSxFQUFFLENBQUM7b0JBQ3BDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDdkUsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELDBCQUEwQixDQUFDLFdBQW1CLEVBQUUsZUFBd0I7UUFDdEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN6QyxNQUFNLG9CQUFvQixHQUFHLGVBQWUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLGFBQWEsQ0FBQTtRQUNqRyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ2hILE9BQU8sQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELDBCQUEwQixDQUFDLFdBQW1CLEVBQUUsZUFBd0I7UUFDdEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxXQUFXLEVBQzNELElBQUksQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsZUFBZSxFQUNuRCxJQUFJLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3RELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM1QixNQUFNLG1CQUFtQixHQUFVLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hGLElBQUksbUJBQW1CLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFdBQVcsRUFDM0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxlQUFlLEVBQ25ELElBQUksQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsYUFBYSxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDaEcsS0FBSyxNQUFNLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9DLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUM1QixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLHFCQUFxQixHQUFVLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQzFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsZUFBZSxJQUFJLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6RCxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxXQUFXLEVBQzNELElBQUksQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsZUFBZSxFQUNuRCxJQUFJLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDeEQsS0FBSyxNQUFNLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pELElBQUksb0JBQW9CLEVBQUUsQ0FBQztvQkFDekIsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQy9CLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELHVCQUF1QixDQUFDLFFBQWEsRUFBRSxlQUFvQixJQUFJO1FBQzdELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sV0FBVyxHQUFHLFdBQVcsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sV0FBVyxHQUFHLFdBQVcsRUFBRSxXQUFXLENBQUM7UUFDN0MsSUFBSSxXQUFXLElBQUksV0FBVyxFQUFFLENBQUM7WUFDL0IsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hFLE1BQU0sSUFBSSxHQUFHLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQztnQkFDdEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELElBQUksS0FBSyxFQUFFLENBQUM7b0JBQ1YsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDNUIsS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQzNCLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFFSDs7T0FFRztJQUNILElBQUksUUFBUSxLQUFhLE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWxEOztPQUVHO0lBQ0gsSUFBSSxRQUFRLENBQUMsSUFBWSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUVoRDs7T0FFRztJQUNILElBQUksZUFBZSxLQUFLLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU3Qzs7T0FFRztJQUNILElBQUksWUFBWSxLQUFhLE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXZEOztPQUVHO0lBQ0gsSUFBSSxZQUFZLENBQUMsS0FBYSxJQUFJLElBQUksRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTdEOztPQUVHO0lBQ0gsSUFBSSxTQUFTLEtBQWEsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFekQ7O09BRUc7SUFDSCxJQUFJLFNBQVMsQ0FBQyxLQUFhLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRXpEOztPQUVHO0lBQ0gsb0JBQW9CLENBQUMsS0FBK0IsRUFBRSxRQUFpQyxFQUFFLGFBQXlDLElBQUk7UUFDcEksT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxzQkFBc0IsQ0FBQyxLQUErQixFQUFFLFFBQWlDLEVBQUUsYUFBeUMsSUFBSTtRQUN0SSxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQixDQUFDLEtBQStCLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ3BJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNILHFCQUFxQixDQUFDLEtBQStCLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ3JJLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7T0FFRztJQUNILHVCQUF1QixDQUFDLEtBQStCLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ3ZJLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7T0FFRztJQUNILHVCQUF1QixDQUFDLEtBQStCLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ3ZJLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsd0JBQXdCLENBQUMsS0FBK0IsRUFBRSxRQUFpQyxFQUFFLGFBQXlDLElBQUk7UUFDeEksT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsVUFBa0IsRUFBRSxRQUFpQyxFQUFFLGFBQXlDLElBQUk7UUFDcEksT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLENBQUMsSUFBWSxFQUFFLFVBQWtCLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ3JJLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7T0FFRztJQUNILHNCQUFzQixDQUFDLElBQVksRUFBRSxRQUFpQyxFQUFFLGFBQXlDLElBQUk7UUFDbkgsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCx1QkFBdUIsQ0FBQyxJQUFZLEVBQUUsUUFBaUMsRUFBRSxhQUF5QyxJQUFJO1FBQ3BILE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLENBQUMsSUFBWSxFQUFFLFFBQWlDLEVBQUUsYUFBeUMsSUFBSTtRQUNqSCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNILHFCQUFxQixDQUFDLElBQVksRUFBRSxRQUFpQyxFQUFFLGFBQXlDLElBQUk7UUFDbEgsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUIsQ0FBQyxNQUFXO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7d0dBNTZDbUIsa0JBQWtCOzRGQUFsQixrQkFBa0IsK0ZBSDVCLDJCQUEyQjs7NEZBR2pCLGtCQUFrQjtrQkFMdkMsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBzaWduYWwsIE9uSW5pdCwgaW5qZWN0LCBEZXN0cm95UmVmLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybVN0cnVjdHVyZUFuZERhdGEgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Zvcm1zL2Zvcm0nO1xuaW1wb3J0IHsgTGliRm9ybU1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9ybS1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGliRXZlbnRNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V2ZW50LW1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMaWJGaWxlTWFuYWdlbWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWxlLW1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtQWN0aW9uVHlwZSwgTk9fRVJST1IgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Zvcm1zL2Zvcm0uY29uc3RhbnRzJztcbmltcG9ydCB7IEZpZWxkRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvZmllbGQnO1xuaW1wb3J0IHsgUmVjb3JkRm9ybVNlY3Rpb24gfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Zvcm1zL3NlY3Rpb24nO1xuaW1wb3J0IHsgRXZlbnRDYWxsYmFjayB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZm9ybS1jb25maWcuaW50ZXJmYWNlJztcblxuY29uc3QgUEFZTE9BRF9WRVJTSU9OID0gJ1RVQUlORVhDSEFOR0VfMS4wJztcbmNvbnN0IElOTElORV9BQ1RJT04gPSAnSU5MSU5FJztcbmNvbnN0IEdMT0JBTF9BQ1RJT04gPSAnR0xPQkFMJztcbmNvbnN0IEdFVF9EQVRBX0FDVElPTiA9ICdHRVREQVRBJztcblxuY29uc3QgU1VCSkVDVCA9ICdzdWJqZWN0JztcbmNvbnN0IFRPS0VOID0gJ3Rva2VuJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2ljRm9ybUNvbXBvbmVudCBleHRlbmRzIEZvcm1TdHJ1Y3R1cmVBbmREYXRhIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHByaXZhdGUgX2NvbnRyb2xUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX29yaWdpblRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZm9ybVJvdXRlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZGVmaW5pdGlvbk9idGFpbmVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX25vdGlmeUZvcm1BY3Rpdml0eTogYm9vbGVhbiA9IHRydWU7XG4gIC8vIEV2ZW50b3MgZGUgYWNjaW9uZXMgeSBjYW1wb3NcbiAgcHJpdmF0ZSBfZm9ybUNoYW5nZVN0YXRlOiAoKHN0YXRlOiBzdHJpbmcpID0+IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSBfZm9ybVNlY3Rpb25zQ2FuRGVhY3RpdmF0ZTogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPiA9IHt9O1xuICBwcml2YXRlIF9mb3JtU2VjdGlvbnNBY3RpdmF0ZTogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPiA9IHt9O1xuICBwcml2YXRlIF9mb3JtU2VjdGlvbnNJbmFjdGl2YXRlOiBSZWNvcmQ8c3RyaW5nLCBFdmVudENhbGxiYWNrW10+ID0ge307XG4gIHByaXZhdGUgX2Zvcm1BY3Rpb25zU3RhcnQ6IFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT4gPSB7fTtcbiAgcHJpdmF0ZSBfZm9ybUFjdGlvbnNGaW5pc2g6IFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT4gPSB7fTtcbiAgcHJpdmF0ZSBfZmllbGRDdXN0b21FdmVudDogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPiA9IHt9O1xuICBwcml2YXRlIF9maWVsZElucHV0VmFsaWRhdGlvbjogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPiA9IHt9O1xuICBwcml2YXRlIF9maWVsZFZhbGlkYXRpb25zU3RhcnQ6IFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT4gPSB7fTtcbiAgcHJpdmF0ZSBfZmllbGRWYWxpZGF0aW9uc0ZpbmlzaDogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPiA9IHt9O1xuICAvLyBDYWxsYmFjayBkZSBhY2Npb25lcyBkZSB0YWJsYXNcbiAgcHJpdmF0ZSBfdGFibGVTZWxlY3Rpb25zU3RhcnQ6IFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT4gPSB7fTtcbiAgcHJpdmF0ZSBfdGFibGVTZWxlY3Rpb25zRmluaXNoOiBSZWNvcmQ8c3RyaW5nLCBFdmVudENhbGxiYWNrW10+ID0ge307XG4gIHByaXZhdGUgX3RhYmxlQWN0aW9uc1N0YXJ0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBFdmVudENhbGxiYWNrW10+PiA9IHt9O1xuICBwcml2YXRlIF90YWJsZUFjdGlvbnNGaW5pc2g6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT4+ID0ge307XG4gIHByaXZhdGUgX3RhYmxlR2V0RGF0YVN0YXJ0OiBSZWNvcmQ8c3RyaW5nLCBFdmVudENhbGxiYWNrW10+ID0ge307XG4gIHByaXZhdGUgX3RhYmxlR2V0RGF0YUZpbmlzaDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFjaz4+ID0ge307XG4gIC8vIEVycm9yZXMgZW4gcHJvY2Vzb3NcbiAgcHJpdmF0ZSBfYWN0aW9uU2VydmVyRXJyb3I6IEV2ZW50Q2FsbGJhY2tbXSA9IFtdO1xuICBwcml2YXRlIF9maWVsZFNlcnZlckVycm9yOiBFdmVudENhbGxiYWNrW10gPSBbXTtcbiAgcHJpdmF0ZSBfdGFibGVTZXJ2ZXJFcnJvcjogRXZlbnRDYWxsYmFja1tdID0gW107XG4gIC8vIEFjY2lvbmVzIGVuIGN1cnNvIGRlbnRybyBkZWwgZm9ybXVsYXJpb1xuICBwcml2YXRlIF9hY3Rpb25zSW5Qcm9ncmVzczogUmVjb3JkPHN0cmluZywgeyBzZW50OiBEYXRlIH0+ID0ge307XG4gIHByaXZhdGUgX3NlcnZlckFjdGlvbnNJblByb2dyZXNzOiBSZWNvcmQ8c3RyaW5nLCB7IHNlbnQ6IERhdGUgfT4gPSB7fTtcbiAgLy8gRGF0b3MgY29tcGxlbWVudGFyaW9zIGRlbCBmb3JtdWxhcmlvXG4gIHByb3RlY3RlZCBpbnB1dERhdGFGaWVsZHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgcHJvdGVjdGVkIGV4dHJhRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICBwcm90ZWN0ZWQgX2V2ZW50RW1pdGVyOiBMaWJFdmVudE1hbmFnZXJTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZW5hYmxlZFNlY3Rpb25zOiBSZWNvcmRGb3JtU2VjdGlvbltdID0gW107XG4gIC8vIEdlc3Rpw7NuIGRlIGVycm9yXG4gIF9lcnJvclR5cGU6IHN0cmluZyA9ICcnO1xuICBlcnJvckNvZGU6IHN0cmluZyA9ICcnO1xuICBlcnJvckZ1bGxDb2RlOiBzdHJpbmcgPSAnJztcbiAgZXJyb3JOYW1lOiBzdHJpbmcgPSAnJztcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgZXJyb3JEZXRhaWw6IHN0cmluZyA9ICcnO1xuXG4gIC8vIENvbnRyb2wgZGUgZXN0YWRvXG4gIHZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYnVzeSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1NYW5hZ2VyU2VydmljZTogTGliRm9ybU1hbmFnZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBfZXZlbnRNYW5hZ2VyOiBMaWJFdmVudE1hbmFnZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBmaWxlTWdtdFNlcnZpY2VzOiBMaWJGaWxlTWFuYWdlbWVudFNlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2V2ZW50RW1pdGVyID0gdGhpcy5fZXZlbnRNYW5hZ2VyO1xuICAgIHRoaXMuY2xlYW5TdGFydCgpO1xuICB9XG5cbiAgY2xlYW5TdGFydCgpIHtcbiAgICB0aGlzLl9lcnJvclR5cGUgPSAnJztcbiAgICB0aGlzLmVycm9yQ29kZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JGdWxsQ29kZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JOYW1lID0gJyc7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLmVycm9yRGV0YWlsID0gJyc7XG4gICAgdGhpcy5jbGVhbkZvcm0oKTtcbiAgICB0aGlzLl9jb250cm9sVG9rZW4gPSBudWxsO1xuICAgIHRoaXMuaW5wdXREYXRhRmllbGRzID0ge307XG4gICAgdGhpcy5fZGVmaW5pdGlvbk9idGFpbmVkID0gZmFsc2U7XG4gICAgLy8gU2UgbGltcGlhbiBsb3MgbWFuZWphZG9yZXMgZGUgZXZlbnRvc1xuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuX2Zvcm1DaGFuZ2VTdGF0ZSA9IFtdO1xuICAgIHRoaXMuX2Zvcm1TZWN0aW9uc0NhbkRlYWN0aXZhdGUgPSB7fTtcbiAgICB0aGlzLl9mb3JtU2VjdGlvbnNBY3RpdmF0ZSA9IHt9O1xuICAgIHRoaXMuX2Zvcm1TZWN0aW9uc0luYWN0aXZhdGUgPSB7fTtcbiAgICB0aGlzLl9mb3JtQWN0aW9uc1N0YXJ0ID0ge307XG4gICAgdGhpcy5fZm9ybUFjdGlvbnNGaW5pc2ggPSB7fTtcbiAgICB0aGlzLl9maWVsZEN1c3RvbUV2ZW50ID0ge307XG4gICAgdGhpcy5fZmllbGRJbnB1dFZhbGlkYXRpb24gPSB7fTtcbiAgICB0aGlzLl9maWVsZFZhbGlkYXRpb25zU3RhcnQgPSB7fTtcbiAgICB0aGlzLl9maWVsZFZhbGlkYXRpb25zRmluaXNoID0ge307XG4gICAgdGhpcy5fdGFibGVTZWxlY3Rpb25zU3RhcnQgPSB7fTtcbiAgICB0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2ggPSB7fTtcbiAgICB0aGlzLl90YWJsZUFjdGlvbnNTdGFydCA9IHt9O1xuICAgIHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaCA9IHt9O1xuICAgIHRoaXMuX3RhYmxlR2V0RGF0YVN0YXJ0ID0ge307XG4gICAgdGhpcy5fdGFibGVHZXREYXRhRmluaXNoID0ge307XG5cbiAgICB0aGlzLl9hY3Rpb25TZXJ2ZXJFcnJvciA9IFtdO1xuICAgIHRoaXMuX2ZpZWxkU2VydmVyRXJyb3IgPSBbXTtcbiAgICB0aGlzLl90YWJsZVNlcnZlckVycm9yID0gW107XG5cbiAgICB0aGlzLm9uQWN0aW9uU2VydmVyRXJyb3IoKCkgPT4gdGhpcy5kaXNwbGF5QWN0aW9uU2VydmVyRXJyb3IoKSk7XG4gICAgdGhpcy5vblZhbGlkYXRpb25TZXJ2ZXJFcnJvcigoKSA9PiB0aGlzLmRpc3BsYXlWYWxpZGF0aW9uU2VydmVyRXJyb3IoKSk7XG4gICAgdGhpcy5vblRhYmxlU2VydmVyRXJyb3IoKCkgPT4gdGhpcy5kaXNwbGF5VGFibGVTZXJ2ZXJFcnJvcigpKTtcbiAgfVxuXG4gIGdldCBmb3JtVmlzaWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMudmlzaWJsZTsgfVxuICBnZXQgZm9ybSgpIHsgcmV0dXJuIHRoaXM7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnByZVN0YXJ0KCk7XG4gICAgdGhpcy5jdXN0b21QcmVQcm9jZXNzaW5nKCk7XG4gIH1cblxuICAvLyBNw6l0b2RvcyB2aXJ0dWFsZXNcbiAgcHJlU3RhcnQoKSB7IH1cbiAgc3RhcnQoKSB7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2UgcHJlU3RhcnQgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGN1c3RvbVByZVByb2Nlc3NpbmcoKSB7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBPdmVybG9hZCBzdGFydCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgY3VzdG9tRm9ybVN0YXJ0KCkgeyB9XG5cbiAgZGlzcGxheUFjdGlvblNlcnZlckVycm9yKCkgeyB9XG4gIGRpc3BsYXlWYWxpZGF0aW9uU2VydmVyRXJyb3IoKSB7IH1cbiAgZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKSB7IH1cbiAgc2hvd0ZpZWxkSW5mbyhjb2RlPzogc3RyaW5nLCBkZXRhaWw/OiBhbnkpIHsgfVxuICBzaG93TW9kYWxEaWFsb2codGl0bGU6IGFueSwgYm9keTogYW55LCBvcHRpb25zOiBhbnksIGNhbGxiYWNrPzogYW55LCBwYXJhbXM/OiBhbnkpIHsgfVxuICBvcGVuVXBsb2FkRGlhbG9nKHRpdGxlOiBhbnksIGJvZHk6IGFueSwgb3B0aW9uczogYW55LCBjYWxsYmFjaz86IGFueSwgcGFyYW1zPzogYW55KSB7IH1cblxuICBzdWJzY3JpYmVBcHBFdmVudChldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogdm9pZCB7XG4gICAgdGhpcy5fZXZlbnRFbWl0ZXIuc3Vic2NyaWJlKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xuICB9XG5cbiAgb3BlbkZvcm0obmFtZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsLCBiYWNrRGF0YTogYW55ID0gbnVsbCwgY2xlYW5TdGFjayA9IGZhbHNlKTogdm9pZCB7XG4gICAgbGV0IG9yaWdpbjogYW55ID0gbnVsbDtcbiAgICBpZiAoIWNsZWFuU3RhY2spIHtcbiAgICAgIG9yaWdpbiA9IHsgLi4uYmFja0RhdGEsIG5hbWU6IHRoaXMubmFtZSwgdXJsOiB0aGlzLl9mb3JtUm91dGUsIHRva2VuOiB0aGlzLl9jb250cm9sVG9rZW4gfTtcbiAgICAgIG9yaWdpbi5zdWJqZWN0ID0gb3JpZ2luPy5zdWJqZWN0ID8/IHRoaXMuc3ViamVjdDtcbiAgICAgIG9yaWdpbi5zdGF0ZSA9IG9yaWdpbj8uc3RhdGUgPz8gdGhpcy5zdGF0ZTtcbiAgICAgIG9yaWdpbi5maWVsZHMgPSBvcmlnaW4/LmZpZWxkcyA/PyB7fTtcbiAgICAgIG9yaWdpbi5leHRyYSA9IG9yaWdpbj8uZXh0cmEgPz8ge307XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IHsgLi4uZGF0YSwgbmFtZSB9O1xuICAgIHRhcmdldC5zdWJqZWN0ID0gdGFyZ2V0Py5zdWJqZWN0ID8/IG51bGw7XG4gICAgdGFyZ2V0LnN0YXRlID0gdGFyZ2V0Py5zdGF0ZSA/PyBudWxsO1xuICAgIHRhcmdldC5maWVsZHMgPSB0YXJnZXQ/LmZpZWxkcyA/PyB7fTtcbiAgICB0YXJnZXQuZXh0cmEgPSB0YXJnZXQ/LmV4dHJhID8/IHt9O1xuICAgIHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLm9wZW5Gb3JtKG9yaWdpbiwgdGFyZ2V0KTtcbiAgfVxuXG4gIGVuYWJsZUFjdGl2aXR5Tm90aWZpY2F0aW9uKCkgeyB0aGlzLl9ub3RpZnlGb3JtQWN0aXZpdHkgPSB0cnVlOyB9XG4gIGRpc2FibGVBY3Rpdml0eU5vdGlmaWNhdGlvbigpIHsgdGhpcy5fbm90aWZ5Rm9ybUFjdGl2aXR5ID0gZmFsc2U7IH1cbiAgY2FuR29CYWNrKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fb3JpZ2luVG9rZW4gIT09IG51bGwgfVxuICBnb0JhY2soKTogdm9pZCB7IHJldHVybiB0aGlzLmZvcm1NYW5hZ2VyU2VydmljZS5iYWNrVG8oKTsgfVxuICBnb0JhY2tGb3JtKCk6IHZvaWQgeyByZXR1cm4gdGhpcy5nb0JhY2soKTsgfVxuICBnZXRPcmlnaW5EZXRhaWwoKTogYW55IHsgcmV0dXJuIHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlPy5nZXRGb3JtSW5mbyh0aGlzLl9vcmlnaW5Ub2tlbiA/PyAnJyk7IH1cblxuICBzZXRFcnJvcihlcnJvclR5cGU6IHN0cmluZyB8IG51bGwsIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgbnVsbCwgZXJyb3JEZXRhaWw6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9lcnJvclR5cGUgPSBlcnJvclR5cGUgfHwgJyc7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UgfHwgJyc7XG4gICAgdGhpcy5lcnJvckRldGFpbCA9IGVycm9yRGV0YWlsIHx8ICcnO1xuICB9XG5cbiAgcmVzZXRFcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLmVycm9yQ29kZSA9IE5PX0VSUk9SO1xuICAgIHRoaXMuZXJyb3JGdWxsQ29kZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JOYW1lID0gJyc7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLmVycm9yRGV0YWlsID0gJyc7XG4gIH1cblxuICBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2Vycm9yVHlwZTsgfVxuICBnZXRFcnJvck1lc3NhZ2UoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZXJyb3JNZXNzYWdlOyB9XG4gIGdldEVycm9yRGV0YWlsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmVycm9yRGV0YWlsOyB9XG4gIGdldEVycm9yTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5lcnJvck5hbWU7IH1cbiAgZ2V0RXJyb3JGdWxsQ29kZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5lcnJvckZ1bGxDb2RlOyB9XG4gIGdldEVycm9yQ29kZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5lcnJvckNvZGU7IH1cblxuICBnZXRGb3JtUGFyYW1ldGVyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChuYW1lKSA/ICh0aGlzLmV4dHJhRGF0YT8uW25hbWVdID8/IG51bGwpIDogbnVsbDtcbiAgfVxuXG4gIHByb2Nlc3NJbnB1dFBhcmFtcyhwYXJhbXM6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIHRoaXMuX2NvbnRyb2xUb2tlbiA9IHBhcmFtcz8uW1RPS0VOXSA/PyBudWxsO1xuICAgIHRoaXMuc3ViamVjdCA9IHBhcmFtcz8uW1NVQkpFQ1RdID8/IG51bGw7XG4gICAgY29uc3QgdG9rZW5JbmZvOiBhbnkgPSAodGhpcy5fY29udHJvbFRva2VuKSA/IHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLmdldEZvcm1JbmZvKHRoaXMuX2NvbnRyb2xUb2tlbikgOiB7fTtcbiAgICBjb25zdCB7IHRva2VuLCBzdWJqZWN0LCBzdGF0ZSwgZmllbGRzLCBleHRyYSwgb3JpZ2luVG9rZW4gfSA9IHRva2VuSW5mbztcbiAgICBpZiAodG9rZW4gJiYgdGhpcy5fY29udHJvbFRva2VuID09PSB0b2tlbikge1xuICAgICAgdGhpcy5zdWJqZWN0ID0gdGhpcy5zdWJqZWN0ID8/IHN1YmplY3QgPz8gbnVsbDtcbiAgICAgIHRoaXMuaW5wdXREYXRhRmllbGRzID0gZmllbGRzO1xuICAgICAgdGhpcy5leHRyYURhdGEgPSBleHRyYTtcbiAgICAgIHRoaXMuX29yaWdpblRva2VuID0gb3JpZ2luVG9rZW47XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3Vic2NyaWJlU2VjdGlvbkFjdGl2YXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybVNlY3Rpb25zID0gdGhpcy5zZWN0aW9ucztcbiAgICBjb25zdCBzZWN0aW9uTmFtZXMgPSBPYmplY3Qua2V5cyhmb3JtU2VjdGlvbnMpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzZWN0aW9uTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBzZWN0aW9uTmFtZSA9IHNlY3Rpb25OYW1lc1tpbmRleF07XG4gICAgICBjb25zdCBzZWN0aW9uID0gZm9ybVNlY3Rpb25zW3NlY3Rpb25OYW1lXTtcbiAgICAgIHNlY3Rpb24uYWN0aXZhdGlvblxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoY29kZTogc3RyaW5nKSA9PiB0aGlzLmxhdW5jaFNlY3Rpb25BY3RpdmF0aW9uKGNvZGUpKTtcbiAgICAgIHNlY3Rpb24uaW5hY3RpdmF0aW9uXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAuc3Vic2NyaWJlKChjb2RlOiBzdHJpbmcpID0+IHRoaXMubGF1bmNoU2VjdGlvbkluYWN0aXZhdGlvbihjb2RlKSk7XG4gICAgICAvLyBBZGljaW9uYWxtZW50ZSBzZSBsZSBwaWRlIGEgbGEgc2VjY2nDs24gc2Ugc3Vic2NyaWJhIGFsIGNhbWJpbyBkZSBlc3RhZG8gZGVsIGZvcm11bGFyaW9cbiAgICAgIHNlY3Rpb24uY29ubmVjdFdpdGhQYXJlbnRGb3JtKHRoaXMsIHRoaXMuc3RhdGVDaGFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZUZpZWxkc1N1YmplY3RzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1GaWVsZHMgPSB0aGlzLmdldEZpZWxkcygpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1GaWVsZHMpKSB7XG4gICAgICBmb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICBmaWVsZC5jdXN0b21FdmVudFxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgZXZlbnROYW1lLCBldmVudERhdGEgfSA9IGV2ZW50O1xuICAgICAgICAgICAgdGhpcy5zdGFydEZpZWxkQ3VzdG9tRXZlbnQoY29kZSwgZXZlbnROYW1lLCBldmVudERhdGEpO1xuICAgICAgICAgIH0pO1xuICAgICAgICBmaWVsZC5lZGl0aW9uRmluaXNoXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uIH0gPSBldmVudDtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRGaWVsZFZhbGlkYXRpb24oY29kZSwgaW50cmluc2ljVmFsaWRhdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIGZpZWxkLmVkaXRpb25QYXJ0aWFsXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uIH0gPSBldmVudDtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRGaWVsZElucHV0VmFsaWRhdGlvbihjb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgZmllbGQuZGV0YWlsUmVxdWVzdFxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHRoaXMuc2hvd0ZpZWxkSW5mbyhldmVudC5jb2RlLCBldmVudC5kZXRhaWwpKTtcbiAgICAgICAgLy8gQWRpY2lvbmFsbWVudGUgc2UgbGUgcGlkZSBhbCBjYW1wbyBzZSBzdWJzY3JpYmEgYWwgY2FtYmlvIGRlIGVzdGFkbyBkZWwgZm9ybXVsYXJpb1xuICAgICAgICBmaWVsZC5jb25uZWN0V2l0aFBhcmVudEZvcm0odGhpcywgdGhpcy5zdGF0ZUNoYW5nZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdWJzY3JpYmVBY3Rpb25TdWJqZWN0cygpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtQWN0aW9ucyA9IHRoaXMuZ2V0QWN0aW9ucygpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1BY3Rpb25zKSkge1xuICAgICAgZm9ybUFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICBhY3Rpb24uYWN0aW9uQWN0aXZhdGVkXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgLnN1YnNjcmliZSgoY29kZTogc3RyaW5nKSA9PiB0aGlzLnN0YXJ0QWN0aW9uKGNvZGUpKTtcbiAgICAgICAgLy8gQWRpY2lvbmFsbWVudGUgc2UgbGUgcGlkZSBhIGxhIGFjY2nDs24gc2Ugc3Vic2NyaWJhIGFsIGNhbWJpbyBkZSBlc3RhZG8gZGVsIGZvcm11bGFyaW9cbiAgICAgICAgYWN0aW9uLmNvbm5lY3RXaXRoUGFyZW50Rm9ybSh0aGlzLCB0aGlzLnN0YXRlQ2hhbmdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZVRhYmxlU3ViamVjdHMoKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybVRhYmxlcyA9IHRoaXMuZ2V0VGFibGVzKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybVRhYmxlcykpIHtcbiAgICAgIGZvcm1UYWJsZXMuZm9yRWFjaCh0YWJsZSA9PiB7XG4gICAgICAgIHRhYmxlLmlubGluZUFjdGlvblRyaWdnZXJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB0aGlzLnN0YXJ0VGFibGVBY3Rpb24oZXZlbnQpKTtcbiAgICAgICAgdGFibGUuZ2xvYmFsQWN0aW9uVHJpZ2dlclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHRoaXMuc3RhcnRUYWJsZUdsb2JhbEFjdGlvbihldmVudCkpO1xuICAgICAgICB0YWJsZS5yZWNvcmRTZWxlY3Rpb25UcmlnZ2VyXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4gdGhpcy5zdGFydFRhYmxlUmVjb3JkU2VsZWN0aW9uKGV2ZW50KSk7XG4gICAgICAgIHRhYmxlLnNlbGVjdGlvbkFjdGlvblRyaWdnZXJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB0aGlzLnN0YXJ0VGFibGVTZWxlY3Rpb25BY3Rpb24oZXZlbnQpKTtcbiAgICAgICAgdGFibGUuZ2V0RGF0YVRyaWdnZXJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB0aGlzLnN0YXJ0VGFibGVHZXREYXRhKGV2ZW50KSk7XG4gICAgICAgIC8vIEFkaWNpb25hbG1lbnRlIHNlIGxlIHBpZGUgYSBsYSB0YWJsYSBzZSBzdWJzY3JpYmEgYWwgY2FtYmlvIGRlIGVzdGFkbyBkZWwgZm9ybXVsYXJpb1xuICAgICAgICB0YWJsZS5jb25uZWN0V2l0aFBhcmVudEZvcm0odGhpcywgdGhpcy5zdGF0ZUNoYW5nZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmb3JtSW5pdChwYXJhbXM6IGFueSwgZm9yY2VSZWxvYWQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbml0aWFsU3RhdGU6IHN0cmluZyB8IG51bGwgPSB0aGlzLnByb2Nlc3NJbnB1dFBhcmFtcyhwYXJhbXMpO1xuICAgIGlmICghdGhpcy5uYW1lKSB7IHJldHVybjsgfVxuICAgIHRyeSB7XG4gICAgICBpZiAoZm9yY2VSZWxvYWQgfHwgIXRoaXMuX2RlZmluaXRpb25PYnRhaW5lZCkge1xuICAgICAgICB0aGlzLmJ1c3kuc2V0KHRydWUpO1xuICAgICAgICBjb25zdCBmb3JtRGVmaW5pdGlvbiA9IGF3YWl0IHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLmdldEZvcm1EZWZpbml0aW9uKHRoaXMubmFtZSk7XG4gICAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmxvYWREZWZpbml0aW9uKGZvcm1EZWZpbml0aW9uKVxuICAgICAgICB0aGlzLl9kZWZpbml0aW9uT2J0YWluZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbGVhbkRhdGEoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmJ1c3kuc2V0KGZhbHNlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGxvYWRpbmcgZm9ybSBkZWZpbml0aW9uIGZvciAke3RoaXMubmFtZX06ICR7ZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnN1cHBvcnRTdGF0ZShpbml0aWFsU3RhdGUgPz8gJycpKSB7XG4gICAgICBpbml0aWFsU3RhdGUgPSB0aGlzLmRlZmF1bHRTdGF0ZSA/PyBudWxsO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dEZpZWxkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmlucHV0RGF0YUZpZWxkcyk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGlucHV0RmllbGROYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dEZpZWxkTmFtZXNbaW5kZXhdO1xuICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHRoaXMuaW5wdXREYXRhRmllbGRzW2NvZGVdO1xuICAgICAgdGhpcy5zZXRGaWVsZFZhbHVlKGNvZGUsIGZpZWxkVmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZVNlY3Rpb25BY3RpdmF0aW9uKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVGaWVsZHNTdWJqZWN0cygpO1xuICAgIHRoaXMuc3Vic2NyaWJlQWN0aW9uU3ViamVjdHMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRhYmxlU3ViamVjdHMoKTtcbiAgICAvLyBTZSBkZWZpbmUgZWwgZXN0YWRvIGluaWNpYWwgeSBzZSBzb2xpY2l0YSBsYSBhY2Npw7NuIGluaWNpYWxcbiAgICB0aGlzLmNoYW5nZVN0YXRlKGluaXRpYWxTdGF0ZSB8fCB0aGlzLmRlZmF1bHRTdGF0ZSk7XG4gICAgaWYgKHRoaXMubG9hZEluaXRpYWxEYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWNvcmRSZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdEZvcm1BY3Rpb24oRm9ybUFjdGlvblR5cGUuR2V0RGF0YSk7XG4gICAgICAgIHRoaXMuY2hlY2tFcnJvclJlY29yZFJlY2VpdmVkKHJlY29yZFJlc3BvbnNlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbG9hZGluZyBpbml0aWFsIGRhdGEgZm9yICR7dGhpcy5uYW1lfTogJHtlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMuZW5hYmxlZFNlY3Rpb25zID0gdGhpcy52aXNpYmxlU2VjdGlvbnMgPz8gW107XG5cbiAgICB0aGlzLnN0YXJ0KCk7XG4gICAgdGhpcy5jdXN0b21Gb3JtU3RhcnQoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNoYW5nZVN0YXRlKHN0YXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGF0ZUNoYW5nZWQgPSBzdXBlci5jaGFuZ2VTdGF0ZShzdGF0ZSA/PyAnJykgPz8gZmFsc2U7XG4gICAgaWYgKHN0YXRlQ2hhbmdlZCkge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uTWV0aG9kcyA9IHRoaXMuX2Zvcm1DaGFuZ2VTdGF0ZTtcbiAgICAgIGlmIChjbGllbnRBY3Rpb25NZXRob2RzICYmIGNsaWVudEFjdGlvbk1ldGhvZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNsaWVudEFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgICBjYWxsYmFjayhzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlQ2hhbmdlZDtcbiAgfVxuXG4gIGNoZWNrRXJyb3JSZWNvcmRSZWNlaXZlZChyZWNvcmRSZXNwb25zZTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBlcnJvciB9ID0gcmVjb3JkUmVzcG9uc2UgPz8ge307XG4gICAgaWYgKCFlcnJvcikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB0aGlzLmVycm9yQ29kZSA9IHJlY29yZFJlc3BvbnNlLmVycm9yQ29kZTtcbiAgICB0aGlzLmVycm9yRnVsbENvZGUgPSByZWNvcmRSZXNwb25zZS5lcnJvckZ1bGxDb2RlO1xuICAgIHRoaXMuZXJyb3JOYW1lID0gcmVjb3JkUmVzcG9uc2UuZXJyb3JOYW1lO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gcmVjb3JkUmVzcG9uc2UuZXJyb3JNZXNzYWdlO1xuICAgIHRoaXMuZXJyb3JEZXRhaWwgPSByZWNvcmRSZXNwb25zZS5lcnJvckRldGFpbDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGVycm9yT2NjdXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuZXJyb3JDb2RlICE9PSBOT19FUlJPUik7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyRXZlbnRIYW5kbGVyKFxuICAgIGhhbmRsZXJNYXA6IFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT4sXG4gICAgY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCxcbiAgICBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gICAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGVTZXQgPSBBcnJheS5pc0FycmF5KGNvZGVzKSA/IGNvZGVzIDogKGNvZGVzID8gW2NvZGVzXSA6IFtdKTtcbiAgICBjb2RlU2V0LmZvckVhY2goKGNvZGUpID0+IHtcbiAgICAgIGlmICghaGFuZGxlck1hcFtjb2RlXSkgeyBoYW5kbGVyTWFwW2NvZGVdID0gW107IH1cbiAgICAgIGhhbmRsZXJNYXBbY29kZV0ucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVFdmVudEhhbmRsZXIoXG4gICAgaGFuZGxlck1hcDogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPixcbiAgICBjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGVTZXQgPSBBcnJheS5pc0FycmF5KGNvZGVzKSA/IGNvZGVzIDogKGNvZGVzID8gW2NvZGVzXSA6IFtdKTtcbiAgICBjb2RlU2V0LmZvckVhY2goKGNvZGUpID0+IHsgaGFuZGxlck1hcFtjb2RlXSA9IFtdOyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUhhbmRsZXJzKFxuICAgIGhhbmRsZXJzOiBFdmVudENhbGxiYWNrW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBoYW5kbGVycy5tYXAoKHsgY2FsbGJhY2sgfSkgPT4gY2FsbGJhY2soLi4uYXJncykpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpO1xuICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KHIgPT4gci5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHIudmFsdWUgIT09IGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3BvcnRlIG1hbmVqbyBkZSBldmVudG9zIGRlIGZvcm11bGFyaW9cbiAgICovXG5cbiAgYXN5bmMgcmVxdWVzdEZvcm1BY3Rpb24oYWN0aW9uQ29kZTogc3RyaW5nLCBhY3Rpb25TdWJqZWN0OiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgYWN0aW9uRGV0YWlsID0ge1xuICAgICAgZm9ybUNvZGU6IHRoaXMubmFtZSxcbiAgICAgIGZvcm1TdWJqZWN0OiB0aGlzLnN1YmplY3QsXG4gICAgICBjdXJyZW50TW9kZTogdGhpcy5zdGF0ZSxcbiAgICAgIGFjdGlvbkNvZGUsXG4gICAgICBhY3Rpb25TdWJqZWN0LFxuICAgICAgdmVyc2lvbjogUEFZTE9BRF9WRVJTSU9OLFxuICAgICAgZm9ybURhdGE6IHRoaXMuZ2V0UGF5bG9hZCgpLFxuICAgICAgaW1tdXRhYmxlRGF0YTogdGhpcy5pbW11dGFibGVEYXRhLFxuICAgIH07XG4gICAgdGhpcy5lcnJvckNvZGUgPSBOT19FUlJPUjtcbiAgICB0aGlzLmVycm9yRnVsbENvZGUgPSAnJztcbiAgICB0aGlzLmVycm9yTmFtZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdGhpcy5lcnJvckRldGFpbCA9ICcnO1xuICAgIHRoaXMuYnVzeS5zZXQodHJ1ZSk7XG4gICAgY29uc3QgZm9ybUFjdGlvblJlc3BvbnNlOiBhbnkgPSBhd2FpdCB0aGlzLmZvcm1NYW5hZ2VyU2VydmljZS5leGVjU2VydmVyQWN0aW9uKGFjdGlvbkRldGFpbCk7XG4gICAgaWYgKCFmb3JtQWN0aW9uUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aGlzLmJ1c3kuc2V0KGZhbHNlKTtcbiAgICBpZiAoZm9ybUFjdGlvblJlc3BvbnNlLmhhc0Vycm9yKCkpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gZm9ybUFjdGlvblJlc3BvbnNlLmVycm9yO1xuICAgICAgdGhpcy5lcnJvckNvZGUgPSBlcnJvci5lcnJvckNvZGU7XG4gICAgICB0aGlzLmVycm9yRnVsbENvZGUgPSBlcnJvci5lcnJvckZ1bGxDb2RlO1xuICAgICAgdGhpcy5lcnJvck5hbWUgPSBlcnJvci5lcnJvck5hbWU7XG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yLmVycm9yTWVzc2FnZTtcbiAgICAgIHRoaXMuZXJyb3JEZXRhaWwgPSBlcnJvci5lcnJvckRldGFpbDtcbiAgICB9XG4gICAgY29uc3QgZm9ybVJlc3BvbnNlRGF0YSA9IGZvcm1BY3Rpb25SZXNwb25zZS5nZXREYXRhKCk7XG4gICAgdGhpcy51cGRhdGVGb3JtV2l0aFNlcnZlckRhdGEoZm9ybVJlc3BvbnNlRGF0YSk7XG4gICAgcmV0dXJuIGZvcm1SZXNwb25zZURhdGE7XG4gIH1cblxuICB1cGRhdGVGb3JtV2l0aFNlcnZlckRhdGEoZm9ybUNvbnRlbnQ6IGFueSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRNb2RlLCBmb3JtU3ViamVjdCwgYWN0aW9ucywgZmllbGRzLCByZWNvcmRUYWJsZXMsXG4gICAgICByZXR1cm5lZEZpbGUsIGltbXV0YWJsZURhdGEsIGV4dHJhSW5mbyxcbiAgICB9ID0gZm9ybUNvbnRlbnQ7XG4gICAgY3VycmVudE1vZGUgJiYgdGhpcy5jaGFuZ2VTdGF0ZShjdXJyZW50TW9kZSk7XG4gICAgaWYgKGZvcm1TdWJqZWN0KSB7IHRoaXMuc3ViamVjdCA9IGZvcm1TdWJqZWN0OyB9XG4gICAgaWYgKGFjdGlvbnMgJiYgYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZWRBY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICBjb25zdCBhY3Rpb25PYmplY3QgPSB0aGlzLmdldEFjdGlvbihjaGFuZ2VkQWN0aW9uLmFjdGlvbkNvZGUpO1xuICAgICAgICBpZiAoYWN0aW9uT2JqZWN0KSB7IGFjdGlvbk9iamVjdC51cGRhdGVGcm9tU2VydmVyKGNoYW5nZWRBY3Rpb24pOyB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY2hhbmdlZEZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICBjb25zdCBmaWVsZE9iamVjdCA9IHRoaXMuZ2V0RmllbGQoY2hhbmdlZEZpZWxkLmZpZWxkQ29kZSk7XG4gICAgICAgIGlmIChmaWVsZE9iamVjdCkge1xuICAgICAgICAgIGZpZWxkT2JqZWN0LnVwZGF0ZUZyb21TZXJ2ZXIoY2hhbmdlZEZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVjb3JkVGFibGVzICYmIHJlY29yZFRhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZWRUYWJsZSBvZiByZWNvcmRUYWJsZXMpIHtcbiAgICAgICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKGNoYW5nZWRUYWJsZS50YWJsZUNvZGUpO1xuICAgICAgICBpZiAodGFibGVPYmplY3QpIHtcbiAgICAgICAgICB0YWJsZU9iamVjdC51cGRhdGVGcm9tU2VydmVyKGNoYW5nZWRUYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJldHVybmVkRmlsZSAmJiByZXR1cm5lZEZpbGUuZmlsZSkge1xuICAgICAgdGhpcy5maWxlTWdtdFNlcnZpY2VzLnNhdmVGaWxlKHJldHVybmVkRmlsZS5maWxlLCByZXR1cm5lZEZpbGUubmFtZSwgcmV0dXJuZWRGaWxlLnR5cGUpO1xuICAgIH1cbiAgICB0aGlzLmltbXV0YWJsZURhdGEgPSBpbW11dGFibGVEYXRhO1xuICAgIHRoaXMuZXh0cmFJbmZvID0gZXh0cmFJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqbyBkZSBldmVudCBoYW5kbGVycyBwYXJhIGVycm9yZXMgU2VydmVyIGRlbCBmb3JtdWxhcmlvXG4gICAqL1xuXG4gIGNsZWFuQWN0aW9uU2VydmVyRXJyb3IoKSB7IHRoaXMuX2FjdGlvblNlcnZlckVycm9yID0gW107IH1cbiAgY2xlYW5GaWVsZFNlcnZlckVycm9yKCkgeyB0aGlzLl9maWVsZFNlcnZlckVycm9yID0gW107IH1cbiAgY2xlYW5UYWJsZVNlcnZlckVycm9yKCkgeyB0aGlzLl90YWJsZVNlcnZlckVycm9yID0gW107IH1cbiAgb25BY3Rpb25TZXJ2ZXJFcnJvcihjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCkgeyB0aGlzLl9hY3Rpb25TZXJ2ZXJFcnJvci5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7IH1cbiAgb25WYWxpZGF0aW9uU2VydmVyRXJyb3IoY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHsgdGhpcy5fZmllbGRTZXJ2ZXJFcnJvci5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7IH1cbiAgb25UYWJsZVNlcnZlckVycm9yKGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7IHRoaXMuX3RhYmxlU2VydmVyRXJyb3IucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pOyB9XG5cbiAgLyoqXG4gICAqIE1hbmVqbyBkZSBldmVudCBoYW5kbGVycyBwYXJhIGFjY2lvbmVzIHNvYnJlIGVsIGZvcm11bGFyaW9cbiAgICovXG5cbiAgb25Gb3JtQ2hhbmdlKGNhbGxiYWNrOiAoc3RhdGU6IHN0cmluZykgPT4gdm9pZCkge1xuICAgIHRoaXMuX2Zvcm1DaGFuZ2VTdGF0ZS5wdXNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIG9uU2VjdGlvbkNhbkRlYWN0aXZhdGUoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKHRoaXMuX2Zvcm1TZWN0aW9uc0NhbkRlYWN0aXZhdGUsIGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICBvblNlY3Rpb25BY3RpdmF0aW9uKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50SGFuZGxlcih0aGlzLl9mb3JtU2VjdGlvbnNBY3RpdmF0ZSwgY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIG9uU2VjdGlvbkluYWN0aXZhdGlvbihjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudEhhbmRsZXIodGhpcy5fZm9ybVNlY3Rpb25zSW5hY3RpdmF0ZSwgY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIG9uQWN0aW9uU3RhcnQoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKHRoaXMuX2Zvcm1BY3Rpb25zU3RhcnQsIGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICBvbkFjdGlvbkZpbmlzaChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudEhhbmRsZXIodGhpcy5fZm9ybUFjdGlvbnNGaW5pc2gsIGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlTZWN0aW9uQWN0aXZhdGlvbihjb2RlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzZWN0aW9uT2JqZWN0ID0gdGhpcy5nZXRTZWN0aW9uKGNvZGUpO1xuICAgIGlmICghc2VjdGlvbk9iamVjdCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBjb25zdCBjbGllbnRTZWN0aW9uTWV0aG9kcyA9IHRoaXMuX2Zvcm1TZWN0aW9uc0NhbkRlYWN0aXZhdGVbY29kZV07XG4gICAgaWYgKGNsaWVudFNlY3Rpb25NZXRob2RzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNsaWVudFNlY3Rpb25NZXRob2Qgb2YgY2xpZW50U2VjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gY2xpZW50U2VjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY2FuQWN0aXZhdGUgPSBjYWxsYmFjayhzZWN0aW9uT2JqZWN0KTtcbiAgICAgICAgaWYgKGNhbkFjdGl2YXRlID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGxhdW5jaFNlY3Rpb25BY3RpdmF0aW9uKGNvZGU6IHN0cmluZykge1xuICAgIHRoaXMubm90aWZ5Rm9ybUFjdGl2aXR5KCk7XG4gICAgY29uc3Qgc2VjdGlvbk9iamVjdCA9IHRoaXMuZ2V0U2VjdGlvbihjb2RlKTtcbiAgICBpZiAoIXNlY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZHMgPSB0aGlzLl9mb3JtU2VjdGlvbnNBY3RpdmF0ZVtjb2RlXTtcbiAgICBpZiAoY2xpZW50U2VjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZCBvZiBjbGllbnRTZWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSBjbGllbnRTZWN0aW9uTWV0aG9kO1xuICAgICAgICBjYWxsYmFjayhzZWN0aW9uT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBsYXVuY2hTZWN0aW9uSW5hY3RpdmF0aW9uKGNvZGU6IHN0cmluZykge1xuICAgIHRoaXMubm90aWZ5Rm9ybUFjdGl2aXR5KCk7XG4gICAgY29uc3Qgc2VjdGlvbk9iamVjdCA9IHRoaXMuZ2V0U2VjdGlvbihjb2RlKTtcbiAgICBpZiAoIXNlY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZHMgPSB0aGlzLl9mb3JtU2VjdGlvbnNJbmFjdGl2YXRlW2NvZGVdO1xuICAgIGlmIChjbGllbnRTZWN0aW9uTWV0aG9kcykge1xuICAgICAgZm9yIChjb25zdCBjbGllbnRTZWN0aW9uTWV0aG9kIG9mIGNsaWVudFNlY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IGNsaWVudFNlY3Rpb25NZXRob2Q7XG4gICAgICAgIGNhbGxiYWNrKHNlY3Rpb25PYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0QWN0aW9uKGNvZGU6IHN0cmluZykge1xuICAgIHRoaXMubm90aWZ5Rm9ybUFjdGl2aXR5KCk7XG4gICAgY29uc3QgYWN0aW9uT2JqZWN0ID0gdGhpcy5nZXRBY3Rpb24oY29kZSk7XG4gICAgaWYgKCFhY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgaWYgKHRoaXMuX2FjdGlvbnNJblByb2dyZXNzW2NvZGVdKSB7XG4gICAgICBjb25zdCB7IHNlbnQgfSA9IHRoaXMuX2FjdGlvbnNJblByb2dyZXNzW2NvZGVdO1xuICAgICAgY29uc29sZS5sb2coYFJlaW5ncmVzbyBzb2JyZSBhY2Npw7NuICR7Y29kZX0gY29uIGVqZWN1Y2nDs24gcHJldmlhICR7c2VudH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYWN0aW9uc0luUHJvZ3Jlc3NbY29kZV0gPSB7IHNlbnQ6IG5ldyBEYXRlKCkgfTtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBhY3Rpb25PYmplY3Quc3RhcnQoKTtcbiAgICBjb25zdCBjbGllbnRBY3Rpb25NZXRob2RzID0gdGhpcy5fZm9ybUFjdGlvbnNTdGFydFtjb2RlXTtcbiAgICBpZiAoY2xpZW50QWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNsaWVudEFjdGlvbk1ldGhvZCBvZiBjbGllbnRBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IGNsaWVudEFjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY29udGludWVBY3Rpb25Qcm9taXNlID0gY2FsbGJhY2soYWN0aW9uT2JqZWN0KTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjb250aW51ZUFjdGlvblByb21pc2UpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZUFjdGlvbiA9IGNsaWVudEFjdGlvblJlc3VsdHMuZXZlcnkociA9PiByLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgci52YWx1ZSAhPT0gZmFsc2UpO1xuICAgICAgaWYgKCFjb250aW51ZUFjdGlvbikge1xuICAgICAgICBhY3Rpb25PYmplY3Quc3RvcCgpO1xuICAgICAgICB0aGlzLl9hY3Rpb25zSW5Qcm9ncmVzc1tjb2RlXSA9IG51bGw7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9hY3Rpb25zSW5Qcm9ncmVzc1tjb2RlXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLnN0YXJ0U2VydmVyQWN0aW9uKGFjdGlvbk9iamVjdCk7XG4gICAgdGhpcy5fYWN0aW9uc0luUHJvZ3Jlc3NbY29kZV0gPSBudWxsO1xuICAgIGRlbGV0ZSB0aGlzLl9hY3Rpb25zSW5Qcm9ncmVzc1tjb2RlXTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2VydmVyQWN0aW9uKGFjdGlvbklucHV0OiBhbnkpIHtcbiAgICBjb25zdCBhY3Rpb24gPSAodHlwZW9mIGFjdGlvbklucHV0ID09PSAnc3RyaW5nJylcbiAgICAgID8gdGhpcy5nZXRBY3Rpb24oYWN0aW9uSW5wdXQpIDogYWN0aW9uSW5wdXQ7XG4gICAgY29uc3QgeyBhY3Rpb25Db2RlOiBjb2RlLCBiYWNrZW5kIH0gPSBhY3Rpb24gPz8ge307XG4gICAgaWYgKCFhY3Rpb24gfHwgIWNvZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGJhY2tlbmQpIHtcbiAgICAgIGlmICh0aGlzLl9zZXJ2ZXJBY3Rpb25zSW5Qcm9ncmVzc1tjb2RlXSkge1xuICAgICAgICBjb25zdCB7IHNlbnQgfSA9IHRoaXMuX3NlcnZlckFjdGlvbnNJblByb2dyZXNzW2NvZGVdO1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVpbmdyZXNvIHNlcnZlciBlbiBhY2Npw7NuICR7Y29kZX0gY29uIGVqZWN1Y2nDs24gcHJldmlhICR7c2VudH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fc2VydmVyQWN0aW9uc0luUHJvZ3Jlc3NbY29kZV0gPSB7IHNlbnQ6IG5ldyBEYXRlKCkgfTtcbiAgICAgIC8vIFNlIGluaWNpYSBsYSBwYXJ0ZSBzZXJ2ZXIgZGUgbGEgYWNjacOzblxuICAgICAgYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0Rm9ybUFjdGlvbihhY3Rpb24uYWN0aW9uQ29kZSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZmluaXNoQWN0aW9uKGFjdGlvbiwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvcik7XG4gICAgc2VydmVyRXJyb3IgPSAhIXRoaXMuZXJyb3JPY2N1cmVkKCk7XG4gICAgaWYgKCFzZXJ2ZXJFcnJvcikge1xuICAgICAgYWN0aW9uLm5ld1N0YXRlICYmIHRoaXMuY2hhbmdlU3RhdGUoYWN0aW9uLm5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX2FjdGlvblNlcnZlckVycm9yLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0aGlzLl9hY3Rpb25TZXJ2ZXJFcnJvcltpbmRleF07XG4gICAgICAgIGNhbGxiYWNrKGFjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3NlcnZlckFjdGlvbnNJblByb2dyZXNzW2NvZGVdID0gbnVsbDtcbiAgICBkZWxldGUgdGhpcy5fc2VydmVyQWN0aW9uc0luUHJvZ3Jlc3NbY29kZV07XG4gICAgYWN0aW9uLnN0b3AoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaEFjdGlvbihhY3Rpb246IGFueSwgYWN0aW9uUmVzdWx0OiBhbnksIHNlcnZlckVycm9yOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBmaW5pc2hBY3Rpb25NZXRob2RzID0gdGhpcy5fZm9ybUFjdGlvbnNGaW5pc2hbYWN0aW9uLmFjdGlvbkNvZGVdO1xuICAgIGlmIChmaW5pc2hBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50QWN0aW9uTWV0aG9kIG9mIGZpbmlzaEFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gY2xpZW50QWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSBwcm9wZXJ0aWVzPy5jb250aW51ZU9uRXJyb3IgPz8gZmFsc2U7XG4gICAgICAgIGlmIChjYWxsYmFjayAmJiAoIXNlcnZlckVycm9yIHx8IGNvbnRpbnVlT25FcnJvcikpIHtcbiAgICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNhbGxiYWNrKGFjdGlvbiwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgY29tcGxldGVHbG9iYWxBY3Rpb24oYWN0aW9uOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydFNlcnZlckFjdGlvbihhY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYWRvcmVzIGRlIGV2ZW50b3MgcGFyYSB2YWxpZGFjaW9uZXMgc29icmUgY2FtcG9zXG4gICAqL1xuXG4gIHJlbW92ZUZpZWxkVmFsaWRhdGlvbklucHV0KGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50SGFuZGxlcih0aGlzLl9maWVsZElucHV0VmFsaWRhdGlvbiwgY29kZXMpO1xuICB9XG5cbiAgb25GaWVsZElucHV0KGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50SGFuZGxlcih0aGlzLl9maWVsZElucHV0VmFsaWRhdGlvbiwgY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHJlbW92ZUZpZWxkQ3VzdG9tRXZlbnQoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRIYW5kbGVyKHRoaXMuX2ZpZWxkQ3VzdG9tRXZlbnQsIGNvZGVzKTtcbiAgfVxuXG4gIG9uRmllbGRDdXN0b21FdmVudChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudEhhbmRsZXIodGhpcy5fZmllbGRDdXN0b21FdmVudCwgY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHJlbW92ZUZpZWxkVmFsaWRhdGlvblN0YXJ0KGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50SGFuZGxlcih0aGlzLl9maWVsZFZhbGlkYXRpb25zU3RhcnQsIGNvZGVzKTtcbiAgfVxuXG4gIG9uRmllbGRWYWxpZGF0aW9uU3RhcnQoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKHRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNTdGFydCwgY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHJlbW92ZUZpZWxkVmFsaWRhdGlvbkZpbmlzaChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVFdmVudEhhbmRsZXIodGhpcy5fZmllbGRWYWxpZGF0aW9uc0ZpbmlzaCwgY29kZXMpO1xuICB9XG5cbiAgb25GaWVsZFZhbGlkYXRpb25GaW5pc2goY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKHRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNGaW5pc2gsIGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICByZW1vdmVGaWVsZEFsbEV2ZW50Q2FsbGJhY2tzKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50SGFuZGxlcih0aGlzLl9maWVsZElucHV0VmFsaWRhdGlvbiwgY29kZXMpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRIYW5kbGVyKHRoaXMuX2ZpZWxkQ3VzdG9tRXZlbnQsIGNvZGVzKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50SGFuZGxlcih0aGlzLl9maWVsZFZhbGlkYXRpb25zU3RhcnQsIGNvZGVzKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50SGFuZGxlcih0aGlzLl9maWVsZFZhbGlkYXRpb25zRmluaXNoLCBjb2Rlcyk7XG4gIH1cblxuICBhc3luYyBzdGFydEZpZWxkSW5wdXRWYWxpZGF0aW9uKGNvZGU6IHN0cmluZywgaW50cmluc2ljVmFsaWRhdGlvbjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLm5vdGlmeUZvcm1BY3Rpdml0eSgpO1xuICAgIGNvbnN0IGZpZWxkVG9WYWxpZGF0ZSA9IHRoaXMuZ2V0RmllbGQoY29kZSk7XG4gICAgaWYgKCFmaWVsZFRvVmFsaWRhdGUpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY29uc3QgdmFsaWRhdGlvbkNhbGxiYWNrcyA9IHRoaXMuX2ZpZWxkSW5wdXRWYWxpZGF0aW9uW2NvZGVdO1xuICAgIGlmICh2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICBjb25zdCBjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb25NZXRob2Qgb2YgdmFsaWRhdGlvbkNhbGxiYWNrcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB2YWxpZGF0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZVZhbGlkYXRpb25Qcm9taXNlID0gY2FsbGJhY2soZmllbGRUb1ZhbGlkYXRlKTtcbiAgICAgICAgY2xpZW50VmFsaWRhdGlvblByb21pc2VzLnB1c2goY29udGludWVWYWxpZGF0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2xpZW50VmFsaWRhdGlvblByb21pc2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBzdGFydEZpZWxkQ3VzdG9tRXZlbnQoY29kZTogc3RyaW5nLCBldmVudE5hbWU6IHN0cmluZywgZXZlbnREYXRhOiBhbnkpIHtcbiAgICB0aGlzLm5vdGlmeUZvcm1BY3Rpdml0eSgpO1xuICAgIGNvbnN0IGZpZWxkVG9UcmlnZ2VyID0gdGhpcy5nZXRGaWVsZChjb2RlKTtcbiAgICBpZiAoIWZpZWxkVG9UcmlnZ2VyKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IGV2ZW50SGFuZGxlckNhbGxiYWNrcyA9IHRoaXMuX2ZpZWxkQ3VzdG9tRXZlbnRbY29kZV07XG4gICAgaWYgKGV2ZW50SGFuZGxlckNhbGxiYWNrcykge1xuICAgICAgY29uc3QgY2xpZW50RXZlbnRQcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZXZlbnRIYW5kbGVyTWV0aG9kIG9mIGV2ZW50SGFuZGxlckNhbGxiYWNrcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSBldmVudEhhbmRsZXJNZXRob2Q7XG4gICAgICAgIGNvbnN0IGNsaWVudEV2ZW50UHJvbWlzZSA9IGNhbGxiYWNrKGV2ZW50TmFtZSwgZXZlbnREYXRhLCBmaWVsZFRvVHJpZ2dlcik7XG4gICAgICAgIGNsaWVudEV2ZW50UHJvbWlzZXMucHVzaChjbGllbnRFdmVudFByb21pc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0RmllbGRWYWxpZGF0aW9uKGNvZGU6IHN0cmluZywgaW50cmluc2ljVmFsaWRhdGlvbjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLm5vdGlmeUZvcm1BY3Rpdml0eSgpO1xuICAgIGNvbnN0IGZpZWxkVG9WYWxpZGF0ZSA9IHRoaXMuZ2V0RmllbGQoY29kZSk7XG4gICAgaWYgKCFmaWVsZFRvVmFsaWRhdGUpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgdmFsaWRhdGlvbkNhbGxiYWNrcyA9IHRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNTdGFydFtjb2RlXTtcbiAgICBpZiAodmFsaWRhdGlvbkNhbGxiYWNrcykge1xuICAgICAgY29uc3QgY2xpZW50VmFsaWRhdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uTWV0aG9kIG9mIHZhbGlkYXRpb25DYWxsYmFja3MpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdmFsaWRhdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY2xpZW50VmFsaWRhdGlvblByb21pc2UgPSBjYWxsYmFjayhmaWVsZFRvVmFsaWRhdGUpO1xuICAgICAgICBjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXMucHVzaChjbGllbnRWYWxpZGF0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRWYWxpZGF0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVWYWxpZGF0aW9uID0gY2xpZW50VmFsaWRhdGlvblJlc3VsdHMuZXZlcnkociA9PiByLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgci52YWx1ZSAhPT0gZmFsc2UpO1xuICAgICAgaWYgKCFjb250aW51ZVZhbGlkYXRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW50cmluc2ljVmFsaWRhdGlvbikge1xuICAgICAgdGhpcy5zdGFydFNlcnZlckZpZWxkVmFsaWRhdGlvbihmaWVsZFRvVmFsaWRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2VydmVyRmllbGRWYWxpZGF0aW9uKGlucHV0RmllbGQ6IHN0cmluZyB8IEZpZWxkRGVzY3JpcHRvcikge1xuICAgIGNvbnN0IGZpZWxkT2JqOiBGaWVsZERlc2NyaXB0b3IgfCBudWxsID0gKHR5cGVvZiBpbnB1dEZpZWxkID09PSAnc3RyaW5nJylcbiAgICAgID8gdGhpcy5nZXRGaWVsZChpbnB1dEZpZWxkKSA6IGlucHV0RmllbGQ7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IHZhbGlkYXRpb25SZXN1bHQ6IGJvb2xlYW4gPSB0cnVlO1xuICAgIGlmICghZmllbGRPYmopIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGZpZWxkT2JqLmJhY2tlbmQpIHtcbiAgICAgIGZpZWxkT2JqLnZhbGlkYXRpbmcgPSB0cnVlO1xuICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKEZvcm1BY3Rpb25UeXBlLlZhbGlkYXRlLCBmaWVsZE9iai5jb2RlKTtcbiAgICAgIHNlcnZlckVycm9yID0gISF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBpZiAoc2VydmVyRXJyb3IpIHtcbiAgICAgIGZpZWxkT2JqPy5zZXRFcnJvckNvZGUodGhpcy5lcnJvckNvZGUpO1xuICAgICAgZmllbGRPYmo/LnNldEVycm9yTWVzc2FnZSh0aGlzLmVycm9yTWVzc2FnZSk7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZmllbGRTZXJ2ZXJFcnJvci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGhpcy5fZmllbGRTZXJ2ZXJFcnJvcltpbmRleF07XG4gICAgICAgIGNhbGxiYWNrKGZpZWxkT2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgdGhpcy5maW5pc2hGaWVsZFZhbGlkYXRpb24oZmllbGRPYmosIHZhbGlkYXRpb25SZXN1bHQsIHNlcnZlckVycm9yKTtcbiAgICBmaWVsZE9iai52YWxpZGF0aW5nID0gZmFsc2U7XG4gIH1cblxuICBhc3luYyBmaW5pc2hGaWVsZFZhbGlkYXRpb24oZmllbGRPYmplY3Q6IGFueSwgdmFsaWRhdGlvblJlc3VsdDogYm9vbGVhbiwgc2VydmVyRXJyb3IgPSBmYWxzZSkge1xuICAgIGNvbnN0IHZhbGlkYXRpb25DYWxsYmFja3MgPSB0aGlzLl9maWVsZFZhbGlkYXRpb25zRmluaXNoW2ZpZWxkT2JqZWN0LmNvZGVdO1xuICAgIGlmICh2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbk1ldGhvZCBvZiB2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHZhbGlkYXRpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlT25FcnJvciA9IHByb3BlcnRpZXM/LmNvbnRpbnVlT25FcnJvciA/PyBmYWxzZTtcbiAgICAgICAgaWYgKCFzZXJ2ZXJFcnJvciB8fCBjb250aW51ZU9uRXJyb3IpIHtcbiAgICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNhbGxiYWNrKGZpZWxkT2JqZWN0LCB2YWxpZGF0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY29udGludWVGaWVsZFZhbGlkYXRpb24oY29kZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRTZXJ2ZXJGaWVsZFZhbGlkYXRpb24oY29kZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphZG9yZXMgZGUgZXZlbnRvcyBwYXJhIGFjY2lvbmVzIHNvYnJlIFRhYmxhc1xuICAgKi9cblxuICBvblRhYmxlQWN0aW9uU3RhcnQoY29kZTogc3RyaW5nLCBhY3Rpb25Db2RlOiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKGNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5saW5lQWN0aW9uT2JqZWN0ID0gdGFibGVPYmplY3QuZ2V0QWN0aW9uKGFjdGlvbkNvZGUpO1xuICAgIGlmICghaW5saW5lQWN0aW9uT2JqZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB0YWJsZUV2ZW50SGFuZGxlcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT47XG4gICAgaWYgKHRoaXMuX3RhYmxlQWN0aW9uc1N0YXJ0W2NvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNTdGFydFtjb2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0ge307XG4gICAgICB0aGlzLl90YWJsZUFjdGlvbnNTdGFydFtjb2RlXSA9IHRhYmxlRXZlbnRIYW5kbGVycztcbiAgICB9XG4gICAgaWYgKCF0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA9IFtdO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0ucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgb25UYWJsZUFjdGlvbkZpbmlzaChjb2RlOiBzdHJpbmcsIGFjdGlvbkNvZGU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmxpbmVBY3Rpb25PYmplY3QgPSB0YWJsZU9iamVjdC5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gICAgaWYgKCFpbmxpbmVBY3Rpb25PYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVyczogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPjtcbiAgICBpZiAodGhpcy5fdGFibGVBY3Rpb25zRmluaXNoW2NvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbY29kZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHt9O1xuICAgICAgdGhpcy5fdGFibGVBY3Rpb25zRmluaXNoW2NvZGVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICBpZiAoIXRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSkge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdID0gW107XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXS5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBvblRhYmxlU2VsZWN0aW9uU3RhcnQoY29kZTogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCkge1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZShjb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0KSB7IHJldHVybjsgfVxuICAgIGxldCB0YWJsZUV2ZW50SGFuZGxlcnM6IEV2ZW50Q2FsbGJhY2tbXTtcbiAgICBpZiAodGhpcy5fdGFibGVTZWxlY3Rpb25zU3RhcnRbY29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlU2VsZWN0aW9uc1N0YXJ0W2NvZGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSBbXTtcbiAgICAgIHRoaXMuX3RhYmxlU2VsZWN0aW9uc1N0YXJ0W2NvZGVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnMucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgb25UYWJsZVNlbGVjdGlvbkZpbmlzaChjb2RlOiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKGNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVyczogRXZlbnRDYWxsYmFja1tdO1xuICAgIGlmICh0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2hbY29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlU2VsZWN0aW9uc0ZpbmlzaFtjb2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gW107XG4gICAgICB0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2hbY29kZV0gPSB0YWJsZUV2ZW50SGFuZGxlcnM7XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVycy5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBvblRhYmxlR2V0RGF0YVN0YXJ0KGNvZGU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdGFibGVFdmVudEhhbmRsZXJzOiBFdmVudENhbGxiYWNrW107XG4gICAgaWYgKHRoaXMuX3RhYmxlR2V0RGF0YVN0YXJ0W2NvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUdldERhdGFTdGFydFtjb2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gW107XG4gICAgICB0aGlzLl90YWJsZUdldERhdGFTdGFydFtjb2RlXSA9IHRhYmxlRXZlbnRIYW5kbGVycztcbiAgICB9XG4gICAgdGFibGVFdmVudEhhbmRsZXJzLnB1c2goeyBjYWxsYmFjaywgcHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIG9uVGFibGVHZXREYXRhRmluaXNoKGNvZGU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdGFibGVFdmVudEhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudENhbGxiYWNrPjtcbiAgICBpZiAodGhpcy5fdGFibGVHZXREYXRhRmluaXNoW2NvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUdldERhdGFGaW5pc2hbY29kZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHt9O1xuICAgICAgdGhpcy5fdGFibGVHZXREYXRhRmluaXNoW2NvZGVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnNbR0VUX0RBVEFfQUNUSU9OXSA9IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVHbG9iYWxBY3Rpb24odGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgdGhpcy5ub3RpZnlGb3JtQWN0aXZpdHkoKTtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uQ29kZSB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb25Db2RlKSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IGFjdGlvbiA9IHRhYmxlT2JqZWN0LmdldEFjdGlvbihhY3Rpb25Db2RlKTtcbiAgICBpZiAoIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICBjb25zdCB0YWJsZUFjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgYWN0aW9uLFxuICAgICAgdGFibGVDb2RlLFxuICAgICAgYWN0aW9uQ29kZSxcbiAgICB9O1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc1N0YXJ0W3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2UgPSBjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2xpZW50QWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQWN0aW9uID0gY2xpZW50QWN0aW9uUmVzdWx0cy5ldmVyeShyID0+IHIuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByLnZhbHVlICE9PSBmYWxzZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFRhYmxlU2VydmVyR2xvYmFsQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZXJ2ZXJHbG9iYWxBY3Rpb24odGFibGVBY3Rpb25EZXRhaWw6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIGFjdGlvbiwgdGFibGVDb2RlLCBhY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGFjdGlvbi5iYWNrZW5kKSB7XG4gICAgICBjb25zdCBhY3Rpb25TdWJqZWN0ID0ge1xuICAgICAgICB0YWJsZUNvZGUsXG4gICAgICAgIGFjdGlvblR5cGU6IEdMT0JBTF9BQ1RJT04sXG4gICAgICAgIGFjdGlvbkNvZGVcbiAgICAgIH07XG4gICAgICBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzXG4gICAgICAgIC5yZXF1ZXN0Rm9ybUFjdGlvbihGb3JtQWN0aW9uVHlwZS5UYWJsZUFjdGlvbiwgYWN0aW9uU3ViamVjdCk7XG4gICAgICBzZXJ2ZXJFcnJvciA9ICEhdGhpcy5lcnJvck9jY3VyZWQoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5maW5pc2hUYWJsZUdsb2JhbEFjdGlvbih0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvcik7XG4gICAgaWYgKCFzZXJ2ZXJFcnJvcikge1xuICAgICAgYWN0aW9uLm5ld1N0YXRlICYmIHRoaXMuY2hhbmdlU3RhdGUoYWN0aW9uLm5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX3RhYmxlU2VydmVyRXJyb3IubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRoaXMuX3RhYmxlU2VydmVyRXJyb3JbaW5kZXhdO1xuICAgICAgICBjYWxsYmFjayh0YWJsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZUdsb2JhbEFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55LCBhY3Rpb25SZXN1bHQ6IGFueSwgc2VydmVyRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlLCBhY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA6IG51bGw7XG4gICAgaWYgKHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0YWJsZUFjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY29udGludWVPbkVycm9yID0gcHJvcGVydGllcz8uY29udGludWVPbkVycm9yID8/IGZhbHNlO1xuICAgICAgICBpZiAoIXNlcnZlckVycm9yIHx8IGNvbnRpbnVlT25FcnJvcikge1xuICAgICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2FsbGJhY2sodGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVBY3Rpb24odGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgdGhpcy5ub3RpZnlGb3JtQWN0aXZpdHkoKTtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uQ29kZSwgYWN0aW9uRGV0YWlsIH0gPSB0YWJsZUFjdGlvbkV2ZW50O1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZUNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QgfHwgIWFjdGlvbkNvZGUpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgeyByZWNvcmRJZCwgcmVjb3JkRGF0YSB9ID0gYWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IGFjdGlvbiA9IHRhYmxlT2JqZWN0LmdldEFjdGlvbihhY3Rpb25Db2RlKTtcbiAgICBpZiAoIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICBjb25zdCB0YWJsZUFjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgYWN0aW9uLFxuICAgICAgdGFibGVDb2RlLFxuICAgICAgYWN0aW9uQ29kZSxcbiAgICAgIHJlY29yZElkLFxuICAgICAgcmVjb3JkRGF0YVxuICAgIH07XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVBY3Rpb25zU3RhcnRbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA6IG51bGw7XG4gICAgaWYgKHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0YWJsZUFjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZSA9IGNhbGxiYWNrKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjbGllbnRBY3Rpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLmV2ZXJ5KHIgPT4gci5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHIudmFsdWUgIT09IGZhbHNlKTtcbiAgICAgIGlmICghY29udGludWVBY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJBY3Rpb24odGFibGVBY3Rpb25EZXRhaWwpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVNlcnZlckFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZU9iamVjdCwgYWN0aW9uLCB0YWJsZUNvZGUsIGFjdGlvbkNvZGUsIHJlY29yZElkLCByZWNvcmREYXRhIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGFjdGlvbi5iYWNrZW5kKSB7XG4gICAgICBjb25zdCBhY3Rpb25TdWJqZWN0ID0ge1xuICAgICAgICB0YWJsZUNvZGUsXG4gICAgICAgIGFjdGlvblR5cGU6IHRoaXMuZm9ybUNvbmZpZz8udGFibGVBY3Rpb25zLmlubGluZSxcbiAgICAgICAgYWN0aW9uQ29kZSxcbiAgICAgICAgdGFibGVSZWNvcmRJZDogcmVjb3JkSWQsXG4gICAgICAgIHRhYmxlUmVjb3JkRGF0YTogcmVjb3JkRGF0YVxuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKEZvcm1BY3Rpb25UeXBlLlRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIHNlcnZlckVycm9yID0gISF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZpbmlzaFRhYmxlQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yKTtcbiAgICBpZiAoIXNlcnZlckVycm9yKSB7XG4gICAgICBhY3Rpb24ubmV3U3RhdGUgJiYgdGhpcy5jaGFuZ2VTdGF0ZShhY3Rpb24ubmV3U3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXlUYWJsZVNlcnZlckVycm9yKCk7XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBjb21wbGV0ZUlubGluZUFjdGlvbih0YWJsZUFjdGlvbjogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRUYWJsZVNlcnZlckFjdGlvbih0YWJsZUFjdGlvbik7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZUFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55LCBhY3Rpb25SZXN1bHQ6IGFueSwgc2VydmVyRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlLCBhY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA6IG51bGw7XG4gICAgaWYgKHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0YWJsZUFjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY29udGludWVPbkVycm9yID0gcHJvcGVydGllcz8uY29udGludWVPbkVycm9yID8/IGZhbHNlO1xuICAgICAgICBpZiAoIXNlcnZlckVycm9yIHx8IGNvbnRpbnVlT25FcnJvcikge1xuICAgICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2FsbGJhY2sodGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVSZWNvcmRTZWxlY3Rpb24odGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgdGhpcy5ub3RpZnlGb3JtQWN0aXZpdHkoKTtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uRGV0YWlsIH0gPSB0YWJsZUFjdGlvbkV2ZW50O1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZUNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgeyByZWNvcmRJZCwgcmVjb3JkRGF0YSB9ID0gYWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlU2VsZWN0aW9uRGV0YWlsID0ge1xuICAgICAgdGFibGVPYmplY3QsXG4gICAgICB0YWJsZUNvZGUsXG4gICAgICByZWNvcmRJZCxcbiAgICAgIHJlY29yZERhdGFcbiAgICB9O1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlU2VsZWN0aW9uc1N0YXJ0W3RhYmxlQ29kZV07XG4gICAgaWYgKHRhYmxlRXZlbnRIYW5kbGVycykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlU2VsZWN0aW9uTWV0aG9kIG9mIHRhYmxlRXZlbnRIYW5kbGVycykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0YWJsZVNlbGVjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZSA9IGNhbGxiYWNrKHRhYmxlU2VsZWN0aW9uRGV0YWlsKTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjbGllbnRBY3Rpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLmV2ZXJ5KHIgPT4gci5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHIudmFsdWUgIT09IGZhbHNlKTtcbiAgICAgIGlmICghY29udGludWVBY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJSZWNvcmRTZWxlY3Rpb24odGFibGVTZWxlY3Rpb25EZXRhaWwpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVNlcnZlclJlY29yZFNlbGVjdGlvbih0YWJsZVNlbGVjdGlvbkRldGFpbDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZU9iamVjdCwgdGFibGVDb2RlLCByZWNvcmRJZCwgcmVjb3JkRGF0YSB9ID0gdGFibGVTZWxlY3Rpb25EZXRhaWw7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkgeyByZXR1cm47IH1cbiAgICB0YWJsZU9iamVjdC5wdXRPbldhaXQoKTtcbiAgICBsZXQgc2VydmVyRXJyb3IgPSBmYWxzZTtcbiAgICBsZXQgYWN0aW9uUmVzdWx0ID0gbnVsbDtcbiAgICBpZiAodGFibGVPYmplY3Quc2VsZWN0aW9uQmFja2VuZCkge1xuICAgICAgY29uc3QgYWN0aW9uU3ViamVjdDogYW55ID0ge1xuICAgICAgICB0YWJsZUNvZGUsXG4gICAgICAgIGFjdGlvblR5cGU6IHRoaXMuZm9ybUNvbmZpZz8udGFibGVBY3Rpb25zLnJvd1NlbGVjdGlvbixcbiAgICAgICAgYWN0aW9uQ29kZTogbnVsbCxcbiAgICAgICAgdGFibGVSZWNvcmRJZDogcmVjb3JkSWQsXG4gICAgICAgIHRhYmxlUmVjb3JkRGF0YTogcmVjb3JkRGF0YVxuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKEZvcm1BY3Rpb25UeXBlLlRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIHNlcnZlckVycm9yID0gISF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZpbmlzaFRhYmxlUmVjb3JkU2VsZWN0aW9uKHRhYmxlU2VsZWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yKTtcbiAgICBpZiAoc2VydmVyRXJyb3IpIHtcbiAgICAgIHRoaXMuZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKTtcbiAgICB9XG4gICAgdGFibGVPYmplY3QuZnJlZVdhaXRpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFRhYmxlUmVjb3JkU2VsZWN0aW9uKHRhYmxlU2VsZWN0aW9uRGV0YWlsOiBhbnksIGFjdGlvblJlc3VsdDogYW55LCBzZXJ2ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUgfSA9IHRhYmxlU2VsZWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlU2VsZWN0aW9uc0ZpbmlzaFt0YWJsZUNvZGVdO1xuICAgIGlmICh0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZVNlbGVjdGlvbk1ldGhvZCBvZiB0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVTZWxlY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlT25FcnJvciA9IHByb3BlcnRpZXM/LmNvbnRpbnVlT25FcnJvciA/PyBmYWxzZTtcbiAgICAgICAgaWYgKCFzZXJ2ZXJFcnJvciB8fCBjb250aW51ZU9uRXJyb3IpIHtcbiAgICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNhbGxiYWNrKHRhYmxlU2VsZWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlU2VsZWN0aW9uQWN0aW9uKHRhYmxlQWN0aW9uRXZlbnQ6IGFueSkge1xuICAgIHRoaXMubm90aWZ5Rm9ybUFjdGl2aXR5KCk7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUsIGFjdGlvbkRldGFpbCB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb25Db2RlKSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRSZWNvcmRzIH0gPSBhY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgYWN0aW9uID0gdGFibGVPYmplY3QuZ2V0QWN0aW9uKGFjdGlvbkNvZGUpO1xuICAgIGlmICghYWN0aW9uKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IHRhYmxlQWN0aW9uRGV0YWlsID0ge1xuICAgICAgdGFibGVPYmplY3QsXG4gICAgICBhY3Rpb24sXG4gICAgICB0YWJsZUNvZGUsXG4gICAgICBhY3Rpb25Db2RlLFxuICAgICAgc2VsZWN0ZWRSZWNvcmRzXG4gICAgfTtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNTdGFydFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlQWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlID0gY2FsbGJhY2sodGFibGVBY3Rpb25EZXRhaWwpO1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNsaWVudEFjdGlvblByb21pc2UpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZUFjdGlvbiA9IGNsaWVudEFjdGlvblJlc3VsdHMuZXZlcnkociA9PiByLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgci52YWx1ZSAhPT0gZmFsc2UpO1xuICAgICAgaWYgKCFjb250aW51ZUFjdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RhcnRUYWJsZVNlcnZlclNlbGVjdGlvbkFjdGlvbih0YWJsZUFjdGlvbkRldGFpbCk7XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlU2VydmVyU2VsZWN0aW9uQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsOiBhbnkpIHtcbiAgICBjb25zdCB7IHRhYmxlT2JqZWN0LCBhY3Rpb24sIHRhYmxlQ29kZSwgYWN0aW9uQ29kZSwgc2VsZWN0ZWRSZWNvcmRzIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGFjdGlvbi5iYWNrZW5kKSB7XG4gICAgICBjb25zdCBhY3Rpb25TdWJqZWN0ID0ge1xuICAgICAgICB0YWJsZUNvZGUsXG4gICAgICAgIGFjdGlvblR5cGU6IHRoaXMuZm9ybUNvbmZpZz8udGFibGVBY3Rpb25zLnNlbGVjdGlvbixcbiAgICAgICAgYWN0aW9uQ29kZSxcbiAgICAgICAgc2VsZWN0ZWRSZWNvcmRzXG4gICAgICB9O1xuICAgICAgYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpc1xuICAgICAgICAucmVxdWVzdEZvcm1BY3Rpb24oRm9ybUFjdGlvblR5cGUuVGFibGVBY3Rpb24sIGFjdGlvblN1YmplY3QpO1xuICAgICAgc2VydmVyRXJyb3IgPSAhIXRoaXMuZXJyb3JPY2N1cmVkKCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZmluaXNoVGFibGVTZWxlY3Rpb25BY3Rpb24odGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCwgc2VydmVyRXJyb3IpO1xuICAgIGlmICghc2VydmVyRXJyb3IpIHtcbiAgICAgIGFjdGlvbi5uZXdTdGF0ZSAmJiB0aGlzLmNoYW5nZVN0YXRlKGFjdGlvbi5uZXdTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKTtcbiAgICB9XG4gICAgdGFibGVPYmplY3QuZnJlZVdhaXRpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFRhYmxlU2VsZWN0aW9uQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsOiBhbnksIGFjdGlvblJlc3VsdDogYW55LCBzZXJ2ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlQWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSBwcm9wZXJ0aWVzPy5jb250aW51ZU9uRXJyb3IgPz8gZmFsc2U7XG4gICAgICAgIGlmICghc2VydmVyRXJyb3IgfHwgY29udGludWVPbkVycm9yKSB7XG4gICAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZUdldERhdGEodGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgdGhpcy5ub3RpZnlGb3JtQWN0aXZpdHkoKTtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgdGFibGVDb2RlXG4gICAgfTtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUdldERhdGFTdGFydFt0YWJsZUNvZGVdO1xuICAgIGlmICh0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2UgPSBjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2xpZW50QWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQWN0aW9uID0gY2xpZW50QWN0aW9uUmVzdWx0cy5ldmVyeShyID0+IHIuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByLnZhbHVlICE9PSBmYWxzZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFRhYmxlU2VydmVyR2V0RGF0YSh0YWJsZUFjdGlvbkRldGFpbCk7XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlU2VydmVyR2V0RGF0YSh0YWJsZUFjdGlvbkRldGFpbDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZU9iamVjdCwgdGFibGVDb2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICB0YWJsZU9iamVjdC5wdXRPbldhaXQoKTtcbiAgICBsZXQgc2VydmVyRXJyb3IgPSBmYWxzZTtcbiAgICBjb25zdCBhY3Rpb25TdWJqZWN0ID0geyB0YWJsZUNvZGUgfTtcbiAgICBjb25zdCBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzXG4gICAgICAucmVxdWVzdEZvcm1BY3Rpb24oRm9ybUFjdGlvblR5cGUuR2V0VGFibGVEYXRhLCBhY3Rpb25TdWJqZWN0KTtcbiAgICBzZXJ2ZXJFcnJvciA9ICEhdGhpcy5lcnJvck9jY3VyZWQoKTtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaFRhYmxlR2V0RGF0YSh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvcik7XG4gICAgaWYgKHNlcnZlckVycm9yKSB7XG4gICAgICB0aGlzLmRpc3BsYXlUYWJsZVNlcnZlckVycm9yKCk7XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZUdldERhdGEodGFibGVBY3Rpb25EZXRhaWw6IGFueSwgYWN0aW9uUmVzdWx0OiBhbnksIHNlcnZlckVycm9yOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgdGFibGVBY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1t0YWJsZUFjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlQWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSBwcm9wZXJ0aWVzPy5jb250aW51ZU9uRXJyb3IgPz8gZmFsc2U7XG4gICAgICAgIGlmICghc2VydmVyRXJyb3IgfHwgY29udGludWVPbkVycm9yKSB7XG4gICAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tTZWN0aW9uUmVxdWlyZWRGaWVsZHMoc2VjdGlvbkNvZGU6IHN0cmluZywgcmVxRmllbGRNZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgdGhpcy5jbGVhbkVycm9yRmllbGRzKG51bGwsIHNlY3Rpb25Db2RlKTtcbiAgICBjb25zdCByZXF1aXJlZEZpZWxkTWVzc2FnZSA9IHJlcUZpZWxkTWVzc2FnZSA/PyB0aGlzLmZvcm1Db25maWc/LmZvcm1TdGFuZGFyZEVycm9ycy5yZXF1aXJlZEZpZWxkXG4gICAgY29uc3QgbnVtRXJyb3JzID0gdGhpcy50YWdGaWVsZHNXaXRoRXJyb3IocmVxdWlyZWRGaWVsZE1lc3NhZ2UsIHRoaXMuZ2V0UmVxdWlyZWRFbXB0eUZpZWxkcyhudWxsLCBzZWN0aW9uQ29kZSkpO1xuICAgIHJldHVybiAobnVtRXJyb3JzID09PSAwKTtcbiAgfVxuXG4gIHZhbGlkYXRlU2VjdGlvbkNvbnNpc3RlbmN5KHNlY3Rpb25Db2RlOiBzdHJpbmcsIHJlcUZpZWxkTWVzc2FnZT86IHN0cmluZykge1xuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IGNvbXBsZXRlRmllbGRzID0gdGhpcy5jaGVja1NlY3Rpb25SZXF1aXJlZEZpZWxkcyhzZWN0aW9uQ29kZSwgcmVxRmllbGRNZXNzYWdlKTtcbiAgICBpZiAoIWNvbXBsZXRlRmllbGRzKSB7XG4gICAgICB0aGlzLnNldEVycm9yKHRoaXMuZm9ybUNvbmZpZz8uZm9ybVN0YW5kYXJkRXJyb3JzLnR5cGVXYXJuaW5nLFxuICAgICAgICB0aGlzLmZvcm1Db25maWc/LmZvcm1TdGFuZGFyZEVycm9ycy52YWxpZGF0aW9uVGl0bGUsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZz8uZm9ybVN0YW5kYXJkRXJyb3JzLnJlcXVpcmVkRmllbGRzKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHZhbGlkYXRpb25FcnJvciA9IGZhbHNlO1xuICAgIGNvbnN0IHJlcXVpcmVkRW1wdHlGaWVsZHM6IGFueVtdID0gdGhpcy5nZXRSZXF1aXJlZEVtcHR5RmllbGRzKG51bGwsIHNlY3Rpb25Db2RlKSA/PyBbXTtcbiAgICBpZiAocmVxdWlyZWRFbXB0eUZpZWxkcz8ubGVuZ3RoID4gMCkge1xuICAgICAgdmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2V0RXJyb3IodGhpcy5mb3JtQ29uZmlnPy5mb3JtU3RhbmRhcmRFcnJvcnMudHlwZVdhcm5pbmcsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZz8uZm9ybVN0YW5kYXJkRXJyb3JzLnZhbGlkYXRpb25UaXRsZSxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnPy5mb3JtU3RhbmRhcmRFcnJvcnMucmVxdWlyZWRGaWVsZHMpO1xuICAgICAgdGhpcy50YWdGaWVsZHNXaXRoRXJyb3IodGhpcy5mb3JtQ29uZmlnPy5mb3JtU3RhbmRhcmRFcnJvcnMucmVxdWlyZWRGaWVsZCwgcmVxdWlyZWRFbXB0eUZpZWxkcyk7XG4gICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgcmVxdWlyZWRFbXB0eUZpZWxkcykge1xuICAgICAgICBjb25zdCByZXF1aXJlZEVtcHR5RmllbGQgPSB0aGlzLmdldEZpZWxkKGNvZGUpO1xuICAgICAgICByZXF1aXJlZEVtcHR5RmllbGQ/LmZvY3VzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB2YWxpZGF0aW9uSXNzdWVGaWVsZHM6IGFueVtdID0gdGhpcy5nZXRGaWVsZHNXaXRoVmFsaWRhdGlvbklzc3VlcyhudWxsLFxuICAgICAgc2VjdGlvbkNvZGUpID8/IFtdO1xuICAgIGlmICghdmFsaWRhdGlvbkVycm9yICYmIHZhbGlkYXRpb25Jc3N1ZUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YWxpZGF0aW9uRXJyb3IgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRFcnJvcih0aGlzLmZvcm1Db25maWc/LmZvcm1TdGFuZGFyZEVycm9ycy50eXBlV2FybmluZyxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnPy5mb3JtU3RhbmRhcmRFcnJvcnMudmFsaWRhdGlvblRpdGxlLFxuICAgICAgICB0aGlzLmZvcm1Db25maWc/LmZvcm1TdGFuZGFyZEVycm9ycy52YWxpZGF0aW9uRmllbGRzKTtcbiAgICAgIGZvciAoY29uc3QgY29kZSBvZiB2YWxpZGF0aW9uSXNzdWVGaWVsZHMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbklzc3VlRmllbGQgPSB0aGlzLmdldEZpZWxkKGNvZGUpO1xuICAgICAgICBpZiAodmFsaWRhdGlvbklzc3VlRmllbGQpIHtcbiAgICAgICAgICB2YWxpZGF0aW9uSXNzdWVGaWVsZC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdGlvbkVycm9yO1xuICB9XG5cbiAgY29weVRhYmxlUmVjb3JkVG9GaWVsZHModGFibGVPYmo6IGFueSwgbWFwcGluZ1RhYmxlOiBhbnkgPSBudWxsKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlT2JqLnRhYmxlQ29kZSk7XG4gICAgY29uc3QgdGFibGVSZWNvcmQgPSB0YWJsZU9iamVjdD8uZ2V0VGFibGVSZWNvcmQodGFibGVPYmoucmVjb3JkSWQpO1xuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gdGFibGVPYmplY3Q/LmNvbHVtbk5hbWVzO1xuICAgIGlmICh0YWJsZVJlY29yZCAmJiBjb2x1bW5OYW1lcykge1xuICAgICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIG9mIGNvbHVtbk5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtblZhbHVlID0gdGFibGVSZWNvcmQuZ2V0RmllbGRWYWx1ZShjb2x1bW5OYW1lKSA/PyAnJztcbiAgICAgICAgY29uc3QgY29kZSA9IG1hcHBpbmdUYWJsZT8uW2NvbHVtbk5hbWVdID8/IGNvbHVtbk5hbWU7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29kZSA/IHRoaXMuZ2V0RmllbGQoY29kZSkgOiBudWxsO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShjb2x1bW5WYWx1ZSk7XG4gICAgICAgICAgZmllbGQuaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbm90aWZ5Rm9ybUFjdGl2aXR5KCkge1xuICAgIGlmICh0aGlzLl9ub3RpZnlGb3JtQWN0aXZpdHkpIHtcbiAgICAgIHRoaXMuX2V2ZW50RW1pdGVyLm5leHQoJ2Zvcm1BY3Rpdml0eScsIHsgY29kZTogdGhpcy5mb3JtQ29kZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTcOpdG9kb3MgTGVnYWN5IGRlIGNvbXBhdGliaWxpZGFkIGhhY2lhIGF0csOhc1xuICAgKi9cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2UgbmFtZSBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgZ2V0IGZvcm1Db2RlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm5hbWUgPz8gJyc7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2UgbmFtZSBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgc2V0IGZvcm1Db2RlKG5hbWU6IHN0cmluZykgeyB0aGlzLm5hbWUgPSBuYW1lOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIGJ1c3kgc2lnbmFsIGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBnZXQgaW5TZXJ2ZXJQcm9jZXNzKCkgeyByZXR1cm4gdGhpcy5idXN5KCk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugc3RhdGUgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGdldCBjdXJyZW50U3RhdGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc3RhdGUgPz8gJyc7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2UgY2hhbmdlU3RhdGUgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIHNldCBjdXJyZW50U3RhdGUoc3RhdGU6IHN0cmluZykgeyB0aGlzPy5jaGFuZ2VTdGF0ZShzdGF0ZSk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25TZWN0aW9uQWN0aXZhdGlvbiBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgZ2V0IGZvcm1Sb3V0ZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZm9ybVJvdXRlID8/ICcnOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIG9uU2VjdGlvbkFjdGl2YXRpb24gaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIHNldCBmb3JtUm91dGUocm91dGU6IHN0cmluZykgeyB0aGlzLl9mb3JtUm91dGUgPSByb3V0ZTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvblNlY3Rpb25BY3RpdmF0aW9uIGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBhZGRTZWN0aW9uQWN0aXZhdGlvbihjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm9uU2VjdGlvbkFjdGl2YXRpb24oY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvblNlY3Rpb25JbmFjdGl2YXRpb24gaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGFkZFNlY3Rpb25JbmFjdGl2YXRpb24oY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vblNlY3Rpb25JbmFjdGl2YXRpb24oY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvbkFjdGlvblN0YXJ0IGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBhZGRBY3Rpb25NZXRob2RTdGFydChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm9uQWN0aW9uU3RhcnQoY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvbkFjdGlvbkZpbmlzaCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgYWRkQWN0aW9uTWV0aG9kRmluaXNoKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25BY3Rpb25GaW5pc2goY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvbkZpZWxkSW5wdXQgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGFkZEZpZWxkSW5wdXRWYWxpZGF0aW9uKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25GaWVsZElucHV0KGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25GaWVsZFZhbGlkYXRpb25TdGFydCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgYWRkRmllbGRWYWxpZGF0aW9uU3RhcnQoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vbkZpZWxkVmFsaWRhdGlvblN0YXJ0KGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25GaWVsZFZhbGlkYXRpb25GaW5pc2ggaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGFkZEZpZWxkVmFsaWRhdGlvbkZpbmlzaChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm9uRmllbGRWYWxpZGF0aW9uRmluaXNoKGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25UYWJsZUFjdGlvblN0YXJ0IGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBhZGRUYWJsZUFjdGlvblN0YXJ0KGNvZGU6IHN0cmluZywgYWN0aW9uQ29kZTogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm9uVGFibGVBY3Rpb25TdGFydChjb2RlLCBhY3Rpb25Db2RlLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25UYWJsZUFjdGlvbkZpbmlzaCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgYWRkVGFibGVBY3Rpb25GaW5pc2goY29kZTogc3RyaW5nLCBhY3Rpb25Db2RlOiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25UYWJsZUFjdGlvbkZpbmlzaChjb2RlLCBhY3Rpb25Db2RlLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25UYWJsZVNlbGVjdGlvblN0YXJ0IGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBhZGRUYWJsZVNlbGVjdGlvblN0YXJ0KGNvZGU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vblRhYmxlU2VsZWN0aW9uU3RhcnQoY29kZSwgY2FsbGJhY2ssIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIG9uVGFibGVTZWxlY3Rpb25GaW5pc2ggaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGFkZFRhYmxlU2VsZWN0aW9uRmluaXNoKGNvZGU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vblRhYmxlU2VsZWN0aW9uRmluaXNoKGNvZGUsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvblRhYmxlR2V0RGF0YVN0YXJ0IGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBhZGRUYWJsZUdldERhdGFTdGFydChjb2RlOiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25UYWJsZUdldERhdGFTdGFydChjb2RlLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25UYWJsZUdldERhdGFGaW5pc2ggaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGFkZFRhYmxlR2V0RGF0YUZpbmlzaChjb2RlOiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25UYWJsZUdldERhdGFGaW5pc2goY29kZSwgY2FsbGJhY2ssIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIHByb2Nlc3NJbnB1dFBhcmFtcyBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgcHJlb2Nlc3NJbnB1dFBhcmFtcyhwYXJhbXM6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NJbnB1dFBhcmFtcyhwYXJhbXMpO1xuICB9XG5cbn1cbiJdfQ==
|