@softheon/armature 10.33.2 → 10.34.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/README.md +81 -78
  2. package/bundles/softheon-armature.umd.js +74 -66
  3. package/bundles/softheon-armature.umd.js.map +1 -1
  4. package/bundles/softheon-armature.umd.min.js +1 -1
  5. package/bundles/softheon-armature.umd.min.js.map +1 -1
  6. package/esm2015/lib/alert-banner/alert-banner-api.js +1 -1
  7. package/esm2015/lib/alert-banner/alert-banner.module.js +1 -1
  8. package/esm2015/lib/alert-banner/components/alert-banner/alert-banner.component.js +1 -1
  9. package/esm2015/lib/alert-banner/models/alert-banner-config.js +1 -1
  10. package/esm2015/lib/alert-banner/models/alert-banner-context.js +1 -1
  11. package/esm2015/lib/alert-banner/models/constants.js +1 -1
  12. package/esm2015/lib/alert-banner/services/alert-banner.service.js +1 -1
  13. package/esm2015/lib/armature.module.js +1 -1
  14. package/esm2015/lib/base-components/base-component-api.js +1 -1
  15. package/esm2015/lib/base-components/base-component.module.js +1 -1
  16. package/esm2015/lib/base-components/sof-alert/sof-alert.component.js +1 -1
  17. package/esm2015/lib/base-components/sof-banner/sof-banner.component.js +1 -1
  18. package/esm2015/lib/base-components/sof-modal/sof-modal.component.js +1 -1
  19. package/esm2015/lib/base-components/sof-progress-bar/sof-progress-bar.component.js +3 -3
  20. package/esm2015/lib/core/client-generated/api/session.service.js +1 -1
  21. package/esm2015/lib/core/client-generated/configuration.js +1 -1
  22. package/esm2015/lib/core/client-generated/encoder.js +1 -1
  23. package/esm2015/lib/core/client-generated/model/applicationUserModel.js +1 -1
  24. package/esm2015/lib/core/client-generated/model/assertedUserModel.js +1 -1
  25. package/esm2015/lib/core/client-generated/model/brandingModel.js +1 -1
  26. package/esm2015/lib/core/client-generated/model/errorModel.js +1 -1
  27. package/esm2015/lib/core/client-generated/model/folderLink.js +1 -1
  28. package/esm2015/lib/core/client-generated/model/identityProfile.js +1 -1
  29. package/esm2015/lib/core/client-generated/model/models.js +1 -1
  30. package/esm2015/lib/core/client-generated/model/oAuthModel.js +1 -1
  31. package/esm2015/lib/core/client-generated/model/preferencesRow.js +1 -1
  32. package/esm2015/lib/core/client-generated/model/rolesRow.js +1 -1
  33. package/esm2015/lib/core/client-generated/model/sessionGetResponseModel.js +1 -1
  34. package/esm2015/lib/core/client-generated/model/sessionPostRequestModel.js +1 -1
  35. package/esm2015/lib/core/client-generated/model/sessionPostResponseModel.js +1 -1
  36. package/esm2015/lib/core/client-generated/model/sessionPutRequestModel.js +1 -1
  37. package/esm2015/lib/core/client-generated/model/sessionPutResponseModel.js +1 -1
  38. package/esm2015/lib/core/client-generated/model/sessionResponseModel.js +1 -1
  39. package/esm2015/lib/core/client-generated/model/settingsProfile.js +1 -1
  40. package/esm2015/lib/core/client-generated/model/themePaletteColorsModel.js +1 -1
  41. package/esm2015/lib/core/client-generated/model/themePaletteModel.js +1 -1
  42. package/esm2015/lib/core/client-generated/model/trackingModel.js +1 -1
  43. package/esm2015/lib/core/client-generated/model/validationRecordsRow.js +1 -1
  44. package/esm2015/lib/core/client-generated/variables.js +1 -1
  45. package/esm2015/lib/core/components/app-template/app-template.component.js +1 -1
  46. package/esm2015/lib/core/functions/guid.js +1 -1
  47. package/esm2015/lib/core/functions/naming-convention.js +1 -1
  48. package/esm2015/lib/core/initializer/abstract-startup-service.js +1 -1
  49. package/esm2015/lib/core/initializer/initializer.service.js +2 -2
  50. package/esm2015/lib/core/interceptors/armature-auth-token-append.interceptor.js +1 -1
  51. package/esm2015/lib/core/models/base-config.js +1 -1
  52. package/esm2015/lib/core/models/constants.js +1 -1
  53. package/esm2015/lib/core/models/data-store-config.js +1 -1
  54. package/esm2015/lib/core/models/header-config.js +1 -1
  55. package/esm2015/lib/core/models/http-verbs.js +1 -1
  56. package/esm2015/lib/core/models/navigation-config.js +1 -1
  57. package/esm2015/lib/core/models/oidc-auth-settings.js +1 -1
  58. package/esm2015/lib/core/models/route-path.js +1 -1
  59. package/esm2015/lib/core/models/session-config.js +1 -1
  60. package/esm2015/lib/core/models/styles.js +1 -1
  61. package/esm2015/lib/core/models/typed-session.js +1 -1
  62. package/esm2015/lib/core/models/user-entity-service-config.js +1 -1
  63. package/esm2015/lib/core/services/authorization.service.js +1 -1
  64. package/esm2015/lib/core/services/banner.service.js +1 -1
  65. package/esm2015/lib/core/services/base-config.service.js +1 -1
  66. package/esm2015/lib/core/services/custom-auth-config.service.js +1 -1
  67. package/esm2015/lib/core/services/default-config.service.js +1 -1
  68. package/esm2015/lib/core/services/session.service.js +1 -1
  69. package/esm2015/lib/core/services/user-entity.service.js +1 -1
  70. package/esm2015/lib/distributed-cache/client-generated/api/api.js +1 -1
  71. package/esm2015/lib/distributed-cache/client-generated/api/cache.service.js +1 -1
  72. package/esm2015/lib/distributed-cache/client-generated/configuration.js +1 -1
  73. package/esm2015/lib/distributed-cache/client-generated/encoder.js +1 -1
  74. package/esm2015/lib/distributed-cache/client-generated/model/cacheExpirationType.js +1 -1
  75. package/esm2015/lib/distributed-cache/client-generated/model/createCacheEntryRequestModel.js +1 -1
  76. package/esm2015/lib/distributed-cache/client-generated/model/models.js +1 -1
  77. package/esm2015/lib/distributed-cache/client-generated/model/retrieveCacheEntryResponseModel.js +1 -1
  78. package/esm2015/lib/distributed-cache/client-generated/model/updateCacheEntryRequestModel.js +1 -1
  79. package/esm2015/lib/distributed-cache/client-generated/variables.js +1 -1
  80. package/esm2015/lib/distributed-cache/distributed-cache-api.js +1 -1
  81. package/esm2015/lib/distributed-cache/distributed-cache.module.js +1 -1
  82. package/esm2015/lib/distributed-cache/models/constants.js +1 -1
  83. package/esm2015/lib/distributed-cache/models/policy-person.js +1 -1
  84. package/esm2015/lib/distributed-cache/services/server-cache.service.js +1 -1
  85. package/esm2015/lib/error/components/error-common/error-common.component.js +1 -1
  86. package/esm2015/lib/error/error-api.js +1 -1
  87. package/esm2015/lib/error/error.module.js +1 -1
  88. package/esm2015/lib/error/models/error-common-config.js +1 -1
  89. package/esm2015/lib/faq/components/faq/faq.component.js +1 -1
  90. package/esm2015/lib/faq/faq-api.js +1 -1
  91. package/esm2015/lib/faq/faq.module.js +1 -1
  92. package/esm2015/lib/faq/models/faq-config.js +1 -1
  93. package/esm2015/lib/faq/models/faq.js +1 -1
  94. package/esm2015/lib/footer/components/footer/footer.component.js +1 -1
  95. package/esm2015/lib/footer/components/site-map/site-map.component.js +1 -1
  96. package/esm2015/lib/footer/footer-api.js +1 -1
  97. package/esm2015/lib/footer/footer.module.js +1 -1
  98. package/esm2015/lib/footer/models/enum/site-map-direction.js +1 -1
  99. package/esm2015/lib/footer/models/footer-config.js +1 -1
  100. package/esm2015/lib/footer/models/site-map-models.js +1 -1
  101. package/esm2015/lib/forms/components/sof-address/sof-address.component.js +1 -1
  102. package/esm2015/lib/forms/directives/alphanumeric/alphanumeric.directive.js +1 -1
  103. package/esm2015/lib/forms/directives/letters-only/letters-only.directive.js +1 -1
  104. package/esm2015/lib/forms/directives/numbers-only/numbers-only.directive.js +1 -1
  105. package/esm2015/lib/forms/forms-api.js +1 -1
  106. package/esm2015/lib/forms/forms.module.js +1 -1
  107. package/esm2015/lib/forms/models/address.js +1 -1
  108. package/esm2015/lib/forms/models/constants.js +1 -1
  109. package/esm2015/lib/forms/models/county.js +1 -1
  110. package/esm2015/lib/forms/models/enums/states.js +1 -1
  111. package/esm2015/lib/forms/pipes/phone-format.pipe.js +1 -1
  112. package/esm2015/lib/forms/services/alert.service.js +1 -1
  113. package/esm2015/lib/header/components/header/header.component.js +1 -1
  114. package/esm2015/lib/header/components/mobile-header-menu/mobile-header-menu.component.js +1 -1
  115. package/esm2015/lib/header/header-api.js +1 -1
  116. package/esm2015/lib/header/header.module.js +1 -1
  117. package/esm2015/lib/header/models/header-auth.settings.js +1 -1
  118. package/esm2015/lib/header/models/header-language.settings.js +1 -1
  119. package/esm2015/lib/header/models/header-theme.settings.js +1 -1
  120. package/esm2015/lib/header/models/header.settings.js +1 -1
  121. package/esm2015/lib/header/models/mobile-header-nav.settings.js +1 -1
  122. package/esm2015/lib/navigation/components/navigation/navigation.component.js +72 -64
  123. package/esm2015/lib/navigation/models/nav-theme.settings.js +1 -1
  124. package/esm2015/lib/navigation/models/nav.settings.js +1 -1
  125. package/esm2015/lib/navigation/models/navigation.js +1 -1
  126. package/esm2015/lib/navigation/navigation-api.js +1 -1
  127. package/esm2015/lib/navigation/navigation.module.js +1 -1
  128. package/esm2015/lib/oauth/models/constants.js +1 -1
  129. package/esm2015/lib/oauth/models/generated/accountManagementAssertionModel.js +1 -1
  130. package/esm2015/lib/oauth/models/generated/accountManagementRefreshRequestModel.js +1 -1
  131. package/esm2015/lib/oauth/models/generated/accountManagementResponseModel.js +1 -1
  132. package/esm2015/lib/oauth/models/generated/coverageDetail.js +1 -1
  133. package/esm2015/lib/oauth/models/generated/finance.js +1 -1
  134. package/esm2015/lib/oauth/models/generated/iSsoResponseModel.js +1 -1
  135. package/esm2015/lib/oauth/models/generated/iSsoResponseModelAccountManagementAssertionModel.js +1 -1
  136. package/esm2015/lib/oauth/models/generated/person.js +1 -1
  137. package/esm2015/lib/oauth/models/generated/policy.js +1 -1
  138. package/esm2015/lib/oauth/models/generated/refreshResponseModel.js +1 -1
  139. package/esm2015/lib/oauth/models/hybrid-saml-oauth-config.js +1 -1
  140. package/esm2015/lib/oauth/oauth-api.js +1 -1
  141. package/esm2015/lib/oauth/oauth.module.js +1 -1
  142. package/esm2015/lib/oauth/services/hybrid-saml-oauth.service.js +1 -1
  143. package/esm2015/lib/rbac/directives/rbac-action.directive.js +1 -1
  144. package/esm2015/lib/rbac/models/access-token-claims.js +1 -1
  145. package/esm2015/lib/rbac/models/constants.js +1 -1
  146. package/esm2015/lib/rbac/models/decoded-access-token.js +1 -1
  147. package/esm2015/lib/rbac/models/rbac-config.js +1 -1
  148. package/esm2015/lib/rbac/models/role-access.js +1 -1
  149. package/esm2015/lib/rbac/rbac-api.js +1 -1
  150. package/esm2015/lib/rbac/rbac.module.js +1 -1
  151. package/esm2015/lib/rbac/services/ar-role-nav.service.js +1 -1
  152. package/esm2015/lib/rbac/services/oauth2-role.service.js +1 -1
  153. package/esm2015/lib/rbac/services/role-nav.service.js +1 -1
  154. package/esm2015/lib/rum/models/arm-error.js +1 -1
  155. package/esm2015/lib/rum/models/rum-config.js +1 -1
  156. package/esm2015/lib/rum/rum-api.js +1 -1
  157. package/esm2015/lib/rum/rum.module.js +1 -1
  158. package/esm2015/lib/rum/services/rum.service.js +1 -1
  159. package/esm2015/lib/rum/services/shared-error.service.js +1 -1
  160. package/esm2015/lib/rum/services/softheon-error-handler.service.js +1 -1
  161. package/esm2015/lib/saml/components/redirect-saml/redirect-saml.component.js +1 -1
  162. package/esm2015/lib/saml/models/i-saml-request.js +1 -1
  163. package/esm2015/lib/saml/models/i-saml-response.js +1 -1
  164. package/esm2015/lib/saml/models/redirect-saml-request.js +1 -1
  165. package/esm2015/lib/saml/models/sso-gateway-model.js +1 -1
  166. package/esm2015/lib/saml/saml-api.js +1 -1
  167. package/esm2015/lib/saml/saml.module.js +1 -1
  168. package/esm2015/lib/saml/services/entry/abstract-saml-entry.service.js +1 -1
  169. package/esm2015/lib/saml/services/entry/sso-gateway-entry.service.js +1 -1
  170. package/esm2015/lib/saml/services/send-off/abstract-saml.service.js +1 -1
  171. package/esm2015/lib/saml/services/send-off/saml.service.js +1 -1
  172. package/esm2015/lib/sof-pipe/constants/constants.js +1 -1
  173. package/esm2015/lib/sof-pipe/models/sof-date-pipe-format.js +1 -1
  174. package/esm2015/lib/sof-pipe/pipes/sof-blank/sof-blank.pipe.js +1 -1
  175. package/esm2015/lib/sof-pipe/pipes/sof-date/sof-date.pipe.js +1 -1
  176. package/esm2015/lib/sof-pipe/pipes/sof-ssn/sof-ssn.pipe.js +1 -1
  177. package/esm2015/lib/sof-pipe/sof-pipe.api.js +1 -1
  178. package/esm2015/lib/sof-pipe/sof-pipe.module.js +1 -1
  179. package/esm2015/lib/theming/directives/css-override.directive.js +1 -1
  180. package/esm2015/lib/theming/models/css-override.js +1 -1
  181. package/esm2015/lib/theming/services/theme.service.js +1 -1
  182. package/esm2015/lib/theming/theme-api.js +1 -1
  183. package/esm2015/lib/theming/theme.module.js +1 -1
  184. package/esm2015/public-api.js +1 -1
  185. package/esm2015/softheon-armature.js +1 -1
  186. package/fesm2015/softheon-armature.js +75 -67
  187. package/fesm2015/softheon-armature.js.map +1 -1
  188. package/lib/navigation/components/navigation/navigation.component.d.ts +12 -8
  189. package/package.json +2 -2
  190. package/softheon-armature.metadata.json +1 -1
@@ -380,27 +380,6 @@ export class ArmatureNavigationComponent {
380
380
  childNode.visited = true;
381
381
  }
382
382
  }
383
- /** Initializes the basic nav settings */
384
- initBasicSettings() {
385
- this.settings.fontAwesomeMenuIcon = this.settings.fontAwesomeMenuIcon || 'fas fa-angle-double-left';
386
- this.settings.fontAwesomeMenuIconClosed = this.settings.fontAwesomeMenuIconClosed || 'fas fa-angle-double-right';
387
- this.settings.allowNavToggle = this.settings.allowNavToggle == null ? true : this.settings.allowNavToggle;
388
- this.settings.mainMenuText ? this.mainMenuText = this.settings.mainMenuText : this.mainMenuText = 'Main Menu';
389
- this.settings.headerHeight = this.settings.headerHeight || 60;
390
- this.settings.menuButtonSRText = this.settings.menuButtonSRText || 'Menu Button';
391
- this.settings.menuStyle = this.settings.menuStyle || 'static';
392
- this.settings.displayNumbers = this.settings.displayNumbers == null ? true : this.settings.displayNumbers;
393
- this.settings.progressSectionCompleteIcon = this.settings.progressSectionCompleteIcon || 'fas fa-check-circle';
394
- this.settings.progressSectionFutureIcon = this.settings.progressSectionFutureIcon || 'far fa-circle';
395
- this.settings.progressSectionCurrentIcon = this.settings.progressSectionCurrentIcon || 'fas fa-circle';
396
- this.settings.progressMenuCompleteIcon = this.settings.progressMenuCompleteIcon || 'far fa-check';
397
- this.settings.showProgressBar = this.settings.showProgressBar == null ? true : this.settings.showProgressBar;
398
- this.settings.sideNavWidthDesktop = this.settings.sideNavWidthDesktop || '350';
399
- this.settings.sideNavWidthMobile = this.settings.sideNavWidthMobile || '350';
400
- this.settings.overrideNavigation = this.settings.overrideNavigation || false;
401
- this.settings.progressMenuWidth = this.settings.progressMenuWidth || '280';
402
- this.settings.useCustomMobileFooter = this.settings.useCustomMobileFooter != null ? this.settings.useCustomMobileFooter : false;
403
- }
404
383
  /**
405
384
  * Closes the expansion panel and navigates to the given node
406
385
  * @param el The mat expansion panel
@@ -410,29 +389,35 @@ export class ArmatureNavigationComponent {
410
389
  el.close();
411
390
  this.navigate(this.navigationData[index].route);
412
391
  }
413
- /** Initializes the advanced nav settings */
414
- initAdvancedSettings() {
415
- this.advancedSettings.topGapDesktop = this.advancedSettings.topGapDesktop || 0;
416
- this.advancedSettings.topGapMobile = this.advancedSettings.topGapMobile || this.settings.headerHeight;
417
- this.advancedSettings.marginTopDesktop = this.advancedSettings.marginTopDesktop || 0;
418
- this.advancedSettings.marginTopMobile = this.advancedSettings.marginTopMobile || 0;
392
+ /**
393
+ * Hides the message
394
+ */
395
+ hide() {
396
+ this.showMessage = false;
419
397
  }
420
- /** Initializes the nav theme settings */
421
- initThemeSettings() {
422
- this.themeSettings.contentBgColor ? this.setThemeColor('content-bg-color', this.themeSettings.contentBgColor) : undefined;
423
- this.themeSettings.fontColor ? this.setThemeColor('font-color', this.themeSettings.fontColor) : undefined;
424
- this.themeSettings.fontColor = this.themeSettings.fontColor || '#000';
425
- this.themeSettings.mobileBgColor = this.themeSettings.mobileBgColor || '#ffffff';
426
- this.themeSettings.bgGradientColor1 ? this.setThemeColor('bg-gradient-color-1', this.themeSettings.bgGradientColor1) : undefined;
427
- this.themeSettings.bgGradientColor2 ? this.setThemeColor('bg-gradient-color-2', this.themeSettings.bgGradientColor2) : undefined;
428
- this.themeSettings.borderRightColor ? this.setThemeColor('border-right-color', this.themeSettings.borderRightColor) : undefined;
429
- this.themeSettings.listBorderColor ? this.setThemeColor('list-border-color', this.themeSettings.listBorderColor) : undefined;
430
- this.themeSettings.highlightGradient1 ? this.setThemeColor('highlight-gradient-1', this.themeSettings.highlightGradient1) : undefined;
431
- this.themeSettings.highlightGradient2 ? this.setThemeColor('highlight-gradient-2', this.themeSettings.highlightGradient2) : undefined;
432
- this.themeSettings.subHighlightBorderColor ?
433
- this.setThemeColor('sub-highlight-border-color', this.themeSettings.subHighlightBorderColor) : undefined;
434
- this.themeSettings.subHighlightBgColor ?
435
- this.setThemeColor('sub-highlight-bg-color', this.themeSettings.subHighlightBgColor) : undefined;
398
+ /**
399
+ * Logs out once user is authorized
400
+ * */
401
+ logOut() {
402
+ this.authorizationService.authorizeUser();
403
+ }
404
+ /**
405
+ * Closes mobile navigation after selection.
406
+ */
407
+ closeNavigationForMobile() {
408
+ if (this.mobileQuery.matches) {
409
+ this.sidenav.close();
410
+ }
411
+ }
412
+ /**
413
+ * Is the navigation selected
414
+ */
415
+ isNavSelected(node) {
416
+ return this.router.isActive(node.route, true);
417
+ }
418
+ /** Sets the width for the side nav */
419
+ setNavWidth(width) {
420
+ return width.includes('%') || width.includes('px') ? width : width + 'px';
436
421
  }
437
422
  /** Binds the stepper to the router */
438
423
  bindStepperToRoutes() {
@@ -474,33 +459,56 @@ export class ArmatureNavigationComponent {
474
459
  }
475
460
  }));
476
461
  }
477
- /**
478
- * Hides the message
479
- */
480
- hide() {
481
- this.showMessage = false;
482
- }
483
- /**
484
- * Logs out once user is authorized
485
- * */
486
- logOut() {
487
- this.authorizationService.authorizeUser();
462
+ /** Initializes the advanced nav settings */
463
+ initAdvancedSettings() {
464
+ this.advancedSettings.topGapDesktop = this.advancedSettings.topGapDesktop || 0;
465
+ this.advancedSettings.topGapMobile = this.advancedSettings.topGapMobile || this.settings.headerHeight;
466
+ this.advancedSettings.marginTopDesktop = this.advancedSettings.marginTopDesktop || 0;
467
+ this.advancedSettings.marginTopMobile = this.advancedSettings.marginTopMobile || 0;
488
468
  }
489
- /**
490
- * Is the navigation selected
491
- */
492
- isNavSelected(node) {
493
- return this.router.isActive(node.route, true);
469
+ /** Initializes the nav theme settings */
470
+ initThemeSettings() {
471
+ this.themeSettings.contentBgColor ? this.setThemeColor('content-bg-color', this.themeSettings.contentBgColor) : undefined;
472
+ this.themeSettings.fontColor ? this.setThemeColor('font-color', this.themeSettings.fontColor) : undefined;
473
+ this.themeSettings.fontColor = this.themeSettings.fontColor || '#000';
474
+ this.themeSettings.mobileBgColor = this.themeSettings.mobileBgColor || '#ffffff';
475
+ this.themeSettings.bgGradientColor1 ? this.setThemeColor('bg-gradient-color-1', this.themeSettings.bgGradientColor1) : undefined;
476
+ this.themeSettings.bgGradientColor2 ? this.setThemeColor('bg-gradient-color-2', this.themeSettings.bgGradientColor2) : undefined;
477
+ this.themeSettings.borderRightColor ? this.setThemeColor('border-right-color', this.themeSettings.borderRightColor) : undefined;
478
+ this.themeSettings.listBorderColor ? this.setThemeColor('list-border-color', this.themeSettings.listBorderColor) : undefined;
479
+ this.themeSettings.highlightGradient1 ? this.setThemeColor('highlight-gradient-1', this.themeSettings.highlightGradient1) : undefined;
480
+ this.themeSettings.highlightGradient2 ? this.setThemeColor('highlight-gradient-2', this.themeSettings.highlightGradient2) : undefined;
481
+ this.themeSettings.subHighlightBorderColor ?
482
+ this.setThemeColor('sub-highlight-border-color', this.themeSettings.subHighlightBorderColor) : undefined;
483
+ this.themeSettings.subHighlightBgColor ?
484
+ this.setThemeColor('sub-highlight-bg-color', this.themeSettings.subHighlightBgColor) : undefined;
494
485
  }
495
- /** Sets the width for the side nav */
496
- setNavWidth(width) {
497
- return width.includes('%') || width.includes('px') ? width : width + 'px';
486
+ /** Initializes the basic nav settings */
487
+ initBasicSettings() {
488
+ this.settings.fontAwesomeMenuIcon = this.settings.fontAwesomeMenuIcon || 'fas fa-angle-double-left';
489
+ this.settings.fontAwesomeMenuIconClosed = this.settings.fontAwesomeMenuIconClosed || 'fas fa-angle-double-right';
490
+ this.settings.allowNavToggle = this.settings.allowNavToggle == null ? true : this.settings.allowNavToggle;
491
+ this.settings.mainMenuText ? this.mainMenuText = this.settings.mainMenuText : this.mainMenuText = 'Main Menu';
492
+ this.settings.headerHeight = this.settings.headerHeight || 60;
493
+ this.settings.menuButtonSRText = this.settings.menuButtonSRText || 'Menu Button';
494
+ this.settings.menuStyle = this.settings.menuStyle || 'static';
495
+ this.settings.displayNumbers = this.settings.displayNumbers == null ? true : this.settings.displayNumbers;
496
+ this.settings.progressSectionCompleteIcon = this.settings.progressSectionCompleteIcon || 'fas fa-check-circle';
497
+ this.settings.progressSectionFutureIcon = this.settings.progressSectionFutureIcon || 'far fa-circle';
498
+ this.settings.progressSectionCurrentIcon = this.settings.progressSectionCurrentIcon || 'fas fa-circle';
499
+ this.settings.progressMenuCompleteIcon = this.settings.progressMenuCompleteIcon || 'far fa-check';
500
+ this.settings.showProgressBar = this.settings.showProgressBar == null ? true : this.settings.showProgressBar;
501
+ this.settings.sideNavWidthDesktop = this.settings.sideNavWidthDesktop || '350';
502
+ this.settings.sideNavWidthMobile = this.settings.sideNavWidthMobile || '350';
503
+ this.settings.overrideNavigation = this.settings.overrideNavigation || false;
504
+ this.settings.progressMenuWidth = this.settings.progressMenuWidth || '280';
505
+ this.settings.useCustomMobileFooter = this.settings.useCustomMobileFooter != null ? this.settings.useCustomMobileFooter : false;
498
506
  }
499
507
  }
500
508
  ArmatureNavigationComponent.decorators = [
501
509
  { type: Component, args: [{
502
510
  selector: 'sof-ar-navigation',
503
- template: "<div class=\"sof-ar-nav-container\"\r\n [style.top]=\"mobileQuery.matches && advancedSettings.topGapMobile ? advancedSettings.topGapMobile + 'px' : settings.headerHeight + 'px'\"\r\n [class.sof-ar-nav-mobile]=\"mobileQuery.matches\">\r\n <div *ngIf=\"showMessage\" m-a-0 fxLayout=\"row\" fxLayoutAlign=\"space-between center\" sws-alert--secondary role=\"alert\">\r\n <div fxLayout=\"row\" aria-hidden=\"true\">\r\n <i *ngIf=\"showCheckMark\" m-r-5 m-l-5 class=\"fas fa-check-circle icon-container\"></i>\r\n <p class=\"message-container\" m-r-5 m-l-5 [innerHtml]=\"message | translate\"></p>\r\n </div>\r\n <div fxLayout=\"column\">\r\n <button id=\"btnClose\" (click)=\"hide()\" mat-icon-button [attr.aria-label]=\"'common.close' | translate\">\r\n <span aria-hidden=\"true\">\r\n <i class=\"fal fa-times fa-lg\"></i>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n <button id=\"sof-ar-nav-btn-menu\" aria-label=\"Menu Button\" mat-icon-button [disableRipple]=\"true\"\r\n (click)=\"snav.toggle()\" class=\"sof-ar-nav-menu-btn\"\r\n [class.hidden]=\"!(mobileQuery.matches || settings.allowNavToggle) || settings.hideNavigation\">\r\n <span *ngIf=\"isNavOpen; else closedIcon\" aria-hidden=\"true\" class=\"sof-ar-nav-menu-icon\">\r\n <i class=\"{{settings.fontAwesomeMenuIcon}} menu-icon\"></i>\r\n </span>\r\n <ng-template #closedIcon>\r\n <span aria-hidden=\"true\" class=\"sof-ar-nav-menu-icon\">\r\n <i class=\"{{settings.fontAwesomeMenuIconClosed}} menu-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <span class=\"sr-only\">{{settings.menuButtonSRText | translate}}</span>\r\n </button>\r\n\r\n <mat-sidenav-container autosize class=\"sof-ar-nav-sidenav-container\" [style.marginTop.px]=\"\r\n mobileQuery.matches ? advancedSettings.marginTopMobile : advancedSettings.marginTopDesktop\">\r\n <mat-sidenav [disableClose]=\"!mobileQuery.matches\" class=\"sof-ar-nav-sidenav\" #snav [mode]=\"mobileQuery.matches ? 'over' : 'side'\"\r\n [fixedInViewport]=\"mobileQuery.matches\" [fixedTopGap]=\"mobileQuery.matches ? advancedSettings.topGapMobile : advancedSettings.topGapDesktop\"\r\n [opened]=\"!mobileQuery.matches && !settings.hideNavigation && settings.menuStyle!='progress' \"\r\n [style.width]=\"mobileQuery.matches ? setNavWidth(settings.sideNavWidthMobile) : setNavWidth(settings.sideNavWidthDesktop)\"\r\n [ngStyle]=\"{background:mobileQuery.matches ? themeSettings?.mobileBgColor : undefined}\">\r\n <ng-container *ngIf=\"mobileQuery.matches && userName && !settings.customUserName\">\r\n <span class=\"user-name\">\r\n {{userName}}\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"mobileQuery.matches && settings.customUserName\">\r\n <span class=\"user-name\">\r\n {{settings.customUserName | translate}}\r\n </span>\r\n </ng-container>\r\n <!-- Nav Header Content -->\r\n <ng-content select=\"[sof-ar-nav-header]\"> </ng-content>\r\n\r\n <!-- Static Navigation -->\r\n <div class=\"nav-content-item sidenav-background\" *ngIf=\"settings.menuStyle === 'static'\" [ngStyle]=\"{'padding-bottom.px': (footerItemCount*64)+128}\">\r\n <ng-container *ngIf=\"settings.menuStyle === 'static'\">\r\n <ng-container *ngFor=\"let nav of navigationData\">\r\n <ng-container *ngIf=\"nav?.subNodes?.length && !nav.hidden\">\r\n <mat-accordion>\r\n <mat-expansion-panel [expanded]=\"nav.expanded\">\r\n <mat-expansion-panel-header [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(nav) }\">\r\n <!-- Desktop Nav -->\r\n <ng-container>\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <a class=\"nav-item\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"{{nav?.fontAwesomeIcon}}\"></i>\r\n </span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"{{nav?.fontAwesomeIcon}}\"></i>\r\n </span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </mat-expansion-panel-header>\r\n <!-- Desktop SubNav -->\r\n <ng-container>\r\n <mat-nav-list [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(subnav) }\" class=\"subnav-content\"\r\n [disableRipple]=\"true\" *ngFor=\"let subnav of nav?.subNodes\">\r\n <a mat-list-item [routerLinkActive]=\"['sof-ar-nav-sub-active-route']\" [routerLink]=\"subnav.route\">\r\n {{subnav.text | translate}}\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </ng-container>\r\n <!-- If subnodes are not there -->\r\n <ng-container>\r\n <!-- Desktop Nav -->\r\n <ng-container *ngIf=\"!nav?.subNodes?.length && !nav?.hidden\">\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list \r\n [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(nav) }\" class=\"nav-header\"\r\n [disableRipple]=\"true\">\r\n <a class=\"nav-item nav-item-margin\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Stepper -->\r\n <mat-vertical-stepper *ngIf=\"settings.menuStyle === 'stepper'\" [selectedIndex]=\"selectedParentIndex\" #vertStepper\r\n [linear]=\"false\" class=\"sidenav-background\">\r\n <!-- Alternate step states for nav, icaons should always be white only worked with styles -->\r\n <ng-template matStepperIcon=\"create\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"edit\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"active\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"done\">\r\n <span>\r\n <i class=\"fas fa-check\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n\r\n <!-- nav steps -->\r\n <ng-container *ngFor=\"let nav of navigationData; let i = index\">\r\n <mat-step *ngIf=\"!nav?.hidden\" state=\"{{ determineStepState(i, -1) }}\">\r\n <ng-template matStepLabel *ngIf=\"!nav.hidden\">\r\n <div id=\"divStep{{ i }}\" style=\"height: 72px\" fxLayout=\"row\" fxLayoutAlign=\"start center\"\r\n matTooltip=\"{{ nav.text | translate }}\" [matTooltipPosition]=\"'after'\" fxFlex=\"100%\">\r\n <a id=\"step{{ i }}\" fxFlex=\"100%\" class=\"mat-button step-link\" [routerLink]=\"nav.route\"\r\n [ngStyle]=\"{ color: themeSettings?.fontColor }\" [routerLinkActive]=\"['step-active']\">\r\n {{ nav.text | translate }}\r\n </a>\r\n </div>\r\n </ng-template>\r\n <p [innerHTML]=\"nav.stepContent | translate\"></p>\r\n <!-- sub nav -->\r\n <mat-vertical-stepper *ngIf=\"nav?.subNodes\" [selectedIndex]=\"selectedChildIndexes[i]\" [linear]=\"false\"\r\n #vertStepperInner>\r\n <!-- Alternate step states for sub nav, icons should always be white only worked with styles -->\r\n <ng-template matStepperIcon=\"create\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"edit\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"done\">\r\n <span>\r\n <i class=\"fas fa-check\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"active\">\r\n <span>\r\n <i class=\"fas fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"none\">\r\n <span></span>\r\n </ng-template>\r\n <!-- sub nav steps -->\r\n <ng-container *ngFor=\"let subnav of nav?.subNodes; let j = index\">\r\n <mat-step state=\"{{ determineStepState(i, j) }}\" *ngIf=\"!subnav.hidden\" >\r\n <ng-template matStepLabel>\r\n <div id=\"divSubStep{{ i }}-{{ j }}\" style=\"height: 72px\" fxLayout=\"row\" fxLayoutAlign=\"start center\"\r\n matTooltip=\"{{ subnav.text | translate }}\" [matTooltipPosition]=\"'after'\" fxFlex=\"100%\">\r\n <a id=\"subStep{{ i }}-{{ j }}\" class=\"mat-button step-link\"\r\n [ngStyle]=\"{ color: themeSettings?.fontColor }\" [routerLink]=\"subnav.route\"\r\n [routerLinkActive]=\"['step-active']\">{{ subnav.text | translate }}</a>\r\n </div>\r\n </ng-template>\r\n <p [innerHTML]=\"subnav.stepContent | translate\"></p>\r\n </mat-step>\r\n </ng-container>\r\n \r\n </mat-vertical-stepper>\r\n </mat-step>\r\n </ng-container>\r\n \r\n </mat-vertical-stepper>\r\n\r\n <!-- Nav Footer -->\r\n <div class=\"nav-footer-item\">\r\n <ng-container *ngIf=\"settings.menuStyle === 'static'\">\r\n <ng-container *ngFor=\"let nav of footerNavigationData\">\r\n <ng-container>\r\n <!-- Desktop Nav -->\r\n <ng-container *ngIf=\"!nav?.subNodes?.length\">\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list class=\"nav-header\" [disableRipple]=\"true\">\r\n <a class=\"nav-item\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n {{nav.text | translate}}\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list>\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n {{nav.text | translate}}\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template [ngTemplateOutlet]=\"navigationFooter\">\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- the mobile progress menu-->\r\n <ng-container *ngIf=\"settings?.menuStyle === 'progress'\">\r\n <div class=\"sidenav-background\" [ngStyle]=\"{'padding-bottom.px': (footerItemCount*64)+128}\">\r\n <mat-accordion>\r\n <div *ngFor=\"let step of navigationData; let i = index\">\r\n <ng-container *ngIf=\"step.subNodes && step.subNodes.length > 0 && !step.hidden\">\r\n <mat-expansion-panel hideToggle class=\"progress-mobile-expansion-panel\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" (opened)=\"panelOpenState = true\"\r\n (closed)=\"panelOpenState = false\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title class=\"progress-mobile-panel-title\">\r\n <div style=\"width: -webkit-fill-available;\"\r\n [ngClass]=\"{'disabled':(!step.visited || step.isDisabled) && !settings.overrideNavigation && !step.complete,'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \" }}\r\n </span>\r\n <span class=\"nav-btn-text\">\r\n {{ step.text | translate }}\r\n </span>\r\n <span *ngIf=\"!panelOpenState\">\r\n <i class=\"fas fa-chevron-down panel-icon\"></i>\r\n </span>\r\n <span *ngIf=\"panelOpenState\">\r\n <i class=\"fas fa-chevron-up panel-icon\"></i>\r\n </span>\r\n </div>\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <!-- mobile sub menu -->\r\n <div class=\"progress-nav-menu\" *ngFor=\"let subNode of step.subNodes; let idx = index;\" [hidden]=\"step.subNodes[idx].hidden\">\r\n <button id=\"mobileMenu{{ idx }}\" mat-button class=\"step-link progress-menu-mobile-btn\"\r\n [ngClass]=\"{'color-primary':subNode.complete && subNode!=activeSubNode}\"\r\n [routerLinkActive]=\"['progress-menu-active']\" [ngStyle]=\"{ ' color': themeSettings?.fontColor }\"\r\n [routerLink]=\"subNode.route\" [disabled]=\"!subNode.visited && !settings.overrideNavigation\">\r\n <ng-template [ngTemplateOutlet]=\"progressSubNodeIcons\"\r\n [ngTemplateOutletContext]=\"{subNode:subNode}\">\r\n </ng-template>\r\n <span class=\"nav-menu-btn-text\" [ngClass]=\"{'disabled':(!subNode.visited) && !settings.overrideNavigation && !subNode.complete,'color-primary':subNode.complete,'progress-menu-active':subNode===activeSubNode}\">{{ subNode.text | translate }}</span>\r\n </button>\r\n </div>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n <!-- if there are no subNodes -->\r\n <ng-container *ngIf=\"(!step.subNodes || step.subNodes.length==0) && !step.hidden\">\r\n <mat-expansion-panel #panel hideToggle (opened)=\"disablePanel(panel,i)\" class=\"progress-mobile-expansion-panel\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title class=\"progress-mobile-panel-title\">\r\n <div [ngClass]=\"{'disabled':(!step.visited || step.isDisabled) && !settings.overrideNavigation && !step.complete,'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \" }}\r\n </span>\r\n <span class=\"nav-btn-text\">\r\n {{ step.text | translate }}\r\n </span>\r\n </div>\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n </div>\r\n </mat-accordion>\r\n </div>\r\n\r\n <!-- the progress menu language and logout buttons-->\r\n <div class=\"nav-footer-item progress-footer\">\r\n <ng-template [ngTemplateOutlet]=\"navigationFooter\">\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <!-- Horizontal Progress -->\r\n <ng-container *ngIf=\"settings?.menuStyle === 'progress'\">\r\n <mat-progress-bar *ngIf=\"settings?.showProgressBar\" mode=\"determinate\" [value]=\"navProgressCount\"\r\n style=\"height: 9px\" color=\"accent\">\r\n </mat-progress-bar>\r\n <div fxHide.lt-md class=\"step-titles center\" fxLayout=\"row\" style=\"justify-content:center !important\" [class.hidden]=\"settings.hideNavigation\">\r\n <div *ngFor=\"let step of navigationData; let i = index\" class=\"horizontal-progress-div\">\r\n <ng-container *ngIf=\"!step.subNodes?.length && !step.hidden\">\r\n <button mat-button [routerLink]=\"step.route\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" class=\"progress-menu-btn\"\r\n [ngClass]=\"{'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \"}}\r\n </span>\r\n <span class=\"nav-btn-text\">{{ step.text | translate }}</span>\r\n </button>\r\n </ng-container>\r\n <!-- if there are subnodes create menus for each step -->\r\n <ng-container *ngIf=\"step.subNodes && step.subNodes.length && !step.hidden\">\r\n <button [ngClass]=\"{'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\"\r\n mat-button [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" class=\"progress-menu-btn\"\r\n [matMenuTriggerFor]=\"menu\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \"}}\r\n </span>\r\n <span class=\"nav-btn-text\">{{ step.text | translate }}</span>\r\n </button>\r\n <mat-menu #menu=\"matMenu\" class=\"sof-ar-mat-menu progress-menu-panel\">\r\n <div class=\"progress-nav-menu\" *ngFor=\"let subNode of step.subNodes; let idx = index;\" [ngStyle]=\"{width:settings.progressMenuWidth+'px'}\" [hidden]=\"step.subNodes[idx].hidden\">\r\n <button id=\"submenu{{ idx }}\" mat-button class=\"step-link progress-menu-btn\"\r\n [ngClass]=\"{'color-primary':subNode.complete && subNode!=activeSubNode,'disabled':!subNode.visited && !settings.overrideNavigation}\"\r\n [routerLinkActive]=\"['progress-menu-active']\" [ngStyle]=\"{ ' color': themeSettings?.fontColor }\"\r\n [routerLink]=\"subNode.route\" [disabled]=\"!subNode.visited && !settings.overrideNavigation\">\r\n <ng-template [ngTemplateOutlet]=\"progressSubNodeIcons\"\r\n [ngTemplateOutletContext]=\"{subNode:subNode}\">\r\n </ng-template>\r\n <span class=\"nav-menu-btn-text\">{{ subNode.text |translate }}</span>\r\n </button>\r\n </div>\r\n </mat-menu>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"mobile-progress-container\" fxHide.gt-sm>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-content sof-ar-nav-content></ng-content>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n <!-- The progress menu parent node icon template-->\r\n <ng-template #progressParentNodeIcons let-step='step'>\r\n <span *ngIf=\"step.complete && step != activeParentNode\">\r\n <i class=\"{{ settings.progressSectionCompleteIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"step === activeParentNode\">\r\n <i class=\"{{ settings.progressSectionCurrentIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"!step.complete && step != activeParentNode\" [ngClass]=\"{'disabled':!step.visited && !settings.overrideNavigation}\">\r\n <i class=\"{{ settings.progressSectionFutureIcon }} progress-nav-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <!-- The progress menu sub node icon template-->\r\n <ng-template #progressSubNodeIcons let-subNode='subNode'>\r\n <span *ngIf=\"subNode.complete &&activeSubNode !=subNode\">\r\n <i class=\"{{settings.progressMenuCompleteIcon}} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"activeSubNode ===subNode\">\r\n <i class=\"{{ settings.progressSectionCurrentIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"!subNode.complete &&activeSubNode !=subNode\" [ngClass]=\"{'disabled':!subNode.visited && !settings.overrideNavigation}\">\r\n <i class=\"{{ settings.progressSectionFutureIcon }} progress-nav-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <!-- The navigation footer template for language and logout buttons -->\r\n <ng-template #navigationFooter>\r\n <ng-content select=\"[sof-ar-nav-mobile-footer]\"> </ng-content>\r\n <ng-container *ngIf=\"!settings.useCustomMobileFooter\">\r\n <!-- The language button -->\r\n <ng-container *ngIf=\"languageSettings?.displayLanguageOptions && languageSettings?.languages.length > 2 && mobileQuery.matches\">\r\n <button id=\"sof-ar-nav-lang-dropdown\" mat-stroked-button\r\n class=\"faded-button-50 language-button navigationFooter\" [matMenuTriggerFor]=\"headerLanguageMenu\"\r\n [attr.aria-label]=\"languageSettings.buttonText | translate\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"far fa-globe language-globe\"></i>\r\n </span>\r\n {{languageSettings.buttonText | translate}}\r\n </button>\r\n <mat-menu #headerLanguageMenu=\"matMenu\" class=\"sof-ar-mat-menu\">\r\n <button mat-menu-item *ngFor=\"let lang of languageSettings.languages\" (click)=\"setLanguage$.emit(lang)\"\r\n id=\"apply-lang-btn-{{lang}}\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\">\r\n <div fxFlex=\"auto\">\r\n {{ lang | translate }}\r\n </div>\r\n <div fxFlex=\"auto\" fxLayoutAlign=\"end end\">\r\n <i *ngIf=\"currentLang === lang\" class=\"fad fa-check selected-language-icon\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <ng-container *ngIf=\"languageSettings?.displayLanguageOptions && languageSettings?.languages.length === 2 && mobileQuery.matches\">\r\n <button *ngIf=\"languageSettings?.languages.length === 2\" id=\"sof-ar-nav-lang-button\" mat-stroked-button\r\n class=\"faded-button-50 language-button navigationFooter\"\r\n [attr.aria-label]=\"languageSettings.buttonText | translate\" (click)=\"setLanguage$.emit()\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"far fa-globe language-globe\"></i>\r\n </span>\r\n {{otherLangText | translate}}\r\n </button>\r\n </ng-container>\r\n <!-- The logout button-->\r\n <ng-container *ngIf=\"mobileQuery.matches && userName\">\r\n <button id=\"sof-ar-header-lang-button\" mat-stroked-button class=\"navigationFooter\" (click)=\"logOut()\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"fas fa-sign-out-alt\"></i>\r\n </span>\r\n {{logOutText | translate}}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n</div>\r\n",
511
+ template: "<div class=\"sof-ar-nav-container\"\r\n [style.top]=\"mobileQuery.matches && advancedSettings.topGapMobile ? advancedSettings.topGapMobile + 'px' : settings.headerHeight + 'px'\"\r\n [class.sof-ar-nav-mobile]=\"mobileQuery.matches\">\r\n <div *ngIf=\"showMessage\" m-a-0 fxLayout=\"row\" fxLayoutAlign=\"space-between center\" sws-alert--secondary role=\"alert\">\r\n <div fxLayout=\"row\" aria-hidden=\"true\">\r\n <i *ngIf=\"showCheckMark\" m-r-5 m-l-5 class=\"fas fa-check-circle icon-container\"></i>\r\n <p class=\"message-container\" m-r-5 m-l-5 [innerHtml]=\"message | translate\"></p>\r\n </div>\r\n <div fxLayout=\"column\">\r\n <button id=\"btnClose\" (click)=\"hide()\" mat-icon-button [attr.aria-label]=\"'common.close' | translate\">\r\n <span aria-hidden=\"true\">\r\n <i class=\"fal fa-times fa-lg\"></i>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n <button id=\"sof-ar-nav-btn-menu\" aria-label=\"Menu Button\" mat-icon-button [disableRipple]=\"true\"\r\n (click)=\"snav.toggle()\" class=\"sof-ar-nav-menu-btn\"\r\n [class.hidden]=\"!(mobileQuery.matches || settings.allowNavToggle) || settings.hideNavigation\">\r\n <span *ngIf=\"isNavOpen; else closedIcon\" aria-hidden=\"true\" class=\"sof-ar-nav-menu-icon\">\r\n <i class=\"{{settings.fontAwesomeMenuIcon}} menu-icon\"></i>\r\n </span>\r\n <ng-template #closedIcon>\r\n <span aria-hidden=\"true\" class=\"sof-ar-nav-menu-icon\">\r\n <i class=\"{{settings.fontAwesomeMenuIconClosed}} menu-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <span class=\"sr-only\">{{settings.menuButtonSRText | translate}}</span>\r\n </button>\r\n\r\n <mat-sidenav-container autosize class=\"sof-ar-nav-sidenav-container\" [style.marginTop.px]=\"\r\n mobileQuery.matches ? advancedSettings.marginTopMobile : advancedSettings.marginTopDesktop\">\r\n <mat-sidenav [disableClose]=\"!mobileQuery.matches\" class=\"sof-ar-nav-sidenav\" #snav [mode]=\"mobileQuery.matches ? 'over' : 'side'\"\r\n [fixedInViewport]=\"mobileQuery.matches\" [fixedTopGap]=\"mobileQuery.matches ? advancedSettings.topGapMobile : advancedSettings.topGapDesktop\"\r\n [opened]=\"!mobileQuery.matches && !settings.hideNavigation && settings.menuStyle!='progress' \"\r\n [style.width]=\"mobileQuery.matches ? setNavWidth(settings.sideNavWidthMobile) : setNavWidth(settings.sideNavWidthDesktop)\"\r\n [ngStyle]=\"{background:mobileQuery.matches ? themeSettings?.mobileBgColor : undefined}\">\r\n <ng-container *ngIf=\"mobileQuery.matches && userName && !settings.customUserName\">\r\n <span class=\"user-name\">\r\n {{userName}}\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"mobileQuery.matches && settings.customUserName\">\r\n <span class=\"user-name\">\r\n {{settings.customUserName | translate}}\r\n </span>\r\n </ng-container>\r\n <!-- Nav Header Content -->\r\n <ng-content select=\"[sof-ar-nav-header]\"> </ng-content>\r\n\r\n <!-- Static Navigation -->\r\n <div class=\"nav-content-item sidenav-background\" *ngIf=\"settings.menuStyle === 'static'\" [ngStyle]=\"{'padding-bottom.px': (footerItemCount*64)+128}\">\r\n <ng-container *ngIf=\"settings.menuStyle === 'static'\">\r\n <ng-container *ngFor=\"let nav of navigationData\">\r\n <ng-container *ngIf=\"nav?.subNodes?.length && !nav.hidden\">\r\n <mat-accordion>\r\n <mat-expansion-panel [expanded]=\"nav.expanded\">\r\n <mat-expansion-panel-header [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(nav) }\">\r\n <!-- Navigation -->\r\n <ng-container>\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <a class=\"nav-item\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"{{nav?.fontAwesomeIcon}}\"></i>\r\n </span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"{{nav?.fontAwesomeIcon}}\"></i>\r\n </span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </mat-expansion-panel-header>\r\n <!-- SubNav -->\r\n <ng-container>\r\n <mat-nav-list [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(subnav) }\" class=\"subnav-content\"\r\n [disableRipple]=\"true\" *ngFor=\"let subnav of nav?.subNodes\" (click)=\"closeNavigationForMobile()\">\r\n <a mat-list-item [routerLinkActive]=\"['sof-ar-nav-sub-active-route']\" [routerLink]=\"subnav.route\">\r\n {{subnav.text | translate}}\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </ng-container>\r\n <!-- If subnodes are not there -->\r\n <ng-container>\r\n <ng-container *ngIf=\"!nav?.subNodes?.length && !nav?.hidden\">\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(nav) }\" class=\"nav-header\"\r\n [disableRipple]=\"true\" (click)=\"closeNavigationForMobile()\">\r\n <a class=\"nav-item nav-item-margin\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Stepper -->\r\n <mat-vertical-stepper *ngIf=\"settings.menuStyle === 'stepper'\" [selectedIndex]=\"selectedParentIndex\" #vertStepper\r\n [linear]=\"false\" class=\"sidenav-background\">\r\n <!-- Alternate step states for nav, icaons should always be white only worked with styles -->\r\n <ng-template matStepperIcon=\"create\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"edit\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"active\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"done\">\r\n <span>\r\n <i class=\"fas fa-check\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n\r\n <!-- nav steps -->\r\n <ng-container *ngFor=\"let nav of navigationData; let i = index\">\r\n <mat-step *ngIf=\"!nav?.hidden\" state=\"{{ determineStepState(i, -1) }}\">\r\n <ng-template matStepLabel *ngIf=\"!nav.hidden\">\r\n <div id=\"divStep{{ i }}\" style=\"height: 72px\" fxLayout=\"row\" fxLayoutAlign=\"start center\"\r\n matTooltip=\"{{ nav.text | translate }}\" [matTooltipPosition]=\"'after'\" fxFlex=\"100%\">\r\n <a id=\"step{{ i }}\" fxFlex=\"100%\" class=\"mat-button step-link\" [routerLink]=\"nav.route\"\r\n [ngStyle]=\"{ color: themeSettings?.fontColor }\" [routerLinkActive]=\"['step-active']\">\r\n {{ nav.text | translate }}\r\n </a>\r\n </div>\r\n </ng-template>\r\n <p [innerHTML]=\"nav.stepContent | translate\"></p>\r\n <!-- sub nav -->\r\n <mat-vertical-stepper *ngIf=\"nav?.subNodes\" [selectedIndex]=\"selectedChildIndexes[i]\" [linear]=\"false\"\r\n #vertStepperInner>\r\n <!-- Alternate step states for sub nav, icons should always be white only worked with styles -->\r\n <ng-template matStepperIcon=\"create\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"edit\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"done\">\r\n <span>\r\n <i class=\"fas fa-check\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"active\">\r\n <span>\r\n <i class=\"fas fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"none\">\r\n <span></span>\r\n </ng-template>\r\n <!-- sub nav steps -->\r\n <ng-container *ngFor=\"let subnav of nav?.subNodes; let j = index\">\r\n <mat-step state=\"{{ determineStepState(i, j) }}\" *ngIf=\"!subnav.hidden\">\r\n <ng-template matStepLabel>\r\n <div id=\"divSubStep{{ i }}-{{ j }}\" style=\"height: 72px\" fxLayout=\"row\" fxLayoutAlign=\"start center\"\r\n matTooltip=\"{{ subnav.text | translate }}\" [matTooltipPosition]=\"'after'\" fxFlex=\"100%\">\r\n <a id=\"subStep{{ i }}-{{ j }}\" class=\"mat-button step-link\"\r\n [ngStyle]=\"{ color: themeSettings?.fontColor }\" [routerLink]=\"subnav.route\"\r\n [routerLinkActive]=\"['step-active']\">{{ subnav.text | translate }}</a>\r\n </div>\r\n </ng-template>\r\n <p [innerHTML]=\"subnav.stepContent | translate\"></p>\r\n </mat-step>\r\n </ng-container>\r\n\r\n </mat-vertical-stepper>\r\n </mat-step>\r\n </ng-container>\r\n\r\n </mat-vertical-stepper>\r\n\r\n <!-- Nav Footer -->\r\n <div class=\"nav-footer-item\">\r\n <ng-container *ngIf=\"settings.menuStyle === 'static'\">\r\n <ng-container *ngFor=\"let nav of footerNavigationData\">\r\n <ng-container>\r\n <!-- Desktop Nav -->\r\n <ng-container *ngIf=\"!nav?.subNodes?.length\">\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list class=\"nav-header\" [disableRipple]=\"true\">\r\n <a class=\"nav-item\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n {{nav.text | translate}}\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list>\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n {{nav.text | translate}}\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template [ngTemplateOutlet]=\"navigationFooter\">\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- the mobile progress menu-->\r\n <ng-container *ngIf=\"settings?.menuStyle === 'progress'\">\r\n <div class=\"sidenav-background\" [ngStyle]=\"{'padding-bottom.px': (footerItemCount*64)+128}\">\r\n <mat-accordion>\r\n <div *ngFor=\"let step of navigationData; let i = index\">\r\n <ng-container *ngIf=\"step.subNodes && step.subNodes.length > 0 && !step.hidden\">\r\n <mat-expansion-panel hideToggle class=\"progress-mobile-expansion-panel\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" (opened)=\"panelOpenState = true\"\r\n (closed)=\"panelOpenState = false\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title class=\"progress-mobile-panel-title\">\r\n <div style=\"width: -webkit-fill-available;\"\r\n [ngClass]=\"{'disabled':(!step.visited || step.isDisabled) && !settings.overrideNavigation && !step.complete,'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \" }}\r\n </span>\r\n <span class=\"nav-btn-text\">\r\n {{ step.text | translate }}\r\n </span>\r\n <span *ngIf=\"!panelOpenState\">\r\n <i class=\"fas fa-chevron-down panel-icon\"></i>\r\n </span>\r\n <span *ngIf=\"panelOpenState\">\r\n <i class=\"fas fa-chevron-up panel-icon\"></i>\r\n </span>\r\n </div>\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <!-- mobile sub menu -->\r\n <div class=\"progress-nav-menu\" *ngFor=\"let subNode of step.subNodes; let idx = index;\" [hidden]=\"step.subNodes[idx].hidden\">\r\n <button id=\"mobileMenu{{ idx }}\" mat-button class=\"step-link progress-menu-mobile-btn\"\r\n [ngClass]=\"{'color-primary':subNode.complete && subNode!=activeSubNode}\"\r\n [routerLinkActive]=\"['progress-menu-active']\" [ngStyle]=\"{ ' color': themeSettings?.fontColor }\"\r\n [routerLink]=\"subNode.route\" [disabled]=\"!subNode.visited && !settings.overrideNavigation\">\r\n <ng-template [ngTemplateOutlet]=\"progressSubNodeIcons\"\r\n [ngTemplateOutletContext]=\"{subNode:subNode}\">\r\n </ng-template>\r\n <span class=\"nav-menu-btn-text\" [ngClass]=\"{'disabled':(!subNode.visited) && !settings.overrideNavigation && !subNode.complete,'color-primary':subNode.complete,'progress-menu-active':subNode===activeSubNode}\">{{ subNode.text | translate }}</span>\r\n </button>\r\n </div>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n <!-- if there are no subNodes -->\r\n <ng-container *ngIf=\"(!step.subNodes || step.subNodes.length==0) && !step.hidden\">\r\n <mat-expansion-panel #panel hideToggle (opened)=\"disablePanel(panel,i)\" class=\"progress-mobile-expansion-panel\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title class=\"progress-mobile-panel-title\">\r\n <div [ngClass]=\"{'disabled':(!step.visited || step.isDisabled) && !settings.overrideNavigation && !step.complete,'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \" }}\r\n </span>\r\n <span class=\"nav-btn-text\">\r\n {{ step.text | translate }}\r\n </span>\r\n </div>\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n </div>\r\n </mat-accordion>\r\n </div>\r\n\r\n <!-- the progress menu language and logout buttons-->\r\n <div class=\"nav-footer-item progress-footer\">\r\n <ng-template [ngTemplateOutlet]=\"navigationFooter\">\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <!-- Horizontal Progress -->\r\n <ng-container *ngIf=\"settings?.menuStyle === 'progress'\">\r\n <mat-progress-bar *ngIf=\"settings?.showProgressBar\" mode=\"determinate\" [value]=\"navProgressCount\"\r\n style=\"height: 9px\" color=\"accent\">\r\n </mat-progress-bar>\r\n <div fxHide.lt-md class=\"step-titles center\" fxLayout=\"row\" style=\"justify-content:center !important\" [class.hidden]=\"settings.hideNavigation\">\r\n <div *ngFor=\"let step of navigationData; let i = index\" class=\"horizontal-progress-div\">\r\n <ng-container *ngIf=\"!step.subNodes?.length && !step.hidden\">\r\n <button mat-button [routerLink]=\"step.route\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" class=\"progress-menu-btn\"\r\n [ngClass]=\"{'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \"}}\r\n </span>\r\n <span class=\"nav-btn-text\">{{ step.text | translate }}</span>\r\n </button>\r\n </ng-container>\r\n <!-- if there are subnodes create menus for each step -->\r\n <ng-container *ngIf=\"step.subNodes && step.subNodes.length && !step.hidden\">\r\n <button [ngClass]=\"{'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\"\r\n mat-button [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" class=\"progress-menu-btn\"\r\n [matMenuTriggerFor]=\"menu\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \"}}\r\n </span>\r\n <span class=\"nav-btn-text\">{{ step.text | translate }}</span>\r\n </button>\r\n <mat-menu #menu=\"matMenu\" class=\"sof-ar-mat-menu progress-menu-panel\">\r\n <div class=\"progress-nav-menu\" *ngFor=\"let subNode of step.subNodes; let idx = index;\" [ngStyle]=\"{width:settings.progressMenuWidth+'px'}\" [hidden]=\"step.subNodes[idx].hidden\">\r\n <button id=\"submenu{{ idx }}\" mat-button class=\"step-link progress-menu-btn\"\r\n [ngClass]=\"{'color-primary':subNode.complete && subNode!=activeSubNode,'disabled':!subNode.visited && !settings.overrideNavigation}\"\r\n [routerLinkActive]=\"['progress-menu-active']\" [ngStyle]=\"{ ' color': themeSettings?.fontColor }\"\r\n [routerLink]=\"subNode.route\" [disabled]=\"!subNode.visited && !settings.overrideNavigation\">\r\n <ng-template [ngTemplateOutlet]=\"progressSubNodeIcons\"\r\n [ngTemplateOutletContext]=\"{subNode:subNode}\">\r\n </ng-template>\r\n <span class=\"nav-menu-btn-text\">{{ subNode.text |translate }}</span>\r\n </button>\r\n </div>\r\n </mat-menu>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"mobile-progress-container\" fxHide.gt-sm>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-content sof-ar-nav-content></ng-content>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n <!-- The progress menu parent node icon template-->\r\n <ng-template #progressParentNodeIcons let-step='step'>\r\n <span *ngIf=\"step.complete && step != activeParentNode\">\r\n <i class=\"{{ settings.progressSectionCompleteIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"step === activeParentNode\">\r\n <i class=\"{{ settings.progressSectionCurrentIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"!step.complete && step != activeParentNode\" [ngClass]=\"{'disabled':!step.visited && !settings.overrideNavigation}\">\r\n <i class=\"{{ settings.progressSectionFutureIcon }} progress-nav-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <!-- The progress menu sub node icon template-->\r\n <ng-template #progressSubNodeIcons let-subNode='subNode'>\r\n <span *ngIf=\"subNode.complete &&activeSubNode !=subNode\">\r\n <i class=\"{{settings.progressMenuCompleteIcon}} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"activeSubNode ===subNode\">\r\n <i class=\"{{ settings.progressSectionCurrentIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"!subNode.complete &&activeSubNode !=subNode\" [ngClass]=\"{'disabled':!subNode.visited && !settings.overrideNavigation}\">\r\n <i class=\"{{ settings.progressSectionFutureIcon }} progress-nav-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <!-- The navigation footer template for language and logout buttons -->\r\n <ng-template #navigationFooter>\r\n <ng-content select=\"[sof-ar-nav-mobile-footer]\"> </ng-content>\r\n <ng-container *ngIf=\"!settings.useCustomMobileFooter\">\r\n <!-- The language button -->\r\n <ng-container *ngIf=\"languageSettings?.displayLanguageOptions && languageSettings?.languages.length > 2 && mobileQuery.matches\">\r\n <button id=\"sof-ar-nav-lang-dropdown\" mat-stroked-button\r\n class=\"faded-button-50 language-button navigationFooter\" [matMenuTriggerFor]=\"headerLanguageMenu\"\r\n [attr.aria-label]=\"languageSettings.buttonText | translate\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"far fa-globe language-globe\"></i>\r\n </span>\r\n {{languageSettings.buttonText | translate}}\r\n </button>\r\n <mat-menu #headerLanguageMenu=\"matMenu\" class=\"sof-ar-mat-menu\">\r\n <button mat-menu-item *ngFor=\"let lang of languageSettings.languages\" (click)=\"setLanguage$.emit(lang)\"\r\n id=\"apply-lang-btn-{{lang}}\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\">\r\n <div fxFlex=\"auto\">\r\n {{ lang | translate }}\r\n </div>\r\n <div fxFlex=\"auto\" fxLayoutAlign=\"end end\">\r\n <i *ngIf=\"currentLang === lang\" class=\"fad fa-check selected-language-icon\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <ng-container *ngIf=\"languageSettings?.displayLanguageOptions && languageSettings?.languages.length === 2 && mobileQuery.matches\">\r\n <button *ngIf=\"languageSettings?.languages.length === 2\" id=\"sof-ar-nav-lang-button\" mat-stroked-button\r\n class=\"faded-button-50 language-button navigationFooter\"\r\n [attr.aria-label]=\"languageSettings.buttonText | translate\" (click)=\"setLanguage$.emit()\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"far fa-globe language-globe\"></i>\r\n </span>\r\n {{otherLangText | translate}}\r\n </button>\r\n </ng-container>\r\n <!-- The logout button-->\r\n <ng-container *ngIf=\"mobileQuery.matches && userName\">\r\n <button id=\"sof-ar-header-lang-button\" mat-stroked-button class=\"navigationFooter\" (click)=\"logOut()\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"fas fa-sign-out-alt\"></i>\r\n </span>\r\n {{logOutText | translate}}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n</div>\r\n",
504
512
  providers: [{
505
513
  provide: STEPPER_GLOBAL_OPTIONS,
506
514
  useValue: ɵ0
@@ -531,4 +539,4 @@ ArmatureNavigationComponent.propDecorators = {
531
539
  setLanguage$: [{ type: Output }]
532
540
  };
533
541
  export { ɵ0 };
534
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiUzovQjAzL193b3JrLzI5OC9zL2xpYnJhcnkvcHJvamVjdHMvYXJtYXR1cmUvc3JjLyIsInNvdXJjZXMiOlsibGliL25hdmlnYXRpb24vY29tcG9uZW50cy9uYXZpZ2F0aW9uL25hdmlnYXRpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQWlCLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFhLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJMUssT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7V0FnQmhDLEVBQUUsMkJBQTJCLEVBQUUsS0FBSyxFQUFFO0FBVnJGLDBGQUEwRjtBQUUxRjs7R0FFRztBQVNILE1BQU0sT0FBTywyQkFBMkI7SUF5SHRDOzs7Ozs7OztPQVFHO0lBQ0gsWUFDVyxpQkFBb0MsRUFDcEMsS0FBbUIsRUFDWCxNQUFjLEVBQ3ZCLGFBQTRCLEVBQ25CLG9CQUEwQyxFQUM5QixhQUFnQztRQUxwRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFVBQUss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USxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELHNDQUFzQztJQUMvQixXQUFXLENBQUMsS0FBYTtRQUM5QixPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQzVFLENBQUM7OztZQS9tQkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLGdxNEJBQTBDO2dCQUUxQyxTQUFTLEVBQUUsQ0FBQzt3QkFDVixPQUFPLEVBQUUsc0JBQXNCO3dCQUFFLFFBQVEsSUFBd0M7cUJBQ2xGLENBQUM7O2FBQ0g7OztZQTVCdUIsaUJBQWlCO1lBRmhDLFlBQVk7WUFNRyxNQUFNO1lBS3JCLGFBQWE7WUFEYixvQkFBb0I7WUFFcEIsaUJBQWlCLHVCQTJKckIsUUFBUTs7O3NCQXJJVixTQUFTLFNBQUMsYUFBYTtzQkFHdkIsU0FBUyxTQUFDLE1BQU07NkJBR2hCLFNBQVMsU0FBQyxPQUFPOzRCQUdqQixZQUFZLFNBQUMsa0JBQWtCOzZCQUcvQixLQUFLO3VCQUdMLEtBQUs7K0JBR0wsS0FBSzs0QkFHTCxLQUFLOytCQUdMLEtBQUs7MEJBR0wsS0FBSzt5QkFHTCxLQUFLOzJCQUdMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNZWRpYU1hdGNoZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvbGF5b3V0JztcclxuaW1wb3J0IHsgU1RFUFBFUl9HTE9CQUxfT1BUSU9OUyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zdGVwcGVyJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RXhwYW5zaW9uUGFuZWwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xyXG5pbXBvcnQgeyBNYXRTaWRlbmF2IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XHJcbmltcG9ydCB7IE1hdFZlcnRpY2FsU3RlcHBlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3N0ZXBwZXInO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBCYXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvYmFzZS1jb25maWcnO1xyXG5pbXBvcnQgeyBBdXRob3JpemF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvYXV0aG9yaXphdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFubmVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvYmFubmVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvYmFzZS1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IEhlYWRlckxhbmd1YWdlU2V0dGluZ3MgfSBmcm9tICcuLi8uLi8uLi9oZWFkZXIvbW9kZWxzL2hlYWRlci1sYW5ndWFnZS5zZXR0aW5ncyc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25UaGVtZVNldHRpbmdzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL25hdi10aGVtZS5zZXR0aW5ncyc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25BZHZhbmNlZFNldHRpbmdzLCBOYXZpZ2F0aW9uU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmF2LnNldHRpbmdzJztcclxuaW1wb3J0IHsgTmF2Tm9kZSwgU3ViTmF2Tm9kZXMgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmF2aWdhdGlvbic7XHJcblxyXG4vLyBUT0RPOiBzZWUgaG93IHRoaXMgY2FuIGZpdCB3aXRoIHRoZSBgc29mLXByb2dyZXNzLWJhcmAgY29tcG9uZW50LiBQb3NzaWJseSBjb21iaW5lIHRoZW1cclxuXHJcbi8qKlxyXG4gKiBUaGUgTmF2aWdhdGlvbiBDb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc29mLWFyLW5hdmlnYXRpb24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uYXZpZ2F0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9uYXZpZ2F0aW9uLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogU1RFUFBFUl9HTE9CQUxfT1BUSU9OUywgdXNlVmFsdWU6IHsgZGlzcGxheURlZmF1bHRJbmRpY2F0b3JUeXBlOiBmYWxzZSB9XHJcbiAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFybWF0dXJlTmF2aWdhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgLyoqIFRoZSBwYXJlbnQgc3RlcHBlciAqL1xyXG4gIEBWaWV3Q2hpbGQoJ3ZlcnRTdGVwcGVyJykgcHVibGljIHN0ZXBwZXI6IE1hdFZlcnRpY2FsU3RlcHBlcjtcclxuXHJcbiAgLyoqIFRoZSBzaWRlIG1vYmlsZSBuYXYgKi9cclxuICBAVmlld0NoaWxkKCdzbmF2JykgcHVibGljIHNpZGVuYXY6IE1hdFNpZGVuYXY7XHJcblxyXG4gIC8qKiBUaGUgbW9iaWxlIGV4cGFuc2lvbiBwYW5lbCBmb3IgcHJvZ3Jlc3MgbWVudSAqL1xyXG4gIEBWaWV3Q2hpbGQoJ3BhbmVsJykgcHVibGljIGV4cGFuc2lvblBhbmVsOiBNYXRFeHBhbnNpb25QYW5lbDtcclxuXHJcbiAgLyoqIFRoZSBjaGlsZCBzdGVwcGVycyAqL1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ3ZlcnRTdGVwcGVySW5uZXInKSBwdWJsaWMgaW5uZXJTdGVwcGVyczogUXVlcnlMaXN0PE1hdFZlcnRpY2FsU3RlcHBlcj47XHJcblxyXG4gIC8qKiBDb21wb25lbnQgSW5wdXQgLSB0aGUgbmF2aWdhdGlvbiBkYXRhICovXHJcbiAgQElucHV0KCkgcHVibGljIG5hdmlnYXRpb25EYXRhOiBOYXZOb2RlW107XHJcblxyXG4gIC8qKiBDb21wb25lbnQgSW5wdXQgLSB0aGUgbmF2aWdhdGlvbiBzZXR0aW5ncyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzID0ge307XHJcblxyXG4gIC8qKiBDb21wb25lbnQgSW5wdXQgLSB0aGUgbmF2aWdhdGlvbiBzZXR0aW5ncyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBhZHZhbmNlZFNldHRpbmdzOiBOYXZpZ2F0aW9uQWR2YW5jZWRTZXR0aW5ncyA9IHt9O1xyXG5cclxuICAvKiogQ29tcG9uZW50IElucHV0IC0gdGhlIG5hdmlnYXRpb24gc2V0dGluZ3MgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgdGhlbWVTZXR0aW5nczogTmF2aWdhdGlvblRoZW1lU2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgLyoqIENvbXBvbmVudCBJbnB1dCAtIHRoZSBuYXZpZ2F0aW9uIGxhbmd1YWdlIHNldHRpbmdzICovXHJcbiAgQElucHV0KCkgcHVibGljIGxhbmd1YWdlU2V0dGluZ3M6IEhlYWRlckxhbmd1YWdlU2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgLyoqIEN1cnJlbnQgbGFuZ3VhZ2UgKiovXHJcbiAgQElucHV0KCkgcHVibGljIGN1cnJlbnRMYW5nOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBsb2dPdXQgdGV4dCAqKi9cclxuICBASW5wdXQoKSBwdWJsaWMgbG9nT3V0VGV4dDogc3RyaW5nO1xyXG5cclxuICAvKiogU2V0cyBsYW5ndWFnZSAqKi9cclxuICBAT3V0cHV0KCkgcHVibGljIHNldExhbmd1YWdlJDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgLyoqIGdldHMgdGhlIG5vbiB1c2VkIGxhbmd1YWdlICovXHJcbiAgcHVibGljIGdldCBvdGhlckxhbmdUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNldHRpbmdzPy5sYW5ndWFnZXM/LmZpbmQoeCA9PiB4ICE9PSB0aGlzLmN1cnJlbnRMYW5nKTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIHNpZGUgbmF2IGlzIG9wZW4gb3Igbm90ICovXHJcbiAgcHVibGljIGlzTmF2T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogTW9iaWxlIFN1Yk5hdiAtIHdoZXRoZXIgb3Igbm90IHRoZSBtb2JpbGUgU3ViTmF2IGlzIG9wZW4gKi9cclxuICBwdWJsaWMgaXNNb2JpbGVTdWJOYXZPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBNb2JpbGUgU3ViTmF2IC10aGUgZGF0YSB0byBiZSBwYXNzZWQgdG8gdGhlIG1vYmlsZSBTdWJOYXYgKi9cclxuICBwdWJsaWMgY3VycmVudE1vYmlsZU5hdjogTmF2Tm9kZTtcclxuXHJcbiAgLyoqIFNldHRpbmdzIC0gdGhlIG1haW4gbWVudSB0ZXh0IHRoYXQgYXBwZWFycyBpbiB0aGUgbW9iaWxlIFN1Yk5hdiAqL1xyXG4gIHB1YmxpYyBtYWluTWVudVRleHQ6IHN0cmluZztcclxuXHJcbiAgLyoqIHRoZSBtb2JpbGUgcXVlcnkgKi9cclxuICBwdWJsaWMgbW9iaWxlUXVlcnk6IE1lZGlhUXVlcnlMaXN0O1xyXG5cclxuICAvKiogVGhlIHNlbGVjdGVkIHBhcmVudCBpbmRleCAqL1xyXG4gIHB1YmxpYyBzZWxlY3RlZFBhcmVudEluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICAvKiogVGhlIHNlbGVjdGVkIGNoaWxkIGluZGV4ICovXHJcbiAgcHVibGljIHNlbGVjdGVkQ2hpbGRJbmRleGVzOiB7IFtrZXk6IG51bWJlcl06IG51bWJlciB9ID0ge307XHJcblxyXG4gIC8qKiBUaGUgbmF2aWdhdGlvbiBwcm9ncmVzcyBjb3VudCAqL1xyXG4gIHB1YmxpYyBuYXZQcm9ncmVzc0NvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICAvKiogVGhlIGN1cnJlbnQgYWN0aXZlIHBhcmVudCBub2RlICovXHJcbiAgcHVibGljIGFjdGl2ZVBhcmVudE5vZGU6IE5hdk5vZGU7XHJcblxyXG4gIC8qKiBUaGUgY3VycmVudCBhY3RpdmUgc3ViIG5vZGUgKi9cclxuICBwdWJsaWMgYWN0aXZlU3ViTm9kZTogU3ViTmF2Tm9kZXM7XHJcblxyXG4gIC8qKiBUcnVlIGlmIHRoZSBleHBhbnNpb24gcGFuZWwgaXMgb3BlbiAqL1xyXG4gIHB1YmxpYyBwYW5lbE9wZW5TdGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogVGhlIGZvb3RlciBuYXZpZ2F0aW9uIGRhdGEgKi9cclxuICBwdWJsaWMgZm9vdGVyTmF2aWdhdGlvbkRhdGE6IE5hdk5vZGVbXVxyXG5cclxuICAvKiogdXNlciBuYW1lICoqL1xyXG4gIHB1YmxpYyB1c2VyTmFtZTogc3RyaW5nO1xyXG5cclxuICAvKiogVGhlIGNvbmZpZyBvYnNlcnZhYmxlICovXHJcbiAgcHVibGljIGNvbmZpZyQ6IE9ic2VydmFibGU8QmFzZUNvbmZpZz47XHJcblxyXG4gIC8qKiBUaGUgcGFyZW50IG5vZGUgaW5kZXggdG8gYmUgc2V0IHdoZW4gbmF2IGlzIHRvZ2dsZWQgdG8gcHJvZ3Jlc3MgbWVudSBzdHlsZSAqL1xyXG4gIHB1YmxpYyB0b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4OiBudW1iZXI7XHJcblxyXG4gIC8qKiBUaGUgY2hpbGQgbm9kZSBpbmRleCB0byBiZSBzZXQgd2hlbiBuYXYgaXMgdG9nZ2xlZCB0byBwcm9ncmVzcyBtZW51IHN0eWxlICovXHJcbiAgcHVibGljIHRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleDogbnVtYmVyO1xyXG5cclxuICAvKiogdGhlIG1vYmlsZSBxdWVyeSBsaXN0ZW5lcjIgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IF9tb2JpbGVRdWVyeUxpc3RlbmVyOiAoKSA9PiB2b2lkO1xyXG5cclxuICAvKiogVGhlIG5hdiBiaW5kIHN1YnNjcmlwdGlvbiAqL1xyXG4gIHByaXZhdGUgbmF2QmluZFN1YjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvKiogVGhlIG1lc3NhZ2UgdG8gZGlzcGxheSAqL1xyXG4gIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHdlIHNob3VsZCB0aGUgbWVzc2FnZSAqL1xyXG4gIHB1YmxpYyBzaG93TWVzc2FnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogV2hldGhlciBzaG91bGQgc2hvdyBjaGVjayBtYXJrIG9yIG5vdCAqL1xyXG4gIHB1YmxpYyBzaG93Q2hlY2tNYXJrOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqIFRoZSBuYXYgYmluZCBzdWJzY3JpcHRpb24gKi9cclxuICBwcml2YXRlIGxvZ0luU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIC8qKiBUaGUgY291bnQgb2YgZm9vdGVyIGl0ZW1zKi9cclxuICBwdWJsaWMgZm9vdGVySXRlbUNvdW50OiBudW1iZXI7XHJcblxyXG4gIC8qKiBUaGUgYmFubmVyIHN1YnNjcmlwdGlvbiAqL1xyXG4gIHByaXZhdGUgYmFubmVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIC8qKiBUaGUgY29uZmlnIHN1YnNjcmlwdGlvbiAqL1xyXG4gIHB1YmxpYyBjb25maWdTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgLyoqIFRoZSBzaWRlbmF2IHN1YnNjcmlwdGlvbiAqL1xyXG4gIHByaXZhdGUgc2lkZU5hdlN1YjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvKipcclxuICAgKiB0aGUgY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gY2hhbmdlRGV0ZWN0b3JSZWYgdGhlIGNoYW5nZSBkZXRlY3RvciByZWZlcmVuY2VcclxuICAgKiBAcGFyYW0gbWVkaWEgdGhlIG1lZGlhIG1hdGNoZXJcclxuICAgKiBAcGFyYW0gcm91dGVyIFRoZSByb3V0ZXJcclxuICAgKiBAcGFyYW0gYmFubmVyU2VydmljZSBUaGUgQmFubmVyIFNlcnZpY2VcclxuICAgKiBAcGFyYW0gYWN0aXZhdGVkUm91dGUgVGhlIGFjdGl2YXRlZCByb3V0ZVxyXG4gICAqIEBwYXJhbSBjb25maWdTZXJ2aWNlIFRoZSBjb25maWcgc2VydmljZVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcmVhZG9ubHkgbWVkaWE6IE1lZGlhTWF0Y2hlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGJhbm5lclNlcnZpY2U6IEJhbm5lclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF1dGhvcml6YXRpb25TZXJ2aWNlOiBBdXRob3JpemF0aW9uU2VydmljZSxcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2VydmljZTogQmFzZUNvbmZpZ1NlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMubW9iaWxlUXVlcnkgPSBtZWRpYS5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA5NTlweCknKTtcclxuICAgIHRoaXMuX21vYmlsZVF1ZXJ5TGlzdGVuZXIgPSAoKSA9PiB7XHJcbiAgICAgIGNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgLy8gY2xvc2UgdGhlIHNpZGVuYXYgd2hlbiBzY3JlZW4gc2l6ZSBpcyBjaGFuZ2VkXHJcbiAgICAgIGlmICghdGhpcy5tb2JpbGVRdWVyeS5tYXRjaGVzICYmIHRoaXMuc2V0dGluZ3MubWVudVN0eWxlID09PSAncHJvZ3Jlc3MnKSB7XHJcbiAgICAgICAgdGhpcy5zaWRlbmF2LmNsb3NlKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICAvLyBiZWxvdyBpZiBzdGF0ZW1lbnQgaXMgZm9yIGVkZ2Ugc3VwcG9ydCBzaW5jZSBhZGRFdmVudExpc3RlbmVyIGRvZXNuJ3QgZXhpc3QgZm9yIE1lZGlhUXVlcnlMaXN0c1xyXG4gICAgaWYgKHRoaXMubW9iaWxlUXVlcnkuYWRkRXZlbnRMaXN0ZW5lcikge1xyXG4gICAgICB0aGlzLm1vYmlsZVF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX21vYmlsZVF1ZXJ5TGlzdGVuZXIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubW9iaWxlUXVlcnkuYWRkTGlzdGVuZXIodGhpcy5fbW9iaWxlUXVlcnlMaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogT24gSW5pdCAtIGNvbmZpZ3VyZSB0aGUgc2V0dGluZ3MgKi9cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5iYW5uZXJTdWJzY3JpcHRpb24uYWRkKHRoaXMuYmFubmVyU2VydmljZS5zaG93QmFubmVyJC5zdWJzY3JpYmUodmFsID0+IHRoaXMuc2hvd01lc3NhZ2UgPSB2YWwpKTtcclxuICAgIHRoaXMuYmFubmVyU3Vic2NyaXB0aW9uLmFkZCh0aGlzLmJhbm5lclNlcnZpY2UubWVzc2FnZSQuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLm1lc3NhZ2UgPSB2YWwpKTtcclxuICAgIHRoaXMuYmFubmVyU3Vic2NyaXB0aW9uLmFkZCh0aGlzLmJhbm5lclNlcnZpY2Uuc2hvd0NoZWNrTWFyayQuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLnNob3dDaGVja01hcmsgPSB2YWwpKTtcclxuXHJcbiAgICB0aGlzLmZvb3Rlck5hdmlnYXRpb25EYXRhID0gdGhpcy5uYXZpZ2F0aW9uRGF0YT8uZmlsdGVyKG5vZGUgPT4gbm9kZT8uYWx0TG9jYXRpb24gPT0gdHJ1ZSk7XHJcbiAgICB0aGlzLmZvb3Rlckl0ZW1Db3VudCA9IHRoaXMuZm9vdGVyTmF2aWdhdGlvbkRhdGEgPyB0aGlzLmZvb3Rlck5hdmlnYXRpb25EYXRhLmxlbmd0aCA6IDA7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25EYXRhID0gdGhpcy5uYXZpZ2F0aW9uRGF0YT8uZmlsdGVyKG5vZGUgPT4gbm9kZT8uYWx0TG9jYXRpb24gIT0gdHJ1ZSk7XHJcblxyXG4gICAgLy8gaWYgcGFyZW50cyBoYXZlIG5vIHJvdXRlLCBncmFiIGZpcnN0IHJvdXRlIG9mIGNoaWxkXHJcbiAgICB0aGlzLm5hdmlnYXRpb25EYXRhPy5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICBpZiAoIW4ucm91dGUpIHtcclxuICAgICAgICBuLnJvdXRlID0gbi5zdWJOb2RlcyAmJiBuLnN1Yk5vZGVzLmxlbmd0aCA+IDAgPyBuLnN1Yk5vZGVzWzBdLnJvdXRlIDogdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGVuYWJsZSBhbGwgcGFnZXMgYnkgZGVmYXVsdFxyXG4gICAgICBpZiAobi5pc0Rpc2FibGVkID09IG51bGwpIHtcclxuICAgICAgICBuLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5pbml0QmFzaWNTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5pbml0QWR2YW5jZWRTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5pbml0VGhlbWVTZXR0aW5ncygpO1xyXG5cclxuICAgIC8vIGluaXQgYmluZGluZyBmb3IgcHJvZ3Jlc3MgbmF2XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5tZW51U3R5bGUgPT09ICdwcm9ncmVzcycpIHtcclxuICAgICAgLy8gc2V0IHRoZSBmaXJzdCBub2RlIGFuZCBjaGlsZCBub2RlIGFzIHZpc2l0ZWRcclxuICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbkRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbMF0udmlzaXRlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZSh0aGlzLm5hdmlnYXRpb25EYXRhWzBdLnJvdXRlKTtcclxuICAgICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uRGF0YVswXS5zdWJOb2RlcyAmJiB0aGlzLm5hdmlnYXRpb25EYXRhWzBdLnN1Yk5vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbMF0uc3ViTm9kZXNbMF0udmlzaXRlZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRlKHRoaXMubmF2aWdhdGlvbkRhdGFbMF0uc3ViTm9kZXNbMF0ucm91dGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IGluaXRpYWwgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgIHRoaXMubmF2UHJvZ3Jlc3NDb3VudCA9ICh0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXggKyAxKSAvIHRoaXMubmF2aWdhdGlvbkRhdGEubGVuZ3RoICogMTAwO1xyXG5cclxuXHJcbiAgICAgIHRoaXMubmF2QmluZFN1Yi5hZGQoXHJcbiAgICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogTmF2aWdhdGlvbkVuZCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBmaW5kIHBhcmVudCBpbmRleCB3aXRoIGFjdGl2ZSBjaGlsZFxyXG4gICAgICAgICAgICB0aGlzLmdldEFjdGl2ZVBhcmVudEFuZENoaWxkKGV2ZW50LnVybCk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy5zZXR0aW5ncy5hbGxvd05hdlRvZ2dsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sb2dJblN1YnNjcmlwdGlvbiA9IHRoaXMuYXV0aG9yaXphdGlvblNlcnZpY2UuaXNMb2dnZWRJbiQuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy51c2VyTmFtZSA9IHRoaXMuYXV0aG9yaXphdGlvblNlcnZpY2UudXNlck5hbWUoKVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnU3Vic2NyaXB0aW9uID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZyQuc3Vic2NyaWJlKGNvbmZpZyA9PiB7XHJcbiAgICAgICAgaWYgKGNvbmZpZykge1xyXG4gICAgICAgICAgaWYgKGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnJlc2V0TmF2KSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF2UHJvZ3Jlc3NDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQYXJlbnRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGUodGhpcy5uYXZpZ2F0aW9uRGF0YVswXS5yb3V0ZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN0ZXBwZXIpIHtcclxuICAgICAgICAgICAgICB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXBwZXIucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJTdGVwcGVycz8uZm9yRWFjaChzdGVwcGVyID0+IHtcclxuICAgICAgICAgICAgICAgICAgc3RlcHBlci5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgc3RlcHBlci5yZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uRGF0YS5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICAgICAgICAgIG4udmlzaXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIG4uY29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBuLnN1Yk5vZGVzPy5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcy52aXNpdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBzLmNvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIHJlc2V0IGJhY2sgdG8gZmFsc2UgdG8gYXZvaWQgbXVsdGlwbGUgdHJpZ2dlcnMgb24gZnV0dXJlIGNhbGxzXHJcbiAgICAgICAgICAgIGNvbmZpZy5uYXZpZ2F0aW9uLnNldHRpbmdzLnJlc2V0TmF2ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcgPSBjb25maWc7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaWYgdGhlIHZhbHVlcyB3ZXJlIGNoYW5nZWQgYW5kIG5vdCBudWxsLCBpdCBtZWFucyB0aGF0IHRoZSBuYXYgd2FzIHRvZ2dsZWQgdG8gcHJvZ3Jlc3NcclxuICAgICAgICAgIGlmIChjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4ICE9IG51bGxcclxuICAgICAgICAgICAgJiYgdGhpcy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4ICE9IGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhcclxuICAgICAgICAgICAgJiYgdGhpcy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXggIT0gY29uZmlnPy5uYXZpZ2F0aW9uPy5zZXR0aW5ncz8udG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4XHJcbiAgICAgICAgICAgICYmIGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleCAhPSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXggPSBjb25maWcubmF2aWdhdGlvbi5zZXR0aW5ncy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4O1xyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleCA9IGNvbmZpZy5uYXZpZ2F0aW9uLnNldHRpbmdzLnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleDtcclxuXHJcbiAgICAgICAgICAgIC8vIGFkZCB0aGUgcm91dGVyIHN1YlxyXG4gICAgICAgICAgICB0aGlzLm5hdkJpbmRTdWIuYWRkKFxyXG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgLy8gZmluZCBwYXJlbnQgaW5kZXggd2l0aCBhY3RpdmUgY2hpbGRcclxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY3RpdmVQYXJlbnRBbmRDaGlsZChldmVudC51cmwpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgLy8gaWYgdGhlIGNoaWxkIG5vZGUgaW5kZXggaXMgdmFsaWRcclxuICAgICAgICAgICAgaWYgKGNvbmZpZy5uYXZpZ2F0aW9uLm5vZGVzW3RoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleF0uc3ViTm9kZXM/Lmxlbmd0aCA+IHRoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXROb2RlU3RhdGVzKGNvbmZpZy5uYXZpZ2F0aW9uLm5vZGVzW3RoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleF0sXHJcbiAgICAgICAgICAgICAgICBjb25maWcubmF2aWdhdGlvbi5ub2Rlc1t0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhdLnN1Yk5vZGVzW3RoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXROb2RlU3RhdGVzKGNvbmZpZy5uYXZpZ2F0aW9uLm5vZGVzW3RoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleF0sIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpbmRleGVzXHJcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleCA9IGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhcclxuICAgICAgICAgICAgdGhpcy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXggPSBjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBMaWZlIGN5Y2xlIGhvb2sgZm9yIGFmdGVyIGNvbXBvbmVudCB2aWV3IGluaXRpYWxpemF0aW9uICovXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNldHRpbmdzLm1lbnVTdHlsZSA9PT0gJ3N0ZXBwZXInKSB7XHJcbiAgICAgIHRoaXMuYmluZFN0ZXBwZXJUb1JvdXRlcygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnN0ZXBwZXIuc3RlcHMuZm9yRWFjaCgoc3RlcCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgIHN0ZXAuc2VsZWN0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXggPSBpbmRleDtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZSh0aGlzLm5hdmlnYXRpb25EYXRhW2luZGV4XS5yb3V0ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pbm5lclN0ZXBwZXJzLmZvckVhY2goKHN0ZXBwZXIsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBzdGVwcGVyLnN0ZXBzLmZvckVhY2goKHN0ZXAsIGppbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBzdGVwLnNlbGVjdCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hpbGRJbmRleGVzW2luZGV4XSA9IGppbmRleDtcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlKHRoaXMubmF2aWdhdGlvbkRhdGFbaW5kZXhdLnN1Yk5vZGVzW2ppbmRleF0ucm91dGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNpZGVOYXZTdWIgPSB0aGlzLnNpZGVuYXYub3BlbmVkQ2hhbmdlLnN1YnNjcmliZShkcmF3ZXJTdGF0ZSA9PiB7XHJcbiAgICAgIHRoaXMuaXNOYXZPcGVuID0gZHJhd2VyU3RhdGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBPbiBEZXN0cm95ICovXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2JpbGVRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLl9tb2JpbGVRdWVyeUxpc3RlbmVyKTtcclxuICAgIHRoaXMubmF2QmluZFN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5sb2dJblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5iYW5uZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuY29uZmlnU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLnNpZGVOYXZTdWIudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vYmlsZSBTdWJOYXYgLSBvcGVuIHRoZSBTdWJOYXZcclxuICAgKiBAcGFyYW0gbmF2IHRoZSBuYXYgZGF0YSB0byBiZSBwYXNzZWQgdG8gdGhlIFN1Yk5hdlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvcGVuTW9iaWxlU3ViTmF2KG5hdjogTmF2Tm9kZSk6IHZvaWQge1xyXG4gICAgdGhpcy5pc01vYmlsZVN1Yk5hdk9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5jdXJyZW50TW9iaWxlTmF2ID0gbmF2O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW9iaWxlIFN1Yk5hdiAtIGNsb3NlcyB0aGUgU3ViTmF2XHJcbiAgICovXHJcbiAgcHVibGljIGNsb3NlTW9iaWxlU3ViTmF2KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc01vYmlsZVN1Yk5hdk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHRoZW1lIGNvbG9yXHJcbiAgICogQHBhcmFtIHZhcmlhYmxlIHRoZSBjc3MgdmFyaWFibGUgbmFtZVxyXG4gICAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3JcclxuICAgKi9cclxuICBwdWJsaWMgc2V0VGhlbWVDb2xvcih2YXJpYWJsZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoYC0tc29mLW5hdi0ke3ZhcmlhYmxlfWAsIGNvbG9yKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgdGhlIHN0ZXAgc3RhdGVcclxuICAgKiBAcGFyYW0gcGFyZW50SW5kZXggVGhlIHBhcmVudCBpbmRleFxyXG4gICAqIEBwYXJhbSBjaGlsZEluZGV4IFRoZSBjaGlsZCBpbmRleFxyXG4gICAqIEByZXR1cm5zIFRoZSBzdGVwIHN0YXRlXHJcbiAgICovXHJcbiAgcHVibGljIGRldGVybWluZVN0ZXBTdGF0ZShwYXJlbnRJbmRleDogbnVtYmVyLCBjaGlsZEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgLy8gbm90IHBhc3NlZCAmJiBub3QgYWN0aXZlXHJcbiAgICBpZiAoY2hpbGRJbmRleCA9PT0gLTEpIHtcclxuICAgICAgaWYgKCF0aGlzLnN0ZXBwZXIpIHtcclxuICAgICAgICByZXR1cm4gJ251bWJlcic7XHJcbiAgICAgIH1cclxuICAgICAgLy8gbm90IHBhc3NlZCAmJiBhY3RpdmVcclxuICAgICAgaWYgKHBhcmVudEluZGV4ID09PSB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnZpc2l0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGFzc2VkIGJ1dCBuYXYgYmFja1xyXG4gICAgICBlbHNlIGlmIChwYXJlbnRJbmRleCA+IHRoaXMuc3RlcHBlci5zZWxlY3RlZEluZGV4ICYmIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnZpc2l0ZWQpIHtcclxuICAgICAgICB0aGlzLnN0ZXBwZXIuc3RlcHMuZmluZCgocywgaW5kZXgpID0+IGluZGV4ID09PSBwYXJlbnRJbmRleClcclxuICAgICAgICAgIC5yZXNldCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGFzc2VkICYmIG5vdCBhY3RpdmVcclxuICAgICAgZWxzZSBpZiAocGFyZW50SW5kZXggPCB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnZpc2l0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2RvbmUnO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5pbm5lclN0ZXBwZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuICdub25lJztcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpbm5lclN0ZXBwZXIgPSB0aGlzLmlubmVyU3RlcHBlcnMuZmluZCgocywgaW5kZXgpID0+IGluZGV4ID09PSBwYXJlbnRJbmRleCk7XHJcbiAgICAgIGlmIChjaGlsZEluZGV4ID09PSBpbm5lclN0ZXBwZXIuc2VsZWN0ZWRJbmRleCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnN1Yk5vZGVzW2NoaWxkSW5kZXhdLnZpc2l0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoY2hpbGRJbmRleCA+IGlubmVyU3RlcHBlci5zZWxlY3RlZEluZGV4ICYmIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnN1Yk5vZGVzW2NoaWxkSW5kZXhdLnZpc2l0ZWQpIHtcclxuICAgICAgICBpbm5lclN0ZXBwZXIuc3RlcHMuZmluZCgocywgaW5kZXgpID0+IGluZGV4ID09PSBjaGlsZEluZGV4KVxyXG4gICAgICAgICAgLnJlc2V0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiAnYWN0aXZlJztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChjaGlsZEluZGV4IDwgaW5uZXJTdGVwcGVyLnNlbGVjdGVkSW5kZXgpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS5zdWJOb2Rlc1tjaGlsZEluZGV4XS52aXNpdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdkb25lJztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJ25vbmUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByb3ZpZGVkIHJvdXRlXHJcbiAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBuYXZpZ2F0ZShyb3V0ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWZsb2F0aW5nLXByb21pc2VzXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHJvdXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5hdmlnYXRlcyB0byBnaXZlbiBzdGVwXHJcbiAgICogQHBhcmFtIHN0ZXBOdW1iZXIgVGhlIHN0ZXAgbnVtYmVyIHRvIG5hdmlnYXRlIHRvXHJcbiAgICovXHJcbiAgcHVibGljIG5hdmlnYXRlVG9TdGVwKHN0ZXBOdW1iZXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHN0ZXBOdW1iZXIgPCB0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXgpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1mbG9hdGluZy1wcm9taXNlc1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMubmF2aWdhdGlvbkRhdGFbc3RlcE51bWJlcl0ucm91dGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgYWN0aXZlIHBhcmVudCBhbmQgY2hpbGQgbm9kZXMgXHJcbiAgICogQHBhcmFtIHVybCBUaGUgcm91dGVyIHVybFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRBY3RpdmVQYXJlbnRBbmRDaGlsZCh1cmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGNoaWxkSW5kZXg7XHJcbiAgICBsZXQgcGFyZW50SW5kZXggPSB0aGlzLm5hdmlnYXRpb25EYXRhLmZpbmRJbmRleChuID0+IHtcclxuICAgICAgY2hpbGRJbmRleCA9IG4uc3ViTm9kZXM/LmZpbmRJbmRleChzID0+IHVybC5pbmNsdWRlcyhzLnJvdXRlLnJlcGxhY2UoJy4nLCAnJykpKTtcclxuICAgICAgcmV0dXJuIGNoaWxkSW5kZXggPiAtMSB8fCB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMobi5yb3V0ZS5yZXBsYWNlKCcuJywgJycpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChwYXJlbnRJbmRleCA9PSAtMSkge1xyXG4gICAgICBwYXJlbnRJbmRleCA9IDBcclxuICAgIH1cclxuXHJcbiAgICAvLyBzZXQgdGhlIGFjdGl2ZSBwYXJlbnQgbm9kZSBhbmQgc3ViIG5vZGVcclxuICAgIHRoaXMuYWN0aXZlUGFyZW50Tm9kZSA9IHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdO1xyXG4gICAgdGhpcy5hY3RpdmVTdWJOb2RlID0gY2hpbGRJbmRleCA+IC0xICYmIHRoaXMuYWN0aXZlUGFyZW50Tm9kZS5zdWJOb2Rlcy5sZW5ndGggPiAwID8gdGhpcy5hY3RpdmVQYXJlbnROb2RlLnN1Yk5vZGVzW2NoaWxkSW5kZXhdIDogbnVsbDtcclxuXHJcbiAgICAvLyBjb21wdXRlIHRoZSBwcm9ncmVzcyBiYXJcclxuICAgIHRoaXMubmF2UHJvZ3Jlc3NDb3VudCA9IChwYXJlbnRJbmRleCArIDEpIC8gdGhpcy5uYXZpZ2F0aW9uRGF0YS5sZW5ndGggKiAxMDA7XHJcblxyXG4gICAgLy8gc2V0IHRoZSBub2RlIHN0YXRlc1xyXG4gICAgdGhpcy5zZXROb2RlU3RhdGVzKHRoaXMuYWN0aXZlUGFyZW50Tm9kZSwgdGhpcy5hY3RpdmVTdWJOb2RlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGNvbXBsZXRlIGFuZCB2aXNpdGVkIHN0YXRlcyBmb3IgYWxsIE5hdk5vZGVzIFxyXG4gICAqIEBwYXJhbSBwYXJlbnROb2RlIFRoZSBwYXJlbnQgbm9kZVxyXG4gICAqIEBwYXJhbSBjaGlsZE5vZGUgVGhlIGNoaWxkIG5vZGVcclxuICAgKi9cclxuICBwdWJsaWMgc2V0Tm9kZVN0YXRlcyhwYXJlbnROb2RlOiBOYXZOb2RlLCBjaGlsZE5vZGU6IFN1Yk5hdk5vZGVzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hpbGROb2RlKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlU3ViTm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgbGV0IGNoaWxkSW5kZXggPSBwYXJlbnROb2RlLnN1Yk5vZGVzLmluZGV4T2YoY2hpbGROb2RlKSA+IC0xID8gcGFyZW50Tm9kZS5zdWJOb2Rlcy5pbmRleE9mKGNoaWxkTm9kZSkgOiAwO1xyXG4gICAgICAvLyBhbGwgc3Vibm9kZXMgYmVmb3JlIHRoaXMgd2VyZSBjb21wbGV0ZWQgYW5kIHZpc2l0ZWRcclxuICAgICAgcGFyZW50Tm9kZS5zdWJOb2Rlcy5zbGljZSgwLCBjaGlsZEluZGV4KS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgIGVsZW1lbnQuY29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgIGVsZW1lbnQudmlzaXRlZCA9IHRydWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hY3RpdmVQYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcclxuICAgIC8vIHNldCBhbGwgcHJldmlvdXMgbm9kZXMgdG8gY29tcGxldGVcclxuICAgIGxldCBwYXJlbnRJbmRleCA9IHRoaXMubmF2aWdhdGlvbkRhdGEuaW5kZXhPZihwYXJlbnROb2RlKSA+IC0xID8gdGhpcy5uYXZpZ2F0aW9uRGF0YS5pbmRleE9mKHBhcmVudE5vZGUpIDogMDtcclxuICAgIHRoaXMubmF2aWdhdGlvbkRhdGEuc2xpY2UoMCwgcGFyZW50SW5kZXgpLmZvckVhY2goZCA9PiB7XHJcbiAgICAgIGQuY29tcGxldGUgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gc2V0IGFsbCBzdWJub2RlcyBvZiBwcmV2aW91cyBub2RlcyB0byBjb21wbGV0ZSBvbmx5IGlmIHRoZSBub2RlIHdhcyBub3QgZGlzYWJsZWRcclxuICAgICAgaWYgKCFkLmlzRGlzYWJsZWQpIHtcclxuICAgICAgICBkLnN1Yk5vZGVzLmZvckVhY2gocyA9PiB7XHJcbiAgICAgICAgICBzLmNvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICAgIHMudmlzaXRlZCA9IHRydWU7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIC8vIHNldCB0aGUgY3VycmVudCBub2RlcyBhcyB2aXNpdGVkXHJcbiAgICBwYXJlbnROb2RlLnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgaWYgKGNoaWxkTm9kZSkge1xyXG4gICAgICBjaGlsZE5vZGUudmlzaXRlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIEluaXRpYWxpemVzIHRoZSBiYXNpYyBuYXYgc2V0dGluZ3MgKi9cclxuICBwcml2YXRlIGluaXRCYXNpY1NldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uID0gdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uIHx8ICdmYXMgZmEtYW5nbGUtZG91YmxlLWxlZnQnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uQ2xvc2VkID0gdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uQ2xvc2VkIHx8ICdmYXMgZmEtYW5nbGUtZG91YmxlLXJpZ2h0JztcclxuICAgIHRoaXMuc2V0dGluZ3MuYWxsb3dOYXZUb2dnbGUgPSB0aGlzLnNldHRpbmdzLmFsbG93TmF2VG9nZ2xlID09IG51bGwgPyB0cnVlIDogdGhpcy5zZXR0aW5ncy5hbGxvd05hdlRvZ2dsZTtcclxuICAgIHRoaXMuc2V0dGluZ3MubWFpbk1lbnVUZXh0ID8gdGhpcy5tYWluTWVudVRleHQgPSB0aGlzLnNldHRpbmdzLm1haW5NZW51VGV4dCA6IHRoaXMubWFpbk1lbnVUZXh0ID0gJ01haW4gTWVudSc7XHJcbiAgICB0aGlzLnNldHRpbmdzLmhlYWRlckhlaWdodCA9IHRoaXMuc2V0dGluZ3MuaGVhZGVySGVpZ2h0IHx8IDYwO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5tZW51QnV0dG9uU1JUZXh0ID0gdGhpcy5zZXR0aW5ncy5tZW51QnV0dG9uU1JUZXh0IHx8ICdNZW51IEJ1dHRvbic7XHJcbiAgICB0aGlzLnNldHRpbmdzLm1lbnVTdHlsZSA9IHRoaXMuc2V0dGluZ3MubWVudVN0eWxlIHx8ICdzdGF0aWMnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5kaXNwbGF5TnVtYmVycyA9IHRoaXMuc2V0dGluZ3MuZGlzcGxheU51bWJlcnMgPT0gbnVsbCA/IHRydWUgOiB0aGlzLnNldHRpbmdzLmRpc3BsYXlOdW1iZXJzO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc1NlY3Rpb25Db21wbGV0ZUljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkNvbXBsZXRlSWNvbiB8fCAnZmFzIGZhLWNoZWNrLWNpcmNsZSc7XHJcbiAgICB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkZ1dHVyZUljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkZ1dHVyZUljb24gfHwgJ2ZhciBmYS1jaXJjbGUnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc1NlY3Rpb25DdXJyZW50SWNvbiA9IHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NTZWN0aW9uQ3VycmVudEljb24gfHwgJ2ZhcyBmYS1jaXJjbGUnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc01lbnVDb21wbGV0ZUljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzTWVudUNvbXBsZXRlSWNvbiB8fCAnZmFyIGZhLWNoZWNrJztcclxuICAgIHRoaXMuc2V0dGluZ3Muc2hvd1Byb2dyZXNzQmFyID0gdGhpcy5zZXR0aW5ncy5zaG93UHJvZ3Jlc3NCYXIgPT0gbnVsbCA/IHRydWUgOiB0aGlzLnNldHRpbmdzLnNob3dQcm9ncmVzc0JhclxyXG4gICAgdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhEZXNrdG9wID0gdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhEZXNrdG9wIHx8ICczNTAnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhNb2JpbGUgPSB0aGlzLnNldHRpbmdzLnNpZGVOYXZXaWR0aE1vYmlsZSB8fCAnMzUwJztcclxuICAgIHRoaXMuc2V0dGluZ3Mub3ZlcnJpZGVOYXZpZ2F0aW9uID0gdGhpcy5zZXR0aW5ncy5vdmVycmlkZU5hdmlnYXRpb24gfHwgZmFsc2U7XHJcbiAgICB0aGlzLnNldHRpbmdzLnByb2dyZXNzTWVudVdpZHRoID0gdGhpcy5zZXR0aW5ncy5wcm9ncmVzc01lbnVXaWR0aCB8fCAnMjgwJztcclxuICAgIHRoaXMuc2V0dGluZ3MudXNlQ3VzdG9tTW9iaWxlRm9vdGVyID0gdGhpcy5zZXR0aW5ncy51c2VDdXN0b21Nb2JpbGVGb290ZXIgIT0gbnVsbCA/IHRoaXMuc2V0dGluZ3MudXNlQ3VzdG9tTW9iaWxlRm9vdGVyIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZXMgdGhlIGV4cGFuc2lvbiBwYW5lbCBhbmQgbmF2aWdhdGVzIHRvIHRoZSBnaXZlbiBub2RlXHJcbiAgICogQHBhcmFtIGVsIFRoZSBtYXQgZXhwYW5zaW9uIHBhbmVsIFxyXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcGFyZW50IG5vZGUgaW5kZXggXHJcbiAgICovXHJcbiAgcHVibGljIGRpc2FibGVQYW5lbChlbCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZWwuY2xvc2UoKTtcclxuICAgIHRoaXMubmF2aWdhdGUodGhpcy5uYXZpZ2F0aW9uRGF0YVtpbmRleF0ucm91dGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluaXRpYWxpemVzIHRoZSBhZHZhbmNlZCBuYXYgc2V0dGluZ3MgKi9cclxuICBwcml2YXRlIGluaXRBZHZhbmNlZFNldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzLnRvcEdhcERlc2t0b3AgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3MudG9wR2FwRGVza3RvcCB8fCAwO1xyXG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzLnRvcEdhcE1vYmlsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5ncy50b3BHYXBNb2JpbGUgfHwgdGhpcy5zZXR0aW5ncy5oZWFkZXJIZWlnaHQ7XHJcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3MubWFyZ2luVG9wRGVza3RvcCA9IHRoaXMuYWR2YW5jZWRTZXR0aW5ncy5tYXJnaW5Ub3BEZXNrdG9wIHx8IDA7XHJcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3MubWFyZ2luVG9wTW9iaWxlID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzLm1hcmdpblRvcE1vYmlsZSB8fCAwO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKiBJbml0aWFsaXplcyB0aGUgbmF2IHRoZW1lIHNldHRpbmdzICovXHJcbiAgcHJpdmF0ZSBpbml0VGhlbWVTZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5jb250ZW50QmdDb2xvciA/IHRoaXMuc2V0VGhlbWVDb2xvcignY29udGVudC1iZy1jb2xvcicsIHRoaXMudGhlbWVTZXR0aW5ncy5jb250ZW50QmdDb2xvcikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuZm9udENvbG9yID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdmb250LWNvbG9yJywgdGhpcy50aGVtZVNldHRpbmdzLmZvbnRDb2xvcikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuZm9udENvbG9yID0gdGhpcy50aGVtZVNldHRpbmdzLmZvbnRDb2xvciB8fCAnIzAwMCc7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MubW9iaWxlQmdDb2xvciA9IHRoaXMudGhlbWVTZXR0aW5ncy5tb2JpbGVCZ0NvbG9yIHx8ICcjZmZmZmZmJztcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5iZ0dyYWRpZW50Q29sb3IxID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdiZy1ncmFkaWVudC1jb2xvci0xJywgdGhpcy50aGVtZVNldHRpbmdzLmJnR3JhZGllbnRDb2xvcjEpIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLmJnR3JhZGllbnRDb2xvcjIgPyB0aGlzLnNldFRoZW1lQ29sb3IoJ2JnLWdyYWRpZW50LWNvbG9yLTInLCB0aGlzLnRoZW1lU2V0dGluZ3MuYmdHcmFkaWVudENvbG9yMikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuYm9yZGVyUmlnaHRDb2xvciA/IHRoaXMuc2V0VGhlbWVDb2xvcignYm9yZGVyLXJpZ2h0LWNvbG9yJywgdGhpcy50aGVtZVNldHRpbmdzLmJvcmRlclJpZ2h0Q29sb3IpIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLmxpc3RCb3JkZXJDb2xvciA/IHRoaXMuc2V0VGhlbWVDb2xvcignbGlzdC1ib3JkZXItY29sb3InLCB0aGlzLnRoZW1lU2V0dGluZ3MubGlzdEJvcmRlckNvbG9yKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5oaWdobGlnaHRHcmFkaWVudDEgPyB0aGlzLnNldFRoZW1lQ29sb3IoJ2hpZ2hsaWdodC1ncmFkaWVudC0xJywgdGhpcy50aGVtZVNldHRpbmdzLmhpZ2hsaWdodEdyYWRpZW50MSkgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuaGlnaGxpZ2h0R3JhZGllbnQyID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdoaWdobGlnaHQtZ3JhZGllbnQtMicsIHRoaXMudGhlbWVTZXR0aW5ncy5oaWdobGlnaHRHcmFkaWVudDIpIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLnN1YkhpZ2hsaWdodEJvcmRlckNvbG9yID9cclxuICAgICAgdGhpcy5zZXRUaGVtZUNvbG9yKCdzdWItaGlnaGxpZ2h0LWJvcmRlci1jb2xvcicsIHRoaXMudGhlbWVTZXR0aW5ncy5zdWJIaWdobGlnaHRCb3JkZXJDb2xvcikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3Muc3ViSGlnaGxpZ2h0QmdDb2xvciA/XHJcbiAgICAgIHRoaXMuc2V0VGhlbWVDb2xvcignc3ViLWhpZ2hsaWdodC1iZy1jb2xvcicsIHRoaXMudGhlbWVTZXR0aW5ncy5zdWJIaWdobGlnaHRCZ0NvbG9yKSA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8qKiBCaW5kcyB0aGUgc3RlcHBlciB0byB0aGUgcm91dGVyICovXHJcbiAgcHJpdmF0ZSBiaW5kU3RlcHBlclRvUm91dGVzKCk6IHZvaWQge1xyXG4gICAgLy8gZmluZCBwYXJlbnRzXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8gZmluZCBwYXJlbnQgaW5kZXggd2l0aCBhY3RpdmUgY2hpbGRcclxuICAgICAgbGV0IGNoaWxkSW5kZXg7XHJcbiAgICAgIGxldCBwYXJlbnRJbmRleCA9IHRoaXMubmF2aWdhdGlvbkRhdGEuZmluZEluZGV4KG4gPT4ge1xyXG4gICAgICAgIGNoaWxkSW5kZXggPSBuLnN1Yk5vZGVzPy5maW5kSW5kZXgocyA9PiB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMocy5yb3V0ZS5yZXBsYWNlKCcuJywgJycpKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjaGlsZEluZGV4ID4gLTEgfHwgdGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKG4ucm91dGUucmVwbGFjZSgnLicsICcnKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICAvLyBpZiBubyBjaGlsZHJlbiBvciBubyBpbmRleGVzIGFjdGl2YXRlIGZpcnN0IHBhcmVudFxyXG4gICAgICBpZiAocGFyZW50SW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgcGFyZW50SW5kZXggPSAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXggPSBwYXJlbnRJbmRleDtcclxuICAgICAgaWYgKGNoaWxkSW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuaW5uZXJTdGVwcGVycy5maW5kKChpcywgaW5kZXgpID0+IGluZGV4ID09PSBwYXJlbnRJbmRleCkuc2VsZWN0ZWRJbmRleCA9IGNoaWxkSW5kZXg7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGZpbmQgcGFyZW50c1xyXG4gICAgdGhpcy5uYXZCaW5kU3ViLmFkZChcclxuICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IHtcclxuICAgICAgICAgIC8vIGZpbmQgcGFyZW50IGluZGV4IHdpdGggYWN0aXZlIGNoaWxkXHJcbiAgICAgICAgICBsZXQgY2hpbGRJbmRleDtcclxuICAgICAgICAgIGxldCBwYXJlbnRJbmRleCA9IHRoaXMubmF2aWdhdGlvbkRhdGEuZmluZEluZGV4KG4gPT4ge1xyXG4gICAgICAgICAgICBjaGlsZEluZGV4ID0gbi5zdWJOb2Rlcz8uZmluZEluZGV4KHMgPT4gZXZlbnQudXJsQWZ0ZXJSZWRpcmVjdHMuaW5jbHVkZXMocy5yb3V0ZS5yZXBsYWNlKCcuJywgJycpKSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY2hpbGRJbmRleCA+IC0xIHx8IGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLmluY2x1ZGVzKG4ucm91dGUucmVwbGFjZSgnLicsICcnKSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIGlmIG5vIGNoaWxkcmVuIG9yIG5vIGluZGV4ZXMgYWN0aXZhdGUgZmlyc3QgcGFyZW50XHJcbiAgICAgICAgICBpZiAocGFyZW50SW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHBhcmVudEluZGV4ID0gMDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXggPSBwYXJlbnRJbmRleDtcclxuICAgICAgICAgIGlmIChjaGlsZEluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbm5lclN0ZXBwZXJzLmZpbmQoKGlzLCBpbmRleCkgPT4gaW5kZXggPT09IHBhcmVudEluZGV4KS5zZWxlY3RlZEluZGV4ID0gY2hpbGRJbmRleDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogSGlkZXMgdGhlIG1lc3NhZ2VcclxuICAqL1xyXG4gIHB1YmxpYyBoaWRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93TWVzc2FnZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIExvZ3Mgb3V0IG9uY2UgdXNlciBpcyBhdXRob3JpemVkXHJcbiAgICogKi9cclxuICBwdWJsaWMgbG9nT3V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hdXRob3JpemF0aW9uU2VydmljZS5hdXRob3JpemVVc2VyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJcyB0aGUgbmF2aWdhdGlvbiBzZWxlY3RlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc05hdlNlbGVjdGVkKG5vZGU6IE5hdk5vZGUgfCBTdWJOYXZOb2Rlcyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucm91dGVyLmlzQWN0aXZlKG5vZGUucm91dGUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNldHMgdGhlIHdpZHRoIGZvciB0aGUgc2lkZSBuYXYgKi9cclxuICBwdWJsaWMgc2V0TmF2V2lkdGgod2lkdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gd2lkdGguaW5jbHVkZXMoJyUnKSB8fCB3aWR0aC5pbmNsdWRlcygncHgnKSA/IHdpZHRoIDogd2lkdGggKyAncHgnO1xyXG4gIH1cclxufVxyXG4iXX0=
542
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiUzovQjAzL193b3JrLzQxMy9zL2xpYnJhcnkvcHJvamVjdHMvYXJtYXR1cmUvc3JjLyIsInNvdXJjZXMiOlsibGliL25hdmlnYXRpb24vY29tcG9uZW50cy9uYXZpZ2F0aW9uL25hdmlnYXRpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQWlCLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFhLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJMUssT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7V0FnQmhDLEVBQUUsMkJBQTJCLEVBQUUsS0FBSyxFQUFFO0FBVnJGLDBGQUEwRjtBQUUxRjs7R0FFRztBQVNILE1BQU0sT0FBTywyQkFBMkI7SUF5SHRDOzs7Ozs7OztPQVFHO0lBQ0gsWUFDVyxpQkFBb0MsRUFDcEMsS0FBbUIsRUFDWCxNQUFjLEVBQ3ZCLGFBQTRCLEVBQ25CLG9CQUEwQyxFQUM5QixhQUFnQztRQUxwRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFVBQUss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QUFDLFFBQVEsQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUM7UUFDN0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQztRQUM3RSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLElBQUksS0FBSyxDQUFDO1FBQzNFLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNsSSxDQUFDOzs7WUF0bkJGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QiwydDRCQUEwQztnQkFFMUMsU0FBUyxFQUFFLENBQUM7d0JBQ1YsT0FBTyxFQUFFLHNCQUFzQjt3QkFBRSxRQUFRLElBQXdDO3FCQUNsRixDQUFDOzthQUNIOzs7WUE1QnVCLGlCQUFpQjtZQUZoQyxZQUFZO1lBTUcsTUFBTTtZQUtyQixhQUFhO1lBRGIsb0JBQW9CO1lBRXBCLGlCQUFpQix1QkEySnJCLFFBQVE7OztzQkFySVYsU0FBUyxTQUFDLGFBQWE7c0JBR3ZCLFNBQVMsU0FBQyxNQUFNOzZCQUdoQixTQUFTLFNBQUMsT0FBTzs0QkFHakIsWUFBWSxTQUFDLGtCQUFrQjs2QkFHL0IsS0FBSzt1QkFHTCxLQUFLOytCQUdMLEtBQUs7NEJBR0wsS0FBSzsrQkFHTCxLQUFLOzBCQUdMLEtBQUs7eUJBR0wsS0FBSzsyQkFHTCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWVkaWFNYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XHJcbmltcG9ydCB7IFNURVBQRVJfR0xPQkFMX09QVElPTlMgfSBmcm9tICdAYW5ndWxhci9jZGsvc3RlcHBlcic7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdEV4cGFuc2lvblBhbmVsIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcclxuaW1wb3J0IHsgTWF0U2lkZW5hdiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NpZGVuYXYnO1xyXG5pbXBvcnQgeyBNYXRWZXJ0aWNhbFN0ZXBwZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zdGVwcGVyJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQmFzZUNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2Jhc2UtY29uZmlnJztcclxuaW1wb3J0IHsgQXV0aG9yaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2F1dGhvcml6YXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEJhbm5lclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2Jhbm5lci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2Jhc2UtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIZWFkZXJMYW5ndWFnZVNldHRpbmdzIH0gZnJvbSAnLi4vLi4vLi4vaGVhZGVyL21vZGVscy9oZWFkZXItbGFuZ3VhZ2Uuc2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uVGhlbWVTZXR0aW5ncyB9IGZyb20gJy4uLy4uL21vZGVscy9uYXYtdGhlbWUuc2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uQWR2YW5jZWRTZXR0aW5ncywgTmF2aWdhdGlvblNldHRpbmdzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL25hdi5zZXR0aW5ncyc7XHJcbmltcG9ydCB7IE5hdk5vZGUsIFN1Yk5hdk5vZGVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL25hdmlnYXRpb24nO1xyXG5cclxuLy8gVE9ETzogc2VlIGhvdyB0aGlzIGNhbiBmaXQgd2l0aCB0aGUgYHNvZi1wcm9ncmVzcy1iYXJgIGNvbXBvbmVudC4gUG9zc2libHkgY29tYmluZSB0aGVtXHJcblxyXG4vKipcclxuICogVGhlIE5hdmlnYXRpb24gQ29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NvZi1hci1uYXZpZ2F0aW9uJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbmF2aWdhdGlvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmF2aWdhdGlvbi5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IFNURVBQRVJfR0xPQkFMX09QVElPTlMsIHVzZVZhbHVlOiB7IGRpc3BsYXlEZWZhdWx0SW5kaWNhdG9yVHlwZTogZmFsc2UgfVxyXG4gIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcm1hdHVyZU5hdmlnYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIC8qKiBUaGUgcGFyZW50IHN0ZXBwZXIgKi9cclxuICBAVmlld0NoaWxkKCd2ZXJ0U3RlcHBlcicpIHB1YmxpYyBzdGVwcGVyOiBNYXRWZXJ0aWNhbFN0ZXBwZXI7XHJcblxyXG4gIC8qKiBUaGUgc2lkZSBtb2JpbGUgbmF2ICovXHJcbiAgQFZpZXdDaGlsZCgnc25hdicpIHB1YmxpYyBzaWRlbmF2OiBNYXRTaWRlbmF2O1xyXG5cclxuICAvKiogVGhlIG1vYmlsZSBleHBhbnNpb24gcGFuZWwgZm9yIHByb2dyZXNzIG1lbnUgKi9cclxuICBAVmlld0NoaWxkKCdwYW5lbCcpIHB1YmxpYyBleHBhbnNpb25QYW5lbDogTWF0RXhwYW5zaW9uUGFuZWw7XHJcblxyXG4gIC8qKiBUaGUgY2hpbGQgc3RlcHBlcnMgKi9cclxuICBAVmlld0NoaWxkcmVuKCd2ZXJ0U3RlcHBlcklubmVyJykgcHVibGljIGlubmVyU3RlcHBlcnM6IFF1ZXJ5TGlzdDxNYXRWZXJ0aWNhbFN0ZXBwZXI+O1xyXG5cclxuICAvKiogQ29tcG9uZW50IElucHV0IC0gdGhlIG5hdmlnYXRpb24gZGF0YSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBuYXZpZ2F0aW9uRGF0YTogTmF2Tm9kZVtdO1xyXG5cclxuICAvKiogQ29tcG9uZW50IElucHV0IC0gdGhlIG5hdmlnYXRpb24gc2V0dGluZ3MgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5ncyA9IHt9O1xyXG5cclxuICAvKiogQ29tcG9uZW50IElucHV0IC0gdGhlIG5hdmlnYXRpb24gc2V0dGluZ3MgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgYWR2YW5jZWRTZXR0aW5nczogTmF2aWdhdGlvbkFkdmFuY2VkU2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgLyoqIENvbXBvbmVudCBJbnB1dCAtIHRoZSBuYXZpZ2F0aW9uIHNldHRpbmdzICovXHJcbiAgQElucHV0KCkgcHVibGljIHRoZW1lU2V0dGluZ3M6IE5hdmlnYXRpb25UaGVtZVNldHRpbmdzID0ge307XHJcblxyXG4gIC8qKiBDb21wb25lbnQgSW5wdXQgLSB0aGUgbmF2aWdhdGlvbiBsYW5ndWFnZSBzZXR0aW5ncyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBsYW5ndWFnZVNldHRpbmdzOiBIZWFkZXJMYW5ndWFnZVNldHRpbmdzID0ge307XHJcblxyXG4gIC8qKiBDdXJyZW50IGxhbmd1YWdlICoqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXJyZW50TGFuZzogc3RyaW5nO1xyXG5cclxuICAvKiogbG9nT3V0IHRleHQgKiovXHJcbiAgQElucHV0KCkgcHVibGljIGxvZ091dFRleHQ6IHN0cmluZztcclxuXHJcbiAgLyoqIFNldHMgbGFuZ3VhZ2UgKiovXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBzZXRMYW5ndWFnZSQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIC8qKiBnZXRzIHRoZSBub24gdXNlZCBsYW5ndWFnZSAqL1xyXG4gIHB1YmxpYyBnZXQgb3RoZXJMYW5nVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VTZXR0aW5ncz8ubGFuZ3VhZ2VzPy5maW5kKHggPT4geCAhPT0gdGhpcy5jdXJyZW50TGFuZyk7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciBzaWRlIG5hdiBpcyBvcGVuIG9yIG5vdCAqL1xyXG4gIHB1YmxpYyBpc05hdk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIE1vYmlsZSBTdWJOYXYgLSB3aGV0aGVyIG9yIG5vdCB0aGUgbW9iaWxlIFN1Yk5hdiBpcyBvcGVuICovXHJcbiAgcHVibGljIGlzTW9iaWxlU3ViTmF2T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogTW9iaWxlIFN1Yk5hdiAtdGhlIGRhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSBtb2JpbGUgU3ViTmF2ICovXHJcbiAgcHVibGljIGN1cnJlbnRNb2JpbGVOYXY6IE5hdk5vZGU7XHJcblxyXG4gIC8qKiBTZXR0aW5ncyAtIHRoZSBtYWluIG1lbnUgdGV4dCB0aGF0IGFwcGVhcnMgaW4gdGhlIG1vYmlsZSBTdWJOYXYgKi9cclxuICBwdWJsaWMgbWFpbk1lbnVUZXh0OiBzdHJpbmc7XHJcblxyXG4gIC8qKiB0aGUgbW9iaWxlIHF1ZXJ5ICovXHJcbiAgcHVibGljIG1vYmlsZVF1ZXJ5OiBNZWRpYVF1ZXJ5TGlzdDtcclxuXHJcbiAgLyoqIFRoZSBzZWxlY3RlZCBwYXJlbnQgaW5kZXggKi9cclxuICBwdWJsaWMgc2VsZWN0ZWRQYXJlbnRJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqIFRoZSBzZWxlY3RlZCBjaGlsZCBpbmRleCAqL1xyXG4gIHB1YmxpYyBzZWxlY3RlZENoaWxkSW5kZXhlczogeyBba2V5OiBudW1iZXJdOiBudW1iZXIgfSA9IHt9O1xyXG5cclxuICAvKiogVGhlIG5hdmlnYXRpb24gcHJvZ3Jlc3MgY291bnQgKi9cclxuICBwdWJsaWMgbmF2UHJvZ3Jlc3NDb3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqIFRoZSBjdXJyZW50IGFjdGl2ZSBwYXJlbnQgbm9kZSAqL1xyXG4gIHB1YmxpYyBhY3RpdmVQYXJlbnROb2RlOiBOYXZOb2RlO1xyXG5cclxuICAvKiogVGhlIGN1cnJlbnQgYWN0aXZlIHN1YiBub2RlICovXHJcbiAgcHVibGljIGFjdGl2ZVN1Yk5vZGU6IFN1Yk5hdk5vZGVzO1xyXG5cclxuICAvKiogVHJ1ZSBpZiB0aGUgZXhwYW5zaW9uIHBhbmVsIGlzIG9wZW4gKi9cclxuICBwdWJsaWMgcGFuZWxPcGVuU3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFRoZSBmb290ZXIgbmF2aWdhdGlvbiBkYXRhICovXHJcbiAgcHVibGljIGZvb3Rlck5hdmlnYXRpb25EYXRhOiBOYXZOb2RlW11cclxuXHJcbiAgLyoqIHVzZXIgbmFtZSAqKi9cclxuICBwdWJsaWMgdXNlck5hbWU6IHN0cmluZztcclxuXHJcbiAgLyoqIFRoZSBjb25maWcgb2JzZXJ2YWJsZSAqL1xyXG4gIHB1YmxpYyBjb25maWckOiBPYnNlcnZhYmxlPEJhc2VDb25maWc+O1xyXG5cclxuICAvKiogVGhlIHBhcmVudCBub2RlIGluZGV4IHRvIGJlIHNldCB3aGVuIG5hdiBpcyB0b2dnbGVkIHRvIHByb2dyZXNzIG1lbnUgc3R5bGUgKi9cclxuICBwdWJsaWMgdG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleDogbnVtYmVyO1xyXG5cclxuICAvKiogVGhlIGNoaWxkIG5vZGUgaW5kZXggdG8gYmUgc2V0IHdoZW4gbmF2IGlzIHRvZ2dsZWQgdG8gcHJvZ3Jlc3MgbWVudSBzdHlsZSAqL1xyXG4gIHB1YmxpYyB0b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXg6IG51bWJlcjtcclxuXHJcbiAgLyoqIHRoZSBtb2JpbGUgcXVlcnkgbGlzdGVuZXIyICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfbW9iaWxlUXVlcnlMaXN0ZW5lcjogKCkgPT4gdm9pZDtcclxuXHJcbiAgLyoqIFRoZSBuYXYgYmluZCBzdWJzY3JpcHRpb24gKi9cclxuICBwcml2YXRlIG5hdkJpbmRTdWI6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgLyoqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgKi9cclxuICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nO1xyXG5cclxuICAvKiogV2hldGhlciB3ZSBzaG91bGQgdGhlIG1lc3NhZ2UgKi9cclxuICBwdWJsaWMgc2hvd01lc3NhZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFdoZXRoZXIgc2hvdWxkIHNob3cgY2hlY2sgbWFyayBvciBub3QgKi9cclxuICBwdWJsaWMgc2hvd0NoZWNrTWFyazogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKiBUaGUgbmF2IGJpbmQgc3Vic2NyaXB0aW9uICovXHJcbiAgcHJpdmF0ZSBsb2dJblN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvKiogVGhlIGNvdW50IG9mIGZvb3RlciBpdGVtcyovXHJcbiAgcHVibGljIGZvb3Rlckl0ZW1Db3VudDogbnVtYmVyO1xyXG5cclxuICAvKiogVGhlIGJhbm5lciBzdWJzY3JpcHRpb24gKi9cclxuICBwcml2YXRlIGJhbm5lclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvKiogVGhlIGNvbmZpZyBzdWJzY3JpcHRpb24gKi9cclxuICBwdWJsaWMgY29uZmlnU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIC8qKiBUaGUgc2lkZW5hdiBzdWJzY3JpcHRpb24gKi9cclxuICBwcml2YXRlIHNpZGVOYXZTdWI6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogdGhlIGNvbnN0cnVjdG9yXHJcbiAgICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgcmVmZXJlbmNlXHJcbiAgICogQHBhcmFtIG1lZGlhIHRoZSBtZWRpYSBtYXRjaGVyXHJcbiAgICogQHBhcmFtIHJvdXRlciBUaGUgcm91dGVyXHJcbiAgICogQHBhcmFtIGJhbm5lclNlcnZpY2UgVGhlIEJhbm5lciBTZXJ2aWNlXHJcbiAgICogQHBhcmFtIGFjdGl2YXRlZFJvdXRlIFRoZSBhY3RpdmF0ZWQgcm91dGVcclxuICAgKiBAcGFyYW0gY29uZmlnU2VydmljZSBUaGUgY29uZmlnIHNlcnZpY2VcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHJlYWRvbmx5IG1lZGlhOiBNZWRpYU1hdGNoZXIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBiYW5uZXJTZXJ2aWNlOiBCYW5uZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRob3JpemF0aW9uU2VydmljZTogQXV0aG9yaXphdGlvblNlcnZpY2UsXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NlcnZpY2U6IEJhc2VDb25maWdTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLm1vYmlsZVF1ZXJ5ID0gbWVkaWEubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogOTU5cHgpJyk7XHJcbiAgICB0aGlzLl9tb2JpbGVRdWVyeUxpc3RlbmVyID0gKCkgPT4ge1xyXG4gICAgICBjaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIC8vIGNsb3NlIHRoZSBzaWRlbmF2IHdoZW4gc2NyZWVuIHNpemUgaXMgY2hhbmdlZFxyXG4gICAgICBpZiAoIXRoaXMubW9iaWxlUXVlcnkubWF0Y2hlcyAmJiB0aGlzLnNldHRpbmdzLm1lbnVTdHlsZSA9PT0gJ3Byb2dyZXNzJykge1xyXG4gICAgICAgIHRoaXMuc2lkZW5hdi5jbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgLy8gYmVsb3cgaWYgc3RhdGVtZW50IGlzIGZvciBlZGdlIHN1cHBvcnQgc2luY2UgYWRkRXZlbnRMaXN0ZW5lciBkb2Vzbid0IGV4aXN0IGZvciBNZWRpYVF1ZXJ5TGlzdHNcclxuICAgIGlmICh0aGlzLm1vYmlsZVF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5tb2JpbGVRdWVyeS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLl9tb2JpbGVRdWVyeUxpc3RlbmVyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm1vYmlsZVF1ZXJ5LmFkZExpc3RlbmVyKHRoaXMuX21vYmlsZVF1ZXJ5TGlzdGVuZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIE9uIEluaXQgLSBjb25maWd1cmUgdGhlIHNldHRpbmdzICovXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuYmFubmVyU3Vic2NyaXB0aW9uLmFkZCh0aGlzLmJhbm5lclNlcnZpY2Uuc2hvd0Jhbm5lciQuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLnNob3dNZXNzYWdlID0gdmFsKSk7XHJcbiAgICB0aGlzLmJhbm5lclN1YnNjcmlwdGlvbi5hZGQodGhpcy5iYW5uZXJTZXJ2aWNlLm1lc3NhZ2UkLnN1YnNjcmliZSh2YWwgPT4gdGhpcy5tZXNzYWdlID0gdmFsKSk7XHJcbiAgICB0aGlzLmJhbm5lclN1YnNjcmlwdGlvbi5hZGQodGhpcy5iYW5uZXJTZXJ2aWNlLnNob3dDaGVja01hcmskLnN1YnNjcmliZSh2YWwgPT4gdGhpcy5zaG93Q2hlY2tNYXJrID0gdmFsKSk7XHJcblxyXG4gICAgdGhpcy5mb290ZXJOYXZpZ2F0aW9uRGF0YSA9IHRoaXMubmF2aWdhdGlvbkRhdGE/LmZpbHRlcihub2RlID0+IG5vZGU/LmFsdExvY2F0aW9uID09IHRydWUpO1xyXG4gICAgdGhpcy5mb290ZXJJdGVtQ291bnQgPSB0aGlzLmZvb3Rlck5hdmlnYXRpb25EYXRhID8gdGhpcy5mb290ZXJOYXZpZ2F0aW9uRGF0YS5sZW5ndGggOiAwO1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uRGF0YSA9IHRoaXMubmF2aWdhdGlvbkRhdGE/LmZpbHRlcihub2RlID0+IG5vZGU/LmFsdExvY2F0aW9uICE9IHRydWUpO1xyXG5cclxuICAgIC8vIGlmIHBhcmVudHMgaGF2ZSBubyByb3V0ZSwgZ3JhYiBmaXJzdCByb3V0ZSBvZiBjaGlsZFxyXG4gICAgdGhpcy5uYXZpZ2F0aW9uRGF0YT8uZm9yRWFjaChuID0+IHtcclxuICAgICAgaWYgKCFuLnJvdXRlKSB7XHJcbiAgICAgICAgbi5yb3V0ZSA9IG4uc3ViTm9kZXMgJiYgbi5zdWJOb2Rlcy5sZW5ndGggPiAwID8gbi5zdWJOb2Rlc1swXS5yb3V0ZSA6IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgICAvLyBlbmFibGUgYWxsIHBhZ2VzIGJ5IGRlZmF1bHRcclxuICAgICAgaWYgKG4uaXNEaXNhYmxlZCA9PSBudWxsKSB7XHJcbiAgICAgICAgbi5pc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaW5pdEJhc2ljU2V0dGluZ3MoKTtcclxuICAgIHRoaXMuaW5pdEFkdmFuY2VkU2V0dGluZ3MoKTtcclxuICAgIHRoaXMuaW5pdFRoZW1lU2V0dGluZ3MoKTtcclxuXHJcbiAgICAvLyBpbml0IGJpbmRpbmcgZm9yIHByb2dyZXNzIG5hdlxyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MubWVudVN0eWxlID09PSAncHJvZ3Jlc3MnKSB7XHJcbiAgICAgIC8vIHNldCB0aGUgZmlyc3Qgbm9kZSBhbmQgY2hpbGQgbm9kZSBhcyB2aXNpdGVkXHJcbiAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25EYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhWzBdLnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGUodGhpcy5uYXZpZ2F0aW9uRGF0YVswXS5yb3V0ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbkRhdGFbMF0uc3ViTm9kZXMgJiYgdGhpcy5uYXZpZ2F0aW9uRGF0YVswXS5zdWJOb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhWzBdLnN1Yk5vZGVzWzBdLnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZSh0aGlzLm5hdmlnYXRpb25EYXRhWzBdLnN1Yk5vZGVzWzBdLnJvdXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCBpbml0aWFsIHByb2dyZXNzIGJhclxyXG4gICAgICB0aGlzLm5hdlByb2dyZXNzQ291bnQgPSAodGhpcy5zZWxlY3RlZFBhcmVudEluZGV4ICsgMSkgLyB0aGlzLm5hdmlnYXRpb25EYXRhLmxlbmd0aCAqIDEwMDtcclxuXHJcblxyXG4gICAgICB0aGlzLm5hdkJpbmRTdWIuYWRkKFxyXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IHtcclxuICAgICAgICAgICAgLy8gZmluZCBwYXJlbnQgaW5kZXggd2l0aCBhY3RpdmUgY2hpbGRcclxuICAgICAgICAgICAgdGhpcy5nZXRBY3RpdmVQYXJlbnRBbmRDaGlsZChldmVudC51cmwpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0dGluZ3MuYWxsb3dOYXZUb2dnbGUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMubG9nSW5TdWJzY3JpcHRpb24gPSB0aGlzLmF1dGhvcml6YXRpb25TZXJ2aWNlLmlzTG9nZ2VkSW4kLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMudXNlck5hbWUgPSB0aGlzLmF1dGhvcml6YXRpb25TZXJ2aWNlLnVzZXJOYW1lKClcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnU2VydmljZSkge1xyXG4gICAgICB0aGlzLmNvbmZpZ1N1YnNjcmlwdGlvbiA9IHRoaXMuY29uZmlnU2VydmljZS5jb25maWckLnN1YnNjcmliZShjb25maWcgPT4ge1xyXG4gICAgICAgIGlmIChjb25maWcpIHtcclxuICAgICAgICAgIGlmIChjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy5yZXNldE5hdikge1xyXG4gICAgICAgICAgICB0aGlzLm5hdlByb2dyZXNzQ291bnQgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXggPSAwO1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlKHRoaXMubmF2aWdhdGlvbkRhdGFbMF0ucm91dGUpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zdGVwcGVyKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zdGVwcGVyLnNlbGVjdGVkSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGVwcGVyLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlubmVyU3RlcHBlcnM/LmZvckVhY2goc3RlcHBlciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHN0ZXBwZXIuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgIHN0ZXBwZXIucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGEuZm9yRWFjaChuID0+IHtcclxuICAgICAgICAgICAgICBuLnZpc2l0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBuLmNvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgbi5zdWJOb2Rlcz8uZm9yRWFjaChzID0+IHtcclxuICAgICAgICAgICAgICAgIHMudmlzaXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcy5jb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyByZXNldCBiYWNrIHRvIGZhbHNlIHRvIGF2b2lkIG11bHRpcGxlIHRyaWdnZXJzIG9uIGZ1dHVyZSBjYWxsc1xyXG4gICAgICAgICAgICBjb25maWcubmF2aWdhdGlvbi5zZXR0aW5ncy5yZXNldE5hdiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnID0gY29uZmlnO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZXMgd2VyZSBjaGFuZ2VkIGFuZCBub3QgbnVsbCwgaXQgbWVhbnMgdGhhdCB0aGUgbmF2IHdhcyB0b2dnbGVkIHRvIHByb2dyZXNzXHJcbiAgICAgICAgICBpZiAoY29uZmlnPy5uYXZpZ2F0aW9uPy5zZXR0aW5ncz8udG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleCAhPSBudWxsXHJcbiAgICAgICAgICAgICYmIHRoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleCAhPSBjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4XHJcbiAgICAgICAgICAgICYmIHRoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4ICE9IGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleFxyXG4gICAgICAgICAgICAmJiBjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXggIT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4ID0gY29uZmlnLm5hdmlnYXRpb24uc2V0dGluZ3MudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleDtcclxuICAgICAgICAgICAgdGhpcy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXggPSBjb25maWcubmF2aWdhdGlvbi5zZXR0aW5ncy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXg7XHJcblxyXG4gICAgICAgICAgICAvLyBhZGQgdGhlIHJvdXRlciBzdWJcclxuICAgICAgICAgICAgdGhpcy5uYXZCaW5kU3ViLmFkZChcclxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5ldmVudHMucGlwZShmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSlcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIGZpbmQgcGFyZW50IGluZGV4IHdpdGggYWN0aXZlIGNoaWxkXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWN0aXZlUGFyZW50QW5kQ2hpbGQoZXZlbnQudXJsKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjaGlsZCBub2RlIGluZGV4IGlzIHZhbGlkXHJcbiAgICAgICAgICAgIGlmIChjb25maWcubmF2aWdhdGlvbi5ub2Rlc1t0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhdLnN1Yk5vZGVzPy5sZW5ndGggPiB0aGlzLnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0Tm9kZVN0YXRlcyhjb25maWcubmF2aWdhdGlvbi5ub2Rlc1t0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhdLFxyXG4gICAgICAgICAgICAgICAgY29uZmlnLm5hdmlnYXRpb24ubm9kZXNbdGhpcy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4XS5zdWJOb2Rlc1t0aGlzLnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0Tm9kZVN0YXRlcyhjb25maWcubmF2aWdhdGlvbi5ub2Rlc1t0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhdLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaW5kZXhlc1xyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXggPSBjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4XHJcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4ID0gY29uZmlnPy5uYXZpZ2F0aW9uPy5zZXR0aW5ncz8udG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTGlmZSBjeWNsZSBob29rIGZvciBhZnRlciBjb21wb25lbnQgdmlldyBpbml0aWFsaXphdGlvbiAqL1xyXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5tZW51U3R5bGUgPT09ICdzdGVwcGVyJykge1xyXG4gICAgICB0aGlzLmJpbmRTdGVwcGVyVG9Sb3V0ZXMoKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdGVwcGVyLnN0ZXBzLmZvckVhY2goKHN0ZXAsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBzdGVwLnNlbGVjdCA9ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBhcmVudEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGUodGhpcy5uYXZpZ2F0aW9uRGF0YVtpbmRleF0ucm91dGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuaW5uZXJTdGVwcGVycy5mb3JFYWNoKChzdGVwcGVyLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgc3RlcHBlci5zdGVwcy5mb3JFYWNoKChzdGVwLCBqaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgc3RlcC5zZWxlY3QgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoaWxkSW5kZXhlc1tpbmRleF0gPSBqaW5kZXg7XHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZSh0aGlzLm5hdmlnYXRpb25EYXRhW2luZGV4XS5zdWJOb2Rlc1tqaW5kZXhdLnJvdXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaWRlTmF2U3ViID0gdGhpcy5zaWRlbmF2Lm9wZW5lZENoYW5nZS5zdWJzY3JpYmUoZHJhd2VyU3RhdGUgPT4ge1xyXG4gICAgICB0aGlzLmlzTmF2T3BlbiA9IGRyYXdlclN0YXRlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogT24gRGVzdHJveSAqL1xyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMubW9iaWxlUXVlcnkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fbW9iaWxlUXVlcnlMaXN0ZW5lcik7XHJcbiAgICB0aGlzLm5hdkJpbmRTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMubG9nSW5TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuYmFubmVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmNvbmZpZ1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5zaWRlTmF2U3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNb2JpbGUgU3ViTmF2IC0gb3BlbiB0aGUgU3ViTmF2XHJcbiAgICogQHBhcmFtIG5hdiB0aGUgbmF2IGRhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSBTdWJOYXZcclxuICAgKi9cclxuICBwdWJsaWMgb3Blbk1vYmlsZVN1Yk5hdihuYXY6IE5hdk5vZGUpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNNb2JpbGVTdWJOYXZPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuY3VycmVudE1vYmlsZU5hdiA9IG5hdjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vYmlsZSBTdWJOYXYgLSBjbG9zZXMgdGhlIFN1Yk5hdlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjbG9zZU1vYmlsZVN1Yk5hdigpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNNb2JpbGVTdWJOYXZPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSB0aGVtZSBjb2xvclxyXG4gICAqIEBwYXJhbSB2YXJpYWJsZSB0aGUgY3NzIHZhcmlhYmxlIG5hbWVcclxuICAgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yXHJcbiAgICovXHJcbiAgcHVibGljIHNldFRoZW1lQ29sb3IodmFyaWFibGU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KGAtLXNvZi1uYXYtJHt2YXJpYWJsZX1gLCBjb2xvcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHRoZSBzdGVwIHN0YXRlXHJcbiAgICogQHBhcmFtIHBhcmVudEluZGV4IFRoZSBwYXJlbnQgaW5kZXhcclxuICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgY2hpbGQgaW5kZXhcclxuICAgKiBAcmV0dXJucyBUaGUgc3RlcCBzdGF0ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBkZXRlcm1pbmVTdGVwU3RhdGUocGFyZW50SW5kZXg6IG51bWJlciwgY2hpbGRJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIC8vIG5vdCBwYXNzZWQgJiYgbm90IGFjdGl2ZVxyXG4gICAgaWYgKGNoaWxkSW5kZXggPT09IC0xKSB7XHJcbiAgICAgIGlmICghdGhpcy5zdGVwcGVyKSB7XHJcbiAgICAgICAgcmV0dXJuICdudW1iZXInO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIG5vdCBwYXNzZWQgJiYgYWN0aXZlXHJcbiAgICAgIGlmIChwYXJlbnRJbmRleCA9PT0gdGhpcy5zdGVwcGVyLnNlbGVjdGVkSW5kZXgpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS52aXNpdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdhY3RpdmUnO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHBhc3NlZCBidXQgbmF2IGJhY2tcclxuICAgICAgZWxzZSBpZiAocGFyZW50SW5kZXggPiB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCAmJiB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS52aXNpdGVkKSB7XHJcbiAgICAgICAgdGhpcy5zdGVwcGVyLnN0ZXBzLmZpbmQoKHMsIGluZGV4KSA9PiBpbmRleCA9PT0gcGFyZW50SW5kZXgpXHJcbiAgICAgICAgICAucmVzZXQoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdhY3RpdmUnO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHBhc3NlZCAmJiBub3QgYWN0aXZlXHJcbiAgICAgIGVsc2UgaWYgKHBhcmVudEluZGV4IDwgdGhpcy5zdGVwcGVyLnNlbGVjdGVkSW5kZXgpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS52aXNpdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdkb25lJztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJ251bWJlcic7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMuaW5uZXJTdGVwcGVycykge1xyXG4gICAgICAgIHJldHVybiAnbm9uZSc7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaW5uZXJTdGVwcGVyID0gdGhpcy5pbm5lclN0ZXBwZXJzLmZpbmQoKHMsIGluZGV4KSA9PiBpbmRleCA9PT0gcGFyZW50SW5kZXgpO1xyXG4gICAgICBpZiAoY2hpbGRJbmRleCA9PT0gaW5uZXJTdGVwcGVyLnNlbGVjdGVkSW5kZXgpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS5zdWJOb2Rlc1tjaGlsZEluZGV4XS52aXNpdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdhY3RpdmUnO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGNoaWxkSW5kZXggPiBpbm5lclN0ZXBwZXIuc2VsZWN0ZWRJbmRleCAmJiB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS5zdWJOb2Rlc1tjaGlsZEluZGV4XS52aXNpdGVkKSB7XHJcbiAgICAgICAgaW5uZXJTdGVwcGVyLnN0ZXBzLmZpbmQoKHMsIGluZGV4KSA9PiBpbmRleCA9PT0gY2hpbGRJbmRleClcclxuICAgICAgICAgIC5yZXNldCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoY2hpbGRJbmRleCA8IGlubmVyU3RlcHBlci5zZWxlY3RlZEluZGV4KSB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uRGF0YVtwYXJlbnRJbmRleF0uc3ViTm9kZXNbY2hpbGRJbmRleF0udmlzaXRlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiAnZG9uZSc7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuICdub25lJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhdGVzIHRvIHRoZSBwcm92aWRlZCByb3V0ZVxyXG4gICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGVcclxuICAgKi9cclxuICBwdWJsaWMgbmF2aWdhdGUocm91dGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1mbG9hdGluZy1wcm9taXNlc1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChyb3V0ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOYXZpZ2F0ZXMgdG8gZ2l2ZW4gc3RlcFxyXG4gICAqIEBwYXJhbSBzdGVwTnVtYmVyIFRoZSBzdGVwIG51bWJlciB0byBuYXZpZ2F0ZSB0b1xyXG4gICAqL1xyXG4gIHB1YmxpYyBuYXZpZ2F0ZVRvU3RlcChzdGVwTnVtYmVyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChzdGVwTnVtYmVyIDwgdGhpcy5zZWxlY3RlZFBhcmVudEluZGV4KSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tZmxvYXRpbmctcHJvbWlzZXNcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLm5hdmlnYXRpb25EYXRhW3N0ZXBOdW1iZXJdLnJvdXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGFjdGl2ZSBwYXJlbnQgYW5kIGNoaWxkIG5vZGVzIFxyXG4gICAqIEBwYXJhbSB1cmwgVGhlIHJvdXRlciB1cmxcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0QWN0aXZlUGFyZW50QW5kQ2hpbGQodXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBjaGlsZEluZGV4O1xyXG4gICAgbGV0IHBhcmVudEluZGV4ID0gdGhpcy5uYXZpZ2F0aW9uRGF0YS5maW5kSW5kZXgobiA9PiB7XHJcbiAgICAgIGNoaWxkSW5kZXggPSBuLnN1Yk5vZGVzPy5maW5kSW5kZXgocyA9PiB1cmwuaW5jbHVkZXMocy5yb3V0ZS5yZXBsYWNlKCcuJywgJycpKSk7XHJcbiAgICAgIHJldHVybiBjaGlsZEluZGV4ID4gLTEgfHwgdGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKG4ucm91dGUucmVwbGFjZSgnLicsICcnKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocGFyZW50SW5kZXggPT0gLTEpIHtcclxuICAgICAgcGFyZW50SW5kZXggPSAwXHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2V0IHRoZSBhY3RpdmUgcGFyZW50IG5vZGUgYW5kIHN1YiBub2RlXHJcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE5vZGUgPSB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XTtcclxuICAgIHRoaXMuYWN0aXZlU3ViTm9kZSA9IGNoaWxkSW5kZXggPiAtMSAmJiB0aGlzLmFjdGl2ZVBhcmVudE5vZGUuc3ViTm9kZXMubGVuZ3RoID4gMCA/IHRoaXMuYWN0aXZlUGFyZW50Tm9kZS5zdWJOb2Rlc1tjaGlsZEluZGV4XSA6IG51bGw7XHJcblxyXG4gICAgLy8gY29tcHV0ZSB0aGUgcHJvZ3Jlc3MgYmFyXHJcbiAgICB0aGlzLm5hdlByb2dyZXNzQ291bnQgPSAocGFyZW50SW5kZXggKyAxKSAvIHRoaXMubmF2aWdhdGlvbkRhdGEubGVuZ3RoICogMTAwO1xyXG5cclxuICAgIC8vIHNldCB0aGUgbm9kZSBzdGF0ZXNcclxuICAgIHRoaXMuc2V0Tm9kZVN0YXRlcyh0aGlzLmFjdGl2ZVBhcmVudE5vZGUsIHRoaXMuYWN0aXZlU3ViTm9kZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBjb21wbGV0ZSBhbmQgdmlzaXRlZCBzdGF0ZXMgZm9yIGFsbCBOYXZOb2RlcyBcclxuICAgKiBAcGFyYW0gcGFyZW50Tm9kZSBUaGUgcGFyZW50IG5vZGVcclxuICAgKiBAcGFyYW0gY2hpbGROb2RlIFRoZSBjaGlsZCBub2RlXHJcbiAgICovXHJcbiAgcHVibGljIHNldE5vZGVTdGF0ZXMocGFyZW50Tm9kZTogTmF2Tm9kZSwgY2hpbGROb2RlOiBTdWJOYXZOb2Rlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoaWxkTm9kZSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVN1Yk5vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgIGxldCBjaGlsZEluZGV4ID0gcGFyZW50Tm9kZS5zdWJOb2Rlcy5pbmRleE9mKGNoaWxkTm9kZSkgPiAtMSA/IHBhcmVudE5vZGUuc3ViTm9kZXMuaW5kZXhPZihjaGlsZE5vZGUpIDogMDtcclxuICAgICAgLy8gYWxsIHN1Ym5vZGVzIGJlZm9yZSB0aGlzIHdlcmUgY29tcGxldGVkIGFuZCB2aXNpdGVkXHJcbiAgICAgIHBhcmVudE5vZGUuc3ViTm9kZXMuc2xpY2UoMCwgY2hpbGRJbmRleCkuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICBlbGVtZW50LmNvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICBlbGVtZW50LnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuYWN0aXZlUGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAvLyBzZXQgYWxsIHByZXZpb3VzIG5vZGVzIHRvIGNvbXBsZXRlXHJcbiAgICBsZXQgcGFyZW50SW5kZXggPSB0aGlzLm5hdmlnYXRpb25EYXRhLmluZGV4T2YocGFyZW50Tm9kZSkgPiAtMSA/IHRoaXMubmF2aWdhdGlvbkRhdGEuaW5kZXhPZihwYXJlbnROb2RlKSA6IDA7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25EYXRhLnNsaWNlKDAsIHBhcmVudEluZGV4KS5mb3JFYWNoKGQgPT4ge1xyXG4gICAgICBkLmNvbXBsZXRlID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIHNldCBhbGwgc3Vibm9kZXMgb2YgcHJldmlvdXMgbm9kZXMgdG8gY29tcGxldGUgb25seSBpZiB0aGUgbm9kZSB3YXMgbm90IGRpc2FibGVkXHJcbiAgICAgIGlmICghZC5pc0Rpc2FibGVkKSB7XHJcbiAgICAgICAgZC5zdWJOb2Rlcy5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICAgICAgcy5jb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICBzLnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAvLyBzZXQgdGhlIGN1cnJlbnQgbm9kZXMgYXMgdmlzaXRlZFxyXG4gICAgcGFyZW50Tm9kZS52aXNpdGVkID0gdHJ1ZTtcclxuICAgIGlmIChjaGlsZE5vZGUpIHtcclxuICAgICAgY2hpbGROb2RlLnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2VzIHRoZSBleHBhbnNpb24gcGFuZWwgYW5kIG5hdmlnYXRlcyB0byB0aGUgZ2l2ZW4gbm9kZVxyXG4gICAqIEBwYXJhbSBlbCBUaGUgbWF0IGV4cGFuc2lvbiBwYW5lbCBcclxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHBhcmVudCBub2RlIGluZGV4IFxyXG4gICAqL1xyXG4gIHB1YmxpYyBkaXNhYmxlUGFuZWwoZWwsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGVsLmNsb3NlKCk7XHJcbiAgICB0aGlzLm5hdmlnYXRlKHRoaXMubmF2aWdhdGlvbkRhdGFbaW5kZXhdLnJvdXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogSGlkZXMgdGhlIG1lc3NhZ2VcclxuICAqL1xyXG4gIHB1YmxpYyBoaWRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93TWVzc2FnZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9ncyBvdXQgb25jZSB1c2VyIGlzIGF1dGhvcml6ZWRcclxuICAgKiAqL1xyXG4gIHB1YmxpYyBsb2dPdXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmF1dGhvcml6YXRpb25TZXJ2aWNlLmF1dGhvcml6ZVVzZXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb3NlcyBtb2JpbGUgbmF2aWdhdGlvbiBhZnRlciBzZWxlY3Rpb24uXHJcbiAgICovXHJcbiAgcHVibGljIGNsb3NlTmF2aWdhdGlvbkZvck1vYmlsZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm1vYmlsZVF1ZXJ5Lm1hdGNoZXMpIHtcclxuICAgICAgdGhpcy5zaWRlbmF2LmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJcyB0aGUgbmF2aWdhdGlvbiBzZWxlY3RlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc05hdlNlbGVjdGVkKG5vZGU6IE5hdk5vZGUgfCBTdWJOYXZOb2Rlcyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucm91dGVyLmlzQWN0aXZlKG5vZGUucm91dGUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNldHMgdGhlIHdpZHRoIGZvciB0aGUgc2lkZSBuYXYgKi9cclxuICBwdWJsaWMgc2V0TmF2V2lkdGgod2lkdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gd2lkdGguaW5jbHVkZXMoJyUnKSB8fCB3aWR0aC5pbmNsdWRlcygncHgnKSA/IHdpZHRoIDogd2lkdGggKyAncHgnO1xyXG4gIH1cclxuXHJcbiAgLyoqIEJpbmRzIHRoZSBzdGVwcGVyIHRvIHRoZSByb3V0ZXIgKi9cclxuICBwcml2YXRlIGJpbmRTdGVwcGVyVG9Sb3V0ZXMoKTogdm9pZCB7XHJcbiAgICAvLyBmaW5kIHBhcmVudHNcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAvLyBmaW5kIHBhcmVudCBpbmRleCB3aXRoIGFjdGl2ZSBjaGlsZFxyXG4gICAgICBsZXQgY2hpbGRJbmRleDtcclxuICAgICAgbGV0IHBhcmVudEluZGV4ID0gdGhpcy5uYXZpZ2F0aW9uRGF0YS5maW5kSW5kZXgobiA9PiB7XHJcbiAgICAgICAgY2hpbGRJbmRleCA9IG4uc3ViTm9kZXM/LmZpbmRJbmRleChzID0+IHRoaXMucm91dGVyLnVybC5pbmNsdWRlcyhzLnJvdXRlLnJlcGxhY2UoJy4nLCAnJykpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNoaWxkSW5kZXggPiAtMSB8fCB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMobi5yb3V0ZS5yZXBsYWNlKCcuJywgJycpKTtcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIGlmIG5vIGNoaWxkcmVuIG9yIG5vIGluZGV4ZXMgYWN0aXZhdGUgZmlyc3QgcGFyZW50XHJcbiAgICAgIGlmIChwYXJlbnRJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICBwYXJlbnRJbmRleCA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRQYXJlbnRJbmRleCA9IHBhcmVudEluZGV4O1xyXG4gICAgICBpZiAoY2hpbGRJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5pbm5lclN0ZXBwZXJzLmZpbmQoKGlzLCBpbmRleCkgPT4gaW5kZXggPT09IHBhcmVudEluZGV4KS5zZWxlY3RlZEluZGV4ID0gY2hpbGRJbmRleDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gZmluZCBwYXJlbnRzXHJcbiAgICB0aGlzLm5hdkJpbmRTdWIuYWRkKFxyXG4gICAgICB0aGlzLnJvdXRlci5ldmVudHMucGlwZShmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChldmVudDogTmF2aWdhdGlvbkVuZCkgPT4ge1xyXG4gICAgICAgICAgLy8gZmluZCBwYXJlbnQgaW5kZXggd2l0aCBhY3RpdmUgY2hpbGRcclxuICAgICAgICAgIGxldCBjaGlsZEluZGV4O1xyXG4gICAgICAgICAgbGV0IHBhcmVudEluZGV4ID0gdGhpcy5uYXZpZ2F0aW9uRGF0YS5maW5kSW5kZXgobiA9PiB7XHJcbiAgICAgICAgICAgIGNoaWxkSW5kZXggPSBuLnN1Yk5vZGVzPy5maW5kSW5kZXgocyA9PiBldmVudC51cmxBZnRlclJlZGlyZWN0cy5pbmNsdWRlcyhzLnJvdXRlLnJlcGxhY2UoJy4nLCAnJykpKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjaGlsZEluZGV4ID4gLTEgfHwgZXZlbnQudXJsQWZ0ZXJSZWRpcmVjdHMuaW5jbHVkZXMobi5yb3V0ZS5yZXBsYWNlKCcuJywgJycpKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgLy8gaWYgbm8gY2hpbGRyZW4gb3Igbm8gaW5kZXhlcyBhY3RpdmF0ZSBmaXJzdCBwYXJlbnRcclxuICAgICAgICAgIGlmIChwYXJlbnRJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcGFyZW50SW5kZXggPSAwO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQYXJlbnRJbmRleCA9IHBhcmVudEluZGV4O1xyXG4gICAgICAgICAgaWYgKGNoaWxkSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmlubmVyU3RlcHBlcnMuZmluZCgoaXMsIGluZGV4KSA9PiBpbmRleCA9PT0gcGFyZW50SW5kZXgpLnNlbGVjdGVkSW5kZXggPSBjaGlsZEluZGV4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluaXRpYWxpemVzIHRoZSBhZHZhbmNlZCBuYXYgc2V0dGluZ3MgKi9cclxuICBwcml2YXRlIGluaXRBZHZhbmNlZFNldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzLnRvcEdhcERlc2t0b3AgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3MudG9wR2FwRGVza3RvcCB8fCAwO1xyXG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzLnRvcEdhcE1vYmlsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5ncy50b3BHYXBNb2JpbGUgfHwgdGhpcy5zZXR0aW5ncy5oZWFkZXJIZWlnaHQ7XHJcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3MubWFyZ2luVG9wRGVza3RvcCA9IHRoaXMuYWR2YW5jZWRTZXR0aW5ncy5tYXJnaW5Ub3BEZXNrdG9wIHx8IDA7XHJcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3MubWFyZ2luVG9wTW9iaWxlID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzLm1hcmdpblRvcE1vYmlsZSB8fCAwO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKiBJbml0aWFsaXplcyB0aGUgbmF2IHRoZW1lIHNldHRpbmdzICovXHJcbiAgcHJpdmF0ZSBpbml0VGhlbWVTZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5jb250ZW50QmdDb2xvciA/IHRoaXMuc2V0VGhlbWVDb2xvcignY29udGVudC1iZy1jb2xvcicsIHRoaXMudGhlbWVTZXR0aW5ncy5jb250ZW50QmdDb2xvcikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuZm9udENvbG9yID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdmb250LWNvbG9yJywgdGhpcy50aGVtZVNldHRpbmdzLmZvbnRDb2xvcikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuZm9udENvbG9yID0gdGhpcy50aGVtZVNldHRpbmdzLmZvbnRDb2xvciB8fCAnIzAwMCc7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MubW9iaWxlQmdDb2xvciA9IHRoaXMudGhlbWVTZXR0aW5ncy5tb2JpbGVCZ0NvbG9yIHx8ICcjZmZmZmZmJztcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5iZ0dyYWRpZW50Q29sb3IxID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdiZy1ncmFkaWVudC1jb2xvci0xJywgdGhpcy50aGVtZVNldHRpbmdzLmJnR3JhZGllbnRDb2xvcjEpIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLmJnR3JhZGllbnRDb2xvcjIgPyB0aGlzLnNldFRoZW1lQ29sb3IoJ2JnLWdyYWRpZW50LWNvbG9yLTInLCB0aGlzLnRoZW1lU2V0dGluZ3MuYmdHcmFkaWVudENvbG9yMikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuYm9yZGVyUmlnaHRDb2xvciA/IHRoaXMuc2V0VGhlbWVDb2xvcignYm9yZGVyLXJpZ2h0LWNvbG9yJywgdGhpcy50aGVtZVNldHRpbmdzLmJvcmRlclJpZ2h0Q29sb3IpIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLmxpc3RCb3JkZXJDb2xvciA/IHRoaXMuc2V0VGhlbWVDb2xvcignbGlzdC1ib3JkZXItY29sb3InLCB0aGlzLnRoZW1lU2V0dGluZ3MubGlzdEJvcmRlckNvbG9yKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5oaWdobGlnaHRHcmFkaWVudDEgPyB0aGlzLnNldFRoZW1lQ29sb3IoJ2hpZ2hsaWdodC1ncmFkaWVudC0xJywgdGhpcy50aGVtZVNldHRpbmdzLmhpZ2hsaWdodEdyYWRpZW50MSkgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuaGlnaGxpZ2h0R3JhZGllbnQyID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdoaWdobGlnaHQtZ3JhZGllbnQtMicsIHRoaXMudGhlbWVTZXR0aW5ncy5oaWdobGlnaHRHcmFkaWVudDIpIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLnN1YkhpZ2hsaWdodEJvcmRlckNvbG9yID9cclxuICAgICAgdGhpcy5zZXRUaGVtZUNvbG9yKCdzdWItaGlnaGxpZ2h0LWJvcmRlci1jb2xvcicsIHRoaXMudGhlbWVTZXR0aW5ncy5zdWJIaWdobGlnaHRCb3JkZXJDb2xvcikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3Muc3ViSGlnaGxpZ2h0QmdDb2xvciA/XHJcbiAgICAgIHRoaXMuc2V0VGhlbWVDb2xvcignc3ViLWhpZ2hsaWdodC1iZy1jb2xvcicsIHRoaXMudGhlbWVTZXR0aW5ncy5zdWJIaWdobGlnaHRCZ0NvbG9yKSA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8qKiBJbml0aWFsaXplcyB0aGUgYmFzaWMgbmF2IHNldHRpbmdzICovXHJcbiAgcHJpdmF0ZSBpbml0QmFzaWNTZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0dGluZ3MuZm9udEF3ZXNvbWVNZW51SWNvbiA9IHRoaXMuc2V0dGluZ3MuZm9udEF3ZXNvbWVNZW51SWNvbiB8fCAnZmFzIGZhLWFuZ2xlLWRvdWJsZS1sZWZ0JztcclxuICAgIHRoaXMuc2V0dGluZ3MuZm9udEF3ZXNvbWVNZW51SWNvbkNsb3NlZCA9IHRoaXMuc2V0dGluZ3MuZm9udEF3ZXNvbWVNZW51SWNvbkNsb3NlZCB8fCAnZmFzIGZhLWFuZ2xlLWRvdWJsZS1yaWdodCc7XHJcbiAgICB0aGlzLnNldHRpbmdzLmFsbG93TmF2VG9nZ2xlID0gdGhpcy5zZXR0aW5ncy5hbGxvd05hdlRvZ2dsZSA9PSBudWxsID8gdHJ1ZSA6IHRoaXMuc2V0dGluZ3MuYWxsb3dOYXZUb2dnbGU7XHJcbiAgICB0aGlzLnNldHRpbmdzLm1haW5NZW51VGV4dCA/IHRoaXMubWFpbk1lbnVUZXh0ID0gdGhpcy5zZXR0aW5ncy5tYWluTWVudVRleHQgOiB0aGlzLm1haW5NZW51VGV4dCA9ICdNYWluIE1lbnUnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5oZWFkZXJIZWlnaHQgPSB0aGlzLnNldHRpbmdzLmhlYWRlckhlaWdodCB8fCA2MDtcclxuICAgIHRoaXMuc2V0dGluZ3MubWVudUJ1dHRvblNSVGV4dCA9IHRoaXMuc2V0dGluZ3MubWVudUJ1dHRvblNSVGV4dCB8fCAnTWVudSBCdXR0b24nO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5tZW51U3R5bGUgPSB0aGlzLnNldHRpbmdzLm1lbnVTdHlsZSB8fCAnc3RhdGljJztcclxuICAgIHRoaXMuc2V0dGluZ3MuZGlzcGxheU51bWJlcnMgPSB0aGlzLnNldHRpbmdzLmRpc3BsYXlOdW1iZXJzID09IG51bGwgPyB0cnVlIDogdGhpcy5zZXR0aW5ncy5kaXNwbGF5TnVtYmVycztcclxuICAgIHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NTZWN0aW9uQ29tcGxldGVJY29uID0gdGhpcy5zZXR0aW5ncy5wcm9ncmVzc1NlY3Rpb25Db21wbGV0ZUljb24gfHwgJ2ZhcyBmYS1jaGVjay1jaXJjbGUnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc1NlY3Rpb25GdXR1cmVJY29uID0gdGhpcy5zZXR0aW5ncy5wcm9ncmVzc1NlY3Rpb25GdXR1cmVJY29uIHx8ICdmYXIgZmEtY2lyY2xlJztcclxuICAgIHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NTZWN0aW9uQ3VycmVudEljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkN1cnJlbnRJY29uIHx8ICdmYXMgZmEtY2lyY2xlJztcclxuICAgIHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NNZW51Q29tcGxldGVJY29uID0gdGhpcy5zZXR0aW5ncy5wcm9ncmVzc01lbnVDb21wbGV0ZUljb24gfHwgJ2ZhciBmYS1jaGVjayc7XHJcbiAgICB0aGlzLnNldHRpbmdzLnNob3dQcm9ncmVzc0JhciA9IHRoaXMuc2V0dGluZ3Muc2hvd1Byb2dyZXNzQmFyID09IG51bGwgPyB0cnVlIDogdGhpcy5zZXR0aW5ncy5zaG93UHJvZ3Jlc3NCYXJcclxuICAgIHRoaXMuc2V0dGluZ3Muc2lkZU5hdldpZHRoRGVza3RvcCA9IHRoaXMuc2V0dGluZ3Muc2lkZU5hdldpZHRoRGVza3RvcCB8fCAnMzUwJztcclxuICAgIHRoaXMuc2V0dGluZ3Muc2lkZU5hdldpZHRoTW9iaWxlID0gdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhNb2JpbGUgfHwgJzM1MCc7XHJcbiAgICB0aGlzLnNldHRpbmdzLm92ZXJyaWRlTmF2aWdhdGlvbiA9IHRoaXMuc2V0dGluZ3Mub3ZlcnJpZGVOYXZpZ2F0aW9uIHx8IGZhbHNlO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc01lbnVXaWR0aCA9IHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NNZW51V2lkdGggfHwgJzI4MCc7XHJcbiAgICB0aGlzLnNldHRpbmdzLnVzZUN1c3RvbU1vYmlsZUZvb3RlciA9IHRoaXMuc2V0dGluZ3MudXNlQ3VzdG9tTW9iaWxlRm9vdGVyICE9IG51bGwgPyB0aGlzLnNldHRpbmdzLnVzZUN1c3RvbU1vYmlsZUZvb3RlciA6IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=