@taimos/radball-digital-api 0.0.0 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/validation.js +60 -60
- package/package.json +1 -1
package/lib/validation.js
CHANGED
|
@@ -58,28 +58,28 @@ exports.ValidationCheckResult = ValidationCheckResult;
|
|
|
58
58
|
function checkAddress(address) {
|
|
59
59
|
const result = new ValidationCheckResult();
|
|
60
60
|
if (address?.city?.trim().length === 0) {
|
|
61
|
-
result.addError('city', '
|
|
61
|
+
result.addError('city', 'Stadt ist erforderlich');
|
|
62
62
|
}
|
|
63
63
|
else if (address.city.length > 200) {
|
|
64
|
-
result.addError('city', '
|
|
64
|
+
result.addError('city', 'Stadt darf 200 Zeichen nicht überschreiten');
|
|
65
65
|
}
|
|
66
66
|
if (address?.country?.trim().length === 0) {
|
|
67
|
-
result.addError('country', '
|
|
67
|
+
result.addError('country', 'Land ist erforderlich');
|
|
68
68
|
}
|
|
69
69
|
else if (address.country.length > 20) {
|
|
70
|
-
result.addError('country', '
|
|
70
|
+
result.addError('country', 'Land darf 20 Zeichen nicht überschreiten');
|
|
71
71
|
}
|
|
72
72
|
if (address?.street?.trim().length === 0) {
|
|
73
|
-
result.addError('street', '
|
|
73
|
+
result.addError('street', 'Straße ist erforderlich');
|
|
74
74
|
}
|
|
75
75
|
else if (address.street.length > 200) {
|
|
76
|
-
result.addError('street', '
|
|
76
|
+
result.addError('street', 'Straße darf 200 Zeichen nicht überschreiten');
|
|
77
77
|
}
|
|
78
78
|
if (address?.zip?.trim().length === 0) {
|
|
79
|
-
result.addError('zip', '
|
|
79
|
+
result.addError('zip', 'PLZ ist erforderlich');
|
|
80
80
|
}
|
|
81
81
|
else if (address.zip.length > 20) {
|
|
82
|
-
result.addError('zip', '
|
|
82
|
+
result.addError('zip', 'PLZ darf 20 Zeichen nicht überschreiten');
|
|
83
83
|
}
|
|
84
84
|
return result;
|
|
85
85
|
}
|
|
@@ -92,36 +92,36 @@ function checkLeague(league) {
|
|
|
92
92
|
// Age range validations
|
|
93
93
|
if (league.minAge != undefined && league.maxAge != undefined) {
|
|
94
94
|
if (league.minAge < 0) {
|
|
95
|
-
result.addError('minAge', '
|
|
95
|
+
result.addError('minAge', 'Mindestalter darf nicht negativ sein');
|
|
96
96
|
}
|
|
97
97
|
if (league.maxAge < 0) {
|
|
98
|
-
result.addError('maxAge', '
|
|
98
|
+
result.addError('maxAge', 'Maximalalter darf nicht negativ sein');
|
|
99
99
|
}
|
|
100
100
|
if (league.maxAge < league.minAge) {
|
|
101
|
-
result.addError('maxAge', '
|
|
101
|
+
result.addError('maxAge', 'Maximalalter muss größer oder gleich dem Mindestalter sein');
|
|
102
102
|
}
|
|
103
103
|
if (league.maxAge > 100) { // adjust as needed
|
|
104
|
-
result.addError('maxAge', '
|
|
104
|
+
result.addError('maxAge', 'Maximalalter überschreitet das vernünftige Limit');
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
107
|
// Name validations
|
|
108
108
|
if (!league.name || league.name.trim().length === 0) {
|
|
109
|
-
result.addError('name', '
|
|
109
|
+
result.addError('name', 'Liganame ist erforderlich');
|
|
110
110
|
}
|
|
111
111
|
else if (league.name.length > 100) { // adjust max length as needed
|
|
112
|
-
result.addError('name', '
|
|
112
|
+
result.addError('name', 'Liganame darf 100 Zeichen nicht überschreiten');
|
|
113
113
|
}
|
|
114
114
|
// Description validation (if required)
|
|
115
115
|
if (league.description && league.description.length > 500) {
|
|
116
|
-
result.addError('description', '
|
|
116
|
+
result.addError('description', 'Beschreibung darf 500 Zeichen nicht überschreiten');
|
|
117
117
|
}
|
|
118
118
|
// Short name validation
|
|
119
119
|
if (league.shortName) {
|
|
120
120
|
if (league.shortName.length > 10) {
|
|
121
|
-
result.addError('shortName', '
|
|
121
|
+
result.addError('shortName', 'Kurzname darf 10 Zeichen nicht überschreiten');
|
|
122
122
|
}
|
|
123
123
|
if (!/^[A-Za-z0-9]+$/.test(league.shortName)) {
|
|
124
|
-
result.addError('shortName', '
|
|
124
|
+
result.addError('shortName', 'Kurzname darf nur alphanumerische Zeichen enthalten');
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
return result;
|
|
@@ -134,15 +134,15 @@ function checkClub(club) {
|
|
|
134
134
|
const result = new ValidationCheckResult();
|
|
135
135
|
// Full name validations
|
|
136
136
|
if (!club.name || club.name.trim().length === 0) {
|
|
137
|
-
result.addError('name', '
|
|
137
|
+
result.addError('name', 'Vereinsname ist erforderlich');
|
|
138
138
|
}
|
|
139
139
|
else if (club.name.length > 100) {
|
|
140
|
-
result.addError('name', '
|
|
140
|
+
result.addError('name', 'Vereinsname darf 100 Zeichen nicht überschreiten');
|
|
141
141
|
}
|
|
142
142
|
// Short name validations
|
|
143
143
|
if (club.shortName) {
|
|
144
144
|
if (club.shortName.length > 30) {
|
|
145
|
-
result.addError('shortName', '
|
|
145
|
+
result.addError('shortName', 'Kurzname darf 30 Zeichen nicht überschreiten');
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
148
|
// Website validation
|
|
@@ -150,11 +150,11 @@ function checkClub(club) {
|
|
|
150
150
|
try {
|
|
151
151
|
new URL(club.website);
|
|
152
152
|
if (!club.website.startsWith('http://') && !club.website.startsWith('https://')) {
|
|
153
|
-
result.addError('website', 'Website
|
|
153
|
+
result.addError('website', 'Website muss mit http:// oder https:// beginnen');
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
catch {
|
|
157
|
-
result.addError('website', '
|
|
157
|
+
result.addError('website', 'Ungültige Website-URL');
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
160
|
// Address validation
|
|
@@ -178,14 +178,14 @@ function checkGym(gym) {
|
|
|
178
178
|
const result = new ValidationCheckResult();
|
|
179
179
|
// Name validations
|
|
180
180
|
if (!gym.name || gym.name.trim().length === 0) {
|
|
181
|
-
result.addError('name', '
|
|
181
|
+
result.addError('name', 'Hallenname ist erforderlich');
|
|
182
182
|
}
|
|
183
183
|
else if (gym.name.length > 100) {
|
|
184
|
-
result.addError('name', '
|
|
184
|
+
result.addError('name', 'Hallenname darf 100 Zeichen nicht überschreiten');
|
|
185
185
|
}
|
|
186
186
|
// available fields validation
|
|
187
187
|
if (!gym.availableFields || gym.availableFields.trim().length === 0) {
|
|
188
|
-
result.addError('availableFields', '
|
|
188
|
+
result.addError('availableFields', 'Verfügbare Felder sind erforderlich');
|
|
189
189
|
}
|
|
190
190
|
// Address validations
|
|
191
191
|
const addressResult = checkAddress(gym.address);
|
|
@@ -206,47 +206,47 @@ function checkSeason(season) {
|
|
|
206
206
|
const result = new ValidationCheckResult();
|
|
207
207
|
// Name validations
|
|
208
208
|
if (!season.name || season.name.trim().length === 0) {
|
|
209
|
-
result.addError('name', '
|
|
209
|
+
result.addError('name', 'Saisonname ist erforderlich');
|
|
210
210
|
}
|
|
211
211
|
else if (season.name.length > 100) {
|
|
212
|
-
result.addError('name', '
|
|
212
|
+
result.addError('name', 'Saisonname darf 100 Zeichen nicht überschreiten');
|
|
213
213
|
}
|
|
214
214
|
// Check for valid dates
|
|
215
215
|
const startDate = new Date(season.startDate);
|
|
216
216
|
const endDate = new Date(season.endDate);
|
|
217
217
|
const registrationEnd = new Date(season.registrationEnd);
|
|
218
218
|
if (isNaN(startDate.getTime()) || isNaN(endDate.getTime()) || isNaN(registrationEnd.getTime())) {
|
|
219
|
-
result.addError('dates', '
|
|
219
|
+
result.addError('dates', 'Ungültiges Datumsformat');
|
|
220
220
|
}
|
|
221
221
|
if (season.registrationStart) {
|
|
222
222
|
const registrationStart = new Date(season.registrationStart);
|
|
223
223
|
if (isNaN(registrationStart.getTime())) {
|
|
224
|
-
result.addError('registrationStart', '
|
|
224
|
+
result.addError('registrationStart', 'Ungültiges Datumsformat');
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
227
|
// Season date validations
|
|
228
228
|
if (endDate <= startDate) {
|
|
229
|
-
result.addError('endDate', '
|
|
229
|
+
result.addError('endDate', 'Saison-Enddatum muss nach dem Startdatum liegen');
|
|
230
230
|
}
|
|
231
231
|
// Registration period validations
|
|
232
232
|
if (season.registrationStart) {
|
|
233
233
|
const registrationStart = new Date(season.registrationStart);
|
|
234
234
|
if (registrationStart) {
|
|
235
235
|
if (registrationEnd <= registrationStart) {
|
|
236
|
-
result.addError('registrationEnd', '
|
|
236
|
+
result.addError('registrationEnd', 'Anmeldungsende muss nach dem Anmeldungsstart liegen');
|
|
237
237
|
}
|
|
238
238
|
if (registrationStart >= startDate) {
|
|
239
|
-
result.addError('registrationStart', '
|
|
239
|
+
result.addError('registrationStart', 'Anmeldung muss vor dem Saisonstart beginnen');
|
|
240
240
|
}
|
|
241
241
|
}
|
|
242
242
|
}
|
|
243
243
|
if (registrationEnd > startDate) {
|
|
244
|
-
result.addError('registrationEnd', '
|
|
244
|
+
result.addError('registrationEnd', 'Anmeldung muss vor dem Saisonstart enden');
|
|
245
245
|
}
|
|
246
246
|
// Future date validation
|
|
247
247
|
const now = new Date();
|
|
248
248
|
if (startDate < now) {
|
|
249
|
-
result.addError('startDate', '
|
|
249
|
+
result.addError('startDate', 'Saison-Startdatum darf nicht in der Vergangenheit liegen');
|
|
250
250
|
}
|
|
251
251
|
return result;
|
|
252
252
|
}
|
|
@@ -258,33 +258,33 @@ function checkPerson(person) {
|
|
|
258
258
|
const result = new ValidationCheckResult();
|
|
259
259
|
// Name validations
|
|
260
260
|
if (!person.firstName?.trim()) {
|
|
261
|
-
result.addError('firstName', '
|
|
261
|
+
result.addError('firstName', 'Vorname ist erforderlich');
|
|
262
262
|
}
|
|
263
263
|
if (!person.lastName?.trim()) {
|
|
264
|
-
result.addError('lastName', '
|
|
264
|
+
result.addError('lastName', 'Nachname ist erforderlich');
|
|
265
265
|
}
|
|
266
266
|
// Email validation
|
|
267
267
|
if (person.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(person.email)) {
|
|
268
|
-
result.addError('email', '
|
|
268
|
+
result.addError('email', 'Ungültiges E-Mail-Format');
|
|
269
269
|
}
|
|
270
270
|
// Phone number validation
|
|
271
271
|
if (person.phone) {
|
|
272
272
|
// Allow digits, spaces, +, -, and ()
|
|
273
273
|
const phoneRegex = /^[\d\s+()-]{8,20}$/;
|
|
274
274
|
if (!phoneRegex.test(person.phone)) {
|
|
275
|
-
result.addError('phone', '
|
|
275
|
+
result.addError('phone', 'Ungültiges Telefonnummer-Format (+49 1234 567890)');
|
|
276
276
|
}
|
|
277
277
|
}
|
|
278
278
|
// Date of birth validation
|
|
279
279
|
if (person.dateOfBirth) {
|
|
280
280
|
const date = new Date(person.dateOfBirth);
|
|
281
281
|
if (isNaN(date.getTime())) {
|
|
282
|
-
result.addError('dateOfBirth', '
|
|
282
|
+
result.addError('dateOfBirth', 'Ungültiges Geburtsdatumsformat');
|
|
283
283
|
}
|
|
284
284
|
// Add age restrictions if needed
|
|
285
285
|
const today = new Date();
|
|
286
286
|
if (date > today) {
|
|
287
|
-
result.addError('dateOfBirth', '
|
|
287
|
+
result.addError('dateOfBirth', 'Geburtsdatum darf nicht in der Zukunft liegen');
|
|
288
288
|
}
|
|
289
289
|
}
|
|
290
290
|
// Address validation
|
|
@@ -308,21 +308,21 @@ function checkAssociation(association) {
|
|
|
308
308
|
const result = new ValidationCheckResult();
|
|
309
309
|
// Name validation
|
|
310
310
|
if (!association.name?.trim()) {
|
|
311
|
-
result.addError('name', '
|
|
311
|
+
result.addError('name', 'Verbandsname ist erforderlich');
|
|
312
312
|
}
|
|
313
313
|
else if (association.name.length > 100) { // adjust max length as needed
|
|
314
|
-
result.addError('name', '
|
|
314
|
+
result.addError('name', 'Verbandsname darf 100 Zeichen nicht überschreiten');
|
|
315
315
|
}
|
|
316
316
|
// Contact Email validation
|
|
317
317
|
if (!association.contactEmail?.trim()) {
|
|
318
|
-
result.addError('contactEmail', '
|
|
318
|
+
result.addError('contactEmail', 'Kontakt-E-Mail ist erforderlich');
|
|
319
319
|
}
|
|
320
320
|
else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(association.contactEmail)) {
|
|
321
|
-
result.addError('contactEmail', '
|
|
321
|
+
result.addError('contactEmail', 'Ungültiges Kontakt-E-Mail-Format');
|
|
322
322
|
}
|
|
323
323
|
// Contact Name validation
|
|
324
324
|
if (!association.contactName?.trim()) {
|
|
325
|
-
result.addError('contactName', '
|
|
325
|
+
result.addError('contactName', 'Kontaktname ist erforderlich');
|
|
326
326
|
}
|
|
327
327
|
// Address validation
|
|
328
328
|
const addressResult = checkAddress(association.address);
|
|
@@ -343,28 +343,28 @@ function checkLeagueGroup(leagueGroup) {
|
|
|
343
343
|
const result = new ValidationCheckResult();
|
|
344
344
|
// Name validations
|
|
345
345
|
if (!leagueGroup.name || leagueGroup.name.trim().length === 0) {
|
|
346
|
-
result.addError('name', '
|
|
346
|
+
result.addError('name', 'Staffelname ist erforderlich');
|
|
347
347
|
}
|
|
348
348
|
else if (leagueGroup.name.length > 100) {
|
|
349
|
-
result.addError('name', '
|
|
349
|
+
result.addError('name', 'Staffelname darf 100 Zeichen nicht überschreiten');
|
|
350
350
|
}
|
|
351
351
|
// Number validation
|
|
352
352
|
if (leagueGroup.number < 1) {
|
|
353
|
-
result.addError('number', '
|
|
353
|
+
result.addError('number', 'Staffelnummer muss positiv sein');
|
|
354
354
|
}
|
|
355
355
|
// Short name validations
|
|
356
356
|
if (!leagueGroup.shortName || leagueGroup.shortName.trim().length === 0) {
|
|
357
|
-
result.addError('shortName', '
|
|
357
|
+
result.addError('shortName', 'Staffel-Kurzname ist erforderlich');
|
|
358
358
|
}
|
|
359
359
|
else if (leagueGroup.shortName.length > 10) {
|
|
360
|
-
result.addError('shortName', '
|
|
360
|
+
result.addError('shortName', 'Staffel-Kurzname darf 10 Zeichen nicht überschreiten');
|
|
361
361
|
}
|
|
362
362
|
else if (!/^[A-Za-z0-9]+$/.test(leagueGroup.shortName)) {
|
|
363
|
-
result.addError('shortName', '
|
|
363
|
+
result.addError('shortName', 'Staffel-Kurzname darf nur alphanumerische Zeichen enthalten');
|
|
364
364
|
}
|
|
365
365
|
// Regulation validation
|
|
366
366
|
if (!leagueGroup.regulation || leagueGroup.regulation.trim().length === 0) {
|
|
367
|
-
result.addError('regulation', '
|
|
367
|
+
result.addError('regulation', 'Staffel-Regelungen sind erforderlich');
|
|
368
368
|
}
|
|
369
369
|
return result;
|
|
370
370
|
}
|
|
@@ -377,31 +377,31 @@ function checkTeam(team) {
|
|
|
377
377
|
// Name validation
|
|
378
378
|
if ('name' in team && team.name !== undefined) {
|
|
379
379
|
if (team.name.trim().length === 0) {
|
|
380
|
-
result.addError('name', '
|
|
380
|
+
result.addError('name', 'Teamname darf nicht leer sein');
|
|
381
381
|
}
|
|
382
382
|
else if (team.name.length > 100) {
|
|
383
|
-
result.addError('name', '
|
|
383
|
+
result.addError('name', 'Teamname darf 100 Zeichen nicht überschreiten');
|
|
384
384
|
}
|
|
385
385
|
}
|
|
386
386
|
else if (!('id' in team)) { // if id is not in team, then it is a new team
|
|
387
|
-
result.addError('name', '
|
|
387
|
+
result.addError('name', 'Teamname ist erforderlich');
|
|
388
388
|
}
|
|
389
389
|
// League ID validation
|
|
390
390
|
if ('leagueId' in team && team.leagueId !== undefined) {
|
|
391
391
|
if (team.leagueId.trim().length === 0) {
|
|
392
|
-
result.addError('leagueId', '
|
|
392
|
+
result.addError('leagueId', 'Liga-ID darf nicht leer sein');
|
|
393
393
|
}
|
|
394
394
|
else if (team.leagueId.length > 100) {
|
|
395
|
-
result.addError('leagueId', '
|
|
395
|
+
result.addError('leagueId', 'Liga-ID darf 100 Zeichen nicht überschreiten');
|
|
396
396
|
}
|
|
397
397
|
}
|
|
398
398
|
else if (!('id' in team)) { // if id is not in team, then it is a new team
|
|
399
|
-
result.addError('leagueId', '
|
|
399
|
+
result.addError('leagueId', 'Liga-ID ist erforderlich');
|
|
400
400
|
}
|
|
401
401
|
// Exemption request validation
|
|
402
402
|
if (team.exemptionRequest) {
|
|
403
403
|
if (team.exemptionRequest.trim().length > 1000) {
|
|
404
|
-
result.addError('exemptionRequest', '
|
|
404
|
+
result.addError('exemptionRequest', 'Freistellungsantrag darf 1000 Zeichen nicht überschreiten');
|
|
405
405
|
}
|
|
406
406
|
}
|
|
407
407
|
return result;
|
|
@@ -410,4 +410,4 @@ function validateTeam(team) {
|
|
|
410
410
|
const result = checkTeam(team);
|
|
411
411
|
result.validate();
|
|
412
412
|
}
|
|
413
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTRDQSxvQ0E0QkM7QUFFRCwwQ0FHQztBQUVELGtDQTBDQztBQUVELHdDQUdDO0FBRUQsOEJBMENDO0FBRUQsb0NBR0M7QUFFRCw0QkEwQkM7QUFFRCxrQ0FHQztBQUVELGtDQXVEQztBQUVELHdDQUdDO0FBRUQsa0NBb0RDO0FBRUQsd0NBR0M7QUFFRCw0Q0FpQ0M7QUFFRCxrREFHQztBQUVELDRDQThCQztBQUVELGtEQUdDO0FBRUQsOEJBaUNDO0FBRUQsb0NBR0M7QUE1YkQsTUFBYSxxQkFBcUI7SUFBbEM7UUFFa0IsYUFBUSxHQUFrQyxFQUFFLENBQUM7UUFDN0MsV0FBTSxHQUFrQyxFQUFFLENBQUM7SUFxQzdELENBQUM7SUFuQ1EsVUFBVSxDQUFDLEtBQWEsRUFBRSxPQUFlO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBYSxFQUFFLE9BQWU7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRU0sc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXhDRCxzREF3Q0M7QUFFRCxTQUFnQixZQUFZLENBQUMsT0FBZ0I7SUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0lBRTNDLElBQUksT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUM5QyxDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsSUFBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxJQUFJLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDcEQsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLE9BQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUscUNBQXFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsSUFBSSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxNQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLHFDQUFxQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELElBQUksT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUNqRCxDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsR0FBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUNwQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLE9BQWdCO0lBQzlDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxNQUEyQztJQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFFM0Msd0JBQXdCO0lBQ3hCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM3RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGdDQUFnQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsMERBQTBELENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsbUJBQW1CO1lBQzVDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLHNDQUFzQyxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFFRCxtQkFBbUI7SUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUNyRCxDQUFDO1NBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDhCQUE4QjtRQUNuRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCx1Q0FBdUM7SUFDdkMsSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQzFELE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLDBDQUEwQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUscURBQXFELENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsTUFBMkM7SUFDeEUsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLElBQXFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUUzQyx3QkFBd0I7SUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUNuRCxDQUFDO1NBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUMvQixNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQztZQUNILElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNoRixNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSw2Q0FBNkMsQ0FBQyxDQUFDO1lBQzVFLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkYsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRCw0Q0FBNEM7UUFDNUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNqRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO1lBQ25FLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLElBQXFDO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQWdCLFFBQVEsQ0FBQyxHQUFrQztJQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFFM0MsbUJBQW1CO0lBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDbEQsQ0FBQztTQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDakMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsK0JBQStCLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsNENBQTRDO0lBQzVDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7UUFDakUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtRQUNuRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLEdBQWtDO0lBQzVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxNQUEyQztJQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFFM0MsbUJBQW1CO0lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLHlCQUF5QixDQUFDLENBQUM7SUFDckQsQ0FBQztTQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsMENBQTBDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsTUFBTSxlQUFlLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRXpELElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMvRixNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDN0QsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixJQUFJLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QixNQUFNLGlCQUFpQixHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdELElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixJQUFJLGVBQWUsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLDZEQUE2RCxDQUFDLENBQUM7WUFDcEcsQ0FBQztZQUNELElBQUksaUJBQWlCLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsa0RBQWtELENBQUMsQ0FBQztZQUMzRixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLGVBQWUsR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLGdEQUFnRCxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZCLElBQUksU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLHlDQUF5QyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsTUFBMkM7SUFDeEUsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLE1BQTJDO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUUzQyxtQkFBbUI7SUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDckUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsMEJBQTBCO0lBQzFCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLHFDQUFxQztRQUNyQyxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELGlDQUFpQztRQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLHVDQUF1QyxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNILENBQUM7SUFFRCxxQkFBcUI7SUFDckIsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzNGLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsNENBQTRDO1FBQzVDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDakUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNuRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxNQUEyQztJQUN4RSxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxXQUEwRDtJQUN6RixNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFFM0Msa0JBQWtCO0lBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUMxRCxDQUFDO1NBQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDhCQUE4QjtRQUN4RSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQy9ELENBQUM7U0FBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLDhCQUE4QixDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLDBCQUEwQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELDRDQUE0QztJQUM1QyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO1FBQ2pFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7UUFDbkUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLFdBQTBEO0lBQzVGLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsV0FBMEQ7SUFDekYsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0lBRTNDLG1CQUFtQjtJQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQzNELENBQUM7U0FBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGdEQUFnRCxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsc0NBQXNDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztTQUFNLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDN0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUscURBQXFELENBQUMsQ0FBQztJQUN0RixDQUFDO1NBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN6RCxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxrRUFBa0UsQ0FBQyxDQUFDO0lBQ25HLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUscUNBQXFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLFdBQTBEO0lBQzVGLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLElBQXlEO0lBQ2pGLE1BQU0sTUFBTSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUUzQyxrQkFBa0I7SUFDbEIsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDOUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLDhDQUE4QztRQUMxRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBQzNELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDeEUsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLDhDQUE4QztRQUMxRSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDL0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxpREFBaUQsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FBQyxJQUF5RDtJQUNwRixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZGRyZXNzLCBNb2RpZnlBc3NvY2lhdGlvbklucHV0LCBNb2RpZnlDbHViSW5wdXQsIE1vZGlmeUd5bUlucHV0LCBNb2RpZnlMZWFndWVJbnB1dCwgTW9kaWZ5UGVyc29uSW5wdXQsIE1vZGlmeVNlYXNvbklucHV0LCBTYXZlQXNzb2NpYXRpb25JbnB1dCwgU2F2ZUNsdWJJbnB1dCwgU2F2ZUd5bUlucHV0LCBTYXZlTGVhZ3VlR3JvdXBJbnB1dCwgU2F2ZUxlYWd1ZUlucHV0LCBTYXZlUGVyc29uSW5wdXQsIFNhdmVTZWFzb25JbnB1dCwgTW9kaWZ5TGVhZ3VlR3JvdXBJbnB1dCwgU2F2ZVRlYW1JbnB1dCwgTW9kaWZ5VGVhbUlucHV0LCBSZWdpc3RlclRlYW1JbnB1dCB9IGZyb20gJ0BnZW5lcmF0ZWQvZ3JhcGhxbC5tb2RlbC5nZW5lcmF0ZWQnO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgd2FybmluZ3M6IHsgW2ZpZWxkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gIHB1YmxpYyByZWFkb25seSBlcnJvcnM6IHsgW2ZpZWxkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG5cbiAgcHVibGljIGFkZFdhcm5pbmcoZmllbGQ6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLndhcm5pbmdzW2ZpZWxkXSkge1xuICAgICAgdGhpcy53YXJuaW5nc1tmaWVsZF0gPSBbXTtcbiAgICB9XG4gICAgdGhpcy53YXJuaW5nc1tmaWVsZF0ucHVzaChtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFcnJvcihmaWVsZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZXJyb3JzW2ZpZWxkXSkge1xuICAgICAgdGhpcy5lcnJvcnNbZmllbGRdID0gW107XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzW2ZpZWxkXS5wdXNoKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIGdldEVycm9yTWVzc2FnZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZXJyb3JzKS5mbGF0KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0V2FybmluZ01lc3NhZ2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLndhcm5pbmdzKS5mbGF0KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXJyb3JNZXNzYWdlc1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldEVycm9yTWVzc2FnZXMoKS5qb2luKCc7ICcpO1xuICB9XG5cbiAgcHVibGljIGdldFdhcm5pbmdNZXNzYWdlc1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFdhcm5pbmdNZXNzYWdlcygpLmpvaW4oJzsgJyk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZXJyb3JzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5nZXRFcnJvck1lc3NhZ2VzU3RyaW5nKCkpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBZGRyZXNzKGFkZHJlc3M6IEFkZHJlc3MpOiBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkNoZWNrUmVzdWx0KCk7XG5cbiAgaWYgKGFkZHJlc3M/LmNpdHk/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NpdHknLCAnQ2l0eSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGFkZHJlc3MuY2l0eSEubGVuZ3RoID4gMjAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdjaXR5JywgJ0NpdHkgY2Fubm90IGV4Y2VlZCAyMDAgY2hhcmFjdGVycycpO1xuICB9XG5cbiAgaWYgKGFkZHJlc3M/LmNvdW50cnk/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NvdW50cnknLCAnQ291bnRyeSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGFkZHJlc3MuY291bnRyeSEubGVuZ3RoID4gMjApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NvdW50cnknLCAnQ291bnRyeSBjYW5ub3QgZXhjZWVkIDIwIGNoYXJhY3RlcnMnKTtcbiAgfVxuXG4gIGlmIChhZGRyZXNzPy5zdHJlZXQ/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3N0cmVldCcsICdTdHJlZXQgaXMgcmVxdWlyZWQnKTtcbiAgfSBlbHNlIGlmIChhZGRyZXNzLnN0cmVldCEubGVuZ3RoID4gMjAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdzdHJlZXQnLCAnU3RyZWV0IGNhbm5vdCBleGNlZWQgMjAwIGNoYXJhY3RlcnMnKTtcbiAgfVxuXG4gIGlmIChhZGRyZXNzPy56aXA/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3ppcCcsICdaaXAgY29kZSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGFkZHJlc3MuemlwIS5sZW5ndGggPiAyMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignemlwJywgJ1ppcCBjb2RlIGNhbm5vdCBleGNlZWQgMjAgY2hhcmFjdGVycycpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBBZGRyZXNzKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrQWRkcmVzcyhhZGRyZXNzKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0xlYWd1ZShsZWFndWU6IFNhdmVMZWFndWVJbnB1dCB8IE1vZGlmeUxlYWd1ZUlucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIEFnZSByYW5nZSB2YWxpZGF0aW9uc1xuICBpZiAobGVhZ3VlLm1pbkFnZSAhPSB1bmRlZmluZWQgJiYgbGVhZ3VlLm1heEFnZSAhPSB1bmRlZmluZWQpIHtcbiAgICBpZiAobGVhZ3VlLm1pbkFnZSA8IDApIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWluQWdlJywgJ01pbmltdW0gYWdlIGNhbm5vdCBiZSBuZWdhdGl2ZScpO1xuICAgIH1cbiAgICBpZiAobGVhZ3VlLm1heEFnZSA8IDApIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWF4QWdlJywgJ01heGltdW0gYWdlIGNhbm5vdCBiZSBuZWdhdGl2ZScpO1xuICAgIH1cbiAgICBpZiAobGVhZ3VlLm1heEFnZSA8IGxlYWd1ZS5taW5BZ2UpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWF4QWdlJywgJ01heGltdW0gYWdlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG1pbmltdW0gYWdlJyk7XG4gICAgfVxuICAgIGlmIChsZWFndWUubWF4QWdlID4gMTAwKSB7IC8vIGFkanVzdCBhcyBuZWVkZWRcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWF4QWdlJywgJ01heGltdW0gYWdlIGV4Y2VlZHMgcmVhc29uYWJsZSBsaW1pdCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5hbWUgdmFsaWRhdGlvbnNcbiAgaWYgKCFsZWFndWUubmFtZSB8fCBsZWFndWUubmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ0xlYWd1ZSBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH0gZWxzZSBpZiAobGVhZ3VlLm5hbWUubGVuZ3RoID4gMTAwKSB7IC8vIGFkanVzdCBtYXggbGVuZ3RoIGFzIG5lZWRlZFxuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdMZWFndWUgbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBEZXNjcmlwdGlvbiB2YWxpZGF0aW9uIChpZiByZXF1aXJlZClcbiAgaWYgKGxlYWd1ZS5kZXNjcmlwdGlvbiAmJiBsZWFndWUuZGVzY3JpcHRpb24ubGVuZ3RoID4gNTAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdkZXNjcmlwdGlvbicsICdEZXNjcmlwdGlvbiBjYW5ub3QgZXhjZWVkIDUwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBTaG9ydCBuYW1lIHZhbGlkYXRpb25cbiAgaWYgKGxlYWd1ZS5zaG9ydE5hbWUpIHtcbiAgICBpZiAobGVhZ3VlLnNob3J0TmFtZS5sZW5ndGggPiAxMCkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCdzaG9ydE5hbWUnLCAnU2hvcnQgbmFtZSBjYW5ub3QgZXhjZWVkIDEwIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gICAgaWYgKCEvXltBLVphLXowLTldKyQvLnRlc3QobGVhZ3VlLnNob3J0TmFtZSkpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignc2hvcnROYW1lJywgJ1Nob3J0IG5hbWUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxlYWd1ZShsZWFndWU6IFNhdmVMZWFndWVJbnB1dCB8IE1vZGlmeUxlYWd1ZUlucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrTGVhZ3VlKGxlYWd1ZSk7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDbHViKGNsdWI6IFNhdmVDbHViSW5wdXQgfCBNb2RpZnlDbHViSW5wdXQpOiBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkNoZWNrUmVzdWx0KCk7XG5cbiAgLy8gRnVsbCBuYW1lIHZhbGlkYXRpb25zXG4gIGlmICghY2x1Yi5uYW1lIHx8IGNsdWIubmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ0NsdWIgbmFtZSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGNsdWIubmFtZS5sZW5ndGggPiAxMDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnQ2x1YiBuYW1lIGNhbm5vdCBleGNlZWQgMTAwIGNoYXJhY3RlcnMnKTtcbiAgfVxuXG4gIC8vIFNob3J0IG5hbWUgdmFsaWRhdGlvbnNcbiAgaWYgKGNsdWIuc2hvcnROYW1lKSB7XG4gICAgaWYgKGNsdWIuc2hvcnROYW1lLmxlbmd0aCA+IDMwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ3Nob3J0TmFtZScsICdTaG9ydCBuYW1lIGNhbm5vdCBleGNlZWQgMzAgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlYnNpdGUgdmFsaWRhdGlvblxuICBpZiAoY2x1Yi53ZWJzaXRlKSB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBVUkwoY2x1Yi53ZWJzaXRlKTtcbiAgICAgIGlmICghY2x1Yi53ZWJzaXRlLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSAmJiAhY2x1Yi53ZWJzaXRlLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgICAgcmVzdWx0LmFkZEVycm9yKCd3ZWJzaXRlJywgJ1dlYnNpdGUgbXVzdCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8nKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignd2Vic2l0ZScsICdJbnZhbGlkIHdlYnNpdGUgVVJMJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkcmVzcyB2YWxpZGF0aW9uXG4gIGlmIChjbHViLmFkZHJlc3MgJiYgKGNsdWIuYWRkcmVzcy5jaXR5IHx8IGNsdWIuYWRkcmVzcy5zdHJlZXQgfHwgY2x1Yi5hZGRyZXNzLnppcCkpIHtcbiAgICBjb25zdCBhZGRyZXNzUmVzdWx0ID0gY2hlY2tBZGRyZXNzKGNsdWIuYWRkcmVzcyk7XG4gICAgLy8gTWVyZ2UgYWRkcmVzcyBlcnJvcnMgaW50byB0aGUgbWFpbiByZXN1bHRcbiAgICBPYmplY3QuZW50cmllcyhhZGRyZXNzUmVzdWx0LmVycm9ycykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkRXJyb3IoYGFkZHJlc3MuJHtmaWVsZH1gLCBtZXNzYWdlKSk7XG4gICAgfSk7XG4gICAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC53YXJuaW5ncykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkV2FybmluZyhgYWRkcmVzcy4ke2ZpZWxkfWAsIG1lc3NhZ2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNsdWIoY2x1YjogU2F2ZUNsdWJJbnB1dCB8IE1vZGlmeUNsdWJJbnB1dCk6IHZvaWQge1xuICBjb25zdCByZXN1bHQgPSBjaGVja0NsdWIoY2x1Yik7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tHeW0oZ3ltOiBTYXZlR3ltSW5wdXQgfCBNb2RpZnlHeW1JbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25zXG4gIGlmICghZ3ltLm5hbWUgfHwgZ3ltLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdHeW0gbmFtZSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGd5bS5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdHeW0gbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBhdmFpbGFibGUgZmllbGRzIHZhbGlkYXRpb25cbiAgaWYgKCFneW0uYXZhaWxhYmxlRmllbGRzIHx8IGd5bS5hdmFpbGFibGVGaWVsZHMudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignYXZhaWxhYmxlRmllbGRzJywgJ0F2YWlsYWJsZSBmaWVsZHMgYXJlIHJlcXVpcmVkJyk7XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25zXG4gIGNvbnN0IGFkZHJlc3NSZXN1bHQgPSBjaGVja0FkZHJlc3MoZ3ltLmFkZHJlc3MpO1xuICAvLyBNZXJnZSBhZGRyZXNzIGVycm9ycyBpbnRvIHRoZSBtYWluIHJlc3VsdFxuICBPYmplY3QuZW50cmllcyhhZGRyZXNzUmVzdWx0LmVycm9ycykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICBtZXNzYWdlcy5mb3JFYWNoKG1lc3NhZ2UgPT4gcmVzdWx0LmFkZEVycm9yKGBhZGRyZXNzLiR7ZmllbGR9YCwgbWVzc2FnZSkpO1xuICB9KTtcbiAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC53YXJuaW5ncykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICBtZXNzYWdlcy5mb3JFYWNoKG1lc3NhZ2UgPT4gcmVzdWx0LmFkZFdhcm5pbmcoYGFkZHJlc3MuJHtmaWVsZH1gLCBtZXNzYWdlKSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUd5bShneW06IFNhdmVHeW1JbnB1dCB8IE1vZGlmeUd5bUlucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrR3ltKGd5bSk7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTZWFzb24oc2Vhc29uOiBTYXZlU2Vhc29uSW5wdXQgfCBNb2RpZnlTZWFzb25JbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25zXG4gIGlmICghc2Vhc29uLm5hbWUgfHwgc2Vhc29uLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdTZWFzb24gbmFtZSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKHNlYXNvbi5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdTZWFzb24gbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgdmFsaWQgZGF0ZXNcbiAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoc2Vhc29uLnN0YXJ0RGF0ZSk7XG4gIGNvbnN0IGVuZERhdGUgPSBuZXcgRGF0ZShzZWFzb24uZW5kRGF0ZSk7XG4gIGNvbnN0IHJlZ2lzdHJhdGlvbkVuZCA9IG5ldyBEYXRlKHNlYXNvbi5yZWdpc3RyYXRpb25FbmQpO1xuXG4gIGlmIChpc05hTihzdGFydERhdGUuZ2V0VGltZSgpKSB8fCBpc05hTihlbmREYXRlLmdldFRpbWUoKSkgfHwgaXNOYU4ocmVnaXN0cmF0aW9uRW5kLmdldFRpbWUoKSkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2RhdGVzJywgJ0ludmFsaWQgZGF0ZSBmb3JtYXQnKTtcbiAgfVxuXG4gIGlmIChzZWFzb24ucmVnaXN0cmF0aW9uU3RhcnQpIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb25TdGFydCA9IG5ldyBEYXRlKHNlYXNvbi5yZWdpc3RyYXRpb25TdGFydCk7XG4gICAgaWYgKGlzTmFOKHJlZ2lzdHJhdGlvblN0YXJ0LmdldFRpbWUoKSkpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uU3RhcnQnLCAnSW52YWxpZCBkYXRlIGZvcm1hdCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlYXNvbiBkYXRlIHZhbGlkYXRpb25zXG4gIGlmIChlbmREYXRlIDw9IHN0YXJ0RGF0ZSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignZW5kRGF0ZScsICdTZWFzb24gZW5kIGRhdGUgbXVzdCBiZSBhZnRlciBzdGFydCBkYXRlJyk7XG4gIH1cblxuICAvLyBSZWdpc3RyYXRpb24gcGVyaW9kIHZhbGlkYXRpb25zXG4gIGlmIChzZWFzb24ucmVnaXN0cmF0aW9uU3RhcnQpIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb25TdGFydCA9IG5ldyBEYXRlKHNlYXNvbi5yZWdpc3RyYXRpb25TdGFydCk7XG4gICAgaWYgKHJlZ2lzdHJhdGlvblN0YXJ0KSB7XG4gICAgICBpZiAocmVnaXN0cmF0aW9uRW5kIDw9IHJlZ2lzdHJhdGlvblN0YXJ0KSB7XG4gICAgICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uRW5kJywgJ1JlZ2lzdHJhdGlvbiBlbmQgZGF0ZSBtdXN0IGJlIGFmdGVyIHJlZ2lzdHJhdGlvbiBzdGFydCBkYXRlJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVnaXN0cmF0aW9uU3RhcnQgPj0gc3RhcnREYXRlKSB7XG4gICAgICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uU3RhcnQnLCAnUmVnaXN0cmF0aW9uIG11c3Qgc3RhcnQgYmVmb3JlIHNlYXNvbiBzdGFydCBkYXRlJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlZ2lzdHJhdGlvbkVuZCA+IHN0YXJ0RGF0ZSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uRW5kJywgJ1JlZ2lzdHJhdGlvbiBtdXN0IGVuZCBiZWZvcmUgc2Vhc29uIHN0YXJ0IGRhdGUnKTtcbiAgfVxuXG4gIC8vIEZ1dHVyZSBkYXRlIHZhbGlkYXRpb25cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgaWYgKHN0YXJ0RGF0ZSA8IG5vdykge1xuICAgIHJlc3VsdC5hZGRFcnJvcignc3RhcnREYXRlJywgJ1NlYXNvbiBzdGFydCBkYXRlIGNhbm5vdCBiZSBpbiB0aGUgcGFzdCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2Vhc29uKHNlYXNvbjogU2F2ZVNlYXNvbklucHV0IHwgTW9kaWZ5U2Vhc29uSW5wdXQpOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tTZWFzb24oc2Vhc29uKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BlcnNvbihwZXJzb246IFNhdmVQZXJzb25JbnB1dCB8IE1vZGlmeVBlcnNvbklucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIE5hbWUgdmFsaWRhdGlvbnNcbiAgaWYgKCFwZXJzb24uZmlyc3ROYW1lPy50cmltKCkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2ZpcnN0TmFtZScsICdGaXJzdCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBpZiAoIXBlcnNvbi5sYXN0TmFtZT8udHJpbSgpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdsYXN0TmFtZScsICdMYXN0IG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIC8vIEVtYWlsIHZhbGlkYXRpb25cbiAgaWYgKHBlcnNvbi5lbWFpbCAmJiAhL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC8udGVzdChwZXJzb24uZW1haWwpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdlbWFpbCcsICdJbnZhbGlkIGVtYWlsIGZvcm1hdCcpO1xuICB9XG5cbiAgLy8gUGhvbmUgbnVtYmVyIHZhbGlkYXRpb25cbiAgaWYgKHBlcnNvbi5waG9uZSkge1xuICAgIC8vIEFsbG93IGRpZ2l0cywgc3BhY2VzLCArLCAtLCBhbmQgKClcbiAgICBjb25zdCBwaG9uZVJlZ2V4ID0gL15bXFxkXFxzKygpLV17OCwyMH0kLztcbiAgICBpZiAoIXBob25lUmVnZXgudGVzdChwZXJzb24ucGhvbmUpKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ3Bob25lJywgJ0ludmFsaWQgcGhvbmUgbnVtYmVyIGZvcm1hdCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERhdGUgb2YgYmlydGggdmFsaWRhdGlvblxuICBpZiAocGVyc29uLmRhdGVPZkJpcnRoKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHBlcnNvbi5kYXRlT2ZCaXJ0aCk7XG4gICAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCdkYXRlT2ZCaXJ0aCcsICdJbnZhbGlkIGRhdGUgb2YgYmlydGggZm9ybWF0Jyk7XG4gICAgfVxuICAgIC8vIEFkZCBhZ2UgcmVzdHJpY3Rpb25zIGlmIG5lZWRlZFxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICBpZiAoZGF0ZSA+IHRvZGF5KSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ2RhdGVPZkJpcnRoJywgJ0RhdGUgb2YgYmlydGggY2Fubm90IGJlIGluIHRoZSBmdXR1cmUnKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25cbiAgaWYgKHBlcnNvbi5hZGRyZXNzICYmIChwZXJzb24uYWRkcmVzcy5jaXR5IHx8IHBlcnNvbi5hZGRyZXNzLnN0cmVldCB8fCBwZXJzb24uYWRkcmVzcy56aXApKSB7XG4gICAgY29uc3QgYWRkcmVzc1Jlc3VsdCA9IGNoZWNrQWRkcmVzcyhwZXJzb24uYWRkcmVzcyk7XG4gICAgLy8gTWVyZ2UgYWRkcmVzcyBlcnJvcnMgaW50byB0aGUgbWFpbiByZXN1bHRcbiAgICBPYmplY3QuZW50cmllcyhhZGRyZXNzUmVzdWx0LmVycm9ycykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkRXJyb3IoYGFkZHJlc3MuJHtmaWVsZH1gLCBtZXNzYWdlKSk7XG4gICAgfSk7XG4gICAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC53YXJuaW5ncykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkV2FybmluZyhgYWRkcmVzcy4ke2ZpZWxkfWAsIG1lc3NhZ2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBlcnNvbihwZXJzb246IFNhdmVQZXJzb25JbnB1dCB8IE1vZGlmeVBlcnNvbklucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrUGVyc29uKHBlcnNvbik7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBc3NvY2lhdGlvbihhc3NvY2lhdGlvbjogU2F2ZUFzc29jaWF0aW9uSW5wdXQgfCBNb2RpZnlBc3NvY2lhdGlvbklucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIE5hbWUgdmFsaWRhdGlvblxuICBpZiAoIWFzc29jaWF0aW9uLm5hbWU/LnRyaW0oKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdBc3NvY2lhdGlvbiBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH0gZWxzZSBpZiAoYXNzb2NpYXRpb24ubmFtZS5sZW5ndGggPiAxMDApIHsgLy8gYWRqdXN0IG1heCBsZW5ndGggYXMgbmVlZGVkXG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ0Fzc29jaWF0aW9uIG5hbWUgY2Fubm90IGV4Y2VlZCAxMDAgY2hhcmFjdGVycycpO1xuICB9XG5cbiAgLy8gQ29udGFjdCBFbWFpbCB2YWxpZGF0aW9uXG4gIGlmICghYXNzb2NpYXRpb24uY29udGFjdEVtYWlsPy50cmltKCkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NvbnRhY3RFbWFpbCcsICdDb250YWN0IGVtYWlsIGlzIHJlcXVpcmVkJyk7XG4gIH0gZWxzZSBpZiAoIS9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvLnRlc3QoYXNzb2NpYXRpb24uY29udGFjdEVtYWlsKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignY29udGFjdEVtYWlsJywgJ0ludmFsaWQgY29udGFjdCBlbWFpbCBmb3JtYXQnKTtcbiAgfVxuXG4gIC8vIENvbnRhY3QgTmFtZSB2YWxpZGF0aW9uXG4gIGlmICghYXNzb2NpYXRpb24uY29udGFjdE5hbWU/LnRyaW0oKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignY29udGFjdE5hbWUnLCAnQ29udGFjdCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25cbiAgY29uc3QgYWRkcmVzc1Jlc3VsdCA9IGNoZWNrQWRkcmVzcyhhc3NvY2lhdGlvbi5hZGRyZXNzKTtcbiAgLy8gTWVyZ2UgYWRkcmVzcyBlcnJvcnMgaW50byB0aGUgbWFpbiByZXN1bHRcbiAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC5lcnJvcnMpLmZvckVhY2goKFtmaWVsZCwgbWVzc2FnZXNdKSA9PiB7XG4gICAgbWVzc2FnZXMuZm9yRWFjaChtZXNzYWdlID0+IHJlc3VsdC5hZGRFcnJvcihgYWRkcmVzcy4ke2ZpZWxkfWAsIG1lc3NhZ2UpKTtcbiAgfSk7XG4gIE9iamVjdC5lbnRyaWVzKGFkZHJlc3NSZXN1bHQud2FybmluZ3MpLmZvckVhY2goKFtmaWVsZCwgbWVzc2FnZXNdKSA9PiB7XG4gICAgbWVzc2FnZXMuZm9yRWFjaChtZXNzYWdlID0+IHJlc3VsdC5hZGRXYXJuaW5nKGBhZGRyZXNzLiR7ZmllbGR9YCwgbWVzc2FnZSkpO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBc3NvY2lhdGlvbihhc3NvY2lhdGlvbjogU2F2ZUFzc29jaWF0aW9uSW5wdXQgfCBNb2RpZnlBc3NvY2lhdGlvbklucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrQXNzb2NpYXRpb24oYXNzb2NpYXRpb24pO1xuICByZXN1bHQudmFsaWRhdGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTGVhZ3VlR3JvdXAobGVhZ3VlR3JvdXA6IFNhdmVMZWFndWVHcm91cElucHV0IHwgTW9kaWZ5TGVhZ3VlR3JvdXBJbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25zXG4gIGlmICghbGVhZ3VlR3JvdXAubmFtZSB8fCBsZWFndWVHcm91cC5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnTGVhZ3VlIGdyb3VwIG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgfSBlbHNlIGlmIChsZWFndWVHcm91cC5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdMZWFndWUgZ3JvdXAgbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBOdW1iZXIgdmFsaWRhdGlvblxuICBpZiAobGVhZ3VlR3JvdXAubnVtYmVyIDwgMSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbnVtYmVyJywgJ0xlYWd1ZSBncm91cCBudW1iZXIgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICB9XG5cbiAgLy8gU2hvcnQgbmFtZSB2YWxpZGF0aW9uc1xuICBpZiAoIWxlYWd1ZUdyb3VwLnNob3J0TmFtZSB8fCBsZWFndWVHcm91cC5zaG9ydE5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignc2hvcnROYW1lJywgJ0xlYWd1ZSBncm91cCBzaG9ydCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH0gZWxzZSBpZiAobGVhZ3VlR3JvdXAuc2hvcnROYW1lLmxlbmd0aCA+IDEwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdzaG9ydE5hbWUnLCAnTGVhZ3VlIGdyb3VwIHNob3J0IG5hbWUgY2Fubm90IGV4Y2VlZCAxMCBjaGFyYWN0ZXJzJyk7XG4gIH0gZWxzZSBpZiAoIS9eW0EtWmEtejAtOV0rJC8udGVzdChsZWFndWVHcm91cC5zaG9ydE5hbWUpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdzaG9ydE5hbWUnLCAnTGVhZ3VlIGdyb3VwIHNob3J0IG5hbWUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycycpO1xuICB9XG5cbiAgLy8gUmVndWxhdGlvbiB2YWxpZGF0aW9uXG4gIGlmICghbGVhZ3VlR3JvdXAucmVndWxhdGlvbiB8fCBsZWFndWVHcm91cC5yZWd1bGF0aW9uLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3JlZ3VsYXRpb24nLCAnTGVhZ3VlIGdyb3VwIHJlZ3VsYXRpb24gaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxlYWd1ZUdyb3VwKGxlYWd1ZUdyb3VwOiBTYXZlTGVhZ3VlR3JvdXBJbnB1dCB8IE1vZGlmeUxlYWd1ZUdyb3VwSW5wdXQpOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tMZWFndWVHcm91cChsZWFndWVHcm91cCk7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tUZWFtKHRlYW06IFNhdmVUZWFtSW5wdXQgfCBNb2RpZnlUZWFtSW5wdXQgfCBSZWdpc3RlclRlYW1JbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25cbiAgaWYgKCduYW1lJyBpbiB0ZWFtICYmIHRlYW0ubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRlYW0ubmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnVGVhbSBuYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH0gZWxzZSBpZiAodGVhbS5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ1RlYW0gbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEoJ2lkJyBpbiB0ZWFtKSkgeyAvLyBpZiBpZCBpcyBub3QgaW4gdGVhbSwgdGhlbiBpdCBpcyBhIG5ldyB0ZWFtXG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ1RlYW0gbmFtZSBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgLy8gTGVhZ3VlIElEIHZhbGlkYXRpb25cbiAgaWYgKCdsZWFndWVJZCcgaW4gdGVhbSAmJiB0ZWFtLmxlYWd1ZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodGVhbS5sZWFndWVJZC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ2xlYWd1ZUlkJywgJ0xlYWd1ZSBJRCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9IGVsc2UgaWYgKHRlYW0ubGVhZ3VlSWQubGVuZ3RoID4gMTAwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ2xlYWd1ZUlkJywgJ0xlYWd1ZSBJRCBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEoJ2lkJyBpbiB0ZWFtKSkgeyAvLyBpZiBpZCBpcyBub3QgaW4gdGVhbSwgdGhlbiBpdCBpcyBhIG5ldyB0ZWFtXG4gICAgcmVzdWx0LmFkZEVycm9yKCdsZWFndWVJZCcsICdMZWFndWUgSUQgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIC8vIEV4ZW1wdGlvbiByZXF1ZXN0IHZhbGlkYXRpb25cbiAgaWYgKHRlYW0uZXhlbXB0aW9uUmVxdWVzdCkge1xuICAgIGlmICh0ZWFtLmV4ZW1wdGlvblJlcXVlc3QudHJpbSgpLmxlbmd0aCA+IDEwMDApIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignZXhlbXB0aW9uUmVxdWVzdCcsICdFeGVtcHRpb24gcmVxdWVzdCBjYW5ub3QgZXhjZWVkIDEwMDAgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRlYW0odGVhbTogU2F2ZVRlYW1JbnB1dCB8IE1vZGlmeVRlYW1JbnB1dCB8IFJlZ2lzdGVyVGVhbUlucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrVGVhbSh0ZWFtKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG4iXX0=
|
|
413
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTRDQSxvQ0E0QkM7QUFFRCwwQ0FHQztBQUVELGtDQTBDQztBQUVELHdDQUdDO0FBRUQsOEJBMENDO0FBRUQsb0NBR0M7QUFFRCw0QkEwQkM7QUFFRCxrQ0FHQztBQUVELGtDQXVEQztBQUVELHdDQUdDO0FBRUQsa0NBb0RDO0FBRUQsd0NBR0M7QUFFRCw0Q0FpQ0M7QUFFRCxrREFHQztBQUVELDRDQThCQztBQUVELGtEQUdDO0FBRUQsOEJBaUNDO0FBRUQsb0NBR0M7QUE1YkQsTUFBYSxxQkFBcUI7SUFBbEM7UUFFa0IsYUFBUSxHQUFrQyxFQUFFLENBQUM7UUFDN0MsV0FBTSxHQUFrQyxFQUFFLENBQUM7SUFxQzdELENBQUM7SUFuQ1EsVUFBVSxDQUFDLEtBQWEsRUFBRSxPQUFlO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBYSxFQUFFLE9BQWU7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRU0sc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXhDRCxzREF3Q0M7QUFFRCxTQUFnQixZQUFZLENBQUMsT0FBZ0I7SUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0lBRTNDLElBQUksT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztJQUNwRCxDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsSUFBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxJQUFJLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDdEQsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLE9BQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsMENBQTBDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsSUFBSSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxNQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLDZDQUE2QyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELElBQUksT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUNqRCxDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsR0FBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUNwQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLE9BQWdCO0lBQzlDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxNQUEyQztJQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFFM0Msd0JBQXdCO0lBQ3hCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM3RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsc0NBQXNDLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLHNDQUFzQyxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsNERBQTRELENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsbUJBQW1CO1lBQzVDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGtEQUFrRCxDQUFDLENBQUM7UUFDaEYsQ0FBQztJQUNILENBQUM7SUFFRCxtQkFBbUI7SUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztJQUN2RCxDQUFDO1NBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDhCQUE4QjtRQUNuRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCx1Q0FBdUM7SUFDdkMsSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQzFELE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLG1EQUFtRCxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLDhDQUE4QyxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUscURBQXFELENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsTUFBMkM7SUFDeEUsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLElBQXFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUUzQyx3QkFBd0I7SUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUMxRCxDQUFDO1NBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxrREFBa0QsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUMvQixNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7SUFDSCxDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQztZQUNILElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNoRixNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxpREFBaUQsQ0FBQyxDQUFDO1lBQ2hGLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkYsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRCw0Q0FBNEM7UUFDNUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNqRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO1lBQ25FLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLElBQXFDO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQWdCLFFBQVEsQ0FBQyxHQUFrQztJQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFFM0MsbUJBQW1CO0lBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLDZCQUE2QixDQUFDLENBQUM7SUFDekQsQ0FBQztTQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDakMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsaURBQWlELENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUscUNBQXFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsNENBQTRDO0lBQzVDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7UUFDakUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtRQUNuRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLEdBQWtDO0lBQzVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxNQUEyQztJQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFFM0MsbUJBQW1CO0lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLDZCQUE2QixDQUFDLENBQUM7SUFDekQsQ0FBQztTQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsaURBQWlELENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsTUFBTSxlQUFlLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRXpELElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMvRixNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDN0QsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixJQUFJLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxpREFBaUQsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QixNQUFNLGlCQUFpQixHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdELElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixJQUFJLGVBQWUsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLHFEQUFxRCxDQUFDLENBQUM7WUFDNUYsQ0FBQztZQUNELElBQUksaUJBQWlCLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsNkNBQTZDLENBQUMsQ0FBQztZQUN0RixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLGVBQWUsR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLDBDQUEwQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZCLElBQUksU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLDBEQUEwRCxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsTUFBMkM7SUFDeEUsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLE1BQTJDO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUUzQyxtQkFBbUI7SUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLDJCQUEyQixDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDckUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsMEJBQTBCO0lBQzFCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLHFDQUFxQztRQUNyQyxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxtREFBbUQsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7SUFDSCxDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLGdDQUFnQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELGlDQUFpQztRQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLCtDQUErQyxDQUFDLENBQUM7UUFDbEYsQ0FBQztJQUNILENBQUM7SUFFRCxxQkFBcUI7SUFDckIsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzNGLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsNENBQTRDO1FBQzVDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDakUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNuRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxNQUEyQztJQUN4RSxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxXQUEwRDtJQUN6RixNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFFM0Msa0JBQWtCO0lBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsK0JBQStCLENBQUMsQ0FBQztJQUMzRCxDQUFDO1NBQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDhCQUE4QjtRQUN4RSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxtREFBbUQsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7U0FBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLDhCQUE4QixDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELDRDQUE0QztJQUM1QyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO1FBQ2pFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7UUFDbkUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLFdBQTBEO0lBQzVGLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsV0FBMEQ7SUFDekYsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0lBRTNDLG1CQUFtQjtJQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO0lBQzFELENBQUM7U0FBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGtEQUFrRCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLG1DQUFtQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztTQUFNLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDN0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsc0RBQXNELENBQUMsQ0FBQztJQUN2RixDQUFDO1NBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN6RCxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSw2REFBNkQsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsc0NBQXNDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLFdBQTBEO0lBQzVGLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLElBQXlEO0lBQ2pGLE1BQU0sTUFBTSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUUzQyxrQkFBa0I7SUFDbEIsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDOUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1FBQzNELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLCtDQUErQyxDQUFDLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLDhDQUE4QztRQUMxRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLDhDQUE4QyxDQUFDLENBQUM7UUFDOUUsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLDhDQUE4QztRQUMxRSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDL0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSwyREFBMkQsQ0FBQyxDQUFDO1FBQ25HLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FBQyxJQUF5RDtJQUNwRixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZGRyZXNzLCBNb2RpZnlBc3NvY2lhdGlvbklucHV0LCBNb2RpZnlDbHViSW5wdXQsIE1vZGlmeUd5bUlucHV0LCBNb2RpZnlMZWFndWVJbnB1dCwgTW9kaWZ5UGVyc29uSW5wdXQsIE1vZGlmeVNlYXNvbklucHV0LCBTYXZlQXNzb2NpYXRpb25JbnB1dCwgU2F2ZUNsdWJJbnB1dCwgU2F2ZUd5bUlucHV0LCBTYXZlTGVhZ3VlR3JvdXBJbnB1dCwgU2F2ZUxlYWd1ZUlucHV0LCBTYXZlUGVyc29uSW5wdXQsIFNhdmVTZWFzb25JbnB1dCwgTW9kaWZ5TGVhZ3VlR3JvdXBJbnB1dCwgU2F2ZVRlYW1JbnB1dCwgTW9kaWZ5VGVhbUlucHV0LCBSZWdpc3RlclRlYW1JbnB1dCB9IGZyb20gJ0BnZW5lcmF0ZWQvZ3JhcGhxbC5tb2RlbC5nZW5lcmF0ZWQnO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgd2FybmluZ3M6IHsgW2ZpZWxkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gIHB1YmxpYyByZWFkb25seSBlcnJvcnM6IHsgW2ZpZWxkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG5cbiAgcHVibGljIGFkZFdhcm5pbmcoZmllbGQ6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLndhcm5pbmdzW2ZpZWxkXSkge1xuICAgICAgdGhpcy53YXJuaW5nc1tmaWVsZF0gPSBbXTtcbiAgICB9XG4gICAgdGhpcy53YXJuaW5nc1tmaWVsZF0ucHVzaChtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFcnJvcihmaWVsZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZXJyb3JzW2ZpZWxkXSkge1xuICAgICAgdGhpcy5lcnJvcnNbZmllbGRdID0gW107XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzW2ZpZWxkXS5wdXNoKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIGdldEVycm9yTWVzc2FnZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZXJyb3JzKS5mbGF0KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0V2FybmluZ01lc3NhZ2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLndhcm5pbmdzKS5mbGF0KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXJyb3JNZXNzYWdlc1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldEVycm9yTWVzc2FnZXMoKS5qb2luKCc7ICcpO1xuICB9XG5cbiAgcHVibGljIGdldFdhcm5pbmdNZXNzYWdlc1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFdhcm5pbmdNZXNzYWdlcygpLmpvaW4oJzsgJyk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZXJyb3JzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5nZXRFcnJvck1lc3NhZ2VzU3RyaW5nKCkpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBZGRyZXNzKGFkZHJlc3M6IEFkZHJlc3MpOiBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkNoZWNrUmVzdWx0KCk7XG5cbiAgaWYgKGFkZHJlc3M/LmNpdHk/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NpdHknLCAnU3RhZHQgaXN0IGVyZm9yZGVybGljaCcpO1xuICB9IGVsc2UgaWYgKGFkZHJlc3MuY2l0eSEubGVuZ3RoID4gMjAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdjaXR5JywgJ1N0YWR0IGRhcmYgMjAwIFplaWNoZW4gbmljaHQgw7xiZXJzY2hyZWl0ZW4nKTtcbiAgfVxuXG4gIGlmIChhZGRyZXNzPy5jb3VudHJ5Py50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdjb3VudHJ5JywgJ0xhbmQgaXN0IGVyZm9yZGVybGljaCcpO1xuICB9IGVsc2UgaWYgKGFkZHJlc3MuY291bnRyeSEubGVuZ3RoID4gMjApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NvdW50cnknLCAnTGFuZCBkYXJmIDIwIFplaWNoZW4gbmljaHQgw7xiZXJzY2hyZWl0ZW4nKTtcbiAgfVxuXG4gIGlmIChhZGRyZXNzPy5zdHJlZXQ/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3N0cmVldCcsICdTdHJhw59lIGlzdCBlcmZvcmRlcmxpY2gnKTtcbiAgfSBlbHNlIGlmIChhZGRyZXNzLnN0cmVldCEubGVuZ3RoID4gMjAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdzdHJlZXQnLCAnU3RyYcOfZSBkYXJmIDIwMCBaZWljaGVuIG5pY2h0IMO8YmVyc2NocmVpdGVuJyk7XG4gIH1cblxuICBpZiAoYWRkcmVzcz8uemlwPy50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCd6aXAnLCAnUExaIGlzdCBlcmZvcmRlcmxpY2gnKTtcbiAgfSBlbHNlIGlmIChhZGRyZXNzLnppcCEubGVuZ3RoID4gMjApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3ppcCcsICdQTFogZGFyZiAyMCBaZWljaGVuIG5pY2h0IMO8YmVyc2NocmVpdGVuJyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IEFkZHJlc3MpOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tBZGRyZXNzKGFkZHJlc3MpO1xuICByZXN1bHQudmFsaWRhdGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTGVhZ3VlKGxlYWd1ZTogU2F2ZUxlYWd1ZUlucHV0IHwgTW9kaWZ5TGVhZ3VlSW5wdXQpOiBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkNoZWNrUmVzdWx0KCk7XG5cbiAgLy8gQWdlIHJhbmdlIHZhbGlkYXRpb25zXG4gIGlmIChsZWFndWUubWluQWdlICE9IHVuZGVmaW5lZCAmJiBsZWFndWUubWF4QWdlICE9IHVuZGVmaW5lZCkge1xuICAgIGlmIChsZWFndWUubWluQWdlIDwgMCkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCdtaW5BZ2UnLCAnTWluZGVzdGFsdGVyIGRhcmYgbmljaHQgbmVnYXRpdiBzZWluJyk7XG4gICAgfVxuICAgIGlmIChsZWFndWUubWF4QWdlIDwgMCkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCdtYXhBZ2UnLCAnTWF4aW1hbGFsdGVyIGRhcmYgbmljaHQgbmVnYXRpdiBzZWluJyk7XG4gICAgfVxuICAgIGlmIChsZWFndWUubWF4QWdlIDwgbGVhZ3VlLm1pbkFnZSkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCdtYXhBZ2UnLCAnTWF4aW1hbGFsdGVyIG11c3MgZ3LDtsOfZXIgb2RlciBnbGVpY2ggZGVtIE1pbmRlc3RhbHRlciBzZWluJyk7XG4gICAgfVxuICAgIGlmIChsZWFndWUubWF4QWdlID4gMTAwKSB7IC8vIGFkanVzdCBhcyBuZWVkZWRcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWF4QWdlJywgJ01heGltYWxhbHRlciDDvGJlcnNjaHJlaXRldCBkYXMgdmVybsO8bmZ0aWdlIExpbWl0Jyk7XG4gICAgfVxuICB9XG5cbiAgLy8gTmFtZSB2YWxpZGF0aW9uc1xuICBpZiAoIWxlYWd1ZS5uYW1lIHx8IGxlYWd1ZS5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnTGlnYW5hbWUgaXN0IGVyZm9yZGVybGljaCcpO1xuICB9IGVsc2UgaWYgKGxlYWd1ZS5uYW1lLmxlbmd0aCA+IDEwMCkgeyAvLyBhZGp1c3QgbWF4IGxlbmd0aCBhcyBuZWVkZWRcbiAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnTGlnYW5hbWUgZGFyZiAxMDAgWmVpY2hlbiBuaWNodCDDvGJlcnNjaHJlaXRlbicpO1xuICB9XG5cbiAgLy8gRGVzY3JpcHRpb24gdmFsaWRhdGlvbiAoaWYgcmVxdWlyZWQpXG4gIGlmIChsZWFndWUuZGVzY3JpcHRpb24gJiYgbGVhZ3VlLmRlc2NyaXB0aW9uLmxlbmd0aCA+IDUwMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignZGVzY3JpcHRpb24nLCAnQmVzY2hyZWlidW5nIGRhcmYgNTAwIFplaWNoZW4gbmljaHQgw7xiZXJzY2hyZWl0ZW4nKTtcbiAgfVxuXG4gIC8vIFNob3J0IG5hbWUgdmFsaWRhdGlvblxuICBpZiAobGVhZ3VlLnNob3J0TmFtZSkge1xuICAgIGlmIChsZWFndWUuc2hvcnROYW1lLmxlbmd0aCA+IDEwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ3Nob3J0TmFtZScsICdLdXJ6bmFtZSBkYXJmIDEwIFplaWNoZW4gbmljaHQgw7xiZXJzY2hyZWl0ZW4nKTtcbiAgICB9XG4gICAgaWYgKCEvXltBLVphLXowLTldKyQvLnRlc3QobGVhZ3VlLnNob3J0TmFtZSkpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignc2hvcnROYW1lJywgJ0t1cnpuYW1lIGRhcmYgbnVyIGFscGhhbnVtZXJpc2NoZSBaZWljaGVuIGVudGhhbHRlbicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxlYWd1ZShsZWFndWU6IFNhdmVMZWFndWVJbnB1dCB8IE1vZGlmeUxlYWd1ZUlucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrTGVhZ3VlKGxlYWd1ZSk7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDbHViKGNsdWI6IFNhdmVDbHViSW5wdXQgfCBNb2RpZnlDbHViSW5wdXQpOiBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkNoZWNrUmVzdWx0KCk7XG5cbiAgLy8gRnVsbCBuYW1lIHZhbGlkYXRpb25zXG4gIGlmICghY2x1Yi5uYW1lIHx8IGNsdWIubmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ1ZlcmVpbnNuYW1lIGlzdCBlcmZvcmRlcmxpY2gnKTtcbiAgfSBlbHNlIGlmIChjbHViLm5hbWUubGVuZ3RoID4gMTAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ1ZlcmVpbnNuYW1lIGRhcmYgMTAwIFplaWNoZW4gbmljaHQgw7xiZXJzY2hyZWl0ZW4nKTtcbiAgfVxuXG4gIC8vIFNob3J0IG5hbWUgdmFsaWRhdGlvbnNcbiAgaWYgKGNsdWIuc2hvcnROYW1lKSB7XG4gICAgaWYgKGNsdWIuc2hvcnROYW1lLmxlbmd0aCA+IDMwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ3Nob3J0TmFtZScsICdLdXJ6bmFtZSBkYXJmIDMwIFplaWNoZW4gbmljaHQgw7xiZXJzY2hyZWl0ZW4nKTtcbiAgICB9XG4gIH1cblxuICAvLyBXZWJzaXRlIHZhbGlkYXRpb25cbiAgaWYgKGNsdWIud2Vic2l0ZSkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgVVJMKGNsdWIud2Vic2l0ZSk7XG4gICAgICBpZiAoIWNsdWIud2Vic2l0ZS5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIWNsdWIud2Vic2l0ZS5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICAgIHJlc3VsdC5hZGRFcnJvcignd2Vic2l0ZScsICdXZWJzaXRlIG11c3MgbWl0IGh0dHA6Ly8gb2RlciBodHRwczovLyBiZWdpbm5lbicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCd3ZWJzaXRlJywgJ1VuZ8O8bHRpZ2UgV2Vic2l0ZS1VUkwnKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25cbiAgaWYgKGNsdWIuYWRkcmVzcyAmJiAoY2x1Yi5hZGRyZXNzLmNpdHkgfHwgY2x1Yi5hZGRyZXNzLnN0cmVldCB8fCBjbHViLmFkZHJlc3MuemlwKSkge1xuICAgIGNvbnN0IGFkZHJlc3NSZXN1bHQgPSBjaGVja0FkZHJlc3MoY2x1Yi5hZGRyZXNzKTtcbiAgICAvLyBNZXJnZSBhZGRyZXNzIGVycm9ycyBpbnRvIHRoZSBtYWluIHJlc3VsdFxuICAgIE9iamVjdC5lbnRyaWVzKGFkZHJlc3NSZXN1bHQuZXJyb3JzKS5mb3JFYWNoKChbZmllbGQsIG1lc3NhZ2VzXSkgPT4ge1xuICAgICAgbWVzc2FnZXMuZm9yRWFjaChtZXNzYWdlID0+IHJlc3VsdC5hZGRFcnJvcihgYWRkcmVzcy4ke2ZpZWxkfWAsIG1lc3NhZ2UpKTtcbiAgICB9KTtcbiAgICBPYmplY3QuZW50cmllcyhhZGRyZXNzUmVzdWx0Lndhcm5pbmdzKS5mb3JFYWNoKChbZmllbGQsIG1lc3NhZ2VzXSkgPT4ge1xuICAgICAgbWVzc2FnZXMuZm9yRWFjaChtZXNzYWdlID0+IHJlc3VsdC5hZGRXYXJuaW5nKGBhZGRyZXNzLiR7ZmllbGR9YCwgbWVzc2FnZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ2x1YihjbHViOiBTYXZlQ2x1YklucHV0IHwgTW9kaWZ5Q2x1YklucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrQ2x1YihjbHViKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0d5bShneW06IFNhdmVHeW1JbnB1dCB8IE1vZGlmeUd5bUlucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIE5hbWUgdmFsaWRhdGlvbnNcbiAgaWYgKCFneW0ubmFtZSB8fCBneW0ubmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ0hhbGxlbm5hbWUgaXN0IGVyZm9yZGVybGljaCcpO1xuICB9IGVsc2UgaWYgKGd5bS5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdIYWxsZW5uYW1lIGRhcmYgMTAwIFplaWNoZW4gbmljaHQgw7xiZXJzY2hyZWl0ZW4nKTtcbiAgfVxuXG4gIC8vIGF2YWlsYWJsZSBmaWVsZHMgdmFsaWRhdGlvblxuICBpZiAoIWd5bS5hdmFpbGFibGVGaWVsZHMgfHwgZ3ltLmF2YWlsYWJsZUZpZWxkcy50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdhdmFpbGFibGVGaWVsZHMnLCAnVmVyZsO8Z2JhcmUgRmVsZGVyIHNpbmQgZXJmb3JkZXJsaWNoJyk7XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25zXG4gIGNvbnN0IGFkZHJlc3NSZXN1bHQgPSBjaGVja0FkZHJlc3MoZ3ltLmFkZHJlc3MpO1xuICAvLyBNZXJnZSBhZGRyZXNzIGVycm9ycyBpbnRvIHRoZSBtYWluIHJlc3VsdFxuICBPYmplY3QuZW50cmllcyhhZGRyZXNzUmVzdWx0LmVycm9ycykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICBtZXNzYWdlcy5mb3JFYWNoKG1lc3NhZ2UgPT4gcmVzdWx0LmFkZEVycm9yKGBhZGRyZXNzLiR7ZmllbGR9YCwgbWVzc2FnZSkpO1xuICB9KTtcbiAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC53YXJuaW5ncykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICBtZXNzYWdlcy5mb3JFYWNoKG1lc3NhZ2UgPT4gcmVzdWx0LmFkZFdhcm5pbmcoYGFkZHJlc3MuJHtmaWVsZH1gLCBtZXNzYWdlKSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUd5bShneW06IFNhdmVHeW1JbnB1dCB8IE1vZGlmeUd5bUlucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrR3ltKGd5bSk7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTZWFzb24oc2Vhc29uOiBTYXZlU2Vhc29uSW5wdXQgfCBNb2RpZnlTZWFzb25JbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25zXG4gIGlmICghc2Vhc29uLm5hbWUgfHwgc2Vhc29uLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdTYWlzb25uYW1lIGlzdCBlcmZvcmRlcmxpY2gnKTtcbiAgfSBlbHNlIGlmIChzZWFzb24ubmFtZS5sZW5ndGggPiAxMDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnU2Fpc29ubmFtZSBkYXJmIDEwMCBaZWljaGVuIG5pY2h0IMO8YmVyc2NocmVpdGVuJyk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgdmFsaWQgZGF0ZXNcbiAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoc2Vhc29uLnN0YXJ0RGF0ZSk7XG4gIGNvbnN0IGVuZERhdGUgPSBuZXcgRGF0ZShzZWFzb24uZW5kRGF0ZSk7XG4gIGNvbnN0IHJlZ2lzdHJhdGlvbkVuZCA9IG5ldyBEYXRlKHNlYXNvbi5yZWdpc3RyYXRpb25FbmQpO1xuXG4gIGlmIChpc05hTihzdGFydERhdGUuZ2V0VGltZSgpKSB8fCBpc05hTihlbmREYXRlLmdldFRpbWUoKSkgfHwgaXNOYU4ocmVnaXN0cmF0aW9uRW5kLmdldFRpbWUoKSkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2RhdGVzJywgJ1VuZ8O8bHRpZ2VzIERhdHVtc2Zvcm1hdCcpO1xuICB9XG5cbiAgaWYgKHNlYXNvbi5yZWdpc3RyYXRpb25TdGFydCkge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvblN0YXJ0ID0gbmV3IERhdGUoc2Vhc29uLnJlZ2lzdHJhdGlvblN0YXJ0KTtcbiAgICBpZiAoaXNOYU4ocmVnaXN0cmF0aW9uU3RhcnQuZ2V0VGltZSgpKSkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCdyZWdpc3RyYXRpb25TdGFydCcsICdVbmfDvGx0aWdlcyBEYXR1bXNmb3JtYXQnKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZWFzb24gZGF0ZSB2YWxpZGF0aW9uc1xuICBpZiAoZW5kRGF0ZSA8PSBzdGFydERhdGUpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2VuZERhdGUnLCAnU2Fpc29uLUVuZGRhdHVtIG11c3MgbmFjaCBkZW0gU3RhcnRkYXR1bSBsaWVnZW4nKTtcbiAgfVxuXG4gIC8vIFJlZ2lzdHJhdGlvbiBwZXJpb2QgdmFsaWRhdGlvbnNcbiAgaWYgKHNlYXNvbi5yZWdpc3RyYXRpb25TdGFydCkge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvblN0YXJ0ID0gbmV3IERhdGUoc2Vhc29uLnJlZ2lzdHJhdGlvblN0YXJ0KTtcbiAgICBpZiAocmVnaXN0cmF0aW9uU3RhcnQpIHtcbiAgICAgIGlmIChyZWdpc3RyYXRpb25FbmQgPD0gcmVnaXN0cmF0aW9uU3RhcnQpIHtcbiAgICAgICAgcmVzdWx0LmFkZEVycm9yKCdyZWdpc3RyYXRpb25FbmQnLCAnQW5tZWxkdW5nc2VuZGUgbXVzcyBuYWNoIGRlbSBBbm1lbGR1bmdzc3RhcnQgbGllZ2VuJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVnaXN0cmF0aW9uU3RhcnQgPj0gc3RhcnREYXRlKSB7XG4gICAgICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uU3RhcnQnLCAnQW5tZWxkdW5nIG11c3Mgdm9yIGRlbSBTYWlzb25zdGFydCBiZWdpbm5lbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChyZWdpc3RyYXRpb25FbmQgPiBzdGFydERhdGUpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3JlZ2lzdHJhdGlvbkVuZCcsICdBbm1lbGR1bmcgbXVzcyB2b3IgZGVtIFNhaXNvbnN0YXJ0IGVuZGVuJyk7XG4gIH1cblxuICAvLyBGdXR1cmUgZGF0ZSB2YWxpZGF0aW9uXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGlmIChzdGFydERhdGUgPCBub3cpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3N0YXJ0RGF0ZScsICdTYWlzb24tU3RhcnRkYXR1bSBkYXJmIG5pY2h0IGluIGRlciBWZXJnYW5nZW5oZWl0IGxpZWdlbicpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2Vhc29uKHNlYXNvbjogU2F2ZVNlYXNvbklucHV0IHwgTW9kaWZ5U2Vhc29uSW5wdXQpOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tTZWFzb24oc2Vhc29uKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BlcnNvbihwZXJzb246IFNhdmVQZXJzb25JbnB1dCB8IE1vZGlmeVBlcnNvbklucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIE5hbWUgdmFsaWRhdGlvbnNcbiAgaWYgKCFwZXJzb24uZmlyc3ROYW1lPy50cmltKCkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2ZpcnN0TmFtZScsICdWb3JuYW1lIGlzdCBlcmZvcmRlcmxpY2gnKTtcbiAgfVxuXG4gIGlmICghcGVyc29uLmxhc3ROYW1lPy50cmltKCkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2xhc3ROYW1lJywgJ05hY2huYW1lIGlzdCBlcmZvcmRlcmxpY2gnKTtcbiAgfVxuXG4gIC8vIEVtYWlsIHZhbGlkYXRpb25cbiAgaWYgKHBlcnNvbi5lbWFpbCAmJiAhL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC8udGVzdChwZXJzb24uZW1haWwpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdlbWFpbCcsICdVbmfDvGx0aWdlcyBFLU1haWwtRm9ybWF0Jyk7XG4gIH1cblxuICAvLyBQaG9uZSBudW1iZXIgdmFsaWRhdGlvblxuICBpZiAocGVyc29uLnBob25lKSB7XG4gICAgLy8gQWxsb3cgZGlnaXRzLCBzcGFjZXMsICssIC0sIGFuZCAoKVxuICAgIGNvbnN0IHBob25lUmVnZXggPSAvXltcXGRcXHMrKCktXXs4LDIwfSQvO1xuICAgIGlmICghcGhvbmVSZWdleC50ZXN0KHBlcnNvbi5waG9uZSkpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcigncGhvbmUnLCAnVW5nw7xsdGlnZXMgVGVsZWZvbm51bW1lci1Gb3JtYXQgKCs0OSAxMjM0IDU2Nzg5MCknKTtcbiAgICB9XG4gIH1cblxuICAvLyBEYXRlIG9mIGJpcnRoIHZhbGlkYXRpb25cbiAgaWYgKHBlcnNvbi5kYXRlT2ZCaXJ0aCkge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShwZXJzb24uZGF0ZU9mQmlydGgpO1xuICAgIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignZGF0ZU9mQmlydGgnLCAnVW5nw7xsdGlnZXMgR2VidXJ0c2RhdHVtc2Zvcm1hdCcpO1xuICAgIH1cbiAgICAvLyBBZGQgYWdlIHJlc3RyaWN0aW9ucyBpZiBuZWVkZWRcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgaWYgKGRhdGUgPiB0b2RheSkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCdkYXRlT2ZCaXJ0aCcsICdHZWJ1cnRzZGF0dW0gZGFyZiBuaWNodCBpbiBkZXIgWnVrdW5mdCBsaWVnZW4nKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25cbiAgaWYgKHBlcnNvbi5hZGRyZXNzICYmIChwZXJzb24uYWRkcmVzcy5jaXR5IHx8IHBlcnNvbi5hZGRyZXNzLnN0cmVldCB8fCBwZXJzb24uYWRkcmVzcy56aXApKSB7XG4gICAgY29uc3QgYWRkcmVzc1Jlc3VsdCA9IGNoZWNrQWRkcmVzcyhwZXJzb24uYWRkcmVzcyk7XG4gICAgLy8gTWVyZ2UgYWRkcmVzcyBlcnJvcnMgaW50byB0aGUgbWFpbiByZXN1bHRcbiAgICBPYmplY3QuZW50cmllcyhhZGRyZXNzUmVzdWx0LmVycm9ycykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkRXJyb3IoYGFkZHJlc3MuJHtmaWVsZH1gLCBtZXNzYWdlKSk7XG4gICAgfSk7XG4gICAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC53YXJuaW5ncykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkV2FybmluZyhgYWRkcmVzcy4ke2ZpZWxkfWAsIG1lc3NhZ2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBlcnNvbihwZXJzb246IFNhdmVQZXJzb25JbnB1dCB8IE1vZGlmeVBlcnNvbklucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrUGVyc29uKHBlcnNvbik7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBc3NvY2lhdGlvbihhc3NvY2lhdGlvbjogU2F2ZUFzc29jaWF0aW9uSW5wdXQgfCBNb2RpZnlBc3NvY2lhdGlvbklucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIE5hbWUgdmFsaWRhdGlvblxuICBpZiAoIWFzc29jaWF0aW9uLm5hbWU/LnRyaW0oKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdWZXJiYW5kc25hbWUgaXN0IGVyZm9yZGVybGljaCcpO1xuICB9IGVsc2UgaWYgKGFzc29jaWF0aW9uLm5hbWUubGVuZ3RoID4gMTAwKSB7IC8vIGFkanVzdCBtYXggbGVuZ3RoIGFzIG5lZWRlZFxuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdWZXJiYW5kc25hbWUgZGFyZiAxMDAgWmVpY2hlbiBuaWNodCDDvGJlcnNjaHJlaXRlbicpO1xuICB9XG5cbiAgLy8gQ29udGFjdCBFbWFpbCB2YWxpZGF0aW9uXG4gIGlmICghYXNzb2NpYXRpb24uY29udGFjdEVtYWlsPy50cmltKCkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NvbnRhY3RFbWFpbCcsICdLb250YWt0LUUtTWFpbCBpc3QgZXJmb3JkZXJsaWNoJyk7XG4gIH0gZWxzZSBpZiAoIS9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvLnRlc3QoYXNzb2NpYXRpb24uY29udGFjdEVtYWlsKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignY29udGFjdEVtYWlsJywgJ1VuZ8O8bHRpZ2VzIEtvbnRha3QtRS1NYWlsLUZvcm1hdCcpO1xuICB9XG5cbiAgLy8gQ29udGFjdCBOYW1lIHZhbGlkYXRpb25cbiAgaWYgKCFhc3NvY2lhdGlvbi5jb250YWN0TmFtZT8udHJpbSgpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdjb250YWN0TmFtZScsICdLb250YWt0bmFtZSBpc3QgZXJmb3JkZXJsaWNoJyk7XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25cbiAgY29uc3QgYWRkcmVzc1Jlc3VsdCA9IGNoZWNrQWRkcmVzcyhhc3NvY2lhdGlvbi5hZGRyZXNzKTtcbiAgLy8gTWVyZ2UgYWRkcmVzcyBlcnJvcnMgaW50byB0aGUgbWFpbiByZXN1bHRcbiAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC5lcnJvcnMpLmZvckVhY2goKFtmaWVsZCwgbWVzc2FnZXNdKSA9PiB7XG4gICAgbWVzc2FnZXMuZm9yRWFjaChtZXNzYWdlID0+IHJlc3VsdC5hZGRFcnJvcihgYWRkcmVzcy4ke2ZpZWxkfWAsIG1lc3NhZ2UpKTtcbiAgfSk7XG4gIE9iamVjdC5lbnRyaWVzKGFkZHJlc3NSZXN1bHQud2FybmluZ3MpLmZvckVhY2goKFtmaWVsZCwgbWVzc2FnZXNdKSA9PiB7XG4gICAgbWVzc2FnZXMuZm9yRWFjaChtZXNzYWdlID0+IHJlc3VsdC5hZGRXYXJuaW5nKGBhZGRyZXNzLiR7ZmllbGR9YCwgbWVzc2FnZSkpO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBc3NvY2lhdGlvbihhc3NvY2lhdGlvbjogU2F2ZUFzc29jaWF0aW9uSW5wdXQgfCBNb2RpZnlBc3NvY2lhdGlvbklucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrQXNzb2NpYXRpb24oYXNzb2NpYXRpb24pO1xuICByZXN1bHQudmFsaWRhdGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTGVhZ3VlR3JvdXAobGVhZ3VlR3JvdXA6IFNhdmVMZWFndWVHcm91cElucHV0IHwgTW9kaWZ5TGVhZ3VlR3JvdXBJbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25zXG4gIGlmICghbGVhZ3VlR3JvdXAubmFtZSB8fCBsZWFndWVHcm91cC5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnU3RhZmZlbG5hbWUgaXN0IGVyZm9yZGVybGljaCcpO1xuICB9IGVsc2UgaWYgKGxlYWd1ZUdyb3VwLm5hbWUubGVuZ3RoID4gMTAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ1N0YWZmZWxuYW1lIGRhcmYgMTAwIFplaWNoZW4gbmljaHQgw7xiZXJzY2hyZWl0ZW4nKTtcbiAgfVxuXG4gIC8vIE51bWJlciB2YWxpZGF0aW9uXG4gIGlmIChsZWFndWVHcm91cC5udW1iZXIgPCAxKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdudW1iZXInLCAnU3RhZmZlbG51bW1lciBtdXNzIHBvc2l0aXYgc2VpbicpO1xuICB9XG5cbiAgLy8gU2hvcnQgbmFtZSB2YWxpZGF0aW9uc1xuICBpZiAoIWxlYWd1ZUdyb3VwLnNob3J0TmFtZSB8fCBsZWFndWVHcm91cC5zaG9ydE5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignc2hvcnROYW1lJywgJ1N0YWZmZWwtS3Vyem5hbWUgaXN0IGVyZm9yZGVybGljaCcpO1xuICB9IGVsc2UgaWYgKGxlYWd1ZUdyb3VwLnNob3J0TmFtZS5sZW5ndGggPiAxMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignc2hvcnROYW1lJywgJ1N0YWZmZWwtS3Vyem5hbWUgZGFyZiAxMCBaZWljaGVuIG5pY2h0IMO8YmVyc2NocmVpdGVuJyk7XG4gIH0gZWxzZSBpZiAoIS9eW0EtWmEtejAtOV0rJC8udGVzdChsZWFndWVHcm91cC5zaG9ydE5hbWUpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdzaG9ydE5hbWUnLCAnU3RhZmZlbC1LdXJ6bmFtZSBkYXJmIG51ciBhbHBoYW51bWVyaXNjaGUgWmVpY2hlbiBlbnRoYWx0ZW4nKTtcbiAgfVxuXG4gIC8vIFJlZ3VsYXRpb24gdmFsaWRhdGlvblxuICBpZiAoIWxlYWd1ZUdyb3VwLnJlZ3VsYXRpb24gfHwgbGVhZ3VlR3JvdXAucmVndWxhdGlvbi50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdyZWd1bGF0aW9uJywgJ1N0YWZmZWwtUmVnZWx1bmdlbiBzaW5kIGVyZm9yZGVybGljaCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTGVhZ3VlR3JvdXAobGVhZ3VlR3JvdXA6IFNhdmVMZWFndWVHcm91cElucHV0IHwgTW9kaWZ5TGVhZ3VlR3JvdXBJbnB1dCk6IHZvaWQge1xuICBjb25zdCByZXN1bHQgPSBjaGVja0xlYWd1ZUdyb3VwKGxlYWd1ZUdyb3VwKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1RlYW0odGVhbTogU2F2ZVRlYW1JbnB1dCB8IE1vZGlmeVRlYW1JbnB1dCB8IFJlZ2lzdGVyVGVhbUlucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIE5hbWUgdmFsaWRhdGlvblxuICBpZiAoJ25hbWUnIGluIHRlYW0gJiYgdGVhbS5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodGVhbS5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdUZWFtbmFtZSBkYXJmIG5pY2h0IGxlZXIgc2VpbicpO1xuICAgIH0gZWxzZSBpZiAodGVhbS5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ1RlYW1uYW1lIGRhcmYgMTAwIFplaWNoZW4gbmljaHQgw7xiZXJzY2hyZWl0ZW4nKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoISgnaWQnIGluIHRlYW0pKSB7IC8vIGlmIGlkIGlzIG5vdCBpbiB0ZWFtLCB0aGVuIGl0IGlzIGEgbmV3IHRlYW1cbiAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnVGVhbW5hbWUgaXN0IGVyZm9yZGVybGljaCcpO1xuICB9XG5cbiAgLy8gTGVhZ3VlIElEIHZhbGlkYXRpb25cbiAgaWYgKCdsZWFndWVJZCcgaW4gdGVhbSAmJiB0ZWFtLmxlYWd1ZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodGVhbS5sZWFndWVJZC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ2xlYWd1ZUlkJywgJ0xpZ2EtSUQgZGFyZiBuaWNodCBsZWVyIHNlaW4nKTtcbiAgICB9IGVsc2UgaWYgKHRlYW0ubGVhZ3VlSWQubGVuZ3RoID4gMTAwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ2xlYWd1ZUlkJywgJ0xpZ2EtSUQgZGFyZiAxMDAgWmVpY2hlbiBuaWNodCDDvGJlcnNjaHJlaXRlbicpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghKCdpZCcgaW4gdGVhbSkpIHsgLy8gaWYgaWQgaXMgbm90IGluIHRlYW0sIHRoZW4gaXQgaXMgYSBuZXcgdGVhbVxuICAgIHJlc3VsdC5hZGRFcnJvcignbGVhZ3VlSWQnLCAnTGlnYS1JRCBpc3QgZXJmb3JkZXJsaWNoJyk7XG4gIH1cblxuICAvLyBFeGVtcHRpb24gcmVxdWVzdCB2YWxpZGF0aW9uXG4gIGlmICh0ZWFtLmV4ZW1wdGlvblJlcXVlc3QpIHtcbiAgICBpZiAodGVhbS5leGVtcHRpb25SZXF1ZXN0LnRyaW0oKS5sZW5ndGggPiAxMDAwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ2V4ZW1wdGlvblJlcXVlc3QnLCAnRnJlaXN0ZWxsdW5nc2FudHJhZyBkYXJmIDEwMDAgWmVpY2hlbiBuaWNodCDDvGJlcnNjaHJlaXRlbicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRlYW0odGVhbTogU2F2ZVRlYW1JbnB1dCB8IE1vZGlmeVRlYW1JbnB1dCB8IFJlZ2lzdGVyVGVhbUlucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrVGVhbSh0ZWFtKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG4iXX0=
|