@sumaris-net/ngx-components 0.24.2 → 0.25.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/bundles/{ngx-sumaris-components.umd.js → sumaris-net.ngx-components.umd.js} +1038 -926
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -0
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +25 -0
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -0
  5. package/doc/changelog.md +4 -0
  6. package/esm2015/public_api.js +2 -1
  7. package/esm2015/src/app/admin/users/list/users.js +6 -4
  8. package/esm2015/src/app/core/graphql/graphql.service.js +25 -72
  9. package/esm2015/src/app/core/graphql/graphql.utils.js +1 -1
  10. package/esm2015/src/app/core/install/install-upgrade-card.component.js +105 -46
  11. package/esm2015/src/app/core/services/account.service.js +146 -149
  12. package/esm2015/src/app/core/services/config.service.js +21 -14
  13. package/esm2015/src/app/core/services/local-settings.service.js +72 -87
  14. package/esm2015/src/app/core/services/network.service.js +136 -171
  15. package/esm2015/src/app/core/services/platform.service.js +34 -17
  16. package/esm2015/src/app/core/services/storage/entities-storage.service.js +59 -63
  17. package/esm2015/src/app/shared/audio/audio.js +10 -39
  18. package/esm2015/src/app/shared/material/boolean/material.boolean.js +1 -1
  19. package/esm2015/src/app/shared/services/startable-service.class.js +77 -0
  20. package/esm2015/src/environments/environment.class.js +1 -1
  21. package/esm2015/src/environments/environment.js +5 -1
  22. package/esm2015/sumaris-net.ngx-components.js +13 -0
  23. package/fesm2015/{ngx-sumaris-components.js → sumaris-net.ngx-components.js} +669 -646
  24. package/fesm2015/sumaris-net.ngx-components.js.map +1 -0
  25. package/package.json +13 -9
  26. package/public_api.d.ts +1 -0
  27. package/src/app/admin/users/list/users.d.ts +1 -0
  28. package/src/app/core/graphql/graphql.service.d.ts +5 -13
  29. package/src/app/core/graphql/graphql.utils.d.ts +2 -1
  30. package/src/app/core/install/install-upgrade-card.component.d.ts +12 -7
  31. package/src/app/core/services/account.service.d.ts +11 -10
  32. package/src/app/core/services/config.service.d.ts +6 -5
  33. package/src/app/core/services/local-settings.service.d.ts +4 -9
  34. package/src/app/core/services/network.service.d.ts +27 -38
  35. package/src/app/core/services/platform.service.d.ts +2 -1
  36. package/src/app/core/services/storage/entities-storage.service.d.ts +13 -13
  37. package/src/app/shared/audio/audio.d.ts +4 -8
  38. package/src/app/shared/services/startable-service.class.d.ts +26 -0
  39. package/src/assets/i18n/fr.json +2 -0
  40. package/src/environments/environment.class.d.ts +1 -0
  41. package/{ngx-sumaris-components.d.ts → sumaris-net.ngx-components.d.ts} +0 -0
  42. package/sumaris-net.ngx-components.metadata.json +1 -0
  43. package/bundles/ngx-sumaris-components.umd.js.map +0 -1
  44. package/bundles/ngx-sumaris-components.umd.min.js +0 -25
  45. package/bundles/ngx-sumaris-components.umd.min.js.map +0 -1
  46. package/esm2015/ngx-sumaris-components.js +0 -13
  47. package/fesm2015/ngx-sumaris-components.js.map +0 -1
  48. package/ngx-sumaris-components.metadata.json +0 -1
@@ -147,7 +147,12 @@ export class AccountService extends BaseGraphqlService {
147
147
  this.storage = storage;
148
148
  this.file = file;
149
149
  this.environment = environment;
150
- this.data = {
150
+ this.onLogin = new Subject();
151
+ this.onLogout = new Subject();
152
+ this.onChange = new Subject();
153
+ this.onAuthTokenChange = new Subject();
154
+ this.onAuthBasicChange = new Subject();
155
+ this._data = {
151
156
  loaded: false,
152
157
  keypair: null,
153
158
  authToken: null,
@@ -161,11 +166,6 @@ export class AccountService extends BaseGraphqlService {
161
166
  this._started = false;
162
167
  this._$additionalFields = new BehaviorSubject([]);
163
168
  this._tokenType$ = new BehaviorSubject(undefined);
164
- this.onLogin = new Subject();
165
- this.onLogout = new Subject();
166
- this.onChange = new Subject();
167
- this.onAuthTokenChange = new Subject();
168
- this.onAuthBasicChange = new Subject();
169
169
  this._debug = !environment.production;
170
170
  if (this._debug)
171
171
  console.debug('[account-service] Creating service');
@@ -173,7 +173,7 @@ export class AccountService extends BaseGraphqlService {
173
173
  // Send auth token to the graphql layer, when changed
174
174
  this.onAuthTokenChange.subscribe((token) => this.graphql.setAuthToken(token));
175
175
  this.onAuthBasicChange.subscribe((basic) => this.graphql.setAuthBasic(basic));
176
- // Listen network restart
176
+ // Listen graphql start (or restart)
177
177
  this.graphql.onStart.subscribe(() => __awaiter(this, void 0, void 0, function* () {
178
178
  if (!this._started) {
179
179
  this.ready();
@@ -195,19 +195,19 @@ export class AccountService extends BaseGraphqlService {
195
195
  }));
196
196
  }
197
197
  get account() {
198
- return this.data.loaded ? this.data.account : undefined;
198
+ return this._data.loaded ? this._data.account : undefined;
199
199
  }
200
200
  get person() {
201
- if (this.data.loaded && !this.data.person) {
202
- this.data.person = this.data.loaded ? this.data.account.asPerson() : undefined;
201
+ if (this._data.loaded && !this._data.person) {
202
+ this._data.person = this._data.loaded ? this._data.account.asPerson() : undefined;
203
203
  }
204
- return this.data.person;
204
+ return this._data.person;
205
205
  }
206
206
  get department() {
207
- if (this.data.loaded && !this.data.department) {
208
- this.data.department = this.data.loaded ? this.data.account.asPerson().department : undefined;
207
+ if (this._data.loaded && !this._data.department) {
208
+ this._data.department = this._data.loaded ? this._data.account.asPerson().department : undefined;
209
209
  }
210
- return this.data.department;
210
+ return this._data.department;
211
211
  }
212
212
  get tokenType() {
213
213
  return this._tokenType$.value;
@@ -217,28 +217,17 @@ export class AccountService extends BaseGraphqlService {
217
217
  console.info('[account] Using authentication token type: ' + value);
218
218
  this._tokenType$.next(value);
219
219
  // Reset values
220
- this.data.authToken = undefined;
220
+ this._data.authToken = undefined;
221
221
  this.onAuthTokenChange.next(undefined);
222
- this.data.authBasic = undefined;
222
+ this._data.authBasic = undefined;
223
223
  this.onAuthBasicChange.next(undefined);
224
224
  }
225
225
  }
226
- resetData() {
227
- this.data.loaded = false;
228
- this.data.keypair = null;
229
- this.data.authToken = null;
230
- this.data.authBasic = null;
231
- this.data.pubkey = null;
232
- this.data.mainProfile = null;
233
- this.data.account = new Account();
234
- this.data.person = null;
235
- this.data.department = null;
236
- }
237
226
  start() {
238
227
  if (this._startPromise)
239
228
  return this._startPromise;
240
229
  if (this._started)
241
- return Promise.resolve();
230
+ return Promise.resolve(this.account);
242
231
  // Restoring local settings
243
232
  this._startPromise = Promise.all([
244
233
  this.settings.ready(),
@@ -249,6 +238,7 @@ export class AccountService extends BaseGraphqlService {
249
238
  .then(() => {
250
239
  this._started = true;
251
240
  this._startPromise = undefined;
241
+ return this.account;
252
242
  });
253
243
  return this._startPromise;
254
244
  }
@@ -260,8 +250,8 @@ export class AccountService extends BaseGraphqlService {
260
250
  if (this._started || this._startPromise) {
261
251
  this._started = false;
262
252
  this._startPromise = undefined;
263
- const hadAuthToken = this.data.authToken && true;
264
- const hadAuthBasic = this.data.authBasic && true;
253
+ const hadAuthToken = this._data.authToken && true;
254
+ const hadAuthBasic = this._data.authBasic && true;
265
255
  const hadAuth = hadAuthToken || hadAuthBasic;
266
256
  this.resetData();
267
257
  if (hadAuth) {
@@ -283,35 +273,35 @@ export class AccountService extends BaseGraphqlService {
283
273
  }
284
274
  ready() {
285
275
  if (this._started)
286
- return Promise.resolve();
276
+ return Promise.resolve(this.account);
287
277
  return this.start();
288
278
  }
289
279
  isLogin() {
290
- return !!(this.data.pubkey && this.data.loaded);
280
+ return !!(this._data.pubkey && this._data.loaded);
291
281
  }
292
282
  isAuth() {
293
- return !!(this.data.pubkey && this.data.keypair && this.data.keypair.secretKey);
283
+ return !!(this._data.pubkey && this._data.keypair && this._data.keypair.secretKey);
294
284
  }
295
285
  hasMinProfile(userProfile) {
296
286
  // should be login, and status ENABLE or TEMPORARY
297
- if (!this.data.account || !this.data.account.pubkey ||
298
- (this.data.account.statusId !== StatusIds.ENABLE && this.data.account.statusId !== StatusIds.TEMPORARY)) {
287
+ if (!this._data.account || !this._data.account.pubkey ||
288
+ (this._data.account.statusId !== StatusIds.ENABLE && this._data.account.statusId !== StatusIds.TEMPORARY)) {
299
289
  return false;
300
290
  }
301
- return PersonUtils.hasUpperOrEqualsProfile(this.data.account.profiles, userProfile);
291
+ return PersonUtils.hasUpperOrEqualsProfile(this._data.account.profiles, userProfile);
302
292
  }
303
293
  hasExactProfile(label) {
304
294
  // should be login, and status ENABLE or TEMPORARY
305
- if (!this.data.account || !this.data.account.pubkey ||
306
- (this.data.account.statusId !== StatusIds.ENABLE && this.data.account.statusId !== StatusIds.TEMPORARY))
295
+ if (!this._data.account || !this._data.account.pubkey ||
296
+ (this._data.account.statusId !== StatusIds.ENABLE && this._data.account.statusId !== StatusIds.TEMPORARY))
307
297
  return false;
308
- return this.data.account.profiles.some(profile => profile === label);
298
+ return this._data.account.profiles.some(profile => profile === label);
309
299
  }
310
300
  hasProfileAndIsEnable(userProfile) {
311
301
  // should be login, and status ENABLE
312
- if (!this.data.account || !this.data.account.pubkey || this.data.account.statusId !== StatusIds.ENABLE)
302
+ if (!this._data.account || !this._data.account.pubkey || this._data.account.statusId !== StatusIds.ENABLE)
313
303
  return false;
314
- return PersonUtils.hasUpperOrEqualsProfile(this.data.account.profiles, userProfile);
304
+ return PersonUtils.hasUpperOrEqualsProfile(this._data.account.profiles, userProfile);
315
305
  }
316
306
  isAdmin() {
317
307
  return this.hasProfileAndIsEnable('ADMIN');
@@ -331,11 +321,11 @@ export class AccountService extends BaseGraphqlService {
331
321
  }
332
322
  isOnlyGuest() {
333
323
  // Should be login, and status ENABLE or TEMPORARY
334
- if (!this.data.account || !this.data.account.pubkey ||
335
- (this.data.account.statusId !== StatusIds.ENABLE && this.data.account.statusId !== StatusIds.TEMPORARY))
324
+ if (!this._data.account || !this._data.account.pubkey ||
325
+ (this._data.account.statusId !== StatusIds.ENABLE && this._data.account.statusId !== StatusIds.TEMPORARY))
336
326
  return false;
337
327
  // Profile less then user
338
- return !PersonUtils.hasUpperOrEqualsProfile(this.data.account.profiles, 'USER');
328
+ return !PersonUtils.hasUpperOrEqualsProfile(this._data.account.profiles, 'USER');
339
329
  }
340
330
  canUserWriteDataForDepartment(recorderDepartment) {
341
331
  if (ReferentialUtils.isEmpty(recorderDepartment)) {
@@ -344,17 +334,17 @@ export class AccountService extends BaseGraphqlService {
344
334
  return this.isAdmin();
345
335
  }
346
336
  // Should be login, and status ENABLE
347
- if (!this.data.account || !this.data.account.pubkey || this.data.account.statusId !== StatusIds.ENABLE)
337
+ if (!this._data.account || !this._data.account.pubkey || this._data.account.statusId !== StatusIds.ENABLE)
348
338
  return false;
349
- if (!this.data.account.department || !this.data.account.department.id) {
339
+ if (!this._data.account.department || !this._data.account.department.id) {
350
340
  console.warn('User account has no department ! Unable to check write right against recorderDepartment');
351
341
  return false;
352
342
  }
353
343
  // Same recorder department: OK, user can write
354
- if (this.data.account.department.id === recorderDepartment.id)
344
+ if (this._data.account.department.id === recorderDepartment.id)
355
345
  return true;
356
346
  // Else, check if supervisor (or more)
357
- return PersonUtils.hasUpperOrEqualsProfile(this.data.account.profiles, 'SUPERVISOR');
347
+ return PersonUtils.hasUpperOrEqualsProfile(this._data.account.profiles, 'SUPERVISOR');
358
348
  }
359
349
  register(data) {
360
350
  return __awaiter(this, void 0, void 0, function* () {
@@ -365,7 +355,7 @@ export class AccountService extends BaseGraphqlService {
365
355
  throw new Error('Missing required username or password');
366
356
  if (this._debug)
367
357
  console.debug('[account] Register new user account...', data.account);
368
- this.data.loaded = false;
358
+ this._data.loaded = false;
369
359
  const now = Date.now();
370
360
  try {
371
361
  const keypair = yield this.cryptoService.scryptKeypair(data.username, data.password);
@@ -375,22 +365,22 @@ export class AccountService extends BaseGraphqlService {
375
365
  data.account.settings.locale = this.settings.locale;
376
366
  data.account.settings.latLongFormat = this.settings.latLongFormat;
377
367
  data.account.department.id = data.account.department.id || this.environment.defaultDepartmentId;
378
- this.data.keypair = keypair;
368
+ this._data.keypair = keypair;
379
369
  const account = yield this.saveRemotely(data.account, keypair);
380
370
  // Default values
381
371
  account.avatar = account.avatar || (this.environment.baseUrl + DEFAULT_AVATAR_IMAGE);
382
- this.data.mainProfile = PersonUtils.getMainProfile(account.profiles);
383
- this.data.account = account;
384
- this.data.pubkey = account.pubkey;
372
+ this._data.mainProfile = PersonUtils.getMainProfile(account.profiles);
373
+ this._data.account = account;
374
+ this._data.pubkey = account.pubkey;
385
375
  // Try to auth on pod
386
376
  yield this.authenticate(data);
387
- this.data.loaded = true;
377
+ this._data.loaded = true;
388
378
  yield this.saveLocally();
389
379
  console.debug(`[account] Account successfully registered in ${Date.now() - now}ms`);
390
380
  // Emit events
391
- this.onLogin.next(this.data.account);
392
- this.onChange.next(this.data.account);
393
- return this.data.account;
381
+ this.onLogin.next(this._data.account);
382
+ this.onChange.next(this._data.account);
383
+ return this._data.account;
394
384
  }
395
385
  catch (error) {
396
386
  console.error(error && error.message || error);
@@ -406,20 +396,20 @@ export class AccountService extends BaseGraphqlService {
406
396
  // Basic auth
407
397
  if (tokenType === 'basic' || tokenType === 'basic-and-token') {
408
398
  // Generate the authBasic, if used
409
- if (!this.data.authBasic) {
399
+ if (!this._data.authBasic) {
410
400
  // Skip if token already provided
411
- if (!(this.data.authToken && tokenType === 'basic-and-token')) {
401
+ if (!(this._data.authToken && tokenType === 'basic-and-token')) {
412
402
  if (!data || !data.username || !data.password)
413
403
  throw new Error('Missing username and password');
414
- this.data.authBasic = this.cryptoService.encodeBase64(`${data.username}:${data.password}`);
404
+ this._data.authBasic = this.cryptoService.encodeBase64(`${data.username}:${data.password}`);
415
405
  }
416
406
  }
417
- this.onAuthBasicChange.next(this.data.authBasic);
407
+ this.onAuthBasicChange.next(this._data.authBasic);
418
408
  }
419
409
  // Generate the authToken, if used
420
410
  if (tokenType === 'token' || tokenType === 'basic-and-token') {
421
411
  try {
422
- this.data.authToken = yield this.authenticateAndGetToken(this.data.authToken);
412
+ this._data.authToken = yield this.authenticateAndGetToken(this._data.authToken);
423
413
  }
424
414
  catch (error) {
425
415
  // Never authenticate, or not ready for offline mode => exit
@@ -430,7 +420,7 @@ export class AccountService extends BaseGraphqlService {
430
420
  }
431
421
  // Forget authBasic, to switch to authToken
432
422
  if (tokenType === 'basic-and-token') {
433
- this.data.authBasic = undefined;
423
+ this._data.authBasic = undefined;
434
424
  this.onAuthBasicChange.next(undefined);
435
425
  }
436
426
  });
@@ -450,18 +440,18 @@ export class AccountService extends BaseGraphqlService {
450
440
  throw { code: ErrorCodes.UNKNOWN_ERROR, message: 'ERROR.SCRYPT_ERROR' };
451
441
  }
452
442
  // Store pubkey+keypair
453
- this.data.pubkey = Base58.encode(keypair.publicKey);
454
- this.data.keypair = keypair;
443
+ this._data.pubkey = Base58.encode(keypair.publicKey);
444
+ this._data.keypair = keypair;
455
445
  // Try to load previous token
456
446
  let previousToken = yield this.storage.get(TOKEN_STORAGE_KEY);
457
- previousToken = previousToken && previousToken.startsWith(this.data.pubkey) && previousToken || null;
447
+ previousToken = previousToken && previousToken.startsWith(this._data.pubkey) && previousToken || null;
458
448
  // Offline mode
459
449
  const offline = this.settings.hasOfflineFeature() && (this.network.offline || data.offline === true);
460
450
  if (offline) {
461
- this.data.authToken = previousToken;
451
+ this._data.authToken = previousToken;
462
452
  // Make sure network if set as offline
463
453
  this.network.setForceOffline(true, { showToast: false });
464
- console.info(`[account] Login [OK] {pubkey: ${this.data.pubkey.substr(0, 8)}}, {offline: true}`);
454
+ console.info(`[account] Login [OK] {pubkey: ${this._data.pubkey.substr(0, 8)}}, {offline: true}`);
465
455
  }
466
456
  // Online mode: try to auth on pod
467
457
  else {
@@ -511,14 +501,14 @@ export class AccountService extends BaseGraphqlService {
511
501
  throw error;
512
502
  }
513
503
  // Emit event to observers
514
- this.onLogin.next(this.data.account);
515
- this.onChange.next(this.data.account);
516
- return this.data.account;
504
+ this.onLogin.next(this._data.account);
505
+ this.onChange.next(this._data.account);
506
+ return this._data.account;
517
507
  });
518
508
  }
519
509
  refresh() {
520
510
  return __awaiter(this, void 0, void 0, function* () {
521
- if (!this.data.pubkey)
511
+ if (!this._data.pubkey)
522
512
  throw new Error('User not logged');
523
513
  if (this.network.offline)
524
514
  throw new Error('Cannot check account in offline mode');
@@ -526,9 +516,9 @@ export class AccountService extends BaseGraphqlService {
526
516
  yield this.saveLocally();
527
517
  console.debug('[account] Successfully reload account');
528
518
  // Emit login event to subscribers
529
- this.onLogin.next(this.data.account);
530
- this.onChange.next(this.data.account);
531
- return this.data.account;
519
+ this.onLogin.next(this._data.account);
520
+ this.onChange.next(this._data.account);
521
+ return this._data.account;
532
522
  });
533
523
  }
534
524
  /**
@@ -538,29 +528,29 @@ export class AccountService extends BaseGraphqlService {
538
528
  */
539
529
  save(account) {
540
530
  return __awaiter(this, void 0, void 0, function* () {
541
- if (!this.data.pubkey)
531
+ if (!this._data.pubkey)
542
532
  return Promise.reject('User not logged');
543
- if (this.data.pubkey !== account.pubkey)
533
+ if (this._data.pubkey !== account.pubkey)
544
534
  return Promise.reject('Not user account');
545
- account = yield this.saveRemotely(account, this.data.keypair);
535
+ account = yield this.saveRemotely(account, this._data.keypair);
546
536
  // Set defaults
547
537
  account.avatar = account.avatar || (this.environment.baseUrl + DEFAULT_AVATAR_IMAGE);
548
- this.data.mainProfile = PersonUtils.getMainProfile(account.profiles);
549
- this.data.account = account;
550
- this.data.loaded = true;
538
+ this._data.mainProfile = PersonUtils.getMainProfile(account.profiles);
539
+ this._data.account = account;
540
+ this._data.loaded = true;
551
541
  // Save locally (in storage)
552
542
  yield this.saveLocally();
553
543
  // Send event
554
- this.onLogin.next(this.data.account);
555
- this.onChange.next(this.data.account);
556
- return this.data.account;
544
+ this.onLogin.next(this._data.account);
545
+ this.onChange.next(this._data.account);
546
+ return this._data.account;
557
547
  });
558
548
  }
559
549
  logout() {
560
550
  return __awaiter(this, void 0, void 0, function* () {
561
- const hadAuthToken = this.data.authToken && true;
562
- const hadAuthBasic = this.data.authBasic && true;
563
- const pubkey = this.data && this.data.pubkey;
551
+ const hadAuthToken = this._data.authToken && true;
552
+ const hadAuthBasic = this._data.authBasic && true;
553
+ const pubkey = this._data && this._data.pubkey;
564
554
  this.resetData();
565
555
  if (!this.settings.hasOfflineFeature()) {
566
556
  // Remove all data from the local storage
@@ -613,9 +603,9 @@ export class AccountService extends BaseGraphqlService {
613
603
  if (offline) {
614
604
  json = yield this.storage.get(ACCOUNT_STORAGE_KEY);
615
605
  json = json && (typeof json === 'string') && JSON.parse(json) || json;
616
- json = json && this.data.pubkey && (json.pubkey === this.data.pubkey) && json || null;
617
- if (!json && this.data.pubkey) {
618
- json = yield this.storage.get(ACCOUNT_STORAGE_KEY + '#' + this.data.pubkey);
606
+ json = json && this._data.pubkey && (json.pubkey === this._data.pubkey) && json || null;
607
+ if (!json && this._data.pubkey) {
608
+ json = yield this.storage.get(ACCOUNT_STORAGE_KEY + '#' + this._data.pubkey);
619
609
  json = json && (typeof json === 'string') && JSON.parse(json) || json;
620
610
  }
621
611
  }
@@ -710,7 +700,7 @@ export class AccountService extends BaseGraphqlService {
710
700
  });
711
701
  }
712
702
  listenChanges() {
713
- if (!this.data.pubkey)
703
+ if (!this._data.pubkey)
714
704
  return Subscription.EMPTY;
715
705
  const self = this;
716
706
  console.debug('[account] [WS] Listening account changes');
@@ -724,34 +714,30 @@ export class AccountService extends BaseGraphqlService {
724
714
  message: 'ERROR.ACCOUNT.SUBSCRIBE_ACCOUNT_ERROR'
725
715
  }
726
716
  }).subscribe({
727
- next({ data }) {
717
+ next: ({ data }) => __awaiter(this, void 0, void 0, function* () {
728
718
  var _a;
729
- return __awaiter(this, void 0, void 0, function* () {
730
- if (!data)
731
- return;
732
- const existingUpdateDate = toDateISOString((_a = self.data.account) === null || _a === void 0 ? void 0 : _a.updateDate);
733
- if (existingUpdateDate !== data.updateDate) {
734
- console.debug(`[account] [WS] Detected update on {${data.updateDate}}`);
735
- yield self.refresh();
736
- }
737
- });
738
- },
739
- error(err) {
740
- return __awaiter(this, void 0, void 0, function* () {
741
- if (err && +err.code === ServerErrorCodes.NOT_FOUND) {
742
- console.info('[account] Account not exists anymore: force user to logout...', err);
743
- yield self.logout();
744
- }
745
- else if (err && +err.code === ServerErrorCodes.UNAUTHORIZED) {
746
- console.info('[account] Account not authorized: force user to logout...', err);
747
- yield self.logout();
748
- }
749
- else {
750
- console.warn('[account] [WS] Received error:', err);
751
- }
752
- });
753
- },
754
- complete() {
719
+ if (!data)
720
+ return;
721
+ const existingUpdateDate = toDateISOString((_a = self._data.account) === null || _a === void 0 ? void 0 : _a.updateDate);
722
+ if (existingUpdateDate !== data.updateDate) {
723
+ console.debug(`[account] [WS] Detected update on {${data.updateDate}}`);
724
+ yield self.refresh();
725
+ }
726
+ }),
727
+ error: (err) => __awaiter(this, void 0, void 0, function* () {
728
+ if (err && +err.code === ServerErrorCodes.NOT_FOUND) {
729
+ console.info('[account] Account not exists anymore: force user to logout...', err);
730
+ yield self.logout();
731
+ }
732
+ else if (err && +err.code === ServerErrorCodes.UNAUTHORIZED) {
733
+ console.info('[account] Account not authorized: force user to logout...', err);
734
+ yield self.logout();
735
+ }
736
+ else {
737
+ console.warn('[account] [WS] Received error:', err);
738
+ }
739
+ }),
740
+ complete: () => {
755
741
  console.debug('[account] [WS] Completed');
756
742
  }
757
743
  });
@@ -792,29 +778,40 @@ export class AccountService extends BaseGraphqlService {
792
778
  this._$additionalFields.next(values.concat(field));
793
779
  }
794
780
  /* -- protected method -- */
781
+ resetData() {
782
+ this._data.loaded = false;
783
+ this._data.keypair = null;
784
+ this._data.authToken = null;
785
+ this._data.authBasic = null;
786
+ this._data.pubkey = null;
787
+ this._data.mainProfile = null;
788
+ this._data.account = new Account();
789
+ this._data.person = null;
790
+ this._data.department = null;
791
+ }
795
792
  loadData(opts) {
796
793
  return __awaiter(this, void 0, void 0, function* () {
797
- if (!this.data.pubkey)
794
+ if (!this._data.pubkey)
798
795
  throw new Error('User not logged');
799
- this.data.loaded = false;
796
+ this._data.loaded = false;
800
797
  try {
801
- let account = (yield this.load(opts)) || new Account();
798
+ const account = (yield this.load(opts)) || new Account();
802
799
  // Set defaults
803
800
  account.avatar = account.avatar || (this.environment.baseUrl + DEFAULT_AVATAR_IMAGE);
804
801
  account.settings = account.settings || new UserSettings();
805
802
  account.settings.locale = account.settings.locale || this.settings.locale;
806
803
  account.settings.latLongFormat = account.settings.latLongFormat || this.settings.latLongFormat || 'DDMM';
807
804
  // Read main profile
808
- this.data.mainProfile = PersonUtils.getMainProfile(account.profiles);
805
+ this._data.mainProfile = PersonUtils.getMainProfile(account.profiles);
809
806
  // Update, instead of replace it
810
- if (this.data.account) {
811
- this.data.account.fromObject(account);
807
+ if (this._data.account) {
808
+ this._data.account.fromObject(account);
812
809
  }
813
810
  else {
814
- this.data.account = account;
811
+ this._data.account = account;
815
812
  }
816
- this.data.loaded = true;
817
- return this.data.account;
813
+ this._data.loaded = true;
814
+ return this._data.account;
818
815
  }
819
816
  catch (error) {
820
817
  this.resetData();
@@ -848,9 +845,9 @@ export class AccountService extends BaseGraphqlService {
848
845
  return;
849
846
  if (this._debug)
850
847
  console.debug(`[account] Account restoration...`);
851
- this.data.authToken = token;
852
- this.data.pubkey = pubkey;
853
- this.data.keypair = seckey && {
848
+ this._data.authToken = token;
849
+ this._data.pubkey = pubkey;
850
+ this._data.keypair = seckey && {
854
851
  publicKey: Base58.decode(pubkey),
855
852
  secretKey: Base58.decode(seckey)
856
853
  } || null;
@@ -858,7 +855,7 @@ export class AccountService extends BaseGraphqlService {
858
855
  if (this.network.online) {
859
856
  try {
860
857
  yield this.authenticate();
861
- if (!this.data.authToken && !this.data.authBasic)
858
+ if (!this._data.authToken && !this._data.authBasic)
862
859
  throw new Error('Authentication failed');
863
860
  }
864
861
  catch (error) {
@@ -889,14 +886,14 @@ export class AccountService extends BaseGraphqlService {
889
886
  // Transform to entity
890
887
  const account = Account.fromObject(jsonAccount);
891
888
  // Update data
892
- this.data.account = account;
893
- this.data.mainProfile = PersonUtils.getMainProfile(account.profiles);
894
- this.data.loaded = true;
889
+ this._data.account = account;
890
+ this._data.mainProfile = PersonUtils.getMainProfile(account.profiles);
891
+ this._data.loaded = true;
895
892
  // Emit event
896
- this.onLogin.next(this.data.account);
897
- this.onChange.next(this.data.account);
893
+ this.onLogin.next(this._data.account);
894
+ this.onChange.next(this._data.account);
898
895
  if (this._debug)
899
- console.debug(`[account] Account restoration [OK] {pubkey: ${pubkey.substr(0, 8)}}, {profile: ${this.data.mainProfile}}`);
896
+ console.debug(`[account] Account restoration [OK] {pubkey: ${pubkey.substr(0, 8)}}, {profile: ${this._data.mainProfile}}`);
900
897
  return account;
901
898
  });
902
899
  }
@@ -905,13 +902,13 @@ export class AccountService extends BaseGraphqlService {
905
902
  */
906
903
  saveLocally() {
907
904
  return __awaiter(this, void 0, void 0, function* () {
908
- if (!this.data.pubkey)
905
+ if (!this._data.pubkey)
909
906
  throw new Error('User not logged');
910
907
  if (this._debug)
911
- console.debug(`[account] Saving account {${this.data.pubkey.substring(0, 6)}} in local storage...`);
908
+ console.debug(`[account] Saving account {${this._data.pubkey.substring(0, 6)}} in local storage...`);
912
909
  // Convert account to json
913
- const json = this.data.account.asObject({ keepTypename: true });
914
- const seckey = this.data.keypair && this.data.keypair.secretKey && Base58.encode(this.data.keypair.secretKey) || null;
910
+ const json = this._data.account.asObject({ keepTypename: true });
911
+ const seckey = this._data.keypair && this._data.keypair.secretKey && Base58.encode(this._data.keypair.secretKey) || null;
915
912
  // Convert avatar URL to dataUrl (e.g. 'data:image/png:<base64 content>')
916
913
  const hasAvatarUrl = json.avatar && !json.avatar.endsWith(DEFAULT_AVATAR_IMAGE) &&
917
914
  (json.avatar.startsWith('http://') || (json.avatar.startsWith('https://')));
@@ -932,9 +929,9 @@ export class AccountService extends BaseGraphqlService {
932
929
  }
933
930
  try {
934
931
  yield Promise.all([
935
- this.storage.set(PUBKEY_STORAGE_KEY, this.data.pubkey),
936
- this.storage.set(TOKEN_STORAGE_KEY, this.data.authToken),
937
- this.storage.set(`${ACCOUNT_STORAGE_KEY}#${this.data.pubkey}`, json),
932
+ this.storage.set(PUBKEY_STORAGE_KEY, this._data.pubkey),
933
+ this.storage.set(TOKEN_STORAGE_KEY, this._data.authToken),
934
+ this.storage.set(`${ACCOUNT_STORAGE_KEY}#${this._data.pubkey}`, json),
938
935
  // Secret key (optional)
939
936
  seckey && this.storage.set(SECKEY_STORAGE_KEY, seckey) || this.storage.remove(SECKEY_STORAGE_KEY),
940
937
  // Remove old storage key
@@ -992,7 +989,7 @@ export class AccountService extends BaseGraphqlService {
992
989
  }
993
990
  authenticateAndGetToken(token, counter) {
994
991
  return __awaiter(this, void 0, void 0, function* () {
995
- if (!this.data.pubkey)
992
+ if (!this._data.pubkey)
996
993
  throw new Error('User not logged');
997
994
  if (!counter)
998
995
  console.info('[account] Authentication on pod...');
@@ -1018,7 +1015,7 @@ export class AccountService extends BaseGraphqlService {
1018
1015
  if (data && data.authenticate) {
1019
1016
  // Store the token
1020
1017
  this.onAuthTokenChange.next(token);
1021
- console.info(`[account] Authentication on pod [OK] {pubkey: '${this.data.pubkey.substr(0, 8)}'}`);
1018
+ console.info(`[account] Authentication on pod [OK] {pubkey: '${this._data.pubkey.substr(0, 8)}'}`);
1022
1019
  return token; // return the token
1023
1020
  }
1024
1021
  // Continue (will retry with another challenge)
@@ -1044,8 +1041,8 @@ export class AccountService extends BaseGraphqlService {
1044
1041
  }
1045
1042
  // TODO: check server pubkey as a valid certificate
1046
1043
  // Do the challenge
1047
- const signature = yield this.cryptoService.sign(data.authChallenge.challenge, this.data.keypair);
1048
- const newToken = `${this.data.pubkey}:${data.authChallenge.challenge}|${signature}`;
1044
+ const signature = yield this.cryptoService.sign(data.authChallenge.challenge, this._data.keypair);
1045
+ const newToken = `${this._data.pubkey}:${data.authChallenge.challenge}|${signature}`;
1049
1046
  // iterate with the new token
1050
1047
  return yield this.authenticateAndGetToken(newToken, (counter || 1) + 1 /* increment */);
1051
1048
  });
@@ -1072,4 +1069,4 @@ AccountService.ctorParameters = () => [
1072
1069
  { type: FileService },
1073
1070
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] }
1074
1071
  ];
1075
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3NlcnZpY2VzL2FjY291bnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLGFBQWEsRUFBVSxNQUFNLGtCQUFrQixDQUFDO0FBRXhELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM5QyxPQUFPLEVBQVMsV0FBVyxFQUFtQixNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBWSxZQUFZLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZUFBZSxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDeEUsT0FBTyxFQUFjLEdBQUcsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN0RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFOUQsT0FBTyxFQUFnQixjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0QsT0FBTyxFQUFDLHFCQUFxQixFQUFlLGdCQUFnQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFD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O1FBQ25DLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQzNELE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDakYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUMzRyxDQUFDOzs7O1lBaGdDRixVQUFVLFNBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDOzs7WUEzS3hCLGFBQWE7WUFlRSxjQUFjO1lBSDdCLGNBQWM7WUFDZCxvQkFBb0I7WUFOcEIsT0FBTztZQVNQLFdBQVc7NENBOE5kLE1BQU0sU0FBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDcnlwdG9TZXJ2aWNlLCBLZXlQYWlyfSBmcm9tICcuL2NyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7RGVwYXJ0bWVudH0gZnJvbSAnLi9tb2RlbC9kZXBhcnRtZW50Lm1vZGVsJztcbmltcG9ydCB7QWNjb3VudH0gZnJvbSAnLi9tb2RlbC9hY2NvdW50Lm1vZGVsJztcbmltcG9ydCB7UGVyc29uLCBQZXJzb25VdGlscywgVXNlclByb2ZpbGVMYWJlbH0gZnJvbSAnLi9tb2RlbC9wZXJzb24ubW9kZWwnO1xuaW1wb3J0IHtVc2FnZU1vZGUsIFVzZXJTZXR0aW5nc30gZnJvbSAnLi9tb2RlbC9zZXR0aW5ncy5tb2RlbCc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7RmV0Y2hQb2xpY3ksIGdxbH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQge1N0b3JhZ2V9IGZyb20gJ0Bpb25pYy9zdG9yYWdlJztcblxuaW1wb3J0IHtzbGVlcH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0Jhc2VHcmFwaHFsU2VydmljZX0gZnJvbSAnLi9iYXNlLWdyYXBocWwtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge0Vycm9yQ29kZXMsIFNlcnZlckVycm9yQ29kZXN9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7R3JhcGhxbFNlcnZpY2V9IGZyb20gJy4uL2dyYXBocWwvZ3JhcGhxbC5zZXJ2aWNlJztcbmltcG9ydCB7TG9jYWxTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4vbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQge0Zvcm1GaWVsZERlZmluaXRpb259IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7QXV0aFRva2VuVHlwZSwgTmV0d29ya1NlcnZpY2V9IGZyb20gJy4vbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7RmlsZVNlcnZpY2V9IGZyb20gJy4uLy4uL3NoYXJlZC9maWxlL2ZpbGUuc2VydmljZSc7XG5pbXBvcnQge01JTklGWV9FTlRJVFlfRk9SX1BPRCwgUmVmZXJlbnRpYWwsIFJlZmVyZW50aWFsVXRpbHN9IGZyb20gJy4vbW9kZWwvcmVmZXJlbnRpYWwubW9kZWwnO1xuaW1wb3J0IHtTdGF0dXNJZHN9IGZyb20gJy4vbW9kZWwvbW9kZWwuZW51bSc7XG5pbXBvcnQge0Jhc2U1OH0gZnJvbSAnLi9iYXNlNTgnO1xuaW1wb3J0IHtFTlZJUk9OTUVOVH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7dG9EYXRlSVNPU3RyaW5nfSBmcm9tICcuLi8uLi9zaGFyZWQvZGF0ZXMnO1xuaW1wb3J0IHtmaXJzdE5vdE5pbFByb21pc2V9IGZyb20gJy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEFjY291bnRIb2xkZXIge1xuICBsb2FkZWQ6IGJvb2xlYW47XG4gIGtleXBhaXI6IEtleVBhaXI7XG4gIGF1dGhUb2tlbjogc3RyaW5nO1xuICBhdXRoQmFzaWM/OiBzdHJpbmc7XG4gIHB1YmtleTogc3RyaW5nO1xuICBhY2NvdW50OiBBY2NvdW50O1xuICBwZXJzb246IFBlcnNvbjtcbiAgZGVwYXJ0bWVudDogRGVwYXJ0bWVudDtcbiAgLy8gVE9ETyA6IHVzZSB0aGlzID9cbiAgbWFpblByb2ZpbGU6IFN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aERhdGEge1xuICB1c2VybmFtZTogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xuICBvZmZsaW5lPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJEYXRhIGV4dGVuZHMgQXV0aERhdGEge1xuICBhY2NvdW50OiBBY2NvdW50O1xufVxuXG5jb25zdCBUT0tFTl9TVE9SQUdFX0tFWSA9ICd0b2tlbic7XG5jb25zdCBQVUJLRVlfU1RPUkFHRV9LRVkgPSAncHVia2V5JztcbmNvbnN0IFNFQ0tFWV9TVE9SQUdFX0tFWSA9ICdzZWNrZXknO1xuY29uc3QgQUNDT1VOVF9TVE9SQUdFX0tFWSA9ICdhY2NvdW50JztcblxuY29uc3QgREVGQVVMVF9BVkFUQVJfSU1BR0UgPSAnYXNzZXRzL2ltZy9wZXJzb24ucG5nJztcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBHcmFwaFFMIHF1ZXJpZXNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5jb25zdCBGcmFnbWVudHMgPSB7XG4gIGFjY291bnQ6IGdxbGBcbiAgICBmcmFnbWVudCBBY2NvdW50RnJhZ21lbnQgb24gQWNjb3VudFZPIHtcbiAgICAgIGlkXG4gICAgICBmaXJzdE5hbWVcbiAgICAgIGxhc3ROYW1lXG4gICAgICBlbWFpbFxuICAgICAgcHVia2V5XG4gICAgICBhdmF0YXJcbiAgICAgIHN0YXR1c0lkXG4gICAgICB1cGRhdGVEYXRlXG4gICAgICBjcmVhdGlvbkRhdGVcbiAgICAgIHByb2ZpbGVzXG4gICAgICBzZXR0aW5ncyB7XG4gICAgICAgIGlkXG4gICAgICAgIGxvY2FsZVxuICAgICAgICBsYXRMb25nRm9ybWF0XG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgbm9uY2VcbiAgICAgICAgdXBkYXRlRGF0ZVxuICAgICAgICBfX3R5cGVuYW1lXG4gICAgICB9XG4gICAgICBkZXBhcnRtZW50IHtcbiAgICAgICAgaWRcbiAgICAgICAgbGFiZWxcbiAgICAgICAgbmFtZVxuICAgICAgICBfX3R5cGVuYW1lXG4gICAgICB9XG4gICAgICBfX3R5cGVuYW1lXG4gICAgfVxuICBgXG59O1xuXG4vLyBMb2FkIGFjY291bnQgcXVlcnlcbmNvbnN0IExvYWRRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBBY2NvdW50IHtcbiAgICBkYXRhOiBhY2NvdW50IHtcbiAgICAgIC4uLkFjY291bnRGcmFnbWVudFxuICAgIH1cbiAgfVxuICAke0ZyYWdtZW50cy5hY2NvdW50fVxuYDtcblxuLy8gQ2hlY2sgZW1haWwgcXVlcnlcbmNvbnN0IElzRW1haWxFeGlzdHNRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBJc0VtYWlsRXhpc3RzKCRlbWFpbDogU3RyaW5nLCAkaGFzaDogU3RyaW5nKXtcbiAgICBpc0VtYWlsRXhpc3RzKGVtYWlsOiAkZW1haWwsIGhhc2g6ICRoYXNoKVxuICB9XG5gO1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElzRW1haWxFeGlzdHNWYXJpYWJsZXMge1xuICBlbWFpbDogc3RyaW5nO1xuICBoYXNoOiBzdHJpbmc7XG59XG5cbi8vIFNhdmUgKGNyZWF0ZSBvciB1cGRhdGUpIGFjY291bnQgbXV0YXRpb25cbmNvbnN0IFNhdmVNdXRhdGlvbjogYW55ID0gZ3FsYFxuICBtdXRhdGlvbiBTYXZlQWNjb3VudCgkZGF0YTpBY2NvdW50Vk9JbnB1dCl7XG4gICAgZGF0YTogc2F2ZUFjY291bnQoYWNjb3VudDogJGRhdGEpe1xuICAgICAgLi4uQWNjb3VudEZyYWdtZW50XG4gICAgfVxuICB9XG4gICR7RnJhZ21lbnRzLmFjY291bnR9XG5gO1xuXG4vLyBDcmVhdGUgYWNjb3VudCBtdXRhdGlvblxuY29uc3QgQ3JlYXRlTXV0YXRpb246IGFueSA9IGdxbGBcbiAgbXV0YXRpb24gQ3JlYXRlQWNjb3VudCgkZGF0YTpBY2NvdW50Vk9JbnB1dCl7XG4gICAgZGF0YTogY3JlYXRlQWNjb3VudChhY2NvdW50OiAkZGF0YSl7XG4gICAgICAuLi5BY2NvdW50RnJhZ21lbnRcbiAgICB9XG4gIH1cbiAgJHtGcmFnbWVudHMuYWNjb3VudH1cbmA7XG5cbi8vIFNlbnQgY29uZmlybWF0aW9uIGVtYWlsXG5jb25zdCBTZW5kQ29uZmlybUVtYWlsTXV0YXRpb246IGFueSA9IGdxbGBcbiAgbXV0YXRpb24gc2VuZEFjY291bnRDb25maXJtYXRpb25FbWFpbCgkZW1haWw6U3RyaW5nLCAkbG9jYWxlOlN0cmluZyl7XG4gICAgc2VuZEFjY291bnRDb25maXJtYXRpb25FbWFpbChlbWFpbDogJGVtYWlsLCBsb2NhbGU6ICRsb2NhbGUpXG4gIH1cbmA7XG5cbi8vIENvbmZpcm0gYWNjb3VudCBlbWFpbFxuY29uc3QgQ29uZmlybUVtYWlsTXV0YXRpb246IGFueSA9IGdxbGBcbiAgbXV0YXRpb24gY29uZmlybUFjY291bnRFbWFpbCgkZW1haWw6U3RyaW5nLCAkY29kZTpTdHJpbmcpe1xuICAgIGNvbmZpcm1BY2NvdW50RW1haWwoZW1haWw6ICRlbWFpbCwgY29kZTogJGNvZGUpXG4gIH1cbmA7XG5cbi8vIEF1dGhlbnRpY2F0aW9uICBxdWVyeVxuY29uc3QgQXV0aFF1ZXJ5OiBhbnkgPSBncWxgXG4gIHF1ZXJ5IEF1dGgoJHRva2VuOiBTdHJpbmcpe1xuICAgIGF1dGhlbnRpY2F0ZSh0b2tlbjogJHRva2VuKVxuICB9XG5gO1xuXG4vLyBOZXcgYXV0aCBjaGFsbGVuZ2UgcXVlcnlcbmNvbnN0IEF1dGhDaGFsbGVuZ2VRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBBdXRoQ2hhbGxlbmdle1xuICAgIGF1dGhDaGFsbGVuZ2V7XG4gICAgICBjaGFsbGVuZ2VcbiAgICAgIHB1YmtleVxuICAgICAgc2lnbmF0dXJlXG4gICAgfVxuICB9XG5gO1xuXG5jb25zdCBVcGRhdGVTdWJzY3JpcHRpb246IGFueSA9IGdxbGBcbiAgc3Vic2NyaXB0aW9uIHVwZGF0ZUFjY291bnQoJGludGVydmFsOiBJbnQpe1xuICAgIGRhdGE6IHVwZGF0ZUFjY291bnQoaW50ZXJ2YWw6ICRpbnRlcnZhbCkge1xuICAgICAgaWRcbiAgICAgIHVwZGF0ZURhdGVcbiAgICB9XG4gIH1cbmA7XG5cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIEFjY291bnRTZXJ2aWNlIGV4dGVuZHMgQmFzZUdyYXBocWxTZXJ2aWNlIHtcblxuICBwcml2YXRlIGRhdGE6IEFjY291bnRIb2xkZXIgPSB7XG4gICAgbG9hZGVkOiBmYWxzZSxcbiAgICBrZXlwYWlyOiBudWxsLFxuICAgIGF1dGhUb2tlbjogbnVsbCxcbiAgICBhdXRoQmFzaWM6IG51bGwsXG4gICAgcHVia2V5OiBudWxsLFxuICAgIG1haW5Qcm9maWxlOiBudWxsLFxuICAgIGFjY291bnQ6IG51bGwsXG4gICAgcGVyc29uOiBudWxsLFxuICAgIGRlcGFydG1lbnQ6IG51bGxcbiAgfTtcblxuICBwcml2YXRlIF9zdGFydFByb21pc2U6IFByb21pc2U8YW55PjtcbiAgcHJpdmF0ZSBfc3RhcnRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF8kYWRkaXRpb25hbEZpZWxkcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rm9ybUZpZWxkRGVmaW5pdGlvbltdPihbXSk7XG4gIHByaXZhdGUgX3Rva2VuVHlwZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF1dGhUb2tlblR5cGU+KHVuZGVmaW5lZCk7XG5cbiAgb25Mb2dpbiA9IG5ldyBTdWJqZWN0PEFjY291bnQ+KCk7XG4gIG9uTG9nb3V0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICBvbkNoYW5nZSA9IG5ldyBTdWJqZWN0PEFjY291bnQ+KCk7XG4gIG9uQXV0aFRva2VuQ2hhbmdlID0gbmV3IFN1YmplY3Q8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICBvbkF1dGhCYXNpY0NoYW5nZSA9IG5ldyBTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuICBnZXQgYWNjb3VudCgpOiBBY2NvdW50IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmxvYWRlZCA/IHRoaXMuZGF0YS5hY2NvdW50IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0IHBlcnNvbigpOiBQZXJzb24ge1xuICAgIGlmICh0aGlzLmRhdGEubG9hZGVkICYmICF0aGlzLmRhdGEucGVyc29uKSB7XG4gICAgICB0aGlzLmRhdGEucGVyc29uID0gdGhpcy5kYXRhLmxvYWRlZCA/IHRoaXMuZGF0YS5hY2NvdW50LmFzUGVyc29uKCkgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGEucGVyc29uO1xuICB9XG5cbiAgZ2V0IGRlcGFydG1lbnQoKTogRGVwYXJ0bWVudCB7XG4gICAgaWYgKHRoaXMuZGF0YS5sb2FkZWQgJiYgIXRoaXMuZGF0YS5kZXBhcnRtZW50KSB7XG4gICAgICB0aGlzLmRhdGEuZGVwYXJ0bWVudCA9IHRoaXMuZGF0YS5sb2FkZWQgPyB0aGlzLmRhdGEuYWNjb3VudC5hc1BlcnNvbigpLmRlcGFydG1lbnQgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGEuZGVwYXJ0bWVudDtcbiAgfVxuXG4gIGdldCB0b2tlblR5cGUoKTogQXV0aFRva2VuVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rva2VuVHlwZSQudmFsdWU7XG4gIH1cblxuICBzZXQgdG9rZW5UeXBlKHZhbHVlOiBBdXRoVG9rZW5UeXBlKSB7XG4gICAgaWYgKHRoaXMuX3Rva2VuVHlwZSQudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1thY2NvdW50XSBVc2luZyBhdXRoZW50aWNhdGlvbiB0b2tlbiB0eXBlOiAnICsgdmFsdWUpO1xuICAgICAgdGhpcy5fdG9rZW5UeXBlJC5uZXh0KHZhbHVlKTtcbiAgICAgIC8vIFJlc2V0IHZhbHVlc1xuICAgICAgdGhpcy5kYXRhLmF1dGhUb2tlbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub25BdXRoVG9rZW5DaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5kYXRhLmF1dGhCYXNpYyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub25BdXRoQmFzaWNDaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbmV0d29yazogTmV0d29ya1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGdyYXBocWw6IEdyYXBocWxTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gICAgcHJvdGVjdGVkIGZpbGU6IEZpbGVTZXJ2aWNlLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudFxuICApIHtcbiAgICBzdXBlcihncmFwaHFsLCBlbnZpcm9ubWVudCk7XG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50LXNlcnZpY2VdIENyZWF0aW5nIHNlcnZpY2UnKTtcblxuICAgIHRoaXMucmVzZXREYXRhKCk7XG5cbiAgICAvLyBTZW5kIGF1dGggdG9rZW4gdG8gdGhlIGdyYXBocWwgbGF5ZXIsIHdoZW4gY2hhbmdlZFxuICAgIHRoaXMub25BdXRoVG9rZW5DaGFuZ2Uuc3Vic2NyaWJlKCh0b2tlbikgPT4gdGhpcy5ncmFwaHFsLnNldEF1dGhUb2tlbih0b2tlbikpO1xuICAgIHRoaXMub25BdXRoQmFzaWNDaGFuZ2Uuc3Vic2NyaWJlKChiYXNpYykgPT4gdGhpcy5ncmFwaHFsLnNldEF1dGhCYXNpYyhiYXNpYykpO1xuXG4gICAgLy8gTGlzdGVuIG5ldHdvcmsgcmVzdGFydFxuICAgIHRoaXMuZ3JhcGhxbC5vblN0YXJ0LnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3N0YXJ0ZWQpIHtcbiAgICAgICAgdGhpcy5yZWFkeSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3N0YXJ0ZWQgJiYgdGhpcy5pc0xvZ2luKCkpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFJlc3RhcnRpbmcsIHRvIHJldHJ5IHRvIGF1dGhlbnRpY2F0ZS4uLicpO1xuICAgICAgICB0aGlzLnJlc3RhcnQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEZvcmNlIG5ldHdvcmsgdG8gd2FpdCBhY2NvdW50IHNlcnZpY2UsIGFmdGVyIGdldHRpbmcgY29ubmVjdGlvbiB0byB0aGUgcGVlclxuICAgIHRoaXMubmV0d29yay5vbignYmVmb3JlVHJ5T25saW5lRmluaXNoJywgYXN5bmMgKG9ubGluZSkgPT4ge1xuICAgICAgLy8gSWYgb25saW5lLCB3YWl0IGEgZnVsbCByZXN0YXJ0LCBiZWNhdXNlIGl0IGNhbiBmb3JjZSBvZmZsaW5lIG1vZGVcbiAgICAgIGlmIChvbmxpbmUgJiYgKCF0aGlzLl9zdGFydGVkIHx8IHRoaXMuaXNMb2dpbigpKSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gRm9yY2UgbmV0d29ya1NlcnZpY2UudHJ5T25saW5lKCkgdG8gd2FpdCwgdGhhdCBhY2NvdW50IHNlcnZpY2UgaXMgcmVzdGFydGVkLi4uJyk7XG4gICAgICAgIC8vYXdhaXQgdGhpcy5zdG9wKCk7XG4gICAgICAgIGF3YWl0IHNsZWVwKDUwMCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gICAgICB9XG4gICAgfSk7XG5cblxuICB9XG5cbiAgcHJpdmF0ZSByZXNldERhdGEoKSB7XG4gICAgdGhpcy5kYXRhLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuZGF0YS5rZXlwYWlyID0gbnVsbDtcbiAgICB0aGlzLmRhdGEuYXV0aFRva2VuID0gbnVsbDtcbiAgICB0aGlzLmRhdGEuYXV0aEJhc2ljID0gbnVsbDtcbiAgICB0aGlzLmRhdGEucHVia2V5ID0gbnVsbDtcbiAgICB0aGlzLmRhdGEubWFpblByb2ZpbGUgPSBudWxsO1xuICAgIHRoaXMuZGF0YS5hY2NvdW50ID0gbmV3IEFjY291bnQoKTtcbiAgICB0aGlzLmRhdGEucGVyc29uID0gbnVsbDtcbiAgICB0aGlzLmRhdGEuZGVwYXJ0bWVudCA9IG51bGw7XG4gIH1cblxuICBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fc3RhcnRQcm9taXNlKSByZXR1cm4gdGhpcy5fc3RhcnRQcm9taXNlO1xuICAgIGlmICh0aGlzLl9zdGFydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAvLyBSZXN0b3JpbmcgbG9jYWwgc2V0dGluZ3NcbiAgICB0aGlzLl9zdGFydFByb21pc2UgPSBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnNldHRpbmdzLnJlYWR5KCksXG4gICAgICAvLyBXYWl0IHRva2VuIHR5cGUgdG8gYmUgc2V0XG4gICAgICBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5fdG9rZW5UeXBlJClcbiAgICBdKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZXN0b3JlTG9jYWxseSgpKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fc3RhcnRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0UHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRlZDtcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0ZWQgfHwgdGhpcy5fc3RhcnRQcm9taXNlKSB7XG4gICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9zdGFydFByb21pc2UgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGhhZEF1dGhUb2tlbiA9IHRoaXMuZGF0YS5hdXRoVG9rZW4gJiYgdHJ1ZTtcbiAgICAgIGNvbnN0IGhhZEF1dGhCYXNpYyA9IHRoaXMuZGF0YS5hdXRoQmFzaWMgJiYgdHJ1ZTtcbiAgICAgIGNvbnN0IGhhZEF1dGggPSBoYWRBdXRoVG9rZW4gfHwgaGFkQXV0aEJhc2ljO1xuICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgIGlmIChoYWRBdXRoKSB7XG4gICAgICAgIHRoaXMub25Mb2dvdXQubmV4dCgpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKGhhZEF1dGhUb2tlbikgdGhpcy5vbkF1dGhUb2tlbkNoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChoYWRBdXRoQmFzaWMpIHRoaXMub25BdXRoQmFzaWNDaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlc3RhcnQoKSB7XG4gICAgYXdhaXQgdGhpcy5zdG9wKCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnQoKTtcbiAgfVxuXG4gIHJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9zdGFydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnQoKTtcbiAgfVxuXG4gIGlzTG9naW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMuZGF0YS5wdWJrZXkgJiYgdGhpcy5kYXRhLmxvYWRlZCk7XG4gIH1cblxuICBpc0F1dGgoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMuZGF0YS5wdWJrZXkgJiYgdGhpcy5kYXRhLmtleXBhaXIgJiYgdGhpcy5kYXRhLmtleXBhaXIuc2VjcmV0S2V5KTtcbiAgfVxuXG4gIGhhc01pblByb2ZpbGUodXNlclByb2ZpbGU6IFVzZXJQcm9maWxlTGFiZWwpOiBib29sZWFuIHtcbiAgICAvLyBzaG91bGQgYmUgbG9naW4sIGFuZCBzdGF0dXMgRU5BQkxFIG9yIFRFTVBPUkFSWVxuICAgIGlmICghdGhpcy5kYXRhLmFjY291bnQgfHwgIXRoaXMuZGF0YS5hY2NvdW50LnB1YmtleSB8fFxuICAgICAgKHRoaXMuZGF0YS5hY2NvdW50LnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuRU5BQkxFICYmIHRoaXMuZGF0YS5hY2NvdW50LnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuVEVNUE9SQVJZKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gUGVyc29uVXRpbHMuaGFzVXBwZXJPckVxdWFsc1Byb2ZpbGUodGhpcy5kYXRhLmFjY291bnQucHJvZmlsZXMsIHVzZXJQcm9maWxlKTtcbiAgfVxuXG4gIGhhc0V4YWN0UHJvZmlsZShsYWJlbDogVXNlclByb2ZpbGVMYWJlbCk6IGJvb2xlYW4ge1xuICAgIC8vIHNob3VsZCBiZSBsb2dpbiwgYW5kIHN0YXR1cyBFTkFCTEUgb3IgVEVNUE9SQVJZXG4gICAgaWYgKCF0aGlzLmRhdGEuYWNjb3VudCB8fCAhdGhpcy5kYXRhLmFjY291bnQucHVia2V5IHx8XG4gICAgICAodGhpcy5kYXRhLmFjY291bnQuc3RhdHVzSWQgIT09IFN0YXR1c0lkcy5FTkFCTEUgJiYgdGhpcy5kYXRhLmFjY291bnQuc3RhdHVzSWQgIT09IFN0YXR1c0lkcy5URU1QT1JBUlkpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmRhdGEuYWNjb3VudC5wcm9maWxlcy5zb21lKHByb2ZpbGUgPT4gcHJvZmlsZSA9PT0gbGFiZWwpO1xuICB9XG5cbiAgaGFzUHJvZmlsZUFuZElzRW5hYmxlKHVzZXJQcm9maWxlOiBVc2VyUHJvZmlsZUxhYmVsKTogYm9vbGVhbiB7XG4gICAgLy8gc2hvdWxkIGJlIGxvZ2luLCBhbmQgc3RhdHVzIEVOQUJMRVxuICAgIGlmICghdGhpcy5kYXRhLmFjY291bnQgfHwgIXRoaXMuZGF0YS5hY2NvdW50LnB1YmtleSB8fCB0aGlzLmRhdGEuYWNjb3VudC5zdGF0dXNJZCAhPT0gU3RhdHVzSWRzLkVOQUJMRSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBQZXJzb25VdGlscy5oYXNVcHBlck9yRXF1YWxzUHJvZmlsZSh0aGlzLmRhdGEuYWNjb3VudC5wcm9maWxlcywgdXNlclByb2ZpbGUpO1xuICB9XG5cbiAgaXNBZG1pbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNQcm9maWxlQW5kSXNFbmFibGUoJ0FETUlOJyk7XG4gIH1cblxuICBpc1N1cGVydmlzb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvZmlsZUFuZElzRW5hYmxlKCdTVVBFUlZJU09SJyk7XG4gIH1cblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvZmlsZUFuZElzRW5hYmxlKCdVU0VSJyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQHBhcmFtIG1vZGVcbiAgICovXG4gIGlzVXNhZ2VNb2RlKG1vZGU6IFVzYWdlTW9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmlzVXNhZ2VNb2RlKG1vZGUpO1xuICB9XG5cbiAgaXNPbmx5R3Vlc3QoKTogYm9vbGVhbiB7XG4gICAgLy8gU2hvdWxkIGJlIGxvZ2luLCBhbmQgc3RhdHVzIEVOQUJMRSBvciBURU1QT1JBUllcbiAgICBpZiAoIXRoaXMuZGF0YS5hY2NvdW50IHx8ICF0aGlzLmRhdGEuYWNjb3VudC5wdWJrZXkgfHxcbiAgICAgICh0aGlzLmRhdGEuYWNjb3VudC5zdGF0dXNJZCAhPT0gU3RhdHVzSWRzLkVOQUJMRSAmJiB0aGlzLmRhdGEuYWNjb3VudC5zdGF0dXNJZCAhPT0gU3RhdHVzSWRzLlRFTVBPUkFSWSkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gUHJvZmlsZSBsZXNzIHRoZW4gdXNlclxuICAgIHJldHVybiAhUGVyc29uVXRpbHMuaGFzVXBwZXJPckVxdWFsc1Byb2ZpbGUodGhpcy5kYXRhLmFjY291bnQucHJvZmlsZXMsICdVU0VSJyk7XG4gIH1cblxuICBjYW5Vc2VyV3JpdGVEYXRhRm9yRGVwYXJ0bWVudChyZWNvcmRlckRlcGFydG1lbnQ6IFJlZmVyZW50aWFsIHwgYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKFJlZmVyZW50aWFsVXRpbHMuaXNFbXB0eShyZWNvcmRlckRlcGFydG1lbnQpKSB7XG4gICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKVxuICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBjaGVjayBpZiB1c2VyIGhhcyByaWdodDogaW52YWxpZCByZWNvcmRlckRlcGFydG1lbnQnLCByZWNvcmRlckRlcGFydG1lbnQpO1xuICAgICAgcmV0dXJuIHRoaXMuaXNBZG1pbigpO1xuICAgIH1cblxuICAgIC8vIFNob3VsZCBiZSBsb2dpbiwgYW5kIHN0YXR1cyBFTkFCTEVcbiAgICBpZiAoIXRoaXMuZGF0YS5hY2NvdW50IHx8ICF0aGlzLmRhdGEuYWNjb3VudC5wdWJrZXkgfHwgdGhpcy5kYXRhLmFjY291bnQuc3RhdHVzSWQgIT09IFN0YXR1c0lkcy5FTkFCTEUpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICghdGhpcy5kYXRhLmFjY291bnQuZGVwYXJ0bWVudCB8fCAhdGhpcy5kYXRhLmFjY291bnQuZGVwYXJ0bWVudC5pZCkge1xuICAgICAgY29uc29sZS53YXJuKCdVc2VyIGFjY291bnQgaGFzIG5vIGRlcGFydG1lbnQgISBVbmFibGUgdG8gY2hlY2sgd3JpdGUgcmlnaHQgYWdhaW5zdCByZWNvcmRlckRlcGFydG1lbnQnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTYW1lIHJlY29yZGVyIGRlcGFydG1lbnQ6IE9LLCB1c2VyIGNhbiB3cml0ZVxuICAgIGlmICh0aGlzLmRhdGEuYWNjb3VudC5kZXBhcnRtZW50LmlkID09PSByZWNvcmRlckRlcGFydG1lbnQuaWQpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gRWxzZSwgY2hlY2sgaWYgc3VwZXJ2aXNvciAob3IgbW9yZSlcbiAgICByZXR1cm4gUGVyc29uVXRpbHMuaGFzVXBwZXJPckVxdWFsc1Byb2ZpbGUodGhpcy5kYXRhLmFjY291bnQucHJvZmlsZXMsICdTVVBFUlZJU09SJyk7XG4gIH1cblxuICBhc3luYyByZWdpc3RlcihkYXRhOiBSZWdpc3RlckRhdGEpOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICBpZiAodGhpcy5pc0xvZ2luKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBhbHJlYWR5IGxvZ2luLiBQbGVhc2UgbG9nb3V0IGJlZm9yZSByZWdpc3Rlci4nKTtcbiAgICB9XG4gICAgaWYgKCFkYXRhLnVzZXJuYW1lIHx8ICFkYXRhLnBhc3N3b3JkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnKTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFJlZ2lzdGVyIG5ldyB1c2VyIGFjY291bnQuLi4nLCBkYXRhLmFjY291bnQpO1xuICAgIHRoaXMuZGF0YS5sb2FkZWQgPSBmYWxzZTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGtleXBhaXIgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2Uuc2NyeXB0S2V5cGFpcihkYXRhLnVzZXJuYW1lLCBkYXRhLnBhc3N3b3JkKTtcbiAgICAgIGRhdGEuYWNjb3VudC5wdWJrZXkgPSBCYXNlNTguZW5jb2RlKGtleXBhaXIucHVibGljS2V5KTtcblxuICAgICAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgICAgIGRhdGEuYWNjb3VudC5zZXR0aW5ncyA9IGRhdGEuYWNjb3VudC5zZXR0aW5ncyB8fCBuZXcgVXNlclNldHRpbmdzKCk7XG4gICAgICBkYXRhLmFjY291bnQuc2V0dGluZ3MubG9jYWxlID0gdGhpcy5zZXR0aW5ncy5sb2NhbGU7XG4gICAgICBkYXRhLmFjY291bnQuc2V0dGluZ3MubGF0TG9uZ0Zvcm1hdCA9IHRoaXMuc2V0dGluZ3MubGF0TG9uZ0Zvcm1hdDtcbiAgICAgIGRhdGEuYWNjb3VudC5kZXBhcnRtZW50LmlkID0gZGF0YS5hY2NvdW50LmRlcGFydG1lbnQuaWQgfHwgdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0RGVwYXJ0bWVudElkO1xuXG4gICAgICB0aGlzLmRhdGEua2V5cGFpciA9IGtleXBhaXI7XG4gICAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgdGhpcy5zYXZlUmVtb3RlbHkoZGF0YS5hY2NvdW50LCBrZXlwYWlyKTtcblxuICAgICAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgICAgIGFjY291bnQuYXZhdGFyID0gYWNjb3VudC5hdmF0YXIgfHwgKHRoaXMuZW52aXJvbm1lbnQuYmFzZVVybCArIERFRkFVTFRfQVZBVEFSX0lNQUdFKTtcbiAgICAgIHRoaXMuZGF0YS5tYWluUHJvZmlsZSA9IFBlcnNvblV0aWxzLmdldE1haW5Qcm9maWxlKGFjY291bnQucHJvZmlsZXMpO1xuXG4gICAgICB0aGlzLmRhdGEuYWNjb3VudCA9IGFjY291bnQ7XG4gICAgICB0aGlzLmRhdGEucHVia2V5ID0gYWNjb3VudC5wdWJrZXk7XG5cbiAgICAgIC8vIFRyeSB0byBhdXRoIG9uIHBvZFxuICAgICAgYXdhaXQgdGhpcy5hdXRoZW50aWNhdGUoZGF0YSk7XG5cbiAgICAgIHRoaXMuZGF0YS5sb2FkZWQgPSB0cnVlO1xuXG4gICAgICBhd2FpdCB0aGlzLnNhdmVMb2NhbGx5KCk7XG5cbiAgICAgIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBY2NvdW50IHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5kYXRhLmFjY291bnQpO1xuICAgICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuZGF0YS5hY2NvdW50KTtcblxuICAgICAgcmV0dXJuIHRoaXMuZGF0YS5hY2NvdW50O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgJiYgZXJyb3IubWVzc2FnZSB8fCBlcnJvcik7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXV0aGVudGljYXRlKGRhdGE/OiBBdXRoRGF0YSkge1xuICAgIC8vIFdhaXQgdGhlIGF1dGggdG9rZW4sIHRoZW4gY29udGludWVcbiAgICBjb25zdCB0b2tlblR5cGUgPSBhd2FpdCBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5fdG9rZW5UeXBlJCk7XG5cbiAgICAvLyBCYXNpYyBhdXRoXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gJ2Jhc2ljJyB8fCB0b2tlblR5cGUgPT09ICdiYXNpYy1hbmQtdG9rZW4nKSB7XG5cbiAgICAgIC8vIEdlbmVyYXRlIHRoZSBhdXRoQmFzaWMsIGlmIHVzZWRcbiAgICAgIGlmICghdGhpcy5kYXRhLmF1dGhCYXNpYykge1xuICAgICAgICAvLyBTa2lwIGlmIHRva2VuIGFscmVhZHkgcHJvdmlkZWRcbiAgICAgICAgaWYgKCEodGhpcy5kYXRhLmF1dGhUb2tlbiAmJiB0b2tlblR5cGUgPT09ICdiYXNpYy1hbmQtdG9rZW4nKSkge1xuICAgICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS51c2VybmFtZSB8fCAhZGF0YS5wYXNzd29yZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHVzZXJuYW1lIGFuZCBwYXNzd29yZCcpO1xuICAgICAgICAgIHRoaXMuZGF0YS5hdXRoQmFzaWMgPSB0aGlzLmNyeXB0b1NlcnZpY2UuZW5jb2RlQmFzZTY0KGAke2RhdGEudXNlcm5hbWV9OiR7ZGF0YS5wYXNzd29yZH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5uZXh0KHRoaXMuZGF0YS5hdXRoQmFzaWMpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIHRoZSBhdXRoVG9rZW4sIGlmIHVzZWRcbiAgICBpZiAodG9rZW5UeXBlID09PSAndG9rZW4nIHx8IHRva2VuVHlwZSA9PT0gJ2Jhc2ljLWFuZC10b2tlbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGF0YS5hdXRoVG9rZW4gPSBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZUFuZEdldFRva2VuKHRoaXMuZGF0YS5hdXRoVG9rZW4pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTmV2ZXIgYXV0aGVudGljYXRlLCBvciBub3QgcmVhZHkgZm9yIG9mZmxpbmUgbW9kZSA9PiBleGl0XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3JnZXQgYXV0aEJhc2ljLCB0byBzd2l0Y2ggdG8gYXV0aFRva2VuXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gJ2Jhc2ljLWFuZC10b2tlbicpIHtcbiAgICAgIHRoaXMuZGF0YS5hdXRoQmFzaWMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm9uQXV0aEJhc2ljQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2dpbihkYXRhOiBBdXRoRGF0YSk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICghZGF0YSB8fCAhZGF0YS51c2VybmFtZSB8fCAhZGF0YS5wYXNzd29yZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIHVzZXJuYW1lIG9yIHBhc3N3b3JkJyk7XG5cbiAgICBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gTG9naW4uLi4nKTtcblxuICAgIGxldCBrZXlwYWlyO1xuICAgIHRyeSB7XG4gICAgICBrZXlwYWlyID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnNjcnlwdEtleXBhaXIoZGF0YS51c2VybmFtZSwgZGF0YS5wYXNzd29yZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgIHRocm93IHsgY29kZTogRXJyb3JDb2Rlcy5VTktOT1dOX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuU0NSWVBUX0VSUk9SJyB9O1xuICAgIH1cblxuICAgIC8vIFN0b3JlIHB1YmtleStrZXlwYWlyXG4gICAgdGhpcy5kYXRhLnB1YmtleSA9IEJhc2U1OC5lbmNvZGUoa2V5cGFpci5wdWJsaWNLZXkpO1xuICAgIHRoaXMuZGF0YS5rZXlwYWlyID0ga2V5cGFpcjtcblxuICAgIC8vIFRyeSB0byBsb2FkIHByZXZpb3VzIHRva2VuXG4gICAgbGV0IHByZXZpb3VzVG9rZW46IHN0cmluZyA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoVE9LRU5fU1RPUkFHRV9LRVkpO1xuICAgIHByZXZpb3VzVG9rZW4gPSBwcmV2aW91c1Rva2VuICYmIHByZXZpb3VzVG9rZW4uc3RhcnRzV2l0aCh0aGlzLmRhdGEucHVia2V5KSAmJiBwcmV2aW91c1Rva2VuIHx8IG51bGw7XG5cbiAgICAvLyBPZmZsaW5lIG1vZGVcbiAgICBjb25zdCBvZmZsaW5lID0gdGhpcy5zZXR0aW5ncy5oYXNPZmZsaW5lRmVhdHVyZSgpICYmICh0aGlzLm5ldHdvcmsub2ZmbGluZSB8fCBkYXRhLm9mZmxpbmUgPT09IHRydWUpO1xuICAgIGlmIChvZmZsaW5lKSAge1xuICAgICAgdGhpcy5kYXRhLmF1dGhUb2tlbiA9IHByZXZpb3VzVG9rZW47XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSBuZXR3b3JrIGlmIHNldCBhcyBvZmZsaW5lXG4gICAgICB0aGlzLm5ldHdvcmsuc2V0Rm9yY2VPZmZsaW5lKHRydWUsIHtzaG93VG9hc3Q6IGZhbHNlfSk7XG4gICAgICBjb25zb2xlLmluZm8oYFthY2NvdW50XSBMb2dpbiBbT0tdIHtwdWJrZXk6ICR7dGhpcy5kYXRhLnB1YmtleS5zdWJzdHIoMCwgOCl9fSwge29mZmxpbmU6IHRydWV9YCk7XG4gICAgfVxuXG4gICAgLy8gT25saW5lIG1vZGU6IHRyeSB0byBhdXRoIG9uIHBvZFxuICAgIGVsc2Uge1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE5ldmVyIGF1dGhlbnRpY2F0ZSwgb3Igbm90IHJlYWR5IGZvciBvZmZsaW5lIG1vZGUgPT4gZXhpdFxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhY2NvdW50IGRhdGFcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkRGF0YSh7b2ZmbGluZSwgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknfSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIElmIGFjY291bnQgbm90IGZvdW5kLCBjaGVjayBpZiBlbWFpbCBpcyB2YWxpZFxuICAgICAgaWYgKGVyciAmJiArKGVyci5jb2RlKSA9PT0gRXJyb3JDb2Rlcy5MT0FEX0FDQ09VTlRfRVJST1IpIHtcblxuICAgICAgICAvLyBDaGVjayBlbWFpbCBleGlzdHNcbiAgICAgICAgaWYgKGRhdGEudXNlcm5hbWUuaW5kZXhPZignQCcpICE9PSAtMSkge1xuICAgICAgICAgIGxldCBpc0VtYWlsRXhpc3RzO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpc0VtYWlsRXhpc3RzID0gYXdhaXQgdGhpcy5pc0VtYWlsRXhpc3RzKGRhdGEudXNlcm5hbWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKG90aGVyRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGVycjsgLy8gcmVzZW5kIHRoZSBmaXJzdCBlcnJvclxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtYWlsIG5vdCBleGlzdHMgKG5vIGFjY291bnQpXG4gICAgICAgICAgaWYgKCFpc0VtYWlsRXhpc3RzKSB7XG4gICAgICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuVU5LTk9XTl9BQ0NPVU5UX0VNQUlMLCBtZXNzYWdlOiAnRVJST1IuVU5LTk9XTl9BQ0NPVU5UX0VNQUlMJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtYWlsIGV4aXN0cywgc28gZXJyb3IgPSAnYmFkIHBhc3N3b3JkJ1xuICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuQkFEX1BBU1NXT1JELCBtZXNzYWdlOiAnRVJST1IuQkFEX1BBU1NXT1JEJyB9O1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7IC8vIHJlc2VuZCB0aGUgZmlyc3QgZXJyb3JcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gU3RvcmUgdG8gbG9jYWwgc3RvcmFnZVxuICAgICAgYXdhaXQgdGhpcy5zYXZlTG9jYWxseSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIEVtaXQgZXZlbnQgdG8gb2JzZXJ2ZXJzXG4gICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5kYXRhLmFjY291bnQpO1xuICAgIHRoaXMub25DaGFuZ2UubmV4dCh0aGlzLmRhdGEuYWNjb3VudCk7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhLmFjY291bnQ7XG4gIH1cblxuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICghdGhpcy5kYXRhLnB1YmtleSkgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBsb2dnZWQnKTtcbiAgICBpZiAodGhpcy5uZXR3b3JrLm9mZmxpbmUpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNoZWNrIGFjY291bnQgaW4gb2ZmbGluZSBtb2RlJyk7XG5cbiAgICBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XG4gICAgYXdhaXQgdGhpcy5zYXZlTG9jYWxseSgpO1xuXG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFN1Y2Nlc3NmdWxseSByZWxvYWQgYWNjb3VudCcpO1xuXG4gICAgLy8gRW1pdCBsb2dpbiBldmVudCB0byBzdWJzY3JpYmVyc1xuICAgIHRoaXMub25Mb2dpbi5uZXh0KHRoaXMuZGF0YS5hY2NvdW50KTtcbiAgICB0aGlzLm9uQ2hhbmdlLm5leHQodGhpcy5kYXRhLmFjY291bnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5hY2NvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvciB1cGRhdGUgYW4gdXNlciBhY2NvdW50LCB0byB0aGUgcmVtb3RlIHN0b3JhZ2VcbiAgICpcbiAgICogQHBhcmFtIGFjY291bnRcbiAgICovXG4gIGFzeW5jIHNhdmUoYWNjb3VudDogQWNjb3VudCk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICghdGhpcy5kYXRhLnB1YmtleSkgcmV0dXJuIFByb21pc2UucmVqZWN0KCdVc2VyIG5vdCBsb2dnZWQnKTtcbiAgICBpZiAodGhpcy5kYXRhLnB1YmtleSAhPT0gYWNjb3VudC5wdWJrZXkpIHJldHVybiBQcm9taXNlLnJlamVjdCgnTm90IHVzZXIgYWNjb3VudCcpO1xuXG4gICAgYWNjb3VudCA9IGF3YWl0IHRoaXMuc2F2ZVJlbW90ZWx5KGFjY291bnQsIHRoaXMuZGF0YS5rZXlwYWlyKTtcblxuICAgIC8vIFNldCBkZWZhdWx0c1xuICAgIGFjY291bnQuYXZhdGFyID0gYWNjb3VudC5hdmF0YXIgfHwgKHRoaXMuZW52aXJvbm1lbnQuYmFzZVVybCArIERFRkFVTFRfQVZBVEFSX0lNQUdFKTtcbiAgICB0aGlzLmRhdGEubWFpblByb2ZpbGUgPSBQZXJzb25VdGlscy5nZXRNYWluUHJvZmlsZShhY2NvdW50LnByb2ZpbGVzKTtcblxuICAgIHRoaXMuZGF0YS5hY2NvdW50ID0gYWNjb3VudDtcbiAgICB0aGlzLmRhdGEubG9hZGVkID0gdHJ1ZTtcblxuICAgIC8vIFNhdmUgbG9jYWxseSAoaW4gc3RvcmFnZSlcbiAgICBhd2FpdCB0aGlzLnNhdmVMb2NhbGx5KCk7XG5cbiAgICAvLyBTZW5kIGV2ZW50XG4gICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5kYXRhLmFjY291bnQpO1xuICAgIHRoaXMub25DaGFuZ2UubmV4dCh0aGlzLmRhdGEuYWNjb3VudCk7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhLmFjY291bnQ7XG4gIH1cblxuICBhc3luYyBsb2dvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICBjb25zdCBoYWRBdXRoVG9rZW4gPSB0aGlzLmRhdGEuYXV0aFRva2VuICYmIHRydWU7XG4gICAgY29uc3QgaGFkQXV0aEJhc2ljID0gdGhpcy5kYXRhLmF1dGhCYXNpYyAmJiB0cnVlO1xuICAgIGNvbnN0IHB1YmtleSA9IHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEucHVia2V5O1xuXG4gICAgdGhpcy5yZXNldERhdGEoKTtcblxuICAgIGlmICghdGhpcy5zZXR0aW5ncy5oYXNPZmZsaW5lRmVhdHVyZSgpKSB7XG5cbiAgICAgIC8vIFJlbW92ZSBhbGwgZGF0YSBmcm9tIHRoZSBsb2NhbCBzdG9yYWdlXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoUFVCS0VZX1NUT1JBR0VfS0VZKSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShUT0tFTl9TVE9SQUdFX0tFWSksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoQUNDT1VOVF9TVE9SQUdFX0tFWSksXG4gICAgICAgIHB1YmtleSAmJiB0aGlzLnN0b3JhZ2UucmVtb3ZlKEFDQ09VTlRfU1RPUkFHRV9LRVkgKyAnIycgKyBwdWJrZXkpIHx8IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKFNFQ0tFWV9TVE9SQUdFX0tFWSlcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIC8vIE9mZmxpbmUgZmVhdHVyZXMgZW5hYmxlOiBuZWVkIHRvIGtlZXAgc29tZSBkYXRhXG4gICAgZWxzZSB7XG4gICAgICAvLyBBbHdheXMgcmVtb3ZlIG9ubHkgc2VjcmV0IGtleVxuICAgICAgLy8gQnV0IGtlZXA6XG4gICAgICAvLyAtIGFjY291bnQgYnkgcHVia2V5XG4gICAgICAvLyAtIGF1dGggdG9rZW5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShQVUJLRVlfU1RPUkFHRV9LRVkpLFxuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKEFDQ09VTlRfU1RPUkFHRV9LRVkpLFxuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKFNFQ0tFWV9TVE9SQUdFX0tFWSlcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHBhZ2UgaGlzdG9yeSwgaW4gbG9jYWwgc2V0dGluZ3NcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzLmNsZWFyUGFnZUhpc3RvcnkoKTtcblxuICAgIC8vIE5vdGlmeSBvYnNlcnZlcnNcbiAgICB0aGlzLm9uTG9nb3V0Lm5leHQoKTtcbiAgICBpZiAoaGFkQXV0aFRva2VuKSB0aGlzLm9uQXV0aFRva2VuQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICBpZiAoaGFkQXV0aEJhc2ljKSB0aGlzLm9uQXV0aEJhc2ljQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLm9uQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgYWNjb3VudFxuICAgKlxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgYXN5bmMgbG9hZChvcHRzPzoge1xuICAgIG9mZmxpbmU/OiBib29sZWFuO1xuICAgIGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3k7XG4gIH0pOiBQcm9taXNlPEFjY291bnQgfCB1bmRlZmluZWQ+IHtcblxuICAgIGNvbnN0IG5vdyA9IHRoaXMuX2RlYnVnICYmIERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gTG9hZGluZyBhY2NvdW50Li4uYCk7XG4gICAgbGV0IGpzb246IGFueTtcblxuICAgIC8vIExvYWQgbG9jYWxseVxuICAgIGNvbnN0IG9mZmxpbmUgPSB0aGlzLm5ldHdvcmsub2ZmbGluZVxuICAgICAgJiYgKCFvcHRzIHx8IChvcHRzLmZldGNoUG9saWN5ICE9PSAnbmV0d29yay1vbmx5JyAmJiBvcHRzLmZldGNoUG9saWN5ICE9PSAnbm8tY2FjaGUnKSlcbiAgICAgIHx8IChvcHRzICYmIG9wdHMub2ZmbGluZSA9PT0gdHJ1ZSk7XG4gICAgaWYgKG9mZmxpbmUpIHtcbiAgICAgIGpzb24gPSBhd2FpdCB0aGlzLnN0b3JhZ2UuZ2V0KEFDQ09VTlRfU1RPUkFHRV9LRVkpO1xuICAgICAganNvbiA9IGpzb24gJiYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykgJiYgSlNPTi5wYXJzZShqc29uKSB8fCBqc29uO1xuICAgICAganNvbiA9IGpzb24gJiYgdGhpcy5kYXRhLnB1YmtleSAmJiAoanNvbi5wdWJrZXkgPT09IHRoaXMuZGF0YS5wdWJrZXkpICYmIGpzb24gfHwgbnVsbDtcbiAgICAgIGlmICghanNvbiAmJiB0aGlzLmRhdGEucHVia2V5KSB7XG4gICAgICAgIGpzb24gPSBhd2FpdCB0aGlzLnN0b3JhZ2UuZ2V0KEFDQ09VTlRfU1RPUkFHRV9LRVkgKyAnIycgKyB0aGlzLmRhdGEucHVia2V5KTtcbiAgICAgICAganNvbiA9IGpzb24gJiYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykgJiYgSlNPTi5wYXJzZShqc29uKSB8fCBqc29uO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgcmVtb3RlbHlcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IHtkYXRhfSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5xdWVyeTx7IGRhdGE6IGFueSB9Pih7XG4gICAgICAgIHF1ZXJ5OiBMb2FkUXVlcnksXG4gICAgICAgIGVycm9yOiB7IGNvZGU6IEVycm9yQ29kZXMuTE9BRF9BQ0NPVU5UX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuTE9BRF9BQ0NPVU5UX0VSUk9SJyB9LFxuICAgICAgICBmZXRjaFBvbGljeTogb3B0cyAmJiBvcHRzLmZldGNoUG9saWN5IHx8ICduby1jYWNoZScgfHwgdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIGpzb24gPSBkYXRhO1xuICAgIH1cblxuICAgIGlmIChqc29uKSB7XG4gICAgICBjb25zdCBhY2NvdW50ID0gQWNjb3VudC5mcm9tT2JqZWN0KGpzb24pO1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gQWNjb3VudCBsb2FkZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCwgYWNjb3VudCk7XG4gICAgICAgcmV0dXJuIGFjY291bnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBbYWNjb3VudF0gQWNjb3VudCBub3QgZm91bmQgIWApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbWFpbCBpcyBhdmFpbGFibGUgZm9yIG5ldyBhY2NvdW50IHJlZ2lzdHJhdGlvbi5cbiAgICogVGhyb3cgYW4gZXJyb3IgaWYgbm90IGF2YWlsYWJsZVxuICAgKlxuICAgKiBAcGFyYW0gZW1haWxcbiAgICovXG4gIGFzeW5jIGNoZWNrRW1haWxBdmFpbGFibGUoZW1haWw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlzRW1haWxFeGlzdHMgPSBhd2FpdCB0aGlzLmlzRW1haWxFeGlzdHMoZW1haWwpO1xuICAgIGlmIChpc0VtYWlsRXhpc3RzKSB7XG4gICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuRU1BSUxfQUxSRUFEWV9SRUdJU1RFUkVELCBtZXNzYWdlOiAnRVJST1IuRU1BSUxfQUxSRUFEWV9SRUdJU1RFUkVEJyB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbWFpbCBpcyBleGlzdHMgaW4gc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZW1haWxcbiAgICovXG4gIGFzeW5jIGlzRW1haWxFeGlzdHMoZW1haWw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gQ2hlY2tpbmcgaWYgeycgKyBlbWFpbCArICd9IGV4aXN0cy4uLicpO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5xdWVyeTx7IGlzRW1haWxFeGlzdHM6IGJvb2xlYW4gfSwgSXNFbWFpbEV4aXN0c1ZhcmlhYmxlcz4oe1xuICAgICAgcXVlcnk6IElzRW1haWxFeGlzdHNRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBlbWFpbCxcbiAgICAgICAgaGFzaDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBFbWFpbCBleGlzdDogJyArIChkYXRhICYmIGRhdGEuaXNFbWFpbEV4aXN0cykpO1xuXG4gICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5pc0VtYWlsRXhpc3RzO1xuICB9XG5cbiAgYXN5bmMgc2VuZENvbmZpcm1hdGlvbkVtYWlsKGVtYWlsOiBzdHJpbmcsIGxvY2FsZT86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXG4gICAgbG9jYWxlID0gbG9jYWxlIHx8IHRoaXMuc2V0dGluZ3MubG9jYWxlO1xuICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBTZW5kaW5nIGNvbmZpcm1hdGlvbiBlbWFpbCB0byB7JyArIGVtYWlsICsgJ30gd2l0aCBsb2NhbGUgeycgKyBsb2NhbGUgKyAnfS4uLicpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ3JhcGhxbC5tdXRhdGU8Ym9vbGVhbj4oe1xuICAgICAgbXV0YXRpb246IFNlbmRDb25maXJtRW1haWxNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBlbWFpbCxcbiAgICAgICAgbG9jYWxlXG4gICAgICB9LFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogRXJyb3JDb2Rlcy5TRU5UX0NPTkZJUk1BVElPTl9FTUFJTF9GQUlMRUQsXG4gICAgICAgIG1lc3NhZ2U6ICdFUlJPUi5TRU5UX0FDQ09VTlRfQ09ORklSTUFUSU9OX0VNQUlMX0ZBSUxFRCdcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpcm1FbWFpbChlbWFpbDogU3RyaW5nLCBjb2RlOiBTdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcblxuICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBTZW5kbmcgY29uZmlybSByZXF1ZXN0IGZvciBlbWFpbCB7JyArIGVtYWlsICsgJ30gd2l0aCBjb2RlIHsnICsgY29kZSArICd9Li4uJyk7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdyYXBocWwubXV0YXRlPHsgY29uZmlybUFjY291bnRFbWFpbDogYm9vbGVhbiB9Pih7XG4gICAgICBtdXRhdGlvbjogQ29uZmlybUVtYWlsTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgZW1haWwsXG4gICAgICAgIGNvZGVcbiAgICAgIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkNPTkZJUk1fRU1BSUxfRkFJTEVELFxuICAgICAgICBtZXNzYWdlOiAnRVJST1IuQ09ORklSTV9BQ0NPVU5UX0VNQUlMX0ZBSUxFRCdcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzICYmIHJlcy5jb25maXJtQWNjb3VudEVtYWlsO1xuICB9XG5cbiAgbGlzdGVuQ2hhbmdlcygpOiBTdWJzY3JpcHRpb24ge1xuICAgIGlmICghdGhpcy5kYXRhLnB1YmtleSkgcmV0dXJuIFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFtXU10gTGlzdGVuaW5nIGFjY291bnQgY2hhbmdlcycpO1xuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5ncmFwaHFsLnN1YnNjcmliZTx7ZGF0YTogYW55fT4oe1xuICAgICAgcXVlcnk6IFVwZGF0ZVN1YnNjcmlwdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnRlcnZhbDogMTBcbiAgICAgIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlNVQlNDUklCRV9BQ0NPVU5UX0VSUk9SLFxuICAgICAgICBtZXNzYWdlOiAnRVJST1IuQUNDT1VOVC5TVUJTQ1JJQkVfQUNDT1VOVF9FUlJPUidcbiAgICAgIH1cbiAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgYXN5bmMgbmV4dCh7ZGF0YX0pIHtcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nVXBkYXRlRGF0ZTogc3RyaW5nID0gdG9EYXRlSVNPU3RyaW5nKHNlbGYuZGF0YS5hY2NvdW50Py51cGRhdGVEYXRlKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nVXBkYXRlRGF0ZSAhPT0gZGF0YS51cGRhdGVEYXRlKSB7XG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFtXU10gRGV0ZWN0ZWQgdXBkYXRlIG9uIHske2RhdGEudXBkYXRlRGF0ZX19YCk7XG4gICAgICAgICAgYXdhaXQgc2VsZi5yZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3luYyBlcnJvcihlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiArZXJyLmNvZGUgPT09IFNlcnZlckVycm9yQ29kZXMuTk9UX0ZPVU5EKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbYWNjb3VudF0gQWNjb3VudCBub3QgZXhpc3RzIGFueW1vcmU6IGZvcmNlIHVzZXIgdG8gbG9nb3V0Li4uJywgZXJyKTtcbiAgICAgICAgICBhd2FpdCBzZWxmLmxvZ291dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVyciAmJiArZXJyLmNvZGUgPT09IFNlcnZlckVycm9yQ29kZXMuVU5BVVRIT1JJWkVEKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbYWNjb3VudF0gQWNjb3VudCBub3QgYXV0aG9yaXplZDogZm9yY2UgdXNlciB0byBsb2dvdXQuLi4nLCBlcnIpO1xuICAgICAgICAgIGF3YWl0IHNlbGYubG9nb3V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbYWNjb3VudF0gW1dTXSBSZWNlaXZlZCBlcnJvcjonLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBbV1NdIENvbXBsZXRlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQWRkIGxvZyB3aGVuIGNsb3NpbmcgV1NcbiAgICBzdWJzY3JpcHRpb24uYWRkKCgpID0+IGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBbV1NdIFN0b3AgbGlzdGVuaW5nIGFjY291bnQgY2hhbmdlcycpKTtcblxuICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGdldFBhZ2VTZXR0aW5ncyhwYWdlSWQ6IHN0cmluZywgcHJvcGVydHlOYW1lPzogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmdldFBhZ2VTZXR0aW5ncyhwYWdlSWQsIHByb3BlcnR5TmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHNhdmVQYWdlU2V0dGluZyhwYWdlSWQ6IHN0cmluZywgdmFsdWU6IGFueSwgcHJvcGVydHlOYW1lPzogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5zZXR0aW5ncy5zYXZlUGFnZVNldHRpbmcocGFnZUlkLCB2YWx1ZSwgcHJvcGVydHlOYW1lKTtcbiAgfVxuXG4gIGdldCBhZGRpdGlvbmFsRmllbGRzKCk6IEZvcm1GaWVsZERlZmluaXRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuXyRhZGRpdGlvbmFsRmllbGRzLmdldFZhbHVlKCk7XG4gIH1cblxuICBnZXQgJGFkZGl0aW9uYWxGaWVsZHMoKTogT2JzZXJ2YWJsZTxGb3JtRmllbGREZWZpbml0aW9uW10+IHtcbiAgICByZXR1cm4gdGhpcy5fJGFkZGl0aW9uYWxGaWVsZHM7XG4gIH1cblxuICBnZXRBZGRpdGlvbmFsRmllbGQoa2V5OiBzdHJpbmcpOiBGb3JtRmllbGREZWZpbml0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fJGFkZGl0aW9uYWxGaWVsZHMuZ2V0VmFsdWUoKS5maW5kKGYgPT4gZi5rZXkgPT09IGtleSk7XG4gIH1cblxuICByZWdpc3RlckFkZGl0aW9uYWxGaWVsZChmaWVsZDogRm9ybUZpZWxkRGVmaW5pdGlvbikge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuXyRhZGRpdGlvbmFsRmllbGRzLmdldFZhbHVlKCk7XG4gICAgaWYgKCEhdmFsdWVzLmZpbmQoZiA9PiBmLmtleSA9PT0gZmllbGQua2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZGRpdGlvbmFsIGFjY291bnQgZmllbGQge2tleTogJHtmaWVsZC5rZXl9fSBhbHJlYWR5IGRlZmluZS5gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gRm91bmQgYWRkaXRpb25hbCBhY2NvdW50J3MgZmllbGQge2tleTogJHtmaWVsZC5rZXl9fWApO1xuICAgIHRoaXMuXyRhZGRpdGlvbmFsRmllbGRzLm5leHQodmFsdWVzLmNvbmNhdChmaWVsZCkpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZCAtLSAqL1xuXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkRGF0YShvcHRzPzoge1xuICAgIG9mZmxpbmU/OiBib29sZWFuO1xuICAgIGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3k7XG4gIH0pOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICBpZiAoIXRoaXMuZGF0YS5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkJyk7XG5cbiAgICB0aGlzLmRhdGEubG9hZGVkID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgbGV0IGFjY291bnQgPSAoYXdhaXQgdGhpcy5sb2FkKG9wdHMpKSB8fCBuZXcgQWNjb3VudCgpO1xuXG4gICAgICAvLyBTZXQgZGVmYXVsdHNcbiAgICAgIGFjY291bnQuYXZhdGFyID0gYWNjb3VudC5hdmF0YXIgfHwgKHRoaXMuZW52aXJvbm1lbnQuYmFzZVVybCArIERFRkFVTFRfQVZBVEFSX0lNQUdFKTtcbiAgICAgIGFjY291bnQuc2V0dGluZ3MgPSBhY2NvdW50LnNldHRpbmdzIHx8IG5ldyBVc2VyU2V0dGluZ3MoKTtcbiAgICAgIGFjY291bnQuc2V0dGluZ3MubG9jYWxlID0gYWNjb3VudC5zZXR0aW5ncy5sb2NhbGUgfHwgdGhpcy5zZXR0aW5ncy5sb2NhbGU7XG4gICAgICBhY2NvdW50LnNldHRpbmdzLmxhdExvbmdGb3JtYXQgPSBhY2NvdW50LnNldHRpbmdzLmxhdExvbmdGb3JtYXQgfHwgdGhpcy5zZXR0aW5ncy5sYXRMb25nRm9ybWF0IHx8ICdERE1NJztcblxuICAgICAgLy8gUmVhZCBtYWluIHByb2ZpbGVcbiAgICAgIHRoaXMuZGF0YS5tYWluUHJvZmlsZSA9IFBlcnNvblV0aWxzLmdldE1haW5Qcm9maWxlKGFjY291bnQucHJvZmlsZXMpO1xuXG4gICAgICAvLyBVcGRhdGUsIGluc3RlYWQgb2YgcmVwbGFjZSBpdFxuICAgICAgaWYgKHRoaXMuZGF0YS5hY2NvdW50KSB7XG4gICAgICAgIHRoaXMuZGF0YS5hY2NvdW50LmZyb21PYmplY3QoYWNjb3VudCk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5kYXRhLmFjY291bnQgPSBhY2NvdW50O1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgIHJldHVybiB0aGlzLmRhdGEuYWNjb3VudDtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgaWYgKGVycm9yLmNvZGUgJiYgZXJyb3IubWVzc2FnZSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhyb3cge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkxPQURfQUNDT1VOVF9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLkxPQURfQUNDT1VOVF9FUlJPUidcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc3RvcmVMb2NhbGx5KCk6IFByb21pc2U8QWNjb3VudCB8IHVuZGVmaW5lZD4ge1xuXG4gICAgLy8gUmVzdG9yZSBmcm9tIHN0b3JhZ2VcbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnN0b3JhZ2UuZ2V0KFBVQktFWV9TVE9SQUdFX0tFWSksXG4gICAgICB0aGlzLnN0b3JhZ2UuZ2V0KFRPS0VOX1NUT1JBR0VfS0VZKSxcbiAgICAgIHRoaXMuc3RvcmFnZS5nZXQoU0VDS0VZX1NUT1JBR0VfS0VZKVxuICAgIF0pO1xuICAgIGNvbnN0IHB1YmtleSA9IHZhbHVlc1swXTtcbiAgICBjb25zdCB0b2tlbiA9IHZhbHVlc1sxXTtcbiAgICBjb25zdCBzZWNrZXkgPSB2YWx1ZXNbMl07XG5cbiAgICAvLyBRdWl0IGlmIG5vIHB1YmtleSAobm90IGxvZ2dlZClcbiAgICBpZiAoIXB1YmtleSkgcmV0dXJuO1xuXG4gICAgLy8gUXVpdCBpZiBjb3VsZCBub3QgYXV0aCBvbiBwb2RcbiAgICBjb25zdCBjYW5SZW1vdGVBdXRoID0gdG9rZW4gfHwgc2Vja2V5IHx8IGZhbHNlO1xuICAgIGlmICghY2FuUmVtb3RlQXV0aCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gQWNjb3VudCByZXN0b3JhdGlvbi4uLmApO1xuXG4gICAgdGhpcy5kYXRhLmF1dGhUb2tlbiA9IHRva2VuO1xuICAgIHRoaXMuZGF0YS5wdWJrZXkgPSBwdWJrZXk7XG4gICAgdGhpcy5kYXRhLmtleXBhaXIgPSBzZWNrZXkgJiYge1xuICAgICAgcHVibGljS2V5OiBCYXNlNTguZGVjb2RlKHB1YmtleSksXG4gICAgICBzZWNyZXRLZXk6IEJhc2U1OC5kZWNvZGUoc2Vja2V5KVxuICAgIH0gfHwgbnVsbDtcblxuICAgIC8vIE9ubGluZSBtb2RlOiB0cnkgdG8gY29ubmVjdCB0byBwb2RcbiAgICBpZiAodGhpcy5uZXR3b3JrLm9ubGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hdXRoZW50aWNhdGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGEuYXV0aFRva2VuICYmICF0aGlzLmRhdGEuYXV0aEJhc2ljKSB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCcpO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE9mZmxpbmUgZmVhdHVyZSBhcmUgZW5hYmxlOiBjb250aW51ZSBpbiBvZmZsaW5lIG1vZGVcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuaGFzT2ZmbGluZUZlYXR1cmUoKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW2FjY291bnRdIFVuYWJsZSB0byBhdXRoZW50aWNhdGUgb24gcG9kOiBmb3JjaW5nIG9mZmxpbmUgbW9kZScpO1xuICAgICAgICAgIHRoaXMubmV0d29yay5zZXRGb3JjZU9mZmxpbmUodHJ1ZSwge3Nob3dUb2FzdDogZmFsc2V9KTtcbiAgICAgICAgICAvLyBDb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vIG9mZmxpbmUgZmVhdHVyZXMgZW5hYmxlICg9b2ZmbGluZSBtb2RlIG5vdCBhbGxvd2VkKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBhY2NvdW50LCBmcm9tIHB1YmtleVxuICAgIGxldCBqc29uQWNjb3VudCA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoYCR7QUNDT1VOVF9TVE9SQUdFX0tFWX0jJHtwdWJrZXl9YCk7XG4gICAgaWYgKCFqc29uQWNjb3VudCkge1xuICAgICAgLy8gVHJ5IHVzaW5nIHRoZSBvbGQgc3RvcmFnZSBrZXlcbiAgICAgIGNvbnN0IGFjY291bnRTdHIgPSBhd2FpdCB0aGlzLnN0b3JhZ2UuZ2V0KEFDQ09VTlRfU1RPUkFHRV9LRVkpO1xuICAgICAganNvbkFjY291bnQgPSBhY2NvdW50U3RyICYmICgodHlwZW9mIGFjY291bnRTdHIgPT09ICdzdHJpbmcnKSAmJiBKU09OLnBhcnNlKGpzb25BY2NvdW50KSB8fCBhY2NvdW50U3RyKTtcbiAgICB9XG5cbiAgICAvLyBJbnZhbGlkIGFjY291bnQ6IGRvIG5vdCB1c2UgaXRcbiAgICBpZiAoIWpzb25BY2NvdW50IHx8IGpzb25BY2NvdW50LnB1YmtleSAhPT0gcHVia2V5KSByZXR1cm47XG5cbiAgICAvLyBUcmFuc2Zvcm0gdG8gZW50aXR5XG4gICAgY29uc3QgYWNjb3VudCA9IEFjY291bnQuZnJvbU9iamVjdChqc29uQWNjb3VudCk7XG5cbiAgICAvLyBVcGRhdGUgZGF0YVxuICAgIHRoaXMuZGF0YS5hY2NvdW50ID0gYWNjb3VudDtcbiAgICB0aGlzLmRhdGEubWFpblByb2ZpbGUgPSBQZXJzb25VdGlscy5nZXRNYWluUHJvZmlsZShhY2NvdW50LnByb2ZpbGVzKTtcbiAgICB0aGlzLmRhdGEubG9hZGVkID0gdHJ1ZTtcblxuICAgIC8vIEVtaXQgZXZlbnRcbiAgICB0aGlzLm9uTG9naW4ubmV4dCh0aGlzLmRhdGEuYWNjb3VudCk7XG4gICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuZGF0YS5hY2NvdW50KTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIEFjY291bnQgcmVzdG9yYXRpb24gW09LXSB7cHVia2V5OiAke3B1YmtleS5zdWJzdHIoMCwgOCl9fSwge3Byb2ZpbGU6ICR7dGhpcy5kYXRhLm1haW5Qcm9maWxlfX1gKTtcblxuICAgIHJldHVybiBhY2NvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYWNjb3VudCBpbnRvIHRoZSBsb2NhbCBzdG9yYWdlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZUxvY2FsbHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmRhdGEucHVia2V5KSB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGxvZ2dlZCcpO1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gU2F2aW5nIGFjY291bnQgeyR7dGhpcy5kYXRhLnB1YmtleS5zdWJzdHJpbmcoMCwgNil9fSBpbiBsb2NhbCBzdG9yYWdlLi4uYCk7XG5cbiAgICAvLyBDb252ZXJ0IGFjY291bnQgdG8ganNvblxuICAgIGNvbnN0IGpzb24gPSB0aGlzLmRhdGEuYWNjb3VudC5hc09iamVjdCh7a2VlcFR5cGVuYW1lOiB0cnVlfSk7XG4gICAgY29uc3Qgc2Vja2V5ID0gdGhpcy5kYXRhLmtleXBhaXIgJiYgdGhpcy5kYXRhLmtleXBhaXIuc2VjcmV0S2V5ICYmIEJhc2U1OC5lbmNvZGUodGhpcy5kYXRhLmtleXBhaXIuc2VjcmV0S2V5KSB8fCBudWxsO1xuXG4gICAgLy8gQ29udmVydCBhdmF0YXIgVVJMIHRvIGRhdGFVcmwgKGUuZy4gJ2RhdGE6aW1hZ2UvcG5nOjxiYXNlNjQgY29udGVudD4nKVxuICAgIGNvbnN0IGhhc0F2YXRhclVybCA9IGpzb24uYXZhdGFyICYmICFqc29uLmF2YXRhci5lbmRzV2l0aChERUZBVUxUX0FWQVRBUl9JTUFHRSkgJiZcbiAgICAgIChqc29uLmF2YXRhci5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgKGpzb24uYXZhdGFyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKTtcbiAgICBpZiAoaGFzQXZhdGFyVXJsICYmIHRoaXMubmV0d29yay5vbmxpbmUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZS5nZXRJbWFnZShqc29uLmF2YXRhciwge1xuICAgICAgICB0aHVtYm5haWw6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2RhdGFVcmwnXG4gICAgICB9KVxuICAgICAgICAudGhlbihkYXRhVXJsID0+IHtcbiAgICAgICAgICBpZiAoZGF0YVVybCAmJiB0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIEltYWdlIGZldGNoZWQ6ICcsIGRhdGFVcmwuc3Vic3RyaW5nKDAsIDUwKSk7XG5cbiAgICAgICAgICAvLyBUT0RPOiBtYWtlIHN1cmUgdG8gZGlzcGxheSBCYXNlNjQgaW1hZ2UgaW4gdGhlIG1lbnUgdG9wIGhlYWRlclxuICAgICAgICAgIC8vanNvbkFjY291bnQuYXZhdGFyID0gZGF0YVVybDtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW2FjY291bnRdIEVycm9yIHdoaWxlIGZldGNoaW5nIGltYWdlOiAke2pzb24uYXZhdGFyfTogJHtlcnJ9YCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoUFVCS0VZX1NUT1JBR0VfS0VZLCB0aGlzLmRhdGEucHVia2V5KSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldChUT0tFTl9TVE9SQUdFX0tFWSwgdGhpcy5kYXRhLmF1dGhUb2tlbiksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoYCR7QUNDT1VOVF9TVE9SQUdFX0tFWX0jJHt0aGlzLmRhdGEucHVia2V5fWAsIGpzb24pLFxuICAgICAgICAvLyBTZWNyZXQga2V5IChvcHRpb25hbClcbiAgICAgICAgc2Vja2V5ICYmIHRoaXMuc3RvcmFnZS5zZXQoU0VDS0VZX1NUT1JBR0VfS0VZLCBzZWNrZXkpIHx8IHRoaXMuc3RvcmFnZS5yZW1vdmUoU0VDS0VZX1NUT1JBR0VfS0VZKSxcbiAgICAgICAgLy8gUmVtb3ZlIG9sZCBzdG9yYWdlIGtleVxuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKEFDQ09VTlRfU1RPUkFHRV9LRVkpXG4gICAgICBdKTtcblxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gQWNjb3VudCBzYXZlZCBpbiBsb2NhbCBzdG9yYWdlJyk7XG4gICAgfVxuICAgIGNhdGNoKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW2FjY291bnRdIEVycm9yIHdoaWxlIHNhdmluZyBhY2NvdW50IGxvY2FsbHk6ICcgKyAoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVyciksIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvciB1cGRhdGUgYW4gdXNlciBhY2NvdW50XG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50XG4gICAqIEBwYXJhbSBrZXlQYWlyXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZVJlbW90ZWx5KGFjY291bnQ6IEFjY291bnQsIGtleVBhaXI/OiBLZXlQYWlyKTogUHJvbWlzZTxBY2NvdW50PiB7XG4gICAgYWNjb3VudC5wdWJrZXkgPSBhY2NvdW50LnB1YmtleSB8fCAoa2V5UGFpciAmJiBCYXNlNTguZW5jb2RlKGtleVBhaXIucHVibGljS2V5KSk7XG4gICAgaWYgKCFhY2NvdW50LnB1YmtleSkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGFjY291bnQgcHVia2V5Jyk7XG5cbiAgICBjb25zdCBub3cgPSB0aGlzLl9kZWJ1ZyAmJiBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFNhdmluZyBhY2NvdW50IHJlbW90ZWx5Li4uYCk7XG5cbiAgICBjb25zdCBpc05ldyA9ICFhY2NvdW50LmlkICYmIGFjY291bnQuaWQgIT09IDA7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGFuIHVwZGF0ZTogZ2V0IGV4aXN0aW5nIGFjY291bnQncyB1cGRhdGVEYXRlLCB0byBhdm9pZCAndmVyc2lvbiBlcnJvcicgd2hlbiBzYXZpbmdcbiAgICBpZiAoIWlzTmV3KSB7XG4gICAgICBjb25zdCBleGlzdGluZ0FjY291bnQgPSBhd2FpdCB0aGlzLmxvYWQoeyBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScgfSk7XG4gICAgICBpZiAoIWV4aXN0aW5nQWNjb3VudCB8fCAhZXhpc3RpbmdBY2NvdW50LnVwZGF0ZURhdGUpIHtcbiAgICAgICAgdGhyb3cgeyBjb2RlOiBFcnJvckNvZGVzLkFDQ09VTlRfTk9UX0VYSVNUUywgbWVzc2FnZTogJ0VSUk9SLkFDQ09VTlRfTk9UX0VYSVNUUycgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZShleGlzdGluZ0FjY291bnQsIGFjY291bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGpzb24gPSBhY2NvdW50LmFzT2JqZWN0KE1JTklGWV9FTlRJVFlfRk9SX1BPRCk7XG5cbiAgICAvLyBVc2VyIG5vdCBhbGxvdyB0byBjaGFuZ2UgaGlzIHByb2ZpbGVzXG4gICAgZGVsZXRlIGpzb24ucHJvZmlsZXM7XG5cbiAgICAvLyBFeGVjdXRlIG11dGF0aW9uXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmdyYXBocWwubXV0YXRlPHsgZGF0YTogQWNjb3VudCB9Pih7XG4gICAgICBtdXRhdGlvbjogaXNOZXcgPyBDcmVhdGVNdXRhdGlvbiA6IFNhdmVNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczogeyBkYXRhOiBqc29uIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlNBVkVfQUNDT1VOVF9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLlNBVkVfQUNDT1VOVF9FUlJPUidcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENvcHkgdXBkYXRlIHByb3BlcnRpZXNcbiAgICB0aGlzLmNvcHlJZEFuZFVwZGF0ZURhdGUoZGF0YSwgYWNjb3VudCk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBY2NvdW50IHJlbW90ZWx5IHNhdmVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgcmV0dXJuIGFjY291bnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYXV0aGVudGljYXRlQW5kR2V0VG9rZW4odG9rZW4/OiBzdHJpbmcsIGNvdW50ZXI/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghdGhpcy5kYXRhLnB1YmtleSkgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBsb2dnZWQnKTtcblxuICAgIGlmICghY291bnRlcikgY29uc29sZS5pbmZvKCdbYWNjb3VudF0gQXV0aGVudGljYXRpb24gb24gcG9kLi4uJyk7XG5cbiAgICBpZiAoY291bnRlciA+IDQpIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIEZhaWxlZCB0byBhdXRoZW50aWNhdGlvbiBvbiBwb2QgKGFmdGVyICR7Y291bnRlcn0gYXR0ZW1wdHMpYCk7XG4gICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuQVVUSF9TRVJWRVJfRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5BVVRIX1NFUlZFUl9FUlJPUicgfTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB2YWxpZFxuICAgIGlmICh0b2tlbikge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5xdWVyeTx7IGF1dGhlbnRpY2F0ZTogYm9vbGVhbiB9LCB7IHRva2VuOiBzdHJpbmcgfT4oe1xuICAgICAgICBxdWVyeTogQXV0aFF1ZXJ5LFxuICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICB0b2tlblxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIGNvZGU6IEVycm9yQ29kZXMuVU5BVVRIT1JJWkVELFxuICAgICAgICAgIG1lc3NhZ2U6ICdFUlJPUi5VTkFVVEhPUklaRUQnXG4gICAgICAgIH0sXG4gICAgICAgIGZldGNoUG9saWN5OiAnbm8tY2FjaGUnXG4gICAgICB9KTtcblxuICAgICAgLy8gVG9rZW4gaXMgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlclxuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5hdXRoZW50aWNhdGUpIHtcbiAgICAgICAgLy8gU3RvcmUgdGhlIHRva2VuXG4gICAgICAgIHRoaXMub25BdXRoVG9rZW5DaGFuZ2UubmV4dCh0b2tlbik7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKGBbYWNjb3VudF0gQXV0aGVudGljYXRpb24gb24gcG9kIFtPS10ge3B1YmtleTogJyR7dGhpcy5kYXRhLnB1YmtleS5zdWJzdHIoMCwgOCl9J31gKTtcbiAgICAgICAgcmV0dXJuIHRva2VuOyAvLyByZXR1cm4gdGhlIHRva2VuXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRpbnVlICh3aWxsIHJldHJ5IHdpdGggYW5vdGhlciBjaGFsbGVuZ2UpXG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgYSBuZXcgdG9rZW5cbiAgICBjb25zdCBjaGFsbGVuZ2VFcnJvciA9IHtcbiAgICAgIGNvZGU6IEVycm9yQ29kZXMuQVVUSF9DSEFMTEVOR0VfRVJST1IsXG4gICAgICBtZXNzYWdlOiAnRVJST1IuQVVUSF9DSEFMTEVOR0VfRVJST1InXG4gICAgfTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5ncmFwaHFsLnF1ZXJ5PHtcbiAgICAgIGF1dGhDaGFsbGVuZ2U6IHtcbiAgICAgICAgcHVia2V5OiBzdHJpbmc7XG4gICAgICAgIGNoYWxsZW5nZTogc3RyaW5nO1xuICAgICAgICBzaWduYXR1cmU6IHN0cmluZztcbiAgICAgIH07XG4gICAgfT4oe1xuICAgICAgcXVlcnk6IEF1dGhDaGFsbGVuZ2VRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge30sXG4gICAgICBlcnJvcjogY2hhbGxlbmdlRXJyb3IsXG4gICAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seSdcbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGNoYWxsZW5nZVxuICAgIGlmICghZGF0YSB8fCAhZGF0YS5hdXRoQ2hhbGxlbmdlKSB0aHJvdyBjaGFsbGVuZ2VFcnJvcjsgLy8gU2hvdWxkIG5ldmVyIG9jY3VyXG5cbiAgICAvLyBDaGVjayBzZXJ2ZXIgc2lnbmF0dXJlXG4gICAgY29uc3Qgc2lnbmF0dXJlT0sgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UudmVyaWZ5KFxuICAgICAgZGF0YS5hdXRoQ2hhbGxlbmdlLmNoYWxsZW5nZSxcbiAgICAgIGRhdGEuYXV0aENoYWxsZW5nZS5zaWduYXR1cmUsXG4gICAgICBkYXRhLmF1dGhDaGFsbGVuZ2UucHVia2V5XG4gICAgKTtcbiAgICBpZiAoIXNpZ25hdHVyZU9LKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZJWE1FOiBCYWQgcGVlciBzaWduYXR1cmUgb24gYXV0aCBjaGFsbGVuZ2UgIScsIGRhdGEuYXV0aENoYWxsZW5nZSk7XG4gICAgfVxuICAgIC8vIFRPRE86IGNoZWNrIHNlcnZlciBwdWJrZXkgYXMgYSB2YWxpZCBjZXJ0aWZpY2F0ZVxuXG4gICAgLy8gRG8gdGhlIGNoYWxsZW5nZVxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5zaWduKGRhdGEuYXV0aENoYWxsZW5nZS5jaGFsbGVuZ2UsIHRoaXMuZGF0YS5rZXlwYWlyKTtcbiAgICBjb25zdCBuZXdUb2tlbiA9IGAke3RoaXMuZGF0YS5wdWJrZXl9OiR7ZGF0YS5hdXRoQ2hhbGxlbmdlLmNoYWxsZW5nZX18JHtzaWduYXR1cmV9YDtcblxuICAgIC8vIGl0ZXJhdGUgd2l0aCB0aGUgbmV3IHRva2VuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlQW5kR2V0VG9rZW4obmV3VG9rZW4sIChjb3VudGVyIHx8IDEpICsgMSAvKiBpbmNyZW1lbnQgKi8pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvcHlJZEFuZFVwZGF0ZURhdGUoc291cmNlOiBBY2NvdW50IHwgdW5kZWZpbmVkLCB0YXJnZXQ6IEFjY291bnQpIHtcbiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xuXG4gICAgdGFyZ2V0LmlkID0gc291cmNlLmlkIHx8IHRhcmdldC5pZDtcbiAgICB0YXJnZXQudXBkYXRlRGF0ZSA9IHNvdXJjZS51cGRhdGVEYXRlIHx8IHRhcmdldC51cGRhdGVEYXRlO1xuICAgIHRhcmdldC5zZXR0aW5ncy5pZCA9IHNvdXJjZS5zZXR0aW5ncyAmJiBzb3VyY2Uuc2V0dGluZ3MuaWQgfHwgdGFyZ2V0LnNldHRpbmdzLmlkO1xuICAgIHRhcmdldC5zZXR0aW5ncy51cGRhdGVEYXRlID0gc291cmNlLnNldHRpbmdzICYmIHNvdXJjZS5zZXR0aW5ncy51cGRhdGVEYXRlIHx8IHRhcmdldC5zZXR0aW5ncy51cGRhdGVEYXRlO1xuICB9XG59XG4iXX0=
1072
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3NlcnZpY2VzL2FjY291bnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLGFBQWEsRUFBVSxNQUFNLGtCQUFrQixDQUFDO0FBRXhELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM5QyxPQUFPLEVBQVMsV0FBVyxFQUFtQixNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBWSxZQUFZLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZUFBZSxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDeEUsT0FBTyxFQUFjLEdBQUcsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN0RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFOUQsT0FBTyxFQUFnQixjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0QsT0FBTyxFQUFDLHFCQUFxQixFQUFlLGdCQUFnQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFD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LG1CQUFtQixDQUFDLE1BQTJCLEVBQUUsTUFBZTtRQUN4RSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFFcEIsTUFBTSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDM0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNqRixNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQzNHLENBQUM7Ozs7WUEvL0JGLFVBQVUsU0FBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7OztZQTVLeEIsYUFBYTtZQWVFLGNBQWM7WUFIN0IsY0FBYztZQUNkLG9CQUFvQjtZQU5wQixPQUFPO1lBU1AsV0FBVzs0Q0E4TmQsTUFBTSxTQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NyeXB0b1NlcnZpY2UsIEtleVBhaXJ9IGZyb20gJy4vY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHtEZXBhcnRtZW50fSBmcm9tICcuL21vZGVsL2RlcGFydG1lbnQubW9kZWwnO1xuaW1wb3J0IHtBY2NvdW50fSBmcm9tICcuL21vZGVsL2FjY291bnQubW9kZWwnO1xuaW1wb3J0IHtQZXJzb24sIFBlcnNvblV0aWxzLCBVc2VyUHJvZmlsZUxhYmVsfSBmcm9tICcuL21vZGVsL3BlcnNvbi5tb2RlbCc7XG5pbXBvcnQge1VzYWdlTW9kZSwgVXNlclNldHRpbmdzfSBmcm9tICcuL21vZGVsL3NldHRpbmdzLm1vZGVsJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtGZXRjaFBvbGljeSwgZ3FsfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7U3RvcmFnZX0gZnJvbSAnQGlvbmljL3N0b3JhZ2UnO1xuXG5pbXBvcnQge3NsZWVwfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7QmFzZUdyYXBocWxTZXJ2aWNlfSBmcm9tICcuL2Jhc2UtZ3JhcGhxbC1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7RXJyb3JDb2RlcywgU2VydmVyRXJyb3JDb2Rlc30gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHtHcmFwaHFsU2VydmljZX0gZnJvbSAnLi4vZ3JhcGhxbC9ncmFwaHFsLnNlcnZpY2UnO1xuaW1wb3J0IHtMb2NhbFNldHRpbmdzU2VydmljZX0gZnJvbSAnLi9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7Rm9ybUZpZWxkRGVmaW5pdGlvbn0gZnJvbSAnLi4vLi4vc2hhcmVkL2Zvcm0vZmllbGQubW9kZWwnO1xuaW1wb3J0IHtBdXRoVG9rZW5UeXBlLCBOZXR3b3JrU2VydmljZX0gZnJvbSAnLi9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHtGaWxlU2VydmljZX0gZnJvbSAnLi4vLi4vc2hhcmVkL2ZpbGUvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7TUlOSUZZX0VOVElUWV9GT1JfUE9ELCBSZWZlcmVudGlhbCwgUmVmZXJlbnRpYWxVdGlsc30gZnJvbSAnLi9tb2RlbC9yZWZlcmVudGlhbC5tb2RlbCc7XG5pbXBvcnQge1N0YXR1c0lkc30gZnJvbSAnLi9tb2RlbC9tb2RlbC5lbnVtJztcbmltcG9ydCB7QmFzZTU4fSBmcm9tICcuL2Jhc2U1OCc7XG5pbXBvcnQge0VOVklST05NRU5UfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHt0b0RhdGVJU09TdHJpbmd9IGZyb20gJy4uLy4uL3NoYXJlZC9kYXRlcyc7XG5pbXBvcnQge2ZpcnN0Tm90TmlsUHJvbWlzZX0gZnJvbSAnLi4vLi4vc2hhcmVkL29ic2VydmFibGVzJztcbmltcG9ydCB7SVN0YXJ0YWJsZVNlcnZpY2V9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zdGFydGFibGUtc2VydmljZS5jbGFzcyc7XG5cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEFjY291bnRIb2xkZXIge1xuICBsb2FkZWQ6IGJvb2xlYW47XG4gIGtleXBhaXI6IEtleVBhaXI7XG4gIGF1dGhUb2tlbjogc3RyaW5nO1xuICBhdXRoQmFzaWM/OiBzdHJpbmc7XG4gIHB1YmtleTogc3RyaW5nO1xuICBhY2NvdW50OiBBY2NvdW50O1xuICBwZXJzb246IFBlcnNvbjtcbiAgZGVwYXJ0bWVudDogRGVwYXJ0bWVudDtcbiAgLy8gVE9ETyA6IHVzZSB0aGlzID9cbiAgbWFpblByb2ZpbGU6IFN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aERhdGEge1xuICB1c2VybmFtZTogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xuICBvZmZsaW5lPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJEYXRhIGV4dGVuZHMgQXV0aERhdGEge1xuICBhY2NvdW50OiBBY2NvdW50O1xufVxuXG5jb25zdCBUT0tFTl9TVE9SQUdFX0tFWSA9ICd0b2tlbic7XG5jb25zdCBQVUJLRVlfU1RPUkFHRV9LRVkgPSAncHVia2V5JztcbmNvbnN0IFNFQ0tFWV9TVE9SQUdFX0tFWSA9ICdzZWNrZXknO1xuY29uc3QgQUNDT1VOVF9TVE9SQUdFX0tFWSA9ICdhY2NvdW50JztcblxuY29uc3QgREVGQVVMVF9BVkFUQVJfSU1BR0UgPSAnYXNzZXRzL2ltZy9wZXJzb24ucG5nJztcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBHcmFwaFFMIHF1ZXJpZXNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5jb25zdCBGcmFnbWVudHMgPSB7XG4gIGFjY291bnQ6IGdxbGBcbiAgICBmcmFnbWVudCBBY2NvdW50RnJhZ21lbnQgb24gQWNjb3VudFZPIHtcbiAgICAgIGlkXG4gICAgICBmaXJzdE5hbWVcbiAgICAgIGxhc3ROYW1lXG4gICAgICBlbWFpbFxuICAgICAgcHVia2V5XG4gICAgICBhdmF0YXJcbiAgICAgIHN0YXR1c0lkXG4gICAgICB1cGRhdGVEYXRlXG4gICAgICBjcmVhdGlvbkRhdGVcbiAgICAgIHByb2ZpbGVzXG4gICAgICBzZXR0aW5ncyB7XG4gICAgICAgIGlkXG4gICAgICAgIGxvY2FsZVxuICAgICAgICBsYXRMb25nRm9ybWF0XG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgbm9uY2VcbiAgICAgICAgdXBkYXRlRGF0ZVxuICAgICAgICBfX3R5cGVuYW1lXG4gICAgICB9XG4gICAgICBkZXBhcnRtZW50IHtcbiAgICAgICAgaWRcbiAgICAgICAgbGFiZWxcbiAgICAgICAgbmFtZVxuICAgICAgICBfX3R5cGVuYW1lXG4gICAgICB9XG4gICAgICBfX3R5cGVuYW1lXG4gICAgfVxuICBgXG59O1xuXG4vLyBMb2FkIGFjY291bnQgcXVlcnlcbmNvbnN0IExvYWRRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBBY2NvdW50IHtcbiAgICBkYXRhOiBhY2NvdW50IHtcbiAgICAgIC4uLkFjY291bnRGcmFnbWVudFxuICAgIH1cbiAgfVxuICAke0ZyYWdtZW50cy5hY2NvdW50fVxuYDtcblxuLy8gQ2hlY2sgZW1haWwgcXVlcnlcbmNvbnN0IElzRW1haWxFeGlzdHNRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBJc0VtYWlsRXhpc3RzKCRlbWFpbDogU3RyaW5nLCAkaGFzaDogU3RyaW5nKXtcbiAgICBpc0VtYWlsRXhpc3RzKGVtYWlsOiAkZW1haWwsIGhhc2g6ICRoYXNoKVxuICB9XG5gO1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElzRW1haWxFeGlzdHNWYXJpYWJsZXMge1xuICBlbWFpbDogc3RyaW5nO1xuICBoYXNoOiBzdHJpbmc7XG59XG5cbi8vIFNhdmUgKGNyZWF0ZSBvciB1cGRhdGUpIGFjY291bnQgbXV0YXRpb25cbmNvbnN0IFNhdmVNdXRhdGlvbjogYW55ID0gZ3FsYFxuICBtdXRhdGlvbiBTYXZlQWNjb3VudCgkZGF0YTpBY2NvdW50Vk9JbnB1dCl7XG4gICAgZGF0YTogc2F2ZUFjY291bnQoYWNjb3VudDogJGRhdGEpe1xuICAgICAgLi4uQWNjb3VudEZyYWdtZW50XG4gICAgfVxuICB9XG4gICR7RnJhZ21lbnRzLmFjY291bnR9XG5gO1xuXG4vLyBDcmVhdGUgYWNjb3VudCBtdXRhdGlvblxuY29uc3QgQ3JlYXRlTXV0YXRpb246IGFueSA9IGdxbGBcbiAgbXV0YXRpb24gQ3JlYXRlQWNjb3VudCgkZGF0YTpBY2NvdW50Vk9JbnB1dCl7XG4gICAgZGF0YTogY3JlYXRlQWNjb3VudChhY2NvdW50OiAkZGF0YSl7XG4gICAgICAuLi5BY2NvdW50RnJhZ21lbnRcbiAgICB9XG4gIH1cbiAgJHtGcmFnbWVudHMuYWNjb3VudH1cbmA7XG5cbi8vIFNlbnQgY29uZmlybWF0aW9uIGVtYWlsXG5jb25zdCBTZW5kQ29uZmlybUVtYWlsTXV0YXRpb246IGFueSA9IGdxbGBcbiAgbXV0YXRpb24gc2VuZEFjY291bnRDb25maXJtYXRpb25FbWFpbCgkZW1haWw6U3RyaW5nLCAkbG9jYWxlOlN0cmluZyl7XG4gICAgc2VuZEFjY291bnRDb25maXJtYXRpb25FbWFpbChlbWFpbDogJGVtYWlsLCBsb2NhbGU6ICRsb2NhbGUpXG4gIH1cbmA7XG5cbi8vIENvbmZpcm0gYWNjb3VudCBlbWFpbFxuY29uc3QgQ29uZmlybUVtYWlsTXV0YXRpb246IGFueSA9IGdxbGBcbiAgbXV0YXRpb24gY29uZmlybUFjY291bnRFbWFpbCgkZW1haWw6U3RyaW5nLCAkY29kZTpTdHJpbmcpe1xuICAgIGNvbmZpcm1BY2NvdW50RW1haWwoZW1haWw6ICRlbWFpbCwgY29kZTogJGNvZGUpXG4gIH1cbmA7XG5cbi8vIEF1dGhlbnRpY2F0aW9uICBxdWVyeVxuY29uc3QgQXV0aFF1ZXJ5OiBhbnkgPSBncWxgXG4gIHF1ZXJ5IEF1dGgoJHRva2VuOiBTdHJpbmcpe1xuICAgIGF1dGhlbnRpY2F0ZSh0b2tlbjogJHRva2VuKVxuICB9XG5gO1xuXG4vLyBOZXcgYXV0aCBjaGFsbGVuZ2UgcXVlcnlcbmNvbnN0IEF1dGhDaGFsbGVuZ2VRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBBdXRoQ2hhbGxlbmdle1xuICAgIGF1dGhDaGFsbGVuZ2V7XG4gICAgICBjaGFsbGVuZ2VcbiAgICAgIHB1YmtleVxuICAgICAgc2lnbmF0dXJlXG4gICAgfVxuICB9XG5gO1xuXG5jb25zdCBVcGRhdGVTdWJzY3JpcHRpb246IGFueSA9IGdxbGBcbiAgc3Vic2NyaXB0aW9uIHVwZGF0ZUFjY291bnQoJGludGVydmFsOiBJbnQpe1xuICAgIGRhdGE6IHVwZGF0ZUFjY291bnQoaW50ZXJ2YWw6ICRpbnRlcnZhbCkge1xuICAgICAgaWRcbiAgICAgIHVwZGF0ZURhdGVcbiAgICB9XG4gIH1cbmA7XG5cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIEFjY291bnRTZXJ2aWNlIGV4dGVuZHMgQmFzZUdyYXBocWxTZXJ2aWNlIGltcGxlbWVudHMgSVN0YXJ0YWJsZVNlcnZpY2U8QWNjb3VudD4ge1xuXG4gIG9uTG9naW4gPSBuZXcgU3ViamVjdDxBY2NvdW50PigpO1xuICBvbkxvZ291dCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgb25DaGFuZ2UgPSBuZXcgU3ViamVjdDxBY2NvdW50PigpO1xuICBvbkF1dGhUb2tlbkNoYW5nZSA9IG5ldyBTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgb25BdXRoQmFzaWNDaGFuZ2UgPSBuZXcgU3ViamVjdDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG5cbiAgcHJpdmF0ZSBfZGF0YTogQWNjb3VudEhvbGRlciA9IHtcbiAgICBsb2FkZWQ6IGZhbHNlLFxuICAgIGtleXBhaXI6IG51bGwsXG4gICAgYXV0aFRva2VuOiBudWxsLFxuICAgIGF1dGhCYXNpYzogbnVsbCxcbiAgICBwdWJrZXk6IG51bGwsXG4gICAgbWFpblByb2ZpbGU6IG51bGwsXG4gICAgYWNjb3VudDogbnVsbCxcbiAgICBwZXJzb246IG51bGwsXG4gICAgZGVwYXJ0bWVudDogbnVsbFxuICB9O1xuICBwcml2YXRlIF9zdGFydFByb21pc2U6IFByb21pc2U8QWNjb3VudD47XG4gIHByaXZhdGUgX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfJGFkZGl0aW9uYWxGaWVsZHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZvcm1GaWVsZERlZmluaXRpb25bXT4oW10pO1xuICBwcml2YXRlIF90b2tlblR5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoVG9rZW5UeXBlPih1bmRlZmluZWQpO1xuXG4gIGdldCBhY2NvdW50KCk6IEFjY291bnQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLmxvYWRlZCA/IHRoaXMuX2RhdGEuYWNjb3VudCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBwZXJzb24oKTogUGVyc29uIHtcbiAgICBpZiAodGhpcy5fZGF0YS5sb2FkZWQgJiYgIXRoaXMuX2RhdGEucGVyc29uKSB7XG4gICAgICB0aGlzLl9kYXRhLnBlcnNvbiA9IHRoaXMuX2RhdGEubG9hZGVkID8gdGhpcy5fZGF0YS5hY2NvdW50LmFzUGVyc29uKCkgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYXRhLnBlcnNvbjtcbiAgfVxuXG4gIGdldCBkZXBhcnRtZW50KCk6IERlcGFydG1lbnQge1xuICAgIGlmICh0aGlzLl9kYXRhLmxvYWRlZCAmJiAhdGhpcy5fZGF0YS5kZXBhcnRtZW50KSB7XG4gICAgICB0aGlzLl9kYXRhLmRlcGFydG1lbnQgPSB0aGlzLl9kYXRhLmxvYWRlZCA/IHRoaXMuX2RhdGEuYWNjb3VudC5hc1BlcnNvbigpLmRlcGFydG1lbnQgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYXRhLmRlcGFydG1lbnQ7XG4gIH1cblxuICBnZXQgdG9rZW5UeXBlKCk6IEF1dGhUb2tlblR5cGUge1xuICAgIHJldHVybiB0aGlzLl90b2tlblR5cGUkLnZhbHVlO1xuICB9XG5cbiAgc2V0IHRva2VuVHlwZSh2YWx1ZTogQXV0aFRva2VuVHlwZSkge1xuICAgIGlmICh0aGlzLl90b2tlblR5cGUkLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgY29uc29sZS5pbmZvKCdbYWNjb3VudF0gVXNpbmcgYXV0aGVudGljYXRpb24gdG9rZW4gdHlwZTogJyArIHZhbHVlKTtcbiAgICAgIHRoaXMuX3Rva2VuVHlwZSQubmV4dCh2YWx1ZSk7XG4gICAgICAvLyBSZXNldCB2YWx1ZXNcbiAgICAgIHRoaXMuX2RhdGEuYXV0aFRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vbkF1dGhUb2tlbkNoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLl9kYXRhLmF1dGhCYXNpYyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub25BdXRoQmFzaWNDaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbmV0d29yazogTmV0d29ya1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGdyYXBocWw6IEdyYXBocWxTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gICAgcHJvdGVjdGVkIGZpbGU6IEZpbGVTZXJ2aWNlLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudFxuICApIHtcbiAgICBzdXBlcihncmFwaHFsLCBlbnZpcm9ubWVudCk7XG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50LXNlcnZpY2VdIENyZWF0aW5nIHNlcnZpY2UnKTtcblxuICAgIHRoaXMucmVzZXREYXRhKCk7XG5cbiAgICAvLyBTZW5kIGF1dGggdG9rZW4gdG8gdGhlIGdyYXBocWwgbGF5ZXIsIHdoZW4gY2hhbmdlZFxuICAgIHRoaXMub25BdXRoVG9rZW5DaGFuZ2Uuc3Vic2NyaWJlKCh0b2tlbikgPT4gdGhpcy5ncmFwaHFsLnNldEF1dGhUb2tlbih0b2tlbikpO1xuICAgIHRoaXMub25BdXRoQmFzaWNDaGFuZ2Uuc3Vic2NyaWJlKChiYXNpYykgPT4gdGhpcy5ncmFwaHFsLnNldEF1dGhCYXNpYyhiYXNpYykpO1xuXG4gICAgLy8gTGlzdGVuIGdyYXBocWwgc3RhcnQgKG9yIHJlc3RhcnQpXG4gICAgdGhpcy5ncmFwaHFsLm9uU3RhcnQuc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fc3RhcnRlZCkge1xuICAgICAgICB0aGlzLnJlYWR5KCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fc3RhcnRlZCAmJiB0aGlzLmlzTG9naW4oKSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gUmVzdGFydGluZywgdG8gcmV0cnkgdG8gYXV0aGVudGljYXRlLi4uJyk7XG4gICAgICAgIHRoaXMucmVzdGFydCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRm9yY2UgbmV0d29yayB0byB3YWl0IGFjY291bnQgc2VydmljZSwgYWZ0ZXIgZ2V0dGluZyBjb25uZWN0aW9uIHRvIHRoZSBwZWVyXG4gICAgdGhpcy5uZXR3b3JrLm9uKCdiZWZvcmVUcnlPbmxpbmVGaW5pc2gnLCBhc3luYyAob25saW5lKSA9PiB7XG4gICAgICAvLyBJZiBvbmxpbmUsIHdhaXQgYSBmdWxsIHJlc3RhcnQsIGJlY2F1c2UgaXQgY2FuIGZvcmNlIG9mZmxpbmUgbW9kZVxuICAgICAgaWYgKG9ubGluZSAmJiAoIXRoaXMuX3N0YXJ0ZWQgfHwgdGhpcy5pc0xvZ2luKCkpKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBGb3JjZSBuZXR3b3JrU2VydmljZS50cnlPbmxpbmUoKSB0byB3YWl0LCB0aGF0IGFjY291bnQgc2VydmljZSBpcyByZXN0YXJ0ZWQuLi4nKTtcbiAgICAgICAgLy9hd2FpdCB0aGlzLnN0b3AoKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoNTAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgc3RhcnQoKTogUHJvbWlzZTxBY2NvdW50PiB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0UHJvbWlzZSkgcmV0dXJuIHRoaXMuX3N0YXJ0UHJvbWlzZTtcbiAgICBpZiAodGhpcy5fc3RhcnRlZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmFjY291bnQpO1xuXG4gICAgLy8gUmVzdG9yaW5nIGxvY2FsIHNldHRpbmdzXG4gICAgdGhpcy5fc3RhcnRQcm9taXNlID0gUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5zZXR0aW5ncy5yZWFkeSgpLFxuICAgICAgLy8gV2FpdCB0b2tlbiB0eXBlIHRvIGJlIHNldFxuICAgICAgZmlyc3ROb3ROaWxQcm9taXNlKHRoaXMuX3Rva2VuVHlwZSQpXG4gICAgXSlcbiAgICAgIC50aGVuKCgpID0+IHRoaXMucmVzdG9yZUxvY2FsbHkoKSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N0YXJ0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNjb3VudDtcbiAgICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl9zdGFydFByb21pc2U7XG4gIH1cblxuICBnZXQgc3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRlZDtcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0ZWQgfHwgdGhpcy5fc3RhcnRQcm9taXNlKSB7XG4gICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9zdGFydFByb21pc2UgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGhhZEF1dGhUb2tlbiA9IHRoaXMuX2RhdGEuYXV0aFRva2VuICYmIHRydWU7XG4gICAgICBjb25zdCBoYWRBdXRoQmFzaWMgPSB0aGlzLl9kYXRhLmF1dGhCYXNpYyAmJiB0cnVlO1xuICAgICAgY29uc3QgaGFkQXV0aCA9IGhhZEF1dGhUb2tlbiB8fCBoYWRBdXRoQmFzaWM7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgaWYgKGhhZEF1dGgpIHtcbiAgICAgICAgdGhpcy5vbkxvZ291dC5uZXh0KCk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICBpZiAoaGFkQXV0aFRva2VuKSB0aGlzLm9uQXV0aFRva2VuQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKGhhZEF1dGhCYXNpYykgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVzdGFydCgpIHtcbiAgICBhd2FpdCB0aGlzLnN0b3AoKTtcbiAgICByZXR1cm4gdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgcmVhZHkoKTogUHJvbWlzZTxBY2NvdW50PiB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5hY2NvdW50KTtcbiAgICByZXR1cm4gdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgaXNMb2dpbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5fZGF0YS5wdWJrZXkgJiYgdGhpcy5fZGF0YS5sb2FkZWQpO1xuICB9XG5cbiAgaXNBdXRoKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLl9kYXRhLnB1YmtleSAmJiB0aGlzLl9kYXRhLmtleXBhaXIgJiYgdGhpcy5fZGF0YS5rZXlwYWlyLnNlY3JldEtleSk7XG4gIH1cblxuICBoYXNNaW5Qcm9maWxlKHVzZXJQcm9maWxlOiBVc2VyUHJvZmlsZUxhYmVsKTogYm9vbGVhbiB7XG4gICAgLy8gc2hvdWxkIGJlIGxvZ2luLCBhbmQgc3RhdHVzIEVOQUJMRSBvciBURU1QT1JBUllcbiAgICBpZiAoIXRoaXMuX2RhdGEuYWNjb3VudCB8fCAhdGhpcy5fZGF0YS5hY2NvdW50LnB1YmtleSB8fFxuICAgICAgKHRoaXMuX2RhdGEuYWNjb3VudC5zdGF0dXNJZCAhPT0gU3RhdHVzSWRzLkVOQUJMRSAmJiB0aGlzLl9kYXRhLmFjY291bnQuc3RhdHVzSWQgIT09IFN0YXR1c0lkcy5URU1QT1JBUlkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBQZXJzb25VdGlscy5oYXNVcHBlck9yRXF1YWxzUHJvZmlsZSh0aGlzLl9kYXRhLmFjY291bnQucHJvZmlsZXMsIHVzZXJQcm9maWxlKTtcbiAgfVxuXG4gIGhhc0V4YWN0UHJvZmlsZShsYWJlbDogVXNlclByb2ZpbGVMYWJlbCk6IGJvb2xlYW4ge1xuICAgIC8vIHNob3VsZCBiZSBsb2dpbiwgYW5kIHN0YXR1cyBFTkFCTEUgb3IgVEVNUE9SQVJZXG4gICAgaWYgKCF0aGlzLl9kYXRhLmFjY291bnQgfHwgIXRoaXMuX2RhdGEuYWNjb3VudC5wdWJrZXkgfHxcbiAgICAgICh0aGlzLl9kYXRhLmFjY291bnQuc3RhdHVzSWQgIT09IFN0YXR1c0lkcy5FTkFCTEUgJiYgdGhpcy5fZGF0YS5hY2NvdW50LnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuVEVNUE9SQVJZKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5hY2NvdW50LnByb2ZpbGVzLnNvbWUocHJvZmlsZSA9PiBwcm9maWxlID09PSBsYWJlbCk7XG4gIH1cblxuICBoYXNQcm9maWxlQW5kSXNFbmFibGUodXNlclByb2ZpbGU6IFVzZXJQcm9maWxlTGFiZWwpOiBib29sZWFuIHtcbiAgICAvLyBzaG91bGQgYmUgbG9naW4sIGFuZCBzdGF0dXMgRU5BQkxFXG4gICAgaWYgKCF0aGlzLl9kYXRhLmFjY291bnQgfHwgIXRoaXMuX2RhdGEuYWNjb3VudC5wdWJrZXkgfHwgdGhpcy5fZGF0YS5hY2NvdW50LnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuRU5BQkxFKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIFBlcnNvblV0aWxzLmhhc1VwcGVyT3JFcXVhbHNQcm9maWxlKHRoaXMuX2RhdGEuYWNjb3VudC5wcm9maWxlcywgdXNlclByb2ZpbGUpO1xuICB9XG5cbiAgaXNBZG1pbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNQcm9maWxlQW5kSXNFbmFibGUoJ0FETUlOJyk7XG4gIH1cblxuICBpc1N1cGVydmlzb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvZmlsZUFuZElzRW5hYmxlKCdTVVBFUlZJU09SJyk7XG4gIH1cblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvZmlsZUFuZElzRW5hYmxlKCdVU0VSJyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQHBhcmFtIG1vZGVcbiAgICovXG4gIGlzVXNhZ2VNb2RlKG1vZGU6IFVzYWdlTW9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmlzVXNhZ2VNb2RlKG1vZGUpO1xuICB9XG5cbiAgaXNPbmx5R3Vlc3QoKTogYm9vbGVhbiB7XG4gICAgLy8gU2hvdWxkIGJlIGxvZ2luLCBhbmQgc3RhdHVzIEVOQUJMRSBvciBURU1QT1JBUllcbiAgICBpZiAoIXRoaXMuX2RhdGEuYWNjb3VudCB8fCAhdGhpcy5fZGF0YS5hY2NvdW50LnB1YmtleSB8fFxuICAgICAgKHRoaXMuX2RhdGEuYWNjb3VudC5zdGF0dXNJZCAhPT0gU3RhdHVzSWRzLkVOQUJMRSAmJiB0aGlzLl9kYXRhLmFjY291bnQuc3RhdHVzSWQgIT09IFN0YXR1c0lkcy5URU1QT1JBUlkpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIFByb2ZpbGUgbGVzcyB0aGVuIHVzZXJcbiAgICByZXR1cm4gIVBlcnNvblV0aWxzLmhhc1VwcGVyT3JFcXVhbHNQcm9maWxlKHRoaXMuX2RhdGEuYWNjb3VudC5wcm9maWxlcywgJ1VTRVInKTtcbiAgfVxuXG4gIGNhblVzZXJXcml0ZURhdGFGb3JEZXBhcnRtZW50KHJlY29yZGVyRGVwYXJ0bWVudDogUmVmZXJlbnRpYWwgfCBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoUmVmZXJlbnRpYWxVdGlscy5pc0VtcHR5KHJlY29yZGVyRGVwYXJ0bWVudCkpIHtcbiAgICAgIGlmICghdGhpcy5pc0FkbWluKCkpXG4gICAgICAgIGNvbnNvbGUud2FybignVW5hYmxlIHRvIGNoZWNrIGlmIHVzZXIgaGFzIHJpZ2h0OiBpbnZhbGlkIHJlY29yZGVyRGVwYXJ0bWVudCcsIHJlY29yZGVyRGVwYXJ0bWVudCk7XG4gICAgICByZXR1cm4gdGhpcy5pc0FkbWluKCk7XG4gICAgfVxuXG4gICAgLy8gU2hvdWxkIGJlIGxvZ2luLCBhbmQgc3RhdHVzIEVOQUJMRVxuICAgIGlmICghdGhpcy5fZGF0YS5hY2NvdW50IHx8ICF0aGlzLl9kYXRhLmFjY291bnQucHVia2V5IHx8IHRoaXMuX2RhdGEuYWNjb3VudC5zdGF0dXNJZCAhPT0gU3RhdHVzSWRzLkVOQUJMRSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLl9kYXRhLmFjY291bnQuZGVwYXJ0bWVudCB8fCAhdGhpcy5fZGF0YS5hY2NvdW50LmRlcGFydG1lbnQuaWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignVXNlciBhY2NvdW50IGhhcyBubyBkZXBhcnRtZW50ICEgVW5hYmxlIHRvIGNoZWNrIHdyaXRlIHJpZ2h0IGFnYWluc3QgcmVjb3JkZXJEZXBhcnRtZW50Jyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gU2FtZSByZWNvcmRlciBkZXBhcnRtZW50OiBPSywgdXNlciBjYW4gd3JpdGVcbiAgICBpZiAodGhpcy5fZGF0YS5hY2NvdW50LmRlcGFydG1lbnQuaWQgPT09IHJlY29yZGVyRGVwYXJ0bWVudC5pZCkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBFbHNlLCBjaGVjayBpZiBzdXBlcnZpc29yIChvciBtb3JlKVxuICAgIHJldHVybiBQZXJzb25VdGlscy5oYXNVcHBlck9yRXF1YWxzUHJvZmlsZSh0aGlzLl9kYXRhLmFjY291bnQucHJvZmlsZXMsICdTVVBFUlZJU09SJyk7XG4gIH1cblxuICBhc3luYyByZWdpc3RlcihkYXRhOiBSZWdpc3RlckRhdGEpOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICBpZiAodGhpcy5pc0xvZ2luKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBhbHJlYWR5IGxvZ2luLiBQbGVhc2UgbG9nb3V0IGJlZm9yZSByZWdpc3Rlci4nKTtcbiAgICB9XG4gICAgaWYgKCFkYXRhLnVzZXJuYW1lIHx8ICFkYXRhLnBhc3N3b3JkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnKTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFJlZ2lzdGVyIG5ldyB1c2VyIGFjY291bnQuLi4nLCBkYXRhLmFjY291bnQpO1xuICAgIHRoaXMuX2RhdGEubG9hZGVkID0gZmFsc2U7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBrZXlwYWlyID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnNjcnlwdEtleXBhaXIoZGF0YS51c2VybmFtZSwgZGF0YS5wYXNzd29yZCk7XG4gICAgICBkYXRhLmFjY291bnQucHVia2V5ID0gQmFzZTU4LmVuY29kZShrZXlwYWlyLnB1YmxpY0tleSk7XG5cbiAgICAgIC8vIERlZmF1bHQgdmFsdWVzXG4gICAgICBkYXRhLmFjY291bnQuc2V0dGluZ3MgPSBkYXRhLmFjY291bnQuc2V0dGluZ3MgfHwgbmV3IFVzZXJTZXR0aW5ncygpO1xuICAgICAgZGF0YS5hY2NvdW50LnNldHRpbmdzLmxvY2FsZSA9IHRoaXMuc2V0dGluZ3MubG9jYWxlO1xuICAgICAgZGF0YS5hY2NvdW50LnNldHRpbmdzLmxhdExvbmdGb3JtYXQgPSB0aGlzLnNldHRpbmdzLmxhdExvbmdGb3JtYXQ7XG4gICAgICBkYXRhLmFjY291bnQuZGVwYXJ0bWVudC5pZCA9IGRhdGEuYWNjb3VudC5kZXBhcnRtZW50LmlkIHx8IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdERlcGFydG1lbnRJZDtcblxuICAgICAgdGhpcy5fZGF0YS5rZXlwYWlyID0ga2V5cGFpcjtcbiAgICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCB0aGlzLnNhdmVSZW1vdGVseShkYXRhLmFjY291bnQsIGtleXBhaXIpO1xuXG4gICAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgICAgYWNjb3VudC5hdmF0YXIgPSBhY2NvdW50LmF2YXRhciB8fCAodGhpcy5lbnZpcm9ubWVudC5iYXNlVXJsICsgREVGQVVMVF9BVkFUQVJfSU1BR0UpO1xuICAgICAgdGhpcy5fZGF0YS5tYWluUHJvZmlsZSA9IFBlcnNvblV0aWxzLmdldE1haW5Qcm9maWxlKGFjY291bnQucHJvZmlsZXMpO1xuXG4gICAgICB0aGlzLl9kYXRhLmFjY291bnQgPSBhY2NvdW50O1xuICAgICAgdGhpcy5fZGF0YS5wdWJrZXkgPSBhY2NvdW50LnB1YmtleTtcblxuICAgICAgLy8gVHJ5IHRvIGF1dGggb24gcG9kXG4gICAgICBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZShkYXRhKTtcblxuICAgICAgdGhpcy5fZGF0YS5sb2FkZWQgPSB0cnVlO1xuXG4gICAgICBhd2FpdCB0aGlzLnNhdmVMb2NhbGx5KCk7XG5cbiAgICAgIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBY2NvdW50IHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YS5hY2NvdW50KTtcbiAgICAgIHRoaXMub25DaGFuZ2UubmV4dCh0aGlzLl9kYXRhLmFjY291bnQpO1xuXG4gICAgICByZXR1cm4gdGhpcy5fZGF0YS5hY2NvdW50O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgJiYgZXJyb3IubWVzc2FnZSB8fCBlcnJvcik7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXV0aGVudGljYXRlKGRhdGE/OiBBdXRoRGF0YSkge1xuICAgIC8vIFdhaXQgdGhlIGF1dGggdG9rZW4sIHRoZW4gY29udGludWVcbiAgICBjb25zdCB0b2tlblR5cGUgPSBhd2FpdCBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5fdG9rZW5UeXBlJCk7XG5cbiAgICAvLyBCYXNpYyBhdXRoXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gJ2Jhc2ljJyB8fCB0b2tlblR5cGUgPT09ICdiYXNpYy1hbmQtdG9rZW4nKSB7XG5cbiAgICAgIC8vIEdlbmVyYXRlIHRoZSBhdXRoQmFzaWMsIGlmIHVzZWRcbiAgICAgIGlmICghdGhpcy5fZGF0YS5hdXRoQmFzaWMpIHtcbiAgICAgICAgLy8gU2tpcCBpZiB0b2tlbiBhbHJlYWR5IHByb3ZpZGVkXG4gICAgICAgIGlmICghKHRoaXMuX2RhdGEuYXV0aFRva2VuICYmIHRva2VuVHlwZSA9PT0gJ2Jhc2ljLWFuZC10b2tlbicpKSB7XG4gICAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLnVzZXJuYW1lIHx8ICFkYXRhLnBhc3N3b3JkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdXNlcm5hbWUgYW5kIHBhc3N3b3JkJyk7XG4gICAgICAgICAgdGhpcy5fZGF0YS5hdXRoQmFzaWMgPSB0aGlzLmNyeXB0b1NlcnZpY2UuZW5jb2RlQmFzZTY0KGAke2RhdGEudXNlcm5hbWV9OiR7ZGF0YS5wYXNzd29yZH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5uZXh0KHRoaXMuX2RhdGEuYXV0aEJhc2ljKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSB0aGUgYXV0aFRva2VuLCBpZiB1c2VkXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gJ3Rva2VuJyB8fCB0b2tlblR5cGUgPT09ICdiYXNpYy1hbmQtdG9rZW4nKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9kYXRhLmF1dGhUb2tlbiA9IGF3YWl0IHRoaXMuYXV0aGVudGljYXRlQW5kR2V0VG9rZW4odGhpcy5fZGF0YS5hdXRoVG9rZW4pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTmV2ZXIgYXV0aGVudGljYXRlLCBvciBub3QgcmVhZHkgZm9yIG9mZmxpbmUgbW9kZSA9PiBleGl0XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3JnZXQgYXV0aEJhc2ljLCB0byBzd2l0Y2ggdG8gYXV0aFRva2VuXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gJ2Jhc2ljLWFuZC10b2tlbicpIHtcbiAgICAgIHRoaXMuX2RhdGEuYXV0aEJhc2ljID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9naW4oZGF0YTogQXV0aERhdGEpOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICBpZiAoIWRhdGEgfHwgIWRhdGEudXNlcm5hbWUgfHwgIWRhdGEucGFzc3dvcmQpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCB1c2VybmFtZSBvciBwYXNzd29yZCcpO1xuXG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIExvZ2luLi4uJyk7XG5cbiAgICBsZXQga2V5cGFpcjtcbiAgICB0cnkge1xuICAgICAga2V5cGFpciA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5zY3J5cHRLZXlwYWlyKGRhdGEudXNlcm5hbWUsIGRhdGEucGFzc3dvcmQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRoaXMucmVzZXREYXRhKCk7XG4gICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuVU5LTk9XTl9FUlJPUiwgbWVzc2FnZTogJ0VSUk9SLlNDUllQVF9FUlJPUicgfTtcbiAgICB9XG5cbiAgICAvLyBTdG9yZSBwdWJrZXkra2V5cGFpclxuICAgIHRoaXMuX2RhdGEucHVia2V5ID0gQmFzZTU4LmVuY29kZShrZXlwYWlyLnB1YmxpY0tleSk7XG4gICAgdGhpcy5fZGF0YS5rZXlwYWlyID0ga2V5cGFpcjtcblxuICAgIC8vIFRyeSB0byBsb2FkIHByZXZpb3VzIHRva2VuXG4gICAgbGV0IHByZXZpb3VzVG9rZW46IHN0cmluZyA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoVE9LRU5fU1RPUkFHRV9LRVkpO1xuICAgIHByZXZpb3VzVG9rZW4gPSBwcmV2aW91c1Rva2VuICYmIHByZXZpb3VzVG9rZW4uc3RhcnRzV2l0aCh0aGlzLl9kYXRhLnB1YmtleSkgJiYgcHJldmlvdXNUb2tlbiB8fCBudWxsO1xuXG4gICAgLy8gT2ZmbGluZSBtb2RlXG4gICAgY29uc3Qgb2ZmbGluZSA9IHRoaXMuc2V0dGluZ3MuaGFzT2ZmbGluZUZlYXR1cmUoKSAmJiAodGhpcy5uZXR3b3JrLm9mZmxpbmUgfHwgZGF0YS5vZmZsaW5lID09PSB0cnVlKTtcbiAgICBpZiAob2ZmbGluZSkgIHtcbiAgICAgIHRoaXMuX2RhdGEuYXV0aFRva2VuID0gcHJldmlvdXNUb2tlbjtcblxuICAgICAgLy8gTWFrZSBzdXJlIG5ldHdvcmsgaWYgc2V0IGFzIG9mZmxpbmVcbiAgICAgIHRoaXMubmV0d29yay5zZXRGb3JjZU9mZmxpbmUodHJ1ZSwge3Nob3dUb2FzdDogZmFsc2V9KTtcbiAgICAgIGNvbnNvbGUuaW5mbyhgW2FjY291bnRdIExvZ2luIFtPS10ge3B1YmtleTogJHt0aGlzLl9kYXRhLnB1YmtleS5zdWJzdHIoMCwgOCl9fSwge29mZmxpbmU6IHRydWV9YCk7XG4gICAgfVxuXG4gICAgLy8gT25saW5lIG1vZGU6IHRyeSB0byBhdXRoIG9uIHBvZFxuICAgIGVsc2Uge1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE5ldmVyIGF1dGhlbnRpY2F0ZSwgb3Igbm90IHJlYWR5IGZvciBvZmZsaW5lIG1vZGUgPT4gZXhpdFxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhY2NvdW50IGRhdGFcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkRGF0YSh7b2ZmbGluZSwgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknfSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIElmIGFjY291bnQgbm90IGZvdW5kLCBjaGVjayBpZiBlbWFpbCBpcyB2YWxpZFxuICAgICAgaWYgKGVyciAmJiArKGVyci5jb2RlKSA9PT0gRXJyb3JDb2Rlcy5MT0FEX0FDQ09VTlRfRVJST1IpIHtcblxuICAgICAgICAvLyBDaGVjayBlbWFpbCBleGlzdHNcbiAgICAgICAgaWYgKGRhdGEudXNlcm5hbWUuaW5kZXhPZignQCcpICE9PSAtMSkge1xuICAgICAgICAgIGxldCBpc0VtYWlsRXhpc3RzO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpc0VtYWlsRXhpc3RzID0gYXdhaXQgdGhpcy5pc0VtYWlsRXhpc3RzKGRhdGEudXNlcm5hbWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKG90aGVyRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGVycjsgLy8gcmVzZW5kIHRoZSBmaXJzdCBlcnJvclxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtYWlsIG5vdCBleGlzdHMgKG5vIGFjY291bnQpXG4gICAgICAgICAgaWYgKCFpc0VtYWlsRXhpc3RzKSB7XG4gICAgICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuVU5LTk9XTl9BQ0NPVU5UX0VNQUlMLCBtZXNzYWdlOiAnRVJST1IuVU5LTk9XTl9BQ0NPVU5UX0VNQUlMJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtYWlsIGV4aXN0cywgc28gZXJyb3IgPSAnYmFkIHBhc3N3b3JkJ1xuICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuQkFEX1BBU1NXT1JELCBtZXNzYWdlOiAnRVJST1IuQkFEX1BBU1NXT1JEJyB9O1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7IC8vIHJlc2VuZCB0aGUgZmlyc3QgZXJyb3JcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gU3RvcmUgdG8gbG9jYWwgc3RvcmFnZVxuICAgICAgYXdhaXQgdGhpcy5zYXZlTG9jYWxseSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIEVtaXQgZXZlbnQgdG8gb2JzZXJ2ZXJzXG4gICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YS5hY2NvdW50KTtcbiAgICB0aGlzLm9uQ2hhbmdlLm5leHQodGhpcy5fZGF0YS5hY2NvdW50KTtcblxuICAgIHJldHVybiB0aGlzLl9kYXRhLmFjY291bnQ7XG4gIH1cblxuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICghdGhpcy5fZGF0YS5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkJyk7XG4gICAgaWYgKHRoaXMubmV0d29yay5vZmZsaW5lKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjaGVjayBhY2NvdW50IGluIG9mZmxpbmUgbW9kZScpO1xuXG4gICAgYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xuICAgIGF3YWl0IHRoaXMuc2F2ZUxvY2FsbHkoKTtcblxuICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBTdWNjZXNzZnVsbHkgcmVsb2FkIGFjY291bnQnKTtcblxuICAgIC8vIEVtaXQgbG9naW4gZXZlbnQgdG8gc3Vic2NyaWJlcnNcbiAgICB0aGlzLm9uTG9naW4ubmV4dCh0aGlzLl9kYXRhLmFjY291bnQpO1xuICAgIHRoaXMub25DaGFuZ2UubmV4dCh0aGlzLl9kYXRhLmFjY291bnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuYWNjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb3IgdXBkYXRlIGFuIHVzZXIgYWNjb3VudCwgdG8gdGhlIHJlbW90ZSBzdG9yYWdlXG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50XG4gICAqL1xuICBhc3luYyBzYXZlKGFjY291bnQ6IEFjY291bnQpOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICBpZiAoIXRoaXMuX2RhdGEucHVia2V5KSByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ1VzZXIgbm90IGxvZ2dlZCcpO1xuICAgIGlmICh0aGlzLl9kYXRhLnB1YmtleSAhPT0gYWNjb3VudC5wdWJrZXkpIHJldHVybiBQcm9taXNlLnJlamVjdCgnTm90IHVzZXIgYWNjb3VudCcpO1xuXG4gICAgYWNjb3VudCA9IGF3YWl0IHRoaXMuc2F2ZVJlbW90ZWx5KGFjY291bnQsIHRoaXMuX2RhdGEua2V5cGFpcik7XG5cbiAgICAvLyBTZXQgZGVmYXVsdHNcbiAgICBhY2NvdW50LmF2YXRhciA9IGFjY291bnQuYXZhdGFyIHx8ICh0aGlzLmVudmlyb25tZW50LmJhc2VVcmwgKyBERUZBVUxUX0FWQVRBUl9JTUFHRSk7XG4gICAgdGhpcy5fZGF0YS5tYWluUHJvZmlsZSA9IFBlcnNvblV0aWxzLmdldE1haW5Qcm9maWxlKGFjY291bnQucHJvZmlsZXMpO1xuXG4gICAgdGhpcy5fZGF0YS5hY2NvdW50ID0gYWNjb3VudDtcbiAgICB0aGlzLl9kYXRhLmxvYWRlZCA9IHRydWU7XG5cbiAgICAvLyBTYXZlIGxvY2FsbHkgKGluIHN0b3JhZ2UpXG4gICAgYXdhaXQgdGhpcy5zYXZlTG9jYWxseSgpO1xuXG4gICAgLy8gU2VuZCBldmVudFxuICAgIHRoaXMub25Mb2dpbi5uZXh0KHRoaXMuX2RhdGEuYWNjb3VudCk7XG4gICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEuYWNjb3VudCk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YS5hY2NvdW50O1xuICB9XG5cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgY29uc3QgaGFkQXV0aFRva2VuID0gdGhpcy5fZGF0YS5hdXRoVG9rZW4gJiYgdHJ1ZTtcbiAgICBjb25zdCBoYWRBdXRoQmFzaWMgPSB0aGlzLl9kYXRhLmF1dGhCYXNpYyAmJiB0cnVlO1xuICAgIGNvbnN0IHB1YmtleSA9IHRoaXMuX2RhdGEgJiYgdGhpcy5fZGF0YS5wdWJrZXk7XG5cbiAgICB0aGlzLnJlc2V0RGF0YSgpO1xuXG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLmhhc09mZmxpbmVGZWF0dXJlKCkpIHtcblxuICAgICAgLy8gUmVtb3ZlIGFsbCBkYXRhIGZyb20gdGhlIGxvY2FsIHN0b3JhZ2VcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShQVUJLRVlfU1RPUkFHRV9LRVkpLFxuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKFRPS0VOX1NUT1JBR0VfS0VZKSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShBQ0NPVU5UX1NUT1JBR0VfS0VZKSxcbiAgICAgICAgcHVia2V5ICYmIHRoaXMuc3RvcmFnZS5yZW1vdmUoQUNDT1VOVF9TVE9SQUdFX0tFWSArICcjJyArIHB1YmtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoU0VDS0VZX1NUT1JBR0VfS0VZKVxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gT2ZmbGluZSBmZWF0dXJlcyBlbmFibGU6IG5lZWQgdG8ga2VlcCBzb21lIGRhdGFcbiAgICBlbHNlIHtcbiAgICAgIC8vIEFsd2F5cyByZW1vdmUgb25seSBzZWNyZXQga2V5XG4gICAgICAvLyBCdXQga2VlcDpcbiAgICAgIC8vIC0gYWNjb3VudCBieSBwdWJrZXlcbiAgICAgIC8vIC0gYXV0aCB0b2tlblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKFBVQktFWV9TVE9SQUdFX0tFWSksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoQUNDT1VOVF9TVE9SQUdFX0tFWSksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoU0VDS0VZX1NUT1JBR0VfS0VZKVxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gcGFnZSBoaXN0b3J5LCBpbiBsb2NhbCBzZXR0aW5nc1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MuY2xlYXJQYWdlSGlzdG9yeSgpO1xuXG4gICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgIHRoaXMub25Mb2dvdXQubmV4dCgpO1xuICAgIGlmIChoYWRBdXRoVG9rZW4pIHRoaXMub25BdXRoVG9rZW5DaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgIGlmIChoYWRBdXRoQmFzaWMpIHRoaXMub25BdXRoQmFzaWNDaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMub25DaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBhY2NvdW50XG4gICAqXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBhc3luYyBsb2FkKG9wdHM/OiB7XG4gICAgb2ZmbGluZT86IGJvb2xlYW47XG4gICAgZmV0Y2hQb2xpY3k/OiBGZXRjaFBvbGljeTtcbiAgfSk6IFByb21pc2U8QWNjb3VudCB8IHVuZGVmaW5lZD4ge1xuXG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBMb2FkaW5nIGFjY291bnQuLi5gKTtcbiAgICBsZXQganNvbjogYW55O1xuXG4gICAgLy8gTG9hZCBsb2NhbGx5XG4gICAgY29uc3Qgb2ZmbGluZSA9IHRoaXMubmV0d29yay5vZmZsaW5lXG4gICAgICAmJiAoIW9wdHMgfHwgKG9wdHMuZmV0Y2hQb2xpY3kgIT09ICduZXR3b3JrLW9ubHknICYmIG9wdHMuZmV0Y2hQb2xpY3kgIT09ICduby1jYWNoZScpKVxuICAgICAgfHwgKG9wdHMgJiYgb3B0cy5vZmZsaW5lID09PSB0cnVlKTtcbiAgICBpZiAob2ZmbGluZSkge1xuICAgICAganNvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoQUNDT1VOVF9TVE9SQUdFX0tFWSk7XG4gICAgICBqc29uID0ganNvbiAmJiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSAmJiBKU09OLnBhcnNlKGpzb24pIHx8IGpzb247XG4gICAgICBqc29uID0ganNvbiAmJiB0aGlzLl9kYXRhLnB1YmtleSAmJiAoanNvbi5wdWJrZXkgPT09IHRoaXMuX2RhdGEucHVia2V5KSAmJiBqc29uIHx8IG51bGw7XG4gICAgICBpZiAoIWpzb24gJiYgdGhpcy5fZGF0YS5wdWJrZXkpIHtcbiAgICAgICAganNvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoQUNDT1VOVF9TVE9SQUdFX0tFWSArICcjJyArIHRoaXMuX2RhdGEucHVia2V5KTtcbiAgICAgICAganNvbiA9IGpzb24gJiYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykgJiYgSlNPTi5wYXJzZShqc29uKSB8fCBqc29uO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgcmVtb3RlbHlcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IHtkYXRhfSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5xdWVyeTx7IGRhdGE6IGFueSB9Pih7XG4gICAgICAgIHF1ZXJ5OiBMb2FkUXVlcnksXG4gICAgICAgIGVycm9yOiB7IGNvZGU6IEVycm9yQ29kZXMuTE9BRF9BQ0NPVU5UX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuTE9BRF9BQ0NPVU5UX0VSUk9SJyB9LFxuICAgICAgICBmZXRjaFBvbGljeTogb3B0cyAmJiBvcHRzLmZldGNoUG9saWN5IHx8ICduby1jYWNoZScgfHwgdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIGpzb24gPSBkYXRhO1xuICAgIH1cblxuICAgIGlmIChqc29uKSB7XG4gICAgICBjb25zdCBhY2NvdW50ID0gQWNjb3VudC5mcm9tT2JqZWN0KGpzb24pO1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gQWNjb3VudCBsb2FkZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCwgYWNjb3VudCk7XG4gICAgICAgcmV0dXJuIGFjY291bnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBbYWNjb3VudF0gQWNjb3VudCBub3QgZm91bmQgIWApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbWFpbCBpcyBhdmFpbGFibGUgZm9yIG5ldyBhY2NvdW50IHJlZ2lzdHJhdGlvbi5cbiAgICogVGhyb3cgYW4gZXJyb3IgaWYgbm90IGF2YWlsYWJsZVxuICAgKlxuICAgKiBAcGFyYW0gZW1haWxcbiAgICovXG4gIGFzeW5jIGNoZWNrRW1haWxBdmFpbGFibGUoZW1haWw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlzRW1haWxFeGlzdHMgPSBhd2FpdCB0aGlzLmlzRW1haWxFeGlzdHMoZW1haWwpO1xuICAgIGlmIChpc0VtYWlsRXhpc3RzKSB7XG4gICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuRU1BSUxfQUxSRUFEWV9SRUdJU1RFUkVELCBtZXNzYWdlOiAnRVJST1IuRU1BSUxfQUxSRUFEWV9SRUdJU1RFUkVEJyB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbWFpbCBpcyBleGlzdHMgaW4gc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZW1haWxcbiAgICovXG4gIGFzeW5jIGlzRW1haWxFeGlzdHMoZW1haWw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gQ2hlY2tpbmcgaWYgeycgKyBlbWFpbCArICd9IGV4aXN0cy4uLicpO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5xdWVyeTx7IGlzRW1haWxFeGlzdHM6IGJvb2xlYW4gfSwgSXNFbWFpbEV4aXN0c1ZhcmlhYmxlcz4oe1xuICAgICAgcXVlcnk6IElzRW1haWxFeGlzdHNRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBlbWFpbCxcbiAgICAgICAgaGFzaDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBFbWFpbCBleGlzdDogJyArIChkYXRhICYmIGRhdGEuaXNFbWFpbEV4aXN0cykpO1xuXG4gICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5pc0VtYWlsRXhpc3RzO1xuICB9XG5cbiAgYXN5bmMgc2VuZENvbmZpcm1hdGlvbkVtYWlsKGVtYWlsOiBzdHJpbmcsIGxvY2FsZT86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXG4gICAgbG9jYWxlID0gbG9jYWxlIHx8IHRoaXMuc2V0dGluZ3MubG9jYWxlO1xuICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBTZW5kaW5nIGNvbmZpcm1hdGlvbiBlbWFpbCB0byB7JyArIGVtYWlsICsgJ30gd2l0aCBsb2NhbGUgeycgKyBsb2NhbGUgKyAnfS4uLicpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ3JhcGhxbC5tdXRhdGU8Ym9vbGVhbj4oe1xuICAgICAgbXV0YXRpb246IFNlbmRDb25maXJtRW1haWxNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBlbWFpbCxcbiAgICAgICAgbG9jYWxlXG4gICAgICB9LFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogRXJyb3JDb2Rlcy5TRU5UX0NPTkZJUk1BVElPTl9FTUFJTF9GQUlMRUQsXG4gICAgICAgIG1lc3NhZ2U6ICdFUlJPUi5TRU5UX0FDQ09VTlRfQ09ORklSTUFUSU9OX0VNQUlMX0ZBSUxFRCdcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpcm1FbWFpbChlbWFpbDogU3RyaW5nLCBjb2RlOiBTdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcblxuICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBTZW5kbmcgY29uZmlybSByZXF1ZXN0IGZvciBlbWFpbCB7JyArIGVtYWlsICsgJ30gd2l0aCBjb2RlIHsnICsgY29kZSArICd9Li4uJyk7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdyYXBocWwubXV0YXRlPHsgY29uZmlybUFjY291bnRFbWFpbDogYm9vbGVhbiB9Pih7XG4gICAgICBtdXRhdGlvbjogQ29uZmlybUVtYWlsTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgZW1haWwsXG4gICAgICAgIGNvZGVcbiAgICAgIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkNPTkZJUk1fRU1BSUxfRkFJTEVELFxuICAgICAgICBtZXNzYWdlOiAnRVJST1IuQ09ORklSTV9BQ0NPVU5UX0VNQUlMX0ZBSUxFRCdcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzICYmIHJlcy5jb25maXJtQWNjb3VudEVtYWlsO1xuICB9XG5cbiAgbGlzdGVuQ2hhbmdlcygpOiBTdWJzY3JpcHRpb24ge1xuICAgIGlmICghdGhpcy5fZGF0YS5wdWJrZXkpIHJldHVybiBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBbV1NdIExpc3RlbmluZyBhY2NvdW50IGNoYW5nZXMnKTtcblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuZ3JhcGhxbC5zdWJzY3JpYmU8e2RhdGE6IGFueX0+KHtcbiAgICAgIHF1ZXJ5OiBVcGRhdGVTdWJzY3JpcHRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW50ZXJ2YWw6IDEwXG4gICAgICB9LFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogRXJyb3JDb2Rlcy5TVUJTQ1JJQkVfQUNDT1VOVF9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLkFDQ09VTlQuU1VCU0NSSUJFX0FDQ09VTlRfRVJST1InXG4gICAgICB9XG4gICAgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGFzeW5jICh7ZGF0YX0pID0+IHtcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nVXBkYXRlRGF0ZTogc3RyaW5nID0gdG9EYXRlSVNPU3RyaW5nKHNlbGYuX2RhdGEuYWNjb3VudD8udXBkYXRlRGF0ZSk7XG4gICAgICAgIGlmIChleGlzdGluZ1VwZGF0ZURhdGUgIT09IGRhdGEudXBkYXRlRGF0ZSkge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBbV1NdIERldGVjdGVkIHVwZGF0ZSBvbiB7JHtkYXRhLnVwZGF0ZURhdGV9fWApO1xuICAgICAgICAgIGF3YWl0IHNlbGYucmVmcmVzaCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGFzeW5jIChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVyciAmJiArZXJyLmNvZGUgPT09IFNlcnZlckVycm9yQ29kZXMuTk9UX0ZPVU5EKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbYWNjb3VudF0gQWNjb3VudCBub3QgZXhpc3RzIGFueW1vcmU6IGZvcmNlIHVzZXIgdG8gbG9nb3V0Li4uJywgZXJyKTtcbiAgICAgICAgICBhd2FpdCBzZWxmLmxvZ291dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVyciAmJiArZXJyLmNvZGUgPT09IFNlcnZlckVycm9yQ29kZXMuVU5BVVRIT1JJWkVEKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbYWNjb3VudF0gQWNjb3VudCBub3QgYXV0aG9yaXplZDogZm9yY2UgdXNlciB0byBsb2dvdXQuLi4nLCBlcnIpO1xuICAgICAgICAgIGF3YWl0IHNlbGYubG9nb3V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbYWNjb3VudF0gW1dTXSBSZWNlaXZlZCBlcnJvcjonLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFtXU10gQ29tcGxldGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgbG9nIHdoZW4gY2xvc2luZyBXU1xuICAgIHN1YnNjcmlwdGlvbi5hZGQoKCkgPT4gY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFtXU10gU3RvcCBsaXN0ZW5pbmcgYWNjb3VudCBjaGFuZ2VzJykpO1xuXG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgZ2V0UGFnZVNldHRpbmdzKHBhZ2VJZDogc3RyaW5nLCBwcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuZ2V0UGFnZVNldHRpbmdzKHBhZ2VJZCwgcHJvcGVydHlOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgc2F2ZVBhZ2VTZXR0aW5nKHBhZ2VJZDogc3RyaW5nLCB2YWx1ZTogYW55LCBwcm9wZXJ0eU5hbWU/OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnNhdmVQYWdlU2V0dGluZyhwYWdlSWQsIHZhbHVlLCBwcm9wZXJ0eU5hbWUpO1xuICB9XG5cbiAgZ2V0IGFkZGl0aW9uYWxGaWVsZHMoKTogRm9ybUZpZWxkRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fJGFkZGl0aW9uYWxGaWVsZHMuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldCAkYWRkaXRpb25hbEZpZWxkcygpOiBPYnNlcnZhYmxlPEZvcm1GaWVsZERlZmluaXRpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLl8kYWRkaXRpb25hbEZpZWxkcztcbiAgfVxuXG4gIGdldEFkZGl0aW9uYWxGaWVsZChrZXk6IHN0cmluZyk6IEZvcm1GaWVsZERlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl8kYWRkaXRpb25hbEZpZWxkcy5nZXRWYWx1ZSgpLmZpbmQoZiA9PiBmLmtleSA9PT0ga2V5KTtcbiAgfVxuXG4gIHJlZ2lzdGVyQWRkaXRpb25hbEZpZWxkKGZpZWxkOiBGb3JtRmllbGREZWZpbml0aW9uKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5fJGFkZGl0aW9uYWxGaWVsZHMuZ2V0VmFsdWUoKTtcbiAgICBpZiAoISF2YWx1ZXMuZmluZChmID0+IGYua2V5ID09PSBmaWVsZC5rZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFkZGl0aW9uYWwgYWNjb3VudCBmaWVsZCB7a2V5OiAke2ZpZWxkLmtleX19IGFscmVhZHkgZGVmaW5lLmApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBGb3VuZCBhZGRpdGlvbmFsIGFjY291bnQncyBmaWVsZCB7a2V5OiAke2ZpZWxkLmtleX19YCk7XG4gICAgdGhpcy5fJGFkZGl0aW9uYWxGaWVsZHMubmV4dCh2YWx1ZXMuY29uY2F0KGZpZWxkKSk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kIC0tICovXG5cbiAgcHJvdGVjdGVkIHJlc2V0RGF0YSgpIHtcbiAgICB0aGlzLl9kYXRhLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2RhdGEua2V5cGFpciA9IG51bGw7XG4gICAgdGhpcy5fZGF0YS5hdXRoVG9rZW4gPSBudWxsO1xuICAgIHRoaXMuX2RhdGEuYXV0aEJhc2ljID0gbnVsbDtcbiAgICB0aGlzLl9kYXRhLnB1YmtleSA9IG51bGw7XG4gICAgdGhpcy5fZGF0YS5tYWluUHJvZmlsZSA9IG51bGw7XG4gICAgdGhpcy5fZGF0YS5hY2NvdW50ID0gbmV3IEFjY291bnQoKTtcbiAgICB0aGlzLl9kYXRhLnBlcnNvbiA9IG51bGw7XG4gICAgdGhpcy5fZGF0YS5kZXBhcnRtZW50ID0gbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkRGF0YShvcHRzPzoge1xuICAgIG9mZmxpbmU/OiBib29sZWFuO1xuICAgIGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3k7XG4gIH0pOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICBpZiAoIXRoaXMuX2RhdGEucHVia2V5KSB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGxvZ2dlZCcpO1xuXG4gICAgdGhpcy5fZGF0YS5sb2FkZWQgPSBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhY2NvdW50ID0gKGF3YWl0IHRoaXMubG9hZChvcHRzKSkgfHwgbmV3IEFjY291bnQoKTtcblxuICAgICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgICBhY2NvdW50LmF2YXRhciA9IGFjY291bnQuYXZhdGFyIHx8ICh0aGlzLmVudmlyb25tZW50LmJhc2VVcmwgKyBERUZBVUxUX0FWQVRBUl9JTUFHRSk7XG4gICAgICBhY2NvdW50LnNldHRpbmdzID0gYWNjb3VudC5zZXR0aW5ncyB8fCBuZXcgVXNlclNldHRpbmdzKCk7XG4gICAgICBhY2NvdW50LnNldHRpbmdzLmxvY2FsZSA9IGFjY291bnQuc2V0dGluZ3MubG9jYWxlIHx8IHRoaXMuc2V0dGluZ3MubG9jYWxlO1xuICAgICAgYWNjb3VudC5zZXR0aW5ncy5sYXRMb25nRm9ybWF0ID0gYWNjb3VudC5zZXR0aW5ncy5sYXRMb25nRm9ybWF0IHx8IHRoaXMuc2V0dGluZ3MubGF0TG9uZ0Zvcm1hdCB8fCAnRERNTSc7XG5cbiAgICAgIC8vIFJlYWQgbWFpbiBwcm9maWxlXG4gICAgICB0aGlzLl9kYXRhLm1haW5Qcm9maWxlID0gUGVyc29uVXRpbHMuZ2V0TWFpblByb2ZpbGUoYWNjb3VudC5wcm9maWxlcyk7XG5cbiAgICAgIC8vIFVwZGF0ZSwgaW5zdGVhZCBvZiByZXBsYWNlIGl0XG4gICAgICBpZiAodGhpcy5fZGF0YS5hY2NvdW50KSB7XG4gICAgICAgIHRoaXMuX2RhdGEuYWNjb3VudC5mcm9tT2JqZWN0KGFjY291bnQpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuX2RhdGEuYWNjb3VudCA9IGFjY291bnQ7XG4gICAgICB9XG4gICAgICB0aGlzLl9kYXRhLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgIHJldHVybiB0aGlzLl9kYXRhLmFjY291bnQ7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgIGlmIChlcnJvci5jb2RlICYmIGVycm9yLm1lc3NhZ2UpIHRocm93IGVycm9yO1xuXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IHtcbiAgICAgICAgY29kZTogRXJyb3JDb2Rlcy5MT0FEX0FDQ09VTlRfRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6ICdFUlJPUi5MT0FEX0FDQ09VTlRfRVJST1InXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZXN0b3JlTG9jYWxseSgpOiBQcm9taXNlPEFjY291bnQgfCB1bmRlZmluZWQ+IHtcblxuICAgIC8vIFJlc3RvcmUgZnJvbSBzdG9yYWdlXG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5zdG9yYWdlLmdldChQVUJLRVlfU1RPUkFHRV9LRVkpLFxuICAgICAgdGhpcy5zdG9yYWdlLmdldChUT0tFTl9TVE9SQUdFX0tFWSksXG4gICAgICB0aGlzLnN0b3JhZ2UuZ2V0KFNFQ0tFWV9TVE9SQUdFX0tFWSlcbiAgICBdKTtcbiAgICBjb25zdCBwdWJrZXkgPSB2YWx1ZXNbMF07XG4gICAgY29uc3QgdG9rZW4gPSB2YWx1ZXNbMV07XG4gICAgY29uc3Qgc2Vja2V5ID0gdmFsdWVzWzJdO1xuXG4gICAgLy8gUXVpdCBpZiBubyBwdWJrZXkgKG5vdCBsb2dnZWQpXG4gICAgaWYgKCFwdWJrZXkpIHJldHVybjtcblxuICAgIC8vIFF1aXQgaWYgY291bGQgbm90IGF1dGggb24gcG9kXG4gICAgY29uc3QgY2FuUmVtb3RlQXV0aCA9IHRva2VuIHx8IHNlY2tleSB8fCBmYWxzZTtcbiAgICBpZiAoIWNhblJlbW90ZUF1dGgpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIEFjY291bnQgcmVzdG9yYXRpb24uLi5gKTtcblxuICAgIHRoaXMuX2RhdGEuYXV0aFRva2VuID0gdG9rZW47XG4gICAgdGhpcy5fZGF0YS5wdWJrZXkgPSBwdWJrZXk7XG4gICAgdGhpcy5fZGF0YS5rZXlwYWlyID0gc2Vja2V5ICYmIHtcbiAgICAgIHB1YmxpY0tleTogQmFzZTU4LmRlY29kZShwdWJrZXkpLFxuICAgICAgc2VjcmV0S2V5OiBCYXNlNTguZGVjb2RlKHNlY2tleSlcbiAgICB9IHx8IG51bGw7XG5cbiAgICAvLyBPbmxpbmUgbW9kZTogdHJ5IHRvIGNvbm5lY3QgdG8gcG9kXG4gICAgaWYgKHRoaXMubmV0d29yay5vbmxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKCk7XG4gICAgICAgIGlmICghdGhpcy5fZGF0YS5hdXRoVG9rZW4gJiYgIXRoaXMuX2RhdGEuYXV0aEJhc2ljKSB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCcpO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE9mZmxpbmUgZmVhdHVyZSBhcmUgZW5hYmxlOiBjb250aW51ZSBpbiBvZmZsaW5lIG1vZGVcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuaGFzT2ZmbGluZUZlYXR1cmUoKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW2FjY291bnRdIFVuYWJsZSB0byBhdXRoZW50aWNhdGUgb24gcG9kOiBmb3JjaW5nIG9mZmxpbmUgbW9kZScpO1xuICAgICAgICAgIHRoaXMubmV0d29yay5zZXRGb3JjZU9mZmxpbmUodHJ1ZSwge3Nob3dUb2FzdDogZmFsc2V9KTtcbiAgICAgICAgICAvLyBDb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vIG9mZmxpbmUgZmVhdHVyZXMgZW5hYmxlICg9b2ZmbGluZSBtb2RlIG5vdCBhbGxvd2VkKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBhY2NvdW50LCBmcm9tIHB1YmtleVxuICAgIGxldCBqc29uQWNjb3VudCA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoYCR7QUNDT1VOVF9TVE9SQUdFX0tFWX0jJHtwdWJrZXl9YCk7XG4gICAgaWYgKCFqc29uQWNjb3VudCkge1xuICAgICAgLy8gVHJ5IHVzaW5nIHRoZSBvbGQgc3RvcmFnZSBrZXlcbiAgICAgIGNvbnN0IGFjY291bnRTdHIgPSBhd2FpdCB0aGlzLnN0b3JhZ2UuZ2V0KEFDQ09VTlRfU1RPUkFHRV9LRVkpO1xuICAgICAganNvbkFjY291bnQgPSBhY2NvdW50U3RyICYmICgodHlwZW9mIGFjY291bnRTdHIgPT09ICdzdHJpbmcnKSAmJiBKU09OLnBhcnNlKGpzb25BY2NvdW50KSB8fCBhY2NvdW50U3RyKTtcbiAgICB9XG5cbiAgICAvLyBJbnZhbGlkIGFjY291bnQ6IGRvIG5vdCB1c2UgaXRcbiAgICBpZiAoIWpzb25BY2NvdW50IHx8IGpzb25BY2NvdW50LnB1YmtleSAhPT0gcHVia2V5KSByZXR1cm47XG5cbiAgICAvLyBUcmFuc2Zvcm0gdG8gZW50aXR5XG4gICAgY29uc3QgYWNjb3VudCA9IEFjY291bnQuZnJvbU9iamVjdChqc29uQWNjb3VudCk7XG5cbiAgICAvLyBVcGRhdGUgZGF0YVxuICAgIHRoaXMuX2RhdGEuYWNjb3VudCA9IGFjY291bnQ7XG4gICAgdGhpcy5fZGF0YS5tYWluUHJvZmlsZSA9IFBlcnNvblV0aWxzLmdldE1haW5Qcm9maWxlKGFjY291bnQucHJvZmlsZXMpO1xuICAgIHRoaXMuX2RhdGEubG9hZGVkID0gdHJ1ZTtcblxuICAgIC8vIEVtaXQgZXZlbnRcbiAgICB0aGlzLm9uTG9naW4ubmV4dCh0aGlzLl9kYXRhLmFjY291bnQpO1xuICAgIHRoaXMub25DaGFuZ2UubmV4dCh0aGlzLl9kYXRhLmFjY291bnQpO1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gQWNjb3VudCByZXN0b3JhdGlvbiBbT0tdIHtwdWJrZXk6ICR7cHVia2V5LnN1YnN0cigwLCA4KX19LCB7cHJvZmlsZTogJHt0aGlzLl9kYXRhLm1haW5Qcm9maWxlfX1gKTtcblxuICAgIHJldHVybiBhY2NvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYWNjb3VudCBpbnRvIHRoZSBsb2NhbCBzdG9yYWdlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZUxvY2FsbHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9kYXRhLnB1YmtleSkgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBsb2dnZWQnKTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFNhdmluZyBhY2NvdW50IHske3RoaXMuX2RhdGEucHVia2V5LnN1YnN0cmluZygwLCA2KX19IGluIGxvY2FsIHN0b3JhZ2UuLi5gKTtcblxuICAgIC8vIENvbnZlcnQgYWNjb3VudCB0byBqc29uXG4gICAgY29uc3QganNvbiA9IHRoaXMuX2RhdGEuYWNjb3VudC5hc09iamVjdCh7a2VlcFR5cGVuYW1lOiB0cnVlfSk7XG4gICAgY29uc3Qgc2Vja2V5ID0gdGhpcy5fZGF0YS5rZXlwYWlyICYmIHRoaXMuX2RhdGEua2V5cGFpci5zZWNyZXRLZXkgJiYgQmFzZTU4LmVuY29kZSh0aGlzLl9kYXRhLmtleXBhaXIuc2VjcmV0S2V5KSB8fCBudWxsO1xuXG4gICAgLy8gQ29udmVydCBhdmF0YXIgVVJMIHRvIGRhdGFVcmwgKGUuZy4gJ2RhdGE6aW1hZ2UvcG5nOjxiYXNlNjQgY29udGVudD4nKVxuICAgIGNvbnN0IGhhc0F2YXRhclVybCA9IGpzb24uYXZhdGFyICYmICFqc29uLmF2YXRhci5lbmRzV2l0aChERUZBVUxUX0FWQVRBUl9JTUFHRSkgJiZcbiAgICAgIChqc29uLmF2YXRhci5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgKGpzb24uYXZhdGFyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKTtcbiAgICBpZiAoaGFzQXZhdGFyVXJsICYmIHRoaXMubmV0d29yay5vbmxpbmUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZS5nZXRJbWFnZShqc29uLmF2YXRhciwge1xuICAgICAgICB0aHVtYm5haWw6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2RhdGFVcmwnXG4gICAgICB9KVxuICAgICAgICAudGhlbihkYXRhVXJsID0+IHtcbiAgICAgICAgICBpZiAoZGF0YVVybCAmJiB0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIEltYWdlIGZldGNoZWQ6ICcsIGRhdGFVcmwuc3Vic3RyaW5nKDAsIDUwKSk7XG5cbiAgICAgICAgICAvLyBUT0RPOiBtYWtlIHN1cmUgdG8gZGlzcGxheSBCYXNlNjQgaW1hZ2UgaW4gdGhlIG1lbnUgdG9wIGhlYWRlclxuICAgICAgICAgIC8vanNvbkFjY291bnQuYXZhdGFyID0gZGF0YVVybDtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW2FjY291bnRdIEVycm9yIHdoaWxlIGZldGNoaW5nIGltYWdlOiAke2pzb24uYXZhdGFyfTogJHtlcnJ9YCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoUFVCS0VZX1NUT1JBR0VfS0VZLCB0aGlzLl9kYXRhLnB1YmtleSksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoVE9LRU5fU1RPUkFHRV9LRVksIHRoaXMuX2RhdGEuYXV0aFRva2VuKSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldChgJHtBQ0NPVU5UX1NUT1JBR0VfS0VZfSMke3RoaXMuX2RhdGEucHVia2V5fWAsIGpzb24pLFxuICAgICAgICAvLyBTZWNyZXQga2V5IChvcHRpb25hbClcbiAgICAgICAgc2Vja2V5ICYmIHRoaXMuc3RvcmFnZS5zZXQoU0VDS0VZX1NUT1JBR0VfS0VZLCBzZWNrZXkpIHx8IHRoaXMuc3RvcmFnZS5yZW1vdmUoU0VDS0VZX1NUT1JBR0VfS0VZKSxcbiAgICAgICAgLy8gUmVtb3ZlIG9sZCBzdG9yYWdlIGtleVxuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKEFDQ09VTlRfU1RPUkFHRV9LRVkpXG4gICAgICBdKTtcblxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gQWNjb3VudCBzYXZlZCBpbiBsb2NhbCBzdG9yYWdlJyk7XG4gICAgfVxuICAgIGNhdGNoKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW2FjY291bnRdIEVycm9yIHdoaWxlIHNhdmluZyBhY2NvdW50IGxvY2FsbHk6ICcgKyAoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVyciksIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvciB1cGRhdGUgYW4gdXNlciBhY2NvdW50XG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50XG4gICAqIEBwYXJhbSBrZXlQYWlyXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZVJlbW90ZWx5KGFjY291bnQ6IEFjY291bnQsIGtleVBhaXI/OiBLZXlQYWlyKTogUHJvbWlzZTxBY2NvdW50PiB7XG4gICAgYWNjb3VudC5wdWJrZXkgPSBhY2NvdW50LnB1YmtleSB8fCAoa2V5UGFpciAmJiBCYXNlNTguZW5jb2RlKGtleVBhaXIucHVibGljS2V5KSk7XG4gICAgaWYgKCFhY2NvdW50LnB1YmtleSkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGFjY291bnQgcHVia2V5Jyk7XG5cbiAgICBjb25zdCBub3cgPSB0aGlzLl9kZWJ1ZyAmJiBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFNhdmluZyBhY2NvdW50IHJlbW90ZWx5Li4uYCk7XG5cbiAgICBjb25zdCBpc05ldyA9ICFhY2NvdW50LmlkICYmIGFjY291bnQuaWQgIT09IDA7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGFuIHVwZGF0ZTogZ2V0IGV4aXN0aW5nIGFjY291bnQncyB1cGRhdGVEYXRlLCB0byBhdm9pZCAndmVyc2lvbiBlcnJvcicgd2hlbiBzYXZpbmdcbiAgICBpZiAoIWlzTmV3KSB7XG4gICAgICBjb25zdCBleGlzdGluZ0FjY291bnQgPSBhd2FpdCB0aGlzLmxvYWQoeyBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScgfSk7XG4gICAgICBpZiAoIWV4aXN0aW5nQWNjb3VudCB8fCAhZXhpc3RpbmdBY2NvdW50LnVwZGF0ZURhdGUpIHtcbiAgICAgICAgdGhyb3cgeyBjb2RlOiBFcnJvckNvZGVzLkFDQ09VTlRfTk9UX0VYSVNUUywgbWVzc2FnZTogJ0VSUk9SLkFDQ09VTlRfTk9UX0VYSVNUUycgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZShleGlzdGluZ0FjY291bnQsIGFjY291bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGpzb24gPSBhY2NvdW50LmFzT2JqZWN0KE1JTklGWV9FTlRJVFlfRk9SX1BPRCk7XG5cbiAgICAvLyBVc2VyIG5vdCBhbGxvdyB0byBjaGFuZ2UgaGlzIHByb2ZpbGVzXG4gICAgZGVsZXRlIGpzb24ucHJvZmlsZXM7XG5cbiAgICAvLyBFeGVjdXRlIG11dGF0aW9uXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmdyYXBocWwubXV0YXRlPHsgZGF0YTogQWNjb3VudCB9Pih7XG4gICAgICBtdXRhdGlvbjogaXNOZXcgPyBDcmVhdGVNdXRhdGlvbiA6IFNhdmVNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczogeyBkYXRhOiBqc29uIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlNBVkVfQUNDT1VOVF9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLlNBVkVfQUNDT1VOVF9FUlJPUidcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENvcHkgdXBkYXRlIHByb3BlcnRpZXNcbiAgICB0aGlzLmNvcHlJZEFuZFVwZGF0ZURhdGUoZGF0YSwgYWNjb3VudCk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBY2NvdW50IHJlbW90ZWx5IHNhdmVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgcmV0dXJuIGFjY291bnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYXV0aGVudGljYXRlQW5kR2V0VG9rZW4odG9rZW4/OiBzdHJpbmcsIGNvdW50ZXI/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghdGhpcy5fZGF0YS5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkJyk7XG5cbiAgICBpZiAoIWNvdW50ZXIpIGNvbnNvbGUuaW5mbygnW2FjY291bnRdIEF1dGhlbnRpY2F0aW9uIG9uIHBvZC4uLicpO1xuXG4gICAgaWYgKGNvdW50ZXIgPiA0KSB7XG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBGYWlsZWQgdG8gYXV0aGVudGljYXRpb24gb24gcG9kIChhZnRlciAke2NvdW50ZXJ9IGF0dGVtcHRzKWApO1xuICAgICAgdGhyb3cgeyBjb2RlOiBFcnJvckNvZGVzLkFVVEhfU0VSVkVSX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuQVVUSF9TRVJWRVJfRVJST1InIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdmFsaWRcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmdyYXBocWwucXVlcnk8eyBhdXRoZW50aWNhdGU6IGJvb2xlYW4gfSwgeyB0b2tlbjogc3RyaW5nIH0+KHtcbiAgICAgICAgcXVlcnk6IEF1dGhRdWVyeSxcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgdG9rZW5cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlVOQVVUSE9SSVpFRCxcbiAgICAgICAgICBtZXNzYWdlOiAnRVJST1IuVU5BVVRIT1JJWkVEJ1xuICAgICAgICB9LFxuICAgICAgICBmZXRjaFBvbGljeTogJ25vLWNhY2hlJ1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRva2VuIGlzIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXJcbiAgICAgIGlmIChkYXRhICYmIGRhdGEuYXV0aGVudGljYXRlKSB7XG4gICAgICAgIC8vIFN0b3JlIHRoZSB0b2tlblxuICAgICAgICB0aGlzLm9uQXV0aFRva2VuQ2hhbmdlLm5leHQodG9rZW4pO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgW2FjY291bnRdIEF1dGhlbnRpY2F0aW9uIG9uIHBvZCBbT0tdIHtwdWJrZXk6ICcke3RoaXMuX2RhdGEucHVia2V5LnN1YnN0cigwLCA4KX0nfWApO1xuICAgICAgICByZXR1cm4gdG9rZW47IC8vIHJldHVybiB0aGUgdG9rZW5cbiAgICAgIH1cblxuICAgICAgLy8gQ29udGludWUgKHdpbGwgcmV0cnkgd2l0aCBhbm90aGVyIGNoYWxsZW5nZSlcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBhIG5ldyB0b2tlblxuICAgIGNvbnN0IGNoYWxsZW5nZUVycm9yID0ge1xuICAgICAgY29kZTogRXJyb3JDb2Rlcy5BVVRIX0NIQUxMRU5HRV9FUlJPUixcbiAgICAgIG1lc3NhZ2U6ICdFUlJPUi5BVVRIX0NIQUxMRU5HRV9FUlJPUidcbiAgICB9O1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmdyYXBocWwucXVlcnk8e1xuICAgICAgYXV0aENoYWxsZW5nZToge1xuICAgICAgICBwdWJrZXk6IHN0cmluZztcbiAgICAgICAgY2hhbGxlbmdlOiBzdHJpbmc7XG4gICAgICAgIHNpZ25hdHVyZTogc3RyaW5nO1xuICAgICAgfTtcbiAgICB9Pih7XG4gICAgICBxdWVyeTogQXV0aENoYWxsZW5nZVF1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7fSxcbiAgICAgIGVycm9yOiBjaGFsbGVuZ2VFcnJvcixcbiAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5J1xuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgY2hhbGxlbmdlXG4gICAgaWYgKCFkYXRhIHx8ICFkYXRhLmF1dGhDaGFsbGVuZ2UpIHRocm93IGNoYWxsZW5nZUVycm9yOyAvLyBTaG91bGQgbmV2ZXIgb2NjdXJcblxuICAgIC8vIENoZWNrIHNlcnZlciBzaWduYXR1cmVcbiAgICBjb25zdCBzaWduYXR1cmVPSyA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS52ZXJpZnkoXG4gICAgICBkYXRhLmF1dGhDaGFsbGVuZ2UuY2hhbGxlbmdlLFxuICAgICAgZGF0YS5hdXRoQ2hhbGxlbmdlLnNpZ25hdHVyZSxcbiAgICAgIGRhdGEuYXV0aENoYWxsZW5nZS5wdWJrZXlcbiAgICApO1xuICAgIGlmICghc2lnbmF0dXJlT0spIHtcbiAgICAgIGNvbnNvbGUud2FybignRklYTUU6IEJhZCBwZWVyIHNpZ25hdHVyZSBvbiBhdXRoIGNoYWxsZW5nZSAhJywgZGF0YS5hdXRoQ2hhbGxlbmdlKTtcbiAgICB9XG4gICAgLy8gVE9ETzogY2hlY2sgc2VydmVyIHB1YmtleSBhcyBhIHZhbGlkIGNlcnRpZmljYXRlXG5cbiAgICAvLyBEbyB0aGUgY2hhbGxlbmdlXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnNpZ24oZGF0YS5hdXRoQ2hhbGxlbmdlLmNoYWxsZW5nZSwgdGhpcy5fZGF0YS5rZXlwYWlyKTtcbiAgICBjb25zdCBuZXdUb2tlbiA9IGAke3RoaXMuX2RhdGEucHVia2V5fToke2RhdGEuYXV0aENoYWxsZW5nZS5jaGFsbGVuZ2V9fCR7c2lnbmF0dXJlfWA7XG5cbiAgICAvLyBpdGVyYXRlIHdpdGggdGhlIG5ldyB0b2tlblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZUFuZEdldFRva2VuKG5ld1Rva2VuLCAoY291bnRlciB8fCAxKSArIDEgLyogaW5jcmVtZW50ICovKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb3B5SWRBbmRVcGRhdGVEYXRlKHNvdXJjZTogQWNjb3VudCB8IHVuZGVmaW5lZCwgdGFyZ2V0OiBBY2NvdW50KSB7XG4gICAgaWYgKCFzb3VyY2UpIHJldHVybjtcblxuICAgIHRhcmdldC5pZCA9IHNvdXJjZS5pZCB8fCB0YXJnZXQuaWQ7XG4gICAgdGFyZ2V0LnVwZGF0ZURhdGUgPSBzb3VyY2UudXBkYXRlRGF0ZSB8fCB0YXJnZXQudXBkYXRlRGF0ZTtcbiAgICB0YXJnZXQuc2V0dGluZ3MuaWQgPSBzb3VyY2Uuc2V0dGluZ3MgJiYgc291cmNlLnNldHRpbmdzLmlkIHx8IHRhcmdldC5zZXR0aW5ncy5pZDtcbiAgICB0YXJnZXQuc2V0dGluZ3MudXBkYXRlRGF0ZSA9IHNvdXJjZS5zZXR0aW5ncyAmJiBzb3VyY2Uuc2V0dGluZ3MudXBkYXRlRGF0ZSB8fCB0YXJnZXQuc2V0dGluZ3MudXBkYXRlRGF0ZTtcbiAgfVxufVxuIl19