valtech-components 4.0.34 → 4.0.37

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 (31) hide show
  1. package/esm2022/lib/services/auth/auth.service.mjs +28 -20
  2. package/esm2022/lib/services/auth/oauth-callback.component.mjs +13 -1
  3. package/esm2022/lib/services/auth/oauth.service.mjs +83 -8
  4. package/esm2022/lib/services/auth/storage.service.mjs +7 -11
  5. package/esm2022/lib/services/auth/types.mjs +1 -1
  6. package/esm2022/lib/services/link-processor.service.mjs +27 -5
  7. package/esm2022/lib/services/requests/request-visibility.mjs +41 -0
  8. package/esm2022/lib/services/requests/types.mjs +1 -1
  9. package/esm2022/lib/version.mjs +2 -2
  10. package/esm2022/public-api.mjs +2 -1
  11. package/fesm2022/valtech-components.mjs +195 -41
  12. package/fesm2022/valtech-components.mjs.map +1 -1
  13. package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +2 -2
  14. package/lib/components/atoms/text/text.component.d.ts +1 -1
  15. package/lib/components/atoms/user-avatar/user-avatar.component.d.ts +1 -1
  16. package/lib/components/molecules/cta-card/cta-card.component.d.ts +1 -1
  17. package/lib/components/molecules/features-list/features-list.component.d.ts +1 -1
  18. package/lib/components/molecules/metric-card/metric-card.component.d.ts +1 -1
  19. package/lib/components/organisms/article/article.component.d.ts +6 -6
  20. package/lib/components/organisms/auth-cta/auth-cta.component.d.ts +1 -1
  21. package/lib/components/organisms/notification-preferences-view/notification-preferences-view.component.d.ts +1 -1
  22. package/lib/services/auth/oauth-callback.component.d.ts +6 -0
  23. package/lib/services/auth/oauth.service.d.ts +28 -0
  24. package/lib/services/auth/storage.service.d.ts +1 -1
  25. package/lib/services/auth/types.d.ts +6 -0
  26. package/lib/services/link-processor.service.d.ts +12 -0
  27. package/lib/services/requests/request-visibility.d.ts +35 -0
  28. package/lib/services/requests/types.d.ts +7 -2
  29. package/lib/version.d.ts +1 -1
  30. package/package.json +1 -1
  31. package/public-api.d.ts +1 -0
@@ -125,8 +125,12 @@ export class AuthService {
125
125
  this.setupFirestoreRBACSync(claims.uid);
126
126
  }
127
127
  }
128
- else if (storedState.refreshToken) {
129
- // 4. Token expirado pero hay refresh token.
128
+ else if (storedState.accessToken) {
129
+ // 4. Token de acceso expirado. El refresh token vive en la cookie
130
+ // HttpOnly (H-05), no en storage — así que el disparador ya no es
131
+ // "hay refresh en storage" sino "había un access token" (sesión
132
+ // previa). El /refresh de fondo usa la cookie; si no es válida, falla
133
+ // y caemos a signOut (catch más abajo).
130
134
  //
131
135
  // NO bloqueamos el bootstrap esperando la red: un /refresh en una
132
136
  // Lambda fría son 2-5s de pantalla en blanco (Angular no renderiza
@@ -386,20 +390,21 @@ export class AuthService {
386
390
  * que el cliente debe guardar para el próximo refresh.
387
391
  */
388
392
  refreshAccessToken() {
393
+ // H-05: el refresh token vive en una cookie HttpOnly (no en storage). El
394
+ // gate ya NO exige tenerlo en memoria — la cookie lo aporta. Durante la
395
+ // transición, si todavía hay un refresh en estado (sesión vieja), se manda
396
+ // en el body (el backend prioriza body sobre cookie). withCredentials hace
397
+ // que el browser envíe la cookie en la request cross-site.
389
398
  const refreshToken = this.state().refreshToken;
390
- if (!refreshToken) {
391
- return throwError(() => ({
392
- code: 'NO_REFRESH_TOKEN',
393
- message: 'No hay token de refresco',
394
- }));
395
- }
396
- return this.http.post(`${this.baseUrl}/refresh`, { refreshToken }).pipe(tap(response => {
399
+ const body = refreshToken ? { refreshToken } : {};
400
+ return this.http
401
+ .post(`${this.baseUrl}/refresh`, body, { withCredentials: true })
402
+ .pipe(tap(response => {
397
403
  const expiresAt = Date.now() + response.expiresIn * 1000;
398
- // Token rotation: guardar nuevo access token Y refresh token
404
+ // Token rotation: el access token se guarda; el refresh rotado viaja en
405
+ // la cookie HttpOnly (NO se persiste en localStorage — H-05).
399
406
  this.stateService.updateAccessToken(response.accessToken, response.expiresIn);
400
- this.stateService.updateRefreshToken(response.refreshToken); // NUEVO: guardar refresh rotado
401
407
  this.storageService.saveAccessToken(response.accessToken, expiresAt);
402
- this.storageService.saveRefreshToken(response.refreshToken); // NUEVO: persistir refresh rotado
403
408
  if (this.config?.enableFirebaseIntegration && response.firebaseToken) {
404
409
  this.signInWithFirebase(response.firebaseToken);
405
410
  }
@@ -475,13 +480,16 @@ export class AuthService {
475
480
  const refreshToken = this.state().refreshToken;
476
481
  // Eliminar dispositivo del backend antes de cerrar sesión
477
482
  await this.unregisterDevice();
478
- // Notificar al backend (fire and forget)
479
- if (refreshToken) {
480
- this.http
481
- .post(`${this.baseUrl}/logout`, { refreshToken })
482
- .pipe(catchError(() => of(null)))
483
- .subscribe();
484
- }
483
+ // Notificar al backend (fire and forget). El refresh token va por la cookie
484
+ // HttpOnly (H-05); si aún hay uno en estado (sesión vieja) se manda en el
485
+ // body. El backend revoca la sesión y expira la cookie. withCredentials
486
+ // envía la cookie cross-site.
487
+ this.http
488
+ .post(`${this.baseUrl}/logout`, refreshToken ? { refreshToken } : {}, {
489
+ withCredentials: true,
490
+ })
491
+ .pipe(catchError(() => of(null)))
492
+ .subscribe();
485
493
  // Cerrar sesión de Firebase si está integrado
486
494
  this.signOutFirebase();
487
495
  this.clearState();
@@ -1403,4 +1411,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1403
1411
  }] }, { type: i10.ConfirmationDialogService }, { type: i11.Firestore, decorators: [{
1404
1412
  type: Optional
1405
1413
  }] }] });
1406
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25GLE9BQU8sRUFBYyxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQXdFL0MsT0FBTyxFQUFhLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7O0FBRTNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxNQUFNLE9BQU8sV0FBVztJQU10QixZQUNtRCxNQUFnQyxFQUN6RSxJQUFnQixFQUNoQixNQUFjLEVBQ2QsWUFBOEIsRUFDOUIsWUFBMEIsRUFDMUIsY0FBa0MsRUFDbEMsV0FBNEIsRUFDNUIsZUFBZ0MsRUFDaEMsWUFBMEIsRUFDZCxnQkFBeUMsRUFDekMsV0FBK0IsRUFDM0MsbUJBQThDLEVBQ2xDLGlCQUFtQztRQVpOLFdBQU0sR0FBTixNQUFNLENBQTBCO1FBQ3pFLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtRQUM5QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixtQkFBYyxHQUFkLGNBQWMs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LGNBREUsTUFBTTs7NEZBQ25CLFdBQVc7a0JBRHZCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFRN0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxtQkFBbUI7OzBCQVN0QyxRQUFROzswQkFDUixRQUFROzswQkFFUixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBpc0Rldk1vZGUsIE9uRGVzdHJveSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IsIG9mLCBmcm9tLCBmaXJzdFZhbHVlRnJvbSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAsIGNhdGNoRXJyb3IsIHN3aXRjaE1hcCwgbWFwLCBmaWx0ZXIsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFZBTFRFQ0hfQVVUSF9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBBdXRoU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi90b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTeW5jU2VydmljZSB9IGZyb20gJy4vc3luYy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFNpZ25pblJlcXVlc3QsXG4gIFNpZ25pblJlc3BvbnNlLFxuICBTaWdudXBSZXF1ZXN0LFxuICBTaWdudXBSZXNwb25zZSxcbiAgVmVyaWZ5RW1haWxSZXF1ZXN0LFxuICBWZXJpZnlFbWFpbFJlc3BvbnNlLFxuICBSZXNlbmRDb2RlUmVxdWVzdCxcbiAgUmVzZW5kQ29kZVJlc3BvbnNlLFxuICBNRkFWZXJpZnlSZXNwb25zZSxcbiAgUmVmcmVzaFJlc3BvbnNlLFxuICBHZXRQZXJtaXNzaW9uc1Jlc3BvbnNlLFxuICBHZXRQcm9maWxlUmVzcG9uc2UsXG4gIFVwZGF0ZVByb2ZpbGVSZXF1ZXN0LFxuICBVcGRhdGVQcm9maWxlUmVzcG9uc2UsXG4gIE1GQVNldHVwUmVzcG9uc2UsXG4gIE1GQUNvbmZpcm1SZXNwb25zZSxcbiAgTUZBRGlzYWJsZVJlcXVlc3QsXG4gIE1GQURpc2FibGVSZXNwb25zZSxcbiAgRm9yZ290UGFzc3dvcmRSZXF1ZXN0LFxuICBGb3Jnb3RQYXNzd29yZFJlc3BvbnNlLFxuICBSZXNldFBhc3N3b3JkUmVxdWVzdCxcbiAgUmVzZXRQYXNzd29yZFJlc3BvbnNlLFxuICBBY3RpdmF0ZUFjY291bnRSZXF1ZXN0LFxuICBBY3RpdmF0ZUFjY291bnRSZXNwb25zZSxcbiAgQ2hhbmdlUGFzc3dvcmRSZXF1ZXN0LFxuICBDaGFuZ2VQYXNzd29yZFJlc3BvbnNlLFxuICBEZWxldGVBY2NvdW50UmVxdWVzdCxcbiAgRGVsZXRlQWNjb3VudFJlc3BvbnNlLFxuICBTZW5kRGVsZXRlQWNjb3VudENvZGVSZXNwb25zZSxcbiAgU3dpdGNoT3JnUmVzcG9uc2UsXG4gIE1GQU1ldGhvZCxcbiAgQXV0aEVycm9yLFxuICBBdXRoU3luY0V2ZW50LFxuICBWYWx0ZWNoQXV0aENvbmZpZyxcbiAgUmVnaXN0ZXJEZXZpY2VSZXNwb25zZSxcbiAgRW5hYmxlTm90aWZpY2F0aW9uc1Jlc3VsdCxcbiAgTm90aWZpY2F0aW9uUGVybWlzc2lvblN0YXRlLFxuICBSZWdpc3RlckRldmljZVJlc3VsdCxcbiAgLy8gVE9UUCBNRkEgdHlwZXNcbiAgVE9UUFNldHVwUmVzcG9uc2UsXG4gIFRPVFBWZXJpZnlTZXR1cFJlc3BvbnNlLFxuICBUT1RQRGlzYWJsZVJlc3BvbnNlLFxuICBSZWdlbmVyYXRlQmFja3VwQ29kZXNSZXNwb25zZSxcbiAgQmFja3VwQ29kZXNDb3VudFJlc3BvbnNlLFxuICAvLyBPQXV0aCB0eXBlc1xuICBPQXV0aFByb3ZpZGVyLFxuICBPQXV0aFJlc3VsdCxcbiAgTGlua2VkUHJvdmlkZXIsXG4gIEhhc1Bhc3N3b3JkUmVzcG9uc2UsXG4gIC8vIEhhbmRsZSB0eXBlc1xuICBVcGRhdGVIYW5kbGVSZXNwb25zZSxcbiAgQ2hlY2tIYW5kbGVSZXNwb25zZSxcbiAgLy8gQXZhdGFyIHR5cGVzXG4gIFVwZGF0ZUF2YXRhclJlcXVlc3QsXG4gIFVwZGF0ZUF2YXRhclJlc3BvbnNlLFxuICAvLyBFbWFpbCBjaGFuZ2VcbiAgSW5pdGlhdGVFbWFpbENoYW5nZVJlcXVlc3QsXG4gIEluaXRpYXRlRW1haWxDaGFuZ2VSZXNwb25zZSxcbiAgQ29uZmlybUVtYWlsQ2hhbmdlU3RlcDFSZXF1ZXN0LFxuICBDb25maXJtRW1haWxDaGFuZ2VTdGVwMVJlc3BvbnNlLFxuICBDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlcXVlc3QsXG4gIENvbmZpcm1FbWFpbENoYW5nZVN0ZXAyUmVzcG9uc2UsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgT0F1dGhTZXJ2aWNlIH0gZnJvbSAnLi9vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpcmViYXNlU2VydmljZSwgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJy4uL2ZpcmViYXNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBJMThuTGFuZyB9IGZyb20gJy4uL2kxOG4nO1xuaW1wb3J0IHsgRmlyZXN0b3JlLCBkb2MsIG9uU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9maXJlL2ZpcmVzdG9yZSc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25EaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vY29uZmlybWF0aW9uLWRpYWxvZy9jb25maXJtYXRpb24tZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgaW50ZXJwcmV0RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIHByaW5jaXBhbCBkZSBhdXRlbnRpY2FjacOzbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnO1xuICpcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgTG9naW5Db21wb25lbnQge1xuICogICBwcml2YXRlIGF1dGggPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICpcbiAqICAgYXN5bmMgbG9naW4oKSB7XG4gKiAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLnNpZ25pbih7IGVtYWlsLCBwYXNzd29yZCB9KSk7XG4gKiAgICAgaWYgKHRoaXMuYXV0aC5tZmFQZW5kaW5nKCkucmVxdWlyZWQpIHtcbiAqICAgICAgIC8vIE1vc3RyYXIgVUkgZGUgTUZBXG4gKiAgICAgfSBlbHNlIHtcbiAqICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLy8gVGltZXIgcGFyYSByZWZyZXNoIHByb2FjdGl2b1xuICBwcml2YXRlIHJlZnJlc2hUaW1lcklkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN5bmNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGZpcmVzdG9yZVJCQUNVbnN1YnNjcmliZTogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChWQUxURUNIX0FVVEhfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVmFsdGVjaEF1dGhDb25maWcgfCBudWxsLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgc3RhdGVTZXJ2aWNlOiBBdXRoU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogQXV0aFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3luY1NlcnZpY2U6IEF1dGhTeW5jU2VydmljZSxcbiAgICBwcml2YXRlIGZpcmViYXNlU2VydmljZTogRmlyZWJhc2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgb2F1dGhTZXJ2aWNlOiBPQXV0aFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlIHwgbnVsbCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSB8IG51bGwsXG4gICAgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25EaWFsb2dTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZmlyZXN0b3JlSW5zdGFuY2U6IEZpcmVzdG9yZSB8IG51bGxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZyAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW3ZhbHRlY2gtY29tcG9uZW50c10gQXV0aFNlcnZpY2U6IHByb3ZpZGVWYWx0ZWNoQXV0aCgpIG5vIGVzdMOhIGVuIG1haW4udHMuICcgK1xuICAgICAgICAgICdMb2dpbiwgcmVnaXN0cm8geSBzZXNpw7NuIG5vIGZ1bmNpb25hcsOhbi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFU1RBRE8gUMOaQkxJQ08gKFNpZ25hbHMgcmVhZG9ubHkpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBFc3RhZG8gY29tcGxldG8gZGUgYXV0ZW50aWNhY2nDs24gKi9cbiAgcmVhZG9ubHkgc3RhdGUgPSB0aGlzLnN0YXRlU2VydmljZS5zdGF0ZTtcblxuICAvKiogVXN1YXJpbyBlc3TDoSBhdXRlbnRpY2FkbyAqL1xuICByZWFkb25seSBpc0F1dGhlbnRpY2F0ZWQgPSB0aGlzLnN0YXRlU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQ7XG5cbiAgLyoqIEVzdGFkbyBkZSBjYXJnYSAqL1xuICByZWFkb25seSBpc0xvYWRpbmcgPSB0aGlzLnN0YXRlU2VydmljZS5pc0xvYWRpbmc7XG5cbiAgLyoqIEluZm9ybWFjacOzbiBkZWwgdXN1YXJpbyAqL1xuICByZWFkb25seSB1c2VyID0gdGhpcy5zdGF0ZVNlcnZpY2UudXNlcjtcblxuICAvKiogVG9rZW4gZGUgYWNjZXNvICovXG4gIHJlYWRvbmx5IGFjY2Vzc1Rva2VuID0gdGhpcy5zdGF0ZVNlcnZpY2UuYWNjZXNzVG9rZW47XG5cbiAgLyoqIFJvbGVzIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHJvbGVzID0gdGhpcy5zdGF0ZVNlcnZpY2Uucm9sZXM7XG5cbiAgLyoqIFBlcm1pc29zIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHBlcm1pc3Npb25zID0gdGhpcy5zdGF0ZVNlcnZpY2UucGVybWlzc2lvbnM7XG5cbiAgLyoqIFVzdWFyaW8gZXMgc3VwZXIgYWRtaW4gKi9cbiAgcmVhZG9ubHkgaXNTdXBlckFkbWluID0gdGhpcy5zdGF0ZVNlcnZpY2UuaXNTdXBlckFkbWluO1xuXG4gIC8qKiBFc3RhZG8gZGUgTUZBIHBlbmRpZW50ZSAqL1xuICByZWFkb25seSBtZmFQZW5kaW5nID0gdGhpcy5zdGF0ZVNlcnZpY2UubWZhUGVuZGluZztcblxuICAvKiogRXJyb3IgYWN0dWFsICovXG4gIHJlYWRvbmx5IGVycm9yID0gdGhpcy5zdGF0ZVNlcnZpY2UuZXJyb3I7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElOSUNJQUxJWkFDScOTTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhbGl6YSBlbCBzZXJ2aWNpbyBkZSBhdXRlbnRpY2FjacOzbi5cbiAgICogTGxhbWFkbyBhdXRvbcOhdGljYW1lbnRlIHBvciBwcm92aWRlVmFsdGVjaEF1dGguXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIDEuIENhcmdhciBlc3RhZG8gZGVzZGUgc3RvcmFnZVxuICAgIGNvbnN0IHN0b3JlZFN0YXRlID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkU3RhdGUoKTtcblxuICAgIGlmIChzdG9yZWRTdGF0ZS5hY2Nlc3NUb2tlbikge1xuICAgICAgLy8gMi4gVmVyaWZpY2FyIHNpIHRva2VuIGVzIHbDoWxpZG9cbiAgICAgIGlmICh0aGlzLnRva2VuU2VydmljZS5pc1Rva2VuVmFsaWQoc3RvcmVkU3RhdGUuYWNjZXNzVG9rZW4pKSB7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc3RvcmVGcm9tU3RvcmFnZShzdG9yZWRTdGF0ZSk7XG5cbiAgICAgICAgLy8gRXh0cmFlciBpbmZvIGRlbCB0b2tlblxuICAgICAgICBjb25zdCBjbGFpbXMgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgaWYgKGNsYWltcykge1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVVzZXJJbmZvKGNsYWltcy51aWQsIGNsYWltcy5lbWFpbCk7XG4gICAgICAgICAgaWYgKGNsYWltcy5vcmcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjdGl2ZU9yZyhjbGFpbXMub3JnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBJbmljaWFyIHRpbWVyIGRlIHJlZnJlc2NvIHByb2FjdGl2b1xuICAgICAgICB0aGlzLnN0YXJ0UmVmcmVzaFRpbWVyKCk7XG5cbiAgICAgICAgLy8gNC4gUmUtZXN0YWJsZWNlciBsYSBzZXNpw7NuIGRlIEZpcmViYXNlIGVuIGJvb3RzdHJhcC5cbiAgICAgICAgLy8gRWwgYWNjZXNzIHRva2VuIHNpZ3VlIHbDoWxpZG8sIGFzw60gcXVlIE5PIHBhc2Ftb3MgcG9yIGxhIHJhbWEgZGVcbiAgICAgICAgLy8gcmVmcmVzaCDigJQgcGVybyBsYSBwZXJzaXN0ZW5jaWEgSW5kZXhlZERCIHByb3BpYSBkZSBGaXJlYmFzZSBBdXRoIG5vXG4gICAgICAgIC8vIHNvYnJldml2ZSBlbCBjb250ZW5lZG9yIGRlIHN0b3JhZ2UgZGUgdW5hIFBXQSBzdGFuZGFsb25lIGVuIGlPUy5cbiAgICAgICAgLy8gU2luIGVzdG8sIGBmaXJlYmFzZUF1dGhSZWFkeWAgc2UgcXVlZGEgZW4gYGZhbHNlYCBwYXJhIHNpZW1wcmUgeVxuICAgICAgICAvLyBjdWFscXVpZXIgbGlzdGVuZXIgRmlyZXN0b3JlIChlai4gZWwgaW5ib3ggZGUgbm90aWZpY2FjaW9uZXMpIGN1ZWxnYS5cbiAgICAgICAgLy8gRmlyZS1hbmQtZm9yZ2V0OiBOTyBkZWJlIGRlbW9yYXIgZWwgcmVzb2x2ZSBkZSBpbml0aWFsaXplKCkuXG4gICAgICAgIHZvaWQgdGhpcy5lbnN1cmVGaXJlYmFzZVNlc3Npb25PbkJvb3RzdHJhcCgpO1xuXG4gICAgICAgIC8vIDUuIExpc3RlbmVyIFJCQUMgRmlyZXN0b3JlIOKAlCByZS1lc3RhYmxlY2VyIHRyYXMgcmVsb2FkIGRlIHDDoWdpbmEuXG4gICAgICAgIC8vIGhhbmRsZVN1Y2Nlc3NmdWxBdXRoIGxvIGNvbmZpZ3VyYSBlbiBlbCBsb2dpbiBpbmljaWFsLCBwZXJvIG5vIHNvYnJldml2ZVxuICAgICAgICAvLyByZWNhcmdhczogaW5pdGlhbGl6ZSgpIHJlc3RhdXJhIGVsIHN0YXRlIGRlc2RlIHN0b3JhZ2UgcGVybyBubyBlbCBsaXN0ZW5lci5cbiAgICAgICAgLy8gc2V0dXBGaXJlc3RvcmVSQkFDU3luYyBlc3BlcmEgaW50ZXJuYW1lbnRlIGEgcXVlIEZpcmViYXNlIEF1dGggZXN0w6kgbGlzdGEuXG4gICAgICAgIGlmIChjbGFpbXM/LnVpZCkge1xuICAgICAgICAgIHRoaXMuc2V0dXBGaXJlc3RvcmVSQkFDU3luYyhjbGFpbXMudWlkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdG9yZWRTdGF0ZS5yZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgLy8gNC4gVG9rZW4gZXhwaXJhZG8gcGVybyBoYXkgcmVmcmVzaCB0b2tlbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTk8gYmxvcXVlYW1vcyBlbCBib290c3RyYXAgZXNwZXJhbmRvIGxhIHJlZDogdW4gL3JlZnJlc2ggZW4gdW5hXG4gICAgICAgIC8vIExhbWJkYSBmcsOtYSBzb24gMi01cyBkZSBwYW50YWxsYSBlbiBibGFuY28gKEFuZ3VsYXIgbm8gcmVuZGVyaXphXG4gICAgICAgIC8vIG5hZGEgaGFzdGEgcXVlIGVsIEFQUF9JTklUSUFMSVpFUiByZXN1ZWx2ZSkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFJlc3RhdXJhY2nDs24gb3B0aW1pc3RhOiBlbCBhY2Nlc3MgdG9rZW4gZXhwaXLDsyBwZXJvIHN1cyBjbGFpbXNcbiAgICAgICAgLy8gKHVpZC9lbWFpbC9yb2xlcykgc2lndWVuIGRlY29kaWZpY2FibGVzIOKAlCBgcGFyc2VUb2tlbmAgTk8gdmFsaWRhXG4gICAgICAgIC8vIGBleHBgLiBSZXN0YXVyYW1vcyBsYSBzZXNpw7NuIGRlc2RlIGVzb3MgY2xhaW1zIHBhcmEgcXVlIGxhIGFwcFxuICAgICAgICAvLyByZW5kZXJpY2UgZWwgc2hlbGwgYXV0ZW50aWNhZG8gZGUgaW5tZWRpYXRvLCB5IGRpc3BhcmFtb3MgZWxcbiAgICAgICAgLy8gL3JlZnJlc2ggZW4gc2VndW5kbyBwbGFubyAoZmlyZS1hbmQtZm9yZ2V0KS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2VndXJpZGFkIGRlIGxhIHZlbnRhbmEgc3ViLXNlZ3VuZG8gYW50ZXMgZGUgcXVlIGVsIHJlZnJlc2ggbGxlZ3VlOlxuICAgICAgICAvLyBjdWFscXVpZXIgQVBJIGNhbGwgc2FsZSBjb24gZWwgdG9rZW4gZXhwaXJhZG8g4oaSIDQwMSDihpIgZWxcbiAgICAgICAgLy8gYXV0aEludGVyY2VwdG9yIHJlZnJlc2NhICsgcmVpbnRlbnRhIGF1dG9tw6F0aWNhbWVudGUuIFNpIGVsIHJlZnJlc2hcbiAgICAgICAgLy8gZGUgZm9uZG8gZmFsbGEg4oaSIHNpZ25PdXQgKyBjbGVhclN0YXRlLlxuICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBib290c3RyYXAg4oCUIGFjY2VzcyB0b2tlbiBleHBpcmVkLCByZWZyZXNoaW5nIGluIGJhY2tncm91bmQnKTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzdG9yZUZyb21TdG9yYWdlKHN0b3JlZFN0YXRlKTtcblxuICAgICAgICBjb25zdCBleHBpcmVkQ2xhaW1zID0gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbihzdG9yZWRTdGF0ZS5hY2Nlc3NUb2tlbik7XG4gICAgICAgIGlmIChleHBpcmVkQ2xhaW1zKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlVXNlckluZm8oZXhwaXJlZENsYWltcy51aWQsIGV4cGlyZWRDbGFpbXMuZW1haWwpO1xuICAgICAgICAgIGlmIChleHBpcmVkQ2xhaW1zLm9yZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKGV4cGlyZWRDbGFpbXMub3JnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4cGlyZWRDbGFpbXMudWlkKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwRmlyZXN0b3JlUkJBQ1N5bmMoZXhwaXJlZENsYWltcy51aWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZnJlc2ggZW4gc2VndW5kbyBwbGFubyDigJQgTk8gc2UgaGFjZSBhd2FpdDogaW5pdGlhbGl6ZSgpIHJlc3VlbHZlIHlhLlxuICAgICAgICBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIGJvb3RzdHJhcCDigJQgYmFja2dyb3VuZCByZWZyZXNoIGZhaWxlZCwgc2lnbmluZyBvdXQnKTtcbiAgICAgICAgICB0aGlzLnNpZ25PdXRGaXJlYmFzZSgpO1xuICAgICAgICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2lnbk91dEZpcmViYXNlKCk7XG4gICAgICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuIEluaWNpYXIgc2luY3Jvbml6YWNpw7NuIGVudHJlIHBlc3Rhw7Fhc1xuICAgIGlmICh0aGlzLmNvbmZpZz8uZW5hYmxlVGFiU3luYykge1xuICAgICAgdGhpcy5zeW5jU2VydmljZS5zdGFydCgpO1xuICAgICAgdGhpcy5zeW5jU3Vic2NyaXB0aW9uID0gdGhpcy5zeW5jU2VydmljZS5vbkV2ZW50JC5zdWJzY3JpYmUoZXZlbnQgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVTeW5jRXZlbnQoZXZlbnQpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldExvYWRpbmcoZmFsc2UpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVmcmVzaFRpbWVyKCk7XG4gICAgdGhpcy5zeW5jU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudGVhcmRvd25GaXJlc3RvcmVSQkFDU3luYygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFVVEVOVElDQUNJw5NOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWEgc2VzacOzbiBjb24gZW1haWwgeSBjb250cmFzZcOxYS5cbiAgICogRGV0ZWN0YSBhdXRvbcOhdGljYW1lbnRlIGxhIHBsYXRhZm9ybWEgcGFyYSBpZGVudGlmaWNhciBkaXNwb3NpdGl2b3MgbnVldm9zLlxuICAgKi9cbiAgc2lnbmluKHJlcXVlc3Q6IFNpZ25pblJlcXVlc3QpOiBPYnNlcnZhYmxlPFNpZ25pblJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyTUZBUGVuZGluZygpO1xuXG4gICAgLy8gQWdyZWdhciBpbmZvIGRlIHBsYXRhZm9ybWEgcGFyYSBkZXZpY2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgcGxhdGZvcm1JbmZvID0gdGhpcy5kZXRlY3RQbGF0Zm9ybUluZm8oKTtcbiAgICBjb25zdCBlbnJpY2hlZFJlcXVlc3Q6IFNpZ25pblJlcXVlc3QgPSB7XG4gICAgICAuLi5yZXF1ZXN0LFxuICAgICAgcGxhdGZvcm06IHJlcXVlc3QucGxhdGZvcm0gPz8gcGxhdGZvcm1JbmZvLnBsYXRmb3JtLFxuICAgICAgYnJvd3NlcjogcmVxdWVzdC5icm93c2VyID8/IHBsYXRmb3JtSW5mby5icm93c2VyLFxuICAgICAgb3M6IHJlcXVlc3Qub3MgPz8gcGxhdGZvcm1JbmZvLm9zLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8U2lnbmluUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vc2lnbmluYCwgZW5yaWNoZWRSZXF1ZXN0KS5waXBlKFxuICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm1mYVJlcXVpcmVkKSB7XG4gICAgICAgICAgLy8gTUZBIHJlcXVlcmlkbyAtIGd1YXJkYXIgZXN0YWRvIHRlbXBvcmFsXG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0TUZBUGVuZGluZyh7XG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG1mYVRva2VuOiByZXNwb25zZS5tZmFUb2tlbiEsXG4gICAgICAgICAgICBtZXRob2Q6IHJlc3BvbnNlLm1mYU1ldGhvZCEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAvLyBMb2dpbiBleGl0b3NvIHNpbiBNRkFcbiAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlKTtcblxuICAgICAgICAgIC8vIE5vdGlmaWNhciBzaSBlcyB1biBkaXNwb3NpdGl2byBudWV2b1xuICAgICAgICAgIGlmIChyZXNwb25zZS5pc05ld0RldmljZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gTmV3IGRldmljZSBkZXRlY3RlZDonLCByZXNwb25zZS5kZXZpY2VJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gT0FVVEggKExvZ2luIHNvY2lhbClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBzZXNpw7NuIGNvbiBPQXV0aCAoR29vZ2xlLCBBcHBsZSwgTWljcm9zb2Z0KS5cbiAgICogQWJyZSB1biBwb3B1cCBwYXJhIGVsIGZsdWpvIGRlIGF1dGVudGljYWNpw7NuLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBQcm92ZWVkb3IgT0F1dGggKCdnb29nbGUnLCAnYXBwbGUnLCAnbWljcm9zb2Z0JylcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBxdWUgZW1pdGUgU2lnbmluUmVzcG9uc2UgY3VhbmRvIHNlIGNvbXBsZXRhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5hdXRoLnNpZ25pbldpdGhPQXV0aCgnZ29vZ2xlJykuc3Vic2NyaWJlKHtcbiAgICogICBuZXh0OiAoKSA9PiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nXSksXG4gICAqICAgZXJyb3I6IChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ09BdXRoIGZhaWxlZDonLCBlcnIpXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHNpZ25pbldpdGhPQXV0aChwcm92aWRlcjogT0F1dGhQcm92aWRlcik6IE9ic2VydmFibGU8U2lnbmluUmVzcG9uc2U+IHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhckVycm9yKCk7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJNRkFQZW5kaW5nKCk7XG5cbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2Uuc3RhcnRGbG93KHByb3ZpZGVyKS5waXBlKFxuICAgICAgdGFwKHJlc3VsdCA9PiB7XG4gICAgICAgIC8vIE1GQSByZXF1ZXJpZG8gdHJhcyBPQXV0aCDigJQgZ3VhcmRhciBlc3RhZG8gdGVtcG9yYWwsIE5PIGF1dGVudGljYXIuXG4gICAgICAgIC8vIEVsIGxvZ2luIGNvbXBvbmVudCByZWFjY2lvbmEgYSBgbWZhUGVuZGluZygpYCB5IGFicmUgZWwgbW9kYWwgdmVyaWZ5LlxuICAgICAgICBpZiAocmVzdWx0Lm1mYVJlcXVpcmVkKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0TUZBUGVuZGluZyh7XG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG1mYVRva2VuOiByZXN1bHQubWZhVG9rZW4hLFxuICAgICAgICAgICAgbWV0aG9kOiByZXN1bHQubWZhTWV0aG9kISxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0aXIgT0F1dGhSZXN1bHQgYSBTaWduaW5SZXNwb25zZSBjb21wYXRpYmxlXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBTaWduaW5SZXNwb25zZSA9IHtcbiAgICAgICAgICBvcGVyYXRpb25JZDogJ29hdXRoJyxcbiAgICAgICAgICBhY2Nlc3NUb2tlbjogcmVzdWx0LmFjY2Vzc1Rva2VuLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVzdWx0LnJlZnJlc2hUb2tlbixcbiAgICAgICAgICBmaXJlYmFzZVRva2VuOiByZXN1bHQuZmlyZWJhc2VUb2tlbixcbiAgICAgICAgICBleHBpcmVzSW46IHJlc3VsdC5leHBpcmVzSW4sXG4gICAgICAgICAgcm9sZXM6IHJlc3VsdC5yb2xlcyxcbiAgICAgICAgICBwZXJtaXNzaW9uczogcmVzdWx0LnBlcm1pc3Npb25zLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKHJlc3VsdCA9PlxuICAgICAgICByZXN1bHQubWZhUmVxdWlyZWRcbiAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbklkOiAnb2F1dGgnLFxuICAgICAgICAgICAgICBtZmFSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbWZhVG9rZW46IHJlc3VsdC5tZmFUb2tlbixcbiAgICAgICAgICAgICAgbWZhTWV0aG9kOiByZXN1bHQubWZhTWV0aG9kLFxuICAgICAgICAgICAgfSBhcyBTaWduaW5SZXNwb25zZSlcbiAgICAgICAgICA6ICh7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbklkOiAnb2F1dGgnLFxuICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogcmVzdWx0LmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgICByZWZyZXNoVG9rZW46IHJlc3VsdC5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICAgIGZpcmViYXNlVG9rZW46IHJlc3VsdC5maXJlYmFzZVRva2VuLFxuICAgICAgICAgICAgICBleHBpcmVzSW46IHJlc3VsdC5leHBpcmVzSW4sXG4gICAgICAgICAgICAgIHJvbGVzOiByZXN1bHQucm9sZXMsXG4gICAgICAgICAgICAgIHBlcm1pc3Npb25zOiByZXN1bHQucGVybWlzc2lvbnMsXG4gICAgICAgICAgICB9IGFzIFNpZ25pblJlc3BvbnNlKVxuICAgICAgKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICBjb25zdCBhdXRoRXJyb3I6IEF1dGhFcnJvciA9IHtcbiAgICAgICAgICBjb2RlOiBlcnJvci5jb2RlIHx8ICdPQVVUSF9FUlJPUicsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCAnRXJyb3IgZGUgYXV0ZW50aWNhY2nDs24gT0F1dGgnLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRFcnJvcihhdXRoRXJyb3IpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBhdXRoRXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZpbmN1bGEgdW4gcHJvdmVlZG9yIE9BdXRoIGFkaWNpb25hbCBhIGxhIGN1ZW50YSBhY3R1YWwuXG4gICAqIFJlcXVpZXJlIHF1ZSBlbCB1c3VhcmlvIGVzdMOpIGF1dGVudGljYWRvLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBQcm92ZWVkb3IgT0F1dGggYSB2aW5jdWxhclxuICAgKi9cbiAgbGlua09BdXRoUHJvdmlkZXIocHJvdmlkZXI6IE9BdXRoUHJvdmlkZXIpOiBPYnNlcnZhYmxlPHsgc3VjY2VzczogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnN0YXJ0TGlua0Zsb3cocHJvdmlkZXIpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4gKHsgc3VjY2VzczogdHJ1ZSB9KSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgY29uc3QgYXV0aEVycm9yOiBBdXRoRXJyb3IgPSB7XG4gICAgICAgICAgY29kZTogZXJyb3IuY29kZSB8fCAnTElOS19FUlJPUicsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCAnRXJyb3IgYWwgdmluY3VsYXIgcHJvdmVlZG9yJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RXJyb3IoYXV0aEVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gYXV0aEVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxvcyBwcm92ZWVkb3JlcyBPQXV0aCB2aW5jdWxhZG9zIGFsIHVzdWFyaW8uXG4gICAqL1xuICBnZXRMaW5rZWRQcm92aWRlcnMoKTogT2JzZXJ2YWJsZTxMaW5rZWRQcm92aWRlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLmdldExpbmtlZFByb3ZpZGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3ZpbmN1bGEgdW4gcHJvdmVlZG9yIE9BdXRoIGRlIGxhIGN1ZW50YS5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gUHJvdmVlZG9yIGEgZGVzdmluY3VsYXJcbiAgICovXG4gIHVubGlua09BdXRoUHJvdmlkZXIocHJvdmlkZXI6IE9BdXRoUHJvdmlkZXIpOiBPYnNlcnZhYmxlPHsgc3VjY2VzczogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnVubGlua1Byb3ZpZGVyKHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RhYmxlY2UgY29udHJhc2XDsWEgcGFyYSB1c3VhcmlvcyBxdWUgc29sbyB0aWVuZW4gT0F1dGguXG4gICAqIFBlcm1pdGUgcXVlIHVzdWFyaW9zIE9BdXRoLW9ubHkgcHVlZGFuIHRhbWJpw6luIHVzYXIgZW1haWwvcGFzc3dvcmQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIE51ZXZhIGNvbnRyYXNlw7FhXG4gICAqL1xuICBzZXRQYXNzd29yZEZvck9BdXRoVXNlcihwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5zZXRQYXNzd29yZChwYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSBjb250cmFzZcOxYSBlc3RhYmxlY2lkYS5cbiAgICogw5p0aWwgcGFyYSBtb3N0cmFyL29jdWx0YXIgb3BjaW9uZXMgZGUgY2FtYmlvIGRlIGNvbnRyYXNlw7FhLlxuICAgKi9cbiAgY2hlY2tIYXNQYXNzd29yZCgpOiBPYnNlcnZhYmxlPEhhc1Bhc3N3b3JkUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2UuaGFzUGFzc3dvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RyYSB1biBudWV2byB1c3VhcmlvLlxuICAgKiBFbCB1c3VhcmlvIHF1ZWRhIGVuIGVzdGFkbyBQRU5ESU5HIGhhc3RhIHZlcmlmaWNhciBzdSBlbWFpbC5cbiAgICovXG4gIHNpZ251cChyZXF1ZXN0OiBTaWdudXBSZXF1ZXN0KTogT2JzZXJ2YWJsZTxTaWdudXBSZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFNpZ251cFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3NpZ251cGAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIGVtYWlsIGNvbiBjw7NkaWdvIGRlIDYgZMOtZ2l0b3MuXG4gICAqIFNpIGVzIGV4aXRvc28sIGhhY2UgYXV0by1sb2dpbiB5IHJldG9ybmEgdG9rZW5zLlxuICAgKi9cbiAgdmVyaWZ5RW1haWwocmVxdWVzdDogVmVyaWZ5RW1haWxSZXF1ZXN0KTogT2JzZXJ2YWJsZTxWZXJpZnlFbWFpbFJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFZlcmlmeUVtYWlsUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vdmVyaWZ5LWVtYWlsYCwgcmVxdWVzdCkucGlwZShcbiAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25zZS52ZXJpZmllZCAmJiByZXNwb25zZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgIC8vIEF1dG8tbG9naW46IGd1YXJkYXIgdG9rZW5zIHkgYWN0dWFsaXphciBlc3RhZG9cbiAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlIGFzIHVua25vd24gYXMgU2lnbmluUmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVlbnbDrWEgY8OzZGlnbyBkZSB2ZXJpZmljYWNpw7NuIGFsIGVtYWlsLlxuICAgKi9cbiAgcmVzZW5kQ29kZShyZXF1ZXN0OiBSZXNlbmRDb2RlUmVxdWVzdCk6IE9ic2VydmFibGU8UmVzZW5kQ29kZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVzZW5kQ29kZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Jlc2VuZC1jb2RlYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2EgY8OzZGlnbyBNRkEuXG4gICAqL1xuICB2ZXJpZnlNRkEoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFWZXJpZnlSZXNwb25zZT4ge1xuICAgIGNvbnN0IG1mYVN0YXRlID0gdGhpcy5tZmFQZW5kaW5nKCk7XG4gICAgaWYgKCFtZmFTdGF0ZS5tZmFUb2tlbikge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gKHtcbiAgICAgICAgY29kZTogJ01GQV9OT1RfUEVORElORycsXG4gICAgICAgIG1lc3NhZ2U6ICdObyBoYXkgdmVyaWZpY2FjacOzbiBNRkEgcGVuZGllbnRlJyxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFWZXJpZnlSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdmVyaWZ5YCwge1xuICAgICAgICBtZmFUb2tlbjogbWZhU3RhdGUubWZhVG9rZW4sXG4gICAgICAgIGNvZGUsXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJNRkFQZW5kaW5nKCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzY2EgZWwgdG9rZW4gZGUgYWNjZXNvLlxuICAgKiBJbXBsZW1lbnRhIHRva2VuIHJvdGF0aW9uOiBjYWRhIHJlZnJlc2ggZ2VuZXJhIHVuIG51ZXZvIHJlZnJlc2ggdG9rZW5cbiAgICogcXVlIGVsIGNsaWVudGUgZGViZSBndWFyZGFyIHBhcmEgZWwgcHLDs3hpbW8gcmVmcmVzaC5cbiAgICovXG4gIHJlZnJlc2hBY2Nlc3NUb2tlbigpOiBPYnNlcnZhYmxlPFJlZnJlc2hSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IHRoaXMuc3RhdGUoKS5yZWZyZXNoVG9rZW47XG4gICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICh7XG4gICAgICAgIGNvZGU6ICdOT19SRUZSRVNIX1RPS0VOJyxcbiAgICAgICAgbWVzc2FnZTogJ05vIGhheSB0b2tlbiBkZSByZWZyZXNjbycsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFJlZnJlc2hSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9yZWZyZXNoYCwgeyByZWZyZXNoVG9rZW4gfSkucGlwZShcbiAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IERhdGUubm93KCkgKyByZXNwb25zZS5leHBpcmVzSW4gKiAxMDAwO1xuXG4gICAgICAgIC8vIFRva2VuIHJvdGF0aW9uOiBndWFyZGFyIG51ZXZvIGFjY2VzcyB0b2tlbiBZIHJlZnJlc2ggdG9rZW5cbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4sIHJlc3BvbnNlLmV4cGlyZXNJbik7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVJlZnJlc2hUb2tlbihyZXNwb25zZS5yZWZyZXNoVG9rZW4pOyAvLyBOVUVWTzogZ3VhcmRhciByZWZyZXNoIHJvdGFkb1xuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY2Nlc3NUb2tlbihyZXNwb25zZS5hY2Nlc3NUb2tlbiwgZXhwaXJlc0F0KTtcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlUmVmcmVzaFRva2VuKHJlc3BvbnNlLnJlZnJlc2hUb2tlbik7IC8vIE5VRVZPOiBwZXJzaXN0aXIgcmVmcmVzaCByb3RhZG9cblxuICAgICAgICBpZiAodGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24gJiYgcmVzcG9uc2UuZmlyZWJhc2VUb2tlbikge1xuICAgICAgICAgIHRoaXMuc2lnbkluV2l0aEZpcmViYXNlKHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGFydFJlZnJlc2hUaW1lcigpO1xuICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1JFRlJFU0gnLFxuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVzcG9uc2UucmVmcmVzaFRva2VuLCAvLyBOVUVWTzogc2luY3Jvbml6YXIgZW50cmUgdGFic1xuICAgICAgICAgICAgZXhwaXJlc0F0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5sb2dvdXQoKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYSBhdXRlbnRpY2FjacOzbiBleGl0b3NhIGRlc2RlIGZ1ZW50ZXMgZXh0ZXJuYXMgKE9BdXRoLCBldGMpLlxuICAgKiBHdWFyZGEgdG9rZW5zLCBhY3R1YWxpemEgZXN0YWRvLCBpbmljaWEgRmlyZWJhc2Ugc2kgY29ycmVzcG9uZGUuXG4gICAqXG4gICAqIEBwYXJhbSBhdXRoUmVzdWx0IC0gUmVzdWx0YWRvIGRlIGF1dGVudGljYWNpw7NuIGNvbiB0b2tlbnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBEZXNkZSB1biBmbHVqbyBPQXV0aCBleHRlcm5vXG4gICAqIGV4dGVybmFsT0F1dGguc2lnbkluKCkuc3Vic2NyaWJlKHtcbiAgICogICBuZXh0OiAocmVzdWx0KSA9PiB7XG4gICAqICAgICB0aGlzLmF1dGhTZXJ2aWNlLnNldEV4dGVybmFsQXV0aChyZXN1bHQpO1xuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0RXh0ZXJuYWxBdXRoKGF1dGhSZXN1bHQ6IHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGZpcmViYXNlVG9rZW4/OiBzdHJpbmc7XG4gICAgZXhwaXJlc0luOiBudW1iZXI7XG4gICAgcm9sZXM/OiBzdHJpbmdbXTtcbiAgICBwZXJtaXNzaW9ucz86IHN0cmluZ1tdO1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aCh7XG4gICAgICAuLi5hdXRoUmVzdWx0LFxuICAgICAgb3BlcmF0aW9uSWQ6ICdleHRlcm5hbC1hdXRoJyxcbiAgICAgIHRva2VuVHlwZTogJ0JlYXJlcicsXG4gICAgfSBhcyBTaWduaW5SZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2llcnJhIHNlc2nDs24gdHJhcyBwZWRpciBjb25maXJtYWNpw7NuIGFsIHVzdWFyaW8uXG4gICAqXG4gICAqIE11ZXN0cmEgdW4gZGnDoWxvZ28gbmF0aXZvIChlc3RpbG8gZGVzdHJ1Y3Rpdm8pLiBTaSBlbCB1c3VhcmlvIGNvbmZpcm1hLFxuICAgKiBlamVjdXRhIGBsb2dvdXQoKWAuIFNpIGNhbmNlbGEsIG5vIHBhc2EgbmFkYS5cbiAgICpcbiAgICogVGV4dG8gcG9yIGRlZmVjdG8gZGVzZGUgYF9nbG9iYWxgIGkxOG46IGBsb2dvdXRDb25maXJtVGl0bGVgLFxuICAgKiBgbG9nb3V0Q29uZmlybU1lc3NhZ2VgLCBgbG9nb3V0YCwgYGNhbmNlbGAuIE92ZXJyaWRlIHZpYSBgb3B0c2AuXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgc2kgZWwgdXN1YXJpbyBjb25maXJtw7MgKGxvZ291dCBlamVjdXRhZG8pLCBmYWxzZSBzaSBjYW5jZWzDsy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogb25Mb2dvdXRDbGljaygpIHsgdGhpcy5hdXRoLmxvZ291dFdpdGhDb25maXJtYXRpb24oKTsgfVxuICAgKi9cbiAgYXN5bmMgbG9nb3V0V2l0aENvbmZpcm1hdGlvbihvcHRzPzoge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgY29uZmlybVRleHQ/OiBzdHJpbmc7XG4gICAgY2FuY2VsVGV4dD86IHN0cmluZztcbiAgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHQgPSAoa2V5OiBzdHJpbmcsIGZhbGxiYWNrOiBzdHJpbmcpID0+IHRoaXMuaTE4blNlcnZpY2U/LnQoa2V5KSB8fCBmYWxsYmFjaztcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybURlc3RydWN0aXZlKHtcbiAgICAgIHRpdGxlOiBvcHRzPy50aXRsZSA/PyB0KCdsb2dvdXRDb25maXJtVGl0bGUnLCAnQ2VycmFyIHNlc2nDs24nKSxcbiAgICAgIG1lc3NhZ2U6IG9wdHM/Lm1lc3NhZ2UgPz8gdCgnbG9nb3V0Q29uZmlybU1lc3NhZ2UnLCAnwr9TZWd1cm8gcXVlIGRlc2VhcyBjZXJyYXIgc2VzacOzbj8nKSxcbiAgICAgIGNvbmZpcm1CdXR0b246IHsgdGV4dDogb3B0cz8uY29uZmlybVRleHQgPz8gdCgnbG9nb3V0JywgJ0NlcnJhciBzZXNpw7NuJykgfSxcbiAgICAgIGNhbmNlbEJ1dHRvbjogeyB0ZXh0OiBvcHRzPy5jYW5jZWxUZXh0ID8/IHQoJ2NhbmNlbCcsICdDYW5jZWxhcicpIH0sXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0LmNvbmZpcm1lZCkge1xuICAgICAgYXdhaXQgdGhpcy5sb2dvdXQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2llcnJhIHNlc2nDs24uXG4gICAqL1xuICBhc3luYyBsb2dvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5zdGF0ZSgpLnJlZnJlc2hUb2tlbjtcblxuICAgIC8vIEVsaW1pbmFyIGRpc3Bvc2l0aXZvIGRlbCBiYWNrZW5kIGFudGVzIGRlIGNlcnJhciBzZXNpw7NuXG4gICAgYXdhaXQgdGhpcy51bnJlZ2lzdGVyRGV2aWNlKCk7XG5cbiAgICAvLyBOb3RpZmljYXIgYWwgYmFja2VuZCAoZmlyZSBhbmQgZm9yZ2V0KVxuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAucG9zdChgJHt0aGlzLmJhc2VVcmx9L2xvZ291dGAsIHsgcmVmcmVzaFRva2VuIH0pXG4gICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gQ2VycmFyIHNlc2nDs24gZGUgRmlyZWJhc2Ugc2kgZXN0w6EgaW50ZWdyYWRvXG4gICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcblxuICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHsgdHlwZTogJ0xPR09VVCcgfSk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuY29uZmlnPy5sb2dpblJvdXRlXSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUZBIFNFVFVQICh1c3VhcmlvIGF1dGVudGljYWRvKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ29uZmlndXJhIE1GQSBwYXJhIGVsIHVzdWFyaW8uXG4gICAqL1xuICBzZXR1cE1GQShtZXRob2Q6IE1GQU1ldGhvZCwgcGhvbmU/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1GQVNldHVwUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFTZXR1cFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS9zZXR1cGAsIHsgbWV0aG9kLCBwaG9uZSB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maXJtYSBsYSBjb25maWd1cmFjacOzbiBkZSBNRkEuXG4gICAqL1xuICBjb25maXJtTUZBKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8TUZBQ29uZmlybVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8TUZBQ29uZmlybVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS9jb25maXJtYCwgeyBjb2RlIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2hhYmlsaXRhIE1GQS4gQWNlcHRhIGBwYXNzd29yZGAgbyBgbWZhQ29kZWAgKHVubyByZXF1ZXJpZG8pLlxuICAgKiBgbWZhQ29kZWAgZXMgcGFyYSB1c3VhcmlvcyBPQXV0aC1vbmx5IGNvbiBUT1RQIHF1ZSBubyB0aWVuZW4gY29udHJhc2XDsWEuXG4gICAqL1xuICBkaXNhYmxlTUZBKGlucHV0OiBNRkFEaXNhYmxlUmVxdWVzdCk6IE9ic2VydmFibGU8TUZBRGlzYWJsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8TUZBRGlzYWJsZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS9kaXNhYmxlYCwgaW5wdXQpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgc2VuZE1GQURpc2FibGVDb2RlKCk6IE9ic2VydmFibGU8eyBvcGVyYXRpb25JZDogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDx7IG9wZXJhdGlvbklkOiBzdHJpbmcgfT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvZGlzYWJsZS1jb2RlYCwge30pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRPVFAgTUZBIChHb29nbGUgQXV0aGVudGljYXRvcilcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBjb25maWd1cmFjacOzbiBkZSBUT1RQIE1GQS5cbiAgICogUmV0b3JuYSBlbCBzZWNyZXRvLCBVUkwgcGFyYSBRUiBjb2RlIHkgY8OzZGlnb3MgZGUgcmVzcGFsZG8uXG4gICAqL1xuICBzZXR1cFRPVFAoKTogT2JzZXJ2YWJsZTxUT1RQU2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFRPVFBTZXR1cFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS90b3RwL3NldHVwYCwge30pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIGVsIGPDs2RpZ28gVE9UUCB5IGFjdGl2YSBNRkEuXG4gICAqIERlYmUgbGxhbWFyc2UgZGVzcHXDqXMgZGUgc2V0dXBUT1RQIGNvbiBlbCBjw7NkaWdvIGRlbCBhdXRoZW50aWNhdG9yLlxuICAgKi9cbiAgdmVyaWZ5VE9UUFNldHVwKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8VE9UUFZlcmlmeVNldHVwUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxUT1RQVmVyaWZ5U2V0dXBSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC92ZXJpZnlgLCB7IGNvZGUgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnZW5lcmEgbG9zIGPDs2RpZ29zIGRlIHJlc3BhbGRvIFRPVFAuXG4gICAqIExvcyBjw7NkaWdvcyBhbnRlcmlvcmVzIHNvbiBpbnZhbGlkYWRvcy5cbiAgICovXG4gIHJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpOiBPYnNlcnZhYmxlPFJlZ2VuZXJhdGVCYWNrdXBDb2Rlc1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVnZW5lcmF0ZUJhY2t1cENvZGVzUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvYmFja3VwLWNvZGVzYCwge30pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGEgY2FudGlkYWQgZGUgY8OzZGlnb3MgZGUgcmVzcGFsZG8gcmVzdGFudGVzLlxuICAgKi9cbiAgZ2V0QmFja3VwQ29kZXNDb3VudCgpOiBPYnNlcnZhYmxlPEJhY2t1cENvZGVzQ291bnRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8QmFja3VwQ29kZXNDb3VudFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS90b3RwL2JhY2t1cC1jb2Rlcy9jb3VudGApXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2FjdGl2YSBUT1RQIE1GQSAocmVxdWllcmUgY29udHJhc2XDsWEpLlxuICAgKi9cbiAgZGlzYWJsZVRPVFAocGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8VE9UUERpc2FibGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFRPVFBEaXNhYmxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvZGlzYWJsZWAsIHsgcGFzc3dvcmQgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gT1JHQU5JWkFDSU9ORVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENhbWJpYSBsYSBvcmdhbml6YWNpw7NuIGFjdGl2YSBkZWwgdXN1YXJpby5cbiAgICogR2VuZXJhIHVuIG51ZXZvIEZpcmViYXNlIHRva2VuIGNvbiBlbCBhY3RpdmVPcmcgYWN0dWFsaXphZG8uXG4gICAqXG4gICAqIEBwYXJhbSBvcmdhbml6YXRpb25JZCAtIElEIGRlIGxhIG9yZ2FuaXphY2nDs24gYSBsYSBxdWUgY2FtYmlhclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbiBlbCBudWV2byBGaXJlYmFzZSB0b2tlbiB5IGFjdGl2ZU9yZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC5zd2l0Y2hPcmcoJ29yZ194eXo3ODknKSk7XG4gICAqIC8vIEZpcmViYXNlIHlhIGVzdMOhIHJlLWF1dGVudGljYWRvIGNvbiBsYSBudWV2YSBvcmdcbiAgICogY29uc3QgYWN0aXZlT3JnID0gYXdhaXQgdGhpcy5maXJlYmFzZS5nZXRBY3RpdmVPcmcoKTtcbiAgICogYGBgXG4gICAqL1xuICBzd2l0Y2hPcmcob3JnYW5pemF0aW9uSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U3dpdGNoT3JnUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8U3dpdGNoT3JnUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vc3dpdGNoLW9yZ2AsIHsgb3JnYW5pemF0aW9uSWQgfSkucGlwZShcbiAgICAgIHN3aXRjaE1hcChyZXNwb25zZSA9PiB7XG4gICAgICAgIC8vIFJlLWF1dGVudGljYXIgZW4gRmlyZWJhc2UgY29uIGVsIG51ZXZvIHRva2VuXG4gICAgICAgIC8vIFVzYXIgc3dpdGNoTWFwICsgZnJvbSBwYXJhIGVzcGVyYXIgYSBxdWUgRmlyZWJhc2UgY29tcGxldGVcbiAgICAgICAgY29uc3QgZmlyZWJhc2VBdXRoJCA9IHJlc3BvbnNlLmZpcmViYXNlVG9rZW5cbiAgICAgICAgICA/IGZyb20odGhpcy5zaWduSW5XaXRoRmlyZWJhc2UocmVzcG9uc2UuZmlyZWJhc2VUb2tlbikpXG4gICAgICAgICAgOiBvZih1bmRlZmluZWQpO1xuXG4gICAgICAgIHJldHVybiBmaXJlYmFzZUF1dGgkLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEFjdHVhbGl6YXIgYWN0aXZlT3JnIGVuIGVsIHN0YXRlIGxvY2FsXG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVBY3RpdmVPcmcocmVzcG9uc2UuYWN0aXZlT3JnKTtcbiAgICAgICAgICAgIC8vIFBlcnNpc3RpciBlbCBudWV2byBhY2Nlc3MgdG9rZW4gKGluY2x1eWUgYWN0aXZlT3JnIGFjdHVhbGl6YWRvKS5cbiAgICAgICAgICAgIC8vIFNpbiBlc3RvLCBlbCBib290c3RyYXAgcG9zdC1yZWZyZXNoIHVzYSBlbCBKV1QgY2FjaGVhZG8gY29uIGxhIG9yZyBhbnRlcmlvci5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgKHJlc3BvbnNlLmV4cGlyZXNJbiA/PyA5MDApICogMTAwMDtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4sIHJlc3BvbnNlLmV4cGlyZXNJbiA/PyA5MDApO1xuICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY2Nlc3NUb2tlbihyZXNwb25zZS5hY2Nlc3NUb2tlbiwgZXhwaXJlc0F0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5vdGlmaWNhciBjYW1iaW8gYSBvdHJhcyBwZXN0YcOxYXNcbiAgICAgICAgICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHtcbiAgICAgICAgICAgICAgdHlwZTogJ09SR19TV0lUQ0gnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB7IGFjdGl2ZU9yZzogcmVzcG9uc2UuYWN0aXZlT3JnIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyBSZXRvcm5hciByZXNwb25zZSBvcmlnaW5hbCBkZXNwdcOpcyBkZSBxdWUgRmlyZWJhc2UgY29tcGxldGVcbiAgICAgICAgICBtYXAoKCkgPT4gcmVzcG9uc2UpXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUEVSRklMIERFIFVTVUFSSU9cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgcGVyZmlsIGRlbCB1c3VhcmlvIGF1dGVudGljYWRvLlxuICAgKiBJbmNsdXllIGluZm9ybWFjacOzbiBkZSBNRkEgeSB0ZWzDqWZvbm8uIEhpZHJhdGEgZWwgc3RhdGUgYXV0b23DoXRpY2FtZW50ZVxuICAgKiBjb24gYG5hbWUvaGFuZGxlL2F2YXRhclVybC9waG9uZWAgcGFyYSBxdWUgYGF1dGgudXNlcigpYCBsb3MgcmV0b3JuZS5cbiAgICovXG4gIGdldFByb2ZpbGUoKTogT2JzZXJ2YWJsZTxHZXRQcm9maWxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxHZXRQcm9maWxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcHJvZmlsZWApLnBpcGUoXG4gICAgICB0YXAocHJvZmlsZSA9PlxuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQcm9maWxlRmllbGRzKHtcbiAgICAgICAgICBuYW1lOiBwcm9maWxlLm5hbWUsXG4gICAgICAgICAgaGFuZGxlOiBwcm9maWxlLmhhbmRsZSA/PyBudWxsLFxuICAgICAgICAgIGF2YXRhclVybDogcHJvZmlsZS5hdmF0YXJVcmwgPz8gbnVsbCxcbiAgICAgICAgICBwaG9uZTogcHJvZmlsZS5waG9uZSA/PyBudWxsLFxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsaXphIGVsIHBlcmZpbCBkZWwgdXN1YXJpby4gU2luY3Jvbml6YSBzdGF0ZSBjb24gbG9zIG51ZXZvcyB2YWx1ZXNcbiAgICogKG5hbWUvcGhvbmUpIOKAlCBlbCBiYWNrZW5kIHJlc3BvbnNlIG5vIGxvcyBlY2hvJ2EgcGVybyBlbCBjYWxsZXIgeWEgdGllbmVcbiAgICogbG9zIHZhbG9yZXMgcXVlIG1hbmTDsy5cbiAgICovXG4gIHVwZGF0ZVByb2ZpbGUocmVxdWVzdDogVXBkYXRlUHJvZmlsZVJlcXVlc3QpOiBPYnNlcnZhYmxlPFVwZGF0ZVByb2ZpbGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVwZGF0ZVByb2ZpbGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9wcm9maWxlYCwgcmVxdWVzdCkucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQcm9maWxlRmllbGRzKHJlcXVlc3QpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsaXphIGVsIGF2YXRhciBkZWwgdXN1YXJpbyBlbiBlbCBiYWNrZW5kLiBTaW5jcm9uaXphIHN0YXRlIGNvbiBlbFxuICAgKiBgYXZhdGFyVXJsYCByZXRvcm5hZG8gcGFyYSBxdWUgZWwgaGVhZGVyIC8gZGFzaGJvYXJkIHNlIHJlZnJlc3F1ZW4gc2luXG4gICAqIG5lY2VzaWRhZCBkZSB1biBnZXRQcm9maWxlIGFkaWNpb25hbC5cbiAgICovXG4gIHVwZGF0ZUF2YXRhcihyZXF1ZXN0OiBVcGRhdGVBdmF0YXJSZXF1ZXN0KTogT2JzZXJ2YWJsZTxVcGRhdGVBdmF0YXJSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVwZGF0ZUF2YXRhclJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Byb2ZpbGUvYXZhdGFyYCwgcmVxdWVzdCkucGlwZShcbiAgICAgIHRhcChyZXMgPT4gdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyh7IGF2YXRhclVybDogcmVzLmF2YXRhclVybCB9KSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJFQ1VQRVJBQ0nDk04gREUgQ09OVFJBU0XDkUFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBlbCBwcm9jZXNvIGRlIHJlY3VwZXJhY2nDs24gZGUgY29udHJhc2XDsWEuXG4gICAqIEVudsOtYSB1biBjw7NkaWdvIGFsIGVtYWlsIGRlbCB1c3VhcmlvLlxuICAgKi9cbiAgZm9yZ290UGFzc3dvcmQocmVxdWVzdDogRm9yZ290UGFzc3dvcmRSZXF1ZXN0KTogT2JzZXJ2YWJsZTxGb3Jnb3RQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8Rm9yZ290UGFzc3dvcmRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9mb3Jnb3QtcGFzc3dvcmRgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldGVhIGxhIGNvbnRyYXNlw7FhIHVzYW5kbyBlbCBjw7NkaWdvIGVudmlhZG8gcG9yIGVtYWlsLlxuICAgKi9cbiAgcmVzZXRQYXNzd29yZChyZXF1ZXN0OiBSZXNldFBhc3N3b3JkUmVxdWVzdCk6IE9ic2VydmFibGU8UmVzZXRQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVzZXRQYXNzd29yZFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Jlc2V0LXBhc3N3b3JkYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhIHVuYSBjdWVudGEgcHJlLWFwcm92aXNpb25hZGEgcG9yIHVuYSBvcmdhbml6YWNpw7NuIChBRFItMDIzKTogZGVmaW5lXG4gICAqIGxhIGNvbnRyYXNlw7FhIGNvbiBlbCB0b2tlbiBkZWwgZW5sYWNlIGRlIGVtYWlsLiBFbiDDqXhpdG8gZWwgYmFja2VuZCBkZXZ1ZWx2ZVxuICAgKiB0b2tlbnMgZGUgYXV0by1zaWduaW4g4oaSIGVsIHVzdWFyaW8gcXVlZGEgbG9ndWVhZG8gKG1pc21vIGZsdWpvIHF1ZSB2ZXJpZnktZW1haWwpLlxuICAgKi9cbiAgYWN0aXZhdGVBY2NvdW50KHJlcXVlc3Q6IEFjdGl2YXRlQWNjb3VudFJlcXVlc3QpOiBPYnNlcnZhYmxlPEFjdGl2YXRlQWNjb3VudFJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBY3RpdmF0ZUFjY291bnRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9hY3RpdmF0ZWAsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UuYWN0aXZhdGVkICYmIHJlc3BvbnNlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSBhcyB1bmtub3duIGFzIFNpZ25pblJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbWJpYSBsYSBjb250cmFzZcOxYSBkZWwgdXN1YXJpbyBhdXRlbnRpY2Fkby5cbiAgICogUmVxdWllcmUgbGEgY29udHJhc2XDsWEgYWN0dWFsIHBhcmEgdmVyaWZpY2FjacOzbi5cbiAgICovXG4gIGNoYW5nZVBhc3N3b3JkKGN1cnJlbnRQYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxDaGFuZ2VQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogQ2hhbmdlUGFzc3dvcmRSZXF1ZXN0ID0geyBjdXJyZW50UGFzc3dvcmQsIG5ld1Bhc3N3b3JkIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8Q2hhbmdlUGFzc3dvcmRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9jaGFuZ2UtcGFzc3dvcmRgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDQU1CSU8gREUgRU1BSUwg4oCUIGZsdWpvIGRlIDMgcGFzb3NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgaW5pdGlhdGVFbWFpbENoYW5nZShcbiAgICBjdXJyZW50UGFzc3dvcmQ6IHN0cmluZyxcbiAgICBuZXdFbWFpbDogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8SW5pdGlhdGVFbWFpbENoYW5nZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogSW5pdGlhdGVFbWFpbENoYW5nZVJlcXVlc3QgPSB7IGN1cnJlbnRQYXNzd29yZCwgbmV3RW1haWwgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxJbml0aWF0ZUVtYWlsQ2hhbmdlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vZW1haWwvaW5pdGlhdGVgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIGNvbmZpcm1FbWFpbENoYW5nZVN0ZXAxKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8Q29uZmlybUVtYWlsQ2hhbmdlU3RlcDFSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IENvbmZpcm1FbWFpbENoYW5nZVN0ZXAxUmVxdWVzdCA9IHsgY29kZSB9O1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PENvbmZpcm1FbWFpbENoYW5nZVN0ZXAxUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vZW1haWwvY29uZmlybS8xYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICBjb25maXJtRW1haWxDaGFuZ2VTdGVwMihjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvbmZpcm1FbWFpbENoYW5nZVN0ZXAyUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlcXVlc3QgPSB7IGNvZGUgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2VtYWlsL2NvbmZpcm0vMmAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVMSU1JTkFDScOTTiBERSBDVUVOVEFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEVsaW1pbmEgbGEgY3VlbnRhIGRlbCB1c3VhcmlvIChzb2Z0IGRlbGV0ZSkuXG4gICAqIFJlcXVpZXJlIGNvbmZpcm1hY2nDs24gZGUgY29udHJhc2XDsWEgcG9yIHNlZ3VyaWRhZC5cbiAgICogRGVzcHXDqXMgZGUgZWxpbWluYXIsIGNpZXJyYSBzZXNpw7NuIGF1dG9tw6F0aWNhbWVudGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIENvbnRyYXNlw7FhIGFjdHVhbCBwYXJhIGNvbmZpcm1hclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbiByZXN1bHRhZG8gZGUgbGEgZWxpbWluYWNpw7NuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXN5bmMgY29uZmlybURlbGV0ZUFjY291bnQocGFzc3dvcmQ6IHN0cmluZykge1xuICAgKiAgIHRyeSB7XG4gICAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmF1dGguZGVsZXRlQWNjb3VudChwYXNzd29yZCkpO1xuICAgKiAgICAgY29uc29sZS5sb2cocmVzdWx0Lm1lc3NhZ2UpOyAvLyBcIlR1IGN1ZW50YSBoYSBzaWRvIGVsaW1pbmFkYS4uLlwiXG4gICAqICAgICAvLyBVc3VhcmlvIGVzIHJlZGlyaWdpZG8gYXV0b23DoXRpY2FtZW50ZSBhbCBsb2dpblxuICAgKiAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAqICAgICAvLyBNYW5lamFyIGVycm9yIChjb250cmFzZcOxYSBpbmNvcnJlY3RhLCBldGMpXG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgLyoqXG4gICAqIEVudsOtYSB1biBjw7NkaWdvIE9UUCBhbCBlbWFpbCBkZWwgdXN1YXJpbyBwYXJhIGNvbmZpcm1hciBsYSBlbGltaW5hY2nDs24uXG4gICAqIFNvbG8gYXBsaWNhIGEgdXN1YXJpb3MgT0F1dGggc2luIGNvbnRyYXNlw7FhIChgaGFzUGFzc3dvcmQoKSA9PT0gZmFsc2VgKS5cbiAgICovXG4gIHNlbmREZWxldGVBY2NvdW50Q29kZSgpOiBPYnNlcnZhYmxlPFNlbmREZWxldGVBY2NvdW50Q29kZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8U2VuZERlbGV0ZUFjY291bnRDb2RlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vYWNjb3VudC9kZWxldGUtY29kZWAsIHt9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIGxhIGN1ZW50YSBkZWwgdXN1YXJpbyAoc29mdCBkZWxldGUpLlxuICAgKiAtIFVzdWFyaW9zIGNvbiBjb250cmFzZcOxYTogcGFzYXIgYHsgcGFzc3dvcmQgfWAuXG4gICAqIC0gVXN1YXJpb3MgT0F1dGggc2luIGNvbnRyYXNlw7FhOiBwYXNhciBgeyBjb2RlIH1gIChvYnRlbmlkbyB2aWEgc2VuZERlbGV0ZUFjY291bnRDb2RlKS5cbiAgICogRGVzcHXDqXMgZGUgZWxpbWluYXIsIGNpZXJyYSBzZXNpw7NuIHkgcmVkaXJpZ2UgYWwgbG9naW4gYXV0b23DoXRpY2FtZW50ZS5cbiAgICovXG4gIGRlbGV0ZUFjY291bnQoY3JlZGVudGlhbHM6IHtcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICBjb2RlPzogc3RyaW5nO1xuICB9KTogT2JzZXJ2YWJsZTxEZWxldGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZGVsZXRlPERlbGV0ZUFjY291bnRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9hY2NvdW50YCwgeyBib2R5OiBjcmVkZW50aWFscyB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmRlbGV0ZWQpIHtcbiAgICAgICAgICAgIC8vIExpbXBpYXIgZXN0YWRvIHkgY2VycmFyIHNlc2nDs24gc2luIG5vdGlmaWNhciBhbCBiYWNrZW5kXG4gICAgICAgICAgICAvLyAobGEgc2VzacOzbiB5YSBmdWUgcmV2b2NhZGEgcG9yIGVsIGJhY2tlbmQpXG4gICAgICAgICAgICB0aGlzLnNpZ25PdXRGaXJlYmFzZSgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7IHR5cGU6ICdMT0dPVVQnIH0pO1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuY29uZmlnPy5sb2dpblJvdXRlXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBFUk1JU09TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxvcyBwZXJtaXNvcyBhY3R1YWxpemFkb3MgZGVsIGJhY2tlbmQuXG4gICAqL1xuICBmZXRjaFBlcm1pc3Npb25zKCk6IE9ic2VydmFibGU8R2V0UGVybWlzc2lvbnNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEdldFBlcm1pc3Npb25zUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcGVybWlzc2lvbnNgKS5waXBlKFxuICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMoXG4gICAgICAgICAgcmVzcG9uc2Uucm9sZXMsXG4gICAgICAgICAgcmVzcG9uc2UucGVybWlzc2lvbnMsXG4gICAgICAgICAgcmVzcG9uc2UuaXNTdXBlckFkbWluXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVBlcm1pc3Npb25zKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnUEVSTUlTU0lPTlNfVVBEQVRFJyB9KTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHBlcm1pc28gZXNwZWPDrWZpY28uXG4gICAqIEZvcm1hdG86IFwicmVzb3VyY2U6YWN0aW9uXCIgKGVqOiBcInRlbXBsYXRlczplZGl0XCIpXG4gICAqL1xuICBoYXNQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzU3VwZXJBZG1pbigpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IFtyZXNvdXJjZSwgYWN0aW9uXSA9IHBlcm1pc3Npb24uc3BsaXQoJzonKTtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucygpLnNvbWUocCA9PiB7XG4gICAgICBjb25zdCBbcFJlc291cmNlLCBwQWN0aW9uXSA9IHAuc3BsaXQoJzonKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChwUmVzb3VyY2UgPT09ICcqJyB8fCBwUmVzb3VyY2UgPT09IHJlc291cmNlKSAmJiAocEFjdGlvbiA9PT0gJyonIHx8IHBBY3Rpb24gPT09IGFjdGlvbilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSBhbGd1bm8gZGUgbG9zIHBlcm1pc29zIGRhZG9zLlxuICAgKi9cbiAgaGFzQW55UGVybWlzc2lvbihwZXJtaXNzaW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuc29tZShwID0+IHRoaXMuaGFzUGVybWlzc2lvbihwKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSB0b2RvcyBsb3MgcGVybWlzb3MgZGFkb3MuXG4gICAqL1xuICBoYXNBbGxQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuZXZlcnkocCA9PiB0aGlzLmhhc1Blcm1pc3Npb24ocCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgdW4gcm9sIGVzcGVjw61maWNvLlxuICAgKi9cbiAgaGFzUm9sZShyb2xlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlcygpLnNvbWUociA9PiByLnRvTG93ZXJDYXNlKCkgPT09IHJvbGUudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSEFORExFIChVU0VSTkFNRSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFjdHVhbGl6YSBlbCBoYW5kbGUgKEB1c2VybmFtZSkgZGVsIHVzdWFyaW8uXG4gICAqIEBwYXJhbSBoYW5kbGUgLSBOdWV2byBoYW5kbGUgKHNpbiBALCBlajogXCJ2aWN0b3J2XCIpXG4gICAqL1xuICB1cGRhdGVIYW5kbGUoaGFuZGxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVwZGF0ZUhhbmRsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8VXBkYXRlSGFuZGxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcHJvZmlsZS9oYW5kbGVgLCB7IGhhbmRsZSB9KS5waXBlKFxuICAgICAgdGFwKCgpID0+IHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVByb2ZpbGVGaWVsZHMoeyBoYW5kbGUgfSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSB1biBoYW5kbGUgZXN0w6EgZGlzcG9uaWJsZS5cbiAgICogQHBhcmFtIGhhbmRsZSAtIEhhbmRsZSBhIHZlcmlmaWNhciAoc2luIEApXG4gICAqL1xuICBjaGVja0hhbmRsZUF2YWlsYWJpbGl0eShoYW5kbGU6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hlY2tIYW5kbGVSZXNwb25zZT4ge1xuICAgIC8vIFNlcnZlciByZXNwb25zZTogeyBvcGVyYXRpb25JZCwgdXNlcj8sIGZvdW5kIH0uIGZvdW5kPXRydWUg4oaSIGhhbmRsZSB0YWtlbi5cbiAgICAvLyBMaWIgc2VtYW50aWM6IGF2YWlsYWJsZSA9ICFmb3VuZC5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0PHtcbiAgICAgICAgb3BlcmF0aW9uSWQ6IHN0cmluZztcbiAgICAgICAgZm91bmQ6IGJvb2xlYW47XG4gICAgICB9PihgJHt0aGlzLnVzZXJzQmFzZVVybH0vaGFuZGxlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGhhbmRsZSl9YClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAocmF3ID0+ICh7XG4gICAgICAgICAgb3BlcmF0aW9uSWQ6IHJhdy5vcGVyYXRpb25JZCxcbiAgICAgICAgICBoYW5kbGUsXG4gICAgICAgICAgYXZhaWxhYmxlOiAhcmF3LmZvdW5kLFxuICAgICAgICB9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBnZXQgYmFzZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZz8uYXBpVXJsfSR7dGhpcy5jb25maWc/LmF1dGhQcmVmaXh9YDtcbiAgfVxuXG4gIC8qKiBCYXNlIGZvciAvdjIvdXNlcnMgZW5kcG9pbnRzIChzZXBhcmF0ZSBmcm9tIC92Mi9hdXRoKS4gKi9cbiAgcHJpdmF0ZSBnZXQgdXNlcnNCYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuY29uZmlnPy5hcGlVcmx9L3YyL3VzZXJzYDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2U6IFNpZ25pblJlc3BvbnNlIHwgTUZBVmVyaWZ5UmVzcG9uc2UpOiB2b2lkIHtcbiAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgcmVzcG9uc2UuZXhwaXJlc0luISAqIDEwMDA7XG4gICAgY29uc3QgdG9rZW5EYXRhID0gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbihyZXNwb25zZS5hY2Nlc3NUb2tlbiEpO1xuICAgIGNvbnN0IGlzUHJlbWl1bSA9IHRva2VuRGF0YT8ucHJlbWl1bSA9PT0gdHJ1ZTtcblxuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEF1dGhlbnRpY2F0ZWQoe1xuICAgICAgYWNjZXNzVG9rZW46IHJlc3BvbnNlLmFjY2Vzc1Rva2VuISxcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVzcG9uc2UucmVmcmVzaFRva2VuISxcbiAgICAgIHVzZXJJZDogdG9rZW5EYXRhPy51aWQsXG4gICAgICBlbWFpbDogdG9rZW5EYXRhPy5lbWFpbCxcbiAgICAgIHJvbGVzOiByZXNwb25zZS5yb2xlcyB8fCBbXSxcbiAgICAgIHBlcm1pc3Npb25zOiByZXNwb25zZS5wZXJtaXNzaW9ucyB8fCBbXSxcbiAgICAgIGlzU3VwZXJBZG1pbjogcmVzcG9uc2UucGVybWlzc2lvbnM/LmluY2x1ZGVzKCcqOionKSB8fCBmYWxzZSxcbiAgICAgIGlzUHJlbWl1bSxcbiAgICAgIGV4cGlyZXNBdCxcbiAgICB9KTtcblxuICAgIGlmICh0b2tlbkRhdGE/Lm9yZykge1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKHRva2VuRGF0YS5vcmcpO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVN0YXRlKHtcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbiEsXG4gICAgICByZWZyZXNoVG9rZW46IHJlc3BvbnNlLnJlZnJlc2hUb2tlbiEsXG4gICAgICByb2xlczogcmVzcG9uc2Uucm9sZXMgfHwgW10sXG4gICAgICBwZXJtaXNzaW9uczogcmVzcG9uc2UucGVybWlzc2lvbnMgfHwgW10sXG4gICAgICBpc1N1cGVyQWRtaW46IHJlc3BvbnNlLnBlcm1pc3Npb25zPy5pbmNsdWRlcygnKjoqJykgfHwgZmFsc2UsXG4gICAgICBpc1ByZW1pdW0sXG4gICAgICBleHBpcmVzQXQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnN0YXJ0UmVmcmVzaFRpbWVyKCk7XG4gICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnTE9HSU4nIH0pO1xuXG4gICAgLy8gSW50ZWdyYWNpw7NuIGNvbiBGaXJlYmFzZVxuICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIGhhbmRsZVN1Y2Nlc3NmdWxBdXRoIC0gRmlyZWJhc2UgY2hlY2s6Jywge1xuICAgICAgZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbjogdGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24sXG4gICAgICBoYXNGaXJlYmFzZVRva2VuS2V5OiAnZmlyZWJhc2VUb2tlbicgaW4gcmVzcG9uc2UsXG4gICAgICBmaXJlYmFzZVRva2VuVmFsdWU6ICEhKHJlc3BvbnNlIGFzIGFueSkuZmlyZWJhc2VUb2tlbixcbiAgICAgIGZpcmViYXNlVG9rZW5MZW5ndGg6IChyZXNwb25zZSBhcyBhbnkpLmZpcmViYXNlVG9rZW4/Lmxlbmd0aCB8fCAwLFxuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24gJiZcbiAgICAgICdmaXJlYmFzZVRva2VuJyBpbiByZXNwb25zZSAmJlxuICAgICAgcmVzcG9uc2UuZmlyZWJhc2VUb2tlblxuICAgICkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdbVmFsdGVjaEF1dGhdIENhbGxpbmcgc2lnbkluV2l0aEZpcmViYXNlIHdpdGggdG9rZW4gbGVuZ3RoOicsXG4gICAgICAgIHJlc3BvbnNlLmZpcmViYXNlVG9rZW4ubGVuZ3RoXG4gICAgICApO1xuICAgICAgdGhpcy5zaWduSW5XaXRoRmlyZWJhc2UocmVzcG9uc2UuZmlyZWJhc2VUb2tlbik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbikge1xuICAgICAgLy8gRWwgbG9naW4gTk8gdHJham8gZmlyZWJhc2VUb2tlbiAoZWouIGZsdWpvIE9BdXRoIHF1ZSBsbyBwZXJkacOzKS4gRW4gdmV6XG4gICAgICAvLyBkZSBxdWVkYXIgc2luIHNlc2nDs24gZGUgRmlyZWJhc2UsIHJlY3Vycmltb3MgYWwgZmFsbGJhY2sgc2VsZi1oZWFsaW5nOlxuICAgICAgLy8gL3JlZnJlc2ggc8OtIGRldnVlbHZlIHVuIGZpcmViYXNlVG9rZW4gY29uZmlhYmxlLlxuICAgICAgY29uc29sZS5sb2coJ1tGQkF1dGhdIGxvZ2luIHJlc3BvbnNlIHNpbiBmaXJlYmFzZVRva2VuIOKGkiByZWN1cnJpZW5kbyBhIGZhbGxiYWNrIC9yZWZyZXNoJyk7XG4gICAgICB2b2lkIHRoaXMucmVlc3RhYmxpc2hGaXJlYmFzZVZpYVJlZnJlc2goJ2xvZ2luLW1pc3NpbmctZmlyZWJhc2UtdG9rZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2Ugc2lnbmluIHNraXBwZWQgLSBpbnRlZ3JhY2nDs24gRmlyZWJhc2UgZGVzYWN0aXZhZGEnKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RybyBhdXRvbcOhdGljbyBkZSBkaXNwb3NpdGl2byBwYXJhIHB1c2ggbm90aWZpY2F0aW9uc1xuICAgIGlmICh0aGlzLmNvbmZpZz8uZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlSWZOZWVkZWQoKTsgLy8gZmlyZS1hbmQtZm9yZ2V0XG4gICAgfVxuXG4gICAgLy8gU2luY3Jvbml6YXIgaWRpb21hIGRlbCB1c3VhcmlvIGNvbiBpMThuXG4gICAgaWYgKHRoaXMuaTE4blNlcnZpY2UgJiYgJ2xhbmd1YWdlJyBpbiByZXNwb25zZSAmJiByZXNwb25zZS5sYW5ndWFnZSkge1xuICAgICAgY29uc3QgdXNlckxhbmcgPSByZXNwb25zZS5sYW5ndWFnZSBhcyBJMThuTGFuZztcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy5pMThuU2VydmljZS5sYW5nKCk7XG4gICAgICBpZiAodXNlckxhbmcgIT09IGN1cnJlbnRMYW5nKSB7XG4gICAgICAgIHRoaXMuaTE4blNlcnZpY2Uuc2V0TGFuZ3VhZ2UodXNlckxhbmcpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZhbHRlY2hBdXRoXSBMYW5ndWFnZSBzeW5jZWQgdG86ICR7dXNlckxhbmd9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuZXIgRmlyZXN0b3JlIFJCQUMg4oCUIG9wdC1pbiB2aWEgZW5hYmxlRmlyZXN0b3JlUkJBQzogdHJ1ZVxuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlKCkudXNlcklkO1xuICAgIGlmICh1c2VySWQpIHtcbiAgICAgIHRoaXMuc2V0dXBGaXJlc3RvcmVSQkFDU3luYyh1c2VySWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLnRlYXJkb3duRmlyZXN0b3JlUkJBQ1N5bmMoKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5yZXNldCgpO1xuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBGaXJlc3RvcmVSQkFDU3luYyh1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZUZpcmVzdG9yZVJCQUMgfHwgIXRoaXMuZmlyZXN0b3JlSW5zdGFuY2UpIHJldHVybjtcbiAgICB0aGlzLnRlYXJkb3duRmlyZXN0b3JlUkJBQ1N5bmMoKTtcblxuICAgIGlmICghdGhpcy5maXJlYmFzZVNlcnZpY2UgfHwgdGhpcy5maXJlYmFzZVNlcnZpY2UuZmlyZWJhc2VBdXRoUmVhZHkoKSkge1xuICAgICAgLy8gRmlyZWJhc2Ugbm90IHVzZWQgb3IgYWxyZWFkeSBhdXRoZW50aWNhdGVkIOKAlCBhdHRhY2ggbGlzdGVuZXIgbm93LlxuICAgICAgdGhpcy5fYXR0YWNoRmlyZXN0b3JlUkJBQ0xpc3RlbmVyKHVzZXJJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpcmViYXNlIEF1dGggbm90IHJlYWR5IHlldC4gRmlyZXN0b3JlIHBlcm1pc3Npb24tZGVuaWVkIGVycm9ycyB0ZXJtaW5hdGVcbiAgICAgIC8vIG9uU25hcHNob3QgcGVybWFuZW50bHkgKG5vIGF1dG9tYXRpYyByZXRyeSB3aGVuIGF1dGggc3RhdGUgY2hhbmdlcykuXG4gICAgICAvLyBXYWl0IHVudGlsIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQsIHRoZW4gYXR0YWNoLlxuICAgICAgdGhpcy5maXJlYmFzZVNlcnZpY2UuZmlyZWJhc2VBdXRoUmVhZHkkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihyZWFkeSA9PiByZWFkeSksXG4gICAgICAgICAgdGFrZSgxKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fYXR0YWNoRmlyZXN0b3JlUkJBQ0xpc3RlbmVyKHVzZXJJZCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2F0dGFjaEZpcmVzdG9yZVJCQUNMaXN0ZW5lcih1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRvY1JlZiA9IGRvYyh0aGlzLmZpcmVzdG9yZUluc3RhbmNlISwgJ3VzZXJzJywgdXNlcklkKTtcbiAgICB0aGlzLmZpcmVzdG9yZVJCQUNVbnN1YnNjcmliZSA9IG9uU25hcHNob3QoZG9jUmVmLCBzbmFwID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBzbmFwLmRhdGEoKTtcbiAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuXG4gICAgICAvLyBTeW5jIGRlIHBlcmZpbCDigJQgZWwgbWlycm9yIEZpcmVzdG9yZSBgL3VzZXJzL3t1aWR9YCBlcyBlbCBlc3Blam8gY2Fuw7NuaWNvXG4gICAgICAvLyBxdWUgZWwgYmFja2VuZCBlc2NyaWJlIChgU3luY1Byb2ZpbGVUb0ZpcmVzdG9yZWApLiBSZWZyZXNjYXIgYWPDoSBtYW50aWVuZVxuICAgICAgLy8gYGF1dGgudXNlcigpYCBWSVZPIChhdmF0YXIgZGVsIGhlYWRlciwgZ3JlZXRpbmcsIGV0Yy4pIHNpbiBkZXBlbmRlciBkZSB1blxuICAgICAgLy8gYGdldFByb2ZpbGUoKWAgbWFudWFsOiBlZGl0YXIgZWwgcGVyZmlsIGVuIHVuYSB2aXN0YSBzZSByZWZsZWphIGVuIHRvZGFzXG4gICAgICAvLyAoaG9tZSBpbmNsdWlkbykgZW4gY3VhbnRvIGVsIGJhY2tlbmQgYWN0dWFsaXphIGVsIG1pcnJvci5cbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVByb2ZpbGVGaWVsZHMoe1xuICAgICAgICBuYW1lOiBkYXRhWyduYW1lJ10gPz8gdW5kZWZpbmVkLFxuICAgICAgICBoYW5kbGU6IGRhdGFbJ2hhbmRsZSddID8/IHVuZGVmaW5lZCxcbiAgICAgICAgYXZhdGFyVXJsOiBkYXRhWydhdmF0YXJVcmwnXSA/PyB1bmRlZmluZWQsXG4gICAgICAgIHBob25lOiBkYXRhWydwaG9uZSddID8/IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByYmFjID0gZGF0YVsncmJhYyddO1xuICAgICAgaWYgKCFyYmFjKSByZXR1cm47XG4gICAgICBjb25zdCBhY3RpdmVPcmcgPSB0aGlzLnN0YXRlU2VydmljZS5zdGF0ZSgpLmFjdGl2ZU9yZztcbiAgICAgIGlmIChyYmFjWydhY3RpdmVPcmcnXSAmJiByYmFjWydhY3RpdmVPcmcnXSAhPT0gYWN0aXZlT3JnKSByZXR1cm47XG4gICAgICBjb25zdCByb2xlczogc3RyaW5nW10gPSByYmFjWydyb2xlcyddID8/IFtdO1xuICAgICAgY29uc3QgcGVybWlzc2lvbnM6IHN0cmluZ1tdID0gcmJhY1sncGVybWlzc2lvbnMnXSA/PyBbXTtcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVBlcm1pc3Npb25zKHJvbGVzLCBwZXJtaXNzaW9ucywgcGVybWlzc2lvbnMuaW5jbHVkZXMoJyo6KicpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdGVhcmRvd25GaXJlc3RvcmVSQkFDU3luYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maXJlc3RvcmVSQkFDVW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMuZmlyZXN0b3JlUkJBQ1Vuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmZpcmVzdG9yZVJCQUNVbnN1YnNjcmliZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFJlZnJlc2hUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcblxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGUoKTtcbiAgICBpZiAoIXN0YXRlLmV4cGlyZXNBdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVmcmVzaEJlZm9yZU1zID0gKHRoaXMuY29uZmlnPy5yZWZyZXNoQmVmb3JlRXhwaXJ5IHx8IDYwKSAqIDEwMDA7XG4gICAgY29uc3QgcmVmcmVzaEF0ID0gc3RhdGUuZXhwaXJlc0F0IC0gcmVmcmVzaEJlZm9yZU1zO1xuICAgIGNvbnN0IGRlbGF5ID0gcmVmcmVzaEF0IC0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmxvZ291dCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sIGRlbGF5KTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnJlZnJlc2hUb2tlbikge1xuICAgICAgLy8gVG9rZW4geWEgZGViZXLDrWEgcmVmcmVzY2Fyc2UsIGludGVudGFyIGFob3JhXG4gICAgICB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnN1YnNjcmliZSh7XG4gICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmxvZ291dCgpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVmcmVzaFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcklkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZXJJZCk7XG4gICAgICB0aGlzLnJlZnJlc2hUaW1lcklkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN5bmNFdmVudChldmVudDogQXV0aFN5bmNFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnTE9HSU4nOlxuICAgICAgY2FzZSAnVE9LRU5fUkVGUkVTSCc6IHtcbiAgICAgICAgLy8gUmVjYXJnYXIgZXN0YWRvIGRlc2RlIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRTdGF0ZSgpO1xuICAgICAgICBpZiAoc3RhdGUuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZXN0b3JlRnJvbVN0b3JhZ2Uoc3RhdGUpO1xuICAgICAgICAgIGNvbnN0IGNsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4oc3RhdGUuYWNjZXNzVG9rZW4pO1xuICAgICAgICAgIGlmIChjbGFpbXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVVzZXJJbmZvKGNsYWltcy51aWQsIGNsYWltcy5lbWFpbCk7XG4gICAgICAgICAgICBpZiAoY2xhaW1zLm9yZykge1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVBY3RpdmVPcmcoY2xhaW1zLm9yZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0xPR09VVCc6XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuc3RvcFJlZnJlc2hUaW1lcigpO1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5jb25maWc/LmxvZ2luUm91dGVdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQRVJNSVNTSU9OU19VUERBVEUnOiB7XG4gICAgICAgIGNvbnN0IHBlcm1zID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkUGVybWlzc2lvbnMoKTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMocGVybXMucm9sZXMsIHBlcm1zLnBlcm1pc3Npb25zLCBwZXJtcy5pc1N1cGVyQWRtaW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ09SR19TV0lUQ0gnOlxuICAgICAgICAvLyBPdHJhIHBlc3Rhw7FhIGNhbWJpw7MgZGUgb3JnYW5pemFjacOzbiAtIHJlY2FyZ2FyIHDDoWdpbmEgcGFyYSBvYnRlbmVyIG51ZXZvIGVzdGFkb1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXV0aEVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSk6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICAvLyBgaW50ZXJwcmV0RXJyb3JgIChoZWxwZXIgY29tcGFydGlkbyBkZSBsYSBsaWIpIG5vcm1hbGl6YSBlbFxuICAgIC8vIEh0dHBFcnJvclJlc3BvbnNlIOKAlCBpbmNsdXllbmRvIGZhbGxvcyBkZSByZWQgKHN0YXR1cyAwKS4gQXBsYW5hbW9zIGFcbiAgICAvLyBBdXRoRXJyb3IgcGFyYSBtYW50ZW5lciBsYSBBUEkgcMO6YmxpY2EgZGUgQXV0aFNlcnZpY2UgZXN0YWJsZS5cbiAgICBjb25zdCBpbnRlcnByZXRlZCA9IGludGVycHJldEVycm9yKGVycm9yKTtcbiAgICBjb25zdCBhdXRoRXJyb3I6IEF1dGhFcnJvciA9IHtcbiAgICAgIGNvZGU6IGludGVycHJldGVkLmNvZGUsXG4gICAgICBtZXNzYWdlOiBpbnRlcnByZXRlZC5tZXNzYWdlLFxuICAgIH07XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RXJyb3IoYXV0aEVycm9yKTtcbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBhdXRoRXJyb3IpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZJUkVCQVNFIElOVEVHUkFUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnbkluV2l0aEZpcmViYXNlKGZpcmViYXNlVG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtGQkF1dGhdIGF1dGggZmxvdyDihpIgc2lnbkluV2l0aEZpcmViYXNlIGF0dGVtcHQgdG9rZW5MZW49JHtmaXJlYmFzZVRva2VuPy5sZW5ndGggPz8gMH0gYCArXG4gICAgICAgIGBmaXJlYmFzZVNlcnZpY2VQcmVzZW50PSR7ISF0aGlzLmZpcmViYXNlU2VydmljZX1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZmlyZWJhc2VTZXJ2aWNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlyZWJhc2VTZXJ2aWNlLnNpZ25JbldpdGhDdXN0b21Ub2tlbihmaXJlYmFzZVRva2VuKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2Ugc2lnbmluIHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZVNlcnZpY2Ugbm90IHByb3ZpZGVkLiBBZGQgcHJvdmlkZVZhbHRlY2hGaXJlYmFzZSgpIHRvIHlvdXIgcHJvdmlkZXJzLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTm8gYmxvcXVlYXIgZWwgbG9naW4gcHJpbmNpcGFsIHNpIEZpcmViYXNlIGZhbGxhXG4gICAgICBjb25zb2xlLmVycm9yKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25pbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnbk91dEZpcmViYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24pIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5maXJlYmFzZVNlcnZpY2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maXJlYmFzZVNlcnZpY2Uuc2lnbk91dCgpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JhciBlcnJvcmVzIGRlIEZpcmViYXNlIHNpZ25vdXRcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLWVzdGFibGVjZSBsYSBzZXNpw7NuIGRlIEZpcmViYXNlIEF1dGggZW4gZWwgYm9vdHN0cmFwIGRlIGxhIGFwcCBjdWFuZG9cbiAgICogZWwgYWNjZXNzIHRva2VuIGRlIGxhIGFwcCBzaWd1ZSB2w6FsaWRvIChsYSByYW1hIGRlIGluaXRpYWxpemUoKSBxdWUgTk9cbiAgICogcGFzYSBwb3IgcmVmcmVzaCkuXG4gICAqXG4gICAqIEZpcmViYXNlIEF1dGggbWFudGllbmUgc3UgUFJPUElBIHNlc2nDs24gY29uIHBlcnNpc3RlbmNpYSBJbmRleGVkREJcbiAgICogaW5kZXBlbmRpZW50ZSBkZWwgc3RvcmFnZSBkZSB0b2tlbnMgZGUgbGEgYXBwLiBFbiB1biBuYXZlZ2Fkb3Igbm9ybWFsIGVzYVxuICAgKiBwZXJzaXN0ZW5jaWEgc2UgYXV0by1yZXN0YXVyYSBzb2xhOyBlbiB1bmEgUFdBIHN0YW5kYWxvbmUgZW4gaU9TIGVsXG4gICAqIGNvbnRlbmVkb3IgZGUgc3RvcmFnZSBubyBzb2JyZXZpdmUsIHkgYGZpcmViYXNlQXV0aFJlYWR5YCBzZSBxdWVkYSBlblxuICAgKiBgZmFsc2VgIGluZGVmaW5pZGFtZW50ZSDihpIgbG9zIGxpc3RlbmVycyBGaXJlc3RvcmUgY3VlbGdhbiAofjQwcyB0aW1lb3V0KS5cbiAgICpcbiAgICogRXN0cmF0ZWdpYTogZGFyIHVuYSB2ZW50YW5hIGNvcnRhIGEgbGEgYXV0by1yZXN0YXVyYWNpw7NuIGRlIEZpcmViYXNlIHksIHNpXG4gICAqIG5vIG9jdXJyZSwgZm9yemFyIHVuIGByZWZyZXNoQWNjZXNzVG9rZW4oKWAg4oCUIHF1ZSB5YSBoYWNlIGBzaWduSW5XaXRoRmlyZWJhc2VgXG4gICAqIGNvbiBlbCBgZmlyZWJhc2VUb2tlbmAgcXVlIGRldnVlbHZlIGAvcmVmcmVzaGAuXG4gICAqXG4gICAqIEZpcmUtYW5kLWZvcmdldDogc2UgaW52b2NhIGNvbiBgdm9pZGAgcGFyYSBubyBkZW1vcmFyIGBpbml0aWFsaXplKClgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVGaXJlYmFzZVNlc3Npb25PbkJvb3RzdHJhcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uIHx8ICF0aGlzLmZpcmViYXNlU2VydmljZSkgcmV0dXJuO1xuXG4gICAgLy8gRGFyIGEgbGEgcGVyc2lzdGVuY2lhIEluZGV4ZWREQiBwcm9waWEgZGUgRmlyZWJhc2UgQXV0aCB1bmEgb3BvcnR1bmlkYWRcbiAgICAvLyBkZSBhdXRvLXJlc3RhdXJhcnNlIChuYXZlZ2Fkb3Igbm9ybWFsKS4gRW4gdW5hIFBXQSBzdGFuZGFsb25lIGRlIGlPU1xuICAgIC8vIG5vcm1hbG1lbnRlIE5PIGxvIGhhcsOhLlxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAyNTAwKSk7XG5cbiAgICBpZiAodGhpcy5maXJlYmFzZVNlcnZpY2UuZmlyZWJhc2VBdXRoUmVhZHkoKSkge1xuICAgICAgY29uc29sZS5sb2coJ1tGQkF1dGhdIGJvb3RzdHJhcCDigJQgRmlyZWJhc2Ugc2Vzc2lvbiByZXN0b3JlZCBvbiBpdHMgb3duJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXG4gICAgICAnW0ZCQXV0aF0gYm9vdHN0cmFwIOKAlCBzZXNzaW9uIHZhbGlkIGJ1dCBGaXJlYmFzZSBOT1QgcmVhZHkg4oaSIHJlY3VycmllbmRvIGEgZmFsbGJhY2snXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnJlZXN0YWJsaXNoRmlyZWJhc2VWaWFSZWZyZXNoKCdib290c3RyYXAtc2Vzc2lvbi1yZXN0b3JlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgc2VsZi1oZWFsaW5nIGRlIEZpcmViYXNlIEF1dGguIFBpZGUgdW4gZmlyZWJhc2VUb2tlbiBmcmVzY28gdsOtYVxuICAgKiBgL3JlZnJlc2hgIChxdWUgc8OtIGxvIGRldnVlbHZlIGRlIGZvcm1hIGNvbmZpYWJsZSkgeSwgZW4gw6l4aXRvLFxuICAgKiBgcmVmcmVzaEFjY2Vzc1Rva2VuKClgIHlhIGVqZWN1dGEgYHNpZ25JbldpdGhGaXJlYmFzZSgpYC5cbiAgICpcbiAgICogU2UgaW52b2NhIGN1YW5kbyB1biBwYXRoIGRlIGF1dGggZGVqw7MgbGEgc2VzacOzbiBkZSBGaXJlYmFzZSBzaW4gZXN0YWJsZWNlcjpcbiAgICogIC0gbG9naW4gT0F1dGgvcGFzc3dvcmQgcXVlIHZvbHZpw7Mgc2luIGBmaXJlYmFzZVRva2VuYCxcbiAgICogIC0gY29sZCBsYXVuY2ggZGUgUFdBIGlPUyBzaW4gcGVyc2lzdGVuY2lhIGRlIEZpcmViYXNlLlxuICAgKlxuICAgKiBgcmVhc29uYCBhcGFyZWNlIGVuIGxvcyBsb2dzIGBbRkJBdXRoXSBmYWxsYmFja2AgcGFyYSBwb2RlciBhdGVzdGlndWFyXG4gICAqIGRlc2RlIGVsIGRlYnVnLWNvbnNvbGUgcXXDqSBkaXNwYXLDsyBlbCBmYWxsYmFjay5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVlc3RhYmxpc2hGaXJlYmFzZVZpYVJlZnJlc2gocmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uIHx8ICF0aGlzLmZpcmViYXNlU2VydmljZSkgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coYFtGQkF1dGhdIGZhbGxiYWNrIOKAlCByZS1lc3RhYmxlY2llbmRvIEZpcmViYXNlIHbDrWEgL3JlZnJlc2ggKG1vdGl2bzogJHtyZWFzb259KWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbRkJBdXRoXSBmYWxsYmFjayDigJQgL3JlZnJlc2ggT0ssIEZpcmViYXNlIHJlLWVzdGFibGVjaWRvIChtb3Rpdm86ICR7cmVhc29ufSlgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtGQkF1dGhdIGZhbGxiYWNrIOKAlCAvcmVmcmVzaCBmYWxsw7MgKG1vdGl2bzogJHtyZWFzb259KTpgLCBlKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gREVWSUNFIFJFR0lTVFJBVElPTiAoUHVzaCBOb3RpZmljYXRpb25zKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU29saWNpdGEgcGVybWlzb3MgZGUgbm90aWZpY2FjacOzbiB5IHJlZ2lzdHJhIGVsIGRpc3Bvc2l0aXZvLlxuICAgKiBVc2FyIGN1YW5kbyBlbCB1c3VhcmlvIGFjZXB0YSByZWNpYmlyIG5vdGlmaWNhY2lvbmVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIG9uRW5hYmxlTm90aWZpY2F0aW9ucygpIHtcbiAgICogICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguZW5hYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIGlmIChyZXN1bHQuZ3JhbnRlZCkge1xuICAgKiAgICAgY29uc29sZS5sb2coJ05vdGlmaWNhY2lvbmVzIGhhYmlsaXRhZGFzJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZW5hYmxlTm90aWZpY2F0aW9ucygpOiBQcm9taXNlPEVuYWJsZU5vdGlmaWNhdGlvbnNSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIE1lc3NhZ2luZ1NlcnZpY2Ugbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBQdXNoIG5vdGlmaWNhdGlvbnMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5yZXF1ZXN0UGVybWlzc2lvbigpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0cmFyIGRpc3Bvc2l0aXZvIGVuIGJhY2tlbmRcbiAgICBjb25zdCByZWdpc3RlcmVkID0gYXdhaXQgdGhpcy5yZWdpc3RlckRldmljZUlmTmVlZGVkKCk7XG5cbiAgICByZXR1cm4geyBncmFudGVkOiB0cnVlLCB0b2tlbiwgcmVnaXN0ZXJlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2FjdGl2YSBsYXMgbm90aWZpY2FjaW9uZXMgcGFyYSBlc3RlIGRpc3Bvc2l0aXZvLlxuICAgKiBFbGltaW5hIGVsIHRva2VuIGRlbCBiYWNrZW5kIHkgZGUgRkNNLlxuICAgKiBVc2FyIGRlc2RlIHVuIHRvZ2dsZSBkZSBwcmVmZXJlbmNpYXMgY3VhbmRvIGVsIHVzdWFyaW8gZGVzYWN0aXZhIG5vdGlmaWNhY2lvbmVzLlxuICAgKlxuICAgKiBOT1RBOiBFc3RvIE5PIHJldm9jYSBlbCBwZXJtaXNvIGRlbCBuYXZlZ2Fkb3IgKGVsIHVzdWFyaW8gZGViZSBoYWNlcmxvIG1hbnVhbG1lbnRlXG4gICAqIGRlc2RlIGxhIGNvbmZpZ3VyYWNpw7NuIGRlbCBuYXZlZ2Fkb3IpLiBTb2xvIGVsaW1pbmEgZWwgcmVnaXN0cm8gZGVsIGRpc3Bvc2l0aXZvLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIG9uVG9nZ2xlTm90aWZpY2F0aW9ucyhlbmFibGVkOiBib29sZWFuKSB7XG4gICAqICAgaWYgKGVuYWJsZWQpIHtcbiAgICogICAgIGF3YWl0IHRoaXMuYXV0aC5lbmFibGVOb3RpZmljYXRpb25zKCk7XG4gICAqICAgfSBlbHNlIHtcbiAgICogICAgIGF3YWl0IHRoaXMuYXV0aC5kaXNhYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGRpc2FibGVOb3RpZmljYXRpb25zKCk6IFByb21pc2U8eyBkaXNhYmxlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybiB7IGRpc2FibGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5jdXJyZW50VG9rZW47XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gRWxpbWluYXIgZGVsIGJhY2tlbmRcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgICAucmVxdWVzdCgnREVMRVRFJywgYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlcy9ieS10b2tlbmAsIHtcbiAgICAgICAgICAgICAgYm9keTogeyB0b2tlbiB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVsaW1pbmFyIHRva2VuIGRlIEZDTVxuICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZGVsZXRlVG9rZW4oKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gTm90aWZpY2F0aW9ucyBkaXNhYmxlZCcpO1xuICAgICAgICByZXR1cm4geyBkaXNhYmxlZDogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBkaXNhYmxlZDogZmFsc2UgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIEZhaWxlZCB0byBkaXNhYmxlIG5vdGlmaWNhdGlvbnM6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgZGlzYWJsZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgZWwgZXN0YWRvIGFjdHVhbCBkZSBwZXJtaXNvcyBkZSBub3RpZmljYWNpw7NuLlxuICAgKlxuICAgKiBAcmV0dXJucyAnZ3JhbnRlZCcgfCAnZGVuaWVkJyB8ICdkZWZhdWx0JyB8ICd1bnN1cHBvcnRlZCdcbiAgICovXG4gIGdldE5vdGlmaWNhdGlvblBlcm1pc3Npb25TdGF0ZSgpOiBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGUge1xuICAgIGlmICghdGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4gJ3Vuc3VwcG9ydGVkJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRQZXJtaXNzaW9uU3RhdGUoKSBhcyBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgbWFudWFsbWVudGUgZWwgZGlzcG9zaXRpdm8gZW4gZWwgYmFja2VuZC5cbiAgICogw5p0aWwgcGFyYSBzaW5jcm9uaXphciBkaXNwb3NpdGl2b3MgcXVlIHRpZW5lbiB0b2tlbiBGQ00gcGVybyBubyBlc3TDoW4gcmVnaXN0cmFkb3MuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlZFRva2VuIFRva2VuIEZDTSBvcGNpb25hbC4gU2kgc2UgcHJvcG9yY2lvbmEsIHNlIHVzYSBkaXJlY3RhbWVudGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgc2luIGRlcGVuZGVyIGRlbCBNZXNzYWdpbmdTZXJ2aWNlIChldml0YSB0aW1pbmcgaXNzdWVzKS5cbiAgICogQHJldHVybnMgUmVzdWx0YWRvIGRlbCByZWdpc3RybyBjb24gZGV2aWNlSWQgc2kgZnVlIGV4aXRvc29cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTaW5jcm9uaXphciBjb24gdG9rZW4gZXhpc3RlbnRlIChyZWNvbWVuZGFkbylcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlZ2lzdGVyRGV2aWNlKG15VG9rZW4pO1xuICAgKlxuICAgKiAvLyBTaW4gdG9rZW4sIGludGVudGFyw6Egb2J0ZW5lcmxvIGRlbCBNZXNzYWdpbmdTZXJ2aWNlXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZWdpc3RlckRldmljZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyRGV2aWNlKHByb3ZpZGVkVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPFJlZ2lzdGVyRGV2aWNlUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdVc3VhcmlvIG5vIGF1dGVudGljYWRvJyB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBWZXJpZmljYXIgcGVybWlzb3Mgc2kgdGVuZW1vcyBNZXNzYWdpbmdTZXJ2aWNlXG4gICAgICBpZiAodGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0UGVybWlzc2lvblN0YXRlKCk7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uICE9PSAnZ3JhbnRlZCcpIHtcbiAgICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdQZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzIG5vIG90b3JnYWRvJyB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVzYXIgdG9rZW4gcHJvcG9yY2lvbmFkbyBwcmltZXJvIChldml0YSB0aW1pbmcgaXNzdWVzIGNvbiBJbmplY3RvcilcbiAgICAgIGxldCB0b2tlbiA9IHByb3ZpZGVkVG9rZW4gfHwgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlPy5jdXJyZW50VG9rZW47XG5cbiAgICAgIC8vIFNpIG5vIGhheSB0b2tlbiwgaW50ZW50YXIgb2J0ZW5lcmxvIGRlbCBNZXNzYWdpbmdTZXJ2aWNlXG4gICAgICBpZiAoIXRva2VuICYmIHRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdGQ00gbm8gc29wb3J0YWRvIGVuIGVzdGUgbmF2ZWdhZG9yJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmdldFRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogZmFsc2UsIGVycm9yOiAnTm8gc2UgcHVkbyBvYnRlbmVyIHRva2VuIEZDTScgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnaXN0cmFyIGVuIGJhY2tlbmRcbiAgICAgIGNvbnN0IHsgcGxhdGZvcm0sIGJyb3dzZXIsIG9zIH0gPSB0aGlzLmRldGVjdFBsYXRmb3JtSW5mbygpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwLnBvc3Q8UmVnaXN0ZXJEZXZpY2VSZXNwb25zZT4oYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlc2AsIHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICBicm93c2VyLFxuICAgICAgICAgIG9zLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRGV2aWNlIHJlZ2lzdGVyZWQgbWFudWFsbHk6JywgcmVzcG9uc2UuZGV2aWNlLmRldmljZUlkKTtcbiAgICAgIHJldHVybiB7IHJlZ2lzdGVyZWQ6IHRydWUsIGRldmljZUlkOiByZXNwb25zZS5kZXZpY2UuZGV2aWNlSWQsIHRva2VuIH07XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIE1hbnVhbCBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWdpc3RlcmVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IGVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnJvcj8ubWVzc2FnZSB8fCAnRXJyb3IgYWwgcmVnaXN0cmFyIGRpc3Bvc2l0aXZvJyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdHJhIGVsIGRpc3Bvc2l0aXZvIGVuIGVsIGJhY2tlbmQgc2kgdGllbmUgcGVybWlzb3MgZGUgbm90aWZpY2FjacOzbi5cbiAgICogU2UgbGxhbWEgYXV0b23DoXRpY2FtZW50ZSBkZXNwdcOpcyBkZSB1biBsb2dpbiBleGl0b3NvIHNpIGVuYWJsZURldmljZVJlZ2lzdHJhdGlvbj10cnVlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckRldmljZUlmTmVlZGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFNvbG8gc2kgZXN0w6EgaGFiaWxpdGFkbyB5IG1lc3NhZ2luZyBlc3TDoSBkaXNwb25pYmxlXG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uIHx8ICF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZpY2FyIHNpIEZDTSBlc3TDoSBzb3BvcnRhZG9cbiAgICAgIGlmICghKGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5pc1N1cHBvcnRlZCgpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmaWNhciBzaSB5YSB0aWVuZSBwZXJtaXNvc1xuICAgICAgY29uc3QgcGVybWlzc2lvbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRQZXJtaXNzaW9uU3RhdGUoKTtcbiAgICAgIGlmIChwZXJtaXNzaW9uICE9PSAnZ3JhbnRlZCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBObyBzb2xpY2l0YXIgYXV0b23DoXRpY2FtZW50ZSwgc29sbyByZWdpc3RyYXIgc2kgeWEgdGllbmUgcGVybWlzb1xuICAgICAgfVxuXG4gICAgICAvLyBPYnRlbmVyIHRva2VuIGV4aXN0ZW50ZSAobm8gc29saWNpdGFyIG51ZXZvKVxuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0VG9rZW4oKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWdpc3RyYXIgZW4gYmFja2VuZFxuICAgICAgY29uc3QgeyBwbGF0Zm9ybSwgYnJvd3Nlciwgb3MgfSA9IHRoaXMuZGV0ZWN0UGxhdGZvcm1JbmZvKCk7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwLnBvc3Q8UmVnaXN0ZXJEZXZpY2VSZXNwb25zZT4oYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlc2AsIHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICBicm93c2VyLFxuICAgICAgICAgIG9zLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRGV2aWNlIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTm8gYmxvcXVlYXIgYXV0aCBzaSBmYWxsYSBkZXZpY2UgcmVnaXN0cmF0aW9uXG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gRGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIGVsIGRpc3Bvc2l0aXZvIGRlbCBiYWNrZW5kIHkgYm9ycmEgZWwgdG9rZW4gRkNNLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB1bnJlZ2lzdGVyRGV2aWNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZURldmljZVJlZ2lzdHJhdGlvbiB8fCAhdGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmN1cnJlbnRUb2tlbjtcbiAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAvLyBEZWxldGUgZnJvbSBiYWNrZW5kIChmaXJlIGFuZCBmb3JnZXQpXG4gICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgIC5yZXF1ZXN0KCdERUxFVEUnLCBgJHt0aGlzLmNvbmZpZz8uYXBpVXJsfS92Mi91c2Vycy9tZS9kZXZpY2VzL2J5LXRva2VuYCwge1xuICAgICAgICAgICAgYm9keTogeyB0b2tlbiB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpXG4gICAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICAgIC8vIERlbGV0ZSBmcm9tIEZDTVxuICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZGVsZXRlVG9rZW4oKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRGV2aWNlIHVucmVnaXN0ZXJlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JhciBlcnJvcmVzIGVuIGNsZWFudXBcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0YSBpbmZvcm1hY2nDs24gZGUgbGEgcGxhdGFmb3JtYSBkZWwgZGlzcG9zaXRpdm8uXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFBsYXRmb3JtSW5mbygpOiB7IHBsYXRmb3JtOiAnd2ViJzsgYnJvd3Nlcjogc3RyaW5nOyBvczogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcblxuICAgIC8vIERldGVjdGFyIG5hdmVnYWRvclxuICAgIGxldCBicm93c2VyID0gJ1Vua25vd24nO1xuICAgIGlmICh1YS5pbmNsdWRlcygnRmlyZWZveCcpKSB7XG4gICAgICBicm93c2VyID0gJ0ZpcmVmb3gnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ0VkZycpKSB7XG4gICAgICBicm93c2VyID0gJ0VkZ2UnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ0Nocm9tZScpKSB7XG4gICAgICBicm93c2VyID0gJ0Nocm9tZSc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnU2FmYXJpJykpIHtcbiAgICAgIGJyb3dzZXIgPSAnU2FmYXJpJztcbiAgICB9XG5cbiAgICAvLyBEZXRlY3RhciBPU1xuICAgIGxldCBvcyA9ICdVbmtub3duJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ1dpbmRvd3MnKSkge1xuICAgICAgb3MgPSAnV2luZG93cyc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnTWFjIE9TJykpIHtcbiAgICAgIG9zID0gJ21hY09TJztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdMaW51eCcpKSB7XG4gICAgICBvcyA9ICdMaW51eCc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnQW5kcm9pZCcpKSB7XG4gICAgICBvcyA9ICdBbmRyb2lkJztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdpT1MnKSB8fCB1YS5pbmNsdWRlcygnaVBob25lJykgfHwgdWEuaW5jbHVkZXMoJ2lQYWQnKSkge1xuICAgICAgb3MgPSAnaU9TJztcbiAgICB9XG5cbiAgICByZXR1cm4geyBwbGF0Zm9ybTogJ3dlYicsIGJyb3dzZXIsIG9zIH07XG4gIH1cbn1cbiJdfQ==
1414
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25GLE9BQU8sRUFBYyxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQXdFL0MsT0FBTyxFQUFhLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7O0FBRTNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxNQUFNLE9BQU8sV0FBVztJQU10QixZQUNtRCxNQUFnQyxFQUN6RSxJQUFnQixFQUNoQixNQUFjLEVBQ2QsWUFBOEIsRUFDOUIsWUFBMEIsRUFDMUIsY0FBa0MsRUFDbEMsV0FBNEIsRUFDNUIsZUFBZ0MsRUFDaEMsWUFBMEIsRUFDZCxnQkFBeUMsRUFDekMsV0FBK0IsRUFDM0MsbUJBQThDLEVBQ2xDLGlCQUFtQztRQVpOLFdBQU0sR0FBTixNQUFNLENBQTBCO1FBQ3pFLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtRQUM5QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixtQkFBYyxHQUFkLGNBQWMs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LFdBQVcsY0FERSxNQUFNOzs0RkFDbkIsV0FBVztrQkFEdkIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQVE3QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBU3RDLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUVSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIGlzRGV2TW9kZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciwgb2YsIGZyb20sIGZpcnN0VmFsdWVGcm9tLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCwgY2F0Y2hFcnJvciwgc3dpdGNoTWFwLCBtYXAsIGZpbHRlciwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVkFMVEVDSF9BVVRIX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IEF1dGhTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL2F1dGgtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuL3Rva2VuLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFN5bmNTZXJ2aWNlIH0gZnJvbSAnLi9zeW5jLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgU2lnbmluUmVxdWVzdCxcbiAgU2lnbmluUmVzcG9uc2UsXG4gIFNpZ251cFJlcXVlc3QsXG4gIFNpZ251cFJlc3BvbnNlLFxuICBWZXJpZnlFbWFpbFJlcXVlc3QsXG4gIFZlcmlmeUVtYWlsUmVzcG9uc2UsXG4gIFJlc2VuZENvZGVSZXF1ZXN0LFxuICBSZXNlbmRDb2RlUmVzcG9uc2UsXG4gIE1GQVZlcmlmeVJlc3BvbnNlLFxuICBSZWZyZXNoUmVzcG9uc2UsXG4gIEdldFBlcm1pc3Npb25zUmVzcG9uc2UsXG4gIEdldFByb2ZpbGVSZXNwb25zZSxcbiAgVXBkYXRlUHJvZmlsZVJlcXVlc3QsXG4gIFVwZGF0ZVByb2ZpbGVSZXNwb25zZSxcbiAgTUZBU2V0dXBSZXNwb25zZSxcbiAgTUZBQ29uZmlybVJlc3BvbnNlLFxuICBNRkFEaXNhYmxlUmVxdWVzdCxcbiAgTUZBRGlzYWJsZVJlc3BvbnNlLFxuICBGb3Jnb3RQYXNzd29yZFJlcXVlc3QsXG4gIEZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gIFJlc2V0UGFzc3dvcmRSZXF1ZXN0LFxuICBSZXNldFBhc3N3b3JkUmVzcG9uc2UsXG4gIEFjdGl2YXRlQWNjb3VudFJlcXVlc3QsXG4gIEFjdGl2YXRlQWNjb3VudFJlc3BvbnNlLFxuICBDaGFuZ2VQYXNzd29yZFJlcXVlc3QsXG4gIENoYW5nZVBhc3N3b3JkUmVzcG9uc2UsXG4gIERlbGV0ZUFjY291bnRSZXF1ZXN0LFxuICBEZWxldGVBY2NvdW50UmVzcG9uc2UsXG4gIFNlbmREZWxldGVBY2NvdW50Q29kZVJlc3BvbnNlLFxuICBTd2l0Y2hPcmdSZXNwb25zZSxcbiAgTUZBTWV0aG9kLFxuICBBdXRoRXJyb3IsXG4gIEF1dGhTeW5jRXZlbnQsXG4gIFZhbHRlY2hBdXRoQ29uZmlnLFxuICBSZWdpc3RlckRldmljZVJlc3BvbnNlLFxuICBFbmFibGVOb3RpZmljYXRpb25zUmVzdWx0LFxuICBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGUsXG4gIFJlZ2lzdGVyRGV2aWNlUmVzdWx0LFxuICAvLyBUT1RQIE1GQSB0eXBlc1xuICBUT1RQU2V0dXBSZXNwb25zZSxcbiAgVE9UUFZlcmlmeVNldHVwUmVzcG9uc2UsXG4gIFRPVFBEaXNhYmxlUmVzcG9uc2UsXG4gIFJlZ2VuZXJhdGVCYWNrdXBDb2Rlc1Jlc3BvbnNlLFxuICBCYWNrdXBDb2Rlc0NvdW50UmVzcG9uc2UsXG4gIC8vIE9BdXRoIHR5cGVzXG4gIE9BdXRoUHJvdmlkZXIsXG4gIE9BdXRoUmVzdWx0LFxuICBMaW5rZWRQcm92aWRlcixcbiAgSGFzUGFzc3dvcmRSZXNwb25zZSxcbiAgLy8gSGFuZGxlIHR5cGVzXG4gIFVwZGF0ZUhhbmRsZVJlc3BvbnNlLFxuICBDaGVja0hhbmRsZVJlc3BvbnNlLFxuICAvLyBBdmF0YXIgdHlwZXNcbiAgVXBkYXRlQXZhdGFyUmVxdWVzdCxcbiAgVXBkYXRlQXZhdGFyUmVzcG9uc2UsXG4gIC8vIEVtYWlsIGNoYW5nZVxuICBJbml0aWF0ZUVtYWlsQ2hhbmdlUmVxdWVzdCxcbiAgSW5pdGlhdGVFbWFpbENoYW5nZVJlc3BvbnNlLFxuICBDb25maXJtRW1haWxDaGFuZ2VTdGVwMVJlcXVlc3QsXG4gIENvbmZpcm1FbWFpbENoYW5nZVN0ZXAxUmVzcG9uc2UsXG4gIENvbmZpcm1FbWFpbENoYW5nZVN0ZXAyUmVxdWVzdCxcbiAgQ29uZmlybUVtYWlsQ2hhbmdlU3RlcDJSZXNwb25zZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBPQXV0aFNlcnZpY2UgfSBmcm9tICcuL29hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlyZWJhc2VTZXJ2aWNlLCBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vZmlyZWJhc2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UsIEkxOG5MYW5nIH0gZnJvbSAnLi4vaTE4bic7XG5pbXBvcnQgeyBGaXJlc3RvcmUsIGRvYywgb25TbmFwc2hvdCB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvZmlyZXN0b3JlJztcbmltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi9jb25maXJtYXRpb24tZGlhbG9nL2NvbmZpcm1hdGlvbi1kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBpbnRlcnByZXRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKlxuICogU2VydmljaW8gcHJpbmNpcGFsIGRlIGF1dGVudGljYWNpw7NuLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJ3ZhbHRlY2gtY29tcG9uZW50cyc7XG4gKlxuICogQENvbXBvbmVudCh7Li4ufSlcbiAqIGV4cG9ydCBjbGFzcyBMb2dpbkNvbXBvbmVudCB7XG4gKiAgIHByaXZhdGUgYXV0aCA9IGluamVjdChBdXRoU2VydmljZSk7XG4gKlxuICogICBhc3luYyBsb2dpbigpIHtcbiAqICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmF1dGguc2lnbmluKHsgZW1haWwsIHBhc3N3b3JkIH0pKTtcbiAqICAgICBpZiAodGhpcy5hdXRoLm1mYVBlbmRpbmcoKS5yZXF1aXJlZCkge1xuICogICAgICAgLy8gTW9zdHJhciBVSSBkZSBNRkFcbiAqICAgICB9IGVsc2Uge1xuICogICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xuICogICAgIH1cbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAvLyBUaW1lciBwYXJhIHJlZnJlc2ggcHJvYWN0aXZvXG4gIHByaXZhdGUgcmVmcmVzaFRpbWVySWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3luY1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZmlyZXN0b3JlUkJBQ1Vuc3Vic2NyaWJlOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFZBTFRFQ0hfQVVUSF9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBWYWx0ZWNoQXV0aENvbmZpZyB8IG51bGwsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBzdGF0ZVNlcnZpY2U6IEF1dGhTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBBdXRoU3RvcmFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzeW5jU2VydmljZTogQXV0aFN5bmNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlyZWJhc2VTZXJ2aWNlOiBGaXJlYmFzZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvYXV0aFNlcnZpY2U6IE9BdXRoU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIG1lc3NhZ2luZ1NlcnZpY2U6IE1lc3NhZ2luZ1NlcnZpY2UgfCBudWxsLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlIHwgbnVsbCxcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvbkRpYWxvZ1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmaXJlc3RvcmVJbnN0YW5jZTogRmlyZXN0b3JlIHwgbnVsbFxuICApIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdbdmFsdGVjaC1jb21wb25lbnRzXSBBdXRoU2VydmljZTogcHJvdmlkZVZhbHRlY2hBdXRoKCkgbm8gZXN0w6EgZW4gbWFpbi50cy4gJyArXG4gICAgICAgICAgJ0xvZ2luLCByZWdpc3RybyB5IHNlc2nDs24gbm8gZnVuY2lvbmFyw6FuLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVTVEFETyBQw5pCTElDTyAoU2lnbmFscyByZWFkb25seSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEVzdGFkbyBjb21wbGV0byBkZSBhdXRlbnRpY2FjacOzbiAqL1xuICByZWFkb25seSBzdGF0ZSA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlO1xuXG4gIC8qKiBVc3VhcmlvIGVzdMOhIGF1dGVudGljYWRvICovXG4gIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZCA9IHRoaXMuc3RhdGVTZXJ2aWNlLmlzQXV0aGVudGljYXRlZDtcblxuICAvKiogRXN0YWRvIGRlIGNhcmdhICovXG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IHRoaXMuc3RhdGVTZXJ2aWNlLmlzTG9hZGluZztcblxuICAvKiogSW5mb3JtYWNpw7NuIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHVzZXIgPSB0aGlzLnN0YXRlU2VydmljZS51c2VyO1xuXG4gIC8qKiBUb2tlbiBkZSBhY2Nlc28gKi9cbiAgcmVhZG9ubHkgYWNjZXNzVG9rZW4gPSB0aGlzLnN0YXRlU2VydmljZS5hY2Nlc3NUb2tlbjtcblxuICAvKiogUm9sZXMgZGVsIHVzdWFyaW8gKi9cbiAgcmVhZG9ubHkgcm9sZXMgPSB0aGlzLnN0YXRlU2VydmljZS5yb2xlcztcblxuICAvKiogUGVybWlzb3MgZGVsIHVzdWFyaW8gKi9cbiAgcmVhZG9ubHkgcGVybWlzc2lvbnMgPSB0aGlzLnN0YXRlU2VydmljZS5wZXJtaXNzaW9ucztcblxuICAvKiogVXN1YXJpbyBlcyBzdXBlciBhZG1pbiAqL1xuICByZWFkb25seSBpc1N1cGVyQWRtaW4gPSB0aGlzLnN0YXRlU2VydmljZS5pc1N1cGVyQWRtaW47XG5cbiAgLyoqIEVzdGFkbyBkZSBNRkEgcGVuZGllbnRlICovXG4gIHJlYWRvbmx5IG1mYVBlbmRpbmcgPSB0aGlzLnN0YXRlU2VydmljZS5tZmFQZW5kaW5nO1xuXG4gIC8qKiBFcnJvciBhY3R1YWwgKi9cbiAgcmVhZG9ubHkgZXJyb3IgPSB0aGlzLnN0YXRlU2VydmljZS5lcnJvcjtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5JQ0lBTElaQUNJw5NOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWFsaXphIGVsIHNlcnZpY2lvIGRlIGF1dGVudGljYWNpw7NuLlxuICAgKiBMbGFtYWRvIGF1dG9tw6F0aWNhbWVudGUgcG9yIHByb3ZpZGVWYWx0ZWNoQXV0aC5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gMS4gQ2FyZ2FyIGVzdGFkbyBkZXNkZSBzdG9yYWdlXG4gICAgY29uc3Qgc3RvcmVkU3RhdGUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRTdGF0ZSgpO1xuXG4gICAgaWYgKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAvLyAyLiBWZXJpZmljYXIgc2kgdG9rZW4gZXMgdsOhbGlkb1xuICAgICAgaWYgKHRoaXMudG9rZW5TZXJ2aWNlLmlzVG9rZW5WYWxpZChzdG9yZWRTdGF0ZS5hY2Nlc3NUb2tlbikpIHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzdG9yZUZyb21TdG9yYWdlKHN0b3JlZFN0YXRlKTtcblxuICAgICAgICAvLyBFeHRyYWVyIGluZm8gZGVsIHRva2VuXG4gICAgICAgIGNvbnN0IGNsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4oc3RvcmVkU3RhdGUuYWNjZXNzVG9rZW4pO1xuICAgICAgICBpZiAoY2xhaW1zKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlVXNlckluZm8oY2xhaW1zLnVpZCwgY2xhaW1zLmVtYWlsKTtcbiAgICAgICAgICBpZiAoY2xhaW1zLm9yZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKGNsYWltcy5vcmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIEluaWNpYXIgdGltZXIgZGUgcmVmcmVzY28gcHJvYWN0aXZvXG4gICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcblxuICAgICAgICAvLyA0LiBSZS1lc3RhYmxlY2VyIGxhIHNlc2nDs24gZGUgRmlyZWJhc2UgZW4gYm9vdHN0cmFwLlxuICAgICAgICAvLyBFbCBhY2Nlc3MgdG9rZW4gc2lndWUgdsOhbGlkbywgYXPDrSBxdWUgTk8gcGFzYW1vcyBwb3IgbGEgcmFtYSBkZVxuICAgICAgICAvLyByZWZyZXNoIOKAlCBwZXJvIGxhIHBlcnNpc3RlbmNpYSBJbmRleGVkREIgcHJvcGlhIGRlIEZpcmViYXNlIEF1dGggbm9cbiAgICAgICAgLy8gc29icmV2aXZlIGVsIGNvbnRlbmVkb3IgZGUgc3RvcmFnZSBkZSB1bmEgUFdBIHN0YW5kYWxvbmUgZW4gaU9TLlxuICAgICAgICAvLyBTaW4gZXN0bywgYGZpcmViYXNlQXV0aFJlYWR5YCBzZSBxdWVkYSBlbiBgZmFsc2VgIHBhcmEgc2llbXByZSB5XG4gICAgICAgIC8vIGN1YWxxdWllciBsaXN0ZW5lciBGaXJlc3RvcmUgKGVqLiBlbCBpbmJveCBkZSBub3RpZmljYWNpb25lcykgY3VlbGdhLlxuICAgICAgICAvLyBGaXJlLWFuZC1mb3JnZXQ6IE5PIGRlYmUgZGVtb3JhciBlbCByZXNvbHZlIGRlIGluaXRpYWxpemUoKS5cbiAgICAgICAgdm9pZCB0aGlzLmVuc3VyZUZpcmViYXNlU2Vzc2lvbk9uQm9vdHN0cmFwKCk7XG5cbiAgICAgICAgLy8gNS4gTGlzdGVuZXIgUkJBQyBGaXJlc3RvcmUg4oCUIHJlLWVzdGFibGVjZXIgdHJhcyByZWxvYWQgZGUgcMOhZ2luYS5cbiAgICAgICAgLy8gaGFuZGxlU3VjY2Vzc2Z1bEF1dGggbG8gY29uZmlndXJhIGVuIGVsIGxvZ2luIGluaWNpYWwsIHBlcm8gbm8gc29icmV2aXZlXG4gICAgICAgIC8vIHJlY2FyZ2FzOiBpbml0aWFsaXplKCkgcmVzdGF1cmEgZWwgc3RhdGUgZGVzZGUgc3RvcmFnZSBwZXJvIG5vIGVsIGxpc3RlbmVyLlxuICAgICAgICAvLyBzZXR1cEZpcmVzdG9yZVJCQUNTeW5jIGVzcGVyYSBpbnRlcm5hbWVudGUgYSBxdWUgRmlyZWJhc2UgQXV0aCBlc3TDqSBsaXN0YS5cbiAgICAgICAgaWYgKGNsYWltcz8udWlkKSB7XG4gICAgICAgICAgdGhpcy5zZXR1cEZpcmVzdG9yZVJCQUNTeW5jKGNsYWltcy51aWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIC8vIDQuIFRva2VuIGRlIGFjY2VzbyBleHBpcmFkby4gRWwgcmVmcmVzaCB0b2tlbiB2aXZlIGVuIGxhIGNvb2tpZVxuICAgICAgICAvLyBIdHRwT25seSAoSC0wNSksIG5vIGVuIHN0b3JhZ2Ug4oCUIGFzw60gcXVlIGVsIGRpc3BhcmFkb3IgeWEgbm8gZXNcbiAgICAgICAgLy8gXCJoYXkgcmVmcmVzaCBlbiBzdG9yYWdlXCIgc2lubyBcImhhYsOtYSB1biBhY2Nlc3MgdG9rZW5cIiAoc2VzacOzblxuICAgICAgICAvLyBwcmV2aWEpLiBFbCAvcmVmcmVzaCBkZSBmb25kbyB1c2EgbGEgY29va2llOyBzaSBubyBlcyB2w6FsaWRhLCBmYWxsYVxuICAgICAgICAvLyB5IGNhZW1vcyBhIHNpZ25PdXQgKGNhdGNoIG3DoXMgYWJham8pLlxuICAgICAgICAvL1xuICAgICAgICAvLyBOTyBibG9xdWVhbW9zIGVsIGJvb3RzdHJhcCBlc3BlcmFuZG8gbGEgcmVkOiB1biAvcmVmcmVzaCBlbiB1bmFcbiAgICAgICAgLy8gTGFtYmRhIGZyw61hIHNvbiAyLTVzIGRlIHBhbnRhbGxhIGVuIGJsYW5jbyAoQW5ndWxhciBubyByZW5kZXJpemFcbiAgICAgICAgLy8gbmFkYSBoYXN0YSBxdWUgZWwgQVBQX0lOSVRJQUxJWkVSIHJlc3VlbHZlKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUmVzdGF1cmFjacOzbiBvcHRpbWlzdGE6IGVsIGFjY2VzcyB0b2tlbiBleHBpcsOzIHBlcm8gc3VzIGNsYWltc1xuICAgICAgICAvLyAodWlkL2VtYWlsL3JvbGVzKSBzaWd1ZW4gZGVjb2RpZmljYWJsZXMg4oCUIGBwYXJzZVRva2VuYCBOTyB2YWxpZGFcbiAgICAgICAgLy8gYGV4cGAuIFJlc3RhdXJhbW9zIGxhIHNlc2nDs24gZGVzZGUgZXNvcyBjbGFpbXMgcGFyYSBxdWUgbGEgYXBwXG4gICAgICAgIC8vIHJlbmRlcmljZSBlbCBzaGVsbCBhdXRlbnRpY2FkbyBkZSBpbm1lZGlhdG8sIHkgZGlzcGFyYW1vcyBlbFxuICAgICAgICAvLyAvcmVmcmVzaCBlbiBzZWd1bmRvIHBsYW5vIChmaXJlLWFuZC1mb3JnZXQpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTZWd1cmlkYWQgZGUgbGEgdmVudGFuYSBzdWItc2VndW5kbyBhbnRlcyBkZSBxdWUgZWwgcmVmcmVzaCBsbGVndWU6XG4gICAgICAgIC8vIGN1YWxxdWllciBBUEkgY2FsbCBzYWxlIGNvbiBlbCB0b2tlbiBleHBpcmFkbyDihpIgNDAxIOKGkiBlbFxuICAgICAgICAvLyBhdXRoSW50ZXJjZXB0b3IgcmVmcmVzY2EgKyByZWludGVudGEgYXV0b23DoXRpY2FtZW50ZS4gU2kgZWwgcmVmcmVzaFxuICAgICAgICAvLyBkZSBmb25kbyBmYWxsYSDihpIgc2lnbk91dCArIGNsZWFyU3RhdGUuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIGJvb3RzdHJhcCDigJQgYWNjZXNzIHRva2VuIGV4cGlyZWQsIHJlZnJlc2hpbmcgaW4gYmFja2dyb3VuZCcpO1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZXN0b3JlRnJvbVN0b3JhZ2Uoc3RvcmVkU3RhdGUpO1xuXG4gICAgICAgIGNvbnN0IGV4cGlyZWRDbGFpbXMgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgaWYgKGV4cGlyZWRDbGFpbXMpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVVc2VySW5mbyhleHBpcmVkQ2xhaW1zLnVpZCwgZXhwaXJlZENsYWltcy5lbWFpbCk7XG4gICAgICAgICAgaWYgKGV4cGlyZWRDbGFpbXMub3JnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVBY3RpdmVPcmcoZXhwaXJlZENsYWltcy5vcmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXhwaXJlZENsYWltcy51aWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBGaXJlc3RvcmVSQkFDU3luYyhleHBpcmVkQ2xhaW1zLnVpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVmcmVzaCBlbiBzZWd1bmRvIHBsYW5vIOKAlCBOTyBzZSBoYWNlIGF3YWl0OiBpbml0aWFsaXplKCkgcmVzdWVsdmUgeWEuXG4gICAgICAgIGZpcnN0VmFsdWVGcm9tKHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKCkpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gYm9vdHN0cmFwIOKAlCBiYWNrZ3JvdW5kIHJlZnJlc2ggZmFpbGVkLCBzaWduaW5nIG91dCcpO1xuICAgICAgICAgIHRoaXMuc2lnbk91dEZpcmViYXNlKCk7XG4gICAgICAgICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcbiAgICAgICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS4gSW5pY2lhciBzaW5jcm9uaXphY2nDs24gZW50cmUgcGVzdGHDsWFzXG4gICAgaWYgKHRoaXMuY29uZmlnPy5lbmFibGVUYWJTeW5jKSB7XG4gICAgICB0aGlzLnN5bmNTZXJ2aWNlLnN0YXJ0KCk7XG4gICAgICB0aGlzLnN5bmNTdWJzY3JpcHRpb24gPSB0aGlzLnN5bmNTZXJ2aWNlLm9uRXZlbnQkLnN1YnNjcmliZShldmVudCA9PlxuICAgICAgICB0aGlzLmhhbmRsZVN5bmNFdmVudChldmVudClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0TG9hZGluZyhmYWxzZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLnN5bmNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy50ZWFyZG93bkZpcmVzdG9yZVJCQUNTeW5jKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQVVURU5USUNBQ0nDk05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBzZXNpw7NuIGNvbiBlbWFpbCB5IGNvbnRyYXNlw7FhLlxuICAgKiBEZXRlY3RhIGF1dG9tw6F0aWNhbWVudGUgbGEgcGxhdGFmb3JtYSBwYXJhIGlkZW50aWZpY2FyIGRpc3Bvc2l0aXZvcyBudWV2b3MuXG4gICAqL1xuICBzaWduaW4ocmVxdWVzdDogU2lnbmluUmVxdWVzdCk6IE9ic2VydmFibGU8U2lnbmluUmVzcG9uc2U+IHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhckVycm9yKCk7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJNRkFQZW5kaW5nKCk7XG5cbiAgICAvLyBBZ3JlZ2FyIGluZm8gZGUgcGxhdGFmb3JtYSBwYXJhIGRldmljZSBkZXRlY3Rpb25cbiAgICBjb25zdCBwbGF0Zm9ybUluZm8gPSB0aGlzLmRldGVjdFBsYXRmb3JtSW5mbygpO1xuICAgIGNvbnN0IGVucmljaGVkUmVxdWVzdDogU2lnbmluUmVxdWVzdCA9IHtcbiAgICAgIC4uLnJlcXVlc3QsXG4gICAgICBwbGF0Zm9ybTogcmVxdWVzdC5wbGF0Zm9ybSA/PyBwbGF0Zm9ybUluZm8ucGxhdGZvcm0sXG4gICAgICBicm93c2VyOiByZXF1ZXN0LmJyb3dzZXIgPz8gcGxhdGZvcm1JbmZvLmJyb3dzZXIsXG4gICAgICBvczogcmVxdWVzdC5vcyA/PyBwbGF0Zm9ybUluZm8ub3MsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxTaWduaW5SZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zaWduaW5gLCBlbnJpY2hlZFJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UubWZhUmVxdWlyZWQpIHtcbiAgICAgICAgICAvLyBNRkEgcmVxdWVyaWRvIC0gZ3VhcmRhciBlc3RhZG8gdGVtcG9yYWxcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRNRkFQZW5kaW5nKHtcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbWZhVG9rZW46IHJlc3BvbnNlLm1mYVRva2VuISxcbiAgICAgICAgICAgIG1ldGhvZDogcmVzcG9uc2UubWZhTWV0aG9kISxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgIC8vIExvZ2luIGV4aXRvc28gc2luIE1GQVxuICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2UpO1xuXG4gICAgICAgICAgLy8gTm90aWZpY2FyIHNpIGVzIHVuIGRpc3Bvc2l0aXZvIG51ZXZvXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmlzTmV3RGV2aWNlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBOZXcgZGV2aWNlIGRldGVjdGVkOicsIHJlc3BvbnNlLmRldmljZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPQVVUSCAoTG9naW4gc29jaWFsKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIHNlc2nDs24gY29uIE9BdXRoIChHb29nbGUsIEFwcGxlLCBNaWNyb3NvZnQpLlxuICAgKiBBYnJlIHVuIHBvcHVwIHBhcmEgZWwgZmx1am8gZGUgYXV0ZW50aWNhY2nDs24uXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFByb3ZlZWRvciBPQXV0aCAoJ2dvb2dsZScsICdhcHBsZScsICdtaWNyb3NvZnQnKVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHF1ZSBlbWl0ZSBTaWduaW5SZXNwb25zZSBjdWFuZG8gc2UgY29tcGxldGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0aGlzLmF1dGguc2lnbmluV2l0aE9BdXRoKCdnb29nbGUnKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6ICgpID0+IHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKSxcbiAgICogICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignT0F1dGggZmFpbGVkOicsIGVycilcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2lnbmluV2l0aE9BdXRoKHByb3ZpZGVyOiBPQXV0aFByb3ZpZGVyKTogT2JzZXJ2YWJsZTxTaWduaW5SZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhck1GQVBlbmRpbmcoKTtcblxuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5zdGFydEZsb3cocHJvdmlkZXIpLnBpcGUoXG4gICAgICB0YXAocmVzdWx0ID0+IHtcbiAgICAgICAgLy8gTUZBIHJlcXVlcmlkbyB0cmFzIE9BdXRoIOKAlCBndWFyZGFyIGVzdGFkbyB0ZW1wb3JhbCwgTk8gYXV0ZW50aWNhci5cbiAgICAgICAgLy8gRWwgbG9naW4gY29tcG9uZW50IHJlYWNjaW9uYSBhIGBtZmFQZW5kaW5nKClgIHkgYWJyZSBlbCBtb2RhbCB2ZXJpZnkuXG4gICAgICAgIGlmIChyZXN1bHQubWZhUmVxdWlyZWQpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRNRkFQZW5kaW5nKHtcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbWZhVG9rZW46IHJlc3VsdC5tZmFUb2tlbiEsXG4gICAgICAgICAgICBtZXRob2Q6IHJlc3VsdC5tZmFNZXRob2QhLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnRpciBPQXV0aFJlc3VsdCBhIFNpZ25pblJlc3BvbnNlIGNvbXBhdGlibGVcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFNpZ25pblJlc3BvbnNlID0ge1xuICAgICAgICAgIG9wZXJhdGlvbklkOiAnb2F1dGgnLFxuICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXN1bHQuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgcmVmcmVzaFRva2VuOiByZXN1bHQucmVmcmVzaFRva2VuLFxuICAgICAgICAgIGZpcmViYXNlVG9rZW46IHJlc3VsdC5maXJlYmFzZVRva2VuLFxuICAgICAgICAgIGV4cGlyZXNJbjogcmVzdWx0LmV4cGlyZXNJbixcbiAgICAgICAgICByb2xlczogcmVzdWx0LnJvbGVzLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiByZXN1bHQucGVybWlzc2lvbnMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2UpO1xuICAgICAgfSksXG4gICAgICBtYXAocmVzdWx0ID0+XG4gICAgICAgIHJlc3VsdC5tZmFSZXF1aXJlZFxuICAgICAgICAgID8gKHtcbiAgICAgICAgICAgICAgb3BlcmF0aW9uSWQ6ICdvYXV0aCcsXG4gICAgICAgICAgICAgIG1mYVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBtZmFUb2tlbjogcmVzdWx0Lm1mYVRva2VuLFxuICAgICAgICAgICAgICBtZmFNZXRob2Q6IHJlc3VsdC5tZmFNZXRob2QsXG4gICAgICAgICAgICB9IGFzIFNpZ25pblJlc3BvbnNlKVxuICAgICAgICAgIDogKHtcbiAgICAgICAgICAgICAgb3BlcmF0aW9uSWQ6ICdvYXV0aCcsXG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXN1bHQuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVzdWx0LnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgICAgZmlyZWJhc2VUb2tlbjogcmVzdWx0LmZpcmViYXNlVG9rZW4sXG4gICAgICAgICAgICAgIGV4cGlyZXNJbjogcmVzdWx0LmV4cGlyZXNJbixcbiAgICAgICAgICAgICAgcm9sZXM6IHJlc3VsdC5yb2xlcyxcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHJlc3VsdC5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIH0gYXMgU2lnbmluUmVzcG9uc2UpXG4gICAgICApLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIGNvbnN0IGF1dGhFcnJvcjogQXV0aEVycm9yID0ge1xuICAgICAgICAgIGNvZGU6IGVycm9yLmNvZGUgfHwgJ09BVVRIX0VSUk9SJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8ICdFcnJvciBkZSBhdXRlbnRpY2FjacOzbiBPQXV0aCcsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEVycm9yKGF1dGhFcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGF1dGhFcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmluY3VsYSB1biBwcm92ZWVkb3IgT0F1dGggYWRpY2lvbmFsIGEgbGEgY3VlbnRhIGFjdHVhbC5cbiAgICogUmVxdWllcmUgcXVlIGVsIHVzdWFyaW8gZXN0w6kgYXV0ZW50aWNhZG8uXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFByb3ZlZWRvciBPQXV0aCBhIHZpbmN1bGFyXG4gICAqL1xuICBsaW5rT0F1dGhQcm92aWRlcihwcm92aWRlcjogT0F1dGhQcm92aWRlcik6IE9ic2VydmFibGU8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2Uuc3RhcnRMaW5rRmxvdyhwcm92aWRlcikucGlwZShcbiAgICAgIG1hcCgoKSA9PiAoeyBzdWNjZXNzOiB0cnVlIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICBjb25zdCBhdXRoRXJyb3I6IEF1dGhFcnJvciA9IHtcbiAgICAgICAgICBjb2RlOiBlcnJvci5jb2RlIHx8ICdMSU5LX0VSUk9SJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8ICdFcnJvciBhbCB2aW5jdWxhciBwcm92ZWVkb3InLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRFcnJvcihhdXRoRXJyb3IpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBhdXRoRXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbG9zIHByb3ZlZWRvcmVzIE9BdXRoIHZpbmN1bGFkb3MgYWwgdXN1YXJpby5cbiAgICovXG4gIGdldExpbmtlZFByb3ZpZGVycygpOiBPYnNlcnZhYmxlPExpbmtlZFByb3ZpZGVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2UuZ2V0TGlua2VkUHJvdmlkZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdmluY3VsYSB1biBwcm92ZWVkb3IgT0F1dGggZGUgbGEgY3VlbnRhLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBQcm92ZWVkb3IgYSBkZXN2aW5jdWxhclxuICAgKi9cbiAgdW5saW5rT0F1dGhQcm92aWRlcihwcm92aWRlcjogT0F1dGhQcm92aWRlcik6IE9ic2VydmFibGU8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2UudW5saW5rUHJvdmlkZXIocHJvdmlkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGFibGVjZSBjb250cmFzZcOxYSBwYXJhIHVzdWFyaW9zIHF1ZSBzb2xvIHRpZW5lbiBPQXV0aC5cbiAgICogUGVybWl0ZSBxdWUgdXN1YXJpb3MgT0F1dGgtb25seSBwdWVkYW4gdGFtYmnDqW4gdXNhciBlbWFpbC9wYXNzd29yZC5cbiAgICpcbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gTnVldmEgY29udHJhc2XDsWFcbiAgICovXG4gIHNldFBhc3N3b3JkRm9yT0F1dGhVc2VyKHBhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHsgc3VjY2VzczogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnNldFBhc3N3b3JkKHBhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIGNvbnRyYXNlw7FhIGVzdGFibGVjaWRhLlxuICAgKiDDmnRpbCBwYXJhIG1vc3RyYXIvb2N1bHRhciBvcGNpb25lcyBkZSBjYW1iaW8gZGUgY29udHJhc2XDsWEuXG4gICAqL1xuICBjaGVja0hhc1Bhc3N3b3JkKCk6IE9ic2VydmFibGU8SGFzUGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5oYXNQYXNzd29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdHJhIHVuIG51ZXZvIHVzdWFyaW8uXG4gICAqIEVsIHVzdWFyaW8gcXVlZGEgZW4gZXN0YWRvIFBFTkRJTkcgaGFzdGEgdmVyaWZpY2FyIHN1IGVtYWlsLlxuICAgKi9cbiAgc2lnbnVwKHJlcXVlc3Q6IFNpZ251cFJlcXVlc3QpOiBPYnNlcnZhYmxlPFNpZ251cFJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8U2lnbnVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vc2lnbnVwYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2EgZW1haWwgY29uIGPDs2RpZ28gZGUgNiBkw61naXRvcy5cbiAgICogU2kgZXMgZXhpdG9zbywgaGFjZSBhdXRvLWxvZ2luIHkgcmV0b3JuYSB0b2tlbnMuXG4gICAqL1xuICB2ZXJpZnlFbWFpbChyZXF1ZXN0OiBWZXJpZnlFbWFpbFJlcXVlc3QpOiBPYnNlcnZhYmxlPFZlcmlmeUVtYWlsUmVzcG9uc2U+IHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhckVycm9yKCk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8VmVyaWZ5RW1haWxSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS92ZXJpZnktZW1haWxgLCByZXF1ZXN0KS5waXBlKFxuICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnZlcmlmaWVkICYmIHJlc3BvbnNlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgLy8gQXV0by1sb2dpbjogZ3VhcmRhciB0b2tlbnMgeSBhY3R1YWxpemFyIGVzdGFkb1xuICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2UgYXMgdW5rbm93biBhcyBTaWduaW5SZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWVudsOtYSBjw7NkaWdvIGRlIHZlcmlmaWNhY2nDs24gYWwgZW1haWwuXG4gICAqL1xuICByZXNlbmRDb2RlKHJlcXVlc3Q6IFJlc2VuZENvZGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxSZXNlbmRDb2RlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxSZXNlbmRDb2RlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcmVzZW5kLWNvZGVgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBjw7NkaWdvIE1GQS5cbiAgICovXG4gIHZlcmlmeU1GQShjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1GQVZlcmlmeVJlc3BvbnNlPiB7XG4gICAgY29uc3QgbWZhU3RhdGUgPSB0aGlzLm1mYVBlbmRpbmcoKTtcbiAgICBpZiAoIW1mYVN0YXRlLm1mYVRva2VuKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAoe1xuICAgICAgICBjb2RlOiAnTUZBX05PVF9QRU5ESU5HJyxcbiAgICAgICAgbWVzc2FnZTogJ05vIGhheSB2ZXJpZmljYWNpw7NuIE1GQSBwZW5kaWVudGUnLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQVZlcmlmeVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS92ZXJpZnlgLCB7XG4gICAgICAgIG1mYVRva2VuOiBtZmFTdGF0ZS5tZmFUb2tlbixcbiAgICAgICAgY29kZSxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhck1GQVBlbmRpbmcoKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNjYSBlbCB0b2tlbiBkZSBhY2Nlc28uXG4gICAqIEltcGxlbWVudGEgdG9rZW4gcm90YXRpb246IGNhZGEgcmVmcmVzaCBnZW5lcmEgdW4gbnVldm8gcmVmcmVzaCB0b2tlblxuICAgKiBxdWUgZWwgY2xpZW50ZSBkZWJlIGd1YXJkYXIgcGFyYSBlbCBwcsOzeGltbyByZWZyZXNoLlxuICAgKi9cbiAgcmVmcmVzaEFjY2Vzc1Rva2VuKCk6IE9ic2VydmFibGU8UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgLy8gSC0wNTogZWwgcmVmcmVzaCB0b2tlbiB2aXZlIGVuIHVuYSBjb29raWUgSHR0cE9ubHkgKG5vIGVuIHN0b3JhZ2UpLiBFbFxuICAgIC8vIGdhdGUgeWEgTk8gZXhpZ2UgdGVuZXJsbyBlbiBtZW1vcmlhIOKAlCBsYSBjb29raWUgbG8gYXBvcnRhLiBEdXJhbnRlIGxhXG4gICAgLy8gdHJhbnNpY2nDs24sIHNpIHRvZGF2w61hIGhheSB1biByZWZyZXNoIGVuIGVzdGFkbyAoc2VzacOzbiB2aWVqYSksIHNlIG1hbmRhXG4gICAgLy8gZW4gZWwgYm9keSAoZWwgYmFja2VuZCBwcmlvcml6YSBib2R5IHNvYnJlIGNvb2tpZSkuIHdpdGhDcmVkZW50aWFscyBoYWNlXG4gICAgLy8gcXVlIGVsIGJyb3dzZXIgZW52w61lIGxhIGNvb2tpZSBlbiBsYSByZXF1ZXN0IGNyb3NzLXNpdGUuXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5zdGF0ZSgpLnJlZnJlc2hUb2tlbjtcbiAgICBjb25zdCBib2R5ID0gcmVmcmVzaFRva2VuID8geyByZWZyZXNoVG9rZW4gfSA6IHt9O1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVmcmVzaFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3JlZnJlc2hgLCBib2R5LCB7IHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIHJlc3BvbnNlLmV4cGlyZXNJbiAqIDEwMDA7XG5cbiAgICAgICAgICAvLyBUb2tlbiByb3RhdGlvbjogZWwgYWNjZXNzIHRva2VuIHNlIGd1YXJkYTsgZWwgcmVmcmVzaCByb3RhZG8gdmlhamEgZW5cbiAgICAgICAgICAvLyBsYSBjb29raWUgSHR0cE9ubHkgKE5PIHNlIHBlcnNpc3RlIGVuIGxvY2FsU3RvcmFnZSDigJQgSC0wNSkuXG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4sIHJlc3BvbnNlLmV4cGlyZXNJbik7XG4gICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWNjZXNzVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4sIGV4cGlyZXNBdCk7XG5cbiAgICAgICAgICBpZiAodGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24gJiYgcmVzcG9uc2UuZmlyZWJhc2VUb2tlbikge1xuICAgICAgICAgICAgdGhpcy5zaWduSW5XaXRoRmlyZWJhc2UocmVzcG9uc2UuZmlyZWJhc2VUb2tlbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5zdGFydFJlZnJlc2hUaW1lcigpO1xuICAgICAgICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHtcbiAgICAgICAgICAgIHR5cGU6ICdUT0tFTl9SRUZSRVNIJyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IHJlc3BvbnNlLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgICByZWZyZXNoVG9rZW46IHJlc3BvbnNlLnJlZnJlc2hUb2tlbiwgLy8gTlVFVk86IHNpbmNyb25pemFyIGVudHJlIHRhYnNcbiAgICAgICAgICAgICAgZXhwaXJlc0F0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5lamEgYXV0ZW50aWNhY2nDs24gZXhpdG9zYSBkZXNkZSBmdWVudGVzIGV4dGVybmFzIChPQXV0aCwgZXRjKS5cbiAgICogR3VhcmRhIHRva2VucywgYWN0dWFsaXphIGVzdGFkbywgaW5pY2lhIEZpcmViYXNlIHNpIGNvcnJlc3BvbmRlLlxuICAgKlxuICAgKiBAcGFyYW0gYXV0aFJlc3VsdCAtIFJlc3VsdGFkbyBkZSBhdXRlbnRpY2FjacOzbiBjb24gdG9rZW5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRGVzZGUgdW4gZmx1am8gT0F1dGggZXh0ZXJub1xuICAgKiBleHRlcm5hbE9BdXRoLnNpZ25JbigpLnN1YnNjcmliZSh7XG4gICAqICAgbmV4dDogKHJlc3VsdCkgPT4ge1xuICAgKiAgICAgdGhpcy5hdXRoU2VydmljZS5zZXRFeHRlcm5hbEF1dGgocmVzdWx0KTtcbiAgICogICB9XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHNldEV4dGVybmFsQXV0aChhdXRoUmVzdWx0OiB7XG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgICBmaXJlYmFzZVRva2VuPzogc3RyaW5nO1xuICAgIGV4cGlyZXNJbjogbnVtYmVyO1xuICAgIHJvbGVzPzogc3RyaW5nW107XG4gICAgcGVybWlzc2lvbnM/OiBzdHJpbmdbXTtcbiAgfSk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgoe1xuICAgICAgLi4uYXV0aFJlc3VsdCxcbiAgICAgIG9wZXJhdGlvbklkOiAnZXh0ZXJuYWwtYXV0aCcsXG4gICAgICB0b2tlblR5cGU6ICdCZWFyZXInLFxuICAgIH0gYXMgU2lnbmluUmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENpZXJyYSBzZXNpw7NuIHRyYXMgcGVkaXIgY29uZmlybWFjacOzbiBhbCB1c3VhcmlvLlxuICAgKlxuICAgKiBNdWVzdHJhIHVuIGRpw6Fsb2dvIG5hdGl2byAoZXN0aWxvIGRlc3RydWN0aXZvKS4gU2kgZWwgdXN1YXJpbyBjb25maXJtYSxcbiAgICogZWplY3V0YSBgbG9nb3V0KClgLiBTaSBjYW5jZWxhLCBubyBwYXNhIG5hZGEuXG4gICAqXG4gICAqIFRleHRvIHBvciBkZWZlY3RvIGRlc2RlIGBfZ2xvYmFsYCBpMThuOiBgbG9nb3V0Q29uZmlybVRpdGxlYCxcbiAgICogYGxvZ291dENvbmZpcm1NZXNzYWdlYCwgYGxvZ291dGAsIGBjYW5jZWxgLiBPdmVycmlkZSB2aWEgYG9wdHNgLlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIHNpIGVsIHVzdWFyaW8gY29uZmlybcOzIChsb2dvdXQgZWplY3V0YWRvKSwgZmFsc2Ugc2kgY2FuY2Vsw7MuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIG9uTG9nb3V0Q2xpY2soKSB7IHRoaXMuYXV0aC5sb2dvdXRXaXRoQ29uZmlybWF0aW9uKCk7IH1cbiAgICovXG4gIGFzeW5jIGxvZ291dFdpdGhDb25maXJtYXRpb24ob3B0cz86IHtcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgIGNvbmZpcm1UZXh0Pzogc3RyaW5nO1xuICAgIGNhbmNlbFRleHQ/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0ID0gKGtleTogc3RyaW5nLCBmYWxsYmFjazogc3RyaW5nKSA9PiB0aGlzLmkxOG5TZXJ2aWNlPy50KGtleSkgfHwgZmFsbGJhY2s7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm1EZXN0cnVjdGl2ZSh7XG4gICAgICB0aXRsZTogb3B0cz8udGl0bGUgPz8gdCgnbG9nb3V0Q29uZmlybVRpdGxlJywgJ0NlcnJhciBzZXNpw7NuJyksXG4gICAgICBtZXNzYWdlOiBvcHRzPy5tZXNzYWdlID8/IHQoJ2xvZ291dENvbmZpcm1NZXNzYWdlJywgJ8K/U2VndXJvIHF1ZSBkZXNlYXMgY2VycmFyIHNlc2nDs24/JyksXG4gICAgICBjb25maXJtQnV0dG9uOiB7IHRleHQ6IG9wdHM/LmNvbmZpcm1UZXh0ID8/IHQoJ2xvZ291dCcsICdDZXJyYXIgc2VzacOzbicpIH0sXG4gICAgICBjYW5jZWxCdXR0b246IHsgdGV4dDogb3B0cz8uY2FuY2VsVGV4dCA/PyB0KCdjYW5jZWwnLCAnQ2FuY2VsYXInKSB9LFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3VsdC5jb25maXJtZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENpZXJyYSBzZXNpw7NuLlxuICAgKi9cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IHRoaXMuc3RhdGUoKS5yZWZyZXNoVG9rZW47XG5cbiAgICAvLyBFbGltaW5hciBkaXNwb3NpdGl2byBkZWwgYmFja2VuZCBhbnRlcyBkZSBjZXJyYXIgc2VzacOzblxuICAgIGF3YWl0IHRoaXMudW5yZWdpc3RlckRldmljZSgpO1xuXG4gICAgLy8gTm90aWZpY2FyIGFsIGJhY2tlbmQgKGZpcmUgYW5kIGZvcmdldCkuIEVsIHJlZnJlc2ggdG9rZW4gdmEgcG9yIGxhIGNvb2tpZVxuICAgIC8vIEh0dHBPbmx5IChILTA1KTsgc2kgYcO6biBoYXkgdW5vIGVuIGVzdGFkbyAoc2VzacOzbiB2aWVqYSkgc2UgbWFuZGEgZW4gZWxcbiAgICAvLyBib2R5LiBFbCBiYWNrZW5kIHJldm9jYSBsYSBzZXNpw7NuIHkgZXhwaXJhIGxhIGNvb2tpZS4gd2l0aENyZWRlbnRpYWxzXG4gICAgLy8gZW52w61hIGxhIGNvb2tpZSBjcm9zcy1zaXRlLlxuICAgIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoYCR7dGhpcy5iYXNlVXJsfS9sb2dvdXRgLCByZWZyZXNoVG9rZW4gPyB7IHJlZnJlc2hUb2tlbiB9IDoge30sIHtcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgLy8gQ2VycmFyIHNlc2nDs24gZGUgRmlyZWJhc2Ugc2kgZXN0w6EgaW50ZWdyYWRvXG4gICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcblxuICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHsgdHlwZTogJ0xPR09VVCcgfSk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuY29uZmlnPy5sb2dpblJvdXRlXSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUZBIFNFVFVQICh1c3VhcmlvIGF1dGVudGljYWRvKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ29uZmlndXJhIE1GQSBwYXJhIGVsIHVzdWFyaW8uXG4gICAqL1xuICBzZXR1cE1GQShtZXRob2Q6IE1GQU1ldGhvZCwgcGhvbmU/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1GQVNldHVwUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFTZXR1cFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS9zZXR1cGAsIHsgbWV0aG9kLCBwaG9uZSB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maXJtYSBsYSBjb25maWd1cmFjacOzbiBkZSBNRkEuXG4gICAqL1xuICBjb25maXJtTUZBKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8TUZBQ29uZmlybVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8TUZBQ29uZmlybVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS9jb25maXJtYCwgeyBjb2RlIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2hhYmlsaXRhIE1GQS4gQWNlcHRhIGBwYXNzd29yZGAgbyBgbWZhQ29kZWAgKHVubyByZXF1ZXJpZG8pLlxuICAgKiBgbWZhQ29kZWAgZXMgcGFyYSB1c3VhcmlvcyBPQXV0aC1vbmx5IGNvbiBUT1RQIHF1ZSBubyB0aWVuZW4gY29udHJhc2XDsWEuXG4gICAqL1xuICBkaXNhYmxlTUZBKGlucHV0OiBNRkFEaXNhYmxlUmVxdWVzdCk6IE9ic2VydmFibGU8TUZBRGlzYWJsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8TUZBRGlzYWJsZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS9kaXNhYmxlYCwgaW5wdXQpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgc2VuZE1GQURpc2FibGVDb2RlKCk6IE9ic2VydmFibGU8eyBvcGVyYXRpb25JZDogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDx7IG9wZXJhdGlvbklkOiBzdHJpbmcgfT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvZGlzYWJsZS1jb2RlYCwge30pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRPVFAgTUZBIChHb29nbGUgQXV0aGVudGljYXRvcilcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBjb25maWd1cmFjacOzbiBkZSBUT1RQIE1GQS5cbiAgICogUmV0b3JuYSBlbCBzZWNyZXRvLCBVUkwgcGFyYSBRUiBjb2RlIHkgY8OzZGlnb3MgZGUgcmVzcGFsZG8uXG4gICAqL1xuICBzZXR1cFRPVFAoKTogT2JzZXJ2YWJsZTxUT1RQU2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFRPVFBTZXR1cFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS90b3RwL3NldHVwYCwge30pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIGVsIGPDs2RpZ28gVE9UUCB5IGFjdGl2YSBNRkEuXG4gICAqIERlYmUgbGxhbWFyc2UgZGVzcHXDqXMgZGUgc2V0dXBUT1RQIGNvbiBlbCBjw7NkaWdvIGRlbCBhdXRoZW50aWNhdG9yLlxuICAgKi9cbiAgdmVyaWZ5VE9UUFNldHVwKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8VE9UUFZlcmlmeVNldHVwUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxUT1RQVmVyaWZ5U2V0dXBSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC92ZXJpZnlgLCB7IGNvZGUgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnZW5lcmEgbG9zIGPDs2RpZ29zIGRlIHJlc3BhbGRvIFRPVFAuXG4gICAqIExvcyBjw7NkaWdvcyBhbnRlcmlvcmVzIHNvbiBpbnZhbGlkYWRvcy5cbiAgICovXG4gIHJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpOiBPYnNlcnZhYmxlPFJlZ2VuZXJhdGVCYWNrdXBDb2Rlc1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVnZW5lcmF0ZUJhY2t1cENvZGVzUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvYmFja3VwLWNvZGVzYCwge30pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGEgY2FudGlkYWQgZGUgY8OzZGlnb3MgZGUgcmVzcGFsZG8gcmVzdGFudGVzLlxuICAgKi9cbiAgZ2V0QmFja3VwQ29kZXNDb3VudCgpOiBPYnNlcnZhYmxlPEJhY2t1cENvZGVzQ291bnRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8QmFja3VwQ29kZXNDb3VudFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS90b3RwL2JhY2t1cC1jb2Rlcy9jb3VudGApXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2FjdGl2YSBUT1RQIE1GQSAocmVxdWllcmUgY29udHJhc2XDsWEpLlxuICAgKi9cbiAgZGlzYWJsZVRPVFAocGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8VE9UUERpc2FibGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFRPVFBEaXNhYmxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvZGlzYWJsZWAsIHsgcGFzc3dvcmQgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gT1JHQU5JWkFDSU9ORVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENhbWJpYSBsYSBvcmdhbml6YWNpw7NuIGFjdGl2YSBkZWwgdXN1YXJpby5cbiAgICogR2VuZXJhIHVuIG51ZXZvIEZpcmViYXNlIHRva2VuIGNvbiBlbCBhY3RpdmVPcmcgYWN0dWFsaXphZG8uXG4gICAqXG4gICAqIEBwYXJhbSBvcmdhbml6YXRpb25JZCAtIElEIGRlIGxhIG9yZ2FuaXphY2nDs24gYSBsYSBxdWUgY2FtYmlhclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbiBlbCBudWV2byBGaXJlYmFzZSB0b2tlbiB5IGFjdGl2ZU9yZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC5zd2l0Y2hPcmcoJ29yZ194eXo3ODknKSk7XG4gICAqIC8vIEZpcmViYXNlIHlhIGVzdMOhIHJlLWF1dGVudGljYWRvIGNvbiBsYSBudWV2YSBvcmdcbiAgICogY29uc3QgYWN0aXZlT3JnID0gYXdhaXQgdGhpcy5maXJlYmFzZS5nZXRBY3RpdmVPcmcoKTtcbiAgICogYGBgXG4gICAqL1xuICBzd2l0Y2hPcmcob3JnYW5pemF0aW9uSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U3dpdGNoT3JnUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8U3dpdGNoT3JnUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vc3dpdGNoLW9yZ2AsIHsgb3JnYW5pemF0aW9uSWQgfSkucGlwZShcbiAgICAgIHN3aXRjaE1hcChyZXNwb25zZSA9PiB7XG4gICAgICAgIC8vIFJlLWF1dGVudGljYXIgZW4gRmlyZWJhc2UgY29uIGVsIG51ZXZvIHRva2VuXG4gICAgICAgIC8vIFVzYXIgc3dpdGNoTWFwICsgZnJvbSBwYXJhIGVzcGVyYXIgYSBxdWUgRmlyZWJhc2UgY29tcGxldGVcbiAgICAgICAgY29uc3QgZmlyZWJhc2VBdXRoJCA9IHJlc3BvbnNlLmZpcmViYXNlVG9rZW5cbiAgICAgICAgICA/IGZyb20odGhpcy5zaWduSW5XaXRoRmlyZWJhc2UocmVzcG9uc2UuZmlyZWJhc2VUb2tlbikpXG4gICAgICAgICAgOiBvZih1bmRlZmluZWQpO1xuXG4gICAgICAgIHJldHVybiBmaXJlYmFzZUF1dGgkLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEFjdHVhbGl6YXIgYWN0aXZlT3JnIGVuIGVsIHN0YXRlIGxvY2FsXG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVBY3RpdmVPcmcocmVzcG9uc2UuYWN0aXZlT3JnKTtcbiAgICAgICAgICAgIC8vIFBlcnNpc3RpciBlbCBudWV2byBhY2Nlc3MgdG9rZW4gKGluY2x1eWUgYWN0aXZlT3JnIGFjdHVhbGl6YWRvKS5cbiAgICAgICAgICAgIC8vIFNpbiBlc3RvLCBlbCBib290c3RyYXAgcG9zdC1yZWZyZXNoIHVzYSBlbCBKV1QgY2FjaGVhZG8gY29uIGxhIG9yZyBhbnRlcmlvci5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgKHJlc3BvbnNlLmV4cGlyZXNJbiA/PyA5MDApICogMTAwMDtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4sIHJlc3BvbnNlLmV4cGlyZXNJbiA/PyA5MDApO1xuICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY2Nlc3NUb2tlbihyZXNwb25zZS5hY2Nlc3NUb2tlbiwgZXhwaXJlc0F0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5vdGlmaWNhciBjYW1iaW8gYSBvdHJhcyBwZXN0YcOxYXNcbiAgICAgICAgICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHtcbiAgICAgICAgICAgICAgdHlwZTogJ09SR19TV0lUQ0gnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB7IGFjdGl2ZU9yZzogcmVzcG9uc2UuYWN0aXZlT3JnIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyBSZXRvcm5hciByZXNwb25zZSBvcmlnaW5hbCBkZXNwdcOpcyBkZSBxdWUgRmlyZWJhc2UgY29tcGxldGVcbiAgICAgICAgICBtYXAoKCkgPT4gcmVzcG9uc2UpXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUEVSRklMIERFIFVTVUFSSU9cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgcGVyZmlsIGRlbCB1c3VhcmlvIGF1dGVudGljYWRvLlxuICAgKiBJbmNsdXllIGluZm9ybWFjacOzbiBkZSBNRkEgeSB0ZWzDqWZvbm8uIEhpZHJhdGEgZWwgc3RhdGUgYXV0b23DoXRpY2FtZW50ZVxuICAgKiBjb24gYG5hbWUvaGFuZGxlL2F2YXRhclVybC9waG9uZWAgcGFyYSBxdWUgYGF1dGgudXNlcigpYCBsb3MgcmV0b3JuZS5cbiAgICovXG4gIGdldFByb2ZpbGUoKTogT2JzZXJ2YWJsZTxHZXRQcm9maWxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxHZXRQcm9maWxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcHJvZmlsZWApLnBpcGUoXG4gICAgICB0YXAocHJvZmlsZSA9PlxuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQcm9maWxlRmllbGRzKHtcbiAgICAgICAgICBuYW1lOiBwcm9maWxlLm5hbWUsXG4gICAgICAgICAgaGFuZGxlOiBwcm9maWxlLmhhbmRsZSA/PyBudWxsLFxuICAgICAgICAgIGF2YXRhclVybDogcHJvZmlsZS5hdmF0YXJVcmwgPz8gbnVsbCxcbiAgICAgICAgICBwaG9uZTogcHJvZmlsZS5waG9uZSA/PyBudWxsLFxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsaXphIGVsIHBlcmZpbCBkZWwgdXN1YXJpby4gU2luY3Jvbml6YSBzdGF0ZSBjb24gbG9zIG51ZXZvcyB2YWx1ZXNcbiAgICogKG5hbWUvcGhvbmUpIOKAlCBlbCBiYWNrZW5kIHJlc3BvbnNlIG5vIGxvcyBlY2hvJ2EgcGVybyBlbCBjYWxsZXIgeWEgdGllbmVcbiAgICogbG9zIHZhbG9yZXMgcXVlIG1hbmTDsy5cbiAgICovXG4gIHVwZGF0ZVByb2ZpbGUocmVxdWVzdDogVXBkYXRlUHJvZmlsZVJlcXVlc3QpOiBPYnNlcnZhYmxlPFVwZGF0ZVByb2ZpbGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVwZGF0ZVByb2ZpbGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9wcm9maWxlYCwgcmVxdWVzdCkucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQcm9maWxlRmllbGRzKHJlcXVlc3QpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsaXphIGVsIGF2YXRhciBkZWwgdXN1YXJpbyBlbiBlbCBiYWNrZW5kLiBTaW5jcm9uaXphIHN0YXRlIGNvbiBlbFxuICAgKiBgYXZhdGFyVXJsYCByZXRvcm5hZG8gcGFyYSBxdWUgZWwgaGVhZGVyIC8gZGFzaGJvYXJkIHNlIHJlZnJlc3F1ZW4gc2luXG4gICAqIG5lY2VzaWRhZCBkZSB1biBnZXRQcm9maWxlIGFkaWNpb25hbC5cbiAgICovXG4gIHVwZGF0ZUF2YXRhcihyZXF1ZXN0OiBVcGRhdGVBdmF0YXJSZXF1ZXN0KTogT2JzZXJ2YWJsZTxVcGRhdGVBdmF0YXJSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVwZGF0ZUF2YXRhclJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Byb2ZpbGUvYXZhdGFyYCwgcmVxdWVzdCkucGlwZShcbiAgICAgIHRhcChyZXMgPT4gdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyh7IGF2YXRhclVybDogcmVzLmF2YXRhclVybCB9KSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJFQ1VQRVJBQ0nDk04gREUgQ09OVFJBU0XDkUFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBlbCBwcm9jZXNvIGRlIHJlY3VwZXJhY2nDs24gZGUgY29udHJhc2XDsWEuXG4gICAqIEVudsOtYSB1biBjw7NkaWdvIGFsIGVtYWlsIGRlbCB1c3VhcmlvLlxuICAgKi9cbiAgZm9yZ290UGFzc3dvcmQocmVxdWVzdDogRm9yZ290UGFzc3dvcmRSZXF1ZXN0KTogT2JzZXJ2YWJsZTxGb3Jnb3RQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8Rm9yZ290UGFzc3dvcmRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9mb3Jnb3QtcGFzc3dvcmRgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldGVhIGxhIGNvbnRyYXNlw7FhIHVzYW5kbyBlbCBjw7NkaWdvIGVudmlhZG8gcG9yIGVtYWlsLlxuICAgKi9cbiAgcmVzZXRQYXNzd29yZChyZXF1ZXN0OiBSZXNldFBhc3N3b3JkUmVxdWVzdCk6IE9ic2VydmFibGU8UmVzZXRQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVzZXRQYXNzd29yZFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Jlc2V0LXBhc3N3b3JkYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhIHVuYSBjdWVudGEgcHJlLWFwcm92aXNpb25hZGEgcG9yIHVuYSBvcmdhbml6YWNpw7NuIChBRFItMDIzKTogZGVmaW5lXG4gICAqIGxhIGNvbnRyYXNlw7FhIGNvbiBlbCB0b2tlbiBkZWwgZW5sYWNlIGRlIGVtYWlsLiBFbiDDqXhpdG8gZWwgYmFja2VuZCBkZXZ1ZWx2ZVxuICAgKiB0b2tlbnMgZGUgYXV0by1zaWduaW4g4oaSIGVsIHVzdWFyaW8gcXVlZGEgbG9ndWVhZG8gKG1pc21vIGZsdWpvIHF1ZSB2ZXJpZnktZW1haWwpLlxuICAgKi9cbiAgYWN0aXZhdGVBY2NvdW50KHJlcXVlc3Q6IEFjdGl2YXRlQWNjb3VudFJlcXVlc3QpOiBPYnNlcnZhYmxlPEFjdGl2YXRlQWNjb3VudFJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBY3RpdmF0ZUFjY291bnRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9hY3RpdmF0ZWAsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UuYWN0aXZhdGVkICYmIHJlc3BvbnNlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSBhcyB1bmtub3duIGFzIFNpZ25pblJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbWJpYSBsYSBjb250cmFzZcOxYSBkZWwgdXN1YXJpbyBhdXRlbnRpY2Fkby5cbiAgICogUmVxdWllcmUgbGEgY29udHJhc2XDsWEgYWN0dWFsIHBhcmEgdmVyaWZpY2FjacOzbi5cbiAgICovXG4gIGNoYW5nZVBhc3N3b3JkKGN1cnJlbnRQYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxDaGFuZ2VQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogQ2hhbmdlUGFzc3dvcmRSZXF1ZXN0ID0geyBjdXJyZW50UGFzc3dvcmQsIG5ld1Bhc3N3b3JkIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8Q2hhbmdlUGFzc3dvcmRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9jaGFuZ2UtcGFzc3dvcmRgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDQU1CSU8gREUgRU1BSUwg4oCUIGZsdWpvIGRlIDMgcGFzb3NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgaW5pdGlhdGVFbWFpbENoYW5nZShcbiAgICBjdXJyZW50UGFzc3dvcmQ6IHN0cmluZyxcbiAgICBuZXdFbWFpbDogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8SW5pdGlhdGVFbWFpbENoYW5nZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogSW5pdGlhdGVFbWFpbENoYW5nZVJlcXVlc3QgPSB7IGN1cnJlbnRQYXNzd29yZCwgbmV3RW1haWwgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxJbml0aWF0ZUVtYWlsQ2hhbmdlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vZW1haWwvaW5pdGlhdGVgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIGNvbmZpcm1FbWFpbENoYW5nZVN0ZXAxKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8Q29uZmlybUVtYWlsQ2hhbmdlU3RlcDFSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IENvbmZpcm1FbWFpbENoYW5nZVN0ZXAxUmVxdWVzdCA9IHsgY29kZSB9O1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PENvbmZpcm1FbWFpbENoYW5nZVN0ZXAxUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vZW1haWwvY29uZmlybS8xYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICBjb25maXJtRW1haWxDaGFuZ2VTdGVwMihjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvbmZpcm1FbWFpbENoYW5nZVN0ZXAyUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlcXVlc3QgPSB7IGNvZGUgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2VtYWlsL2NvbmZpcm0vMmAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVMSU1JTkFDScOTTiBERSBDVUVOVEFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEVsaW1pbmEgbGEgY3VlbnRhIGRlbCB1c3VhcmlvIChzb2Z0IGRlbGV0ZSkuXG4gICAqIFJlcXVpZXJlIGNvbmZpcm1hY2nDs24gZGUgY29udHJhc2XDsWEgcG9yIHNlZ3VyaWRhZC5cbiAgICogRGVzcHXDqXMgZGUgZWxpbWluYXIsIGNpZXJyYSBzZXNpw7NuIGF1dG9tw6F0aWNhbWVudGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIENvbnRyYXNlw7FhIGFjdHVhbCBwYXJhIGNvbmZpcm1hclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbiByZXN1bHRhZG8gZGUgbGEgZWxpbWluYWNpw7NuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXN5bmMgY29uZmlybURlbGV0ZUFjY291bnQocGFzc3dvcmQ6IHN0cmluZykge1xuICAgKiAgIHRyeSB7XG4gICAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmF1dGguZGVsZXRlQWNjb3VudChwYXNzd29yZCkpO1xuICAgKiAgICAgY29uc29sZS5sb2cocmVzdWx0Lm1lc3NhZ2UpOyAvLyBcIlR1IGN1ZW50YSBoYSBzaWRvIGVsaW1pbmFkYS4uLlwiXG4gICAqICAgICAvLyBVc3VhcmlvIGVzIHJlZGlyaWdpZG8gYXV0b23DoXRpY2FtZW50ZSBhbCBsb2dpblxuICAgKiAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAqICAgICAvLyBNYW5lamFyIGVycm9yIChjb250cmFzZcOxYSBpbmNvcnJlY3RhLCBldGMpXG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgLyoqXG4gICAqIEVudsOtYSB1biBjw7NkaWdvIE9UUCBhbCBlbWFpbCBkZWwgdXN1YXJpbyBwYXJhIGNvbmZpcm1hciBsYSBlbGltaW5hY2nDs24uXG4gICAqIFNvbG8gYXBsaWNhIGEgdXN1YXJpb3MgT0F1dGggc2luIGNvbnRyYXNlw7FhIChgaGFzUGFzc3dvcmQoKSA9PT0gZmFsc2VgKS5cbiAgICovXG4gIHNlbmREZWxldGVBY2NvdW50Q29kZSgpOiBPYnNlcnZhYmxlPFNlbmREZWxldGVBY2NvdW50Q29kZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8U2VuZERlbGV0ZUFjY291bnRDb2RlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vYWNjb3VudC9kZWxldGUtY29kZWAsIHt9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIGxhIGN1ZW50YSBkZWwgdXN1YXJpbyAoc29mdCBkZWxldGUpLlxuICAgKiAtIFVzdWFyaW9zIGNvbiBjb250cmFzZcOxYTogcGFzYXIgYHsgcGFzc3dvcmQgfWAuXG4gICAqIC0gVXN1YXJpb3MgT0F1dGggc2luIGNvbnRyYXNlw7FhOiBwYXNhciBgeyBjb2RlIH1gIChvYnRlbmlkbyB2aWEgc2VuZERlbGV0ZUFjY291bnRDb2RlKS5cbiAgICogRGVzcHXDqXMgZGUgZWxpbWluYXIsIGNpZXJyYSBzZXNpw7NuIHkgcmVkaXJpZ2UgYWwgbG9naW4gYXV0b23DoXRpY2FtZW50ZS5cbiAgICovXG4gIGRlbGV0ZUFjY291bnQoY3JlZGVudGlhbHM6IHtcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICBjb2RlPzogc3RyaW5nO1xuICB9KTogT2JzZXJ2YWJsZTxEZWxldGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZGVsZXRlPERlbGV0ZUFjY291bnRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9hY2NvdW50YCwgeyBib2R5OiBjcmVkZW50aWFscyB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmRlbGV0ZWQpIHtcbiAgICAgICAgICAgIC8vIExpbXBpYXIgZXN0YWRvIHkgY2VycmFyIHNlc2nDs24gc2luIG5vdGlmaWNhciBhbCBiYWNrZW5kXG4gICAgICAgICAgICAvLyAobGEgc2VzacOzbiB5YSBmdWUgcmV2b2NhZGEgcG9yIGVsIGJhY2tlbmQpXG4gICAgICAgICAgICB0aGlzLnNpZ25PdXRGaXJlYmFzZSgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7IHR5cGU6ICdMT0dPVVQnIH0pO1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuY29uZmlnPy5sb2dpblJvdXRlXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBFUk1JU09TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxvcyBwZXJtaXNvcyBhY3R1YWxpemFkb3MgZGVsIGJhY2tlbmQuXG4gICAqL1xuICBmZXRjaFBlcm1pc3Npb25zKCk6IE9ic2VydmFibGU8R2V0UGVybWlzc2lvbnNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEdldFBlcm1pc3Npb25zUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcGVybWlzc2lvbnNgKS5waXBlKFxuICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMoXG4gICAgICAgICAgcmVzcG9uc2Uucm9sZXMsXG4gICAgICAgICAgcmVzcG9uc2UucGVybWlzc2lvbnMsXG4gICAgICAgICAgcmVzcG9uc2UuaXNTdXBlckFkbWluXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVBlcm1pc3Npb25zKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnUEVSTUlTU0lPTlNfVVBEQVRFJyB9KTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHBlcm1pc28gZXNwZWPDrWZpY28uXG4gICAqIEZvcm1hdG86IFwicmVzb3VyY2U6YWN0aW9uXCIgKGVqOiBcInRlbXBsYXRlczplZGl0XCIpXG4gICAqL1xuICBoYXNQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzU3VwZXJBZG1pbigpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IFtyZXNvdXJjZSwgYWN0aW9uXSA9IHBlcm1pc3Npb24uc3BsaXQoJzonKTtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucygpLnNvbWUocCA9PiB7XG4gICAgICBjb25zdCBbcFJlc291cmNlLCBwQWN0aW9uXSA9IHAuc3BsaXQoJzonKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChwUmVzb3VyY2UgPT09ICcqJyB8fCBwUmVzb3VyY2UgPT09IHJlc291cmNlKSAmJiAocEFjdGlvbiA9PT0gJyonIHx8IHBBY3Rpb24gPT09IGFjdGlvbilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSBhbGd1bm8gZGUgbG9zIHBlcm1pc29zIGRhZG9zLlxuICAgKi9cbiAgaGFzQW55UGVybWlzc2lvbihwZXJtaXNzaW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuc29tZShwID0+IHRoaXMuaGFzUGVybWlzc2lvbihwKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSB0b2RvcyBsb3MgcGVybWlzb3MgZGFkb3MuXG4gICAqL1xuICBoYXNBbGxQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuZXZlcnkocCA9PiB0aGlzLmhhc1Blcm1pc3Npb24ocCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgdW4gcm9sIGVzcGVjw61maWNvLlxuICAgKi9cbiAgaGFzUm9sZShyb2xlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlcygpLnNvbWUociA9PiByLnRvTG93ZXJDYXNlKCkgPT09IHJvbGUudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSEFORExFIChVU0VSTkFNRSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFjdHVhbGl6YSBlbCBoYW5kbGUgKEB1c2VybmFtZSkgZGVsIHVzdWFyaW8uXG4gICAqIEBwYXJhbSBoYW5kbGUgLSBOdWV2byBoYW5kbGUgKHNpbiBALCBlajogXCJ2aWN0b3J2XCIpXG4gICAqL1xuICB1cGRhdGVIYW5kbGUoaGFuZGxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVwZGF0ZUhhbmRsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8VXBkYXRlSGFuZGxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcHJvZmlsZS9oYW5kbGVgLCB7IGhhbmRsZSB9KS5waXBlKFxuICAgICAgdGFwKCgpID0+IHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVByb2ZpbGVGaWVsZHMoeyBoYW5kbGUgfSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSB1biBoYW5kbGUgZXN0w6EgZGlzcG9uaWJsZS5cbiAgICogQHBhcmFtIGhhbmRsZSAtIEhhbmRsZSBhIHZlcmlmaWNhciAoc2luIEApXG4gICAqL1xuICBjaGVja0hhbmRsZUF2YWlsYWJpbGl0eShoYW5kbGU6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hlY2tIYW5kbGVSZXNwb25zZT4ge1xuICAgIC8vIFNlcnZlciByZXNwb25zZTogeyBvcGVyYXRpb25JZCwgdXNlcj8sIGZvdW5kIH0uIGZvdW5kPXRydWUg4oaSIGhhbmRsZSB0YWtlbi5cbiAgICAvLyBMaWIgc2VtYW50aWM6IGF2YWlsYWJsZSA9ICFmb3VuZC5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0PHtcbiAgICAgICAgb3BlcmF0aW9uSWQ6IHN0cmluZztcbiAgICAgICAgZm91bmQ6IGJvb2xlYW47XG4gICAgICB9PihgJHt0aGlzLnVzZXJzQmFzZVVybH0vaGFuZGxlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGhhbmRsZSl9YClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAocmF3ID0+ICh7XG4gICAgICAgICAgb3BlcmF0aW9uSWQ6IHJhdy5vcGVyYXRpb25JZCxcbiAgICAgICAgICBoYW5kbGUsXG4gICAgICAgICAgYXZhaWxhYmxlOiAhcmF3LmZvdW5kLFxuICAgICAgICB9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBnZXQgYmFzZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZz8uYXBpVXJsfSR7dGhpcy5jb25maWc/LmF1dGhQcmVmaXh9YDtcbiAgfVxuXG4gIC8qKiBCYXNlIGZvciAvdjIvdXNlcnMgZW5kcG9pbnRzIChzZXBhcmF0ZSBmcm9tIC92Mi9hdXRoKS4gKi9cbiAgcHJpdmF0ZSBnZXQgdXNlcnNCYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuY29uZmlnPy5hcGlVcmx9L3YyL3VzZXJzYDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2U6IFNpZ25pblJlc3BvbnNlIHwgTUZBVmVyaWZ5UmVzcG9uc2UpOiB2b2lkIHtcbiAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgcmVzcG9uc2UuZXhwaXJlc0luISAqIDEwMDA7XG4gICAgY29uc3QgdG9rZW5EYXRhID0gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbihyZXNwb25zZS5hY2Nlc3NUb2tlbiEpO1xuICAgIGNvbnN0IGlzUHJlbWl1bSA9IHRva2VuRGF0YT8ucHJlbWl1bSA9PT0gdHJ1ZTtcblxuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEF1dGhlbnRpY2F0ZWQoe1xuICAgICAgYWNjZXNzVG9rZW46IHJlc3BvbnNlLmFjY2Vzc1Rva2VuISxcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVzcG9uc2UucmVmcmVzaFRva2VuISxcbiAgICAgIHVzZXJJZDogdG9rZW5EYXRhPy51aWQsXG4gICAgICBlbWFpbDogdG9rZW5EYXRhPy5lbWFpbCxcbiAgICAgIHJvbGVzOiByZXNwb25zZS5yb2xlcyB8fCBbXSxcbiAgICAgIHBlcm1pc3Npb25zOiByZXNwb25zZS5wZXJtaXNzaW9ucyB8fCBbXSxcbiAgICAgIGlzU3VwZXJBZG1pbjogcmVzcG9uc2UucGVybWlzc2lvbnM/LmluY2x1ZGVzKCcqOionKSB8fCBmYWxzZSxcbiAgICAgIGlzUHJlbWl1bSxcbiAgICAgIGV4cGlyZXNBdCxcbiAgICB9KTtcblxuICAgIGlmICh0b2tlbkRhdGE/Lm9yZykge1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKHRva2VuRGF0YS5vcmcpO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVN0YXRlKHtcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbiEsXG4gICAgICByZWZyZXNoVG9rZW46IHJlc3BvbnNlLnJlZnJlc2hUb2tlbiEsXG4gICAgICByb2xlczogcmVzcG9uc2Uucm9sZXMgfHwgW10sXG4gICAgICBwZXJtaXNzaW9uczogcmVzcG9uc2UucGVybWlzc2lvbnMgfHwgW10sXG4gICAgICBpc1N1cGVyQWRtaW46IHJlc3BvbnNlLnBlcm1pc3Npb25zPy5pbmNsdWRlcygnKjoqJykgfHwgZmFsc2UsXG4gICAgICBpc1ByZW1pdW0sXG4gICAgICBleHBpcmVzQXQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnN0YXJ0UmVmcmVzaFRpbWVyKCk7XG4gICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnTE9HSU4nIH0pO1xuXG4gICAgLy8gSW50ZWdyYWNpw7NuIGNvbiBGaXJlYmFzZVxuICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIGhhbmRsZVN1Y2Nlc3NmdWxBdXRoIC0gRmlyZWJhc2UgY2hlY2s6Jywge1xuICAgICAgZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbjogdGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24sXG4gICAgICBoYXNGaXJlYmFzZVRva2VuS2V5OiAnZmlyZWJhc2VUb2tlbicgaW4gcmVzcG9uc2UsXG4gICAgICBmaXJlYmFzZVRva2VuVmFsdWU6ICEhKHJlc3BvbnNlIGFzIGFueSkuZmlyZWJhc2VUb2tlbixcbiAgICAgIGZpcmViYXNlVG9rZW5MZW5ndGg6IChyZXNwb25zZSBhcyBhbnkpLmZpcmViYXNlVG9rZW4/Lmxlbmd0aCB8fCAwLFxuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24gJiZcbiAgICAgICdmaXJlYmFzZVRva2VuJyBpbiByZXNwb25zZSAmJlxuICAgICAgcmVzcG9uc2UuZmlyZWJhc2VUb2tlblxuICAgICkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdbVmFsdGVjaEF1dGhdIENhbGxpbmcgc2lnbkluV2l0aEZpcmViYXNlIHdpdGggdG9rZW4gbGVuZ3RoOicsXG4gICAgICAgIHJlc3BvbnNlLmZpcmViYXNlVG9rZW4ubGVuZ3RoXG4gICAgICApO1xuICAgICAgdGhpcy5zaWduSW5XaXRoRmlyZWJhc2UocmVzcG9uc2UuZmlyZWJhc2VUb2tlbik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbikge1xuICAgICAgLy8gRWwgbG9naW4gTk8gdHJham8gZmlyZWJhc2VUb2tlbiAoZWouIGZsdWpvIE9BdXRoIHF1ZSBsbyBwZXJkacOzKS4gRW4gdmV6XG4gICAgICAvLyBkZSBxdWVkYXIgc2luIHNlc2nDs24gZGUgRmlyZWJhc2UsIHJlY3Vycmltb3MgYWwgZmFsbGJhY2sgc2VsZi1oZWFsaW5nOlxuICAgICAgLy8gL3JlZnJlc2ggc8OtIGRldnVlbHZlIHVuIGZpcmViYXNlVG9rZW4gY29uZmlhYmxlLlxuICAgICAgY29uc29sZS5sb2coJ1tGQkF1dGhdIGxvZ2luIHJlc3BvbnNlIHNpbiBmaXJlYmFzZVRva2VuIOKGkiByZWN1cnJpZW5kbyBhIGZhbGxiYWNrIC9yZWZyZXNoJyk7XG4gICAgICB2b2lkIHRoaXMucmVlc3RhYmxpc2hGaXJlYmFzZVZpYVJlZnJlc2goJ2xvZ2luLW1pc3NpbmctZmlyZWJhc2UtdG9rZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2Ugc2lnbmluIHNraXBwZWQgLSBpbnRlZ3JhY2nDs24gRmlyZWJhc2UgZGVzYWN0aXZhZGEnKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RybyBhdXRvbcOhdGljbyBkZSBkaXNwb3NpdGl2byBwYXJhIHB1c2ggbm90aWZpY2F0aW9uc1xuICAgIGlmICh0aGlzLmNvbmZpZz8uZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlSWZOZWVkZWQoKTsgLy8gZmlyZS1hbmQtZm9yZ2V0XG4gICAgfVxuXG4gICAgLy8gU2luY3Jvbml6YXIgaWRpb21hIGRlbCB1c3VhcmlvIGNvbiBpMThuXG4gICAgaWYgKHRoaXMuaTE4blNlcnZpY2UgJiYgJ2xhbmd1YWdlJyBpbiByZXNwb25zZSAmJiByZXNwb25zZS5sYW5ndWFnZSkge1xuICAgICAgY29uc3QgdXNlckxhbmcgPSByZXNwb25zZS5sYW5ndWFnZSBhcyBJMThuTGFuZztcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy5pMThuU2VydmljZS5sYW5nKCk7XG4gICAgICBpZiAodXNlckxhbmcgIT09IGN1cnJlbnRMYW5nKSB7XG4gICAgICAgIHRoaXMuaTE4blNlcnZpY2Uuc2V0TGFuZ3VhZ2UodXNlckxhbmcpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZhbHRlY2hBdXRoXSBMYW5ndWFnZSBzeW5jZWQgdG86ICR7dXNlckxhbmd9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuZXIgRmlyZXN0b3JlIFJCQUMg4oCUIG9wdC1pbiB2aWEgZW5hYmxlRmlyZXN0b3JlUkJBQzogdHJ1ZVxuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlKCkudXNlcklkO1xuICAgIGlmICh1c2VySWQpIHtcbiAgICAgIHRoaXMuc2V0dXBGaXJlc3RvcmVSQkFDU3luYyh1c2VySWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLnRlYXJkb3duRmlyZXN0b3JlUkJBQ1N5bmMoKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5yZXNldCgpO1xuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBGaXJlc3RvcmVSQkFDU3luYyh1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZUZpcmVzdG9yZVJCQUMgfHwgIXRoaXMuZmlyZXN0b3JlSW5zdGFuY2UpIHJldHVybjtcbiAgICB0aGlzLnRlYXJkb3duRmlyZXN0b3JlUkJBQ1N5bmMoKTtcblxuICAgIGlmICghdGhpcy5maXJlYmFzZVNlcnZpY2UgfHwgdGhpcy5maXJlYmFzZVNlcnZpY2UuZmlyZWJhc2VBdXRoUmVhZHkoKSkge1xuICAgICAgLy8gRmlyZWJhc2Ugbm90IHVzZWQgb3IgYWxyZWFkeSBhdXRoZW50aWNhdGVkIOKAlCBhdHRhY2ggbGlzdGVuZXIgbm93LlxuICAgICAgdGhpcy5fYXR0YWNoRmlyZXN0b3JlUkJBQ0xpc3RlbmVyKHVzZXJJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpcmViYXNlIEF1dGggbm90IHJlYWR5IHlldC4gRmlyZXN0b3JlIHBlcm1pc3Npb24tZGVuaWVkIGVycm9ycyB0ZXJtaW5hdGVcbiAgICAgIC8vIG9uU25hcHNob3QgcGVybWFuZW50bHkgKG5vIGF1dG9tYXRpYyByZXRyeSB3aGVuIGF1dGggc3RhdGUgY2hhbmdlcykuXG4gICAgICAvLyBXYWl0IHVudGlsIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQsIHRoZW4gYXR0YWNoLlxuICAgICAgdGhpcy5maXJlYmFzZVNlcnZpY2UuZmlyZWJhc2VBdXRoUmVhZHkkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihyZWFkeSA9PiByZWFkeSksXG4gICAgICAgICAgdGFrZSgxKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fYXR0YWNoRmlyZXN0b3JlUkJBQ0xpc3RlbmVyKHVzZXJJZCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2F0dGFjaEZpcmVzdG9yZVJCQUNMaXN0ZW5lcih1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRvY1JlZiA9IGRvYyh0aGlzLmZpcmVzdG9yZUluc3RhbmNlISwgJ3VzZXJzJywgdXNlcklkKTtcbiAgICB0aGlzLmZpcmVzdG9yZVJCQUNVbnN1YnNjcmliZSA9IG9uU25hcHNob3QoZG9jUmVmLCBzbmFwID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBzbmFwLmRhdGEoKTtcbiAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuXG4gICAgICAvLyBTeW5jIGRlIHBlcmZpbCDigJQgZWwgbWlycm9yIEZpcmVzdG9yZSBgL3VzZXJzL3t1aWR9YCBlcyBlbCBlc3Blam8gY2Fuw7NuaWNvXG4gICAgICAvLyBxdWUgZWwgYmFja2VuZCBlc2NyaWJlIChgU3luY1Byb2ZpbGVUb0ZpcmVzdG9yZWApLiBSZWZyZXNjYXIgYWPDoSBtYW50aWVuZVxuICAgICAgLy8gYGF1dGgudXNlcigpYCBWSVZPIChhdmF0YXIgZGVsIGhlYWRlciwgZ3JlZXRpbmcsIGV0Yy4pIHNpbiBkZXBlbmRlciBkZSB1blxuICAgICAgLy8gYGdldFByb2ZpbGUoKWAgbWFudWFsOiBlZGl0YXIgZWwgcGVyZmlsIGVuIHVuYSB2aXN0YSBzZSByZWZsZWphIGVuIHRvZGFzXG4gICAgICAvLyAoaG9tZSBpbmNsdWlkbykgZW4gY3VhbnRvIGVsIGJhY2tlbmQgYWN0dWFsaXphIGVsIG1pcnJvci5cbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVByb2ZpbGVGaWVsZHMoe1xuICAgICAgICBuYW1lOiBkYXRhWyduYW1lJ10gPz8gdW5kZWZpbmVkLFxuICAgICAgICBoYW5kbGU6IGRhdGFbJ2hhbmRsZSddID8/IHVuZGVmaW5lZCxcbiAgICAgICAgYXZhdGFyVXJsOiBkYXRhWydhdmF0YXJVcmwnXSA/PyB1bmRlZmluZWQsXG4gICAgICAgIHBob25lOiBkYXRhWydwaG9uZSddID8/IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByYmFjID0gZGF0YVsncmJhYyddO1xuICAgICAgaWYgKCFyYmFjKSByZXR1cm47XG4gICAgICBjb25zdCBhY3RpdmVPcmcgPSB0aGlzLnN0YXRlU2VydmljZS5zdGF0ZSgpLmFjdGl2ZU9yZztcbiAgICAgIGlmIChyYmFjWydhY3RpdmVPcmcnXSAmJiByYmFjWydhY3RpdmVPcmcnXSAhPT0gYWN0aXZlT3JnKSByZXR1cm47XG4gICAgICBjb25zdCByb2xlczogc3RyaW5nW10gPSByYmFjWydyb2xlcyddID8/IFtdO1xuICAgICAgY29uc3QgcGVybWlzc2lvbnM6IHN0cmluZ1tdID0gcmJhY1sncGVybWlzc2lvbnMnXSA/PyBbXTtcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVBlcm1pc3Npb25zKHJvbGVzLCBwZXJtaXNzaW9ucywgcGVybWlzc2lvbnMuaW5jbHVkZXMoJyo6KicpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdGVhcmRvd25GaXJlc3RvcmVSQkFDU3luYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maXJlc3RvcmVSQkFDVW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMuZmlyZXN0b3JlUkJBQ1Vuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmZpcmVzdG9yZVJCQUNVbnN1YnNjcmliZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFJlZnJlc2hUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcblxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGUoKTtcbiAgICBpZiAoIXN0YXRlLmV4cGlyZXNBdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVmcmVzaEJlZm9yZU1zID0gKHRoaXMuY29uZmlnPy5yZWZyZXNoQmVmb3JlRXhwaXJ5IHx8IDYwKSAqIDEwMDA7XG4gICAgY29uc3QgcmVmcmVzaEF0ID0gc3RhdGUuZXhwaXJlc0F0IC0gcmVmcmVzaEJlZm9yZU1zO1xuICAgIGNvbnN0IGRlbGF5ID0gcmVmcmVzaEF0IC0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmxvZ291dCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sIGRlbGF5KTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnJlZnJlc2hUb2tlbikge1xuICAgICAgLy8gVG9rZW4geWEgZGViZXLDrWEgcmVmcmVzY2Fyc2UsIGludGVudGFyIGFob3JhXG4gICAgICB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnN1YnNjcmliZSh7XG4gICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmxvZ291dCgpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVmcmVzaFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcklkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZXJJZCk7XG4gICAgICB0aGlzLnJlZnJlc2hUaW1lcklkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN5bmNFdmVudChldmVudDogQXV0aFN5bmNFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnTE9HSU4nOlxuICAgICAgY2FzZSAnVE9LRU5fUkVGUkVTSCc6IHtcbiAgICAgICAgLy8gUmVjYXJnYXIgZXN0YWRvIGRlc2RlIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRTdGF0ZSgpO1xuICAgICAgICBpZiAoc3RhdGUuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZXN0b3JlRnJvbVN0b3JhZ2Uoc3RhdGUpO1xuICAgICAgICAgIGNvbnN0IGNsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4oc3RhdGUuYWNjZXNzVG9rZW4pO1xuICAgICAgICAgIGlmIChjbGFpbXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVVzZXJJbmZvKGNsYWltcy51aWQsIGNsYWltcy5lbWFpbCk7XG4gICAgICAgICAgICBpZiAoY2xhaW1zLm9yZykge1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVBY3RpdmVPcmcoY2xhaW1zLm9yZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0xPR09VVCc6XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuc3RvcFJlZnJlc2hUaW1lcigpO1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5jb25maWc/LmxvZ2luUm91dGVdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQRVJNSVNTSU9OU19VUERBVEUnOiB7XG4gICAgICAgIGNvbnN0IHBlcm1zID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkUGVybWlzc2lvbnMoKTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMocGVybXMucm9sZXMsIHBlcm1zLnBlcm1pc3Npb25zLCBwZXJtcy5pc1N1cGVyQWRtaW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ09SR19TV0lUQ0gnOlxuICAgICAgICAvLyBPdHJhIHBlc3Rhw7FhIGNhbWJpw7MgZGUgb3JnYW5pemFjacOzbiAtIHJlY2FyZ2FyIHDDoWdpbmEgcGFyYSBvYnRlbmVyIG51ZXZvIGVzdGFkb1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXV0aEVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSk6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICAvLyBgaW50ZXJwcmV0RXJyb3JgIChoZWxwZXIgY29tcGFydGlkbyBkZSBsYSBsaWIpIG5vcm1hbGl6YSBlbFxuICAgIC8vIEh0dHBFcnJvclJlc3BvbnNlIOKAlCBpbmNsdXllbmRvIGZhbGxvcyBkZSByZWQgKHN0YXR1cyAwKS4gQXBsYW5hbW9zIGFcbiAgICAvLyBBdXRoRXJyb3IgcGFyYSBtYW50ZW5lciBsYSBBUEkgcMO6YmxpY2EgZGUgQXV0aFNlcnZpY2UgZXN0YWJsZS5cbiAgICBjb25zdCBpbnRlcnByZXRlZCA9IGludGVycHJldEVycm9yKGVycm9yKTtcbiAgICBjb25zdCBhdXRoRXJyb3I6IEF1dGhFcnJvciA9IHtcbiAgICAgIGNvZGU6IGludGVycHJldGVkLmNvZGUsXG4gICAgICBtZXNzYWdlOiBpbnRlcnByZXRlZC5tZXNzYWdlLFxuICAgIH07XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RXJyb3IoYXV0aEVycm9yKTtcbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBhdXRoRXJyb3IpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZJUkVCQVNFIElOVEVHUkFUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnbkluV2l0aEZpcmViYXNlKGZpcmViYXNlVG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtGQkF1dGhdIGF1dGggZmxvdyDihpIgc2lnbkluV2l0aEZpcmViYXNlIGF0dGVtcHQgdG9rZW5MZW49JHtmaXJlYmFzZVRva2VuPy5sZW5ndGggPz8gMH0gYCArXG4gICAgICAgIGBmaXJlYmFzZVNlcnZpY2VQcmVzZW50PSR7ISF0aGlzLmZpcmViYXNlU2VydmljZX1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZmlyZWJhc2VTZXJ2aWNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlyZWJhc2VTZXJ2aWNlLnNpZ25JbldpdGhDdXN0b21Ub2tlbihmaXJlYmFzZVRva2VuKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2Ugc2lnbmluIHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZVNlcnZpY2Ugbm90IHByb3ZpZGVkLiBBZGQgcHJvdmlkZVZhbHRlY2hGaXJlYmFzZSgpIHRvIHlvdXIgcHJvdmlkZXJzLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTm8gYmxvcXVlYXIgZWwgbG9naW4gcHJpbmNpcGFsIHNpIEZpcmViYXNlIGZhbGxhXG4gICAgICBjb25zb2xlLmVycm9yKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25pbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnbk91dEZpcmViYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24pIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5maXJlYmFzZVNlcnZpY2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maXJlYmFzZVNlcnZpY2Uuc2lnbk91dCgpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JhciBlcnJvcmVzIGRlIEZpcmViYXNlIHNpZ25vdXRcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLWVzdGFibGVjZSBsYSBzZXNpw7NuIGRlIEZpcmViYXNlIEF1dGggZW4gZWwgYm9vdHN0cmFwIGRlIGxhIGFwcCBjdWFuZG9cbiAgICogZWwgYWNjZXNzIHRva2VuIGRlIGxhIGFwcCBzaWd1ZSB2w6FsaWRvIChsYSByYW1hIGRlIGluaXRpYWxpemUoKSBxdWUgTk9cbiAgICogcGFzYSBwb3IgcmVmcmVzaCkuXG4gICAqXG4gICAqIEZpcmViYXNlIEF1dGggbWFudGllbmUgc3UgUFJPUElBIHNlc2nDs24gY29uIHBlcnNpc3RlbmNpYSBJbmRleGVkREJcbiAgICogaW5kZXBlbmRpZW50ZSBkZWwgc3RvcmFnZSBkZSB0b2tlbnMgZGUgbGEgYXBwLiBFbiB1biBuYXZlZ2Fkb3Igbm9ybWFsIGVzYVxuICAgKiBwZXJzaXN0ZW5jaWEgc2UgYXV0by1yZXN0YXVyYSBzb2xhOyBlbiB1bmEgUFdBIHN0YW5kYWxvbmUgZW4gaU9TIGVsXG4gICAqIGNvbnRlbmVkb3IgZGUgc3RvcmFnZSBubyBzb2JyZXZpdmUsIHkgYGZpcmViYXNlQXV0aFJlYWR5YCBzZSBxdWVkYSBlblxuICAgKiBgZmFsc2VgIGluZGVmaW5pZGFtZW50ZSDihpIgbG9zIGxpc3RlbmVycyBGaXJlc3RvcmUgY3VlbGdhbiAofjQwcyB0aW1lb3V0KS5cbiAgICpcbiAgICogRXN0cmF0ZWdpYTogZGFyIHVuYSB2ZW50YW5hIGNvcnRhIGEgbGEgYXV0by1yZXN0YXVyYWNpw7NuIGRlIEZpcmViYXNlIHksIHNpXG4gICAqIG5vIG9jdXJyZSwgZm9yemFyIHVuIGByZWZyZXNoQWNjZXNzVG9rZW4oKWAg4oCUIHF1ZSB5YSBoYWNlIGBzaWduSW5XaXRoRmlyZWJhc2VgXG4gICAqIGNvbiBlbCBgZmlyZWJhc2VUb2tlbmAgcXVlIGRldnVlbHZlIGAvcmVmcmVzaGAuXG4gICAqXG4gICAqIEZpcmUtYW5kLWZvcmdldDogc2UgaW52b2NhIGNvbiBgdm9pZGAgcGFyYSBubyBkZW1vcmFyIGBpbml0aWFsaXplKClgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVGaXJlYmFzZVNlc3Npb25PbkJvb3RzdHJhcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uIHx8ICF0aGlzLmZpcmViYXNlU2VydmljZSkgcmV0dXJuO1xuXG4gICAgLy8gRGFyIGEgbGEgcGVyc2lzdGVuY2lhIEluZGV4ZWREQiBwcm9waWEgZGUgRmlyZWJhc2UgQXV0aCB1bmEgb3BvcnR1bmlkYWRcbiAgICAvLyBkZSBhdXRvLXJlc3RhdXJhcnNlIChuYXZlZ2Fkb3Igbm9ybWFsKS4gRW4gdW5hIFBXQSBzdGFuZGFsb25lIGRlIGlPU1xuICAgIC8vIG5vcm1hbG1lbnRlIE5PIGxvIGhhcsOhLlxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAyNTAwKSk7XG5cbiAgICBpZiAodGhpcy5maXJlYmFzZVNlcnZpY2UuZmlyZWJhc2VBdXRoUmVhZHkoKSkge1xuICAgICAgY29uc29sZS5sb2coJ1tGQkF1dGhdIGJvb3RzdHJhcCDigJQgRmlyZWJhc2Ugc2Vzc2lvbiByZXN0b3JlZCBvbiBpdHMgb3duJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXG4gICAgICAnW0ZCQXV0aF0gYm9vdHN0cmFwIOKAlCBzZXNzaW9uIHZhbGlkIGJ1dCBGaXJlYmFzZSBOT1QgcmVhZHkg4oaSIHJlY3VycmllbmRvIGEgZmFsbGJhY2snXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnJlZXN0YWJsaXNoRmlyZWJhc2VWaWFSZWZyZXNoKCdib290c3RyYXAtc2Vzc2lvbi1yZXN0b3JlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgc2VsZi1oZWFsaW5nIGRlIEZpcmViYXNlIEF1dGguIFBpZGUgdW4gZmlyZWJhc2VUb2tlbiBmcmVzY28gdsOtYVxuICAgKiBgL3JlZnJlc2hgIChxdWUgc8OtIGxvIGRldnVlbHZlIGRlIGZvcm1hIGNvbmZpYWJsZSkgeSwgZW4gw6l4aXRvLFxuICAgKiBgcmVmcmVzaEFjY2Vzc1Rva2VuKClgIHlhIGVqZWN1dGEgYHNpZ25JbldpdGhGaXJlYmFzZSgpYC5cbiAgICpcbiAgICogU2UgaW52b2NhIGN1YW5kbyB1biBwYXRoIGRlIGF1dGggZGVqw7MgbGEgc2VzacOzbiBkZSBGaXJlYmFzZSBzaW4gZXN0YWJsZWNlcjpcbiAgICogIC0gbG9naW4gT0F1dGgvcGFzc3dvcmQgcXVlIHZvbHZpw7Mgc2luIGBmaXJlYmFzZVRva2VuYCxcbiAgICogIC0gY29sZCBsYXVuY2ggZGUgUFdBIGlPUyBzaW4gcGVyc2lzdGVuY2lhIGRlIEZpcmViYXNlLlxuICAgKlxuICAgKiBgcmVhc29uYCBhcGFyZWNlIGVuIGxvcyBsb2dzIGBbRkJBdXRoXSBmYWxsYmFja2AgcGFyYSBwb2RlciBhdGVzdGlndWFyXG4gICAqIGRlc2RlIGVsIGRlYnVnLWNvbnNvbGUgcXXDqSBkaXNwYXLDsyBlbCBmYWxsYmFjay5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVlc3RhYmxpc2hGaXJlYmFzZVZpYVJlZnJlc2gocmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uIHx8ICF0aGlzLmZpcmViYXNlU2VydmljZSkgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coYFtGQkF1dGhdIGZhbGxiYWNrIOKAlCByZS1lc3RhYmxlY2llbmRvIEZpcmViYXNlIHbDrWEgL3JlZnJlc2ggKG1vdGl2bzogJHtyZWFzb259KWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbRkJBdXRoXSBmYWxsYmFjayDigJQgL3JlZnJlc2ggT0ssIEZpcmViYXNlIHJlLWVzdGFibGVjaWRvIChtb3Rpdm86ICR7cmVhc29ufSlgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtGQkF1dGhdIGZhbGxiYWNrIOKAlCAvcmVmcmVzaCBmYWxsw7MgKG1vdGl2bzogJHtyZWFzb259KTpgLCBlKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gREVWSUNFIFJFR0lTVFJBVElPTiAoUHVzaCBOb3RpZmljYXRpb25zKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU29saWNpdGEgcGVybWlzb3MgZGUgbm90aWZpY2FjacOzbiB5IHJlZ2lzdHJhIGVsIGRpc3Bvc2l0aXZvLlxuICAgKiBVc2FyIGN1YW5kbyBlbCB1c3VhcmlvIGFjZXB0YSByZWNpYmlyIG5vdGlmaWNhY2lvbmVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIG9uRW5hYmxlTm90aWZpY2F0aW9ucygpIHtcbiAgICogICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguZW5hYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIGlmIChyZXN1bHQuZ3JhbnRlZCkge1xuICAgKiAgICAgY29uc29sZS5sb2coJ05vdGlmaWNhY2lvbmVzIGhhYmlsaXRhZGFzJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZW5hYmxlTm90aWZpY2F0aW9ucygpOiBQcm9taXNlPEVuYWJsZU5vdGlmaWNhdGlvbnNSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIE1lc3NhZ2luZ1NlcnZpY2Ugbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBQdXNoIG5vdGlmaWNhdGlvbnMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5yZXF1ZXN0UGVybWlzc2lvbigpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0cmFyIGRpc3Bvc2l0aXZvIGVuIGJhY2tlbmRcbiAgICBjb25zdCByZWdpc3RlcmVkID0gYXdhaXQgdGhpcy5yZWdpc3RlckRldmljZUlmTmVlZGVkKCk7XG5cbiAgICByZXR1cm4geyBncmFudGVkOiB0cnVlLCB0b2tlbiwgcmVnaXN0ZXJlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2FjdGl2YSBsYXMgbm90aWZpY2FjaW9uZXMgcGFyYSBlc3RlIGRpc3Bvc2l0aXZvLlxuICAgKiBFbGltaW5hIGVsIHRva2VuIGRlbCBiYWNrZW5kIHkgZGUgRkNNLlxuICAgKiBVc2FyIGRlc2RlIHVuIHRvZ2dsZSBkZSBwcmVmZXJlbmNpYXMgY3VhbmRvIGVsIHVzdWFyaW8gZGVzYWN0aXZhIG5vdGlmaWNhY2lvbmVzLlxuICAgKlxuICAgKiBOT1RBOiBFc3RvIE5PIHJldm9jYSBlbCBwZXJtaXNvIGRlbCBuYXZlZ2Fkb3IgKGVsIHVzdWFyaW8gZGViZSBoYWNlcmxvIG1hbnVhbG1lbnRlXG4gICAqIGRlc2RlIGxhIGNvbmZpZ3VyYWNpw7NuIGRlbCBuYXZlZ2Fkb3IpLiBTb2xvIGVsaW1pbmEgZWwgcmVnaXN0cm8gZGVsIGRpc3Bvc2l0aXZvLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIG9uVG9nZ2xlTm90aWZpY2F0aW9ucyhlbmFibGVkOiBib29sZWFuKSB7XG4gICAqICAgaWYgKGVuYWJsZWQpIHtcbiAgICogICAgIGF3YWl0IHRoaXMuYXV0aC5lbmFibGVOb3RpZmljYXRpb25zKCk7XG4gICAqICAgfSBlbHNlIHtcbiAgICogICAgIGF3YWl0IHRoaXMuYXV0aC5kaXNhYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGRpc2FibGVOb3RpZmljYXRpb25zKCk6IFByb21pc2U8eyBkaXNhYmxlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybiB7IGRpc2FibGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5jdXJyZW50VG9rZW47XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gRWxpbWluYXIgZGVsIGJhY2tlbmRcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgICAucmVxdWVzdCgnREVMRVRFJywgYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlcy9ieS10b2tlbmAsIHtcbiAgICAgICAgICAgICAgYm9keTogeyB0b2tlbiB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVsaW1pbmFyIHRva2VuIGRlIEZDTVxuICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZGVsZXRlVG9rZW4oKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gTm90aWZpY2F0aW9ucyBkaXNhYmxlZCcpO1xuICAgICAgICByZXR1cm4geyBkaXNhYmxlZDogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBkaXNhYmxlZDogZmFsc2UgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIEZhaWxlZCB0byBkaXNhYmxlIG5vdGlmaWNhdGlvbnM6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgZGlzYWJsZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgZWwgZXN0YWRvIGFjdHVhbCBkZSBwZXJtaXNvcyBkZSBub3RpZmljYWNpw7NuLlxuICAgKlxuICAgKiBAcmV0dXJucyAnZ3JhbnRlZCcgfCAnZGVuaWVkJyB8ICdkZWZhdWx0JyB8ICd1bnN1cHBvcnRlZCdcbiAgICovXG4gIGdldE5vdGlmaWNhdGlvblBlcm1pc3Npb25TdGF0ZSgpOiBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGUge1xuICAgIGlmICghdGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4gJ3Vuc3VwcG9ydGVkJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRQZXJtaXNzaW9uU3RhdGUoKSBhcyBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgbWFudWFsbWVudGUgZWwgZGlzcG9zaXRpdm8gZW4gZWwgYmFja2VuZC5cbiAgICogw5p0aWwgcGFyYSBzaW5jcm9uaXphciBkaXNwb3NpdGl2b3MgcXVlIHRpZW5lbiB0b2tlbiBGQ00gcGVybyBubyBlc3TDoW4gcmVnaXN0cmFkb3MuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlZFRva2VuIFRva2VuIEZDTSBvcGNpb25hbC4gU2kgc2UgcHJvcG9yY2lvbmEsIHNlIHVzYSBkaXJlY3RhbWVudGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgc2luIGRlcGVuZGVyIGRlbCBNZXNzYWdpbmdTZXJ2aWNlIChldml0YSB0aW1pbmcgaXNzdWVzKS5cbiAgICogQHJldHVybnMgUmVzdWx0YWRvIGRlbCByZWdpc3RybyBjb24gZGV2aWNlSWQgc2kgZnVlIGV4aXRvc29cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTaW5jcm9uaXphciBjb24gdG9rZW4gZXhpc3RlbnRlIChyZWNvbWVuZGFkbylcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlZ2lzdGVyRGV2aWNlKG15VG9rZW4pO1xuICAgKlxuICAgKiAvLyBTaW4gdG9rZW4sIGludGVudGFyw6Egb2J0ZW5lcmxvIGRlbCBNZXNzYWdpbmdTZXJ2aWNlXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZWdpc3RlckRldmljZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyRGV2aWNlKHByb3ZpZGVkVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPFJlZ2lzdGVyRGV2aWNlUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdVc3VhcmlvIG5vIGF1dGVudGljYWRvJyB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBWZXJpZmljYXIgcGVybWlzb3Mgc2kgdGVuZW1vcyBNZXNzYWdpbmdTZXJ2aWNlXG4gICAgICBpZiAodGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0UGVybWlzc2lvblN0YXRlKCk7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uICE9PSAnZ3JhbnRlZCcpIHtcbiAgICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdQZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzIG5vIG90b3JnYWRvJyB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVzYXIgdG9rZW4gcHJvcG9yY2lvbmFkbyBwcmltZXJvIChldml0YSB0aW1pbmcgaXNzdWVzIGNvbiBJbmplY3RvcilcbiAgICAgIGxldCB0b2tlbiA9IHByb3ZpZGVkVG9rZW4gfHwgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlPy5jdXJyZW50VG9rZW47XG5cbiAgICAgIC8vIFNpIG5vIGhheSB0b2tlbiwgaW50ZW50YXIgb2J0ZW5lcmxvIGRlbCBNZXNzYWdpbmdTZXJ2aWNlXG4gICAgICBpZiAoIXRva2VuICYmIHRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdGQ00gbm8gc29wb3J0YWRvIGVuIGVzdGUgbmF2ZWdhZG9yJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmdldFRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogZmFsc2UsIGVycm9yOiAnTm8gc2UgcHVkbyBvYnRlbmVyIHRva2VuIEZDTScgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnaXN0cmFyIGVuIGJhY2tlbmRcbiAgICAgIGNvbnN0IHsgcGxhdGZvcm0sIGJyb3dzZXIsIG9zIH0gPSB0aGlzLmRldGVjdFBsYXRmb3JtSW5mbygpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwLnBvc3Q8UmVnaXN0ZXJEZXZpY2VSZXNwb25zZT4oYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlc2AsIHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICBicm93c2VyLFxuICAgICAgICAgIG9zLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRGV2aWNlIHJlZ2lzdGVyZWQgbWFudWFsbHk6JywgcmVzcG9uc2UuZGV2aWNlLmRldmljZUlkKTtcbiAgICAgIHJldHVybiB7IHJlZ2lzdGVyZWQ6IHRydWUsIGRldmljZUlkOiByZXNwb25zZS5kZXZpY2UuZGV2aWNlSWQsIHRva2VuIH07XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIE1hbnVhbCBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWdpc3RlcmVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IGVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnJvcj8ubWVzc2FnZSB8fCAnRXJyb3IgYWwgcmVnaXN0cmFyIGRpc3Bvc2l0aXZvJyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdHJhIGVsIGRpc3Bvc2l0aXZvIGVuIGVsIGJhY2tlbmQgc2kgdGllbmUgcGVybWlzb3MgZGUgbm90aWZpY2FjacOzbi5cbiAgICogU2UgbGxhbWEgYXV0b23DoXRpY2FtZW50ZSBkZXNwdcOpcyBkZSB1biBsb2dpbiBleGl0b3NvIHNpIGVuYWJsZURldmljZVJlZ2lzdHJhdGlvbj10cnVlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckRldmljZUlmTmVlZGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFNvbG8gc2kgZXN0w6EgaGFiaWxpdGFkbyB5IG1lc3NhZ2luZyBlc3TDoSBkaXNwb25pYmxlXG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uIHx8ICF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZpY2FyIHNpIEZDTSBlc3TDoSBzb3BvcnRhZG9cbiAgICAgIGlmICghKGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5pc1N1cHBvcnRlZCgpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmaWNhciBzaSB5YSB0aWVuZSBwZXJtaXNvc1xuICAgICAgY29uc3QgcGVybWlzc2lvbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRQZXJtaXNzaW9uU3RhdGUoKTtcbiAgICAgIGlmIChwZXJtaXNzaW9uICE9PSAnZ3JhbnRlZCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBObyBzb2xpY2l0YXIgYXV0b23DoXRpY2FtZW50ZSwgc29sbyByZWdpc3RyYXIgc2kgeWEgdGllbmUgcGVybWlzb1xuICAgICAgfVxuXG4gICAgICAvLyBPYnRlbmVyIHRva2VuIGV4aXN0ZW50ZSAobm8gc29saWNpdGFyIG51ZXZvKVxuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0VG9rZW4oKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWdpc3RyYXIgZW4gYmFja2VuZFxuICAgICAgY29uc3QgeyBwbGF0Zm9ybSwgYnJvd3Nlciwgb3MgfSA9IHRoaXMuZGV0ZWN0UGxhdGZvcm1JbmZvKCk7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwLnBvc3Q8UmVnaXN0ZXJEZXZpY2VSZXNwb25zZT4oYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlc2AsIHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICBicm93c2VyLFxuICAgICAgICAgIG9zLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRGV2aWNlIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTm8gYmxvcXVlYXIgYXV0aCBzaSBmYWxsYSBkZXZpY2UgcmVnaXN0cmF0aW9uXG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gRGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIGVsIGRpc3Bvc2l0aXZvIGRlbCBiYWNrZW5kIHkgYm9ycmEgZWwgdG9rZW4gRkNNLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB1bnJlZ2lzdGVyRGV2aWNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZURldmljZVJlZ2lzdHJhdGlvbiB8fCAhdGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmN1cnJlbnRUb2tlbjtcbiAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAvLyBEZWxldGUgZnJvbSBiYWNrZW5kIChmaXJlIGFuZCBmb3JnZXQpXG4gICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgIC5yZXF1ZXN0KCdERUxFVEUnLCBgJHt0aGlzLmNvbmZpZz8uYXBpVXJsfS92Mi91c2Vycy9tZS9kZXZpY2VzL2J5LXRva2VuYCwge1xuICAgICAgICAgICAgYm9keTogeyB0b2tlbiB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpXG4gICAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICAgIC8vIERlbGV0ZSBmcm9tIEZDTVxuICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZGVsZXRlVG9rZW4oKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRGV2aWNlIHVucmVnaXN0ZXJlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JhciBlcnJvcmVzIGVuIGNsZWFudXBcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0YSBpbmZvcm1hY2nDs24gZGUgbGEgcGxhdGFmb3JtYSBkZWwgZGlzcG9zaXRpdm8uXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFBsYXRmb3JtSW5mbygpOiB7IHBsYXRmb3JtOiAnd2ViJzsgYnJvd3Nlcjogc3RyaW5nOyBvczogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcblxuICAgIC8vIERldGVjdGFyIG5hdmVnYWRvclxuICAgIGxldCBicm93c2VyID0gJ1Vua25vd24nO1xuICAgIGlmICh1YS5pbmNsdWRlcygnRmlyZWZveCcpKSB7XG4gICAgICBicm93c2VyID0gJ0ZpcmVmb3gnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ0VkZycpKSB7XG4gICAgICBicm93c2VyID0gJ0VkZ2UnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ0Nocm9tZScpKSB7XG4gICAgICBicm93c2VyID0gJ0Nocm9tZSc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnU2FmYXJpJykpIHtcbiAgICAgIGJyb3dzZXIgPSAnU2FmYXJpJztcbiAgICB9XG5cbiAgICAvLyBEZXRlY3RhciBPU1xuICAgIGxldCBvcyA9ICdVbmtub3duJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ1dpbmRvd3MnKSkge1xuICAgICAgb3MgPSAnV2luZG93cyc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnTWFjIE9TJykpIHtcbiAgICAgIG9zID0gJ21hY09TJztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdMaW51eCcpKSB7XG4gICAgICBvcyA9ICdMaW51eCc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnQW5kcm9pZCcpKSB7XG4gICAgICBvcyA9ICdBbmRyb2lkJztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdpT1MnKSB8fCB1YS5pbmNsdWRlcygnaVBob25lJykgfHwgdWEuaW5jbHVkZXMoJ2lQYWQnKSkge1xuICAgICAgb3MgPSAnaU9TJztcbiAgICB9XG5cbiAgICByZXR1cm4geyBwbGF0Zm9ybTogJ3dlYicsIGJyb3dzZXIsIG9zIH07XG4gIH1cbn1cbiJdfQ==