@thetradeengineorg1/snova-shell-module 0.0.260 → 0.0.261

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 (290) hide show
  1. package/README.md +24 -24
  2. package/bundles/thetradeengineorg1-snova-shell-module.umd.js +18874 -18874
  3. package/bundles/thetradeengineorg1-snova-shell-module.umd.js.map +1 -1
  4. package/esm2015/lib/globaldependencies/components/avatar.component.js +33 -33
  5. package/esm2015/lib/globaldependencies/components/componentbase.js +538 -538
  6. package/esm2015/lib/globaldependencies/constants/feature-ids.js +449 -449
  7. package/esm2015/lib/globaldependencies/constants/localstorage-properties.js +38 -38
  8. package/esm2015/lib/globaldependencies/helpers/dom.helper.js +70 -70
  9. package/esm2015/lib/globaldependencies/helpers/fontawesome-icons.js +144 -144
  10. package/esm2015/lib/globaldependencies/helpers/moment-utc-date-adapter.js +37 -37
  11. package/esm2015/lib/globaldependencies/helpers/window.helper.js +32 -32
  12. package/esm2015/lib/globaldependencies/intercepter/jwt.interceptor.js +40 -40
  13. package/esm2015/lib/globaldependencies/pipes/fetchSizedAndCachedImage.pipe.js +36 -36
  14. package/esm2015/lib/globaldependencies/pipes/highLightText.pipe.js +24 -24
  15. package/esm2015/lib/globaldependencies/pipes/orderby-pipe.js +24 -24
  16. package/esm2015/lib/globaldependencies/pipes/removeSpecialCharacters.pipe.js +22 -22
  17. package/esm2015/lib/globaldependencies/pipes/sanitize.pipe.js +24 -24
  18. package/esm2015/lib/globaldependencies/pipes/softlabels.pipes.js +346 -346
  19. package/esm2015/lib/globaldependencies/pipes/utctolocaltime.pipe.js +23 -23
  20. package/esm2015/lib/globaldependencies/pipes/utctolocaltimewithdate.pipe.js +25 -25
  21. package/esm2015/lib/globaldependencies/pipes/workflowstatus.pipes.js +27 -27
  22. package/esm2015/lib/shell-components/components/Payments/account.component.js +121 -121
  23. package/esm2015/lib/shell-components/components/Payments/company-information.js +558 -558
  24. package/esm2015/lib/shell-components/components/Payments/company-plans.component.js +636 -636
  25. package/esm2015/lib/shell-components/components/Payments/document.component.js +129 -129
  26. package/esm2015/lib/shell-components/components/Payments/payment-method.component.js +90 -90
  27. package/esm2015/lib/shell-components/components/Payments/product-service.component.js +438 -438
  28. package/esm2015/lib/shell-components/components/Payments/purchase-more-licenses.js +249 -249
  29. package/esm2015/lib/shell-components/components/Payments/transactions.component.js +172 -172
  30. package/esm2015/lib/shell-components/components/admin-layout/admin-layout.component.js +350 -350
  31. package/esm2015/lib/shell-components/components/all-work-items-dialog/all-work-items-dialog.component.js +102 -102
  32. package/esm2015/lib/shell-components/components/confirmation-dialog/confirmation-dialog.component.js +126 -126
  33. package/esm2015/lib/shell-components/components/export-import-configuration/export-configuration.component.js +502 -502
  34. package/esm2015/lib/shell-components/components/feed-time/feed-time-dialog.component.js +98 -98
  35. package/esm2015/lib/shell-components/components/feed-time/feed-time.component.js +87 -87
  36. package/esm2015/lib/shell-components/components/header-side/header-side.component.js +2342 -2342
  37. package/esm2015/lib/shell-components/components/header-top/header-top.component.js +489 -489
  38. package/esm2015/lib/shell-components/components/lives/lives-welcome-page.js +55 -55
  39. package/esm2015/lib/shell-components/components/menu/menu.component.js +3413 -3413
  40. package/esm2015/lib/shell-components/components/menu/searchTask.enum.js +10 -10
  41. package/esm2015/lib/shell-components/components/notifications/announcement-dialog.component.js +110 -110
  42. package/esm2015/lib/shell-components/components/notifications/notifications.component.js +534 -534
  43. package/esm2015/lib/shell-components/components/sidebar-top/sidebar-top.component.js +39 -39
  44. package/esm2015/lib/shell-components/components/sidenav/side-bar.component.js +148 -148
  45. package/esm2015/lib/shell-components/components/sidenav/sidenav.component.js +439 -439
  46. package/esm2015/lib/shell-components/components/submit-feedback/submit-feedback.component.js +75 -75
  47. package/esm2015/lib/shell-components/constants/api-urls.js +1052 -1052
  48. package/esm2015/lib/shell-components/constants/available-languages.js +25 -25
  49. package/esm2015/lib/shell-components/constants/channel-names.js +38 -38
  50. package/esm2015/lib/shell-components/constants/menu-categories.js +6 -6
  51. package/esm2015/lib/shell-components/constants/notification-routes.js +6 -6
  52. package/esm2015/lib/shell-components/constants/notification-type-ids.js +42 -42
  53. package/esm2015/lib/shell-components/enum/recentSearchType.enum.js +13 -13
  54. package/esm2015/lib/shell-components/models/AppMenuItemModel.js +3 -3
  55. package/esm2015/lib/shell-components/models/AppNotification.js +17 -17
  56. package/esm2015/lib/shell-components/models/AssetAssignedNotificationModel.js +12 -12
  57. package/esm2015/lib/shell-components/models/ChannelUpdateModel.js +3 -3
  58. package/esm2015/lib/shell-components/models/EmployeeStatusModel.js +3 -3
  59. package/esm2015/lib/shell-components/models/IAdjust-screen-options.js +2 -2
  60. package/esm2015/lib/shell-components/models/IBadge.js +2 -2
  61. package/esm2015/lib/shell-components/models/IChildItem.js +2 -2
  62. package/esm2015/lib/shell-components/models/ILayout-change-options.js +2 -2
  63. package/esm2015/lib/shell-components/models/IMenuItem.js +2 -2
  64. package/esm2015/lib/shell-components/models/IlayoutConf.js +2 -2
  65. package/esm2015/lib/shell-components/models/IntroModel.js +3 -3
  66. package/esm2015/lib/shell-components/models/MessageDetails.js +3 -3
  67. package/esm2015/lib/shell-components/models/MessageTypingDetails.js +3 -3
  68. package/esm2015/lib/shell-components/models/NewProjectCreatedNotificationModel.js +10 -10
  69. package/esm2015/lib/shell-components/models/NewProjectFeatureNotificationModel.js +10 -10
  70. package/esm2015/lib/shell-components/models/NotificationsOutPutModel.js +22 -22
  71. package/esm2015/lib/shell-components/models/ProjectSearchCriteriaInputModel.js +3 -3
  72. package/esm2015/lib/shell-components/models/RecentSearchModel.js +5 -5
  73. package/esm2015/lib/shell-components/models/ReportConfigAssignedNotification.js +11 -11
  74. package/esm2015/lib/shell-components/models/ReportSubmittedNotification.js +12 -12
  75. package/esm2015/lib/shell-components/models/RoleUpdatedNotification.js +9 -9
  76. package/esm2015/lib/shell-components/models/UserStoryAssignedNotification.js +13 -13
  77. package/esm2015/lib/shell-components/models/archiveUserStoryModel.js +10 -10
  78. package/esm2015/lib/shell-components/models/companieslist.model.js +3 -3
  79. package/esm2015/lib/shell-components/models/company-model.js +7 -7
  80. package/esm2015/lib/shell-components/models/company-payment-model.js +3 -3
  81. package/esm2015/lib/shell-components/models/dragedWidget.js +3 -3
  82. package/esm2015/lib/shell-components/models/employee-List.js +3 -3
  83. package/esm2015/lib/shell-components/models/employee.js +4 -4
  84. package/esm2015/lib/shell-components/models/entityRoleFeature.js +3 -3
  85. package/esm2015/lib/shell-components/models/export-configuration-model.js +3 -3
  86. package/esm2015/lib/shell-components/models/export-data.module.js +8 -8
  87. package/esm2015/lib/shell-components/models/goalApprovedNotificationModel.js +9 -9
  88. package/esm2015/lib/shell-components/models/import-configuration-model.js +3 -3
  89. package/esm2015/lib/shell-components/models/initialStatusofUsers.js +3 -3
  90. package/esm2015/lib/shell-components/models/invoiceOutput-model.js +3 -3
  91. package/esm2015/lib/shell-components/models/leaveApplicationNotifiction.js +9 -9
  92. package/esm2015/lib/shell-components/models/multiChartsScheduling.js +11 -11
  93. package/esm2015/lib/shell-components/models/parkUserStoryInputModel.js +10 -10
  94. package/esm2015/lib/shell-components/models/project.js +3 -3
  95. package/esm2015/lib/shell-components/models/recentSearchApiModel.js +3 -3
  96. package/esm2015/lib/shell-components/models/searchCriteriaInputModelBase.js +3 -3
  97. package/esm2015/lib/shell-components/models/shellModulesInfo.js +7 -7
  98. package/esm2015/lib/shell-components/models/softlabels-model.js +7 -7
  99. package/esm2015/lib/shell-components/models/sprintReplanRequestedModel.js +9 -9
  100. package/esm2015/lib/shell-components/models/sprintStartedNotificationModel.js +9 -9
  101. package/esm2015/lib/shell-components/models/store-model.js +3 -3
  102. package/esm2015/lib/shell-components/models/store-search-model.js +4 -4
  103. package/esm2015/lib/shell-components/models/themes.model.js +3 -3
  104. package/esm2015/lib/shell-components/models/timesheetenabledisable.js +4 -4
  105. package/esm2015/lib/shell-components/models/user.js +8 -8
  106. package/esm2015/lib/shell-components/models/userStory.js +3 -3
  107. package/esm2015/lib/shell-components/models/userStoryCommentNotificationModel.js +9 -9
  108. package/esm2015/lib/shell-components/models/userStoryUpdateNotificationModel.js +9 -9
  109. package/esm2015/lib/shell-components/models/userstory-custom-fields.model.js +3 -3
  110. package/esm2015/lib/shell-components/models/validation.model.js +2 -2
  111. package/esm2015/lib/shell-components/models/widgetlist.js +6 -6
  112. package/esm2015/lib/shell-components/models/workspaceList.js +3 -3
  113. package/esm2015/lib/shell-components/services/authentication.service.js +96 -96
  114. package/esm2015/lib/shell-components/services/chat.service.js +67 -67
  115. package/esm2015/lib/shell-components/services/common-used.service.js +263 -263
  116. package/esm2015/lib/shell-components/services/feature.service.js +101 -101
  117. package/esm2015/lib/shell-components/services/google-analytics.service.js +24 -24
  118. package/esm2015/lib/shell-components/services/layout.service.js +68 -68
  119. package/esm2015/lib/shell-components/services/payment.service.js +103 -103
  120. package/esm2015/lib/shell-components/services/recentSearch.service.js +90 -90
  121. package/esm2015/lib/shell-components/services/shell.modules.service.js +24 -24
  122. package/esm2015/lib/shell-components/services/signalr.service.js +113 -113
  123. package/esm2015/lib/shell-components/services/theme.service.js +161 -161
  124. package/esm2015/lib/shell-components/shell.module.js +450 -450
  125. package/esm2015/lib/shell-components/shell.routing.js +16 -16
  126. package/esm2015/lib/shell-components/store/actions/authentication.actions.js +260 -260
  127. package/esm2015/lib/shell-components/store/actions/chat.actions.js +248 -248
  128. package/esm2015/lib/shell-components/store/actions/menuitems.actions.js +39 -39
  129. package/esm2015/lib/shell-components/store/actions/notification-validator.action.js +19 -19
  130. package/esm2015/lib/shell-components/store/actions/notifications.actions.js +74 -74
  131. package/esm2015/lib/shell-components/store/effects/authentication.effects.js +503 -503
  132. package/esm2015/lib/shell-components/store/effects/chat.effects.js +139 -139
  133. package/esm2015/lib/shell-components/store/effects/index.js +13 -13
  134. package/esm2015/lib/shell-components/store/effects/menuitems.effects.js +53 -53
  135. package/esm2015/lib/shell-components/store/effects/notification-validator.effects.js +56 -56
  136. package/esm2015/lib/shell-components/store/effects/notifications.effects.js +116 -116
  137. package/esm2015/lib/shell-components/store/reducers/authentication.reducers.js +86 -86
  138. package/esm2015/lib/shell-components/store/reducers/chat.reducers.js +68 -68
  139. package/esm2015/lib/shell-components/store/reducers/index.js +80 -80
  140. package/esm2015/lib/shell-components/store/reducers/menuitems.reducers.js +56 -56
  141. package/esm2015/lib/shell-components/store/reducers/notification-validator.reducers.js +13 -13
  142. package/esm2015/lib/shell-components/store/reducers/notifications.reducers.js +38 -38
  143. package/esm2015/public-api.js +92 -92
  144. package/esm2015/store/reducers/index.js +47 -47
  145. package/esm2015/thetradeengineorg1-snova-shell-module.js +4 -4
  146. package/fesm2015/thetradeengineorg1-snova-shell-module.js +16979 -16979
  147. package/fesm2015/thetradeengineorg1-snova-shell-module.js.map +1 -1
  148. package/lib/globaldependencies/components/avatar.component.d.ts +10 -10
  149. package/lib/globaldependencies/components/componentbase.d.ts +455 -455
  150. package/lib/globaldependencies/constants/feature-ids.d.ts +448 -448
  151. package/lib/globaldependencies/constants/localstorage-properties.d.ts +37 -37
  152. package/lib/globaldependencies/helpers/dom.helper.d.ts +7 -7
  153. package/lib/globaldependencies/helpers/fontawesome-icons.d.ts +1 -1
  154. package/lib/globaldependencies/helpers/moment-utc-date-adapter.d.ts +9 -9
  155. package/lib/globaldependencies/helpers/window.helper.d.ts +12 -12
  156. package/lib/globaldependencies/intercepter/jwt.interceptor.d.ts +11 -11
  157. package/lib/globaldependencies/pipes/fetchSizedAndCachedImage.pipe.d.ts +8 -8
  158. package/lib/globaldependencies/pipes/highLightText.pipe.d.ts +8 -8
  159. package/lib/globaldependencies/pipes/orderby-pipe.d.ts +9 -9
  160. package/lib/globaldependencies/pipes/removeSpecialCharacters.pipe.d.ts +8 -8
  161. package/lib/globaldependencies/pipes/sanitize.pipe.d.ts +11 -11
  162. package/lib/globaldependencies/pipes/softlabels.pipes.d.ts +8 -8
  163. package/lib/globaldependencies/pipes/utctolocaltime.pipe.d.ts +8 -8
  164. package/lib/globaldependencies/pipes/utctolocaltimewithdate.pipe.d.ts +8 -8
  165. package/lib/globaldependencies/pipes/workflowstatus.pipes.d.ts +8 -8
  166. package/lib/shell-components/components/Payments/account.component.d.ts +14 -14
  167. package/lib/shell-components/components/Payments/company-information.d.ts +62 -62
  168. package/lib/shell-components/components/Payments/company-plans.component.d.ts +47 -47
  169. package/lib/shell-components/components/Payments/document.component.d.ts +20 -20
  170. package/lib/shell-components/components/Payments/payment-method.component.d.ts +15 -15
  171. package/lib/shell-components/components/Payments/product-service.component.d.ts +48 -48
  172. package/lib/shell-components/components/Payments/purchase-more-licenses.d.ts +37 -37
  173. package/lib/shell-components/components/Payments/transactions.component.d.ts +28 -28
  174. package/lib/shell-components/components/admin-layout/admin-layout.component.d.ts +67 -67
  175. package/lib/shell-components/components/all-work-items-dialog/all-work-items-dialog.component.d.ts +32 -32
  176. package/lib/shell-components/components/confirmation-dialog/confirmation-dialog.component.d.ts +32 -32
  177. package/lib/shell-components/components/export-import-configuration/export-configuration.component.d.ts +60 -60
  178. package/lib/shell-components/components/feed-time/feed-time-dialog.component.d.ts +33 -33
  179. package/lib/shell-components/components/feed-time/feed-time.component.d.ts +27 -27
  180. package/lib/shell-components/components/header-side/header-side.component.d.ts +220 -220
  181. package/lib/shell-components/components/header-top/header-top.component.d.ts +40 -40
  182. package/lib/shell-components/components/lives/lives-welcome-page.d.ts +14 -14
  183. package/lib/shell-components/components/menu/menu.component.d.ts +220 -220
  184. package/lib/shell-components/components/menu/searchTask.enum.d.ts +8 -8
  185. package/lib/shell-components/components/notifications/announcement-dialog.component.d.ts +27 -27
  186. package/lib/shell-components/components/notifications/notifications.component.d.ts +53 -53
  187. package/lib/shell-components/components/sidebar-top/sidebar-top.component.d.ts +10 -10
  188. package/lib/shell-components/components/sidenav/side-bar.component.d.ts +23 -23
  189. package/lib/shell-components/components/sidenav/sidenav.component.d.ts +17 -17
  190. package/lib/shell-components/components/submit-feedback/submit-feedback.component.d.ts +25 -25
  191. package/lib/shell-components/constants/api-urls.d.ts +1051 -1051
  192. package/lib/shell-components/constants/available-languages.d.ts +7 -7
  193. package/lib/shell-components/constants/channel-names.d.ts +37 -37
  194. package/lib/shell-components/constants/menu-categories.d.ts +5 -5
  195. package/lib/shell-components/constants/notification-routes.d.ts +5 -5
  196. package/lib/shell-components/constants/notification-type-ids.d.ts +41 -41
  197. package/lib/shell-components/enum/recentSearchType.enum.d.ts +11 -11
  198. package/lib/shell-components/models/AppMenuItemModel.d.ts +12 -12
  199. package/lib/shell-components/models/AppNotification.d.ts +12 -12
  200. package/lib/shell-components/models/AssetAssignedNotificationModel.d.ts +10 -10
  201. package/lib/shell-components/models/ChannelUpdateModel.d.ts +47 -47
  202. package/lib/shell-components/models/EmployeeStatusModel.d.ts +11 -11
  203. package/lib/shell-components/models/IAdjust-screen-options.d.ts +4 -4
  204. package/lib/shell-components/models/IBadge.d.ts +4 -4
  205. package/lib/shell-components/models/IChildItem.d.ts +7 -7
  206. package/lib/shell-components/models/ILayout-change-options.d.ts +4 -4
  207. package/lib/shell-components/models/IMenuItem.d.ts +14 -14
  208. package/lib/shell-components/models/IlayoutConf.d.ts +10 -10
  209. package/lib/shell-components/models/IntroModel.d.ts +3 -3
  210. package/lib/shell-components/models/MessageDetails.d.ts +55 -55
  211. package/lib/shell-components/models/MessageTypingDetails.d.ts +9 -9
  212. package/lib/shell-components/models/NewProjectCreatedNotificationModel.d.ts +8 -8
  213. package/lib/shell-components/models/NewProjectFeatureNotificationModel.d.ts +8 -8
  214. package/lib/shell-components/models/NotificationsOutPutModel.d.ts +41 -41
  215. package/lib/shell-components/models/ProjectSearchCriteriaInputModel.d.ts +10 -10
  216. package/lib/shell-components/models/RecentSearchModel.d.ts +14 -14
  217. package/lib/shell-components/models/ReportConfigAssignedNotification.d.ts +9 -9
  218. package/lib/shell-components/models/ReportSubmittedNotification.d.ts +10 -10
  219. package/lib/shell-components/models/RoleUpdatedNotification.d.ts +7 -7
  220. package/lib/shell-components/models/UserStoryAssignedNotification.d.ts +8 -8
  221. package/lib/shell-components/models/archiveUserStoryModel.d.ts +7 -7
  222. package/lib/shell-components/models/companieslist.model.d.ts +8 -8
  223. package/lib/shell-components/models/company-model.d.ts +31 -31
  224. package/lib/shell-components/models/company-payment-model.d.ts +18 -18
  225. package/lib/shell-components/models/dragedWidget.d.ts +16 -16
  226. package/lib/shell-components/models/employee-List.d.ts +8 -8
  227. package/lib/shell-components/models/employee.d.ts +60 -60
  228. package/lib/shell-components/models/entityRoleFeature.d.ts +9 -9
  229. package/lib/shell-components/models/export-configuration-model.d.ts +8 -8
  230. package/lib/shell-components/models/export-data.module.d.ts +6 -6
  231. package/lib/shell-components/models/goalApprovedNotificationModel.d.ts +8 -8
  232. package/lib/shell-components/models/import-configuration-model.d.ts +3 -3
  233. package/lib/shell-components/models/initialStatusofUsers.d.ts +5 -5
  234. package/lib/shell-components/models/invoiceOutput-model.d.ts +9 -9
  235. package/lib/shell-components/models/leaveApplicationNotifiction.d.ts +7 -7
  236. package/lib/shell-components/models/multiChartsScheduling.d.ts +9 -9
  237. package/lib/shell-components/models/parkUserStoryInputModel.d.ts +7 -7
  238. package/lib/shell-components/models/project.d.ts +28 -28
  239. package/lib/shell-components/models/recentSearchApiModel.d.ts +6 -6
  240. package/lib/shell-components/models/searchCriteriaInputModelBase.d.ts +10 -10
  241. package/lib/shell-components/models/shellModulesInfo.d.ts +16 -16
  242. package/lib/shell-components/models/softlabels-model.d.ts +66 -66
  243. package/lib/shell-components/models/sprintReplanRequestedModel.d.ts +7 -7
  244. package/lib/shell-components/models/sprintStartedNotificationModel.d.ts +7 -7
  245. package/lib/shell-components/models/store-model.d.ts +13 -13
  246. package/lib/shell-components/models/store-search-model.d.ts +7 -7
  247. package/lib/shell-components/models/themes.model.d.ts +9 -9
  248. package/lib/shell-components/models/timesheetenabledisable.d.ts +16 -16
  249. package/lib/shell-components/models/user.d.ts +40 -40
  250. package/lib/shell-components/models/userStory.d.ts +188 -188
  251. package/lib/shell-components/models/userStoryCommentNotificationModel.d.ts +6 -6
  252. package/lib/shell-components/models/userStoryUpdateNotificationModel.d.ts +6 -6
  253. package/lib/shell-components/models/userstory-custom-fields.model.d.ts +6 -6
  254. package/lib/shell-components/models/validation.model.d.ts +5 -5
  255. package/lib/shell-components/models/widgetlist.d.ts +28 -28
  256. package/lib/shell-components/models/workspaceList.d.ts +19 -19
  257. package/lib/shell-components/services/authentication.service.d.ts +18 -18
  258. package/lib/shell-components/services/chat.service.d.ts +16 -16
  259. package/lib/shell-components/services/common-used.service.d.ts +45 -45
  260. package/lib/shell-components/services/feature.service.d.ts +19 -19
  261. package/lib/shell-components/services/google-analytics.service.d.ts +9 -9
  262. package/lib/shell-components/services/layout.service.d.ts +23 -23
  263. package/lib/shell-components/services/payment.service.d.ts +19 -19
  264. package/lib/shell-components/services/recentSearch.service.d.ts +16 -16
  265. package/lib/shell-components/services/shell.modules.service.d.ts +9 -9
  266. package/lib/shell-components/services/signalr.service.d.ts +25 -25
  267. package/lib/shell-components/services/theme.service.d.ts +14 -14
  268. package/lib/shell-components/shell.module.d.ts +119 -119
  269. package/lib/shell-components/shell.routing.d.ts +2 -2
  270. package/lib/shell-components/store/actions/authentication.actions.d.ts +327 -327
  271. package/lib/shell-components/store/actions/chat.actions.d.ts +399 -399
  272. package/lib/shell-components/store/actions/menuitems.actions.d.ts +51 -51
  273. package/lib/shell-components/store/actions/notification-validator.action.d.ts +25 -25
  274. package/lib/shell-components/store/actions/notifications.actions.d.ts +116 -116
  275. package/lib/shell-components/store/effects/authentication.effects.d.ts +54 -54
  276. package/lib/shell-components/store/effects/chat.effects.d.ts +30 -30
  277. package/lib/shell-components/store/effects/index.d.ts +1 -1
  278. package/lib/shell-components/store/effects/menuitems.effects.d.ts +17 -17
  279. package/lib/shell-components/store/effects/notification-validator.effects.d.ts +21 -21
  280. package/lib/shell-components/store/effects/notifications.effects.d.ts +23 -23
  281. package/lib/shell-components/store/reducers/authentication.reducers.d.ts +30 -30
  282. package/lib/shell-components/store/reducers/chat.reducers.d.ts +17 -17
  283. package/lib/shell-components/store/reducers/index.d.ts +59 -59
  284. package/lib/shell-components/store/reducers/menuitems.reducers.d.ts +11 -11
  285. package/lib/shell-components/store/reducers/notification-validator.reducers.d.ts +5 -5
  286. package/lib/shell-components/store/reducers/notifications.reducers.d.ts +10 -10
  287. package/package.json +1 -1
  288. package/public-api.d.ts +82 -82
  289. package/store/reducers/index.d.ts +24 -24
  290. package/thetradeengineorg1-snova-shell-module.d.ts +5 -5
@@ -1,534 +1,534 @@
1
- import { Component, Input } from "@angular/core";
2
- import { NavigationEnd } from "@angular/router";
3
- import { ofType } from "@ngrx/effects";
4
- import { select } from "@ngrx/store";
5
- import { Subject } from "rxjs";
6
- import { takeUntil, tap } from "rxjs/operators";
7
- import { AuthenticationActionTypes } from "../../store/actions/authentication.actions";
8
- import { ClearAllNotifications, NotificationsActionTypes, UpsertUnreadNotificationsTriggered } from "../../store/actions/notifications.actions";
9
- import * as sharedModuleReducers from "../../store/reducers/index";
10
- import { NotificationTypeIds } from '../../constants/notification-type-ids';
11
- import { LocalStorageProperties } from '../../../globaldependencies/constants/localstorage-properties';
12
- import { ChannelNames } from '../../constants/channel-names';
13
- import '../../../globaldependencies/helpers/fontawesome-icons';
14
- import * as _ from "underscore";
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "@angular/router";
17
- import * as i2 from "pubnub-angular2";
18
- import * as i3 from "@ngrx/store";
19
- import * as i4 from "@ngrx/effects";
20
- import * as i5 from "ngx-cookie-service";
21
- import * as i6 from "ngx-toastr";
22
- import * as i7 from "@angular/material/dialog";
23
- import * as i8 from "../../../globaldependencies/pipes/orderby-pipe";
24
- import * as i9 from "../../services/signalr.service";
25
- import * as i10 from "@angular/common";
26
- import * as i11 from "@angular/material/divider";
27
- import * as i12 from "@angular/material/list";
28
- import * as i13 from "@angular/flex-layout/extended";
29
- import * as i14 from "@ngx-translate/core";
30
- import * as i15 from "../../../globaldependencies/pipes/sanitize.pipe";
31
- import * as i16 from "ngx-timeago";
32
- import * as i17 from "../../../globaldependencies/pipes/utctolocaltime.pipe";
33
- const _c0 = function (a0, a1) { return { "notificataion-unread": a0, "notificataion-read": a1 }; };
34
- function NotificationsComponent_div_4_mat_nav_list_1_Template(rf, ctx) { if (rf & 1) {
35
- const _r6 = i0.ɵɵgetCurrentView();
36
- i0.ɵɵelementStart(0, "mat-nav-list", 7);
37
- i0.ɵɵelementStart(1, "mat-list-item", 8);
38
- i0.ɵɵlistener("click", function NotificationsComponent_div_4_mat_nav_list_1_Template_mat_list_item_click_1_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const notification_r4 = restoredCtx.$implicit; const ctx_r5 = i0.ɵɵnextContext(2); return ctx_r5.upsertReadNewNotification(notification_r4); });
39
- i0.ɵɵelementStart(2, "div");
40
- i0.ɵɵelementStart(3, "a");
41
- i0.ɵɵelementStart(4, "div", 9);
42
- i0.ɵɵelement(5, "div", 10);
43
- i0.ɵɵpipe(6, "sanitizeHtml");
44
- i0.ɵɵelementStart(7, "small", 11);
45
- i0.ɵɵtext(8);
46
- i0.ɵɵpipe(9, "timeago");
47
- i0.ɵɵpipe(10, "utcToLocalTime");
48
- i0.ɵɵelementEnd();
49
- i0.ɵɵelementEnd();
50
- i0.ɵɵelementEnd();
51
- i0.ɵɵelementEnd();
52
- i0.ɵɵelementEnd();
53
- i0.ɵɵelementEnd();
54
- } if (rf & 2) {
55
- const notification_r4 = ctx.$implicit;
56
- const ctx_r3 = i0.ɵɵnextContext(2);
57
- i0.ɵɵadvance(1);
58
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(9, _c0, !ctx_r3.notificationColor, ctx_r3.notificationColor));
59
- i0.ɵɵadvance(4);
60
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind1(6, 3, notification_r4.summary), i0.ɵɵsanitizeHtml);
61
- i0.ɵɵadvance(3);
62
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(9, 5, i0.ɵɵpipeBind1(10, 7, notification_r4.createdDateTime)));
63
- } }
64
- function NotificationsComponent_div_4_Template(rf, ctx) { if (rf & 1) {
65
- i0.ɵɵelementStart(0, "div", 5);
66
- i0.ɵɵtemplate(1, NotificationsComponent_div_4_mat_nav_list_1_Template, 11, 12, "mat-nav-list", 6);
67
- i0.ɵɵpipe(2, "orderBy");
68
- i0.ɵɵelementEnd();
69
- } if (rf & 2) {
70
- const ctx_r0 = i0.ɵɵnextContext();
71
- i0.ɵɵadvance(1);
72
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(2, 1, ctx_r0.newNotifications));
73
- } }
74
- function NotificationsComponent_div_5_Template(rf, ctx) { if (rf & 1) {
75
- i0.ɵɵelementStart(0, "div", 12);
76
- i0.ɵɵtext(1);
77
- i0.ɵɵpipe(2, "translate");
78
- i0.ɵɵelementEnd();
79
- } if (rf & 2) {
80
- i0.ɵɵadvance(1);
81
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "NOTIFICATIONS.NONOTIFICATIONSTITLE"), "");
82
- } }
83
- function NotificationsComponent_div_7_Template(rf, ctx) { if (rf & 1) {
84
- const _r8 = i0.ɵɵgetCurrentView();
85
- i0.ɵɵelementStart(0, "div", 13);
86
- i0.ɵɵelementStart(1, "label", 14);
87
- i0.ɵɵelementStart(2, "a", 15);
88
- i0.ɵɵlistener("click", function NotificationsComponent_div_7_Template_a_click_2_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(); return ctx_r7.clearNewAll($event); });
89
- i0.ɵɵtext(3);
90
- i0.ɵɵpipe(4, "translate");
91
- i0.ɵɵelementEnd();
92
- i0.ɵɵelementEnd();
93
- i0.ɵɵelementEnd();
94
- } if (rf & 2) {
95
- i0.ɵɵadvance(3);
96
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 1, "NOTIFICATIONS.CLEARALLNOTIFICATIONS"));
97
- } }
98
- export class NotificationsComponent {
99
- constructor(router, pubnub, store, actionUpdates$, cookieService, toastr, dialog, orderByPipe, signalr, cdRef) {
100
- this.router = router;
101
- this.pubnub = pubnub;
102
- this.store = store;
103
- this.actionUpdates$ = actionUpdates$;
104
- this.cookieService = cookieService;
105
- this.toastr = toastr;
106
- this.dialog = dialog;
107
- this.orderByPipe = orderByPipe;
108
- this.signalr = signalr;
109
- this.cdRef = cdRef;
110
- this.ngDestroyed$ = new Subject();
111
- this.constNotification_WorkItemAssignedToUser = NotificationTypeIds.Notification_WorkItemAssignedToUser;
112
- this.notificationColor = false;
113
- this.newNotifications = [];
114
- this.actionUpdates$
115
- .pipe(takeUntil(this.ngDestroyed$), ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), tap(() => {
116
- if (this.cookieService.check(LocalStorageProperties.CurrentUserId)) {
117
- const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
118
- // Subscribe to Task Assignment Notificaitons here.
119
- const taskAssignmentChannelToSubscribeInto = ChannelNames.Channel_TaskAssignments + CurrentUserId;
120
- const tastatusReportSubmissionChannelToSubscribeInto = ChannelNames.Channel_StatusReportSubmission + CurrentUserId;
121
- const tastatusConfigAssignChannelToSubscribeInto = ChannelNames.Channel_StatusConfigAssign + CurrentUserId;
122
- const multiChartsSchedulingChannelToSubscribeInto = ChannelNames.Channel_MultiChartsScheduling + CurrentUserId;
123
- const assetsAssignedChannelToSubscribeInto = ChannelNames.Channel_AssetAssignment + CurrentUserId;
124
- const projectCreatedChannelToSubscribeInto = ChannelNames.Channel_NewProject + CurrentUserId;
125
- const projectAccessToMemberChannelToSubscribeInto = ChannelNames.Channel_ProjectMemberRole + CurrentUserId;
126
- const goalApprovedChannelToSubscribeInto = ChannelNames.Channel_GoalApprovedFromReplan + CurrentUserId;
127
- const userStoryUpdateChannelToSubscribeInto = ChannelNames.Channel_UserStoryUpdateNotification + CurrentUserId;
128
- const AnnouncementChannelToSubscribeInto = ChannelNames.Channel_AnnouncementNotification + CurrentUserId;
129
- const ReminderChannelToSubscribeInto = ChannelNames.Channel_ReminderNotification + CurrentUserId;
130
- const PerformanceChannelToSubscribeInto = ChannelNames.Channel_PeroformanceNotification + CurrentUserId;
131
- const userStoryCommentChannelToSubscribeInto = ChannelNames.Channel_UserStoryComment + CurrentUserId;
132
- const sprintStartedChannelToSubscribeInto = ChannelNames.Channel_SprintStarted + CurrentUserId;
133
- const sprintReplanChannelToSubscribeInto = ChannelNames.Channel_SprintRequestedToReplan + CurrentUserId;
134
- const leaveAppliedChannelToSubscribeInto = ChannelNames.Channel_LeaveApplied + CurrentUserId;
135
- const ApproveLeaveChannelToSubscribeInto = ChannelNames.Channel_ApproveLeave + CurrentUserId;
136
- const RejectLeaveChannelToSubscribeInto = ChannelNames.Channel_RejectLeave + CurrentUserId;
137
- const ResignationChannelToSubscribeInto = ChannelNames.Channel_Resignation + CurrentUserId;
138
- const ApproveResignationChannelToSubscribeInto = ChannelNames.Channel_ApproveResignation + CurrentUserId;
139
- const RejectResignationChannelToSubscribeInto = ChannelNames.Channel_RejectResignation + CurrentUserId;
140
- const AutoTImesheetSubmissionChannelToSubscribeInto = ChannelNames.Channel_AutoTimesheetSubmission + CurrentUserId;
141
- const ProbationAssignNotification = ChannelNames.Channel_ProbationAssignNotification + CurrentUserId;
142
- const ReviewAssignToEmployeeNotification = ChannelNames.Channel_ReviewAssignToEmployeeNotification + CurrentUserId;
143
- const ReviewSubmittedByEmployeeNotification = ChannelNames.Channel_ReviewSubmittedByEmployeeNotification + CurrentUserId;
144
- const ReviewInvitationNotificationModel = ChannelNames.Channel_ReviewInvitationNotificationModel + CurrentUserId;
145
- const PerformanceReviewSubmittedByEmployeeNotification = ChannelNames.Channel_PerformanceReviewSubmittedByEmployeeNotification + CurrentUserId;
146
- const PerformanceReviewInvitationNotificationModel = ChannelNames.Channel_PerformanceReviewInvitationNotificationModel + CurrentUserId;
147
- const PerformanceReviewAssignToEmployeeNotification = ChannelNames.Channel_PerformanceReviewAssignToEmployeeNotification + CurrentUserId;
148
- console.log("subscribing to " + taskAssignmentChannelToSubscribeInto);
149
- console.log("subscribing to " + tastatusReportSubmissionChannelToSubscribeInto);
150
- console.log("subscribing to " + tastatusConfigAssignChannelToSubscribeInto);
151
- console.log("subscribing to" + assetsAssignedChannelToSubscribeInto);
152
- console.log("subscribing to" + projectCreatedChannelToSubscribeInto);
153
- console.log("subscribing to" + projectAccessToMemberChannelToSubscribeInto);
154
- console.log("subscribing to" + goalApprovedChannelToSubscribeInto);
155
- console.log("subscribing to" + userStoryUpdateChannelToSubscribeInto);
156
- console.log("subscribing to" + AnnouncementChannelToSubscribeInto);
157
- console.log("subscribing to" + userStoryCommentChannelToSubscribeInto);
158
- console.log("subscribing to" + sprintStartedChannelToSubscribeInto);
159
- console.log("subscribing to" + sprintReplanChannelToSubscribeInto);
160
- console.log("subscribing to" + ReminderChannelToSubscribeInto);
161
- console.log("subscribing to" + PerformanceChannelToSubscribeInto);
162
- this.pubnub.subscribe({
163
- channels: [taskAssignmentChannelToSubscribeInto, tastatusReportSubmissionChannelToSubscribeInto,
164
- ProbationAssignNotification, ReviewAssignToEmployeeNotification, ReviewSubmittedByEmployeeNotification,
165
- ReviewInvitationNotificationModel, PerformanceReviewSubmittedByEmployeeNotification, PerformanceReviewAssignToEmployeeNotification,
166
- tastatusConfigAssignChannelToSubscribeInto, multiChartsSchedulingChannelToSubscribeInto, PerformanceReviewInvitationNotificationModel,
167
- assetsAssignedChannelToSubscribeInto, projectCreatedChannelToSubscribeInto, ,
168
- projectAccessToMemberChannelToSubscribeInto, goalApprovedChannelToSubscribeInto,
169
- userStoryUpdateChannelToSubscribeInto, AnnouncementChannelToSubscribeInto, ReminderChannelToSubscribeInto, RejectResignationChannelToSubscribeInto,
170
- userStoryCommentChannelToSubscribeInto, sprintStartedChannelToSubscribeInto, ResignationChannelToSubscribeInto, ApproveResignationChannelToSubscribeInto,
171
- sprintReplanChannelToSubscribeInto, leaveAppliedChannelToSubscribeInto, ApproveLeaveChannelToSubscribeInto, RejectLeaveChannelToSubscribeInto,
172
- PerformanceChannelToSubscribeInto, AutoTImesheetSubmissionChannelToSubscribeInto]
173
- });
174
- // Add other subscriptions here.
175
- }
176
- else {
177
- console.log("User not logged in yet to be able to subscribe.");
178
- }
179
- }))
180
- .subscribe();
181
- this.actionUpdates$
182
- .pipe(takeUntil(this.ngDestroyed$), ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), tap(() => {
183
- var roleUpdatesChannelToSubscribeInto = ChannelNames.Channel_RoleUpdates + "19B6F9FC-7370-4B9C-A05C-3B8D819EEEAF";
184
- console.log("subscribing to " + roleUpdatesChannelToSubscribeInto);
185
- this.pubnub.subscribe({
186
- channels: [roleUpdatesChannelToSubscribeInto]
187
- });
188
- }))
189
- .subscribe();
190
- this.actionUpdates$
191
- .pipe(takeUntil(this.ngDestroyed$), ofType(NotificationsActionTypes.ClearAllUnreadNotificationsCompleted), tap(() => {
192
- this.notifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationAll));
193
- this.notifications$.subscribe(x => {
194
- this.notifications = x;
195
- });
196
- }))
197
- .subscribe();
198
- // const storeListner = (message) => {
199
- // console.log("---------Received pubnub message---------");
200
- // // this.toastr.info(message.message.Summary);
201
- // try {
202
- // // Receiving the User Story Assigned Notification
203
- // if (message.message.NotificationTypeGuid == NotificationTypeIds.Notification_WorkItemAssignedToUser) {
204
- // var userStoryAssignedNotification = new UserStoryAssignedNotification();
205
- // userStoryAssignedNotification.loadFromCaseInsensitiveObject(message.message);
206
- // userStoryAssignedNotification.route = ChannelRoutes.ViewWorkItem + userStoryAssignedNotification.notificationId;
207
- // this.store.dispatch(new NewNotificationReceived(userStoryAssignedNotification));
208
- // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Notification_RoleUpdated) {
209
- // var roleUpdatedNotification = new RoleUpdatedNotification();
210
- // roleUpdatedNotification.loadFromCaseInsensitiveObject(message.message);
211
- // roleUpdatedNotification.route = ChannelRoutes.ViewAccount;
212
- // this.store.dispatch(new NewNotificationReceived(roleUpdatedNotification));
213
- // this.store.dispatch(new RolesFetchTriggered());
214
- // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Status_Report_Sumitted) {
215
- // var reportSubmittedNotification = new ReportSubmittedNotification();
216
- // reportSubmittedNotification.loadFromCaseInsensitiveObject(message.message);
217
- // reportSubmittedNotification.route = ChannelRoutes.ViewAccount;
218
- // this.store.dispatch(new NewNotificationReceived(reportSubmittedNotification));
219
- // this.store.dispatch(new RolesFetchTriggered());
220
- // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Status_Report_Config_Created) {
221
- // var reportConfigAssignedNotification = new ReportConfigAssignedNotification();
222
- // reportConfigAssignedNotification.loadFromCaseInsensitiveObject(message.message);
223
- // reportConfigAssignedNotification.route = ChannelRoutes.ViewAccount;
224
- // this.store.dispatch(new NewNotificationReceived(reportConfigAssignedNotification));
225
- // this.store.dispatch(new RolesFetchTriggered());
226
- // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Multiple_Charts_Scheduling_created) {
227
- // var multipleChartsScheduling = new MultipleChartsScheduling();
228
- // multipleChartsScheduling.loadFromCaseInsensitiveObject(message.message);
229
- // multipleChartsScheduling.route = ChannelRoutes.ViewAccount;
230
- // this.store.dispatch(new NewNotificationReceived(multipleChartsScheduling));
231
- // this.store.dispatch(new RolesFetchTriggered());
232
- // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Assets_Assignment) {
233
- // const assetAssignedNotification = new AssetAssignedNotification();
234
- // assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
235
- // assetAssignedNotification.route = ChannelRoutes.ViewAccount;
236
- // this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
237
- // this.store.dispatch(new RolesFetchTriggered());
238
- // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Reminder_Notification.toString().toLowerCase()) {
239
- // const assetAssignedNotification = new AssetAssignedNotification();
240
- // assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
241
- // assetAssignedNotification.route = ChannelRoutes.ViewAccount;
242
- // this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
243
- // this.store.dispatch(new RolesFetchTriggered());
244
- // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Announcement_Received.toString().toLowerCase()) {
245
- // const assetAssignedNotification = new AssetAssignedNotification();
246
- // assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
247
- // assetAssignedNotification.route = ChannelRoutes.ViewAccount;
248
- // this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
249
- // this.store.dispatch(new RolesFetchTriggered());
250
- // if (message.message.Id != this.announceNotificationId) {
251
- // this.announceNotificationId = message.message.Id;
252
- // this.openAnnouncementDialog(message.message);
253
- // }
254
- // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Performance_Received.toString().toLowerCase() || message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
255
- // const newProjectCreatedNotification = new NewProjectCreatedNotificationModel();
256
- // newProjectCreatedNotification.loadFromCaseInsensitiveObject(message.message);
257
- // newProjectCreatedNotification.route = ChannelRoutes.ViewAccount;
258
- // this.store.dispatch(new NewNotificationReceived(newProjectCreatedNotification));
259
- // this.store.dispatch(new RolesFetchTriggered());
260
- // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.NewProjectCreatedNotificationId.toString().toLowerCase() || message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
261
- // const newProjectCreatedNotification = new NewProjectCreatedNotificationModel();
262
- // newProjectCreatedNotification.loadFromCaseInsensitiveObject(message.message);
263
- // newProjectCreatedNotification.route = ChannelRoutes.ViewAccount;
264
- // this.store.dispatch(new NewNotificationReceived(newProjectCreatedNotification));
265
- // this.store.dispatch(new RolesFetchTriggered());
266
- // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.GoalApprovedFromReplan.toString().toLowerCase()) {
267
- // const goalApprovedNotificationModel = new GoalApprovedNotificationModel();
268
- // goalApprovedNotificationModel.loadFromCaseInsensitiveObject(message.message);
269
- // goalApprovedNotificationModel.route = ChannelRoutes.ViewAccount;
270
- // this.store.dispatch(new NewNotificationReceived(goalApprovedNotificationModel));
271
- // this.store.dispatch(new RolesFetchTriggered());
272
- // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.USerStoryUpdateNotificationId.toString().toLowerCase()) {
273
- // const userStoryUpdateNotificationModel = new UserStoryUpdateNotificationModel();
274
- // userStoryUpdateNotificationModel.loadFromCaseInsensitiveObject(message.message);
275
- // userStoryUpdateNotificationModel.route = ChannelRoutes.ViewAccount;
276
- // this.store.dispatch(new NewNotificationReceived(userStoryUpdateNotificationModel));
277
- // this.store.dispatch(new RolesFetchTriggered());
278
- // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.PushNotificationForUserStoryComment.toString().toLowerCase()) {
279
- // const userStoryCommentNotificationModel = new UserStoryCommentNotificationModel();
280
- // userStoryCommentNotificationModel.loadFromCaseInsensitiveObject(message.message);
281
- // userStoryCommentNotificationModel.route = ChannelRoutes.ViewAccount;
282
- // this.store.dispatch(new NewNotificationReceived(userStoryCommentNotificationModel));
283
- // this.store.dispatch(new RolesFetchTriggered());
284
- // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.SprintStarted.toString().toLowerCase()) {
285
- // const sprintStartedNotificationModel = new SprintStartedNotificationModel();
286
- // sprintStartedNotificationModel.loadFromCaseInsensitiveObject(message.message);
287
- // sprintStartedNotificationModel.route = ChannelRoutes.ViewAccount;
288
- // this.store.dispatch(new NewNotificationReceived(sprintStartedNotificationModel));
289
- // this.store.dispatch(new RolesFetchTriggered());
290
- // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.SprintRequestdForREplan.toString().toLowerCase()) {
291
- // const sprintReplanStartedNotificationModel = new SprintReplanStartedNotificationModel();
292
- // sprintReplanStartedNotificationModel.loadFromCaseInsensitiveObject(message.message);
293
- // sprintReplanStartedNotificationModel.route = ChannelRoutes.ViewAccount;
294
- // this.store.dispatch(new NewNotificationReceived(sprintReplanStartedNotificationModel));
295
- // this.store.dispatch(new RolesFetchTriggered());
296
- // } else {
297
- // // TODO: Send these errors onto server for further processing
298
- // console.log("Found undetected notification type. " + message.message.NotificationTypeGuid);
299
- // }
300
- // // Add other notifications here.
301
- // } catch (exception) {
302
- // // TODO: Send these exceptions onto server for further processing
303
- // console.log("Exception Occured" + exception.message);
304
- // }
305
- // };
306
- // this.pubnub.addListener({
307
- // status: st => {
308
- // if (st.category === "PNUnknownCategory") {
309
- // var newState = {
310
- // new: "error"
311
- // };
312
- // this.pubnub.setState(
313
- // {
314
- // state: newState
315
- // }
316
- // // function (status) {
317
- // // console.log(st.errorData.message);
318
- // // }
319
- // );
320
- // }
321
- // },
322
- // message: message => {
323
- // console.log("subscribed to " + message);
324
- // storeListner(message);
325
- // }
326
- // });
327
- }
328
- ngOnInit() {
329
- this.router.events
330
- .pipe(takeUntil(this.ngDestroyed$))
331
- .subscribe((routeChange) => {
332
- if (routeChange instanceof NavigationEnd) {
333
- if (this.notificPanel) {
334
- this.notificPanel.close();
335
- }
336
- }
337
- });
338
- this.signalr.notifications$.subscribe((data) => {
339
- this.newNotifications = data && data.length > 0 ? data : [];
340
- this.cdRef.detectChanges();
341
- });
342
- this.getSoftLabelConfigurations();
343
- this.notifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationAll), tap(x => console.log(x)));
344
- this.authenticatedUserRecord$ = this.store.pipe(select(sharedModuleReducers.getAuthenticatedUserModel));
345
- this.loadingNotifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationsLoading));
346
- }
347
- getSoftLabelConfigurations() {
348
- this.softLabels = JSON.parse(localStorage.getItem('SoftLabels'));
349
- }
350
- clearAll(e) {
351
- const notifications = [];
352
- this.notifications.forEach((element) => {
353
- notifications.push(element);
354
- });
355
- this.store.dispatch(new ClearAllNotifications(notifications));
356
- e.preventDefault();
357
- this.notificationColor = !this.notificationColor;
358
- }
359
- // openAnnouncementDialog(announced) {
360
- // this.dialog.closeAll();
361
- // const dialogRef = this.dialog.open(AnnoucementDialogComponent, {
362
- // minWidth: "60vw",
363
- // maxWidth: "60vw",
364
- // minHeight: "50vh",
365
- // maxHeight: "80vh",
366
- // disableClose: true,
367
- // data: {
368
- // announcementId: announced.AnnouncementId,
369
- // announcement: announced.Announcement,
370
- // announcedBy: announced.AnnouncedBy,
371
- // announcedById: announced.AnnouncedById,
372
- // announcedByUserImage: announced.AnnouncedByUserImage,
373
- // announcedOn: announced.AnnouncedOn
374
- // }
375
- // });
376
- // dialogRef.componentInstance.closeMatDialog.subscribe((result) => {
377
- // const index = this.notifications.findIndex((p) => p.notificationId.toString().toLowerCase() == this.announceNotificationId.toString().toLowerCase());
378
- // if (index > -1) {
379
- // this.upsertReadNotification(this.notifications[index]);
380
- // }
381
- // });
382
- // }
383
- upsertReadNotification(selectedNotification) {
384
- const notifications = [];
385
- var roles = JSON.parse(localStorage.getItem(LocalStorageProperties.RoleFeatures));
386
- let Feature_ApproveOrRejectLeave = '2C22916F-B80B-4C51-9534-23F698DE120B';
387
- let canAccess_feature_ApproveOrRejectLeave = _.find(roles, function (role) { return role['featureId'].toLowerCase() == Feature_ApproveOrRejectLeave.toString().toLowerCase(); }) != null;
388
- const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
389
- notifications.push(selectedNotification);
390
- const notiifcationmodel = JSON.parse(selectedNotification.notificationJson);
391
- if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
392
- NotificationTypeIds.NewProjectCreatedNotificationId.toString().toLowerCase() ||
393
- selectedNotification.notificationTypeId.toString().toLowerCase() ==
394
- NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
395
- this.router.navigate(["projects/projectstatus/" + notiifcationmodel.ProjectGuid + "/active-goals"]);
396
- }
397
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
398
- NotificationTypeIds.GoalApprovedFromReplan.toString().toLowerCase()) {
399
- this.router.navigate(["projects/goal/" + notiifcationmodel.GoalGuid]);
400
- }
401
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
402
- NotificationTypeIds.Notification_WorkItemAssignedToUser.toString().toLowerCase()) {
403
- this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryGuid]);
404
- }
405
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
406
- NotificationTypeIds.USerStoryUpdateNotificationId.toString().toLowerCase()) {
407
- this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryId]);
408
- }
409
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
410
- NotificationTypeIds.SprintStarted.toString().toLowerCase()) {
411
- this.router.navigate(["projects/sprint/" + notiifcationmodel.SprintGuid]);
412
- }
413
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
414
- NotificationTypeIds.PushNotificationForUserStoryComment.toString().toLowerCase()) {
415
- this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryGuid]);
416
- }
417
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
418
- NotificationTypeIds.GoalRequestdForREplan.toString().toLowerCase()) {
419
- this.router.navigate(["projects/goal/" + notiifcationmodel.GoalGuid]);
420
- }
421
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
422
- NotificationTypeIds.SprintRequestdForREplan.toString().toLowerCase()) {
423
- this.router.navigate(["projects/sprint/" + notiifcationmodel.SprintGuid]);
424
- }
425
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
426
- NotificationTypeIds.Notification_AdhocWorkItemAssignedToUser.toString().toLowerCase()) {
427
- this.router.navigate(["dashboard/adhoc-workitem/" + notiifcationmodel.UserStoryGuid]);
428
- }
429
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
430
- NotificationTypeIds.AdhocUSerStoryUpdateNotificationId.toString().toLowerCase()) {
431
- this.router.navigate(["dashboard/adhoc-workitem/" + notiifcationmodel.UserStoryId]);
432
- }
433
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
434
- NotificationTypeIds.LeaveApplication.toString().toLowerCase() && canAccess_feature_ApproveOrRejectLeave) {
435
- this.router.navigate(["hrmanagment/leaves"]);
436
- }
437
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
438
- NotificationTypeIds.ApproveLeaveApplication.toString().toLowerCase()) {
439
- this.router.navigate(["dashboard/profile/" + CurrentUserId + "/leaves-permissions"]);
440
- }
441
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
442
- NotificationTypeIds.RejectLeaveApplication.toString().toLowerCase()) {
443
- this.router.navigate(["dashboard/profile/" + CurrentUserId + "/leaves-permissions"]);
444
- }
445
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
446
- NotificationTypeIds.AutoTimeSheetSubmissionNotification.toString().toLowerCase()) {
447
- this.router.navigate(["dashboard/profile/" + CurrentUserId + "/timesheetApproval"]);
448
- }
449
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
450
- NotificationTypeIds.ProbationAssignNotification.toString().toLowerCase()) {
451
- this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
452
- }
453
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
454
- NotificationTypeIds.ReviewAssignToEmployeeNotification.toString().toLowerCase()) {
455
- this.router.navigate(["dashboard/profile/" + CurrentUserId + "/probation"]);
456
- }
457
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
458
- NotificationTypeIds.ReviewSubmittedByEmployeeNotification.toString().toLowerCase()) {
459
- this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
460
- }
461
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
462
- NotificationTypeIds.ReviewInvitationNotification.toString().toLowerCase()) {
463
- this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
464
- }
465
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
466
- NotificationTypeIds.PerformanceReviewSubmittedByEmployeeNotification.toString().toLowerCase()) {
467
- this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/performance"]);
468
- }
469
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
470
- NotificationTypeIds.PerformanceReviewInvitationNotificationModel.toString().toLowerCase()) {
471
- this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/performance"]);
472
- }
473
- else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
474
- NotificationTypeIds.PerformanceReviewAssignToEmployeeNotification.toString().toLowerCase()) {
475
- this.router.navigate(["dashboard/profile/" + CurrentUserId + "/performance"]);
476
- }
477
- this.store.dispatch(new UpsertUnreadNotificationsTriggered(notifications));
478
- }
479
- upsertReadNewNotification(notification) {
480
- let notes = [notification];
481
- this.signalr.upsertReadNewNotifications(notes)
482
- .subscribe((res) => {
483
- if (res.success) {
484
- this.signalr.removeItemFromNotifications(notification.id);
485
- }
486
- });
487
- if (notification.navigationUrl) {
488
- window.open(notification.navigationUrl, "_blank");
489
- }
490
- }
491
- clearNewAll(e) {
492
- this.signalr.upsertReadNewNotifications(this.newNotifications)
493
- .subscribe((res) => {
494
- if (res.success) {
495
- this.signalr.removeAllNotifications();
496
- }
497
- });
498
- }
499
- ngOnDestroy() {
500
- this.ngDestroyed$.next();
501
- }
502
- }
503
- NotificationsComponent.ɵfac = function NotificationsComponent_Factory(t) { return new (t || NotificationsComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i2.PubNubAngular), i0.ɵɵdirectiveInject(i3.Store), i0.ɵɵdirectiveInject(i4.Actions), i0.ɵɵdirectiveInject(i5.CookieService), i0.ɵɵdirectiveInject(i6.ToastrService), i0.ɵɵdirectiveInject(i7.MatDialog), i0.ɵɵdirectiveInject(i8.OrderByPipe), i0.ɵɵdirectiveInject(i9.SignalrService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
504
- NotificationsComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NotificationsComponent, selectors: [["app-notifications"]], inputs: { notificPanel: "notificPanel" }, decls: 8, vars: 7, consts: [[1, "text-center", "mat-bg-primary", "pt-1", "pb-1"], [1, "m-0"], ["id", "style-1", 4, "ngIf"], ["class", "text-center p-1", 4, "ngIf"], ["class", "text-center mt-05 mb-05", 4, "ngIf"], ["id", "style-1"], ["class", "notification-list p-0 pr-03", "role", "list", 4, "ngFor", "ngForOf"], ["role", "list", 1, "notification-list", "p-0", "pr-03"], ["role", "listitem", "routerLinkActive", "open", 1, "notific-item", "pr-03", "notification-margin", 3, "ngClass", "click"], [1, "mat-list-text", "pl-0", "pr-03", "notification-cursor", "notifications-list-item"], [1, "word-break", "display-pre-line", 2, "margin", "0px !important", 3, "innerHTML"], [1, "time", "text-muted"], [1, "text-center", "p-1"], [1, "text-center", "mt-05", "mb-05"], [1, "mb-0"], [3, "click"]], template: function NotificationsComponent_Template(rf, ctx) { if (rf & 1) {
505
- i0.ɵɵelementStart(0, "div", 0);
506
- i0.ɵɵelementStart(1, "h6", 1);
507
- i0.ɵɵtext(2);
508
- i0.ɵɵpipe(3, "translate");
509
- i0.ɵɵelementEnd();
510
- i0.ɵɵelementEnd();
511
- i0.ɵɵtemplate(4, NotificationsComponent_div_4_Template, 3, 3, "div", 2);
512
- i0.ɵɵtemplate(5, NotificationsComponent_div_5_Template, 3, 3, "div", 3);
513
- i0.ɵɵelement(6, "mat-divider");
514
- i0.ɵɵtemplate(7, NotificationsComponent_div_7_Template, 5, 3, "div", 4);
515
- } if (rf & 2) {
516
- i0.ɵɵadvance(2);
517
- i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(3, 5, "NOTIFICATIONS.NOTIFICATIONSTITLE"), " (", ctx.newNotifications == null ? null : ctx.newNotifications.length, ")");
518
- i0.ɵɵadvance(2);
519
- i0.ɵɵproperty("ngIf", ctx.newNotifications.length != 0);
520
- i0.ɵɵadvance(1);
521
- i0.ɵɵproperty("ngIf", ctx.newNotifications.length == 0);
522
- i0.ɵɵadvance(2);
523
- i0.ɵɵproperty("ngIf", ctx.newNotifications.length);
524
- } }, directives: [i10.NgIf, i11.MatDivider, i10.NgForOf, i12.MatNavList, i12.MatListItem, i1.RouterLinkActive, i10.NgClass, i13.DefaultClassDirective], pipes: [i14.TranslatePipe, i8.OrderByPipe, i15.SanitizeHtmlPipe, i16.TimeagoPipe, i17.UtcToLocalTimePipe], encapsulation: 2 });
525
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NotificationsComponent, [{
526
- type: Component,
527
- args: [{
528
- selector: "app-notifications",
529
- templateUrl: "./notifications.component.html"
530
- }]
531
- }], function () { return [{ type: i1.Router }, { type: i2.PubNubAngular }, { type: i3.Store }, { type: i4.Actions }, { type: i5.CookieService }, { type: i6.ToastrService }, { type: i7.MatDialog }, { type: i8.OrderByPipe }, { type: i9.SignalrService }, { type: i0.ChangeDetectorRef }]; }, { notificPanel: [{
532
- type: Input
533
- }] }); })();
534
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zaGVsbC1tb2R1bGUtY29tcG9uZW50cy9zaGVsbC1jb21wb25lbnRzL3NyYy9saWIvc2hlbGwtY29tcG9uZW50cy9jb21wb25lbnRzL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zaGVsbC1tb2R1bGUtY29tcG9uZW50cy9zaGVsbC1jb21wb25lbnRzL3NyYy9saWIvc2hlbGwtY29tcG9uZW50cy9jb21wb25lbnRzL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQThDLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFckcsT0FBTyxFQUFFLGFBQWEsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBVyxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBUyxNQUFNLGFBQWEsQ0FBQztBQUk1QyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHlCQUF5QixFQUF1QixNQUFNLDRDQUE0QyxDQUFDO0FBQzVHLE9BQU8sRUFBRSxxQkFBcUIsRUFBMkIsd0JBQXdCLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUV6SyxPQUFPLEtBQUssb0JBQW9CLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLNUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0RBQStELENBQUM7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QzdDbkMsOEJBQWtEO1FBRWhELDZCQUFnQjtRQUFBLFlBQW1GOztRQUFBLGlCQUFLO1FBQzFHLGlCQUFNO1FBQ04sdUVBa0JNO1FBQ04sdUVBQzhEO1FBQzlELDhCQUEyQjtRQUMzQix1RUFHTTs7UUEzQlksZUFBbUY7UUFBbkYsaUtBQW1GO1FBRWxGLGVBQWtDO1FBQWxDLHVEQUFrQztRQW1CdkIsZUFBa0M7UUFBbEMsdURBQWtDO1FBRzFCLGVBQTZCO1FBQTdCLGtEQUE2Qjs7dUZEbUJ0RCxzQkFBc0I7Y0FMbEMsU0FBUztlQUFDO2dCQUNULFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLFdBQVcsRUFBRSxnQ0FBZ0M7YUFDOUM7c1NBSVUsWUFBWTtrQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IEFjdGlvbnMsIG9mVHlwZSB9IGZyb20gXCJAbmdyeC9lZmZlY3RzXCI7XHJcbmltcG9ydCB7IHNlbGVjdCwgU3RvcmUgfSBmcm9tIFwiQG5ncngvc3RvcmVcIjtcclxuaW1wb3J0IHsgQ29va2llU2VydmljZSB9IGZyb20gXCJuZ3gtY29va2llLXNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gXCJuZ3gtdG9hc3RyXCI7XHJcbmltcG9ydCB7IFB1Yk51YkFuZ3VsYXIgfSBmcm9tIFwicHVibnViLWFuZ3VsYXIyXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLCBSb2xlc0ZldGNoVHJpZ2dlcmVkIH0gZnJvbSBcIi4uLy4uL3N0b3JlL2FjdGlvbnMvYXV0aGVudGljYXRpb24uYWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBDbGVhckFsbE5vdGlmaWNhdGlvbnMsIE5ld05vdGlmaWNhdGlvblJlY2VpdmVkLCBOb3RpZmljYXRpb25zQWN0aW9uVHlwZXMsIFVwc2VydFVucmVhZE5vdGlmaWNhdGlvbnNUcmlnZ2VyZWQgfSBmcm9tIFwiLi4vLi4vc3RvcmUvYWN0aW9ucy9ub3RpZmljYXRpb25zLmFjdGlvbnNcIjtcclxuaW1wb3J0IHsgU3RhdGUgfSBmcm9tIFwiLi4vLi4vc3RvcmUvcmVkdWNlcnMvaW5kZXhcIjtcclxuaW1wb3J0ICogYXMgc2hhcmVkTW9kdWxlUmVkdWNlcnMgZnJvbSBcIi4uLy4uL3N0b3JlL3JlZHVjZXJzL2luZGV4XCI7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblR5cGVJZHMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvbm90aWZpY2F0aW9uLXR5cGUtaWRzJztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uTW9kZWwsIE5vdGlmaWNhdGlvbk91dHB1dE1vZGVsLCBVc2VyTm90aWZpY2F0aW9uUmVhZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL05vdGlmaWNhdGlvbnNPdXRQdXRNb2RlbCc7XHJcbmltcG9ydCB7IFNvZnRMYWJlbENvbmZpZ3VyYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zb2Z0bGFiZWxzLW1vZGVsJztcclxuaW1wb3J0IHsgVXNlck1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3VzZXInO1xyXG5pbXBvcnQgeyBPcmRlckJ5UGlwZSB9IGZyb20gJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9waXBlcy9vcmRlcmJ5LXBpcGUnO1xyXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vLi4vZ2xvYmFsZGVwZW5kZW5jaWVzL2NvbnN0YW50cy9sb2NhbHN0b3JhZ2UtcHJvcGVydGllcyc7XHJcbmltcG9ydCB7IENoYW5uZWxOYW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jaGFubmVsLW5hbWVzJztcclxuaW1wb3J0IHsgQ2hhbm5lbFJvdXRlcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9ub3RpZmljYXRpb24tcm91dGVzJztcclxuaW1wb3J0IHsgVXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvVXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24nO1xyXG5pbXBvcnQgeyBSb2xlVXBkYXRlZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9Sb2xlVXBkYXRlZE5vdGlmaWNhdGlvbic7XHJcbmltcG9ydCB7IFJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9SZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24nO1xyXG5pbXBvcnQgeyBSZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9SZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbic7XHJcbmltcG9ydCB7IE11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZyB9IGZyb20gJy4uLy4uL21vZGVscy9tdWx0aUNoYXJ0c1NjaGVkdWxpbmcnO1xyXG5pbXBvcnQgeyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL0Fzc2V0QXNzaWduZWROb3RpZmljYXRpb25Nb2RlbCc7XHJcbmltcG9ydCB7IE5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvTmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb25Nb2RlbCc7XHJcbmltcG9ydCB7IEdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsJztcclxuaW1wb3J0IHsgVXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvdXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwnO1xyXG5pbXBvcnQgeyBVc2VyU3RvcnlDb21tZW50Tm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsJztcclxuaW1wb3J0IHsgU3ByaW50U3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NwcmludFN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCc7XHJcbmltcG9ydCB7IFNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zcHJpbnRSZXBsYW5SZXF1ZXN0ZWRNb2RlbCc7XHJcbmltcG9ydCB7IEFubm91Y2VtZW50RGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9hbm5vdW5jZW1lbnQtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEd1aWQgfSBmcm9tICdndWlkLXR5cGVzY3JpcHQnO1xyXG5pbXBvcnQgJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9oZWxwZXJzL2ZvbnRhd2Vzb21lLWljb25zJztcclxuaW1wb3J0ICogYXMgXyBmcm9tIFwidW5kZXJzY29yZVwiO1xyXG5pbXBvcnQgeyBTaWduYWxyU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zaWduYWxyLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1ub3RpZmljYXRpb25zXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9ub3RpZmljYXRpb25zLmNvbXBvbmVudC5odG1sXCJcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgbm90aWZpY1BhbmVsO1xyXG5cclxuICBwdWJsaWMgbmdEZXN0cm95ZWQkID0gbmV3IFN1YmplY3QoKTtcclxuICBjb25zdE5vdGlmaWNhdGlvbl9Xb3JrSXRlbUFzc2lnbmVkVG9Vc2VyID0gTm90aWZpY2F0aW9uVHlwZUlkcy5Ob3RpZmljYXRpb25fV29ya0l0ZW1Bc3NpZ25lZFRvVXNlcjtcclxuICBub3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb25PdXRwdXRNb2RlbFtdPjtcclxuICBub3RpZmljYXRpb25zOiBOb3RpZmljYXRpb25PdXRwdXRNb2RlbFtdO1xyXG4gIHNvZnRMYWJlbHM6IFNvZnRMYWJlbENvbmZpZ3VyYXRpb25Nb2RlbFtdO1xyXG4gIGxvYWRpbmdOb3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICBzZWxlY3RlZE5vdGlmaWNhdGlvbjogVXNlck5vdGlmaWNhdGlvblJlYWRNb2RlbDtcclxuICBhbm5vdW5jZW1lbnRJZDogc3RyaW5nO1xyXG4gIGFubm91bmNlTm90aWZpY2F0aW9uSWQ6IHN0cmluZztcclxuICBub3RpZmljYXRpb25Db2xvciA9IGZhbHNlO1xyXG4gIGF1dGhlbnRpY2F0ZWRVc2VyUmVjb3JkJDogT2JzZXJ2YWJsZTxVc2VyTW9kZWw+O1xyXG4gIG5ld05vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbk1vZGVsW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIHB1Ym51YjogUHViTnViQW5ndWxhciwgcHJpdmF0ZSBzdG9yZTogU3RvcmU8U3RhdGU+LFxyXG4gICAgcHJpdmF0ZSBhY3Rpb25VcGRhdGVzJDogQWN0aW9ucywgcHJpdmF0ZSBjb29raWVTZXJ2aWNlOiBDb29raWVTZXJ2aWNlLCBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSxcclxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSBvcmRlckJ5UGlwZTogT3JkZXJCeVBpcGUsIHByaXZhdGUgc2lnbmFscjogU2lnbmFsclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwpIHtcclxuICAgIHRoaXMuYWN0aW9uVXBkYXRlcyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubmdEZXN0cm95ZWQkKSxcclxuICAgICAgICBvZlR5cGUoQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5Vc2VyRGV0YWlsc0ZldGNoZWRBZnRlckxvZ2luKSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY29va2llU2VydmljZS5jaGVjayhMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBDdXJyZW50VXNlcklkID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpO1xyXG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gVGFzayBBc3NpZ25tZW50IE5vdGlmaWNhaXRvbnMgaGVyZS5cclxuICAgICAgICAgICAgY29uc3QgdGFza0Fzc2lnbm1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfVGFza0Fzc2lnbm1lbnRzICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgdGFzdGF0dXNSZXBvcnRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1N0YXR1c1JlcG9ydFN1Ym1pc3Npb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TdGF0dXNDb25maWdBc3NpZ24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBtdWx0aUNoYXJ0c1NjaGVkdWxpbmdDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTXVsdGlDaGFydHNTY2hlZHVsaW5nICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfQXNzZXRBc3NpZ25tZW50ICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgcHJvamVjdENyZWF0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTmV3UHJvamVjdCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3RBY2Nlc3NUb01lbWJlckNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Qcm9qZWN0TWVtYmVyUm9sZSArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Hb2FsQXBwcm92ZWRGcm9tUmVwbGFuICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgdXNlclN0b3J5VXBkYXRlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1VzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IEFubm91bmNlbWVudENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Bbm5vdW5jZW1lbnROb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBSZW1pbmRlckNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9SZW1pbmRlck5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Blcm9mb3JtYW5jZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfVXNlclN0b3J5Q29tbWVudCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwcmludFN0YXJ0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfU3ByaW50U3RhcnRlZCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwcmludFJlcGxhbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TcHJpbnRSZXF1ZXN0ZWRUb1JlcGxhbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlYXZlQXBwbGllZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9MZWF2ZUFwcGxpZWQgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBBcHByb3ZlTGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfQXBwcm92ZUxlYXZlICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgUmVqZWN0TGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmVqZWN0TGVhdmUgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBSZXNpZ25hdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9SZXNpZ25hdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IEFwcHJvdmVSZXNpZ25hdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9BcHByb3ZlUmVzaWduYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBSZWplY3RSZXNpZ25hdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9SZWplY3RSZXNpZ25hdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IEF1dG9USW1lc2hlZXRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX0F1dG9UaW1lc2hlZXRTdWJtaXNzaW9uICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgUHJvYmF0aW9uQXNzaWduTm90aWZpY2F0aW9uID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUHJvYmF0aW9uQXNzaWduTm90aWZpY2F0aW9uICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Jldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBSZXZpZXdTdWJtaXR0ZWRCeUVtcGxveWVlTm90aWZpY2F0aW9uID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IFJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbCA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Jldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1BlcmZvcm1hbmNlUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUGVyZm9ybWFuY2VSZXZpZXdJbnZpdGF0aW9uTm90aWZpY2F0aW9uTW9kZWwgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBQZXJmb3JtYW5jZVJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9QZXJmb3JtYW5jZVJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgdGFza0Fzc2lnbm1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0byBcIiArIHRhc3RhdHVzUmVwb3J0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgdGFzdGF0dXNDb25maWdBc3NpZ25DaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgcHJvamVjdENyZWF0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgcHJvamVjdEFjY2Vzc1RvTWVtYmVyQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyB1c2VyU3RvcnlVcGRhdGVDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgQW5ub3VuY2VtZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgc3ByaW50U3RhcnRlZENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBzcHJpbnRSZXBsYW5DaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgUmVtaW5kZXJDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgUGVyZm9ybWFuY2VDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgdGhpcy5wdWJudWIuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICBjaGFubmVsczogW3Rhc2tBc3NpZ25tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50bywgdGFzdGF0dXNSZXBvcnRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcclxuICAgICAgICAgICAgICAgIFByb2JhdGlvbkFzc2lnbk5vdGlmaWNhdGlvbiwgUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbiwgUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbixcclxuICAgICAgICAgICAgICAgIFJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbCwgUGVyZm9ybWFuY2VSZXZpZXdTdWJtaXR0ZWRCeUVtcGxveWVlTm90aWZpY2F0aW9uLCBQZXJmb3JtYW5jZVJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24sXHJcbiAgICAgICAgICAgICAgICB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8sIG11bHRpQ2hhcnRzU2NoZWR1bGluZ0NoYW5uZWxUb1N1YnNjcmliZUludG8sIFBlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBwcm9qZWN0Q3JlYXRlZENoYW5uZWxUb1N1YnNjcmliZUludG8sICxcclxuICAgICAgICAgICAgICAgIHByb2plY3RBY2Nlc3NUb01lbWJlckNoYW5uZWxUb1N1YnNjcmliZUludG8sIGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8sXHJcbiAgICAgICAgICAgICAgICB1c2VyU3RvcnlVcGRhdGVDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBbm5vdW5jZW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBSZW1pbmRlckNoYW5uZWxUb1N1YnNjcmliZUludG8sIFJlamVjdFJlc2lnbmF0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcclxuICAgICAgICAgICAgICAgIHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBzcHJpbnRTdGFydGVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgUmVzaWduYXRpb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBcHByb3ZlUmVzaWduYXRpb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvLFxyXG4gICAgICAgICAgICAgICAgc3ByaW50UmVwbGFuQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgbGVhdmVBcHBsaWVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgQXBwcm92ZUxlYXZlQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgUmVqZWN0TGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvLFxyXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBdXRvVEltZXNoZWV0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG9dXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBBZGQgb3RoZXIgc3Vic2NyaXB0aW9ucyBoZXJlLlxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJVc2VyIG5vdCBsb2dnZWQgaW4geWV0IHRvIGJlIGFibGUgdG8gc3Vic2NyaWJlLlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLmFjdGlvblVwZGF0ZXMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveWVkJCksXHJcbiAgICAgICAgb2ZUeXBlKEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuVXNlckRldGFpbHNGZXRjaGVkQWZ0ZXJMb2dpbiksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIHZhciByb2xlVXBkYXRlc0NoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Sb2xlVXBkYXRlcyArIFwiMTlCNkY5RkMtNzM3MC00QjlDLUEwNUMtM0I4RDgxOUVFRUFGXCI7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgcm9sZVVwZGF0ZXNDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgIHRoaXMucHVibnViLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIGNoYW5uZWxzOiBbcm9sZVVwZGF0ZXNDaGFubmVsVG9TdWJzY3JpYmVJbnRvXVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25VcGRhdGVzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5uZ0Rlc3Ryb3llZCQpLFxyXG4gICAgICAgIG9mVHlwZShOb3RpZmljYXRpb25zQWN0aW9uVHlwZXMuQ2xlYXJBbGxVbnJlYWROb3RpZmljYXRpb25zQ29tcGxldGVkKSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3Qoc2hhcmVkTW9kdWxlUmVkdWNlcnMuZ2V0Tm90aWZpY2F0aW9uQWxsKSk7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0geDtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAvLyBjb25zdCBzdG9yZUxpc3RuZXIgPSAobWVzc2FnZSkgPT4ge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLVJlY2VpdmVkIHB1Ym51YiBtZXNzYWdlLS0tLS0tLS0tXCIpO1xyXG4gICAgLy8gICAvLyB0aGlzLnRvYXN0ci5pbmZvKG1lc3NhZ2UubWVzc2FnZS5TdW1tYXJ5KTtcclxuICAgIC8vICAgdHJ5IHtcclxuICAgIC8vICAgICAvLyBSZWNlaXZpbmcgdGhlIFVzZXIgU3RvcnkgQXNzaWduZWQgTm90aWZpY2F0aW9uXHJcbiAgICAvLyAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLk5vdGlmaWNhdGlvbl9Xb3JrSXRlbUFzc2lnbmVkVG9Vc2VyKSB7XHJcbiAgICAvLyAgICAgICB2YXIgdXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgVXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24oKTtcclxuICAgIC8vICAgICAgIHVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICB1c2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld1dvcmtJdGVtICsgdXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZCh1c2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbikpO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkID09IE5vdGlmaWNhdGlvblR5cGVJZHMuTm90aWZpY2F0aW9uX1JvbGVVcGRhdGVkKSB7XHJcbiAgICAvLyAgICAgICB2YXIgcm9sZVVwZGF0ZWROb3RpZmljYXRpb24gPSBuZXcgUm9sZVVwZGF0ZWROb3RpZmljYXRpb24oKTtcclxuICAgIC8vICAgICAgIHJvbGVVcGRhdGVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICByb2xlVXBkYXRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChyb2xlVXBkYXRlZE5vdGlmaWNhdGlvbikpO1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlN0YXR1c19SZXBvcnRfU3VtaXR0ZWQpIHtcclxuICAgIC8vICAgICAgIHZhciByZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24gPSBuZXcgUmVwb3J0U3VibWl0dGVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICByZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChyZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5TdGF0dXNfUmVwb3J0X0NvbmZpZ19DcmVhdGVkKSB7XHJcbiAgICAvLyAgICAgICB2YXIgcmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgUmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24oKTtcclxuICAgIC8vICAgICAgIHJlcG9ydENvbmZpZ0Fzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICByZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChyZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbikpO1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLk11bHRpcGxlX0NoYXJ0c19TY2hlZHVsaW5nX2NyZWF0ZWQpIHtcclxuICAgIC8vICAgICAgIHZhciBtdWx0aXBsZUNoYXJ0c1NjaGVkdWxpbmcgPSBuZXcgTXVsdGlwbGVDaGFydHNTY2hlZHVsaW5nKCk7XHJcbiAgICAvLyAgICAgICBtdWx0aXBsZUNoYXJ0c1NjaGVkdWxpbmcubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIG11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZy5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChtdWx0aXBsZUNoYXJ0c1NjaGVkdWxpbmcpKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Bc3NldHNfQXNzaWdubWVudCkge1xyXG4gICAgLy8gICAgICAgY29uc3QgYXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbiA9IG5ldyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUmVtaW5kZXJfTm90aWZpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgLy8gICAgICAgY29uc3QgYXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbiA9IG5ldyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuQW5ub3VuY2VtZW50X1JlY2VpdmVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgLy8gICAgICAgY29uc3QgYXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbiA9IG5ldyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlLklkICE9IHRoaXMuYW5ub3VuY2VOb3RpZmljYXRpb25JZCkge1xyXG4gICAgLy8gICAgICAgICB0aGlzLmFubm91bmNlTm90aWZpY2F0aW9uSWQgPSBtZXNzYWdlLm1lc3NhZ2UuSWQ7XHJcbiAgICAvLyAgICAgICAgIHRoaXMub3BlbkFubm91bmNlbWVudERpYWxvZyhtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlBlcmZvcm1hbmNlX1JlY2VpdmVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSB8fCBtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUHJvamVjdE1lbWJlclJvbGVBZGRlZE5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgLy8gICAgICAgY29uc3QgbmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24gPSBuZXcgTmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgLy8gICAgICAgbmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uKSk7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLk5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIHx8IG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Qcm9qZWN0TWVtYmVyUm9sZUFkZGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbiA9IG5ldyBOZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAvLyAgICAgICBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgbmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24ucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuR29hbEFwcHJvdmVkRnJvbVJlcGxhbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgIC8vICAgICAgIGNvbnN0IGdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsID0gbmV3IEdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAvLyAgICAgICBnb2FsQXBwcm92ZWROb3RpZmljYXRpb25Nb2RlbC5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgZ29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQoZ29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwpKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuVVNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCB1c2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb25Nb2RlbCA9IG5ldyBVc2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgLy8gICAgICAgdXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHVzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKHVzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsKSk7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlB1c2hOb3RpZmljYXRpb25Gb3JVc2VyU3RvcnlDb21tZW50LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgLy8gICAgICAgY29uc3QgdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsID0gbmV3IFVzZXJTdG9yeUNvbW1lbnROb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgLy8gICAgICAgdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICB1c2VyU3RvcnlDb21tZW50Tm90aWZpY2F0aW9uTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQodXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsKSk7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFN0YXJ0ZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCBzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwgPSBuZXcgU3ByaW50U3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAvLyAgICAgICBzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHNwcmludFN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbC5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwpKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuU3ByaW50UmVxdWVzdGRGb3JSRXBsYW4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCBzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwgPSBuZXcgU3ByaW50UmVwbGFuU3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAvLyAgICAgICBzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbC5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwpKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgIC8vIFRPRE86IFNlbmQgdGhlc2UgZXJyb3JzIG9udG8gc2VydmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcclxuICAgIC8vICAgICAgIGNvbnNvbGUubG9nKFwiRm91bmQgdW5kZXRlY3RlZCBub3RpZmljYXRpb24gdHlwZS4gXCIgKyBtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICAvLyBBZGQgb3RoZXIgbm90aWZpY2F0aW9ucyBoZXJlLlxyXG5cclxuICAgIC8vICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAvLyAgICAgLy8gVE9ETzogU2VuZCB0aGVzZSBleGNlcHRpb25zIG9udG8gc2VydmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcclxuICAgIC8vICAgICBjb25zb2xlLmxvZyhcIkV4Y2VwdGlvbiBPY2N1cmVkXCIgKyBleGNlcHRpb24ubWVzc2FnZSk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH07XHJcblxyXG4gICAgLy8gdGhpcy5wdWJudWIuYWRkTGlzdGVuZXIoe1xyXG4gICAgLy8gICBzdGF0dXM6IHN0ID0+IHtcclxuICAgIC8vICAgICBpZiAoc3QuY2F0ZWdvcnkgPT09IFwiUE5Vbmtub3duQ2F0ZWdvcnlcIikge1xyXG4gICAgLy8gICAgICAgdmFyIG5ld1N0YXRlID0ge1xyXG4gICAgLy8gICAgICAgICBuZXc6IFwiZXJyb3JcIlxyXG4gICAgLy8gICAgICAgfTtcclxuICAgIC8vICAgICAgIHRoaXMucHVibnViLnNldFN0YXRlKFxyXG4gICAgLy8gICAgICAgICB7XHJcbiAgICAvLyAgICAgICAgICAgc3RhdGU6IG5ld1N0YXRlXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgLy8gZnVuY3Rpb24gKHN0YXR1cykge1xyXG4gICAgLy8gICAgICAgICAvLyAgIGNvbnNvbGUubG9nKHN0LmVycm9yRGF0YS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgICAgLy8gfVxyXG4gICAgLy8gICAgICAgKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIG1lc3NhZ2U6IG1lc3NhZ2UgPT4ge1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJlZCB0byBcIiArIG1lc3NhZ2UpO1xyXG4gICAgLy8gICAgIHN0b3JlTGlzdG5lcihtZXNzYWdlKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMucm91dGVyLmV2ZW50c1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ0Rlc3Ryb3llZCQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyb3V0ZUNoYW5nZSkgPT4ge1xyXG4gICAgICAgIGlmIChyb3V0ZUNoYW5nZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLm5vdGlmaWNQYW5lbCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNQYW5lbC5jbG9zZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnNpZ25hbHIubm90aWZpY2F0aW9ucyQuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5uZXdOb3RpZmljYXRpb25zID0gZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDAgPyBkYXRhIDogW107XHJcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdldFNvZnRMYWJlbENvbmZpZ3VyYXRpb25zKCk7XHJcblxyXG4gICAgdGhpcy5ub3RpZmljYXRpb25zJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3Qoc2hhcmVkTW9kdWxlUmVkdWNlcnMuZ2V0Tm90aWZpY2F0aW9uQWxsKSxcclxuICAgICAgdGFwKHggPT4gY29uc29sZS5sb2coeCkpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuYXV0aGVudGljYXRlZFVzZXJSZWNvcmQkID0gdGhpcy5zdG9yZS5waXBlKFxyXG4gICAgICBzZWxlY3Qoc2hhcmVkTW9kdWxlUmVkdWNlcnMuZ2V0QXV0aGVudGljYXRlZFVzZXJNb2RlbClcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nTm90aWZpY2F0aW9ucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHNoYXJlZE1vZHVsZVJlZHVjZXJzLmdldE5vdGlmaWNhdGlvbnNMb2FkaW5nKSk7XHJcbiAgfVxyXG5cclxuICBnZXRTb2Z0TGFiZWxDb25maWd1cmF0aW9ucygpIHtcclxuICAgIHRoaXMuc29mdExhYmVscyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ1NvZnRMYWJlbHMnKSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckFsbChlKSB7XHJcbiAgICBjb25zdCBub3RpZmljYXRpb25zID0gW107XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICBub3RpZmljYXRpb25zLnB1c2goZWxlbWVudCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IENsZWFyQWxsTm90aWZpY2F0aW9ucyhub3RpZmljYXRpb25zKSk7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbkNvbG9yID0gIXRoaXMubm90aWZpY2F0aW9uQ29sb3I7XHJcbiAgfVxyXG5cclxuICAvLyBvcGVuQW5ub3VuY2VtZW50RGlhbG9nKGFubm91bmNlZCkge1xyXG4gIC8vICAgdGhpcy5kaWFsb2cuY2xvc2VBbGwoKTtcclxuICAvLyAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQW5ub3VjZW1lbnREaWFsb2dDb21wb25lbnQsIHtcclxuICAvLyAgICAgbWluV2lkdGg6IFwiNjB2d1wiLFxyXG4gIC8vICAgICBtYXhXaWR0aDogXCI2MHZ3XCIsXHJcbiAgLy8gICAgIG1pbkhlaWdodDogXCI1MHZoXCIsXHJcbiAgLy8gICAgIG1heEhlaWdodDogXCI4MHZoXCIsXHJcbiAgLy8gICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAvLyAgICAgZGF0YToge1xyXG4gIC8vICAgICAgIGFubm91bmNlbWVudElkOiBhbm5vdW5jZWQuQW5ub3VuY2VtZW50SWQsXHJcbiAgLy8gICAgICAgYW5ub3VuY2VtZW50OiBhbm5vdW5jZWQuQW5ub3VuY2VtZW50LFxyXG4gIC8vICAgICAgIGFubm91bmNlZEJ5OiBhbm5vdW5jZWQuQW5ub3VuY2VkQnksXHJcbiAgLy8gICAgICAgYW5ub3VuY2VkQnlJZDogYW5ub3VuY2VkLkFubm91bmNlZEJ5SWQsXHJcbiAgLy8gICAgICAgYW5ub3VuY2VkQnlVc2VySW1hZ2U6IGFubm91bmNlZC5Bbm5vdW5jZWRCeVVzZXJJbWFnZSxcclxuICAvLyAgICAgICBhbm5vdW5jZWRPbjogYW5ub3VuY2VkLkFubm91bmNlZE9uXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmNsb3NlTWF0RGlhbG9nLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgLy8gICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ub3RpZmljYXRpb25zLmZpbmRJbmRleCgocCkgPT4gcC5ub3RpZmljYXRpb25JZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gdGhpcy5hbm5vdW5jZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7XHJcbiAgLy8gICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgLy8gICAgICAgdGhpcy51cHNlcnRSZWFkTm90aWZpY2F0aW9uKHRoaXMubm90aWZpY2F0aW9uc1tpbmRleF0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIHVwc2VydFJlYWROb3RpZmljYXRpb24oc2VsZWN0ZWROb3RpZmljYXRpb24pIHtcclxuICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSBbXTtcclxuICAgIHZhciByb2xlcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Sb2xlRmVhdHVyZXMpKTtcclxuICAgIGxldCBGZWF0dXJlX0FwcHJvdmVPclJlamVjdExlYXZlID0gJzJDMjI5MTZGLUI4MEItNEM1MS05NTM0LTIzRjY5OERFMTIwQic7XHJcbiAgICBsZXQgY2FuQWNjZXNzX2ZlYXR1cmVfQXBwcm92ZU9yUmVqZWN0TGVhdmUgPSBfLmZpbmQocm9sZXMsIGZ1bmN0aW9uIChyb2xlKSB7IHJldHVybiByb2xlWydmZWF0dXJlSWQnXS50b0xvd2VyQ2FzZSgpID09IEZlYXR1cmVfQXBwcm92ZU9yUmVqZWN0TGVhdmUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOyB9KSAhPSBudWxsO1xyXG4gICAgY29uc3QgQ3VycmVudFVzZXJJZCA9IHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlcklkKTtcclxuICAgIG5vdGlmaWNhdGlvbnMucHVzaChzZWxlY3RlZE5vdGlmaWNhdGlvbik7XHJcbiAgICBjb25zdCBub3RpaWZjYXRpb25tb2RlbCA9IEpTT04ucGFyc2Uoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uSnNvbik7XHJcbiAgICBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLk5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIHx8XHJcbiAgICAgIHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5Qcm9qZWN0TWVtYmVyUm9sZUFkZGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL3Byb2plY3RzdGF0dXMvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Qcm9qZWN0R3VpZCArIFwiL2FjdGl2ZS1nb2Fsc1wiXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5Hb2FsQXBwcm92ZWRGcm9tUmVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9nb2FsL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuR29hbEd1aWRdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLk5vdGlmaWNhdGlvbl9Xb3JrSXRlbUFzc2lnbmVkVG9Vc2VyLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy93b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUd1aWRdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlVTZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy93b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUlkXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5TcHJpbnRTdGFydGVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9zcHJpbnQvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5TcHJpbnRHdWlkXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUHVzaE5vdGlmaWNhdGlvbkZvclVzZXJTdG9yeUNvbW1lbnQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL3dvcmtpdGVtL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlclN0b3J5R3VpZF0pO1xyXG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuR29hbFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9nb2FsL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuR29hbEd1aWRdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9zcHJpbnQvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5TcHJpbnRHdWlkXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5Ob3RpZmljYXRpb25fQWRob2NXb3JrSXRlbUFzc2lnbmVkVG9Vc2VyLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvYWRob2Mtd29ya2l0ZW0vXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VyU3RvcnlHdWlkXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5BZGhvY1VTZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvYWRob2Mtd29ya2l0ZW0vXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VyU3RvcnlJZF0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLkxlYXZlQXBwbGljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICYmIGNhbkFjY2Vzc19mZWF0dXJlX0FwcHJvdmVPclJlamVjdExlYXZlKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImhybWFuYWdtZW50L2xlYXZlc1wiXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuQXBwcm92ZUxlYXZlQXBwbGljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL2xlYXZlcy1wZXJtaXNzaW9uc1wiXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUmVqZWN0TGVhdmVBcHBsaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBDdXJyZW50VXNlcklkICsgXCIvbGVhdmVzLXBlcm1pc3Npb25zXCJdKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5BdXRvVGltZVNoZWV0U3VibWlzc2lvbk5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBDdXJyZW50VXNlcklkICsgXCIvdGltZXNoZWV0QXBwcm92YWxcIl0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlByb2JhdGlvbkFzc2lnbk5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VySWQgKyBcIi9wcm9iYXRpb25cIl0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL3Byb2JhdGlvblwiXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VySWQgKyBcIi9wcm9iYXRpb25cIl0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlcklkICsgXCIvcHJvYmF0aW9uXCJdKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZVJldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlcklkICsgXCIvcGVyZm9ybWFuY2VcIl0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlBlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvcHJvZmlsZS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJJZCArIFwiL3BlcmZvcm1hbmNlXCJdKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZVJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL3BlcmZvcm1hbmNlXCJdKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFVwc2VydFVucmVhZE5vdGlmaWNhdGlvbnNUcmlnZ2VyZWQobm90aWZpY2F0aW9ucykpO1xyXG4gIH1cclxuXHJcbiAgdXBzZXJ0UmVhZE5ld05vdGlmaWNhdGlvbihub3RpZmljYXRpb24pIHtcclxuICAgIGxldCBub3RlczogTm90aWZpY2F0aW9uTW9kZWxbXSA9IFtub3RpZmljYXRpb25dO1xyXG4gICAgdGhpcy5zaWduYWxyLnVwc2VydFJlYWROZXdOb3RpZmljYXRpb25zKG5vdGVzKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgdGhpcy5zaWduYWxyLnJlbW92ZUl0ZW1Gcm9tTm90aWZpY2F0aW9ucyhub3RpZmljYXRpb24uaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICBpZiAobm90aWZpY2F0aW9uLm5hdmlnYXRpb25VcmwpIHtcclxuICAgICAgd2luZG93Lm9wZW4obm90aWZpY2F0aW9uLm5hdmlnYXRpb25VcmwsIFwiX2JsYW5rXCIpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGNsZWFyTmV3QWxsKGUpIHtcclxuICAgIHRoaXMuc2lnbmFsci51cHNlcnRSZWFkTmV3Tm90aWZpY2F0aW9ucyh0aGlzLm5ld05vdGlmaWNhdGlvbnMpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICB0aGlzLnNpZ25hbHIucmVtb3ZlQWxsTm90aWZpY2F0aW9ucygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLm5nRGVzdHJveWVkJC5uZXh0KCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtYXQtYmctcHJpbWFyeSBwdC0xIHBiLTFcIj5cclxuICA8IS0tIDxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiKGxvYWRpbmdOb3RpZmljYXRpb25zJCB8IGFzeW5jKVwiPjwvbWF0LXByb2dyZXNzLWJhcj4gLS0+XHJcbiAgPGg2IGNsYXNzPVwibS0wXCI+e3sgJ05PVElGSUNBVElPTlMuTk9USUZJQ0FUSU9OU1RJVExFJyB8IHRyYW5zbGF0ZSB9fSAoe3tuZXdOb3RpZmljYXRpb25zPy5sZW5ndGh9fSk8L2g2PlxyXG48L2Rpdj5cclxuPGRpdiBpZD1cInN0eWxlLTFcIiAqbmdJZj1cIm5ld05vdGlmaWNhdGlvbnMubGVuZ3RoICE9IDBcIj5cclxuICA8bWF0LW5hdi1saXN0IGNsYXNzPVwibm90aWZpY2F0aW9uLWxpc3QgcC0wIHByLTAzXCIgcm9sZT1cImxpc3RcIlxyXG4gICAgKm5nRm9yPVwibGV0IG5vdGlmaWNhdGlvbiBvZiAobmV3Tm90aWZpY2F0aW9ucyB8IG9yZGVyQnkpXCIgPlxyXG4gICAgPG1hdC1saXN0LWl0ZW0gY2xhc3M9XCJub3RpZmljLWl0ZW0gIHByLTAzIG5vdGlmaWNhdGlvbi1tYXJnaW5cIiByb2xlPVwibGlzdGl0ZW1cIlxyXG4gICAgICBbbmdDbGFzc109XCJ7J25vdGlmaWNhdGFpb24tdW5yZWFkJzogIW5vdGlmaWNhdGlvbkNvbG9yICwnbm90aWZpY2F0YWlvbi1yZWFkJzogbm90aWZpY2F0aW9uQ29sb3IgfVwiXHJcbiAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJvcGVuXCIgKGNsaWNrKT1cInVwc2VydFJlYWROZXdOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKVwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxhPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1saXN0LXRleHQgcGwtMCBwci0wMyBub3RpZmljYXRpb24tY3Vyc29yIG5vdGlmaWNhdGlvbnMtbGlzdC1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3b3JkLWJyZWFrIGRpc3BsYXktcHJlLWxpbmVcIiBzdHlsZT1cIm1hcmdpbjogMHB4ICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm5vdGlmaWNhdGlvbi5zdW1tYXJ5IHwgc2FuaXRpemVIdG1sXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0aW1lIHRleHQtbXV0ZWRcIj57eyBub3RpZmljYXRpb24uY3JlYXRlZERhdGVUaW1lIHwgdXRjVG9Mb2NhbFRpbWUgfCB0aW1lYWdvIH19PC9zbWFsbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC1saXN0LWl0ZW0+XHJcbiAgPC9tYXQtbmF2LWxpc3Q+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcC0xXCIgKm5nSWY9XCJuZXdOb3RpZmljYXRpb25zLmxlbmd0aCA9PSAwXCI+XHJcbiAge3sgJ05PVElGSUNBVElPTlMuTk9OT1RJRklDQVRJT05TVElUTEUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbjxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxyXG48ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgbXQtMDUgbWItMDVcIiAqbmdJZj1cIm5ld05vdGlmaWNhdGlvbnMubGVuZ3RoXCI+XHJcbiAgPGxhYmVsIGNsYXNzPVwibWItMFwiPjxhIChjbGljayk9XCJjbGVhck5ld0FsbCgkZXZlbnQpXCI+e3sgJ05PVElGSUNBVElPTlMuQ0xFQVJBTExOT1RJRklDQVRJT05TJyB8IHRyYW5zbGF0ZVxyXG4gICAgICB9fTwvYT48L2xhYmVsPlxyXG48L2Rpdj4iXX0=
1
+ import { Component, Input } from "@angular/core";
2
+ import { NavigationEnd } from "@angular/router";
3
+ import { ofType } from "@ngrx/effects";
4
+ import { select } from "@ngrx/store";
5
+ import { Subject } from "rxjs";
6
+ import { takeUntil, tap } from "rxjs/operators";
7
+ import { AuthenticationActionTypes } from "../../store/actions/authentication.actions";
8
+ import { ClearAllNotifications, NotificationsActionTypes, UpsertUnreadNotificationsTriggered } from "../../store/actions/notifications.actions";
9
+ import * as sharedModuleReducers from "../../store/reducers/index";
10
+ import { NotificationTypeIds } from '../../constants/notification-type-ids';
11
+ import { LocalStorageProperties } from '../../../globaldependencies/constants/localstorage-properties';
12
+ import { ChannelNames } from '../../constants/channel-names';
13
+ import '../../../globaldependencies/helpers/fontawesome-icons';
14
+ import * as _ from "underscore";
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@angular/router";
17
+ import * as i2 from "pubnub-angular2";
18
+ import * as i3 from "@ngrx/store";
19
+ import * as i4 from "@ngrx/effects";
20
+ import * as i5 from "ngx-cookie-service";
21
+ import * as i6 from "ngx-toastr";
22
+ import * as i7 from "@angular/material/dialog";
23
+ import * as i8 from "../../../globaldependencies/pipes/orderby-pipe";
24
+ import * as i9 from "../../services/signalr.service";
25
+ import * as i10 from "@angular/common";
26
+ import * as i11 from "@angular/material/divider";
27
+ import * as i12 from "@angular/material/list";
28
+ import * as i13 from "@angular/flex-layout/extended";
29
+ import * as i14 from "@ngx-translate/core";
30
+ import * as i15 from "../../../globaldependencies/pipes/sanitize.pipe";
31
+ import * as i16 from "ngx-timeago";
32
+ import * as i17 from "../../../globaldependencies/pipes/utctolocaltime.pipe";
33
+ const _c0 = function (a0, a1) { return { "notificataion-unread": a0, "notificataion-read": a1 }; };
34
+ function NotificationsComponent_div_4_mat_nav_list_1_Template(rf, ctx) { if (rf & 1) {
35
+ const _r6 = i0.ɵɵgetCurrentView();
36
+ i0.ɵɵelementStart(0, "mat-nav-list", 7);
37
+ i0.ɵɵelementStart(1, "mat-list-item", 8);
38
+ i0.ɵɵlistener("click", function NotificationsComponent_div_4_mat_nav_list_1_Template_mat_list_item_click_1_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const notification_r4 = restoredCtx.$implicit; const ctx_r5 = i0.ɵɵnextContext(2); return ctx_r5.upsertReadNewNotification(notification_r4); });
39
+ i0.ɵɵelementStart(2, "div");
40
+ i0.ɵɵelementStart(3, "a");
41
+ i0.ɵɵelementStart(4, "div", 9);
42
+ i0.ɵɵelement(5, "div", 10);
43
+ i0.ɵɵpipe(6, "sanitizeHtml");
44
+ i0.ɵɵelementStart(7, "small", 11);
45
+ i0.ɵɵtext(8);
46
+ i0.ɵɵpipe(9, "timeago");
47
+ i0.ɵɵpipe(10, "utcToLocalTime");
48
+ i0.ɵɵelementEnd();
49
+ i0.ɵɵelementEnd();
50
+ i0.ɵɵelementEnd();
51
+ i0.ɵɵelementEnd();
52
+ i0.ɵɵelementEnd();
53
+ i0.ɵɵelementEnd();
54
+ } if (rf & 2) {
55
+ const notification_r4 = ctx.$implicit;
56
+ const ctx_r3 = i0.ɵɵnextContext(2);
57
+ i0.ɵɵadvance(1);
58
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(9, _c0, !ctx_r3.notificationColor, ctx_r3.notificationColor));
59
+ i0.ɵɵadvance(4);
60
+ i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind1(6, 3, notification_r4.summary), i0.ɵɵsanitizeHtml);
61
+ i0.ɵɵadvance(3);
62
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(9, 5, i0.ɵɵpipeBind1(10, 7, notification_r4.createdDateTime)));
63
+ } }
64
+ function NotificationsComponent_div_4_Template(rf, ctx) { if (rf & 1) {
65
+ i0.ɵɵelementStart(0, "div", 5);
66
+ i0.ɵɵtemplate(1, NotificationsComponent_div_4_mat_nav_list_1_Template, 11, 12, "mat-nav-list", 6);
67
+ i0.ɵɵpipe(2, "orderBy");
68
+ i0.ɵɵelementEnd();
69
+ } if (rf & 2) {
70
+ const ctx_r0 = i0.ɵɵnextContext();
71
+ i0.ɵɵadvance(1);
72
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(2, 1, ctx_r0.newNotifications));
73
+ } }
74
+ function NotificationsComponent_div_5_Template(rf, ctx) { if (rf & 1) {
75
+ i0.ɵɵelementStart(0, "div", 12);
76
+ i0.ɵɵtext(1);
77
+ i0.ɵɵpipe(2, "translate");
78
+ i0.ɵɵelementEnd();
79
+ } if (rf & 2) {
80
+ i0.ɵɵadvance(1);
81
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "NOTIFICATIONS.NONOTIFICATIONSTITLE"), "");
82
+ } }
83
+ function NotificationsComponent_div_7_Template(rf, ctx) { if (rf & 1) {
84
+ const _r8 = i0.ɵɵgetCurrentView();
85
+ i0.ɵɵelementStart(0, "div", 13);
86
+ i0.ɵɵelementStart(1, "label", 14);
87
+ i0.ɵɵelementStart(2, "a", 15);
88
+ i0.ɵɵlistener("click", function NotificationsComponent_div_7_Template_a_click_2_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(); return ctx_r7.clearNewAll($event); });
89
+ i0.ɵɵtext(3);
90
+ i0.ɵɵpipe(4, "translate");
91
+ i0.ɵɵelementEnd();
92
+ i0.ɵɵelementEnd();
93
+ i0.ɵɵelementEnd();
94
+ } if (rf & 2) {
95
+ i0.ɵɵadvance(3);
96
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 1, "NOTIFICATIONS.CLEARALLNOTIFICATIONS"));
97
+ } }
98
+ export class NotificationsComponent {
99
+ constructor(router, pubnub, store, actionUpdates$, cookieService, toastr, dialog, orderByPipe, signalr, cdRef) {
100
+ this.router = router;
101
+ this.pubnub = pubnub;
102
+ this.store = store;
103
+ this.actionUpdates$ = actionUpdates$;
104
+ this.cookieService = cookieService;
105
+ this.toastr = toastr;
106
+ this.dialog = dialog;
107
+ this.orderByPipe = orderByPipe;
108
+ this.signalr = signalr;
109
+ this.cdRef = cdRef;
110
+ this.ngDestroyed$ = new Subject();
111
+ this.constNotification_WorkItemAssignedToUser = NotificationTypeIds.Notification_WorkItemAssignedToUser;
112
+ this.notificationColor = false;
113
+ this.newNotifications = [];
114
+ this.actionUpdates$
115
+ .pipe(takeUntil(this.ngDestroyed$), ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), tap(() => {
116
+ if (this.cookieService.check(LocalStorageProperties.CurrentUserId)) {
117
+ const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
118
+ // Subscribe to Task Assignment Notificaitons here.
119
+ const taskAssignmentChannelToSubscribeInto = ChannelNames.Channel_TaskAssignments + CurrentUserId;
120
+ const tastatusReportSubmissionChannelToSubscribeInto = ChannelNames.Channel_StatusReportSubmission + CurrentUserId;
121
+ const tastatusConfigAssignChannelToSubscribeInto = ChannelNames.Channel_StatusConfigAssign + CurrentUserId;
122
+ const multiChartsSchedulingChannelToSubscribeInto = ChannelNames.Channel_MultiChartsScheduling + CurrentUserId;
123
+ const assetsAssignedChannelToSubscribeInto = ChannelNames.Channel_AssetAssignment + CurrentUserId;
124
+ const projectCreatedChannelToSubscribeInto = ChannelNames.Channel_NewProject + CurrentUserId;
125
+ const projectAccessToMemberChannelToSubscribeInto = ChannelNames.Channel_ProjectMemberRole + CurrentUserId;
126
+ const goalApprovedChannelToSubscribeInto = ChannelNames.Channel_GoalApprovedFromReplan + CurrentUserId;
127
+ const userStoryUpdateChannelToSubscribeInto = ChannelNames.Channel_UserStoryUpdateNotification + CurrentUserId;
128
+ const AnnouncementChannelToSubscribeInto = ChannelNames.Channel_AnnouncementNotification + CurrentUserId;
129
+ const ReminderChannelToSubscribeInto = ChannelNames.Channel_ReminderNotification + CurrentUserId;
130
+ const PerformanceChannelToSubscribeInto = ChannelNames.Channel_PeroformanceNotification + CurrentUserId;
131
+ const userStoryCommentChannelToSubscribeInto = ChannelNames.Channel_UserStoryComment + CurrentUserId;
132
+ const sprintStartedChannelToSubscribeInto = ChannelNames.Channel_SprintStarted + CurrentUserId;
133
+ const sprintReplanChannelToSubscribeInto = ChannelNames.Channel_SprintRequestedToReplan + CurrentUserId;
134
+ const leaveAppliedChannelToSubscribeInto = ChannelNames.Channel_LeaveApplied + CurrentUserId;
135
+ const ApproveLeaveChannelToSubscribeInto = ChannelNames.Channel_ApproveLeave + CurrentUserId;
136
+ const RejectLeaveChannelToSubscribeInto = ChannelNames.Channel_RejectLeave + CurrentUserId;
137
+ const ResignationChannelToSubscribeInto = ChannelNames.Channel_Resignation + CurrentUserId;
138
+ const ApproveResignationChannelToSubscribeInto = ChannelNames.Channel_ApproveResignation + CurrentUserId;
139
+ const RejectResignationChannelToSubscribeInto = ChannelNames.Channel_RejectResignation + CurrentUserId;
140
+ const AutoTImesheetSubmissionChannelToSubscribeInto = ChannelNames.Channel_AutoTimesheetSubmission + CurrentUserId;
141
+ const ProbationAssignNotification = ChannelNames.Channel_ProbationAssignNotification + CurrentUserId;
142
+ const ReviewAssignToEmployeeNotification = ChannelNames.Channel_ReviewAssignToEmployeeNotification + CurrentUserId;
143
+ const ReviewSubmittedByEmployeeNotification = ChannelNames.Channel_ReviewSubmittedByEmployeeNotification + CurrentUserId;
144
+ const ReviewInvitationNotificationModel = ChannelNames.Channel_ReviewInvitationNotificationModel + CurrentUserId;
145
+ const PerformanceReviewSubmittedByEmployeeNotification = ChannelNames.Channel_PerformanceReviewSubmittedByEmployeeNotification + CurrentUserId;
146
+ const PerformanceReviewInvitationNotificationModel = ChannelNames.Channel_PerformanceReviewInvitationNotificationModel + CurrentUserId;
147
+ const PerformanceReviewAssignToEmployeeNotification = ChannelNames.Channel_PerformanceReviewAssignToEmployeeNotification + CurrentUserId;
148
+ console.log("subscribing to " + taskAssignmentChannelToSubscribeInto);
149
+ console.log("subscribing to " + tastatusReportSubmissionChannelToSubscribeInto);
150
+ console.log("subscribing to " + tastatusConfigAssignChannelToSubscribeInto);
151
+ console.log("subscribing to" + assetsAssignedChannelToSubscribeInto);
152
+ console.log("subscribing to" + projectCreatedChannelToSubscribeInto);
153
+ console.log("subscribing to" + projectAccessToMemberChannelToSubscribeInto);
154
+ console.log("subscribing to" + goalApprovedChannelToSubscribeInto);
155
+ console.log("subscribing to" + userStoryUpdateChannelToSubscribeInto);
156
+ console.log("subscribing to" + AnnouncementChannelToSubscribeInto);
157
+ console.log("subscribing to" + userStoryCommentChannelToSubscribeInto);
158
+ console.log("subscribing to" + sprintStartedChannelToSubscribeInto);
159
+ console.log("subscribing to" + sprintReplanChannelToSubscribeInto);
160
+ console.log("subscribing to" + ReminderChannelToSubscribeInto);
161
+ console.log("subscribing to" + PerformanceChannelToSubscribeInto);
162
+ this.pubnub.subscribe({
163
+ channels: [taskAssignmentChannelToSubscribeInto, tastatusReportSubmissionChannelToSubscribeInto,
164
+ ProbationAssignNotification, ReviewAssignToEmployeeNotification, ReviewSubmittedByEmployeeNotification,
165
+ ReviewInvitationNotificationModel, PerformanceReviewSubmittedByEmployeeNotification, PerformanceReviewAssignToEmployeeNotification,
166
+ tastatusConfigAssignChannelToSubscribeInto, multiChartsSchedulingChannelToSubscribeInto, PerformanceReviewInvitationNotificationModel,
167
+ assetsAssignedChannelToSubscribeInto, projectCreatedChannelToSubscribeInto, ,
168
+ projectAccessToMemberChannelToSubscribeInto, goalApprovedChannelToSubscribeInto,
169
+ userStoryUpdateChannelToSubscribeInto, AnnouncementChannelToSubscribeInto, ReminderChannelToSubscribeInto, RejectResignationChannelToSubscribeInto,
170
+ userStoryCommentChannelToSubscribeInto, sprintStartedChannelToSubscribeInto, ResignationChannelToSubscribeInto, ApproveResignationChannelToSubscribeInto,
171
+ sprintReplanChannelToSubscribeInto, leaveAppliedChannelToSubscribeInto, ApproveLeaveChannelToSubscribeInto, RejectLeaveChannelToSubscribeInto,
172
+ PerformanceChannelToSubscribeInto, AutoTImesheetSubmissionChannelToSubscribeInto]
173
+ });
174
+ // Add other subscriptions here.
175
+ }
176
+ else {
177
+ console.log("User not logged in yet to be able to subscribe.");
178
+ }
179
+ }))
180
+ .subscribe();
181
+ this.actionUpdates$
182
+ .pipe(takeUntil(this.ngDestroyed$), ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), tap(() => {
183
+ var roleUpdatesChannelToSubscribeInto = ChannelNames.Channel_RoleUpdates + "19B6F9FC-7370-4B9C-A05C-3B8D819EEEAF";
184
+ console.log("subscribing to " + roleUpdatesChannelToSubscribeInto);
185
+ this.pubnub.subscribe({
186
+ channels: [roleUpdatesChannelToSubscribeInto]
187
+ });
188
+ }))
189
+ .subscribe();
190
+ this.actionUpdates$
191
+ .pipe(takeUntil(this.ngDestroyed$), ofType(NotificationsActionTypes.ClearAllUnreadNotificationsCompleted), tap(() => {
192
+ this.notifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationAll));
193
+ this.notifications$.subscribe(x => {
194
+ this.notifications = x;
195
+ });
196
+ }))
197
+ .subscribe();
198
+ // const storeListner = (message) => {
199
+ // console.log("---------Received pubnub message---------");
200
+ // // this.toastr.info(message.message.Summary);
201
+ // try {
202
+ // // Receiving the User Story Assigned Notification
203
+ // if (message.message.NotificationTypeGuid == NotificationTypeIds.Notification_WorkItemAssignedToUser) {
204
+ // var userStoryAssignedNotification = new UserStoryAssignedNotification();
205
+ // userStoryAssignedNotification.loadFromCaseInsensitiveObject(message.message);
206
+ // userStoryAssignedNotification.route = ChannelRoutes.ViewWorkItem + userStoryAssignedNotification.notificationId;
207
+ // this.store.dispatch(new NewNotificationReceived(userStoryAssignedNotification));
208
+ // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Notification_RoleUpdated) {
209
+ // var roleUpdatedNotification = new RoleUpdatedNotification();
210
+ // roleUpdatedNotification.loadFromCaseInsensitiveObject(message.message);
211
+ // roleUpdatedNotification.route = ChannelRoutes.ViewAccount;
212
+ // this.store.dispatch(new NewNotificationReceived(roleUpdatedNotification));
213
+ // this.store.dispatch(new RolesFetchTriggered());
214
+ // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Status_Report_Sumitted) {
215
+ // var reportSubmittedNotification = new ReportSubmittedNotification();
216
+ // reportSubmittedNotification.loadFromCaseInsensitiveObject(message.message);
217
+ // reportSubmittedNotification.route = ChannelRoutes.ViewAccount;
218
+ // this.store.dispatch(new NewNotificationReceived(reportSubmittedNotification));
219
+ // this.store.dispatch(new RolesFetchTriggered());
220
+ // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Status_Report_Config_Created) {
221
+ // var reportConfigAssignedNotification = new ReportConfigAssignedNotification();
222
+ // reportConfigAssignedNotification.loadFromCaseInsensitiveObject(message.message);
223
+ // reportConfigAssignedNotification.route = ChannelRoutes.ViewAccount;
224
+ // this.store.dispatch(new NewNotificationReceived(reportConfigAssignedNotification));
225
+ // this.store.dispatch(new RolesFetchTriggered());
226
+ // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Multiple_Charts_Scheduling_created) {
227
+ // var multipleChartsScheduling = new MultipleChartsScheduling();
228
+ // multipleChartsScheduling.loadFromCaseInsensitiveObject(message.message);
229
+ // multipleChartsScheduling.route = ChannelRoutes.ViewAccount;
230
+ // this.store.dispatch(new NewNotificationReceived(multipleChartsScheduling));
231
+ // this.store.dispatch(new RolesFetchTriggered());
232
+ // } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Assets_Assignment) {
233
+ // const assetAssignedNotification = new AssetAssignedNotification();
234
+ // assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
235
+ // assetAssignedNotification.route = ChannelRoutes.ViewAccount;
236
+ // this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
237
+ // this.store.dispatch(new RolesFetchTriggered());
238
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Reminder_Notification.toString().toLowerCase()) {
239
+ // const assetAssignedNotification = new AssetAssignedNotification();
240
+ // assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
241
+ // assetAssignedNotification.route = ChannelRoutes.ViewAccount;
242
+ // this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
243
+ // this.store.dispatch(new RolesFetchTriggered());
244
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Announcement_Received.toString().toLowerCase()) {
245
+ // const assetAssignedNotification = new AssetAssignedNotification();
246
+ // assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
247
+ // assetAssignedNotification.route = ChannelRoutes.ViewAccount;
248
+ // this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
249
+ // this.store.dispatch(new RolesFetchTriggered());
250
+ // if (message.message.Id != this.announceNotificationId) {
251
+ // this.announceNotificationId = message.message.Id;
252
+ // this.openAnnouncementDialog(message.message);
253
+ // }
254
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Performance_Received.toString().toLowerCase() || message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
255
+ // const newProjectCreatedNotification = new NewProjectCreatedNotificationModel();
256
+ // newProjectCreatedNotification.loadFromCaseInsensitiveObject(message.message);
257
+ // newProjectCreatedNotification.route = ChannelRoutes.ViewAccount;
258
+ // this.store.dispatch(new NewNotificationReceived(newProjectCreatedNotification));
259
+ // this.store.dispatch(new RolesFetchTriggered());
260
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.NewProjectCreatedNotificationId.toString().toLowerCase() || message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
261
+ // const newProjectCreatedNotification = new NewProjectCreatedNotificationModel();
262
+ // newProjectCreatedNotification.loadFromCaseInsensitiveObject(message.message);
263
+ // newProjectCreatedNotification.route = ChannelRoutes.ViewAccount;
264
+ // this.store.dispatch(new NewNotificationReceived(newProjectCreatedNotification));
265
+ // this.store.dispatch(new RolesFetchTriggered());
266
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.GoalApprovedFromReplan.toString().toLowerCase()) {
267
+ // const goalApprovedNotificationModel = new GoalApprovedNotificationModel();
268
+ // goalApprovedNotificationModel.loadFromCaseInsensitiveObject(message.message);
269
+ // goalApprovedNotificationModel.route = ChannelRoutes.ViewAccount;
270
+ // this.store.dispatch(new NewNotificationReceived(goalApprovedNotificationModel));
271
+ // this.store.dispatch(new RolesFetchTriggered());
272
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.USerStoryUpdateNotificationId.toString().toLowerCase()) {
273
+ // const userStoryUpdateNotificationModel = new UserStoryUpdateNotificationModel();
274
+ // userStoryUpdateNotificationModel.loadFromCaseInsensitiveObject(message.message);
275
+ // userStoryUpdateNotificationModel.route = ChannelRoutes.ViewAccount;
276
+ // this.store.dispatch(new NewNotificationReceived(userStoryUpdateNotificationModel));
277
+ // this.store.dispatch(new RolesFetchTriggered());
278
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.PushNotificationForUserStoryComment.toString().toLowerCase()) {
279
+ // const userStoryCommentNotificationModel = new UserStoryCommentNotificationModel();
280
+ // userStoryCommentNotificationModel.loadFromCaseInsensitiveObject(message.message);
281
+ // userStoryCommentNotificationModel.route = ChannelRoutes.ViewAccount;
282
+ // this.store.dispatch(new NewNotificationReceived(userStoryCommentNotificationModel));
283
+ // this.store.dispatch(new RolesFetchTriggered());
284
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.SprintStarted.toString().toLowerCase()) {
285
+ // const sprintStartedNotificationModel = new SprintStartedNotificationModel();
286
+ // sprintStartedNotificationModel.loadFromCaseInsensitiveObject(message.message);
287
+ // sprintStartedNotificationModel.route = ChannelRoutes.ViewAccount;
288
+ // this.store.dispatch(new NewNotificationReceived(sprintStartedNotificationModel));
289
+ // this.store.dispatch(new RolesFetchTriggered());
290
+ // } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.SprintRequestdForREplan.toString().toLowerCase()) {
291
+ // const sprintReplanStartedNotificationModel = new SprintReplanStartedNotificationModel();
292
+ // sprintReplanStartedNotificationModel.loadFromCaseInsensitiveObject(message.message);
293
+ // sprintReplanStartedNotificationModel.route = ChannelRoutes.ViewAccount;
294
+ // this.store.dispatch(new NewNotificationReceived(sprintReplanStartedNotificationModel));
295
+ // this.store.dispatch(new RolesFetchTriggered());
296
+ // } else {
297
+ // // TODO: Send these errors onto server for further processing
298
+ // console.log("Found undetected notification type. " + message.message.NotificationTypeGuid);
299
+ // }
300
+ // // Add other notifications here.
301
+ // } catch (exception) {
302
+ // // TODO: Send these exceptions onto server for further processing
303
+ // console.log("Exception Occured" + exception.message);
304
+ // }
305
+ // };
306
+ // this.pubnub.addListener({
307
+ // status: st => {
308
+ // if (st.category === "PNUnknownCategory") {
309
+ // var newState = {
310
+ // new: "error"
311
+ // };
312
+ // this.pubnub.setState(
313
+ // {
314
+ // state: newState
315
+ // }
316
+ // // function (status) {
317
+ // // console.log(st.errorData.message);
318
+ // // }
319
+ // );
320
+ // }
321
+ // },
322
+ // message: message => {
323
+ // console.log("subscribed to " + message);
324
+ // storeListner(message);
325
+ // }
326
+ // });
327
+ }
328
+ ngOnInit() {
329
+ this.router.events
330
+ .pipe(takeUntil(this.ngDestroyed$))
331
+ .subscribe((routeChange) => {
332
+ if (routeChange instanceof NavigationEnd) {
333
+ if (this.notificPanel) {
334
+ this.notificPanel.close();
335
+ }
336
+ }
337
+ });
338
+ this.signalr.notifications$.subscribe((data) => {
339
+ this.newNotifications = data && data.length > 0 ? data : [];
340
+ this.cdRef.detectChanges();
341
+ });
342
+ this.getSoftLabelConfigurations();
343
+ this.notifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationAll), tap(x => console.log(x)));
344
+ this.authenticatedUserRecord$ = this.store.pipe(select(sharedModuleReducers.getAuthenticatedUserModel));
345
+ this.loadingNotifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationsLoading));
346
+ }
347
+ getSoftLabelConfigurations() {
348
+ this.softLabels = JSON.parse(localStorage.getItem('SoftLabels'));
349
+ }
350
+ clearAll(e) {
351
+ const notifications = [];
352
+ this.notifications.forEach((element) => {
353
+ notifications.push(element);
354
+ });
355
+ this.store.dispatch(new ClearAllNotifications(notifications));
356
+ e.preventDefault();
357
+ this.notificationColor = !this.notificationColor;
358
+ }
359
+ // openAnnouncementDialog(announced) {
360
+ // this.dialog.closeAll();
361
+ // const dialogRef = this.dialog.open(AnnoucementDialogComponent, {
362
+ // minWidth: "60vw",
363
+ // maxWidth: "60vw",
364
+ // minHeight: "50vh",
365
+ // maxHeight: "80vh",
366
+ // disableClose: true,
367
+ // data: {
368
+ // announcementId: announced.AnnouncementId,
369
+ // announcement: announced.Announcement,
370
+ // announcedBy: announced.AnnouncedBy,
371
+ // announcedById: announced.AnnouncedById,
372
+ // announcedByUserImage: announced.AnnouncedByUserImage,
373
+ // announcedOn: announced.AnnouncedOn
374
+ // }
375
+ // });
376
+ // dialogRef.componentInstance.closeMatDialog.subscribe((result) => {
377
+ // const index = this.notifications.findIndex((p) => p.notificationId.toString().toLowerCase() == this.announceNotificationId.toString().toLowerCase());
378
+ // if (index > -1) {
379
+ // this.upsertReadNotification(this.notifications[index]);
380
+ // }
381
+ // });
382
+ // }
383
+ upsertReadNotification(selectedNotification) {
384
+ const notifications = [];
385
+ var roles = JSON.parse(localStorage.getItem(LocalStorageProperties.RoleFeatures));
386
+ let Feature_ApproveOrRejectLeave = '2C22916F-B80B-4C51-9534-23F698DE120B';
387
+ let canAccess_feature_ApproveOrRejectLeave = _.find(roles, function (role) { return role['featureId'].toLowerCase() == Feature_ApproveOrRejectLeave.toString().toLowerCase(); }) != null;
388
+ const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
389
+ notifications.push(selectedNotification);
390
+ const notiifcationmodel = JSON.parse(selectedNotification.notificationJson);
391
+ if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
392
+ NotificationTypeIds.NewProjectCreatedNotificationId.toString().toLowerCase() ||
393
+ selectedNotification.notificationTypeId.toString().toLowerCase() ==
394
+ NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
395
+ this.router.navigate(["projects/projectstatus/" + notiifcationmodel.ProjectGuid + "/active-goals"]);
396
+ }
397
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
398
+ NotificationTypeIds.GoalApprovedFromReplan.toString().toLowerCase()) {
399
+ this.router.navigate(["projects/goal/" + notiifcationmodel.GoalGuid]);
400
+ }
401
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
402
+ NotificationTypeIds.Notification_WorkItemAssignedToUser.toString().toLowerCase()) {
403
+ this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryGuid]);
404
+ }
405
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
406
+ NotificationTypeIds.USerStoryUpdateNotificationId.toString().toLowerCase()) {
407
+ this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryId]);
408
+ }
409
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
410
+ NotificationTypeIds.SprintStarted.toString().toLowerCase()) {
411
+ this.router.navigate(["projects/sprint/" + notiifcationmodel.SprintGuid]);
412
+ }
413
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
414
+ NotificationTypeIds.PushNotificationForUserStoryComment.toString().toLowerCase()) {
415
+ this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryGuid]);
416
+ }
417
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
418
+ NotificationTypeIds.GoalRequestdForREplan.toString().toLowerCase()) {
419
+ this.router.navigate(["projects/goal/" + notiifcationmodel.GoalGuid]);
420
+ }
421
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
422
+ NotificationTypeIds.SprintRequestdForREplan.toString().toLowerCase()) {
423
+ this.router.navigate(["projects/sprint/" + notiifcationmodel.SprintGuid]);
424
+ }
425
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
426
+ NotificationTypeIds.Notification_AdhocWorkItemAssignedToUser.toString().toLowerCase()) {
427
+ this.router.navigate(["dashboard/adhoc-workitem/" + notiifcationmodel.UserStoryGuid]);
428
+ }
429
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
430
+ NotificationTypeIds.AdhocUSerStoryUpdateNotificationId.toString().toLowerCase()) {
431
+ this.router.navigate(["dashboard/adhoc-workitem/" + notiifcationmodel.UserStoryId]);
432
+ }
433
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
434
+ NotificationTypeIds.LeaveApplication.toString().toLowerCase() && canAccess_feature_ApproveOrRejectLeave) {
435
+ this.router.navigate(["hrmanagment/leaves"]);
436
+ }
437
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
438
+ NotificationTypeIds.ApproveLeaveApplication.toString().toLowerCase()) {
439
+ this.router.navigate(["dashboard/profile/" + CurrentUserId + "/leaves-permissions"]);
440
+ }
441
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
442
+ NotificationTypeIds.RejectLeaveApplication.toString().toLowerCase()) {
443
+ this.router.navigate(["dashboard/profile/" + CurrentUserId + "/leaves-permissions"]);
444
+ }
445
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
446
+ NotificationTypeIds.AutoTimeSheetSubmissionNotification.toString().toLowerCase()) {
447
+ this.router.navigate(["dashboard/profile/" + CurrentUserId + "/timesheetApproval"]);
448
+ }
449
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
450
+ NotificationTypeIds.ProbationAssignNotification.toString().toLowerCase()) {
451
+ this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
452
+ }
453
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
454
+ NotificationTypeIds.ReviewAssignToEmployeeNotification.toString().toLowerCase()) {
455
+ this.router.navigate(["dashboard/profile/" + CurrentUserId + "/probation"]);
456
+ }
457
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
458
+ NotificationTypeIds.ReviewSubmittedByEmployeeNotification.toString().toLowerCase()) {
459
+ this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
460
+ }
461
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
462
+ NotificationTypeIds.ReviewInvitationNotification.toString().toLowerCase()) {
463
+ this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
464
+ }
465
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
466
+ NotificationTypeIds.PerformanceReviewSubmittedByEmployeeNotification.toString().toLowerCase()) {
467
+ this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/performance"]);
468
+ }
469
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
470
+ NotificationTypeIds.PerformanceReviewInvitationNotificationModel.toString().toLowerCase()) {
471
+ this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/performance"]);
472
+ }
473
+ else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
474
+ NotificationTypeIds.PerformanceReviewAssignToEmployeeNotification.toString().toLowerCase()) {
475
+ this.router.navigate(["dashboard/profile/" + CurrentUserId + "/performance"]);
476
+ }
477
+ this.store.dispatch(new UpsertUnreadNotificationsTriggered(notifications));
478
+ }
479
+ upsertReadNewNotification(notification) {
480
+ let notes = [notification];
481
+ this.signalr.upsertReadNewNotifications(notes)
482
+ .subscribe((res) => {
483
+ if (res.success) {
484
+ this.signalr.removeItemFromNotifications(notification.id);
485
+ }
486
+ });
487
+ if (notification.navigationUrl) {
488
+ window.open(notification.navigationUrl, "_blank");
489
+ }
490
+ }
491
+ clearNewAll(e) {
492
+ this.signalr.upsertReadNewNotifications(this.newNotifications)
493
+ .subscribe((res) => {
494
+ if (res.success) {
495
+ this.signalr.removeAllNotifications();
496
+ }
497
+ });
498
+ }
499
+ ngOnDestroy() {
500
+ this.ngDestroyed$.next();
501
+ }
502
+ }
503
+ NotificationsComponent.ɵfac = function NotificationsComponent_Factory(t) { return new (t || NotificationsComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i2.PubNubAngular), i0.ɵɵdirectiveInject(i3.Store), i0.ɵɵdirectiveInject(i4.Actions), i0.ɵɵdirectiveInject(i5.CookieService), i0.ɵɵdirectiveInject(i6.ToastrService), i0.ɵɵdirectiveInject(i7.MatDialog), i0.ɵɵdirectiveInject(i8.OrderByPipe), i0.ɵɵdirectiveInject(i9.SignalrService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
504
+ NotificationsComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NotificationsComponent, selectors: [["app-notifications"]], inputs: { notificPanel: "notificPanel" }, decls: 8, vars: 7, consts: [[1, "text-center", "mat-bg-primary", "pt-1", "pb-1"], [1, "m-0"], ["id", "style-1", 4, "ngIf"], ["class", "text-center p-1", 4, "ngIf"], ["class", "text-center mt-05 mb-05", 4, "ngIf"], ["id", "style-1"], ["class", "notification-list p-0 pr-03", "role", "list", 4, "ngFor", "ngForOf"], ["role", "list", 1, "notification-list", "p-0", "pr-03"], ["role", "listitem", "routerLinkActive", "open", 1, "notific-item", "pr-03", "notification-margin", 3, "ngClass", "click"], [1, "mat-list-text", "pl-0", "pr-03", "notification-cursor", "notifications-list-item"], [1, "word-break", "display-pre-line", 2, "margin", "0px !important", 3, "innerHTML"], [1, "time", "text-muted"], [1, "text-center", "p-1"], [1, "text-center", "mt-05", "mb-05"], [1, "mb-0"], [3, "click"]], template: function NotificationsComponent_Template(rf, ctx) { if (rf & 1) {
505
+ i0.ɵɵelementStart(0, "div", 0);
506
+ i0.ɵɵelementStart(1, "h6", 1);
507
+ i0.ɵɵtext(2);
508
+ i0.ɵɵpipe(3, "translate");
509
+ i0.ɵɵelementEnd();
510
+ i0.ɵɵelementEnd();
511
+ i0.ɵɵtemplate(4, NotificationsComponent_div_4_Template, 3, 3, "div", 2);
512
+ i0.ɵɵtemplate(5, NotificationsComponent_div_5_Template, 3, 3, "div", 3);
513
+ i0.ɵɵelement(6, "mat-divider");
514
+ i0.ɵɵtemplate(7, NotificationsComponent_div_7_Template, 5, 3, "div", 4);
515
+ } if (rf & 2) {
516
+ i0.ɵɵadvance(2);
517
+ i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(3, 5, "NOTIFICATIONS.NOTIFICATIONSTITLE"), " (", ctx.newNotifications == null ? null : ctx.newNotifications.length, ")");
518
+ i0.ɵɵadvance(2);
519
+ i0.ɵɵproperty("ngIf", ctx.newNotifications.length != 0);
520
+ i0.ɵɵadvance(1);
521
+ i0.ɵɵproperty("ngIf", ctx.newNotifications.length == 0);
522
+ i0.ɵɵadvance(2);
523
+ i0.ɵɵproperty("ngIf", ctx.newNotifications.length);
524
+ } }, directives: [i10.NgIf, i11.MatDivider, i10.NgForOf, i12.MatNavList, i12.MatListItem, i1.RouterLinkActive, i10.NgClass, i13.DefaultClassDirective], pipes: [i14.TranslatePipe, i8.OrderByPipe, i15.SanitizeHtmlPipe, i16.TimeagoPipe, i17.UtcToLocalTimePipe], encapsulation: 2 });
525
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NotificationsComponent, [{
526
+ type: Component,
527
+ args: [{
528
+ selector: "app-notifications",
529
+ templateUrl: "./notifications.component.html"
530
+ }]
531
+ }], function () { return [{ type: i1.Router }, { type: i2.PubNubAngular }, { type: i3.Store }, { type: i4.Actions }, { type: i5.CookieService }, { type: i6.ToastrService }, { type: i7.MatDialog }, { type: i8.OrderByPipe }, { type: i9.SignalrService }, { type: i0.ChangeDetectorRef }]; }, { notificPanel: [{
532
+ type: Input
533
+ }] }); })();
534
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zaGVsbC1tb2R1bGUtY29tcG9uZW50cy9zaGVsbC1jb21wb25lbnRzL3NyYy9saWIvc2hlbGwtY29tcG9uZW50cy9jb21wb25lbnRzL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zaGVsbC1tb2R1bGUtY29tcG9uZW50cy9zaGVsbC1jb21wb25lbnRzL3NyYy9saWIvc2hlbGwtY29tcG9uZW50cy9jb21wb25lbnRzL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQThDLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFckcsT0FBTyxFQUFFLGFBQWEsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBVyxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBUyxNQUFNLGFBQWEsQ0FBQztBQUk1QyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHlCQUF5QixFQUF1QixNQUFNLDRDQUE0QyxDQUFDO0FBQzVHLE9BQU8sRUFBRSxxQkFBcUIsRUFBMkIsd0JBQXdCLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUV6SyxPQUFPLEtBQUssb0JBQW9CLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLNUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0RBQStELENBQUM7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QzdDbkMsOEJBQWtEO1FBRWhELDZCQUFnQjtRQUFBLFlBQW1GOztRQUFBLGlCQUFLO1FBQzFHLGlCQUFNO1FBQ04sdUVBa0JNO1FBQ04sdUVBQzhEO1FBQzlELDhCQUEyQjtRQUMzQix1RUFHTTs7UUEzQlksZUFBbUY7UUFBbkYsaUtBQW1GO1FBRWxGLGVBQWtDO1FBQWxDLHVEQUFrQztRQW1CdkIsZUFBa0M7UUFBbEMsdURBQWtDO1FBRzFCLGVBQTZCO1FBQTdCLGtEQUE2Qjs7dUZEbUJ0RCxzQkFBc0I7Y0FMbEMsU0FBUztlQUFDO2dCQUNULFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLFdBQVcsRUFBRSxnQ0FBZ0M7YUFDOUM7c1NBSVUsWUFBWTtrQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7IEFjdGlvbnMsIG9mVHlwZSB9IGZyb20gXCJAbmdyeC9lZmZlY3RzXCI7XG5pbXBvcnQgeyBzZWxlY3QsIFN0b3JlIH0gZnJvbSBcIkBuZ3J4L3N0b3JlXCI7XG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSBcIm5neC1jb29raWUtc2VydmljZVwiO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gXCJuZ3gtdG9hc3RyXCI7XG5pbXBvcnQgeyBQdWJOdWJBbmd1bGFyIH0gZnJvbSBcInB1Ym51Yi1hbmd1bGFyMlwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcywgUm9sZXNGZXRjaFRyaWdnZXJlZCB9IGZyb20gXCIuLi8uLi9zdG9yZS9hY3Rpb25zL2F1dGhlbnRpY2F0aW9uLmFjdGlvbnNcIjtcbmltcG9ydCB7IENsZWFyQWxsTm90aWZpY2F0aW9ucywgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQsIE5vdGlmaWNhdGlvbnNBY3Rpb25UeXBlcywgVXBzZXJ0VW5yZWFkTm90aWZpY2F0aW9uc1RyaWdnZXJlZCB9IGZyb20gXCIuLi8uLi9zdG9yZS9hY3Rpb25zL25vdGlmaWNhdGlvbnMuYWN0aW9uc1wiO1xuaW1wb3J0IHsgU3RhdGUgfSBmcm9tIFwiLi4vLi4vc3RvcmUvcmVkdWNlcnMvaW5kZXhcIjtcbmltcG9ydCAqIGFzIHNoYXJlZE1vZHVsZVJlZHVjZXJzIGZyb20gXCIuLi8uLi9zdG9yZS9yZWR1Y2Vycy9pbmRleFwiO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uVHlwZUlkcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9ub3RpZmljYXRpb24tdHlwZS1pZHMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uTW9kZWwsIE5vdGlmaWNhdGlvbk91dHB1dE1vZGVsLCBVc2VyTm90aWZpY2F0aW9uUmVhZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL05vdGlmaWNhdGlvbnNPdXRQdXRNb2RlbCc7XG5pbXBvcnQgeyBTb2Z0TGFiZWxDb25maWd1cmF0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvc29mdGxhYmVscy1tb2RlbCc7XG5pbXBvcnQgeyBVc2VyTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvdXNlcic7XG5pbXBvcnQgeyBPcmRlckJ5UGlwZSB9IGZyb20gJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9waXBlcy9vcmRlcmJ5LXBpcGUnO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlUHJvcGVydGllcyB9IGZyb20gJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9jb25zdGFudHMvbG9jYWxzdG9yYWdlLXByb3BlcnRpZXMnO1xuaW1wb3J0IHsgQ2hhbm5lbE5hbWVzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NoYW5uZWwtbmFtZXMnO1xuaW1wb3J0IHsgQ2hhbm5lbFJvdXRlcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9ub3RpZmljYXRpb24tcm91dGVzJztcbmltcG9ydCB7IFVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1VzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IFJvbGVVcGRhdGVkTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1JvbGVVcGRhdGVkTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IFJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9SZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24nO1xuaW1wb3J0IHsgUmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvUmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24nO1xuaW1wb3J0IHsgTXVsdGlwbGVDaGFydHNTY2hlZHVsaW5nIH0gZnJvbSAnLi4vLi4vbW9kZWxzL211bHRpQ2hhcnRzU2NoZWR1bGluZyc7XG5pbXBvcnQgeyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL0Fzc2V0QXNzaWduZWROb3RpZmljYXRpb25Nb2RlbCc7XG5pbXBvcnQgeyBOZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL05ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uTW9kZWwnO1xuaW1wb3J0IHsgR29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwnO1xuaW1wb3J0IHsgVXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvdXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwnO1xuaW1wb3J0IHsgVXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3VzZXJTdG9yeUNvbW1lbnROb3RpZmljYXRpb25Nb2RlbCc7XG5pbXBvcnQgeyBTcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvc3ByaW50U3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsJztcbmltcG9ydCB7IFNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zcHJpbnRSZXBsYW5SZXF1ZXN0ZWRNb2RlbCc7XG5pbXBvcnQgeyBBbm5vdWNlbWVudERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vYW5ub3VuY2VtZW50LWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgR3VpZCB9IGZyb20gJ2d1aWQtdHlwZXNjcmlwdCc7XG5pbXBvcnQgJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9oZWxwZXJzL2ZvbnRhd2Vzb21lLWljb25zJztcbmltcG9ydCAqIGFzIF8gZnJvbSBcInVuZGVyc2NvcmVcIjtcbmltcG9ydCB7IFNpZ25hbHJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3NpZ25hbHIuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYXBwLW5vdGlmaWNhdGlvbnNcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9ub3RpZmljYXRpb25zLmNvbXBvbmVudC5odG1sXCJcbn0pXG5cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBub3RpZmljUGFuZWw7XG5cbiAgcHVibGljIG5nRGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0KCk7XG4gIGNvbnN0Tm90aWZpY2F0aW9uX1dvcmtJdGVtQXNzaWduZWRUb1VzZXIgPSBOb3RpZmljYXRpb25UeXBlSWRzLk5vdGlmaWNhdGlvbl9Xb3JrSXRlbUFzc2lnbmVkVG9Vc2VyO1xuICBub3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb25PdXRwdXRNb2RlbFtdPjtcbiAgbm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uT3V0cHV0TW9kZWxbXTtcbiAgc29mdExhYmVsczogU29mdExhYmVsQ29uZmlndXJhdGlvbk1vZGVsW107XG4gIGxvYWRpbmdOb3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgc2VsZWN0ZWROb3RpZmljYXRpb246IFVzZXJOb3RpZmljYXRpb25SZWFkTW9kZWw7XG4gIGFubm91bmNlbWVudElkOiBzdHJpbmc7XG4gIGFubm91bmNlTm90aWZpY2F0aW9uSWQ6IHN0cmluZztcbiAgbm90aWZpY2F0aW9uQ29sb3IgPSBmYWxzZTtcbiAgYXV0aGVudGljYXRlZFVzZXJSZWNvcmQkOiBPYnNlcnZhYmxlPFVzZXJNb2RlbD47XG4gIG5ld05vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbk1vZGVsW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIHB1Ym51YjogUHViTnViQW5ndWxhciwgcHJpdmF0ZSBzdG9yZTogU3RvcmU8U3RhdGU+LFxuICAgIHByaXZhdGUgYWN0aW9uVXBkYXRlcyQ6IEFjdGlvbnMsIHByaXZhdGUgY29va2llU2VydmljZTogQ29va2llU2VydmljZSwgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLCBwcml2YXRlIG9yZGVyQnlQaXBlOiBPcmRlckJ5UGlwZSwgcHJpdmF0ZSBzaWduYWxyOiBTaWduYWxyU2VydmljZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwpIHtcbiAgICB0aGlzLmFjdGlvblVwZGF0ZXMkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubmdEZXN0cm95ZWQkKSxcbiAgICAgICAgb2ZUeXBlKEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuVXNlckRldGFpbHNGZXRjaGVkQWZ0ZXJMb2dpbiksXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29va2llU2VydmljZS5jaGVjayhMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IEN1cnJlbnRVc2VySWQgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudFVzZXJJZCk7XG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gVGFzayBBc3NpZ25tZW50IE5vdGlmaWNhaXRvbnMgaGVyZS5cbiAgICAgICAgICAgIGNvbnN0IHRhc2tBc3NpZ25tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Rhc2tBc3NpZ25tZW50cyArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCB0YXN0YXR1c1JlcG9ydFN1Ym1pc3Npb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfU3RhdHVzUmVwb3J0U3VibWlzc2lvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TdGF0dXNDb25maWdBc3NpZ24gKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgbXVsdGlDaGFydHNTY2hlZHVsaW5nQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX011bHRpQ2hhcnRzU2NoZWR1bGluZyArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBhc3NldHNBc3NpZ25lZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Bc3NldEFzc2lnbm1lbnQgKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgcHJvamVjdENyZWF0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTmV3UHJvamVjdCArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0QWNjZXNzVG9NZW1iZXJDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUHJvamVjdE1lbWJlclJvbGUgKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgZ29hbEFwcHJvdmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX0dvYWxBcHByb3ZlZEZyb21SZXBsYW4gKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgdXNlclN0b3J5VXBkYXRlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1VzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBBbm5vdW5jZW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfQW5ub3VuY2VtZW50Tm90aWZpY2F0aW9uICsgQ3VycmVudFVzZXJJZDtcbiAgICAgICAgICAgIGNvbnN0IFJlbWluZGVyQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1JlbWluZGVyTm90aWZpY2F0aW9uICsgQ3VycmVudFVzZXJJZDtcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Blcm9mb3JtYW5jZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCB1c2VyU3RvcnlDb21tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1VzZXJTdG9yeUNvbW1lbnQgKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3Qgc3ByaW50U3RhcnRlZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TcHJpbnRTdGFydGVkICsgQ3VycmVudFVzZXJJZDtcbiAgICAgICAgICAgIGNvbnN0IHNwcmludFJlcGxhbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TcHJpbnRSZXF1ZXN0ZWRUb1JlcGxhbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBsZWF2ZUFwcGxpZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTGVhdmVBcHBsaWVkICsgQ3VycmVudFVzZXJJZDtcbiAgICAgICAgICAgIGNvbnN0IEFwcHJvdmVMZWF2ZUNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9BcHByb3ZlTGVhdmUgKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgUmVqZWN0TGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmVqZWN0TGVhdmUgKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgUmVzaWduYXRpb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmVzaWduYXRpb24gKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgQXBwcm92ZVJlc2lnbmF0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX0FwcHJvdmVSZXNpZ25hdGlvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBSZWplY3RSZXNpZ25hdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9SZWplY3RSZXNpZ25hdGlvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBBdXRvVEltZXNoZWV0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9BdXRvVGltZXNoZWV0U3VibWlzc2lvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBQcm9iYXRpb25Bc3NpZ25Ob3RpZmljYXRpb24gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Qcm9iYXRpb25Bc3NpZ25Ob3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Jldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Jldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsICsgQ3VycmVudFVzZXJJZDtcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1BlcmZvcm1hbmNlUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBQZXJmb3JtYW5jZVJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbCA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1BlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsICsgQ3VycmVudFVzZXJJZDtcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1BlcmZvcm1hbmNlUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgdGFza0Fzc2lnbm1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG8gXCIgKyB0YXN0YXR1c1JlcG9ydFN1Ym1pc3Npb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG8gXCIgKyB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHByb2plY3RDcmVhdGVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBwcm9qZWN0QWNjZXNzVG9NZW1iZXJDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgdXNlclN0b3J5VXBkYXRlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBBbm5vdW5jZW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHNwcmludFN0YXJ0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHNwcmludFJlcGxhbkNoYW5uZWxUb1N1YnNjcmliZUludG8pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgUmVtaW5kZXJDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIFBlcmZvcm1hbmNlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XG4gICAgICAgICAgICB0aGlzLnB1Ym51Yi5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICBjaGFubmVsczogW3Rhc2tBc3NpZ25tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50bywgdGFzdGF0dXNSZXBvcnRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcbiAgICAgICAgICAgICAgICBQcm9iYXRpb25Bc3NpZ25Ob3RpZmljYXRpb24sIFJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24sIFJldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24sXG4gICAgICAgICAgICAgICAgUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsLCBQZXJmb3JtYW5jZVJldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24sIFBlcmZvcm1hbmNlUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbixcbiAgICAgICAgICAgICAgICB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8sIG11bHRpQ2hhcnRzU2NoZWR1bGluZ0NoYW5uZWxUb1N1YnNjcmliZUludG8sIFBlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsLFxuICAgICAgICAgICAgICAgIGFzc2V0c0Fzc2lnbmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgcHJvamVjdENyZWF0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCAsXG4gICAgICAgICAgICAgICAgcHJvamVjdEFjY2Vzc1RvTWVtYmVyQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgZ29hbEFwcHJvdmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcbiAgICAgICAgICAgICAgICB1c2VyU3RvcnlVcGRhdGVDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBbm5vdW5jZW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBSZW1pbmRlckNoYW5uZWxUb1N1YnNjcmliZUludG8sIFJlamVjdFJlc2lnbmF0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcbiAgICAgICAgICAgICAgICB1c2VyU3RvcnlDb21tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50bywgc3ByaW50U3RhcnRlZENoYW5uZWxUb1N1YnNjcmliZUludG8sIFJlc2lnbmF0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgQXBwcm92ZVJlc2lnbmF0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcbiAgICAgICAgICAgICAgICBzcHJpbnRSZXBsYW5DaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBsZWF2ZUFwcGxpZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBcHByb3ZlTGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBSZWplY3RMZWF2ZUNoYW5uZWxUb1N1YnNjcmliZUludG8sXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBdXRvVEltZXNoZWV0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG9dXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIEFkZCBvdGhlciBzdWJzY3JpcHRpb25zIGhlcmUuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVXNlciBub3QgbG9nZ2VkIGluIHlldCB0byBiZSBhYmxlIHRvIHN1YnNjcmliZS5cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5hY3Rpb25VcGRhdGVzJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveWVkJCksXG4gICAgICAgIG9mVHlwZShBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLlVzZXJEZXRhaWxzRmV0Y2hlZEFmdGVyTG9naW4pLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHZhciByb2xlVXBkYXRlc0NoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Sb2xlVXBkYXRlcyArIFwiMTlCNkY5RkMtNzM3MC00QjlDLUEwNUMtM0I4RDgxOUVFRUFGXCI7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0byBcIiArIHJvbGVVcGRhdGVzQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XG4gICAgICAgICAgdGhpcy5wdWJudWIuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIGNoYW5uZWxzOiBbcm9sZVVwZGF0ZXNDaGFubmVsVG9TdWJzY3JpYmVJbnRvXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5hY3Rpb25VcGRhdGVzJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveWVkJCksXG4gICAgICAgIG9mVHlwZShOb3RpZmljYXRpb25zQWN0aW9uVHlwZXMuQ2xlYXJBbGxVbnJlYWROb3RpZmljYXRpb25zQ29tcGxldGVkKSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChzaGFyZWRNb2R1bGVSZWR1Y2Vycy5nZXROb3RpZmljYXRpb25BbGwpKTtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IHg7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIC8vIGNvbnN0IHN0b3JlTGlzdG5lciA9IChtZXNzYWdlKSA9PiB7XG4gICAgLy8gICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLVJlY2VpdmVkIHB1Ym51YiBtZXNzYWdlLS0tLS0tLS0tXCIpO1xuICAgIC8vICAgLy8gdGhpcy50b2FzdHIuaW5mbyhtZXNzYWdlLm1lc3NhZ2UuU3VtbWFyeSk7XG4gICAgLy8gICB0cnkge1xuICAgIC8vICAgICAvLyBSZWNlaXZpbmcgdGhlIFVzZXIgU3RvcnkgQXNzaWduZWQgTm90aWZpY2F0aW9uXG4gICAgLy8gICAgIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Ob3RpZmljYXRpb25fV29ya0l0ZW1Bc3NpZ25lZFRvVXNlcikge1xuICAgIC8vICAgICAgIHZhciB1c2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbiA9IG5ldyBVc2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbigpO1xuICAgIC8vICAgICAgIHVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XG4gICAgLy8gICAgICAgdXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24ucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdXb3JrSXRlbSArIHVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkO1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKHVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uKSk7XG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkID09IE5vdGlmaWNhdGlvblR5cGVJZHMuTm90aWZpY2F0aW9uX1JvbGVVcGRhdGVkKSB7XG4gICAgLy8gICAgICAgdmFyIHJvbGVVcGRhdGVkTm90aWZpY2F0aW9uID0gbmV3IFJvbGVVcGRhdGVkTm90aWZpY2F0aW9uKCk7XG4gICAgLy8gICAgICAgcm9sZVVwZGF0ZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICByb2xlVXBkYXRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQocm9sZVVwZGF0ZWROb3RpZmljYXRpb24pKTtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlN0YXR1c19SZXBvcnRfU3VtaXR0ZWQpIHtcbiAgICAvLyAgICAgICB2YXIgcmVwb3J0U3VibWl0dGVkTm90aWZpY2F0aW9uID0gbmV3IFJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbigpO1xuICAgIC8vICAgICAgIHJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xuICAgIC8vICAgICAgIHJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQocmVwb3J0U3VibWl0dGVkTm90aWZpY2F0aW9uKSk7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5TdGF0dXNfUmVwb3J0X0NvbmZpZ19DcmVhdGVkKSB7XG4gICAgLy8gICAgICAgdmFyIHJlcG9ydENvbmZpZ0Fzc2lnbmVkTm90aWZpY2F0aW9uID0gbmV3IFJlcG9ydENvbmZpZ0Fzc2lnbmVkTm90aWZpY2F0aW9uKCk7XG4gICAgLy8gICAgICAgcmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICByZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQocmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24pKTtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLk11bHRpcGxlX0NoYXJ0c19TY2hlZHVsaW5nX2NyZWF0ZWQpIHtcbiAgICAvLyAgICAgICB2YXIgbXVsdGlwbGVDaGFydHNTY2hlZHVsaW5nID0gbmV3IE11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZygpO1xuICAgIC8vICAgICAgIG11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZy5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xuICAgIC8vICAgICAgIG11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZy5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobXVsdGlwbGVDaGFydHNTY2hlZHVsaW5nKSk7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Bc3NldHNfQXNzaWdubWVudCkge1xuICAgIC8vICAgICAgIGNvbnN0IGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgQXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbigpO1xuICAgIC8vICAgICAgIGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKSk7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUmVtaW5kZXJfTm90aWZpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIC8vICAgICAgIGNvbnN0IGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgQXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbigpO1xuICAgIC8vICAgICAgIGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKSk7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuQW5ub3VuY2VtZW50X1JlY2VpdmVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIC8vICAgICAgIGNvbnN0IGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgQXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbigpO1xuICAgIC8vICAgICAgIGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKSk7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcbiAgICAvLyAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlLklkICE9IHRoaXMuYW5ub3VuY2VOb3RpZmljYXRpb25JZCkge1xuICAgIC8vICAgICAgICAgdGhpcy5hbm5vdW5jZU5vdGlmaWNhdGlvbklkID0gbWVzc2FnZS5tZXNzYWdlLklkO1xuICAgIC8vICAgICAgICAgdGhpcy5vcGVuQW5ub3VuY2VtZW50RGlhbG9nKG1lc3NhZ2UubWVzc2FnZSk7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZV9SZWNlaXZlZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgfHwgbWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlByb2plY3RNZW1iZXJSb2xlQWRkZWROb3RpZmljYXRpb25JZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAvLyAgICAgICBjb25zdCBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbiA9IG5ldyBOZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XG4gICAgLy8gICAgICAgbmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24pKTtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5OZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSB8fCBtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUHJvamVjdE1lbWJlclJvbGVBZGRlZE5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIC8vICAgICAgIGNvbnN0IG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uID0gbmV3IE5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uTW9kZWwoKTtcbiAgICAvLyAgICAgICBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xuICAgIC8vICAgICAgIG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbikpO1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLkdvYWxBcHByb3ZlZEZyb21SZXBsYW4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgLy8gICAgICAgY29uc3QgZ29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwgPSBuZXcgR29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwoKTtcbiAgICAvLyAgICAgICBnb2FsQXBwcm92ZWROb3RpZmljYXRpb25Nb2RlbC5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xuICAgIC8vICAgICAgIGdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChnb2FsQXBwcm92ZWROb3RpZmljYXRpb25Nb2RlbCkpO1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlVTZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIC8vICAgICAgIGNvbnN0IHVzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsID0gbmV3IFVzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsKCk7XG4gICAgLy8gICAgICAgdXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICB1c2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb25Nb2RlbC5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQodXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwpKTtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5QdXNoTm90aWZpY2F0aW9uRm9yVXNlclN0b3J5Q29tbWVudC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAvLyAgICAgICBjb25zdCB1c2VyU3RvcnlDb21tZW50Tm90aWZpY2F0aW9uTW9kZWwgPSBuZXcgVXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsKCk7XG4gICAgLy8gICAgICAgdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XG4gICAgLy8gICAgICAgdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZCh1c2VyU3RvcnlDb21tZW50Tm90aWZpY2F0aW9uTW9kZWwpKTtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5TcHJpbnRTdGFydGVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIC8vICAgICAgIGNvbnN0IHNwcmludFN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCA9IG5ldyBTcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwoKTtcbiAgICAvLyAgICAgICBzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICBzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKHNwcmludFN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCkpO1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIC8vICAgICAgIGNvbnN0IHNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCA9IG5ldyBTcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwoKTtcbiAgICAvLyAgICAgICBzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICBzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKHNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCkpO1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgLy8gVE9ETzogU2VuZCB0aGVzZSBlcnJvcnMgb250byBzZXJ2ZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgIC8vICAgICAgIGNvbnNvbGUubG9nKFwiRm91bmQgdW5kZXRlY3RlZCBub3RpZmljYXRpb24gdHlwZS4gXCIgKyBtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIC8vIEFkZCBvdGhlciBub3RpZmljYXRpb25zIGhlcmUuXG5cbiAgICAvLyAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgIC8vICAgICAvLyBUT0RPOiBTZW5kIHRoZXNlIGV4Y2VwdGlvbnMgb250byBzZXJ2ZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgIC8vICAgICBjb25zb2xlLmxvZyhcIkV4Y2VwdGlvbiBPY2N1cmVkXCIgKyBleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgLy8gICB9XG4gICAgLy8gfTtcblxuICAgIC8vIHRoaXMucHVibnViLmFkZExpc3RlbmVyKHtcbiAgICAvLyAgIHN0YXR1czogc3QgPT4ge1xuICAgIC8vICAgICBpZiAoc3QuY2F0ZWdvcnkgPT09IFwiUE5Vbmtub3duQ2F0ZWdvcnlcIikge1xuICAgIC8vICAgICAgIHZhciBuZXdTdGF0ZSA9IHtcbiAgICAvLyAgICAgICAgIG5ldzogXCJlcnJvclwiXG4gICAgLy8gICAgICAgfTtcbiAgICAvLyAgICAgICB0aGlzLnB1Ym51Yi5zZXRTdGF0ZShcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgc3RhdGU6IG5ld1N0YXRlXG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICAvLyBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgLy8gICAgICAgICAvLyAgIGNvbnNvbGUubG9nKHN0LmVycm9yRGF0YS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICAgIC8vIH1cbiAgICAvLyAgICAgICApO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9LFxuICAgIC8vICAgbWVzc2FnZTogbWVzc2FnZSA9PiB7XG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJlZCB0byBcIiArIG1lc3NhZ2UpO1xuICAgIC8vICAgICBzdG9yZUxpc3RuZXIobWVzc2FnZSk7XG4gICAgLy8gICB9XG4gICAgLy8gfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKChyb3V0ZUNoYW5nZSkgPT4ge1xuICAgICAgICBpZiAocm91dGVDaGFuZ2UgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgICAgaWYgKHRoaXMubm90aWZpY1BhbmVsKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNQYW5lbC5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgdGhpcy5zaWduYWxyLm5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLm5ld05vdGlmaWNhdGlvbnMgPSBkYXRhICYmIGRhdGEubGVuZ3RoID4gMCA/IGRhdGEgOiBbXTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICAgIHRoaXMuZ2V0U29mdExhYmVsQ29uZmlndXJhdGlvbnMoKTtcblxuICAgIHRoaXMubm90aWZpY2F0aW9ucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHNoYXJlZE1vZHVsZVJlZHVjZXJzLmdldE5vdGlmaWNhdGlvbkFsbCksXG4gICAgICB0YXAoeCA9PiBjb25zb2xlLmxvZyh4KSlcbiAgICApO1xuXG4gICAgdGhpcy5hdXRoZW50aWNhdGVkVXNlclJlY29yZCQgPSB0aGlzLnN0b3JlLnBpcGUoXG4gICAgICBzZWxlY3Qoc2hhcmVkTW9kdWxlUmVkdWNlcnMuZ2V0QXV0aGVudGljYXRlZFVzZXJNb2RlbClcbiAgICApO1xuXG4gICAgdGhpcy5sb2FkaW5nTm90aWZpY2F0aW9ucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHNoYXJlZE1vZHVsZVJlZHVjZXJzLmdldE5vdGlmaWNhdGlvbnNMb2FkaW5nKSk7XG4gIH1cblxuICBnZXRTb2Z0TGFiZWxDb25maWd1cmF0aW9ucygpIHtcbiAgICB0aGlzLnNvZnRMYWJlbHMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdTb2Z0TGFiZWxzJykpO1xuICB9XG5cbiAgY2xlYXJBbGwoZSkge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSBbXTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgbm90aWZpY2F0aW9ucy5wdXNoKGVsZW1lbnQpO1xuICAgIH0pO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IENsZWFyQWxsTm90aWZpY2F0aW9ucyhub3RpZmljYXRpb25zKSk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMubm90aWZpY2F0aW9uQ29sb3IgPSAhdGhpcy5ub3RpZmljYXRpb25Db2xvcjtcbiAgfVxuXG4gIC8vIG9wZW5Bbm5vdW5jZW1lbnREaWFsb2coYW5ub3VuY2VkKSB7XG4gIC8vICAgdGhpcy5kaWFsb2cuY2xvc2VBbGwoKTtcbiAgLy8gICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFubm91Y2VtZW50RGlhbG9nQ29tcG9uZW50LCB7XG4gIC8vICAgICBtaW5XaWR0aDogXCI2MHZ3XCIsXG4gIC8vICAgICBtYXhXaWR0aDogXCI2MHZ3XCIsXG4gIC8vICAgICBtaW5IZWlnaHQ6IFwiNTB2aFwiLFxuICAvLyAgICAgbWF4SGVpZ2h0OiBcIjgwdmhcIixcbiAgLy8gICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgLy8gICAgIGRhdGE6IHtcbiAgLy8gICAgICAgYW5ub3VuY2VtZW50SWQ6IGFubm91bmNlZC5Bbm5vdW5jZW1lbnRJZCxcbiAgLy8gICAgICAgYW5ub3VuY2VtZW50OiBhbm5vdW5jZWQuQW5ub3VuY2VtZW50LFxuICAvLyAgICAgICBhbm5vdW5jZWRCeTogYW5ub3VuY2VkLkFubm91bmNlZEJ5LFxuICAvLyAgICAgICBhbm5vdW5jZWRCeUlkOiBhbm5vdW5jZWQuQW5ub3VuY2VkQnlJZCxcbiAgLy8gICAgICAgYW5ub3VuY2VkQnlVc2VySW1hZ2U6IGFubm91bmNlZC5Bbm5vdW5jZWRCeVVzZXJJbWFnZSxcbiAgLy8gICAgICAgYW5ub3VuY2VkT246IGFubm91bmNlZC5Bbm5vdW5jZWRPblxuICAvLyAgICAgfVxuICAvLyAgIH0pO1xuICAvLyAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5jbG9zZU1hdERpYWxvZy5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAvLyAgICAgY29uc3QgaW5kZXggPSB0aGlzLm5vdGlmaWNhdGlvbnMuZmluZEluZGV4KChwKSA9PiBwLm5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSB0aGlzLmFubm91bmNlTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTtcbiAgLy8gICAgIGlmIChpbmRleCA+IC0xKSB7XG4gIC8vICAgICAgIHRoaXMudXBzZXJ0UmVhZE5vdGlmaWNhdGlvbih0aGlzLm5vdGlmaWNhdGlvbnNbaW5kZXhdKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIHVwc2VydFJlYWROb3RpZmljYXRpb24oc2VsZWN0ZWROb3RpZmljYXRpb24pIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25zID0gW107XG4gICAgdmFyIHJvbGVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLlJvbGVGZWF0dXJlcykpO1xuICAgIGxldCBGZWF0dXJlX0FwcHJvdmVPclJlamVjdExlYXZlID0gJzJDMjI5MTZGLUI4MEItNEM1MS05NTM0LTIzRjY5OERFMTIwQic7XG4gICAgbGV0IGNhbkFjY2Vzc19mZWF0dXJlX0FwcHJvdmVPclJlamVjdExlYXZlID0gXy5maW5kKHJvbGVzLCBmdW5jdGlvbiAocm9sZSkgeyByZXR1cm4gcm9sZVsnZmVhdHVyZUlkJ10udG9Mb3dlckNhc2UoKSA9PSBGZWF0dXJlX0FwcHJvdmVPclJlamVjdExlYXZlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsgfSkgIT0gbnVsbDtcbiAgICBjb25zdCBDdXJyZW50VXNlcklkID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpO1xuICAgIG5vdGlmaWNhdGlvbnMucHVzaChzZWxlY3RlZE5vdGlmaWNhdGlvbik7XG4gICAgY29uc3Qgbm90aWlmY2F0aW9ubW9kZWwgPSBKU09OLnBhcnNlKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbkpzb24pO1xuICAgIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLk5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlByb2plY3RNZW1iZXJSb2xlQWRkZWROb3RpZmljYXRpb25JZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL3Byb2plY3RzdGF0dXMvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Qcm9qZWN0R3VpZCArIFwiL2FjdGl2ZS1nb2Fsc1wiXSk7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLkdvYWxBcHByb3ZlZEZyb21SZXBsYW4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9nb2FsL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuR29hbEd1aWRdKTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuTm90aWZpY2F0aW9uX1dvcmtJdGVtQXNzaWduZWRUb1VzZXIudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy93b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUd1aWRdKTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuVVNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy93b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUlkXSk7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFN0YXJ0ZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9zcHJpbnQvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5TcHJpbnRHdWlkXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUHVzaE5vdGlmaWNhdGlvbkZvclVzZXJTdG9yeUNvbW1lbnQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy93b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUd1aWRdKTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuR29hbFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wicHJvamVjdHMvZ29hbC9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLkdvYWxHdWlkXSk7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wicHJvamVjdHMvc3ByaW50L1wiICsgbm90aWlmY2F0aW9ubW9kZWwuU3ByaW50R3VpZF0pO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5Ob3RpZmljYXRpb25fQWRob2NXb3JrSXRlbUFzc2lnbmVkVG9Vc2VyLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL2FkaG9jLXdvcmtpdGVtL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlclN0b3J5R3VpZF0pO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5BZGhvY1VTZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL2FkaG9jLXdvcmtpdGVtL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlclN0b3J5SWRdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5MZWF2ZUFwcGxpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSAmJiBjYW5BY2Nlc3NfZmVhdHVyZV9BcHByb3ZlT3JSZWplY3RMZWF2ZSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiaHJtYW5hZ21lbnQvbGVhdmVzXCJdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5BcHByb3ZlTGVhdmVBcHBsaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL2xlYXZlcy1wZXJtaXNzaW9uc1wiXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUmVqZWN0TGVhdmVBcHBsaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL2xlYXZlcy1wZXJtaXNzaW9uc1wiXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuQXV0b1RpbWVTaGVldFN1Ym1pc3Npb25Ob3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvcHJvZmlsZS9cIiArIEN1cnJlbnRVc2VySWQgKyBcIi90aW1lc2hlZXRBcHByb3ZhbFwiXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUHJvYmF0aW9uQXNzaWduTm90aWZpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VySWQgKyBcIi9wcm9iYXRpb25cIl0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvcHJvZmlsZS9cIiArIEN1cnJlbnRVc2VySWQgKyBcIi9wcm9iYXRpb25cIl0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlJldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvcHJvZmlsZS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJJZCArIFwiL3Byb2JhdGlvblwiXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlcklkICsgXCIvcHJvYmF0aW9uXCJdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZVJldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvcHJvZmlsZS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJJZCArIFwiL3BlcmZvcm1hbmNlXCJdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZVJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlcklkICsgXCIvcGVyZm9ybWFuY2VcIl0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlBlcmZvcm1hbmNlUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL3BlcmZvcm1hbmNlXCJdKTtcbiAgICB9XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgVXBzZXJ0VW5yZWFkTm90aWZpY2F0aW9uc1RyaWdnZXJlZChub3RpZmljYXRpb25zKSk7XG4gIH1cblxuICB1cHNlcnRSZWFkTmV3Tm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbikge1xuICAgIGxldCBub3RlczogTm90aWZpY2F0aW9uTW9kZWxbXSA9IFtub3RpZmljYXRpb25dO1xuICAgIHRoaXMuc2lnbmFsci51cHNlcnRSZWFkTmV3Tm90aWZpY2F0aW9ucyhub3RlcylcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuc2lnbmFsci5yZW1vdmVJdGVtRnJvbU5vdGlmaWNhdGlvbnMobm90aWZpY2F0aW9uLmlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgaWYgKG5vdGlmaWNhdGlvbi5uYXZpZ2F0aW9uVXJsKSB7XG4gICAgICB3aW5kb3cub3Blbihub3RpZmljYXRpb24ubmF2aWdhdGlvblVybCwgXCJfYmxhbmtcIik7XG4gICAgfVxuXG4gIH1cblxuICBjbGVhck5ld0FsbChlKSB7XG4gICAgdGhpcy5zaWduYWxyLnVwc2VydFJlYWROZXdOb3RpZmljYXRpb25zKHRoaXMubmV3Tm90aWZpY2F0aW9ucylcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuc2lnbmFsci5yZW1vdmVBbGxOb3RpZmljYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMubmdEZXN0cm95ZWQkLm5leHQoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG1hdC1iZy1wcmltYXJ5IHB0LTEgcGItMVwiPlxuICA8IS0tIDxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiKGxvYWRpbmdOb3RpZmljYXRpb25zJCB8IGFzeW5jKVwiPjwvbWF0LXByb2dyZXNzLWJhcj4gLS0+XG4gIDxoNiBjbGFzcz1cIm0tMFwiPnt7ICdOT1RJRklDQVRJT05TLk5PVElGSUNBVElPTlNUSVRMRScgfCB0cmFuc2xhdGUgfX0gKHt7bmV3Tm90aWZpY2F0aW9ucz8ubGVuZ3RofX0pPC9oNj5cbjwvZGl2PlxuPGRpdiBpZD1cInN0eWxlLTFcIiAqbmdJZj1cIm5ld05vdGlmaWNhdGlvbnMubGVuZ3RoICE9IDBcIj5cbiAgPG1hdC1uYXYtbGlzdCBjbGFzcz1cIm5vdGlmaWNhdGlvbi1saXN0IHAtMCBwci0wM1wiIHJvbGU9XCJsaXN0XCJcbiAgICAqbmdGb3I9XCJsZXQgbm90aWZpY2F0aW9uIG9mIChuZXdOb3RpZmljYXRpb25zIHwgb3JkZXJCeSlcIiA+XG4gICAgPG1hdC1saXN0LWl0ZW0gY2xhc3M9XCJub3RpZmljLWl0ZW0gIHByLTAzIG5vdGlmaWNhdGlvbi1tYXJnaW5cIiByb2xlPVwibGlzdGl0ZW1cIlxuICAgICAgW25nQ2xhc3NdPVwieydub3RpZmljYXRhaW9uLXVucmVhZCc6ICFub3RpZmljYXRpb25Db2xvciAsJ25vdGlmaWNhdGFpb24tcmVhZCc6IG5vdGlmaWNhdGlvbkNvbG9yIH1cIlxuICAgICAgcm91dGVyTGlua0FjdGl2ZT1cIm9wZW5cIiAoY2xpY2spPVwidXBzZXJ0UmVhZE5ld05vdGlmaWNhdGlvbihub3RpZmljYXRpb24pXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LWxpc3QtdGV4dCBwbC0wIHByLTAzIG5vdGlmaWNhdGlvbi1jdXJzb3Igbm90aWZpY2F0aW9ucy1saXN0LWl0ZW1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3b3JkLWJyZWFrIGRpc3BsYXktcHJlLWxpbmVcIiBzdHlsZT1cIm1hcmdpbjogMHB4ICFpbXBvcnRhbnQ7XCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJub3RpZmljYXRpb24uc3VtbWFyeSB8IHNhbml0aXplSHRtbFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0aW1lIHRleHQtbXV0ZWRcIj57eyBub3RpZmljYXRpb24uY3JlYXRlZERhdGVUaW1lIHwgdXRjVG9Mb2NhbFRpbWUgfCB0aW1lYWdvIH19PC9zbWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtbGlzdC1pdGVtPlxuICA8L21hdC1uYXYtbGlzdD5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHAtMVwiICpuZ0lmPVwibmV3Tm90aWZpY2F0aW9ucy5sZW5ndGggPT0gMFwiPlxuICB7eyAnTk9USUZJQ0FUSU9OUy5OT05PVElGSUNBVElPTlNUSVRMRScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbjxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG10LTA1IG1iLTA1XCIgKm5nSWY9XCJuZXdOb3RpZmljYXRpb25zLmxlbmd0aFwiPlxuICA8bGFiZWwgY2xhc3M9XCJtYi0wXCI+PGEgKGNsaWNrKT1cImNsZWFyTmV3QWxsKCRldmVudClcIj57eyAnTk9USUZJQ0FUSU9OUy5DTEVBUkFMTE5PVElGSUNBVElPTlMnIHwgdHJhbnNsYXRlXG4gICAgICB9fTwvYT48L2xhYmVsPlxuPC9kaXY+Il19