@thetradeengineorg1/snova-shell-module 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/README.md +24 -0
  2. package/bundles/thetradeengineorg1-snova-shell-module.umd.js +13896 -0
  3. package/bundles/thetradeengineorg1-snova-shell-module.umd.js.map +1 -0
  4. package/esm2015/lib/globaldependencies/components/componentbase.js +538 -0
  5. package/esm2015/lib/globaldependencies/constants/feature-ids.js +449 -0
  6. package/esm2015/lib/globaldependencies/constants/localstorage-properties.js +38 -0
  7. package/esm2015/lib/globaldependencies/helpers/dom.helper.js +70 -0
  8. package/esm2015/lib/globaldependencies/helpers/fontawesome-icons.js +144 -0
  9. package/esm2015/lib/globaldependencies/helpers/moment-utc-date-adapter.js +37 -0
  10. package/esm2015/lib/globaldependencies/helpers/window.helper.js +32 -0
  11. package/esm2015/lib/globaldependencies/intercepter/jwt.interceptor.js +40 -0
  12. package/esm2015/lib/globaldependencies/pipes/fetchSizedAndCachedImage.pipe.js +36 -0
  13. package/esm2015/lib/globaldependencies/pipes/highLightText.pipe.js +24 -0
  14. package/esm2015/lib/globaldependencies/pipes/orderby-pipe.js +24 -0
  15. package/esm2015/lib/globaldependencies/pipes/removeSpecialCharacters.pipe.js +22 -0
  16. package/esm2015/lib/globaldependencies/pipes/sanitize.pipe.js +24 -0
  17. package/esm2015/lib/globaldependencies/pipes/softlabels.pipes.js +346 -0
  18. package/esm2015/lib/globaldependencies/pipes/utctolocaltime.pipe.js +23 -0
  19. package/esm2015/lib/globaldependencies/pipes/utctolocaltimewithdate.pipe.js +25 -0
  20. package/esm2015/lib/globaldependencies/pipes/workflowstatus.pipes.js +27 -0
  21. package/esm2015/lib/shell-components/components/Payments/account.component.js +50 -0
  22. package/esm2015/lib/shell-components/components/Payments/company-information.js +262 -0
  23. package/esm2015/lib/shell-components/components/Payments/company-plans.component.js +138 -0
  24. package/esm2015/lib/shell-components/components/Payments/document.component.js +57 -0
  25. package/esm2015/lib/shell-components/components/Payments/payment-method.component.js +32 -0
  26. package/esm2015/lib/shell-components/components/Payments/product-service.component.js +143 -0
  27. package/esm2015/lib/shell-components/components/Payments/purchase-more-licenses.js +152 -0
  28. package/esm2015/lib/shell-components/components/Payments/transactions.component.js +60 -0
  29. package/esm2015/lib/shell-components/components/admin-layout/admin-layout.component.js +250 -0
  30. package/esm2015/lib/shell-components/components/all-work-items-dialog/all-work-items-dialog.component.js +89 -0
  31. package/esm2015/lib/shell-components/components/confirmation-dialog/confirmation-dialog.component.js +90 -0
  32. package/esm2015/lib/shell-components/components/export-import-configuration/export-configuration.component.js +357 -0
  33. package/esm2015/lib/shell-components/components/feed-time/feed-time-dialog.component.js +85 -0
  34. package/esm2015/lib/shell-components/components/feed-time/feed-time.component.js +83 -0
  35. package/esm2015/lib/shell-components/components/header-side/header-side.component.js +1642 -0
  36. package/esm2015/lib/shell-components/components/header-top/header-top.component.js +93 -0
  37. package/esm2015/lib/shell-components/components/lives/lives-welcome-page.js +26 -0
  38. package/esm2015/lib/shell-components/components/menu/menu.component.js +2478 -0
  39. package/esm2015/lib/shell-components/components/menu/searchTask.enum.js +10 -0
  40. package/esm2015/lib/shell-components/components/notifications/announcement-dialog.component.js +73 -0
  41. package/esm2015/lib/shell-components/components/notifications/notifications.component.js +449 -0
  42. package/esm2015/lib/shell-components/components/sidebar-top/sidebar-top.component.js +33 -0
  43. package/esm2015/lib/shell-components/components/sidenav/side-bar.component.js +81 -0
  44. package/esm2015/lib/shell-components/components/sidenav/sidenav.component.js +43 -0
  45. package/esm2015/lib/shell-components/components/submit-feedback/submit-feedback.component.js +71 -0
  46. package/esm2015/lib/shell-components/constants/api-urls.js +1052 -0
  47. package/esm2015/lib/shell-components/constants/available-languages.js +25 -0
  48. package/esm2015/lib/shell-components/constants/channel-names.js +38 -0
  49. package/esm2015/lib/shell-components/constants/menu-categories.js +6 -0
  50. package/esm2015/lib/shell-components/constants/notification-routes.js +6 -0
  51. package/esm2015/lib/shell-components/constants/notification-type-ids.js +42 -0
  52. package/esm2015/lib/shell-components/enum/recentSearchType.enum.js +13 -0
  53. package/esm2015/lib/shell-components/models/AppMenuItemModel.js +3 -0
  54. package/esm2015/lib/shell-components/models/AppNotification.js +17 -0
  55. package/esm2015/lib/shell-components/models/AssetAssignedNotificationModel.js +12 -0
  56. package/esm2015/lib/shell-components/models/ChannelUpdateModel.js +3 -0
  57. package/esm2015/lib/shell-components/models/EmployeeStatusModel.js +3 -0
  58. package/esm2015/lib/shell-components/models/IAdjust-screen-options.js +2 -0
  59. package/esm2015/lib/shell-components/models/IBadge.js +2 -0
  60. package/esm2015/lib/shell-components/models/IChildItem.js +2 -0
  61. package/esm2015/lib/shell-components/models/ILayout-change-options.js +2 -0
  62. package/esm2015/lib/shell-components/models/IMenuItem.js +2 -0
  63. package/esm2015/lib/shell-components/models/IlayoutConf.js +2 -0
  64. package/esm2015/lib/shell-components/models/IntroModel.js +3 -0
  65. package/esm2015/lib/shell-components/models/MessageDetails.js +3 -0
  66. package/esm2015/lib/shell-components/models/MessageTypingDetails.js +3 -0
  67. package/esm2015/lib/shell-components/models/NewProjectCreatedNotificationModel.js +10 -0
  68. package/esm2015/lib/shell-components/models/NewProjectFeatureNotificationModel.js +10 -0
  69. package/esm2015/lib/shell-components/models/NotificationsOutPutModel.js +22 -0
  70. package/esm2015/lib/shell-components/models/ProjectSearchCriteriaInputModel.js +3 -0
  71. package/esm2015/lib/shell-components/models/RecentSearchModel.js +5 -0
  72. package/esm2015/lib/shell-components/models/ReportConfigAssignedNotification.js +11 -0
  73. package/esm2015/lib/shell-components/models/ReportSubmittedNotification.js +12 -0
  74. package/esm2015/lib/shell-components/models/RoleUpdatedNotification.js +9 -0
  75. package/esm2015/lib/shell-components/models/UserStoryAssignedNotification.js +13 -0
  76. package/esm2015/lib/shell-components/models/archiveUserStoryModel.js +10 -0
  77. package/esm2015/lib/shell-components/models/companieslist.model.js +3 -0
  78. package/esm2015/lib/shell-components/models/company-model.js +7 -0
  79. package/esm2015/lib/shell-components/models/company-payment-model.js +3 -0
  80. package/esm2015/lib/shell-components/models/dragedWidget.js +3 -0
  81. package/esm2015/lib/shell-components/models/employee-List.js +3 -0
  82. package/esm2015/lib/shell-components/models/employee.js +4 -0
  83. package/esm2015/lib/shell-components/models/entityRoleFeature.js +3 -0
  84. package/esm2015/lib/shell-components/models/export-configuration-model.js +3 -0
  85. package/esm2015/lib/shell-components/models/export-data.module.js +8 -0
  86. package/esm2015/lib/shell-components/models/goalApprovedNotificationModel.js +9 -0
  87. package/esm2015/lib/shell-components/models/import-configuration-model.js +3 -0
  88. package/esm2015/lib/shell-components/models/initialStatusofUsers.js +3 -0
  89. package/esm2015/lib/shell-components/models/invoiceOutput-model.js +3 -0
  90. package/esm2015/lib/shell-components/models/leaveApplicationNotifiction.js +9 -0
  91. package/esm2015/lib/shell-components/models/multiChartsScheduling.js +11 -0
  92. package/esm2015/lib/shell-components/models/parkUserStoryInputModel.js +10 -0
  93. package/esm2015/lib/shell-components/models/project.js +3 -0
  94. package/esm2015/lib/shell-components/models/recentSearchApiModel.js +3 -0
  95. package/esm2015/lib/shell-components/models/searchCriteriaInputModelBase.js +3 -0
  96. package/esm2015/lib/shell-components/models/shellModulesInfo.js +7 -0
  97. package/esm2015/lib/shell-components/models/softlabels-model.js +7 -0
  98. package/esm2015/lib/shell-components/models/sprintReplanRequestedModel.js +9 -0
  99. package/esm2015/lib/shell-components/models/sprintStartedNotificationModel.js +9 -0
  100. package/esm2015/lib/shell-components/models/store-model.js +3 -0
  101. package/esm2015/lib/shell-components/models/store-search-model.js +4 -0
  102. package/esm2015/lib/shell-components/models/themes.model.js +3 -0
  103. package/esm2015/lib/shell-components/models/timesheetenabledisable.js +4 -0
  104. package/esm2015/lib/shell-components/models/user.js +8 -0
  105. package/esm2015/lib/shell-components/models/userStory.js +3 -0
  106. package/esm2015/lib/shell-components/models/userStoryCommentNotificationModel.js +9 -0
  107. package/esm2015/lib/shell-components/models/userStoryUpdateNotificationModel.js +9 -0
  108. package/esm2015/lib/shell-components/models/userstory-custom-fields.model.js +3 -0
  109. package/esm2015/lib/shell-components/models/validation.model.js +2 -0
  110. package/esm2015/lib/shell-components/models/widgetlist.js +6 -0
  111. package/esm2015/lib/shell-components/models/workspaceList.js +3 -0
  112. package/esm2015/lib/shell-components/services/authentication.service.js +96 -0
  113. package/esm2015/lib/shell-components/services/chat.service.js +67 -0
  114. package/esm2015/lib/shell-components/services/common-used.service.js +263 -0
  115. package/esm2015/lib/shell-components/services/feature.service.js +101 -0
  116. package/esm2015/lib/shell-components/services/google-analytics.service.js +24 -0
  117. package/esm2015/lib/shell-components/services/layout.service.js +68 -0
  118. package/esm2015/lib/shell-components/services/payment.service.js +103 -0
  119. package/esm2015/lib/shell-components/services/recentSearch.service.js +90 -0
  120. package/esm2015/lib/shell-components/services/shell.modules.service.js +24 -0
  121. package/esm2015/lib/shell-components/services/signalr.service.js +113 -0
  122. package/esm2015/lib/shell-components/services/theme.service.js +161 -0
  123. package/esm2015/lib/shell-components/shell.module.js +436 -0
  124. package/esm2015/lib/shell-components/shell.routing.js +16 -0
  125. package/esm2015/lib/shell-components/store/actions/authentication.actions.js +260 -0
  126. package/esm2015/lib/shell-components/store/actions/chat.actions.js +248 -0
  127. package/esm2015/lib/shell-components/store/actions/menuitems.actions.js +39 -0
  128. package/esm2015/lib/shell-components/store/actions/notification-validator.action.js +19 -0
  129. package/esm2015/lib/shell-components/store/actions/notifications.actions.js +74 -0
  130. package/esm2015/lib/shell-components/store/effects/authentication.effects.js +503 -0
  131. package/esm2015/lib/shell-components/store/effects/chat.effects.js +139 -0
  132. package/esm2015/lib/shell-components/store/effects/index.js +13 -0
  133. package/esm2015/lib/shell-components/store/effects/menuitems.effects.js +53 -0
  134. package/esm2015/lib/shell-components/store/effects/notification-validator.effects.js +56 -0
  135. package/esm2015/lib/shell-components/store/effects/notifications.effects.js +116 -0
  136. package/esm2015/lib/shell-components/store/reducers/authentication.reducers.js +86 -0
  137. package/esm2015/lib/shell-components/store/reducers/chat.reducers.js +68 -0
  138. package/esm2015/lib/shell-components/store/reducers/index.js +80 -0
  139. package/esm2015/lib/shell-components/store/reducers/menuitems.reducers.js +56 -0
  140. package/esm2015/lib/shell-components/store/reducers/notification-validator.reducers.js +13 -0
  141. package/esm2015/lib/shell-components/store/reducers/notifications.reducers.js +38 -0
  142. package/esm2015/public-api.js +90 -0
  143. package/esm2015/store/reducers/index.js +47 -0
  144. package/esm2015/thetradeengineorg1-snova-shell-module.js +5 -0
  145. package/fesm2015/thetradeengineorg1-snova-shell-module.js +12808 -0
  146. package/fesm2015/thetradeengineorg1-snova-shell-module.js.map +1 -0
  147. package/lib/globaldependencies/components/componentbase.d.ts +455 -0
  148. package/lib/globaldependencies/constants/feature-ids.d.ts +448 -0
  149. package/lib/globaldependencies/constants/localstorage-properties.d.ts +37 -0
  150. package/lib/globaldependencies/helpers/dom.helper.d.ts +7 -0
  151. package/lib/globaldependencies/helpers/fontawesome-icons.d.ts +1 -0
  152. package/lib/globaldependencies/helpers/moment-utc-date-adapter.d.ts +9 -0
  153. package/lib/globaldependencies/helpers/window.helper.d.ts +12 -0
  154. package/lib/globaldependencies/intercepter/jwt.interceptor.d.ts +11 -0
  155. package/lib/globaldependencies/pipes/fetchSizedAndCachedImage.pipe.d.ts +8 -0
  156. package/lib/globaldependencies/pipes/highLightText.pipe.d.ts +8 -0
  157. package/lib/globaldependencies/pipes/orderby-pipe.d.ts +9 -0
  158. package/lib/globaldependencies/pipes/removeSpecialCharacters.pipe.d.ts +8 -0
  159. package/lib/globaldependencies/pipes/sanitize.pipe.d.ts +11 -0
  160. package/lib/globaldependencies/pipes/softlabels.pipes.d.ts +8 -0
  161. package/lib/globaldependencies/pipes/utctolocaltime.pipe.d.ts +8 -0
  162. package/lib/globaldependencies/pipes/utctolocaltimewithdate.pipe.d.ts +8 -0
  163. package/lib/globaldependencies/pipes/workflowstatus.pipes.d.ts +8 -0
  164. package/lib/shell-components/components/Payments/account.component.d.ts +14 -0
  165. package/lib/shell-components/components/Payments/company-information.d.ts +62 -0
  166. package/lib/shell-components/components/Payments/company-plans.component.d.ts +47 -0
  167. package/lib/shell-components/components/Payments/document.component.d.ts +20 -0
  168. package/lib/shell-components/components/Payments/payment-method.component.d.ts +15 -0
  169. package/lib/shell-components/components/Payments/product-service.component.d.ts +48 -0
  170. package/lib/shell-components/components/Payments/purchase-more-licenses.d.ts +37 -0
  171. package/lib/shell-components/components/Payments/transactions.component.d.ts +28 -0
  172. package/lib/shell-components/components/admin-layout/admin-layout.component.d.ts +67 -0
  173. package/lib/shell-components/components/all-work-items-dialog/all-work-items-dialog.component.d.ts +32 -0
  174. package/lib/shell-components/components/confirmation-dialog/confirmation-dialog.component.d.ts +32 -0
  175. package/lib/shell-components/components/export-import-configuration/export-configuration.component.d.ts +60 -0
  176. package/lib/shell-components/components/feed-time/feed-time-dialog.component.d.ts +33 -0
  177. package/lib/shell-components/components/feed-time/feed-time.component.d.ts +27 -0
  178. package/lib/shell-components/components/header-side/header-side.component.d.ts +216 -0
  179. package/lib/shell-components/components/header-top/header-top.component.d.ts +40 -0
  180. package/lib/shell-components/components/lives/lives-welcome-page.d.ts +14 -0
  181. package/lib/shell-components/components/menu/menu.component.d.ts +220 -0
  182. package/lib/shell-components/components/menu/searchTask.enum.d.ts +8 -0
  183. package/lib/shell-components/components/notifications/announcement-dialog.component.d.ts +27 -0
  184. package/lib/shell-components/components/notifications/notifications.component.d.ts +53 -0
  185. package/lib/shell-components/components/sidebar-top/sidebar-top.component.d.ts +10 -0
  186. package/lib/shell-components/components/sidenav/side-bar.component.d.ts +23 -0
  187. package/lib/shell-components/components/sidenav/sidenav.component.d.ts +17 -0
  188. package/lib/shell-components/components/submit-feedback/submit-feedback.component.d.ts +25 -0
  189. package/lib/shell-components/constants/api-urls.d.ts +1051 -0
  190. package/lib/shell-components/constants/available-languages.d.ts +7 -0
  191. package/lib/shell-components/constants/channel-names.d.ts +37 -0
  192. package/lib/shell-components/constants/menu-categories.d.ts +5 -0
  193. package/lib/shell-components/constants/notification-routes.d.ts +5 -0
  194. package/lib/shell-components/constants/notification-type-ids.d.ts +41 -0
  195. package/lib/shell-components/enum/recentSearchType.enum.d.ts +11 -0
  196. package/lib/shell-components/models/AppMenuItemModel.d.ts +12 -0
  197. package/lib/shell-components/models/AppNotification.d.ts +12 -0
  198. package/lib/shell-components/models/AssetAssignedNotificationModel.d.ts +10 -0
  199. package/lib/shell-components/models/ChannelUpdateModel.d.ts +47 -0
  200. package/lib/shell-components/models/EmployeeStatusModel.d.ts +11 -0
  201. package/lib/shell-components/models/IAdjust-screen-options.d.ts +4 -0
  202. package/lib/shell-components/models/IBadge.d.ts +4 -0
  203. package/lib/shell-components/models/IChildItem.d.ts +7 -0
  204. package/lib/shell-components/models/ILayout-change-options.d.ts +4 -0
  205. package/lib/shell-components/models/IMenuItem.d.ts +14 -0
  206. package/lib/shell-components/models/IlayoutConf.d.ts +10 -0
  207. package/lib/shell-components/models/IntroModel.d.ts +3 -0
  208. package/lib/shell-components/models/MessageDetails.d.ts +55 -0
  209. package/lib/shell-components/models/MessageTypingDetails.d.ts +9 -0
  210. package/lib/shell-components/models/NewProjectCreatedNotificationModel.d.ts +8 -0
  211. package/lib/shell-components/models/NewProjectFeatureNotificationModel.d.ts +8 -0
  212. package/lib/shell-components/models/NotificationsOutPutModel.d.ts +41 -0
  213. package/lib/shell-components/models/ProjectSearchCriteriaInputModel.d.ts +10 -0
  214. package/lib/shell-components/models/RecentSearchModel.d.ts +14 -0
  215. package/lib/shell-components/models/ReportConfigAssignedNotification.d.ts +9 -0
  216. package/lib/shell-components/models/ReportSubmittedNotification.d.ts +10 -0
  217. package/lib/shell-components/models/RoleUpdatedNotification.d.ts +7 -0
  218. package/lib/shell-components/models/UserStoryAssignedNotification.d.ts +8 -0
  219. package/lib/shell-components/models/archiveUserStoryModel.d.ts +7 -0
  220. package/lib/shell-components/models/companieslist.model.d.ts +8 -0
  221. package/lib/shell-components/models/company-model.d.ts +31 -0
  222. package/lib/shell-components/models/company-payment-model.d.ts +18 -0
  223. package/lib/shell-components/models/dragedWidget.d.ts +16 -0
  224. package/lib/shell-components/models/employee-List.d.ts +8 -0
  225. package/lib/shell-components/models/employee.d.ts +60 -0
  226. package/lib/shell-components/models/entityRoleFeature.d.ts +9 -0
  227. package/lib/shell-components/models/export-configuration-model.d.ts +8 -0
  228. package/lib/shell-components/models/export-data.module.d.ts +6 -0
  229. package/lib/shell-components/models/goalApprovedNotificationModel.d.ts +8 -0
  230. package/lib/shell-components/models/import-configuration-model.d.ts +3 -0
  231. package/lib/shell-components/models/initialStatusofUsers.d.ts +5 -0
  232. package/lib/shell-components/models/invoiceOutput-model.d.ts +9 -0
  233. package/lib/shell-components/models/leaveApplicationNotifiction.d.ts +7 -0
  234. package/lib/shell-components/models/multiChartsScheduling.d.ts +9 -0
  235. package/lib/shell-components/models/parkUserStoryInputModel.d.ts +7 -0
  236. package/lib/shell-components/models/project.d.ts +28 -0
  237. package/lib/shell-components/models/recentSearchApiModel.d.ts +6 -0
  238. package/lib/shell-components/models/searchCriteriaInputModelBase.d.ts +10 -0
  239. package/lib/shell-components/models/shellModulesInfo.d.ts +16 -0
  240. package/lib/shell-components/models/softlabels-model.d.ts +66 -0
  241. package/lib/shell-components/models/sprintReplanRequestedModel.d.ts +7 -0
  242. package/lib/shell-components/models/sprintStartedNotificationModel.d.ts +7 -0
  243. package/lib/shell-components/models/store-model.d.ts +13 -0
  244. package/lib/shell-components/models/store-search-model.d.ts +7 -0
  245. package/lib/shell-components/models/themes.model.d.ts +9 -0
  246. package/lib/shell-components/models/timesheetenabledisable.d.ts +16 -0
  247. package/lib/shell-components/models/user.d.ts +40 -0
  248. package/lib/shell-components/models/userStory.d.ts +188 -0
  249. package/lib/shell-components/models/userStoryCommentNotificationModel.d.ts +6 -0
  250. package/lib/shell-components/models/userStoryUpdateNotificationModel.d.ts +6 -0
  251. package/lib/shell-components/models/userstory-custom-fields.model.d.ts +6 -0
  252. package/lib/shell-components/models/validation.model.d.ts +5 -0
  253. package/lib/shell-components/models/widgetlist.d.ts +28 -0
  254. package/lib/shell-components/models/workspaceList.d.ts +19 -0
  255. package/lib/shell-components/services/authentication.service.d.ts +18 -0
  256. package/lib/shell-components/services/chat.service.d.ts +16 -0
  257. package/lib/shell-components/services/common-used.service.d.ts +45 -0
  258. package/lib/shell-components/services/feature.service.d.ts +19 -0
  259. package/lib/shell-components/services/google-analytics.service.d.ts +9 -0
  260. package/lib/shell-components/services/layout.service.d.ts +23 -0
  261. package/lib/shell-components/services/payment.service.d.ts +19 -0
  262. package/lib/shell-components/services/recentSearch.service.d.ts +16 -0
  263. package/lib/shell-components/services/shell.modules.service.d.ts +9 -0
  264. package/lib/shell-components/services/signalr.service.d.ts +25 -0
  265. package/lib/shell-components/services/theme.service.d.ts +14 -0
  266. package/lib/shell-components/shell.module.d.ts +117 -0
  267. package/lib/shell-components/shell.routing.d.ts +2 -0
  268. package/lib/shell-components/store/actions/authentication.actions.d.ts +327 -0
  269. package/lib/shell-components/store/actions/chat.actions.d.ts +399 -0
  270. package/lib/shell-components/store/actions/menuitems.actions.d.ts +51 -0
  271. package/lib/shell-components/store/actions/notification-validator.action.d.ts +25 -0
  272. package/lib/shell-components/store/actions/notifications.actions.d.ts +116 -0
  273. package/lib/shell-components/store/effects/authentication.effects.d.ts +54 -0
  274. package/lib/shell-components/store/effects/chat.effects.d.ts +30 -0
  275. package/lib/shell-components/store/effects/index.d.ts +1 -0
  276. package/lib/shell-components/store/effects/menuitems.effects.d.ts +17 -0
  277. package/lib/shell-components/store/effects/notification-validator.effects.d.ts +21 -0
  278. package/lib/shell-components/store/effects/notifications.effects.d.ts +23 -0
  279. package/lib/shell-components/store/reducers/authentication.reducers.d.ts +30 -0
  280. package/lib/shell-components/store/reducers/chat.reducers.d.ts +17 -0
  281. package/lib/shell-components/store/reducers/index.d.ts +59 -0
  282. package/lib/shell-components/store/reducers/menuitems.reducers.d.ts +11 -0
  283. package/lib/shell-components/store/reducers/notification-validator.reducers.d.ts +5 -0
  284. package/lib/shell-components/store/reducers/notifications.reducers.d.ts +10 -0
  285. package/package.json +22 -0
  286. package/public-api.d.ts +80 -0
  287. package/store/reducers/index.d.ts +24 -0
  288. package/thetradeengineorg1-snova-shell-module.d.ts +5 -0
@@ -0,0 +1,1642 @@
1
+ import { __awaiter } from "tslib";
2
+ import { FetchTimeSheetButtonDetails, RolesFetchTriggered } from './../../store/actions/authentication.actions';
3
+ import { Component, Inject, Input, ViewChild, Output, EventEmitter, ViewChildren } from "@angular/core";
4
+ import { ReceiveMessageTriggered, PresenceEventTriggered, InitalStateOfUsersTriggered, MessageActionTypes, ReceiveChannelUpdateModelTriggered, ReceiveSignalTriggered, } from "../../store/actions/chat.actions";
5
+ import { select } from "@ngrx/store";
6
+ import { Subject } from "rxjs";
7
+ import { takeUntil, tap } from "rxjs/operators";
8
+ import { GetUserStoreIdTriggered, AuthenticationActionTypes } from "../../store/actions/authentication.actions";
9
+ import { ClearAllUnreadNotificationsTriggered, ClearUnreadNotificationsTriggered, NewNotificationReceived, NotificationsActionTypes, UpsertUnreadNotificationsTriggered } from "../../store/actions/notifications.actions";
10
+ import * as sharedModuleReducers from "../../store/reducers/index";
11
+ import '../../../globaldependencies/helpers/fontawesome-icons';
12
+ import { ConfirmationDialogComponent } from "../confirmation-dialog/confirmation-dialog.component";
13
+ import { ofType } from "@ngrx/effects";
14
+ import { LocalStorageProperties } from '../../../globaldependencies/constants/localstorage-properties';
15
+ import { ChannelNames } from '../../constants/channel-names';
16
+ import { WINDOW } from '../../../globaldependencies/helpers/window.helper';
17
+ import { CustomAppBaseComponent } from '../../../globaldependencies/components/componentbase';
18
+ import { AppNotification } from '../../models/AppNotification';
19
+ import { StoreSearchModel } from '../../models/store-search-model';
20
+ import { WorkItemsDialogComponent } from '../all-work-items-dialog/all-work-items-dialog.component';
21
+ import { FeedTimeDialogComponent } from '../feed-time/feed-time-dialog.component';
22
+ import { NotificationTypeIds } from '../../constants/notification-type-ids';
23
+ import { UserStoryAssignedNotification } from '../../models/UserStoryAssignedNotification';
24
+ import { ChannelRoutes } from '../../constants/notification-routes';
25
+ import { RoleUpdatedNotification } from '../../models/RoleUpdatedNotification';
26
+ import { ReportSubmittedNotification } from '../../models/ReportSubmittedNotification';
27
+ import { ReportConfigAssignedNotification } from '../../models/ReportConfigAssignedNotification';
28
+ import { MultipleChartsScheduling } from '../../models/multiChartsScheduling';
29
+ import { AssetAssignedNotification } from '../../models/AssetAssignedNotificationModel';
30
+ import { NewProjectCreatedNotificationModel } from '../../models/NewProjectCreatedNotificationModel';
31
+ import { GoalApprovedNotificationModel } from '../../models/goalApprovedNotificationModel';
32
+ import { UserStoryUpdateNotificationModel } from '../../models/userStoryUpdateNotificationModel';
33
+ import { UserStoryCommentNotificationModel } from '../../models/userStoryCommentNotificationModel';
34
+ import { SprintStartedNotificationModel } from '../../models/sprintStartedNotificationModel';
35
+ import { SprintReplanStartedNotificationModel } from '../../models/sprintReplanRequestedModel';
36
+ import { animate, style, transition, trigger } from '@angular/animations';
37
+ import { SPINNER } from 'ngx-ui-loader';
38
+ import { NewProjectFeatureCreatedNotificationModel } from '../../models/NewProjectFeatureNotificationModel';
39
+ import { UserStoryArchiveNotificationModel } from '../../models/archiveUserStoryModel';
40
+ import { UserStoryParkNotificationModel } from '../../models/parkUserStoryInputModel';
41
+ import { ExportConfigurationDialogComponent } from '../export-import-configuration/export-configuration.component';
42
+ import { FileResultModel } from '@snovasys/snova-document-management';
43
+ // import { ConstantVariables } from "../constants/constant-variables";
44
+ import Resumable from "resumablejs";
45
+ import { ApiUrls } from '../../constants/api-urls';
46
+ import { AvailableLangs } from '../../constants/available-languages';
47
+ import { ImportConfigurationModel } from '../../models/import-configuration-model';
48
+ import { MessageTypingDetails } from '../../models/MessageTypingDetails';
49
+ import { IntroModel } from "../../models/IntroModel";
50
+ import { LeaveApplicationNotification } from '../../models/leaveApplicationNotifiction';
51
+ import * as i0 from "@angular/core";
52
+ import * as i1 from "ng-push-ivy";
53
+ import * as i2 from "../../services/theme.service";
54
+ import * as i3 from "ngx-ui-loader";
55
+ import * as i4 from "../../services/layout.service";
56
+ import * as i5 from "@ngx-translate/core";
57
+ import * as i6 from "@angular/router";
58
+ import * as i7 from "ngx-cookie-service";
59
+ import * as i8 from "@angular/material/dialog";
60
+ import * as i9 from "../../services/common-used.service";
61
+ import * as i10 from "@ngrx/store";
62
+ import * as i11 from "pubnub-angular2";
63
+ import * as i12 from "../../services/authentication.service";
64
+ import * as i13 from "@ngrx/effects";
65
+ import * as i14 from "ngx-toastr";
66
+ import * as i15 from "@snovasys/snova-document-management";
67
+ import * as i16 from "../../services/shell.modules.service";
68
+ import * as i17 from "../../services/chat.service";
69
+ import * as i18 from "../../services/signalr.service";
70
+ import * as i19 from "@angular/material/toolbar";
71
+ import * as i20 from "../menu/menu.component";
72
+ import * as i21 from "@angular/material/select";
73
+ import * as i22 from "@snovasys/snova-avatar";
74
+ import * as i23 from "@angular/material/form-field";
75
+ import * as i24 from "@angular/material/icon";
76
+ import * as i25 from "@angular/material/core";
77
+ import * as i26 from "@angular/material/button";
78
+ import * as i27 from "@angular/material/menu";
79
+ import * as i28 from "../notifications/notifications.component";
80
+ import * as i29 from "@ncstate/sat-popover";
81
+ import * as i30 from "../feed-time/feed-time.component";
82
+ import * as i31 from "@angular/material/divider";
83
+ import * as i32 from "../submit-feedback/submit-feedback.component";
84
+ import * as i33 from "@angular/material/list";
85
+ import * as i34 from "@angular/material/card";
86
+ import * as i35 from "@fortawesome/angular-fontawesome";
87
+ import * as i36 from "ngx-dropzone";
88
+ import * as i37 from "@angular/material/progress-bar";
89
+ import * as i38 from "../notifications/announcement-dialog.component";
90
+ import * as i39 from "@angular/flex-layout/flex";
91
+ import * as i40 from "@angular/flex-layout/extended";
92
+ import * as i41 from "@angular/common";
93
+ import * as i42 from "@angular/forms";
94
+ import * as i43 from "@angular/material/tooltip";
95
+ import * as i44 from "@angular/material/input";
96
+ import * as i45 from "../../../globaldependencies/pipes/removeSpecialCharacters.pipe";
97
+ import * as i46 from "../../../globaldependencies/pipes/fetchSizedAndCachedImage.pipe";
98
+ import * as i47 from "../../../globaldependencies/pipes/softlabels.pipes";
99
+ /** @dynamic */
100
+ export class HeaderSideComponent extends CustomAppBaseComponent {
101
+ constructor(pushNotifications, themeService, ngxService, layout, translate, router, cookieService, dialog, commonService, store, pubnub, authService, actionUpdates$, cdRef, toastr, storeManagementService, ShellModulesService, chatService, signalr, window) {
102
+ super();
103
+ this.pushNotifications = pushNotifications;
104
+ this.themeService = themeService;
105
+ this.ngxService = ngxService;
106
+ this.layout = layout;
107
+ this.translate = translate;
108
+ this.router = router;
109
+ this.cookieService = cookieService;
110
+ this.dialog = dialog;
111
+ this.commonService = commonService;
112
+ this.store = store;
113
+ this.pubnub = pubnub;
114
+ this.authService = authService;
115
+ this.actionUpdates$ = actionUpdates$;
116
+ this.cdRef = cdRef;
117
+ this.toastr = toastr;
118
+ this.storeManagementService = storeManagementService;
119
+ this.ShellModulesService = ShellModulesService;
120
+ this.chatService = chatService;
121
+ this.signalr = signalr;
122
+ this.window = window;
123
+ this.opened = new EventEmitter();
124
+ this.spinnerType = SPINNER.circle;
125
+ this.availableLangs = AvailableLangs.languages;
126
+ this.availableLangsMobile = [
127
+ {
128
+ name: "En",
129
+ code: "en"
130
+ },
131
+ {
132
+ name: "Te",
133
+ code: "te"
134
+ },
135
+ {
136
+ name: "Ko",
137
+ code: "ko"
138
+ },
139
+ {
140
+ name: "Ar",
141
+ code: "ar"
142
+ }
143
+ ];
144
+ this.ngDestroyed$ = new Subject();
145
+ this.dashboardFilters = {
146
+ projectId: null,
147
+ userId: null,
148
+ goalId: null,
149
+ isDailogue: true
150
+ };
151
+ this.timePunchCardShow = false;
152
+ this.showTrailPeriod = false;
153
+ this.companiesList = [];
154
+ this.selectedStoreId = "";
155
+ this.isRecording = false;
156
+ this.projectRoleText = 'Project role configuration';
157
+ this.loggedInUserId = "";
158
+ this.showDeleteIcon = false;
159
+ this.showDelete = false;
160
+ this.isStoreAccess = true;
161
+ this.files = [];
162
+ this.moduleTypeId = 9;
163
+ this.fileIndex = 0;
164
+ this.fileCounter = 1;
165
+ this.uploadedFileNames = [];
166
+ this.isFileUploadCompleted = false;
167
+ this.isFolderUploadCompleted = false;
168
+ this.searchText = null;
169
+ this.logInUserId = this.cookieService.get("CurrentUserId");
170
+ this.newNotificationsCount = 0;
171
+ // this.signalr.initializeSignalRConnection();
172
+ this.signalr.notifications$.subscribe((data) => this.newNotificationsCount = data && data.length ? data.length : 0);
173
+ this.pushNotifications.requestPermission();
174
+ this.isRecording = false;
175
+ // this.getActTrackerRecorder();
176
+ if ((localStorage.getItem(LocalStorageProperties.UserModel) != null && localStorage.getItem(LocalStorageProperties.UserModel) != undefined)) {
177
+ this.loadNotifications();
178
+ }
179
+ let currentCulture = this.cookieService.get(LocalStorageProperties.CurrentCulture);
180
+ const companylan = JSON.parse(this.cookieService.get(LocalStorageProperties.CompanyDetails));
181
+ let currentCulturelan = companylan.lanCode;
182
+ if (currentCulture == '' || currentCulture == null || currentCulture == undefined || currentCulture === 'null' || currentCulture === 'undefined') {
183
+ if (currentCulturelan == '' || currentCulturelan == null || currentCulturelan == undefined || currentCulturelan === 'null' || currentCulturelan === 'undefined') {
184
+ currentCulture = 'en';
185
+ }
186
+ else {
187
+ currentCulture = currentCulturelan;
188
+ }
189
+ }
190
+ this.currentLang = currentCulture;
191
+ let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
192
+ this.cookieService.set(LocalStorageProperties.CurrentCulture, this.currentLang, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
193
+ this.actionUpdates$
194
+ .pipe(takeUntil(this.ngDestroyed$), ofType(AuthenticationActionTypes.UserDetailsFetchedAfterCompanyLogin), tap(() => {
195
+ this.reload = true;
196
+ // this.chatService.getRecentChannelMessages().subscribe((recentChannelMessages: any) => {
197
+ // recentChannelMessages.data.forEach(element => {
198
+ // this.messagesUnreadCount += element.unreadMessageCount;
199
+ // });
200
+ // });
201
+ // this.chatService.getRecentIndividualMessages().subscribe((recentColleagueMessages: any) => {
202
+ // var uniq = {};
203
+ // recentColleagueMessages.data = recentColleagueMessages.data.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true));
204
+ // recentColleagueMessages.data.forEach(element => {
205
+ // if(element.id != this.loggedInUserId){
206
+ // this.messagesUnreadCount += element.unreadMessageCount;
207
+ // }
208
+ // });
209
+ // });
210
+ this.getIntroDetails();
211
+ this.ngOnInit();
212
+ this.getNotifications();
213
+ this.getTeamMembers();
214
+ var DefaultDashboardIdForLoggedInUser = this.cookieService.check(LocalStorageProperties.DefaultDashboard) ? JSON.parse(this.cookieService.get(LocalStorageProperties.DefaultDashboard)) : null;
215
+ const userReference = localStorage.getItem(LocalStorageProperties.UserReferenceId);
216
+ if (!DefaultDashboardIdForLoggedInUser) {
217
+ this.router.navigate([this.returnUrl]);
218
+ }
219
+ else if (userReference != "null" && userReference != null) {
220
+ this.router.navigateByUrl("dashboard-management/dashboard/" + DefaultDashboardIdForLoggedInUser + "/form/" + userReference);
221
+ }
222
+ else {
223
+ this.router.navigateByUrl("dashboard-management/dashboard/" + DefaultDashboardIdForLoggedInUser);
224
+ }
225
+ }))
226
+ .subscribe();
227
+ this.actionUpdates$
228
+ .pipe(takeUntil(this.ngDestroyed$), ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), tap(() => {
229
+ setTimeout(() => {
230
+ if (this.cookieService.check(LocalStorageProperties.CurrentUserId)) {
231
+ const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
232
+ // Subscribe to Task Assignment Notificaitons here.
233
+ const taskAssignmentChannelToSubscribeInto = ChannelNames.Channel_TaskAssignments + CurrentUserId;
234
+ const tastatusReportSubmissionChannelToSubscribeInto = ChannelNames.Channel_StatusReportSubmission + CurrentUserId;
235
+ const tastatusConfigAssignChannelToSubscribeInto = ChannelNames.Channel_StatusConfigAssign + CurrentUserId;
236
+ const multiChartsSchedulingChannelToSubscribeInto = ChannelNames.Channel_MultiChartsScheduling + CurrentUserId;
237
+ const assetsAssignedChannelToSubscribeInto = ChannelNames.Channel_AssetAssignment + CurrentUserId;
238
+ const projectCreatedChannelToSubscribeInto = ChannelNames.Channel_NewProject + CurrentUserId;
239
+ const projectAccessToMemberChannelToSubscribeInto = ChannelNames.Channel_ProjectMemberRole + CurrentUserId;
240
+ const goalApprovedChannelToSubscribeInto = ChannelNames.Channel_GoalApprovedFromReplan + CurrentUserId;
241
+ const userStoryUpdateChannelToSubscribeInto = ChannelNames.Channel_UserStoryUpdateNotification + CurrentUserId;
242
+ const AnnouncementChannelToSubscribeInto = ChannelNames.Channel_AnnouncementNotification + CurrentUserId;
243
+ const purchaseExecutionAssignedChannelToSubscribeInto = ChannelNames.Channel_PurchaseExecutionAssignToEmployeeNotification + CurrentUserId;
244
+ console.log("subscribing to " + taskAssignmentChannelToSubscribeInto);
245
+ console.log("subscribing to " + tastatusReportSubmissionChannelToSubscribeInto);
246
+ console.log("subscribing to " + tastatusConfigAssignChannelToSubscribeInto);
247
+ console.log("subscribing to" + assetsAssignedChannelToSubscribeInto);
248
+ console.log("subscribing to" + projectCreatedChannelToSubscribeInto);
249
+ console.log("subscribing to" + projectAccessToMemberChannelToSubscribeInto);
250
+ console.log("subscribing to" + goalApprovedChannelToSubscribeInto);
251
+ console.log("subscribing to" + userStoryUpdateChannelToSubscribeInto);
252
+ console.log("subscribing to" + AnnouncementChannelToSubscribeInto);
253
+ console.log("subscribing to" + purchaseExecutionAssignedChannelToSubscribeInto);
254
+ pubnub.subscribe({
255
+ channels: [taskAssignmentChannelToSubscribeInto, tastatusReportSubmissionChannelToSubscribeInto,
256
+ tastatusConfigAssignChannelToSubscribeInto, multiChartsSchedulingChannelToSubscribeInto,
257
+ assetsAssignedChannelToSubscribeInto, projectCreatedChannelToSubscribeInto, ,
258
+ projectAccessToMemberChannelToSubscribeInto, goalApprovedChannelToSubscribeInto,
259
+ userStoryUpdateChannelToSubscribeInto, AnnouncementChannelToSubscribeInto, purchaseExecutionAssignedChannelToSubscribeInto]
260
+ });
261
+ // Add other subscriptions here.
262
+ }
263
+ else {
264
+ console.log("User not logged in yet to be able to subscribe.");
265
+ }
266
+ var roleUpdatesChannelToSubscribeInto = ChannelNames.Channel_RoleUpdates + "19B6F9FC-7370-4B9C-A05C-3B8D819EEEAF";
267
+ console.log("subscribing to " + roleUpdatesChannelToSubscribeInto);
268
+ pubnub.subscribe({
269
+ channels: [roleUpdatesChannelToSubscribeInto]
270
+ });
271
+ }, 3000);
272
+ })).subscribe();
273
+ this.actionUpdates$
274
+ .pipe(takeUntil(this.ngDestroyed$), ofType(NotificationsActionTypes.ClearAllUnreadNotificationsCompleted), tap(() => {
275
+ this.notifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationAll));
276
+ this.notifications$.subscribe(x => {
277
+ this.notifications = x;
278
+ const index = this.notifications.findIndex((p) => JSON.parse(p.notificationJson).NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Announcement_Received.toString().toLowerCase());
279
+ if (index > -1) {
280
+ //this.announceNotificationId = JSON.parse(this.notifications[index].notificationJson).notificationId;
281
+ this.announceNotificationId = this.notifications[index].notificationId;
282
+ this.openAnnouncementDialog(JSON.parse(this.notifications[index].notificationJson));
283
+ }
284
+ });
285
+ }))
286
+ .subscribe();
287
+ // this.actionUpdates$
288
+ // .pipe(
289
+ // takeUntil(this.ngDestroyed$),
290
+ // ofType(MessageActionTypes.CountCompleted),
291
+ // tap((result: any) => {
292
+ // this.messagesUnreadCount = result.messageCount;
293
+ // this.cdRef.detectChanges();
294
+ // })
295
+ // )
296
+ // .subscribe();
297
+ this.actionUpdates$
298
+ .pipe(takeUntil(this.ngDestroyed$), ofType(MessageActionTypes.RequestingStateOfUsersCompleted), tap((result) => {
299
+ this.subScribingToPresenceChannel();
300
+ }))
301
+ .subscribe();
302
+ this.actionUpdates$
303
+ .pipe(takeUntil(this.ngDestroyed$), ofType(MessageActionTypes.MessageCompleted), tap((result) => {
304
+ var messageDetails = result['messageDetails'];
305
+ this.publishingMessageOfUser = messageDetails;
306
+ this.publishingMessage();
307
+ }))
308
+ .subscribe();
309
+ this.actionUpdates$
310
+ .pipe(takeUntil(this.ngDestroyed$), ofType(MessageActionTypes.SendChannelUpdateModelCompleted), tap((result) => {
311
+ var channelUpdateModel = result['channelUpdateModel'];
312
+ var loginCompanyId = this.cookieService.get("CompanyId");
313
+ this.pubnub.publish({
314
+ channel: [(loginCompanyId + '-' + channelUpdateModel.channelId)],
315
+ message: JSON.stringify(channelUpdateModel)
316
+ }, function (status, resopnse) {
317
+ // console.log(status)
318
+ // console.log(resopnse)
319
+ });
320
+ }))
321
+ .subscribe();
322
+ this.actionUpdates$
323
+ .pipe(takeUntil(this.ngDestroyed$), ofType(MessageActionTypes.SendingSignalCompleted), tap((result) => {
324
+ var messageTypingDetails = result.messageTypingDetails;
325
+ var signalMessage = new MessageTypingDetails();
326
+ signalMessage.state = messageTypingDetails.state;
327
+ console.log(messageTypingDetails, signalMessage);
328
+ // this.pubnub.signal({
329
+ // channel:[messageTypingDetails.pubnubChannelNameOfMessage],
330
+ // message : JSON.stringify(signalMessage)
331
+ // })
332
+ }))
333
+ .subscribe();
334
+ const storeListner = (message) => {
335
+ console.log("---------Received pubnub message---------");
336
+ //this.toastr.info(message.message.Summary);
337
+ try {
338
+ //Receiving the User Story Assigned Notification
339
+ if (typeof (message.message) == 'string') {
340
+ var indexOfCurrentTopic;
341
+ var messageDetailsObject = JSON.parse(message.message);
342
+ if (messageDetailsObject.textMessage || messageDetailsObject.filePath || messageDetailsObject.messageType) {
343
+ this.store.dispatch(new ReceiveMessageTriggered(messageDetailsObject));
344
+ }
345
+ else if (messageDetailsObject.isFromChannelArchive == true ||
346
+ messageDetailsObject.isFromRemoveMember == true ||
347
+ messageDetailsObject.refreshChannels == true || messageDetailsObject.isFromAddMember == true) {
348
+ this.chatService.getUserChannels().subscribe((channels) => {
349
+ this.channelList = channels.data;
350
+ var loginCompanyId = this.cookieService.get("CompanyId");
351
+ var channelName = loginCompanyId + '-' + messageDetailsObject.channelId;
352
+ var index = this.channelList.findIndex(x => x.id == messageDetailsObject.channelId);
353
+ if (index != -1 && (messageDetailsObject.refreshChannels == true || messageDetailsObject.isFromAddMember == true)) {
354
+ this.pubnub.subscribe({
355
+ channels: [channelName]
356
+ });
357
+ }
358
+ else {
359
+ if (index == -1) {
360
+ this.pubnub.unsubscribe({
361
+ channels: [channelName]
362
+ });
363
+ }
364
+ }
365
+ this.store.dispatch(new ReceiveChannelUpdateModelTriggered(messageDetailsObject));
366
+ });
367
+ }
368
+ if (this.router.routerState.snapshot.url != "/chat" && messageDetailsObject.messageType != "Reaction" && messageDetailsObject.body != null && messageDetailsObject.title != null && (messageDetailsObject.isPinned == null || messageDetailsObject.isPinned == undefined) && (messageDetailsObject.isStarred == null || messageDetailsObject.isStarred == undefined) && messageDetailsObject.senderUserId != this.logInUserId) {
369
+ if (messageDetailsObject.channelId) {
370
+ this.chatService.getUserChannels().subscribe((channels) => {
371
+ this.channelList = channels.data;
372
+ indexOfCurrentTopic = this.channelList.findIndex(x => x.id == messageDetailsObject.channelId);
373
+ if (indexOfCurrentTopic != -1) {
374
+ // this.notificationOfChat(messageDetailsObject);
375
+ }
376
+ });
377
+ }
378
+ else {
379
+ // this.notificationOfChat(messageDetailsObject);
380
+ }
381
+ }
382
+ }
383
+ else if (message.message.NotificationTypeGuid == NotificationTypeIds.Notification_WorkItemAssignedToUser) {
384
+ var userStoryAssignedNotification = new UserStoryAssignedNotification();
385
+ userStoryAssignedNotification.loadFromCaseInsensitiveObject(message.message);
386
+ userStoryAssignedNotification.route = ChannelRoutes.ViewWorkItem + userStoryAssignedNotification.notificationId;
387
+ this.store.dispatch(new NewNotificationReceived(userStoryAssignedNotification));
388
+ }
389
+ else if (message.message.NotificationTypeGuid == NotificationTypeIds.GenericNotificationActivity) {
390
+ var userStoryAssignedNotification = new UserStoryAssignedNotification();
391
+ userStoryAssignedNotification.loadFromCaseInsensitiveObject(message.message);
392
+ // userStoryAssignedNotification.route = ChannelRoutes.ViewWorkItem + userStoryAssignedNotification.notificationId;
393
+ this.store.dispatch(new NewNotificationReceived(userStoryAssignedNotification));
394
+ }
395
+ else if (message.message.NotificationTypeGuid == NotificationTypeIds.Notification_RoleUpdated) {
396
+ var roleUpdatedNotification = new RoleUpdatedNotification();
397
+ roleUpdatedNotification.loadFromCaseInsensitiveObject(message.message);
398
+ roleUpdatedNotification.route = ChannelRoutes.ViewAccount;
399
+ this.store.dispatch(new NewNotificationReceived(roleUpdatedNotification));
400
+ this.store.dispatch(new RolesFetchTriggered());
401
+ }
402
+ else if (message.message.NotificationTypeGuid == NotificationTypeIds.Status_Report_Sumitted) {
403
+ var reportSubmittedNotification = new ReportSubmittedNotification();
404
+ reportSubmittedNotification.loadFromCaseInsensitiveObject(message.message);
405
+ reportSubmittedNotification.route = ChannelRoutes.ViewAccount;
406
+ this.store.dispatch(new NewNotificationReceived(reportSubmittedNotification));
407
+ this.store.dispatch(new RolesFetchTriggered());
408
+ }
409
+ else if (message.message.NotificationTypeGuid == NotificationTypeIds.Status_Report_Config_Created) {
410
+ var reportConfigAssignedNotification = new ReportConfigAssignedNotification();
411
+ reportConfigAssignedNotification.loadFromCaseInsensitiveObject(message.message);
412
+ reportConfigAssignedNotification.route = ChannelRoutes.ViewAccount;
413
+ this.store.dispatch(new NewNotificationReceived(reportConfigAssignedNotification));
414
+ this.store.dispatch(new RolesFetchTriggered());
415
+ }
416
+ else if (message.message.NotificationTypeGuid == NotificationTypeIds.Multiple_Charts_Scheduling_created) {
417
+ var multipleChartsScheduling = new MultipleChartsScheduling();
418
+ multipleChartsScheduling.loadFromCaseInsensitiveObject(message.message);
419
+ multipleChartsScheduling.route = ChannelRoutes.ViewAccount;
420
+ this.store.dispatch(new NewNotificationReceived(multipleChartsScheduling));
421
+ this.store.dispatch(new RolesFetchTriggered());
422
+ }
423
+ else if (message.message.NotificationTypeGuid == NotificationTypeIds.Assets_Assignment) {
424
+ const assetAssignedNotification = new AssetAssignedNotification();
425
+ assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
426
+ assetAssignedNotification.route = ChannelRoutes.ViewAccount;
427
+ this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
428
+ this.store.dispatch(new RolesFetchTriggered());
429
+ }
430
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Reminder_Notification.toString().toLowerCase()) {
431
+ const assetAssignedNotification = new AssetAssignedNotification();
432
+ assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
433
+ assetAssignedNotification.route = ChannelRoutes.ViewAccount;
434
+ this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
435
+ this.store.dispatch(new RolesFetchTriggered());
436
+ }
437
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Announcement_Received.toString().toLowerCase()) {
438
+ const assetAssignedNotification = new AssetAssignedNotification();
439
+ assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
440
+ assetAssignedNotification.route = ChannelRoutes.ViewAccount;
441
+ this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
442
+ this.store.dispatch(new RolesFetchTriggered());
443
+ // if (message.message.Id != this.announceNotificationId) {
444
+ // this.announceNotificationId = message.message.Id;
445
+ // this.openAnnouncementDialog(message.message);
446
+ // }
447
+ }
448
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Performance_Received.toString().toLowerCase() || message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
449
+ const newProjectCreatedNotification = new NewProjectCreatedNotificationModel();
450
+ newProjectCreatedNotification.loadFromCaseInsensitiveObject(message.message);
451
+ newProjectCreatedNotification.route = ChannelRoutes.ViewAccount;
452
+ this.store.dispatch(new NewNotificationReceived(newProjectCreatedNotification));
453
+ this.store.dispatch(new RolesFetchTriggered());
454
+ }
455
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.NewProjectCreatedNotificationId.toString().toLowerCase() || message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
456
+ const newProjectCreatedNotification = new NewProjectCreatedNotificationModel();
457
+ newProjectCreatedNotification.loadFromCaseInsensitiveObject(message.message);
458
+ newProjectCreatedNotification.route = ChannelRoutes.ViewAccount;
459
+ this.store.dispatch(new NewNotificationReceived(newProjectCreatedNotification));
460
+ this.store.dispatch(new RolesFetchTriggered());
461
+ }
462
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.GoalApprovedFromReplan.toString().toLowerCase()) {
463
+ const goalApprovedNotificationModel = new GoalApprovedNotificationModel();
464
+ goalApprovedNotificationModel.loadFromCaseInsensitiveObject(message.message);
465
+ goalApprovedNotificationModel.route = ChannelRoutes.ViewAccount;
466
+ this.store.dispatch(new NewNotificationReceived(goalApprovedNotificationModel));
467
+ this.store.dispatch(new RolesFetchTriggered());
468
+ }
469
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.USerStoryUpdateNotificationId.toString().toLowerCase()) {
470
+ const userStoryUpdateNotificationModel = new UserStoryUpdateNotificationModel();
471
+ userStoryUpdateNotificationModel.loadFromCaseInsensitiveObject(message.message);
472
+ userStoryUpdateNotificationModel.route = ChannelRoutes.ViewAccount;
473
+ this.store.dispatch(new NewNotificationReceived(userStoryUpdateNotificationModel));
474
+ this.store.dispatch(new RolesFetchTriggered());
475
+ }
476
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.PushNotificationForUserStoryComment.toString().toLowerCase()) {
477
+ const userStoryCommentNotificationModel = new UserStoryCommentNotificationModel();
478
+ userStoryCommentNotificationModel.loadFromCaseInsensitiveObject(message.message);
479
+ userStoryCommentNotificationModel.route = ChannelRoutes.ViewAccount;
480
+ this.store.dispatch(new NewNotificationReceived(userStoryCommentNotificationModel));
481
+ this.store.dispatch(new RolesFetchTriggered());
482
+ }
483
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.SprintStarted.toString().toLowerCase()) {
484
+ const sprintStartedNotificationModel = new SprintStartedNotificationModel();
485
+ sprintStartedNotificationModel.loadFromCaseInsensitiveObject(message.message);
486
+ sprintStartedNotificationModel.route = ChannelRoutes.ViewAccount;
487
+ this.store.dispatch(new NewNotificationReceived(sprintStartedNotificationModel));
488
+ this.store.dispatch(new RolesFetchTriggered());
489
+ }
490
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.SprintRequestdForREplan.toString().toLowerCase()) {
491
+ const sprintReplanStartedNotificationModel = new SprintReplanStartedNotificationModel();
492
+ sprintReplanStartedNotificationModel.loadFromCaseInsensitiveObject(message.message);
493
+ sprintReplanStartedNotificationModel.route = ChannelRoutes.ViewAccount;
494
+ this.store.dispatch(new NewNotificationReceived(sprintReplanStartedNotificationModel));
495
+ this.store.dispatch(new RolesFetchTriggered());
496
+ }
497
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectFeature.toString().toLowerCase()) {
498
+ const newProjectFeatureCreatedNotification = new NewProjectFeatureCreatedNotificationModel();
499
+ newProjectFeatureCreatedNotification.loadFromCaseInsensitiveObject(message.message);
500
+ newProjectFeatureCreatedNotification.route = ChannelRoutes.ViewAccount;
501
+ this.store.dispatch(new NewNotificationReceived(newProjectFeatureCreatedNotification));
502
+ this.store.dispatch(new RolesFetchTriggered());
503
+ }
504
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.UserStoryArchive.toString().toLowerCase()) {
505
+ const newUserStoryArchiveModel = new UserStoryArchiveNotificationModel();
506
+ newUserStoryArchiveModel.loadFromCaseInsensitiveObject(message.message);
507
+ newUserStoryArchiveModel.route = ChannelRoutes.ViewAccount;
508
+ this.store.dispatch(new NewNotificationReceived(newUserStoryArchiveModel));
509
+ this.store.dispatch(new RolesFetchTriggered());
510
+ }
511
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.UserStoryPark.toString().toLowerCase()) {
512
+ const newUserStoryParkModel = new UserStoryParkNotificationModel();
513
+ newUserStoryParkModel.loadFromCaseInsensitiveObject(message.message);
514
+ newUserStoryParkModel.route = ChannelRoutes.ViewAccount;
515
+ this.store.dispatch(new NewNotificationReceived(newUserStoryParkModel));
516
+ this.store.dispatch(new RolesFetchTriggered());
517
+ }
518
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.LeaveApplication.toString().toLowerCase()) {
519
+ const leaveApplicationNotification = new LeaveApplicationNotification();
520
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
521
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
522
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
523
+ this.store.dispatch(new RolesFetchTriggered());
524
+ }
525
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ApproveLeaveApplication.toString().toLowerCase()) {
526
+ const leaveApplicationNotification = new LeaveApplicationNotification();
527
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
528
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
529
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
530
+ this.store.dispatch(new RolesFetchTriggered());
531
+ }
532
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.RejectLeaveApplication.toString().toLowerCase()) {
533
+ const leaveApplicationNotification = new LeaveApplicationNotification();
534
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
535
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
536
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
537
+ this.store.dispatch(new RolesFetchTriggered());
538
+ }
539
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ResignationNotification.toString().toLowerCase()) {
540
+ const leaveApplicationNotification = new LeaveApplicationNotification();
541
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
542
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
543
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
544
+ this.store.dispatch(new RolesFetchTriggered());
545
+ }
546
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ResignationApprovalNotification.toString().toLowerCase()) {
547
+ const leaveApplicationNotification = new LeaveApplicationNotification();
548
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
549
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
550
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
551
+ this.store.dispatch(new RolesFetchTriggered());
552
+ }
553
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ResignationRejectionNotification.toString().toLowerCase()) {
554
+ const leaveApplicationNotification = new LeaveApplicationNotification();
555
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
556
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
557
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
558
+ this.store.dispatch(new RolesFetchTriggered());
559
+ }
560
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.AutoTimeSheetSubmissionNotification.toString().toLowerCase()) {
561
+ const leaveApplicationNotification = new LeaveApplicationNotification();
562
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
563
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
564
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
565
+ this.store.dispatch(new RolesFetchTriggered());
566
+ }
567
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProbationAssignNotification.toString().toLowerCase()) {
568
+ const leaveApplicationNotification = new LeaveApplicationNotification();
569
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
570
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
571
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
572
+ this.store.dispatch(new RolesFetchTriggered());
573
+ }
574
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ReviewAssignToEmployeeNotification.toString().toLowerCase()) {
575
+ const leaveApplicationNotification = new LeaveApplicationNotification();
576
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
577
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
578
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
579
+ this.store.dispatch(new RolesFetchTriggered());
580
+ }
581
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ReviewSubmittedByEmployeeNotification.toString().toLowerCase()) {
582
+ const leaveApplicationNotification = new LeaveApplicationNotification();
583
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
584
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
585
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
586
+ this.store.dispatch(new RolesFetchTriggered());
587
+ }
588
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ReviewInvitationNotification.toString().toLowerCase()) {
589
+ const leaveApplicationNotification = new LeaveApplicationNotification();
590
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
591
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
592
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
593
+ this.store.dispatch(new RolesFetchTriggered());
594
+ }
595
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.PerformanceReviewSubmittedByEmployeeNotification.toString().toLowerCase()) {
596
+ const leaveApplicationNotification = new LeaveApplicationNotification();
597
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
598
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
599
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
600
+ this.store.dispatch(new RolesFetchTriggered());
601
+ }
602
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.PerformanceReviewInvitationNotificationModel.toString().toLowerCase()) {
603
+ const leaveApplicationNotification = new LeaveApplicationNotification();
604
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
605
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
606
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
607
+ this.store.dispatch(new RolesFetchTriggered());
608
+ }
609
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.PerformanceReviewAssignToEmployeeNotification.toString().toLowerCase()) {
610
+ const leaveApplicationNotification = new LeaveApplicationNotification();
611
+ leaveApplicationNotification.loadFromCaseInsensitiveObject(message.message);
612
+ leaveApplicationNotification.route = ChannelRoutes.ViewAccount;
613
+ this.store.dispatch(new NewNotificationReceived(leaveApplicationNotification));
614
+ this.store.dispatch(new RolesFetchTriggered());
615
+ }
616
+ else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.PurchaseShipmentNotificationId.toString().toLowerCase()) {
617
+ const purchaseExecutionNotification = new LeaveApplicationNotification();
618
+ purchaseExecutionNotification.loadFromCaseInsensitiveObject(message.message);
619
+ purchaseExecutionNotification.route = ChannelRoutes.EditPurchaseExecution;
620
+ this.store.dispatch(new NewNotificationReceived(purchaseExecutionNotification));
621
+ this.store.dispatch(new RolesFetchTriggered());
622
+ }
623
+ else {
624
+ // TODO: Send these errors onto server for further processing
625
+ console.log("Found undetected notification type. " + message.message.NotificationTypeGuid);
626
+ }
627
+ // Add other notifications here.
628
+ }
629
+ catch (exception) {
630
+ // TODO: Send these exceptions onto server for further processing
631
+ console.log("Exception Occured" + exception.message);
632
+ }
633
+ };
634
+ const statusOfUser = (presenceEvent) => {
635
+ this.store.dispatch(new PresenceEventTriggered(presenceEvent));
636
+ };
637
+ const typingStatus = (signalEvent) => {
638
+ this.store.dispatch(new ReceiveSignalTriggered(signalEvent));
639
+ };
640
+ this.chatService.getPubnubKeys().subscribe((keys) => {
641
+ this.pubnub.init({
642
+ publishKey: keys.data.publishKey,
643
+ subscribeKey: keys.data.subscribeKey,
644
+ uuid: this.logInUserId
645
+ });
646
+ this.chatService.getAllUsersForSlackApp().subscribe((colleagues) => {
647
+ this.colleaguesList = colleagues.data;
648
+ this.chatService.getUserChannels().subscribe((channels) => {
649
+ this.channelList = channels.data;
650
+ this.signOutUserChannels();
651
+ var loginCompanyId = this.cookieService.get("CompanyId");
652
+ if (this.channelList != undefined || this.channelList != null) {
653
+ for (var index1 = 0; index1 < this.channelList.length; index1++) {
654
+ this.pubnub.subscribe({
655
+ channels: [(loginCompanyId + '-' + this.channelList[index1].id)]
656
+ });
657
+ }
658
+ }
659
+ this.pubnub.subscribe({
660
+ channels: [('ChannelUpdates-' + loginCompanyId)]
661
+ });
662
+ this.pubnub.subscribe({
663
+ channels: [('UserUpdates-' + loginCompanyId)]
664
+ });
665
+ var index12 = this.colleaguesList.findIndex(x => x.userId == this.logInUserId);
666
+ if (index12 > -1) {
667
+ var name = this.colleaguesList[index12].fullName;
668
+ name = name.trim();
669
+ name = this.replaceAll(name, " ", "");
670
+ this.loginUserchannelName = (name + '-' + this.logInUserId);
671
+ this.pubnub.subscribe({
672
+ channels: [this.loginUserchannelName]
673
+ });
674
+ }
675
+ });
676
+ });
677
+ this.pubnub.addListener({
678
+ status: st => {
679
+ if (st.category === "PNUnknownCategory") {
680
+ var newState = {
681
+ new: "error"
682
+ };
683
+ this.pubnub.setState({
684
+ state: newState
685
+ }
686
+ // function (status) {
687
+ // console.log(st.errorData.message);
688
+ // }
689
+ );
690
+ }
691
+ },
692
+ signal: signalEvent => {
693
+ typingStatus(signalEvent);
694
+ },
695
+ presence: presenceEvent => {
696
+ statusOfUser(presenceEvent);
697
+ },
698
+ message: message => {
699
+ console.log("subscribed to " + message);
700
+ storeListner(message);
701
+ }
702
+ });
703
+ });
704
+ }
705
+ signOutUserChannels() {
706
+ return __awaiter(this, void 0, void 0, function* () {
707
+ this.pubnub.unsubscribe({ channels: [this.loginUserchannelName] });
708
+ var loginCompanyId = this.cookieService.get("CompanyId");
709
+ if (this.channelList != undefined || this.channelList != null) {
710
+ for (var index = 0; index < this.channelList.length; index++) {
711
+ this.pubnub.unsubscribe({
712
+ channels: [(loginCompanyId + '-' + this.channelList[index].id)]
713
+ });
714
+ }
715
+ }
716
+ this.pubnub.unsubscribe({
717
+ channels: [('ChannelUpdates-' + loginCompanyId)]
718
+ });
719
+ this.pubnub.unsubscribe({
720
+ channels: [('UserUpdates-' + loginCompanyId)]
721
+ });
722
+ });
723
+ }
724
+ subScribingToPresenceChannel() {
725
+ return __awaiter(this, void 0, void 0, function* () {
726
+ var loginCompanyId = this.cookieService.get("CompanyId");
727
+ var presenceChannel = "MessengerPresence-" + loginCompanyId;
728
+ yield this.pubnub.subscribe({
729
+ channels: [presenceChannel],
730
+ withPresence: true
731
+ });
732
+ this.pubnub.hereNow({
733
+ channels: [presenceChannel],
734
+ includeUUIDs: true,
735
+ includeState: true
736
+ }, (status, response) => {
737
+ this.store.dispatch(new InitalStateOfUsersTriggered(response));
738
+ });
739
+ });
740
+ }
741
+ publishingMessage() {
742
+ if (this.publishingMessageOfUser.pubnubChannelNameOfMessage.length > 0) {
743
+ this.publishingMessageOfUser.pubnubChannelNameOfMessage.forEach(channelName => {
744
+ this.pubnub.publish({
745
+ channel: [channelName],
746
+ message: JSON.stringify(this.publishingMessageOfUser)
747
+ }, function (status, resopnse) {
748
+ // console.log(status)
749
+ // console.log(resopnse)
750
+ });
751
+ });
752
+ }
753
+ }
754
+ openAnnouncementDialog(announced) {
755
+ this.dialog.closeAll();
756
+ let dialogId = "annoucement-dialog";
757
+ const dialogRef = this.dialog.open(this.openAnnoucementDialogComponent, {
758
+ minWidth: "60vw",
759
+ maxWidth: "60vw",
760
+ minHeight: "50vh",
761
+ maxHeight: "80vh",
762
+ disableClose: true,
763
+ id: dialogId,
764
+ data: {
765
+ dialogId: dialogId,
766
+ announcementId: announced.AnnouncementId,
767
+ announcement: announced.Announcement,
768
+ announcedBy: announced.AnnouncedBy,
769
+ announcedById: announced.AnnouncedById,
770
+ announcedByUserImage: announced.AnnouncedByUserImage,
771
+ announcedOn: announced.AnnouncedOn
772
+ }
773
+ });
774
+ dialogRef.afterClosed().subscribe((result) => {
775
+ const index = this.notifications.findIndex((p) => p.notificationId.toString().toLowerCase() == this.announceNotificationId.toString().toLowerCase());
776
+ if (index > -1) {
777
+ this.upsertReadNotification(this.notifications[index]);
778
+ }
779
+ });
780
+ }
781
+ // notificationOfChat(messageDetailsObject) {
782
+ // if(this.previousMessage != messageDetailsObject){
783
+ // this.messagesUnreadCount += 1;
784
+ // var imageforNotification: any;
785
+ // if (messageDetailsObject.senderProfileImage == null) {
786
+ // imageforNotification = "https://pngimage.net/wp-content/uploads/2018/05/avatar-png-images-1.png";
787
+ // }
788
+ // else {
789
+ // imageforNotification = messageDetailsObject.senderProfileImage;
790
+ // }
791
+ // let options = {
792
+ // body: messageDetailsObject.body,
793
+ // icon: imageforNotification,
794
+ // data: {
795
+ // senderUserId: messageDetailsObject.senderUserId,
796
+ // channelId: messageDetailsObject.channelId
797
+ // }
798
+ // }
799
+ // this.pushNotifications.create(messageDetailsObject.title, options).subscribe(
800
+ // res => {
801
+ // if (res.event.type === 'click') {
802
+ // window.focus();
803
+ // if (this.router.url != '/chat') {
804
+ // if (res.notification.data.channelId != null && res.notification.data.channelId != undefined) {
805
+ // localStorage.setItem(LocalStorageProperties.ChatId, res.notification.data.channelId);
806
+ // } else {
807
+ // localStorage.setItem(LocalStorageProperties.ChatId, res.notification.data.senderUserId);
808
+ // }
809
+ // this.router.navigate(["/chat"]);
810
+ // }
811
+ // }
812
+ // },
813
+ // err => console.log(err)
814
+ // );
815
+ // this.previousMessage = messageDetailsObject
816
+ // }
817
+ // }
818
+ upsertReadNotification(selectedNotification) {
819
+ const notifications = [];
820
+ notifications.push(selectedNotification);
821
+ const notiifcationmodel = JSON.parse(selectedNotification.notificationJson);
822
+ if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
823
+ NotificationTypeIds.NewProjectCreatedNotificationId.toString().toLowerCase() ||
824
+ selectedNotification.notificationTypeId.toString().toLowerCase() ==
825
+ NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
826
+ this.router.navigate(["projects/projectstatus/" + notiifcationmodel.ProjectGuid + "/active-goals"]);
827
+ }
828
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
829
+ NotificationTypeIds.GoalApprovedFromReplan.toString().toLowerCase()) {
830
+ this.router.navigate(["projects/goal/" + notiifcationmodel.GoalGuid]);
831
+ }
832
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
833
+ NotificationTypeIds.Notification_WorkItemAssignedToUser.toString().toLowerCase()) {
834
+ this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryGuid]);
835
+ }
836
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
837
+ NotificationTypeIds.USerStoryUpdateNotificationId.toString().toLowerCase()) {
838
+ this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryId]);
839
+ }
840
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
841
+ NotificationTypeIds.SprintStarted.toString().toLowerCase()) {
842
+ this.router.navigate(["projects/sprint/" + notiifcationmodel.SprintGuid]);
843
+ }
844
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
845
+ NotificationTypeIds.PushNotificationForUserStoryComment.toString().toLowerCase()) {
846
+ this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryGuid]);
847
+ }
848
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
849
+ NotificationTypeIds.GoalRequestdForREplan.toString().toLowerCase()) {
850
+ this.router.navigate(["projects/goal/" + notiifcationmodel.GoalGuid]);
851
+ }
852
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
853
+ NotificationTypeIds.SprintRequestdForREplan.toString().toLowerCase()) {
854
+ this.router.navigate(["projects/sprint/" + notiifcationmodel.SprintGuid]);
855
+ }
856
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
857
+ NotificationTypeIds.Notification_AdhocWorkItemAssignedToUser.toString().toLowerCase()) {
858
+ this.router.navigate(["dashboard/adhoc-workitem/" + notiifcationmodel.UserStoryGuid]);
859
+ }
860
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
861
+ NotificationTypeIds.AdhocUSerStoryUpdateNotificationId.toString().toLowerCase()) {
862
+ this.router.navigate(["dashboard/adhoc-workitem/" + notiifcationmodel.UserStoryId]);
863
+ }
864
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
865
+ NotificationTypeIds.PurchaseShipmentNotificationId.toString().toLowerCase()) {
866
+ this.router.navigate(["client/purchase-execution/" + notiifcationmodel.PurchaseGuid]);
867
+ }
868
+ this.store.dispatch(new UpsertUnreadNotificationsTriggered(notifications));
869
+ }
870
+ loadNotifications() {
871
+ const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
872
+ // Subscribe to Task Assignment Notificaitons here.
873
+ const taskAssignmentChannelToSubscribeInto = ChannelNames.Channel_TaskAssignments + CurrentUserId;
874
+ const tastatusReportSubmissionChannelToSubscribeInto = ChannelNames.Channel_StatusReportSubmission + CurrentUserId;
875
+ const tastatusConfigAssignChannelToSubscribeInto = ChannelNames.Channel_StatusConfigAssign + CurrentUserId;
876
+ const multiChartsSchedulingChannelToSubscribeInto = ChannelNames.Channel_MultiChartsScheduling + CurrentUserId;
877
+ const assetsAssignedChannelToSubscribeInto = ChannelNames.Channel_AssetAssignment + CurrentUserId;
878
+ const projectCreatedChannelToSubscribeInto = ChannelNames.Channel_NewProject + CurrentUserId;
879
+ const projectAccessToMemberChannelToSubscribeInto = ChannelNames.Channel_ProjectMemberRole + CurrentUserId;
880
+ const goalApprovedChannelToSubscribeInto = ChannelNames.Channel_GoalApprovedFromReplan + CurrentUserId;
881
+ const userStoryUpdateChannelToSubscribeInto = ChannelNames.Channel_UserStoryUpdateNotification + CurrentUserId;
882
+ const AnnouncementChannelToSubscribeInto = ChannelNames.Channel_AnnouncementNotification + CurrentUserId;
883
+ const ReminderChannelToSubscribeInto = ChannelNames.Channel_ReminderNotification + CurrentUserId;
884
+ const PerformanceChannelToSubscribeInto = ChannelNames.Channel_PeroformanceNotification + CurrentUserId;
885
+ const userStoryCommentChannelToSubscribeInto = ChannelNames.Channel_UserStoryComment + CurrentUserId;
886
+ const sprintStartedChannelToSubscribeInto = ChannelNames.Channel_SprintStarted + CurrentUserId;
887
+ const sprintReplanChannelToSubscribeInto = ChannelNames.Channel_SprintRequestedToReplan + CurrentUserId;
888
+ const projectFeatureChannelToSubscribeInto = ChannelNames.Channel_ProjectFeature + CurrentUserId;
889
+ const userStoryArchiveChannelToSubscribeInto = ChannelNames.Channel_UserStoryArchive + CurrentUserId;
890
+ const userStoryParkChannelToSubscribeInto = ChannelNames.Channel_UserStoryPark + CurrentUserId;
891
+ const genericActivityNotificationChannelToSubscribeInto = ChannelNames.Channel_GenericActivityNotification + CurrentUserId;
892
+ const purchaseExecutionAssignedChannelToSubscribeInto = ChannelNames.Channel_GenericActivityNotification + CurrentUserId;
893
+ console.log("subscribing to " + taskAssignmentChannelToSubscribeInto);
894
+ console.log("subscribing to " + tastatusReportSubmissionChannelToSubscribeInto);
895
+ console.log("subscribing to " + tastatusConfigAssignChannelToSubscribeInto);
896
+ console.log("subscribing to" + assetsAssignedChannelToSubscribeInto);
897
+ console.log("subscribing to" + projectCreatedChannelToSubscribeInto);
898
+ console.log("subscribing to" + projectAccessToMemberChannelToSubscribeInto);
899
+ console.log("subscribing to" + goalApprovedChannelToSubscribeInto);
900
+ console.log("subscribing to" + userStoryUpdateChannelToSubscribeInto);
901
+ console.log("subscribing to" + AnnouncementChannelToSubscribeInto);
902
+ console.log("subscribing to" + userStoryCommentChannelToSubscribeInto);
903
+ console.log("subscribing to" + sprintStartedChannelToSubscribeInto);
904
+ console.log("subscribing to" + sprintReplanChannelToSubscribeInto);
905
+ console.log("subscribing to" + ReminderChannelToSubscribeInto);
906
+ console.log("subscribing to" + PerformanceChannelToSubscribeInto);
907
+ console.log("subscribing to" + projectFeatureChannelToSubscribeInto);
908
+ console.log("subscribing to" + userStoryArchiveChannelToSubscribeInto);
909
+ console.log("subscribing to" + userStoryParkChannelToSubscribeInto);
910
+ console.log("subscribing to" + genericActivityNotificationChannelToSubscribeInto);
911
+ console.log("subscribing to" + purchaseExecutionAssignedChannelToSubscribeInto);
912
+ this.pubnub.subscribe({
913
+ channels: [taskAssignmentChannelToSubscribeInto, tastatusReportSubmissionChannelToSubscribeInto,
914
+ tastatusConfigAssignChannelToSubscribeInto, multiChartsSchedulingChannelToSubscribeInto,
915
+ assetsAssignedChannelToSubscribeInto, projectCreatedChannelToSubscribeInto, ,
916
+ projectAccessToMemberChannelToSubscribeInto, goalApprovedChannelToSubscribeInto,
917
+ userStoryUpdateChannelToSubscribeInto, AnnouncementChannelToSubscribeInto, ReminderChannelToSubscribeInto,
918
+ userStoryCommentChannelToSubscribeInto, sprintStartedChannelToSubscribeInto,
919
+ sprintReplanChannelToSubscribeInto,
920
+ PerformanceChannelToSubscribeInto,
921
+ projectFeatureChannelToSubscribeInto,
922
+ userStoryArchiveChannelToSubscribeInto,
923
+ userStoryParkChannelToSubscribeInto, genericActivityNotificationChannelToSubscribeInto, purchaseExecutionAssignedChannelToSubscribeInto]
924
+ });
925
+ var roleUpdatesChannelToSubscribeInto = ChannelNames.Channel_RoleUpdates + "19B6F9FC-7370-4B9C-A05C-3B8D819EEEAF";
926
+ console.log("subscribing to " + roleUpdatesChannelToSubscribeInto);
927
+ this.pubnub.subscribe({
928
+ channels: [roleUpdatesChannelToSubscribeInto]
929
+ });
930
+ }
931
+ replaceAll(str, find, replace) {
932
+ var escapedFind = find.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
933
+ return str.replace(new RegExp(escapedFind, 'g'), replace);
934
+ }
935
+ ngOnInit() {
936
+ this.signalr.getNotificationsFromApi().subscribe();
937
+ this.getSoftLabels();
938
+ if (this.cookieService.check(LocalStorageProperties.DisplayWelComeNote) && this.cookieService.get(LocalStorageProperties.DisplayWelComeNote) == 'true') {
939
+ if ((localStorage.getItem(LocalStorageProperties.UserModel) != null && localStorage.getItem(LocalStorageProperties.UserModel) != undefined)) {
940
+ this.userFullName = JSON.parse(localStorage.getItem(LocalStorageProperties.UserModel)).fullName;
941
+ }
942
+ var count = this.cookieService.check(LocalStorageProperties.UserLoggedInCount);
943
+ if (count && this.cookieService.get(LocalStorageProperties.UserLoggedInCount) != 'null'
944
+ && this.cookieService.get(LocalStorageProperties.UserLoggedInCount) != 'undefined') {
945
+ this.loggedInCount = this.cookieService.get(LocalStorageProperties.UserLoggedInCount);
946
+ if (this.loggedInCount == '1' || this.loggedInCount == '2') {
947
+ this.displayWelcomeNote = true;
948
+ setTimeout(() => {
949
+ this.displayWelcomeNote = false;
950
+ let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
951
+ this.cookieService.set(LocalStorageProperties.DisplayWelComeNote, 'false', null, environment.cookiePath, this.window.location.hostname, false, "Strict");
952
+ }, 8000);
953
+ }
954
+ }
955
+ }
956
+ let currentCulture = this.cookieService.get(LocalStorageProperties.CurrentCulture);
957
+ const companylan = JSON.parse(this.cookieService.get(LocalStorageProperties.CompanyDetails));
958
+ let currentCulturelan = companylan.lanCode;
959
+ if (currentCulture == '' || currentCulture == null || currentCulture == undefined || currentCulture === 'null' || currentCulture === 'undefined') {
960
+ if (currentCulturelan == '' || currentCulturelan == null || currentCulturelan == undefined || currentCulturelan === 'null' || currentCulturelan === 'undefined') {
961
+ currentCulture = 'en';
962
+ }
963
+ else {
964
+ currentCulture = currentCulturelan;
965
+ }
966
+ }
967
+ this.currentLang = currentCulture;
968
+ super.ngOnInit();
969
+ this.loadingInProgress$ = this.store.pipe(select(sharedModuleReducers.isTimeSheetFetching));
970
+ this.timeSheetButtonDetails$ = this.store.pipe(select(sharedModuleReducers.getTimeShettButtonDetails));
971
+ this.timeSheetButtonDetails$
972
+ .subscribe(data => {
973
+ this.timesheetDisableorEnable = data;
974
+ });
975
+ //this.getTimeSheetButtons();
976
+ //this.getUserStore();
977
+ this.showTrailPeriod = false;
978
+ this.egretThemes = this.themeService.egretThemes;
979
+ this.layoutConf = this.layout.layoutConf;
980
+ // this.themeModel$ = this.store.pipe(select(sharedModuleReducers.getThemeModel));
981
+ //this.store.dispatch(new InitializeAfterLoginData());
982
+ var user = JSON.parse(localStorage.getItem(LocalStorageProperties.UserModel));
983
+ if (user != null) {
984
+ this.monitorCompanyrelatedDetails(user);
985
+ }
986
+ this.loggedInUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
987
+ this.getEmployeeIdByUserId();
988
+ let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
989
+ this.applicationVersion = environment.version;
990
+ this.menuType = "Main";
991
+ this.selectedLangName = this.availableLangs.find(x => x.code == this.currentLang).name;
992
+ this.userStoreId$ = this.store.pipe(select(sharedModuleReducers.getUserStoreId));
993
+ this.userStoreId$.subscribe(result => {
994
+ this.userStoreId = result;
995
+ });
996
+ }
997
+ showHideDeleteButton(data) {
998
+ this.showDeleteIcon = data.isDemoDataCleared ? false : data.isToShowDeleteIcon;
999
+ }
1000
+ monitorCompanyrelatedDetails(user) {
1001
+ this.authenticatedUserRecord = user;
1002
+ this.showHideDeleteButton(user);
1003
+ this.companiesList = user.companiesList;
1004
+ this.getCompanyDetails(user.companyId);
1005
+ var company = this.companiesList.filter(x => x.companyId.toLowerCase() == this.cookieService.get(LocalStorageProperties.CompanyId).toLowerCase());
1006
+ this.selectedCompany = company ? company[0] : null;
1007
+ this.selectedCompanyName = company ? company[0] ? company[0].companyName : null : null;
1008
+ }
1009
+ navigateToDashboards() {
1010
+ const userReference = localStorage.getItem(LocalStorageProperties.UserReferenceId);
1011
+ this.defaultDashboardId = this.cookieService.check(LocalStorageProperties.DefaultDashboard) ? JSON.parse(this.cookieService.get(LocalStorageProperties.DefaultDashboard)) : null;
1012
+ if (this.defaultDashboardId && userReference != "null" && userReference != null) {
1013
+ this.router.navigateByUrl("dashboard-management/dashboard/" + this.defaultDashboardId + "/form/" + userReference);
1014
+ }
1015
+ else if (this.defaultDashboardId) {
1016
+ this.router.navigateByUrl("dashboard-management/dashboard/" + this.defaultDashboardId);
1017
+ }
1018
+ }
1019
+ isOpened(event) {
1020
+ this.opened.emit(event);
1021
+ }
1022
+ getSoftLabels() {
1023
+ this.softLabels = JSON.parse(localStorage.getItem('SoftLabels'));
1024
+ }
1025
+ onSignout() {
1026
+ return __awaiter(this, void 0, void 0, function* () {
1027
+ this.reload = false;
1028
+ const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
1029
+ const taskAssignmentChannelToSubscribeInto = ChannelNames.Channel_TaskAssignments
1030
+ + this.cookieService.get(LocalStorageProperties.CurrentUserId);
1031
+ const tastatusReportSubmissionChannelToSubscribeInto = ChannelNames.Channel_StatusReportSubmission
1032
+ + this.cookieService.get(LocalStorageProperties.CurrentUserId);
1033
+ const tastatusConfigAssignChannelToSubscribeInto = ChannelNames.Channel_StatusConfigAssign
1034
+ + this.cookieService.get(LocalStorageProperties.CurrentUserId);
1035
+ const multiChartsSchedulingChannelToSubscribeInto = ChannelNames.Channel_MultiChartsScheduling + CurrentUserId;
1036
+ const assetsAssignedChannelToSubscribeInto = ChannelNames.Channel_AssetAssignment + CurrentUserId;
1037
+ const projectCreatedChannelToSubscribeInto = ChannelNames.Channel_NewProject + CurrentUserId;
1038
+ const projectAccessToMemberChannelToSubscribeInto = ChannelNames.Channel_ProjectMemberRole + CurrentUserId;
1039
+ const goalApprovedChannelToSubscribeInto = ChannelNames.Channel_GoalApprovedFromReplan + CurrentUserId;
1040
+ const userStoryUpdateChannelToSubscribeInto = ChannelNames.Channel_UserStoryUpdateNotification + CurrentUserId;
1041
+ const AnnouncementChannelToSubscribeInto = ChannelNames.Channel_AnnouncementNotification + CurrentUserId;
1042
+ const userStoryCommentChannelToSubscribeInto = ChannelNames.Channel_UserStoryComment + CurrentUserId;
1043
+ const sprintStartedChannelToSubscribeInto = ChannelNames.Channel_SprintStarted + CurrentUserId;
1044
+ const sprintReplanChannelToSubscribeInto = ChannelNames.Channel_SprintRequestedToReplan + CurrentUserId;
1045
+ const PerformanceChannelToSubscribeInto = ChannelNames.Channel_PeroformanceNotification + CurrentUserId;
1046
+ const ReminderChannelToSubscribeInto = ChannelNames.Channel_ReminderNotification + CurrentUserId;
1047
+ const projectFeatureChannelToSubscribeInto = ChannelNames.Channel_ProjectFeature + CurrentUserId;
1048
+ const userStoryArchiveChannelToSubscribeInto = ChannelNames.Channel_UserStoryArchive + CurrentUserId;
1049
+ const userStoryParkChannelToSubscribeInto = ChannelNames.Channel_UserStoryPark + CurrentUserId;
1050
+ const genericActivityNotificationChannelToSubscribeInto = ChannelNames.Channel_GenericActivityNotification + CurrentUserId;
1051
+ const purchaseExecutionAssignedChannelToSubscribeInto = ChannelNames.Channel_PurchaseExecutionAssignToEmployeeNotification + CurrentUserId;
1052
+ this.pubnub.unsubscribe({ channels: [taskAssignmentChannelToSubscribeInto] });
1053
+ this.pubnub.unsubscribe({ channels: [tastatusReportSubmissionChannelToSubscribeInto] });
1054
+ this.pubnub.unsubscribe({ channels: [tastatusConfigAssignChannelToSubscribeInto] });
1055
+ this.pubnub.unsubscribe({ channels: [multiChartsSchedulingChannelToSubscribeInto] });
1056
+ this.pubnub.unsubscribe({ channels: [assetsAssignedChannelToSubscribeInto] });
1057
+ this.pubnub.unsubscribe({ channels: [projectCreatedChannelToSubscribeInto] });
1058
+ this.pubnub.unsubscribe({ channels: [projectAccessToMemberChannelToSubscribeInto] });
1059
+ this.pubnub.unsubscribe({ channels: [goalApprovedChannelToSubscribeInto] });
1060
+ this.pubnub.unsubscribe({ channels: [userStoryUpdateChannelToSubscribeInto] });
1061
+ this.pubnub.unsubscribe({ channels: [AnnouncementChannelToSubscribeInto] });
1062
+ this.pubnub.unsubscribe({ channels: [userStoryCommentChannelToSubscribeInto] });
1063
+ this.pubnub.unsubscribe({ channels: [sprintStartedChannelToSubscribeInto] });
1064
+ this.pubnub.unsubscribe({ channels: [sprintReplanChannelToSubscribeInto] });
1065
+ this.pubnub.unsubscribe({ channels: [PerformanceChannelToSubscribeInto] });
1066
+ this.pubnub.unsubscribe({ channels: [ReminderChannelToSubscribeInto] });
1067
+ this.pubnub.unsubscribe({ channels: [projectFeatureChannelToSubscribeInto] });
1068
+ this.pubnub.unsubscribe({ channels: [userStoryArchiveChannelToSubscribeInto] });
1069
+ this.pubnub.unsubscribe({ channels: [userStoryParkChannelToSubscribeInto] });
1070
+ this.pubnub.unsubscribe({ channels: [purchaseExecutionAssignedChannelToSubscribeInto] });
1071
+ this.pubnub.unsubscribe({ channels: [this.loginUserchannelName] });
1072
+ // var loginCompanyId = this.cookieService.get("CompanyId");
1073
+ // var presenceChannel = "MessengerPresence-" + loginCompanyId;
1074
+ // this.pubnub.unsubscribe({
1075
+ // channels: [presenceChannel],
1076
+ // });
1077
+ // if (this.channelList != undefined || this.channelList != null) {
1078
+ // for (var index = 0; index < this.channelList.length; index++) {
1079
+ // this.pubnub.unsubscribe({
1080
+ // channels: [(loginCompanyId + '-' + this.channelList[index].id)]
1081
+ // });
1082
+ // }
1083
+ // }
1084
+ // this.pubnub.unsubscribe({
1085
+ // channels: [('ChannelUpdates-' + loginCompanyId)]
1086
+ // });
1087
+ // this.pubnub.unsubscribe({
1088
+ // channels: [('UserUpdates-' + loginCompanyId)]
1089
+ // });
1090
+ this.pubnub.unsubscribe({ channels: [genericActivityNotificationChannelToSubscribeInto] });
1091
+ // this.pubnub.unsubscribeAll();
1092
+ // this.pubnub.removeAllListeners();
1093
+ let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
1094
+ let companyName = this.cookieService.get(LocalStorageProperties.CompanyDetails);
1095
+ let companyId = this.cookieService.get(LocalStorageProperties.CompanyId);
1096
+ let companyDetails = this.cookieService.get(LocalStorageProperties.CompanyDetails);
1097
+ let companyTheme = this.cookieService.get(LocalStorageProperties.CompanyTheme);
1098
+ let UserLoggedInCount = this.cookieService.get(LocalStorageProperties.UserLoggedInCount);
1099
+ let currentCulture = this.cookieService.get(LocalStorageProperties.CurrentCulture);
1100
+ this.cookieService.deleteAll(environment.cookiePath);
1101
+ this.cookieService.delete("selectedProjectsTab");
1102
+ this.cookieService.set(LocalStorageProperties.UserLoggedInCount, UserLoggedInCount, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1103
+ this.cookieService.set(LocalStorageProperties.CurrentCulture, currentCulture, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1104
+ this.cookieService.set(LocalStorageProperties.CurrentUser, null, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1105
+ this.cookieService.set(LocalStorageProperties.CurrentUserId, null, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1106
+ this.cookieService.set(LocalStorageProperties.CompanyName, companyName, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1107
+ this.cookieService.set(LocalStorageProperties.CompanyId, companyId, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1108
+ this.cookieService.set(LocalStorageProperties.DefaultDashboard, null, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1109
+ this.cookieService.set(LocalStorageProperties.CompanyDetails, companyDetails, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1110
+ this.cookieService.set(LocalStorageProperties.CompanyTheme, companyTheme, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1111
+ this.cookieService.set(LocalStorageProperties.SearchClick, null, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1112
+ this.cookieService.set(LocalStorageProperties.UserModel, null, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1113
+ this.cookieService.set(LocalStorageProperties.EnableTeamDashboard, null, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1114
+ localStorage.setItem(LocalStorageProperties.Dashboards, null);
1115
+ localStorage.setItem(LocalStorageProperties.UserReferenceId, null);
1116
+ localStorage.setItem(LocalStorageProperties.RoleFeatures, null);
1117
+ localStorage.removeItem(LocalStorageProperties.UserRoleFeatures);
1118
+ localStorage.removeItem(LocalStorageProperties.RedirectionUrl);
1119
+ localStorage.removeItem(LocalStorageProperties.SideBarMenuItems);
1120
+ localStorage.removeItem(LocalStorageProperties.IntroModules);
1121
+ this.cookieService.set(LocalStorageProperties.AddOrEditCustomAppIsRequired, null, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1122
+ this.router.navigate(["/sessions/signin"]);
1123
+ return false;
1124
+ });
1125
+ }
1126
+ setLang() {
1127
+ this.translate.use(this.currentLang);
1128
+ console.log(this.window.location.hostname);
1129
+ let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
1130
+ this.cookieService.set(LocalStorageProperties.CurrentCulture, this.currentLang, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1131
+ this.selectedLangName = this.availableLangs.find(x => x.code == this.currentLang).name;
1132
+ }
1133
+ changeTheme(theme) {
1134
+ this.themeService.changeTheme(theme);
1135
+ }
1136
+ toggleNotific() {
1137
+ // this.getUnreadNotifications();
1138
+ }
1139
+ toggleRecording() {
1140
+ this.getActTrackerRecorder();
1141
+ var user = JSON.parse(localStorage.getItem(LocalStorageProperties.UserModel));
1142
+ if (user != null) {
1143
+ this.monitorCompanyrelatedDetails(user);
1144
+ }
1145
+ }
1146
+ getNotifications() {
1147
+ const notificationSearchModel = new AppNotification();
1148
+ this.store.dispatch(new ClearAllUnreadNotificationsTriggered(notificationSearchModel));
1149
+ this.unreadCountOfNotifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationUnreadTotal));
1150
+ }
1151
+ getUnreadNotifications() {
1152
+ const notificationSearchModel = new AppNotification();
1153
+ this.store.dispatch(new ClearUnreadNotificationsTriggered(notificationSearchModel));
1154
+ this.unreadCountOfNotifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationUnreadTotal));
1155
+ }
1156
+ getActTrackerRecorder() {
1157
+ this.commonService.getActTrackerRecorder().subscribe((response) => {
1158
+ if (response.success) {
1159
+ this.isRecording = response.data;
1160
+ }
1161
+ });
1162
+ }
1163
+ clearDemoData() {
1164
+ const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
1165
+ height: "30%",
1166
+ width: "30%",
1167
+ hasBackdrop: true,
1168
+ direction: "ltr",
1169
+ data: {},
1170
+ disableClose: true
1171
+ });
1172
+ dialogRef.afterClosed().subscribe(() => {
1173
+ console.log("The dialog was closed");
1174
+ });
1175
+ }
1176
+ exportConfigurationDialogData() {
1177
+ const dialogRef = this.dialog.open(ExportConfigurationDialogComponent, {
1178
+ height: "45%",
1179
+ width: "40%",
1180
+ hasBackdrop: true,
1181
+ direction: "ltr",
1182
+ data: {},
1183
+ disableClose: true
1184
+ });
1185
+ dialogRef.afterClosed().subscribe(() => {
1186
+ console.log("The dialog was closed");
1187
+ });
1188
+ }
1189
+ toggleSidenav() {
1190
+ if (this.layoutConf.sidebarStyle === "closed") {
1191
+ return this.layout.publishLayoutChange({
1192
+ sidebarStyle: "full"
1193
+ });
1194
+ }
1195
+ this.layout.publishLayoutChange({
1196
+ sidebarStyle: "closed"
1197
+ });
1198
+ setTimeout(() => { window.dispatchEvent(new Event("resize")); }, 250);
1199
+ }
1200
+ toggleCollapse() {
1201
+ // compact --> full
1202
+ if (this.layoutConf.sidebarStyle === "compact") {
1203
+ return this.layout.publishLayoutChange({
1204
+ sidebarStyle: "full"
1205
+ }, { transitionClass: true });
1206
+ }
1207
+ // * --> compact
1208
+ this.layout.publishLayoutChange({
1209
+ sidebarStyle: "compact"
1210
+ }, { transitionClass: true });
1211
+ }
1212
+ getTimeSheetButtons() {
1213
+ //this.loadingInProgress = true;
1214
+ // this.commonService.getTimeSheetEnabledInformation().pipe(takeUntil(this.ngDestroyed$))
1215
+ // .subscribe((data: any) => {
1216
+ // if (data === "" || data === undefined) {
1217
+ // return;
1218
+ // }
1219
+ // this.timesheetDisableorEnable = JSON.parse(data);
1220
+ // this.loadingInProgress = false;
1221
+ // });
1222
+ this.store.dispatch(new FetchTimeSheetButtonDetails());
1223
+ }
1224
+ closeFeedTimeSheet() {
1225
+ this.feedTimeSheetPopover.close();
1226
+ this.isFeedTimeSheet = false;
1227
+ }
1228
+ openTimeSheet() {
1229
+ const projectDialog = this.dialog.open(FeedTimeDialogComponent, {
1230
+ minWidth: '30vw',
1231
+ height: '35vh',
1232
+ data: !this.isFeedTimeSheet
1233
+ //disableClose: true
1234
+ });
1235
+ projectDialog.afterClosed().subscribe(() => {
1236
+ this.closeFeedTimeSheet();
1237
+ });
1238
+ this.getTimeSheetButtons();
1239
+ // this.isFeedTimeSheet = !this.isFeedTimeSheet;
1240
+ }
1241
+ // getAllMenuItems() {
1242
+ // this.store.dispatch(new GetAllMenuItemsTriggered(MenuCategories.Main));
1243
+ // }
1244
+ changeMenuType(type) {
1245
+ this.menuType = type;
1246
+ }
1247
+ openFeedBackDialog() {
1248
+ this.isFeedBackDialog = true;
1249
+ }
1250
+ closeFeedBacklogDialog() {
1251
+ this.isFeedBackDialog = false;
1252
+ this.feedBackPopOver.close();
1253
+ }
1254
+ getCompanyDetails(companyId) {
1255
+ if (this.cookieService.check(LocalStorageProperties.CompanyDetails) && this.cookieService.check(LocalStorageProperties.CompanyId)) {
1256
+ this.company = JSON.parse(this.cookieService.get(LocalStorageProperties.CompanyDetails));
1257
+ }
1258
+ if (!this.company) {
1259
+ this.commonService.getCompanyById(companyId).subscribe((response) => {
1260
+ this.company = response.data;
1261
+ if (this.company.isRemoteAccess == 1 && this.company.trailDays > 0) {
1262
+ this.showTrailPeriod = true;
1263
+ // this.noOfDays=this.company.noOfDays;
1264
+ }
1265
+ if (this.company.isDemoData == true) {
1266
+ this.showDelete = true;
1267
+ }
1268
+ else {
1269
+ this.showDelete = false;
1270
+ }
1271
+ if (this.company.isDemoData == false || this.company.isDemoData == null) {
1272
+ this.showDelete = false;
1273
+ }
1274
+ if (this.company != null && this.company != undefined && this.company.industryId.toUpperCase() == '7499F5E3-0EF2-4044-B840-2411B68302F9')
1275
+ this.isStoreAccess = false;
1276
+ else
1277
+ this.isStoreAccess = true;
1278
+ });
1279
+ }
1280
+ else {
1281
+ if (this.company.isRemoteAccess == 1 && this.company.trailDays > 0) {
1282
+ this.showTrailPeriod = true;
1283
+ // this.noOfDays=this.company.noOfDays;
1284
+ }
1285
+ if (this.company.isDemoData == true) {
1286
+ this.showDelete = true;
1287
+ }
1288
+ if (this.company.isDemoData == false || this.company.isDemoData == null) {
1289
+ this.showDelete = false;
1290
+ }
1291
+ if (this.company != null && this.company != undefined && this.company.industryId.toUpperCase() == '7499F5E3-0EF2-4044-B840-2411B68302F9')
1292
+ this.isStoreAccess = false;
1293
+ else
1294
+ this.isStoreAccess = true;
1295
+ }
1296
+ }
1297
+ getUserStore() {
1298
+ let storeSearchModel = new StoreSearchModel();
1299
+ storeSearchModel.isArchived = false;
1300
+ storeSearchModel.isDefault = true;
1301
+ storeSearchModel.isCompany = false;
1302
+ this.store.dispatch(new GetUserStoreIdTriggered(storeSearchModel));
1303
+ }
1304
+ goToUserStore() {
1305
+ if (this.cookieService.get(LocalStorageProperties.CurrentUserId))
1306
+ this.router.navigate(["document/store", this.userStoreId, this.cookieService.get(LocalStorageProperties.CurrentUserId).toLowerCase()]);
1307
+ }
1308
+ selectAfterlogin(e) {
1309
+ this.companyId = e.companyId;
1310
+ this.selectedCompanyName = e.companyName;
1311
+ this.selectedCompany = e;
1312
+ }
1313
+ selectCompany(e) {
1314
+ return __awaiter(this, void 0, void 0, function* () {
1315
+ if (this.cookieService.get(LocalStorageProperties.CompanyId).toLowerCase() != e.companyId.toString().toLowerCase()) {
1316
+ this.reload = false;
1317
+ console.log(e);
1318
+ this.companyId = e.companyId;
1319
+ this.selectedCompanyName = e.companyName;
1320
+ this.selectedCompany = e;
1321
+ this.loading = true;
1322
+ this.searchText = null;
1323
+ this.ngxService.start();
1324
+ this.authService.companyLogin(this.selectedCompany).subscribe((userToken) => __awaiter(this, void 0, void 0, function* () {
1325
+ if (userToken.success) {
1326
+ yield this.onSignout();
1327
+ let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
1328
+ this.cookieService.set(LocalStorageProperties.CurrentUser, e.authToken, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1329
+ this.cookieService.set(LocalStorageProperties.CurrentUserId, e.userId, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1330
+ this.cookieService.set(LocalStorageProperties.CurrentUser, userToken.data.authToken, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1331
+ this.cookieService.set("DefaultDashboard", userToken.data.defaultDashboardId ? JSON.stringify(userToken.data.defaultDashboardId.workspaceId) : null, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1332
+ this.cookieService.set('CompanyDetails', JSON.stringify(userToken.data.companyDetails));
1333
+ this.cookieService.set('CompaniesList', JSON.stringify(userToken.data.usersModel.companiesList)),
1334
+ localStorage.setItem('RoleFeatures', JSON.stringify(userToken.data.roleFeatures));
1335
+ localStorage.setItem("UserModel", JSON.stringify(userToken.data.usersModel));
1336
+ localStorage.setItem('SoftLabels', JSON.stringify(userToken.data.softLabels));
1337
+ localStorage.setItem("CompanySettings", JSON.stringify(userToken.data.companySettings));
1338
+ localStorage.setItem("FromLogIn", JSON.stringify(true));
1339
+ this.cookieService.set(LocalStorageProperties.CompanyName, userToken.data.usersModel.companyName, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1340
+ this.cookieService.set(LocalStorageProperties.CompanyId, userToken.data.usersModel.companyId, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1341
+ //this.store.dispatch(new UserDetailsFetchedAfterCompanyLogin(userToken.data.usersModel));
1342
+ this.setDafaultLanguage();
1343
+ }
1344
+ this.loading = false;
1345
+ this.ngxService.stop();
1346
+ }));
1347
+ }
1348
+ });
1349
+ }
1350
+ setDafaultLanguage() {
1351
+ const company = JSON.parse(this.cookieService.get(LocalStorageProperties.CompanyDetails));
1352
+ let currentCulture = company.lanCode;
1353
+ if (currentCulture == null || currentCulture == undefined || currentCulture === 'null' || currentCulture === 'undefined') {
1354
+ currentCulture = 'en';
1355
+ }
1356
+ let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
1357
+ this.cookieService.set(LocalStorageProperties.CurrentCulture, currentCulture, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1358
+ this.currentLang = currentCulture;
1359
+ this.translate.use(this.currentLang);
1360
+ }
1361
+ getEmployeeIdByUserId() {
1362
+ }
1363
+ navigateToProfile() {
1364
+ this.commonService.getUserById(this.cookieService.get(LocalStorageProperties.CurrentUserId).toLowerCase()).subscribe((response) => {
1365
+ if (response.success == true) {
1366
+ this.employeeId = response.data.employeeId;
1367
+ if (this.employeeId) {
1368
+ this.router.navigate(["dashboard/profile", this.cookieService.get(LocalStorageProperties.CurrentUserId).toLowerCase(), "overview"]);
1369
+ }
1370
+ else {
1371
+ this.router.navigate(["dashboard/myProfile", this.cookieService.get(LocalStorageProperties.CurrentUserId).toLowerCase()]);
1372
+ }
1373
+ }
1374
+ });
1375
+ }
1376
+ navigateToMessenger() {
1377
+ this.router.navigate(["/chat"]);
1378
+ }
1379
+ navigateToStatusReport() {
1380
+ const projectDialog = this.dialog.open(WorkItemsDialogComponent, {
1381
+ minWidth: '82vw',
1382
+ height: '82vh',
1383
+ data: { dashboardFilters: this.dashboardFilters },
1384
+ disableClose: true
1385
+ });
1386
+ projectDialog.afterClosed().subscribe(() => { });
1387
+ }
1388
+ navigateToSettings() {
1389
+ this.router.navigate(["/settings"]);
1390
+ }
1391
+ alternateSignIn() {
1392
+ this.router.navigate(["/sessions/generic-signin"]);
1393
+ }
1394
+ navigateToRoles() {
1395
+ this.router.navigate(["/rolemanagement/rolemanagement"]);
1396
+ }
1397
+ navigateToUrl(workspaceId) {
1398
+ const userReference = localStorage.getItem(LocalStorageProperties.UserReferenceId);
1399
+ if (userReference != "null" && userReference != null) {
1400
+ this.router.navigateByUrl("dashboard-management/dashboard/" + workspaceId + "/form/" + userReference);
1401
+ }
1402
+ else {
1403
+ this.router.navigateByUrl("dashboard-management/dashboard/" + workspaceId);
1404
+ }
1405
+ }
1406
+ addUploadFilePopupOpen(fileUploadDropzonePopup) {
1407
+ fileUploadDropzonePopup.openPopover();
1408
+ }
1409
+ setLabelNameForDropzone(fileName) {
1410
+ return fileName.substring(0, 20) + "...";
1411
+ }
1412
+ onRemove(event) {
1413
+ this.files.splice(this.files.indexOf(event), 1);
1414
+ if (this.files.length > 0) {
1415
+ this.filesPresent = true;
1416
+ }
1417
+ else {
1418
+ this.filesPresent = false;
1419
+ }
1420
+ }
1421
+ removeAllFiles() {
1422
+ this.filesPresent = false;
1423
+ this.files = [];
1424
+ }
1425
+ filesSelected(event) {
1426
+ this.files.push(...event.addedFiles);
1427
+ if (this.files.length > 0) {
1428
+ this.filesPresent = true;
1429
+ }
1430
+ }
1431
+ closeUploadFilePopup() {
1432
+ this.fileUploadDropzonePopup.forEach((p) => p.closePopover());
1433
+ this.files = [];
1434
+ this.fileResultModel = [];
1435
+ }
1436
+ saveFiles() {
1437
+ this.anyOperationInProgress = true;
1438
+ const formData = new FormData();
1439
+ this.files.forEach((file) => {
1440
+ this.fileIndex = this.fileIndex + 1;
1441
+ const fileKeyName = "file" + this.fileIndex.toString();
1442
+ formData.append(fileKeyName, file);
1443
+ });
1444
+ let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
1445
+ this.UploaderOnInit(environment.apiURL + ApiUrls.UploadFileChunks);
1446
+ }
1447
+ UploaderOnInit(url) {
1448
+ let progress = 0;
1449
+ const r = new Resumable({
1450
+ target: url,
1451
+ chunkSize: 1 * 1024 * 1024,
1452
+ query: { moduleTypeId: this.moduleTypeId },
1453
+ headers: {
1454
+ "Authorization": `Bearer ${this.cookieService.get(LocalStorageProperties.CurrentUser)}`
1455
+ },
1456
+ });
1457
+ r.addFiles(this.files);
1458
+ r.on('fileAdded', (file, event) => {
1459
+ if (!this.fileResultModel || this.fileResultModel.length > 0) {
1460
+ this.fileResultModel = [];
1461
+ this.cdRef.detectChanges();
1462
+ }
1463
+ r.upload();
1464
+ });
1465
+ r.on('complete', (event) => {
1466
+ r.files.pop();
1467
+ this.progressValue = 0;
1468
+ this.filesPresent = false;
1469
+ this.uploadedFileNames = [];
1470
+ this.fileCounter = 1;
1471
+ this.fileIndex = 0;
1472
+ this.anyOperationInProgress = false;
1473
+ });
1474
+ r.on('progress', () => {
1475
+ progress = Math.round(r.progress() * 100);
1476
+ this.progressValue = progress;
1477
+ this.cdRef.detectChanges();
1478
+ });
1479
+ r.on('fileSuccess', (file, response) => {
1480
+ if (file && file.fileName) {
1481
+ if (!this.uploadedFileNames.find(x => x == file.fileName)) {
1482
+ this.uploadedFileNames.push(file.fileName);
1483
+ this.fileCounter = this.uploadedFileNames.length;
1484
+ let result = JSON.parse(response);
1485
+ if (result && result.length > 0) {
1486
+ if (!this.fileResultModel) {
1487
+ this.fileResultModel = [];
1488
+ }
1489
+ let fileResult = new FileResultModel();
1490
+ fileResult.fileExtension = result[0].FileExtension;
1491
+ fileResult.fileName = result[0].FileName;
1492
+ fileResult.filePath = result[0].FilePath;
1493
+ fileResult.fileSize = result[0].FileSize;
1494
+ this.fileResultModel.push(fileResult);
1495
+ if (result[0].FilePath != null && result[0].FilePath != "")
1496
+ this.importDynamicJson(result[0].FilePath);
1497
+ else
1498
+ this.closeUploadFilePopup();
1499
+ }
1500
+ this.cdRef.detectChanges();
1501
+ }
1502
+ }
1503
+ });
1504
+ }
1505
+ importDynamicJson(configuredJsonURL) {
1506
+ var importConfigurationModel = new ImportConfigurationModel();
1507
+ importConfigurationModel.configurationUrl = configuredJsonURL;
1508
+ this.importingInProgress = true;
1509
+ this.commonService.SystemImportConfiguration(importConfigurationModel).subscribe((response) => {
1510
+ if (response.success === true) {
1511
+ this.closeUploadFilePopup();
1512
+ this.toastr.success("Data imported successfully");
1513
+ }
1514
+ else {
1515
+ this.toastr.error(response.apiResponseMessages[0].message);
1516
+ }
1517
+ this.importingInProgress = false;
1518
+ });
1519
+ }
1520
+ closeSearch() {
1521
+ this.searchText = null;
1522
+ }
1523
+ searchCompanies(companies, search) {
1524
+ if (search == null || search == '') {
1525
+ return companies;
1526
+ }
1527
+ else if (search != null) {
1528
+ search = search.toLowerCase();
1529
+ search = search.trim();
1530
+ const temp = companies.filter(data => data.companyName.toString().toLowerCase().indexOf(search) > -1);
1531
+ return temp;
1532
+ }
1533
+ }
1534
+ ngOnDestroy() {
1535
+ // this.pubnub.unsubscribe({ channels: [this.loginUserchannelName] });
1536
+ // var loginCompanyId = this.cookieService.get("CompanyId");
1537
+ // if (this.channelList != undefined || this.channelList != null) {
1538
+ // for (var index = 0; index < this.channelList.length; index++) {
1539
+ // this.pubnub.unsubscribe({
1540
+ // channels: [(loginCompanyId + '-' + this.channelList[index].id)]
1541
+ // });
1542
+ // }
1543
+ // }
1544
+ // this.pubnub.unsubscribe({
1545
+ // channels: [('ChannelUpdates-' + loginCompanyId)]
1546
+ // });
1547
+ // this.pubnub.unsubscribe({
1548
+ // channels: [('UserUpdates-' + loginCompanyId)]
1549
+ // });
1550
+ this.ngDestroyed$.next();
1551
+ this.ngDestroyed$.complete();
1552
+ }
1553
+ onNavigateToBillingScreen() {
1554
+ this.router.navigate(["/shell/Accounts"]);
1555
+ }
1556
+ onNavigateToPricingScreen() {
1557
+ this.router.navigate(["/shell/payments-plans"]);
1558
+ }
1559
+ getIntroDetails() {
1560
+ var intro = new IntroModel();
1561
+ intro.userId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
1562
+ this.commonService.getIntroDetails(intro).subscribe((responseData) => {
1563
+ if (responseData.success == false) {
1564
+ this.validationMessage = responseData.apiResponseMessages[0].message;
1565
+ this.anyOperationInProgress = false;
1566
+ this.toastr.error(this.validationMessage);
1567
+ }
1568
+ else if (responseData.success == true) {
1569
+ let intro = JSON.parse(localStorage.getItem(LocalStorageProperties.IntroModules));
1570
+ if (!intro)
1571
+ localStorage.setItem(LocalStorageProperties.IntroModules, JSON.stringify(responseData.data));
1572
+ }
1573
+ });
1574
+ }
1575
+ getTeamMembers() {
1576
+ var teamMemberModel;
1577
+ let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
1578
+ var teamMemberModel;
1579
+ teamMemberModel = {
1580
+ isForTracker: true
1581
+ };
1582
+ teamMemberModel.isArchived = false;
1583
+ this.commonService.getTeamLeadsList(teamMemberModel).subscribe((responseData) => {
1584
+ let employeesDropDown = responseData.data;
1585
+ if (employeesDropDown && employeesDropDown.length > 1) {
1586
+ this.cookieService.set(LocalStorageProperties.EnableTeamDashboard, 'true', null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1587
+ }
1588
+ else {
1589
+ this.cookieService.set(LocalStorageProperties.EnableTeamDashboard, 'false', null, environment.cookiePath, this.window.location.hostname, false, "Strict");
1590
+ }
1591
+ });
1592
+ }
1593
+ }
1594
+ HeaderSideComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.1", ngImport: i0, type: HeaderSideComponent, deps: [{ token: i1.PushNotificationsService }, { token: i2.ThemeService }, { token: i3.NgxUiLoaderService }, { token: i4.LayoutService }, { token: i5.TranslateService }, { token: i6.Router }, { token: i7.CookieService }, { token: i8.MatDialog }, { token: i9.CommonService }, { token: i10.Store }, { token: i11.PubNubAngular }, { token: i12.AuthenticationService }, { token: i13.Actions }, { token: i0.ChangeDetectorRef }, { token: i14.ToastrService }, { token: i15.StoreManagementService }, { token: i16.ShellModulesService }, { token: i17.ChatService }, { token: i18.SignalrService }, { token: WINDOW }], target: i0.ɵɵFactoryTarget.Component });
1595
+ HeaderSideComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.1", type: HeaderSideComponent, selector: "app-header-side", inputs: { notificPanel: "notificPanel" }, outputs: { opened: "opened" }, viewQueries: [{ propertyName: "feedTimeSheetPopover", first: true, predicate: ["feedTimeSheet"], descendants: true }, { propertyName: "feedBackPopOver", first: true, predicate: ["feedBackPopover"], descendants: true }, { propertyName: "documentPopover", first: true, predicate: ["documentPopover"], descendants: true }, { propertyName: "openAnnoucementDialogComponent", first: true, predicate: ["openAnnoucementDialogComponent"], descendants: true }, { propertyName: "fileUploadDropzonePopup", predicate: ["fileUploadDropzonePopup"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<mat-toolbar class=\"topbar remove-padding\">\r\n <div fxFlex>\r\n <app-menu [reload]=\"reload\" (isOpened)=\"isOpened($event)\" (openNewDashboard)=\"navigateToUrl($event)\"></app-menu>\r\n </div>\r\n <div fxFlex fxLayout=\"row\" fxHide.xs fxLayoutAlign=\"center\" style=\"vertical-align: center;\">\r\n </div>\r\n <div fxFlex fxLayout=\"row\" fxLayoutAlign=\"end center\">\r\n <div *ngIf=\"companiesList != null && companiesList.length > 1\" class=\"filter-data custom-box language-section\"\r\n style=\"width:150px;\" (click)=\"$event.stopPropagation()\">\r\n <mat-select placeholder=\"\" name=\"selectedCompany\" [(ngModel)]=\"selectedCompany\"\r\n (selectionChange)=\"selectCompany($event.value)\">\r\n <mat-select-trigger>\r\n <div *ngIf=\"selectedCompany\" fxLayout=\"row\" fxLayoutGap=\"15px\">\r\n <div [ngStyle]=\"{ 'margin-bottom': selectedCompany.companyMiniLogo ? '10px' : '0px' }\">\r\n <app-avatar [name]=\"selectedCompany.companyName | removeSpecialCharacters\"\r\n fxLayoutAlign=\"start center\" matTooltipClass=\"tooltipClass-mat\" matTooltip=\"{{ selectedCompany.companyName }}\"\r\n [src]=\"selectedCompany.companyMiniLogo | fetchSizedAndCachedImage: '20':''\"\r\n [isRound]=\"true\" size=\"20\">\r\n </app-avatar>\r\n </div>\r\n <span matTooltipClass=\"tooltipClass-mat\" matTooltip=\"{{selectedCompany.companyName}}\" matTooltipShowDelay=\"400\"\r\n fxFlex=\"calc(100% - 40px)\" class=\"language-display\" style=\"color: black !important;\">{{ selectedCompanyName }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n <div fxFlex class=\"search_goalinput ml-1\" fxLayoutAlign=\"start center\"\r\n style=\"position: sticky; top: 0; z-index: 1; background-color: white;\">\r\n <div fxLayoutAlign=\"start center\">\r\n <mat-form-field class=\"full-width\">\r\n <input class=\"search_goal\" matInput placeholder=\"{{'HRMANAGAMENT.SEARCH' | translate}}\"\r\n [(ngModel)]=\"searchText\" autocomplete=\"off\">\r\n <!-- (input)=\"search($event)\"> -->\r\n </mat-form-field>\r\n </div>\r\n <span class=\"close_icon masterdata-search-close\" fxLayoutAlign=\"end center\">\r\n <span *ngIf=\"!searchText\"></span>\r\n <mat-icon *ngIf=\"searchText\" class=\"icon-button mr-05 mt-05\" aria-hidden=\"false\"\r\n (click)=\"closeSearch()\" style=\"cursor:pointer\">\r\n close</mat-icon>\r\n </span>\r\n </div>\r\n <mat-option *ngFor=\"let companyList of searchCompanies(companiesList, searchText)\" [value]=\"companyList\"\r\n matTooltipClass=\"tooltipClass-mat\" matTooltip=\"{{companyList.companyName}}\" matTooltipShowDelay=\"400\">\r\n <div class=\"cursor-pointer\" fxLayout=\"row\">\r\n <app-avatar [name]=\"companyList.companyName | removeSpecialCharacters\"\r\n [ngStyle]=\"{ 'margin-bottom': companyList.companyMiniLogo ? '10px' : '0px' }\"\r\n fxLayoutAlign=\"start center\" matTooltipClass=\"tooltipClass-mat\" matTooltip=\"{{ companyList.companyName }}\"\r\n [src]=\"companyList.companyMiniLogo | fetchSizedAndCachedImage: '20':''\" [isRound]=\"true\"\r\n size=\"20\">\r\n </app-avatar>\r\n <div class=\"ml-05\">\r\n {{ companyList.companyName }}\r\n </div>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </div>\r\n <!-- <div *ngIf=\"showTrailPeriod\">\r\n <span>{{ 'SHELL.FREETRAILEXPIRE' | translate }}<span [(ngModel)]=\"noOfDays\">{{company.trailDays}}</span>\r\n {{ 'SHELL.DAYS' | translate }}</span>\r\n </div> -->\r\n <!-- <div class=\"home\">\r\n <button mat-icon-button [style.overflow]=\"'visible'\" matTooltip=\"{{ 'SHELL.HOME' | translate}}\"\r\n class=\"topbar-button-right\" (click)=\"changeMenuType('WorkspaceMenuItems');navigateToDashboards()\"\r\n [ngClass]=\"(menuType == 'WorkspaceMenuItems'|| this.router.url.includes('/dashboard-management')) ? 'icon_active_class' : ''\">\r\n <mat-icon>home</mat-icon>\r\n </button>\r\n </div> -->\r\n <!-- <div class=\"home\" *ngIf=\"canAccess_feature_ViewRoles\">\r\n <button mat-icon-button [style.overflow]=\"'visible'\" matTooltip=\"{{ 'ROLESVIEW.ROLES' | translate}}\"\r\n class=\"topbar-button-right\" (click)=\"changeMenuType('WorkspaceMenuItems');navigateToRoles()\"\r\n [ngClass]=\"(menuType == 'WorkspaceMenuItems'|| this.router.url.includes('/rolemanagement/rolemanagement')) ? 'icon_active_class' : ''\">\r\n <mat-icon>brightness_high</mat-icon>\r\n </button>\r\n </div> -->\r\n <div *ngIf=\"(canAccess_feature_Settings) || (canAccess_feature_ViewRoles)\">\r\n <button matTooltipClass=\"tooltipClass-mat\" matTooltip=\"{{ 'SHELL.SETTINGS' | translate }}\" class=\"topbar-button-right theme-navbar-icon-color\" mat-icon-button\r\n (click)=\"navigateToSettings()\"\r\n [ngClass]=\"(this.router.url.includes('/settings')) ? 'icon_active_class' : ''\">\r\n <mat-icon>settings</mat-icon>\r\n </button>\r\n </div>\r\n <!-- <div *ngIf=\"canAccess_feature_AbilityToChat\">\r\n <button mat-icon-button [style.overflow]=\"'visible'\" matTooltip=\"{{ 'SHELL.CHAT' | translate }}\"\r\n class=\"topbar-button-right\" (click)=\"navigateToMessenger()\"\r\n [ngClass]=\"(this.router.url.includes('/chat')) ? 'icon_active_class' : ''\">\r\n <mat-icon matBadge=\"{{messagesUnreadCount}}\" [matBadgeHidden]=\"messagesUnreadCount == 0\"\r\n matBadgeColor=\"warn\" class=\"m-0 icon\">forum</mat-icon>\r\n </button>\r\n </div> -->\r\n\r\n <div *ngIf=\"canAccess_feature_MyProjectWork\">\r\n <button matTooltipClass=\"tooltipClass-mat\" matTooltip=\"{{ 'SHELL.MYWORK' | translate }}\" class=\"topbar-button-right theme-navbar-icon-color\" mat-icon-button\r\n (click)=\"navigateToStatusReport()\">\r\n <mat-icon>assignment</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"(canAccess_feature_PunchCard) && !( timesheetDisableorEnable && timesheetDisableorEnable.TimeSheetRestricted)\">\r\n <button mat-icon-button id=\"feedTimeSheetComponent\" [style.overflow]=\"'visible'\"\r\n matTooltipClass=\"tooltipClass-mat\" matTooltip=\"{{ 'SHELL.LOGTIME' | translate}}\" [satPopoverAnchorFor]=\"feedTimeSheet\"\r\n (click)=\"openTimeSheet()\" class=\"topbar-button-right theme-navbar-icon-color\">\r\n <mat-icon>access_time</mat-icon>\r\n </button>\r\n </div>\r\n <!-- Notification toggle button -->\r\n <button mat-icon-button matTooltipClass=\"tooltipClass-mat\" matTooltip=\"{{ 'SHELL.NOTIFICATIONS' | translate}}\" (click)=\"toggleNotific()\"\r\n [style.overflow]=\"'visible'\" *ngIf=\"newNotificationsCount != 0\" class=\"topbar-button-right theme-navbar-icon-color\"\r\n [matMenuTriggerFor]=\"notification\">\r\n <mat-icon>notifications</mat-icon>\r\n <span *ngIf=\"newNotificationsCount != 0\" class=\"notification-number mat-bg-warn\">{{\r\n newNotificationsCount }}</span>\r\n </button>\r\n <mat-menu #notification=\"matMenu\">\r\n <app-notifications></app-notifications>\r\n </mat-menu>\r\n\r\n <!-- Top left user menu -->\r\n <button mat-icon-button [matMenuTriggerFor]=\"accountMenu\" (click)=\"toggleRecording()\"\r\n [ngClass]=\"this.router.url.includes('/dashboard/profile/') ? 'icon_active_class' : ''\"\r\n class=\"topbar-button-right img-button\" *ngIf=\"authenticatedUserRecord\">\r\n <img class=\"icon-highlight-setter\" *ngIf=\"authenticatedUserRecord.profileImage\"\r\n [src]=\"authenticatedUserRecord.profileImage | fetchSizedAndCachedImage: '60':''\" alt=\"profile image\" />\r\n <div *ngIf=\"!authenticatedUserRecord.profileImage\" style=\"margin-left: 4px !important;\">\r\n <app-avatar [name]=\"authenticatedUserRecord.fullName | removeSpecialCharacters\" [isRound]=\"true\" size=\"30\">\r\n </app-avatar>\r\n </div>\r\n </button>\r\n\r\n <sat-popover #feedTimeSheet [autoFocus]=\"false\" hasBackdrop [restoreFocus]=\"false\" [interactiveClose]=\"true\"\r\n scrollStrategy=\"reposition\" verticalAlign=\"below\" horizontalAlign=\"before\">\r\n <app-feed-time (closeFeedTimeSheetPopup)=\"closeFeedTimeSheet()\" [isFeedTimeSheet]=\"isFeedTimeSheet\">\r\n </app-feed-time>\r\n </sat-popover>\r\n\r\n <mat-menu #accountMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"navigateToProfile()\">\r\n <mat-icon>account_box</mat-icon>\r\n <span>{{ 'SHELL.PROFILE' | translate}}</span>\r\n <mat-icon class=\"activity-recorder recording-style\" *ngIf=\"isRecording\">\r\n <!-- fiber_manual_record -->\r\n </mat-icon>\r\n </button>\r\n\r\n <!-- <button mat-menu-item (click)=\"goToUserStore()\" *ngIf=\"isStoreAccess\">\r\n <mat-icon>cloud</mat-icon>\r\n <span>Store</span>\r\n </button> -->\r\n <button mat-menu-item matTooltipClass=\"tooltipClass-mat\" matTooltip=\"{{ 'SHELL.CLEARDEMODATA' | translate}}\" *ngIf=\"showDeleteIcon && showDelete\"\r\n (click)=\"clearDemoData()\" [style.overflow]=\"'visible'\">\r\n <mat-icon>delete</mat-icon>\r\n <span>{{ 'SHELL.CLEARDEMODATA' | translate}}</span>\r\n </button>\r\n <button mat-menu-item matTooltipClass=\"tooltipClass-mat\" matTooltip=\"{{ 'SHELL.EXPORTCONFIGURATION' | translate}}\"\r\n *ngIf=\"canAccess_feature_ManageSystemExports\" (click)=\"exportConfigurationDialogData()\"\r\n [style.overflow]=\"'visible'\">\r\n <mat-icon>get_app</mat-icon>\r\n <span>{{ 'SHELL.EXPORTCONFIGURATION' | translate}}</span>\r\n </button>\r\n <button mat-menu-item matTooltipClass=\"tooltipClass-mat\" matTooltip=\"{{ 'SHELL.IMPORTCONFIGURATION' | translate}}\"\r\n [satPopoverAnchorFor]=\"fileUploadDropzonePopover\" #fileUploadDropzonePopup=\"satPopoverAnchor\"\r\n *ngIf=\"canAccess_feature_ManageSystemImports\" (click)=\"addUploadFilePopupOpen(fileUploadDropzonePopup)\">\r\n <mat-icon>publish</mat-icon>\r\n <span>{{ 'SHELL.IMPORTCONFIGURATION' | translate}}</span>\r\n </button>\r\n <!--<div class=\"filter-data custom-box language-section\" (click)=\"$event.stopPropagation()\">\r\n <mat-select placeholder=\"\" name=\"currentLang\" [(ngModel)]=\"currentLang\" (selectionChange)=\"setLang()\">\r\n <mat-select-trigger>\r\n <div fxLayout=\"row\" fxLayoutGap=\"15px\">\r\n <mat-icon fxFlex=\"24px\" class=\"language-icon\">language</mat-icon>\r\n <span fxFlex=\"calc(100% - 40px)\" class=\"language-display\">{{ selectedLangName }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option value=\"option\" *ngFor=\"let lang of availableLangs\" [value]=\"lang.code\">\r\n {{ lang.name }}\r\n </mat-option>\r\n </mat-select>\r\n </div>-->\r\n <button mat-menu-item (click)=\"onNavigateToBillingScreen()\" *ngIf=\"canAccess_feature_ManageAccountsAndBilling\">\r\n <mat-icon>account_balance</mat-icon>\r\n <span>Account & Billing</span>\r\n </button>\r\n <button mat-menu-item (click)=\"onNavigateToPricingScreen()\" *ngIf=\"canAccess_feature_ManageAccountsAndBilling\">\r\n <mat-icon>account_balance_wallet</mat-icon>\r\n <span>Pricing & Features</span>\r\n </button>\r\n\r\n <button *ngIf=\"canAccess_feature_AlternateSignIn\" mat-menu-item (click)=\"alternateSignIn()\"\r\n [style.overflow]=\"'visible'\" matTooltipClass=\"tooltipClass-mat\" matTooltip=\"{{ 'SHELL.SIGNINAS' | translate}}\">\r\n <mat-icon>how_to_reg</mat-icon>\r\n <span>{{ 'SHELL.SIGNINAS' | translate}}</span>\r\n </button>\r\n <button mat-menu-item (click)=\"onSignout()\">\r\n <mat-icon>exit_to_app</mat-icon>\r\n <span>{{ 'SHELL.SIGNOUT' | translate}}</span>\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"feedBackPopover.toggle();openFeedBackDialog()\">\r\n <mat-icon class=\"feedback-icon\" [satPopoverAnchorFor]=\"feedBackPopover\">\r\n sentiment_satisfied_alt\r\n </mat-icon>\r\n <span>v-{{applicationVersion}}</span>\r\n </button>\r\n </mat-menu>\r\n</mat-toolbar>\r\n<!-- <ngx-ui-loader fgsSize=\"180\" [fgsType]=\"spinnerType\" color=\"primary\"></ngx-ui-loader> -->\r\n<div *ngIf=\"loading\" class=\"k-i-loading\"></div>\r\n<sat-popover #feedBackPopover verticalAlign=\"below\" hasBackdrop backdropClass=\"backdrop-color\"\r\n [interactiveClose]=\"false\" horizontalAlign=\"end\">\r\n <app-submit-feedback *ngIf=\"isFeedBackDialog\" (closeDialog)=\"closeFeedBacklogDialog()\">\r\n </app-submit-feedback>\r\n</sat-popover>\r\n\r\n<mat-menu #menu2=\"matMenu\" class=\"dialog_window\" (click)=\"$event.stopPropagation()\">\r\n <mat-card-content class=\"p-0 m-0 listof_assets store-list-dropdown\" id=\"style-1\">\r\n <mat-list class=\"compact-list\">\r\n <mat-card class=\"p-0 asset-card\" *ngIf=\"(canAccess_feature_AddOrUpdateForm || canAccess_feature_ViewForms)\"\r\n [routerLink]=\"['/applications/view-forms']\">\r\n <span class=\"hide-content-overflow userStory-name-control store-dropdown-padding\">Forms</span>\r\n </mat-card>\r\n <mat-card class=\"p-0 asset-card\" *ngIf=\"canAccess_feature_AddOrUpdateApplications\"\r\n [routerLink]=\"['/applications/custom-applications']\">\r\n <span class=\"hide-content-overflow userStory-name-control store-dropdown-padding\">Custom\r\n applications</span>\r\n </mat-card>\r\n <mat-card *ngIf=\"canAccess_feature_ViewRoles\" class=\"p-0 asset-card\"\r\n [routerLink]=\"['/rolemanagement/rolemanagement']\">\r\n <span class=\"hide-content-overflow userStory-name-control store-dropdown-padding\">Role\r\n configuration</span>\r\n </mat-card>\r\n <mat-card *ngIf=\"canAccess_feature_ManageProjectRolePermissions\" class=\"p-0 asset-card\"\r\n [routerLink]=\"['/rolemanagement/entityrolemanagement']\">\r\n <span class=\"hide-content-overflow userStory-name-control store-dropdown-padding\">{{projectRoleText |\r\n softLabelsPipe : softLabels}}</span>\r\n </mat-card>\r\n </mat-list>\r\n </mat-card-content>\r\n</mat-menu>\r\n\r\n<div [@fade] *ngIf=\"displayWelcomeNote && userFullName\" class=\"welcome-note\">\r\n <span *ngIf=\"loggedInCount == 1; else elseSpan\">Welcome &nbsp; </span> <span> {{ userFullName }} </span>\r\n <ng-template #elseSpan> Welcome back &nbsp;</ng-template>\r\n</div>\r\n<sat-popover #fileUploadDropzonePopover hasBackdrop [interactiveClose]=\"false\" backdropClass=\"testrun-popover\"\r\n scrollStrategy=\"reposition\">\r\n <mat-card class=\"p-0 mr-0 custom-hrm-dropzone\">\r\n <mat-card-title>\r\n <div class=\"card-title-text mat-bg-primary p-05\" fxLayout=\"row\">\r\n <div fxFlex class=\"text-center\">\r\n {{'TESTMANAGEMENT.UPLOADFILES' | translate}}\r\n </div>\r\n <div fxFlex=\"20px\" fxLayoutAlign=\"end center\">\r\n <button class=\"inline_edit_close_btn btn\" (click)=\"closeUploadFilePopup()\">\r\n <fa-icon icon=\"times\"></fa-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </mat-card-title>\r\n <div class=\"m-1\">\r\n <div class=\"custom-dropzone dropzone-height\" ngx-dropzone (change)=\"filesSelected($event)\" accept=\".json\">\r\n <ngx-dropzone-label>\r\n <span>{{'DOCUMENTMANAGEMENT.DRAGANDDROPFILESHERE' | translate}}</span>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-preview class=\"custom-dropzone-preview\" *ngFor=\"let f of files\" [removable]=\"true\"\r\n (removed)=\"onRemove(f)\">\r\n <ngx-dropzone-label class=\"custom-dropzone-label\" [attr.data-tip]=\"f.name\">\r\n {{ setLabelNameForDropzone(f.name) }}\r\n </ngx-dropzone-label>\r\n </ngx-dropzone-preview>\r\n </div>\r\n <div class=\"m-05 text-muted\" style=\"text-align: center;\">\r\n <span>allowed file extensions : .json</span>\r\n </div>\r\n <mat-progress-bar color=\"primary\" mode=\"determinate\" [value]=\"progressValue\" *ngIf=\"progressValue > 0\">\r\n </mat-progress-bar>\r\n <div *ngIf=\"progressValue > 0\">\r\n {{progressValue}}% completed (Uploading {{fileCounter}} of {{files.length}} files)\r\n </div>\r\n <div class=\"mt-05\" fxLayoutAlign=\"center end\" *ngIf=\"filesPresent\">\r\n <button mat-button mat-raised-button color=\"primary\" (click)=\"saveFiles()\">\r\n <fa-icon class=\"mr-05\" icon=\"save\"></fa-icon>{{'UPLOAD' | translate}}\r\n </button>\r\n <button class=\"ml-1\" mat-button mat-raised-button (click)=\"removeAllFiles();\">\r\n <fa-icon class=\"mr-05\" icon=\"times\"></fa-icon>{{'DOCUMENTMANAGEMENT.CLEARFILES' | translate}}\r\n </button>\r\n </div>\r\n <div class=\"mt-05\" fxLayoutAlign=\"center end\" *ngIf=\"importingInProgress\">\r\n <button class=\"ml-1\" mat-button mat-raised-button [disabled]=\"true\">\r\n <fa-icon class=\"mr-05\" icon=\"upload\"></fa-icon>{{'SHELL.IMPORTINGTEXT' | translate }}\r\n <i class=\"fa fa-spin fa-spinner\" *ngIf=\"importingInProgress\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </mat-card>\r\n</sat-popover>\r\n\r\n<style>\r\n .file-or-folder-icon {\r\n width: 50px;\r\n height: 50px;\r\n font-size: 50px;\r\n }\r\n\r\n .file-or-folder-name-align {\r\n overflow: hidden;\r\n display: -webkit-box;\r\n -webkit-line-clamp: 2;\r\n -webkit-box-orient: vertical;\r\n text-align: center;\r\n word-break: break-word;\r\n }\r\n\r\n .dropzone-height {\r\n height: 130px;\r\n }\r\n\r\n .custom-dropzone-preview {\r\n height: 100px !important;\r\n min-height: 100px !important;\r\n padding: 0px !important;\r\n }\r\n</style>\r\n<ng-template #openAnnoucementDialogComponent let-data>\r\n <announcement-dialog [data]=[data]></announcement-dialog>\r\n</ng-template>", styles: ["\n .file-or-folder-icon {\n width: 50px;\n height: 50px;\n font-size: 50px;\n }\n\n .file-or-folder-name-align {\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n text-align: center;\n word-break: break-word;\n }\n\n .dropzone-height {\n height: 130px;\n }\n\n .custom-dropzone-preview {\n height: 100px !important;\n min-height: 100px !important;\n padding: 0px !important;\n }\n"], components: [{ type: i19.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { type: i20.MenuComponent, selector: "app-menu", inputs: ["reload"], outputs: ["isOpened", "openNewDashboard"] }, { type: i21.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i22.SnovasysAvatarComponent, selector: "app-avatar", inputs: ["avatarClass", "name", "src", "isRound", "size"] }, { type: i23.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i24.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i25.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i26.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i27.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i28.NotificationsComponent, selector: "app-notifications", inputs: ["notificPanel"] }, { type: i29.SatPopover, selector: "sat-popover", inputs: ["backdropClass", "horizontalAlign", "xAlign", "verticalAlign", "yAlign", "forceAlignment", "lockAlignment", "autoFocus", "restoreFocus", "scrollStrategy", "hasBackdrop", "interactiveClose", "openTransition", "closeTransition"], outputs: ["opened", "closed", "afterOpen", "afterClose", "backdropClicked", "overlayKeydown"] }, { type: i30.FeedTimeComponent, selector: "app-feed-time", inputs: ["isFeedTimeSheet"], outputs: ["closeFeedTimeSheetPopup"] }, { type: i27.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { type: i31.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: i32.FeedBackSubmissionComponent, selector: "app-submit-feedback", outputs: ["closeDialog"] }, { type: i33.MatList, selector: "mat-list, mat-action-list", inputs: ["disableRipple", "disabled"], exportAs: ["matList"] }, { type: i34.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i35.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "listItem", "rotate", "fixedWidth", "transform"] }, { type: i36.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable"], outputs: ["change"] }, { type: i36.NgxDropzonePreviewComponent, selector: "ngx-dropzone-preview", inputs: ["removable", "file"], outputs: ["removed"] }, { type: i37.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "mode", "value", "bufferValue"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { type: i38.AnnoucementDialogComponent, selector: "announcement-dialog", inputs: ["data"], outputs: ["closeMatDialog"] }], directives: [{ type: i39.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i39.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i40.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { type: i39.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i41.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i42.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i42.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i21.MatSelectTrigger, selector: "mat-select-trigger" }, { type: i39.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i41.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i40.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i43.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i44.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i42.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i41.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i41.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i40.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i29.SatPopoverAnchor, selector: "[satPopoverAnchorFor]", inputs: ["satPopoverAnchorFor"], outputs: ["popoverOpened", "popoverClosed"], exportAs: ["satPopoverAnchor"] }, { type: i27.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["matMenuTriggerRestoreFocus", "mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { type: i34.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i6.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["routerLink", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i34.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i36.ɵb, selector: "ngx-dropzone-label" }], pipes: { "removeSpecialCharacters": i45.RemoveSpecialCharactersPipe, "fetchSizedAndCachedImage": i46.FetchSizedAndCachedImagePipe, "translate": i5.TranslatePipe, "softLabelsPipe": i47.SoftLabelPipe }, animations: [
1596
+ trigger('fade', [
1597
+ transition('void => *', [
1598
+ style({ opacity: 0 }),
1599
+ animate(2000, style({ opacity: 1 })),
1600
+ animate(6000, style({ opacity: 0 }))
1601
+ ])
1602
+ ])
1603
+ ] });
1604
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.1", ngImport: i0, type: HeaderSideComponent, decorators: [{
1605
+ type: Component,
1606
+ args: [{
1607
+ selector: "app-header-side",
1608
+ templateUrl: "./header-side.template.html",
1609
+ animations: [
1610
+ trigger('fade', [
1611
+ transition('void => *', [
1612
+ style({ opacity: 0 }),
1613
+ animate(2000, style({ opacity: 1 })),
1614
+ animate(6000, style({ opacity: 0 }))
1615
+ ])
1616
+ ])
1617
+ ]
1618
+ }]
1619
+ }], ctorParameters: function () { return [{ type: i1.PushNotificationsService }, { type: i2.ThemeService }, { type: i3.NgxUiLoaderService }, { type: i4.LayoutService }, { type: i5.TranslateService }, { type: i6.Router }, { type: i7.CookieService }, { type: i8.MatDialog }, { type: i9.CommonService }, { type: i10.Store }, { type: i11.PubNubAngular }, { type: i12.AuthenticationService }, { type: i13.Actions }, { type: i0.ChangeDetectorRef }, { type: i14.ToastrService }, { type: i15.StoreManagementService }, { type: i16.ShellModulesService }, { type: i17.ChatService }, { type: i18.SignalrService }, { type: Window, decorators: [{
1620
+ type: Inject,
1621
+ args: [WINDOW]
1622
+ }] }]; }, propDecorators: { feedTimeSheetPopover: [{
1623
+ type: ViewChild,
1624
+ args: ['feedTimeSheet']
1625
+ }], feedBackPopOver: [{
1626
+ type: ViewChild,
1627
+ args: ['feedBackPopover']
1628
+ }], fileUploadDropzonePopup: [{
1629
+ type: ViewChildren,
1630
+ args: ["fileUploadDropzonePopup"]
1631
+ }], documentPopover: [{
1632
+ type: ViewChild,
1633
+ args: ['documentPopover']
1634
+ }], notificPanel: [{
1635
+ type: Input
1636
+ }], opened: [{
1637
+ type: Output
1638
+ }], openAnnoucementDialogComponent: [{
1639
+ type: ViewChild,
1640
+ args: ["openAnnoucementDialogComponent"]
1641
+ }] } });
1642
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLXNpZGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2hlbGwtbW9kdWxlLWNvbXBvbmVudHMvc2hlbGwtY29tcG9uZW50cy9zcmMvbGliL3NoZWxsLWNvbXBvbmVudHMvY29tcG9uZW50cy9oZWFkZXItc2lkZS9oZWFkZXItc2lkZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zaGVsbC1tb2R1bGUtY29tcG9uZW50cy9zaGVsbC1jb21wb25lbnRzL3NyYy9saWIvc2hlbGwtY29tcG9uZW50cy9jb21wb25lbnRzL2hlYWRlci1zaWRlL2hlYWRlci1zaWRlLnRlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBcUUsMkJBQTJCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNuTCxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBRUwsU0FBUyxFQUNULE1BQU0sRUFDTixZQUFZLEVBR00sWUFBWSxFQUMvQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0Isa0JBQWtCLEVBQ2xCLGtDQUFrQyxFQUNsQyxzQkFBc0IsR0FDdkIsTUFBTSxrQ0FBa0MsQ0FBQTtBQUl6QyxPQUFPLEVBQUUsTUFBTSxFQUFTLE1BQU0sYUFBYSxDQUFDO0FBSTVDLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNoSCxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsaUNBQWlDLEVBQUUsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUs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RUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzs2QkFDckMsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIO2lCQUNGOzBtQkFxSW1DLE1BQU07MEJBQXJDLE1BQU07MkJBQUMsTUFBTTs0Q0FsSVksb0JBQW9CO3NCQUEvQyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0ksZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ2EsdUJBQXVCO3NCQUEvRCxZQUFZO3VCQUFDLHlCQUF5QjtnQkFDVCxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFFbkIsWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxNQUFNO3NCQUFmLE1BQU07Z0JBQzhDLDhCQUE4QjtzQkFBbEYsU0FBUzt1QkFBQyxnQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVc2VyRGV0YWlsc0ZldGNoZWRBZnRlckxvZ2luLCBVc2VyRGV0YWlsc0ZldGNoZWRBZnRlckNvbXBhbnlMb2dpbiwgRmV0Y2hUaW1lU2hlZXRCdXR0b25EZXRhaWxzLCBSb2xlc0ZldGNoVHJpZ2dlcmVkIH0gZnJvbSAnLi8uLi8uLi9zdG9yZS9hY3Rpb25zL2F1dGhlbnRpY2F0aW9uLmFjdGlvbnMnO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIE5nTW9kdWxlUmVmLFxyXG4gIE5nTW9kdWxlRmFjdG9yeUxvYWRlcixcclxuICBWaWV3Q29udGFpbmVyUmVmLCBWaWV3Q2hpbGRyZW4sIENoYW5nZURldGVjdG9yUmVmLCBUZW1wbGF0ZVJlZlxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgUmVjZWl2ZU1lc3NhZ2VUcmlnZ2VyZWQsXHJcbiAgUHJlc2VuY2VFdmVudFRyaWdnZXJlZCxcclxuICBJbml0YWxTdGF0ZU9mVXNlcnNUcmlnZ2VyZWQsXHJcbiAgTWVzc2FnZUFjdGlvblR5cGVzLFxyXG4gIFJlY2VpdmVDaGFubmVsVXBkYXRlTW9kZWxUcmlnZ2VyZWQsXHJcbiAgUmVjZWl2ZVNpZ25hbFRyaWdnZXJlZCxcclxufSBmcm9tIFwiLi4vLi4vc3RvcmUvYWN0aW9ucy9jaGF0LmFjdGlvbnNcIlxyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHsgU2F0UG9wb3ZlciB9IGZyb20gXCJAbmNzdGF0ZS9zYXQtcG9wb3ZlclwiO1xyXG5pbXBvcnQgeyBzZWxlY3QsIFN0b3JlIH0gZnJvbSBcIkBuZ3J4L3N0b3JlXCI7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSBcIm5neC1jb29raWUtc2VydmljZVwiO1xyXG5cclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IHRha2VVbnRpbCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IEdldFVzZXJTdG9yZUlkVHJpZ2dlcmVkLCBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzIH0gZnJvbSBcIi4uLy4uL3N0b3JlL2FjdGlvbnMvYXV0aGVudGljYXRpb24uYWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBDbGVhckFsbFVucmVhZE5vdGlmaWNhdGlvbnNUcmlnZ2VyZWQsIENsZWFyVW5yZWFkTm90aWZpY2F0aW9uc1RyaWdnZXJlZCwgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQsIE5vdGlmaWNhdGlvbnNBY3Rpb25UeXBlcywgVXBzZXJ0VW5yZWFkTm90aWZpY2F0aW9uc1RyaWdnZXJlZCB9IGZyb20gXCIuLi8uLi9zdG9yZS9hY3Rpb25zL25vdGlmaWNhdGlvbnMuYWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBTdGF0ZSB9IGZyb20gXCIuLi8uLi9zdG9yZS9yZWR1Y2Vycy9pbmRleFwiO1xyXG5pbXBvcnQgKiBhcyBzaGFyZWRNb2R1bGVSZWR1Y2VycyBmcm9tIFwiLi4vLi4vc3RvcmUvcmVkdWNlcnMvaW5kZXhcIjtcclxuaW1wb3J0ICcuLi8uLi8uLi9nbG9iYWxkZXBlbmRlbmNpZXMvaGVscGVycy9mb250YXdlc29tZS1pY29ucyc7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gXCIuLi9jb25maXJtYXRpb24tZGlhbG9nL2NvbmZpcm1hdGlvbi1kaWFsb2cuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvY29tbW9uLXVzZWQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBBY3Rpb25zLCBvZlR5cGUgfSBmcm9tIFwiQG5ncngvZWZmZWN0c1wiO1xyXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vLi4vZ2xvYmFsZGVwZW5kZW5jaWVzL2NvbnN0YW50cy9sb2NhbHN0b3JhZ2UtcHJvcGVydGllcyc7XHJcbmltcG9ydCB7IENoYW5uZWxOYW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jaGFubmVsLW5hbWVzJztcclxuaW1wb3J0IHsgV0lORE9XIH0gZnJvbSAnLi4vLi4vLi4vZ2xvYmFsZGVwZW5kZW5jaWVzL2hlbHBlcnMvd2luZG93LmhlbHBlcic7XHJcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGhlbnRpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aGVtZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGF5b3V0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xheW91dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVGltZXNoZWV0RGlzYWJsZW9yRW5hYmxlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RpbWVzaGVldGVuYWJsZWRpc2FibGUnO1xyXG5pbXBvcnQgeyBUaGVtZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RoZW1lcy5tb2RlbCc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbk1vZGVsLCBOb3RpZmljYXRpb25PdXRwdXRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9Ob3RpZmljYXRpb25zT3V0UHV0TW9kZWwnO1xyXG5pbXBvcnQgeyBDdXN0b21BcHBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZ2xvYmFsZGVwZW5kZW5jaWVzL2NvbXBvbmVudHMvY29tcG9uZW50YmFzZSc7XHJcbmltcG9ydCB7IFNvZnRMYWJlbENvbmZpZ3VyYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zb2Z0bGFiZWxzLW1vZGVsJztcclxuaW1wb3J0IHsgVXNlck1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3VzZXInO1xyXG5pbXBvcnQgeyBDb21wYW5pZXNMaXN0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbXBhbmllc2xpc3QubW9kZWwnO1xyXG5pbXBvcnQgeyBTdG9yZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3N0b3JlLW1vZGVsJztcclxuaW1wb3J0IHsgQXBwTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL0FwcE5vdGlmaWNhdGlvbic7XHJcbmltcG9ydCB7IFN0b3JlU2VhcmNoTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvc3RvcmUtc2VhcmNoLW1vZGVsJztcclxuaW1wb3J0IHsgTmdNb2R1bGVGYWN0b3J5LCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFdvcmtJdGVtc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2FsbC13b3JrLWl0ZW1zLWRpYWxvZy9hbGwtd29yay1pdGVtcy1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2hlbGxNb2R1bGVzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NoZWxsLm1vZHVsZXMuc2VydmljZSc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSBcInVuZGVyc2NvcmVcIjtcclxuaW1wb3J0IHsgRmVlZFRpbWVEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9mZWVkLXRpbWUvZmVlZC10aW1lLWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25UeXBlSWRzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL25vdGlmaWNhdGlvbi10eXBlLWlkcyc7XHJcbmltcG9ydCB7IFVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1VzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uJztcclxuaW1wb3J0IHsgQ2hhbm5lbFJvdXRlcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9ub3RpZmljYXRpb24tcm91dGVzJztcclxuaW1wb3J0IHsgUm9sZVVwZGF0ZWROb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvUm9sZVVwZGF0ZWROb3RpZmljYXRpb24nO1xyXG5pbXBvcnQgeyBSZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvUmVwb3J0U3VibWl0dGVkTm90aWZpY2F0aW9uJztcclxuaW1wb3J0IHsgUmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvUmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24nO1xyXG5pbXBvcnQgeyBNdWx0aXBsZUNoYXJ0c1NjaGVkdWxpbmcgfSBmcm9tICcuLi8uLi9tb2RlbHMvbXVsdGlDaGFydHNTY2hlZHVsaW5nJztcclxuaW1wb3J0IHsgQXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9Bc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uTW9kZWwnO1xyXG5pbXBvcnQgeyBOZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL05ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uTW9kZWwnO1xyXG5pbXBvcnQgeyBHb2FsQXBwcm92ZWROb3RpZmljYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nb2FsQXBwcm92ZWROb3RpZmljYXRpb25Nb2RlbCc7XHJcbmltcG9ydCB7IFVzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3VzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsJztcclxuaW1wb3J0IHsgVXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3VzZXJTdG9yeUNvbW1lbnROb3RpZmljYXRpb25Nb2RlbCc7XHJcbmltcG9ydCB7IFNwcmludFN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwnO1xyXG5pbXBvcnQgeyBTcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvc3ByaW50UmVwbGFuUmVxdWVzdGVkTW9kZWwnO1xyXG5pbXBvcnQgeyBBbm5vdWNlbWVudERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL25vdGlmaWNhdGlvbnMvYW5ub3VuY2VtZW50LWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBXb3Jrc3BhY2VMaXN0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3dvcmtzcGFjZUxpc3QnO1xyXG5pbXBvcnQgeyBhbmltYXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBOZ3hVaUxvYWRlclNlcnZpY2UsIFNQSU5ORVIgfSBmcm9tICduZ3gtdWktbG9hZGVyJztcclxuaW1wb3J0IHsgTmV3UHJvamVjdEZlYXR1cmVDcmVhdGVkTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvTmV3UHJvamVjdEZlYXR1cmVOb3RpZmljYXRpb25Nb2RlbCc7XHJcbmltcG9ydCB7IFVzZXJTdG9yeUFyY2hpdmVOb3RpZmljYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9hcmNoaXZlVXNlclN0b3J5TW9kZWwnO1xyXG5pbXBvcnQgeyBVc2VyU3RvcnlQYXJrTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvcGFya1VzZXJTdG9yeUlucHV0TW9kZWwnO1xyXG5pbXBvcnQgeyBFeHBvcnRDb25maWd1cmF0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vZXhwb3J0LWltcG9ydC1jb25maWd1cmF0aW9uL2V4cG9ydC1jb25maWd1cmF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZpbGVNb2RlbCwgRmlsZVJlc3VsdE1vZGVsLCBTdG9yZU1hbmFnZW1lbnRTZXJ2aWNlLCBVcHNlcnRGaWxlTW9kZWwgfSBmcm9tICdAc25vdmFzeXMvc25vdmEtZG9jdW1lbnQtbWFuYWdlbWVudCc7XHJcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcclxudHlwZSBNb2R1bGVXaXRoQ29tcG9uZW50U2VydmljZSA9IFR5cGU8YW55PiAmIHsgY29tcG9uZW50U2VydmljZTogVHlwZTxhbnk+IH07XHJcbi8vIGltcG9ydCB7IENvbnN0YW50VmFyaWFibGVzIH0gZnJvbSBcIi4uL2NvbnN0YW50cy9jb25zdGFudC12YXJpYWJsZXNcIjtcclxuaW1wb3J0IFJlc3VtYWJsZSBmcm9tIFwicmVzdW1hYmxlanNcIjtcclxuaW1wb3J0IHsgQXBpVXJscyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9hcGktdXJscyc7XHJcbmltcG9ydCB7IEF2YWlsYWJsZUxhbmdzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2F2YWlsYWJsZS1sYW5ndWFnZXMnO1xyXG5pbXBvcnQgeyBJbXBvcnRDb25maWd1cmF0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvaW1wb3J0LWNvbmZpZ3VyYXRpb24tbW9kZWwnO1xyXG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NoYXQuc2VydmljZSc7XHJcbmltcG9ydCB7IE1lc3NhZ2VEZXRhaWxzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL01lc3NhZ2VEZXRhaWxzJztcclxuaW1wb3J0IHsgQ2hhbm5lbFVwZGF0ZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL0NoYW5uZWxVcGRhdGVNb2RlbCc7XHJcbmltcG9ydCB7IFB1c2hOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gJ25nLXB1c2gtaXZ5JztcclxuaW1wb3J0IHsgTWVzc2FnZVR5cGluZ0RldGFpbHMgfSBmcm9tICcuLi8uLi9tb2RlbHMvTWVzc2FnZVR5cGluZ0RldGFpbHMnO1xyXG5pbXBvcnQgeyBQdWJOdWJBbmd1bGFyIH0gZnJvbSAncHVibnViLWFuZ3VsYXIyJztcclxuXHJcblxyXG5pbXBvcnQgeyBJbnRyb01vZGVsIH0gZnJvbSBcIi4uLy4uL21vZGVscy9JbnRyb01vZGVsXCI7XHJcbmltcG9ydCB7IExlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWN0aW9uJztcclxuaW1wb3J0IHsgU2lnbmFsclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zaWduYWxyLnNlcnZpY2UnO1xyXG5cclxuLyoqIEBkeW5hbWljICovXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtaGVhZGVyLXNpZGVcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2hlYWRlci1zaWRlLnRlbXBsYXRlLmh0bWxcIixcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdmYWRlJywgW1xyXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IConLCBbXHJcbiAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAwIH0pLFxyXG4gICAgICAgIGFuaW1hdGUoMjAwMCwgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKSxcclxuICAgICAgICBhbmltYXRlKDYwMDAsIHN0eWxlKHsgb3BhY2l0eTogMCB9KSlcclxuICAgICAgXSlcclxuICAgIF0pXHJcbiAgXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEhlYWRlclNpZGVDb21wb25lbnQgZXh0ZW5kcyBDdXN0b21BcHBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAVmlld0NoaWxkKCdmZWVkVGltZVNoZWV0JykgZmVlZFRpbWVTaGVldFBvcG92ZXI6IFNhdFBvcG92ZXI7XHJcbiAgQFZpZXdDaGlsZCgnZmVlZEJhY2tQb3BvdmVyJykgZmVlZEJhY2tQb3BPdmVyOiBTYXRQb3BvdmVyO1xyXG4gIEBWaWV3Q2hpbGRyZW4oXCJmaWxlVXBsb2FkRHJvcHpvbmVQb3B1cFwiKSBmaWxlVXBsb2FkRHJvcHpvbmVQb3B1cDtcclxuICBAVmlld0NoaWxkKCdkb2N1bWVudFBvcG92ZXInKSBkb2N1bWVudFBvcG92ZXI6IFNhdFBvcG92ZXI7XHJcbiAgc29mdExhYmVsczogU29mdExhYmVsQ29uZmlndXJhdGlvbk1vZGVsW107XHJcbiAgQElucHV0KCkgbm90aWZpY1BhbmVsO1xyXG4gIEBPdXRwdXQoKSBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAVmlld0NoaWxkKFwib3BlbkFubm91Y2VtZW50RGlhbG9nQ29tcG9uZW50XCIpIHByaXZhdGUgb3BlbkFubm91Y2VtZW50RGlhbG9nQ29tcG9uZW50OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHNwaW5uZXJUeXBlID0gU1BJTk5FUi5jaXJjbGU7XHJcbiAgcHVibGljIGF2YWlsYWJsZUxhbmdzID0gQXZhaWxhYmxlTGFuZ3MubGFuZ3VhZ2VzO1xyXG4gIHB1YmxpYyBhdmFpbGFibGVMYW5nc01vYmlsZSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogXCJFblwiLFxyXG4gICAgICBjb2RlOiBcImVuXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6IFwiVGVcIixcclxuICAgICAgY29kZTogXCJ0ZVwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiBcIktvXCIsXHJcbiAgICAgIGNvZGU6IFwia29cIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogXCJBclwiLFxyXG4gICAgICBjb2RlOiBcImFyXCJcclxuICAgIH1cclxuICBdO1xyXG4gIC8vIHRoZW1lTW9kZWwkOiBPYnNlcnZhYmxlPFRoZW1lTW9kZWw+O1xyXG4gIGNvdW50T2ZOb3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xyXG4gIG5vdGlmaWNhdGlvbnMkOiBPYnNlcnZhYmxlPE5vdGlmaWNhdGlvbk91dHB1dE1vZGVsW10+O1xyXG4gIHVucmVhZENvdW50T2ZOb3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xyXG4gIGFzc2V0SWQkOiBPYnNlcnZhYmxlPHN0cmluZz47XHJcbiAgdXNlclN0b3JlSWQkOiBPYnNlcnZhYmxlPHN0cmluZz47XHJcbiAgdGhlbWVNb2RlbDogVGhlbWVNb2RlbDtcclxuICByZWxvYWQ6IGJvb2xlYW47XHJcbiAgcHVibGljIG5nRGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgZGFzaGJvYXJkRmlsdGVycyA9IHtcclxuICAgIHByb2plY3RJZDogbnVsbCxcclxuICAgIHVzZXJJZDogbnVsbCxcclxuICAgIGdvYWxJZDogbnVsbCxcclxuICAgIGlzRGFpbG9ndWU6IHRydWVcclxuICB9O1xyXG4gIHB1YmxpYyBlZ3JldFRoZW1lcztcclxuICBwdWJsaWMgbGF5b3V0Q29uZjogYW55O1xyXG4gIHB1YmxpYyB0aW1lc2hlZXREaXNhYmxlb3JFbmFibGU6IFRpbWVzaGVldERpc2FibGVvckVuYWJsZTtcclxuICBkb21haW5zOiBhbnlbXTtcclxuICBsb2FkaW5nSW5Qcm9ncmVzcyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgdGltZVB1bmNoQ2FyZFNob3cgPSBmYWxzZTtcclxuICBzaG93VHJhaWxQZXJpb2Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBhcHBsaWNhdGlvblZlcnNpb246IGFueTtcclxuICBjb21wYW5pZXNMaXN0ID0gW107XHJcbiAgbWVudVR5cGU6IHN0cmluZ1xyXG4gIGlzRmVlZEJhY2tEaWFsb2c6IGJvb2xlYW47XHJcbiAgc2VsZWN0ZWRMYW5nTmFtZTogc3RyaW5nO1xyXG4gIGN1cnJlbnRMYW5nOiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRTdG9yZUlkOiBzdHJpbmcgPSBcIlwiO1xyXG4gIHVzZXJTdG9yZUlkOiBzdHJpbmc7XHJcbiAgc3RvcmVzTGlzdDogU3RvcmVNb2RlbFtdO1xyXG4gIHZhbGlkYXRpb25NZXNzYWdlOiBzdHJpbmc7XHJcbiAgaXNSZWNvcmRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcm9qZWN0Um9sZVRleHQ6IHN0cmluZyA9ICdQcm9qZWN0IHJvbGUgY29uZmlndXJhdGlvbic7XHJcbiAgbG9nZ2VkSW5Vc2VySWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgY29tcGFueTogYW55O1xyXG4gIGxvZ2dlZFVzZXJEZXRhaWxzOiBhbnk7XHJcbiAgbm9PZkRheXM6IGFueTtcclxuICBzaG93RGVsZXRlSWNvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dEZWxldGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1N0b3JlQWNjZXNzOiBib29sZWFuID0gdHJ1ZTtcclxuICBjb21wYW55SWQ6IHN0cmluZztcclxuICByZXR1cm5Vcmw6IHN0cmluZztcclxuICBzZWxlY3RlZENvbXBhbnlOYW1lOiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRDb21wYW55OiBDb21wYW5pZXNMaXN0O1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgbG9hZGluZzogYm9vbGVhbjtcclxuICBhdXRoZW50aWNhdGVkVXNlclJlY29yZDogVXNlck1vZGVsO1xyXG4gIGVtcGxveWVlSWQ6IHN0cmluZztcclxuICBpc0ZlZWRUaW1lU2hlZXQ6IGJvb2xlYW47XHJcbiAgZGVmYXVsdERhc2hib2FyZElkOiBzdHJpbmc7XHJcbiAgdGltZVNoZWV0QnV0dG9uRGV0YWlscyQ6IE9ic2VydmFibGU8VGltZXNoZWV0RGlzYWJsZW9yRW5hYmxlPlxyXG4gIG5vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbk91dHB1dE1vZGVsW107XHJcbiAgYW5ub3VuY2VtZW50SWQ6IHN0cmluZztcclxuICBhbm5vdW5jZU5vdGlmaWNhdGlvbklkOiBzdHJpbmc7XHJcbiAgZGlzcGxheVdlbGNvbWVOb3RlOiBib29sZWFuO1xyXG4gIGxvZ2dlZEluQ291bnQ6IGFueTtcclxuICB1c2VyRnVsbE5hbWU6IGFueTtcclxuICBmaWxlczogRmlsZVtdID0gW107XHJcbiAgZmlsZXNQcmVzZW50OiBib29sZWFuO1xyXG4gIHByb2dyZXNzVmFsdWU6IG51bWJlcjtcclxuICBmaWxlUmVzdWx0TW9kZWw6IEZpbGVSZXN1bHRNb2RlbFtdO1xyXG4gIG1vZHVsZVR5cGVJZCA9IDk7XHJcbiAgYW55T3BlcmF0aW9uSW5Qcm9ncmVzczogYm9vbGVhbjtcclxuICBmaWxlSW5kZXg6IG51bWJlciA9IDA7XHJcbiAgZmlsZUNvdW50ZXI6IG51bWJlciA9IDE7XHJcbiAgdXBsb2FkZWRGaWxlTmFtZXMgPSBbXTtcclxuICBpc0ZpbGVVcGxvYWRDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0ZvbGRlclVwbG9hZENvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGltcG9ydGluZ0luUHJvZ3Jlc3M6IGJvb2xlYW47XHJcbiAgc2VhcmNoVGV4dDogc3RyaW5nID0gbnVsbDtcclxuICAvLyBtZXNzYWdlc1VucmVhZENvdW50OiBudW1iZXIgPSAwO1xyXG4gIGNoYW5uZWxMaXN0OiBhbnk7XHJcbiAgdXNlckNoYW5uZWxzOiBhbnk7XHJcbiAgY29sbGVhZ3Vlc0xpc3Q6IGFueTtcclxuICBsb2dnZWRJblVzZXJmdWxsTmFtZTogYW55O1xyXG4gIGxvZ0luVXNlcklkID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChcIkN1cnJlbnRVc2VySWRcIik7XHJcbiAgbG9naW5Vc2VyY2hhbm5lbE5hbWU6IHN0cmluZztcclxuICBwcmV2aW91c01lc3NhZ2UgOiBhbnk7XHJcbiAgcHVibGlzaGluZ01lc3NhZ2VPZlVzZXIgOmFueTtcclxuICBuZXdOb3RpZmljYXRpb25zQ291bnQ6IGFueSA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBwdXNoTm90aWZpY2F0aW9uczogUHVzaE5vdGlmaWNhdGlvbnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0aGVtZVNlcnZpY2U6IFRoZW1lU2VydmljZSxcclxuICAgIHByaXZhdGUgbmd4U2VydmljZTogTmd4VWlMb2FkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsYXlvdXQ6IExheW91dFNlcnZpY2UsXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBjb29raWVTZXJ2aWNlOiBDb29raWVTZXJ2aWNlLFxyXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmU8U3RhdGU+LFxyXG4gICAgcHJpdmF0ZSBwdWJudWI6IFB1Yk51YkFuZ3VsYXIsXHJcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoZW50aWNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFjdGlvblVwZGF0ZXMkOiBBY3Rpb25zLFxyXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RvcmVNYW5hZ2VtZW50U2VydmljZTogU3RvcmVNYW5hZ2VtZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgU2hlbGxNb2R1bGVzU2VydmljZTogU2hlbGxNb2R1bGVzU2VydmljZSxcclxuICAgIHByaXZhdGUgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzaWduYWxyOiBTaWduYWxyU2VydmljZSxcclxuICAgIEBJbmplY3QoV0lORE9XKSBwcml2YXRlIHdpbmRvdzogV2luZG93XHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgLy8gdGhpcy5zaWduYWxyLmluaXRpYWxpemVTaWduYWxSQ29ubmVjdGlvbigpO1xyXG4gICAgdGhpcy5zaWduYWxyLm5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB0aGlzLm5ld05vdGlmaWNhdGlvbnNDb3VudCA9IGRhdGEgJiYgZGF0YS5sZW5ndGggPyBkYXRhLmxlbmd0aCA6IDApO1xyXG5cclxuICAgIHRoaXMucHVzaE5vdGlmaWNhdGlvbnMucmVxdWVzdFBlcm1pc3Npb24oKTtcclxuICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgIC8vIHRoaXMuZ2V0QWN0VHJhY2tlclJlY29yZGVyKCk7XHJcbiAgICBpZiAoKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuVXNlck1vZGVsKSAhPSBudWxsICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuVXNlck1vZGVsKSAhPSB1bmRlZmluZWQpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5sb2FkTm90aWZpY2F0aW9ucygpO1xyXG4gICAgfVxyXG4gICAgbGV0IGN1cnJlbnRDdWx0dXJlID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRDdWx0dXJlKTtcclxuICAgIGNvbnN0IGNvbXBhbnlsYW4gPSBKU09OLnBhcnNlKHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Db21wYW55RGV0YWlscykpO1xyXG4gICAgbGV0IGN1cnJlbnRDdWx0dXJlbGFuID0gY29tcGFueWxhbi5sYW5Db2RlO1xyXG5cclxuICAgIGlmIChjdXJyZW50Q3VsdHVyZSA9PSAnJyB8fCBjdXJyZW50Q3VsdHVyZSA9PSBudWxsIHx8IGN1cnJlbnRDdWx0dXJlID09IHVuZGVmaW5lZCB8fCBjdXJyZW50Q3VsdHVyZSA9PT0gJ251bGwnIHx8IGN1cnJlbnRDdWx0dXJlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBpZiAoY3VycmVudEN1bHR1cmVsYW4gPT0gJycgfHwgY3VycmVudEN1bHR1cmVsYW4gPT0gbnVsbCB8fCBjdXJyZW50Q3VsdHVyZWxhbiA9PSB1bmRlZmluZWQgfHwgY3VycmVudEN1bHR1cmVsYW4gPT09ICdudWxsJyB8fCBjdXJyZW50Q3VsdHVyZWxhbiA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBjdXJyZW50Q3VsdHVyZSA9ICdlbic7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY3VycmVudEN1bHR1cmUgPSBjdXJyZW50Q3VsdHVyZWxhbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jdXJyZW50TGFuZyA9IGN1cnJlbnRDdWx0dXJlO1xyXG4gICAgbGV0IGVudmlyb25tZW50ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkVudmlyb25tZW50KSk7XHJcbiAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudEN1bHR1cmUsIHRoaXMuY3VycmVudExhbmcsIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICB0aGlzLmFjdGlvblVwZGF0ZXMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveWVkJCksXHJcbiAgICAgICAgb2ZUeXBlKEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuVXNlckRldGFpbHNGZXRjaGVkQWZ0ZXJDb21wYW55TG9naW4pLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlbG9hZCA9IHRydWU7XHJcbiAgICAgICAgICAvLyB0aGlzLmNoYXRTZXJ2aWNlLmdldFJlY2VudENoYW5uZWxNZXNzYWdlcygpLnN1YnNjcmliZSgocmVjZW50Q2hhbm5lbE1lc3NhZ2VzOiBhbnkpID0+IHtcclxuICAgICAgICAgIC8vICAgcmVjZW50Q2hhbm5lbE1lc3NhZ2VzLmRhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgIC8vICAgICB0aGlzLm1lc3NhZ2VzVW5yZWFkQ291bnQgKz0gZWxlbWVudC51bnJlYWRNZXNzYWdlQ291bnQ7XHJcbiAgICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAvLyB0aGlzLmNoYXRTZXJ2aWNlLmdldFJlY2VudEluZGl2aWR1YWxNZXNzYWdlcygpLnN1YnNjcmliZSgocmVjZW50Q29sbGVhZ3VlTWVzc2FnZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgLy8gICB2YXIgdW5pcSA9IHt9O1xyXG4gICAgICAgICAgLy8gICByZWNlbnRDb2xsZWFndWVNZXNzYWdlcy5kYXRhID0gcmVjZW50Q29sbGVhZ3VlTWVzc2FnZXMuZGF0YS5maWx0ZXIob2JqID0+ICF1bmlxW29iai5pZF0gJiYgKHVuaXFbb2JqLmlkXSA9IHRydWUpKTtcclxuICAgICAgICAgIC8vICAgcmVjZW50Q29sbGVhZ3VlTWVzc2FnZXMuZGF0YS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgLy8gICAgIGlmKGVsZW1lbnQuaWQgIT0gdGhpcy5sb2dnZWRJblVzZXJJZCl7XHJcbiAgICAgICAgICAvLyAgICAgdGhpcy5tZXNzYWdlc1VucmVhZENvdW50ICs9IGVsZW1lbnQudW5yZWFkTWVzc2FnZUNvdW50O1xyXG4gICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgIC8vICAgfSk7XHJcbiAgICAgICAgICAvLyB9KTtcclxuICAgIHRoaXMuZ2V0SW50cm9EZXRhaWxzKCk7XHJcbiAgICAgICAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgICAgICAgICB0aGlzLmdldE5vdGlmaWNhdGlvbnMoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGVhbU1lbWJlcnMoKTtcclxuICAgICAgICAgIHZhciBEZWZhdWx0RGFzaGJvYXJkSWRGb3JMb2dnZWRJblVzZXIgPSB0aGlzLmNvb2tpZVNlcnZpY2UuY2hlY2soTG9jYWxTdG9yYWdlUHJvcGVydGllcy5EZWZhdWx0RGFzaGJvYXJkKSA/IEpTT04ucGFyc2UodGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkRlZmF1bHREYXNoYm9hcmQpKSA6IG51bGw7XHJcbiAgICAgICAgICBjb25zdCB1c2VyUmVmZXJlbmNlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Vc2VyUmVmZXJlbmNlSWQpO1xyXG4gICAgICAgICAgaWYgKCFEZWZhdWx0RGFzaGJvYXJkSWRGb3JMb2dnZWRJblVzZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMucmV0dXJuVXJsXSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHVzZXJSZWZlcmVuY2UgIT0gXCJudWxsXCIgJiYgdXNlclJlZmVyZW5jZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoXCJkYXNoYm9hcmQtbWFuYWdlbWVudC9kYXNoYm9hcmQvXCIgKyBEZWZhdWx0RGFzaGJvYXJkSWRGb3JMb2dnZWRJblVzZXIgKyBcIi9mb3JtL1wiICsgdXNlclJlZmVyZW5jZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFwiZGFzaGJvYXJkLW1hbmFnZW1lbnQvZGFzaGJvYXJkL1wiICsgRGVmYXVsdERhc2hib2FyZElkRm9yTG9nZ2VkSW5Vc2VyKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcblxyXG5cclxuICAgIHRoaXMuYWN0aW9uVXBkYXRlcyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubmdEZXN0cm95ZWQkKSxcclxuICAgICAgICBvZlR5cGUoQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5Vc2VyRGV0YWlsc0ZldGNoZWRBZnRlckxvZ2luKSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvb2tpZVNlcnZpY2UuY2hlY2soTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlcklkKSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IEN1cnJlbnRVc2VySWQgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudFVzZXJJZCk7XHJcbiAgICAgICAgICAgICAgLy8gU3Vic2NyaWJlIHRvIFRhc2sgQXNzaWdubWVudCBOb3RpZmljYWl0b25zIGhlcmUuXHJcbiAgICAgICAgICAgICAgY29uc3QgdGFza0Fzc2lnbm1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfVGFza0Fzc2lnbm1lbnRzICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgICBjb25zdCB0YXN0YXR1c1JlcG9ydFN1Ym1pc3Npb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfU3RhdHVzUmVwb3J0U3VibWlzc2lvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGFzdGF0dXNDb25maWdBc3NpZ25DaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfU3RhdHVzQ29uZmlnQXNzaWduICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgICBjb25zdCBtdWx0aUNoYXJ0c1NjaGVkdWxpbmdDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTXVsdGlDaGFydHNTY2hlZHVsaW5nICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgICBjb25zdCBhc3NldHNBc3NpZ25lZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Bc3NldEFzc2lnbm1lbnQgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHByb2plY3RDcmVhdGVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX05ld1Byb2plY3QgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHByb2plY3RBY2Nlc3NUb01lbWJlckNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Qcm9qZWN0TWVtYmVyUm9sZSArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgICAgY29uc3QgZ29hbEFwcHJvdmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX0dvYWxBcHByb3ZlZEZyb21SZXBsYW4gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHVzZXJTdG9yeVVwZGF0ZUNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Vc2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICAgIGNvbnN0IEFubm91bmNlbWVudENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Bbm5vdW5jZW1lbnROb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHB1cmNoYXNlRXhlY3V0aW9uQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUHVyY2hhc2VFeGVjdXRpb25Bc3NpZ25Ub0VtcGxveWVlTm90aWZpY2F0aW9uICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgdGFza0Fzc2lnbm1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgdGFzdGF0dXNSZXBvcnRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0byBcIiArIHRhc3RhdHVzQ29uZmlnQXNzaWduQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBwcm9qZWN0Q3JlYXRlZENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHByb2plY3RBY2Nlc3NUb01lbWJlckNoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHVzZXJTdG9yeVVwZGF0ZUNoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIEFubm91bmNlbWVudENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHB1cmNoYXNlRXhlY3V0aW9uQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgICBwdWJudWIuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIGNoYW5uZWxzOiBbdGFza0Fzc2lnbm1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCB0YXN0YXR1c1JlcG9ydFN1Ym1pc3Npb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvLFxyXG4gICAgICAgICAgICAgICAgICB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8sIG11bHRpQ2hhcnRzU2NoZWR1bGluZ0NoYW5uZWxUb1N1YnNjcmliZUludG8sXHJcbiAgICAgICAgICAgICAgICAgIGFzc2V0c0Fzc2lnbmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgcHJvamVjdENyZWF0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCAsXHJcbiAgICAgICAgICAgICAgICAgIHByb2plY3RBY2Nlc3NUb01lbWJlckNoYW5uZWxUb1N1YnNjcmliZUludG8sIGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8sXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJTdG9yeVVwZGF0ZUNoYW5uZWxUb1N1YnNjcmliZUludG8sIEFubm91bmNlbWVudENoYW5uZWxUb1N1YnNjcmliZUludG8scHVyY2hhc2VFeGVjdXRpb25Bc3NpZ25lZENoYW5uZWxUb1N1YnNjcmliZUludG9dXHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIEFkZCBvdGhlciBzdWJzY3JpcHRpb25zIGhlcmUuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJVc2VyIG5vdCBsb2dnZWQgaW4geWV0IHRvIGJlIGFibGUgdG8gc3Vic2NyaWJlLlwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHJvbGVVcGRhdGVzQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1JvbGVVcGRhdGVzICsgXCIxOUI2RjlGQy03MzcwLTRCOUMtQTA1Qy0zQjhEODE5RUVFQUZcIjtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0byBcIiArIHJvbGVVcGRhdGVzQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICAgICAgICAgIHB1Ym51Yi5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIGNoYW5uZWxzOiBbcm9sZVVwZGF0ZXNDaGFubmVsVG9TdWJzY3JpYmVJbnRvXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0sIDMwMDApO1xyXG4gICAgICAgIH0pKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLmFjdGlvblVwZGF0ZXMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveWVkJCksXHJcbiAgICAgICAgb2ZUeXBlKE5vdGlmaWNhdGlvbnNBY3Rpb25UeXBlcy5DbGVhckFsbFVucmVhZE5vdGlmaWNhdGlvbnNDb21wbGV0ZWQpLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChzaGFyZWRNb2R1bGVSZWR1Y2Vycy5nZXROb3RpZmljYXRpb25BbGwpKTtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucyQuc3Vic2NyaWJlKHggPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSB4O1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubm90aWZpY2F0aW9ucy5maW5kSW5kZXgoKHApID0+IEpTT04ucGFyc2UocC5ub3RpZmljYXRpb25Kc29uKS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Bbm5vdW5jZW1lbnRfUmVjZWl2ZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAvL3RoaXMuYW5ub3VuY2VOb3RpZmljYXRpb25JZCA9IEpTT04ucGFyc2UodGhpcy5ub3RpZmljYXRpb25zW2luZGV4XS5ub3RpZmljYXRpb25Kc29uKS5ub3RpZmljYXRpb25JZDtcclxuICAgICAgICAgICAgICB0aGlzLmFubm91bmNlTm90aWZpY2F0aW9uSWQgPSB0aGlzLm5vdGlmaWNhdGlvbnNbaW5kZXhdLm5vdGlmaWNhdGlvbklkO1xyXG4gICAgICAgICAgICAgIHRoaXMub3BlbkFubm91bmNlbWVudERpYWxvZyhKU09OLnBhcnNlKHRoaXMubm90aWZpY2F0aW9uc1tpbmRleF0ubm90aWZpY2F0aW9uSnNvbikpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIC8vIHRoaXMuYWN0aW9uVXBkYXRlcyRcclxuICAgIC8vICAgLnBpcGUoXHJcbiAgICAvLyAgICAgdGFrZVVudGlsKHRoaXMubmdEZXN0cm95ZWQkKSxcclxuICAgIC8vICAgICBvZlR5cGUoTWVzc2FnZUFjdGlvblR5cGVzLkNvdW50Q29tcGxldGVkKSxcclxuICAgIC8vICAgICB0YXAoKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAvLyAgICAgICB0aGlzLm1lc3NhZ2VzVW5yZWFkQ291bnQgPSByZXN1bHQubWVzc2FnZUNvdW50O1xyXG4gICAgLy8gICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAvLyAgICAgfSlcclxuICAgIC8vICAgKVxyXG4gICAgLy8gICAuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25VcGRhdGVzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5uZ0Rlc3Ryb3llZCQpLFxyXG4gICAgICAgIG9mVHlwZShNZXNzYWdlQWN0aW9uVHlwZXMuUmVxdWVzdGluZ1N0YXRlT2ZVc2Vyc0NvbXBsZXRlZCksXHJcbiAgICAgICAgdGFwKChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdWJTY3JpYmluZ1RvUHJlc2VuY2VDaGFubmVsKCk7XHJcbiAgICAgICAgICBcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuYWN0aW9uVXBkYXRlcyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubmdEZXN0cm95ZWQkKSxcclxuICAgICAgICBvZlR5cGUoTWVzc2FnZUFjdGlvblR5cGVzLk1lc3NhZ2VDb21wbGV0ZWQpLFxyXG4gICAgICAgIHRhcCgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICAgIHZhciBtZXNzYWdlRGV0YWlscyA9IHJlc3VsdFsnbWVzc2FnZURldGFpbHMnXTtcclxuICAgICAgICAgIHRoaXMucHVibGlzaGluZ01lc3NhZ2VPZlVzZXIgPSBtZXNzYWdlRGV0YWlscztcclxuICAgICAgICAgIHRoaXMucHVibGlzaGluZ01lc3NhZ2UoKTtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuYWN0aW9uVXBkYXRlcyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubmdEZXN0cm95ZWQkKSxcclxuICAgICAgICBvZlR5cGUoTWVzc2FnZUFjdGlvblR5cGVzLlNlbmRDaGFubmVsVXBkYXRlTW9kZWxDb21wbGV0ZWQpLFxyXG4gICAgICAgIHRhcCgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICAgIHZhciBjaGFubmVsVXBkYXRlTW9kZWwgPSByZXN1bHRbJ2NoYW5uZWxVcGRhdGVNb2RlbCddO1xyXG4gICAgICAgICAgdmFyIGxvZ2luQ29tcGFueUlkID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChcIkNvbXBhbnlJZFwiKTtcclxuICAgICAgICAgIHRoaXMucHVibnViLnB1Ymxpc2goe1xyXG4gICAgICAgICAgICBjaGFubmVsOiBbKGxvZ2luQ29tcGFueUlkICsgJy0nICsgY2hhbm5lbFVwZGF0ZU1vZGVsLmNoYW5uZWxJZCldLFxyXG4gICAgICAgICAgICBtZXNzYWdlOiBKU09OLnN0cmluZ2lmeShjaGFubmVsVXBkYXRlTW9kZWwpXHJcbiAgICAgICAgICB9LCBmdW5jdGlvbiAoc3RhdHVzLCByZXNvcG5zZSkge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhzdGF0dXMpXHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc29wbnNlKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICAgICBcclxuICAgICAgXHJcbiAgICB0aGlzLmFjdGlvblVwZGF0ZXMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveWVkJCksXHJcbiAgICAgICAgb2ZUeXBlKE1lc3NhZ2VBY3Rpb25UeXBlcy5TZW5kaW5nU2lnbmFsQ29tcGxldGVkKSxcclxuICAgICAgICB0YXAoKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgICB2YXIgbWVzc2FnZVR5cGluZ0RldGFpbHMgPSByZXN1bHQubWVzc2FnZVR5cGluZ0RldGFpbHM7XHJcbiAgICAgICAgICB2YXIgc2lnbmFsTWVzc2FnZT0gbmV3IE1lc3NhZ2VUeXBpbmdEZXRhaWxzKCk7XHJcbiAgICAgICAgICBzaWduYWxNZXNzYWdlLnN0YXRlID0gbWVzc2FnZVR5cGluZ0RldGFpbHMuc3RhdGU7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlVHlwaW5nRGV0YWlscyxzaWduYWxNZXNzYWdlKTtcclxuICAgICAgICAgIC8vIHRoaXMucHVibnViLnNpZ25hbCh7XHJcbiAgICAgICAgICAvLyAgIGNoYW5uZWw6W21lc3NhZ2VUeXBpbmdEZXRhaWxzLnB1Ym51YkNoYW5uZWxOYW1lT2ZNZXNzYWdlXSxcclxuICAgICAgICAgIC8vICAgbWVzc2FnZSA6IEpTT04uc3RyaW5naWZ5KHNpZ25hbE1lc3NhZ2UpXHJcbiAgICAgICAgICAvLyB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpOyAgXHJcbiAgICAgIGNvbnN0IHN0b3JlTGlzdG5lciA9IChtZXNzYWdlKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCItLS0tLS0tLS1SZWNlaXZlZCBwdWJudWIgbWVzc2FnZS0tLS0tLS0tLVwiKTtcclxuICAgICAgICAvL3RoaXMudG9hc3RyLmluZm8obWVzc2FnZS5tZXNzYWdlLlN1bW1hcnkpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvL1JlY2VpdmluZyB0aGUgVXNlciBTdG9yeSBBc3NpZ25lZCBOb3RpZmljYXRpb25cclxuICAgICAgICAgIGlmICh0eXBlb2YgKG1lc3NhZ2UubWVzc2FnZSkgPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdmFyIGluZGV4T2ZDdXJyZW50VG9waWM6IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG1lc3NhZ2VEZXRhaWxzT2JqZWN0ID0gSlNPTi5wYXJzZShtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBpZiAobWVzc2FnZURldGFpbHNPYmplY3QudGV4dE1lc3NhZ2UgfHwgbWVzc2FnZURldGFpbHNPYmplY3QuZmlsZVBhdGggfHwgbWVzc2FnZURldGFpbHNPYmplY3QubWVzc2FnZVR5cGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSZWNlaXZlTWVzc2FnZVRyaWdnZXJlZChtZXNzYWdlRGV0YWlsc09iamVjdCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2VEZXRhaWxzT2JqZWN0LmlzRnJvbUNoYW5uZWxBcmNoaXZlID09IHRydWUgfHxcclxuICAgICAgICAgICAgICBtZXNzYWdlRGV0YWlsc09iamVjdC5pc0Zyb21SZW1vdmVNZW1iZXIgPT0gdHJ1ZSB8fFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2VEZXRhaWxzT2JqZWN0LnJlZnJlc2hDaGFubmVscyA9PSB0cnVlIHx8IG1lc3NhZ2VEZXRhaWxzT2JqZWN0LmlzRnJvbUFkZE1lbWJlciA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5nZXRVc2VyQ2hhbm5lbHMoKS5zdWJzY3JpYmUoKGNoYW5uZWxzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3QgPSBjaGFubmVscy5kYXRhO1xyXG4gICAgICAgICAgICAgICAgdmFyIGxvZ2luQ29tcGFueUlkID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChcIkNvbXBhbnlJZFwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBjaGFubmVsTmFtZSA9IGxvZ2luQ29tcGFueUlkICsgJy0nICsgbWVzc2FnZURldGFpbHNPYmplY3QuY2hhbm5lbElkO1xyXG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5jaGFubmVsTGlzdC5maW5kSW5kZXgoeCA9PiB4LmlkID09IG1lc3NhZ2VEZXRhaWxzT2JqZWN0LmNoYW5uZWxJZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEgJiYgKG1lc3NhZ2VEZXRhaWxzT2JqZWN0LnJlZnJlc2hDaGFubmVscyA9PSB0cnVlIHx8IG1lc3NhZ2VEZXRhaWxzT2JqZWN0LmlzRnJvbUFkZE1lbWJlciA9PSB0cnVlKSkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnB1Ym51Yi5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzOiBbY2hhbm5lbE5hbWVdXHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1Ym51Yi51bnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsczogW2NoYW5uZWxOYW1lXVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJlY2VpdmVDaGFubmVsVXBkYXRlTW9kZWxUcmlnZ2VyZWQobWVzc2FnZURldGFpbHNPYmplY3QpKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwgIT0gXCIvY2hhdFwiICYmIG1lc3NhZ2VEZXRhaWxzT2JqZWN0Lm1lc3NhZ2VUeXBlICE9IFwiUmVhY3Rpb25cIiAmJiBtZXNzYWdlRGV0YWlsc09iamVjdC5ib2R5ICE9IG51bGwgJiYgbWVzc2FnZURldGFpbHNPYmplY3QudGl0bGUgIT0gbnVsbCAgJiYgKG1lc3NhZ2VEZXRhaWxzT2JqZWN0LmlzUGlubmVkID09IG51bGwgfHwgbWVzc2FnZURldGFpbHNPYmplY3QuaXNQaW5uZWQgPT0gdW5kZWZpbmVkKSAmJiAgKG1lc3NhZ2VEZXRhaWxzT2JqZWN0LmlzU3RhcnJlZCA9PSBudWxsIHx8IG1lc3NhZ2VEZXRhaWxzT2JqZWN0LmlzU3RhcnJlZCA9PSB1bmRlZmluZWQpICYmIG1lc3NhZ2VEZXRhaWxzT2JqZWN0LnNlbmRlclVzZXJJZCAhPSB0aGlzLmxvZ0luVXNlcklkICkge1xyXG4gICAgICAgICAgICAgIGlmIChtZXNzYWdlRGV0YWlsc09iamVjdC5jaGFubmVsSWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2V0VXNlckNoYW5uZWxzKCkuc3Vic2NyaWJlKChjaGFubmVsczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3QgPSBjaGFubmVscy5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICBpbmRleE9mQ3VycmVudFRvcGljID0gdGhpcy5jaGFubmVsTGlzdC5maW5kSW5kZXgoeCA9PiB4LmlkID09IG1lc3NhZ2VEZXRhaWxzT2JqZWN0LmNoYW5uZWxJZCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpbmRleE9mQ3VycmVudFRvcGljICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5ub3RpZmljYXRpb25PZkNoYXQobWVzc2FnZURldGFpbHNPYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ub3RpZmljYXRpb25PZkNoYXQobWVzc2FnZURldGFpbHNPYmplY3QpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLk5vdGlmaWNhdGlvbl9Xb3JrSXRlbUFzc2lnbmVkVG9Vc2VyKSB7XHJcbiAgICAgICAgICAgIHZhciB1c2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbiA9IG5ldyBVc2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbigpO1xyXG4gICAgICAgICAgICB1c2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB1c2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld1dvcmtJdGVtICsgdXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKHVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uKSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLkdlbmVyaWNOb3RpZmljYXRpb25BY3Rpdml0eSkge1xyXG4gICAgICAgICAgICB2YXIgdXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgVXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24oKTtcclxuICAgICAgICAgICAgdXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgLy8gdXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24ucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdXb3JrSXRlbSArIHVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZCh1c2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbikpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Ob3RpZmljYXRpb25fUm9sZVVwZGF0ZWQpIHtcclxuICAgICAgICAgICAgdmFyIHJvbGVVcGRhdGVkTm90aWZpY2F0aW9uID0gbmV3IFJvbGVVcGRhdGVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHJvbGVVcGRhdGVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHJvbGVVcGRhdGVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQocm9sZVVwZGF0ZWROb3RpZmljYXRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkID09IE5vdGlmaWNhdGlvblR5cGVJZHMuU3RhdHVzX1JlcG9ydF9TdW1pdHRlZCkge1xyXG4gICAgICAgICAgICB2YXIgcmVwb3J0U3VibWl0dGVkTm90aWZpY2F0aW9uID0gbmV3IFJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbigpO1xyXG4gICAgICAgICAgICByZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgcmVwb3J0U3VibWl0dGVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQocmVwb3J0U3VibWl0dGVkTm90aWZpY2F0aW9uKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlN0YXR1c19SZXBvcnRfQ29uZmlnX0NyZWF0ZWQpIHtcclxuICAgICAgICAgICAgdmFyIHJlcG9ydENvbmZpZ0Fzc2lnbmVkTm90aWZpY2F0aW9uID0gbmV3IFJlcG9ydENvbmZpZ0Fzc2lnbmVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHJlcG9ydENvbmZpZ0Fzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHJlcG9ydENvbmZpZ0Fzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQocmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkID09IE5vdGlmaWNhdGlvblR5cGVJZHMuTXVsdGlwbGVfQ2hhcnRzX1NjaGVkdWxpbmdfY3JlYXRlZCkge1xyXG4gICAgICAgICAgICB2YXIgbXVsdGlwbGVDaGFydHNTY2hlZHVsaW5nID0gbmV3IE11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZygpO1xyXG4gICAgICAgICAgICBtdWx0aXBsZUNoYXJ0c1NjaGVkdWxpbmcubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgbXVsdGlwbGVDaGFydHNTY2hlZHVsaW5nLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobXVsdGlwbGVDaGFydHNTY2hlZHVsaW5nKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLkFzc2V0c19Bc3NpZ25tZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgQXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbigpO1xyXG4gICAgICAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24ucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5SZW1pbmRlcl9Ob3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgQXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbigpO1xyXG4gICAgICAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24ucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Bbm5vdW5jZW1lbnRfUmVjZWl2ZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgQXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbigpO1xyXG4gICAgICAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24ucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAgICAgICAgIC8vIGlmIChtZXNzYWdlLm1lc3NhZ2UuSWQgIT0gdGhpcy5hbm5vdW5jZU5vdGlmaWNhdGlvbklkKSB7XHJcbiAgICAgICAgICAgIC8vICAgdGhpcy5hbm5vdW5jZU5vdGlmaWNhdGlvbklkID0gbWVzc2FnZS5tZXNzYWdlLklkO1xyXG4gICAgICAgICAgICAvLyAgIHRoaXMub3BlbkFubm91bmNlbWVudERpYWxvZyhtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZV9SZWNlaXZlZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgfHwgbWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlByb2plY3RNZW1iZXJSb2xlQWRkZWROb3RpZmljYXRpb25JZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24gPSBuZXcgTmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgICAgICAgICBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5OZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSB8fCBtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUHJvamVjdE1lbWJlclJvbGVBZGRlZE5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbiA9IG5ldyBOZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAgICAgICAgIG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLkdvYWxBcHByb3ZlZEZyb21SZXBsYW4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsID0gbmV3IEdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAgICAgICAgIGdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQoZ29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwpKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlVTZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb25Nb2RlbCA9IG5ldyBVc2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgICAgICAgICB1c2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb25Nb2RlbC5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB1c2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb25Nb2RlbC5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKHVzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5QdXNoTm90aWZpY2F0aW9uRm9yVXNlclN0b3J5Q29tbWVudC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsID0gbmV3IFVzZXJTdG9yeUNvbW1lbnROb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgICAgICAgICB1c2VyU3RvcnlDb21tZW50Tm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQodXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5TcHJpbnRTdGFydGVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwgPSBuZXcgU3ByaW50U3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAgICAgICAgIHNwcmludFN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbC5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwpKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwgPSBuZXcgU3ByaW50UmVwbGFuU3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAgICAgICAgIHNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbC5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwpKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlByb2plY3RGZWF0dXJlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdQcm9qZWN0RmVhdHVyZUNyZWF0ZWROb3RpZmljYXRpb24gPSBuZXcgTmV3UHJvamVjdEZlYXR1cmVDcmVhdGVkTm90aWZpY2F0aW9uTW9kZWwoKTtcclxuICAgICAgICAgICAgbmV3UHJvamVjdEZlYXR1cmVDcmVhdGVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIG5ld1Byb2plY3RGZWF0dXJlQ3JlYXRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKG5ld1Byb2plY3RGZWF0dXJlQ3JlYXRlZE5vdGlmaWNhdGlvbikpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuVXNlclN0b3J5QXJjaGl2ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VXNlclN0b3J5QXJjaGl2ZU1vZGVsID0gbmV3IFVzZXJTdG9yeUFyY2hpdmVOb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgICAgICAgICBuZXdVc2VyU3RvcnlBcmNoaXZlTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgbmV3VXNlclN0b3J5QXJjaGl2ZU1vZGVsLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobmV3VXNlclN0b3J5QXJjaGl2ZU1vZGVsKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Vc2VyU3RvcnlQYXJrLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdVc2VyU3RvcnlQYXJrTW9kZWwgPSBuZXcgVXNlclN0b3J5UGFya05vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAgICAgICAgIG5ld1VzZXJTdG9yeVBhcmtNb2RlbC5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBuZXdVc2VyU3RvcnlQYXJrTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChuZXdVc2VyU3RvcnlQYXJrTW9kZWwpKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuTGVhdmVBcHBsaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbiA9IG5ldyBMZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuQXBwcm92ZUxlYXZlQXBwbGljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24gPSBuZXcgTGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbigpO1xyXG4gICAgICAgICAgICBsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24ucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAgICAgICB9IFxyXG4gICAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlJlamVjdExlYXZlQXBwbGljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24gPSBuZXcgTGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbigpO1xyXG4gICAgICAgICAgICBsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24ucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAgICAgICB9IFxyXG4gICAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlJlc2lnbmF0aW9uTm90aWZpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uID0gbmV3IExlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24oKTtcclxuICAgICAgICAgICAgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbikpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgICAgICAgfSBcclxuICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5SZXNpZ25hdGlvbkFwcHJvdmFsTm90aWZpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uID0gbmV3IExlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24oKTtcclxuICAgICAgICAgICAgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbikpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgICAgICAgfSBcclxuICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5SZXNpZ25hdGlvblJlamVjdGlvbk5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbiA9IG5ldyBMZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuQXV0b1RpbWVTaGVldFN1Ym1pc3Npb25Ob3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24gPSBuZXcgTGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbigpO1xyXG4gICAgICAgICAgICBsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24ucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAgICAgICB9IFxyXG4gICAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlByb2JhdGlvbkFzc2lnbk5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbiA9IG5ldyBMZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbiA9IG5ldyBMZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbiA9IG5ldyBMZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbiA9IG5ldyBMZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUGVyZm9ybWFuY2VSZXZpZXdTdWJtaXR0ZWRCeUVtcGxveWVlTm90aWZpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uID0gbmV3IExlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24oKTtcclxuICAgICAgICAgICAgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbikpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgICAgICAgfSBcclxuICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZVJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbiA9IG5ldyBMZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGxlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUGVyZm9ybWFuY2VSZXZpZXdBc3NpZ25Ub0VtcGxveWVlTm90aWZpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uID0gbmV3IExlYXZlQXBwbGljYXRpb25Ob3RpZmljYXRpb24oKTtcclxuICAgICAgICAgICAgbGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBsZWF2ZUFwcGxpY2F0aW9uTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbikpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlB1cmNoYXNlU2hpcG1lbnROb3RpZmljYXRpb25JZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgcHVyY2hhc2VFeGVjdXRpb25Ob3RpZmljYXRpb24gPSBuZXcgTGVhdmVBcHBsaWNhdGlvbk5vdGlmaWNhdGlvbigpO1xyXG4gICAgICAgICAgICBwdXJjaGFzZUV4ZWN1dGlvbk5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBwdXJjaGFzZUV4ZWN1dGlvbk5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuRWRpdFB1cmNoYXNlRXhlY3V0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChwdXJjaGFzZUV4ZWN1dGlvbk5vdGlmaWNhdGlvbikpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFRPRE86IFNlbmQgdGhlc2UgZXJyb3JzIG9udG8gc2VydmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGb3VuZCB1bmRldGVjdGVkIG5vdGlmaWNhdGlvbiB0eXBlLiBcIiArIG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBBZGQgb3RoZXIgbm90aWZpY2F0aW9ucyBoZXJlLlxyXG4gIFxyXG4gICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgLy8gVE9ETzogU2VuZCB0aGVzZSBleGNlcHRpb25zIG9udG8gc2VydmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXhjZXB0aW9uIE9jY3VyZWRcIiArIGV4Y2VwdGlvbi5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IHN0YXR1c09mVXNlciA9IChwcmVzZW5jZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUHJlc2VuY2VFdmVudFRyaWdnZXJlZChwcmVzZW5jZUV2ZW50KSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdHlwaW5nU3RhdHVzID0gKHNpZ25hbEV2ZW50KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUmVjZWl2ZVNpZ25hbFRyaWdnZXJlZChzaWduYWxFdmVudCkpO1xyXG4gICAgICB9ICBcclxuICAgICAgdGhpcy5jaGF0U2VydmljZS5nZXRQdWJudWJLZXlzKCkuc3Vic2NyaWJlKChrZXlzOmFueSkgPT57XHJcbiAgICAgICB0aGlzLnB1Ym51Yi5pbml0KHtcclxuICAgICAgICAgcHVibGlzaEtleSA6IGtleXMuZGF0YS5wdWJsaXNoS2V5LFxyXG4gICAgICAgICBzdWJzY3JpYmVLZXkgOmtleXMuZGF0YS5zdWJzY3JpYmVLZXksXHJcbiAgICAgICAgIHV1aWQgOiB0aGlzLmxvZ0luVXNlcklkXHJcbiAgICAgICAgfSlcclxuICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2V0QWxsVXNlcnNGb3JTbGFja0FwcCgpLnN1YnNjcmliZSgoY29sbGVhZ3VlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb2xsZWFndWVzTGlzdCA9IGNvbGxlYWd1ZXMuZGF0YTtcclxuICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmdldFVzZXJDaGFubmVscygpLnN1YnNjcmliZSgoY2hhbm5lbHM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jaGFubmVsTGlzdCA9IGNoYW5uZWxzLmRhdGE7XHJcbiAgICAgICAgICB0aGlzLnNpZ25PdXRVc2VyQ2hhbm5lbHMoKTtcclxuICAgICAgICAgIHZhciBsb2dpbkNvbXBhbnlJZCA9IHRoaXMuY29va2llU2VydmljZS5nZXQoXCJDb21wYW55SWRcIik7XHJcbiAgICAgICAgICBpZiAodGhpcy5jaGFubmVsTGlzdCAhPSB1bmRlZmluZWQgfHwgdGhpcy5jaGFubmVsTGlzdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGluZGV4MSA9IDA7IGluZGV4MSA8IHRoaXMuY2hhbm5lbExpc3QubGVuZ3RoOyBpbmRleDErKykge1xyXG4gICAgICAgICAgICAgIHRoaXMucHVibnViLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBjaGFubmVsczogWyhsb2dpbkNvbXBhbnlJZCArICctJyArIHRoaXMuY2hhbm5lbExpc3RbaW5kZXgxXS5pZCldXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucHVibnViLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIGNoYW5uZWxzOiBbKCdDaGFubmVsVXBkYXRlcy0nICsgbG9naW5Db21wYW55SWQpXVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnB1Ym51Yi5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBjaGFubmVsczogWygnVXNlclVwZGF0ZXMtJyArIGxvZ2luQ29tcGFueUlkKV1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdmFyIGluZGV4MTIgPSB0aGlzLmNvbGxlYWd1ZXNMaXN0LmZpbmRJbmRleCh4ID0+IHgudXNlcklkID09IHRoaXMubG9nSW5Vc2VySWQpO1xyXG4gICAgICAgICAgaWYoaW5kZXgxMiA+IC0xKXtcclxuICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5jb2xsZWFndWVzTGlzdFtpbmRleDEyXS5mdWxsTmFtZTtcclxuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKTtcclxuICAgICAgICAgIG5hbWUgPSB0aGlzLnJlcGxhY2VBbGwobmFtZSwgXCIgXCIsIFwiXCIpXHJcbiAgICAgICAgICB0aGlzLmxvZ2luVXNlcmNoYW5uZWxOYW1lID0gKG5hbWUgKyAnLScgKyB0aGlzLmxvZ0luVXNlcklkKTtcclxuICAgICAgICAgICB0aGlzLnB1Ym51Yi5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBjaGFubmVsczogW3RoaXMubG9naW5Vc2VyY2hhbm5lbE5hbWVdXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSkgXHJcbiAgICAgICAgdGhpcy5wdWJudWIuYWRkTGlzdGVuZXIoe1xyXG4gICAgICAgICAgc3RhdHVzOiBzdCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzdC5jYXRlZ29yeSA9PT0gXCJQTlVua25vd25DYXRlZ29yeVwiKSB7XHJcbiAgICAgICAgICAgICAgdmFyIG5ld1N0YXRlID0ge1xyXG4gICAgICAgICAgICAgICAgbmV3OiBcImVycm9yXCJcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIHRoaXMucHVibnViLnNldFN0YXRlKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBzdGF0ZTogbmV3U3RhdGVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIChzdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2coc3QuZXJyb3JEYXRhLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzaWduYWw6IHNpZ25hbEV2ZW50ID0+IHtcclxuICAgICAgICAgICAgdHlwaW5nU3RhdHVzKHNpZ25hbEV2ZW50KVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHByZXNlbmNlOiBwcmVzZW5jZUV2ZW50ID0+IHtcclxuICAgICAgICAgICAgc3RhdHVzT2ZVc2VyKHByZXNlbmNlRXZlbnQpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJlZCB0byBcIiArIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBzdG9yZUxpc3RuZXIobWVzc2FnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICBhc3luYyBzaWduT3V0VXNlckNoYW5uZWxzKCl7XHJcbiAgICB0aGlzLnB1Ym51Yi51bnN1YnNjcmliZSh7IGNoYW5uZWxzOiBbdGhpcy5sb2dpblVzZXJjaGFubmVsTmFtZV0gfSk7XHJcbiAgdmFyIGxvZ2luQ29tcGFueUlkID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChcIkNvbXBhbnlJZFwiKTtcclxuICBpZiAodGhpcy5jaGFubmVsTGlzdCAhPSB1bmRlZmluZWQgfHwgdGhpcy5jaGFubmVsTGlzdCAhPSBudWxsKSB7XHJcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5jaGFubmVsTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoe1xyXG4gICAgICAgIGNoYW5uZWxzOiBbKGxvZ2luQ29tcGFueUlkICsgJy0nICsgdGhpcy5jaGFubmVsTGlzdFtpbmRleF0uaWQpXVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoe1xyXG4gICAgY2hhbm5lbHM6IFsoJ0NoYW5uZWxVcGRhdGVzLScgKyBsb2dpbkNvbXBhbnlJZCldXHJcbiAgfSk7XHJcbiAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoe1xyXG4gICAgY2hhbm5lbHM6IFsoJ1VzZXJVcGRhdGVzLScgKyBsb2dpbkNvbXBhbnlJZCldXHJcbiAgfSk7XHJcbiB9XHJcblxyXG4gIGFzeW5jIHN1YlNjcmliaW5nVG9QcmVzZW5jZUNoYW5uZWwoKXtcclxuICAgIHZhciBsb2dpbkNvbXBhbnlJZCA9IHRoaXMuY29va2llU2VydmljZS5nZXQoXCJDb21wYW55SWRcIik7XHJcbiAgICAgICAgICB2YXIgcHJlc2VuY2VDaGFubmVsID0gXCJNZXNzZW5nZXJQcmVzZW5jZS1cIiArIGxvZ2luQ29tcGFueUlkO1xyXG4gICAgICAgICAgIGF3YWl0IHRoaXMucHVibnViLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIGNoYW5uZWxzOiBbcHJlc2VuY2VDaGFubmVsXSxcclxuICAgICAgICAgICAgd2l0aFByZXNlbmNlOiB0cnVlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMucHVibnViLmhlcmVOb3coe1xyXG4gICAgICAgICAgICAgIGNoYW5uZWxzOiBbcHJlc2VuY2VDaGFubmVsXSxcclxuICAgICAgICAgICAgICBpbmNsdWRlVVVJRHM6IHRydWUsXHJcbiAgICAgICAgICAgICAgaW5jbHVkZVN0YXRlOiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIChzdGF0dXMsIHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgSW5pdGFsU3RhdGVPZlVzZXJzVHJpZ2dlcmVkKHJlc3BvbnNlKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgfVxyXG4gIHB1Ymxpc2hpbmdNZXNzYWdlKCkge1xyXG4gICAgaWYgKHRoaXMucHVibGlzaGluZ01lc3NhZ2VPZlVzZXIucHVibnViQ2hhbm5lbE5hbWVPZk1lc3NhZ2UubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnB1Ymxpc2hpbmdNZXNzYWdlT2ZVc2VyLnB1Ym51YkNoYW5uZWxOYW1lT2ZNZXNzYWdlLmZvckVhY2goY2hhbm5lbE5hbWUgPT4ge1xyXG4gICAgICAgIHRoaXMucHVibnViLnB1Ymxpc2goe1xyXG4gICAgICAgICAgY2hhbm5lbDogW2NoYW5uZWxOYW1lXSxcclxuICAgICAgICAgIG1lc3NhZ2U6IEpTT04uc3RyaW5naWZ5KHRoaXMucHVibGlzaGluZ01lc3NhZ2VPZlVzZXIpXHJcbiAgICAgICAgfSwgZnVuY3Rpb24gKHN0YXR1cywgcmVzb3Buc2UpIHtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHN0YXR1cylcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc29wbnNlKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3BlbkFubm91bmNlbWVudERpYWxvZyhhbm5vdW5jZWQpIHtcclxuICAgIHRoaXMuZGlhbG9nLmNsb3NlQWxsKCk7XHJcbiAgICBsZXQgZGlhbG9nSWQgPSBcImFubm91Y2VtZW50LWRpYWxvZ1wiO1xyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3Blbih0aGlzLm9wZW5Bbm5vdWNlbWVudERpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICBtaW5XaWR0aDogXCI2MHZ3XCIsXHJcbiAgICAgIG1heFdpZHRoOiBcIjYwdndcIixcclxuICAgICAgbWluSGVpZ2h0OiBcIjUwdmhcIixcclxuICAgICAgbWF4SGVpZ2h0OiBcIjgwdmhcIixcclxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxyXG4gICAgICBpZDogZGlhbG9nSWQsXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBkaWFsb2dJZDogZGlhbG9nSWQsXHJcbiAgICAgICAgYW5ub3VuY2VtZW50SWQ6IGFubm91bmNlZC5Bbm5vdW5jZW1lbnRJZCxcclxuICAgICAgICBhbm5vdW5jZW1lbnQ6IGFubm91bmNlZC5Bbm5vdW5jZW1lbnQsXHJcbiAgICAgICAgYW5ub3VuY2VkQnk6IGFubm91bmNlZC5Bbm5vdW5jZWRCeSxcclxuICAgICAgICBhbm5vdW5jZWRCeUlkOiBhbm5vdW5jZWQuQW5ub3VuY2VkQnlJZCxcclxuICAgICAgICBhbm5vdW5jZWRCeVVzZXJJbWFnZTogYW5ub3VuY2VkLkFubm91bmNlZEJ5VXNlckltYWdlLFxyXG4gICAgICAgIGFubm91bmNlZE9uOiBhbm5vdW5jZWQuQW5ub3VuY2VkT25cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubm90aWZpY2F0aW9ucy5maW5kSW5kZXgoKHApID0+IHAubm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IHRoaXMuYW5ub3VuY2VOb3RpZmljYXRpb25JZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMudXBzZXJ0UmVhZE5vdGlmaWNhdGlvbih0aGlzLm5vdGlmaWNhdGlvbnNbaW5kZXhdKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8vIG5vdGlmaWNhdGlvbk9mQ2hhdChtZXNzYWdlRGV0YWlsc09iamVjdCkge1xyXG4gIC8vICAgaWYodGhpcy5wcmV2aW91c01lc3NhZ2UgIT0gbWVzc2FnZURldGFpbHNPYmplY3Qpe1xyXG4gIC8vICAgdGhpcy5tZXNzYWdlc1VucmVhZENvdW50ICs9IDE7XHJcbiAgLy8gICB2YXIgaW1hZ2Vmb3JOb3RpZmljYXRpb246IGFueTtcclxuICAvLyAgIGlmIChtZXNzYWdlRGV0YWlsc09iamVjdC5zZW5kZXJQcm9maWxlSW1hZ2UgPT0gbnVsbCkge1xyXG4gIC8vICAgICBpbWFnZWZvck5vdGlmaWNhdGlvbiA9IFwiaHR0cHM6Ly9wbmdpbWFnZS5uZXQvd3AtY29udGVudC91cGxvYWRzLzIwMTgvMDUvYXZhdGFyLXBuZy1pbWFnZXMtMS5wbmdcIjtcclxuICAvLyAgIH1cclxuICAvLyAgIGVsc2Uge1xyXG4gIC8vICAgICBpbWFnZWZvck5vdGlmaWNhdGlvbiA9IG1lc3NhZ2VEZXRhaWxzT2JqZWN0LnNlbmRlclByb2ZpbGVJbWFnZTtcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBvcHRpb25zID0ge1xyXG4gIC8vICAgICBib2R5OiBtZXNzYWdlRGV0YWlsc09iamVjdC5ib2R5LFxyXG4gIC8vICAgICBpY29uOiBpbWFnZWZvck5vdGlmaWNhdGlvbixcclxuICAvLyAgICAgZGF0YToge1xyXG4gIC8vICAgICAgIHNlbmRlclVzZXJJZDogbWVzc2FnZURldGFpbHNPYmplY3Quc2VuZGVyVXNlcklkLFxyXG4gIC8vICAgICAgIGNoYW5uZWxJZDogbWVzc2FnZURldGFpbHNPYmplY3QuY2hhbm5lbElkXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMucHVzaE5vdGlmaWNhdGlvbnMuY3JlYXRlKG1lc3NhZ2VEZXRhaWxzT2JqZWN0LnRpdGxlLCBvcHRpb25zKS5zdWJzY3JpYmUoXHJcbiAgLy8gICAgIHJlcyA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHJlcy5ldmVudC50eXBlID09PSAnY2xpY2snKSB7XHJcbiAgLy8gICAgICAgICB3aW5kb3cuZm9jdXMoKTtcclxuICAvLyAgICAgICAgIGlmICh0aGlzLnJvdXRlci51cmwgIT0gJy9jaGF0Jykge1xyXG4gIC8vICAgICAgICAgICBpZiAocmVzLm5vdGlmaWNhdGlvbi5kYXRhLmNoYW5uZWxJZCAhPSBudWxsICYmIHJlcy5ub3RpZmljYXRpb24uZGF0YS5jaGFubmVsSWQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgLy8gICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DaGF0SWQsIHJlcy5ub3RpZmljYXRpb24uZGF0YS5jaGFubmVsSWQpO1xyXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ2hhdElkLCByZXMubm90aWZpY2F0aW9uLmRhdGEuc2VuZGVyVXNlcklkKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCIvY2hhdFwiXSk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBlcnIgPT4gY29uc29sZS5sb2coZXJyKVxyXG4gIC8vICAgKTtcclxuICAvLyAgIHRoaXMucHJldmlvdXNNZXNzYWdlID0gbWVzc2FnZURldGFpbHNPYmplY3RcclxuICAvLyAgIH1cclxuICAvLyB9XHJcbiAgdXBzZXJ0UmVhZE5vdGlmaWNhdGlvbihzZWxlY3RlZE5vdGlmaWNhdGlvbikge1xyXG4gICAgY29uc3Qgbm90aWZpY2F0aW9ucyA9IFtdO1xyXG4gICAgbm90aWZpY2F0aW9ucy5wdXNoKHNlbGVjdGVkTm90aWZpY2F0aW9uKTtcclxuICAgIGNvbnN0IG5vdGlpZmNhdGlvbm1vZGVsID0gSlNPTi5wYXJzZShzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25Kc29uKTtcclxuICAgIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuTmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb25JZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgfHxcclxuICAgICAgc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlByb2plY3RNZW1iZXJSb2xlQWRkZWROb3RpZmljYXRpb25JZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wicHJvamVjdHMvcHJvamVjdHN0YXR1cy9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlByb2plY3RHdWlkICsgXCIvYWN0aXZlLWdvYWxzXCJdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLkdvYWxBcHByb3ZlZEZyb21SZXBsYW4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL2dvYWwvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Hb2FsR3VpZF0pO1xyXG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuTm90aWZpY2F0aW9uX1dvcmtJdGVtQXNzaWduZWRUb1VzZXIudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL3dvcmtpdGVtL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlclN0b3J5R3VpZF0pO1xyXG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuVVNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL3dvcmtpdGVtL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlclN0b3J5SWRdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFN0YXJ0ZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL3NwcmludC9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlNwcmludEd1aWRdKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5QdXNoTm90aWZpY2F0aW9uRm9yVXNlclN0b3J5Q29tbWVudC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wicHJvamVjdHMvd29ya2l0ZW0vXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VyU3RvcnlHdWlkXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5Hb2FsUmVxdWVzdGRGb3JSRXBsYW4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL2dvYWwvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Hb2FsR3VpZF0pO1xyXG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuU3ByaW50UmVxdWVzdGRGb3JSRXBsYW4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL3NwcmludC9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlNwcmludEd1aWRdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLk5vdGlmaWNhdGlvbl9BZGhvY1dvcmtJdGVtQXNzaWduZWRUb1VzZXIudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9hZGhvYy13b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUd1aWRdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLkFkaG9jVVNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9hZGhvYy13b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUlkXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUHVyY2hhc2VTaGlwbWVudE5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiY2xpZW50L3B1cmNoYXNlLWV4ZWN1dGlvbi9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlB1cmNoYXNlR3VpZF0pO1xyXG4gIH1cclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFVwc2VydFVucmVhZE5vdGlmaWNhdGlvbnNUcmlnZ2VyZWQobm90aWZpY2F0aW9ucykpO1xyXG5cclxuXHJcbiAgfVxyXG4gIGxvYWROb3RpZmljYXRpb25zKCkge1xyXG4gICAgY29uc3QgQ3VycmVudFVzZXJJZCA9IHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlcklkKTtcclxuICAgIC8vIFN1YnNjcmliZSB0byBUYXNrIEFzc2lnbm1lbnQgTm90aWZpY2FpdG9ucyBoZXJlLlxyXG4gICAgY29uc3QgdGFza0Fzc2lnbm1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfVGFza0Fzc2lnbm1lbnRzICsgQ3VycmVudFVzZXJJZDtcclxuICAgIGNvbnN0IHRhc3RhdHVzUmVwb3J0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TdGF0dXNSZXBvcnRTdWJtaXNzaW9uICsgQ3VycmVudFVzZXJJZDtcclxuICAgIGNvbnN0IHRhc3RhdHVzQ29uZmlnQXNzaWduQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1N0YXR1c0NvbmZpZ0Fzc2lnbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCBtdWx0aUNoYXJ0c1NjaGVkdWxpbmdDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTXVsdGlDaGFydHNTY2hlZHVsaW5nICsgQ3VycmVudFVzZXJJZDtcclxuICAgIGNvbnN0IGFzc2V0c0Fzc2lnbmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX0Fzc2V0QXNzaWdubWVudCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCBwcm9qZWN0Q3JlYXRlZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9OZXdQcm9qZWN0ICsgQ3VycmVudFVzZXJJZDtcclxuICAgIGNvbnN0IHByb2plY3RBY2Nlc3NUb01lbWJlckNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Qcm9qZWN0TWVtYmVyUm9sZSArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCBnb2FsQXBwcm92ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfR29hbEFwcHJvdmVkRnJvbVJlcGxhbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCB1c2VyU3RvcnlVcGRhdGVDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfVXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uICsgQ3VycmVudFVzZXJJZDtcclxuICAgIGNvbnN0IEFubm91bmNlbWVudENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Bbm5vdW5jZW1lbnROb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgY29uc3QgUmVtaW5kZXJDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmVtaW5kZXJOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgY29uc3QgUGVyZm9ybWFuY2VDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUGVyb2Zvcm1hbmNlTm90aWZpY2F0aW9uICsgQ3VycmVudFVzZXJJZDtcclxuICAgIGNvbnN0IHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfVXNlclN0b3J5Q29tbWVudCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCBzcHJpbnRTdGFydGVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1NwcmludFN0YXJ0ZWQgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgY29uc3Qgc3ByaW50UmVwbGFuQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1NwcmludFJlcXVlc3RlZFRvUmVwbGFuICsgQ3VycmVudFVzZXJJZDtcclxuICAgIGNvbnN0IHByb2plY3RGZWF0dXJlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Byb2plY3RGZWF0dXJlICsgQ3VycmVudFVzZXJJZDtcclxuICAgIGNvbnN0IHVzZXJTdG9yeUFyY2hpdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfVXNlclN0b3J5QXJjaGl2ZSArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCB1c2VyU3RvcnlQYXJrQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1VzZXJTdG9yeVBhcmsgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgY29uc3QgZ2VuZXJpY0FjdGl2aXR5Tm90aWZpY2F0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX0dlbmVyaWNBY3Rpdml0eU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCBwdXJjaGFzZUV4ZWN1dGlvbkFzc2lnbmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX0dlbmVyaWNBY3Rpdml0eU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcblxyXG4gICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0byBcIiArIHRhc2tBc3NpZ25tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgdGFzdGF0dXNSZXBvcnRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgdGFzdGF0dXNDb25maWdBc3NpZ25DaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIGFzc2V0c0Fzc2lnbmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBwcm9qZWN0Q3JlYXRlZENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgcHJvamVjdEFjY2Vzc1RvTWVtYmVyQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBnb2FsQXBwcm92ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHVzZXJTdG9yeVVwZGF0ZUNoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgQW5ub3VuY2VtZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyB1c2VyU3RvcnlDb21tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBzcHJpbnRTdGFydGVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBzcHJpbnRSZXBsYW5DaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIFJlbWluZGVyQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBQZXJmb3JtYW5jZUNoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgcHJvamVjdEZlYXR1cmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHVzZXJTdG9yeUFyY2hpdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHVzZXJTdG9yeVBhcmtDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIGdlbmVyaWNBY3Rpdml0eU5vdGlmaWNhdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgcHVyY2hhc2VFeGVjdXRpb25Bc3NpZ25lZENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG5cclxuXHJcbiAgICB0aGlzLnB1Ym51Yi5zdWJzY3JpYmUoe1xyXG4gICAgICBjaGFubmVsczogW3Rhc2tBc3NpZ25tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50bywgdGFzdGF0dXNSZXBvcnRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcclxuICAgICAgICB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8sIG11bHRpQ2hhcnRzU2NoZWR1bGluZ0NoYW5uZWxUb1N1YnNjcmliZUludG8sXHJcbiAgICAgICAgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBwcm9qZWN0Q3JlYXRlZENoYW5uZWxUb1N1YnNjcmliZUludG8sICxcclxuICAgICAgICBwcm9qZWN0QWNjZXNzVG9NZW1iZXJDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBnb2FsQXBwcm92ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLFxyXG4gICAgICAgIHVzZXJTdG9yeVVwZGF0ZUNoYW5uZWxUb1N1YnNjcmliZUludG8sIEFubm91bmNlbWVudENoYW5uZWxUb1N1YnNjcmliZUludG8sIFJlbWluZGVyQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcclxuICAgICAgICB1c2VyU3RvcnlDb21tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50bywgc3ByaW50U3RhcnRlZENoYW5uZWxUb1N1YnNjcmliZUludG8sXHJcbiAgICAgICAgc3ByaW50UmVwbGFuQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcclxuICAgICAgICBQZXJmb3JtYW5jZUNoYW5uZWxUb1N1YnNjcmliZUludG8sXHJcbiAgICAgICAgcHJvamVjdEZlYXR1cmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvLFxyXG4gICAgICAgIHVzZXJTdG9yeUFyY2hpdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvLFxyXG4gICAgICAgIHVzZXJTdG9yeVBhcmtDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBnZW5lcmljQWN0aXZpdHlOb3RpZmljYXRpb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvLHB1cmNoYXNlRXhlY3V0aW9uQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvXVxyXG4gICAgfSk7XHJcbiAgICB2YXIgcm9sZVVwZGF0ZXNDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUm9sZVVwZGF0ZXMgKyBcIjE5QjZGOUZDLTczNzAtNEI5Qy1BMDVDLTNCOEQ4MTlFRUVBRlwiO1xyXG4gICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0byBcIiArIHJvbGVVcGRhdGVzQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICB0aGlzLnB1Ym51Yi5zdWJzY3JpYmUoe1xyXG4gICAgICBjaGFubmVsczogW3JvbGVVcGRhdGVzQ2hhbm5lbFRvU3Vic2NyaWJlSW50b11cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgfVxyXG5cclxuICByZXBsYWNlQWxsKHN0ciwgZmluZCwgcmVwbGFjZSkge1xyXG4gICAgdmFyIGVzY2FwZWRGaW5kID0gZmluZC5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFxbXFxdXFwvXFxcXF0pL2csIFwiXFxcXCQxXCIpO1xyXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAoZXNjYXBlZEZpbmQsICdnJyksIHJlcGxhY2UpO1xyXG4gIH1cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuc2lnbmFsci5nZXROb3RpZmljYXRpb25zRnJvbUFwaSgpLnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5nZXRTb2Z0TGFiZWxzKCk7XHJcbiAgICBpZiAodGhpcy5jb29raWVTZXJ2aWNlLmNoZWNrKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRGlzcGxheVdlbENvbWVOb3RlKSAmJiB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRGlzcGxheVdlbENvbWVOb3RlKSA9PSAndHJ1ZScpIHtcclxuICAgICAgaWYgKChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLlVzZXJNb2RlbCkgIT0gbnVsbCAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLlVzZXJNb2RlbCkgIT0gdW5kZWZpbmVkKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnVzZXJGdWxsTmFtZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Vc2VyTW9kZWwpKS5mdWxsTmFtZTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgY291bnQgPSB0aGlzLmNvb2tpZVNlcnZpY2UuY2hlY2soTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Vc2VyTG9nZ2VkSW5Db3VudCk7XHJcbiAgICAgIGlmIChjb3VudCAmJiB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuVXNlckxvZ2dlZEluQ291bnQpICE9ICdudWxsJ1xyXG4gICAgICAgICYmIHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Vc2VyTG9nZ2VkSW5Db3VudCkgIT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlZEluQ291bnQgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuVXNlckxvZ2dlZEluQ291bnQpO1xyXG4gICAgICAgIGlmICh0aGlzLmxvZ2dlZEluQ291bnQgPT0gJzEnIHx8IHRoaXMubG9nZ2VkSW5Db3VudCA9PSAnMicpIHtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheVdlbGNvbWVOb3RlID0gdHJ1ZTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlXZWxjb21lTm90ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgZW52aXJvbm1lbnQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRW52aXJvbm1lbnQpKTtcclxuICAgICAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkRpc3BsYXlXZWxDb21lTm90ZSwgJ2ZhbHNlJywgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgICAgIH0sIDgwMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGN1cnJlbnRDdWx0dXJlID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRDdWx0dXJlKTtcclxuICAgIGNvbnN0IGNvbXBhbnlsYW4gPSBKU09OLnBhcnNlKHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Db21wYW55RGV0YWlscykpO1xyXG4gICAgbGV0IGN1cnJlbnRDdWx0dXJlbGFuID0gY29tcGFueWxhbi5sYW5Db2RlO1xyXG5cclxuICAgIGlmIChjdXJyZW50Q3VsdHVyZSA9PSAnJyB8fCBjdXJyZW50Q3VsdHVyZSA9PSBudWxsIHx8IGN1cnJlbnRDdWx0dXJlID09IHVuZGVmaW5lZCB8fCBjdXJyZW50Q3VsdHVyZSA9PT0gJ251bGwnIHx8IGN1cnJlbnRDdWx0dXJlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBpZiAoY3VycmVudEN1bHR1cmVsYW4gPT0gJycgfHwgY3VycmVudEN1bHR1cmVsYW4gPT0gbnVsbCB8fCBjdXJyZW50Q3VsdHVyZWxhbiA9PSB1bmRlZmluZWQgfHwgY3VycmVudEN1bHR1cmVsYW4gPT09ICdudWxsJyB8fCBjdXJyZW50Q3VsdHVyZWxhbiA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBjdXJyZW50Q3VsdHVyZSA9ICdlbic7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY3VycmVudEN1bHR1cmUgPSBjdXJyZW50Q3VsdHVyZWxhbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jdXJyZW50TGFuZyA9IGN1cnJlbnRDdWx0dXJlO1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgIHRoaXMubG9hZGluZ0luUHJvZ3Jlc3MkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChzaGFyZWRNb2R1bGVSZWR1Y2Vycy5pc1RpbWVTaGVldEZldGNoaW5nKSk7XHJcbiAgICB0aGlzLnRpbWVTaGVldEJ1dHRvbkRldGFpbHMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChzaGFyZWRNb2R1bGVSZWR1Y2Vycy5nZXRUaW1lU2hldHRCdXR0b25EZXRhaWxzKSk7XHJcbiAgICB0aGlzLnRpbWVTaGVldEJ1dHRvbkRldGFpbHMkXHJcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy50aW1lc2hlZXREaXNhYmxlb3JFbmFibGUgPSBkYXRhO1xyXG4gICAgICB9KVxyXG4gICAgLy90aGlzLmdldFRpbWVTaGVldEJ1dHRvbnMoKTtcclxuICAgIC8vdGhpcy5nZXRVc2VyU3RvcmUoKTtcclxuICAgIHRoaXMuc2hvd1RyYWlsUGVyaW9kID0gZmFsc2U7XHJcbiAgICB0aGlzLmVncmV0VGhlbWVzID0gdGhpcy50aGVtZVNlcnZpY2UuZWdyZXRUaGVtZXM7XHJcbiAgICB0aGlzLmxheW91dENvbmYgPSB0aGlzLmxheW91dC5sYXlvdXRDb25mO1xyXG5cclxuICAgIC8vIHRoaXMudGhlbWVNb2RlbCQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHNoYXJlZE1vZHVsZVJlZHVjZXJzLmdldFRoZW1lTW9kZWwpKTtcclxuICAgIC8vdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgSW5pdGlhbGl6ZUFmdGVyTG9naW5EYXRhKCkpO1xyXG4gICAgdmFyIHVzZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuVXNlck1vZGVsKSk7XHJcbiAgICBpZiAodXNlciAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMubW9uaXRvckNvbXBhbnlyZWxhdGVkRGV0YWlscyh1c2VyKTtcclxuICAgIH1cclxuICAgIHRoaXMubG9nZ2VkSW5Vc2VySWQgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudFVzZXJJZCk7XHJcbiAgICB0aGlzLmdldEVtcGxveWVlSWRCeVVzZXJJZCgpO1xyXG4gICAgbGV0IGVudmlyb25tZW50ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkVudmlyb25tZW50KSk7XHJcbiAgICB0aGlzLmFwcGxpY2F0aW9uVmVyc2lvbiA9IGVudmlyb25tZW50LnZlcnNpb247XHJcbiAgICB0aGlzLm1lbnVUeXBlID0gXCJNYWluXCI7XHJcbiAgICB0aGlzLnNlbGVjdGVkTGFuZ05hbWUgPSB0aGlzLmF2YWlsYWJsZUxhbmdzLmZpbmQoeCA9PiB4LmNvZGUgPT0gdGhpcy5jdXJyZW50TGFuZykubmFtZTtcclxuICAgIHRoaXMudXNlclN0b3JlSWQkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChzaGFyZWRNb2R1bGVSZWR1Y2Vycy5nZXRVc2VyU3RvcmVJZCkpO1xyXG4gICAgdGhpcy51c2VyU3RvcmVJZCQuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIHRoaXMudXNlclN0b3JlSWQgPSByZXN1bHQ7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgc2hvd0hpZGVEZWxldGVCdXR0b24oZGF0YSkge1xyXG4gICAgdGhpcy5zaG93RGVsZXRlSWNvbiA9IGRhdGEuaXNEZW1vRGF0YUNsZWFyZWQgPyBmYWxzZSA6IGRhdGEuaXNUb1Nob3dEZWxldGVJY29uO1xyXG4gIH1cclxuXHJcbiAgbW9uaXRvckNvbXBhbnlyZWxhdGVkRGV0YWlscyh1c2VyKSB7XHJcbiAgICB0aGlzLmF1dGhlbnRpY2F0ZWRVc2VyUmVjb3JkID0gdXNlcjtcclxuICAgIHRoaXMuc2hvd0hpZGVEZWxldGVCdXR0b24odXNlcik7XHJcbiAgICB0aGlzLmNvbXBhbmllc0xpc3QgPSB1c2VyLmNvbXBhbmllc0xpc3Q7XHJcbiAgICB0aGlzLmdldENvbXBhbnlEZXRhaWxzKHVzZXIuY29tcGFueUlkKTtcclxuICAgIHZhciBjb21wYW55ID0gdGhpcy5jb21wYW5pZXNMaXN0LmZpbHRlcih4ID0+IHguY29tcGFueUlkLnRvTG93ZXJDYXNlKCkgPT0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkNvbXBhbnlJZCkudG9Mb3dlckNhc2UoKSlcclxuICAgIHRoaXMuc2VsZWN0ZWRDb21wYW55ID0gY29tcGFueSA/IGNvbXBhbnlbMF0gOiBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbXBhbnlOYW1lID0gY29tcGFueSA/IGNvbXBhbnlbMF0gPyBjb21wYW55WzBdLmNvbXBhbnlOYW1lIDogbnVsbCA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0ZVRvRGFzaGJvYXJkcygpIHtcclxuICAgIGNvbnN0IHVzZXJSZWZlcmVuY2UgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLlVzZXJSZWZlcmVuY2VJZCk7XHJcbiAgICB0aGlzLmRlZmF1bHREYXNoYm9hcmRJZCA9IHRoaXMuY29va2llU2VydmljZS5jaGVjayhMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkRlZmF1bHREYXNoYm9hcmQpID8gSlNPTi5wYXJzZSh0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRGVmYXVsdERhc2hib2FyZCkpIDogbnVsbDtcclxuICAgIGlmICh0aGlzLmRlZmF1bHREYXNoYm9hcmRJZCAmJiB1c2VyUmVmZXJlbmNlICE9IFwibnVsbFwiICYmIHVzZXJSZWZlcmVuY2UgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFwiZGFzaGJvYXJkLW1hbmFnZW1lbnQvZGFzaGJvYXJkL1wiICsgdGhpcy5kZWZhdWx0RGFzaGJvYXJkSWQgKyBcIi9mb3JtL1wiICsgdXNlclJlZmVyZW5jZSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdERhc2hib2FyZElkKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoXCJkYXNoYm9hcmQtbWFuYWdlbWVudC9kYXNoYm9hcmQvXCIgKyB0aGlzLmRlZmF1bHREYXNoYm9hcmRJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc09wZW5lZChldmVudCkge1xyXG4gICAgdGhpcy5vcGVuZWQuZW1pdChldmVudCk7XHJcbiAgfVxyXG5cclxuICBnZXRTb2Z0TGFiZWxzKCkge1xyXG4gICAgdGhpcy5zb2Z0TGFiZWxzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnU29mdExhYmVscycpKTtcclxuICB9XHJcblxyXG4gICBhc3luYyBvblNpZ25vdXQoKSB7XHJcbiAgICB0aGlzLnJlbG9hZCA9IGZhbHNlO1xyXG4gICAgY29uc3QgQ3VycmVudFVzZXJJZCA9IHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlcklkKTtcclxuICAgIGNvbnN0IHRhc2tBc3NpZ25tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Rhc2tBc3NpZ25tZW50c1xyXG4gICAgICArIHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlcklkKTtcclxuICAgIGNvbnN0IHRhc3RhdHVzUmVwb3J0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TdGF0dXNSZXBvcnRTdWJtaXNzaW9uXHJcbiAgICAgICsgdGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpO1xyXG4gICAgY29uc3QgdGFzdGF0dXNDb25maWdBc3NpZ25DaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfU3RhdHVzQ29uZmlnQXNzaWduXHJcbiAgICAgICsgdGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpO1xyXG4gICAgY29uc3QgbXVsdGlDaGFydHNTY2hlZHVsaW5nQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX011bHRpQ2hhcnRzU2NoZWR1bGluZyArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCBhc3NldHNBc3NpZ25lZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Bc3NldEFzc2lnbm1lbnQgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgY29uc3QgcHJvamVjdENyZWF0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTmV3UHJvamVjdCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCBwcm9qZWN0QWNjZXNzVG9NZW1iZXJDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUHJvamVjdE1lbWJlclJvbGUgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgY29uc3QgZ29hbEFwcHJvdmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX0dvYWxBcHByb3ZlZEZyb21SZXBsYW4gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgY29uc3QgdXNlclN0b3J5VXBkYXRlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1VzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCBBbm5vdW5jZW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfQW5ub3VuY2VtZW50Tm90aWZpY2F0aW9uICsgQ3VycmVudFVzZXJJZDtcclxuICAgIGNvbnN0IHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfVXNlclN0b3J5Q29tbWVudCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCBzcHJpbnRTdGFydGVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1NwcmludFN0YXJ0ZWQgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgY29uc3Qgc3ByaW50UmVwbGFuQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1NwcmludFJlcXVlc3RlZFRvUmVwbGFuICsgQ3VycmVudFVzZXJJZDtcclxuICAgIGNvbnN0IFBlcmZvcm1hbmNlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Blcm9mb3JtYW5jZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCBSZW1pbmRlckNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9SZW1pbmRlck5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCBwcm9qZWN0RmVhdHVyZUNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Qcm9qZWN0RmVhdHVyZSArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICBjb25zdCB1c2VyU3RvcnlBcmNoaXZlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1VzZXJTdG9yeUFyY2hpdmUgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgY29uc3QgdXNlclN0b3J5UGFya0NoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Vc2VyU3RvcnlQYXJrICsgQ3VycmVudFVzZXJJZDtcclxuICAgIGNvbnN0IGdlbmVyaWNBY3Rpdml0eU5vdGlmaWNhdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9HZW5lcmljQWN0aXZpdHlOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgY29uc3QgcHVyY2hhc2VFeGVjdXRpb25Bc3NpZ25lZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9QdXJjaGFzZUV4ZWN1dGlvbkFzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG5cclxuICAgIHRoaXMucHVibnViLnVuc3Vic2NyaWJlKHsgY2hhbm5lbHM6IFt0YXNrQXNzaWdubWVudENoYW5uZWxUb1N1YnNjcmliZUludG9dIH0pO1xyXG4gICAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoeyBjaGFubmVsczogW3Rhc3RhdHVzUmVwb3J0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG9dIH0pO1xyXG4gICAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoeyBjaGFubmVsczogW3Rhc3RhdHVzQ29uZmlnQXNzaWduQ2hhbm5lbFRvU3Vic2NyaWJlSW50b10gfSk7XHJcbiAgICB0aGlzLnB1Ym51Yi51bnN1YnNjcmliZSh7IGNoYW5uZWxzOiBbbXVsdGlDaGFydHNTY2hlZHVsaW5nQ2hhbm5lbFRvU3Vic2NyaWJlSW50b10gfSk7XHJcbiAgICB0aGlzLnB1Ym51Yi51bnN1YnNjcmliZSh7IGNoYW5uZWxzOiBbYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvXSB9KTtcclxuICAgIHRoaXMucHVibnViLnVuc3Vic2NyaWJlKHsgY2hhbm5lbHM6IFtwcm9qZWN0Q3JlYXRlZENoYW5uZWxUb1N1YnNjcmliZUludG9dIH0pO1xyXG4gICAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoeyBjaGFubmVsczogW3Byb2plY3RBY2Nlc3NUb01lbWJlckNoYW5uZWxUb1N1YnNjcmliZUludG9dIH0pO1xyXG4gICAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoeyBjaGFubmVsczogW2dvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG9dIH0pO1xyXG4gICAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoeyBjaGFubmVsczogW3VzZXJTdG9yeVVwZGF0ZUNoYW5uZWxUb1N1YnNjcmliZUludG9dIH0pO1xyXG4gICAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoeyBjaGFubmVsczogW0Fubm91bmNlbWVudENoYW5uZWxUb1N1YnNjcmliZUludG9dIH0pO1xyXG4gICAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoeyBjaGFubmVsczogW3VzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvXSB9KTtcclxuICAgIHRoaXMucHVibnViLnVuc3Vic2NyaWJlKHsgY2hhbm5lbHM6IFtzcHJpbnRTdGFydGVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50b10gfSk7XHJcbiAgICB0aGlzLnB1Ym51Yi51bnN1YnNjcmliZSh7IGNoYW5uZWxzOiBbc3ByaW50UmVwbGFuQ2hhbm5lbFRvU3Vic2NyaWJlSW50b10gfSk7XHJcbiAgICB0aGlzLnB1Ym51Yi51bnN1YnNjcmliZSh7IGNoYW5uZWxzOiBbUGVyZm9ybWFuY2VDaGFubmVsVG9TdWJzY3JpYmVJbnRvXSB9KTtcclxuICAgIHRoaXMucHVibnViLnVuc3Vic2NyaWJlKHsgY2hhbm5lbHM6IFtSZW1pbmRlckNoYW5uZWxUb1N1YnNjcmliZUludG9dIH0pO1xyXG4gICAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoeyBjaGFubmVsczogW3Byb2plY3RGZWF0dXJlQ2hhbm5lbFRvU3Vic2NyaWJlSW50b10gfSk7XHJcbiAgICB0aGlzLnB1Ym51Yi51bnN1YnNjcmliZSh7IGNoYW5uZWxzOiBbdXNlclN0b3J5QXJjaGl2ZUNoYW5uZWxUb1N1YnNjcmliZUludG9dIH0pO1xyXG4gICAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoeyBjaGFubmVsczogW3VzZXJTdG9yeVBhcmtDaGFubmVsVG9TdWJzY3JpYmVJbnRvXSB9KTtcclxuICAgIHRoaXMucHVibnViLnVuc3Vic2NyaWJlKHsgY2hhbm5lbHM6IFtwdXJjaGFzZUV4ZWN1dGlvbkFzc2lnbmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50b10gfSk7XHJcbiAgICB0aGlzLnB1Ym51Yi51bnN1YnNjcmliZSh7IGNoYW5uZWxzOiBbdGhpcy5sb2dpblVzZXJjaGFubmVsTmFtZV0gfSk7XHJcbiAgICAvLyB2YXIgbG9naW5Db21wYW55SWQgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KFwiQ29tcGFueUlkXCIpO1xyXG4gICAgLy8gdmFyIHByZXNlbmNlQ2hhbm5lbCA9IFwiTWVzc2VuZ2VyUHJlc2VuY2UtXCIgKyBsb2dpbkNvbXBhbnlJZDtcclxuICAgIC8vIHRoaXMucHVibnViLnVuc3Vic2NyaWJlKHtcclxuICAgIC8vICAgY2hhbm5lbHM6IFtwcmVzZW5jZUNoYW5uZWxdLFxyXG4gICAgLy8gfSk7XHJcbiAgICAvLyBpZiAodGhpcy5jaGFubmVsTGlzdCAhPSB1bmRlZmluZWQgfHwgdGhpcy5jaGFubmVsTGlzdCAhPSBudWxsKSB7XHJcbiAgICAvLyAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmNoYW5uZWxMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgLy8gICAgIHRoaXMucHVibnViLnVuc3Vic2NyaWJlKHtcclxuICAgIC8vICAgICAgIGNoYW5uZWxzOiBbKGxvZ2luQ29tcGFueUlkICsgJy0nICsgdGhpcy5jaGFubmVsTGlzdFtpbmRleF0uaWQpXVxyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLnB1Ym51Yi51bnN1YnNjcmliZSh7XHJcbiAgICAvLyAgIGNoYW5uZWxzOiBbKCdDaGFubmVsVXBkYXRlcy0nICsgbG9naW5Db21wYW55SWQpXVxyXG4gICAgLy8gfSk7XHJcbiAgICAvLyB0aGlzLnB1Ym51Yi51bnN1YnNjcmliZSh7XHJcbiAgICAvLyAgIGNoYW5uZWxzOiBbKCdVc2VyVXBkYXRlcy0nICsgbG9naW5Db21wYW55SWQpXVxyXG4gICAgLy8gfSk7XHJcbiAgICB0aGlzLnB1Ym51Yi51bnN1YnNjcmliZSh7IGNoYW5uZWxzOiBbZ2VuZXJpY0FjdGl2aXR5Tm90aWZpY2F0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50b10gfSk7XHJcbiAgICAvLyB0aGlzLnB1Ym51Yi51bnN1YnNjcmliZUFsbCgpO1xyXG4gICAgLy8gdGhpcy5wdWJudWIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcbiAgICBsZXQgZW52aXJvbm1lbnQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRW52aXJvbm1lbnQpKTtcclxuICAgIGxldCBjb21wYW55TmFtZSA9IHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Db21wYW55RGV0YWlscyk7XHJcbiAgICBsZXQgY29tcGFueUlkID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkNvbXBhbnlJZCk7XHJcblxyXG4gICAgbGV0IGNvbXBhbnlEZXRhaWxzID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkNvbXBhbnlEZXRhaWxzKTtcclxuICAgIGxldCBjb21wYW55VGhlbWUgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ29tcGFueVRoZW1lKTtcclxuICAgIGxldCBVc2VyTG9nZ2VkSW5Db3VudCA9IHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Vc2VyTG9nZ2VkSW5Db3VudCk7XHJcbiAgICBsZXQgY3VycmVudEN1bHR1cmUgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudEN1bHR1cmUpO1xyXG4gICAgdGhpcy5jb29raWVTZXJ2aWNlLmRlbGV0ZUFsbChlbnZpcm9ubWVudC5jb29raWVQYXRoKTtcclxuICAgIHRoaXMuY29va2llU2VydmljZS5kZWxldGUoXCJzZWxlY3RlZFByb2plY3RzVGFiXCIpO1xyXG5cclxuXHJcbiAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuVXNlckxvZ2dlZEluQ291bnQsIFVzZXJMb2dnZWRJbkNvdW50LCBudWxsLCBlbnZpcm9ubWVudC5jb29raWVQYXRoLCB0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwgZmFsc2UsIFwiU3RyaWN0XCIpO1xyXG4gICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRDdWx0dXJlLCBjdXJyZW50Q3VsdHVyZSwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlciwgbnVsbCwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlcklkLCBudWxsLCBudWxsLCBlbnZpcm9ubWVudC5jb29raWVQYXRoLCB0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwgZmFsc2UsIFwiU3RyaWN0XCIpO1xyXG4gICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkNvbXBhbnlOYW1lLCBjb21wYW55TmFtZSwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Db21wYW55SWQsIGNvbXBhbnlJZCwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5EZWZhdWx0RGFzaGJvYXJkLCBudWxsLCBudWxsLCBlbnZpcm9ubWVudC5jb29raWVQYXRoLCB0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwgZmFsc2UsIFwiU3RyaWN0XCIpO1xyXG4gICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkNvbXBhbnlEZXRhaWxzLCBjb21wYW55RGV0YWlscywgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Db21wYW55VGhlbWUsIGNvbXBhbnlUaGVtZSwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5TZWFyY2hDbGljaywgbnVsbCwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Vc2VyTW9kZWwsIG51bGwsIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRW5hYmxlVGVhbURhc2hib2FyZCwgbnVsbCwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRGFzaGJvYXJkcywgbnVsbCk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLlVzZXJSZWZlcmVuY2VJZCwgbnVsbCk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLlJvbGVGZWF0dXJlcywgbnVsbCk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLlVzZXJSb2xlRmVhdHVyZXMpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5SZWRpcmVjdGlvblVybCk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLlNpZGVCYXJNZW51SXRlbXMpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5JbnRyb01vZHVsZXMpO1xyXG4gICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkFkZE9yRWRpdEN1c3RvbUFwcElzUmVxdWlyZWQsIG51bGwsIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL3Nlc3Npb25zL3NpZ25pblwiXSk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzZXRMYW5nKCkge1xyXG4gICAgdGhpcy50cmFuc2xhdGUudXNlKHRoaXMuY3VycmVudExhbmcpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO1xyXG4gICAgbGV0IGVudmlyb25tZW50ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkVudmlyb25tZW50KSk7XHJcbiAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudEN1bHR1cmUsIHRoaXMuY3VycmVudExhbmcsIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICB0aGlzLnNlbGVjdGVkTGFuZ05hbWUgPSB0aGlzLmF2YWlsYWJsZUxhbmdzLmZpbmQoeCA9PiB4LmNvZGUgPT0gdGhpcy5jdXJyZW50TGFuZykubmFtZTtcclxuICB9XHJcblxyXG4gIGNoYW5nZVRoZW1lKHRoZW1lKSB7XHJcbiAgICB0aGlzLnRoZW1lU2VydmljZS5jaGFuZ2VUaGVtZSh0aGVtZSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVOb3RpZmljKCkge1xyXG4gICAgLy8gdGhpcy5nZXRVbnJlYWROb3RpZmljYXRpb25zKCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVSZWNvcmRpbmcoKSB7XHJcbiAgICB0aGlzLmdldEFjdFRyYWNrZXJSZWNvcmRlcigpO1xyXG4gICAgdmFyIHVzZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuVXNlck1vZGVsKSk7XHJcbiAgICBpZiAodXNlciAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMubW9uaXRvckNvbXBhbnlyZWxhdGVkRGV0YWlscyh1c2VyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE5vdGlmaWNhdGlvbnMoKSB7XHJcbiAgICBjb25zdCBub3RpZmljYXRpb25TZWFyY2hNb2RlbCA9IG5ldyBBcHBOb3RpZmljYXRpb24oKTtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IENsZWFyQWxsVW5yZWFkTm90aWZpY2F0aW9uc1RyaWdnZXJlZChub3RpZmljYXRpb25TZWFyY2hNb2RlbCkpO1xyXG4gICAgdGhpcy51bnJlYWRDb3VudE9mTm90aWZpY2F0aW9ucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHNoYXJlZE1vZHVsZVJlZHVjZXJzLmdldE5vdGlmaWNhdGlvblVucmVhZFRvdGFsKSk7XHJcbiAgfVxyXG5cclxuICBnZXRVbnJlYWROb3RpZmljYXRpb25zKCkge1xyXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VhcmNoTW9kZWwgPSBuZXcgQXBwTm90aWZpY2F0aW9uKCk7XHJcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBDbGVhclVucmVhZE5vdGlmaWNhdGlvbnNUcmlnZ2VyZWQobm90aWZpY2F0aW9uU2VhcmNoTW9kZWwpKTtcclxuICAgIHRoaXMudW5yZWFkQ291bnRPZk5vdGlmaWNhdGlvbnMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChzaGFyZWRNb2R1bGVSZWR1Y2Vycy5nZXROb3RpZmljYXRpb25VbnJlYWRUb3RhbCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWN0VHJhY2tlclJlY29yZGVyKCkge1xyXG4gICAgdGhpcy5jb21tb25TZXJ2aWNlLmdldEFjdFRyYWNrZXJSZWNvcmRlcigpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSByZXNwb25zZS5kYXRhO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsZWFyRGVtb0RhdGEoKSB7XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICBoZWlnaHQ6IFwiMzAlXCIsXHJcbiAgICAgIHdpZHRoOiBcIjMwJVwiLFxyXG4gICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgZGlyZWN0aW9uOiBcImx0clwiLFxyXG4gICAgICBkYXRhOiB7fSxcclxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiVGhlIGRpYWxvZyB3YXMgY2xvc2VkXCIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZXhwb3J0Q29uZmlndXJhdGlvbkRpYWxvZ0RhdGEoKSB7XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEV4cG9ydENvbmZpZ3VyYXRpb25EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgaGVpZ2h0OiBcIjQ1JVwiLFxyXG4gICAgICB3aWR0aDogXCI0MCVcIixcclxuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgICAgIGRpcmVjdGlvbjogXCJsdHJcIixcclxuICAgICAgZGF0YToge30sXHJcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIlRoZSBkaWFsb2cgd2FzIGNsb3NlZFwiKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2lkZW5hdigpIHtcclxuICAgIGlmICh0aGlzLmxheW91dENvbmYuc2lkZWJhclN0eWxlID09PSBcImNsb3NlZFwiKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxheW91dC5wdWJsaXNoTGF5b3V0Q2hhbmdlKHtcclxuICAgICAgICBzaWRlYmFyU3R5bGU6IFwiZnVsbFwiXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sYXlvdXQucHVibGlzaExheW91dENoYW5nZSh7XHJcbiAgICAgIHNpZGViYXJTdHlsZTogXCJjbG9zZWRcIlxyXG4gICAgfSk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicmVzaXplXCIpKTsgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNvbGxhcHNlKCkge1xyXG4gICAgLy8gY29tcGFjdCAtLT4gZnVsbFxyXG4gICAgaWYgKHRoaXMubGF5b3V0Q29uZi5zaWRlYmFyU3R5bGUgPT09IFwiY29tcGFjdFwiKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxheW91dC5wdWJsaXNoTGF5b3V0Q2hhbmdlKFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHNpZGViYXJTdHlsZTogXCJmdWxsXCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgdHJhbnNpdGlvbkNsYXNzOiB0cnVlIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAqIC0tPiBjb21wYWN0XHJcbiAgICB0aGlzLmxheW91dC5wdWJsaXNoTGF5b3V0Q2hhbmdlKFxyXG4gICAgICB7XHJcbiAgICAgICAgc2lkZWJhclN0eWxlOiBcImNvbXBhY3RcIlxyXG4gICAgICB9LFxyXG4gICAgICB7IHRyYW5zaXRpb25DbGFzczogdHJ1ZSB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFRpbWVTaGVldEJ1dHRvbnMoKSB7XHJcbiAgICAvL3RoaXMubG9hZGluZ0luUHJvZ3Jlc3MgPSB0cnVlO1xyXG4gICAgLy8gdGhpcy5jb21tb25TZXJ2aWNlLmdldFRpbWVTaGVldEVuYWJsZWRJbmZvcm1hdGlvbigpLnBpcGUodGFrZVVudGlsKHRoaXMubmdEZXN0cm95ZWQkKSlcclxuICAgIC8vICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAvLyAgICAgaWYgKGRhdGEgPT09IFwiXCIgfHwgZGF0YSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAvLyAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHRoaXMudGltZXNoZWV0RGlzYWJsZW9yRW5hYmxlID0gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgIC8vICAgICB0aGlzLmxvYWRpbmdJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAvLyAgIH0pO1xyXG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgRmV0Y2hUaW1lU2hlZXRCdXR0b25EZXRhaWxzKCkpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VGZWVkVGltZVNoZWV0KCkge1xyXG4gICAgdGhpcy5mZWVkVGltZVNoZWV0UG9wb3Zlci5jbG9zZSgpO1xyXG4gICAgdGhpcy5pc0ZlZWRUaW1lU2hlZXQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9wZW5UaW1lU2hlZXQoKSB7XHJcbiAgICBjb25zdCBwcm9qZWN0RGlhbG9nID0gdGhpcy5kaWFsb2cub3BlbihGZWVkVGltZURpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICBtaW5XaWR0aDogJzMwdncnLFxyXG4gICAgICBoZWlnaHQ6ICczNXZoJyxcclxuICAgICAgZGF0YTogIXRoaXMuaXNGZWVkVGltZVNoZWV0XHJcbiAgICAgIC8vZGlzYWJsZUNsb3NlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIHByb2plY3REaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNsb3NlRmVlZFRpbWVTaGVldCgpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdldFRpbWVTaGVldEJ1dHRvbnMoKTtcclxuICAgIC8vIHRoaXMuaXNGZWVkVGltZVNoZWV0ID0gIXRoaXMuaXNGZWVkVGltZVNoZWV0O1xyXG4gIH1cclxuXHJcbiAgLy8gZ2V0QWxsTWVudUl0ZW1zKCkge1xyXG4gIC8vICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgR2V0QWxsTWVudUl0ZW1zVHJpZ2dlcmVkKE1lbnVDYXRlZ29yaWVzLk1haW4pKTtcclxuICAvLyB9XHJcblxyXG4gIGNoYW5nZU1lbnVUeXBlKHR5cGUpIHtcclxuICAgIHRoaXMubWVudVR5cGUgPSB0eXBlO1xyXG4gIH1cclxuXHJcbiAgb3BlbkZlZWRCYWNrRGlhbG9nKCkge1xyXG4gICAgdGhpcy5pc0ZlZWRCYWNrRGlhbG9nID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGNsb3NlRmVlZEJhY2tsb2dEaWFsb2coKSB7XHJcbiAgICB0aGlzLmlzRmVlZEJhY2tEaWFsb2cgPSBmYWxzZTtcclxuICAgIHRoaXMuZmVlZEJhY2tQb3BPdmVyLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRDb21wYW55RGV0YWlscyhjb21wYW55SWQ6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuY29va2llU2VydmljZS5jaGVjayhMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkNvbXBhbnlEZXRhaWxzKSAmJiB0aGlzLmNvb2tpZVNlcnZpY2UuY2hlY2soTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Db21wYW55SWQpKSB7XHJcbiAgICAgIHRoaXMuY29tcGFueSA9IEpTT04ucGFyc2UodGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkNvbXBhbnlEZXRhaWxzKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuY29tcGFueSkge1xyXG4gICAgICB0aGlzLmNvbW1vblNlcnZpY2UuZ2V0Q29tcGFueUJ5SWQoY29tcGFueUlkKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmNvbXBhbnkgPSByZXNwb25zZS5kYXRhO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb21wYW55LmlzUmVtb3RlQWNjZXNzID09IDEgJiYgdGhpcy5jb21wYW55LnRyYWlsRGF5cyA+IDApIHtcclxuICAgICAgICAgIHRoaXMuc2hvd1RyYWlsUGVyaW9kID0gdHJ1ZTtcclxuICAgICAgICAgIC8vIHRoaXMubm9PZkRheXM9dGhpcy5jb21wYW55Lm5vT2ZEYXlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb21wYW55LmlzRGVtb0RhdGEgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgdGhpcy5zaG93RGVsZXRlID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zaG93RGVsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvbXBhbnkuaXNEZW1vRGF0YSA9PSBmYWxzZSB8fCB0aGlzLmNvbXBhbnkuaXNEZW1vRGF0YSA9PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dEZWxldGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29tcGFueSAhPSBudWxsICYmIHRoaXMuY29tcGFueSAhPSB1bmRlZmluZWQgJiYgdGhpcy5jb21wYW55LmluZHVzdHJ5SWQudG9VcHBlckNhc2UoKSA9PSAnNzQ5OUY1RTMtMEVGMi00MDQ0LUI4NDAtMjQxMUI2ODMwMkY5JylcclxuICAgICAgICAgIHRoaXMuaXNTdG9yZUFjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuaXNTdG9yZUFjY2VzcyA9IHRydWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbXBhbnkuaXNSZW1vdGVBY2Nlc3MgPT0gMSAmJiB0aGlzLmNvbXBhbnkudHJhaWxEYXlzID4gMCkge1xyXG4gICAgICAgIHRoaXMuc2hvd1RyYWlsUGVyaW9kID0gdHJ1ZTtcclxuICAgICAgICAvLyB0aGlzLm5vT2ZEYXlzPXRoaXMuY29tcGFueS5ub09mRGF5cztcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5jb21wYW55LmlzRGVtb0RhdGEgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuc2hvd0RlbGV0ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuY29tcGFueS5pc0RlbW9EYXRhID09IGZhbHNlIHx8IHRoaXMuY29tcGFueS5pc0RlbW9EYXRhID09IG51bGwpIHtcclxuICAgICAgICB0aGlzLnNob3dEZWxldGUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5jb21wYW55ICE9IG51bGwgJiYgdGhpcy5jb21wYW55ICE9IHVuZGVmaW5lZCAmJiB0aGlzLmNvbXBhbnkuaW5kdXN0cnlJZC50b1VwcGVyQ2FzZSgpID09ICc3NDk5RjVFMy0wRUYyLTQwNDQtQjg0MC0yNDExQjY4MzAyRjknKVxyXG4gICAgICAgIHRoaXMuaXNTdG9yZUFjY2VzcyA9IGZhbHNlO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5pc1N0b3JlQWNjZXNzID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFVzZXJTdG9yZSgpIHtcclxuICAgIGxldCBzdG9yZVNlYXJjaE1vZGVsID0gbmV3IFN0b3JlU2VhcmNoTW9kZWwoKTtcclxuICAgIHN0b3JlU2VhcmNoTW9kZWwuaXNBcmNoaXZlZCA9IGZhbHNlO1xyXG4gICAgc3RvcmVTZWFyY2hNb2RlbC5pc0RlZmF1bHQgPSB0cnVlO1xyXG4gICAgc3RvcmVTZWFyY2hNb2RlbC5pc0NvbXBhbnkgPSBmYWxzZTtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IEdldFVzZXJTdG9yZUlkVHJpZ2dlcmVkKHN0b3JlU2VhcmNoTW9kZWwpKTtcclxuICB9XHJcblxyXG4gIGdvVG9Vc2VyU3RvcmUoKSB7XHJcbiAgICBpZiAodGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpKVxyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkb2N1bWVudC9zdG9yZVwiLCB0aGlzLnVzZXJTdG9yZUlkLCB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudFVzZXJJZCkudG9Mb3dlckNhc2UoKV0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0QWZ0ZXJsb2dpbihlKSB7XHJcbiAgICB0aGlzLmNvbXBhbnlJZCA9IGUuY29tcGFueUlkXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29tcGFueU5hbWUgPSBlLmNvbXBhbnlOYW1lO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbXBhbnkgPSBlO1xyXG4gIH1cclxuXHJcbiBhc3luYyBzZWxlY3RDb21wYW55KGUpIHtcclxuICAgIGlmICh0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ29tcGFueUlkKS50b0xvd2VyQ2FzZSgpICE9IGUuY29tcGFueUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJlbG9hZCA9IGZhbHNlO1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgICAgdGhpcy5jb21wYW55SWQgPSBlLmNvbXBhbnlJZDtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbXBhbnlOYW1lID0gZS5jb21wYW55TmFtZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbXBhbnkgPSBlO1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlYXJjaFRleHQgPSBudWxsO1xyXG4gICAgICB0aGlzLm5neFNlcnZpY2Uuc3RhcnQoKTtcclxuICAgICAgdGhpcy5hdXRoU2VydmljZS5jb21wYW55TG9naW4odGhpcy5zZWxlY3RlZENvbXBhbnkpLnN1YnNjcmliZShhc3luYyAodXNlclRva2VuOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodXNlclRva2VuLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMub25TaWdub3V0KCk7XHJcbiAgICAgICAgICBsZXQgZW52aXJvbm1lbnQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRW52aXJvbm1lbnQpKTtcclxuICAgICAgICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlciwgZS5hdXRoVG9rZW4sIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICAgICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudFVzZXJJZCwgZS51c2VySWQsIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICAgICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudFVzZXIsIHVzZXJUb2tlbi5kYXRhLmF1dGhUb2tlbiwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoXCJEZWZhdWx0RGFzaGJvYXJkXCIsIHVzZXJUb2tlbi5kYXRhLmRlZmF1bHREYXNoYm9hcmRJZCA/IEpTT04uc3RyaW5naWZ5KHVzZXJUb2tlbi5kYXRhLmRlZmF1bHREYXNoYm9hcmRJZC53b3Jrc3BhY2VJZCkgOiBudWxsLCBudWxsLCBlbnZpcm9ubWVudC5jb29raWVQYXRoLCB0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwgZmFsc2UsIFwiU3RyaWN0XCIpO1xyXG4gICAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldCgnQ29tcGFueURldGFpbHMnLCBKU09OLnN0cmluZ2lmeSh1c2VyVG9rZW4uZGF0YS5jb21wYW55RGV0YWlscykpO1xyXG4gICAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldCgnQ29tcGFuaWVzTGlzdCcsIEpTT04uc3RyaW5naWZ5KHVzZXJUb2tlbi5kYXRhLnVzZXJzTW9kZWwuY29tcGFuaWVzTGlzdCkpLFxyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ1JvbGVGZWF0dXJlcycsIEpTT04uc3RyaW5naWZ5KHVzZXJUb2tlbi5kYXRhLnJvbGVGZWF0dXJlcykpO1xyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJVc2VyTW9kZWxcIiwgSlNPTi5zdHJpbmdpZnkodXNlclRva2VuLmRhdGEudXNlcnNNb2RlbCkpO1xyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ1NvZnRMYWJlbHMnLCBKU09OLnN0cmluZ2lmeSh1c2VyVG9rZW4uZGF0YS5zb2Z0TGFiZWxzKSk7XHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIkNvbXBhbnlTZXR0aW5nc1wiLCBKU09OLnN0cmluZ2lmeSh1c2VyVG9rZW4uZGF0YS5jb21wYW55U2V0dGluZ3MpKTtcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiRnJvbUxvZ0luXCIsIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcclxuICAgICAgICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Db21wYW55TmFtZSwgdXNlclRva2VuLmRhdGEudXNlcnNNb2RlbC5jb21wYW55TmFtZSwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Db21wYW55SWQsIHVzZXJUb2tlbi5kYXRhLnVzZXJzTW9kZWwuY29tcGFueUlkLCBudWxsLCBlbnZpcm9ubWVudC5jb29raWVQYXRoLCB0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwgZmFsc2UsIFwiU3RyaWN0XCIpO1xyXG4gICAgICAgICAgLy90aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBVc2VyRGV0YWlsc0ZldGNoZWRBZnRlckNvbXBhbnlMb2dpbih1c2VyVG9rZW4uZGF0YS51c2Vyc01vZGVsKSk7XHJcbiAgICAgICAgICB0aGlzLnNldERhZmF1bHRMYW5ndWFnZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm5neFNlcnZpY2Uuc3RvcCgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldERhZmF1bHRMYW5ndWFnZSgpIHtcclxuICAgIGNvbnN0IGNvbXBhbnkgPSBKU09OLnBhcnNlKHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Db21wYW55RGV0YWlscykpO1xyXG4gICAgbGV0IGN1cnJlbnRDdWx0dXJlID0gY29tcGFueS5sYW5Db2RlO1xyXG4gICAgaWYgKGN1cnJlbnRDdWx0dXJlID09IG51bGwgfHwgY3VycmVudEN1bHR1cmUgPT0gdW5kZWZpbmVkIHx8IGN1cnJlbnRDdWx0dXJlID09PSAnbnVsbCcgfHwgY3VycmVudEN1bHR1cmUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGN1cnJlbnRDdWx0dXJlID0gJ2VuJztcclxuICAgIH1cclxuICAgIGxldCBlbnZpcm9ubWVudCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5FbnZpcm9ubWVudCkpO1xyXG4gICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRDdWx0dXJlLCBjdXJyZW50Q3VsdHVyZSwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgIHRoaXMuY3VycmVudExhbmcgPSBjdXJyZW50Q3VsdHVyZTtcclxuICAgIHRoaXMudHJhbnNsYXRlLnVzZSh0aGlzLmN1cnJlbnRMYW5nKTtcclxuICB9XHJcblxyXG5cclxuICBnZXRFbXBsb3llZUlkQnlVc2VySWQoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVUb1Byb2ZpbGUoKSB7XHJcbiAgICB0aGlzLmNvbW1vblNlcnZpY2UuZ2V0VXNlckJ5SWQodGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpLnRvTG93ZXJDYXNlKCkpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5lbXBsb3llZUlkID0gcmVzcG9uc2UuZGF0YS5lbXBsb3llZUlkO1xyXG4gICAgICAgIGlmICh0aGlzLmVtcGxveWVlSWQpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlXCIsIHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlcklkKS50b0xvd2VyQ2FzZSgpLCBcIm92ZXJ2aWV3XCJdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvbXlQcm9maWxlXCIsIHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlcklkKS50b0xvd2VyQ2FzZSgpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgbmF2aWdhdGVUb01lc3NlbmdlcigpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIi9jaGF0XCJdKTtcclxuICB9XHJcblxyXG5cclxuICBuYXZpZ2F0ZVRvU3RhdHVzUmVwb3J0KCkge1xyXG4gICAgY29uc3QgcHJvamVjdERpYWxvZyA9IHRoaXMuZGlhbG9nLm9wZW4oV29ya0l0ZW1zRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIG1pbldpZHRoOiAnODJ2dycsXHJcbiAgICAgIGhlaWdodDogJzgydmgnLFxyXG4gICAgICBkYXRhOiB7IGRhc2hib2FyZEZpbHRlcnM6IHRoaXMuZGFzaGJvYXJkRmlsdGVycyB9LFxyXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcclxuICAgIH0pO1xyXG4gICAgcHJvamVjdERpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7IH0pO1xyXG4gIH1cclxuICBuYXZpZ2F0ZVRvU2V0dGluZ3MoKSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCIvc2V0dGluZ3NcIl0pO1xyXG4gIH1cclxuXHJcbiAgYWx0ZXJuYXRlU2lnbkluKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL3Nlc3Npb25zL2dlbmVyaWMtc2lnbmluXCJdKTtcclxuICB9XHJcblxyXG4gIG5hdmlnYXRlVG9Sb2xlcygpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIi9yb2xlbWFuYWdlbWVudC9yb2xlbWFuYWdlbWVudFwiXSk7XHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0ZVRvVXJsKHdvcmtzcGFjZUlkKSB7XHJcbiAgICBjb25zdCB1c2VyUmVmZXJlbmNlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Vc2VyUmVmZXJlbmNlSWQpO1xyXG4gICAgaWYgKHVzZXJSZWZlcmVuY2UgIT0gXCJudWxsXCIgJiYgdXNlclJlZmVyZW5jZSAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoXCJkYXNoYm9hcmQtbWFuYWdlbWVudC9kYXNoYm9hcmQvXCIgKyB3b3Jrc3BhY2VJZCArIFwiL2Zvcm0vXCIgKyB1c2VyUmVmZXJlbmNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoXCJkYXNoYm9hcmQtbWFuYWdlbWVudC9kYXNoYm9hcmQvXCIgKyB3b3Jrc3BhY2VJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRVcGxvYWRGaWxlUG9wdXBPcGVuKGZpbGVVcGxvYWREcm9wem9uZVBvcHVwKSB7XHJcbiAgICBmaWxlVXBsb2FkRHJvcHpvbmVQb3B1cC5vcGVuUG9wb3ZlcigpO1xyXG4gIH1cclxuICBzZXRMYWJlbE5hbWVGb3JEcm9wem9uZShmaWxlTmFtZSkge1xyXG4gICAgcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZygwLCAyMCkgKyBcIi4uLlwiO1xyXG4gIH1cclxuICBvblJlbW92ZShldmVudCkge1xyXG4gICAgdGhpcy5maWxlcy5zcGxpY2UodGhpcy5maWxlcy5pbmRleE9mKGV2ZW50KSwgMSk7XHJcbiAgICBpZiAodGhpcy5maWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZmlsZXNQcmVzZW50ID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmlsZXNQcmVzZW50ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlbW92ZUFsbEZpbGVzKCkge1xyXG4gICAgdGhpcy5maWxlc1ByZXNlbnQgPSBmYWxzZTtcclxuICAgIHRoaXMuZmlsZXMgPSBbXTtcclxuICB9XHJcbiAgZmlsZXNTZWxlY3RlZChldmVudCkge1xyXG4gICAgdGhpcy5maWxlcy5wdXNoKC4uLmV2ZW50LmFkZGVkRmlsZXMpO1xyXG4gICAgaWYgKHRoaXMuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmZpbGVzUHJlc2VudCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZVVwbG9hZEZpbGVQb3B1cCgpIHtcclxuICAgIHRoaXMuZmlsZVVwbG9hZERyb3B6b25lUG9wdXAuZm9yRWFjaCgocCkgPT4gcC5jbG9zZVBvcG92ZXIoKSk7XHJcbiAgICB0aGlzLmZpbGVzID0gW107XHJcbiAgICB0aGlzLmZpbGVSZXN1bHRNb2RlbCA9IFtdO1xyXG4gIH1cclxuICBzYXZlRmlsZXMoKSB7XHJcbiAgICB0aGlzLmFueU9wZXJhdGlvbkluUHJvZ3Jlc3MgPSB0cnVlO1xyXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgIHRoaXMuZmlsZXMuZm9yRWFjaCgoZmlsZTogRmlsZSkgPT4ge1xyXG4gICAgICB0aGlzLmZpbGVJbmRleCA9IHRoaXMuZmlsZUluZGV4ICsgMTtcclxuICAgICAgY29uc3QgZmlsZUtleU5hbWUgPSBcImZpbGVcIiArIHRoaXMuZmlsZUluZGV4LnRvU3RyaW5nKCk7XHJcbiAgICAgIGZvcm1EYXRhLmFwcGVuZChmaWxlS2V5TmFtZSwgZmlsZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgZW52aXJvbm1lbnQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRW52aXJvbm1lbnQpKTtcclxuICAgIHRoaXMuVXBsb2FkZXJPbkluaXQoZW52aXJvbm1lbnQuYXBpVVJMICsgQXBpVXJscy5VcGxvYWRGaWxlQ2h1bmtzKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBVcGxvYWRlck9uSW5pdCh1cmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHByb2dyZXNzID0gMDtcclxuICAgIGNvbnN0IHIgPSBuZXcgUmVzdW1hYmxlKHtcclxuICAgICAgdGFyZ2V0OiB1cmwsXHJcbiAgICAgIGNodW5rU2l6ZTogMSAqIDEwMjQgKiAxMDI0LCAvLzMgTUJcclxuICAgICAgcXVlcnk6IHsgbW9kdWxlVHlwZUlkOiB0aGlzLm1vZHVsZVR5cGVJZCB9LFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgXCJBdXRob3JpemF0aW9uXCI6IGBCZWFyZXIgJHt0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudFVzZXIpfWBcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gICAgci5hZGRGaWxlcyh0aGlzLmZpbGVzKTtcclxuICAgIHIub24oJ2ZpbGVBZGRlZCcsIChmaWxlLCBldmVudCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuZmlsZVJlc3VsdE1vZGVsIHx8IHRoaXMuZmlsZVJlc3VsdE1vZGVsLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLmZpbGVSZXN1bHRNb2RlbCA9IFtdO1xyXG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICAgIHIudXBsb2FkKClcclxuICAgIH0pO1xyXG4gICAgci5vbignY29tcGxldGUnLCAoZXZlbnQpID0+IHtcclxuICAgICAgci5maWxlcy5wb3AoKTtcclxuICAgICAgdGhpcy5wcm9ncmVzc1ZhbHVlID0gMDtcclxuICAgICAgdGhpcy5maWxlc1ByZXNlbnQgPSBmYWxzZTtcclxuICAgICAgdGhpcy51cGxvYWRlZEZpbGVOYW1lcyA9IFtdO1xyXG4gICAgICB0aGlzLmZpbGVDb3VudGVyID0gMTtcclxuICAgICAgdGhpcy5maWxlSW5kZXggPSAwO1xyXG4gICAgICB0aGlzLmFueU9wZXJhdGlvbkluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gICAgci5vbigncHJvZ3Jlc3MnLCAoKSA9PiB7XHJcbiAgICAgIHByb2dyZXNzID0gTWF0aC5yb3VuZChyLnByb2dyZXNzKCkgKiAxMDApO1xyXG4gICAgICB0aGlzLnByb2dyZXNzVmFsdWUgPSBwcm9ncmVzcztcclxuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICAgIHIub24oJ2ZpbGVTdWNjZXNzJywgKGZpbGUsIHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIGlmIChmaWxlICYmIGZpbGUuZmlsZU5hbWUpIHtcclxuICAgICAgICBpZiAoIXRoaXMudXBsb2FkZWRGaWxlTmFtZXMuZmluZCh4ID0+IHggPT0gZmlsZS5maWxlTmFtZSkpIHtcclxuICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlTmFtZXMucHVzaChmaWxlLmZpbGVOYW1lKVxyXG4gICAgICAgICAgdGhpcy5maWxlQ291bnRlciA9IHRoaXMudXBsb2FkZWRGaWxlTmFtZXMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVSZXN1bHRNb2RlbCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZmlsZVJlc3VsdE1vZGVsID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGZpbGVSZXN1bHQgPSBuZXcgRmlsZVJlc3VsdE1vZGVsKCk7XHJcbiAgICAgICAgICAgIGZpbGVSZXN1bHQuZmlsZUV4dGVuc2lvbiA9IHJlc3VsdFswXS5GaWxlRXh0ZW5zaW9uO1xyXG4gICAgICAgICAgICBmaWxlUmVzdWx0LmZpbGVOYW1lID0gcmVzdWx0WzBdLkZpbGVOYW1lO1xyXG4gICAgICAgICAgICBmaWxlUmVzdWx0LmZpbGVQYXRoID0gcmVzdWx0WzBdLkZpbGVQYXRoO1xyXG4gICAgICAgICAgICBmaWxlUmVzdWx0LmZpbGVTaXplID0gcmVzdWx0WzBdLkZpbGVTaXplO1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVSZXN1bHRNb2RlbC5wdXNoKGZpbGVSZXN1bHQpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0WzBdLkZpbGVQYXRoICE9IG51bGwgJiYgcmVzdWx0WzBdLkZpbGVQYXRoICE9IFwiXCIpXHJcbiAgICAgICAgICAgICAgdGhpcy5pbXBvcnREeW5hbWljSnNvbihyZXN1bHRbMF0uRmlsZVBhdGgpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5jbG9zZVVwbG9hZEZpbGVQb3B1cCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGltcG9ydER5bmFtaWNKc29uKGNvbmZpZ3VyZWRKc29uVVJMKSB7XHJcbiAgICB2YXIgaW1wb3J0Q29uZmlndXJhdGlvbk1vZGVsID0gbmV3IEltcG9ydENvbmZpZ3VyYXRpb25Nb2RlbCgpO1xyXG4gICAgaW1wb3J0Q29uZmlndXJhdGlvbk1vZGVsLmNvbmZpZ3VyYXRpb25VcmwgPSBjb25maWd1cmVkSnNvblVSTDtcclxuICAgIHRoaXMuaW1wb3J0aW5nSW5Qcm9ncmVzcyA9IHRydWU7XHJcbiAgICB0aGlzLmNvbW1vblNlcnZpY2UuU3lzdGVtSW1wb3J0Q29uZmlndXJhdGlvbihpbXBvcnRDb25maWd1cmF0aW9uTW9kZWwpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuY2xvc2VVcGxvYWRGaWxlUG9wdXAoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFwiRGF0YSBpbXBvcnRlZCBzdWNjZXNzZnVsbHlcIik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UuYXBpUmVzcG9uc2VNZXNzYWdlc1swXS5tZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmltcG9ydGluZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VTZWFyY2goKSB7XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoQ29tcGFuaWVzKGNvbXBhbmllcywgc2VhcmNoKSB7XHJcbiAgICBpZiAoc2VhcmNoID09IG51bGwgfHwgc2VhcmNoID09ICcnKSB7XHJcbiAgICAgIHJldHVybiBjb21wYW5pZXM7XHJcbiAgICB9IGVsc2UgaWYgKHNlYXJjaCAhPSBudWxsKSB7XHJcbiAgICAgIHNlYXJjaCA9IHNlYXJjaC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBzZWFyY2ggPSBzZWFyY2gudHJpbSgpO1xyXG4gICAgICBjb25zdCB0ZW1wID0gY29tcGFuaWVzLmZpbHRlcihkYXRhID0+XHJcbiAgICAgICAgZGF0YS5jb21wYW55TmFtZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2gpID4gLTFcclxuICAgICAgKVxyXG4gICAgICByZXR1cm4gdGVtcDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vIHRoaXMucHVibnViLnVuc3Vic2NyaWJlKHsgY2hhbm5lbHM6IFt0aGlzLmxvZ2luVXNlcmNoYW5uZWxOYW1lXSB9KTtcclxuICAgIC8vIHZhciBsb2dpbkNvbXBhbnlJZCA9IHRoaXMuY29va2llU2VydmljZS5nZXQoXCJDb21wYW55SWRcIik7XHJcbiAgICAvLyBpZiAodGhpcy5jaGFubmVsTGlzdCAhPSB1bmRlZmluZWQgfHwgdGhpcy5jaGFubmVsTGlzdCAhPSBudWxsKSB7XHJcbiAgICAvLyAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmNoYW5uZWxMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgLy8gICAgIHRoaXMucHVibnViLnVuc3Vic2NyaWJlKHtcclxuICAgIC8vICAgICAgIGNoYW5uZWxzOiBbKGxvZ2luQ29tcGFueUlkICsgJy0nICsgdGhpcy5jaGFubmVsTGlzdFtpbmRleF0uaWQpXVxyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgICAvLyAgdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoe1xyXG4gICAgLy8gICBjaGFubmVsczogWygnQ2hhbm5lbFVwZGF0ZXMtJyArIGxvZ2luQ29tcGFueUlkKV1cclxuICAgIC8vIH0pO1xyXG4gICAgLy8gdGhpcy5wdWJudWIudW5zdWJzY3JpYmUoe1xyXG4gICAgLy8gICBjaGFubmVsczogWygnVXNlclVwZGF0ZXMtJyArIGxvZ2luQ29tcGFueUlkKV1cclxuICAgIC8vIH0pO1xyXG4gICAgdGhpcy5uZ0Rlc3Ryb3llZCQubmV4dCgpO1xyXG4gICAgdGhpcy5uZ0Rlc3Ryb3llZCQuY29tcGxldGUoKTtcclxuICB9XHJcbiAgb25OYXZpZ2F0ZVRvQmlsbGluZ1NjcmVlbigpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIi9zaGVsbC9BY2NvdW50c1wiXSk7XHJcbiAgfVxyXG5cclxuICBvbk5hdmlnYXRlVG9QcmljaW5nU2NyZWVuKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL3NoZWxsL3BheW1lbnRzLXBsYW5zXCJdKTtcclxuICB9XHJcbiAgZ2V0SW50cm9EZXRhaWxzKCkge1xyXG4gICAgdmFyIGludHJvID0gbmV3IEludHJvTW9kZWwoKTtcclxuICAgIGludHJvLnVzZXJJZCA9IHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlcklkKTtcclxuICAgIHRoaXMuY29tbW9uU2VydmljZS5nZXRJbnRyb0RldGFpbHMoaW50cm8pLnN1YnNjcmliZSgocmVzcG9uc2VEYXRhOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlRGF0YS5zdWNjZXNzID09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9IHJlc3BvbnNlRGF0YS5hcGlSZXNwb25zZU1lc3NhZ2VzWzBdLm1lc3NhZ2U7XHJcbiAgICAgICAgdGhpcy5hbnlPcGVyYXRpb25JblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IodGhpcy52YWxpZGF0aW9uTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocmVzcG9uc2VEYXRhLnN1Y2Nlc3MgPT0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBpbnRybyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5JbnRyb01vZHVsZXMpKTtcclxuICAgICAgICBpZighaW50cm8pXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5JbnRyb01vZHVsZXMsIEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlRGF0YS5kYXRhKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVhbU1lbWJlcnMoKSB7XHJcbiAgICB2YXIgdGVhbU1lbWJlck1vZGVsO1xyXG4gICAgbGV0IGVudmlyb25tZW50ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkVudmlyb25tZW50KSk7XHJcbiAgICB2YXIgdGVhbU1lbWJlck1vZGVsO1xyXG4gICAgdGVhbU1lbWJlck1vZGVsID0ge1xyXG4gICAgICBpc0ZvclRyYWNrZXI6IHRydWVcclxuICAgIH1cclxuICAgIHRlYW1NZW1iZXJNb2RlbC5pc0FyY2hpdmVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmNvbW1vblNlcnZpY2UuZ2V0VGVhbUxlYWRzTGlzdCh0ZWFtTWVtYmVyTW9kZWwpLnN1YnNjcmliZSgocmVzcG9uc2VEYXRhOiBhbnkpID0+IHtcclxuICAgICAgbGV0IGVtcGxveWVlc0Ryb3BEb3duID0gcmVzcG9uc2VEYXRhLmRhdGE7XHJcbiAgICAgIGlmIChlbXBsb3llZXNEcm9wRG93biAmJiBlbXBsb3llZXNEcm9wRG93bi5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkVuYWJsZVRlYW1EYXNoYm9hcmQsICd0cnVlJywgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRW5hYmxlVGVhbURhc2hib2FyZCwgJ2ZhbHNlJywgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuIiwiPG1hdC10b29sYmFyIGNsYXNzPVwidG9wYmFyIHJlbW92ZS1wYWRkaW5nXCI+XHJcbiAgICA8ZGl2IGZ4RmxleD5cclxuICAgICAgICA8YXBwLW1lbnUgW3JlbG9hZF09XCJyZWxvYWRcIiAoaXNPcGVuZWQpPVwiaXNPcGVuZWQoJGV2ZW50KVwiIChvcGVuTmV3RGFzaGJvYXJkKT1cIm5hdmlnYXRlVG9VcmwoJGV2ZW50KVwiPjwvYXBwLW1lbnU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVwicm93XCIgZnhIaWRlLnhzIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXJcIiBzdHlsZT1cInZlcnRpY2FsLWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29tcGFuaWVzTGlzdCAhPSBudWxsICYmIGNvbXBhbmllc0xpc3QubGVuZ3RoID4gMVwiIGNsYXNzPVwiZmlsdGVyLWRhdGEgY3VzdG9tLWJveCBsYW5ndWFnZS1zZWN0aW9uXCJcclxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDoxNTBweDtcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiXCIgbmFtZT1cInNlbGVjdGVkQ29tcGFueVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb21wYW55XCJcclxuICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0Q29tcGFueSgkZXZlbnQudmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZENvbXBhbnlcIiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMTVweFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cInsgJ21hcmdpbi1ib3R0b20nOiBzZWxlY3RlZENvbXBhbnkuY29tcGFueU1pbmlMb2dvID8gJzEwcHgnIDogJzBweCcgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1hdmF0YXIgW25hbWVdPVwic2VsZWN0ZWRDb21wYW55LmNvbXBhbnlOYW1lIHwgcmVtb3ZlU3BlY2lhbENoYXJhY3RlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIiBtYXRUb29sdGlwQ2xhc3M9XCJ0b29sdGlwQ2xhc3MtbWF0XCIgbWF0VG9vbHRpcD1cInt7IHNlbGVjdGVkQ29tcGFueS5jb21wYW55TmFtZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJzZWxlY3RlZENvbXBhbnkuY29tcGFueU1pbmlMb2dvIHwgZmV0Y2hTaXplZEFuZENhY2hlZEltYWdlOiAnMjAnOicnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNSb3VuZF09XCJ0cnVlXCIgc2l6ZT1cIjIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC1hdmF0YXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBtYXRUb29sdGlwQ2xhc3M9XCJ0b29sdGlwQ2xhc3MtbWF0XCIgbWF0VG9vbHRpcD1cInt7c2VsZWN0ZWRDb21wYW55LmNvbXBhbnlOYW1lfX1cIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNDAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4RmxleD1cImNhbGMoMTAwJSAtIDQwcHgpXCIgY2xhc3M9XCJsYW5ndWFnZS1kaXNwbGF5XCIgc3R5bGU9XCJjb2xvcjogYmxhY2sgIWltcG9ydGFudDtcIj57eyBzZWxlY3RlZENvbXBhbnlOYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBjbGFzcz1cInNlYXJjaF9nb2FsaW5wdXQgbWwtMVwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IHN0aWNreTsgdG9wOiAwOyB6LWluZGV4OiAxOyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwic2VhcmNoX2dvYWxcIiBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cInt7J0hSTUFOQUdBTUVOVC5TRUFSQ0gnIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAoaW5wdXQpPVwic2VhcmNoKCRldmVudClcIj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbG9zZV9pY29uIG1hc3RlcmRhdGEtc2VhcmNoLWNsb3NlXCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2VhcmNoVGV4dFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwic2VhcmNoVGV4dFwiIGNsYXNzPVwiaWNvbi1idXR0b24gbXItMDUgbXQtMDVcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbG9zZVNlYXJjaCgpXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhbnlMaXN0IG9mIHNlYXJjaENvbXBhbmllcyhjb21wYW5pZXNMaXN0LCBzZWFyY2hUZXh0KVwiIFt2YWx1ZV09XCJjb21wYW55TGlzdFwiXHJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwQ2xhc3M9XCJ0b29sdGlwQ2xhc3MtbWF0XCIgbWF0VG9vbHRpcD1cInt7Y29tcGFueUxpc3QuY29tcGFueU5hbWV9fVwiIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI0MDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWF2YXRhciBbbmFtZV09XCJjb21wYW55TGlzdC5jb21wYW55TmFtZSB8IHJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ21hcmdpbi1ib3R0b20nOiBjb21wYW55TGlzdC5jb21wYW55TWluaUxvZ28gPyAnMTBweCcgOiAnMHB4JyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIiBtYXRUb29sdGlwQ2xhc3M9XCJ0b29sdGlwQ2xhc3MtbWF0XCIgbWF0VG9vbHRpcD1cInt7IGNvbXBhbnlMaXN0LmNvbXBhbnlOYW1lIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY29tcGFueUxpc3QuY29tcGFueU1pbmlMb2dvIHwgZmV0Y2hTaXplZEFuZENhY2hlZEltYWdlOiAnMjAnOicnXCIgW2lzUm91bmRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwiMjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtYXZhdGFyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMDVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbXBhbnlMaXN0LmNvbXBhbnlOYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwic2hvd1RyYWlsUGVyaW9kXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7ICdTSEVMTC5GUkVFVFJBSUxFWFBJUkUnIHwgdHJhbnNsYXRlIH19PHNwYW4gWyhuZ01vZGVsKV09XCJub09mRGF5c1wiPnt7Y29tcGFueS50cmFpbERheXN9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIHt7ICdTSEVMTC5EQVlTJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiaG9tZVwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbc3R5bGUub3ZlcmZsb3ddPVwiJ3Zpc2libGUnXCIgbWF0VG9vbHRpcD1cInt7ICdTSEVMTC5IT01FJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidG9wYmFyLWJ1dHRvbi1yaWdodFwiIChjbGljayk9XCJjaGFuZ2VNZW51VHlwZSgnV29ya3NwYWNlTWVudUl0ZW1zJyk7bmF2aWdhdGVUb0Rhc2hib2FyZHMoKVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIobWVudVR5cGUgPT0gJ1dvcmtzcGFjZU1lbnVJdGVtcyd8fCB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy9kYXNoYm9hcmQtbWFuYWdlbWVudCcpKSA/ICdpY29uX2FjdGl2ZV9jbGFzcycgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmhvbWU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiaG9tZVwiICpuZ0lmPVwiY2FuQWNjZXNzX2ZlYXR1cmVfVmlld1JvbGVzXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFtzdHlsZS5vdmVyZmxvd109XCIndmlzaWJsZSdcIiBtYXRUb29sdGlwPVwie3sgJ1JPTEVTVklFVy5ST0xFUycgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRvcGJhci1idXR0b24tcmlnaHRcIiAoY2xpY2spPVwiY2hhbmdlTWVudVR5cGUoJ1dvcmtzcGFjZU1lbnVJdGVtcycpO25hdmlnYXRlVG9Sb2xlcygpXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihtZW51VHlwZSA9PSAnV29ya3NwYWNlTWVudUl0ZW1zJ3x8IHRoaXMucm91dGVyLnVybC5pbmNsdWRlcygnL3JvbGVtYW5hZ2VtZW50L3JvbGVtYW5hZ2VtZW50JykpID8gJ2ljb25fYWN0aXZlX2NsYXNzJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+YnJpZ2h0bmVzc19oaWdoPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIoY2FuQWNjZXNzX2ZlYXR1cmVfU2V0dGluZ3MpIHx8IChjYW5BY2Nlc3NfZmVhdHVyZV9WaWV3Um9sZXMpXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0VG9vbHRpcENsYXNzPVwidG9vbHRpcENsYXNzLW1hdFwiIG1hdFRvb2x0aXA9XCJ7eyAnU0hFTEwuU0VUVElOR1MnIHwgdHJhbnNsYXRlIH19XCIgY2xhc3M9XCJ0b3BiYXItYnV0dG9uLXJpZ2h0IHRoZW1lLW5hdmJhci1pY29uLWNvbG9yXCIgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVUb1NldHRpbmdzKClcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKHRoaXMucm91dGVyLnVybC5pbmNsdWRlcygnL3NldHRpbmdzJykpID8gJ2ljb25fYWN0aXZlX2NsYXNzJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+c2V0dGluZ3M8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwhLS0gPGRpdiAqbmdJZj1cImNhbkFjY2Vzc19mZWF0dXJlX0FiaWxpdHlUb0NoYXRcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW3N0eWxlLm92ZXJmbG93XT1cIid2aXNpYmxlJ1wiIG1hdFRvb2x0aXA9XCJ7eyAnU0hFTEwuQ0hBVCcgfCB0cmFuc2xhdGUgfX1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0b3BiYXItYnV0dG9uLXJpZ2h0XCIgKGNsaWNrKT1cIm5hdmlnYXRlVG9NZXNzZW5nZXIoKVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIodGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCcvY2hhdCcpKSA/ICdpY29uX2FjdGl2ZV9jbGFzcycgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdEJhZGdlPVwie3ttZXNzYWdlc1VucmVhZENvdW50fX1cIiBbbWF0QmFkZ2VIaWRkZW5dPVwibWVzc2FnZXNVbnJlYWRDb3VudCA9PSAwXCJcclxuICAgICAgICAgICAgICAgICAgICBtYXRCYWRnZUNvbG9yPVwid2FyblwiIGNsYXNzPVwibS0wIGljb25cIj5mb3J1bTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PiAgLS0+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjYW5BY2Nlc3NfZmVhdHVyZV9NeVByb2plY3RXb3JrXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0VG9vbHRpcENsYXNzPVwidG9vbHRpcENsYXNzLW1hdFwiIG1hdFRvb2x0aXA9XCJ7eyAnU0hFTEwuTVlXT1JLJyB8IHRyYW5zbGF0ZSB9fVwiIGNsYXNzPVwidG9wYmFyLWJ1dHRvbi1yaWdodCB0aGVtZS1uYXZiYXItaWNvbi1jb2xvclwiIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlVG9TdGF0dXNSZXBvcnQoKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmFzc2lnbm1lbnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIihjYW5BY2Nlc3NfZmVhdHVyZV9QdW5jaENhcmQpICYmICEoIHRpbWVzaGVldERpc2FibGVvckVuYWJsZSAmJiB0aW1lc2hlZXREaXNhYmxlb3JFbmFibGUuVGltZVNoZWV0UmVzdHJpY3RlZClcIj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBpZD1cImZlZWRUaW1lU2hlZXRDb21wb25lbnRcIiBbc3R5bGUub3ZlcmZsb3ddPVwiJ3Zpc2libGUnXCJcclxuICAgICAgICBtYXRUb29sdGlwQ2xhc3M9XCJ0b29sdGlwQ2xhc3MtbWF0XCIgbWF0VG9vbHRpcD1cInt7ICdTSEVMTC5MT0dUSU1FJyB8IHRyYW5zbGF0ZX19XCIgW3NhdFBvcG92ZXJBbmNob3JGb3JdPVwiZmVlZFRpbWVTaGVldFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvcGVuVGltZVNoZWV0KClcIiBjbGFzcz1cInRvcGJhci1idXR0b24tcmlnaHQgdGhlbWUtbmF2YmFyLWljb24tY29sb3JcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPmFjY2Vzc190aW1lPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSBOb3RpZmljYXRpb24gdG9nZ2xlIGJ1dHRvbiAtLT5cclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXBDbGFzcz1cInRvb2x0aXBDbGFzcy1tYXRcIiBtYXRUb29sdGlwPVwie3sgJ1NIRUxMLk5PVElGSUNBVElPTlMnIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwidG9nZ2xlTm90aWZpYygpXCJcclxuICAgICAgICBbc3R5bGUub3ZlcmZsb3ddPVwiJ3Zpc2libGUnXCIgKm5nSWY9XCJuZXdOb3RpZmljYXRpb25zQ291bnQgIT0gMFwiIGNsYXNzPVwidG9wYmFyLWJ1dHRvbi1yaWdodCB0aGVtZS1uYXZiYXItaWNvbi1jb2xvclwiXHJcbiAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm5vdGlmaWNhdGlvblwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5ub3RpZmljYXRpb25zPC9tYXQtaWNvbj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIm5ld05vdGlmaWNhdGlvbnNDb3VudCAhPSAwXCIgY2xhc3M9XCJub3RpZmljYXRpb24tbnVtYmVyIG1hdC1iZy13YXJuXCI+e3tcclxuICAgICAgICAgICAgbmV3Tm90aWZpY2F0aW9uc0NvdW50IH19PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8bWF0LW1lbnUgI25vdGlmaWNhdGlvbj1cIm1hdE1lbnVcIj5cclxuICAgICAgICA8YXBwLW5vdGlmaWNhdGlvbnM+PC9hcHAtbm90aWZpY2F0aW9ucz5cclxuICAgIDwvbWF0LW1lbnU+XHJcblxyXG4gICAgPCEtLSBUb3AgbGVmdCB1c2VyIG1lbnUgLS0+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYWNjb3VudE1lbnVcIiAoY2xpY2spPVwidG9nZ2xlUmVjb3JkaW5nKClcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cInRoaXMucm91dGVyLnVybC5pbmNsdWRlcygnL2Rhc2hib2FyZC9wcm9maWxlLycpID8gJ2ljb25fYWN0aXZlX2NsYXNzJyA6ICcnXCJcclxuICAgICAgICBjbGFzcz1cInRvcGJhci1idXR0b24tcmlnaHQgaW1nLWJ1dHRvblwiICpuZ0lmPVwiYXV0aGVudGljYXRlZFVzZXJSZWNvcmRcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiaWNvbi1oaWdobGlnaHQtc2V0dGVyXCIgKm5nSWY9XCJhdXRoZW50aWNhdGVkVXNlclJlY29yZC5wcm9maWxlSW1hZ2VcIlxyXG4gICAgICAgICAgICBbc3JjXT1cImF1dGhlbnRpY2F0ZWRVc2VyUmVjb3JkLnByb2ZpbGVJbWFnZSB8IGZldGNoU2l6ZWRBbmRDYWNoZWRJbWFnZTogJzYwJzonJ1wiIGFsdD1cInByb2ZpbGUgaW1hZ2VcIiAvPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhYXV0aGVudGljYXRlZFVzZXJSZWNvcmQucHJvZmlsZUltYWdlXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogNHB4ICFpbXBvcnRhbnQ7XCI+XHJcbiAgICAgICAgICAgIDxhcHAtYXZhdGFyIFtuYW1lXT1cImF1dGhlbnRpY2F0ZWRVc2VyUmVjb3JkLmZ1bGxOYW1lIHwgcmVtb3ZlU3BlY2lhbENoYXJhY3RlcnNcIiBbaXNSb3VuZF09XCJ0cnVlXCIgc2l6ZT1cIjMwXCI+XHJcbiAgICAgICAgICAgIDwvYXBwLWF2YXRhcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDxzYXQtcG9wb3ZlciAjZmVlZFRpbWVTaGVldCBbYXV0b0ZvY3VzXT1cImZhbHNlXCIgaGFzQmFja2Ryb3AgW3Jlc3RvcmVGb2N1c109XCJmYWxzZVwiIFtpbnRlcmFjdGl2ZUNsb3NlXT1cInRydWVcIlxyXG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5PVwicmVwb3NpdGlvblwiIHZlcnRpY2FsQWxpZ249XCJiZWxvd1wiIGhvcml6b250YWxBbGlnbj1cImJlZm9yZVwiPlxyXG4gICAgICAgIDxhcHAtZmVlZC10aW1lIChjbG9zZUZlZWRUaW1lU2hlZXRQb3B1cCk9XCJjbG9zZUZlZWRUaW1lU2hlZXQoKVwiIFtpc0ZlZWRUaW1lU2hlZXRdPVwiaXNGZWVkVGltZVNoZWV0XCI+XHJcbiAgICAgICAgPC9hcHAtZmVlZC10aW1lPlxyXG4gICAgPC9zYXQtcG9wb3Zlcj5cclxuXHJcbiAgICA8bWF0LW1lbnUgI2FjY291bnRNZW51PVwibWF0TWVudVwiPlxyXG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwibmF2aWdhdGVUb1Byb2ZpbGUoKVwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+YWNjb3VudF9ib3g8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyAnU0hFTEwuUFJPRklMRScgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWN0aXZpdHktcmVjb3JkZXIgcmVjb3JkaW5nLXN0eWxlXCIgKm5nSWY9XCJpc1JlY29yZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBmaWJlcl9tYW51YWxfcmVjb3JkIC0tPlxyXG4gICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8IS0tIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZ29Ub1VzZXJTdG9yZSgpXCIgKm5nSWY9XCJpc1N0b3JlQWNjZXNzXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG91ZDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDxzcGFuPlN0b3JlPC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPiAtLT5cclxuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gbWF0VG9vbHRpcENsYXNzPVwidG9vbHRpcENsYXNzLW1hdFwiIG1hdFRvb2x0aXA9XCJ7eyAnU0hFTEwuQ0xFQVJERU1PREFUQScgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwic2hvd0RlbGV0ZUljb24gJiYgc2hvd0RlbGV0ZVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhckRlbW9EYXRhKClcIiBbc3R5bGUub3ZlcmZsb3ddPVwiJ3Zpc2libGUnXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyAnU0hFTEwuQ0xFQVJERU1PREFUQScgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gbWF0VG9vbHRpcENsYXNzPVwidG9vbHRpcENsYXNzLW1hdFwiIG1hdFRvb2x0aXA9XCJ7eyAnU0hFTEwuRVhQT1JUQ09ORklHVVJBVElPTicgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiY2FuQWNjZXNzX2ZlYXR1cmVfTWFuYWdlU3lzdGVtRXhwb3J0c1wiIChjbGljayk9XCJleHBvcnRDb25maWd1cmF0aW9uRGlhbG9nRGF0YSgpXCJcclxuICAgICAgICAgICAgW3N0eWxlLm92ZXJmbG93XT1cIid2aXNpYmxlJ1wiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+Z2V0X2FwcDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7ICdTSEVMTC5FWFBPUlRDT05GSUdVUkFUSU9OJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBtYXRUb29sdGlwQ2xhc3M9XCJ0b29sdGlwQ2xhc3MtbWF0XCIgbWF0VG9vbHRpcD1cInt7ICdTSEVMTC5JTVBPUlRDT05GSUdVUkFUSU9OJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgW3NhdFBvcG92ZXJBbmNob3JGb3JdPVwiZmlsZVVwbG9hZERyb3B6b25lUG9wb3ZlclwiICNmaWxlVXBsb2FkRHJvcHpvbmVQb3B1cD1cInNhdFBvcG92ZXJBbmNob3JcIlxyXG4gICAgICAgICAgICAqbmdJZj1cImNhbkFjY2Vzc19mZWF0dXJlX01hbmFnZVN5c3RlbUltcG9ydHNcIiAoY2xpY2spPVwiYWRkVXBsb2FkRmlsZVBvcHVwT3BlbihmaWxlVXBsb2FkRHJvcHpvbmVQb3B1cClcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPnB1Ymxpc2g8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyAnU0hFTEwuSU1QT1JUQ09ORklHVVJBVElPTicgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8IS0tPGRpdiBjbGFzcz1cImZpbHRlci1kYXRhIGN1c3RvbS1ib3ggbGFuZ3VhZ2Utc2VjdGlvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJcIiBuYW1lPVwiY3VycmVudExhbmdcIiBbKG5nTW9kZWwpXT1cImN1cnJlbnRMYW5nXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZXRMYW5nKClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMTVweFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZnhGbGV4PVwiMjRweFwiIGNsYXNzPVwibGFuZ3VhZ2UtaWNvblwiPmxhbmd1YWdlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZnhGbGV4PVwiY2FsYygxMDAlIC0gNDBweClcIiBjbGFzcz1cImxhbmd1YWdlLWRpc3BsYXlcIj57eyBzZWxlY3RlZExhbmdOYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm9wdGlvblwiICpuZ0Zvcj1cImxldCBsYW5nIG9mIGF2YWlsYWJsZUxhbmdzXCIgW3ZhbHVlXT1cImxhbmcuY29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGxhbmcubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+LS0+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbk5hdmlnYXRlVG9CaWxsaW5nU2NyZWVuKClcIiAqbmdJZj1cImNhbkFjY2Vzc19mZWF0dXJlX01hbmFnZUFjY291bnRzQW5kQmlsbGluZ1wiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+YWNjb3VudF9iYWxhbmNlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPHNwYW4+QWNjb3VudCAmIEJpbGxpbmc8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbk5hdmlnYXRlVG9QcmljaW5nU2NyZWVuKClcIiAqbmdJZj1cImNhbkFjY2Vzc19mZWF0dXJlX01hbmFnZUFjY291bnRzQW5kQmlsbGluZ1wiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+YWNjb3VudF9iYWxhbmNlX3dhbGxldDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDxzcGFuPlByaWNpbmcgJiBGZWF0dXJlczwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImNhbkFjY2Vzc19mZWF0dXJlX0FsdGVybmF0ZVNpZ25JblwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImFsdGVybmF0ZVNpZ25JbigpXCJcclxuICAgICAgICAgICAgW3N0eWxlLm92ZXJmbG93XT1cIid2aXNpYmxlJ1wiIG1hdFRvb2x0aXBDbGFzcz1cInRvb2x0aXBDbGFzcy1tYXRcIiBtYXRUb29sdGlwPVwie3sgJ1NIRUxMLlNJR05JTkFTJyB8IHRyYW5zbGF0ZX19XCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5ob3dfdG9fcmVnPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPHNwYW4+e3sgJ1NIRUxMLlNJR05JTkFTJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25TaWdub3V0KClcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPmV4aXRfdG9fYXBwPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPHNwYW4+e3sgJ1NIRUxMLlNJR05PVVQnIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJmZWVkQmFja1BvcG92ZXIudG9nZ2xlKCk7b3BlbkZlZWRCYWNrRGlhbG9nKClcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZmVlZGJhY2staWNvblwiIFtzYXRQb3BvdmVyQW5jaG9yRm9yXT1cImZlZWRCYWNrUG9wb3ZlclwiPlxyXG4gICAgICAgICAgICAgICAgc2VudGltZW50X3NhdGlzZmllZF9hbHRcclxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPHNwYW4+di17e2FwcGxpY2F0aW9uVmVyc2lvbn19PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9tYXQtbWVudT5cclxuPC9tYXQtdG9vbGJhcj5cclxuPCEtLSA8bmd4LXVpLWxvYWRlciBmZ3NTaXplPVwiMTgwXCIgW2Znc1R5cGVdPVwic3Bpbm5lclR5cGVcIiBjb2xvcj1cInByaW1hcnlcIj48L25neC11aS1sb2FkZXI+IC0tPlxyXG48ZGl2ICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiay1pLWxvYWRpbmdcIj48L2Rpdj5cclxuPHNhdC1wb3BvdmVyICNmZWVkQmFja1BvcG92ZXIgdmVydGljYWxBbGlnbj1cImJlbG93XCIgaGFzQmFja2Ryb3AgYmFja2Ryb3BDbGFzcz1cImJhY2tkcm9wLWNvbG9yXCJcclxuICAgIFtpbnRlcmFjdGl2ZUNsb3NlXT1cImZhbHNlXCIgaG9yaXpvbnRhbEFsaWduPVwiZW5kXCI+XHJcbiAgICA8YXBwLXN1Ym1pdC1mZWVkYmFjayAqbmdJZj1cImlzRmVlZEJhY2tEaWFsb2dcIiAoY2xvc2VEaWFsb2cpPVwiY2xvc2VGZWVkQmFja2xvZ0RpYWxvZygpXCI+XHJcbiAgICA8L2FwcC1zdWJtaXQtZmVlZGJhY2s+XHJcbjwvc2F0LXBvcG92ZXI+XHJcblxyXG48bWF0LW1lbnUgI21lbnUyPVwibWF0TWVudVwiIGNsYXNzPVwiZGlhbG9nX3dpbmRvd1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwicC0wIG0tMCBsaXN0b2ZfYXNzZXRzIHN0b3JlLWxpc3QtZHJvcGRvd25cIiBpZD1cInN0eWxlLTFcIj5cclxuICAgICAgICA8bWF0LWxpc3QgY2xhc3M9XCJjb21wYWN0LWxpc3RcIj5cclxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwicC0wIGFzc2V0LWNhcmRcIiAqbmdJZj1cIihjYW5BY2Nlc3NfZmVhdHVyZV9BZGRPclVwZGF0ZUZvcm0gfHwgY2FuQWNjZXNzX2ZlYXR1cmVfVmlld0Zvcm1zKVwiXHJcbiAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy9hcHBsaWNhdGlvbnMvdmlldy1mb3JtcyddXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtY29udGVudC1vdmVyZmxvdyB1c2VyU3RvcnktbmFtZS1jb250cm9sIHN0b3JlLWRyb3Bkb3duLXBhZGRpbmdcIj5Gb3Jtczwvc3Bhbj5cclxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cclxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwicC0wIGFzc2V0LWNhcmRcIiAqbmdJZj1cImNhbkFjY2Vzc19mZWF0dXJlX0FkZE9yVXBkYXRlQXBwbGljYXRpb25zXCJcclxuICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL2FwcGxpY2F0aW9ucy9jdXN0b20tYXBwbGljYXRpb25zJ11cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1jb250ZW50LW92ZXJmbG93IHVzZXJTdG9yeS1uYW1lLWNvbnRyb2wgc3RvcmUtZHJvcGRvd24tcGFkZGluZ1wiPkN1c3RvbVxyXG4gICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uczwvc3Bhbj5cclxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cclxuICAgICAgICAgICAgPG1hdC1jYXJkICpuZ0lmPVwiY2FuQWNjZXNzX2ZlYXR1cmVfVmlld1JvbGVzXCIgY2xhc3M9XCJwLTAgYXNzZXQtY2FyZFwiXHJcbiAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy9yb2xlbWFuYWdlbWVudC9yb2xlbWFuYWdlbWVudCddXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtY29udGVudC1vdmVyZmxvdyB1c2VyU3RvcnktbmFtZS1jb250cm9sIHN0b3JlLWRyb3Bkb3duLXBhZGRpbmdcIj5Sb2xlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cclxuICAgICAgICAgICAgPG1hdC1jYXJkICpuZ0lmPVwiY2FuQWNjZXNzX2ZlYXR1cmVfTWFuYWdlUHJvamVjdFJvbGVQZXJtaXNzaW9uc1wiIGNsYXNzPVwicC0wIGFzc2V0LWNhcmRcIlxyXG4gICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiWycvcm9sZW1hbmFnZW1lbnQvZW50aXR5cm9sZW1hbmFnZW1lbnQnXVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLWNvbnRlbnQtb3ZlcmZsb3cgdXNlclN0b3J5LW5hbWUtY29udHJvbCBzdG9yZS1kcm9wZG93bi1wYWRkaW5nXCI+e3twcm9qZWN0Um9sZVRleHQgfFxyXG4gICAgICAgICAgICAgICAgICAgIHNvZnRMYWJlbHNQaXBlIDogc29mdExhYmVsc319PC9zcGFuPlxyXG4gICAgICAgICAgICA8L21hdC1jYXJkPlxyXG4gICAgICAgIDwvbWF0LWxpc3Q+XHJcbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbjwvbWF0LW1lbnU+XHJcblxyXG48ZGl2IFtAZmFkZV0gKm5nSWY9XCJkaXNwbGF5V2VsY29tZU5vdGUgJiYgdXNlckZ1bGxOYW1lXCIgY2xhc3M9XCJ3ZWxjb21lLW5vdGVcIj5cclxuICAgIDxzcGFuICpuZ0lmPVwibG9nZ2VkSW5Db3VudCA9PSAxOyBlbHNlIGVsc2VTcGFuXCI+V2VsY29tZSAmbmJzcDsgPC9zcGFuPiA8c3Bhbj4ge3sgdXNlckZ1bGxOYW1lIH19IDwvc3Bhbj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZWxzZVNwYW4+IFdlbGNvbWUgYmFjayAmbmJzcDs8L25nLXRlbXBsYXRlPlxyXG48L2Rpdj5cclxuPHNhdC1wb3BvdmVyICNmaWxlVXBsb2FkRHJvcHpvbmVQb3BvdmVyIGhhc0JhY2tkcm9wIFtpbnRlcmFjdGl2ZUNsb3NlXT1cImZhbHNlXCIgYmFja2Ryb3BDbGFzcz1cInRlc3RydW4tcG9wb3ZlclwiXHJcbiAgICBzY3JvbGxTdHJhdGVneT1cInJlcG9zaXRpb25cIj5cclxuICAgIDxtYXQtY2FyZCBjbGFzcz1cInAtMCBtci0wIGN1c3RvbS1ocm0tZHJvcHpvbmVcIj5cclxuICAgICAgICA8bWF0LWNhcmQtdGl0bGU+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlLXRleHQgbWF0LWJnLXByaW1hcnkgcC0wNVwiIGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3snVEVTVE1BTkFHRU1FTlQuVVBMT0FERklMRVMnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCIyMHB4XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5saW5lX2VkaXRfY2xvc2VfYnRuIGJ0blwiIChjbGljayk9XCJjbG9zZVVwbG9hZEZpbGVQb3B1cCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L21hdC1jYXJkLXRpdGxlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kcm9wem9uZSBkcm9wem9uZS1oZWlnaHRcIiBuZ3gtZHJvcHpvbmUgKGNoYW5nZSk9XCJmaWxlc1NlbGVjdGVkKCRldmVudClcIiBhY2NlcHQ9XCIuanNvblwiPlxyXG4gICAgICAgICAgICAgICAgPG5neC1kcm9wem9uZS1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eydET0NVTUVOVE1BTkFHRU1FTlQuRFJBR0FORERST1BGSUxFU0hFUkUnIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L25neC1kcm9wem9uZS1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxuZ3gtZHJvcHpvbmUtcHJldmlldyBjbGFzcz1cImN1c3RvbS1kcm9wem9uZS1wcmV2aWV3XCIgKm5nRm9yPVwibGV0IGYgb2YgZmlsZXNcIiBbcmVtb3ZhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChyZW1vdmVkKT1cIm9uUmVtb3ZlKGYpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5neC1kcm9wem9uZS1sYWJlbCBjbGFzcz1cImN1c3RvbS1kcm9wem9uZS1sYWJlbFwiIFthdHRyLmRhdGEtdGlwXT1cImYubmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBzZXRMYWJlbE5hbWVGb3JEcm9wem9uZShmLm5hbWUpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZ3gtZHJvcHpvbmUtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L25neC1kcm9wem9uZS1wcmV2aWV3PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMDUgdGV4dC1tdXRlZFwiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCBmaWxlIGV4dGVuc2lvbnMgOiAuanNvbjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIGNvbG9yPVwicHJpbWFyeVwiIG1vZGU9XCJkZXRlcm1pbmF0ZVwiIFt2YWx1ZV09XCJwcm9ncmVzc1ZhbHVlXCIgKm5nSWY9XCJwcm9ncmVzc1ZhbHVlID4gMFwiPlxyXG4gICAgICAgICAgICA8L21hdC1wcm9ncmVzcy1iYXI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9ncmVzc1ZhbHVlID4gMFwiPlxyXG4gICAgICAgICAgICAgICAge3twcm9ncmVzc1ZhbHVlfX0lIGNvbXBsZXRlZCAoVXBsb2FkaW5nIHt7ZmlsZUNvdW50ZXJ9fSBvZiB7e2ZpbGVzLmxlbmd0aH19IGZpbGVzKVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTA1XCIgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBlbmRcIiAqbmdJZj1cImZpbGVzUHJlc2VudFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzYXZlRmlsZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGNsYXNzPVwibXItMDVcIiBpY29uPVwic2F2ZVwiPjwvZmEtaWNvbj57eydVUExPQUQnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1sLTFcIiBtYXQtYnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJyZW1vdmVBbGxGaWxlcygpO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGNsYXNzPVwibXItMDVcIiBpY29uPVwidGltZXNcIj48L2ZhLWljb24+e3snRE9DVU1FTlRNQU5BR0VNRU5ULkNMRUFSRklMRVMnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTA1XCIgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBlbmRcIiAqbmdJZj1cImltcG9ydGluZ0luUHJvZ3Jlc3NcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJtbC0xXCIgbWF0LWJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGNsYXNzPVwibXItMDVcIiBpY29uPVwidXBsb2FkXCI+PC9mYS1pY29uPnt7J1NIRUxMLklNUE9SVElOR1RFWFQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zcGluIGZhLXNwaW5uZXJcIiAqbmdJZj1cImltcG9ydGluZ0luUHJvZ3Jlc3NcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC1jYXJkPlxyXG48L3NhdC1wb3BvdmVyPlxyXG5cclxuPHN0eWxlPlxyXG4gICAgLmZpbGUtb3ItZm9sZGVyLWljb24ge1xyXG4gICAgICAgIHdpZHRoOiA1MHB4O1xyXG4gICAgICAgIGhlaWdodDogNTBweDtcclxuICAgICAgICBmb250LXNpemU6IDUwcHg7XHJcbiAgICB9XHJcblxyXG4gICAgLmZpbGUtb3ItZm9sZGVyLW5hbWUtYWxpZ24ge1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XHJcbiAgICAgICAgLXdlYmtpdC1saW5lLWNsYW1wOiAyO1xyXG4gICAgICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XHJcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmRyb3B6b25lLWhlaWdodCB7XHJcbiAgICAgICAgaGVpZ2h0OiAxMzBweDtcclxuICAgIH1cclxuXHJcbiAgICAuY3VzdG9tLWRyb3B6b25lLXByZXZpZXcge1xyXG4gICAgICAgIGhlaWdodDogMTAwcHggIWltcG9ydGFudDtcclxuICAgICAgICBtaW4taGVpZ2h0OiAxMDBweCAhaW1wb3J0YW50O1xyXG4gICAgICAgIHBhZGRpbmc6IDBweCAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG48L3N0eWxlPlxyXG48bmctdGVtcGxhdGUgI29wZW5Bbm5vdWNlbWVudERpYWxvZ0NvbXBvbmVudCBsZXQtZGF0YT5cclxuICAgIDxhbm5vdW5jZW1lbnQtZGlhbG9nIFtkYXRhXT1bZGF0YV0+PC9hbm5vdW5jZW1lbnQtZGlhbG9nPlxyXG48L25nLXRlbXBsYXRlPiJdfQ==