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